From 3bad09d497fdfec17781166b69d3b761c935623e Mon Sep 17 00:00:00 2001 From: Jon D Date: Fri, 6 Jul 2018 22:20:19 +0100 Subject: [PATCH 001/217] Merge Work-In-Progress 4320 to 4320 --- data/core.yaml | 5 + dist/locales/en.json | 6 + modules/actions/detach_node.js | 27 + modules/actions/index.js | 1 + modules/operations/detach_node.js | 50 ++ modules/operations/index.js | 1 + .../operations/operation-detachNode.svg | 61 ++ test/index.html | 14 +- test/spec/actions/detach_node.js | 540 ++++++++++++++++++ 9 files changed, 700 insertions(+), 5 deletions(-) create mode 100644 modules/actions/detach_node.js create mode 100644 modules/operations/detach_node.js create mode 100644 svg/iD-sprite/operations/operation-detachNode.svg create mode 100644 test/spec/actions/detach_node.js diff --git a/data/core.yaml b/data/core.yaml index 5b544040b..820e0fc0d 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -229,6 +229,11 @@ en: annotation: create: Added a turn restriction delete: Deleted a turn restriction + detachNode: + title: Detach + key: D + description: Detach this node from these lines/areas. + annotation: Detached a node from owning lines/areas. restriction: controls: distance: Distance diff --git a/dist/locales/en.json b/dist/locales/en.json index 3412491a4..8abaa9db5 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -297,6 +297,12 @@ "create": "Added a turn restriction", "delete": "Deleted a turn restriction" } + }, + "detachNode": { + "title": "Detach", + "key": "D", + "description": "Detach this node from these lines/areas.", + "annotation": "Detached a node from owning lines/areas." } }, "restriction": { diff --git a/modules/actions/detach_node.js b/modules/actions/detach_node.js new file mode 100644 index 000000000..d83fd46ed --- /dev/null +++ b/modules/actions/detach_node.js @@ -0,0 +1,27 @@ +import { osmNode } from '../osm'; + +export function actionDetachNode(nodeId) { + return function (graph) { + // Get the point in question + var node = graph.entity(nodeId); + // Get all of the ways it's currently attached to + var parentWays = graph.parentWays(node); + // Create a new node to replace the one we will detach + var replacementNode = osmNode({ loc: node.loc }); + // We need to process each way in turn, updating the graph as we go + return parentWays + .reduce(function (accGraph, parentWay) { + // Make a note of where in the way our target node is inside this way + var originalIndex = parentWay.nodes.indexOf(nodeId); + // Swap out the target node for the replacement + var updatedWay = parentWay + .removeNode(nodeId) // Remove our target node from the parent way + .addNode(replacementNode.id, originalIndex); // Add in the replacement node in its place + // Update the graph with the updated way + return accGraph.replace(updatedWay); + }, + // Seed the reduction with the input graph, updated to include the replacementNode so + // that is accessible to the ways when we add it in to them + graph.replace(replacementNode)); + }; +} diff --git a/modules/actions/index.js b/modules/actions/index.js index 330690db2..4f15456d8 100644 --- a/modules/actions/index.js +++ b/modules/actions/index.js @@ -33,3 +33,4 @@ export { actionSplit } from './split'; export { actionStraighten } from './straighten'; export { actionUnrestrictTurn } from './unrestrict_turn'; export { actionReflect } from './reflect.js'; +export { actionDetachNode } from './detach_node'; \ No newline at end of file diff --git a/modules/operations/detach_node.js b/modules/operations/detach_node.js new file mode 100644 index 000000000..28ca9b600 --- /dev/null +++ b/modules/operations/detach_node.js @@ -0,0 +1,50 @@ +import { actionDetachNode } from '../actions/index'; +import { behaviorOperation } from '../behavior/index'; +import { modeMove } from '../modes/index'; +import { t } from '../util/locale'; + +export function operationDetachNode(selectedIDs, context) { + var selectedNode = selectedIDs[0]; + var operation = function () { + context.perform(actionDetachNode(selectedNode)); + context.enter(modeMove(context, [selectedNode], context.graph)); + }; + var hasTags = function (entity) { + return Object.keys(entity.tags).length > 0; + }; + operation.available = function () { + // Check multiple items aren't selected + if (selectedIDs.length !== 1) { + return false; + } + // Get the entity itself + var graph = context.graph(); + var entity = graph.hasEntity(selectedNode); + if (!entity) { + // This probably isn't possible + return false; + } + // Confirm entity is a node with tags + if (entity.type === 'node' && hasTags(entity)) { + // Confirm that the node is owned by at least 1 parent way + var parentWays = graph.parentWays(entity); + return parentWays && parentWays.length > 0; + } + // Not appropriate + return false; + }; + operation.disabled = function () { + return false; + }; + operation.tooltip = function () { + return t('operations.detachNode.description'); + }; + operation.annotation = function () { + return t('operations.detachNode.annotation'); + }; + operation.id = 'detachNode'; + operation.keys = [t('operations.detachNode.key')]; + operation.title = t('operations.detachNode.title'); + operation.behavior = behaviorOperation(context).which(operation); + return operation; +} diff --git a/modules/operations/index.js b/modules/operations/index.js index 1ad24cd97..8339d8205 100644 --- a/modules/operations/index.js +++ b/modules/operations/index.js @@ -10,3 +10,4 @@ export { operationReverse } from './reverse'; export { operationRotate } from './rotate'; export { operationSplit } from './split'; export { operationStraighten } from './straighten'; +export { operationDetachNode } from './detach_node'; diff --git a/svg/iD-sprite/operations/operation-detachNode.svg b/svg/iD-sprite/operations/operation-detachNode.svg new file mode 100644 index 000000000..fea5ba873 --- /dev/null +++ b/svg/iD-sprite/operations/operation-detachNode.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/test/index.html b/test/index.html index 188b9084c..73fd6cc59 100644 --- a/test/index.html +++ b/test/index.html @@ -1,5 +1,6 @@ + Mocha Tests @@ -7,6 +8,7 @@ +
@@ -17,9 +19,9 @@ @@ -60,6 +62,7 @@ + @@ -138,7 +141,8 @@ - + + \ No newline at end of file diff --git a/test/spec/actions/detach_node.js b/test/spec/actions/detach_node.js new file mode 100644 index 000000000..70739b640 --- /dev/null +++ b/test/spec/actions/detach_node.js @@ -0,0 +1,540 @@ +describe('iD.actionDetachNode', function () { + var tags = { 'name': 'test' }; + function createTargetNode(id, lonlat) { + return iD.Node({ id: id, loc: lonlat, tags: tags }); + } + describe('simple way', function () { + var graph; + beforeEach(function () { + // Set up a simple way + // a-b-c-d + // (0,0)-(1,0)-(2,0)-(3,0) + graph = iD.Graph([ + iD.Node({ id: 'a', loc: [0, 0] }), + iD.Node({ id: 'b', loc: [1, 0] }), + iD.Node({ id: 'c', loc: [2, 0] }), + iD.Node({ id: 'd', loc: [3, 0] }), + iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd'] }) + ]); + }); + + describe('target in first position', function () { + beforeEach(function () { + // Swap target into the location & position of A + var targetNode = createTargetNode('a', graph.entity('a').loc); + graph = graph.replace(targetNode); + }); + + it('does not change length of way', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // Confirm that the way still has 4 nodes + var target = assertionGraph.entity('w'); + expect(target.nodes.length).to.eql(4); + }); + + it('does not change order of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // Confirm that the way is ordered correctly + var target = assertionGraph.entity('w'); + // Note that we can't be sure of the id of the replacement node + // so we only assert the nodes we know the ids for + // As we have already confirmed the size of the array we can assume + // that the replacement node is in the correct posisiton by a process of elimination + expect(target.nodes[1]).to.eql('b'); + expect(target.nodes[2]).to.eql('c'); + expect(target.nodes[3]).to.eql('d'); + }); + + it('does not change location of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // Confirm that the nodes have not moved, including the replacement node + var nodes = assertionGraph.entity('w').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 0]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([3, 0]); + }); + + it('does replace target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + var nodes = assertionGraph.entity('w').nodes; + // Confirm that the target is no longer "a" + expect(nodes[0]).not.to.eql('a'); + // and that the tags are not present + expect(assertionGraph.entity(nodes[0]).tags).to.eql({}); + }); + + it('does detach target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // confirm that a still exists + var targetNode = assertionGraph.entity('a'); + expect(targetNode).not.to.eql(undefined); + // .., and that the location is correct + expect(targetNode.loc).to.eql([0, 0]); + // ... and that the tags are intact + expect(targetNode.tags).to.eql(tags); + // ... and that the parentWay is empty + expect(assertionGraph.parentWays(targetNode)).to.eql([]); + }); + }); + + describe('target in second position', function () { + beforeEach(function () { + // Swap target into the location & position of B + var targetNode = createTargetNode('b', graph.entity('b').loc); + graph = graph.replace(targetNode); + }); + + it('does not change length of way', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Confirm that the way still has 4 nodes + var target = assertionGraph.entity('w'); + expect(target.nodes.length).to.eql(4); + }); + + it('does not change order of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Confirm that the way is ordered correctly + var target = assertionGraph.entity('w'); + // Note that we can't be sure of the id of the replacement node + // so we only assert the nodes we know the ids for + // As we have already confirmed the size of the array we can assume + // that the replacement node is in the correct posisiton by a process of elimination + expect(target.nodes[0]).to.eql('a'); + expect(target.nodes[2]).to.eql('c'); + expect(target.nodes[3]).to.eql('d'); + }); + + it('does not change location of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Confirm that the nodes have not moved, including the replacement node + var nodes = assertionGraph.entity('w').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 0]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([3, 0]); + }); + + it('does replace target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + var nodes = assertionGraph.entity('w').nodes; + // Confirm that the target is no longer "a" + expect(nodes[1]).not.to.eql('b'); + // and that the tags are not present + expect(assertionGraph.entity(nodes[1]).tags).to.eql({}); + }); + + it('does detach target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // confirm that a still exists + var targetNode = assertionGraph.entity('b'); + expect(targetNode).not.to.eql(undefined); + // .., and that the location is correct + expect(targetNode.loc).to.eql([1, 0]); + // ... and that the tags are intact + expect(targetNode.tags).to.eql(tags); + // ... and that the parentWay is empty + expect(assertionGraph.parentWays(targetNode)).to.eql([]); + }); + }); + }); + describe('closed way', function () { + var graph; + beforeEach(function () { + // Set up a closed way + // a-b (0,0)-(1,0) + // | | + // d-c (0,1)-(1,1) + graph = iD.Graph([ + iD.Node({ id: 'a', loc: [0, 0] }), + iD.Node({ id: 'b', loc: [1, 0] }), + iD.Node({ id: 'c', loc: [1, 1] }), + iD.Node({ id: 'd', loc: [0, 1] }), + iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd', 'a'] }) + ]); + }); + + describe('target in first position', function () { + beforeEach(function () { + // Swap target into the location & position of A + var targetNode = createTargetNode('a', graph.entity('a').loc); + graph = graph.replace(targetNode); + }); + + it('does not change length of way', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // Confirm that the way still has 5 nodes + var target = assertionGraph.entity('w'); + expect(target.nodes.length).to.eql(5); + }); + + it('does not change order of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // Confirm that the way is ordered correctly + var target = assertionGraph.entity('w'); + // Note that we can't be sure of the id of the replacement node + // so we only assert the nodes we know the ids for + // As we have already confirmed the size of the array we can assume + // that the replacement node is in the correct posisiton by a process of elimination + expect(target.nodes[1]).to.eql('b'); + expect(target.nodes[2]).to.eql('c'); + expect(target.nodes[3]).to.eql('d'); + // Need to confirm that the id of the first & last node is the same so that the way remains closed + expect(target.nodes[0]).to.eql(target.nodes[4]); + }); + + it('does not change location of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // Confirm that the nodes have not moved, including the replacement node + var nodes = assertionGraph.entity('w').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 1]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([0, 1]); + // We don't need to assert node[4] location as we've already confirmed that it is the same as node 0 + }); + + it('does replace target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + var nodes = assertionGraph.entity('w').nodes; + // Confirm that the target is no longer "a" + expect(nodes[0]).not.to.eql('a'); + // .. also in the tail position + expect(nodes[4]).not.to.eql('a'); + // and that the tags are not present (already confirmed same node in position 0 & 4, so only need to check tags once) + expect(assertionGraph.entity(nodes[0]).tags).to.eql({}); + }); + + it('does detach target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('a')(graph); + + // confirm that a still exists + var targetNode = assertionGraph.entity('a'); + expect(targetNode).not.to.eql(undefined); + // .., and that the location is correct + expect(targetNode.loc).to.eql([0, 0]); + // ... and that the tags are intact + expect(targetNode.tags).to.eql(tags); + // ... and that the parentWay is empty + expect(assertionGraph.parentWays(targetNode)).to.eql([]); + }); + }); + + describe('target in second position', function () { + beforeEach(function () { + // Swap target into the location & position of B + var targetNode = createTargetNode('b', graph.entity('b').loc); + graph = graph.replace(targetNode); + }); + + it('does not change length of way', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Confirm that the way still has 5 nodes + var target = assertionGraph.entity('w'); + expect(target.nodes.length).to.eql(5); + }); + + it('does not change order of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Confirm that the way is ordered correctly + var target = assertionGraph.entity('w'); + // Note that we can't be sure of the id of the replacement node + // so we only assert the nodes we know the ids for + // As we have already confirmed the size of the array we can assume + // that the replacement node is in the correct posisiton by a process of elimination + expect(target.nodes[0]).to.eql('a'); + expect(target.nodes[2]).to.eql('c'); + expect(target.nodes[3]).to.eql('d'); + expect(target.nodes[4]).to.eql('a'); + }); + + it('does not change location of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Confirm that the nodes have not moved, including the replacement node + var nodes = assertionGraph.entity('w').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 1]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([0, 1]); + // Confirmed already that node[4] is node[0] so no further assertion needed + }); + + it('does replace target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + var nodes = assertionGraph.entity('w').nodes; + // Confirm that the target is no longer "a" + expect(nodes[1]).not.to.eql('b'); + // and that the tags are not present + expect(assertionGraph.entity(nodes[1]).tags).to.eql({}); + }); + + it('does detach target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('b')(graph); + + // confirm that a still exists + var targetNode = assertionGraph.entity('b'); + expect(targetNode).not.to.eql(undefined); + // .., and that the location is correct + expect(targetNode.loc).to.eql([1, 0]); + // ... and that the tags are intact + expect(targetNode.tags).to.eql(tags); + // ... and that the parentWay is empty + expect(assertionGraph.parentWays(targetNode)).to.eql([]); + }); + }); + }); + describe('intersecting simple ways', function () { + var graph; + beforeEach(function () { + // Set up two simple ways + // a-b-c-d (0,0)-(1,0)-(2,0)-(3,0) + // e (2,1) + // f (2,2) + // Node c represents the target + graph = iD.Graph([ + iD.Node({ id: 'a', loc: [0, 0] }), + iD.Node({ id: 'b', loc: [1, 0] }), + iD.Node({ id: 'c', loc: [2, 0], tags: tags }), + iD.Node({ id: 'd', loc: [3, 0] }), + iD.Node({ id: 'e', loc: [2, 1] }), + iD.Node({ id: 'f', loc: [2, 2] }), + iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd'] }), + iD.Way({ id: 'x', nodes: ['c', 'e', 'f'] }) + ]); + }); + + it('does not change length of ways', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // Confirm that the way still has 4 nodes + var target = assertionGraph.entity('w'); + expect(target.nodes.length).to.eql(4); + // .. and second way has 3 + target = assertionGraph.entity('x'); + expect(target.nodes.length).to.eql(3); + }); + + it('does not change order of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // Confirm that the way is ordered correctly + var target = assertionGraph.entity('w'); + // Note that we can't be sure of the id of the replacement node + // so we only assert the nodes we know the ids for + // As we have already confirmed the size of the array we can assume + // that the replacement node is in the correct posisiton by a process of elimination + expect(target.nodes[0]).to.eql('a'); + expect(target.nodes[1]).to.eql('b'); + expect(target.nodes[3]).to.eql('d'); + // and second way + target = assertionGraph.entity('x'); + expect(target.nodes[1]).to.eql('e'); + expect(target.nodes[2]).to.eql('f'); + }); + + it('does not change location of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // Confirm that the nodes have not moved, including the replacement node + var nodes = assertionGraph.entity('w').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 0]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([3, 0]); + // and second way + nodes = assertionGraph.entity('x').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([2, 0]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([2, 1]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 2]); + }); + + it('uses same replacement node at intersection', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + // Confirm both ways have the same replacement node + expect(assertionGraph.entity('w').nodes[2]).to.eql(assertionGraph.entity('x').nodes[0]); + }); + + it('does replace target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + var nodes = assertionGraph.entity('w').nodes; + // Confirm that the target is no longer "c" + expect(nodes[2]).not.to.eql('c'); + // and that the tags are not present + expect(assertionGraph.entity(nodes[2]).tags).to.eql({}); + // Confirm that the second way's first node is the same + expect(assertionGraph.entity('x').nodes[0]).to.eql(nodes[2]); + }); + + it('does detach target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // confirm that a still exists + var targetNode = assertionGraph.entity('c'); + expect(targetNode).not.to.eql(undefined); + // .., and that the location is correct + expect(targetNode.loc).to.eql([2, 0]); + // ... and that the tags are intact + expect(targetNode.tags).to.eql(tags); + // ... and that the parentWay is empty + expect(assertionGraph.parentWays(targetNode)).to.eql([]); + }); + }); + describe('intersecting closed way', function () { + var graph; + beforeEach(function () { + // Set up two intersecting closed ways + // a-b (0,0)-(1,0) + // | | + // d-c-e (0,1)-(1,1)-(2,1) + // | | + // g f (0,2) - (1,2) + // C is the target node + graph = iD.Graph([ + iD.Node({ id: 'a', loc: [0, 0] }), + iD.Node({ id: 'b', loc: [1, 0] }), + iD.Node({ id: 'c', loc: [1, 1], tags: tags }), + iD.Node({ id: 'd', loc: [0, 1] }), + iD.Node({ id: 'e', loc: [2, 1] }), + iD.Node({ id: 'f', loc: [1, 2] }), + iD.Node({ id: 'g', loc: [0, 2] }), + iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd', 'a'] }), + iD.Way({ id: 'x', nodes: ['c', 'e', 'f', 'g', 'c'] }) + ]); + }); + + it('does not change length of ways', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // Confirm that the way still has 5 nodes + var target = assertionGraph.entity('w'); + expect(target.nodes.length).to.eql(5); + // and the second + target = assertionGraph.entity('x'); + expect(target.nodes.length).to.eql(5); + }); + + it('does not change order of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // Confirm that the way is ordered correctly + var target = assertionGraph.entity('w'); + // Note that we can't be sure of the id of the replacement node + // so we only assert the nodes we know the ids for + // As we have already confirmed the size of the array we can assume + // that the replacement node is in the correct posisiton by a process of elimination + expect(target.nodes[0]).to.eql('a'); + expect(target.nodes[1]).to.eql('b'); + expect(target.nodes[3]).to.eql('d'); + // Need to confirm that the id of the first & last node is the same so that the way remains closed + expect(target.nodes[0]).to.eql(target.nodes[4]); + // and the same for the other way + target = assertionGraph.entity('x'); + expect(target.nodes[1]).to.eql('e'); + expect(target.nodes[2]).to.eql('f'); + expect(target.nodes[3]).to.eql('g'); + expect(target.nodes[0]).to.eql(target.nodes[4]); + }); + + it('does not change location of nodes', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // Confirm that the nodes have not moved, including the replacement node + var nodes = assertionGraph.entity('w').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 1]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([0, 1]); + // We don't need to assert node[4] location as we've already confirmed that it is the same as node 0 + // and the other way + nodes = assertionGraph.entity('x').nodes; + expect(assertionGraph.entity(nodes[0]).loc).to.eql([1, 1]); + expect(assertionGraph.entity(nodes[1]).loc).to.eql([2, 1]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 2]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([0, 2]); + }); + + it('uses same replacement node at intersection', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + // Confirm both ways have the same replacement node + expect(assertionGraph.entity('w').nodes[2]).to.eql(assertionGraph.entity('x').nodes[0]); + }); + + it('does replace target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + var nodes = assertionGraph.entity('w').nodes; + // Confirm that the target is no longer "c" + expect(nodes[0]).not.to.eql('c'); + // .. also in the tail position + expect(nodes[4]).not.to.eql('c'); + // and that the tags are not present (already confirmed same node in position 0 & 4, so only need to check tags once) + expect(assertionGraph.entity(nodes[0]).tags).to.eql({}); + // Don't need to check for way 2 since we've already confirmed it is the same node + }); + + it('does detach target node', function () { + // Act + var assertionGraph = iD.actionDetachNode('c')(graph); + + // confirm that a still exists + var targetNode = assertionGraph.entity('c'); + expect(targetNode).not.to.eql(undefined); + // .., and that the location is correct + expect(targetNode.loc).to.eql([1, 1]); + // ... and that the tags are intact + expect(targetNode.tags).to.eql(tags); + // ... and that the parentWay is empty + expect(assertionGraph.parentWays(targetNode)).to.eql([]); + }); + }); +}); \ No newline at end of file From 3b6b4bb7be3fd1d02d8ca881733e7e6cc13ab816 Mon Sep 17 00:00:00 2001 From: Jon D Date: Sat, 7 Jul 2018 10:37:58 +0100 Subject: [PATCH 002/217] Clean up SVG --- .../operations/operation-detachNode.svg | 66 ++----------------- 1 file changed, 7 insertions(+), 59 deletions(-) diff --git a/svg/iD-sprite/operations/operation-detachNode.svg b/svg/iD-sprite/operations/operation-detachNode.svg index fea5ba873..504acc2cb 100644 --- a/svg/iD-sprite/operations/operation-detachNode.svg +++ b/svg/iD-sprite/operations/operation-detachNode.svg @@ -1,61 +1,9 @@ - + + - - - - image/svg+xml - - - - - - - - - + xmlns="http://www.w3.org/2000/svg" version="1.1" x="0" y="0" width="20" height="20" viewBox="0 0 20 20" id="svg838"> + + + + From 3fe6f16526a4421db684b398b2efc63341f1d648 Mon Sep 17 00:00:00 2001 From: Jon D Date: Sat, 7 Jul 2018 10:50:44 +0100 Subject: [PATCH 003/217] Fix keyboard shortcut clash --- data/core.yaml | 2 +- dist/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 820e0fc0d..20d827514 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -231,7 +231,7 @@ en: delete: Deleted a turn restriction detachNode: title: Detach - key: D + key: T description: Detach this node from these lines/areas. annotation: Detached a node from owning lines/areas. restriction: diff --git a/dist/locales/en.json b/dist/locales/en.json index 8abaa9db5..15dbd00c9 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -300,7 +300,7 @@ }, "detachNode": { "title": "Detach", - "key": "D", + "key": "T", "description": "Detach this node from these lines/areas.", "annotation": "Detached a node from owning lines/areas." } From dd3de593ca85653ab82d0f3162df75320f34e887 Mon Sep 17 00:00:00 2001 From: Jon D Date: Sat, 7 Jul 2018 11:12:41 +0100 Subject: [PATCH 004/217] Add tests for Detach Node operation --- test/index.html | 1 + test/spec/operations/detach_node.js | 85 +++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 test/spec/operations/detach_node.js diff --git a/test/index.html b/test/index.html index 73fd6cc59..f0a1f7189 100644 --- a/test/index.html +++ b/test/index.html @@ -140,6 +140,7 @@ + diff --git a/test/spec/operations/detach_node.js b/test/spec/operations/detach_node.js new file mode 100644 index 000000000..6604ce051 --- /dev/null +++ b/test/spec/operations/detach_node.js @@ -0,0 +1,85 @@ +describe('iD.operationDetachNode', function () { + var fakeContext; + var graph; + var fakeTags = { 'name': 'fake' }; + beforeEach(function () { + // Set up graph + var createFakeNode = function (id, hasTags) { + return hasTags + ? { id: id, type: 'node', tags: fakeTags } + : { id: id, type: 'node' }; + }; + // a - node with tags & parent way + // b - node with tags & 2 parent ways + // c - node with no tags, parent way + // d - node with no tags, 2 parent ways + // e - node with tags, no parent way + // f - node with no tags, no parent way + graph = iD.Graph([ + iD.Node(createFakeNode('a', true)), + iD.Node(createFakeNode('b', true)), + iD.Node(createFakeNode('c', false)), + iD.Node(createFakeNode('d', false)), + iD.Node(createFakeNode('e', true)), + iD.Node(createFakeNode('f', false)), + iD.Way({ id: 'x', nodes: ['a', 'b', 'c', 'd'] }), + iD.Way({ id: 'y', nodes: ['b', 'd'] }) + ]); + + // Set up the fake context + fakeContext = {}; + fakeContext.graph = function () { + return graph; + }; + }); + + it('is not available for no selected ids', function () { + var result = iD.operationDetachNode([], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for two selected ids', function () { + var result = iD.operationDetachNode(['a', 'b'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for unkown selected id', function () { + var result = iD.operationDetachNode(['z'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected way', function () { + var result = iD.operationDetachNode(['x'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with tags, no parent way', function () { + var result = iD.operationDetachNode(['e'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with no tags, no parent way', function () { + var result = iD.operationDetachNode(['f'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with no tags, parent way', function () { + var result = iD.operationDetachNode(['c'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with no tags, two parent ways', function () { + var result = iD.operationDetachNode(['d'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is available for selected node with tags, parent way', function () { + var result = iD.operationDetachNode(['a'], fakeContext).available(); + expect(result).to.eql(true); + }); + + it('is available for selected node with tags, two parent ways', function () { + var result = iD.operationDetachNode(['b'], fakeContext).available(); + expect(result).to.eql(true); + }); +}); From 836517a9fe336385689f3a70ad7bb13f971cef66 Mon Sep 17 00:00:00 2001 From: Matias Volpe Date: Thu, 12 Jul 2018 09:11:18 -0300 Subject: [PATCH 005/217] Add ability to resize to PhotoViewer --- css/60_photos.css | 41 ++++++++++++++++++++-- modules/services/mapillary.js | 7 ++++ modules/ui/init.js | 64 ++++++++++++++++++++++++++++++++++- 3 files changed, 108 insertions(+), 4 deletions(-) diff --git a/css/60_photos.css b/css/60_photos.css index d1e84d79c..d7f4adff5 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -12,11 +12,46 @@ border-radius: 0; padding: 5px; position: absolute; - right: 0; - top: 0; - z-index: 48; + right: 5px; + top: 5px; + z-index: 50; } +#photoviewer button.resize-handle-xy { + border-radius: 0; + position: absolute; + top: 0; + right: 0; + z-index: 49; + cursor: nesw-resize; + height: 10px; + width: 10px; +} + +#photoviewer button.resize-handle-x { + border-radius: 0; + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 48; + cursor: ew-resize; + height: auto; + width: 5px; +} + +#photoviewer button.resize-handle-y { + border-radius: 0; + position: absolute; + top: 0; + right: 0; + z-index: 48; + cursor: ns-resize; + height: 5px; + width: 100%; +} + + .photo-wrapper, .photo-wrapper img { width: 100%; diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index baed207b8..01aefaae2 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -431,6 +431,13 @@ export default { // load mapillary signs sprite var defs = context.container().select('defs'); defs.call(svgDefs(context).addSprites, ['mapillary-sprite']); + + // Register viewer resize handler + context.ui().on('photoviewerResize', function() { + if (_mlyViewer) { + _mlyViewer.resize(); + } + }); }, diff --git a/modules/ui/init.js b/modules/ui/init.js index 7e1d134fc..e196d507f 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -2,6 +2,7 @@ import { event as d3_event, select as d3_select } from 'd3-selection'; +import { dispatch as d3_dispatch } from 'd3-dispatch'; import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; @@ -13,6 +14,7 @@ import { modeBrowse } from '../modes'; import { services } from '../services'; import { svgDefs, svgIcon } from '../svg'; import { utilGetDimensions } from '../util/dimensions'; +import { utilRebind } from '../util'; import { uiAccount } from './account'; import { uiAttribution } from './attribution'; @@ -42,9 +44,46 @@ import { uiVersion } from './version'; import { uiZoom } from './zoom'; import { uiCmd } from './cmd'; +function buildResizeListener(target, eventName, dispatch, options) { + var resizeOnX = !!options.resizeOnX; + var resizeOnY = !!options.resizeOnY; + var startX; + var startY; + var startWidth; + var startHeight; + + function startResize() { + if (resizeOnX) { + target.style('width', (startWidth + d3_event.clientX - startX) + 'px'); + } + + if (resizeOnY) { + target.style('height', (startHeight + startY - d3_event.clientY) + 'px'); + } + + dispatch.call(eventName, target); + } + + function stopResize() { + d3_select(window) + .on('.' + eventName, null); + } + + return function initResize() { + startX = d3_event.clientX; + startY = d3_event.clientY; + startWidth = target.node().getBoundingClientRect().width; + startHeight = target.node().getBoundingClientRect().height; + + d3_select(window) + .on('mousemove.' + eventName, startResize, false) + .on('mouseup.' + eventName, stopResize, false); + }; +} export function uiInit(context) { var uiInitCounter = 0; + var dispatch = d3_dispatch('photoviewerResize'); function render(container) { @@ -256,6 +295,29 @@ export function uiInit(context) { .append('div') .call(svgIcon('#iD-icon-close')); + photoviewer + .append('button') + .attr('class', 'resize-handle-xy') + .on( + 'mousedown', + buildResizeListener(photoviewer, 'photoviewerResize', dispatch, { resizeOnX: true, resizeOnY: true }) + ); + + photoviewer + .append('button') + .attr('class', 'resize-handle-x') + .on( + 'mousedown', + buildResizeListener(photoviewer, 'photoviewerResize', dispatch, { resizeOnX: true }) + ); + + photoviewer + .append('button') + .attr('class', 'resize-handle-y') + .on( + 'mousedown', + buildResizeListener(photoviewer, 'photoviewerResize', dispatch, { resizeOnY: true }) + ); window.onbeforeunload = function() { return context.save(); @@ -370,5 +432,5 @@ export function uiInit(context) { ui.sidebar = uiSidebar(context); - return ui; + return utilRebind(ui, dispatch, 'on'); } From 0ea0749135838b54f1c8efc59b62d692e3273095 Mon Sep 17 00:00:00 2001 From: Matias Volpe Date: Fri, 13 Jul 2018 09:16:36 -0300 Subject: [PATCH 006/217] Add minimum resize height/width --- modules/ui/init.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/ui/init.js b/modules/ui/init.js index e196d507f..3e4c695c5 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -47,6 +47,8 @@ import { uiCmd } from './cmd'; function buildResizeListener(target, eventName, dispatch, options) { var resizeOnX = !!options.resizeOnX; var resizeOnY = !!options.resizeOnY; + var minHeight = options.minHeight || 240; + var minWidth = options.minWidth || 320; var startX; var startY; var startWidth; @@ -54,11 +56,13 @@ function buildResizeListener(target, eventName, dispatch, options) { function startResize() { if (resizeOnX) { - target.style('width', (startWidth + d3_event.clientX - startX) + 'px'); + var newWidth = Math.max(minWidth, startWidth + d3_event.clientX - startX); + target.style('width', newWidth + 'px'); } if (resizeOnY) { - target.style('height', (startHeight + startY - d3_event.clientY) + 'px'); + var newHeight = Math.max(minHeight, startHeight + startY - d3_event.clientY); + target.style('height', newHeight + 'px'); } dispatch.call(eventName, target); From d4b162266794982ebae2417a3b5f4d5bf219d7e4 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sat, 14 Jul 2018 19:15:25 -0400 Subject: [PATCH 007/217] moved getTiles and filtering to utils --- dist/locales/en.json | 4 +- modules/lib/d3.geo.tile.js | 93 ----------------- modules/lib/index.js | 1 - modules/renderer/tile_layer.js | 5 +- modules/services/mapillary.js | 46 +-------- modules/services/openstreetcam.js | 65 +++--------- modules/services/osm.js | 30 +----- modules/services/streetside.js | 50 +-------- modules/util/index.js | 1 + modules/util/tile.js | 165 ++++++++++++++++++++++++++++++ package.json | 2 +- 11 files changed, 199 insertions(+), 263 deletions(-) delete mode 100644 modules/lib/d3.geo.tile.js create mode 100644 modules/util/tile.js diff --git a/dist/locales/en.json b/dist/locales/en.json index 8e9018bfb..3931424de 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -6681,7 +6681,7 @@ "attribution": { "text": "Terms & Feedback" }, - "description": "DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.", + "description": "Premium DigitalGlobe satellite imagery.", "name": "DigitalGlobe Premium Imagery" }, "DigitalGlobe-Premium-vintage": { @@ -6695,7 +6695,7 @@ "attribution": { "text": "Terms & Feedback" }, - "description": "DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.", + "description": "Standard DigitalGlobe satellite imagery.", "name": "DigitalGlobe Standard Imagery" }, "DigitalGlobe-Standard-vintage": { diff --git a/modules/lib/d3.geo.tile.js b/modules/lib/d3.geo.tile.js deleted file mode 100644 index 3b0f718ef..000000000 --- a/modules/lib/d3.geo.tile.js +++ /dev/null @@ -1,93 +0,0 @@ -import { range as d3_range } from 'd3-array'; - - -export function d3geoTile() { - var _size = [960, 500]; - var _scale = 256; - var _scaleExtent = [0, 20]; - var _translate = [_size[0] / 2, _size[1] / 2]; - var _zoomDelta = 0; - var _margin = 0; - - function bound(val) { - return Math.min(_scaleExtent[1], Math.max(_scaleExtent[0], val)); - } - - function tile() { - var z = Math.max(Math.log(_scale) / Math.LN2 - 8, 0); - var z0 = bound(Math.round(z + _zoomDelta)); - var k = Math.pow(2, z - z0 + 8); - var origin = [ - (_translate[0] - _scale / 2) / k, - (_translate[1] - _scale / 2) / k - ]; - - var cols = d3_range( - Math.max(0, Math.floor(-origin[0]) - _margin), - Math.max(0, Math.ceil(_size[0] / k - origin[0]) + _margin) - ); - var rows = d3_range( - Math.max(0, Math.floor(-origin[1]) - _margin), - Math.max(0, Math.ceil(_size[1] / k - origin[1]) + _margin) - ); - - var tiles = []; - for (var i = 0; i < rows.length; i++) { - var y = rows[i]; - for (var j = 0; j < cols.length; j++) { - var x = cols[j]; - - if (i >= _margin && i <= rows.length - _margin && - j >= _margin && j <= cols.length - _margin) { - tiles.unshift([x, y, z0]); // tiles in view at beginning - } else { - tiles.push([x, y, z0]); // tiles in margin at the end - } - } - } - - tiles.translate = origin; - tiles.scale = k; - - return tiles; - } - - tile.scaleExtent = function(val) { - if (!arguments.length) return _scaleExtent; - _scaleExtent = val; - return tile; - }; - - tile.size = function(val) { - if (!arguments.length) return _size; - _size = val; - return tile; - }; - - tile.scale = function(val) { - if (!arguments.length) return _scale; - _scale = val; - return tile; - }; - - tile.translate = function(val) { - if (!arguments.length) return _translate; - _translate = val; - return tile; - }; - - tile.zoomDelta = function(val) { - if (!arguments.length) return _zoomDelta; - _zoomDelta = +val; - return tile; - }; - - // number to extend the rows/columns beyond those covering the viewport - tile.margin = function(val) { - if (!arguments.length) return _margin; - _margin = +val; - return tile; - }; - - return tile; -} diff --git a/modules/lib/index.js b/modules/lib/index.js index b6ddad54a..bee98416c 100644 --- a/modules/lib/index.js +++ b/modules/lib/index.js @@ -1,3 +1,2 @@ export { d3combobox } from './d3.combobox'; -export { d3geoTile } from './d3.geo.tile'; export { d3keybinding } from './d3.keybinding'; diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index 475147e43..d5c59e9b9 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -1,15 +1,14 @@ import { select as d3_select } from 'd3-selection'; import { t } from '../util/locale'; -import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile'; import { geoScaleToZoom, geoVecLength } from '../geo'; -import { utilPrefixCSSProperty } from '../util'; +import { utilPrefixCSSProperty, utilTile } from '../util'; export function rendererTileLayer(context) { var tileSize = 256; var transformProp = utilPrefixCSSProperty('Transform'); - var geotile = d3_geoTile(); + var geotile = utilTile(); var _projection; var _cache = {}; diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index baed207b8..84395e20c 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -18,11 +18,12 @@ import { import rbush from 'rbush'; -import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile'; import { geoExtent } from '../geo'; import { svgDefs } from '../svg'; import { utilDetect } from '../util/detect'; -import { utilQsString, utilRebind } from '../util'; +import { utilQsString, utilRebind, utilTile } from '../util'; + +var geoTile = utilTile(); var apibase = 'https://a.mapillary.com/v3/'; var viewercss = 'mapillary-js/mapillary.min.css'; @@ -79,49 +80,12 @@ function localeTimestamp(s) { } -function getTiles(projection) { - var s = projection.scale() * 2 * Math.PI; - var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); - var ts = 256 * Math.pow(2, z - tileZoom); - var origin = [ - s / 2 - projection.translate()[0], - s / 2 - projection.translate()[1] - ]; - - return d3_geoTile() - .scaleExtent([tileZoom, tileZoom]) - .scale(s) - .size(projection.clipExtent()[1]) - .translate(projection.translate())() - .map(function(tile) { - var x = tile[0] * ts - origin[0]; - var y = tile[1] * ts - origin[1]; - - return { - id: tile.toString(), - xyz: tile, - extent: geoExtent( - projection.invert([x, y + ts]), - projection.invert([x + ts, y]) - ) - }; - }); -} - - function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = getTiles(projection).filter(function(t) { - return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]); - }); - - _filter(which.inflight, function(v, k) { - var wanted = _find(tiles, function(tile) { return k === (tile.id + ',0'); }); - if (!wanted) delete which.inflight[k]; - return !wanted; - }).map(abortRequest); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection)); + geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); tiles.forEach(function(tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 14ded2d6b..848ea1fce 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -22,9 +22,9 @@ import { import rbush from 'rbush'; -import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile'; import { geoExtent } from '../geo'; +import { utilTile } from '../util'; import { utilDetect } from '../util/detect'; import { @@ -33,18 +33,19 @@ import { utilSetTransform } from '../util'; +var geoTile = utilTile(); -var apibase = 'https://openstreetcam.org', - maxResults = 1000, - tileZoom = 14, - dispatch = d3_dispatch('loadedImages'), - imgZoom = d3_zoom() - .extent([[0, 0], [320, 240]]) - .translateExtent([[0, 0], [320, 240]]) - .scaleExtent([1, 15]) - .on('zoom', zoomPan), - _oscCache, - _oscSelectedImage; +var apibase = 'https://openstreetcam.org'; +var maxResults = 1000; +var tileZoom = 14; +var dispatch = d3_dispatch('loadedImages'); +var imgZoom = d3_zoom() + .extent([[0, 0], [320, 240]]) + .translateExtent([[0, 0], [320, 240]]) + .scaleExtent([1, 15]) + .on('zoom', zoomPan); +var _oscCache; +var _oscSelectedImage; function abortRequest(i) { @@ -74,48 +75,12 @@ function maxPageAtZoom(z) { } -function getTiles(projection) { - var s = projection.scale() * 2 * Math.PI, - z = Math.max(Math.log(s) / Math.log(2) - 8, 0), - ts = 256 * Math.pow(2, z - tileZoom), - origin = [ - s / 2 - projection.translate()[0], - s / 2 - projection.translate()[1]]; - - return d3_geoTile() - .scaleExtent([tileZoom, tileZoom]) - .scale(s) - .size(projection.clipExtent()[1]) - .translate(projection.translate())() - .map(function(tile) { - var x = tile[0] * ts - origin[0], - y = tile[1] * ts - origin[1]; - - return { - id: tile.toString(), - xyz: tile, - extent: geoExtent( - projection.invert([x, y + ts]), - projection.invert([x + ts, y]) - ) - }; - }); -} - - function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI, currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = getTiles(projection).filter(function(t) { - return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]); - }); - - _filter(which.inflight, function(v, k) { - var wanted = _find(tiles, function(tile) { return k === (tile.id + ',0'); }); - if (!wanted) delete which.inflight[k]; - return !wanted; - }).map(abortRequest); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection)); + geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); tiles.forEach(function(tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/services/osm.js b/modules/services/osm.js index 9ead1f5b0..8f73006ee 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -13,7 +13,6 @@ import { xml as d3_xml } from 'd3-request'; import osmAuth from 'osm-auth'; import { JXON } from '../util/jxon'; -import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile'; import { geoExtent } from '../geo'; import { osmEntity, @@ -22,8 +21,9 @@ import { osmWay } from '../osm'; -import { utilRebind, utilIdleWorker } from '../util'; +import { utilRebind, utilIdleWorker, utilTile } from '../util'; +var geoTile = utilTile(); var dispatch = d3_dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded'); var urlroot = 'https://www.openstreetmap.org'; @@ -581,30 +581,8 @@ export default { s / 2 - projection.translate()[1] ]; - var tiles = d3_geoTile() - .scaleExtent([_tileZoom, _tileZoom]) - .scale(s) - .size(dimensions) - .translate(projection.translate())() - .map(function(tile) { - var x = tile[0] * ts - origin[0]; - var y = tile[1] * ts - origin[1]; - - return { - id: tile.toString(), - extent: geoExtent( - projection.invert([x, y + ts]), - projection.invert([x + ts, y])) - }; - }); - - _filter(_tiles.inflight, function(v, i) { - var wanted = _find(tiles, function(tile) { - return i === tile.id; - }); - if (!wanted) delete _tiles.inflight[i]; - return !wanted; - }).map(abortRequest); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(_tileZoom, projection)); + geoTile.removeInflightRequests(_tiles, tiles, abortRequest); tiles.forEach(function(tile) { var id = tile.id; diff --git a/modules/services/streetside.js b/modules/services/streetside.js index f13470b6c..944221543 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -17,7 +17,6 @@ import { import rbush from 'rbush'; import { t } from '../util/locale'; import { jsonpRequest } from '../util/jsonp_request'; -import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile'; import { geoExtent, @@ -29,10 +28,12 @@ import { } from '../geo'; import { utilDetect } from '../util/detect'; -import { utilQsString, utilRebind } from '../util'; +import { utilQsString, utilRebind, utilTile } from '../util'; import Q from 'q'; +var geoTile = utilTile(); + var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?'; var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/'; var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm'; @@ -85,46 +86,6 @@ function localeTimestamp(s) { return d.toLocaleString(detected.locale, options); } -/** - * getTiles() returns array of d3 geo tiles. - * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from - * an area around (and including) the current map view extents. - */ -function getTiles(projection, margin) { - // s is the current map scale - // z is the 'Level of Detail', or zoom-level, where Level 1 is far from the earth, and Level 23 is close to the ground. - // ts ('tile size') here is the formula for determining the width/height of the map in pixels, but with a modification. - // See 'Ground Resolution and Map Scale': //https://msdn.microsoft.com/en-us/library/bb259689.aspx. - // As used here, by subtracting constant 'tileZoom' from z (the level), you end up with a much smaller value for the tile size (in pixels). - var s = projection.scale() * 2 * Math.PI; - var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); - var ts = 256 * Math.pow(2, z - tileZoom); - var origin = [ - s / 2 - projection.translate()[0], - s / 2 - projection.translate()[1] - ]; - - var tiler = d3_geoTile() - .scaleExtent([tileZoom, tileZoom]) - .scale(s) - .size(projection.clipExtent()[1]) - .translate(projection.translate()) - .margin(margin || 0); // request nearby tiles so we can connect sequences. - - return tiler() - .map(function(tile) { - var x = tile[0] * ts - origin[0]; - var y = tile[1] * ts - origin[1]; - return { - id: tile.toString(), - xyz: tile, - extent: geoExtent( - projection.invert([x, y + ts]), - projection.invert([x + ts, y]) - ) - }; - }); -} /** * loadTiles() wraps the process of generating tiles and then fetching image points for each tile. @@ -133,10 +94,7 @@ function loadTiles(which, url, projection, margin) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - // breakup the map view into tiles - var tiles = getTiles(projection, margin).filter(function (t) { - return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]); - }); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, margin)); tiles.forEach(function (tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/util/index.js b/modules/util/index.js index f64856de8..9673bfef5 100644 --- a/modules/util/index.js +++ b/modules/util/index.js @@ -23,5 +23,6 @@ export { utilSessionMutex } from './session_mutex'; export { utilStringQs } from './util'; export { utilSuggestNames } from './suggest_names'; export { utilTagText } from './util'; +export { utilTile } from './tile'; export { utilTriggerEvent } from './trigger_event'; export { utilWrap } from './util'; diff --git a/modules/util/tile.js b/modules/util/tile.js new file mode 100644 index 000000000..78d9a6423 --- /dev/null +++ b/modules/util/tile.js @@ -0,0 +1,165 @@ +import _filter from 'lodash-es/filter'; +import _find from 'lodash-es/find'; +import { range as d3_range } from 'd3-array'; +import { geoExtent } from '../geo'; + + +export function utilTile() { + var _size = [960, 500]; + var _scale = 256; + var _scaleExtent = [0, 20]; + var _translate = [_size[0] / 2, _size[1] / 2]; + var _zoomDelta = 0; + var _margin = 0; + + function bound(val) { + return Math.min(_scaleExtent[1], Math.max(_scaleExtent[0], val)); + } + + function nearNullIsland(x, y, z) { + if (z >= 7) { + var center = Math.pow(2, z - 1); + var width = Math.pow(2, z - 6); + var min = center - (width / 2); + var max = center + (width / 2) - 1; + return x >= min && x <= max && y >= min && y <= max; + } + return false; + } + + function tile() { + var z = Math.max(Math.log(_scale) / Math.LN2 - 8, 0); + var z0 = bound(Math.round(z + _zoomDelta)); + var k = Math.pow(2, z - z0 + 8); + var origin = [ + (_translate[0] - _scale / 2) / k, + (_translate[1] - _scale / 2) / k + ]; + + var cols = d3_range( + Math.max(0, Math.floor(-origin[0]) - _margin), + Math.max(0, Math.ceil(_size[0] / k - origin[0]) + _margin) + ); + var rows = d3_range( + Math.max(0, Math.floor(-origin[1]) - _margin), + Math.max(0, Math.ceil(_size[1] / k - origin[1]) + _margin) + ); + + var tiles = []; + for (var i = 0; i < rows.length; i++) { + var y = rows[i]; + for (var j = 0; j < cols.length; j++) { + var x = cols[j]; + + if (i >= _margin && i <= rows.length - _margin && + j >= _margin && j <= cols.length - _margin) { + tiles.unshift([x, y, z0]); // tiles in view at beginning + } else { + tiles.push([x, y, z0]); // tiles in margin at the end + } + } + } + + tiles.translate = origin; + tiles.scale = k; + + return tiles; + } + + /** + * getTiles() returns array of d3 geo tiles. + * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from + * an area around (and including) the current map view extents. + */ + tile.getTiles = function(tileZoom, projection, margin) { + // s is the current map scale + // z is the 'Level of Detail', or zoom-level, where Level 1 is far from the earth, and Level 23 is close to the ground. + // ts ('tile size') here is the formula for determining the width/height of the map in pixels, but with a modification. + // See 'Ground Resolution and Map Scale': //https://msdn.microsoft.com/en-us/library/bb259689.aspx. + // As used here, by subtracting constant 'tileZoom' from z (the level), you end up with a much smaller value for the tile size (in pixels). + var s = projection.scale() * 2 * Math.PI; + var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); + var ts = 256 * Math.pow(2, z - tileZoom); + var origin = [ + s / 2 - projection.translate()[0], + s / 2 - projection.translate()[1] + ]; + + var tiler = this + .scaleExtent([tileZoom, tileZoom]) + .scale(s) + .size(projection.clipExtent()[1]) + .translate(projection.translate()) + .margin(margin || 0); // request nearby tiles so we can connect sequences. + + return tiler() + .map(function(tile) { + var x = tile[0] * ts - origin[0]; + var y = tile[1] * ts - origin[1]; + return { + id: tile.toString(), + xyz: tile, + extent: geoExtent( + projection.invert([x, y + ts]), + projection.invert([x + ts, y]) + ) + }; + }); + }; + + tile.filterNullIsland = function(tiles) { + return tiles.filter(function(t) { + return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]); + }); + }; + + // remove inflight requests that no longer cover the view.. + tile.removeInflightRequests = function(cache, tiles, callback, modifier) { + return _filter(cache.inflight, function(v, i) { + var wanted = _find(tiles, function(tile) { return i === tile.id + modifier; }); + if (!wanted) { + delete cache.inflight[i]; + } + return !wanted; + }).map(callback); // abort request + }; + + tile.scaleExtent = function(val) { + if (!arguments.length) return _scaleExtent; + _scaleExtent = val; + return tile; + }; + + tile.size = function(val) { + if (!arguments.length) return _size; + _size = val; + return tile; + }; + + tile.scale = function(val) { + if (!arguments.length) return _scale; + _scale = val; + return tile; + }; + + tile.translate = function(val) { + if (!arguments.length) return _translate; + _translate = val; + return tile; + }; + + tile.zoomDelta = function(val) { + if (!arguments.length) return _zoomDelta; + _zoomDelta = +val; + return tile; + }; + + // number to extend the rows/columns beyond those covering the viewport + tile.margin = function(val) { + if (!arguments.length) return _margin; + _margin = +val; + return tile; + }; + + return tile; +} diff --git a/package.json b/package.json index 3f2f448fc..a920390d4 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "json-stringify-pretty-compact": "^1.1.0", "jsonschema": "^1.1.0", "mapillary-js": "2.12.1", - "mapillary_sprite_source": "^1.4.0", + "mapillary_sprite_source": "^1.5.0", "minimist": "^1.2.0", "mocha": "^5.0.0", "mocha-phantomjs-core": "^2.1.0", From af2b67663b52322a0744e7205d2ac84a753d3bd7 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Tue, 17 Jul 2018 11:35:27 -0400 Subject: [PATCH 008/217] added new-note button --- css/55_cursors.css | 1 + data/core.yaml | 5 ++++ dist/locales/en.json | 8 +++++- modules/actions/add_note.js | 6 ++++ modules/actions/index.js | 1 + modules/modes/add_note.js | 53 ++++++++++++++++++++++++++++++++++++ modules/modes/index.js | 1 + modules/modes/select_note.js | 7 +++++ modules/svg/notes.js | 9 ------ modules/ui/init.js | 2 +- modules/ui/modes.js | 23 ++++++++++++++-- 11 files changed, 102 insertions(+), 14 deletions(-) create mode 100644 modules/actions/add_note.js create mode 100644 modules/modes/add_note.js diff --git a/css/55_cursors.css b/css/55_cursors.css index ef5aad85d..8247876db 100644 --- a/css/55_cursors.css +++ b/css/55_cursors.css @@ -82,6 +82,7 @@ } .mode-add-point #map, +.mode-add-note #map, .mode-browse.lasso #map, .mode-browse.lasso .way, .mode-browse.lasso .vertex, diff --git a/data/core.yaml b/data/core.yaml index 26e750653..308ffdc9c 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -16,6 +16,10 @@ en: title: Point description: "Add restaurants, monuments, postal boxes or other points to the map." tail: Click on the map to add a point. + add_note: + title: Note + description: "Spotted an issue? Let other mappers know." + tail: Click on the map to add a note. browse: title: Browse description: Pan and zoom the map. @@ -31,6 +35,7 @@ en: point: Added a point. vertex: Added a node to a way. relation: Added a relation. + note: Added a note. start: annotation: line: Started a line. diff --git a/dist/locales/en.json b/dist/locales/en.json index 6b2c5c7ff..0df3c4de9 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -21,6 +21,11 @@ "description": "Add restaurants, monuments, postal boxes or other points to the map.", "tail": "Click on the map to add a point." }, + "add_note": { + "title": "Note", + "description": "Spotted an issue? Let other mappers know.", + "tail": "Click on the map to add a note." + }, "browse": { "title": "Browse", "description": "Pan and zoom the map." @@ -40,7 +45,8 @@ "annotation": { "point": "Added a point.", "vertex": "Added a node to a way.", - "relation": "Added a relation." + "relation": "Added a relation.", + "note": "Added a note." } }, "start": { diff --git a/modules/actions/add_note.js b/modules/actions/add_note.js new file mode 100644 index 000000000..d36963a61 --- /dev/null +++ b/modules/actions/add_note.js @@ -0,0 +1,6 @@ +import osm from '../services/osm'; + +export function actionAddNote(note) { + osm.replaceNote(note); + console.log('actionAddNote: ', note); +} \ No newline at end of file diff --git a/modules/actions/index.js b/modules/actions/index.js index 330690db2..1e2339644 100644 --- a/modules/actions/index.js +++ b/modules/actions/index.js @@ -1,6 +1,7 @@ export { actionAddEntity } from './add_entity'; export { actionAddMember } from './add_member'; export { actionAddMidpoint } from './add_midpoint'; +export { actionAddNote } from './add_note'; export { actionAddVertex } from './add_vertex'; export { actionChangeMember } from './change_member'; export { actionChangePreset } from './change_preset'; diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js new file mode 100644 index 000000000..57f133c9b --- /dev/null +++ b/modules/modes/add_note.js @@ -0,0 +1,53 @@ +import { t } from '../util/locale'; +import { actionAddNote } from '../actions'; +import { behaviorDraw } from '../behavior'; +import { modeBrowse, modeSelectNote } from './index'; +import { osmNote } from '../osm'; +import { dispatch as d3_dispatch } from 'd3-dispatch'; + + + +export function modeAddNote(context) { + var mode = { + id: 'add-note', + button: 'note', + title: t('modes.add_note.title'), + description: t('modes.add_note.description'), + key: '4' + }; + + var behavior = behaviorDraw(context) + .tail(t('modes.add_note.tail')) + .on('click', add) + .on('cancel', cancel) + .on('finish', cancel); + + + function add(loc) { + var note = osmNote({ loc: loc }); + + // actionAddNote(note); + + context.enter( + modeSelectNote(context, [note.id]).newFeature(true) + ); + } + + + function cancel() { + context.enter(modeBrowse(context)); + } + + + mode.enter = function() { + context.install(behavior); + }; + + + mode.exit = function() { + context.uninstall(behavior); + }; + + + return mode; +} diff --git a/modules/modes/index.js b/modules/modes/index.js index ffcdf9868..56ed999d0 100644 --- a/modules/modes/index.js +++ b/modules/modes/index.js @@ -1,6 +1,7 @@ export { modeAddArea } from './add_area'; export { modeAddLine } from './add_line'; export { modeAddPoint } from './add_point'; +export { modeAddNote } from './add_note'; export { modeBrowse } from './browse'; export { modeDragNode } from './drag_node'; export { modeDrawArea } from './draw_area'; diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 8da727c8e..9433152d4 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -39,6 +39,8 @@ export function modeSelectNote(context, selectedNoteID) { behaviorLasso(context), ]; + var newFeature = false; + function checkSelectedID() { if (!osm) return; @@ -49,6 +51,11 @@ export function modeSelectNote(context, selectedNoteID) { return note; } + mode.newFeature = function(_) { + if (!arguments.length) return newFeature; + newFeature = _; + return mode; + }; mode.enter = function() { diff --git a/modules/svg/notes.js b/modules/svg/notes.js index b416e8ee4..43e23f080 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -82,15 +82,6 @@ export function svgNotes(projection, context, dispatch) { .append('g') .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; }); - // notesEnter - // .append('use') - // .attr('class', 'note-shadow') - // .attr('width', '24px') - // .attr('height', '24px') - // .attr('x', '-12px') - // .attr('y', '-24px') - // .attr('xlink:href', '#iD-icon-note'); - notesEnter .append('use') .attr('class', 'note-fill') diff --git a/modules/ui/init.js b/modules/ui/init.js index 7e1d134fc..cbdc7bd4b 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -101,7 +101,7 @@ export function uiInit(context) { limiter .append('div') - .attr('class', 'button-wrap joined col3') + .attr('class', 'button-wrap joined col5') .call(uiModes(context), limiter); limiter diff --git a/modules/ui/modes.js b/modules/ui/modes.js index eb86e30c3..8b434f8c4 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -3,10 +3,13 @@ import _debounce from 'lodash-es/debounce'; import { select as d3_select } from 'd3-selection'; import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; +import { svgNotes } from '../svg'; + import { modeAddArea, modeAddLine, modeAddPoint, + modeAddNote, modeBrowse } from '../modes'; @@ -19,7 +22,8 @@ export function uiModes(context) { var modes = [ modeAddPoint(context), modeAddLine(context), - modeAddArea(context) + modeAddArea(context), + modeAddNote(context) ]; @@ -29,6 +33,13 @@ export function uiModes(context) { } + function toggleNewNote() { + return svgNotes().enabled() + && context.connection().authenticated() + && ~~context.map().zoom() >= 12; + } + + return function(selection) { var buttons = selection.selectAll('button.add-button') .data(modes); @@ -36,7 +47,10 @@ export function uiModes(context) { buttons = buttons.enter() .append('button') .attr('tabindex', -1) - .attr('class', function(mode) { return mode.id + ' add-button col4'; }) + .attr('class', function(mode) { return mode.id + ' add-button col3'; }) + // .classed('disabled', function(mode) { + // return mode.id === 'add-note' && !svgNotes.enabled; // disable notes button + // }) .on('click.mode-buttons', function(mode) { // When drawing, ignore accidental clicks on mode buttons - #4042 var currMode = context.mode().id; @@ -109,10 +123,13 @@ export function uiModes(context) { .on('enter.modes', update); - function update() { selection.selectAll('button.add-button') + .filter(function(d) { return d.id !== 'add-note'; }) // disable all but add-note .property('disabled', !editable()); + + selection.selectAll('button.add-note') // disable add-note + .property('disabled', !toggleNewNote()); } }; } From ea2fffbd49274574ef5726015585b19e6382021b Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Tue, 17 Jul 2018 14:25:06 -0400 Subject: [PATCH 009/217] fix toggling new note button --- modules/ui/modes.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/ui/modes.js b/modules/ui/modes.js index 8b434f8c4..f024dfa96 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -99,7 +99,11 @@ export function uiModes(context) { modes.forEach(function(mode) { keybinding.on(mode.key, function() { - if (editable()) { + // TODO: allow zooming out beyond minZoom when adding new note. Currently prevented + if ( + (editable() && mode.id !== 'add-note') + || (toggleNewNote() && mode.id === 'add-note') + ) { if (mode.id === context.mode().id) { context.enter(modeBrowse(context)); } else { From b0ba681538333a52a108eff59d7a4708f133455b Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Tue, 17 Jul 2018 16:07:47 -0400 Subject: [PATCH 010/217] fix browser-specific Date() issues in notes --- modules/ui/note_comments.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/note_comments.js b/modules/ui/note_comments.js index a9890779c..d22740481 100644 --- a/modules/ui/note_comments.js +++ b/modules/ui/note_comments.js @@ -99,6 +99,7 @@ export function uiNoteComments() { if (!s) return null; var detected = utilDetect(); var options = { day: 'numeric', month: 'short', year: 'numeric' }; + s = s.replace(/-/g, '/'); // fix browser-specific Date() issues var d = new Date(s); if (isNaN(d.getTime())) return null; return d.toLocaleDateString(detected.locale, options); From e221dcae587830e61400a61a629a155adf761b9e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 17 Jul 2018 17:05:08 -0400 Subject: [PATCH 011/217] Dispatch new dimensions with photoview resize, resize all layers -Adds ability to resize OpenStreetCam and Bing Streetside layers -Also slightly increases the width of the resize handles -Also limits max resize so it won't go larger than the map --- css/60_photos.css | 13 +++-- modules/services/openstreetcam.js | 44 +++++++++------ modules/services/streetside.js | 8 +++ modules/ui/init.js | 94 +++++++++++++++++-------------- 4 files changed, 95 insertions(+), 64 deletions(-) diff --git a/css/60_photos.css b/css/60_photos.css index 9c452d3c5..cc853900c 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -31,8 +31,8 @@ right: 0; z-index: 49; cursor: nesw-resize; - height: 10px; - width: 10px; + height: 25px; + width: 25px; } #photoviewer button.resize-handle-x { @@ -44,7 +44,7 @@ z-index: 48; cursor: ew-resize; height: auto; - width: 5px; + width: 6px; } #photoviewer button.resize-handle-y { @@ -54,7 +54,7 @@ right: 0; z-index: 48; cursor: ns-resize; - height: 5px; + height: 6px; width: 100%; } @@ -64,6 +64,7 @@ width: 100%; height: 100%; overflow: hidden; + object-fit: cover; } .photo-wrapper .photo-attribution { @@ -221,7 +222,7 @@ flex-flow: row nowrap; justify-content: space-between; align-items: center; - pading: 0 5px; + padding: 0 5px; } .ms-wrapper .photo-attribution .image-view-link { text-align: left; @@ -297,6 +298,8 @@ label.streetside-hires { } .osc-image-wrap { + width: 100%; + height: 100%; transform-origin:0 0; -ms-transform-origin:0 0; -webkit-transform-origin:0 0; diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 14ded2d6b..99be60e12 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -34,17 +34,17 @@ import { } from '../util'; -var apibase = 'https://openstreetcam.org', - maxResults = 1000, - tileZoom = 14, - dispatch = d3_dispatch('loadedImages'), - imgZoom = d3_zoom() - .extent([[0, 0], [320, 240]]) - .translateExtent([[0, 0], [320, 240]]) - .scaleExtent([1, 15]) - .on('zoom', zoomPan), - _oscCache, - _oscSelectedImage; +var apibase = 'https://openstreetcam.org'; +var maxResults = 1000; +var tileZoom = 14; +var dispatch = d3_dispatch('loadedImages'); +var imgZoom = d3_zoom() + .extent([[0, 0], [320, 240]]) + .translateExtent([[0, 0], [320, 240]]) + .scaleExtent([1, 15]) + .on('zoom', zoomPan); +var _oscCache; +var _oscSelectedImage; function abortRequest(i) { @@ -129,12 +129,12 @@ function loadNextTilePage(which, currZoom, url, tile) { var maxPages = maxPageAtZoom(currZoom); var nextPage = cache.nextPage[tile.id] || 1; var params = utilQsString({ - ipp: maxResults, - page: nextPage, - // client_id: clientId, - bbTopLeft: [bbox.maxY, bbox.minX].join(','), - bbBottomRight: [bbox.minY, bbox.maxX].join(',') - }, true); + ipp: maxResults, + page: nextPage, + // client_id: clientId, + bbTopLeft: [bbox.maxY, bbox.minX].join(','), + bbBottomRight: [bbox.minY, bbox.maxX].join(',') + }, true); if (nextPage > maxPages) return; @@ -367,6 +367,16 @@ export default { .attr('class', 'osc-image-wrap'); + // Register viewer resize handler + context.ui().on('photoviewerResize', function(dimensions) { + imgZoom = d3_zoom() + .extent([[0, 0], dimensions]) + .translateExtent([[0, 0], dimensions]) + .scaleExtent([1, 15]) + .on('zoom', zoomPan); + }); + + function rotate(deg) { return function() { if (!_oscSelectedImage) return; diff --git a/modules/services/streetside.js b/modules/services/streetside.js index f13470b6c..040f66b6c 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -669,6 +669,14 @@ export default { .attr('src', context.asset(pannellumViewerJS)); + // Register viewer resize handler + context.ui().on('photoviewerResize', function() { + if (_pannellumViewer) { + _pannellumViewer.resize(); + } + }); + + function step(stepBy) { return function() { var viewer = d3_select('#photoviewer'); diff --git a/modules/ui/init.js b/modules/ui/init.js index 3e4c695c5..9d1e608c2 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -44,46 +44,6 @@ import { uiVersion } from './version'; import { uiZoom } from './zoom'; import { uiCmd } from './cmd'; -function buildResizeListener(target, eventName, dispatch, options) { - var resizeOnX = !!options.resizeOnX; - var resizeOnY = !!options.resizeOnY; - var minHeight = options.minHeight || 240; - var minWidth = options.minWidth || 320; - var startX; - var startY; - var startWidth; - var startHeight; - - function startResize() { - if (resizeOnX) { - var newWidth = Math.max(minWidth, startWidth + d3_event.clientX - startX); - target.style('width', newWidth + 'px'); - } - - if (resizeOnY) { - var newHeight = Math.max(minHeight, startHeight + startY - d3_event.clientY); - target.style('height', newHeight + 'px'); - } - - dispatch.call(eventName, target); - } - - function stopResize() { - d3_select(window) - .on('.' + eventName, null); - } - - return function initResize() { - startX = d3_event.clientX; - startY = d3_event.clientY; - startWidth = target.node().getBoundingClientRect().width; - startHeight = target.node().getBoundingClientRect().height; - - d3_select(window) - .on('mousemove.' + eventName, startResize, false) - .on('mouseup.' + eventName, stopResize, false); - }; -} export function uiInit(context) { var uiInitCounter = 0; @@ -382,8 +342,8 @@ export function uiInit(context) { .call(uiShortcuts(context)); } - var osm = context.connection(), - auth = uiLoading(context).message(t('loading_auth')).blocking(true); + var osm = context.connection(); + var auth = uiLoading(context).message(t('loading_auth')).blocking(true); if (osm && auth) { osm @@ -402,6 +362,56 @@ export function uiInit(context) { hash.startWalkthrough = false; context.container().call(uiIntro(context)); } + + + function buildResizeListener(target, eventName, dispatch, options) { + var resizeOnX = !!options.resizeOnX; + var resizeOnY = !!options.resizeOnY; + var minHeight = options.minHeight || 240; + var minWidth = options.minWidth || 320; + var startX; + var startY; + var startWidth; + var startHeight; + + function startResize() { + var mapSize = context.map().dimensions(); + + if (resizeOnX) { + var maxWidth = mapSize[0]; + var newWidth = clamp((startWidth + d3_event.clientX - startX), minWidth, maxWidth); + target.style('width', newWidth + 'px'); + } + + if (resizeOnY) { + var maxHeight = mapSize[1] - 90; // preserve space at top/bottom of map + var newHeight = clamp((startHeight + startY - d3_event.clientY), minHeight, maxHeight); + target.style('height', newHeight + 'px'); + } + + dispatch.call(eventName, target, utilGetDimensions(target, true)); + } + + function clamp(num, min, max) { + return Math.max(min, Math.min(num, max)); + } + + function stopResize() { + d3_select(window) + .on('.' + eventName, null); + } + + return function initResize() { + startX = d3_event.clientX; + startY = d3_event.clientY; + startWidth = target.node().getBoundingClientRect().width; + startHeight = target.node().getBoundingClientRect().height; + + d3_select(window) + .on('mousemove.' + eventName, startResize, false) + .on('mouseup.' + eventName, stopResize, false); + }; + } } From 7737c571aa909925871c7b4dc59a049418249956 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 17 Jul 2018 17:47:05 -0400 Subject: [PATCH 012/217] Shrink the photo viewer if the map has been resized to be smaller --- modules/ui/init.js | 51 ++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/modules/ui/init.js b/modules/ui/init.js index 9d1e608c2..4059f9420 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -283,6 +283,9 @@ export function uiInit(context) { buildResizeListener(photoviewer, 'photoviewerResize', dispatch, { resizeOnY: true }) ); + var mapDimensions = map.dimensions(); + + // bind events window.onbeforeunload = function() { return context.save(); }; @@ -291,30 +294,13 @@ export function uiInit(context) { context.history().unlock(); }; - var mapDimensions = map.dimensions(); - - - function onResize() { - mapDimensions = utilGetDimensions(content, true); - map.dimensions(mapDimensions); - } - d3_select(window) .on('resize.editor', onResize); onResize(); - function pan(d) { - return function() { - d3_event.preventDefault(); - context.pan(d, 100); - }; - } - - - // pan amount - var pa = 80; + var pa = 80; // pan amount var keybinding = d3_keybinding('main') .on('⌫', function() { d3_event.preventDefault(); }) .on('←', pan([pa, 0])) @@ -364,6 +350,35 @@ export function uiInit(context) { } + function onResize() { + mapDimensions = utilGetDimensions(content, true); + map.dimensions(mapDimensions); + + // shrink photo viewer if it is too big + // (-90 preserves space at top and bottom of map used by menus) + var photoDimensions = utilGetDimensions(photoviewer, true); + if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) { + var setPhotoDimensions = [ + Math.min(photoDimensions[0], mapDimensions[0]), + Math.min(photoDimensions[1], mapDimensions[1] - 90), + ]; + + photoviewer + .style('width', setPhotoDimensions[0] + 'px') + .style('height', setPhotoDimensions[1] + 'px'); + + dispatch.call('photoviewerResize', photoviewer, setPhotoDimensions); + } + } + + + function pan(d) { + return function() { + d3_event.preventDefault(); + context.pan(d, 100); + }; + } + function buildResizeListener(target, eventName, dispatch, options) { var resizeOnX = !!options.resizeOnX; var resizeOnY = !!options.resizeOnY; From b017616993c4f8913239428e9e48a6f8cec8c0b1 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Wed, 18 Jul 2018 09:38:59 -0400 Subject: [PATCH 013/217] added new note icon and completed sidebar --- css/65_data.css | 10 ++++++- data/core.yaml | 3 +++ dist/locales/en.json | 5 +++- modules/actions/add_note.js | 6 ----- modules/actions/index.js | 1 - modules/modes/add_note.js | 22 ++++++++++----- modules/modes/select_note.js | 2 +- modules/services/osm.js | 39 ++++++++++++++++++++++----- modules/svg/notes.js | 31 ++++++++++++++++++--- modules/ui/init.js | 2 +- modules/ui/modes.js | 9 ++----- modules/ui/note_comments.js | 2 ++ modules/ui/note_editor.js | 52 +++++++++++++++++++++++++++--------- modules/ui/note_header.js | 11 ++++++-- 14 files changed, 145 insertions(+), 50 deletions(-) delete mode 100644 modules/actions/add_note.js diff --git a/css/65_data.css b/css/65_data.css index d672fccff..fbad3ba9e 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -21,6 +21,11 @@ color: #ff3300; stroke: #333; } +.note-header-icon.new .note-fill, +.layer-notes .note.new .note-fill { + color: #00bcdd; + stroke: #333; +} .note-header-icon.closed .note-fill, .layer-notes .note.closed .note-fill { color: #55dd00; @@ -99,7 +104,6 @@ .comments-container { background: #ececec; padding: 1px 10px; - margin: 10px 0; border-radius: 8px; } @@ -157,6 +161,10 @@ min-height: 100px; } +.note-save-section { + margin: 10px 0; +} + .note-report { float: right; } diff --git a/data/core.yaml b/data/core.yaml index 308ffdc9c..9827276fd 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -635,6 +635,9 @@ en: close_comment: Close and Comment open_comment: Reopen and Comment report: Report + new: New Note + newDescription: "Describe the issue." + newNote: Add Note help: title: Help key: H diff --git a/dist/locales/en.json b/dist/locales/en.json index 0df3c4de9..0ecfd4606 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -769,7 +769,10 @@ "comment": "Comment", "close_comment": "Close and Comment", "open_comment": "Reopen and Comment", - "report": "Report" + "report": "Report", + "new": "New Note", + "newDescription": "Describe the issue.", + "newNote": "Add Note" }, "help": { "title": "Help", diff --git a/modules/actions/add_note.js b/modules/actions/add_note.js deleted file mode 100644 index d36963a61..000000000 --- a/modules/actions/add_note.js +++ /dev/null @@ -1,6 +0,0 @@ -import osm from '../services/osm'; - -export function actionAddNote(note) { - osm.replaceNote(note); - console.log('actionAddNote: ', note); -} \ No newline at end of file diff --git a/modules/actions/index.js b/modules/actions/index.js index 1e2339644..330690db2 100644 --- a/modules/actions/index.js +++ b/modules/actions/index.js @@ -1,7 +1,6 @@ export { actionAddEntity } from './add_entity'; export { actionAddMember } from './add_member'; export { actionAddMidpoint } from './add_midpoint'; -export { actionAddNote } from './add_note'; export { actionAddVertex } from './add_vertex'; export { actionChangeMember } from './change_member'; export { actionChangePreset } from './change_preset'; diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index 57f133c9b..e44a2f763 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -1,13 +1,16 @@ import { t } from '../util/locale'; -import { actionAddNote } from '../actions'; import { behaviorDraw } from '../behavior'; import { modeBrowse, modeSelectNote } from './index'; import { osmNote } from '../osm'; +import { services } from '../services'; import { dispatch as d3_dispatch } from 'd3-dispatch'; export function modeAddNote(context) { + + var dispatch = d3_dispatch('change'); + var mode = { id: 'add-note', button: 'note', @@ -24,13 +27,20 @@ export function modeAddNote(context) { function add(loc) { - var note = osmNote({ loc: loc }); + var note = osmNote({ + loc: loc, + status: 'open', + comments: {}, + newFeature: true + }); - // actionAddNote(note); + services.osm.replaceNote(note); + dispatch.call('change'); - context.enter( - modeSelectNote(context, [note.id]).newFeature(true) - ); + + context + .selectedNoteID(note.id) + .enter(modeSelectNote(context, [note.id]).newFeature(true)); } diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 9433152d4..b5294ab75 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -98,7 +98,7 @@ export function modeSelectNote(context, selectedNoteID) { .call(keybinding); context.ui().sidebar - .show(noteEditor.note(note)); + .show(noteEditor.note(note, newFeature)); context.map() .on('drawn.select', selectNote); diff --git a/modules/services/osm.js b/modules/services/osm.js index 7e9faf49d..7b641715f 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -159,6 +159,17 @@ function parseComments(comments) { } +function encodeNoteRtree(note) { + return { + minX: note.loc[0], + minY: note.loc[1], + maxX: note.loc[0], + maxY: note.loc[1], + data: note + }; +} + + var parsers = { node: function nodeData(obj, uid) { var attrs = obj.attributes; @@ -239,9 +250,10 @@ var parsers = { } var note = new osmNote(props); - var item = { minX: note.loc[0], minY: note.loc[1], maxX: note.loc[0], maxY: note.loc[1], data: note }; - _noteCache.rtree.insert(item); + var item = encodeNoteRtree(note); _noteCache.note[note.id] = note; + _noteCache.rtree.insert(item); + return note; }, @@ -906,7 +918,7 @@ export default { if (err) { return callback(err); } // we get the updated note back, remove from caches and reparse.. - var item = { minX: note.loc[0], minY: note.loc[1], maxX: note.loc[0], maxY: note.loc[1], data: note }; + var item = encodeNoteRtree(note); _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); delete _noteCache.note[note.id]; @@ -1052,11 +1064,24 @@ export default { // replace a single note in the cache - replaceNote: function(n) { - if (n instanceof osmNote) { - _noteCache.note[n.id] = n; + replaceNote: function(note) { + if (!(note instanceof osmNote) || !note.id) return; + + _noteCache.note[note.id] = note; // update (or insert) in _noteCache.note + + function updateRtree(item) { // update (or insert) in _noteCache.rtree + + // TODO: other checks needed? (e.g., if cache.data.children.length decrements ...) + + // remove note + _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); + _noteCache.rtree.insert(item); // add note (updated) + } - return n; + + updateRtree(encodeNoteRtree(note)); + + return note; } }; diff --git a/modules/svg/notes.js b/modules/svg/notes.js index 43e23f080..511f10c00 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -43,25 +43,35 @@ export function svgNotes(projection, context, dispatch) { function showLayer() { - editOn(); + // editOn(); layer + .classed('disabled', false) .style('opacity', 0) .transition() .duration(250) .style('opacity', 1) - .on('end', function () { dispatch.call('change'); }); + .on('end interrupt', function () { + dispatch.call('change'); + }); } function hideLayer() { + // editOff(); + throttledRedraw.cancel(); + layer.interrupt(); layer .transition() .duration(250) .style('opacity', 0) - .on('end', editOff); + .on('end interrupt', function () { + layer.classed('disabled', true); + dispatch.call('change'); + }); + } @@ -80,7 +90,8 @@ export function svgNotes(projection, context, dispatch) { // enter var notesEnter = notes.enter() .append('g') - .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; }); + .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; }) + .classed('new', function(d){ return d.id < 0; }); notesEnter .append('use') @@ -103,6 +114,18 @@ export function svgNotes(projection, context, dispatch) { .attr('y', '-20px') .attr('xlink:href', '#iD-icon-more'); + // add plus if this is a new note + notesEnter.selectAll('.note-annotation') + .data(function(d) { return d.id < 0 ? [0] : []; }) + .enter() + .append('use') + .attr('class', 'note-annotation thread') + .attr('width', '14px') + .attr('height', '14px') + .attr('x', '-7px') + .attr('y', '-20px') + .attr('xlink:href', '#iD-icon-plus'); + // update notes .merge(notesEnter) diff --git a/modules/ui/init.js b/modules/ui/init.js index cbdc7bd4b..7e1d134fc 100644 --- a/modules/ui/init.js +++ b/modules/ui/init.js @@ -101,7 +101,7 @@ export function uiInit(context) { limiter .append('div') - .attr('class', 'button-wrap joined col5') + .attr('class', 'button-wrap joined col3') .call(uiModes(context), limiter); limiter diff --git a/modules/ui/modes.js b/modules/ui/modes.js index f024dfa96..4d01b6820 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -48,10 +48,8 @@ export function uiModes(context) { .append('button') .attr('tabindex', -1) .attr('class', function(mode) { return mode.id + ' add-button col3'; }) - // .classed('disabled', function(mode) { - // return mode.id === 'add-note' && !svgNotes.enabled; // disable notes button - // }) .on('click.mode-buttons', function(mode) { + //TODO: prevent modeBrowse when in modeAddNote & osm layer is turned off // When drawing, ignore accidental clicks on mode buttons - #4042 var currMode = context.mode().id; if (currMode.match(/^draw/) !== null) return; @@ -100,10 +98,7 @@ export function uiModes(context) { modes.forEach(function(mode) { keybinding.on(mode.key, function() { // TODO: allow zooming out beyond minZoom when adding new note. Currently prevented - if ( - (editable() && mode.id !== 'add-note') - || (toggleNewNote() && mode.id === 'add-note') - ) { + if ((editable() && mode.id !== 'add-note') || (toggleNewNote() && mode.id === 'add-note')) { if (mode.id === context.mode().id) { context.enter(modeBrowse(context)); } else { diff --git a/modules/ui/note_comments.js b/modules/ui/note_comments.js index a9890779c..325213cb3 100644 --- a/modules/ui/note_comments.js +++ b/modules/ui/note_comments.js @@ -11,6 +11,8 @@ export function uiNoteComments() { function noteComments(selection) { + if (_note.newFeature) { return; } + var comments = selection.selectAll('.comments-container') .data([0]); diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index 4a15e3adc..e70df71be 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -90,7 +90,9 @@ export function uiNoteEditor(context) { noteSaveEnter .append('h4') .attr('class', '.note-save-header') - .text(t('note.newComment')); + .text(function() { + return _note.newFeature ? t('note.newDescription') : t('note.newComment'); + }); noteSaveEnter .append('textarea') @@ -140,18 +142,26 @@ export function uiNoteEditor(context) { .append('div') .attr('class', 'buttons'); - buttonEnter - .append('button') - .attr('class', 'button status-button action') - .append('span') - .attr('class', 'label'); + if (_note.newFeature) { + buttonEnter + .append('button') + .attr('class', 'button add-note-button action') + .append('span') + .attr('class', 'label'); + } else { + buttonEnter + .append('button') + .attr('class', 'button status-button action') + .append('span') + .attr('class', 'label'); - buttonEnter - .append('button') - .attr('class', 'button comment-button action') - .append('span') - .attr('class', 'label') - .text(t('note.comment')); + buttonEnter + .append('button') + .attr('class', 'button comment-button action') + .append('span') + .attr('class', 'label') + .text(t('note.comment')); + } // update buttonSection = buttonSection @@ -187,12 +197,28 @@ export function uiNoteEditor(context) { }); } }); + + buttonSection.select('.add-note-button') // select and propagate data + .text(t('note.newNote')) + .attr('disabled', function(d) { + return (d.status === 'open' && d.newComment) ? null : true; + }) + .on('click.save', function(d) { + this.blur(); // avoid keeping focus on the button - #4641 + var osm = services.osm; + if (osm) { + osm.postNoteAdd(d, d.status, function(err, note) { + dispatch.call('change', note); + }); + } + }); } - noteEditor.note = function(_) { + noteEditor.note = function(_, __) { if (!arguments.length) return _note; _note = _; + _note.update({ newFeature: __ }); return noteEditor; }; diff --git a/modules/ui/note_header.js b/modules/ui/note_header.js index dcaf82d46..63a6a143e 100644 --- a/modules/ui/note_header.js +++ b/modules/ui/note_header.js @@ -22,7 +22,8 @@ export function uiNoteHeader() { var iconEnter = headerEnter .append('div') - .attr('class', function(d) { return 'note-header-icon ' + d.status; }); + .attr('class', function(d) { return 'note-header-icon ' + d.status; }) + .classed('new', function(d) { return d.id < 0; }); iconEnter .append('div') @@ -35,6 +36,11 @@ export function uiNoteHeader() { .append('div') .attr('class', 'note-icon-annotation') .call(svgIcon('#iD-icon-more', 'note-annotation')); + } else if (_note.newFeature) { + iconEnter + .append('div') + .attr('class', 'note-icon-annotation') + .call(svgIcon('#iD-icon-plus', 'note-annotation')); } }); @@ -42,13 +48,14 @@ export function uiNoteHeader() { .append('div') .attr('class', 'note-header-label') .text(function(d) { + if (_note.newFeature) { return t('note.new'); } return t('note.note') + ' ' + d.id + ' ' + (d.status === 'closed' ? t('note.closed') : ''); }); } - noteHeader.note = function(_) { + noteHeader.note = function(_, __) { if (!arguments.length) return _note; _note = _; return noteHeader; From 87615c56c4271b5905fbcb9ab8ee82cefd7d43df Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Wed, 18 Jul 2018 10:16:39 -0400 Subject: [PATCH 014/217] deselect selected notes on mode exit --- modules/modes/select_note.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index b5294ab75..b23a0b7c1 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -123,6 +123,8 @@ export function modeSelectNote(context, selectedNoteID) { context.ui().sidebar .hide(); + + context.selectedNoteID(null); }; From 60f66b73e983e184703aab56885f3c82fc5a3ae3 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Wed, 18 Jul 2018 15:16:52 -0400 Subject: [PATCH 015/217] fixed missing declarations. TODO: fix tests --- dist/locales/en.json | 4 ++-- modules/services/osm.js | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dist/locales/en.json b/dist/locales/en.json index f243cb992..e4b2ccb4d 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -6706,7 +6706,7 @@ "attribution": { "text": "Terms & Feedback" }, - "description": "Premium DigitalGlobe satellite imagery.", + "description": "DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.", "name": "DigitalGlobe Premium Imagery" }, "DigitalGlobe-Premium-vintage": { @@ -6720,7 +6720,7 @@ "attribution": { "text": "Terms & Feedback" }, - "description": "Standard DigitalGlobe satellite imagery.", + "description": "DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.", "name": "DigitalGlobe Standard Imagery" }, "DigitalGlobe-Standard-vintage": { diff --git a/modules/services/osm.js b/modules/services/osm.js index 128fe88d9..71f71562f 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -787,7 +787,10 @@ export default { ]; var tiles = geoTile.filterNullIsland(geoTile.getTiles(_tileZoom, projection)); - geoTile.removeInflightRequests(_tiles, tiles, abortRequest); + + // remove inflight requests that no longer cover the view.. + var hadRequests = !_isEmpty(cache.inflight); + geoTile.removeInflightRequests(cache, tiles, abortRequest); if (hadRequests && !loadingNotes && _isEmpty(cache.inflight)) { dispatch.call('loaded'); // stop the spinner From c563abaf7a46953199301ef9933a4491f4dc1562 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Wed, 18 Jul 2018 15:49:04 -0400 Subject: [PATCH 016/217] pass dimensions to tile --- modules/services/mapillary.js | 2 +- modules/services/openstreetcam.js | 2 +- modules/services/osm.js | 9 +-------- modules/services/streetside.js | 2 +- modules/util/tile.js | 4 ++-- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 93870f94b..db387fd1f 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -84,7 +84,7 @@ function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection)); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, projection.clipExtent()[1], 0)); geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); tiles.forEach(function(tile) { diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 98b857670..be2953f16 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -79,7 +79,7 @@ function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI, currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection)); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, projection.clipExtent()[1], 0)); geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); tiles.forEach(function(tile) { diff --git a/modules/services/osm.js b/modules/services/osm.js index 71f71562f..67a2e29f2 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -778,15 +778,8 @@ export default { tilezoom = _tileZoom; } - var s = projection.scale() * 2 * Math.PI; - var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); - var ts = 256 * Math.pow(2, z - tilezoom); - var origin = [ - s / 2 - projection.translate()[0], - s / 2 - projection.translate()[1] - ]; - var tiles = geoTile.filterNullIsland(geoTile.getTiles(_tileZoom, projection)); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(_tileZoom, projection, dimensions, 0)); // remove inflight requests that no longer cover the view.. var hadRequests = !_isEmpty(cache.inflight); diff --git a/modules/services/streetside.js b/modules/services/streetside.js index 591a21172..4252c05a8 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -94,7 +94,7 @@ function loadTiles(which, url, projection, margin) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, margin)); + var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, projection.clipExtent()[1], margin)); tiles.forEach(function (tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/util/tile.js b/modules/util/tile.js index 78d9a6423..546b4f10a 100644 --- a/modules/util/tile.js +++ b/modules/util/tile.js @@ -71,7 +71,7 @@ export function utilTile() { * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from * an area around (and including) the current map view extents. */ - tile.getTiles = function(tileZoom, projection, margin) { + tile.getTiles = function(tileZoom, projection, dimensions, margin) { // s is the current map scale // z is the 'Level of Detail', or zoom-level, where Level 1 is far from the earth, and Level 23 is close to the ground. // ts ('tile size') here is the formula for determining the width/height of the map in pixels, but with a modification. @@ -88,7 +88,7 @@ export function utilTile() { var tiler = this .scaleExtent([tileZoom, tileZoom]) .scale(s) - .size(projection.clipExtent()[1]) + .size(dimensions) .translate(projection.translate()) .margin(margin || 0); // request nearby tiles so we can connect sequences. From 1b7493081ecb4795d1e6ffe183042b9a600294e5 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 18 Jul 2018 16:16:34 -0400 Subject: [PATCH 017/217] Show linkified text in notes, hide scrollbars when hovering (closes #5151) --- css/80_app.css | 6 ++++++ modules/ui/note_comments.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/css/80_app.css b/css/80_app.css index aeba94aea..c6c8c0d91 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1325,6 +1325,12 @@ a.hide-toggle { border: 1px solid #ccc; } +/* no scrollbars */ +.inspector-hover div { + overflow-x: hidden; + overflow-y: hidden; +} + /* hide and remove from layout */ .inspector-hidden, .inspector-hover label input[type="checkbox"], diff --git a/modules/ui/note_comments.js b/modules/ui/note_comments.js index d22740481..870b5f184 100644 --- a/modules/ui/note_comments.js +++ b/modules/ui/note_comments.js @@ -64,7 +64,7 @@ export function uiNoteComments() { mainEnter .append('div') .attr('class', 'comment-text') - .text(function(d) { return d.text; }); + .html(function(d) { return d.html; }); comments .call(replaceAvatars); From cfa387607c28ec8c3718ea2a6b39ed86ac84cfb6 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 18 Jul 2018 17:08:35 -0400 Subject: [PATCH 018/217] Upgrade to Rollup ~0.63.2 (closes #5098) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f2f448fc..4c914d053 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "osm-community-index": "0.4.5", "phantomjs-prebuilt": "~2.1.11", "request": "^2.85.0", - "rollup": "~0.60.0", + "rollup": "~0.63.2", "rollup-plugin-commonjs": "^9.0.0", "rollup-plugin-includepaths": "~0.2.3", "rollup-plugin-json": "^3.0.0", From 438756103da611c29f070668264aaf686ac28c93 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Wed, 18 Jul 2018 17:11:17 -0400 Subject: [PATCH 019/217] update checking if note is new --- modules/modes/select_note.js | 2 +- modules/ui/note_comments.js | 2 +- modules/ui/note_editor.js | 7 +++---- modules/ui/note_header.js | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index b23a0b7c1..e2c008fbc 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -98,7 +98,7 @@ export function modeSelectNote(context, selectedNoteID) { .call(keybinding); context.ui().sidebar - .show(noteEditor.note(note, newFeature)); + .show(noteEditor.note(note)); context.map() .on('drawn.select', selectNote); diff --git a/modules/ui/note_comments.js b/modules/ui/note_comments.js index 325213cb3..7d35b9935 100644 --- a/modules/ui/note_comments.js +++ b/modules/ui/note_comments.js @@ -11,7 +11,7 @@ export function uiNoteComments() { function noteComments(selection) { - if (_note.newFeature) { return; } + if (_note.isNew()) { return; } var comments = selection.selectAll('.comments-container') .data([0]); diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index e70df71be..865b298e4 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -91,7 +91,7 @@ export function uiNoteEditor(context) { .append('h4') .attr('class', '.note-save-header') .text(function() { - return _note.newFeature ? t('note.newDescription') : t('note.newComment'); + return _note.isNew() ? t('note.newDescription') : t('note.newComment'); }); noteSaveEnter @@ -142,7 +142,7 @@ export function uiNoteEditor(context) { .append('div') .attr('class', 'buttons'); - if (_note.newFeature) { + if (_note.isNew()) { buttonEnter .append('button') .attr('class', 'button add-note-button action') @@ -215,10 +215,9 @@ export function uiNoteEditor(context) { } - noteEditor.note = function(_, __) { + noteEditor.note = function(_) { if (!arguments.length) return _note; _note = _; - _note.update({ newFeature: __ }); return noteEditor; }; diff --git a/modules/ui/note_header.js b/modules/ui/note_header.js index 63a6a143e..c63b61756 100644 --- a/modules/ui/note_header.js +++ b/modules/ui/note_header.js @@ -36,7 +36,7 @@ export function uiNoteHeader() { .append('div') .attr('class', 'note-icon-annotation') .call(svgIcon('#iD-icon-more', 'note-annotation')); - } else if (_note.newFeature) { + } else if (_note.isNew()) { iconEnter .append('div') .attr('class', 'note-icon-annotation') @@ -48,7 +48,7 @@ export function uiNoteHeader() { .append('div') .attr('class', 'note-header-label') .text(function(d) { - if (_note.newFeature) { return t('note.new'); } + if (_note.isNew()) { return t('note.new'); } return t('note.note') + ' ' + d.id + ' ' + (d.status === 'closed' ? t('note.closed') : ''); }); From 3fe31cc456a1eae7ababf670eb920b88b322ccde Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 18 Jul 2018 23:08:46 -0400 Subject: [PATCH 020/217] Make sure railway bridges with a service tag render with dark casing (closes #5159) --- css/50_misc.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/50_misc.css b/css/50_misc.css index 531b09a0d..be90c5e73 100644 --- a/css/50_misc.css +++ b/css/50_misc.css @@ -71,7 +71,7 @@ path.stroke.tag-barrier { /* bridges */ path.casing.tag-bridge { stroke-opacity: 0.6; - stroke: #000; + stroke: #000 !important; stroke-linecap: butt; stroke-dasharray: none; } From aac394a48723fb14356f6e24aebe5ea1b807ef69 Mon Sep 17 00:00:00 2001 From: Matias Volpe Date: Wed, 18 Jul 2018 14:19:07 -0300 Subject: [PATCH 021/217] Update directional indicator based off of current bearing in Mapillary JS --- modules/services/mapillary.js | 7 ++++++- modules/svg/mapillary_images.js | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index e264d5cca..c1c2dd24a 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -29,7 +29,7 @@ var viewerjs = 'mapillary-js/mapillary.min.js'; var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi'; var maxResults = 1000; var tileZoom = 14; -var dispatch = d3_dispatch('loadedImages', 'loadedSigns'); +var dispatch = d3_dispatch('loadedImages', 'loadedSigns', 'bearingChanged'); var _mlyFallback = false; var _mlyCache; var _mlyClicks; @@ -511,6 +511,7 @@ export default { _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts); _mlyViewer.on('nodechanged', nodeChanged); + _mlyViewer.on('bearingchanged', bearingChanged); _mlyViewer.moveToKey(imageKey) .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console } @@ -545,6 +546,10 @@ export default { that.selectImage(undefined, node.key, true); } } + + function bearingChanged(e) { + dispatch.call('bearingChanged', undefined, e); + } }, diff --git a/modules/svg/mapillary_images.js b/modules/svg/mapillary_images.js index fb8a4b4b8..449b768f8 100644 --- a/modules/svg/mapillary_images.js +++ b/modules/svg/mapillary_images.js @@ -1,4 +1,5 @@ import _throttle from 'lodash-es/throttle'; +import _isNumber from 'lodash-es/isNumber'; import { select as d3_select } from 'd3-selection'; import { svgPath, svgPointTransform } from './index'; import { services } from '../services'; @@ -11,6 +12,7 @@ export function svgMapillaryImages(projection, context, dispatch) { var minViewfieldZoom = 18; var layer = d3_select(null); var _mapillary; + var viewerCompassAngle; function init() { @@ -24,6 +26,19 @@ export function svgMapillaryImages(projection, context, dispatch) { if (services.mapillary && !_mapillary) { _mapillary = services.mapillary; _mapillary.event.on('loadedImages', throttledRedraw); + _mapillary.event.on('bearingChanged', function(e) { + viewerCompassAngle = e; + + // avoid updating if the map is currently transformed + // e.g. during drags or easing. + if (context.map().isTransformed()) return; + + layer.selectAll('.viewfield-group.selected') + .filter(function(d) { + return d.pano; + }) + .attr('transform', transform); + }); } else if (!services.mapillary && _mapillary) { _mapillary = null; } @@ -102,7 +117,9 @@ export function svgMapillaryImages(projection, context, dispatch) { function transform(d) { var t = svgPointTransform(projection)(d); - if (d.ca) { + if (d.pano && _isNumber(viewerCompassAngle)) { + t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)'; + } else if (d.ca) { t += ' rotate(' + Math.floor(d.ca) + ',0,0)'; } return t; From c000da07afe062fe46da179a8a18bda71bc319b9 Mon Sep 17 00:00:00 2001 From: Matias Volpe Date: Thu, 19 Jul 2018 09:46:25 -0300 Subject: [PATCH 022/217] Leave directional indicator only for current image --- css/60_photos.css | 7 +++++++ modules/svg/mapillary_images.js | 1 + 2 files changed, 8 insertions(+) diff --git a/css/60_photos.css b/css/60_photos.css index cc853900c..c1e4a0d9e 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -177,6 +177,13 @@ .layer-mapillary-images .viewfield-group * { fill: #55ff22; } +.layer-mapillary-images .viewfield-group .viewfield { + display: none; +} +.layer-mapillary-images .viewfield-group.selected .viewfield, +.layer-mapillary-images .viewfield-group .viewfield.pano { + display: inline; +} .layer-mapillary-images .sequence { stroke: #55ff22; } diff --git a/modules/svg/mapillary_images.js b/modules/svg/mapillary_images.js index 449b768f8..641882790 100644 --- a/modules/svg/mapillary_images.js +++ b/modules/svg/mapillary_images.js @@ -201,6 +201,7 @@ export function svgMapillaryImages(projection, context, dispatch) { viewfields.enter() // viewfields may or may not be drawn... .insert('path', 'circle') // but if they are, draw below the circles .attr('class', 'viewfield') + .classed('pano', function() { return this.parentNode.__data__.pano; }) .attr('transform', 'scale(1.5,1.5),translate(-8, -13)') .attr('d', viewfieldPath); From 386d375b7a80cc55c77001900c44c9b58dd51398 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Thu, 19 Jul 2018 10:51:39 -0400 Subject: [PATCH 023/217] fix excessive note tiling and network request --- modules/services/mapillary.js | 5 ++++- modules/services/openstreetcam.js | 5 ++++- modules/services/osm.js | 6 +++--- modules/services/streetside.js | 4 +++- modules/util/tile.js | 22 ++++++++++++++++++---- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index db387fd1f..cdf04aa3b 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -84,7 +84,10 @@ function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, projection.clipExtent()[1], 0)); + var dimension = projection.clipExtent()[1]; + var tiles = geoTile.getTiles(projection, dimension, tileZoom, 0); + tiles = geoTile.filterNullIsland(tiles); + geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); tiles.forEach(function(tile) { diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index be2953f16..73483dddc 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -79,7 +79,10 @@ function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI, currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, projection.clipExtent()[1], 0)); + var dimension = projection.clipExtent()[1]; + var tiles = geoTile.getTiles(projection, dimension, tileZoom, 0); + tiles = geoTile.filterNullIsland(tiles); + geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); tiles.forEach(function(tile) { diff --git a/modules/services/osm.js b/modules/services/osm.js index 67a2e29f2..4263662e2 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -778,13 +778,13 @@ export default { tilezoom = _tileZoom; } - - var tiles = geoTile.filterNullIsland(geoTile.getTiles(_tileZoom, projection, dimensions, 0)); + // get tiles + var tiles = geoTile.getTiles(projection, dimensions, tilezoom, 0); + tiles = geoTile.filterNullIsland(tiles); // remove inflight requests that no longer cover the view.. var hadRequests = !_isEmpty(cache.inflight); geoTile.removeInflightRequests(cache, tiles, abortRequest); - if (hadRequests && !loadingNotes && _isEmpty(cache.inflight)) { dispatch.call('loaded'); // stop the spinner } diff --git a/modules/services/streetside.js b/modules/services/streetside.js index 4252c05a8..52ee2c14f 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -94,7 +94,9 @@ function loadTiles(which, url, projection, margin) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - var tiles = geoTile.filterNullIsland(geoTile.getTiles(tileZoom, projection, projection.clipExtent()[1], margin)); + var dimension = projection.clipExtent()[1]; + var tiles = geoTile.getTiles(projection, dimension, tileZoom, margin); + tiles = geoTile.filterNullIsland(tiles); tiles.forEach(function (tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/util/tile.js b/modules/util/tile.js index 546b4f10a..2179525f7 100644 --- a/modules/util/tile.js +++ b/modules/util/tile.js @@ -66,12 +66,14 @@ export function utilTile() { return tiles; } + /** * getTiles() returns array of d3 geo tiles. * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from * an area around (and including) the current map view extents. */ - tile.getTiles = function(tileZoom, projection, dimensions, margin) { + tile.getTiles = function(projection, dimensions, tilezoom, margin) { + // s is the current map scale // z is the 'Level of Detail', or zoom-level, where Level 1 is far from the earth, and Level 23 is close to the ground. // ts ('tile size') here is the formula for determining the width/height of the map in pixels, but with a modification. @@ -79,23 +81,24 @@ export function utilTile() { // As used here, by subtracting constant 'tileZoom' from z (the level), you end up with a much smaller value for the tile size (in pixels). var s = projection.scale() * 2 * Math.PI; var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); - var ts = 256 * Math.pow(2, z - tileZoom); + var ts = 256 * Math.pow(2, z - tilezoom); var origin = [ s / 2 - projection.translate()[0], s / 2 - projection.translate()[1] ]; var tiler = this - .scaleExtent([tileZoom, tileZoom]) + .scaleExtent([tilezoom, tilezoom]) .scale(s) .size(dimensions) .translate(projection.translate()) .margin(margin || 0); // request nearby tiles so we can connect sequences. - return tiler() + var tiles = tiler() .map(function(tile) { var x = tile[0] * ts - origin[0]; var y = tile[1] * ts - origin[1]; + return { id: tile.toString(), xyz: tile, @@ -105,14 +108,18 @@ export function utilTile() { ) }; }); + + return tiles; }; + tile.filterNullIsland = function(tiles) { return tiles.filter(function(t) { return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]); }); }; + // remove inflight requests that no longer cover the view.. tile.removeInflightRequests = function(cache, tiles, callback, modifier) { return _filter(cache.inflight, function(v, i) { @@ -124,36 +131,42 @@ export function utilTile() { }).map(callback); // abort request }; + tile.scaleExtent = function(val) { if (!arguments.length) return _scaleExtent; _scaleExtent = val; return tile; }; + tile.size = function(val) { if (!arguments.length) return _size; _size = val; return tile; }; + tile.scale = function(val) { if (!arguments.length) return _scale; _scale = val; return tile; }; + tile.translate = function(val) { if (!arguments.length) return _translate; _translate = val; return tile; }; + tile.zoomDelta = function(val) { if (!arguments.length) return _zoomDelta; _zoomDelta = +val; return tile; }; + // number to extend the rows/columns beyond those covering the viewport tile.margin = function(val) { if (!arguments.length) return _margin; @@ -161,5 +174,6 @@ export function utilTile() { return tile; }; + return tile; } From 14212b47fe4b8458c0b5a3cf949526ec66ee0152 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Thu, 19 Jul 2018 15:21:46 -0400 Subject: [PATCH 024/217] WIP: drag note --- modules/behavior/drag.js | 10 +- modules/modes/add_note.js | 2 +- modules/modes/browse.js | 4 +- modules/modes/drag_note.js | 491 +++++++++++++++++++++++++++++++++++ modules/modes/select.js | 4 +- modules/modes/select_note.js | 6 +- 6 files changed, 512 insertions(+), 5 deletions(-) create mode 100644 modules/modes/drag_note.js diff --git a/modules/behavior/drag.js b/modules/behavior/drag.js index f32c952ce..ad0428fa1 100644 --- a/modules/behavior/drag.js +++ b/modules/behavior/drag.js @@ -9,6 +9,8 @@ import { touches as d3_touches } from 'd3-selection'; +import { osmNote } from '../osm'; + import { utilRebind } from '../util/rebind'; import { @@ -162,7 +164,13 @@ export function behaviorDrag() { var target = d3_event.target; for (; target && target !== root; target = target.parentNode) { var datum = target.__data__; - var entity = datum && datum.properties && datum.properties.entity; + + var entity; + if (datum instanceof osmNote) { entity = datum;} + else { + entity = datum && datum.properties && datum.properties.entity; + } + if (entity && target[matchesSelector](_selector)) { return dragstart.call(target, entity); } diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index e44a2f763..77ec21c13 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -35,7 +35,7 @@ export function modeAddNote(context) { }); services.osm.replaceNote(note); - dispatch.call('change'); + dispatch.call('change', this); context diff --git a/modules/modes/browse.js b/modules/modes/browse.js index 5ba0e7fee..1638b6451 100644 --- a/modules/modes/browse.js +++ b/modules/modes/browse.js @@ -8,6 +8,7 @@ import { } from '../behavior'; import { modeDragNode } from './drag_node'; +import { modeDragNote } from './drag_note'; export function modeBrowse(context) { @@ -23,7 +24,8 @@ export function modeBrowse(context) { behaviorHover(context).on('hover', context.ui().sidebar.hover), behaviorSelect(context), behaviorLasso(context), - modeDragNode(context).behavior + modeDragNode(context).behavior, + modeDragNote(context).behavior // TAH - possibly change ]; diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js new file mode 100644 index 000000000..b5f1eef0f --- /dev/null +++ b/modules/modes/drag_note.js @@ -0,0 +1,491 @@ +import _find from 'lodash-es/find'; + +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + +import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; + +import { t } from '../util/locale'; + +import { + actionAddMidpoint, + actionConnect, + actionMoveNode, + actionNoop +} from '../actions'; + +import { + behaviorEdit, + behaviorHover, + behaviorDrag +} from '../behavior'; + +import { + geoChooseEdge, + geoHasLineIntersections, + geoHasSelfIntersections, + geoVecSubtract, + geoViewportEdge +} from '../geo'; + +import { modeBrowse, modeSelect } from './index'; +import { osmJoinWays, osmNote } from '../osm'; +import { uiFlash } from '../ui'; + + +export function modeDragNote(context) { + var mode = { + id: 'drag-note', + button: 'browse' + }; + var hover = behaviorHover(context).altDisables(true) + .on('hover', context.ui().sidebar.hover); + var edit = behaviorEdit(context); + + var _nudgeInterval; + var _restoreSelectedNoteIDs = []; + var _wasMidpoint = false; + var _isCancelled = false; + var _activeEntity; + var _startLoc; + var _lastLoc; + + + function startNudge(entity, nudge) { + if (_nudgeInterval) window.clearInterval(_nudgeInterval); + _nudgeInterval = window.setInterval(function() { + context.pan(nudge); + doMove(entity, nudge); + }, 50); + } + + + function stopNudge() { + if (_nudgeInterval) { + window.clearInterval(_nudgeInterval); + _nudgeInterval = null; + } + } + + + function moveAnnotation(entity) { + console.log('entity') + return t('operations.move.annotation.' + entity.geometry(context.graph())); + } + + + function connectAnnotation(entity) { + return t('operations.connect.annotation.' + entity.geometry(context.graph())); + } + + + function origin(entity) { + return context.projection(entity.loc); + } + + + function keydown() { + if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { + if (context.surface().classed('nope')) { + context.surface() + .classed('nope-suppressed', true); + } + context.surface() + .classed('nope', false) + .classed('nope-disabled', true); + } + } + + + function keyup() { + if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { + if (context.surface().classed('nope-suppressed')) { + context.surface() + .classed('nope', true); + } + context.surface() + .classed('nope-suppressed', false) + .classed('nope-disabled', false); + } + } + + + function start(entity) { + _wasMidpoint = entity.type === 'midpoint'; + var hasHidden = context.features().hasHiddenConnections(entity, context.graph()); + _isCancelled = d3_event.sourceEvent.shiftKey || hasHidden; + + + if (_isCancelled) { + if (hasHidden) { + uiFlash() + .duration(4000) + .text(t('modes.drag_node.connected_to_hidden'))(); + } + return drag.cancel(); + } + + if (_wasMidpoint) { + var midpoint = entity; + entity = osmNote(); + context.perform(actionAddMidpoint(midpoint, entity)); + entity = context.entity(entity.id); // get post-action entity + + var vertex = context.surface().selectAll('.' + entity.id); + drag.target(vertex.node(), entity); + + } else { + context.perform(actionNoop()); + } + + _activeEntity = entity; + _startLoc = entity.loc; + + context.surface().selectAll('.' + _activeEntity.id) + .classed('active', true); + + context.enter(mode); + } + + + // related code + // - `behavior/draw.js` `datum()` + function datum() { + var event = d3_event && d3_event.sourceEvent; + if (!event || event.altKey) { + return {}; + } else { + // When dragging, snap only to touch targets.. + // (this excludes area fills and active drawing elements) + var d = event.target.__data__; + return (d && d.properties && d.properties.target) ? d : {}; + } + } + + + function doMove(entity, nudge) { + nudge = nudge || [0, 0]; + + var currPoint = (d3_event && d3_event.point) || context.projection(_lastLoc); + var currMouse = geoVecSubtract(currPoint, nudge); + var loc = context.projection.invert(currMouse); + + if (!_nudgeInterval) { // If not nudging at the edge of the viewport, try to snap.. + // related code + // - `mode/drag_node.js` `doMode()` + // - `behavior/draw.js` `click()` + // - `behavior/draw_way.js` `move()` + var d = datum(); + var target = d; + var targetLoc = target && target.loc; + var targetNodes = d && d.properties && d.properties.nodes; + var edge; + + if (targetLoc) { // snap to node/vertex - a point target with `.loc` + loc = targetLoc; + + } else if (targetNodes) { // snap to way - a line target with `.nodes` + edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id); + if (edge) { + loc = edge.loc; + } + } + } + + context.replace( + actionMoveNode(entity.id, loc), + // moveAnnotation(entity) TODO: - likely replace + ); + + // Below here: validations + var isInvalid = false; + + // Check if this connection to `target` could cause relations to break.. + if (target) { + isInvalid = hasRelationConflict(entity, target, edge, context.graph()); + } + + // Check if this drag causes the geometry to break.. + if (!isInvalid) { + isInvalid = hasInvalidGeometry(entity, context.graph()); + } + + + var nope = context.surface().classed('nope'); + if (isInvalid === 'relation' || isInvalid === 'restriction') { + if (!nope) { // about to nope - show hint + uiFlash() + .duration(4000) + .text(t('operations.connect.' + isInvalid, + { relation: context.presets().item('type/restriction').name() } + ))(); + } + } else { + if (nope) { // about to un-nope, remove hint + uiFlash() + .duration(1) + .text('')(); + } + } + + + var nopeDisabled = context.surface().classed('nope-disabled'); + if (nopeDisabled) { + context.surface() + .classed('nope', false) + .classed('nope-suppressed', isInvalid); + } else { + context.surface() + .classed('nope', isInvalid) + .classed('nope-suppressed', false); + } + + _lastLoc = loc; + } + + + // Uses `actionConnect.disabled()` to know whether this connection is ok.. + function hasRelationConflict(entity, target, edge, graph) { + var testGraph = graph.update(); // copy + + // if snapping to way - add midpoint there and consider that the target.. + if (edge) { + var midpoint = osmNote(); + var action = actionAddMidpoint({ + loc: edge.loc, + edge: [target.nodes[edge.index - 1], target.nodes[edge.index]] + }, midpoint); + + testGraph = action(testGraph); + target = midpoint; + } + + // can we connect to it? + var ids = [entity.id, target.id]; + return actionConnect(ids).disabled(testGraph); + } + + + function hasInvalidGeometry(entity, graph) { + var parents = graph.parentWays(entity); + var i, j, k; + + for (i = 0; i < parents.length; i++) { + var parent = parents[i]; + var nodes = []; + var activeIndex = null; // which multipolygon ring contains node being dragged + + // test any parent multipolygons for valid geometry + var relations = graph.parentRelations(parent); + for (j = 0; j < relations.length; j++) { + if (!relations[j].isMultipolygon()) continue; + + var rings = osmJoinWays(relations[j].members, graph); + + // find active ring and test it for self intersections + for (k = 0; k < rings.length; k++) { + nodes = rings[k].nodes; + if (_find(nodes, function(n) { return n.id === entity.id; })) { + activeIndex = k; + if (geoHasSelfIntersections(nodes, entity.id)) { + return true; + } + } + rings[k].coords = nodes.map(function(n) { return n.loc; }); + } + + // test active ring for intersections with other rings in the multipolygon + for (k = 0; k < rings.length; k++) { + if (k === activeIndex) continue; + + // make sure active ring doesnt cross passive rings + if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) { + return true; + } + } + } + + + // If we still haven't tested this node's parent way for self-intersections. + // (because it's not a member of a multipolygon), test it now. + if (activeIndex === null) { + nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); }); + if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) { + return true; + } + } + + } + + return false; + } + + + function move(entity) { + if (_isCancelled) return; + d3_event.sourceEvent.stopPropagation(); + + context.surface().classed('nope-disabled', d3_event.sourceEvent.altKey); + + _lastLoc = context.projection.invert(d3_event.point); + + doMove(entity); + var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); + if (nudge) { + startNudge(entity, nudge); + } else { + stopNudge(); + } + } + + + function end(entity) { + if (_isCancelled) return; + + var d = datum(); + var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope'); + var target = d && d.properties && d.properties.entity; // entity to snap to + + if (nope) { // bounce back + context.perform( + _actionBounceBack(entity.id, _startLoc) + ); + + } else if (target && target.type === 'way') { + var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id); + context.replace( + actionAddMidpoint({ + loc: choice.loc, + edge: [target.nodes[choice.index - 1], target.nodes[choice.index]] + }, entity), + // connectAnnotation(target) TODO: - likely replace + ); + + } else if (target && target.type === 'node') { + context.replace( + actionConnect([target.id, entity.id]), + // connectAnnotation(target) TODO: - likely replace + ); + + } else if (_wasMidpoint) { + context.replace( + actionNoop(), + t('operations.add.annotation.vertex') + ); + + } else { + context.replace( + actionNoop(), + // moveAnnotation(entity) TODO: - likely replace + ); + } + + var reselection = _restoreSelectedNoteIDs.filter(function(id) { + return context.graph().hasEntity(id); + }); + + if (reselection.length) { + context.enter(modeSelect(context, reselection)); + } else { + context.enter(modeBrowse(context)); + } + } + + + function _actionBounceBack(nodeID, toLoc) { + var moveNode = actionMoveNode(nodeID, toLoc); + var action = function(graph, t) { + // last time through, pop off the bounceback perform. + // it will then overwrite the initial perform with a moveNode that does nothing + if (t === 1) context.pop(); + return moveNode(graph, t); + }; + action.transitionable = true; + return action; + } + + + function cancel() { + drag.cancel(); + context.enter(modeBrowse(context)); + } + + + var drag = behaviorDrag() + .selector('.layer-notes .note') + .surface(d3_select('#map').node()) + .origin(origin) + .on('start', start) + .on('move', move) + .on('end', end); + + + mode.enter = function() { + context.install(hover); + context.install(edit); + + // d3_select(window) + // .on('keydown.drawWay', keydown) + // .on('keyup.drawWay', keyup); + + context.history() + .on('undone.drag-node', cancel); + }; + + + mode.exit = function() { + context.ui().sidebar.hover.cancel(); + context.uninstall(hover); + context.uninstall(edit); + + d3_select(window) + .on('keydown.hover', null) + .on('keyup.hover', null); + + context.history() + .on('undone.drag-node', null); + + context.map() + .on('drawn.drag-node', null); + + _activeEntity = null; + + context.surface() + .classed('nope', false) + .classed('nope-suppressed', false) + .classed('nope-disabled', false) + .selectAll('.active') + .classed('active', false); + + stopNudge(); + }; + + + mode.selectedIDs = function() { + if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; + // no assign + return mode; + }; + + + mode.activeID = function() { + if (!arguments.length) return _activeEntity && _activeEntity.id; + // no assign + return mode; + }; + + + mode.restoreSelectedNoteIDs = function(_) { + if (!arguments.length) return _restoreSelectedNoteIDs; + _restoreSelectedNoteIDs = _; + return mode; + }; + + + mode.behavior = drag; + + + return mode; +} diff --git a/modules/modes/select.js b/modules/modes/select.js index 924314de9..90168b12c 100644 --- a/modules/modes/select.js +++ b/modules/modes/select.js @@ -36,6 +36,7 @@ import { import { modeBrowse } from './browse'; import { modeDragNode } from './drag_node'; +import { modeDragNote } from './drag_note'; import * as Operations from '../operations/index'; import { uiEditMenu, uiSelectionList } from '../ui'; import { uiCmd } from '../ui/cmd'; @@ -63,7 +64,8 @@ export function modeSelect(context, selectedIDs) { behaviorHover(context), behaviorSelect(context), behaviorLasso(context), - modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior + modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior, + modeDragNote(context).restoreSelectedNoteIDs(selectedIDs).behavior // TODO: - likely remove ]; var inspector; var editMenu; diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index b23a0b7c1..5df958a93 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -8,11 +8,14 @@ import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; import { behaviorHover, behaviorLasso, - behaviorSelect + behaviorSelect, + behaviorDrag } from '../behavior'; + import { services } from '../services'; import { modeBrowse } from './browse'; +import { modeDragNote } from './drag_note'; import { uiNoteEditor } from '../ui'; @@ -37,6 +40,7 @@ export function modeSelectNote(context, selectedNoteID) { behaviorHover(context), behaviorSelect(context), behaviorLasso(context), + modeDragNote(context).restoreSelectedNoteIDs(selectedNoteID).behavior ]; var newFeature = false; From e9aa36e812cb87024e6324ef111a9bf418e6035f Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 10:40:04 -0400 Subject: [PATCH 025/217] restrict adding notes to zoom >= 16 --- dist/locales/en.json | 2 +- modules/ui/modes.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/locales/en.json b/dist/locales/en.json index 21fc4efc6..a7599f7fb 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -772,7 +772,7 @@ "report": "Report", "new": "New Note", "newDescription": "Describe the issue.", - "newNote": "Add Note" + "newNote": "Add Note", "login": "You must log in to change or comment on this note.", "upload_explanation": "Your comments will be publicly visible to all OpenStreetMap users.", "upload_explanation_with_user": "Your comments as {user} will be publicly visible to all OpenStreetMap users." diff --git a/modules/ui/modes.js b/modules/ui/modes.js index 4d01b6820..8a93b9ce7 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -36,7 +36,7 @@ export function uiModes(context) { function toggleNewNote() { return svgNotes().enabled() && context.connection().authenticated() - && ~~context.map().zoom() >= 12; + && ~~context.map().zoom() >= 16; } From 1edd9ae92f2117ea79b775d38671b4f07fe9060e Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 12:08:26 -0400 Subject: [PATCH 026/217] WIP: added incomplete move note action --- modules/actions/index.js | 1 + modules/actions/move_note.js | 19 ++++ modules/modes/drag_note.js | 186 +++++------------------------------ modules/osm/note.js | 6 +- 4 files changed, 51 insertions(+), 161 deletions(-) create mode 100644 modules/actions/move_note.js diff --git a/modules/actions/index.js b/modules/actions/index.js index 330690db2..6a5e9ed0c 100644 --- a/modules/actions/index.js +++ b/modules/actions/index.js @@ -23,6 +23,7 @@ export { actionMergePolygon } from './merge_polygon'; export { actionMergeRemoteChanges } from './merge_remote_changes'; export { actionMove } from './move'; export { actionMoveNode } from './move_node'; +export { actionMoveNote } from './move_note'; export { actionNoop } from './noop'; export { actionOrthogonalize } from './orthogonalize'; export { actionRestrictTurn } from './restrict_turn'; diff --git a/modules/actions/move_note.js b/modules/actions/move_note.js new file mode 100644 index 000000000..e2179b15a --- /dev/null +++ b/modules/actions/move_note.js @@ -0,0 +1,19 @@ +import { geoVecInterp } from '../geo'; +import { services } from '../services'; + +export function actionMoveNote(noteID, toLoc) { + + var action = function(graph, t) { + if (t === null || !isFinite(t)) t = 1; + t = Math.min(Math.max(+t, 0), 1); + + var note = services.osm.getNote(noteID); + note.move(geoVecInterp(note.loc, toLoc, t)); + console.log('moved: ', note.loc); + // TODO: update + }; + + action.transitionable = true; + + return action; +} diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index b5f1eef0f..5cc577339 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -1,3 +1,5 @@ +import { dispatch as d3_dispatch } from 'd3-dispatch'; + import _find from 'lodash-es/find'; import { @@ -12,7 +14,7 @@ import { t } from '../util/locale'; import { actionAddMidpoint, actionConnect, - actionMoveNode, + actionMoveNote, actionNoop } from '../actions'; @@ -52,6 +54,8 @@ export function modeDragNote(context) { var _startLoc; var _lastLoc; + var dispatch = d3_dispatch('change'); + function startNudge(entity, nudge) { if (_nudgeInterval) window.clearInterval(_nudgeInterval); @@ -113,37 +117,10 @@ export function modeDragNote(context) { function start(entity) { - _wasMidpoint = entity.type === 'midpoint'; - var hasHidden = context.features().hasHiddenConnections(entity, context.graph()); - _isCancelled = d3_event.sourceEvent.shiftKey || hasHidden; - - - if (_isCancelled) { - if (hasHidden) { - uiFlash() - .duration(4000) - .text(t('modes.drag_node.connected_to_hidden'))(); - } - return drag.cancel(); - } - - if (_wasMidpoint) { - var midpoint = entity; - entity = osmNote(); - context.perform(actionAddMidpoint(midpoint, entity)); - entity = context.entity(entity.id); // get post-action entity - - var vertex = context.surface().selectAll('.' + entity.id); - drag.target(vertex.node(), entity); - - } else { - context.perform(actionNoop()); - } - _activeEntity = entity; _startLoc = entity.loc; - context.surface().selectAll('.' + _activeEntity.id) + context.surface().selectAll('.note-' + _activeEntity.id) .classed('active', true); context.enter(mode); @@ -180,38 +157,22 @@ export function modeDragNote(context) { var d = datum(); var target = d; var targetLoc = target && target.loc; - var targetNodes = d && d.properties && d.properties.nodes; + var targetNotes = d; var edge; - if (targetLoc) { // snap to node/vertex - a point target with `.loc` - loc = targetLoc; + // if (targetLoc) { // snap to node/vertex - a point target with `.loc` + // loc = targetLoc; - } else if (targetNodes) { // snap to way - a line target with `.nodes` - edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id); - if (edge) { - loc = edge.loc; - } - } - } - - context.replace( - actionMoveNode(entity.id, loc), - // moveAnnotation(entity) TODO: - likely replace - ); - - // Below here: validations - var isInvalid = false; - - // Check if this connection to `target` could cause relations to break.. - if (target) { - isInvalid = hasRelationConflict(entity, target, edge, context.graph()); - } - - // Check if this drag causes the geometry to break.. - if (!isInvalid) { - isInvalid = hasInvalidGeometry(entity, context.graph()); + // } else if (targetNodes) { // snap to way - a line target with `.nodes` + // edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id); + // if (edge) { + // loc = edge.loc; + // } + // } } + actionMoveNote(entity.id, loc); + dispatch.call('change'); var nope = context.surface().classed('nope'); if (isInvalid === 'relation' || isInvalid === 'restriction') { @@ -246,101 +207,6 @@ export function modeDragNote(context) { } - // Uses `actionConnect.disabled()` to know whether this connection is ok.. - function hasRelationConflict(entity, target, edge, graph) { - var testGraph = graph.update(); // copy - - // if snapping to way - add midpoint there and consider that the target.. - if (edge) { - var midpoint = osmNote(); - var action = actionAddMidpoint({ - loc: edge.loc, - edge: [target.nodes[edge.index - 1], target.nodes[edge.index]] - }, midpoint); - - testGraph = action(testGraph); - target = midpoint; - } - - // can we connect to it? - var ids = [entity.id, target.id]; - return actionConnect(ids).disabled(testGraph); - } - - - function hasInvalidGeometry(entity, graph) { - var parents = graph.parentWays(entity); - var i, j, k; - - for (i = 0; i < parents.length; i++) { - var parent = parents[i]; - var nodes = []; - var activeIndex = null; // which multipolygon ring contains node being dragged - - // test any parent multipolygons for valid geometry - var relations = graph.parentRelations(parent); - for (j = 0; j < relations.length; j++) { - if (!relations[j].isMultipolygon()) continue; - - var rings = osmJoinWays(relations[j].members, graph); - - // find active ring and test it for self intersections - for (k = 0; k < rings.length; k++) { - nodes = rings[k].nodes; - if (_find(nodes, function(n) { return n.id === entity.id; })) { - activeIndex = k; - if (geoHasSelfIntersections(nodes, entity.id)) { - return true; - } - } - rings[k].coords = nodes.map(function(n) { return n.loc; }); - } - - // test active ring for intersections with other rings in the multipolygon - for (k = 0; k < rings.length; k++) { - if (k === activeIndex) continue; - - // make sure active ring doesnt cross passive rings - if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) { - return true; - } - } - } - - - // If we still haven't tested this node's parent way for self-intersections. - // (because it's not a member of a multipolygon), test it now. - if (activeIndex === null) { - nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); }); - if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) { - return true; - } - } - - } - - return false; - } - - - function move(entity) { - if (_isCancelled) return; - d3_event.sourceEvent.stopPropagation(); - - context.surface().classed('nope-disabled', d3_event.sourceEvent.altKey); - - _lastLoc = context.projection.invert(d3_event.point); - - doMove(entity); - var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); - if (nudge) { - startNudge(entity, nudge); - } else { - stopNudge(); - } - } - - function end(entity) { if (_isCancelled) return; @@ -430,8 +296,8 @@ export function modeDragNote(context) { // .on('keydown.drawWay', keydown) // .on('keyup.drawWay', keyup); - context.history() - .on('undone.drag-node', cancel); + // context.history() + // .on('undone.drag-node', cancel); }; @@ -440,15 +306,15 @@ export function modeDragNote(context) { context.uninstall(hover); context.uninstall(edit); - d3_select(window) - .on('keydown.hover', null) - .on('keyup.hover', null); + // d3_select(window) + // .on('keydown.hover', null) + // .on('keyup.hover', null); - context.history() - .on('undone.drag-node', null); + // context.history() + // .on('undone.drag-node', null); - context.map() - .on('drawn.drag-node', null); + // context.map() + // .on('drawn.drag-node', null); _activeEntity = null; diff --git a/modules/osm/note.js b/modules/osm/note.js index 3e10e8cf1..0b7b98d6f 100644 --- a/modules/osm/note.js +++ b/modules/osm/note.js @@ -55,6 +55,10 @@ _extend(osmNote.prototype, { isNew: function() { return this.id < 0; - } + }, + + move: function(loc) { + return this.update({loc: loc}); + }, }); From 18def6e576349fe029895aef107eee53c8ace6b8 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 12:10:50 -0400 Subject: [PATCH 027/217] fixed accidental deletion move function --- modules/modes/drag_note.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index 5cc577339..76575b79e 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -206,6 +206,23 @@ export function modeDragNote(context) { _lastLoc = loc; } + function move(entity) { + if (_isCancelled) return; + d3_event.sourceEvent.stopPropagation(); + + context.surface().classed('nope-disabled', d3_event.sourceEvent.altKey); + + _lastLoc = context.projection.invert(d3_event.point); + + doMove(entity); + var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); + if (nudge) { + startNudge(entity, nudge); + } else { + stopNudge(); + } + } + function end(entity) { if (_isCancelled) return; From 5d779f2fc51e95925d6a1e31aad6392b043d5cd6 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 12:56:36 -0400 Subject: [PATCH 028/217] WIP: readded missing vars --- modules/modes/drag_note.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index 76575b79e..2c55f4448 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -117,6 +117,8 @@ export function modeDragNote(context) { function start(entity) { + _isCancelled = d3_event.sourceEvent.shiftKey; + _activeEntity = entity; _startLoc = entity.loc; @@ -191,6 +193,9 @@ export function modeDragNote(context) { } } + // Below here: validations + var isInvalid = false; + var nopeDisabled = context.surface().classed('nope-disabled'); if (nopeDisabled) { @@ -309,6 +314,9 @@ export function modeDragNote(context) { context.install(hover); context.install(edit); + // context.selectedIDs(null); TODO: possibly add something like this + // context.selectedNoteID(_activeEntity); + // d3_select(window) // .on('keydown.drawWay', keydown) // .on('keyup.drawWay', keyup); From 24579b15bcf10fb62aa33b7ee1e1f5c7d40c13a8 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 14:26:02 -0400 Subject: [PATCH 029/217] WIP testing new drag_notes mode --- modules/behavior/drag.js | 3 + modules/modes/browse.js | 4 +- modules/modes/drag_note2.js | 496 +++++++++++++++++++++++++++++++++++ modules/modes/index.js | 1 + modules/modes/select_note.js | 2 +- 5 files changed, 503 insertions(+), 3 deletions(-) create mode 100644 modules/modes/drag_note2.js diff --git a/modules/behavior/drag.js b/modules/behavior/drag.js index ad0428fa1..550b8c5a1 100644 --- a/modules/behavior/drag.js +++ b/modules/behavior/drag.js @@ -69,6 +69,7 @@ export function behaviorDrag() { function dragstart() { + console.log('TAH - drag start'); _target = this; _event = eventOf(_target, arguments); @@ -128,6 +129,7 @@ export function behaviorDrag() { function dragend() { + console.log('TAH - drag end'); if (started) { _event({ type: 'end' }); @@ -155,6 +157,7 @@ export function behaviorDrag() { function drag(selection) { + console.log('TAH - drag: ', selection); var matchesSelector = utilPrefixDOMProperty('matchesSelector'); var delegate = dragstart; diff --git a/modules/modes/browse.js b/modules/modes/browse.js index 1638b6451..70fc21e96 100644 --- a/modules/modes/browse.js +++ b/modules/modes/browse.js @@ -8,7 +8,7 @@ import { } from '../behavior'; import { modeDragNode } from './drag_node'; -import { modeDragNote } from './drag_note'; +import { modeDragNote2 } from './drag_note2'; export function modeBrowse(context) { @@ -25,7 +25,7 @@ export function modeBrowse(context) { behaviorSelect(context), behaviorLasso(context), modeDragNode(context).behavior, - modeDragNote(context).behavior // TAH - possibly change + modeDragNote2(context).behavior ]; diff --git a/modules/modes/drag_note2.js b/modules/modes/drag_note2.js new file mode 100644 index 000000000..f2505bb7c --- /dev/null +++ b/modules/modes/drag_note2.js @@ -0,0 +1,496 @@ +import _find from 'lodash-es/find'; + +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + +import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; + +import { t } from '../util/locale'; + +import { + actionAddMidpoint, + actionConnect, + actionMoveNode, + actionNoop +} from '../actions'; + +import { + behaviorEdit, + behaviorHover, + behaviorDrag +} from '../behavior'; + +import { + geoChooseEdge, + geoHasLineIntersections, + geoHasSelfIntersections, + geoVecSubtract, + geoViewportEdge +} from '../geo'; + +import { modeBrowse, modeSelect } from './index'; +import { osmJoinWays, osmNode } from '../osm'; +import { uiFlash } from '../ui'; + + +export function modeDragNote2(context) { + var mode = { + id: 'drag-note2', + button: 'browse' + }; + var hover = behaviorHover(context).altDisables(true) + .on('hover', context.ui().sidebar.hover); + var edit = behaviorEdit(context); + + var _nudgeInterval; + var _restoreSelectedIDs = []; + var _wasMidpoint = false; + var _isCancelled = false; + var _activeEntity; + var _startLoc; + var _lastLoc; + + + function startNudge(entity, nudge) { + if (_nudgeInterval) window.clearInterval(_nudgeInterval); + _nudgeInterval = window.setInterval(function() { + context.pan(nudge); + doMove(entity, nudge); + }, 50); + } + + + function stopNudge() { + if (_nudgeInterval) { + window.clearInterval(_nudgeInterval); + _nudgeInterval = null; + } + } + + + function moveAnnotation(entity) { + return t('operations.move.annotation.' + entity.geometry(context.graph())); + } + + + function connectAnnotation(entity) { + return t('operations.connect.annotation.' + entity.geometry(context.graph())); + } + + + function origin(entity) { + return context.projection(entity.loc); + } + + + function keydown() { + if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { + if (context.surface().classed('nope')) { + context.surface() + .classed('nope-suppressed', true); + } + context.surface() + .classed('nope', false) + .classed('nope-disabled', true); + } + } + + + function keyup() { + if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { + if (context.surface().classed('nope-suppressed')) { + context.surface() + .classed('nope', true); + } + context.surface() + .classed('nope-suppressed', false) + .classed('nope-disabled', false); + } + } + + + function start(entity) { + _wasMidpoint = entity.type === 'midpoint'; + var hasHidden = context.features().hasHiddenConnections(entity, context.graph()); + _isCancelled = d3_event.sourceEvent.shiftKey || hasHidden; + + + if (_isCancelled) { + if (hasHidden) { + uiFlash() + .duration(4000) + .text(t('modes.drag_node.connected_to_hidden'))(); + } + return drag.cancel(); + } + + if (_wasMidpoint) { + var midpoint = entity; + entity = osmNode(); + context.perform(actionAddMidpoint(midpoint, entity)); + entity = context.entity(entity.id); // get post-action entity + + var vertex = context.surface().selectAll('.' + entity.id); + drag.target(vertex.node(), entity); + + } else { + console.log('else'); + context.perform(actionNoop()); + } + + _activeEntity = entity; + _startLoc = entity.loc; + + context.surface().selectAll('.' + _activeEntity.id) + .classed('active', true); + + context.enter(mode); + } + + + // related code + // - `behavior/draw.js` `datum()` + function datum() { + var event = d3_event && d3_event.sourceEvent; + if (!event || event.altKey) { + return {}; + } else { + // When dragging, snap only to touch targets.. + // (this excludes area fills and active drawing elements) + var d = event.target.__data__; + return (d && d.properties && d.properties.target) ? d : {}; + } + } + + + function doMove(entity, nudge) { + nudge = nudge || [0, 0]; + + var currPoint = (d3_event && d3_event.point) || context.projection(_lastLoc); + var currMouse = geoVecSubtract(currPoint, nudge); + var loc = context.projection.invert(currMouse); + + if (!_nudgeInterval) { // If not nudging at the edge of the viewport, try to snap.. + // related code + // - `mode/drag_node.js` `doMode()` + // - `behavior/draw.js` `click()` + // - `behavior/draw_way.js` `move()` + var d = datum(); + var target = d && d.properties && d.properties.entity; + var targetLoc = target && target.loc; + var targetNodes = d && d.properties && d.properties.nodes; + var edge; + + if (targetLoc) { // snap to node/vertex - a point target with `.loc` + loc = targetLoc; + + } else if (targetNodes) { // snap to way - a line target with `.nodes` + edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id); + if (edge) { + loc = edge.loc; + } + } + } + + context.replace( + actionMoveNode(entity.id, loc), + moveAnnotation(entity) + ); + + // Below here: validations + var isInvalid = false; + + // Check if this connection to `target` could cause relations to break.. + if (target) { + isInvalid = hasRelationConflict(entity, target, edge, context.graph()); + } + + // Check if this drag causes the geometry to break.. + if (!isInvalid) { + isInvalid = hasInvalidGeometry(entity, context.graph()); + } + + + var nope = context.surface().classed('nope'); + if (isInvalid === 'relation' || isInvalid === 'restriction') { + if (!nope) { // about to nope - show hint + uiFlash() + .duration(4000) + .text(t('operations.connect.' + isInvalid, + { relation: context.presets().item('type/restriction').name() } + ))(); + } + } else { + if (nope) { // about to un-nope, remove hint + uiFlash() + .duration(1) + .text('')(); + } + } + + + var nopeDisabled = context.surface().classed('nope-disabled'); + if (nopeDisabled) { + context.surface() + .classed('nope', false) + .classed('nope-suppressed', isInvalid); + } else { + context.surface() + .classed('nope', isInvalid) + .classed('nope-suppressed', false); + } + + _lastLoc = loc; + } + + + // Uses `actionConnect.disabled()` to know whether this connection is ok.. + function hasRelationConflict(entity, target, edge, graph) { + var testGraph = graph.update(); // copy + + // if snapping to way - add midpoint there and consider that the target.. + if (edge) { + var midpoint = osmNode(); + var action = actionAddMidpoint({ + loc: edge.loc, + edge: [target.nodes[edge.index - 1], target.nodes[edge.index]] + }, midpoint); + + testGraph = action(testGraph); + target = midpoint; + } + + // can we connect to it? + var ids = [entity.id, target.id]; + return actionConnect(ids).disabled(testGraph); + } + + + function hasInvalidGeometry(entity, graph) { + var parents = graph.parentWays(entity); + var i, j, k; + + for (i = 0; i < parents.length; i++) { + var parent = parents[i]; + var nodes = []; + var activeIndex = null; // which multipolygon ring contains node being dragged + + // test any parent multipolygons for valid geometry + var relations = graph.parentRelations(parent); + for (j = 0; j < relations.length; j++) { + if (!relations[j].isMultipolygon()) continue; + + var rings = osmJoinWays(relations[j].members, graph); + + // find active ring and test it for self intersections + for (k = 0; k < rings.length; k++) { + nodes = rings[k].nodes; + if (_find(nodes, function(n) { return n.id === entity.id; })) { + activeIndex = k; + if (geoHasSelfIntersections(nodes, entity.id)) { + return true; + } + } + rings[k].coords = nodes.map(function(n) { return n.loc; }); + } + + // test active ring for intersections with other rings in the multipolygon + for (k = 0; k < rings.length; k++) { + if (k === activeIndex) continue; + + // make sure active ring doesnt cross passive rings + if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) { + return true; + } + } + } + + + // If we still haven't tested this node's parent way for self-intersections. + // (because it's not a member of a multipolygon), test it now. + if (activeIndex === null) { + nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); }); + if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) { + return true; + } + } + + } + + return false; + } + + + function move(entity) { + if (_isCancelled) return; + d3_event.sourceEvent.stopPropagation(); + + context.surface().classed('nope-disabled', d3_event.sourceEvent.altKey); + + _lastLoc = context.projection.invert(d3_event.point); + + doMove(entity); + var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); + if (nudge) { + startNudge(entity, nudge); + } else { + stopNudge(); + } + } + + + function end(entity) { + if (_isCancelled) return; + + var d = datum(); + var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope'); + var target = d && d.properties && d.properties.entity; // entity to snap to + + if (nope) { // bounce back + context.perform( + _actionBounceBack(entity.id, _startLoc) + ); + + } else if (target && target.type === 'way') { + var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id); + context.replace( + actionAddMidpoint({ + loc: choice.loc, + edge: [target.nodes[choice.index - 1], target.nodes[choice.index]] + }, entity), + connectAnnotation(target) + ); + + } else if (target && target.type === 'node') { + context.replace( + actionConnect([target.id, entity.id]), + connectAnnotation(target) + ); + + } else if (_wasMidpoint) { + context.replace( + actionNoop(), + t('operations.add.annotation.vertex') + ); + + } else { + context.replace( + actionNoop(), + moveAnnotation(entity) + ); + } + + var reselection = _restoreSelectedIDs.filter(function(id) { + return context.graph().hasEntity(id); + }); + + if (reselection.length) { + context.enter(modeSelect(context, reselection)); + } else { + context.enter(modeBrowse(context)); + } + } + + + function _actionBounceBack(nodeID, toLoc) { + var moveNode = actionMoveNode(nodeID, toLoc); + var action = function(graph, t) { + // last time through, pop off the bounceback perform. + // it will then overwrite the initial perform with a moveNode that does nothing + if (t === 1) context.pop(); + return moveNode(graph, t); + }; + action.transitionable = true; + return action; + } + + + function cancel() { + drag.cancel(); + context.enter(modeBrowse(context)); + } + + + var drag = behaviorDrag() + .selector('.layer-notes .note') + .surface(d3_select('#map').node()) + .origin(origin) + .on('start', start) + .on('move', move) + .on('end', end); + + + mode.enter = function() { + console.log('TAH - mode.drag_note2 entered'); + context.install(hover); + context.install(edit); + + d3_select(window) + .on('keydown.drawWay', keydown) + .on('keyup.drawWay', keyup); + + context.history() + .on('undone.drag-node', cancel); + }; + + + mode.exit = function() { + console.log('TAH - mode.drag_note2 exited'); + context.ui().sidebar.hover.cancel(); + context.uninstall(hover); + context.uninstall(edit); + + d3_select(window) + .on('keydown.hover', null) + .on('keyup.hover', null); + + context.history() + .on('undone.drag-node', null); + + context.map() + .on('drawn.drag-node', null); + + _activeEntity = null; + + context.surface() + .classed('nope', false) + .classed('nope-suppressed', false) + .classed('nope-disabled', false) + .selectAll('.active') + .classed('active', false); + + stopNudge(); + }; + + + mode.selectedIDs = function() { + console.log('TAH - mode.selectedIDs'); + if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; + // no assign + return mode; + }; + + + mode.activeID = function() { + console.log('TAH - mode.selectedIDs'); + if (!arguments.length) return _activeEntity && _activeEntity.id; + // no assign + return mode; + }; + + + mode.restoreSelectedIDs = function(_) { + console.log('TAH - mode.restoreSelectedIDs'); + if (!arguments.length) return _restoreSelectedIDs; + _restoreSelectedIDs = _; + return mode; + }; + + + mode.behavior = drag; + + + return mode; +} diff --git a/modules/modes/index.js b/modules/modes/index.js index 56ed999d0..68ae49f05 100644 --- a/modules/modes/index.js +++ b/modules/modes/index.js @@ -4,6 +4,7 @@ export { modeAddPoint } from './add_point'; export { modeAddNote } from './add_note'; export { modeBrowse } from './browse'; export { modeDragNode } from './drag_node'; +export { modeDragNote2 } from './drag_note2'; export { modeDrawArea } from './draw_area'; export { modeDrawLine } from './draw_line'; export { modeMove } from './move'; diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 430870e96..c16b5c711 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -40,7 +40,7 @@ export function modeSelectNote(context, selectedNoteID) { behaviorHover(context), behaviorSelect(context), behaviorLasso(context), - modeDragNote(context).restoreSelectedNoteIDs(selectedNoteID).behavior + // modeDragNote(context).restoreSelectedNoteIDs(selectedNoteID).behavior TAH - re-add ]; var newFeature = false; From bf9b19359ae24d297ac2837e8eacfa21660608a6 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 21:41:44 -0400 Subject: [PATCH 030/217] WIP drag note --- modules/behavior/drag.js | 7 +- modules/behavior/draw.js | 1 - modules/behavior/hash.js | 2 + modules/modes/add_note.js | 3 +- modules/modes/browse.js | 4 +- modules/modes/drag_note.js | 254 +++++++++++++++++++++++++++++++++++ modules/modes/index.js | 1 + modules/modes/select_note.js | 3 + modules/osm/note.js | 4 + modules/renderer/map.js | 8 +- modules/services/osm.js | 36 +++-- modules/svg/notes.js | 2 + modules/ui/modes.js | 4 +- modules/ui/note_editor.js | 6 +- 14 files changed, 315 insertions(+), 20 deletions(-) create mode 100644 modules/modes/drag_note.js diff --git a/modules/behavior/drag.js b/modules/behavior/drag.js index f32c952ce..9735b77ae 100644 --- a/modules/behavior/drag.js +++ b/modules/behavior/drag.js @@ -9,6 +9,8 @@ import { touches as d3_touches } from 'd3-selection'; +import { osmNote } from '../osm'; + import { utilRebind } from '../util/rebind'; import { @@ -162,7 +164,10 @@ export function behaviorDrag() { var target = d3_event.target; for (; target && target !== root; target = target.parentNode) { var datum = target.__data__; - var entity = datum && datum.properties && datum.properties.entity; + + var entity = datum instanceof osmNote ? + datum : datum && datum.properties && datum.properties.entity; + if (entity && target[matchesSelector](_selector)) { return dragstart.call(target, entity); } diff --git a/modules/behavior/draw.js b/modules/behavior/draw.js index 80b158d71..21d17d2f5 100644 --- a/modules/behavior/draw.js +++ b/modules/behavior/draw.js @@ -138,7 +138,6 @@ export function behaviorDraw(context) { return; } } - dispatch.call('click', this, context.map().mouseCoordinates(), d); } diff --git a/modules/behavior/hash.js b/modules/behavior/hash.js index 2aa76ff2b..cb073c40a 100644 --- a/modules/behavior/hash.js +++ b/modules/behavior/hash.js @@ -51,6 +51,8 @@ export function behaviorHash(context) { var newParams = {}; delete q.id; + console.log('TAH - hash: context.selectedIDs()', context.selectedIDs()); + console.log('TAH - hash: context.selectedNoteID()', context.selectedNoteID()); var selected = context.selectedIDs().filter(function(id) { return !context.entity(id).isNew(); }); diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index e44a2f763..f0ab36571 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -28,6 +28,7 @@ export function modeAddNote(context) { function add(loc) { var note = osmNote({ + id: -1, loc: loc, status: 'open', comments: {}, @@ -35,8 +36,6 @@ export function modeAddNote(context) { }); services.osm.replaceNote(note); - dispatch.call('change'); - context .selectedNoteID(note.id) diff --git a/modules/modes/browse.js b/modules/modes/browse.js index 5ba0e7fee..72484df62 100644 --- a/modules/modes/browse.js +++ b/modules/modes/browse.js @@ -8,6 +8,7 @@ import { } from '../behavior'; import { modeDragNode } from './drag_node'; +import { modeDragNote } from './drag_note'; export function modeBrowse(context) { @@ -23,7 +24,8 @@ export function modeBrowse(context) { behaviorHover(context).on('hover', context.ui().sidebar.hover), behaviorSelect(context), behaviorLasso(context), - modeDragNode(context).behavior + modeDragNode(context).behavior, + modeDragNote(context).behavior ]; diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js new file mode 100644 index 000000000..d6d1f2b9b --- /dev/null +++ b/modules/modes/drag_note.js @@ -0,0 +1,254 @@ +import _find from 'lodash-es/find'; + +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + +import { dispatch as d3_dispatch } from 'd3-dispatch'; + +import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; + +import { geoVecInterp } from '../geo'; + +import { t } from '../util/locale'; + +import { services } from '../services'; + + +import { + actionAddMidpoint, + actionConnect, + actionMoveNode, + actionNoop +} from '../actions'; + +import { + behaviorEdit, + behaviorHover, + behaviorDrag +} from '../behavior'; + +import { + geoChooseEdge, + geoHasLineIntersections, + geoHasSelfIntersections, + geoVecSubtract, + geoViewportEdge +} from '../geo'; + +import { modeBrowse, modeSelectNote } from './index'; +import { osmJoinWays, osmNode } from '../osm'; +import { uiFlash } from '../ui'; + + +export function modeDragNote(context) { + var mode = { + id: 'drag-note', + button: 'browse' + }; + var hover = behaviorHover(context).altDisables(true) + .on('hover', context.ui().sidebar.hover); + var edit = behaviorEdit(context); + + var dispatch = d3_dispatch('redraw', 'change'); + + var _nudgeInterval; + var _restoreSelectedNoteID = []; + var _wasMidpoint = false; + var _isCancelled = false; + var _activeEntity; + var _startLoc; + var _lastLoc; + + + function startNudge(entity, nudge) { + if (_nudgeInterval) window.clearInterval(_nudgeInterval); + _nudgeInterval = window.setInterval(function() { + context.pan(nudge); + doMove(entity, nudge); + }, 50); + } + + + function stopNudge() { + if (_nudgeInterval) { + window.clearInterval(_nudgeInterval); + _nudgeInterval = null; + } + } + + + function origin(entity) { + return context.projection(entity.loc); + } + + + function keydown() { + if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { + if (context.surface().classed('nope')) { + context.surface() + .classed('nope-suppressed', true); + } + context.surface() + .classed('nope', false) + .classed('nope-disabled', true); + } + } + + + function keyup() { + if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { + if (context.surface().classed('nope-suppressed')) { + context.surface() + .classed('nope', true); + } + context.surface() + .classed('nope-suppressed', false) + .classed('nope-disabled', false); + } + } + + + function start(entity) { + console.log('TAH - drag_note start()'); + + context.perform(actionNoop()); + + _activeEntity = entity; + _startLoc = entity.loc; + + context.surface().selectAll('.note-' + _activeEntity.id) + .classed('active', true); + + context.enter(mode); + } + + + function move(entity) { + if (_isCancelled) return; + d3_event.sourceEvent.stopPropagation(); + + context.surface().classed('nope-disabled', d3_event.sourceEvent.altKey); + + _lastLoc = context.projection.invert(d3_event.point); + + doMove(entity); + // var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); + // if (nudge) { + // startNudge(entity, nudge); + // } else { + // stopNudge(); + // } + + } + + + function doMove(entity, nudge) { + nudge = nudge || [0, 0]; + + var currPoint = (d3_event && d3_event.point) || context.projection(_lastLoc); + var currMouse = geoVecSubtract(currPoint, nudge); + var loc = context.projection.invert(currMouse); + + entity = entity.move(geoVecInterp(entity.loc, loc, 1)); + + var osm = services.osm; + if (osm) { + osm.replaceNote(entity); // update note cache + } + dispatch.call('change', this, 'difference'); + console.log('moved: ', entity.loc); + } + + + function end(entity) { + console.log('TAH - drag_note end()'); + context + .selectedNoteID(entity.id) + .enter(modeSelectNote(context, entity.id)); + } + + + function cancel() { + drag.cancel(); + context.enter(modeBrowse(context)); + } + + + var drag = behaviorDrag() + .selector('.layer-notes .new') + .surface(d3_select('#map').node()) + .origin(origin) + .on('start', start) + .on('move', move) + .on('end', end); + + + mode.enter = function() { + context.install(hover); + context.install(edit); + + d3_select(window) + .on('keydown.drawWay', keydown) + .on('keyup.drawWay', keyup); + + context.history() + .on('undone.drag-note', cancel); + }; + + + mode.exit = function() { + context.ui().sidebar.hover.cancel(); + context.uninstall(hover); + context.uninstall(edit); + + d3_select(window) + .on('keydown.hover', null) + .on('keyup.hover', null); + + context.history() + .on('undone.drag-note', null); + + context.map() + .on('drawn.drag-note', null); + + _activeEntity = null; + + context.surface() + .classed('nope', false) + .classed('nope-suppressed', false) + .classed('nope-disabled', false) + .selectAll('.active') + .classed('active', false); + + stopNudge(); + }; + + + mode.selectedNoteID = function() { + if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; + // no assign + return mode; + }; + + + mode.activeID = function() { + if (!arguments.length) return _activeEntity && _activeEntity.id; + // no assign + return mode; + }; + + + mode.restoreSelectedNoteID = function(_) { + if (!arguments.length) return _restoreSelectedNoteID; + _restoreSelectedNoteID = _; + return mode; + }; + + + mode.behavior = drag; + + + return mode; +} diff --git a/modules/modes/index.js b/modules/modes/index.js index 56ed999d0..83838c4e1 100644 --- a/modules/modes/index.js +++ b/modules/modes/index.js @@ -4,6 +4,7 @@ export { modeAddPoint } from './add_point'; export { modeAddNote } from './add_note'; export { modeBrowse } from './browse'; export { modeDragNode } from './drag_node'; +export { modeDragNote } from './drag_note'; export { modeDrawArea } from './draw_area'; export { modeDrawLine } from './draw_line'; export { modeMove } from './move'; diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index e2c008fbc..56fe0f198 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -11,6 +11,8 @@ import { behaviorSelect } from '../behavior'; +import { modeDragNote } from '../modes'; + import { services } from '../services'; import { modeBrowse } from './browse'; import { uiNoteEditor } from '../ui'; @@ -37,6 +39,7 @@ export function modeSelectNote(context, selectedNoteID) { behaviorHover(context), behaviorSelect(context), behaviorLasso(context), + modeDragNote(context).behavior ]; var newFeature = false; diff --git a/modules/osm/note.js b/modules/osm/note.js index 3e10e8cf1..ed03c0504 100644 --- a/modules/osm/note.js +++ b/modules/osm/note.js @@ -55,6 +55,10 @@ _extend(osmNote.prototype, { isNew: function() { return this.id < 0; + }, + + move: function(loc) { + return this.update({ loc: loc }); } }); diff --git a/modules/renderer/map.js b/modules/renderer/map.js index 1118488b7..d6c7d809c 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -38,7 +38,8 @@ import { svgLines, svgMidpoints, svgPoints, - svgVertices + svgVertices, + svgNotes } from '../svg'; import { uiFlash } from '../ui'; @@ -73,6 +74,8 @@ export function rendererMap(context) { var drawMidpoints = svgMidpoints(projection, context); var drawLabels = svgLabels(projection, context); + var drawNotes = svgNotes(projection, context); + var _selection = d3_select(null); var supersurface = d3_select(null); var wrapper = d3_select(null); @@ -341,6 +344,9 @@ export function rendererMap(context) { .call(drawLabels, graph, data, filter, dimensions, fullRedraw) .call(drawPoints, graph, data, filter); + surface.selectAll('.data-layer-notes') + .call(drawNotes); + dispatch.call('drawn', this, {full: true}); } diff --git a/modules/services/osm.js b/modules/services/osm.js index 079a64c1a..9afd91fb8 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -327,6 +327,20 @@ function parseXML(xml, callback, options) { } +// replace or remove note from rtree +function updateRtree(item, replace) { // update (or insert) in _noteCache.rtree + + // TODO: other checks needed? (e.g., if cache.data.children.length decrements ...) + + // remove note + _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); + if (replace) { + _noteCache.rtree.insert(item); // add note (updated) + } + +} + + function wrapcb(thisArg, callback, cid) { return function(err, result) { if (err) { @@ -1033,23 +1047,23 @@ export default { }, + // remove a single note from the cache + removeNote: function(note) { + if (!(note instanceof osmNote) || !note.id) return; + + delete _noteCache.note[note.id]; + + updateRtree(encodeNoteRtree(note), false); + }, + + // replace a single note in the cache replaceNote: function(note) { if (!(note instanceof osmNote) || !note.id) return; _noteCache.note[note.id] = note; // update (or insert) in _noteCache.note - function updateRtree(item) { // update (or insert) in _noteCache.rtree - - // TODO: other checks needed? (e.g., if cache.data.children.length decrements ...) - - // remove note - _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); - _noteCache.rtree.insert(item); // add note (updated) - - } - - updateRtree(encodeNoteRtree(note)); + updateRtree(encodeNoteRtree(note), true); return note; } diff --git a/modules/svg/notes.js b/modules/svg/notes.js index 511f10c00..e5f7d88c3 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -1,12 +1,14 @@ import _throttle from 'lodash-es/throttle'; import { select as d3_select } from 'd3-selection'; +import { dispatch as d3_dispatch } from 'd3-dispatch'; import { svgPointTransform } from './index'; import { services } from '../services'; export function svgNotes(projection, context, dispatch) { + if (!dispatch) { dispatch = d3_dispatch('change'); } var throttledRedraw = _throttle(function () { dispatch.call('change'); }, 1000); var minZoom = 12; var layer = d3_select(null); diff --git a/modules/ui/modes.js b/modules/ui/modes.js index 4d01b6820..ad00af2b4 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -16,6 +16,7 @@ import { import { svgIcon } from '../svg'; import { tooltip } from '../util/tooltip'; import { uiTooltipHtml } from './tooltipHtml'; +import { services } from '../services/index.js'; export function uiModes(context) { @@ -36,7 +37,7 @@ export function uiModes(context) { function toggleNewNote() { return svgNotes().enabled() && context.connection().authenticated() - && ~~context.map().zoom() >= 12; + && ~~context.map().zoom() >= 16; } @@ -97,7 +98,6 @@ export function uiModes(context) { modes.forEach(function(mode) { keybinding.on(mode.key, function() { - // TODO: allow zooming out beyond minZoom when adding new note. Currently prevented if ((editable() && mode.id !== 'add-note') || (toggleNewNote() && mode.id === 'add-note')) { if (mode.id === context.mode().id) { context.enter(modeBrowse(context)); diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index 1ded94d46..fd526076f 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -40,7 +40,11 @@ export function uiNoteEditor(context) { headerEnter .append('button') .attr('class', 'fr note-editor-close') - .on('click', function() { context.enter(modeBrowse(context)); }) + .on('click', function() { + var osm = services.osm; + if (_note.isNew()) { osm.removeNote(_note); } // delete new note + context.enter(modeBrowse(context)); + }) .call(svgIcon('#iD-icon-close')); headerEnter From 1d61355d08bc9636ebfd187155f213d3b2b0ea5a Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 22:19:57 -0400 Subject: [PATCH 031/217] added service for new note --- modules/services/osm.js | 39 ++++++++++++++++++++++++++++++++++++++- modules/ui/note_editor.js | 2 +- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/modules/services/osm.js b/modules/services/osm.js index 9afd91fb8..74e9a5cb8 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -861,7 +861,43 @@ export default { // Create a note // POST /api/0.6/notes?params postNoteCreate: function(note, callback) { - // todo + if (!this.authenticated()) { + return callback({ message: 'Not Authenticated', status: -3 }, note); + } + if (_noteCache.inflightPost[note.id]) { + return callback({ message: 'Note update already inflight', status: -2 }, note); + } + + if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required + + var path = '/api/0.6/notes?' + + 'lat=' + note.loc[1] + + '&lon=' + note.loc[0] + + '&' + utilQsString({ text: note.newComment }); + _noteCache.inflightPost[note.id] = oauth.xhr( + { method: 'POST', path: path }, + wrapcb(this, done, _connectionID) + ); + + + function done(err, xml) { + delete _noteCache.inflightPost[note.id]; + if (err) { return callback(err); } + + // we get the updated note back, remove from caches and reparse.. + var item = encodeNoteRtree(note); + _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); + delete _noteCache.note[note.id]; + + var options = { skipSeen: false }; + return parseXML(xml, function(err, results) { + if (err) { + return callback(err); + } else { + return callback(undefined, results[0]); + } + }, options); + } }, @@ -884,6 +920,7 @@ export default { action = 'reopen'; } else { action = 'comment'; + if (!note.newComment) return; // when commenting, comment required } var path = '/api/0.6/notes/' + note.id + '/' + action; diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index fd526076f..10c78ab9e 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -322,7 +322,7 @@ export function uiNoteEditor(context) { this.blur(); // avoid keeping focus on the button - #4641 var osm = services.osm; if (osm) { - osm.postNoteAdd(d, d.status, function(err, note) { + osm.postNoteCreate(d, function(err, note) { dispatch.call('change', note); }); } From bd81f7fdbe7a2e968981acd2a5bc26598df2e640 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 20 Jul 2018 22:34:00 -0400 Subject: [PATCH 032/217] Add `aeroway=aerodrome` to Military Airfield preset, adjust terms (closes #5164) --- data/presets.yaml | 4 ++-- data/presets/presets.json | 4 ++-- data/presets/presets/aeroway/aerodrome.json | 6 +++++- data/presets/presets/landuse/military/airfield.json | 10 ++++++++++ dist/locales/en.json | 4 ++-- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index 7e64c40da..a5c716a72 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -1825,7 +1825,7 @@ en: aeroway/aerodrome: # aeroway=aerodrome name: Airport - # 'terms: airplane,airport,aerodrome' + # 'terms: aerodrome,aeroway,airplane,airport,jet,plane' terms: '' aeroway/apron: # aeroway=apron @@ -3692,7 +3692,7 @@ en: landuse/military/airfield: # military=airfield name: Military Airfield - # 'terms: air force,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war' + # 'terms: aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war' terms: '' landuse/military/barracks: # military=barracks diff --git a/data/presets/presets.json b/data/presets/presets.json index 31654b69e..5c824b596 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -25,7 +25,7 @@ "aerialway/pylon": {"geometry": ["point", "vertex"], "fields": ["ref"], "tags": {"aerialway": "pylon"}, "name": "Aerialway Pylon"}, "aerialway/rope_tow": {"geometry": ["line"], "terms": ["handle tow", "bugel lift"], "fields": ["name", "aerialway/capacity", "aerialway/duration"], "tags": {"aerialway": "rope_tow"}, "name": "Rope Tow Lift"}, "aerialway/t-bar": {"geometry": ["line"], "fields": ["name", "aerialway/capacity", "aerialway/duration"], "terms": ["tbar"], "tags": {"aerialway": "t-bar"}, "name": "T-bar Lift"}, - "aeroway/aerodrome": {"icon": "maki-airport", "geometry": ["point", "area"], "fields": ["name", "iata", "icao", "operator", "internet_access", "internet_access/fee", "internet_access/ssid"], "terms": ["airplane", "airport", "aerodrome"], "tags": {"aeroway": "aerodrome"}, "name": "Airport"}, + "aeroway/aerodrome": {"icon": "maki-airport", "geometry": ["point", "area"], "fields": ["name", "iata", "icao", "operator", "internet_access", "internet_access/fee", "internet_access/ssid"], "terms": ["aerodrome", "aeroway", "airplane", "airport", "jet", "plane"], "tags": {"aeroway": "aerodrome"}, "matchScore": 0.9, "name": "Airport"}, "aeroway/apron": {"icon": "maki-airport", "geometry": ["area"], "terms": ["ramp"], "fields": ["ref", "surface"], "tags": {"aeroway": "apron"}, "name": "Apron"}, "aeroway/gate": {"icon": "maki-airport", "geometry": ["point"], "fields": ["ref_aeroway_gate"], "tags": {"aeroway": "gate"}, "name": "Airport Gate"}, "aeroway/hangar": {"geometry": ["area"], "fields": ["name", "building_area"], "tags": {"aeroway": "hangar"}, "name": "Hangar"}, @@ -439,7 +439,7 @@ "landuse/landfill": {"geometry": ["area"], "fields": ["name"], "tags": {"landuse": "landfill"}, "terms": ["dump"], "name": "Landfill"}, "landuse/meadow": {"icon": "maki-garden", "geometry": ["area"], "fields": ["name"], "tags": {"landuse": "meadow"}, "terms": [], "name": "Meadow"}, "landuse/military": {"icon": "temaki-military", "fields": ["name"], "geometry": ["area"], "tags": {"landuse": "military"}, "terms": [], "matchScore": 0.9, "name": "Military Area"}, - "landuse/military/airfield": {"icon": "maki-airfield", "fields": ["name", "iata", "icao"], "geometry": ["point", "area"], "tags": {"military": "airfield"}, "addTags": {"landuse": "military", "military": "airfield"}, "removeTags": {"landuse": "military", "military": "airfield"}, "terms": ["air force", "army", "base", "bomb", "fight", "force", "guard", "heli*", "jet", "marine", "navy", "plane", "troop", "war"], "name": "Military Airfield"}, + "landuse/military/airfield": {"icon": "maki-airfield", "fields": ["name", "iata", "icao"], "geometry": ["point", "area"], "tags": {"military": "airfield"}, "addTags": {"aeroway": "aerodrome", "landuse": "military", "military": "airfield"}, "removeTags": {"aeroway": "aerodrome", "landuse": "military", "military": "airfield"}, "reference": {"key": "military", "value": "airfield"}, "terms": ["aerodrome", "aeroway", "air force", "airplane", "airport", "army", "base", "bomb", "fight", "force", "guard", "heli*", "jet", "marine", "navy", "plane", "troop", "war"], "name": "Military Airfield"}, "landuse/military/barracks": {"icon": "temaki-military", "fields": ["name", "building_area"], "geometry": ["point", "area"], "tags": {"military": "barracks"}, "addTags": {"landuse": "military", "military": "barracks"}, "removeTags": {"landuse": "military", "military": "barracks"}, "terms": ["air force", "army", "base", "fight", "force", "guard", "marine", "navy", "troop", "war"], "name": "Barracks"}, "landuse/military/bunker": {"icon": "temaki-military", "fields": ["name", "bunker_type", "building_area"], "geometry": ["point", "area"], "tags": {"military": "bunker"}, "addTags": {"building": "bunker", "landuse": "military", "military": "bunker"}, "removeTags": {"building": "bunker", "landuse": "military", "military": "bunker"}, "terms": ["air force", "army", "base", "fight", "force", "guard", "marine", "navy", "troop", "war"], "name": "Military Bunker"}, "landuse/military/checkpoint": {"icon": "maki-barrier", "fields": ["name"], "geometry": ["point", "vertex", "area"], "tags": {"military": "checkpoint"}, "addTags": {"landuse": "military", "military": "checkpoint"}, "removeTags": {"landuse": "military", "military": "checkpoint"}, "terms": ["air force", "army", "base", "force", "guard", "marine", "navy", "troop", "war"], "name": "Checkpoint"}, diff --git a/data/presets/presets/aeroway/aerodrome.json b/data/presets/presets/aeroway/aerodrome.json index 6d98ff8f6..4530677dd 100644 --- a/data/presets/presets/aeroway/aerodrome.json +++ b/data/presets/presets/aeroway/aerodrome.json @@ -14,12 +14,16 @@ "internet_access/ssid" ], "terms": [ + "aerodrome", + "aeroway", "airplane", "airport", - "aerodrome" + "jet", + "plane" ], "tags": { "aeroway": "aerodrome" }, + "matchScore": 0.9, "name": "Airport" } diff --git a/data/presets/presets/landuse/military/airfield.json b/data/presets/presets/landuse/military/airfield.json index ebe245114..97b61ff02 100644 --- a/data/presets/presets/landuse/military/airfield.json +++ b/data/presets/presets/landuse/military/airfield.json @@ -13,15 +13,25 @@ "military": "airfield" }, "addTags": { + "aeroway": "aerodrome", "landuse": "military", "military": "airfield" }, "removeTags": { + "aeroway": "aerodrome", "landuse": "military", "military": "airfield" }, + "reference": { + "key": "military", + "value": "airfield" + }, "terms": [ + "aerodrome", + "aeroway", "air force", + "airplane", + "airport", "army", "base", "bomb", diff --git a/dist/locales/en.json b/dist/locales/en.json index e4b2ccb4d..8781f6338 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2971,7 +2971,7 @@ }, "aeroway/aerodrome": { "name": "Airport", - "terms": "airplane,airport,aerodrome" + "terms": "aerodrome,aeroway,airplane,airport,jet,plane" }, "aeroway/apron": { "name": "Apron", @@ -4627,7 +4627,7 @@ }, "landuse/military/airfield": { "name": "Military Airfield", - "terms": "air force,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war" + "terms": "aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war" }, "landuse/military/barracks": { "name": "Barracks", From fbedbb1608b2cd1ea723c16295008683ae51357c Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 23:17:41 -0400 Subject: [PATCH 033/217] select note before rendering sidebar --- modules/behavior/hash.js | 2 -- modules/modes/drag_note.js | 4 ---- modules/modes/select_note.js | 5 +++-- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/modules/behavior/hash.js b/modules/behavior/hash.js index cb073c40a..2aa76ff2b 100644 --- a/modules/behavior/hash.js +++ b/modules/behavior/hash.js @@ -51,8 +51,6 @@ export function behaviorHash(context) { var newParams = {}; delete q.id; - console.log('TAH - hash: context.selectedIDs()', context.selectedIDs()); - console.log('TAH - hash: context.selectedNoteID()', context.selectedNoteID()); var selected = context.selectedIDs().filter(function(id) { return !context.entity(id).isNew(); }); diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index d6d1f2b9b..602fac67e 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -111,8 +111,6 @@ export function modeDragNote(context) { function start(entity) { - console.log('TAH - drag_note start()'); - context.perform(actionNoop()); _activeEntity = entity; @@ -158,12 +156,10 @@ export function modeDragNote(context) { osm.replaceNote(entity); // update note cache } dispatch.call('change', this, 'difference'); - console.log('moved: ', entity.loc); } function end(entity) { - console.log('TAH - drag_note end()'); context .selectedNoteID(entity.id) .enter(modeSelectNote(context, entity.id)); diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 56fe0f198..3692d4c13 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -80,6 +80,7 @@ export function modeSelectNote(context, selectedNoteID) { } else { selection .classed('selected', true); + context.selectedNoteID(selectedNoteID); } } @@ -100,13 +101,13 @@ export function modeSelectNote(context, selectedNoteID) { d3_select(document) .call(keybinding); + selectNote(); + context.ui().sidebar .show(noteEditor.note(note)); context.map() .on('drawn.select', selectNote); - - selectNote(); }; From 06a410107bd87111214df2ba57988912db67bd7e Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Fri, 20 Jul 2018 23:31:49 -0400 Subject: [PATCH 034/217] cleaned up merge relics and comments --- modules/behavior/drag.js | 11 ----------- modules/modes/drag_note2.js | 6 ------ modules/modes/select_note.js | 11 +---------- modules/services/mapillary.js | 28 ---------------------------- modules/services/openstreetcam.js | 14 -------------- modules/services/osm.js | 2 -- modules/ui/modes.js | 1 - modules/ui/note_header.js | 2 +- 8 files changed, 2 insertions(+), 73 deletions(-) diff --git a/modules/behavior/drag.js b/modules/behavior/drag.js index 943483873..9735b77ae 100644 --- a/modules/behavior/drag.js +++ b/modules/behavior/drag.js @@ -69,7 +69,6 @@ export function behaviorDrag() { function dragstart() { - console.log('TAH - drag start'); _target = this; _event = eventOf(_target, arguments); @@ -129,7 +128,6 @@ export function behaviorDrag() { function dragend() { - console.log('TAH - drag end'); if (started) { _event({ type: 'end' }); @@ -157,7 +155,6 @@ export function behaviorDrag() { function drag(selection) { - console.log('TAH - drag: ', selection); var matchesSelector = utilPrefixDOMProperty('matchesSelector'); var delegate = dragstart; @@ -168,16 +165,8 @@ export function behaviorDrag() { for (; target && target !== root; target = target.parentNode) { var datum = target.__data__; -<<<<<<< HEAD - var entity; - if (datum instanceof osmNote) { entity = datum;} - else { - entity = datum && datum.properties && datum.properties.entity; - } -======= var entity = datum instanceof osmNote ? datum : datum && datum.properties && datum.properties.entity; ->>>>>>> drag-note if (entity && target[matchesSelector](_selector)) { return dragstart.call(target, entity); diff --git a/modules/modes/drag_note2.js b/modules/modes/drag_note2.js index f2505bb7c..ab0f55cae 100644 --- a/modules/modes/drag_note2.js +++ b/modules/modes/drag_note2.js @@ -136,7 +136,6 @@ export function modeDragNote2(context) { drag.target(vertex.node(), entity); } else { - console.log('else'); context.perform(actionNoop()); } @@ -423,7 +422,6 @@ export function modeDragNote2(context) { mode.enter = function() { - console.log('TAH - mode.drag_note2 entered'); context.install(hover); context.install(edit); @@ -437,7 +435,6 @@ export function modeDragNote2(context) { mode.exit = function() { - console.log('TAH - mode.drag_note2 exited'); context.ui().sidebar.hover.cancel(); context.uninstall(hover); context.uninstall(edit); @@ -466,7 +463,6 @@ export function modeDragNote2(context) { mode.selectedIDs = function() { - console.log('TAH - mode.selectedIDs'); if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; // no assign return mode; @@ -474,7 +470,6 @@ export function modeDragNote2(context) { mode.activeID = function() { - console.log('TAH - mode.selectedIDs'); if (!arguments.length) return _activeEntity && _activeEntity.id; // no assign return mode; @@ -482,7 +477,6 @@ export function modeDragNote2(context) { mode.restoreSelectedIDs = function(_) { - console.log('TAH - mode.restoreSelectedIDs'); if (!arguments.length) return _restoreSelectedIDs; _restoreSelectedIDs = _; return mode; diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 5c4e1d195..3692d4c13 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -8,18 +8,13 @@ import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; import { behaviorHover, behaviorLasso, - behaviorSelect, - behaviorDrag + behaviorSelect } from '../behavior'; -<<<<<<< HEAD -======= import { modeDragNote } from '../modes'; ->>>>>>> drag-note import { services } from '../services'; import { modeBrowse } from './browse'; -import { modeDragNote } from './drag_note'; import { uiNoteEditor } from '../ui'; @@ -44,11 +39,7 @@ export function modeSelectNote(context, selectedNoteID) { behaviorHover(context), behaviorSelect(context), behaviorLasso(context), -<<<<<<< HEAD - // modeDragNote(context).restoreSelectedNoteIDs(selectedNoteID).behavior TAH - re-add -======= modeDragNote(context).behavior ->>>>>>> drag-note ]; var newFeature = false; diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index cdf04aa3b..8d87c9c07 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -1,6 +1,4 @@ /* global Mapillary:false */ -import _filter from 'lodash-es/filter'; -import _find from 'lodash-es/find'; import _flatten from 'lodash-es/flatten'; import _forEach from 'lodash-es/forEach'; import _isEmpty from 'lodash-es/isEmpty'; @@ -44,18 +42,6 @@ function abortRequest(i) { } -function nearNullIsland(x, y, z) { - if (z >= 7) { - var center = Math.pow(2, z - 1); - var width = Math.pow(2, z - 6); - var min = center - (width / 2); - var max = center + (width / 2) - 1; - return x >= min && x <= max && y >= min && y <= max; - } - return false; -} - - function maxPageAtZoom(z) { if (z < 15) return 2; if (z === 15) return 5; @@ -66,20 +52,6 @@ function maxPageAtZoom(z) { } -function localeTimestamp(s) { - if (!s) return null; - var detected = utilDetect(); - var options = { - day: 'numeric', month: 'short', year: 'numeric', - hour: 'numeric', minute: 'numeric', second: 'numeric', - timeZone: 'UTC' - }; - var d = new Date(s); - if (isNaN(d.getTime())) return null; - return d.toLocaleString(detected.locale, options); -} - - function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 73483dddc..9895a678b 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -1,5 +1,3 @@ -import _filter from 'lodash-es/filter'; -import _find from 'lodash-es/find'; import _flatten from 'lodash-es/flatten'; import _forEach from 'lodash-es/forEach'; import _map from 'lodash-es/map'; @@ -53,18 +51,6 @@ function abortRequest(i) { } -function nearNullIsland(x, y, z) { - if (z >= 7) { - var center = Math.pow(2, z - 1), - width = Math.pow(2, z - 6), - min = center - (width / 2), - max = center + (width / 2) - 1; - return x >= min && x <= max && y >= min && y <= max; - } - return false; -} - - function maxPageAtZoom(z) { if (z < 15) return 2; if (z === 15) return 5; diff --git a/modules/services/osm.js b/modules/services/osm.js index 74e9a5cb8..4504e9299 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -2,8 +2,6 @@ import _chunk from 'lodash-es/chunk'; import _cloneDeep from 'lodash-es/cloneDeep'; import _extend from 'lodash-es/extend'; import _forEach from 'lodash-es/forEach'; -import _filter from 'lodash-es/filter'; -import _find from 'lodash-es/find'; import _groupBy from 'lodash-es/groupBy'; import _isEmpty from 'lodash-es/isEmpty'; import _map from 'lodash-es/map'; diff --git a/modules/ui/modes.js b/modules/ui/modes.js index ad00af2b4..c1c268fb2 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -16,7 +16,6 @@ import { import { svgIcon } from '../svg'; import { tooltip } from '../util/tooltip'; import { uiTooltipHtml } from './tooltipHtml'; -import { services } from '../services/index.js'; export function uiModes(context) { diff --git a/modules/ui/note_header.js b/modules/ui/note_header.js index c63b61756..e2bb1af66 100644 --- a/modules/ui/note_header.js +++ b/modules/ui/note_header.js @@ -55,7 +55,7 @@ export function uiNoteHeader() { } - noteHeader.note = function(_, __) { + noteHeader.note = function(_) { if (!arguments.length) return _note; _note = _; return noteHeader; From e4d829ec06ccc9d73a8e45b8c627f95ca8fb0395 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 10:03:40 -0400 Subject: [PATCH 035/217] Have the tiler return filtered results - re: skipNullIsland --- modules/services/mapillary.js | 3 +- modules/services/openstreetcam.js | 3 +- modules/services/osm.js | 1 - modules/services/streetside.js | 7 +-- modules/util/tile.js | 72 +++++++++++++++---------------- 5 files changed, 40 insertions(+), 46 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index cdf04aa3b..4d19f43af 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -23,7 +23,7 @@ import { svgDefs } from '../svg'; import { utilDetect } from '../util/detect'; import { utilQsString, utilRebind, utilTile } from '../util'; -var geoTile = utilTile(); +var geoTile = utilTile().skipNullIsland(true); var apibase = 'https://a.mapillary.com/v3/'; var viewercss = 'mapillary-js/mapillary.min.css'; @@ -86,7 +86,6 @@ function loadTiles(which, url, projection) { var dimension = projection.clipExtent()[1]; var tiles = geoTile.getTiles(projection, dimension, tileZoom, 0); - tiles = geoTile.filterNullIsland(tiles); geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 73483dddc..89b391022 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -33,7 +33,7 @@ import { utilSetTransform } from '../util'; -var geoTile = utilTile(); +var geoTile = utilTile().skipNullIsland(true); var apibase = 'https://openstreetcam.org'; var maxResults = 1000; @@ -81,7 +81,6 @@ function loadTiles(which, url, projection) { var dimension = projection.clipExtent()[1]; var tiles = geoTile.getTiles(projection, dimension, tileZoom, 0); - tiles = geoTile.filterNullIsland(tiles); geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); diff --git a/modules/services/osm.js b/modules/services/osm.js index 4263662e2..d7686ce34 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -780,7 +780,6 @@ export default { // get tiles var tiles = geoTile.getTiles(projection, dimensions, tilezoom, 0); - tiles = geoTile.filterNullIsland(tiles); // remove inflight requests that no longer cover the view.. var hadRequests = !_isEmpty(cache.inflight); diff --git a/modules/services/streetside.js b/modules/services/streetside.js index 52ee2c14f..435d0c210 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -32,7 +32,7 @@ import { utilQsString, utilRebind, utilTile } from '../util'; import Q from 'q'; -var geoTile = utilTile(); +var geoTile = utilTile().skipNullIsland(true); var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?'; var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/'; @@ -95,8 +95,9 @@ function loadTiles(which, url, projection, margin) { var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); var dimension = projection.clipExtent()[1]; - var tiles = geoTile.getTiles(projection, dimension, tileZoom, margin); - tiles = geoTile.filterNullIsland(tiles); + var tiles = geoTile + .margin(margin) + .getTiles(projection, dimension, tileZoom); tiles.forEach(function (tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/util/tile.js b/modules/util/tile.js index 2179525f7..2ed2474e2 100644 --- a/modules/util/tile.js +++ b/modules/util/tile.js @@ -11,11 +11,14 @@ export function utilTile() { var _translate = [_size[0] / 2, _size[1] / 2]; var _zoomDelta = 0; var _margin = 0; + var _skipNullIsland = false; + function bound(val) { return Math.min(_scaleExtent[1], Math.max(_scaleExtent[0], val)); } + function nearNullIsland(x, y, z) { if (z >= 7) { var center = Math.pow(2, z - 1); @@ -27,7 +30,8 @@ export function utilTile() { return false; } - function tile() { + + function tiler() { var z = Math.max(Math.log(_scale) / Math.LN2 - 8, 0); var z0 = bound(Math.round(z + _zoomDelta)); var k = Math.pow(2, z - z0 + 8); @@ -72,13 +76,7 @@ export function utilTile() { * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from * an area around (and including) the current map view extents. */ - tile.getTiles = function(projection, dimensions, tilezoom, margin) { - - // s is the current map scale - // z is the 'Level of Detail', or zoom-level, where Level 1 is far from the earth, and Level 23 is close to the ground. - // ts ('tile size') here is the formula for determining the width/height of the map in pixels, but with a modification. - // See 'Ground Resolution and Map Scale': //https://msdn.microsoft.com/en-us/library/bb259689.aspx. - // As used here, by subtracting constant 'tileZoom' from z (the level), you end up with a much smaller value for the tile size (in pixels). + tiler.getTiles = function(projection, dimensions, tilezoom) { var s = projection.scale() * 2 * Math.PI; var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); var ts = 256 * Math.pow(2, z - tilezoom); @@ -87,18 +85,19 @@ export function utilTile() { s / 2 - projection.translate()[1] ]; - var tiler = this + this .scaleExtent([tilezoom, tilezoom]) .scale(s) .size(dimensions) - .translate(projection.translate()) - .margin(margin || 0); // request nearby tiles so we can connect sequences. + .translate(projection.translate()); - var tiles = tiler() + return tiler() .map(function(tile) { + if (_skipNullIsland && nearNullIsland(tile[0], tile[1], tile[2])) { + return false; + } var x = tile[0] * ts - origin[0]; var y = tile[1] * ts - origin[1]; - return { id: tile.toString(), xyz: tile, @@ -107,21 +106,12 @@ export function utilTile() { projection.invert([x + ts, y]) ) }; - }); - - return tiles; - }; - - - tile.filterNullIsland = function(tiles) { - return tiles.filter(function(t) { - return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]); - }); + }).filter(Boolean); }; // remove inflight requests that no longer cover the view.. - tile.removeInflightRequests = function(cache, tiles, callback, modifier) { + tiler.removeInflightRequests = function(cache, tiles, callback, modifier) { return _filter(cache.inflight, function(v, i) { var wanted = _find(tiles, function(tile) { return i === tile.id + modifier; }); if (!wanted) { @@ -132,48 +122,54 @@ export function utilTile() { }; - tile.scaleExtent = function(val) { + tiler.scaleExtent = function(val) { if (!arguments.length) return _scaleExtent; _scaleExtent = val; - return tile; + return tiler; }; - tile.size = function(val) { + tiler.size = function(val) { if (!arguments.length) return _size; _size = val; - return tile; + return tiler; }; - tile.scale = function(val) { + tiler.scale = function(val) { if (!arguments.length) return _scale; _scale = val; - return tile; + return tiler; }; - tile.translate = function(val) { + tiler.translate = function(val) { if (!arguments.length) return _translate; _translate = val; - return tile; + return tiler; }; - tile.zoomDelta = function(val) { + tiler.zoomDelta = function(val) { if (!arguments.length) return _zoomDelta; _zoomDelta = +val; - return tile; + return tiler; }; - // number to extend the rows/columns beyond those covering the viewport - tile.margin = function(val) { + tiler.margin = function(val) { if (!arguments.length) return _margin; _margin = +val; - return tile; + return tiler; }; - return tile; + tiler.skipNullIsland = function(val) { + if (!arguments.length) return _skipNullIsland; + _skipNullIsland = val; + return tiler; + }; + + + return tiler; } From d1fe81b9053d47e85dc0dfd687679f6e59afe95d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 10:07:56 -0400 Subject: [PATCH 036/217] rename utilTile -> utilTiler --- modules/renderer/tile_layer.js | 4 ++-- modules/services/mapillary.js | 4 ++-- modules/services/openstreetcam.js | 4 ++-- modules/services/osm.js | 4 ++-- modules/services/streetside.js | 4 ++-- modules/util/index.js | 2 +- modules/util/tile.js | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index d5c59e9b9..36668553c 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -2,13 +2,13 @@ import { select as d3_select } from 'd3-selection'; import { t } from '../util/locale'; import { geoScaleToZoom, geoVecLength } from '../geo'; -import { utilPrefixCSSProperty, utilTile } from '../util'; +import { utilPrefixCSSProperty, utilTiler } from '../util'; export function rendererTileLayer(context) { var tileSize = 256; var transformProp = utilPrefixCSSProperty('Transform'); - var geotile = utilTile(); + var geotile = utilTiler(); var _projection; var _cache = {}; diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 4d19f43af..431b8f1e8 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -21,9 +21,9 @@ import rbush from 'rbush'; import { geoExtent } from '../geo'; import { svgDefs } from '../svg'; import { utilDetect } from '../util/detect'; -import { utilQsString, utilRebind, utilTile } from '../util'; +import { utilQsString, utilRebind, utilTiler } from '../util'; -var geoTile = utilTile().skipNullIsland(true); +var geoTile = utilTiler().skipNullIsland(true); var apibase = 'https://a.mapillary.com/v3/'; var viewercss = 'mapillary-js/mapillary.min.css'; diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 89b391022..dd9693176 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -24,7 +24,7 @@ import rbush from 'rbush'; import { geoExtent } from '../geo'; -import { utilTile } from '../util'; +import { utilTiler } from '../util'; import { utilDetect } from '../util/detect'; import { @@ -33,7 +33,7 @@ import { utilSetTransform } from '../util'; -var geoTile = utilTile().skipNullIsland(true); +var geoTile = utilTiler().skipNullIsland(true); var apibase = 'https://openstreetcam.org'; var maxResults = 1000; diff --git a/modules/services/osm.js b/modules/services/osm.js index d7686ce34..edf390a93 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -30,11 +30,11 @@ import { import { utilRebind, utilIdleWorker, - utilTile, + utilTiler, utilQsString } from '../util'; -var geoTile = utilTile(); +var geoTile = utilTiler(); var dispatch = d3_dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes'); var urlroot = 'https://www.openstreetmap.org'; diff --git a/modules/services/streetside.js b/modules/services/streetside.js index 435d0c210..3f5c6f1a6 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -28,11 +28,11 @@ import { } from '../geo'; import { utilDetect } from '../util/detect'; -import { utilQsString, utilRebind, utilTile } from '../util'; +import { utilQsString, utilRebind, utilTiler } from '../util'; import Q from 'q'; -var geoTile = utilTile().skipNullIsland(true); +var geoTile = utilTiler().skipNullIsland(true); var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?'; var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/'; diff --git a/modules/util/index.js b/modules/util/index.js index 9673bfef5..bc5c7c9a6 100644 --- a/modules/util/index.js +++ b/modules/util/index.js @@ -23,6 +23,6 @@ export { utilSessionMutex } from './session_mutex'; export { utilStringQs } from './util'; export { utilSuggestNames } from './suggest_names'; export { utilTagText } from './util'; -export { utilTile } from './tile'; +export { utilTiler } from './tile'; export { utilTriggerEvent } from './trigger_event'; export { utilWrap } from './util'; diff --git a/modules/util/tile.js b/modules/util/tile.js index 2ed2474e2..180f1197d 100644 --- a/modules/util/tile.js +++ b/modules/util/tile.js @@ -4,7 +4,7 @@ import { range as d3_range } from 'd3-array'; import { geoExtent } from '../geo'; -export function utilTile() { +export function utilTiler() { var _size = [960, 500]; var _scale = 256; var _scaleExtent = [0, 20]; From ff64455370b9a49679145d0b3e83c014e5d940c0 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 10:12:11 -0400 Subject: [PATCH 037/217] rename the file too --- modules/util/index.js | 2 +- modules/util/{tile.js => tiler.js} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename modules/util/{tile.js => tiler.js} (100%) diff --git a/modules/util/index.js b/modules/util/index.js index bc5c7c9a6..4d4c53269 100644 --- a/modules/util/index.js +++ b/modules/util/index.js @@ -23,6 +23,6 @@ export { utilSessionMutex } from './session_mutex'; export { utilStringQs } from './util'; export { utilSuggestNames } from './suggest_names'; export { utilTagText } from './util'; -export { utilTiler } from './tile'; +export { utilTiler } from './tiler'; export { utilTriggerEvent } from './trigger_event'; export { utilWrap } from './util'; diff --git a/modules/util/tile.js b/modules/util/tiler.js similarity index 100% rename from modules/util/tile.js rename to modules/util/tiler.js From 02713e48fbeaa95fe3b82e4eae6c5c994f0cc262 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 11:11:39 -0400 Subject: [PATCH 038/217] Move cache management out of tiler, it's responsibilty of service Also remove some unused code and eslint warnings --- modules/services/mapillary.js | 40 +++++++++---------------------- modules/services/openstreetcam.js | 30 ++++++++++------------- modules/services/osm.js | 16 +++++++++---- modules/services/streetside.js | 26 ++++++++++---------- modules/util/tiler.js | 21 ++++------------ 5 files changed, 53 insertions(+), 80 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 431b8f1e8..3338211ab 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -1,5 +1,4 @@ /* global Mapillary:false */ -import _filter from 'lodash-es/filter'; import _find from 'lodash-es/find'; import _flatten from 'lodash-es/flatten'; import _forEach from 'lodash-es/forEach'; @@ -44,18 +43,6 @@ function abortRequest(i) { } -function nearNullIsland(x, y, z) { - if (z >= 7) { - var center = Math.pow(2, z - 1); - var width = Math.pow(2, z - 6); - var min = center - (width / 2); - var max = center + (width / 2) - 1; - return x >= min && x <= max && y >= min && y <= max; - } - return false; -} - - function maxPageAtZoom(z) { if (z < 15) return 2; if (z === 15) return 5; @@ -66,28 +53,23 @@ function maxPageAtZoom(z) { } -function localeTimestamp(s) { - if (!s) return null; - var detected = utilDetect(); - var options = { - day: 'numeric', month: 'short', year: 'numeric', - hour: 'numeric', minute: 'numeric', second: 'numeric', - timeZone: 'UTC' - }; - var d = new Date(s); - if (isNaN(d.getTime())) return null; - return d.toLocaleString(detected.locale, options); -} - - function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); var dimension = projection.clipExtent()[1]; - var tiles = geoTile.getTiles(projection, dimension, tileZoom, 0); + var tiles = geoTile.getTiles(projection, dimension, tileZoom); - geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); + // abort inflight requests that are no longer needed + var cache = _mlyCache[which]; + _forEach(cache.inflight, function(v, k) { + var wanted = _find(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; }); + + if (!wanted) { + abortRequest(v); + delete cache.inflight[k]; + } + }); tiles.forEach(function(tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index dd9693176..f7577b51d 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -1,4 +1,3 @@ -import _filter from 'lodash-es/filter'; import _find from 'lodash-es/find'; import _flatten from 'lodash-es/flatten'; import _forEach from 'lodash-es/forEach'; @@ -53,18 +52,6 @@ function abortRequest(i) { } -function nearNullIsland(x, y, z) { - if (z >= 7) { - var center = Math.pow(2, z - 1), - width = Math.pow(2, z - 6), - min = center - (width / 2), - max = center + (width / 2) - 1; - return x >= min && x <= max && y >= min && y <= max; - } - return false; -} - - function maxPageAtZoom(z) { if (z < 15) return 2; if (z === 15) return 5; @@ -76,13 +63,22 @@ function maxPageAtZoom(z) { function loadTiles(which, url, projection) { - var s = projection.scale() * 2 * Math.PI, - currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); + var s = projection.scale() * 2 * Math.PI; + var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); var dimension = projection.clipExtent()[1]; - var tiles = geoTile.getTiles(projection, dimension, tileZoom, 0); + var tiles = geoTile.getTiles(projection, dimension, tileZoom); - geoTile.removeInflightRequests(which, tiles, abortRequest, ',0'); + // abort inflight requests that are no longer needed + var cache = _oscCache[which]; + _forEach(cache.inflight, function(v, k) { + var wanted = _find(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; }); + + if (!wanted) { + abortRequest(v); + delete cache.inflight[k]; + } + }); tiles.forEach(function(tile) { loadNextTilePage(which, currZoom, url, tile); diff --git a/modules/services/osm.js b/modules/services/osm.js index edf390a93..2aecabb6e 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -2,7 +2,6 @@ import _chunk from 'lodash-es/chunk'; import _cloneDeep from 'lodash-es/cloneDeep'; import _extend from 'lodash-es/extend'; import _forEach from 'lodash-es/forEach'; -import _filter from 'lodash-es/filter'; import _find from 'lodash-es/find'; import _groupBy from 'lodash-es/groupBy'; import _isEmpty from 'lodash-es/isEmpty'; @@ -778,12 +777,19 @@ export default { tilezoom = _tileZoom; } - // get tiles - var tiles = geoTile.getTiles(projection, dimensions, tilezoom, 0); + // determine the needed tiles to cover the view + var tiles = geoTile.getTiles(projection, dimensions, tilezoom); - // remove inflight requests that no longer cover the view.. + // abort inflight requests that are no longer needed var hadRequests = !_isEmpty(cache.inflight); - geoTile.removeInflightRequests(cache, tiles, abortRequest); + _forEach(cache.inflight, function(v, k) { + var wanted = _find(tiles, function(tile) { return k === tile.id; }); + if (!wanted) { + abortRequest(v); + delete cache.inflight[k]; + } + }); + if (hadRequests && !loadingNotes && _isEmpty(cache.inflight)) { dispatch.call('loaded'); // stop the spinner } diff --git a/modules/services/streetside.js b/modules/services/streetside.js index 3f5c6f1a6..b7b592cba 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -1,4 +1,5 @@ import _extend from 'lodash-es/extend'; +import _find from 'lodash-es/find'; import _flatten from 'lodash-es/flatten'; import _forEach from 'lodash-es/forEach'; import _map from 'lodash-es/map'; @@ -53,6 +54,7 @@ var _pannellumViewer; var _sceneOptions; var _dataUrlArray = []; + /** * abortRequest(). */ @@ -60,19 +62,6 @@ function abortRequest(i) { i.abort(); } -/** - * nearNullIsland(). - */ -function nearNullIsland(x, y, z) { - if (z >= 7) { - var center = Math.pow(2, z - 1); - var width = Math.pow(2, z - 6); - var min = center - (width / 2); - var max = center + (width / 2) - 1; - return x >= min && x <= max && y >= min && y <= max; - } - return false; -} /** * localeTimeStamp(). @@ -99,6 +88,17 @@ function loadTiles(which, url, projection, margin) { .margin(margin) .getTiles(projection, dimension, tileZoom); + // abort inflight requests that are no longer needed + var cache = _ssCache[which]; + _forEach(cache.inflight, function(v, k) { + var wanted = _find(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; }); + + if (!wanted) { + abortRequest(v); + delete cache.inflight[k]; + } + }); + tiles.forEach(function (tile) { loadNextTilePage(which, currZoom, url, tile); }); diff --git a/modules/util/tiler.js b/modules/util/tiler.js index 180f1197d..27bb17759 100644 --- a/modules/util/tiler.js +++ b/modules/util/tiler.js @@ -1,5 +1,3 @@ -import _filter from 'lodash-es/filter'; -import _find from 'lodash-es/find'; import { range as d3_range } from 'd3-array'; import { geoExtent } from '../geo'; @@ -19,7 +17,10 @@ export function utilTiler() { } - function nearNullIsland(x, y, z) { + function nearNullIsland(tile) { + var x = tile[0]; + var y = tile[1]; + var z = tile[2]; if (z >= 7) { var center = Math.pow(2, z - 1); var width = Math.pow(2, z - 6); @@ -93,7 +94,7 @@ export function utilTiler() { return tiler() .map(function(tile) { - if (_skipNullIsland && nearNullIsland(tile[0], tile[1], tile[2])) { + if (_skipNullIsland && nearNullIsland(tile)) { return false; } var x = tile[0] * ts - origin[0]; @@ -110,18 +111,6 @@ export function utilTiler() { }; - // remove inflight requests that no longer cover the view.. - tiler.removeInflightRequests = function(cache, tiles, callback, modifier) { - return _filter(cache.inflight, function(v, i) { - var wanted = _find(tiles, function(tile) { return i === tile.id + modifier; }); - if (!wanted) { - delete cache.inflight[i]; - } - return !wanted; - }).map(callback); // abort request - }; - - tiler.scaleExtent = function(val) { if (!arguments.length) return _scaleExtent; _scaleExtent = val; From e8fc9f2edad1fc2c8f3a88378d908c3db5cbf414 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sat, 21 Jul 2018 12:31:22 -0400 Subject: [PATCH 039/217] simplify save buttons --- modules/ui/note_editor.js | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index 10c78ab9e..2a50f8891 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -256,19 +256,15 @@ export function uiNoteEditor(context) { .append('div') .attr('class', 'buttons'); - if (_note.isNew()) { - buttonEnter - .append('button') - .attr('class', 'button add-note-button action') - .append('span') - .attr('class', 'label'); - } else { - buttonEnter - .append('button') - .attr('class', 'button status-button action') - .append('span') - .attr('class', 'label'); + buttonEnter + .append('button') + .attr('class', function() { + return _note.isNew() ? 'button add-note-button action' : 'button status-button action'; + }) + .append('span') + .attr('class', 'label'); + if (!_note.isNew()) { buttonEnter .append('button') .attr('class', 'button comment-button action') From 373353f40d8bc29e1d89ec68a1344cd4b01c1e50 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sat, 21 Jul 2018 15:54:47 -0400 Subject: [PATCH 040/217] added breathe behavior & cleaned hover/select styling on notes --- css/20_map.css | 21 +++++++++++++++++++-- css/65_data.css | 8 -------- modules/modes/select_note.js | 4 +++- modules/svg/notes.js | 24 +++++++++++++++++++++--- modules/ui/sidebar.js | 4 ++-- 5 files changed, 45 insertions(+), 16 deletions(-) diff --git a/css/20_map.css b/css/20_map.css index 3e3dab771..0e7137b74 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -65,7 +65,13 @@ } -/* points */ +/* points & notes */ + +g.note .stroke { + stroke: #444; + stroke-width: 1; + fill: #444; +} g.point .stroke { stroke: #444; @@ -73,6 +79,13 @@ g.point .stroke { fill: #fff; } +g.note .shadow { + fill: none; + stroke: #f6634f; + stroke-width: 8; + stroke-opacity: 0; +} + g.point .shadow { fill: none; stroke: #f6634f; @@ -80,19 +93,23 @@ g.point .shadow { stroke-opacity: 0; } +g.note.related:not(.selected) .shadow, +g.note.hover:not(.selected) .shadow, g.point.related:not(.selected) .shadow, g.point.hover:not(.selected) .shadow { stroke-opacity: 0.5; } +g.note.selected .shadow, g.point.selected .shadow { stroke-opacity: 0.7; } +g.note ellipse.stroke, g.point ellipse.stroke { display: none; } - +.mode-drag-note g.note.active ellipse.stroke, .mode-drag-node g.point.active ellipse.stroke { display: block; } diff --git a/css/65_data.css b/css/65_data.css index 07146df57..7deaba72a 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -31,14 +31,6 @@ color: #55dd00; stroke: #333; } -.layer-notes .note.hovered .note-fill { - color: #eebb00; - stroke: #333; -} -.layer-notes .note.selected .note-fill { - color: #ffee00; - stroke: #333; -} /* slight adjustments to preset icon for note icons */ .note-header-icon .preset-icon-28 { diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 3692d4c13..7fe0c6e7d 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -6,6 +6,7 @@ import { import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; import { + behaviorBreathe, behaviorHover, behaviorLasso, behaviorSelect @@ -36,6 +37,7 @@ export function modeSelectNote(context, selectedNoteID) { }); var behaviors = [ + behaviorBreathe(context), behaviorHover(context), behaviorSelect(context), behaviorLasso(context), @@ -120,7 +122,7 @@ export function modeSelectNote(context, selectedNoteID) { context.surface() .selectAll('.note.selected') - .classed('selected hovered', false); + .classed('selected hover', false); context.map() .on('drawn.select', null); diff --git a/modules/svg/notes.js b/modules/svg/notes.js index e5f7d88c3..29c05194b 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -14,6 +14,12 @@ export function svgNotes(projection, context, dispatch) { var layer = d3_select(null); var _notes; + function markerPath(selection, klass) { + selection + .attr('class', klass) + .attr('transform', 'translate(-8, -22)') + .attr('d', 'm17.49424,0l-14.99506,0c-1.37845,0 -2.49918,1.12072 -2.49918,2.49918l0,11.24629c0,1.37845 1.12072,2.49918 2.49918,2.49918l3.74876,0l0,3.28017c0,0.38269 0.43736,0.60527 0.74585,0.37878l4.8773,-3.65895l5.62315,0c1.37845,0 2.49918,-1.12072 2.49918,-2.49918l0,-11.24629c0,-1.37845 -1.12072,-2.49918 -2.49918,-2.49918z'); + } function init() { if (svgNotes.initialized) return; // run once @@ -95,12 +101,24 @@ export function svgNotes(projection, context, dispatch) { .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; }) .classed('new', function(d){ return d.id < 0; }); + notesEnter + .append('path') + .call(markerPath, 'shadow'); + + notesEnter + .append('ellipse') + .attr('cx', 0.5) + .attr('cy', 1) + .attr('rx', 6.5) + .attr('ry', 3) + .attr('class', 'stroke'); + notesEnter .append('use') .attr('class', 'note-fill') .attr('width', '20px') .attr('height', '20px') - .attr('x', '-10px') + .attr('x', '-8px') .attr('y', '-22px') .attr('xlink:href', '#iD-icon-note'); @@ -112,7 +130,7 @@ export function svgNotes(projection, context, dispatch) { .attr('class', 'note-annotation thread') .attr('width', '14px') .attr('height', '14px') - .attr('x', '-7px') + .attr('x', '-5px') .attr('y', '-20px') .attr('xlink:href', '#iD-icon-more'); @@ -124,7 +142,7 @@ export function svgNotes(projection, context, dispatch) { .attr('class', 'note-annotation thread') .attr('width', '14px') .attr('height', '14px') - .attr('x', '-7px') + .attr('x', '-5px') .attr('y', '-20px') .attr('xlink:href', '#iD-icon-plus'); diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index 256c775f8..879d91757 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -33,7 +33,7 @@ export function uiSidebar(context) { _wasNote = true; var notes = d3_selectAll('.note'); notes - .classed('hovered', function(d) { return d === what; }); + .classed('hover', function(d) { return d === what; }); sidebar.show(noteEditor.note(what)); @@ -68,7 +68,7 @@ export function uiSidebar(context) { } else if (_wasNote) { _wasNote = false; d3_selectAll('.note') - .classed('hovered', false); + .classed('hover', false); sidebar.hide(); } } From f6e41a1cb8c02981e8d2a3b033fc1cd269137c09 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 18:52:54 -0400 Subject: [PATCH 041/217] Remove unused zoomDelta parameter --- modules/util/tiler.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/util/tiler.js b/modules/util/tiler.js index 27bb17759..d66e29933 100644 --- a/modules/util/tiler.js +++ b/modules/util/tiler.js @@ -7,7 +7,6 @@ export function utilTiler() { var _scale = 256; var _scaleExtent = [0, 20]; var _translate = [_size[0] / 2, _size[1] / 2]; - var _zoomDelta = 0; var _margin = 0; var _skipNullIsland = false; @@ -34,7 +33,7 @@ export function utilTiler() { function tiler() { var z = Math.max(Math.log(_scale) / Math.LN2 - 8, 0); - var z0 = bound(Math.round(z + _zoomDelta)); + var z0 = bound(Math.round(z)); var k = Math.pow(2, z - z0 + 8); var origin = [ (_translate[0] - _scale / 2) / k, @@ -139,12 +138,6 @@ export function utilTiler() { }; - tiler.zoomDelta = function(val) { - if (!arguments.length) return _zoomDelta; - _zoomDelta = +val; - return tiler; - }; - // number to extend the rows/columns beyond those covering the viewport tiler.margin = function(val) { if (!arguments.length) return _margin; From 292347b28ad4757af09af57fa7197cd00a3c8b2b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 18:53:19 -0400 Subject: [PATCH 042/217] Use utilTiler's Null Island filter for overlay sources --- modules/renderer/tile_layer.js | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index 36668553c..c30ee2c3e 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -8,7 +8,7 @@ import { utilPrefixCSSProperty, utilTiler } from '../util'; export function rendererTileLayer(context) { var tileSize = 256; var transformProp = utilPrefixCSSProperty('Transform'); - var geotile = utilTiler(); + var tiler = utilTiler(); var _projection; var _cache = {}; @@ -17,19 +17,6 @@ export function rendererTileLayer(context) { var _source; - // blacklist overlay tiles around Null Island.. - function nearNullIsland(x, y, z) { - if (z >= 7) { - var center = Math.pow(2, z - 1); - var width = Math.pow(2, z - 6); - var min = center - (width / 2); - var max = center + (width / 2) - 1; - return x >= min && x <= max && y >= min && y <= max; - } - return false; - } - - function tileSizeAtZoom(d, z) { var EPSILON = 0.002; return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON; @@ -94,7 +81,7 @@ export function rendererTileLayer(context) { _projection.translate()[1] + pixelOffset[1] ]; - geotile + tiler .scale(_projection.scale() * 2 * Math.PI) .translate(translate); @@ -116,7 +103,9 @@ export function rendererTileLayer(context) { var showDebug = context.getDebug('tile') && !_source.overlay; if (_source.validZoom(_zoom)) { - geotile().forEach(function(d) { + tiler.skipNullIsland(!!_source.overlay); + + tiler().forEach(function(d) { addSource(d); if (d[3] === '') return; if (typeof d[3] !== 'string') return; // Workaround for #2295 @@ -127,15 +116,11 @@ export function rendererTileLayer(context) { }); requests = uniqueBy(requests, 3).filter(function(r) { - if (!!_source.overlay && nearNullIsland(r[0], r[1], r[2])) { - return false; - } // don't re-request tiles which have failed in the past return _cache[r[3]] !== false; }); } - function load(d) { _cache[d[3]] = true; d3_select(this) @@ -179,7 +164,7 @@ export function rendererTileLayer(context) { // Pick a representative tile near the center of the viewport // (This is useful for sampling the imagery vintage) - var dims = geotile.size(); + var dims = tiler.size(); var mapCenter = [dims[0] / 2, dims[1] / 2]; var minDist = Math.max(dims[0], dims[1]); var nearCenter; @@ -276,8 +261,8 @@ export function rendererTileLayer(context) { background.dimensions = function(_) { - if (!arguments.length) return geotile.size(); - geotile.size(_); + if (!arguments.length) return tiler.size(); + tiler.size(_); return background; }; @@ -286,7 +271,7 @@ export function rendererTileLayer(context) { if (!arguments.length) return _source; _source = _; _cache = {}; - geotile.scaleExtent(_source.scaleExtent); + tiler.scaleExtent(_source.scaleExtent); return background; }; From 658721a15067b217ed6236bd0e3d084f58d8ae75 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sat, 21 Jul 2018 19:36:13 -0400 Subject: [PATCH 043/217] WIP: added note category, TODO: update input --- css/65_data.css | 4 ++ data/presets.yaml | 16 ++++++++ data/presets/fields.json | 1 + data/presets/fields/category.json | 21 +++++++++++ data/taginfo.json | 25 ++++++++++++ dist/locales/en.json | 11 ++++++ modules/modes/add_note.js | 2 +- modules/modes/drag_note.js | 2 +- modules/modes/select_note.js | 1 - modules/ui/note_category.js | 63 +++++++++++++++++++++++++++++++ modules/ui/note_comments.js | 2 +- modules/ui/note_editor.js | 6 +++ 12 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 data/presets/fields/category.json create mode 100644 modules/ui/note_category.js diff --git a/css/65_data.css b/css/65_data.css index 7deaba72a..a8367e1fe 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -93,6 +93,10 @@ border-radius: 5px 0 0 5px; } +.note-category { + margin: 20px 0px; +} + .comments-container { background: #ececec; padding: 1px 10px; diff --git a/data/presets.yaml b/data/presets.yaml index a5c716a72..e9bd42092 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -304,6 +304,22 @@ en: castle_type: # castle_type=* label: Type + category: + # 'none=*, option1=*, option2=*, option3=*, option4=*' + label: Category + options: + # none=yes + none: None + # option1=yes + option1: Option1 + # option2=yes + option2: Option2 + # option3=yes + option3: Option3 + # option4=yes + option4: Option4 + # category field placeholder + placeholder: Unknown clothes: # clothes=* label: Clothes diff --git a/data/presets/fields.json b/data/presets/fields.json index d295ff913..7296ec5fe 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -49,6 +49,7 @@ "capacity": {"key": "capacity", "type": "number", "minValue": 0, "label": "Capacity", "placeholder": "50, 100, 200..."}, "cash_in": {"key": "cash_in", "type": "check", "label": "Cash In"}, "castle_type": {"key": "castle_type", "type": "combo", "label": "Type"}, + "category": {"type": "radio", "keys": ["none", "option1", "option2", "option3", "option4"], "label": "Category", "placeholder": "Unknown", "strings": {"options": {"none": "None", "option1": "Option1", "option2": "Option2", "option3": "Option3", "option4": "Option4"}}}, "clothes": {"key": "clothes", "type": "semiCombo", "label": "Clothes"}, "club": {"key": "club", "type": "typeCombo", "label": "Type"}, "collection_times": {"key": "collection_times", "type": "text", "label": "Collection Times"}, diff --git a/data/presets/fields/category.json b/data/presets/fields/category.json new file mode 100644 index 000000000..7eeb9747c --- /dev/null +++ b/data/presets/fields/category.json @@ -0,0 +1,21 @@ +{ + "type": "radio", + "keys": [ + "none", + "option1", + "option2", + "option3", + "option4" + ], + "label": "Category", + "placeholder": "Unknown", + "strings": { + "options": { + "none": "None", + "option1": "Option1", + "option2": "Option2", + "option3": "Option3", + "option4": "Option4" + } + } +} diff --git a/data/taginfo.json b/data/taginfo.json index 50d522098..e73652fc6 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -6375,6 +6375,31 @@ {"key": "capacity", "description": "Capacity"}, {"key": "cash_in", "description": "Cash In"}, {"key": "castle_type", "description": "Type"}, + {"key": "none", "value": "none", "description": "Category"}, + {"key": "none", "value": "option1", "description": "Category"}, + {"key": "none", "value": "option2", "description": "Category"}, + {"key": "none", "value": "option3", "description": "Category"}, + {"key": "none", "value": "option4", "description": "Category"}, + {"key": "option1", "value": "none", "description": "Category"}, + {"key": "option1", "value": "option1", "description": "Category"}, + {"key": "option1", "value": "option2", "description": "Category"}, + {"key": "option1", "value": "option3", "description": "Category"}, + {"key": "option1", "value": "option4", "description": "Category"}, + {"key": "option2", "value": "none", "description": "Category"}, + {"key": "option2", "value": "option1", "description": "Category"}, + {"key": "option2", "value": "option2", "description": "Category"}, + {"key": "option2", "value": "option3", "description": "Category"}, + {"key": "option2", "value": "option4", "description": "Category"}, + {"key": "option3", "value": "none", "description": "Category"}, + {"key": "option3", "value": "option1", "description": "Category"}, + {"key": "option3", "value": "option2", "description": "Category"}, + {"key": "option3", "value": "option3", "description": "Category"}, + {"key": "option3", "value": "option4", "description": "Category"}, + {"key": "option4", "value": "none", "description": "Category"}, + {"key": "option4", "value": "option1", "description": "Category"}, + {"key": "option4", "value": "option2", "description": "Category"}, + {"key": "option4", "value": "option3", "description": "Category"}, + {"key": "option4", "value": "option4", "description": "Category"}, {"key": "clothes", "description": "Clothes"}, {"key": "collection_times", "description": "Collection Times"}, {"key": "comment", "description": "Changeset Comment"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 7f6489a73..972409ee3 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1667,6 +1667,17 @@ "castle_type": { "label": "Type" }, + "category": { + "label": "Category", + "placeholder": "Unknown", + "options": { + "none": "None", + "option1": "Option1", + "option2": "Option2", + "option3": "Option3", + "option4": "Option4" + } + }, "clothes": { "label": "Clothes" }, diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index f0ab36571..685dcf3c7 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -39,7 +39,7 @@ export function modeAddNote(context) { context .selectedNoteID(note.id) - .enter(modeSelectNote(context, [note.id]).newFeature(true)); + .enter(modeSelectNote(context, note.id).newFeature(true)); } diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index 602fac67e..8437300c2 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -223,7 +223,7 @@ export function modeDragNote(context) { mode.selectedNoteID = function() { - if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; + if (!arguments.length) return _activeEntity ? _activeEntity.id : []; // no assign return mode; }; diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 7fe0c6e7d..61fe78891 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -129,7 +129,6 @@ export function modeSelectNote(context, selectedNoteID) { context.ui().sidebar .hide(); - context.selectedNoteID(null); }; diff --git a/modules/ui/note_category.js b/modules/ui/note_category.js new file mode 100644 index 000000000..5f43a3e2f --- /dev/null +++ b/modules/ui/note_category.js @@ -0,0 +1,63 @@ +import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { select as d3_select, selectAll as d3_selectAll } from 'd3-selection'; + +import { services } from '../services'; +import { uiField } from './field'; +import { uiFormFields } from './form_fields'; + +export function uiNoteCategory(context) { + var formFields = uiFormFields(context); + var _note; + var _fieldsArr; + + function noteCategory(selection) { + + if (!_note.isNew()) return; // don't add category + + var initial = false; + + if (!_fieldsArr) { + initial = true; + var presets = context.presets(); + + _fieldsArr = [ + uiField(context, presets.field('category'), null, { show: true, revert: false }), + ]; + + _fieldsArr.forEach(function(field) { + field + .on('change', change); + }); + } + + selection + .append('div') + .attr('class', 'note-category') + .call(formFields.fieldsArr(_fieldsArr)); + + function change() { + var val = d3_select('input[name=\'category\']:checked').property('value') || undefined; + // NOTE: perhaps there is a better way to get value, something like ... + // var input = d3_select(this); + // var val = input.property('value') || undefined; + + // store the unsaved comment with the note itself + _note = _note.update({ newCategory: val }); + + var osm = services.osm; + if (osm) { + osm.replaceNote(_note); // update note cache + } + } + + } + + noteCategory.note = function(_) { + if (!arguments.length) return _note; + _note = _; + return noteCategory; + }; + + + return noteCategory; +} \ No newline at end of file diff --git a/modules/ui/note_comments.js b/modules/ui/note_comments.js index ccf3d5537..87649782c 100644 --- a/modules/ui/note_comments.js +++ b/modules/ui/note_comments.js @@ -11,7 +11,7 @@ export function uiNoteComments() { function noteComments(selection) { - if (_note.isNew()) { return; } + if (_note.isNew()) return; // don't draw .comments-container var comments = selection.selectAll('.comments-container') .data([0]); diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index 2a50f8891..b0bcc7812 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -20,11 +20,13 @@ import { utilNoAuto, utilRebind } from '../util'; +import { uiNoteCategory } from './note_category'; export function uiNoteEditor(context) { var dispatch = d3_dispatch('change'); var noteComments = uiNoteComments(); + var noteCategory = uiNoteCategory(context); var noteHeader = uiNoteHeader(); var _note; @@ -107,6 +109,10 @@ export function uiNoteEditor(context) { .append('div') .attr('class', 'note-save save-section cf'); + if (_note.isNew()) { + noteSaveEnter.call(noteCategory.note(_note)); + } + noteSaveEnter .append('h4') .attr('class', '.note-save-header') From c3fe1fedd95b94ec34b74a31bfa499e8ea129ce4 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sat, 21 Jul 2018 21:09:17 -0400 Subject: [PATCH 044/217] updated categories, added category to note service --- data/presets.yaml | 22 ++++--- data/presets/fields.json | 2 +- data/presets/fields/category.json | 20 +++--- data/taginfo.json | 104 +++++++++++++++++++++++------- dist/locales/en.json | 10 +-- modules/actions/move_note.js | 1 - modules/services/osm.js | 5 +- modules/ui/note_category.js | 63 ------------------ modules/ui/note_editor.js | 47 ++++++++++++-- 9 files changed, 157 insertions(+), 117 deletions(-) delete mode 100644 modules/ui/note_category.js diff --git a/data/presets.yaml b/data/presets.yaml index e9bd42092..1061a765f 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -305,19 +305,23 @@ en: # castle_type=* label: Type category: - # 'none=*, option1=*, option2=*, option3=*, option4=*' + # 'none=*, updateDetails=*, missing=*, wrongLocation=*, groundtruth=*, doesNotExist=*, discussion=*' label: Category options: + # discussion=yes + discussion: Needs discussing + # doesNotExist=yes + doesNotExist: Does not or never existed + # groundtruth=yes + groundtruth: Ground truth or needs local confirmation + # missing=yes + missing: Something is missing # none=yes none: None - # option1=yes - option1: Option1 - # option2=yes - option2: Option2 - # option3=yes - option3: Option3 - # option4=yes - option4: Option4 + # updateDetails=yes + updateDetails: Update or add details + # wrongLocation=yes + wrongLocation: Wrong location # category field placeholder placeholder: Unknown clothes: diff --git a/data/presets/fields.json b/data/presets/fields.json index 7296ec5fe..e1018de87 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -49,7 +49,7 @@ "capacity": {"key": "capacity", "type": "number", "minValue": 0, "label": "Capacity", "placeholder": "50, 100, 200..."}, "cash_in": {"key": "cash_in", "type": "check", "label": "Cash In"}, "castle_type": {"key": "castle_type", "type": "combo", "label": "Type"}, - "category": {"type": "radio", "keys": ["none", "option1", "option2", "option3", "option4"], "label": "Category", "placeholder": "Unknown", "strings": {"options": {"none": "None", "option1": "Option1", "option2": "Option2", "option3": "Option3", "option4": "Option4"}}}, + "category": {"type": "radio", "keys": ["none", "updateDetails", "missing", "wrongLocation", "groundtruth", "doesNotExist", "discussion"], "label": "Category", "placeholder": "Unknown", "strings": {"options": {"none": "None", "updateDetails": "Update or add details", "missing": "Something is missing", "wrongLocation": "Wrong location", "groundtruth": "Ground truth or needs local confirmation", "doesNotExist": "Does not or never existed", "discussion": "Needs discussing"}}}, "clothes": {"key": "clothes", "type": "semiCombo", "label": "Clothes"}, "club": {"key": "club", "type": "typeCombo", "label": "Type"}, "collection_times": {"key": "collection_times", "type": "text", "label": "Collection Times"}, diff --git a/data/presets/fields/category.json b/data/presets/fields/category.json index 7eeb9747c..1af4a78b8 100644 --- a/data/presets/fields/category.json +++ b/data/presets/fields/category.json @@ -2,20 +2,24 @@ "type": "radio", "keys": [ "none", - "option1", - "option2", - "option3", - "option4" + "updateDetails", + "missing", + "wrongLocation", + "groundtruth", + "doesNotExist", + "discussion" ], "label": "Category", "placeholder": "Unknown", "strings": { "options": { "none": "None", - "option1": "Option1", - "option2": "Option2", - "option3": "Option3", - "option4": "Option4" + "updateDetails": "Update or add details", + "missing": "Something is missing", + "wrongLocation": "Wrong location", + "groundtruth": "Ground truth or needs local confirmation", + "doesNotExist": "Does not or never existed", + "discussion": "Needs discussing" } } } diff --git a/data/taginfo.json b/data/taginfo.json index e73652fc6..a22acfd27 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -6376,30 +6376,86 @@ {"key": "cash_in", "description": "Cash In"}, {"key": "castle_type", "description": "Type"}, {"key": "none", "value": "none", "description": "Category"}, - {"key": "none", "value": "option1", "description": "Category"}, - {"key": "none", "value": "option2", "description": "Category"}, - {"key": "none", "value": "option3", "description": "Category"}, - {"key": "none", "value": "option4", "description": "Category"}, - {"key": "option1", "value": "none", "description": "Category"}, - {"key": "option1", "value": "option1", "description": "Category"}, - {"key": "option1", "value": "option2", "description": "Category"}, - {"key": "option1", "value": "option3", "description": "Category"}, - {"key": "option1", "value": "option4", "description": "Category"}, - {"key": "option2", "value": "none", "description": "Category"}, - {"key": "option2", "value": "option1", "description": "Category"}, - {"key": "option2", "value": "option2", "description": "Category"}, - {"key": "option2", "value": "option3", "description": "Category"}, - {"key": "option2", "value": "option4", "description": "Category"}, - {"key": "option3", "value": "none", "description": "Category"}, - {"key": "option3", "value": "option1", "description": "Category"}, - {"key": "option3", "value": "option2", "description": "Category"}, - {"key": "option3", "value": "option3", "description": "Category"}, - {"key": "option3", "value": "option4", "description": "Category"}, - {"key": "option4", "value": "none", "description": "Category"}, - {"key": "option4", "value": "option1", "description": "Category"}, - {"key": "option4", "value": "option2", "description": "Category"}, - {"key": "option4", "value": "option3", "description": "Category"}, - {"key": "option4", "value": "option4", "description": "Category"}, + {"key": "none", "value": "updateDetails", "description": "Category"}, + {"key": "none", "value": "missing", "description": "Category"}, + {"key": "none", "value": "wrongLocation", "description": "Category"}, + {"key": "none", "value": "groundtruth", "description": "Category"}, + {"key": "none", "value": "doesNotExist", "description": "Category"}, + {"key": "none", "value": "discussion", "description": "Category"}, + {"key": "updateDetails", "value": "none", "description": "Category"}, + { + "key": "updateDetails", + "value": "updateDetails", + "description": "Category" + }, + {"key": "updateDetails", "value": "missing", "description": "Category"}, + { + "key": "updateDetails", + "value": "wrongLocation", + "description": "Category" + }, + {"key": "updateDetails", "value": "groundtruth", "description": "Category"}, + { + "key": "updateDetails", + "value": "doesNotExist", + "description": "Category" + }, + {"key": "updateDetails", "value": "discussion", "description": "Category"}, + {"key": "missing", "value": "none", "description": "Category"}, + {"key": "missing", "value": "updateDetails", "description": "Category"}, + {"key": "missing", "value": "missing", "description": "Category"}, + {"key": "missing", "value": "wrongLocation", "description": "Category"}, + {"key": "missing", "value": "groundtruth", "description": "Category"}, + {"key": "missing", "value": "doesNotExist", "description": "Category"}, + {"key": "missing", "value": "discussion", "description": "Category"}, + {"key": "wrongLocation", "value": "none", "description": "Category"}, + { + "key": "wrongLocation", + "value": "updateDetails", + "description": "Category" + }, + {"key": "wrongLocation", "value": "missing", "description": "Category"}, + { + "key": "wrongLocation", + "value": "wrongLocation", + "description": "Category" + }, + {"key": "wrongLocation", "value": "groundtruth", "description": "Category"}, + { + "key": "wrongLocation", + "value": "doesNotExist", + "description": "Category" + }, + {"key": "wrongLocation", "value": "discussion", "description": "Category"}, + {"key": "groundtruth", "value": "none", "description": "Category"}, + {"key": "groundtruth", "value": "updateDetails", "description": "Category"}, + {"key": "groundtruth", "value": "missing", "description": "Category"}, + {"key": "groundtruth", "value": "wrongLocation", "description": "Category"}, + {"key": "groundtruth", "value": "groundtruth", "description": "Category"}, + {"key": "groundtruth", "value": "doesNotExist", "description": "Category"}, + {"key": "groundtruth", "value": "discussion", "description": "Category"}, + {"key": "doesNotExist", "value": "none", "description": "Category"}, + { + "key": "doesNotExist", + "value": "updateDetails", + "description": "Category" + }, + {"key": "doesNotExist", "value": "missing", "description": "Category"}, + { + "key": "doesNotExist", + "value": "wrongLocation", + "description": "Category" + }, + {"key": "doesNotExist", "value": "groundtruth", "description": "Category"}, + {"key": "doesNotExist", "value": "doesNotExist", "description": "Category"}, + {"key": "doesNotExist", "value": "discussion", "description": "Category"}, + {"key": "discussion", "value": "none", "description": "Category"}, + {"key": "discussion", "value": "updateDetails", "description": "Category"}, + {"key": "discussion", "value": "missing", "description": "Category"}, + {"key": "discussion", "value": "wrongLocation", "description": "Category"}, + {"key": "discussion", "value": "groundtruth", "description": "Category"}, + {"key": "discussion", "value": "doesNotExist", "description": "Category"}, + {"key": "discussion", "value": "discussion", "description": "Category"}, {"key": "clothes", "description": "Clothes"}, {"key": "collection_times", "description": "Collection Times"}, {"key": "comment", "description": "Changeset Comment"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 972409ee3..49bec21b2 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1672,10 +1672,12 @@ "placeholder": "Unknown", "options": { "none": "None", - "option1": "Option1", - "option2": "Option2", - "option3": "Option3", - "option4": "Option4" + "updateDetails": "Update or add details", + "missing": "Something is missing", + "wrongLocation": "Wrong location", + "groundtruth": "Ground truth or needs local confirmation", + "doesNotExist": "Does not or never existed", + "discussion": "Needs discussing" } }, "clothes": { diff --git a/modules/actions/move_note.js b/modules/actions/move_note.js index e2179b15a..e7c1a273d 100644 --- a/modules/actions/move_note.js +++ b/modules/actions/move_note.js @@ -9,7 +9,6 @@ export function actionMoveNote(noteID, toLoc) { var note = services.osm.getNote(noteID); note.move(geoVecInterp(note.loc, toLoc, t)); - console.log('moved: ', note.loc); // TODO: update }; diff --git a/modules/services/osm.js b/modules/services/osm.js index 03cb6f0eb..d33b941b7 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -875,10 +875,13 @@ export default { if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required + var comment = note.newComment; + if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; } var path = '/api/0.6/notes?' + 'lat=' + note.loc[1] + '&lon=' + note.loc[0] + - '&' + utilQsString({ text: note.newComment }); + '&' + utilQsString({ text: comment }); + _noteCache.inflightPost[note.id] = oauth.xhr( { method: 'POST', path: path }, wrapcb(this, done, _connectionID) diff --git a/modules/ui/note_category.js b/modules/ui/note_category.js deleted file mode 100644 index 5f43a3e2f..000000000 --- a/modules/ui/note_category.js +++ /dev/null @@ -1,63 +0,0 @@ -import { dispatch as d3_dispatch } from 'd3-dispatch'; -import { select as d3_select, selectAll as d3_selectAll } from 'd3-selection'; - -import { services } from '../services'; -import { uiField } from './field'; -import { uiFormFields } from './form_fields'; - -export function uiNoteCategory(context) { - var formFields = uiFormFields(context); - var _note; - var _fieldsArr; - - function noteCategory(selection) { - - if (!_note.isNew()) return; // don't add category - - var initial = false; - - if (!_fieldsArr) { - initial = true; - var presets = context.presets(); - - _fieldsArr = [ - uiField(context, presets.field('category'), null, { show: true, revert: false }), - ]; - - _fieldsArr.forEach(function(field) { - field - .on('change', change); - }); - } - - selection - .append('div') - .attr('class', 'note-category') - .call(formFields.fieldsArr(_fieldsArr)); - - function change() { - var val = d3_select('input[name=\'category\']:checked').property('value') || undefined; - // NOTE: perhaps there is a better way to get value, something like ... - // var input = d3_select(this); - // var val = input.property('value') || undefined; - - // store the unsaved comment with the note itself - _note = _note.update({ newCategory: val }); - - var osm = services.osm; - if (osm) { - osm.replaceNote(_note); // update note cache - } - } - - } - - noteCategory.note = function(_) { - if (!arguments.length) return _note; - _note = _; - return noteCategory; - }; - - - return noteCategory; -} \ No newline at end of file diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index b0bcc7812..f67cd3a28 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -9,6 +9,9 @@ import { services } from '../services'; import { modeBrowse } from '../modes'; import { svgIcon } from '../svg'; +import { uiField } from './field'; +import { uiFormFields } from './form_fields'; + import { uiNoteComments, uiNoteHeader, @@ -20,15 +23,17 @@ import { utilNoAuto, utilRebind } from '../util'; -import { uiNoteCategory } from './note_category'; export function uiNoteEditor(context) { var dispatch = d3_dispatch('change'); var noteComments = uiNoteComments(); - var noteCategory = uiNoteCategory(context); var noteHeader = uiNoteHeader(); + + var formFields = uiFormFields(context); + var _note; + var _fieldsArr; function noteEditor(selection) { @@ -109,8 +114,38 @@ export function uiNoteEditor(context) { .append('div') .attr('class', 'note-save save-section cf'); + // if new note, show categories to pick from if (_note.isNew()) { - noteSaveEnter.call(noteCategory.note(_note)); + var presets = context.presets(); + + // NOTE: this key isn't a age and therefore there is no documentation (yet) + _fieldsArr = [ + uiField(context, presets.field('category'), null, { show: true, revert: false }), + ]; + + _fieldsArr.forEach(function(field) { + field + .on('change', changeCategory); + }); + + noteSaveEnter + .append('div') + .attr('class', 'note-category') + .call(formFields.fieldsArr(_fieldsArr)); + } + + function changeCategory() { + // NOTE: perhaps there is a better way to get value + var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined; + + // store the unsaved category with the note itself + _note = _note.update({ newCategory: val }); + var osm = services.osm; + if (osm) { + osm.replaceNote(_note); // update note cache + } + noteSave + .call(noteSaveButtons); } noteSaveEnter @@ -127,8 +162,8 @@ export function uiNoteEditor(context) { .attr('maxlength', 1000) .property('value', function(d) { return d.newComment; }) .call(utilNoAuto) - .on('input', change) - .on('blur', change); + .on('input', changeInput) + .on('blur', changeInput); // update noteSave = noteSaveEnter @@ -137,7 +172,7 @@ export function uiNoteEditor(context) { .call(noteSaveButtons); - function change() { + function changeInput() { var input = d3_select(this); var val = input.property('value').trim() || undefined; From cd3d57627643da1cb28c3dd20f5f00f91b1f905d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 21:27:44 -0400 Subject: [PATCH 045/217] rename `geoTile` -> `tiler` --- modules/services/mapillary.js | 4 ++-- modules/services/openstreetcam.js | 4 ++-- modules/services/osm.js | 4 ++-- modules/services/streetside.js | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 3338211ab..0f664ffe4 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -22,7 +22,7 @@ import { svgDefs } from '../svg'; import { utilDetect } from '../util/detect'; import { utilQsString, utilRebind, utilTiler } from '../util'; -var geoTile = utilTiler().skipNullIsland(true); +var tiler = utilTiler().skipNullIsland(true); var apibase = 'https://a.mapillary.com/v3/'; var viewercss = 'mapillary-js/mapillary.min.css'; @@ -58,7 +58,7 @@ function loadTiles(which, url, projection) { var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); var dimension = projection.clipExtent()[1]; - var tiles = geoTile.getTiles(projection, dimension, tileZoom); + var tiles = tiler.getTiles(projection, dimension, tileZoom); // abort inflight requests that are no longer needed var cache = _mlyCache[which]; diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index f7577b51d..6094be376 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -32,7 +32,7 @@ import { utilSetTransform } from '../util'; -var geoTile = utilTiler().skipNullIsland(true); +var tiler = utilTiler().skipNullIsland(true); var apibase = 'https://openstreetcam.org'; var maxResults = 1000; @@ -67,7 +67,7 @@ function loadTiles(which, url, projection) { var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); var dimension = projection.clipExtent()[1]; - var tiles = geoTile.getTiles(projection, dimension, tileZoom); + var tiles = tiler.getTiles(projection, dimension, tileZoom); // abort inflight requests that are no longer needed var cache = _oscCache[which]; diff --git a/modules/services/osm.js b/modules/services/osm.js index 2aecabb6e..d5a812b80 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -33,7 +33,7 @@ import { utilQsString } from '../util'; -var geoTile = utilTiler(); +var tiler = utilTiler(); var dispatch = d3_dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes'); var urlroot = 'https://www.openstreetmap.org'; @@ -778,7 +778,7 @@ export default { } // determine the needed tiles to cover the view - var tiles = geoTile.getTiles(projection, dimensions, tilezoom); + var tiles = tiler.getTiles(projection, dimensions, tilezoom); // abort inflight requests that are no longer needed var hadRequests = !_isEmpty(cache.inflight); diff --git a/modules/services/streetside.js b/modules/services/streetside.js index b7b592cba..f028e11b3 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -33,7 +33,7 @@ import { utilQsString, utilRebind, utilTiler } from '../util'; import Q from 'q'; -var geoTile = utilTiler().skipNullIsland(true); +var tiler = utilTiler().skipNullIsland(true); var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?'; var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/'; @@ -84,7 +84,7 @@ function loadTiles(which, url, projection, margin) { var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); var dimension = projection.clipExtent()[1]; - var tiles = geoTile + var tiles = tiler .margin(margin) .getTiles(projection, dimension, tileZoom); From baad5f0cc589e4f033fd8a12446428a9da23b06d Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sat, 21 Jul 2018 21:44:07 -0400 Subject: [PATCH 046/217] added tests for osm/note --- modules/actions/move_note.js | 1 - modules/services/osm.js | 2 +- test/spec/osm/note.js | 38 +++++++++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/modules/actions/move_note.js b/modules/actions/move_note.js index e7c1a273d..97d89b97a 100644 --- a/modules/actions/move_note.js +++ b/modules/actions/move_note.js @@ -9,7 +9,6 @@ export function actionMoveNote(noteID, toLoc) { var note = services.osm.getNote(noteID); note.move(geoVecInterp(note.loc, toLoc, t)); - // TODO: update }; action.transitionable = true; diff --git a/modules/services/osm.js b/modules/services/osm.js index d33b941b7..89e0ae958 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -329,7 +329,7 @@ function parseXML(xml, callback, options) { // replace or remove note from rtree function updateRtree(item, replace) { // update (or insert) in _noteCache.rtree - // TODO: other checks needed? (e.g., if cache.data.children.length decrements ...) + // NOTE: other checks needed? (e.g., if cache.data.children.length decrements ...) // remove note _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); diff --git a/test/spec/osm/note.js b/test/spec/osm/note.js index 4e3d24817..6dc2f99ea 100644 --- a/test/spec/osm/note.js +++ b/test/spec/osm/note.js @@ -1,3 +1,5 @@ +import { geoVecInterp } from '../geo'; + describe('iD.osmNote', function () { it('returns a note', function () { expect(iD.osmNote()).to.be.an.instanceOf(iD.osmNote); @@ -10,6 +12,40 @@ describe('iD.osmNote', function () { }); }); - // TODO: add tests for #update, or remove function + describe('#update', function() { + it('returns an updated note', function() { + + }); + }); + + describe('#isNew', function() { + it('returns true if a note is new', function() { + var note = iD.osmNote({ + id: -1, + loc: [5, 10] + }); + expect(note.isNew()).to.be.true; + }); + it('returns false if a note is not new', function() { + var note = iD.osmNote({ + id: 1, + loc: [5, 10] + }); + expect(note.isNew()).to.be.false; + }); + }); + + describe('#move', function() { + it('returns an moved note', function() { + var note = iD.osmNote({ + id: 1, + loc: [5, 10] + }); + + var moveAmount = geoVecInterp(note.loc, [10, 10], 1); + note.move(moveAmount); + expect(note.loc).to.equal([10, 10]); + }); + }); }); \ No newline at end of file From c0b77d8226b2b5048d16817bf37cc804bca5b5dd Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 21:44:14 -0400 Subject: [PATCH 047/217] remove unneeded dimensions argument (projection clipExtent has it) --- modules/core/context.js | 18 +++++++++--------- modules/renderer/map.js | 2 +- modules/services/mapillary.js | 7 ++----- modules/services/openstreetcam.js | 20 +++++++++----------- modules/services/osm.js | 10 +++++----- modules/services/streetside.js | 9 +++------ modules/util/tiler.js | 3 ++- 7 files changed, 31 insertions(+), 38 deletions(-) diff --git a/modules/core/context.js b/modules/core/context.js index 4d758066e..31dbe7deb 100644 --- a/modules/core/context.js +++ b/modules/core/context.js @@ -119,7 +119,7 @@ export function coreContext() { return context; }; - context.loadTiles = utilCallWhenIdle(function(projection, dimensions, callback) { + context.loadTiles = utilCallWhenIdle(function(projection, callback) { var cid; function done(err, result) { if (connection.getConnectionId() !== cid) { @@ -131,11 +131,11 @@ export function coreContext() { } if (connection && context.editable()) { cid = connection.getConnectionId(); - connection.loadTiles(projection, dimensions, done); + connection.loadTiles(projection, done); } }); - context.loadEntity = function(entityId, callback) { + context.loadEntity = function(entityID, callback) { var cid; function done(err, result) { if (connection.getConnectionId() !== cid) { @@ -147,24 +147,24 @@ export function coreContext() { } if (connection) { cid = connection.getConnectionId(); - connection.loadEntity(entityId, done); + connection.loadEntity(entityID, done); } }; - context.zoomToEntity = function(entityId, zoomTo) { + context.zoomToEntity = function(entityID, zoomTo) { if (zoomTo !== false) { - this.loadEntity(entityId, function(err, result) { + this.loadEntity(entityID, function(err, result) { if (err) return; - var entity = _find(result.data, function(e) { return e.id === entityId; }); + var entity = _find(result.data, function(e) { return e.id === entityID; }); if (entity) { map.zoomTo(entity); } }); } map.on('drawn.zoomToEntity', function() { - if (!context.hasEntity(entityId)) return; + if (!context.hasEntity(entityID)) return; map.on('drawn.zoomToEntity', null); context.on('enter.zoomToEntity', null); - context.enter(modeSelect(context, [entityId])); + context.enter(modeSelect(context, [entityID])); }); context.on('enter.zoomToEntity', function() { diff --git a/modules/renderer/map.js b/modules/renderer/map.js index 1118488b7..097a17665 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -483,7 +483,7 @@ export function rendererMap(context) { // OSM if (map.editable()) { - context.loadTiles(projection, dimensions); + context.loadTiles(projection); drawVector(difference, extent); } else { editOff(); diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 0f664ffe4..866a9778e 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -19,10 +19,8 @@ import rbush from 'rbush'; import { geoExtent } from '../geo'; import { svgDefs } from '../svg'; -import { utilDetect } from '../util/detect'; import { utilQsString, utilRebind, utilTiler } from '../util'; -var tiler = utilTiler().skipNullIsland(true); var apibase = 'https://a.mapillary.com/v3/'; var viewercss = 'mapillary-js/mapillary.min.css'; @@ -30,6 +28,7 @@ var viewerjs = 'mapillary-js/mapillary.min.js'; var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi'; var maxResults = 1000; var tileZoom = 14; +var tiler = utilTiler().skipNullIsland(true); var dispatch = d3_dispatch('loadedImages', 'loadedSigns'); var _mlyFallback = false; var _mlyCache; @@ -56,9 +55,7 @@ function maxPageAtZoom(z) { function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - - var dimension = projection.clipExtent()[1]; - var tiles = tiler.getTiles(projection, dimension, tileZoom); + var tiles = tiler.getTiles(projection, tileZoom); // abort inflight requests that are no longer needed var cache = _mlyCache[which]; diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 6094be376..8fa1574e7 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -32,11 +32,11 @@ import { utilSetTransform } from '../util'; -var tiler = utilTiler().skipNullIsland(true); var apibase = 'https://openstreetcam.org'; var maxResults = 1000; var tileZoom = 14; +var tiler = utilTiler().skipNullIsland(true); var dispatch = d3_dispatch('loadedImages'); var imgZoom = d3_zoom() .extent([[0, 0], [320, 240]]) @@ -65,9 +65,7 @@ function maxPageAtZoom(z) { function loadTiles(which, url, projection) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - - var dimension = projection.clipExtent()[1]; - var tiles = tiler.getTiles(projection, dimension, tileZoom); + var tiles = tiler.getTiles(projection, tileZoom); // abort inflight requests that are no longer needed var cache = _oscCache[which]; @@ -123,8 +121,8 @@ function loadNextTilePage(which, currZoom, url, tile) { } var features = data.currentPageItems.map(function(item) { - var loc = [+item.lng, +item.lat], - d; + var loc = [+item.lng, +item.lat]; + var d; if (which === 'images') { d = { @@ -172,14 +170,14 @@ function loadNextTilePage(which, currZoom, url, tile) { function partitionViewport(psize, projection) { var dimensions = projection.clipExtent()[1]; psize = psize || 16; - var cols = d3_range(0, dimensions[0], psize), - rows = d3_range(0, dimensions[1], psize), - partitions = []; + var cols = d3_range(0, dimensions[0], psize); + var rows = d3_range(0, dimensions[1], psize); + var partitions = []; rows.forEach(function(y) { cols.forEach(function(x) { - var min = [x, y + psize], - max = [x + psize, y]; + var min = [x, y + psize]; + var max = [x + psize, y]; partitions.push( geoExtent(projection.invert(min), projection.invert(max))); }); diff --git a/modules/services/osm.js b/modules/services/osm.js index d5a812b80..fe02d626d 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -33,8 +33,8 @@ import { utilQsString } from '../util'; -var tiler = utilTiler(); +var tiler = utilTiler(); var dispatch = d3_dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes'); var urlroot = 'https://www.openstreetmap.org'; var oauth = osmAuth({ @@ -752,7 +752,7 @@ export default { // Load data (entities or notes) from the API in tiles // GET /api/0.6/map?bbox= // GET /api/0.6/notes?bbox= - loadTiles: function(projection, dimensions, callback, noteOptions) { + loadTiles: function(projection, callback, noteOptions) { if (_off) return; var that = this; @@ -778,7 +778,7 @@ export default { } // determine the needed tiles to cover the view - var tiles = tiler.getTiles(projection, dimensions, tilezoom); + var tiles = tiler.getTiles(projection, tilezoom); // abort inflight requests that are no longer needed var hadRequests = !_isEmpty(cache.inflight); @@ -831,9 +831,9 @@ export default { // Load notes from the API (just calls this.loadTiles) // GET /api/0.6/notes?bbox= - loadNotes: function(projection, dimensions, noteOptions) { + loadNotes: function(projection, noteOptions) { noteOptions = _extend({ limit: 10000, closed: 7}, noteOptions); - this.loadTiles(projection, dimensions, null, noteOptions); + this.loadTiles(projection, null, noteOptions); }, diff --git a/modules/services/streetside.js b/modules/services/streetside.js index f028e11b3..ea9971f2d 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -33,7 +33,6 @@ import { utilQsString, utilRebind, utilTiler } from '../util'; import Q from 'q'; -var tiler = utilTiler().skipNullIsland(true); var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?'; var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/'; @@ -42,10 +41,12 @@ var pannellumViewerCSS = 'pannellum-streetside/pannellum.css'; var pannellumViewerJS = 'pannellum-streetside/pannellum.js'; var maxResults = 2000; var tileZoom = 16.5; +var tiler = utilTiler().skipNullIsland(true); var dispatch = d3_dispatch('loadedBubbles', 'viewerChanged'); var minHfov = 10; // zoom in degrees: 20, 10, 5 var maxHfov = 90; // zoom out degrees var defaultHfov = 45; + var _hires = false; var _resolution = 512; // higher numbers are slower - 512, 1024, 2048, 4096 var _currScene = 0; @@ -82,11 +83,7 @@ function localeTimestamp(s) { function loadTiles(which, url, projection, margin) { var s = projection.scale() * 2 * Math.PI; var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); - - var dimension = projection.clipExtent()[1]; - var tiles = tiler - .margin(margin) - .getTiles(projection, dimension, tileZoom); + var tiles = tiler.margin(margin).getTiles(projection, tileZoom); // abort inflight requests that are no longer needed var cache = _ssCache[which]; diff --git a/modules/util/tiler.js b/modules/util/tiler.js index d66e29933..a869a3472 100644 --- a/modules/util/tiler.js +++ b/modules/util/tiler.js @@ -76,7 +76,8 @@ export function utilTiler() { * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from * an area around (and including) the current map view extents. */ - tiler.getTiles = function(projection, dimensions, tilezoom) { + tiler.getTiles = function(projection, tilezoom) { + var dimensions = projection.clipExtent()[1]; var s = projection.scale() * 2 * Math.PI; var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); var ts = 256 * Math.pow(2, z - tilezoom); From 7be9439c35b4ea5feeb39c33358a629e0f3f1abd Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 21:59:35 -0400 Subject: [PATCH 048/217] Use geoScaleToZoom to calculate zoom in Mapillary, OpenStreetCam --- modules/services/mapillary.js | 5 ++--- modules/services/openstreetcam.js | 10 ++++------ modules/services/streetside.js | 8 +++----- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 866a9778e..ddf72eabc 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -17,7 +17,7 @@ import { import rbush from 'rbush'; -import { geoExtent } from '../geo'; +import { geoExtent, geoScaleToZoom } from '../geo'; import { svgDefs } from '../svg'; import { utilQsString, utilRebind, utilTiler } from '../util'; @@ -53,8 +53,7 @@ function maxPageAtZoom(z) { function loadTiles(which, url, projection) { - var s = projection.scale() * 2 * Math.PI; - var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); + var currZoom = Math.floor(geoScaleToZoom(projection.scale())); var tiles = tiler.getTiles(projection, tileZoom); // abort inflight requests that are no longer needed diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 8fa1574e7..4c0c4cd28 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -21,15 +21,14 @@ import { import rbush from 'rbush'; -import { geoExtent } from '../geo'; - -import { utilTiler } from '../util'; +import { geoExtent, geoScaleToZoom } from '../geo'; import { utilDetect } from '../util/detect'; import { utilQsString, utilRebind, - utilSetTransform + utilSetTransform, + utilTiler } from '../util'; @@ -63,8 +62,7 @@ function maxPageAtZoom(z) { function loadTiles(which, url, projection) { - var s = projection.scale() * 2 * Math.PI; - var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); + var currZoom = Math.floor(geoScaleToZoom(projection.scale())); var tiles = tiler.getTiles(projection, tileZoom); // abort inflight requests that are no longer needed diff --git a/modules/services/streetside.js b/modules/services/streetside.js index ea9971f2d..39d5f7990 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -81,8 +81,6 @@ function localeTimestamp(s) { * loadTiles() wraps the process of generating tiles and then fetching image points for each tile. */ function loadTiles(which, url, projection, margin) { - var s = projection.scale() * 2 * Math.PI; - var currZoom = Math.floor(Math.max(Math.log(s) / Math.log(2) - 8, 0)); var tiles = tiler.margin(margin).getTiles(projection, tileZoom); // abort inflight requests that are no longer needed @@ -97,14 +95,14 @@ function loadTiles(which, url, projection, margin) { }); tiles.forEach(function (tile) { - loadNextTilePage(which, currZoom, url, tile); + loadNextTilePage(which, url, tile); }); } /** * loadNextTilePage() load data for the next tile page in line. */ -function loadNextTilePage(which, currZoom, url, tile) { +function loadNextTilePage(which, url, tile) { var cache = _ssCache[which]; var nextPage = cache.nextPage[tile.id] || 0; var id = tile.id + ',' + String(nextPage); @@ -118,7 +116,7 @@ function loadNextTilePage(which, currZoom, url, tile) { // [].shift() removes the first element, some statistics info, not a bubble point bubbles.shift(); - var features = bubbles.map(function (bubble) { + var features = bubbles.map(function(bubble) { if (cache.points[bubble.id]) return null; // skip duplicates var loc = [bubble.lo, bubble.la]; From 88119330099c3447ca2cb8e7bd2312631669aa6d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 21 Jul 2018 22:31:04 -0400 Subject: [PATCH 049/217] Split up loadTiles and loadNotes code Code is similar but different enough that I'd rather have 2 separate functions rather than a single function with a bunch of ifs --- modules/services/osm.js | 118 +++++++++++++++++++++----------------- modules/ui/note_editor.js | 4 +- 2 files changed, 66 insertions(+), 56 deletions(-) diff --git a/modules/services/osm.js b/modules/services/osm.js index fe02d626d..4a3c0bc5c 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -77,6 +77,17 @@ function abortRequest(i) { } +function abortUnwantedRequests(cache, tiles) { + _forEach(cache.inflight, function(v, k) { + var wanted = _find(tiles, function(tile) { return k === tile.id; }); + if (!wanted) { + abortRequest(v); + delete cache.inflight[k]; + } + }); +} + + function getLoc(attrs) { var lon = attrs.lon && attrs.lon.value; var lat = attrs.lat && attrs.lat.value; @@ -749,78 +760,44 @@ export default { }, - // Load data (entities or notes) from the API in tiles + // Load data (entities) from the API in tiles // GET /api/0.6/map?bbox= - // GET /api/0.6/notes?bbox= - loadTiles: function(projection, callback, noteOptions) { + loadTiles: function(projection, callback) { if (_off) return; var that = this; - - // are we loading entities or notes? - var loadingNotes = (noteOptions !== undefined); - var path, cache, tilezoom, throttleLoadUsers; - - if (loadingNotes) { - noteOptions = _extend({ limit: 10000, closed: 7}, noteOptions); - path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox='; - cache = _noteCache; - tilezoom = _noteZoom; - throttleLoadUsers = _throttle(function() { - var uids = Object.keys(_userCache.toLoad); - if (!uids.length) return; - that.loadUsers(uids, function() {}); // eagerly load user details - }, 750); - } else { - path = '/api/0.6/map?bbox='; - cache = _tileCache; - tilezoom = _tileZoom; - } + var path = '/api/0.6/map?bbox='; // determine the needed tiles to cover the view - var tiles = tiler.getTiles(projection, tilezoom); + var tiles = tiler.getTiles(projection, _tileZoom); // abort inflight requests that are no longer needed - var hadRequests = !_isEmpty(cache.inflight); - _forEach(cache.inflight, function(v, k) { - var wanted = _find(tiles, function(tile) { return k === tile.id; }); - if (!wanted) { - abortRequest(v); - delete cache.inflight[k]; - } - }); - - if (hadRequests && !loadingNotes && _isEmpty(cache.inflight)) { + var hadRequests = !_isEmpty(_tileCache.inflight); + abortUnwantedRequests(_tileCache, tiles); + if (hadRequests && _isEmpty(_tileCache.inflight)) { dispatch.call('loaded'); // stop the spinner } // issue new requests.. tiles.forEach(function(tile) { - if (cache.loaded[tile.id] || cache.inflight[tile.id]) return; - if (!loadingNotes && _isEmpty(cache.inflight)) { + if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return; + if (_isEmpty(_tileCache.inflight)) { dispatch.call('loading'); // start the spinner } - var options = { skipSeen: !loadingNotes }; - cache.inflight[tile.id] = that.loadFromAPI( + var options = { skipSeen: true }; + _tileCache.inflight[tile.id] = that.loadFromAPI( path + tile.extent.toParam(), function(err, parsed) { - delete cache.inflight[tile.id]; + delete _tileCache.inflight[tile.id]; if (!err) { - cache.loaded[tile.id] = true; + _tileCache.loaded[tile.id] = true; } - - if (loadingNotes) { - throttleLoadUsers(); - dispatch.call('loadedNotes'); - - } else { - if (callback) { - callback(err, _extend({ data: parsed }, tile)); - } - if (_isEmpty(cache.inflight)) { - dispatch.call('loaded'); // stop the spinner - } + if (callback) { + callback(err, _extend({ data: parsed }, tile)); + } + if (_isEmpty(_tileCache.inflight)) { + dispatch.call('loaded'); // stop the spinner } }, options @@ -829,11 +806,44 @@ export default { }, - // Load notes from the API (just calls this.loadTiles) + // Load notes from the API in tiles // GET /api/0.6/notes?bbox= loadNotes: function(projection, noteOptions) { noteOptions = _extend({ limit: 10000, closed: 7}, noteOptions); - this.loadTiles(projection, null, noteOptions); + if (_off) return; + + var that = this; + var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox='; + var throttleLoadUsers = _throttle(function() { + var uids = Object.keys(_userCache.toLoad); + if (!uids.length) return; + that.loadUsers(uids, function() {}); // eagerly load user details + }, 750); + + // determine the needed tiles to cover the view + var tiles = tiler.getTiles(projection, _noteZoom); + + // abort inflight requests that are no longer needed + abortUnwantedRequests(_noteCache, tiles); + + // issue new requests.. + tiles.forEach(function(tile) { + if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return; + + var options = { skipSeen: false }; + _noteCache.inflight[tile.id] = that.loadFromAPI( + path + tile.extent.toParam(), + function(err) { + delete _noteCache.inflight[tile.id]; + if (!err) { + _noteCache.loaded[tile.id] = true; + } + throttleLoadUsers(); + dispatch.call('loadedNotes'); + }, + options + ); + }); }, diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index 1d96d80f1..901419b72 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -59,7 +59,7 @@ export function uiNoteEditor(context) { var editor = body.selectAll('.note-editor') .data([0]); - editor = editor.enter() + editor.enter() .append('div') .attr('class', 'modal-section note-editor') .merge(editor) @@ -71,7 +71,7 @@ export function uiNoteEditor(context) { var footer = selection.selectAll('.footer') .data([0]); - footer = footer.enter() + footer.enter() .append('div') .attr('class', 'footer') .merge(footer) From 00bb7337369e8cacb13a54c2f547f76b80ea7e6a Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sat, 21 Jul 2018 22:49:12 -0400 Subject: [PATCH 050/217] changed note annotation icons --- modules/svg/notes.js | 20 +++++--------------- modules/ui/note_header.js | 16 +++++----------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/modules/svg/notes.js b/modules/svg/notes.js index 29c05194b..f516922c9 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -124,27 +124,17 @@ export function svgNotes(projection, context, dispatch) { // add dots if there's a comment thread notesEnter.selectAll('.note-annotation') - .data(function(d) { return d.comments.length > 1 ? [0] : []; }) + .data(function(d) { return [d]; }) .enter() .append('use') .attr('class', 'note-annotation thread') .attr('width', '14px') .attr('height', '14px') .attr('x', '-5px') - .attr('y', '-20px') - .attr('xlink:href', '#iD-icon-more'); - - // add plus if this is a new note - notesEnter.selectAll('.note-annotation') - .data(function(d) { return d.id < 0 ? [0] : []; }) - .enter() - .append('use') - .attr('class', 'note-annotation thread') - .attr('width', '14px') - .attr('height', '14px') - .attr('x', '-5px') - .attr('y', '-20px') - .attr('xlink:href', '#iD-icon-plus'); + .attr('y', '-21px') + .attr('xlink:href', function(d) { + return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply')); + }); // update notes diff --git a/modules/ui/note_header.js b/modules/ui/note_header.js index e2bb1af66..8fc2a0e95 100644 --- a/modules/ui/note_header.js +++ b/modules/ui/note_header.js @@ -31,17 +31,11 @@ export function uiNoteHeader() { .call(svgIcon('#iD-icon-note', 'note-fill')); iconEnter.each(function(d) { - if (d.comments.length > 1) { - iconEnter - .append('div') - .attr('class', 'note-icon-annotation') - .call(svgIcon('#iD-icon-more', 'note-annotation')); - } else if (_note.isNew()) { - iconEnter - .append('div') - .attr('class', 'note-icon-annotation') - .call(svgIcon('#iD-icon-plus', 'note-annotation')); - } + var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply')); + iconEnter + .append('div') + .attr('class', 'note-icon-annotation') + .call(svgIcon(statusIcon, 'note-annotation')); }); headerEnter From 4038c8200e366166a4e441ef79651521030cda2b Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sun, 22 Jul 2018 00:05:15 -0400 Subject: [PATCH 051/217] added note section to help docs --- data/core.yaml | 9 +++++++++ dist/locales/en.json | 10 ++++++++++ modules/ui/help.js | 13 +++++++++++++ 3 files changed, 32 insertions(+) diff --git a/data/core.yaml b/data/core.yaml index b317df32a..348dfaa0f 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -762,6 +762,15 @@ en: boundary_h: "Boundaries" boundary: "A *boundary* relation is a group of one or more line features that together form an administrative boundary." boundary_add: "To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation." + notes: + title: Notes + intro: "*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel or press the shortcut key `` to enable the notes layer." + add_note_h: "Adding Notes" + add_note: "To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`." + move_note: "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location. Once acceptable, give the note a description and click `Add Note`." + update_note_h: "Closing, Reopening, and Commenting" + update_note: "An existing note can be updated by closing it, reopening it, or commenting on it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original or a previous issue is not resolved, or that there is a new issue. A comment on a note is for discussion." + update_note_command: "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed." imagery: title: Background Imagery intro: "The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data." diff --git a/dist/locales/en.json b/dist/locales/en.json index 8781f6338..24f1863f3 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -905,6 +905,16 @@ "boundary": "A *boundary* relation is a group of one or more line features that together form an administrative boundary.", "boundary_add": "To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation." }, + "notes": { + "title": "Notes", + "intro": "*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel or press the shortcut key `` to enable the notes layer.", + "add_note_h": "Adding Notes", + "add_note": "To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.", + "move_note": "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location. Once acceptable, give the note a description and click `Add Note`.", + "update_note_h": "Closing, Reopening, and Commenting", + "update_note": "An existing note can be updated by closing it, reopening it, or commenting on it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original or a previous issue is not resolved, or that there is a new issue. A comment on a note is for discussion.", + "update_note_command": "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed." + }, "imagery": { "title": "Background Imagery", "intro": "The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.", diff --git a/modules/ui/help.js b/modules/ui/help.js index 5b5c71993..a5901b2a9 100644 --- a/modules/ui/help.js +++ b/modules/ui/help.js @@ -147,6 +147,16 @@ export function uiHelp(context) { 'boundary', 'boundary_add' ]], + ['notes', [ + 'intro', + 'add_note_h', + 'add_note', + 'move_note', + 'update_note_h', + 'update_note', + 'update_note_command' + ]], + ['imagery', [ 'intro', 'sources_h', @@ -210,6 +220,8 @@ export function uiHelp(context) { 'help.relations.turn_restriction_h': 3, 'help.relations.route_h': 3, 'help.relations.boundary_h': 3, + 'help.notes.add_note_h': 3, + 'help.notes.update_note_h': 3, 'help.imagery.sources_h': 3, 'help.imagery.offsets_h': 3, 'help.streetlevel.using_h': 3, @@ -220,6 +232,7 @@ export function uiHelp(context) { point: icon('#iD-icon-point', 'pre-text'), line: icon('#iD-icon-line', 'pre-text'), area: icon('#iD-icon-area', 'pre-text'), + note: icon('#iD-icon-note', 'pre-text'), plus: icon('#iD-icon-plus', 'pre-text'), minus: icon('#iD-icon-minus', 'pre-text'), orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'), From 27922e81b8f16bc12ef3f0fb391215ff836ae950 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Sun, 22 Jul 2018 00:16:17 -0400 Subject: [PATCH 052/217] updated shortcut menu --- data/core.yaml | 5 +++-- data/shortcuts.json | 5 +++++ dist/locales/en.json | 5 +++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 348dfaa0f..ceff1d969 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -770,7 +770,7 @@ en: move_note: "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location. Once acceptable, give the note a description and click `Add Note`." update_note_h: "Closing, Reopening, and Commenting" update_note: "An existing note can be updated by closing it, reopening it, or commenting on it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original or a previous issue is not resolved, or that there is a new issue. A comment on a note is for discussion." - update_note_command: "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed." + update_note_command: "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed. Notes are not features and updates must be saved individually." imagery: title: Background Imagery intro: "The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data." @@ -1135,7 +1135,8 @@ en: add_point: "'Add point' mode" add_line: "'Add line' mode" add_area: "'Add area' mode" - place_point: "Place a point" + add_note: "'Add note' mode" + place_point: "Place a point or note" disable_snap: "Hold to disable point snapping" stop_line: "Finish drawing a line or area" operations: diff --git a/data/shortcuts.json b/data/shortcuts.json index ee0c9cdc9..ff4fd800d 100644 --- a/data/shortcuts.json +++ b/data/shortcuts.json @@ -171,6 +171,11 @@ ], "text": "shortcuts.editing.drawing.add_area" }, + { + "shortcuts": ["4" + ], + "text": "shortcuts.editing.drawing.add_note" + }, { "shortcuts": ["Left-click","shortcuts.key.space" ], diff --git a/dist/locales/en.json b/dist/locales/en.json index 24f1863f3..8a0708fd7 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -913,7 +913,7 @@ "move_note": "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location. Once acceptable, give the note a description and click `Add Note`.", "update_note_h": "Closing, Reopening, and Commenting", "update_note": "An existing note can be updated by closing it, reopening it, or commenting on it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original or a previous issue is not resolved, or that there is a new issue. A comment on a note is for discussion.", - "update_note_command": "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed." + "update_note_command": "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed. Notes are not features and updates must be saved individually." }, "imagery": { "title": "Background Imagery", @@ -1309,7 +1309,8 @@ "add_point": "'Add point' mode", "add_line": "'Add line' mode", "add_area": "'Add area' mode", - "place_point": "Place a point", + "add_note": "'Add note' mode", + "place_point": "Place a point or note", "disable_snap": "Hold to disable point snapping", "stop_line": "Finish drawing a line or area" }, From 2fa593421f20046ac998225eb017540305458be1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 22 Jul 2018 01:15:44 -0400 Subject: [PATCH 053/217] Rename scaleExtent to zoomExtent, slightly simplify getTiles() --- API.md | 2 +- data/imagery.json | 1642 ++++++++++------------- data/update_imagery.js | 2 +- modules/renderer/background_source.js | 10 +- modules/renderer/tile_layer.js | 2 +- modules/services/mapillary.js | 4 +- modules/services/openstreetcam.js | 4 +- modules/services/osm.js | 6 +- modules/services/streetside.js | 4 +- modules/util/tiler.js | 48 +- test/spec/renderer/background_source.js | 8 +- 11 files changed, 739 insertions(+), 993 deletions(-) diff --git a/API.md b/API.md index 83a68bc8a..b624db79f 100644 --- a/API.md +++ b/API.md @@ -219,7 +219,7 @@ Each imagery source should have the following properties: Optional properties: * `description` - A longer source description which, if included, will be displayed in a popup when viewing the background imagery list * `overlay` - If `true`, this is an overlay layer (a transparent layer rendered above base imagery layer). Defaults to `false` -* `scaleExtent` - Allowable min and max zoom levels, defaults to `[0, 22]` +* `zoomExtent` - Allowable min and max zoom levels, defaults to `[0, 22]` * `polygon` - Array of coordinate rings within which imagery is valid. If omitted, imagery is assumed to be valid worldwide * `overzoom` - Can this imagery be scaled up when zooming in beyond the max zoom? Defaults to `true` * `terms_url` - Url to link to when displaying the imagery terms diff --git a/data/imagery.json b/data/imagery.json index 892539d24..8716aaeca 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -7,7 +7,7 @@ "template": "https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}", "endDate": "2013-06-01T00:00:00.000Z", "startDate": "2013-05-01T00:00:00.000Z", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-123.02167, 48.44667], @@ -60,7 +60,7 @@ "template": "https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}", "endDate": "2016-07-01T00:00:00.000Z", "startDate": "2016-05-01T00:00:00.000Z", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-123.02167, 48.44667], @@ -110,7 +110,7 @@ "name": "7th Series (OS7)", "type": "tms", "template": "https://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg", - "scaleExtent": [6, 14], + "zoomExtent": [6, 14], "polygon": [ [ [-3.04697, 54.83947], @@ -412,7 +412,7 @@ "projection": "EPSG:4326", "endDate": "2017-05-01T00:00:00.000Z", "startDate": "2017-05-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [149.085, -35.1171], @@ -481,6 +481,88 @@ ] ], "terms_url": "https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548", + "terms_text": "© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory" + }, + { + "id": "ACT2018", + "name": "ACTmapi Imagery 2018", + "type": "wms", + "template": "https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2018mga/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "projection": "EPSG:4326", + "endDate": "2018-03-19T00:00:00.000Z", + "startDate": "2018-03-19T00:00:00.000Z", + "zoomExtent": [0, 21], + "polygon": [ + [ + [149.2695, -35.4381], + [149.2669, -35.348], + [149.3329, -35.3468], + [149.3334, -35.3648], + [149.3774, -35.364], + [149.3769, -35.3459], + [149.3989, -35.3455], + [149.3984, -35.3275], + [149.4094, -35.3273], + [149.4088, -35.3092], + [149.3978, -35.3095], + [149.3973, -35.2914], + [149.3533, -35.2923], + [149.3528, -35.2743], + [149.3089, -35.2751], + [149.3084, -35.2571], + [149.2644, -35.2579], + [149.2634, -35.2219], + [149.2415, -35.2223], + [149.241, -35.2043], + [149.219, -35.2047], + [149.218, -35.1687], + [149.1961, -35.1691], + [149.1956, -35.151], + [149.1737, -35.1514], + [149.1732, -35.1334], + [149.1512, -35.1338], + [149.1508, -35.1158], + [149.085, -35.1169], + [149.0854, -35.135], + [149.0635, -35.1353], + [149.0639, -35.1534], + [149.0201, -35.1541], + [149.0205, -35.1721], + [148.9985, -35.1725], + [148.999, -35.1905], + [148.9331, -35.1916], + [148.934, -35.2276], + [148.912, -35.228], + [148.9124, -35.246], + [148.8685, -35.2467], + [148.8689, -35.2647], + [148.8469, -35.265], + [148.8473, -35.2831], + [148.8034, -35.2837], + [148.8038, -35.3018], + [148.7818, -35.3021], + [148.7838, -35.3922], + [148.8058, -35.3919], + [148.8086, -35.5181], + [148.7976, -35.5182], + [148.7994, -35.5993], + [148.8766, -35.5982], + [148.8747, -35.517], + [148.8527, -35.5174], + [148.8508, -35.4363], + [148.8398, -35.4364], + [148.8388, -35.3914], + [149.0039, -35.3888], + [149.0048, -35.4248], + [149.0268, -35.4244], + [149.0277, -35.4605], + [149.0497, -35.4601], + [149.0511, -35.5142], + [149.1613, -35.5122], + [149.1594, -35.4402], + [149.2695, -35.4381] + ] + ], "terms_text": "© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory", "best": true }, @@ -605,7 +687,7 @@ "name": "AGIV Flanders GRB", "type": "tms", "template": "https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [4.40434, 50.78177], @@ -735,7 +817,7 @@ "name": "AGIV Flanders most recent aerial imagery", "type": "tms", "template": "https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [4.7737, 50.79368], @@ -904,7 +986,7 @@ "template": "https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2006-01-01T00:00:00.000Z", - "scaleExtent": [0, 16], + "zoomExtent": [0, 16], "polygon": [ [ [112.28778, -28.78459], @@ -1554,7 +1636,7 @@ "template": "https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{x}/{y}.jpeg", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [2.94012, 44.63388], @@ -2053,7 +2135,7 @@ "template": "https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{x}/{y}.jpeg", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [2.49389, 46.66829], @@ -2098,7 +2180,7 @@ "name": "BANO", "type": "tms", "template": "https://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png", - "scaleExtent": [12, 20], + "zoomExtent": [12, 20], "polygon": [ [ [-2.7, 43.9], @@ -2679,7 +2761,7 @@ "template": "https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png", "endDate": "2010-07-20T00:00:00.000Z", "startDate": "2013-07-19T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -2919,7 +3001,7 @@ "name": "basemap.at", "type": "tms", "template": "https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [16.50733, 46.99293], @@ -3125,7 +3207,7 @@ "name": "basemap.at Beschriftungen (annotations)", "type": "tms", "template": "https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [16.50733, 46.99293], @@ -3332,7 +3414,7 @@ "name": "basemap.at Orthofoto", "type": "tms", "template": "https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [16.50733, 46.99293], @@ -3534,326 +3616,13 @@ "description": "Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.", "icon": "https://www.basemap.at/images/logo_basemap.jpg" }, - { - "id": "bavaria-2m", - "name": "Bavaria (2 m)", - "type": "wms", - "template": "https://geodaten.bayern.de/ogc/ogc_dop200_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=adv_dop200c&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", - "projection": "EPSG:4326", - "scaleExtent": [8, 18], - "polygon": [ - [ - [10.12359, 50.56846], - [10.14286, 50.55078], - [10.20281, 50.55742], - [10.25205, 50.51796], - [10.32698, 50.49345], - [10.41048, 50.41848], - [10.60317, 50.33109], - [10.62244, 50.2271], - [10.72521, 50.21066], - [10.72949, 50.24765], - [10.85153, 50.24354], - [10.71879, 50.32015], - [10.71236, 50.36524], - [10.85581, 50.39664], - [10.93717, 50.39664], - [10.99069, 50.36661], - [11.12772, 50.36661], - [11.1791, 50.31332], - [11.16197, 50.29417], - [11.24119, 50.2928], - [11.24975, 50.37344], - [11.24119, 50.47982], - [11.35895, 50.5234], - [11.43816, 50.50979], - [11.44244, 50.48936], - [11.42532, 50.4771], - [11.42532, 50.44166], - [11.48955, 50.42257], - [11.49169, 50.39801], - [11.51952, 50.39801], - [11.52594, 50.37617], - [11.59874, 50.40347], - [11.63727, 50.38845], - [11.79357, 50.4212], - [11.83639, 50.39255], - [11.92203, 50.42802], - [11.98626, 50.38709], - [11.98412, 50.35705], - [12.04835, 50.33109], - [12.09331, 50.32972], - [12.1297, 50.29828], - [12.14041, 50.27228], - [12.10615, 50.25586], - [12.11258, 50.23532], - [12.14897, 50.23669], - [12.19822, 50.20107], - [12.22391, 50.16406], - [12.20464, 50.14348], - [12.20678, 50.10779], - [12.24318, 50.09955], - [12.27743, 50.07208], - [12.49367, 49.98543], - [12.49796, 49.94136], - [12.55576, 49.92206], - [12.54934, 49.86827], - [12.48083, 49.78817], - [12.41018, 49.75775], - [12.46156, 49.70655], - [12.5472, 49.68023], - [12.58788, 49.55261], - [12.65425, 49.53455], - [12.66281, 49.43302], - [12.75274, 49.41073], - [12.7977, 49.34661], - [12.90475, 49.35638], - [12.99681, 49.33685], - [13.05462, 49.27543], - [13.13169, 49.21952], - [13.19164, 49.14395], - [13.2366, 49.12153], - [13.29655, 49.12293], - [13.37148, 49.08088], - [13.4143, 49.02897], - [13.4143, 48.97981], - [13.57916, 48.96997], - [13.63483, 48.94326], - [13.67765, 48.88698], - [13.73759, 48.89261], - [13.7847, 48.83346], - [13.84036, 48.77423], - [13.81681, 48.70646], - [13.84464, 48.70081], - [13.8425, 48.60038], - [13.76543, 48.5423], - [13.75258, 48.50401], - [13.67122, 48.50543], - [13.64339, 48.54371], - [13.45712, 48.5508], - [13.45712, 48.41598], - [13.40574, 48.36053], - [13.2837, 48.27511], - [13.09315, 48.26941], - [12.95827, 48.19097], - [12.87691, 48.18526], - [12.772, 48.09382], - [12.86407, 48.01368], - [12.89832, 47.95492], - [12.94543, 47.95636], - [12.99681, 47.88461], - [13.01394, 47.83434], - [12.93472, 47.7322], - [13.0589, 47.72499], - [13.11885, 47.63851], - [13.06532, 47.56922], - [13.05676, 47.47379], - [13.00323, 47.45208], - [12.76772, 47.55044], - [12.76986, 47.63274], - [12.73989, 47.67312], - [12.6671, 47.67024], - [12.57503, 47.6212], - [12.48083, 47.61975], - [12.41446, 47.67024], - [12.24318, 47.67745], - [12.2132, 47.69186], - [12.19179, 47.68177], - [12.2132, 47.66591], - [12.21106, 47.60388], - [12.17467, 47.59521], - [12.13827, 47.60388], - [11.89205, 47.60388], - [11.85137, 47.57933], - [11.63942, 47.58222], - [11.59445, 47.54899], - [11.59017, 47.51285], - [11.51738, 47.49839], - [11.4403, 47.50417], - [11.39534, 47.47524], - [11.42746, 47.44484], - [11.3461, 47.44339], - [11.27973, 47.39559], - [11.21336, 47.38834], - [11.24761, 47.43181], - [11.10203, 47.39269], - [10.965, 47.38979], - [10.97785, 47.43615], - [10.9179, 47.47524], - [10.8708, 47.47524], - [10.85581, 47.49405], - [10.90077, 47.5143], - [10.87294, 47.53598], - [10.81085, 47.51285], - [10.64385, 47.54899], - [10.59461, 47.55477], - [10.57962, 47.52876], - [10.46187, 47.54032], - [10.46615, 47.48392], - [10.48756, 47.47813], - [10.48756, 47.41298], - [10.45973, 47.40283], - [10.45973, 47.37529], - [10.41048, 47.37384], - [10.40834, 47.34339], - [10.32056, 47.28678], - [10.28202, 47.27806], - [10.28416, 47.26208], - [10.14714, 47.26208], - [10.1921, 47.30275], - [10.19424, 47.37384], - [10.16641, 47.37384], - [10.16641, 47.34629], - [10.10004, 47.34339], - [10.0615, 47.36369], - [10.06792, 47.41877], - [10.09361, 47.42601], - [10.09576, 47.44194], - [9.978, 47.48537], - [9.95659, 47.52731], - [9.8945, 47.52876], - [9.85596, 47.50851], - [9.81743, 47.54465], - [9.82171, 47.57644], - [9.77461, 47.58222], - [9.73821, 47.52586], - [9.67398, 47.53454], - [9.58406, 47.56488], - [9.63972, 47.60532], - [9.7168, 47.60388], - [9.85596, 47.676], - [9.978, 47.65582], - [10.02938, 47.68177], - [10.10004, 47.66735], - [10.13215, 47.676], - [10.14286, 47.70195], - [10.0615, 47.7725], - [10.11288, 47.8099], - [10.08291, 47.85302], - [10.1086, 47.90902], - [10.07649, 47.96496], - [10.13001, 48.02084], - [10.13429, 48.10669], - [10.10004, 48.12813], - [10.05508, 48.26228], - [9.96944, 48.36765], - [10.03153, 48.42593], - [10.02938, 48.46144], - [10.12359, 48.47705], - [10.15356, 48.4515], - [10.23492, 48.51252], - [10.31628, 48.51678], - [10.29915, 48.61878], - [10.24563, 48.6683], - [10.27346, 48.70646], - [10.3698, 48.68385], - [10.43189, 48.69939], - [10.45116, 48.72765], - [10.40192, 48.746], - [10.44046, 48.84896], - [10.43403, 48.95873], - [10.33769, 49.02055], - [10.24991, 49.03599], - [10.24991, 49.07387], - [10.20066, 49.10331], - [10.25205, 49.13274], - [10.12359, 49.19714], - [10.11931, 49.26285], - [10.15142, 49.28939], - [10.10432, 49.34522], - [10.14072, 49.39401], - [10.1086, 49.44555], - [10.11074, 49.50537], - [10.0722, 49.53316], - [10.01654, 49.47616], - [9.92662, 49.47894], - [9.92448, 49.55678], - [9.89878, 49.58177], - [9.85596, 49.53872], - [9.80672, 49.55678], - [9.86667, 49.60675], - [9.85382, 49.6442], - [9.81743, 49.66083], - [9.83455, 49.68993], - [9.79602, 49.72039], - [9.75748, 49.70793], - [9.74035, 49.68577], - [9.70609, 49.71624], - [9.67826, 49.71624], - [9.68254, 49.68854], - [9.62045, 49.69131], - [9.64615, 49.78955], - [9.55836, 49.77434], - [9.57121, 49.73561], - [9.50698, 49.75222], - [9.49199, 49.77987], - [9.46844, 49.76051], - [9.42562, 49.77849], - [9.40421, 49.76466], - [9.33356, 49.7702], - [9.32928, 49.73423], - [9.4085, 49.72593], - [9.42776, 49.69824], - [9.41492, 49.6442], - [9.38066, 49.63865], - [9.35925, 49.64974], - [9.33998, 49.63727], - [9.31215, 49.64836], - [9.27789, 49.62617], - [9.28432, 49.60814], - [9.2415, 49.57483], - [9.09805, 49.57205], - [9.06594, 49.60814], - [9.10019, 49.65113], - [9.09163, 49.6927], - [9.13017, 49.71208], - [9.13873, 49.74253], - [9.10876, 49.75637], - [9.13659, 49.79093], - [9.10019, 49.78955], - [9.07236, 49.82824], - [9.03596, 49.83514], - [9.01669, 50.02671], - [8.96317, 50.03084], - [8.95674, 50.05971], - [9.00171, 50.0707], - [9.02097, 50.11054], - [9.1216, 50.12289], - [9.15586, 50.11328], - [9.19654, 50.11878], - [9.18583, 50.13525], - [9.23507, 50.1476], - [9.37638, 50.12701], - [9.4085, 50.0817], - [9.52197, 50.09543], - [9.50484, 50.14211], - [9.53267, 50.16406], - [9.48985, 50.16954], - [9.49413, 50.24354], - [9.61403, 50.22163], - [9.66541, 50.23532], - [9.63544, 50.24901], - [9.66756, 50.27228], - [9.74249, 50.30922], - [9.72964, 50.35841], - [9.77032, 50.42939], - [9.86881, 50.40074], - [9.91805, 50.40893], - [10.03581, 50.47982], - [10.03795, 50.51115], - [10.12359, 50.56846] - ] - ], - "terms_url": "https://www.ldbv.bayern.de/", - "terms_text": "Bayerische Vermessungsverwaltung" - }, { "id": "bavaria-80cm", "name": "Bavaria (80 cm)", "type": "wms", - "template": "https://www.geodaten.bayern.de/ogc/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "template": "https://geoservices.bayern.de/wms/v1/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [7, 18], + "zoomExtent": [7, 18], "polygon": [ [ [10.12359, 50.56846], @@ -4166,7 +3935,7 @@ "name": "Bavaria DOP 80cm", "type": "tms", "template": "https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", - "scaleExtent": [7, 18], + "zoomExtent": [7, 18], "polygon": [ [ [10.12359, 50.56846], @@ -4479,7 +4248,7 @@ "name": "BD Carthage", "type": "tms", "template": "https://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png", - "scaleExtent": [6, 20], + "zoomExtent": [6, 20], "polygon": [ [ [-2.7, 43.9], @@ -5058,7 +4827,7 @@ "name": "BDOrtho IGN", "type": "tms", "template": "https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg", - "scaleExtent": [2, 21], + "zoomExtent": [2, 21], "polygon": [ [ [-2.7, 43.9], @@ -5695,7 +5464,7 @@ "template": "https://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [2.31954, 6.55745], @@ -6313,7 +6082,7 @@ "name": "Bing aerial imagery", "type": "bing", "template": "https://www.bing.com/maps", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "default": true, "description": "Satellite and aerial imagery.", "icon": "https://osmlab.github.io/editor-layer-index/sources/world/Bing.png" @@ -6325,7 +6094,7 @@ "template": "https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2017-01-01T00:00:00.000Z", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [11.22962, 44.53077], @@ -6400,7 +6169,7 @@ "template": "http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [6.66713, 46.83358], @@ -6421,7 +6190,7 @@ "template": "http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-0.59923, 45.04193], @@ -6500,7 +6269,7 @@ "template": "http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [-0.59923, 45.04193], @@ -6655,7 +6424,7 @@ "template": "http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png", "endDate": "2013-06-01T00:00:00.000Z", "startDate": "2009-01-01T00:00:00.000Z", - "scaleExtent": [9, 20], + "zoomExtent": [9, 20], "polygon": [ [ [-123.3176, 49.32726], @@ -7128,7 +6897,7 @@ "name": "Cadastre", "type": "tms", "template": "http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png", - "scaleExtent": [12, 22], + "zoomExtent": [12, 22], "polygon": [ [ [-2.7, 43.9], @@ -7707,7 +7476,7 @@ "name": "Cadastre geoportail.lu", "type": "tms", "template": "https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -8090,7 +7859,7 @@ "name": "Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual", "type": "tms", "template": "https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [92.10238, 20.81356], @@ -8187,7 +7956,7 @@ "template": "https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png", "endDate": "2017-12-20T00:00:00.000Z", "startDate": "2017-12-11T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [-72.26734, 18.63561], @@ -8533,7 +8302,7 @@ "template": "https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [6.79478, 46.57542], @@ -9505,7 +9274,7 @@ "projection": "EPSG:3857", "endDate": "2010-01-01T00:00:00.000Z", "startDate": "2010-01-01T00:00:00.000Z", - "scaleExtent": [14, 18], + "zoomExtent": [14, 18], "polygon": [ [ [-7.31278, 36.98391], @@ -9576,7 +9345,7 @@ "template": "http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [7.02235, 46.42856], @@ -10332,7 +10101,7 @@ "template": "https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [18.44866, -33.89362], @@ -10545,7 +10314,7 @@ "template": "https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [18.44866, -33.89362], @@ -10760,7 +10529,7 @@ "projection": "EPSG:3857", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2011-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [8.44624, 47.44143], @@ -10778,7 +10547,7 @@ "type": "wms", "template": "https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [8.45788, 47.44582], @@ -10980,7 +10749,7 @@ "name": "Czech CUZK:KM tiles proxy", "type": "tms", "template": "https://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png", - "scaleExtent": [13, 18], + "zoomExtent": [13, 18], "polygon": [ [ [15.00637, 49.01774], @@ -11321,7 +11090,7 @@ "name": "Czech RUIAN budovy", "type": "tms", "template": "https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png", - "scaleExtent": [12, 20], + "zoomExtent": [12, 20], "polygon": [ [ [15.00637, 49.01774], @@ -11493,7 +11262,7 @@ "name": "Czech RUIAN parcely", "type": "tms", "template": "https://tile.poloha.net/parcely/{zoom}/{x}/{y}.png", - "scaleExtent": [12, 20], + "zoomExtent": [12, 20], "polygon": [ [ [15.00637, 49.01774], @@ -11769,7 +11538,7 @@ "template": "http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [10, 20], + "zoomExtent": [10, 20], "polygon": [ [ [19.07732, 47.69597], @@ -12344,7 +12113,7 @@ "name": "DigitalGlobe Premium Imagery", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "terms_url": "https://wiki.openstreetmap.org/wiki/DigitalGlobe", "terms_text": "Terms & Feedback", "default": true, @@ -12356,7 +12125,7 @@ "name": "DigitalGlobe Premium Imagery Vintage", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "terms_url": "https://wiki.openstreetmap.org/wiki/DigitalGlobe", "terms_text": "Terms & Feedback", "description": "Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.", @@ -12368,7 +12137,7 @@ "name": "DigitalGlobe Standard Imagery", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "terms_url": "https://wiki.openstreetmap.org/wiki/DigitalGlobe", "terms_text": "Terms & Feedback", "default": true, @@ -12380,7 +12149,7 @@ "name": "DigitalGlobe Standard Imagery Vintage", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "terms_url": "https://wiki.openstreetmap.org/wiki/DigitalGlobe", "terms_text": "Terms & Feedback", "description": "Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.", @@ -14635,7 +14404,7 @@ "name": "Esri World Imagery", "type": "tms", "template": "https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "terms_url": "https://wiki.openstreetmap.org/wiki/Esri", "terms_text": "Terms & Feedback", "default": true, @@ -14647,7 +14416,7 @@ "name": "Esri World Imagery (Clarity) Beta", "type": "tms", "template": "https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "terms_url": "https://wiki.openstreetmap.org/wiki/Esri", "terms_text": "Terms & Feedback", "default": true, @@ -17779,7 +17548,7 @@ "name": "Estonia Ortho (Maaamet)", "type": "tms", "template": "https://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png", - "scaleExtent": [14, 18], + "zoomExtent": [14, 18], "polygon": [ [ [22.35364, 58.85385], @@ -18579,7 +18348,7 @@ "template": "http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [6.62313, 46.82339], @@ -18600,7 +18369,7 @@ "type": "wms", "template": "https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [3, 22], + "zoomExtent": [3, 22], "polygon": [ [ [31.90425, 70.43681], @@ -18644,7 +18413,7 @@ "template": "http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg", "endDate": "2000-01-01T00:00:00.000Z", "startDate": "2000-01-01T00:00:00.000Z", - "scaleExtent": [0, 17], + "zoomExtent": [0, 17], "polygon": [ [ [16.11391, 46.8691], @@ -19232,7 +19001,7 @@ "template": "http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg", "endDate": "2005-01-01T00:00:00.000Z", "startDate": "2005-01-01T00:00:00.000Z", - "scaleExtent": [0, 17], + "zoomExtent": [0, 17], "polygon": [ [ [16.11391, 46.8691], @@ -19818,7 +19587,7 @@ "name": "Freemap.sk Car", "type": "tms", "template": "https://{switch:a,b,c,d}.freemap.sk/A/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [8, 16], + "zoomExtent": [8, 16], "polygon": [ [ [19.83682, 49.25529], @@ -19877,7 +19646,7 @@ "name": "Freemap.sk Cyclo", "type": "tms", "template": "https://{switch:a,b,c,d}.freemap.sk/C/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [8, 16], + "zoomExtent": [8, 16], "polygon": [ [ [19.83682, 49.25529], @@ -19936,7 +19705,7 @@ "name": "Freemap.sk Hiking", "type": "tms", "template": "https://{switch:a,b,c,d}.freemap.sk/T/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [8, 16], + "zoomExtent": [8, 16], "polygon": [ [ [19.83682, 49.25529], @@ -19995,7 +19764,7 @@ "name": "Freemap.sk Ski", "type": "tms", "template": "https://{switch:a,b,c,d}.freemap.sk/K/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [8, 16], + "zoomExtent": [8, 16], "polygon": [ [ [19.83682, 49.25529], @@ -20055,7 +19824,7 @@ "type": "wms", "template": "https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [3, 20], + "zoomExtent": [3, 20], "polygon": [ [ [27.96569, 70.0988], @@ -20169,7 +19938,7 @@ "template": "https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}", "endDate": "2014-07-06T00:00:00.000Z", "startDate": "2014-07-06T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [34.49022, 31.59487], @@ -20248,7 +20017,7 @@ "template": "https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}", "endDate": "2014-07-06T00:00:00.000Z", "startDate": "2014-07-06T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [34.49022, 31.59487], @@ -20846,7 +20615,7 @@ "type": "wms", "template": "https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [4, 20], + "zoomExtent": [4, 20], "polygon": [ [ [-141.0678, 60.2442], @@ -21106,7 +20875,7 @@ "type": "wms", "template": "https://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [4, 20], + "zoomExtent": [4, 20], "polygon": [ [ [-141.0678, 60.2442], @@ -22823,7 +22592,7 @@ "template": "http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2017-04-09T00:00:00.000Z", "startDate": "2017-04-09T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [6.05001, 49.82175], @@ -22843,7 +22612,7 @@ "type": "wms", "template": "http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}", "projection": "EPSG:4326", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [15.9751, 54.37092], @@ -23067,7 +22836,7 @@ "name": "Geoportal.gov.pl (Orthophotomap)", "type": "tms", "template": "https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}", - "scaleExtent": [6, 24], + "zoomExtent": [6, 24], "polygon": [ [ [15.9751, 54.37092], @@ -23529,7 +23298,7 @@ "template": "http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [6.06066, 48.60554], @@ -23547,7 +23316,7 @@ "name": "GURS: Building outlines", "type": "tms", "template": "http://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png", - "scaleExtent": [8, 19], + "zoomExtent": [8, 19], "polygon": [ [ [15.17101, 45.41273], @@ -23740,7 +23509,7 @@ "name": "GURS: Road lines", "type": "tms", "template": "http://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png", - "scaleExtent": [8, 19], + "zoomExtent": [8, 19], "polygon": [ [ [15.17101, 45.41273], @@ -24203,7 +23972,7 @@ "template": "https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png", "endDate": "2014-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [8, 20], + "zoomExtent": [8, 20], "polygon": [ [ [-1.31567, 50.77809], @@ -24393,7 +24162,7 @@ "template": "https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [8, 20], + "zoomExtent": [8, 20], "polygon": [ [ [-1.31567, 50.77809], @@ -24581,7 +24350,7 @@ "name": "Hillshade Hungary", "type": "tms", "template": "https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [[[15, 45], [24, 45], [24, 49], [15, 49], [15, 45]]], "terms_text": "SRTM", "overlay": true @@ -24591,7 +24360,7 @@ "name": "IBGE Distrito Federal", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-48.2444, -16.0508], @@ -24610,7 +24379,7 @@ "name": "IBGE Mapa de Setores Rurais", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-69.94793, -4.23168], @@ -25700,7 +25469,7 @@ "name": "IBGE Mapa de Setores Urbanos", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-69.94793, -4.23168], @@ -28311,7 +28080,7 @@ "name": "IGN topographical map (TMS)", "type": "tms", "template": "https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}", - "scaleExtent": [1, 20], + "zoomExtent": [1, 20], "polygon": [ [ [-55.5438, -35.77219], @@ -28696,7 +28465,7 @@ "name": "Imagerie Drone (Haiti)", "type": "tms", "template": "http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [-72.15474, 19.6879], @@ -29333,7 +29102,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}", "endDate": "2016-03-27T00:00:00.000Z", "startDate": "2016-03-27T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [79.01779, 8.82757], @@ -29355,7 +29124,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2014-07-31T00:00:00.000Z", "startDate": "2014-07-31T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [-152.70873, 62.30357], @@ -29378,7 +29147,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}", "endDate": "2016-03-03T00:00:00.000Z", "startDate": "2016-03-03T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [58.049, 43.2623], @@ -29403,7 +29172,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}", "endDate": "2016-09-09T00:00:00.000Z", "startDate": "2016-09-09T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [58.049, 43.2623], @@ -29428,7 +29197,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}", "endDate": "2017-04-17T00:00:00.000Z", "startDate": "2017-04-17T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-62.9988, -40.7327], @@ -29450,7 +29219,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}", "endDate": "2017-01-27T00:00:00.000Z", "startDate": "2017-01-27T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-62.9988, -40.7327], @@ -29472,7 +29241,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2014-03-16T00:00:00.000Z", "startDate": "2014-03-16T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [114.36, 2.02846], @@ -29495,7 +29264,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [104.00155, -0.00008], @@ -29517,7 +29286,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2017-06-05T00:00:00.000Z", "startDate": "2017-06-05T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-168.2544, 53.8749], @@ -29539,7 +29308,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2013-10-18T00:00:00.000Z", "startDate": "2013-10-18T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [3.24653, -54.47047], @@ -29562,7 +29331,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}", "endDate": "2017-02-23T00:00:00.000Z", "startDate": "2017-02-23T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [96.1197, -67.6542], @@ -29586,7 +29355,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}", "endDate": "2016-09-29T00:00:00.000Z", "startDate": "2016-09-29T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [10.55906, 45.95485], @@ -29611,7 +29380,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-12-10T00:00:00.000Z", "startDate": "2015-12-10T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-34.17701, -55.29693], @@ -29634,7 +29403,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}", "endDate": "2016-08-31T00:00:00.000Z", "startDate": "2016-08-31T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-154.5102, 59.4577], @@ -29658,7 +29427,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}", "endDate": "2016-09-21T00:00:00.000Z", "startDate": "2016-09-21T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-72.75945, -15.68684], @@ -29682,7 +29451,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}", "endDate": "2015-12-21T00:00:00.000Z", "startDate": "2015-12-21T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [1.83975, 6.2578], @@ -29705,7 +29474,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}", "endDate": "2016-03-11T00:00:00.000Z", "startDate": "2016-03-11T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-92.05216, 1.3213], @@ -29727,7 +29496,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2014-09-02T00:00:00.000Z", "startDate": "2014-09-02T00:00:00.000Z", - "scaleExtent": [0, 11], + "zoomExtent": [0, 11], "polygon": [ [ [-84.34799, 74.38946], @@ -29749,7 +29518,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2013-08-27T00:00:00.000Z", "startDate": "2013-08-27T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [-13.04701, 64.21109], @@ -29771,7 +29540,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}", "endDate": "2012-02-05T00:00:00.000Z", "startDate": "2012-02-05T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-78.532, -1.80509], @@ -29793,7 +29562,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}", "endDate": "2016-01-09T00:00:00.000Z", "startDate": "2016-01-09T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-56.13476, -61.63472], @@ -29816,7 +29585,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}", "endDate": "2017-03-27T00:00:00.000Z", "startDate": "2017-01-25T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [45.4547, -68.5091], @@ -29841,7 +29610,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-12-13T00:00:00.000Z", "startDate": "2015-12-13T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-24.75878, 14.74814], @@ -29863,7 +29632,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [-43.9774, 59.7171], @@ -30038,7 +29807,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}", "endDate": "2016-04-12T00:00:00.000Z", "startDate": "2016-04-12T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [73.06897, -53.27059], @@ -30061,7 +29830,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2013-09-16T00:00:00.000Z", "startDate": "2013-09-16T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [-69.8568, -55.55949], @@ -30086,7 +29855,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}", "endDate": "2015-10-08T00:00:00.000Z", "startDate": "2015-10-08T00:00:00.000Z", - "scaleExtent": [0, 17], + "zoomExtent": [0, 17], "polygon": [ [ [-50.6992, 66.9888], @@ -30116,7 +29885,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}", "endDate": "2016-05-18T00:00:00.000Z", "startDate": "2016-05-18T00:00:00.000Z", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [ [ [-50.7519, 66.9996], @@ -30142,7 +29911,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}", "endDate": "2016-08-07T00:00:00.000Z", "startDate": "2016-08-07T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [35.93259, 44.96237], @@ -30164,7 +29933,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}", "endDate": "2018-04-29T00:00:00.000Z", "startDate": "2018-04-29T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [35.8787, 45.0348], @@ -30186,7 +29955,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}", "endDate": "2016-07-17T00:00:00.000Z", "startDate": "2016-07-17T00:00:00.000Z", - "scaleExtent": [0, 10], + "zoomExtent": [0, 10], "polygon": [ [ [-79.05175, 81.91484], @@ -30211,7 +29980,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}", "endDate": "2018-01-06T00:00:00.000Z", "startDate": "2018-01-06T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [-62.7282, -68.9652], @@ -30237,7 +30006,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}", "endDate": "2013-11-16T00:00:00.000Z", "startDate": "2013-11-16T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-28.21075, -56.72108], @@ -30259,7 +30028,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-10-13T00:00:00.000Z", "startDate": "2015-10-13T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-27.99293, -56.73479], @@ -30282,7 +30051,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}", "endDate": "2018-02-22T00:00:00.000Z", "startDate": "2018-02-22T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [35.124, -70.3693], @@ -30305,7 +30074,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}", "endDate": "2013-05-17T00:00:00.000Z", "startDate": "2013-05-17T00:00:00.000Z", - "scaleExtent": [0, 10], + "zoomExtent": [0, 10], "polygon": [ [ [-85.76109, 81.39333], @@ -30335,7 +30104,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}", "endDate": "2017-02-14T00:00:00.000Z", "startDate": "2017-02-14T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [162.9125, -78.4514], @@ -30360,7 +30129,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}", "endDate": "2016-06-13T00:00:00.000Z", "startDate": "2016-06-13T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [37.20666, -0.26685], @@ -30382,7 +30151,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}", "endDate": "2016-08-02T00:00:00.000Z", "startDate": "2016-08-02T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [37.24769, -3.22921], @@ -30404,7 +30173,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-06-08T00:00:00.000Z", "startDate": "2015-06-08T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [150.38853, -2.80053], @@ -30426,7 +30195,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}", "endDate": "2016-09-25T00:00:00.000Z", "startDate": "2016-09-25T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [5.1562, 52.8755], @@ -30450,7 +30219,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}", "endDate": "2017-06-02T00:00:00.000Z", "startDate": "2017-06-02T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [5.1713, 53.0918], @@ -30473,7 +30242,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}", "endDate": "2018-05-08T00:00:00.000Z", "startDate": "2018-05-08T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [5.3179, 53.0918], @@ -30497,7 +30266,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}", "endDate": "2018-05-16T00:00:00.000Z", "startDate": "2018-05-16T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [51.0243, 45.0729], @@ -30520,7 +30289,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}", "endDate": "2016-08-12T00:00:00.000Z", "startDate": "2016-08-12T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [59.19898, 64.89205], @@ -30544,7 +30313,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}", "endDate": "2015-09-13T00:00:00.000Z", "startDate": "2015-09-13T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [37.7291, 64.1971], @@ -30568,7 +30337,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}", "endDate": "2012-07-09T00:00:00.000Z", "startDate": "2012-07-09T00:00:00.000Z", - "scaleExtent": [0, 10], + "zoomExtent": [0, 10], "polygon": [ [ [-81.62923, 82.4597], @@ -30592,7 +30361,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}", "endDate": "2012-07-15T00:00:00.000Z", "startDate": "2012-07-08T00:00:00.000Z", - "scaleExtent": [0, 10], + "zoomExtent": [0, 10], "polygon": [ [ [-78.89729, 82.17577], @@ -30617,7 +30386,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}", "endDate": "2015-08-21T00:00:00.000Z", "startDate": "2015-08-21T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [7.63568, 53.28027], @@ -30640,7 +30409,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}", "endDate": "2015-08-21T00:00:00.000Z", "startDate": "2015-08-21T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [7.63568, 53.28027], @@ -30663,7 +30432,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}", "endDate": "2012-08-13T00:00:00.000Z", "startDate": "2005-06-21T00:00:00.000Z", - "scaleExtent": [0, 10], + "zoomExtent": [0, 10], "polygon": [ [ [-52.49222, 82.48972], @@ -30690,7 +30459,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}", "endDate": "2013-03-13T00:00:00.000Z", "startDate": "2013-03-13T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [73.2279, -53.20333], @@ -30714,7 +30483,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}", "endDate": "2016-06-07T00:00:00.000Z", "startDate": "2016-06-07T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-80.01654, 8.84898], @@ -30736,7 +30505,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}", "endDate": "2016-12-30T00:00:00.000Z", "startDate": "2016-12-30T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-79.62539, 8.77083], @@ -30760,7 +30529,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}", "endDate": "2016-09-30T00:00:00.000Z", "startDate": "2016-09-30T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [53.1802, 67.5344], @@ -30787,7 +30556,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2016-02-02T00:00:00.000Z", "startDate": "2016-02-02T00:00:00.000Z", - "scaleExtent": [0, 10], + "zoomExtent": [0, 10], "polygon": [ [ [-53.20922, -84.12525], @@ -30811,7 +30580,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}", "endDate": "2015-08-31T00:00:00.000Z", "startDate": "2015-08-31T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [19.11233, 42.15316], @@ -30833,7 +30602,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}", "endDate": "2011-04-15T00:00:00.000Z", "startDate": "2011-04-15T00:00:00.000Z", - "scaleExtent": [0, 15], + "zoomExtent": [0, 15], "polygon": [ [ [-51.23857, 68.79972], @@ -30855,7 +30624,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [67.9684, 22.36265], @@ -30878,7 +30647,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}", "endDate": "2015-08-28T00:00:00.000Z", "startDate": "2015-08-28T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [23.80811, 41.58488], @@ -30901,7 +30670,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-02-09T00:00:00.000Z", "startDate": "2015-02-09T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [29.7663, 0.20689], @@ -30923,7 +30692,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}", "endDate": "2016-07-02T00:00:00.000Z", "startDate": "2016-07-02T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [29.80514, 0.23586], @@ -30945,7 +30714,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2014-02-05T00:00:00.000Z", "startDate": "2014-02-05T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-180, -67.42635], @@ -30967,7 +30736,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-12-13T00:00:00.000Z", "startDate": "2015-12-13T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-42.12875, -53.7205], @@ -30989,7 +30758,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2013-09-27T00:00:00.000Z", "startDate": "2013-09-27T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [120.84382, -3.59545], @@ -31013,7 +30782,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2016-02-04T00:00:00.000Z", "startDate": "2016-02-04T00:00:00.000Z", - "scaleExtent": [0, 10], + "zoomExtent": [0, 10], "polygon": [ [ [156.96951, -84.50098], @@ -31040,7 +30809,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2015-10-13T00:00:00.000Z", "startDate": "2015-10-13T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [136.4226, -4.2853], @@ -31062,7 +30831,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}", "endDate": "2016-08-12T00:00:00.000Z", "startDate": "2016-08-12T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [136.8044, -4.2585], @@ -31084,7 +30853,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [16.6108, 76.4137], @@ -31124,7 +30893,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}", "endDate": "2011-05-07T00:00:00.000Z", "startDate": "2011-05-07T00:00:00.000Z", - "scaleExtent": [0, 15], + "zoomExtent": [0, 15], "polygon": [ [ [-68.93977, 76.51133], @@ -31148,7 +30917,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}", "endDate": "2015-09-25T00:00:00.000Z", "startDate": "2015-09-25T00:00:00.000Z", - "scaleExtent": [0, 17], + "zoomExtent": [0, 17], "polygon": [ [ [-68.74292, 76.52636], @@ -31174,7 +30943,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}", "endDate": "2015-10-06T00:00:00.000Z", "startDate": "2015-10-06T00:00:00.000Z", - "scaleExtent": [0, 16], + "zoomExtent": [0, 16], "polygon": [ [ [-68.81924, 76.5251], @@ -31199,7 +30968,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}", "endDate": "2015-09-25T00:00:00.000Z", "startDate": "2015-09-25T00:00:00.000Z", - "scaleExtent": [0, 16], + "zoomExtent": [0, 16], "polygon": [ [ [-68.77771, 76.50688], @@ -31223,7 +30992,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}", "endDate": "2016-08-12T00:00:00.000Z", "startDate": "2016-08-12T00:00:00.000Z", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [78.45886, 80.72643], @@ -31245,7 +31014,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2014-12-24T00:00:00.000Z", "startDate": "2014-12-24T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [153.06138, -11.78923], @@ -31268,7 +31037,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2016-01-31T00:00:00.000Z", "startDate": "2016-01-31T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-72.86696, -41.51741], @@ -31291,7 +31060,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}", "endDate": "2016-06-23T00:00:00.000Z", "startDate": "2016-06-23T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [126.36143, 51.37553], @@ -31313,7 +31082,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}", "endDate": "2017-10-17T00:00:00.000Z", "startDate": "2017-10-17T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [4.6412, 43.2493], @@ -31342,7 +31111,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}", "endDate": "2013-10-09T00:00:00.000Z", "startDate": "2013-10-09T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [75.98364, 34.97851], @@ -31364,7 +31133,7 @@ "template": "http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}", "endDate": "2016-05-10T00:00:00.000Z", "startDate": "2016-05-10T00:00:00.000Z", - "scaleExtent": [0, 14], + "zoomExtent": [0, 14], "polygon": [ [ [-71.18071, -14.49785], @@ -31384,7 +31153,7 @@ "name": "IPR ortofoto LAST (tmsproxy)", "type": "tms", "template": "https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg", - "scaleExtent": [1, 20], + "zoomExtent": [1, 20], "polygon": [ [ [14.81232, 49.93089], @@ -31400,7 +31169,7 @@ "name": "IPR ortofoto Low-Vegetation (tmsproxy)", "type": "tms", "template": "https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg", - "scaleExtent": [1, 20], + "zoomExtent": [1, 20], "polygon": [ [ [14.30454, 49.99538], @@ -31450,7 +31219,7 @@ "name": "Ireland British War Office 1:25k GSGS 3906", "type": "tms", "template": "https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [ [ [-9.31139, 51.43828], @@ -31509,7 +31278,7 @@ "name": "Israel Hiking", "type": "tms", "template": "https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 16], + "zoomExtent": [7, 16], "polygon": [ [ [34.64563, 32.92073], @@ -31564,7 +31333,7 @@ "name": "Israel MTB", "type": "tms", "template": "https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 16], + "zoomExtent": [7, 16], "polygon": [ [ [34.64563, 32.92073], @@ -31993,7 +31762,7 @@ "name": "Japan GSI ortho Imagery", "type": "tms", "template": "https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg", - "scaleExtent": [5, 19], + "zoomExtent": [5, 19], "polygon": [ [ [130.35021, 31.45741], @@ -33982,7 +33751,7 @@ "name": "Japan GSI Standard Map", "type": "tms", "template": "https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png", - "scaleExtent": [5, 18], + "zoomExtent": [5, 18], "polygon": [ [ [141.85547, 44.64912], @@ -34019,7 +33788,7 @@ "template": "https://mapproxy.osm.ch/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2014-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [8, 19], + "zoomExtent": [8, 19], "polygon": [ [ [8.09602, 47.57882], @@ -34636,7 +34405,7 @@ "template": "https://mapproxy.osm.ch/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [8, 19], + "zoomExtent": [8, 19], "polygon": [ [ [7.70438, 47.55794], @@ -34727,7 +34496,7 @@ "template": "https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [18, 21], + "zoomExtent": [18, 21], "polygon": [ [ [7.37028, 47.41368], @@ -34956,7 +34725,7 @@ "template": "https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [8, 21], + "zoomExtent": [8, 21], "polygon": [ [ [7.492, 47.4817], @@ -34975,7 +34744,7 @@ "template": "https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2017-01-01T00:00:00.000Z", - "scaleExtent": [8, 21], + "zoomExtent": [8, 21], "polygon": [ [ [7.67138, 47.59522], @@ -35036,7 +34805,7 @@ "template": "https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [15, 19], + "zoomExtent": [15, 19], "polygon": [ [ [7.95595, 47.47162], @@ -35215,7 +34984,7 @@ "projection": "EPSG:4326", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [15, 19], + "zoomExtent": [15, 19], "polygon": [ [ [7.57042, 47.15792], @@ -35491,7 +35260,7 @@ "name": "Kanton Thurgau OF 2017", "type": "tms", "template": "https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", - "scaleExtent": [8, 21], + "zoomExtent": [8, 21], "polygon": [ [ [8.63768, 47.70041], @@ -35573,7 +35342,7 @@ "template": "https://mapproxy.osm.ch/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [8, 21], + "zoomExtent": [8, 21], "polygon": [ [ [8.71338, 47.21388], @@ -36084,7 +35853,7 @@ "projection": "EPSG:3857", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [8, 21], + "zoomExtent": [8, 21], "polygon": [ [ [8.71338, 47.21388], @@ -36593,7 +36362,7 @@ "type": "wms", "template": "https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [31.90425, 70.43681], @@ -36636,7 +36405,7 @@ "type": "wms", "template": "https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [31.90425, 70.43681], @@ -36679,7 +36448,7 @@ "type": "wms", "template": "https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [31.90425, 70.43681], @@ -36722,7 +36491,7 @@ "type": "wms", "template": "https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [9, 22], + "zoomExtent": [9, 22], "polygon": [ [ [31.90425, 70.43681], @@ -36765,7 +36534,7 @@ "type": "wms", "template": "https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 24], + "zoomExtent": [0, 24], "polygon": [ [ [11.53568, 58.86659], @@ -36930,7 +36699,7 @@ "type": "wms", "template": "https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 24], + "zoomExtent": [0, 24], "polygon": [ [ [11.53568, 58.86659], @@ -37095,7 +36864,7 @@ "type": "wms", "template": "https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [11, 20], + "zoomExtent": [11, 20], "polygon": [ [ [31.90425, 70.43681], @@ -37137,7 +36906,7 @@ "type": "wms", "template": "https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [6, 24], + "zoomExtent": [6, 24], "polygon": [ [ [11.53568, 58.86659], @@ -37302,7 +37071,7 @@ "name": "Kartverket Hillshade overlay", "type": "tms", "template": "https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}", - "scaleExtent": [9, 15], + "zoomExtent": [9, 15], "polygon": [ [ [31.90425, 70.43681], @@ -37345,7 +37114,7 @@ "type": "wms", "template": "https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [5, 15], + "zoomExtent": [5, 15], "polygon": [ [ [31.90425, 70.43681], @@ -37386,7 +37155,7 @@ "name": "Kartverket N50 topo", "type": "tms", "template": "https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}", - "scaleExtent": [3, 15], + "zoomExtent": [3, 15], "polygon": [ [ [11.53568, 58.86659], @@ -37550,7 +37319,7 @@ "name": "Kartverket Nautical Charts", "type": "tms", "template": "https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}", - "scaleExtent": [3, 20], + "zoomExtent": [3, 20], "polygon": [ [ [-15.01273, -60.16205], @@ -37605,7 +37374,7 @@ "type": "wms", "template": "https://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [3, 24], + "zoomExtent": [3, 24], "polygon": [ [ [11.53568, 58.86659], @@ -37824,7 +37593,7 @@ "type": "wms", "template": "http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [18.90884, 50.24006], @@ -37879,7 +37648,7 @@ "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png", "endDate": "2012-05-14T00:00:00.000Z", "startDate": "2012-05-13T00:00:00.000Z", - "scaleExtent": [9, 20], + "zoomExtent": [9, 20], "polygon": [ [ [-119.58673, 49.79281], @@ -37987,7 +37756,7 @@ "name": "Kelowna Roads overlay", "type": "tms", "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png", - "scaleExtent": [9, 20], + "zoomExtent": [9, 20], "polygon": [ [ [-119.58673, 49.79281], @@ -38096,7 +37865,7 @@ "type": "wms", "template": "https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [12, 19], + "zoomExtent": [12, 19], "polygon": [ [ [3.24857, 56.08599], @@ -38139,7 +37908,7 @@ "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png", "endDate": "2013-09-03T00:00:00.000Z", "startDate": "2013-09-03T00:00:00.000Z", - "scaleExtent": [5, 14], + "zoomExtent": [5, 14], "polygon": [ [ [-60.855, 6.1765], @@ -38156,7 +37925,7 @@ "name": "Lantmäteriet Economic Map (historic)", "type": "tms", "template": "https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg", - "scaleExtent": [3, 17], + "zoomExtent": [3, 17], "polygon": [ [ [12.71117, 55.2666], @@ -38187,7 +37956,7 @@ "type": "wms", "template": "https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [5, 19], + "zoomExtent": [5, 19], "polygon": [ [ [12.80182, 55.19612], @@ -38222,7 +37991,7 @@ "type": "wms", "template": "https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [5, 19], + "zoomExtent": [5, 19], "polygon": [ [ [12.80182, 55.19612], @@ -38250,7 +38019,7 @@ "template": "http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2017-06-22T00:00:00.000Z", "startDate": "2017-06-14T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -38493,7 +38262,7 @@ "template": "http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png", "endDate": "2013-09-12T00:00:00.000Z", "startDate": "2013-09-12T00:00:00.000Z", - "scaleExtent": [5, 13], + "zoomExtent": [5, 13], "polygon": [ [ [-121.93555, 47.78206], @@ -38520,7 +38289,7 @@ "template": "http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [6.66668, 46.49441], @@ -38548,7 +38317,7 @@ "name": "LINZ NZ Aerial Imagery", "type": "tms", "template": "https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [167.25037, -47.21957], @@ -38638,7 +38407,7 @@ "name": "LINZ NZ Topo50 Gridless Maps", "type": "tms", "template": "https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [167.25037, -47.21957], @@ -38729,7 +38498,7 @@ "template": "https://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2010-01-01T00:00:00.000Z", - "scaleExtent": [4, 18], + "zoomExtent": [4, 18], "polygon": [ [ [26.21384, 55.85075], @@ -38845,7 +38614,7 @@ "name": "Locator Overlay", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ", - "scaleExtent": [0, 16], + "zoomExtent": [0, 16], "overzoom": false, "terms_url": "https://www.mapbox.com/about/maps", "terms_text": "Terms & Feedback", @@ -38929,7 +38698,7 @@ "projection": "EPSG:4326", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [19.55046, 51.68509], @@ -39000,7 +38769,7 @@ "projection": "EPSG:4326", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2017-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [19.55046, 51.68509], @@ -39070,7 +38839,7 @@ "template": "http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-1.48638, 46.87691], @@ -39408,7 +39177,7 @@ "template": "https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2011-01-01T00:00:00.000Z", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-51.10903, -23.39275], @@ -39714,7 +39483,7 @@ "type": "wms", "template": "https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE", "projection": "EPSG:3857", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [159.00339, -31.48767], @@ -39769,7 +39538,7 @@ "type": "wms", "template": "https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE", "projection": "EPSG:3857", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [159.00339, -31.48767], @@ -39824,7 +39593,7 @@ "type": "wms", "template": "https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE", "projection": "EPSG:3857", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [159.00339, -31.48767], @@ -39879,7 +39648,7 @@ "type": "wms", "template": "https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE", "projection": "EPSG:3857", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [159.00339, -31.48767], @@ -39934,7 +39703,7 @@ "type": "wms", "template": "https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE", "projection": "EPSG:3857", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [159.00339, -31.48767], @@ -39989,7 +39758,7 @@ "type": "wms", "template": "https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE", "projection": "EPSG:3857", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [159.00339, -31.48767], @@ -40043,7 +39812,7 @@ "name": "LPI NSW Base Map", "type": "tms", "template": "https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}", - "scaleExtent": [1, 19], + "zoomExtent": [1, 19], "polygon": [ [ [140.99486, -28.95297], @@ -40082,7 +39851,7 @@ "name": "LPI NSW Imagery", "type": "tms", "template": "https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}", - "scaleExtent": [1, 21], + "zoomExtent": [1, 21], "polygon": [ [ [140.98687, -28.98878], @@ -40182,7 +39951,7 @@ "type": "wms", "template": "https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE", "projection": "EPSG:3857", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [140.98687, -28.98878], @@ -40281,7 +40050,7 @@ "name": "LPI NSW Topographic Map", "type": "tms", "template": "https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}", - "scaleExtent": [1, 16], + "zoomExtent": [1, 16], "polygon": [ [ [140.99884, -28.99924], @@ -40502,7 +40271,7 @@ "type": "wms", "template": "https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}", "projection": "EPSG:3857", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [129.00009, -31.68764], @@ -40538,7 +40307,7 @@ "type": "wms", "template": "https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [17, 22], + "zoomExtent": [17, 22], "polygon": [ [ [8.10355, 49.865], @@ -40575,7 +40344,7 @@ "name": "Mapbox Satellite", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "terms_url": "https://www.mapbox.com/about/maps", "terms_text": "Terms & Feedback", "default": true, @@ -41039,7 +40808,7 @@ "projection": "EPSG:3857", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-76.23413, 37.92037], @@ -41100,7 +40869,7 @@ "type": "wms", "template": "https://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-76.46299, 38.9808], @@ -41766,7 +41535,7 @@ "type": "wms", "template": "https://arcgisproxy.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade,naturvern_punkt&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [-10.95725, 71.60964], @@ -41831,7 +41600,7 @@ "type": "wms", "template": "https://arcgisproxy.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [31.90425, 70.43681], @@ -41932,7 +41701,7 @@ "name": "MML Background Map", "type": "tms", "template": "http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg", - "scaleExtent": [2, 19], + "zoomExtent": [2, 19], "polygon": [ [ [27.96569, 70.0988], @@ -42043,7 +41812,7 @@ "name": "MML Orthophoto", "type": "tms", "template": "http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg", - "scaleExtent": [2, 19], + "zoomExtent": [2, 19], "polygon": [ [ [27.96569, 70.0988], @@ -42155,7 +41924,7 @@ "name": "MML Topographic Map", "type": "tms", "template": "http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg", - "scaleExtent": [2, 19], + "zoomExtent": [2, 19], "polygon": [ [ [27.96569, 70.0988], @@ -42266,7 +42035,7 @@ "name": "MTBmap.no", "type": "tms", "template": "https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg", - "scaleExtent": [3, 14], + "zoomExtent": [3, 14], "polygon": [ [ [31.90425, 70.43681], @@ -42310,7 +42079,7 @@ "projection": "EPSG:3857", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [11, 22], + "zoomExtent": [11, 22], "polygon": [ [ [11.48878, 48.053], @@ -42381,7 +42150,7 @@ "template": "https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2017-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [19.73762, 41.30154], @@ -42403,7 +42172,7 @@ "template": "https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2017-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [19.70226, 41.1404], @@ -42487,7 +42256,7 @@ "template": "http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png", "endDate": "2012-10-01T00:00:00.000Z", "startDate": "2012-10-01T00:00:00.000Z", - "scaleExtent": [1, 13], + "zoomExtent": [1, 13], "polygon": [ [ [-6.92922, 13.78574], @@ -42514,7 +42283,7 @@ "projection": "EPSG:3857", "endDate": "2015-05-03T00:00:00.000Z", "startDate": "2015-03-29T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-74.86599, 40.08543], @@ -42611,7 +42380,7 @@ "projection": "EPSG:3857", "endDate": "2015-05-03T00:00:00.000Z", "startDate": "2015-03-29T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-74.86599, 40.08543], @@ -42706,7 +42475,7 @@ "type": "tms", "template": "https://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [0, 15], + "zoomExtent": [0, 15], "polygon": [ [ [120.45706, 26.39706], @@ -42857,7 +42626,7 @@ "name": "Nomes de Ruas IBGE Salvador-BA", "type": "tms", "template": "https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-38.48974, -12.81113], @@ -42881,7 +42650,7 @@ "name": "Nordic snowmobile overlay", "type": "tms", "template": "https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png", - "scaleExtent": [3, 18], + "zoomExtent": [3, 18], "polygon": [ [ [27.53173, 60.21799], @@ -42924,7 +42693,7 @@ "name": "Norway Orthophoto", "type": "tms", "template": "https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [11.53568, 58.86659], @@ -43090,7 +42859,7 @@ "type": "wms", "template": "http://npdwms.npd.no/NPD_FactMap.asp?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Surface_labels,Surface,Pipelines,Pipelines_labels,Fields_labels,Fields&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [6, 20], + "zoomExtent": [6, 20], "polygon": [ [ [8.51989, 57.6454], @@ -43126,7 +42895,7 @@ "type": "wms", "template": "https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [5, 13], + "zoomExtent": [5, 13], "polygon": [ [ [31.90425, 70.43681], @@ -43169,7 +42938,7 @@ "type": "wms", "template": "https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [6, 22], + "zoomExtent": [6, 22], "polygon": [ [ [31.90425, 70.43681], @@ -43212,7 +42981,7 @@ "type": "wms", "template": "https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [6, 22], + "zoomExtent": [6, 22], "polygon": [ [ [31.90425, 70.43681], @@ -43255,7 +43024,7 @@ "type": "wms", "template": "https://gis3.nve.no/map/services/Vindkraft/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_utbygd,Vindkraft_under_bygging,Vindkraftomrade_konsesjonsbehandling,Vindturbin_konsesjonsbehandling&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [6, 22], + "zoomExtent": [6, 22], "polygon": [ [ [31.90425, 70.43681], @@ -43300,7 +43069,7 @@ "projection": "EPSG:3857", "endDate": "2018-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-74.91231, 45.03606], @@ -43660,7 +43429,7 @@ "name": "OpenStreetMap (Belgian Style - Dutch)", "type": "tms", "template": "https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [ [ [5.47007, 49.49196], @@ -44173,7 +43942,7 @@ "name": "OpenStreetMap (Belgian Style - French)", "type": "tms", "template": "https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [ [ [5.47007, 49.49196], @@ -44686,7 +44455,7 @@ "name": "OpenStreetMap (Standard)", "type": "tms", "template": "https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "terms_url": "https://www.openstreetmap.org", "terms_text": "© OpenStreetMap contributors, CC-BY-SA", "default": true, @@ -44698,7 +44467,7 @@ "name": "OpenStreetMap GPS traces", "type": "tms", "template": "https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "terms_url": "https://www.openstreetmap.org/copyright", "terms_text": "© OpenStreetMap contributors", "terms_html": "GPS Direction: © OpenStreetMap contributors.", @@ -44711,7 +44480,7 @@ "name": "openstreetmap.hu orthophotos", "type": "tms", "template": "http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [18.8577, 47.44553], @@ -44917,7 +44686,7 @@ "template": "https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2010-07-02T00:00:00.000Z", "startDate": "2010-06-24T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -45159,7 +44928,7 @@ "template": "https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2013-07-20T00:00:00.000Z", "startDate": "2013-07-19T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -45401,7 +45170,7 @@ "template": "https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2016-08-16T00:00:00.000Z", "startDate": "2013-08-30T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -45643,7 +45412,7 @@ "template": "https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2017-06-22T00:00:00.000Z", "startDate": "2017-06-14T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -45934,7 +45703,7 @@ "projection": "EPSG:3857", "endDate": "2006-01-01T00:00:00.000Z", "startDate": "2004-01-01T00:00:00.000Z", - "scaleExtent": [14, 19], + "zoomExtent": [14, 19], "polygon": [ [ [-7.31278, 36.98391], @@ -46006,7 +45775,7 @@ "projection": "EPSG:3857", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [1, 20], + "zoomExtent": [1, 20], "polygon": [ [ [-7.38968, 37.19205], @@ -46099,7 +45868,7 @@ "name": "OS 1:25k historic (OSM)", "type": "tms", "template": "https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg", - "scaleExtent": [6, 17], + "zoomExtent": [6, 17], "polygon": [ [ [-6.45854, 49.90441], @@ -46395,7 +46164,7 @@ "name": "OS New Popular Edition historic", "type": "tms", "template": "https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png", - "scaleExtent": [6, 15], + "zoomExtent": [6, 15], "polygon": [ [ [-3.68466, 55.23744], @@ -46496,7 +46265,7 @@ "name": "OS OpenData Locator", "type": "tms", "template": "http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [-0.88639, 61.11666], @@ -46531,7 +46300,7 @@ "name": "OS OpenData StreetView", "type": "tms", "template": "https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png", - "scaleExtent": [1, 18], + "zoomExtent": [1, 18], "polygon": [ [ [-5.82929, 50.02297], @@ -46829,7 +46598,7 @@ "name": "OS Scottish Popular historic", "type": "tms", "template": "https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg", - "scaleExtent": [6, 15], + "zoomExtent": [6, 15], "polygon": [ [ [-6.37546, 57.1045], @@ -47125,7 +46894,7 @@ "name": "OSMIE Baronies", "type": "tms", "template": "https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [-6.32987, 52.38838], @@ -47219,7 +46988,7 @@ "name": "OSMIE Civil Parishes", "type": "tms", "template": "https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [-6.32987, 52.38838], @@ -47313,7 +47082,7 @@ "name": "OSMIE Dail Election Areas", "type": "tms", "template": "https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [-6.32987, 52.38838], @@ -47407,7 +47176,7 @@ "name": "OSMIE EDs", "type": "tms", "template": "https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [-6.32987, 52.38838], @@ -47501,7 +47270,7 @@ "name": "OSMIE Local Election Areas", "type": "tms", "template": "https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [-6.32987, 52.38838], @@ -47595,7 +47364,7 @@ "name": "OSMIE T.ie Land not in Counties", "type": "tms", "template": "https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png", - "scaleExtent": [2, 19], + "zoomExtent": [2, 19], "polygon": [ [ [-6.32987, 52.38838], @@ -47689,7 +47458,7 @@ "name": "OSMIE Townlands", "type": "tms", "template": "https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [-6.32987, 52.38838], @@ -47920,7 +47689,7 @@ "name": "Pangasinán/Bulacan (Philippines HiRes)", "type": "tms", "template": "https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png", - "scaleExtent": [12, 19], + "zoomExtent": [12, 19], "polygon": [ [ [120.33659, 15.98577], @@ -48517,7 +48286,7 @@ "name": "PDOK aerial imagery Beeldmateriaal.nl 25cm latest", "type": "tms", "template": "https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [3.14377, 51.35984], @@ -48661,7 +48430,7 @@ "name": "PNOA Spain", "type": "tms", "template": "https://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-17.88463, 28.44606], @@ -49352,7 +49121,7 @@ "type": "wms", "template": "http://wms.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [15.9751, 54.37092], @@ -49464,7 +49233,7 @@ "type": "wms", "template": "https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [21.53768, 50.01085], @@ -49497,7 +49266,7 @@ "type": "wms", "template": "https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [22.17224, 50.10121], @@ -49537,7 +49306,7 @@ "type": "wms", "template": "https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [23.29224, 50.09693], @@ -49612,7 +49381,7 @@ "type": "wms", "template": "https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [21.60041, 50.21025], @@ -49646,7 +49415,7 @@ "type": "wms", "template": "https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [22.18219, 50.17339], @@ -49684,7 +49453,7 @@ "type": "wms", "template": "https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [22.18219, 50.17339], @@ -49722,7 +49491,7 @@ "type": "wms", "template": "https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [22.017, 50.35811], @@ -49759,7 +49528,7 @@ "projection": "EPSG:3857", "endDate": "2018-01-01T00:00:00.000Z", "startDate": "2018-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [16.72794, 52.48838], @@ -49799,7 +49568,7 @@ "projection": "EPSG:3857", "endDate": "2014-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [16.72794, 52.48838], @@ -49839,7 +49608,7 @@ "projection": "EPSG:3857", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [16.72794, 52.48838], @@ -49877,7 +49646,7 @@ "type": "wms", "template": "http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [1, 20], + "zoomExtent": [1, 20], "polygon": [ [ [14.81232, 49.93089], @@ -49894,7 +49663,7 @@ "type": "wms", "template": "http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [1, 20], + "zoomExtent": [1, 20], "polygon": [ [ [14.30454, 49.99538], @@ -49945,7 +49714,7 @@ "type": "wms", "template": "http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [22.72268, 49.76885], @@ -49986,7 +49755,7 @@ "type": "wms", "template": "http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [22.72268, 49.76885], @@ -50026,7 +49795,7 @@ "name": "RABA-KGZ: Slovenia built-up areas", "type": "tms", "template": "http://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png", - "scaleExtent": [8, 19], + "zoomExtent": [8, 19], "polygon": [ [ [15.17101, 45.41273], @@ -50218,7 +49987,7 @@ "name": "RABA-KGZ: Slovenia farmland use", "type": "tms", "template": "http://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png", - "scaleExtent": [8, 19], + "zoomExtent": [8, 19], "polygon": [ [ [15.17101, 45.41273], @@ -50411,7 +50180,7 @@ "type": "wms", "template": "https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [13, 22], + "zoomExtent": [13, 22], "polygon": [ [ [-10.95725, 71.60964], @@ -50640,7 +50409,7 @@ "projection": "EPSG:3857", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [0, 13], + "zoomExtent": [0, 13], "polygon": [ [ [-42.30363, -22.43698], @@ -50658,7 +50427,7 @@ "name": "Route 500", "type": "tms", "template": "https://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png", - "scaleExtent": [12, 20], + "zoomExtent": [12, 20], "polygon": [ [ [-2.7, 43.9], @@ -51238,7 +51007,7 @@ "type": "wms", "template": "https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [18.84294, 50.32508], @@ -51298,7 +51067,7 @@ "type": "wms", "template": "http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [22.09538, 50.08157], @@ -51346,7 +51115,7 @@ "type": "wms", "template": "http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [22.09538, 50.08157], @@ -51395,7 +51164,7 @@ "template": "http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-66.15007, 18.35002], @@ -52338,7 +52107,7 @@ "name": "SDFE aerial imagery", "type": "tms", "template": "https://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [8.37439, 54.95517], @@ -52517,7 +52286,7 @@ "type": "wms", "template": "https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [8.37439, 54.95517], @@ -52694,7 +52463,7 @@ "type": "wms", "template": "https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [8.37439, 54.95517], @@ -52871,7 +52640,7 @@ "type": "wms", "template": "https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [8.37439, 54.95517], @@ -53048,7 +52817,7 @@ "type": "wms", "template": "https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [8.37439, 54.95517], @@ -53225,7 +52994,7 @@ "type": "wms", "template": "https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [8.37439, 54.95517], @@ -53426,7 +53195,7 @@ "type": "wms", "template": "https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [19.03103, 50.33933], @@ -53459,7 +53228,7 @@ "type": "wms", "template": "https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [19.03103, 50.33933], @@ -53805,7 +53574,7 @@ "template": "http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [6.71057, 46.54396], @@ -53833,7 +53602,7 @@ "name": "Slovakia Historic Maps", "type": "tms", "template": "http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 12], + "zoomExtent": [0, 12], "polygon": [ [ [16.81969, 47.49272], @@ -53850,7 +53619,7 @@ "name": "Snowmobile map Sweden", "type": "tms", "template": "https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png", - "scaleExtent": [5, 14], + "zoomExtent": [5, 14], "polygon": [ [ [12.80182, 55.19612], @@ -53888,7 +53657,7 @@ "template": "http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png", "endDate": "2017-03-01T00:00:00.000Z", "startDate": "2017-03-01T00:00:00.000Z", - "scaleExtent": [11, 20], + "zoomExtent": [11, 20], "polygon": [ [ [18.79273, 47.37079], @@ -54016,7 +53785,7 @@ "name": "South Africa CD:NGI Aerial", "type": "tms", "template": "http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg", - "scaleExtent": [1, 22], + "zoomExtent": [1, 22], "polygon": [ [ [17.83968, -32.79834], @@ -54326,7 +54095,7 @@ "template": "https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2011-01-01T00:00:00.000Z", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [ [ [10.38615, 46.68821], @@ -55295,299 +55064,272 @@ "template": "https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg", "endDate": "2014-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [ [ - [12.23442, 46.84254], - [12.24913, 46.82785], - [12.24913, 46.81945], - [12.25753, 46.81735], - [12.26173, 46.80686], - [12.26594, 46.80686], - [12.26804, 46.79637], - [12.26173, 46.79427], - [12.27014, 46.78587], - [12.27224, 46.76908], - [12.28485, 46.76698], - [12.29745, 46.7439], - [12.30166, 46.7439], - [12.30166, 46.7376], - [12.28695, 46.7376], - [12.23652, 46.72081], - [12.18819, 46.71451], - [12.16298, 46.70192], - [12.10835, 46.69353], - [12.08944, 46.68303], - [12.05792, 46.68093], - [12.04531, 46.67464], - [12.03481, 46.67464], - [12.03061, 46.68303], - [12.0096, 46.68303], - [11.98438, 46.66834], - [11.94866, 46.66414], - [11.93816, 46.65575], - [11.90874, 46.64525], - [11.89193, 46.64525], - [11.8457, 46.62846], - [11.82049, 46.62636], - [11.80998, 46.60748], - [11.79528, 46.60328], - [11.78897, 46.59069], - [11.78057, 46.58859], - [11.76586, 46.55501], - [11.75325, 46.54871], - [11.73855, 46.52982], - [11.73224, 46.52982], - [11.72384, 46.51513], - [11.71543, 46.51513], - [11.71333, 46.50254], - [11.70913, 46.50254], - [11.70913, 46.49624], - [11.69652, 46.48575], - [11.69442, 46.47735], - [11.66711, 46.47525], - [11.66711, 46.44587], - [11.6608, 46.44587], - [11.64399, 46.45846], - [11.63769, 46.45846], - [11.63349, 46.44587], - [11.62508, 46.44797], + [11.71495, 46.51227], + [11.69889, 46.50218], + [11.6672, 46.49647], + [11.64515, 46.49743], + [11.63849, 46.50051], + [11.63495, 46.49486], + [11.64297, 46.49346], + [11.65174, 46.48271], + [11.64536, 46.47189], + [11.64179, 46.47439], + [11.62679, 46.4708], + [11.62987, 46.46377], + [11.61882, 46.44325], + [11.61936, 46.43957], [11.62508, 46.43957], - [11.61878, 46.43957], - [11.61458, 46.42278], - [11.61037, 46.42278], - [11.61037, 46.41649], - [11.62508, 46.41229], - [11.62508, 46.3934], - [11.61458, 46.38291], - [11.60617, 46.38291], - [11.60407, 46.37241], - [11.58306, 46.37241], - [11.58306, 46.34932], - [11.55995, 46.32414], - [11.53894, 46.32834], - [11.53894, 46.34513], - [11.52423, 46.34723], - [11.50111, 46.34723], - [11.49901, 46.32834], - [11.48851, 46.33044], - [11.49271, 46.32204], - [11.41917, 46.32414], - [11.41707, 46.25278], - [11.35613, 46.24858], - [11.34773, 46.25698], - [11.34563, 46.26747], - [11.34143, 46.26747], - [11.33722, 46.25068], - [11.31201, 46.24858], - [11.30991, 46.25278], - [11.3015, 46.25278], - [11.2889, 46.24019], - [11.2889, 46.2234], - [11.25108, 46.2234], - [11.24898, 46.2129], - [11.16283, 46.215], - [11.16283, 46.24858], - [11.12711, 46.24858], - [11.13131, 46.25278], - [11.12291, 46.25488], - [11.12501, 46.29895], - [11.16283, 46.29895], - [11.16283, 46.36821], - [11.16703, 46.36821], - [11.16703, 46.38081], - [11.17543, 46.3871], - [11.17754, 46.3997], - [11.20485, 46.3997], - [11.20695, 46.42068], - [11.19014, 46.42068], - [11.19014, 46.42698], - [11.19435, 46.42698], - [11.19855, 46.44167], - [11.20485, 46.44587], - [11.20695, 46.47315], - [11.19014, 46.47525], - [11.18804, 46.48365], - [11.15232, 46.47525], - [11.08298, 46.47525], - [11.08088, 46.43537], - [11.04096, 46.42068], - [11.01154, 46.42068], - [10.99894, 46.44587], - [10.98843, 46.44587], - [10.98423, 46.45217], - [10.96952, 46.45217], - [10.96112, 46.48365], - [10.95691, 46.48365], - [10.95481, 46.49414], - [10.94851, 46.49624], - [10.94431, 46.50673], - [10.91069, 46.49624], - [10.90018, 46.49624], - [10.89808, 46.51093], - [10.85606, 46.50254], - [10.84135, 46.54241], - [10.86446, 46.54661], - [10.86236, 46.55081], - [10.76571, 46.54031], - [10.72158, 46.55081], - [10.59762, 46.55291], - [10.5619, 46.54871], - [10.53668, 46.55291], - [10.50096, 46.54871], - [10.48415, 46.55501], - [10.46314, 46.55501], - [10.47155, 46.5676], - [10.47365, 46.59069], - [10.47785, 46.59069], - [10.47785, 46.61797], - [10.46944, 46.62636], - [10.44843, 46.63476], - [10.42532, 46.62846], - [10.3938, 46.63056], - [10.3896, 46.64525], - [10.3812, 46.64735], - [10.3833, 46.66414], - [10.3791, 46.66834], - [10.3791, 46.69353], - [10.3854, 46.72081], - [10.3896, 46.72081], - [10.3938, 46.7376], - [10.41692, 46.75229], - [10.41692, 46.78587], - [10.42112, 46.79847], - [10.42532, 46.79847], - [10.42532, 46.80686], - [10.43373, 46.81106], - [10.43793, 46.79007], - [10.44423, 46.78377], - [10.44843, 46.7439], - [10.45264, 46.7439], - [10.45684, 46.72711], - [10.46104, 46.72711], - [10.46524, 46.71032], - [10.46944, 46.71032], - [10.47365, 46.67254], - [10.47995, 46.67044], - [10.48415, 46.65575], - [10.48836, 46.65575], - [10.48415, 46.62846], - [10.48836, 46.62846], - [10.48836, 46.62217], - [10.49886, 46.62007], - [10.52828, 46.62427], - [10.49886, 46.63056], - [10.49886, 46.64525], - [10.50516, 46.64316], - [10.49886, 46.66204], - [10.51777, 46.65785], - [10.58921, 46.66204], - [10.63123, 46.65365], - [10.79302, 46.65575], - [10.79723, 46.65155], - [10.88127, 46.65155], - [10.89178, 46.65785], - [10.9275, 46.66414], - [10.94431, 46.67464], - [10.98003, 46.67464], - [11.00104, 46.68303], - [11.02415, 46.68303], - [11.05147, 46.69772], - [11.12711, 46.70822], - [11.13971, 46.71242], - [11.14392, 46.71871], - [11.17543, 46.72081], - [11.19855, 46.7334], - [11.24898, 46.7355], - [11.25318, 46.72291], - [11.2952, 46.72921], - [11.30571, 46.70822], - [11.31831, 46.70822], - [11.33722, 46.71871], - [11.38555, 46.72081], - [11.43178, 46.7376], - [11.50952, 46.7439], - [11.54734, 46.75649], - [11.56835, 46.75649], - [11.58306, 46.76698], - [11.60617, 46.76908], - [11.61037, 46.77538], - [11.69862, 46.79427], - [11.71753, 46.79427], - [11.72174, 46.79007], - [11.73855, 46.75859], - [11.74905, 46.75019], - [11.76166, 46.70192], - [11.76586, 46.70192], - [11.78687, 46.71661], - [11.8331, 46.72291], - [11.86041, 46.7376], - [11.90874, 46.7439], - [11.92135, 46.75229], - [11.95286, 46.75859], - [11.95917, 46.76488], - [11.99489, 46.77538], - [12.00749, 46.77538], - [12.0096, 46.77958], - [12.03061, 46.78168], - [12.05792, 46.79427], - [12.09995, 46.79847], - [12.13566, 46.81316], - [12.15878, 46.81316], - [12.18609, 46.82785], - [12.21551, 46.83205], - [12.23442, 46.84254] + [11.62508, 46.44797], + [11.63349, 46.44587], + [11.63769, 46.45846], + [11.64399, 46.45846], + [11.6608, 46.44587], + [11.66711, 46.44587], + [11.66711, 46.47525], + [11.69442, 46.47735], + [11.69652, 46.48575], + [11.70913, 46.49624], + [11.70913, 46.50254], + [11.71333, 46.50254], + [11.71495, 46.51227] ], [ - [11.97388, 46.96637], - [11.99489, 46.96007], - [11.99489, 46.95587], - [12.0096, 46.95797], - [12.0117, 46.94748], - [12.0159, 46.94748], - [12.0117, 46.94118], - [12.018, 46.93908], - [12.02851, 46.92229], - [12.00749, 46.9118], - [11.97388, 46.9055], - [11.95707, 46.89501], - [11.91714, 46.88871], - [11.85831, 46.86982], - [11.8394, 46.86982], - [11.80158, 46.85303], - [11.76166, 46.84464], - [11.74905, 46.83415], - [11.68181, 46.81945], - [11.67971, 46.81526], - [11.6545, 46.81106], - [11.64399, 46.80476], - [11.63769, 46.80686], - [11.63139, 46.82155], - [11.62508, 46.82155], - [11.62298, 46.83205], - [11.61037, 46.84464], - [11.61668, 46.84884], - [11.61458, 46.85723], - [11.61037, 46.85723], - [11.61668, 46.86563], - [11.64609, 46.86563], - [11.68602, 46.88242], - [11.69022, 46.88871], - [11.74905, 46.89711], - [11.75325, 46.90341], - [11.78057, 46.9076], - [11.80158, 46.9202], - [11.8457, 46.92649], - [11.87722, 46.94118], - [11.89613, 46.94328], - [11.92135, 46.95797], - [11.96757, 46.96217], - [11.97388, 46.96637] + [11.61435, 46.41535], + [11.60161, 46.39731], + [11.60307, 46.38924], + [11.5932, 46.38265], + [11.56489, 46.38018], + [11.55878, 46.35076], + [11.55249, 46.34418], + [11.54423, 46.34483], + [11.53837, 46.35015], + [11.52445, 46.35502], + [11.47969, 46.36277], + [11.48052, 46.3551], + [11.46322, 46.34922], + [11.45556, 46.33396], + [11.42105, 46.32441], + [11.40517, 46.32387], + [11.39865, 46.31426], + [11.39994, 46.30709], + [11.39569, 46.3083], + [11.38188, 46.30052], + [11.36088, 46.29906], + [11.36078, 46.29682], + [11.38256, 46.29177], + [11.3871, 46.28143], + [11.39609, 46.27423], + [11.39862, 46.264], + [11.38756, 46.26029], + [11.37347, 46.2629], + [11.36836, 46.26135], + [11.35783, 46.26481], + [11.35495, 46.27564], + [11.33912, 46.28306], + [11.33379, 46.29049], + [11.33471, 46.2962], + [11.3129, 46.28256], + [11.31737, 46.27303], + [11.30645, 46.25786], + [11.29124, 46.2604], + [11.24743, 46.22933], + [11.20622, 46.2187], + [11.18267, 46.22496], + [11.17077, 46.23806], + [11.17994, 46.24434], + [11.18351, 46.25269], + [11.18935, 46.25354], + [11.19448, 46.2461], + [11.20029, 46.25566], + [11.16604, 46.26129], + [11.14885, 46.27904], + [11.13725, 46.28336], + [11.14293, 46.28934], + [11.15847, 46.29059], + [11.16439, 46.2986], + [11.1761, 46.30346], + [11.1847, 46.32104], + [11.18894, 46.32151], + [11.18696, 46.32673], + [11.1942, 46.33016], + [11.20204, 46.34212], + [11.19001, 46.35984], + [11.19263, 46.36578], + [11.20393, 46.36765], + [11.19792, 46.37232], + [11.21275, 46.39804], + [11.21345, 46.40675], + [11.20644, 46.4156], + [11.20485, 46.3997], + [11.17754, 46.3997], + [11.17543, 46.3871], + [11.16703, 46.38081], + [11.16703, 46.36821], + [11.16283, 46.36821], + [11.16283, 46.29895], + [11.12501, 46.29895], + [11.12291, 46.25488], + [11.13131, 46.25278], + [11.12711, 46.24858], + [11.16283, 46.24858], + [11.16283, 46.215], + [11.24898, 46.2129], + [11.25108, 46.2234], + [11.2889, 46.2234], + [11.2889, 46.24019], + [11.3015, 46.25278], + [11.30991, 46.25278], + [11.31201, 46.24858], + [11.33722, 46.25068], + [11.34143, 46.26747], + [11.34563, 46.26747], + [11.34773, 46.25698], + [11.35613, 46.24858], + [11.41707, 46.25278], + [11.41917, 46.32414], + [11.49271, 46.32204], + [11.48851, 46.33044], + [11.49901, 46.32834], + [11.50111, 46.34723], + [11.52423, 46.34723], + [11.53894, 46.34513], + [11.53894, 46.32834], + [11.55995, 46.32414], + [11.58306, 46.34932], + [11.58306, 46.37241], + [11.60407, 46.37241], + [11.60617, 46.38291], + [11.61458, 46.38291], + [11.62508, 46.3934], + [11.62508, 46.41229], + [11.61435, 46.41535] + ], + [ + [11.20663, 46.41745], + [11.21026, 46.4206], + [11.20347, 46.42682], + [11.21416, 46.43556], + [11.21634, 46.44255], + [11.20903, 46.45293], + [11.21419, 46.45807], + [11.21736, 46.45731], + [11.21886, 46.46199], + [11.21626, 46.47277], + [11.20939, 46.481], + [11.20876, 46.49346], + [11.19608, 46.50241], + [11.1924, 46.501], + [11.18686, 46.50734], + [11.18002, 46.49823], + [11.17014, 46.49635], + [11.16095, 46.4878], + [11.12934, 46.48058], + [11.1103, 46.49643], + [11.10449, 46.4948], + [11.08812, 46.50128], + [11.08173, 46.53021], + [11.05915, 46.51508], + [11.03795, 46.51357], + [11.05006, 46.50784], + [11.05773, 46.49235], + [11.06278, 46.4894], + [11.06894, 46.46619], + [11.07625, 46.45487], + [11.0778, 46.44569], + [11.07301, 46.44042], + [11.05394, 46.44849], + [11.0414, 46.44569], + [11.02817, 46.46116], + [11.00952, 46.46917], + [11.00462, 46.47607], + [10.98695, 46.48289], + [10.96543, 46.48103], + [10.96285, 46.47718], + [10.96952, 46.45217], + [10.98423, 46.45217], + [10.98843, 46.44587], + [10.99894, 46.44587], + [11.01154, 46.42068], + [11.04096, 46.42068], + [11.08088, 46.43537], + [11.08298, 46.47525], + [11.15232, 46.47525], + [11.18804, 46.48365], + [11.19014, 46.47525], + [11.20695, 46.47315], + [11.20485, 46.44587], + [11.19855, 46.44167], + [11.19435, 46.42698], + [11.19014, 46.42698], + [11.19014, 46.42068], + [11.20695, 46.42068], + [11.20663, 46.41745] + ], + [ + [10.47433, 46.55501], + [10.47617, 46.55749], + [10.47321, 46.56701], + [10.48305, 46.5777], + [10.48575, 46.58921], + [10.48221, 46.59199], + [10.48576, 46.59805], + [10.48291, 46.60512], + [10.49055, 46.61394], + [10.46952, 46.62628], + [10.47785, 46.61797], + [10.47785, 46.59069], + [10.47365, 46.59069], + [10.47155, 46.5676], + [10.46314, 46.55501], + [10.47433, 46.55501] + ], + [ + [10.46925, 46.62643], + [10.44632, 46.63989], + [10.40935, 46.63389], + [10.40011, 46.63648], + [10.39873, 46.6455], + [10.38946, 46.65862], + [10.39057, 46.67089], + [10.3803, 46.68399], + [10.38615, 46.68821], + [10.39201, 46.69016], + [10.40215, 46.70624], + [10.41274, 46.70821], + [10.41622, 46.71479], + [10.4168, 46.71847], + [10.39934, 46.73435], + [10.43464, 46.75356], + [10.44107, 46.75413], + [10.44011, 46.77149], + [10.42123, 46.78861], + [10.42845, 46.79755], + [10.43626, 46.79843], + [10.43373, 46.81106], + [10.42532, 46.80686], + [10.42532, 46.79847], + [10.42112, 46.79847], + [10.41692, 46.78587], + [10.41692, 46.75229], + [10.3938, 46.7376], + [10.3896, 46.72081], + [10.3854, 46.72081], + [10.3791, 46.69353], + [10.3791, 46.66834], + [10.3833, 46.66414], + [10.3812, 46.64735], + [10.3896, 46.64525], + [10.3938, 46.63056], + [10.42532, 46.62846], + [10.44843, 46.63476], + [10.46925, 46.62643] ] ], "terms_url": "https://geoservices.buergernetz.bz.it/geokatalog/", - "terms_text": "© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0", - "best": true + "terms_text": "© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0" }, { "id": "South-Tyrol-Orthofoto-2014-2015", @@ -55596,7 +55338,7 @@ "template": "https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg", "endDate": "2015-11-01T00:00:00.000Z", "startDate": "2014-07-01T00:00:00.000Z", - "scaleExtent": [0, 18], + "zoomExtent": [0, 18], "polygon": [ [ [10.38615, 46.68821], @@ -56079,7 +55821,7 @@ "name": "South Tyrol Topomap", "type": "tms", "template": "https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [10.38615, 46.68821], @@ -57519,7 +57261,7 @@ "type": "wms", "template": "https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [31.90425, 70.43681], @@ -57562,7 +57304,7 @@ "type": "wms", "template": "https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [31.90425, 70.43681], @@ -57606,7 +57348,7 @@ "template": "https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2016-01-01T00:00:00.000Z", "startDate": "2016-01-01T00:00:00.000Z", - "scaleExtent": [8, 21], + "zoomExtent": [8, 21], "polygon": [ [ [7.29431, 46.92376], @@ -57709,7 +57451,7 @@ "template": "https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [14, 19], + "zoomExtent": [14, 19], "polygon": [ [ [7.3807, 47.00952], @@ -57780,7 +57522,7 @@ "template": "https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2008-01-01T00:00:00.000Z", "startDate": "2008-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [8.68, 47.32], @@ -57799,7 +57541,7 @@ "template": "https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2011-01-01T00:00:00.000Z", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [8.44624, 47.44143], @@ -57816,7 +57558,7 @@ "name": "Stadtplan Zürich", "type": "tms", "template": "https://mapproxy.osm.ch/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [8.56681, 47.34713], @@ -58302,7 +58044,7 @@ "name": "Stamen Terrain", "type": "tms", "template": "https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/terrain-background/{zoom}/{x}/{y}.jpg", - "scaleExtent": [4, 18], + "zoomExtent": [4, 18], "terms_url": "http://maps.stamen.com/#terrain", "terms_text": "Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL", "icon": "https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png" @@ -58314,7 +58056,7 @@ "template": "https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png", "endDate": "2009-01-01T00:00:00.000Z", "startDate": "2007-01-01T00:00:00.000Z", - "scaleExtent": [8, 21], + "zoomExtent": [8, 21], "polygon": [ [ [-0.75248, 51.08219], @@ -58447,7 +58189,7 @@ "projection": "EPSG:4326", "endDate": "2008-01-01T00:00:00.000Z", "startDate": "2008-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [18.92818, 50.32151], @@ -58496,7 +58238,7 @@ "projection": "EPSG:4326", "endDate": "2009-01-01T00:00:00.000Z", "startDate": "2009-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [18.92818, 50.32151], @@ -58545,7 +58287,7 @@ "projection": "EPSG:4326", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [18.92818, 50.32151], @@ -58593,7 +58335,7 @@ "template": "http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2011-01-01T00:00:00.000Z", - "scaleExtent": [10, 22], + "zoomExtent": [10, 22], "polygon": [ [ [20.14599, 46.22811], @@ -58661,7 +58403,7 @@ "name": "Taiwan e-Map Open Data", "type": "tms", "template": "https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}", - "scaleExtent": [0, 15], + "zoomExtent": [0, 15], "polygon": [ [ [120.45706, 26.39706], @@ -59110,7 +58852,7 @@ "id": "TEClines", "name": "TEC bus lines", "type": "wms", - "template": "https://geodata.tec-wl.be/arcgis/rest/services/Lignes/MapServer/export?f=image&format=png8&transparent=True&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}", + "template": "https://geodata.tec-wl.be/arcgis/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", "polygon": [ [ @@ -59169,7 +58911,7 @@ "id": "TECstops", "name": "TEC bus stops", "type": "wms", - "template": "https://geodata.tec-wl.be/arcgis/rest/services/Poteaux/MapServer/export?f=image&format=png8&transparent=True&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}", + "template": "https://geodata.tec-wl.be/arcgis/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", "polygon": [ [ @@ -59277,7 +59019,7 @@ "type": "tms", "template": "https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-99.99854, 34.56018], @@ -59317,7 +59059,7 @@ "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw", "endDate": "2017-01-01T00:00:00.000Z", "startDate": "2017-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [-124.76179, 48.41301], @@ -59464,7 +59206,7 @@ "type": "wms", "template": "https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien 20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [15, 22], + "zoomExtent": [15, 22], "polygon": [ [ [10.43998, 47.59768], @@ -60682,7 +60424,7 @@ "template": "https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png", "endDate": "2010-07-20T00:00:00.000Z", "startDate": "2013-07-19T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [5.96175, 50.17631], @@ -61262,7 +61004,7 @@ "projection": "EPSG:3857", "endDate": "2007-01-01T00:00:00.000Z", "startDate": "2007-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [1.192, 43.63288], @@ -61359,7 +61101,7 @@ "projection": "EPSG:3857", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2011-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [1.11351, 43.68676], @@ -61430,7 +61172,7 @@ "projection": "EPSG:3857", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [1.11351, 43.68676], @@ -61501,7 +61243,7 @@ "projection": "EPSG:3857", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [1.11351, 43.68676], @@ -61571,7 +61313,7 @@ "template": "http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2008-01-01T00:00:00.000Z", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [0.54575, 47.46526], @@ -61733,7 +61475,7 @@ "template": "http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", - "scaleExtent": [0, 22], + "zoomExtent": [0, 22], "polygon": [ [ [0.77512, 47.32983], @@ -61858,7 +61600,7 @@ "type": "wms", "template": "http://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [7, 20], + "zoomExtent": [7, 20], "polygon": [ [ [12.80182, 55.19612], @@ -61894,7 +61636,7 @@ "type": "wms", "template": "https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [13, 20], + "zoomExtent": [13, 20], "polygon": [ [ [12.80182, 55.19612], @@ -61930,7 +61672,7 @@ "type": "wms", "template": "https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", - "scaleExtent": [3, 20], + "zoomExtent": [3, 20], "polygon": [ [ [12.80182, 55.19612], @@ -61965,7 +61707,7 @@ "name": "Trafikverket Street Names", "type": "tms", "template": "https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png", - "scaleExtent": [15, 19], + "zoomExtent": [15, 19], "polygon": [ [ [12.80182, 55.19612], @@ -62000,7 +61742,7 @@ "name": "U.S. Forest Roads Overlay", "type": "tms", "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA", - "scaleExtent": [0, 20], + "zoomExtent": [0, 20], "polygon": [ [ [-124.76179, 48.41301], @@ -62135,7 +61877,7 @@ "name": "U.S. Forest Service roads", "type": "tms", "template": "https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-124.76179, 48.41301], @@ -62267,7 +62009,7 @@ "name": "Übersichtsplan Zürich", "type": "tms", "template": "https://mapproxy.osm.ch/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw", - "scaleExtent": [0, 21], + "zoomExtent": [0, 21], "polygon": [ [ [8.45788, 47.44582], @@ -62300,7 +62042,7 @@ "template": "http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg", "endDate": "2014-01-01T00:00:00.000Z", "startDate": "2014-01-01T00:00:00.000Z", - "scaleExtent": [0, 16], + "zoomExtent": [0, 16], "polygon": [ [ [30.30752, 50.57184], @@ -62474,7 +62216,7 @@ "template": "http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", - "scaleExtent": [0, 16], + "zoomExtent": [0, 16], "polygon": [ [ [23.6193, 51.65491], @@ -63554,7 +63296,7 @@ "name": "USGS Large Scale Imagery", "type": "tms", "template": "http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg", - "scaleExtent": [12, 20], + "zoomExtent": [12, 20], "polygon": [ [ [-123.25493, 48.7529], @@ -64618,7 +64360,7 @@ "name": "USGS Topographic Maps", "type": "tms", "template": "https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png", - "scaleExtent": [0, 16], + "zoomExtent": [0, 16], "polygon": [ [ [-55.99594, 52.00107], @@ -64788,7 +64530,7 @@ "name": "Vector Streetmap for San Juan County WA", "type": "tms", "template": "https://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [-123.27402, 48.69297], @@ -64814,7 +64556,7 @@ "template": "http://wms.openstreetmap.fr/tms/1.0.0/PNRVercors-RHP-1999/{zoom}/{x}/{y}", "endDate": "1999-01-01T00:00:00.000Z", "startDate": "1999-01-01T00:00:00.000Z", - "scaleExtent": [0, 19], + "zoomExtent": [0, 19], "polygon": [ [ [5.43565, 44.99918], @@ -64915,7 +64657,7 @@ "name": "Vienna: Beschriftungen (annotations)", "type": "tms", "template": "https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png", - "scaleExtent": [12, 19], + "zoomExtent": [12, 19], "polygon": [ [ [16.54475, 48.17286], @@ -65014,7 +64756,7 @@ "name": "Vienna: Mehrzweckkarte (general purpose)", "type": "tms", "template": "https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg", - "scaleExtent": [10, 19], + "zoomExtent": [10, 19], "polygon": [ [ [16.54475, 48.17286], @@ -65112,7 +64854,7 @@ "name": "Vienna: Orthofoto (aerial image)", "type": "tms", "template": "https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg", - "scaleExtent": [10, 19], + "zoomExtent": [10, 19], "polygon": [ [ [16.14995, 48.10832], @@ -65137,7 +64879,7 @@ "template": "http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png", "endDate": "2010-01-01T00:00:00.000Z", "startDate": "2010-01-01T00:00:00.000Z", - "scaleExtent": [14, 20], + "zoomExtent": [14, 20], "polygon": [ [ [6.24859, 46.38252], @@ -65897,7 +65639,7 @@ "projection": "EPSG:3857", "endDate": "2015-01-01T00:00:00.000Z", "startDate": "2015-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [17.14217, 51.12846], @@ -66009,7 +65751,7 @@ "projection": "EPSG:4326", "endDate": "2011-01-01T00:00:00.000Z", "startDate": "2011-01-01T00:00:00.000Z", - "scaleExtent": [0, 23], + "zoomExtent": [0, 23], "polygon": [ [ [18.74396, 50.2753], diff --git a/data/update_imagery.js b/data/update_imagery.js index ca2e255ca..fbf604950 100644 --- a/data/update_imagery.js +++ b/data/update_imagery.js @@ -116,7 +116,7 @@ sources.concat(whitelist).forEach(function(source) { var extent = source.extent || {}; if (extent.min_zoom || extent.max_zoom) { - im.scaleExtent = [ + im.zoomExtent = [ extent.min_zoom || 0, extent.max_zoom || 22 ]; diff --git a/modules/renderer/background_source.js b/modules/renderer/background_source.js index 76eba00af..f580a6742 100644 --- a/modules/renderer/background_source.js +++ b/modules/renderer/background_source.js @@ -48,7 +48,7 @@ export function rendererBackgroundSource(data) { var best = !!source.best; var template = source.template; - source.scaleExtent = data.scaleExtent || [0, 22]; + source.zoomExtent = data.zoomExtent || [0, 22]; source.overzoom = data.overzoom !== false; @@ -171,8 +171,8 @@ export function rendererBackgroundSource(data) { source.validZoom = function(z) { - return source.scaleExtent[0] <= z && - (source.overzoom || source.scaleExtent[1] > z); + return source.zoomExtent[0] <= z && + (source.overzoom || source.zoomExtent[1] > z); }; @@ -347,13 +347,13 @@ rendererBackgroundSource.Esri = function(data) { } // if any tiles are missing at level 20 we restrict maxZoom to 19 - esri.scaleExtent[1] = (hasTiles ? 22 : 19); + esri.zoomExtent[1] = (hasTiles ? 22 : 19); }); }; esri.getMetadata = function(center, tileCoord, callback) { var tileId = tileCoord.slice(0, 3).join('/'); - var zoom = Math.min(tileCoord[2], esri.scaleExtent[1]); + var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]); var centerPoint = center[0] + ',' + center[1]; // long, lat (as it should be) var unknown = t('info_panels.background.unknown'); var metadataLayer; diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index c30ee2c3e..d7d93bef3 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -271,7 +271,7 @@ export function rendererTileLayer(context) { if (!arguments.length) return _source; _source = _; _cache = {}; - tiler.scaleExtent(_source.scaleExtent); + tiler.zoomExtent(_source.zoomExtent); return background; }; diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index ddf72eabc..b73db8b71 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -28,7 +28,7 @@ var viewerjs = 'mapillary-js/mapillary.min.js'; var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi'; var maxResults = 1000; var tileZoom = 14; -var tiler = utilTiler().skipNullIsland(true); +var tiler = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true); var dispatch = d3_dispatch('loadedImages', 'loadedSigns'); var _mlyFallback = false; var _mlyCache; @@ -54,7 +54,7 @@ function maxPageAtZoom(z) { function loadTiles(which, url, projection) { var currZoom = Math.floor(geoScaleToZoom(projection.scale())); - var tiles = tiler.getTiles(projection, tileZoom); + var tiles = tiler.getTiles(projection); // abort inflight requests that are no longer needed var cache = _mlyCache[which]; diff --git a/modules/services/openstreetcam.js b/modules/services/openstreetcam.js index 4c0c4cd28..40044e8ca 100644 --- a/modules/services/openstreetcam.js +++ b/modules/services/openstreetcam.js @@ -35,7 +35,7 @@ import { var apibase = 'https://openstreetcam.org'; var maxResults = 1000; var tileZoom = 14; -var tiler = utilTiler().skipNullIsland(true); +var tiler = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true); var dispatch = d3_dispatch('loadedImages'); var imgZoom = d3_zoom() .extent([[0, 0], [320, 240]]) @@ -63,7 +63,7 @@ function maxPageAtZoom(z) { function loadTiles(which, url, projection) { var currZoom = Math.floor(geoScaleToZoom(projection.scale())); - var tiles = tiler.getTiles(projection, tileZoom); + var tiles = tiler.getTiles(projection); // abort inflight requests that are no longer needed var cache = _oscCache[which]; diff --git a/modules/services/osm.js b/modules/services/osm.js index 4a3c0bc5c..31dd39703 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -769,7 +769,7 @@ export default { var path = '/api/0.6/map?bbox='; // determine the needed tiles to cover the view - var tiles = tiler.getTiles(projection, _tileZoom); + var tiles = tiler.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection); // abort inflight requests that are no longer needed var hadRequests = !_isEmpty(_tileCache.inflight); @@ -809,7 +809,7 @@ export default { // Load notes from the API in tiles // GET /api/0.6/notes?bbox= loadNotes: function(projection, noteOptions) { - noteOptions = _extend({ limit: 10000, closed: 7}, noteOptions); + noteOptions = _extend({ limit: 10000, closed: 7 }, noteOptions); if (_off) return; var that = this; @@ -821,7 +821,7 @@ export default { }, 750); // determine the needed tiles to cover the view - var tiles = tiler.getTiles(projection, _noteZoom); + var tiles = tiler.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection); // abort inflight requests that are no longer needed abortUnwantedRequests(_noteCache, tiles); diff --git a/modules/services/streetside.js b/modules/services/streetside.js index 39d5f7990..8a0cd1b1e 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -41,7 +41,7 @@ var pannellumViewerCSS = 'pannellum-streetside/pannellum.css'; var pannellumViewerJS = 'pannellum-streetside/pannellum.js'; var maxResults = 2000; var tileZoom = 16.5; -var tiler = utilTiler().skipNullIsland(true); +var tiler = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true); var dispatch = d3_dispatch('loadedBubbles', 'viewerChanged'); var minHfov = 10; // zoom in degrees: 20, 10, 5 var maxHfov = 90; // zoom out degrees @@ -81,7 +81,7 @@ function localeTimestamp(s) { * loadTiles() wraps the process of generating tiles and then fetching image points for each tile. */ function loadTiles(which, url, projection, margin) { - var tiles = tiler.margin(margin).getTiles(projection, tileZoom); + var tiles = tiler.margin(margin).getTiles(projection); // abort inflight requests that are no longer needed var cache = _ssCache[which]; diff --git a/modules/util/tiler.js b/modules/util/tiler.js index a869a3472..03686c9c9 100644 --- a/modules/util/tiler.js +++ b/modules/util/tiler.js @@ -1,18 +1,19 @@ import { range as d3_range } from 'd3-array'; -import { geoExtent } from '../geo'; +import { geoExtent, geoScaleToZoom } from '../geo'; export function utilTiler() { - var _size = [960, 500]; + var _size = [256, 256]; var _scale = 256; - var _scaleExtent = [0, 20]; + var _tileSize = 256; + var _zoomExtent = [0, 20]; var _translate = [_size[0] / 2, _size[1] / 2]; var _margin = 0; var _skipNullIsland = false; function bound(val) { - return Math.min(_scaleExtent[1], Math.max(_scaleExtent[0], val)); + return Math.min(_zoomExtent[1], Math.max(_zoomExtent[0], val)); } @@ -32,7 +33,7 @@ export function utilTiler() { function tiler() { - var z = Math.max(Math.log(_scale) / Math.LN2 - 8, 0); + var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize); var z0 = bound(Math.round(z)); var k = Math.pow(2, z - z0 + 8); var origin = [ @@ -72,27 +73,23 @@ export function utilTiler() { /** - * getTiles() returns array of d3 geo tiles. - * Using d3.geo.tiles.js from lib, gets tile extents for each grid tile in a grid created from - * an area around (and including) the current map view extents. + * getTiles() returns an array of tiles that cover the map view */ - tiler.getTiles = function(projection, tilezoom) { - var dimensions = projection.clipExtent()[1]; - var s = projection.scale() * 2 * Math.PI; - var z = Math.max(Math.log(s) / Math.log(2) - 8, 0); - var ts = 256 * Math.pow(2, z - tilezoom); + tiler.getTiles = function(projection) { var origin = [ - s / 2 - projection.translate()[0], - s / 2 - projection.translate()[1] + projection.scale() * Math.PI - projection.translate()[0], + projection.scale() * Math.PI - projection.translate()[1] ]; this - .scaleExtent([tilezoom, tilezoom]) - .scale(s) - .size(dimensions) + .size(projection.clipExtent()[1]) + .scale(projection.scale() * 2 * Math.PI) .translate(projection.translate()); - return tiler() + var tiles = tiler(); + var ts = tiles.scale; + + return tiles .map(function(tile) { if (_skipNullIsland && nearNullIsland(tile)) { return false; @@ -111,9 +108,16 @@ export function utilTiler() { }; - tiler.scaleExtent = function(val) { - if (!arguments.length) return _scaleExtent; - _scaleExtent = val; + tiler.tileSize = function(val) { + if (!arguments.length) return _tileSize; + _tileSize = val; + return tiler; + }; + + + tiler.zoomExtent = function(val) { + if (!arguments.length) return _zoomExtent; + _zoomExtent = val; return tiler; }; diff --git a/test/spec/renderer/background_source.js b/test/spec/renderer/background_source.js index 2828bdf0c..2289676a4 100644 --- a/test/spec/renderer/background_source.js +++ b/test/spec/renderer/background_source.js @@ -44,28 +44,28 @@ describe('iD.rendererBackgroundSource', function() { }); it('correctly displays an overlay with no overzoom specified', function() { - var source = iD.rendererBackgroundSource({ scaleExtent: [6,16] }); + var source = iD.rendererBackgroundSource({ zoomExtent: [6,16] }); expect(source.validZoom(10)).to.be.true; expect(source.validZoom(3)).to.be.false; expect(source.validZoom(17)).to.be.true; }); it('correctly displays an overlay with an invalid overzoom', function() { - var source = iD.rendererBackgroundSource({ scaleExtent: [6,16], overzoom: 'gibberish'}); + var source = iD.rendererBackgroundSource({ zoomExtent: [6,16], overzoom: 'gibberish'}); expect(source.validZoom(10)).to.be.true; expect(source.validZoom(3)).to.be.false; expect(source.validZoom(17)).to.be.true; }); it('correctly displays an overlay with overzoom:true', function() { - var source = iD.rendererBackgroundSource({ scaleExtent: [6,16], overzoom: true}); + var source = iD.rendererBackgroundSource({ zoomExtent: [6,16], overzoom: true}); expect(source.validZoom(10)).to.be.true; expect(source.validZoom(3)).to.be.false; expect(source.validZoom(17)).to.be.true; }); it('correctly displays an overlay with overzoom:false', function() { - var source = iD.rendererBackgroundSource({ scaleExtent: [6,16], overzoom: false}); + var source = iD.rendererBackgroundSource({ zoomExtent: [6,16], overzoom: false}); expect(source.validZoom(10)).to.be.true; expect(source.validZoom(3)).to.be.false; expect(source.validZoom(17)).to.be.false; From 52dc6c280fab25c77c1daaa6b373009459c81cf1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 22 Jul 2018 01:43:56 -0400 Subject: [PATCH 054/217] Preparation for non-256px tileSizes in sources --- modules/renderer/background_source.js | 6 +++--- modules/renderer/tile_layer.js | 13 +++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/renderer/background_source.js b/modules/renderer/background_source.js index f580a6742..005500a9a 100644 --- a/modules/renderer/background_source.js +++ b/modules/renderer/background_source.js @@ -48,10 +48,10 @@ export function rendererBackgroundSource(data) { var best = !!source.best; var template = source.template; + source.tileSize = data.tileSize || 256; source.zoomExtent = data.zoomExtent || [0, 22]; source.overzoom = data.overzoom !== false; - source.offset = function(_) { if (!arguments.length) return offset; offset = _; @@ -133,8 +133,8 @@ export function rendererBackgroundSource(data) { var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]); var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]); return template - .replace('{width}', 256) - .replace('{height}', 256) + .replace('{width}', this.tileSize) + .replace('{height}', this.tileSize) .replace('{proj}', this.projection) .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y); } diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index d7d93bef3..03af506d6 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -6,10 +6,10 @@ import { utilPrefixCSSProperty, utilTiler } from '../util'; export function rendererTileLayer(context) { - var tileSize = 256; var transformProp = utilPrefixCSSProperty('Transform'); var tiler = utilTiler(); + var _tileSize = 256; var _projection; var _cache = {}; var _tileOrigin; @@ -19,7 +19,7 @@ export function rendererTileLayer(context) { function tileSizeAtZoom(d, z) { var EPSILON = 0.002; - return ((tileSize * Math.pow(2, z - d[2])) / tileSize) + EPSILON; + return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON; } @@ -64,7 +64,7 @@ export function rendererTileLayer(context) { // Update tiles based on current state of `projection`. function background(selection) { - _zoom = geoScaleToZoom(_projection.scale(), tileSize); + _zoom = geoScaleToZoom(_projection.scale(), _tileSize); var pixelOffset; if (_source) { @@ -140,7 +140,7 @@ export function rendererTileLayer(context) { } function imageTransform(d) { - var ts = tileSize * Math.pow(2, _zoom - d[2]); + var ts = _tileSize * Math.pow(2, _zoom - d[2]); var scale = tileSizeAtZoom(d, _zoom); return 'translate(' + ((d[0] * ts) - _tileOrigin[0]) + 'px,' + @@ -149,7 +149,7 @@ export function rendererTileLayer(context) { } function tileCenter(d) { - var ts = tileSize * Math.pow(2, _zoom - d[2]); + var ts = _tileSize * Math.pow(2, _zoom - d[2]); return [ ((d[0] * ts) - _tileOrigin[0] + (ts / 2)), ((d[1] * ts) - _tileOrigin[1] + (ts / 2)) @@ -270,8 +270,9 @@ export function rendererTileLayer(context) { background.source = function(_) { if (!arguments.length) return _source; _source = _; + _tileSize = _source.tileSize; _cache = {}; - tiler.zoomExtent(_source.zoomExtent); + tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent); return background; }; From ac27cbd67d944d1f2f20ca9422b7392cc8dcafeb Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 22 Jul 2018 02:50:49 -0400 Subject: [PATCH 055/217] Add support for 512px Mapbox Satellite tiles The tiler and projection are still not aware of the 512px size. This results in fetching 512px images but placing them in the 256px slippy map and scalling them down. (This is dumb but at least they look nicer than before) --- data/imagery.json | 104 ++++++++++++++++++++++++++++++++- data/update_imagery.js | 9 ++- modules/renderer/tile_layer.js | 3 +- 3 files changed, 113 insertions(+), 3 deletions(-) diff --git a/data/imagery.json b/data/imagery.json index 8716aaeca..b1c9998e8 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -38932,6 +38932,107 @@ "terms_url": "http://data2.loire-atlantique.fr/licences/", "terms_text": "Département de Loire-Atlantique" }, + { + "id": "Loire_Atlantique-Orthophotos-2016", + "name": "Loire-Atlantique - Orthophotos 2016 - 10 cm", + "type": "wms", + "template": "https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "projection": "EPSG:3857", + "endDate": "2016-01-01T00:00:00.000Z", + "startDate": "2016-01-01T00:00:00.000Z", + "zoomExtent": [0, 20], + "polygon": [ + [ + [-1.48638, 46.87691], + [-1.54437, 46.84873], + [-1.73468, 46.87246], + [-1.89276, 46.94234], + [-1.95475, 46.98084], + [-2.07067, 47.08521], + [-2.2678, 47.12656], + [-2.22627, 47.17124], + [-2.19217, 47.16914], + [-2.19341, 47.25546], + [-2.29694, 47.22769], + [-2.41658, 47.25336], + [-2.54862, 47.28575], + [-2.63913, 47.41678], + [-2.50573, 47.50812], + [-2.31063, 47.53021], + [-2.24836, 47.52384], + [-2.23223, 47.51499], + [-2.12109, 47.54674], + [-2.11783, 47.60126], + [-2.1001, 47.61123], + [-2.09981, 47.62005], + [-2.11141, 47.62873], + [-2.10055, 47.65141], + [-2.08121, 47.66578], + [-1.98016, 47.70751], + [-1.83077, 47.72419], + [-1.67455, 47.72544], + [-1.63735, 47.77463], + [-1.49601, 47.81752], + [-1.49911, 47.84166], + [-1.38133, 47.84415], + [-1.346, 47.81086], + [-1.23007, 47.78587], + [-1.21643, 47.75838], + [-1.22635, 47.73628], + [-1.21086, 47.7317], + [-1.18668, 47.73462], + [-1.15196, 47.69332], + [-1.13151, 47.63654], + [-1.09121, 47.6332], + [-0.99265, 47.6027], + [-0.98459, 47.58598], + [-1.0317, 47.55001], + [-1.13585, 47.55628], + [-1.13275, 47.5161], + [-1.0317, 47.51778], + [-0.94863, 47.50103], + [-0.93686, 47.47715], + [-0.93376, 47.43859], + [-0.9009, 47.39874], + [-0.92694, 47.37482], + [-0.97157, 47.35845], + [-1.28339, 47.32736], + [-1.23379, 47.26093], + [-1.20032, 47.26935], + [-1.16498, 47.24957], + [-1.14143, 47.1763], + [-1.1563, 47.15818], + [-1.20652, 47.12402], + [-1.20838, 47.10968], + [-1.15568, 47.10504], + [-1.14081, 47.08056], + [-1.09431, 47.0717], + [-1.09989, 47.03199], + [-1.14453, 47.01636], + [-1.21582, 47.02904], + [-1.26727, 47.06325], + [-1.28524, 47.02185], + [-1.34972, 47.02397], + [-1.33918, 46.969], + [-1.3491, 46.94446], + [-1.45014, 46.91186], + [-1.47504, 46.9176], + [-1.48775, 46.93063], + [-1.49235, 46.98433], + [-1.48644, 46.99943], + [-1.49213, 47.02722], + [-1.52764, 47.00541], + [-1.52961, 46.97252], + [-1.50507, 46.94439], + [-1.50222, 46.92973], + [-1.51142, 46.91371], + [-1.48622, 46.89724], + [-1.48638, 46.87691] + ] + ], + "terms_url": "http://data2.loire-atlantique.fr/licences/", + "terms_text": "© Loire-Atlantique ouverture des données publiques" + }, { "id": "Lombardia-Italy-CTR-DBT", "name": "Lombardia - Italy (CTR DBT)", @@ -40343,7 +40444,8 @@ "id": "Mapbox", "name": "Mapbox Satellite", "type": "tms", - "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ", + "template": "https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ", + "tileSize": 512, "zoomExtent": [0, 22], "terms_url": "https://www.mapbox.com/about/maps", "terms_text": "Terms & Feedback", diff --git a/data/update_imagery.js b/data/update_imagery.js index fbf604950..4375f5d3f 100644 --- a/data/update_imagery.js +++ b/data/update_imagery.js @@ -91,6 +91,13 @@ sources.concat(whitelist).forEach(function(source) { template: source.url }; + + // supports 512px tiles + if (source.id === 'Mapbox') { + im.template = im.template.replace('.jpg', '@2x.jpg'); + im.tileSize = 512; + } + if (source.type === 'wms') { im.projection = supportedProjection; } @@ -149,7 +156,7 @@ sources.concat(whitelist).forEach(function(source) { im.terms_html = attribution.html; } - ['best', 'default', 'description', 'icon', 'overlay'].forEach(function(a) { + ['best', 'default', 'description', 'icon', 'overlay', 'tileSize'].forEach(function(a) { if (source[a]) { im[a] = source[a]; } diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index 03af506d6..454e71400 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -272,7 +272,8 @@ export function rendererTileLayer(context) { _source = _; _tileSize = _source.tileSize; _cache = {}; - tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent); + // tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent); // not yet + tiler.zoomExtent(_source.zoomExtent); return background; }; From 90bc0b8537b3e36b46921b157c5081b71a983a10 Mon Sep 17 00:00:00 2001 From: Jon D Date: Sun, 22 Jul 2018 19:35:29 +0100 Subject: [PATCH 056/217] Update to prevent detachment of node when either a via or location_hint role in a turn restriction. Update to move any other relation to new node. --- data/core.yaml | 3 +- dist/locales/en.json | 3 +- modules/actions/detach_node.js | 20 +- modules/operations/detach_node.js | 56 ++++- modules/util/index.js | 4 +- test/spec/actions/detach_node.js | 82 +++++++- test/spec/operations/detach_node.js | 303 +++++++++++++++++++++------- 7 files changed, 385 insertions(+), 86 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 20d827514..9f5c8eb3f 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -233,7 +233,8 @@ en: title: Detach key: T description: Detach this node from these lines/areas. - annotation: Detached a node from owning lines/areas. + annotation: Detached a node from owning lines/areas. + via_restriction: "This can't be detached because it would damage a turn restriction." restriction: controls: distance: Distance diff --git a/dist/locales/en.json b/dist/locales/en.json index 15dbd00c9..4aea68312 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -302,7 +302,8 @@ "title": "Detach", "key": "T", "description": "Detach this node from these lines/areas.", - "annotation": "Detached a node from owning lines/areas." + "annotation": "Detached a node from owning lines/areas.", + "via_restriction": "This can't be detached because it would damage a turn restriction." } }, "restriction": { diff --git a/modules/actions/detach_node.js b/modules/actions/detach_node.js index d83fd46ed..7ff5cd8e3 100644 --- a/modules/actions/detach_node.js +++ b/modules/actions/detach_node.js @@ -9,19 +9,31 @@ export function actionDetachNode(nodeId) { // Create a new node to replace the one we will detach var replacementNode = osmNode({ loc: node.loc }); // We need to process each way in turn, updating the graph as we go - return parentWays + var updatedWaysGraph = parentWays .reduce(function (accGraph, parentWay) { // Make a note of where in the way our target node is inside this way var originalIndex = parentWay.nodes.indexOf(nodeId); // Swap out the target node for the replacement - var updatedWay = parentWay - .removeNode(nodeId) // Remove our target node from the parent way + var updatedWay = parentWay.removeNode(nodeId) // Remove our target node from the parent way .addNode(replacementNode.id, originalIndex); // Add in the replacement node in its place - // Update the graph with the updated way + // Update the graph with the updated way and pass into the next cycle of the reduce operation return accGraph.replace(updatedWay); }, // Seed the reduction with the input graph, updated to include the replacementNode so // that is accessible to the ways when we add it in to them graph.replace(replacementNode)); + // Process any relations too + var parentRels = updatedWaysGraph.parentRelations(node); + return parentRels + .reduce(function (accGraph, parentRel) { + // Move the relationship to the new node + var originalMember = parentRel.memberById(nodeId); + var newMember = { id: replacementNode.id, type: 'node', role: originalMember.role }; + // Remove & replace with the new member + var updatedRel = parentRel.removeMembersWithID(nodeId) + .addMember(newMember, originalMember.index); + // Update graph and pass into the next cycle of the reduce operation + return accGraph.replace(updatedRel); + }, updatedWaysGraph); }; } diff --git a/modules/operations/detach_node.js b/modules/operations/detach_node.js index 28ca9b600..bb1f985cf 100644 --- a/modules/operations/detach_node.js +++ b/modules/operations/detach_node.js @@ -2,6 +2,8 @@ import { actionDetachNode } from '../actions/index'; import { behaviorOperation } from '../behavior/index'; import { modeMove } from '../modes/index'; import { t } from '../util/locale'; +import _flatMap from 'lodash-es/flatMap'; +import _uniq from 'lodash-es/uniq'; export function operationDetachNode(selectedIDs, context) { var selectedNode = selectedIDs[0]; @@ -37,7 +39,10 @@ export function operationDetachNode(selectedIDs, context) { return false; }; operation.tooltip = function () { - return t('operations.detachNode.description'); + var disableReason = operation.disabled(); + return disableReason + ? t('operations.detachNode.' + disableReason) + : t('operations.detachNode.description'); }; operation.annotation = function () { return t('operations.detachNode.annotation'); @@ -46,5 +51,54 @@ export function operationDetachNode(selectedIDs, context) { operation.keys = [t('operations.detachNode.key')]; operation.title = t('operations.detachNode.title'); operation.behavior = behaviorOperation(context).which(operation); + + operation.disabled = function () { + // We should prevent the node being detached if it represents a via/location_hint node of a turn restriction + var graph = context.graph(); + // Get nodes for the Ids (although there should only be one, we can handle multiple here) + var nodes = selectedIDs.map(function (i) { return graph.hasEntity(i); }) + .filter(isNotNullOrUndefined); + // Get all via nodes of restrictions involving the target nodes + var restrictionNodeIds = _flatMap(nodes, function (node) { + // Get the relations that this node belongs to + var relationsFromNode = graph.parentRelations(node); + // Check each relation in turn + return _flatMap(relationsFromNode, function (relation) { + // Check to see if this is a restriction relation, if not return null + if (!relation.isValidRestriction()) { + return null; + } + // We have identified that it is a restriction. + // https://wiki.openstreetmap.org/wiki/Relation:restriction indicates that + // from & to roles are only appropriate for Ways + // The via members can be either nodes or ways. Via-Ways do not prevent us removing a node + // from within them, as it is the way itself which is in the relation with the via role, + // and not the consitutent nodes (so if we switch out a constituent node, the way id + // does not change and therefore the relation will not be affected). Therefore we + // only need to examine the standalone nodes + return relation.members.filter(function (m) { + return (m.role === 'via' || m.role === 'location_hint') && m.type === 'node'; + }).map(function (m) { return m.id; }); + }); + }).filter(isNotNullOrUndefined); + + // Get unique list of ids in restrictionNodeIds to simplify checking + var nodeIds = _uniq(restrictionNodeIds); + + // Now we have a list of via/location_hint nodes, we should prevent detachment if the target node is in this list + var anyInhibits = nodes.filter(function (n) { + return nodeIds.indexOf(n.id) !== -1; + }); + if (anyInhibits.length > 0) { + // The node is a via/location_hint, do not permit + return 'via_restriction'; + } + // We are ok to proceed + return false; + }; return operation; } + +function isNotNullOrUndefined(i) { + return i !== undefined && i !== null; +} \ No newline at end of file diff --git a/modules/util/index.js b/modules/util/index.js index f64856de8..d25494503 100644 --- a/modules/util/index.js +++ b/modules/util/index.js @@ -12,7 +12,7 @@ export { utilFunctor } from './util'; export { utilGetAllNodes } from './util'; export { utilGetPrototypeOf } from './util'; export { utilGetSetValue } from './get_set_value'; -export { utilIdleWorker} from './idle_worker'; +export { utilIdleWorker } from './idle_worker'; export { utilNoAuto } from './util'; export { utilPrefixCSSProperty } from './util'; export { utilPrefixDOMProperty } from './util'; @@ -24,4 +24,4 @@ export { utilStringQs } from './util'; export { utilSuggestNames } from './suggest_names'; export { utilTagText } from './util'; export { utilTriggerEvent } from './trigger_event'; -export { utilWrap } from './util'; +export { utilWrap } from './util'; \ No newline at end of file diff --git a/test/spec/actions/detach_node.js b/test/spec/actions/detach_node.js index 70739b640..16fcc5e3a 100644 --- a/test/spec/actions/detach_node.js +++ b/test/spec/actions/detach_node.js @@ -79,7 +79,7 @@ describe('iD.actionDetachNode', function () { // confirm that a still exists var targetNode = assertionGraph.entity('a'); expect(targetNode).not.to.eql(undefined); - // .., and that the location is correct + // ... and that the location is correct expect(targetNode.loc).to.eql([0, 0]); // ... and that the tags are intact expect(targetNode.tags).to.eql(tags); @@ -149,7 +149,7 @@ describe('iD.actionDetachNode', function () { // confirm that a still exists var targetNode = assertionGraph.entity('b'); expect(targetNode).not.to.eql(undefined); - // .., and that the location is correct + // ... and that the location is correct expect(targetNode.loc).to.eql([1, 0]); // ... and that the tags are intact expect(targetNode.tags).to.eql(tags); @@ -240,7 +240,7 @@ describe('iD.actionDetachNode', function () { // confirm that a still exists var targetNode = assertionGraph.entity('a'); expect(targetNode).not.to.eql(undefined); - // .., and that the location is correct + // ... and that the location is correct expect(targetNode.loc).to.eql([0, 0]); // ... and that the tags are intact expect(targetNode.tags).to.eql(tags); @@ -312,7 +312,7 @@ describe('iD.actionDetachNode', function () { // confirm that a still exists var targetNode = assertionGraph.entity('b'); expect(targetNode).not.to.eql(undefined); - // .., and that the location is correct + // ... and that the location is correct expect(targetNode.loc).to.eql([1, 0]); // ... and that the tags are intact expect(targetNode.tags).to.eql(tags); @@ -416,7 +416,7 @@ describe('iD.actionDetachNode', function () { // confirm that a still exists var targetNode = assertionGraph.entity('c'); expect(targetNode).not.to.eql(undefined); - // .., and that the location is correct + // ... and that the location is correct expect(targetNode.loc).to.eql([2, 0]); // ... and that the tags are intact expect(targetNode.tags).to.eql(tags); @@ -529,7 +529,7 @@ describe('iD.actionDetachNode', function () { // confirm that a still exists var targetNode = assertionGraph.entity('c'); expect(targetNode).not.to.eql(undefined); - // .., and that the location is correct + // ... and that the location is correct expect(targetNode.loc).to.eql([1, 1]); // ... and that the tags are intact expect(targetNode.tags).to.eql(tags); @@ -537,4 +537,74 @@ describe('iD.actionDetachNode', function () { expect(assertionGraph.parentWays(targetNode)).to.eql([]); }); }); + describe('with relation', function () { + var graph; + + beforeEach(function () { + // Set up a simple way + // a-b-c (0,0)-(1,0)-(2,0) + // Node b represents the target + // With a relationship for the way including b + graph = iD.Graph([ + iD.Node({ id: 'a', loc: [0, 0] }), + iD.Node({ id: 'b', loc: [1, 0], tags: tags }), + iD.Node({ id: 'c', loc: [2, 0] }), + iD.Way({ id: 'w', nodes: ['a', 'b', 'c'] }), + iD.Relation({ + id: 'r', + tags: { + type: 'route', + route: 'foot' + }, + members: [ + { id: 'a', type: 'node', role: 'point' }, + { id: 'b', type: 'node', role: 'point' }, + { id: 'c', type: 'node', role: 'point' } + ] + }) + ]); + }); + + it('detached node not a member of relation', function () { + var assertionGraph = iD.actionDetachNode('b')(graph); + + var targetNode = assertionGraph.entity('b'); + // Confirm is not a member of the relation + expect(assertionGraph.parentRelations(targetNode).length).to.eql(0); + }); + + it('new node is a member of relation', function () { + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Find the new node + var targetWay = assertionGraph.entity('w'); + var newNodeId = targetWay.nodes.filter(function (m) { + return m !== 'a' && m !== 'b' && m !== 'c'; + })[0]; + var newNode = assertionGraph.entity(newNodeId); + + // Confirm is a member of the relation + expect(assertionGraph.parentRelations(newNode).length).to.eql(1); + expect(assertionGraph.parentRelations(newNode)[0].id).to.eql('r'); + }); + + it('Relation membership has the same properties', function () { + var assertionGraph = iD.actionDetachNode('b')(graph); + + // Find the new node + var targetWay = assertionGraph.entity('w'); + var newNodeId = targetWay.nodes.filter(function (m) { + return m !== 'a' && m !== 'b' && m !== 'c'; + })[0]; + + // Get the relation + var targetRelation = assertionGraph.entity('r'); + // Find the member + var targetMember = targetRelation.memberById(newNodeId); + + // Confirm membership is the same as original (except for the new id) + expect(targetMember).to.eql({ id: newNodeId, index: 1, type: 'node', role: 'point' }); + }); + + }); }); \ No newline at end of file diff --git a/test/spec/operations/detach_node.js b/test/spec/operations/detach_node.js index 6604ce051..357d390fa 100644 --- a/test/spec/operations/detach_node.js +++ b/test/spec/operations/detach_node.js @@ -1,85 +1,246 @@ describe('iD.operationDetachNode', function () { var fakeContext; var graph; + + // Some common setup functions + // Set up the fake context + fakeContext = {}; + fakeContext.graph = function () { + return graph; + }; var fakeTags = { 'name': 'fake' }; - beforeEach(function () { - // Set up graph - var createFakeNode = function (id, hasTags) { - return hasTags - ? { id: id, type: 'node', tags: fakeTags } - : { id: id, type: 'node' }; - }; - // a - node with tags & parent way - // b - node with tags & 2 parent ways - // c - node with no tags, parent way - // d - node with no tags, 2 parent ways - // e - node with tags, no parent way - // f - node with no tags, no parent way - graph = iD.Graph([ - iD.Node(createFakeNode('a', true)), - iD.Node(createFakeNode('b', true)), - iD.Node(createFakeNode('c', false)), - iD.Node(createFakeNode('d', false)), - iD.Node(createFakeNode('e', true)), - iD.Node(createFakeNode('f', false)), - iD.Way({ id: 'x', nodes: ['a', 'b', 'c', 'd'] }), - iD.Way({ id: 'y', nodes: ['b', 'd'] }) - ]); + // Set up graph + var createFakeNode = function (id, hasTags) { + return hasTags + ? { id: id, type: 'node', tags: fakeTags } + : { id: id, type: 'node' }; + }; - // Set up the fake context - fakeContext = {}; - fakeContext.graph = function () { - return graph; - }; + describe('available', function () { + beforeEach(function () { + // a - node with tags & parent way + // b - node with tags & 2 parent ways + // c - node with no tags, parent way + // d - node with no tags, 2 parent ways + // e - node with tags, no parent way + // f - node with no tags, no parent way + graph = iD.Graph([ + iD.Node(createFakeNode('a', true)), + iD.Node(createFakeNode('b', true)), + iD.Node(createFakeNode('c', false)), + iD.Node(createFakeNode('d', false)), + iD.Node(createFakeNode('e', true)), + iD.Node(createFakeNode('f', false)), + iD.Way({ id: 'x', nodes: ['a', 'b', 'c', 'd'] }), + iD.Way({ id: 'y', nodes: ['b', 'd'] }) + ]); + }); + + it('is not available for no selected ids', function () { + var result = iD.operationDetachNode([], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for two selected ids', function () { + var result = iD.operationDetachNode(['a', 'b'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for unkown selected id', function () { + var result = iD.operationDetachNode(['z'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected way', function () { + var result = iD.operationDetachNode(['x'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with tags, no parent way', function () { + var result = iD.operationDetachNode(['e'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with no tags, no parent way', function () { + var result = iD.operationDetachNode(['f'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with no tags, parent way', function () { + var result = iD.operationDetachNode(['c'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is not available for selected node with no tags, two parent ways', function () { + var result = iD.operationDetachNode(['d'], fakeContext).available(); + expect(result).to.eql(false); + }); + + it('is available for selected node with tags, parent way', function () { + var result = iD.operationDetachNode(['a'], fakeContext).available(); + expect(result).to.eql(true); + }); + + it('is available for selected node with tags, two parent ways', function () { + var result = iD.operationDetachNode(['b'], fakeContext).available(); + expect(result).to.eql(true); + }); }); - it('is not available for no selected ids', function () { - var result = iD.operationDetachNode([], fakeContext).available(); - expect(result).to.eql(false); - }); + describe('disabled', function () { + it('returns enabled for non-related node', function () { + graph = iD.Graph([ + iD.Node(createFakeNode('a', false)), + iD.Node(createFakeNode('b', true)), + iD.Node(createFakeNode('c', false)), + iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }) + ]); + var result = iD.operationDetachNode(['b'], fakeContext).disabled(); + expect(result).to.eql(false); + }); - it('is not available for two selected ids', function () { - var result = iD.operationDetachNode(['a', 'b'], fakeContext).available(); - expect(result).to.eql(false); - }); + it('returns enabled for non-restriction related node', function () { + graph = iD.Graph([ + iD.Node(createFakeNode('a', false)), + iD.Node(createFakeNode('b', true)), + iD.Node(createFakeNode('c', false)), + iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }), + iD.Relation({ id: 'r', members: [{ id: 'b', role: 'label' }] }) + ]); + var result = iD.operationDetachNode(['b'], fakeContext).disabled(); + expect(result).to.eql(false); + }); - it('is not available for unkown selected id', function () { - var result = iD.operationDetachNode(['z'], fakeContext).available(); - expect(result).to.eql(false); - }); + it('returns not-enabled for via node in restriction', function () { + // https://wiki.openstreetmap.org/wiki/Relation:restriction indicates that + // from & to roles are only appropriate for Ways + graph = iD.Graph([ + iD.Node(createFakeNode('a', false)), + iD.Node(createFakeNode('b', false)), + iD.Node(createFakeNode('c', false)), + iD.Node(createFakeNode('d', true)), + iD.Node(createFakeNode('e', false)), + iD.Node(createFakeNode('f', false)), + iD.Node(createFakeNode('g', false)), + iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }), + iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), + iD.Relation({ + id: 'r', + tags: { + type: 'restriction', + restriction: 'no_right_turn' + }, + members: [ + { id: 'x', type: 'way', role: 'from' }, + { id: 'd', type: 'node', role: 'via' }, + { id: 'z', type: 'way', role: 'to' } + ] + }) + ]); + var result = iD.operationDetachNode(['d'], fakeContext).disabled(); + expect(result).not.to.eql(false); + }); - it('is not available for selected way', function () { - var result = iD.operationDetachNode(['x'], fakeContext).available(); - expect(result).to.eql(false); - }); + it('returns not-enabled for via node in restriction and other non-restriction relation', function () { + graph = iD.Graph([ + iD.Node(createFakeNode('a', false)), + iD.Node(createFakeNode('b', false)), + iD.Node(createFakeNode('c', false)), + iD.Node(createFakeNode('d', true)), + iD.Node(createFakeNode('e', false)), + iD.Node(createFakeNode('f', false)), + iD.Node(createFakeNode('g', false)), + iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }), + iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), + iD.Relation({ + id: 'r', + tags: { + type: 'restriction', + restriction: 'no_right_turn' + }, + members: [ + { id: 'x', type: 'way', role: 'from' }, + { id: 'd', type: 'node', role: 'via' }, + { id: 'z', type: 'way', role: 'to' } + ] + }), + iD.Relation({ + id: 's', + members: [ + { id: 'x', type: 'way' }, + { id: 'd', type: 'node' }, + ] + }) + ]); + var result = iD.operationDetachNode(['d'], fakeContext).disabled(); + expect(result).not.to.eql(false); + }); - it('is not available for selected node with tags, no parent way', function () { - var result = iD.operationDetachNode(['e'], fakeContext).available(); - expect(result).to.eql(false); - }); + it('returns not-enabled for location_hint node in restriction', function () { + // https://wiki.openstreetmap.org/wiki/Relation:restriction indicates that + // from & to roles are only appropriate for Ways + graph = iD.Graph([ + iD.Node(createFakeNode('a', false)), + iD.Node(createFakeNode('b', false)), + iD.Node(createFakeNode('c', false)), + iD.Node(createFakeNode('d', true)), + iD.Node(createFakeNode('e', false)), + iD.Node(createFakeNode('f', false)), + iD.Node(createFakeNode('g', false)), + iD.Way({ id: 'x', nodes: ['a', 'b'] }), + iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), + iD.Relation({ + id: 'r', + tags: { + type: 'restriction', + restriction: 'no_right_turn' + }, + members: [ + { id: 'x', type: 'way', role: 'from' }, + { id: 'c', type: 'node', role: 'via' }, + { id: 'd', type: 'node', role: 'location_hint' }, + { id: 'z', type: 'way', role: 'to' } + ] + }) + ]); + var result = iD.operationDetachNode(['d'], fakeContext).disabled(); + expect(result).not.to.eql(false); + }); - it('is not available for selected node with no tags, no parent way', function () { - var result = iD.operationDetachNode(['f'], fakeContext).available(); - expect(result).to.eql(false); - }); - - it('is not available for selected node with no tags, parent way', function () { - var result = iD.operationDetachNode(['c'], fakeContext).available(); - expect(result).to.eql(false); - }); - - it('is not available for selected node with no tags, two parent ways', function () { - var result = iD.operationDetachNode(['d'], fakeContext).available(); - expect(result).to.eql(false); - }); - - it('is available for selected node with tags, parent way', function () { - var result = iD.operationDetachNode(['a'], fakeContext).available(); - expect(result).to.eql(true); - }); - - it('is available for selected node with tags, two parent ways', function () { - var result = iD.operationDetachNode(['b'], fakeContext).available(); - expect(result).to.eql(true); + it('returns not-enabled for location_hint node in restriction and other non-restriction relation', function () { + graph = iD.Graph([ + iD.Node(createFakeNode('a', false)), + iD.Node(createFakeNode('b', false)), + iD.Node(createFakeNode('c', false)), + iD.Node(createFakeNode('d', true)), + iD.Node(createFakeNode('e', false)), + iD.Node(createFakeNode('f', false)), + iD.Node(createFakeNode('g', false)), + iD.Way({ id: 'x', nodes: ['a', 'b'] }), + iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), + iD.Relation({ + id: 'r', + tags: { + type: 'restriction', + restriction: 'no_right_turn' + }, + members: [ + { id: 'x', type: 'way', role: 'from' }, + { id: 'c', type: 'node', role: 'via' }, + { id: 'd', type: 'node', role: 'location_hint' }, + { id: 'z', type: 'way', role: 'to' } + ] + }), + iD.Relation({ + id: 's', + members: [ + { id: 'x', type: 'way' }, + { id: 'd', type: 'node' }, + ] + }) + ]); + var result = iD.operationDetachNode(['d'], fakeContext).disabled(); + expect(result).not.to.eql(false); + }); }); }); From 119792fd22b9f72b6b29a96742435a5b9e59f3dc Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 23 Jul 2018 13:36:34 -0400 Subject: [PATCH 057/217] Cleanups to Detach Node feature This commit includes a bunch of minor things: - change keyboard shortcut to 'E' to not conflict with anything - move `disabled` check from operation into action and simplify - use `actionMoveNode` to place the detached node at the mouse cursor - disable the operation if the node is connected to hidden features - lots of code simplification - make the icon more centered --- data/core.yaml | 10 +- data/shortcuts.json | 100 +++----- dist/locales/en.json | 10 +- modules/actions/detach_node.js | 75 +++--- modules/core/graph.js | 47 ++-- modules/operations/detach_node.js | 147 +++++------ modules/osm/relation.js | 3 +- modules/osm/way.js | 37 ++- .../operations/operation-detach-node.svg | 6 + .../operations/operation-detachNode.svg | 9 - test/spec/actions/detach_node.js | 232 ++++++++++-------- test/spec/operations/detach_node.js | 204 +++++---------- 12 files changed, 382 insertions(+), 498 deletions(-) create mode 100644 svg/iD-sprite/operations/operation-detach-node.svg delete mode 100644 svg/iD-sprite/operations/operation-detachNode.svg diff --git a/data/core.yaml b/data/core.yaml index f06a69983..828e9715b 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -229,12 +229,13 @@ en: annotation: create: Added a turn restriction delete: Deleted a turn restriction - detachNode: + detach_node: title: Detach - key: T + key: E description: Detach this node from these lines/areas. - annotation: Detached a node from owning lines/areas. - via_restriction: "This can't be detached because it would damage a turn restriction." + annotation: Detached a node from parent lines/areas. + restriction: "This node can't be detached because it would damage a \"{relation}\" relation." + connected_to_hidden: This node can't be detached because it is connected to a hidden feature. restriction: controls: distance: Distance @@ -1140,6 +1141,7 @@ en: continue_line: "Continue a line at the selected node" merge: "Combine (merge) selected features" disconnect: "Disconnect features at the selected node" + detach_node: "Detach selected node from parent lines/areas" split: "Split a line into two at the selected node" reverse: "Reverse a line" move: "Move selected features" diff --git a/data/shortcuts.json b/data/shortcuts.json index ee0c9cdc9..0da3dfdce 100644 --- a/data/shortcuts.json +++ b/data/shortcuts.json @@ -123,23 +123,19 @@ "text": "shortcuts.browsing.vertex_selected.previous" }, { - "shortcuts": ["]","↘" - ], + "shortcuts": ["]","↘"], "text": "shortcuts.browsing.vertex_selected.next" }, { - "shortcuts": ["{","⇞" - ], + "shortcuts": ["{","⇞"], "text": "shortcuts.browsing.vertex_selected.first" }, { - "shortcuts": ["}","⇟" - ], + "shortcuts": ["}","⇟"], "text": "shortcuts.browsing.vertex_selected.last" }, { - "shortcuts": ["\\","shortcuts.key.pause" - ], + "shortcuts": ["\\","shortcuts.key.pause"], "text": "shortcuts.browsing.vertex_selected.change_parent" } ] @@ -157,33 +153,27 @@ "text": "shortcuts.editing.drawing.title" }, { - "shortcuts": ["1" - ], + "shortcuts": ["1"], "text": "shortcuts.editing.drawing.add_point" }, { - "shortcuts": ["2" - ], + "shortcuts": ["2"], "text": "shortcuts.editing.drawing.add_line" }, { - "shortcuts": ["3" - ], + "shortcuts": ["3"], "text": "shortcuts.editing.drawing.add_area" }, { - "shortcuts": ["Left-click","shortcuts.key.space" - ], + "shortcuts": ["Left-click","shortcuts.key.space"], "text": "shortcuts.editing.drawing.place_point" }, { - "shortcuts": ["⌥" - ], + "shortcuts": ["⌥"], "text": "shortcuts.editing.drawing.disable_snap" }, { - "shortcuts": ["↵","⎋" - ], + "shortcuts": ["↵","⎋"], "text": "shortcuts.editing.drawing.stop_line" }, { @@ -192,32 +182,27 @@ }, { "modifiers": ["⌘"], - "shortcuts": ["C" - ], + "shortcuts": ["C"], "text": "shortcuts.editing.commands.copy" }, { "modifiers": ["⌘"], - "shortcuts": ["V" - ], + "shortcuts": ["V"], "text": "shortcuts.editing.commands.paste" }, { "modifiers": ["⌘"], - "shortcuts": ["Z" - ], + "shortcuts": ["Z"], "text": "shortcuts.editing.commands.undo" }, { "modifiers": ["⌘","⇧"], - "shortcuts": ["Z" - ], + "shortcuts": ["Z"], "text": "shortcuts.editing.commands.redo" }, { "modifiers": ["⌘"], - "shortcuts": ["S" - ], + "shortcuts": ["S"], "text": "shortcuts.editing.commands.save" } ] @@ -229,64 +214,56 @@ "text": "shortcuts.editing.operations.title" }, { - "shortcuts": ["operations.continue.key" - ], + "shortcuts": ["operations.continue.key"], "text": "shortcuts.editing.operations.continue_line" }, { - "shortcuts": ["operations.merge.key" - ], + "shortcuts": ["operations.merge.key"], "text": "shortcuts.editing.operations.merge" }, { - "shortcuts": ["operations.disconnect.key" - ], + "shortcuts": ["operations.disconnect.key"], "text": "shortcuts.editing.operations.disconnect" }, { - "shortcuts": ["operations.split.key" - ], + "shortcuts": ["operations.detach_node.key"], + "text": "shortcuts.editing.operations.detach_node" + }, + { + "shortcuts": ["operations.split.key"], "text": "shortcuts.editing.operations.split" }, { - "shortcuts": ["operations.reverse.key" - ], + "shortcuts": ["operations.reverse.key"], "text": "shortcuts.editing.operations.reverse" }, { - "shortcuts": ["operations.move.key" - ], + "shortcuts": ["operations.move.key"], "text": "shortcuts.editing.operations.move" }, { - "shortcuts": ["operations.rotate.key" - ], + "shortcuts": ["operations.rotate.key"], "text": "shortcuts.editing.operations.rotate" }, { - "shortcuts": ["operations.orthogonalize.key" - ], + "shortcuts": ["operations.orthogonalize.key"], "text": "shortcuts.editing.operations.orthogonalize" }, { - "shortcuts": ["operations.circularize.key" - ], + "shortcuts": ["operations.circularize.key"], "text": "shortcuts.editing.operations.circularize" }, { - "shortcuts": ["operations.reflect.key.long" - ], + "shortcuts": ["operations.reflect.key.long"], "text": "shortcuts.editing.operations.reflect_long" }, { - "shortcuts": ["operations.reflect.key.short" - ], + "shortcuts": ["operations.reflect.key.short"], "text": "shortcuts.editing.operations.reflect_short" }, { "modifiers": ["⌘"], - "shortcuts": ["⌫" - ], + "shortcuts": ["⌫"], "text": "shortcuts.editing.operations.delete" } ] @@ -305,32 +282,27 @@ }, { "modifiers": ["⌘"], - "shortcuts": ["info_panels.key" - ], + "shortcuts": ["info_panels.key"], "text": "shortcuts.tools.info.all" }, { "modifiers": ["⌘","⇧"], - "shortcuts": ["info_panels.background.key" - ], + "shortcuts": ["info_panels.background.key"], "text": "shortcuts.tools.info.background" }, { "modifiers": ["⌘","⇧"], - "shortcuts": ["info_panels.history.key" - ], + "shortcuts": ["info_panels.history.key"], "text": "shortcuts.tools.info.history" }, { "modifiers": ["⌘","⇧"], - "shortcuts": ["info_panels.location.key" - ], + "shortcuts": ["info_panels.location.key"], "text": "shortcuts.tools.info.location" }, { "modifiers": ["⌘","⇧"], - "shortcuts": ["info_panels.measurement.key" - ], + "shortcuts": ["info_panels.measurement.key"], "text": "shortcuts.tools.info.measurement" } ] diff --git a/dist/locales/en.json b/dist/locales/en.json index 8363a101f..47a1f0100 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -298,12 +298,13 @@ "delete": "Deleted a turn restriction" } }, - "detachNode": { + "detach_node": { "title": "Detach", - "key": "T", + "key": "E", "description": "Detach this node from these lines/areas.", - "annotation": "Detached a node from owning lines/areas.", - "via_restriction": "This can't be detached because it would damage a turn restriction." + "annotation": "Detached a node from parent lines/areas.", + "restriction": "This node can't be detached because it would damage a \"{relation}\" relation.", + "connected_to_hidden": "This node can't be detached because it is connected to a hidden feature." } }, "restriction": { @@ -1315,6 +1316,7 @@ "continue_line": "Continue a line at the selected node", "merge": "Combine (merge) selected features", "disconnect": "Disconnect features at the selected node", + "detach_node": "Detach selected node from parent lines/areas", "split": "Split a line into two at the selected node", "reverse": "Reverse a line", "move": "Move selected features", diff --git a/modules/actions/detach_node.js b/modules/actions/detach_node.js index 7ff5cd8e3..39bcd59fa 100644 --- a/modules/actions/detach_node.js +++ b/modules/actions/detach_node.js @@ -1,39 +1,48 @@ import { osmNode } from '../osm'; -export function actionDetachNode(nodeId) { - return function (graph) { - // Get the point in question - var node = graph.entity(nodeId); - // Get all of the ways it's currently attached to - var parentWays = graph.parentWays(node); + +export function actionDetachNode(nodeID) { + + var action = function(graph) { + var node = graph.entity(nodeID); + // Create a new node to replace the one we will detach - var replacementNode = osmNode({ loc: node.loc }); - // We need to process each way in turn, updating the graph as we go - var updatedWaysGraph = parentWays - .reduce(function (accGraph, parentWay) { - // Make a note of where in the way our target node is inside this way - var originalIndex = parentWay.nodes.indexOf(nodeId); - // Swap out the target node for the replacement - var updatedWay = parentWay.removeNode(nodeId) // Remove our target node from the parent way - .addNode(replacementNode.id, originalIndex); // Add in the replacement node in its place - // Update the graph with the updated way and pass into the next cycle of the reduce operation - return accGraph.replace(updatedWay); - }, - // Seed the reduction with the input graph, updated to include the replacementNode so - // that is accessible to the ways when we add it in to them - graph.replace(replacementNode)); + var replacement = osmNode({ loc: node.loc }); + graph = graph.replace(replacement); + + // Process each way in turn, updating the graph as we go + graph = graph.parentWays(node) + .reduce(function(accGraph, parentWay) { + return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id)); + }, graph); + // Process any relations too - var parentRels = updatedWaysGraph.parentRelations(node); - return parentRels - .reduce(function (accGraph, parentRel) { - // Move the relationship to the new node - var originalMember = parentRel.memberById(nodeId); - var newMember = { id: replacementNode.id, type: 'node', role: originalMember.role }; - // Remove & replace with the new member - var updatedRel = parentRel.removeMembersWithID(nodeId) - .addMember(newMember, originalMember.index); - // Update graph and pass into the next cycle of the reduce operation - return accGraph.replace(updatedRel); - }, updatedWaysGraph); + return graph.parentRelations(node) + .reduce(function(accGraph, parentRel) { + return accGraph.replace(parentRel.replaceMember(node, replacement)); + }, graph); }; + + + action.disabled = function(graph) { + var node = graph.entity(nodeID); + var parentRels = graph.parentRelations(node); + + for (var i = 0; i < parentRels.length; i++) { + var relation = parentRels[i]; + if (!relation.isValidRestriction()) continue; + + for (var j = 0; j < relation.members.length; j++) { + var m = relation.members[j]; + if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) { + return 'restriction'; + } + } + } + + return false; + }; + + + return action; } diff --git a/modules/core/graph.js b/modules/core/graph.js index bfe2c1cf2..31c06c410 100644 --- a/modules/core/graph.js +++ b/modules/core/graph.js @@ -52,9 +52,8 @@ coreGraph.prototype = { transient: function(entity, key, fn) { - var id = entity.id, - transients = this.transients[id] || - (this.transients[id] = {}); + var id = entity.id; + var transients = this.transients[id] || (this.transients[id] = {}); if (transients[key] !== undefined) { return transients[key]; @@ -67,8 +66,8 @@ coreGraph.prototype = { parentWays: function(entity) { - var parents = this._parentWays[entity.id], - result = []; + var parents = this._parentWays[entity.id]; + var result = []; if (parents) { for (var i = 0; i < parents.length; i++) { @@ -92,8 +91,8 @@ coreGraph.prototype = { parentRelations: function(entity) { - var parents = this._parentRels[entity.id], - result = []; + var parents = this._parentRels[entity.id]; + var result = []; if (parents) { for (var i = 0; i < parents.length; i++) { @@ -134,8 +133,8 @@ coreGraph.prototype = { // data into each state. To external consumers, it should appear as if the // graph always contained the newly downloaded data. rebase: function(entities, stack, force) { - var base = this.base(), - i, j, k, id; + var base = this.base(); + var i, j, k, id; for (i = 0; i < entities.length; i++) { var entity = entities[i]; @@ -168,8 +167,8 @@ coreGraph.prototype = { _updateRebased: function() { - var base = this.base(), - i, k, child, id, keys; + var base = this.base(); + var i, k, child, id, keys; keys = Object.keys(this._parentWays); for (i = 0; i < keys.length; i++) { @@ -206,17 +205,13 @@ coreGraph.prototype = { // Updates calculated properties (parentWays, parentRels) for the specified change _updateCalculated: function(oldentity, entity, parentWays, parentRels) { - parentWays = parentWays || this._parentWays; parentRels = parentRels || this._parentRels; - var type = entity && entity.type || oldentity && oldentity.type, - removed, added, ways, rels, i; + var type = entity && entity.type || oldentity && oldentity.type; + var removed, added, ways, rels, i; - - if (type === 'way') { - - // Update parentWays + if (type === 'way') { // Update parentWays if (oldentity && entity) { removed = _difference(oldentity.nodes, entity.nodes); added = _difference(entity.nodes, oldentity.nodes); @@ -236,9 +231,7 @@ coreGraph.prototype = { parentWays[added[i]] = ways; } - } else if (type === 'relation') { - - // Update parentRels + } else if (type === 'relation') { // Update parentRels if (oldentity && entity) { removed = _difference(oldentity.members, entity.members); added = _difference(entity.members, oldentity); @@ -262,8 +255,7 @@ coreGraph.prototype = { replace: function(entity) { - if (this.entities[entity.id] === entity) - return this; + if (this.entities[entity.id] === entity) return this; return this.update(function() { this._updateCalculated(this.entities[entity.id], entity); @@ -281,11 +273,9 @@ coreGraph.prototype = { revert: function(id) { - var baseEntity = this.base().entities[id], - headEntity = this.entities[id]; - - if (headEntity === baseEntity) - return this; + var baseEntity = this.base().entities[id]; + var headEntity = this.entities[id]; + if (headEntity === baseEntity) return this; return this.update(function() { this._updateCalculated(headEntity, baseEntity); @@ -296,7 +286,6 @@ coreGraph.prototype = { update: function() { var graph = this.frozen ? coreGraph(this, true) : this; - for (var i = 0; i < arguments.length; i++) { arguments[i].call(graph, graph); } diff --git a/modules/operations/detach_node.js b/modules/operations/detach_node.js index bb1f985cf..268b8554e 100644 --- a/modules/operations/detach_node.js +++ b/modules/operations/detach_node.js @@ -1,104 +1,85 @@ -import { actionDetachNode } from '../actions/index'; -import { behaviorOperation } from '../behavior/index'; -import { modeMove } from '../modes/index'; +import _some from 'lodash-es/some'; + +import { actionDetachNode, actionMoveNode } from '../actions'; +import { behaviorOperation } from '../behavior'; +import { modeMove } from '../modes'; import { t } from '../util/locale'; -import _flatMap from 'lodash-es/flatMap'; -import _uniq from 'lodash-es/uniq'; + export function operationDetachNode(selectedIDs, context) { - var selectedNode = selectedIDs[0]; + var nodeID = selectedIDs.length && selectedIDs[0]; + var action = actionDetachNode(nodeID); + var operation = function () { - context.perform(actionDetachNode(selectedNode)); - context.enter(modeMove(context, [selectedNode], context.graph)); - }; - var hasTags = function (entity) { - return Object.keys(entity.tags).length > 0; + context.perform(action); // do the detach + + var mouse = context.map().mouseCoordinates(); + if (mouse.some(isNaN)) { + enterMoveMode(); + + } else { + // move detached node to the mouse location (transitioned) + context.perform(actionMoveNode(nodeID, mouse)); + + // after transition completes, put at final mouse location and enter move mode. + window.setTimeout(function() { + mouse = context.map().mouseCoordinates(); + context.replace(actionMoveNode(nodeID, mouse)); + enterMoveMode(); + }, 150); + } + + function enterMoveMode() { + var baseGraph = context.graph(); + context.enter(modeMove(context, [nodeID], baseGraph)); + } }; + + operation.available = function () { - // Check multiple items aren't selected - if (selectedIDs.length !== 1) { - return false; - } - // Get the entity itself + if (selectedIDs.length !== 1) return false; + var graph = context.graph(); - var entity = graph.hasEntity(selectedNode); - if (!entity) { - // This probably isn't possible - return false; - } - // Confirm entity is a node with tags - if (entity.type === 'node' && hasTags(entity)) { - // Confirm that the node is owned by at least 1 parent way - var parentWays = graph.parentWays(entity); - return parentWays && parentWays.length > 0; - } - // Not appropriate - return false; + var entity = graph.hasEntity(nodeID); + if (!entity) return false; + + return entity.type === 'node' && + entity.hasInterestingTags() && + graph.parentWays(entity).length > 0; }; + + operation.disabled = function () { - return false; + var reason; + if (_some(selectedIDs, context.hasHiddenConnections)) { + reason = 'connected_to_hidden'; + } + return action.disabled(context.graph()) || reason; }; + + operation.tooltip = function () { var disableReason = operation.disabled(); - return disableReason - ? t('operations.detachNode.' + disableReason) - : t('operations.detachNode.description'); + if (disableReason) { + return t('operations.detach_node.' + disableReason, + { relation: context.presets().item('type/restriction').name() }); + } else { + return t('operations.detach_node.description'); + } }; + + operation.annotation = function () { - return t('operations.detachNode.annotation'); + return t('operations.detach_node.annotation'); }; - operation.id = 'detachNode'; - operation.keys = [t('operations.detachNode.key')]; - operation.title = t('operations.detachNode.title'); + + + operation.id = 'detach-node'; + operation.keys = [t('operations.detach_node.key')]; + operation.title = t('operations.detach_node.title'); operation.behavior = behaviorOperation(context).which(operation); - operation.disabled = function () { - // We should prevent the node being detached if it represents a via/location_hint node of a turn restriction - var graph = context.graph(); - // Get nodes for the Ids (although there should only be one, we can handle multiple here) - var nodes = selectedIDs.map(function (i) { return graph.hasEntity(i); }) - .filter(isNotNullOrUndefined); - // Get all via nodes of restrictions involving the target nodes - var restrictionNodeIds = _flatMap(nodes, function (node) { - // Get the relations that this node belongs to - var relationsFromNode = graph.parentRelations(node); - // Check each relation in turn - return _flatMap(relationsFromNode, function (relation) { - // Check to see if this is a restriction relation, if not return null - if (!relation.isValidRestriction()) { - return null; - } - // We have identified that it is a restriction. - // https://wiki.openstreetmap.org/wiki/Relation:restriction indicates that - // from & to roles are only appropriate for Ways - // The via members can be either nodes or ways. Via-Ways do not prevent us removing a node - // from within them, as it is the way itself which is in the relation with the via role, - // and not the consitutent nodes (so if we switch out a constituent node, the way id - // does not change and therefore the relation will not be affected). Therefore we - // only need to examine the standalone nodes - return relation.members.filter(function (m) { - return (m.role === 'via' || m.role === 'location_hint') && m.type === 'node'; - }).map(function (m) { return m.id; }); - }); - }).filter(isNotNullOrUndefined); - // Get unique list of ids in restrictionNodeIds to simplify checking - var nodeIds = _uniq(restrictionNodeIds); - - // Now we have a list of via/location_hint nodes, we should prevent detachment if the target node is in this list - var anyInhibits = nodes.filter(function (n) { - return nodeIds.indexOf(n.id) !== -1; - }); - if (anyInhibits.length > 0) { - // The node is a via/location_hint, do not permit - return 'via_restriction'; - } - // We are ok to proceed - return false; - }; return operation; } -function isNotNullOrUndefined(i) { - return i !== undefined && i !== null; -} \ No newline at end of file diff --git a/modules/osm/relation.js b/modules/osm/relation.js index 8532990ed..1ba283df4 100644 --- a/modules/osm/relation.js +++ b/modules/osm/relation.js @@ -42,8 +42,7 @@ _extend(osmRelation.prototype, { copy: function(resolver, copies) { - if (copies[this.id]) - return copies[this.id]; + if (copies[this.id]) return copies[this.id]; var copy = osmEntity.prototype.copy.call(this, resolver, copies); diff --git a/modules/osm/way.js b/modules/osm/way.js index af1b3d476..c4da27c25 100644 --- a/modules/osm/way.js +++ b/modules/osm/way.js @@ -31,8 +31,7 @@ _extend(osmWay.prototype, { copy: function(resolver, copies) { - if (copies[this.id]) - return copies[this.id]; + if (copies[this.id]) return copies[this.id]; var copy = osmEntity.prototype.copy.call(this, resolver, copies); @@ -239,9 +238,9 @@ _extend(osmWay.prototype, { unclose: function() { if (!this.isClosed()) return this; - var nodes = this.nodes.slice(), - connector = this.first(), - i = nodes.length - 1; + var nodes = this.nodes.slice(); + var connector = this.first(); + var i = nodes.length - 1; // remove trailing connectors.. while (i > 0 && nodes.length > 1 && nodes[i] === connector) { @@ -260,9 +259,9 @@ _extend(osmWay.prototype, { // Consecutive duplicates are eliminated including existing ones. // Circularity is always preserved when adding a node. addNode: function(id, index) { - var nodes = this.nodes.slice(), - isClosed = this.isClosed(), - max = isClosed ? nodes.length - 1 : nodes.length; + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + var max = isClosed ? nodes.length - 1 : nodes.length; if (index === undefined) { index = max; @@ -309,9 +308,9 @@ _extend(osmWay.prototype, { // Consecutive duplicates are eliminated including existing ones. // Circularity is preserved when updating a node. updateNode: function(id, index) { - var nodes = this.nodes.slice(), - isClosed = this.isClosed(), - max = nodes.length - 1; + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); + var max = nodes.length - 1; if (index === undefined || index < 0 || index > max) { throw new RangeError('index ' + index + ' out of range 0..' + max); @@ -353,13 +352,13 @@ _extend(osmWay.prototype, { // Replaces each occurrence of node id needle with replacement. // Consecutive duplicates are eliminated including existing ones. // Circularity is preserved. - replaceNode: function(needle, replacement) { - var nodes = this.nodes.slice(), - isClosed = this.isClosed(); + replaceNode: function(needleID, replacementID) { + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); for (var i = 0; i < nodes.length; i++) { - if (nodes[i] === needle) { - nodes[i] = replacement; + if (nodes[i] === needleID) { + nodes[i] = replacementID; } } @@ -374,12 +373,12 @@ _extend(osmWay.prototype, { }, - // Removes each occurrence of node id needle with replacement. + // Removes each occurrence of node id. // Consecutive duplicates are eliminated including existing ones. // Circularity is preserved. removeNode: function(id) { - var nodes = this.nodes.slice(), - isClosed = this.isClosed(); + var nodes = this.nodes.slice(); + var isClosed = this.isClosed(); nodes = nodes .filter(function(node) { return node !== id; }) diff --git a/svg/iD-sprite/operations/operation-detach-node.svg b/svg/iD-sprite/operations/operation-detach-node.svg new file mode 100644 index 000000000..a10edfc66 --- /dev/null +++ b/svg/iD-sprite/operations/operation-detach-node.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/svg/iD-sprite/operations/operation-detachNode.svg b/svg/iD-sprite/operations/operation-detachNode.svg deleted file mode 100644 index 504acc2cb..000000000 --- a/svg/iD-sprite/operations/operation-detachNode.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/test/spec/actions/detach_node.js b/test/spec/actions/detach_node.js index 16fcc5e3a..1bac58e44 100644 --- a/test/spec/actions/detach_node.js +++ b/test/spec/actions/detach_node.js @@ -1,20 +1,22 @@ describe('iD.actionDetachNode', function () { var tags = { 'name': 'test' }; + function createTargetNode(id, lonlat) { - return iD.Node({ id: id, loc: lonlat, tags: tags }); + return iD.osmNode({ id: id, loc: lonlat, tags: tags }); } - describe('simple way', function () { + + describe('linear way', function () { var graph; beforeEach(function () { - // Set up a simple way - // a-b-c-d - // (0,0)-(1,0)-(2,0)-(3,0) - graph = iD.Graph([ - iD.Node({ id: 'a', loc: [0, 0] }), - iD.Node({ id: 'b', loc: [1, 0] }), - iD.Node({ id: 'c', loc: [2, 0] }), - iD.Node({ id: 'd', loc: [3, 0] }), - iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd'] }) + // + // a -- b -- c -- d + // + graph = iD.coreGraph([ + iD.osmNode({ id: 'a', loc: [0, 0] }), + iD.osmNode({ id: 'b', loc: [1, 0] }), + iD.osmNode({ id: 'c', loc: [2, 0] }), + iD.osmNode({ id: 'd', loc: [3, 0] }), + iD.osmWay({ id: '-', nodes: ['a', 'b', 'c', 'd'] }) ]); }); @@ -30,7 +32,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('a')(graph); // Confirm that the way still has 4 nodes - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); expect(target.nodes.length).to.eql(4); }); @@ -39,11 +41,11 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('a')(graph); // Confirm that the way is ordered correctly - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); // Note that we can't be sure of the id of the replacement node // so we only assert the nodes we know the ids for // As we have already confirmed the size of the array we can assume - // that the replacement node is in the correct posisiton by a process of elimination + // that the replacement node is in the correct posisiton by a process of elimination expect(target.nodes[1]).to.eql('b'); expect(target.nodes[2]).to.eql('c'); expect(target.nodes[3]).to.eql('d'); @@ -54,7 +56,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('a')(graph); // Confirm that the nodes have not moved, including the replacement node - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 0]); @@ -65,7 +67,7 @@ describe('iD.actionDetachNode', function () { // Act var assertionGraph = iD.actionDetachNode('a')(graph); - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; // Confirm that the target is no longer "a" expect(nodes[0]).not.to.eql('a'); // and that the tags are not present @@ -100,7 +102,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Confirm that the way still has 4 nodes - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); expect(target.nodes.length).to.eql(4); }); @@ -109,11 +111,11 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Confirm that the way is ordered correctly - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); // Note that we can't be sure of the id of the replacement node // so we only assert the nodes we know the ids for // As we have already confirmed the size of the array we can assume - // that the replacement node is in the correct posisiton by a process of elimination + // that the replacement node is in the correct posisiton by a process of elimination expect(target.nodes[0]).to.eql('a'); expect(target.nodes[2]).to.eql('c'); expect(target.nodes[3]).to.eql('d'); @@ -124,7 +126,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Confirm that the nodes have not moved, including the replacement node - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 0]); @@ -135,7 +137,7 @@ describe('iD.actionDetachNode', function () { // Act var assertionGraph = iD.actionDetachNode('b')(graph); - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; // Confirm that the target is no longer "a" expect(nodes[1]).not.to.eql('b'); // and that the tags are not present @@ -158,19 +160,22 @@ describe('iD.actionDetachNode', function () { }); }); }); + + describe('closed way', function () { var graph; beforeEach(function () { - // Set up a closed way - // a-b (0,0)-(1,0) - // | | - // d-c (0,1)-(1,1) - graph = iD.Graph([ - iD.Node({ id: 'a', loc: [0, 0] }), - iD.Node({ id: 'b', loc: [1, 0] }), - iD.Node({ id: 'c', loc: [1, 1] }), - iD.Node({ id: 'd', loc: [0, 1] }), - iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd', 'a'] }) + // + // d -- c + // | | + // a -- b + // + graph = iD.coreGraph([ + iD.osmNode({ id: 'a', loc: [0, 0] }), + iD.osmNode({ id: 'b', loc: [1, 0] }), + iD.osmNode({ id: 'c', loc: [1, 1] }), + iD.osmNode({ id: 'd', loc: [0, 1] }), + iD.osmWay({ id: '-', nodes: ['a', 'b', 'c', 'd', 'a'] }) ]); }); @@ -186,7 +191,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('a')(graph); // Confirm that the way still has 5 nodes - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); expect(target.nodes.length).to.eql(5); }); @@ -195,11 +200,11 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('a')(graph); // Confirm that the way is ordered correctly - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); // Note that we can't be sure of the id of the replacement node // so we only assert the nodes we know the ids for // As we have already confirmed the size of the array we can assume - // that the replacement node is in the correct posisiton by a process of elimination + // that the replacement node is in the correct posisiton by a process of elimination expect(target.nodes[1]).to.eql('b'); expect(target.nodes[2]).to.eql('c'); expect(target.nodes[3]).to.eql('d'); @@ -212,7 +217,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('a')(graph); // Confirm that the nodes have not moved, including the replacement node - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 1]); @@ -224,7 +229,7 @@ describe('iD.actionDetachNode', function () { // Act var assertionGraph = iD.actionDetachNode('a')(graph); - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; // Confirm that the target is no longer "a" expect(nodes[0]).not.to.eql('a'); // .. also in the tail position @@ -261,7 +266,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Confirm that the way still has 5 nodes - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); expect(target.nodes.length).to.eql(5); }); @@ -270,11 +275,11 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Confirm that the way is ordered correctly - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); // Note that we can't be sure of the id of the replacement node // so we only assert the nodes we know the ids for // As we have already confirmed the size of the array we can assume - // that the replacement node is in the correct posisiton by a process of elimination + // that the replacement node is in the correct posisiton by a process of elimination expect(target.nodes[0]).to.eql('a'); expect(target.nodes[2]).to.eql('c'); expect(target.nodes[3]).to.eql('d'); @@ -286,7 +291,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Confirm that the nodes have not moved, including the replacement node - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 1]); @@ -298,7 +303,7 @@ describe('iD.actionDetachNode', function () { // Act var assertionGraph = iD.actionDetachNode('b')(graph); - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; // Confirm that the target is no longer "a" expect(nodes[1]).not.to.eql('b'); // and that the tags are not present @@ -321,23 +326,29 @@ describe('iD.actionDetachNode', function () { }); }); }); - describe('intersecting simple ways', function () { + + + describe('intersecting linear ways', function () { var graph; beforeEach(function () { - // Set up two simple ways - // a-b-c-d (0,0)-(1,0)-(2,0)-(3,0) - // e (2,1) - // f (2,2) + // + // f + // ‖ + // e + // ‖ + // a -- b -- c -- d + // // Node c represents the target - graph = iD.Graph([ - iD.Node({ id: 'a', loc: [0, 0] }), - iD.Node({ id: 'b', loc: [1, 0] }), - iD.Node({ id: 'c', loc: [2, 0], tags: tags }), - iD.Node({ id: 'd', loc: [3, 0] }), - iD.Node({ id: 'e', loc: [2, 1] }), - iD.Node({ id: 'f', loc: [2, 2] }), - iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd'] }), - iD.Way({ id: 'x', nodes: ['c', 'e', 'f'] }) + // + graph = iD.coreGraph([ + iD.osmNode({ id: 'a', loc: [0, 0] }), + iD.osmNode({ id: 'b', loc: [1, 0] }), + iD.osmNode({ id: 'c', loc: [2, 0], tags: tags }), + iD.osmNode({ id: 'd', loc: [3, 0] }), + iD.osmNode({ id: 'e', loc: [2, 1] }), + iD.osmNode({ id: 'f', loc: [2, 2] }), + iD.osmWay({ id: '-', nodes: ['a', 'b', 'c', 'd'] }), + iD.osmWay({ id: '=', nodes: ['c', 'e', 'f'] }) ]); }); @@ -346,10 +357,10 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm that the way still has 4 nodes - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); expect(target.nodes.length).to.eql(4); // .. and second way has 3 - target = assertionGraph.entity('x'); + target = assertionGraph.entity('='); expect(target.nodes.length).to.eql(3); }); @@ -358,16 +369,16 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm that the way is ordered correctly - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); // Note that we can't be sure of the id of the replacement node // so we only assert the nodes we know the ids for // As we have already confirmed the size of the array we can assume - // that the replacement node is in the correct posisiton by a process of elimination + // that the replacement node is in the correct posisiton by a process of elimination expect(target.nodes[0]).to.eql('a'); expect(target.nodes[1]).to.eql('b'); expect(target.nodes[3]).to.eql('d'); // and second way - target = assertionGraph.entity('x'); + target = assertionGraph.entity('='); expect(target.nodes[1]).to.eql('e'); expect(target.nodes[2]).to.eql('f'); }); @@ -377,13 +388,13 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm that the nodes have not moved, including the replacement node - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 0]); expect(assertionGraph.entity(nodes[3]).loc).to.eql([3, 0]); // and second way - nodes = assertionGraph.entity('x').nodes; + nodes = assertionGraph.entity('=').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([2, 0]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([2, 1]); expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 2]); @@ -393,20 +404,20 @@ describe('iD.actionDetachNode', function () { // Act var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm both ways have the same replacement node - expect(assertionGraph.entity('w').nodes[2]).to.eql(assertionGraph.entity('x').nodes[0]); + expect(assertionGraph.entity('-').nodes[2]).to.eql(assertionGraph.entity('=').nodes[0]); }); it('does replace target node', function () { // Act var assertionGraph = iD.actionDetachNode('c')(graph); - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; // Confirm that the target is no longer "c" expect(nodes[2]).not.to.eql('c'); // and that the tags are not present expect(assertionGraph.entity(nodes[2]).tags).to.eql({}); // Confirm that the second way's first node is the same - expect(assertionGraph.entity('x').nodes[0]).to.eql(nodes[2]); + expect(assertionGraph.entity('=').nodes[0]).to.eql(nodes[2]); }); it('does detach target node', function () { @@ -424,26 +435,30 @@ describe('iD.actionDetachNode', function () { expect(assertionGraph.parentWays(targetNode)).to.eql([]); }); }); + + describe('intersecting closed way', function () { var graph; beforeEach(function () { - // Set up two intersecting closed ways - // a-b (0,0)-(1,0) - // | | - // d-c-e (0,1)-(1,1)-(2,1) - // | | - // g f (0,2) - (1,2) - // C is the target node - graph = iD.Graph([ - iD.Node({ id: 'a', loc: [0, 0] }), - iD.Node({ id: 'b', loc: [1, 0] }), - iD.Node({ id: 'c', loc: [1, 1], tags: tags }), - iD.Node({ id: 'd', loc: [0, 1] }), - iD.Node({ id: 'e', loc: [2, 1] }), - iD.Node({ id: 'f', loc: [1, 2] }), - iD.Node({ id: 'g', loc: [0, 2] }), - iD.Way({ id: 'w', nodes: ['a', 'b', 'c', 'd', 'a'] }), - iD.Way({ id: 'x', nodes: ['c', 'e', 'f', 'g', 'c'] }) + // + // g == f + // ‖ ‖ + // d -- c == e + // | | + // a -- b + // + // c is the target node + // + graph = iD.coreGraph([ + iD.osmNode({ id: 'a', loc: [0, 0] }), + iD.osmNode({ id: 'b', loc: [1, 0] }), + iD.osmNode({ id: 'c', loc: [1, 1], tags: tags }), + iD.osmNode({ id: 'd', loc: [0, 1] }), + iD.osmNode({ id: 'e', loc: [2, 1] }), + iD.osmNode({ id: 'f', loc: [2, 2] }), + iD.osmNode({ id: 'g', loc: [1, 2] }), + iD.osmWay({ id: '-', nodes: ['a', 'b', 'c', 'd', 'a'] }), + iD.osmWay({ id: '=', nodes: ['c', 'e', 'f', 'g', 'c'] }) ]); }); @@ -452,10 +467,10 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm that the way still has 5 nodes - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); expect(target.nodes.length).to.eql(5); // and the second - target = assertionGraph.entity('x'); + target = assertionGraph.entity('='); expect(target.nodes.length).to.eql(5); }); @@ -464,18 +479,18 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm that the way is ordered correctly - var target = assertionGraph.entity('w'); + var target = assertionGraph.entity('-'); // Note that we can't be sure of the id of the replacement node // so we only assert the nodes we know the ids for // As we have already confirmed the size of the array we can assume - // that the replacement node is in the correct posisiton by a process of elimination + // that the replacement node is in the correct posisiton by a process of elimination expect(target.nodes[0]).to.eql('a'); expect(target.nodes[1]).to.eql('b'); expect(target.nodes[3]).to.eql('d'); // Need to confirm that the id of the first & last node is the same so that the way remains closed expect(target.nodes[0]).to.eql(target.nodes[4]); // and the same for the other way - target = assertionGraph.entity('x'); + target = assertionGraph.entity('='); expect(target.nodes[1]).to.eql('e'); expect(target.nodes[2]).to.eql('f'); expect(target.nodes[3]).to.eql('g'); @@ -487,32 +502,32 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm that the nodes have not moved, including the replacement node - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([0, 0]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([1, 0]); expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 1]); expect(assertionGraph.entity(nodes[3]).loc).to.eql([0, 1]); // We don't need to assert node[4] location as we've already confirmed that it is the same as node 0 // and the other way - nodes = assertionGraph.entity('x').nodes; + nodes = assertionGraph.entity('=').nodes; expect(assertionGraph.entity(nodes[0]).loc).to.eql([1, 1]); expect(assertionGraph.entity(nodes[1]).loc).to.eql([2, 1]); - expect(assertionGraph.entity(nodes[2]).loc).to.eql([1, 2]); - expect(assertionGraph.entity(nodes[3]).loc).to.eql([0, 2]); + expect(assertionGraph.entity(nodes[2]).loc).to.eql([2, 2]); + expect(assertionGraph.entity(nodes[3]).loc).to.eql([1, 2]); }); it('uses same replacement node at intersection', function () { // Act var assertionGraph = iD.actionDetachNode('c')(graph); // Confirm both ways have the same replacement node - expect(assertionGraph.entity('w').nodes[2]).to.eql(assertionGraph.entity('x').nodes[0]); + expect(assertionGraph.entity('-').nodes[2]).to.eql(assertionGraph.entity('=').nodes[0]); }); it('does replace target node', function () { // Act var assertionGraph = iD.actionDetachNode('c')(graph); - var nodes = assertionGraph.entity('w').nodes; + var nodes = assertionGraph.entity('-').nodes; // Confirm that the target is no longer "c" expect(nodes[0]).not.to.eql('c'); // .. also in the tail position @@ -537,25 +552,24 @@ describe('iD.actionDetachNode', function () { expect(assertionGraph.parentWays(targetNode)).to.eql([]); }); }); + + describe('with relation', function () { var graph; beforeEach(function () { - // Set up a simple way - // a-b-c (0,0)-(1,0)-(2,0) + // + // a -- b -- c + // // Node b represents the target // With a relationship for the way including b - graph = iD.Graph([ - iD.Node({ id: 'a', loc: [0, 0] }), - iD.Node({ id: 'b', loc: [1, 0], tags: tags }), - iD.Node({ id: 'c', loc: [2, 0] }), - iD.Way({ id: 'w', nodes: ['a', 'b', 'c'] }), - iD.Relation({ - id: 'r', - tags: { - type: 'route', - route: 'foot' - }, + // + graph = iD.coreGraph([ + iD.osmNode({ id: 'a', loc: [0, 0] }), + iD.osmNode({ id: 'b', loc: [1, 0], tags: tags }), + iD.osmNode({ id: 'c', loc: [2, 0] }), + iD.osmWay({ id: '-', nodes: ['a', 'b', 'c'] }), + iD.osmRelation({id: 'r', tags: {type: 'route', route: 'foot'}, members: [ { id: 'a', type: 'node', role: 'point' }, { id: 'b', type: 'node', role: 'point' }, @@ -577,7 +591,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Find the new node - var targetWay = assertionGraph.entity('w'); + var targetWay = assertionGraph.entity('-'); var newNodeId = targetWay.nodes.filter(function (m) { return m !== 'a' && m !== 'b' && m !== 'c'; })[0]; @@ -592,7 +606,7 @@ describe('iD.actionDetachNode', function () { var assertionGraph = iD.actionDetachNode('b')(graph); // Find the new node - var targetWay = assertionGraph.entity('w'); + var targetWay = assertionGraph.entity('-'); var newNodeId = targetWay.nodes.filter(function (m) { return m !== 'a' && m !== 'b' && m !== 'c'; })[0]; @@ -607,4 +621,4 @@ describe('iD.actionDetachNode', function () { }); }); -}); \ No newline at end of file +}); diff --git a/test/spec/operations/detach_node.js b/test/spec/operations/detach_node.js index 357d390fa..e79bf8349 100644 --- a/test/spec/operations/detach_node.js +++ b/test/spec/operations/detach_node.js @@ -2,13 +2,13 @@ describe('iD.operationDetachNode', function () { var fakeContext; var graph; - // Some common setup functions // Set up the fake context fakeContext = {}; - fakeContext.graph = function () { - return graph; - }; + fakeContext.graph = function () { return graph; }; + fakeContext.hasHiddenConnections = function () { return false; }; + var fakeTags = { 'name': 'fake' }; + // Set up graph var createFakeNode = function (id, hasTags) { return hasTags @@ -24,112 +24,108 @@ describe('iD.operationDetachNode', function () { // d - node with no tags, 2 parent ways // e - node with tags, no parent way // f - node with no tags, no parent way - graph = iD.Graph([ - iD.Node(createFakeNode('a', true)), - iD.Node(createFakeNode('b', true)), - iD.Node(createFakeNode('c', false)), - iD.Node(createFakeNode('d', false)), - iD.Node(createFakeNode('e', true)), - iD.Node(createFakeNode('f', false)), - iD.Way({ id: 'x', nodes: ['a', 'b', 'c', 'd'] }), - iD.Way({ id: 'y', nodes: ['b', 'd'] }) + graph = iD.coreGraph([ + iD.osmNode(createFakeNode('a', true)), + iD.osmNode(createFakeNode('b', true)), + iD.osmNode(createFakeNode('c', false)), + iD.osmNode(createFakeNode('d', false)), + iD.osmNode(createFakeNode('e', true)), + iD.osmNode(createFakeNode('f', false)), + iD.osmWay({ id: 'x', nodes: ['a', 'b', 'c', 'd'] }), + iD.osmWay({ id: 'y', nodes: ['b', 'd'] }) ]); }); it('is not available for no selected ids', function () { var result = iD.operationDetachNode([], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('is not available for two selected ids', function () { var result = iD.operationDetachNode(['a', 'b'], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); - it('is not available for unkown selected id', function () { + it('is not available for unknown selected id', function () { var result = iD.operationDetachNode(['z'], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('is not available for selected way', function () { var result = iD.operationDetachNode(['x'], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('is not available for selected node with tags, no parent way', function () { var result = iD.operationDetachNode(['e'], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('is not available for selected node with no tags, no parent way', function () { var result = iD.operationDetachNode(['f'], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('is not available for selected node with no tags, parent way', function () { var result = iD.operationDetachNode(['c'], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('is not available for selected node with no tags, two parent ways', function () { var result = iD.operationDetachNode(['d'], fakeContext).available(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('is available for selected node with tags, parent way', function () { var result = iD.operationDetachNode(['a'], fakeContext).available(); - expect(result).to.eql(true); + expect(result).to.be.ok; }); it('is available for selected node with tags, two parent ways', function () { var result = iD.operationDetachNode(['b'], fakeContext).available(); - expect(result).to.eql(true); + expect(result).to.be.ok; }); }); + describe('disabled', function () { it('returns enabled for non-related node', function () { - graph = iD.Graph([ - iD.Node(createFakeNode('a', false)), - iD.Node(createFakeNode('b', true)), - iD.Node(createFakeNode('c', false)), - iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }) + graph = iD.coreGraph([ + iD.osmNode(createFakeNode('a', false)), + iD.osmNode(createFakeNode('b', true)), + iD.osmNode(createFakeNode('c', false)), + iD.osmWay({ id: 'x', nodes: ['a', 'b', 'c'] }) ]); var result = iD.operationDetachNode(['b'], fakeContext).disabled(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('returns enabled for non-restriction related node', function () { - graph = iD.Graph([ - iD.Node(createFakeNode('a', false)), - iD.Node(createFakeNode('b', true)), - iD.Node(createFakeNode('c', false)), - iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }), - iD.Relation({ id: 'r', members: [{ id: 'b', role: 'label' }] }) + graph = iD.coreGraph([ + iD.osmNode(createFakeNode('a', false)), + iD.osmNode(createFakeNode('b', true)), + iD.osmNode(createFakeNode('c', false)), + iD.osmWay({ id: 'x', nodes: ['a', 'b', 'c'] }), + iD.osmRelation({ id: 'r', members: [{ id: 'b', role: 'label' }] }) ]); var result = iD.operationDetachNode(['b'], fakeContext).disabled(); - expect(result).to.eql(false); + expect(result).to.be.not.ok; }); it('returns not-enabled for via node in restriction', function () { // https://wiki.openstreetmap.org/wiki/Relation:restriction indicates that // from & to roles are only appropriate for Ways - graph = iD.Graph([ - iD.Node(createFakeNode('a', false)), - iD.Node(createFakeNode('b', false)), - iD.Node(createFakeNode('c', false)), - iD.Node(createFakeNode('d', true)), - iD.Node(createFakeNode('e', false)), - iD.Node(createFakeNode('f', false)), - iD.Node(createFakeNode('g', false)), - iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }), - iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), - iD.Relation({ - id: 'r', - tags: { - type: 'restriction', - restriction: 'no_right_turn' - }, + graph = iD.coreGraph([ + iD.osmNode(createFakeNode('a', false)), + iD.osmNode(createFakeNode('b', false)), + iD.osmNode(createFakeNode('c', false)), + iD.osmNode(createFakeNode('d', true)), + iD.osmNode(createFakeNode('e', false)), + iD.osmNode(createFakeNode('f', false)), + iD.osmNode(createFakeNode('g', false)), + iD.osmWay({ id: 'x', nodes: ['a', 'b', 'c'] }), + iD.osmWay({ id: 'y', nodes: ['e', 'f', 'g'] }), + iD.osmRelation({id: 'r', tags: {type: 'restriction', restriction: 'no_right_turn'}, members: [ { id: 'x', type: 'way', role: 'from' }, { id: 'd', type: 'node', role: 'via' }, @@ -138,63 +134,23 @@ describe('iD.operationDetachNode', function () { }) ]); var result = iD.operationDetachNode(['d'], fakeContext).disabled(); - expect(result).not.to.eql(false); - }); - - it('returns not-enabled for via node in restriction and other non-restriction relation', function () { - graph = iD.Graph([ - iD.Node(createFakeNode('a', false)), - iD.Node(createFakeNode('b', false)), - iD.Node(createFakeNode('c', false)), - iD.Node(createFakeNode('d', true)), - iD.Node(createFakeNode('e', false)), - iD.Node(createFakeNode('f', false)), - iD.Node(createFakeNode('g', false)), - iD.Way({ id: 'x', nodes: ['a', 'b', 'c'] }), - iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), - iD.Relation({ - id: 'r', - tags: { - type: 'restriction', - restriction: 'no_right_turn' - }, - members: [ - { id: 'x', type: 'way', role: 'from' }, - { id: 'd', type: 'node', role: 'via' }, - { id: 'z', type: 'way', role: 'to' } - ] - }), - iD.Relation({ - id: 's', - members: [ - { id: 'x', type: 'way' }, - { id: 'd', type: 'node' }, - ] - }) - ]); - var result = iD.operationDetachNode(['d'], fakeContext).disabled(); - expect(result).not.to.eql(false); + expect(result).to.eql('restriction'); }); it('returns not-enabled for location_hint node in restriction', function () { // https://wiki.openstreetmap.org/wiki/Relation:restriction indicates that // from & to roles are only appropriate for Ways - graph = iD.Graph([ - iD.Node(createFakeNode('a', false)), - iD.Node(createFakeNode('b', false)), - iD.Node(createFakeNode('c', false)), - iD.Node(createFakeNode('d', true)), - iD.Node(createFakeNode('e', false)), - iD.Node(createFakeNode('f', false)), - iD.Node(createFakeNode('g', false)), - iD.Way({ id: 'x', nodes: ['a', 'b'] }), - iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), - iD.Relation({ - id: 'r', - tags: { - type: 'restriction', - restriction: 'no_right_turn' - }, + graph = iD.coreGraph([ + iD.osmNode(createFakeNode('a', false)), + iD.osmNode(createFakeNode('b', false)), + iD.osmNode(createFakeNode('c', false)), + iD.osmNode(createFakeNode('d', true)), + iD.osmNode(createFakeNode('e', false)), + iD.osmNode(createFakeNode('f', false)), + iD.osmNode(createFakeNode('g', false)), + iD.osmWay({ id: 'x', nodes: ['a', 'b'] }), + iD.osmWay({ id: 'y', nodes: ['e', 'f', 'g'] }), + iD.osmRelation({id: 'r', tags: {type: 'restriction', restriction: 'no_right_turn'}, members: [ { id: 'x', type: 'way', role: 'from' }, { id: 'c', type: 'node', role: 'via' }, @@ -204,43 +160,7 @@ describe('iD.operationDetachNode', function () { }) ]); var result = iD.operationDetachNode(['d'], fakeContext).disabled(); - expect(result).not.to.eql(false); - }); - - it('returns not-enabled for location_hint node in restriction and other non-restriction relation', function () { - graph = iD.Graph([ - iD.Node(createFakeNode('a', false)), - iD.Node(createFakeNode('b', false)), - iD.Node(createFakeNode('c', false)), - iD.Node(createFakeNode('d', true)), - iD.Node(createFakeNode('e', false)), - iD.Node(createFakeNode('f', false)), - iD.Node(createFakeNode('g', false)), - iD.Way({ id: 'x', nodes: ['a', 'b'] }), - iD.Way({ id: 'y', nodes: ['e', 'f', 'g'] }), - iD.Relation({ - id: 'r', - tags: { - type: 'restriction', - restriction: 'no_right_turn' - }, - members: [ - { id: 'x', type: 'way', role: 'from' }, - { id: 'c', type: 'node', role: 'via' }, - { id: 'd', type: 'node', role: 'location_hint' }, - { id: 'z', type: 'way', role: 'to' } - ] - }), - iD.Relation({ - id: 's', - members: [ - { id: 'x', type: 'way' }, - { id: 'd', type: 'node' }, - ] - }) - ]); - var result = iD.operationDetachNode(['d'], fakeContext).disabled(); - expect(result).not.to.eql(false); + expect(result).to.eql('restriction'); }); }); }); From 31c39287bf09b01b3f9480c5b3a33df0484577ad Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 23 Jul 2018 14:44:33 -0400 Subject: [PATCH 058/217] Restore the viewfields --- css/60_photos.css | 7 ------- 1 file changed, 7 deletions(-) diff --git a/css/60_photos.css b/css/60_photos.css index c1e4a0d9e..cc853900c 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -177,13 +177,6 @@ .layer-mapillary-images .viewfield-group * { fill: #55ff22; } -.layer-mapillary-images .viewfield-group .viewfield { - display: none; -} -.layer-mapillary-images .viewfield-group.selected .viewfield, -.layer-mapillary-images .viewfield-group .viewfield.pano { - display: inline; -} .layer-mapillary-images .sequence { stroke: #55ff22; } From e23ef4ba4a7f6c793624409c1860c8a155af1311 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Mon, 23 Jul 2018 15:09:25 -0400 Subject: [PATCH 059/217] redraw on note drag. TODO: change dispatch call --- css/20_map.css | 14 +- modules/modes/drag_note.js | 5 +- modules/modes/drag_note2.js | 490 ----------------------------------- modules/modes/select_note.js | 2 +- modules/osm/note.js | 2 +- modules/renderer/map.js | 24 +- modules/ui/sidebar.js | 3 +- 7 files changed, 30 insertions(+), 510 deletions(-) delete mode 100644 modules/modes/drag_note2.js diff --git a/css/20_map.css b/css/20_map.css index 0e7137b74..a715b6bf0 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -68,9 +68,17 @@ /* points & notes */ g.note .stroke { - stroke: #444; + stroke: #222; stroke-width: 1; - fill: #444; + fill: #222; + opacity: 0.6; +} + +g.note.active .stroke { + stroke: #222; + stroke-width: 1; + fill: #222; + opacity: 0.8; } g.point .stroke { @@ -105,7 +113,7 @@ g.point.selected .shadow { stroke-opacity: 0.7; } -g.note ellipse.stroke, +/* g.note ellipse.stroke, */ g.point ellipse.stroke { display: none; } diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index 8437300c2..f51e9bdcc 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -111,8 +111,6 @@ export function modeDragNote(context) { function start(entity) { - context.perform(actionNoop()); - _activeEntity = entity; _startLoc = entity.loc; @@ -155,7 +153,8 @@ export function modeDragNote(context) { if (osm) { osm.replaceNote(entity); // update note cache } - dispatch.call('change', this, 'difference'); + + context.perform(actionNoop()); // TODO: replace with better call for redrawing } diff --git a/modules/modes/drag_note2.js b/modules/modes/drag_note2.js deleted file mode 100644 index ab0f55cae..000000000 --- a/modules/modes/drag_note2.js +++ /dev/null @@ -1,490 +0,0 @@ -import _find from 'lodash-es/find'; - -import { - event as d3_event, - select as d3_select -} from 'd3-selection'; - -import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; - -import { t } from '../util/locale'; - -import { - actionAddMidpoint, - actionConnect, - actionMoveNode, - actionNoop -} from '../actions'; - -import { - behaviorEdit, - behaviorHover, - behaviorDrag -} from '../behavior'; - -import { - geoChooseEdge, - geoHasLineIntersections, - geoHasSelfIntersections, - geoVecSubtract, - geoViewportEdge -} from '../geo'; - -import { modeBrowse, modeSelect } from './index'; -import { osmJoinWays, osmNode } from '../osm'; -import { uiFlash } from '../ui'; - - -export function modeDragNote2(context) { - var mode = { - id: 'drag-note2', - button: 'browse' - }; - var hover = behaviorHover(context).altDisables(true) - .on('hover', context.ui().sidebar.hover); - var edit = behaviorEdit(context); - - var _nudgeInterval; - var _restoreSelectedIDs = []; - var _wasMidpoint = false; - var _isCancelled = false; - var _activeEntity; - var _startLoc; - var _lastLoc; - - - function startNudge(entity, nudge) { - if (_nudgeInterval) window.clearInterval(_nudgeInterval); - _nudgeInterval = window.setInterval(function() { - context.pan(nudge); - doMove(entity, nudge); - }, 50); - } - - - function stopNudge() { - if (_nudgeInterval) { - window.clearInterval(_nudgeInterval); - _nudgeInterval = null; - } - } - - - function moveAnnotation(entity) { - return t('operations.move.annotation.' + entity.geometry(context.graph())); - } - - - function connectAnnotation(entity) { - return t('operations.connect.annotation.' + entity.geometry(context.graph())); - } - - - function origin(entity) { - return context.projection(entity.loc); - } - - - function keydown() { - if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { - if (context.surface().classed('nope')) { - context.surface() - .classed('nope-suppressed', true); - } - context.surface() - .classed('nope', false) - .classed('nope-disabled', true); - } - } - - - function keyup() { - if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { - if (context.surface().classed('nope-suppressed')) { - context.surface() - .classed('nope', true); - } - context.surface() - .classed('nope-suppressed', false) - .classed('nope-disabled', false); - } - } - - - function start(entity) { - _wasMidpoint = entity.type === 'midpoint'; - var hasHidden = context.features().hasHiddenConnections(entity, context.graph()); - _isCancelled = d3_event.sourceEvent.shiftKey || hasHidden; - - - if (_isCancelled) { - if (hasHidden) { - uiFlash() - .duration(4000) - .text(t('modes.drag_node.connected_to_hidden'))(); - } - return drag.cancel(); - } - - if (_wasMidpoint) { - var midpoint = entity; - entity = osmNode(); - context.perform(actionAddMidpoint(midpoint, entity)); - entity = context.entity(entity.id); // get post-action entity - - var vertex = context.surface().selectAll('.' + entity.id); - drag.target(vertex.node(), entity); - - } else { - context.perform(actionNoop()); - } - - _activeEntity = entity; - _startLoc = entity.loc; - - context.surface().selectAll('.' + _activeEntity.id) - .classed('active', true); - - context.enter(mode); - } - - - // related code - // - `behavior/draw.js` `datum()` - function datum() { - var event = d3_event && d3_event.sourceEvent; - if (!event || event.altKey) { - return {}; - } else { - // When dragging, snap only to touch targets.. - // (this excludes area fills and active drawing elements) - var d = event.target.__data__; - return (d && d.properties && d.properties.target) ? d : {}; - } - } - - - function doMove(entity, nudge) { - nudge = nudge || [0, 0]; - - var currPoint = (d3_event && d3_event.point) || context.projection(_lastLoc); - var currMouse = geoVecSubtract(currPoint, nudge); - var loc = context.projection.invert(currMouse); - - if (!_nudgeInterval) { // If not nudging at the edge of the viewport, try to snap.. - // related code - // - `mode/drag_node.js` `doMode()` - // - `behavior/draw.js` `click()` - // - `behavior/draw_way.js` `move()` - var d = datum(); - var target = d && d.properties && d.properties.entity; - var targetLoc = target && target.loc; - var targetNodes = d && d.properties && d.properties.nodes; - var edge; - - if (targetLoc) { // snap to node/vertex - a point target with `.loc` - loc = targetLoc; - - } else if (targetNodes) { // snap to way - a line target with `.nodes` - edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id); - if (edge) { - loc = edge.loc; - } - } - } - - context.replace( - actionMoveNode(entity.id, loc), - moveAnnotation(entity) - ); - - // Below here: validations - var isInvalid = false; - - // Check if this connection to `target` could cause relations to break.. - if (target) { - isInvalid = hasRelationConflict(entity, target, edge, context.graph()); - } - - // Check if this drag causes the geometry to break.. - if (!isInvalid) { - isInvalid = hasInvalidGeometry(entity, context.graph()); - } - - - var nope = context.surface().classed('nope'); - if (isInvalid === 'relation' || isInvalid === 'restriction') { - if (!nope) { // about to nope - show hint - uiFlash() - .duration(4000) - .text(t('operations.connect.' + isInvalid, - { relation: context.presets().item('type/restriction').name() } - ))(); - } - } else { - if (nope) { // about to un-nope, remove hint - uiFlash() - .duration(1) - .text('')(); - } - } - - - var nopeDisabled = context.surface().classed('nope-disabled'); - if (nopeDisabled) { - context.surface() - .classed('nope', false) - .classed('nope-suppressed', isInvalid); - } else { - context.surface() - .classed('nope', isInvalid) - .classed('nope-suppressed', false); - } - - _lastLoc = loc; - } - - - // Uses `actionConnect.disabled()` to know whether this connection is ok.. - function hasRelationConflict(entity, target, edge, graph) { - var testGraph = graph.update(); // copy - - // if snapping to way - add midpoint there and consider that the target.. - if (edge) { - var midpoint = osmNode(); - var action = actionAddMidpoint({ - loc: edge.loc, - edge: [target.nodes[edge.index - 1], target.nodes[edge.index]] - }, midpoint); - - testGraph = action(testGraph); - target = midpoint; - } - - // can we connect to it? - var ids = [entity.id, target.id]; - return actionConnect(ids).disabled(testGraph); - } - - - function hasInvalidGeometry(entity, graph) { - var parents = graph.parentWays(entity); - var i, j, k; - - for (i = 0; i < parents.length; i++) { - var parent = parents[i]; - var nodes = []; - var activeIndex = null; // which multipolygon ring contains node being dragged - - // test any parent multipolygons for valid geometry - var relations = graph.parentRelations(parent); - for (j = 0; j < relations.length; j++) { - if (!relations[j].isMultipolygon()) continue; - - var rings = osmJoinWays(relations[j].members, graph); - - // find active ring and test it for self intersections - for (k = 0; k < rings.length; k++) { - nodes = rings[k].nodes; - if (_find(nodes, function(n) { return n.id === entity.id; })) { - activeIndex = k; - if (geoHasSelfIntersections(nodes, entity.id)) { - return true; - } - } - rings[k].coords = nodes.map(function(n) { return n.loc; }); - } - - // test active ring for intersections with other rings in the multipolygon - for (k = 0; k < rings.length; k++) { - if (k === activeIndex) continue; - - // make sure active ring doesnt cross passive rings - if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) { - return true; - } - } - } - - - // If we still haven't tested this node's parent way for self-intersections. - // (because it's not a member of a multipolygon), test it now. - if (activeIndex === null) { - nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); }); - if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) { - return true; - } - } - - } - - return false; - } - - - function move(entity) { - if (_isCancelled) return; - d3_event.sourceEvent.stopPropagation(); - - context.surface().classed('nope-disabled', d3_event.sourceEvent.altKey); - - _lastLoc = context.projection.invert(d3_event.point); - - doMove(entity); - var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); - if (nudge) { - startNudge(entity, nudge); - } else { - stopNudge(); - } - } - - - function end(entity) { - if (_isCancelled) return; - - var d = datum(); - var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope'); - var target = d && d.properties && d.properties.entity; // entity to snap to - - if (nope) { // bounce back - context.perform( - _actionBounceBack(entity.id, _startLoc) - ); - - } else if (target && target.type === 'way') { - var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id); - context.replace( - actionAddMidpoint({ - loc: choice.loc, - edge: [target.nodes[choice.index - 1], target.nodes[choice.index]] - }, entity), - connectAnnotation(target) - ); - - } else if (target && target.type === 'node') { - context.replace( - actionConnect([target.id, entity.id]), - connectAnnotation(target) - ); - - } else if (_wasMidpoint) { - context.replace( - actionNoop(), - t('operations.add.annotation.vertex') - ); - - } else { - context.replace( - actionNoop(), - moveAnnotation(entity) - ); - } - - var reselection = _restoreSelectedIDs.filter(function(id) { - return context.graph().hasEntity(id); - }); - - if (reselection.length) { - context.enter(modeSelect(context, reselection)); - } else { - context.enter(modeBrowse(context)); - } - } - - - function _actionBounceBack(nodeID, toLoc) { - var moveNode = actionMoveNode(nodeID, toLoc); - var action = function(graph, t) { - // last time through, pop off the bounceback perform. - // it will then overwrite the initial perform with a moveNode that does nothing - if (t === 1) context.pop(); - return moveNode(graph, t); - }; - action.transitionable = true; - return action; - } - - - function cancel() { - drag.cancel(); - context.enter(modeBrowse(context)); - } - - - var drag = behaviorDrag() - .selector('.layer-notes .note') - .surface(d3_select('#map').node()) - .origin(origin) - .on('start', start) - .on('move', move) - .on('end', end); - - - mode.enter = function() { - context.install(hover); - context.install(edit); - - d3_select(window) - .on('keydown.drawWay', keydown) - .on('keyup.drawWay', keyup); - - context.history() - .on('undone.drag-node', cancel); - }; - - - mode.exit = function() { - context.ui().sidebar.hover.cancel(); - context.uninstall(hover); - context.uninstall(edit); - - d3_select(window) - .on('keydown.hover', null) - .on('keyup.hover', null); - - context.history() - .on('undone.drag-node', null); - - context.map() - .on('drawn.drag-node', null); - - _activeEntity = null; - - context.surface() - .classed('nope', false) - .classed('nope-suppressed', false) - .classed('nope-disabled', false) - .selectAll('.active') - .classed('active', false); - - stopNudge(); - }; - - - mode.selectedIDs = function() { - if (!arguments.length) return _activeEntity ? [_activeEntity.id] : []; - // no assign - return mode; - }; - - - mode.activeID = function() { - if (!arguments.length) return _activeEntity && _activeEntity.id; - // no assign - return mode; - }; - - - mode.restoreSelectedIDs = function(_) { - if (!arguments.length) return _restoreSelectedIDs; - _restoreSelectedIDs = _; - return mode; - }; - - - mode.behavior = drag; - - - return mode; -} diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 61fe78891..143b57155 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -21,7 +21,7 @@ import { uiNoteEditor } from '../ui'; export function modeSelectNote(context, selectedNoteID) { var mode = { - id: 'select_note', + id: 'select-note', button: 'browse' }; diff --git a/modules/osm/note.js b/modules/osm/note.js index ed03c0504..c11207440 100644 --- a/modules/osm/note.js +++ b/modules/osm/note.js @@ -50,7 +50,7 @@ _extend(osmNote.prototype, { }, update: function(attrs) { - return osmNote(this, attrs, {v: 1 + (this.v || 0)}); + return osmNote(this, attrs); // {v: 1 + (this.v || 0)} }, isNew: function() { diff --git a/modules/renderer/map.js b/modules/renderer/map.js index d6c7d809c..acb1f8f40 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -39,7 +39,6 @@ import { svgMidpoints, svgPoints, svgVertices, - svgNotes } from '../svg'; import { uiFlash } from '../ui'; @@ -74,8 +73,6 @@ export function rendererMap(context) { var drawMidpoints = svgMidpoints(projection, context); var drawLabels = svgLabels(projection, context); - var drawNotes = svgNotes(projection, context); - var _selection = d3_select(null); var supersurface = d3_select(null); var wrapper = d3_select(null); @@ -215,8 +212,7 @@ export function rendererMap(context) { .call(context.background()); context.on('enter.map', function() { - if (map.editable() && !_transformed) { - + if ((map.editable() && !_transformed) || map.noteEditable()) { // redraw immediately any objects affected by a change in selectedIDs. var graph = context.graph(); var selectedAndParents = {}; @@ -344,9 +340,6 @@ export function rendererMap(context) { .call(drawLabels, graph, data, filter, dimensions, fullRedraw) .call(drawPoints, graph, data, filter); - surface.selectAll('.data-layer-notes') - .call(drawNotes); - dispatch.call('drawn', this, {full: true}); } @@ -356,7 +349,7 @@ export function rendererMap(context) { surface.selectAll('.layer-osm *').remove(); var mode = context.mode(); - if (mode && mode.id !== 'save' && mode.id !== 'select_note') { + if (mode && mode.id !== 'save' && mode.id !== 'select-note') { context.enter(modeBrowse(context)); } @@ -488,10 +481,11 @@ export function rendererMap(context) { .call(drawLayers); // OSM - if (map.editable()) { + if (map.editable() || map.noteEditable()) { // NOTE: when `map.noteEditable()` is removed, `redraw()` keep being called on timer context.loadTiles(projection, dimensions); drawVector(difference, extent); - } else { + } + else { editOff(); } @@ -855,6 +849,14 @@ export function rendererMap(context) { }; + map.noteEditable = function() { + var noteLayer = surface.selectAll('.data-layer-notes'); + if (!noteLayer.empty() && noteLayer.classed('disabled')) return false; + + return map.zoom() >= context.minEditableZoom(); + }; + + map.minzoom = function(_) { if (!arguments.length) return minzoom; minzoom = _; diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index 879d91757..02035d905 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -29,7 +29,8 @@ export function uiSidebar(context) { function hover(what) { - if ((what instanceof osmNote)) { + if ((what instanceof osmNote) && (context.mode().id !== 'drag-note')) { + // TODO: figure out why `what` isn't an updated note. Won't hover since .loc doesn't match _wasNote = true; var notes = d3_selectAll('.note'); notes From 26f045b16c227612eeaa7ce08c2e4cdc0cd12f43 Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Mon, 23 Jul 2018 16:17:48 -0400 Subject: [PATCH 060/217] added/updated service/osm, osm/note, mode/add_note tests --- test/index.html | 1 + test/spec/modes/add_note.js | 63 +++++++++++++++++++++++++++++++++++++ test/spec/osm/note.js | 10 ++---- test/spec/services/osm.js | 22 +++++++++++++ 4 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 test/spec/modes/add_note.js diff --git a/test/index.html b/test/index.html index b094f4b32..938c897bd 100644 --- a/test/index.html +++ b/test/index.html @@ -82,6 +82,7 @@ + diff --git a/test/spec/modes/add_note.js b/test/spec/modes/add_note.js new file mode 100644 index 000000000..7b1e7a37c --- /dev/null +++ b/test/spec/modes/add_note.js @@ -0,0 +1,63 @@ +describe('iD.modeAddNote', function() { + var context; + + before(function() { + iD.services.osm = iD.serviceOsm; + }); + + after(function() { + delete iD.services.osm; + }); + + beforeEach(function() { + var container = d3.select(document.createElement('div')); + + context = iD.Context() + .container(container); + + context.loadTiles = function () {}; + + container.call(context.map()) + .append('div') + .attr('class', 'inspector-wrap'); + + context.map().centerZoom([-77.02271, 38.90085], 20); + context.enter(iD.modeAddNote(context)); + }); + + describe('clicking the map', function () { + it('adds a note', function() { + var note = iD.osmNote({ + id: -1, + comments: {}, + loc: [-77.02271, 38.90085], + newFeature: true, + status: 'open' + }); + happen.mousedown(context.surface().node(), {}); + happen.mouseup(window, {}); + expect(iD.services.osm.caches().note.note[-1]).to.eql(note); + context.mode().exit(); + d3.select('window').on('click.draw-block', null); + }); + + it('selects the node', function() { + happen.mousedown(context.surface().node(), {}); + happen.mouseup(window, {}); + expect(context.selectedNoteID()).to.eql(-1); + expect(context.mode().id).to.equal('select-note'); + context.mode().exit(); + d3.select('window').on('click.draw-block', null); + }); + }); + + describe('pressing ⎋', function() { + it('exits to browse mode', function(done) { + happen.keydown(document, {keyCode: 27}); + window.setTimeout(function() { + expect(context.mode().id).to.equal('browse'); + done(); + }, 200); + }); + }); +}); diff --git a/test/spec/osm/note.js b/test/spec/osm/note.js index 6dc2f99ea..241dfea0b 100644 --- a/test/spec/osm/note.js +++ b/test/spec/osm/note.js @@ -1,5 +1,3 @@ -import { geoVecInterp } from '../geo'; - describe('iD.osmNote', function () { it('returns a note', function () { expect(iD.osmNote()).to.be.an.instanceOf(iD.osmNote); @@ -39,12 +37,10 @@ describe('iD.osmNote', function () { it('returns an moved note', function() { var note = iD.osmNote({ id: 1, - loc: [5, 10] + loc: [5, 5] }); - - var moveAmount = geoVecInterp(note.loc, [10, 10], 1); - note.move(moveAmount); - expect(note.loc).to.equal([10, 10]); + note = note.move([10, 10]); + expect(note.loc).to.eql([10, 10]); }); }); diff --git a/test/spec/services/osm.js b/test/spec/services/osm.js index bc1617b4c..b8080b2c5 100644 --- a/test/spec/services/osm.js +++ b/test/spec/services/osm.js @@ -658,12 +658,28 @@ describe('iD.serviceOsm', function () { }); }); + describe('#removeNote', function() { + it('removes a note that is new', function(done) { + var note = iD.osmNote({ id: -1, loc: [0, 0], }); + connection.replaceNote(note); + connection.removeNote(note); + var result = connection.getNote(-1); + expect(result).to.eql(undefined); + done(); + }); + }); + describe('#replaceNote', function() { it('returns a new note', function (done) { var note = iD.osmNote({ id: 2, loc: [0, 0], }); var result = connection.replaceNote(note); expect(result.id).to.eql(2); + expect(connection.caches().note.note[2]).to.eql(note); + var rtree = connection.caches().note.rtree; + var result_rtree = rtree.search({ 'minX': -1, 'minY': -1, 'maxX': 1, 'maxY': 1 }); + expect(result_rtree.length).to.eql(1); + expect(result_rtree[0].data).to.eql(note); done(); }); @@ -673,6 +689,12 @@ describe('iD.serviceOsm', function () { note.status = 'closed'; var result = connection.replaceNote(note); expect(result.status).to.eql('closed'); + + var rtree = connection.caches().note.rtree; + var result_rtree = rtree.search({ 'minX': -1, 'minY': -1, 'maxX': 1, 'maxY': 1 }); + expect(result_rtree.length).to.eql(1); + expect(result_rtree[0].data.status).to.eql('closed'); + done(); }); }); From 78fc2f7c27c9d1271ac1d370ae2a47a25fa93c24 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 23 Jul 2018 21:07:28 -0400 Subject: [PATCH 061/217] No longer need to pass `dimension` to loadTiles --- modules/renderer/map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/renderer/map.js b/modules/renderer/map.js index acb1f8f40..01e1fc294 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -482,7 +482,7 @@ export function rendererMap(context) { // OSM if (map.editable() || map.noteEditable()) { // NOTE: when `map.noteEditable()` is removed, `redraw()` keep being called on timer - context.loadTiles(projection, dimensions); + context.loadTiles(projection); drawVector(difference, extent); } else { From 46dc44b35baeb8a505ea1f7d0c5cd2eb35243013 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 23 Jul 2018 22:21:47 -0400 Subject: [PATCH 062/217] Make the mode buttons dynamic - show/hide the note button when the notes layer is enabled/disabled - enable/disable the note button based on notesEditable --- modules/renderer/map.js | 8 +-- modules/ui/modes.js | 127 +++++++++++++++++++++++----------------- 2 files changed, 76 insertions(+), 59 deletions(-) diff --git a/modules/renderer/map.js b/modules/renderer/map.js index 01e1fc294..050142720 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -212,7 +212,7 @@ export function rendererMap(context) { .call(context.background()); context.on('enter.map', function() { - if ((map.editable() && !_transformed) || map.noteEditable()) { + if (map.editable() && !_transformed) { // redraw immediately any objects affected by a change in selectedIDs. var graph = context.graph(); var selectedAndParents = {}; @@ -240,7 +240,6 @@ export function rendererMap(context) { dispatch.call('drawn', this, { full: false }); - // redraw everything else later scheduleRedraw(); } @@ -481,7 +480,8 @@ export function rendererMap(context) { .call(drawLayers); // OSM - if (map.editable() || map.noteEditable()) { // NOTE: when `map.noteEditable()` is removed, `redraw()` keep being called on timer + // NOTE: when `map.notesEditable()` is removed, `redraw()` keep being called on timer + if (map.editable() || map.notesEditable()) { context.loadTiles(projection); drawVector(difference, extent); } @@ -849,7 +849,7 @@ export function rendererMap(context) { }; - map.noteEditable = function() { + map.notesEditable = function() { var noteLayer = surface.selectAll('.data-layer-notes'); if (!noteLayer.empty() && noteLayer.classed('disabled')) return false; diff --git a/modules/ui/modes.js b/modules/ui/modes.js index c1c268fb2..dbff2e88e 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -3,8 +3,6 @@ import _debounce from 'lodash-es/debounce'; import { select as d3_select } from 'd3-selection'; import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; -import { svgNotes } from '../svg'; - import { modeAddArea, modeAddLine, @@ -32,53 +30,18 @@ export function uiModes(context) { return context.editable() && mode && mode.id !== 'save'; } + function notesEnabled() { + var noteLayer = context.layers().layer('notes'); + return noteLayer && noteLayer.enabled(); + } - function toggleNewNote() { - return svgNotes().enabled() - && context.connection().authenticated() - && ~~context.map().zoom() >= 16; + function notesEditable() { + var mode = context.mode(); + return context.map().notesEditable() && mode && mode.id !== 'save'; } return function(selection) { - var buttons = selection.selectAll('button.add-button') - .data(modes); - - buttons = buttons.enter() - .append('button') - .attr('tabindex', -1) - .attr('class', function(mode) { return mode.id + ' add-button col3'; }) - .on('click.mode-buttons', function(mode) { - //TODO: prevent modeBrowse when in modeAddNote & osm layer is turned off - // When drawing, ignore accidental clicks on mode buttons - #4042 - var currMode = context.mode().id; - if (currMode.match(/^draw/) !== null) return; - - if (mode.id === currMode) { - context.enter(modeBrowse(context)); - } else { - context.enter(mode); - } - }) - .call(tooltip() - .placement('bottom') - .html(true) - .title(function(mode) { - return uiTooltipHtml(mode.description, mode.key); - }) - ); - - buttons - .each(function(d) { - d3_select(this) - .call(svgIcon('#iD-icon-' + d.button, 'pre-text')); - }); - - buttons - .append('span') - .attr('class', 'label') - .text(function(mode) { return mode.title; }); - context .on('enter.editor', function(entered) { selection.selectAll('button.add-button') @@ -97,12 +60,13 @@ export function uiModes(context) { modes.forEach(function(mode) { keybinding.on(mode.key, function() { - if ((editable() && mode.id !== 'add-note') || (toggleNewNote() && mode.id === 'add-note')) { - if (mode.id === context.mode().id) { - context.enter(modeBrowse(context)); - } else { - context.enter(mode); - } + if (mode.id === 'add-note' && !notesEditable()) return; + if (mode.id !== 'add-note' && !editable()) return; + + if (mode.id === context.mode().id) { + context.enter(modeBrowse(context)); + } else { + context.enter(mode); } }); }); @@ -120,14 +84,67 @@ export function uiModes(context) { context .on('enter.modes', update); + update(); + function update() { - selection.selectAll('button.add-button') - .filter(function(d) { return d.id !== 'add-note'; }) // disable all but add-note - .property('disabled', !editable()); + var showNotes = notesEnabled(); + var data = showNotes ? modes : modes.slice(0, 3); - selection.selectAll('button.add-note') // disable add-note - .property('disabled', !toggleNewNote()); + selection + .classed('col3', !showNotes) // 25% + .classed('col4', showNotes); // 33% + + var buttons = selection.selectAll('button.add-button') + .data(data, function(d) { return d.id; }); + + // exit + buttons.exit() + .remove(); + + // enter + var buttonsEnter = buttons.enter() + .append('button') + .attr('tabindex', -1) + .attr('class', function(d) { return d.id + ' add-button'; }) + .on('click.mode-buttons', function(mode) { + // When drawing, ignore accidental clicks on mode buttons - #4042 + var currMode = context.mode().id; + if (currMode.match(/^draw/) !== null) return; + + if (mode.id === currMode) { + context.enter(modeBrowse(context)); + } else { + context.enter(mode); + } + }) + .call(tooltip() + .placement('bottom') + .html(true) + .title(function(mode) { + return uiTooltipHtml(mode.description, mode.key); + }) + ); + + buttonsEnter + .each(function(d) { + d3_select(this) + .call(svgIcon('#iD-icon-' + d.button, 'pre-text')); + }); + + buttonsEnter + .append('span') + .attr('class', 'label') + .text(function(mode) { return mode.title; }); + + // update + buttons = buttons + .merge(buttonsEnter) + .classed('col3', showNotes) // 25% + .classed('col4', !showNotes) // 33% + .property('disabled', function(d) { + return d.id === 'add-note' ? !notesEditable() : !editable(); + }); } }; } From eca326a1dd962efa5ca86f4c6ebce2ffe50c2a7a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 23 Jul 2018 22:50:19 -0400 Subject: [PATCH 063/217] Improve the look of the Add Note button icon --- css/80_app.css | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/css/80_app.css b/css/80_app.css index c6c8c0d91..dc7c00f7a 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -588,6 +588,20 @@ button.save.has-count .count::before { right: -6px; } +button.add-note svg.icon { + height: 15px; + width: 15px; + color: rgba(0,0,0,0.25); + stroke-width: 60; + stroke: black; + margin-top: 3px; + margin-right: 7px; +} +[dir='rtl'] button.add-note svg.icon { + margin-left: 7px; + margin-right: unset; +} + /* Icons */ .icon { From a3dc0e8213cc12f211c1f92f33ae49e44d025442 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 23 Jul 2018 23:20:34 -0400 Subject: [PATCH 064/217] Shrink annotations, add margin between note header and comments --- css/65_data.css | 9 +++++---- modules/svg/notes.js | 13 ++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/css/65_data.css b/css/65_data.css index a8367e1fe..3267a0d5c 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -39,14 +39,14 @@ .note-header-icon .note-icon-annotation { position: absolute; - top: 21px; - left: 21px; + top: 22px; + left: 22px; margin: auto; } .note-header-icon .note-icon-annotation .icon { - width: 18px; - height: 18px; + width: 15px; + height: 15px; } @@ -101,6 +101,7 @@ background: #ececec; padding: 1px 10px; border-radius: 8px; + margin-top: 20px; } .comment { diff --git a/modules/svg/notes.js b/modules/svg/notes.js index f516922c9..3adcced5a 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -99,7 +99,7 @@ export function svgNotes(projection, context, dispatch) { var notesEnter = notes.enter() .append('g') .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; }) - .classed('new', function(d){ return d.id < 0; }); + .classed('new', function(d) { return d.id < 0; }); notesEnter .append('path') @@ -122,16 +122,15 @@ export function svgNotes(projection, context, dispatch) { .attr('y', '-22px') .attr('xlink:href', '#iD-icon-note'); - // add dots if there's a comment thread notesEnter.selectAll('.note-annotation') .data(function(d) { return [d]; }) .enter() .append('use') - .attr('class', 'note-annotation thread') - .attr('width', '14px') - .attr('height', '14px') - .attr('x', '-5px') - .attr('y', '-21px') + .attr('class', 'note-annotation') + .attr('width', '10px') + .attr('height', '10px') + .attr('x', '-3px') + .attr('y', '-19px') .attr('xlink:href', function(d) { return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply')); }); From 6dcb879990e918b74769ebcd4f2e4a564cef5211 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 23 Jul 2018 23:39:10 -0400 Subject: [PATCH 065/217] Remove notes and deselect any selected note when disabling notes layer --- modules/svg/notes.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/svg/notes.js b/modules/svg/notes.js index 3adcced5a..f4f5048ec 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -3,6 +3,7 @@ import _throttle from 'lodash-es/throttle'; import { select as d3_select } from 'd3-selection'; import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { modeBrowse } from '../modes'; import { svgPointTransform } from './index'; import { services } from '../services'; @@ -51,7 +52,7 @@ export function svgNotes(projection, context, dispatch) { function showLayer() { - // editOn(); + editOn(); layer .classed('disabled', false) @@ -66,7 +67,7 @@ export function svgNotes(projection, context, dispatch) { function hideLayer() { - // editOff(); + editOff(); throttledRedraw.cancel(); layer.interrupt(); @@ -179,14 +180,19 @@ export function svgNotes(projection, context, dispatch) { } } - drawNotes.enabled = function(_) { + drawNotes.enabled = function(val) { if (!arguments.length) return svgNotes.enabled; - svgNotes.enabled = _; + + svgNotes.enabled = val; if (svgNotes.enabled) { showLayer(); } else { hideLayer(); + if (context.selectedNoteID()) { + context.enter(modeBrowse(context)); + } } + dispatch.call('change'); return this; }; From 0334e7b353b39d6c58c83eba4e77321041600e00 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 00:16:37 -0400 Subject: [PATCH 066/217] Visibility stuff - Draw ellipse below note shadow - Use brighter color for new note - Use thicker stroke for note shadow (same width as point) --- css/20_map.css | 8 +------- css/55_cursors.css | 3 ++- css/65_data.css | 2 +- modules/svg/notes.js | 10 +++++----- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/css/20_map.css b/css/20_map.css index a715b6bf0..6ec2927ba 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -87,14 +87,8 @@ g.point .stroke { fill: #fff; } +g.point .shadow, g.note .shadow { - fill: none; - stroke: #f6634f; - stroke-width: 8; - stroke-opacity: 0; -} - -g.point .shadow { fill: none; stroke: #f6634f; stroke-width: 16; diff --git a/css/55_cursors.css b/css/55_cursors.css index 8247876db..466e21ae2 100644 --- a/css/55_cursors.css +++ b/css/55_cursors.css @@ -58,7 +58,8 @@ .mode-draw-area #map, .mode-add-line #map, .mode-add-area #map, -.mode-drag-node #map { +.mode-drag-node #map, +.mode-drag-note #map { cursor: crosshair; /* Opera */ cursor: url(img/cursor-draw.png) 9 9, crosshair; /* FF */ } diff --git a/css/65_data.css b/css/65_data.css index 3267a0d5c..bae3c4818 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -23,7 +23,7 @@ } .note-header-icon.new .note-fill, .layer-notes .note.new .note-fill { - color: #00bcdd; + color: #ffee00; stroke: #333; } .note-header-icon.closed .note-fill, diff --git a/modules/svg/notes.js b/modules/svg/notes.js index f4f5048ec..bc97adb55 100644 --- a/modules/svg/notes.js +++ b/modules/svg/notes.js @@ -19,7 +19,7 @@ export function svgNotes(projection, context, dispatch) { selection .attr('class', klass) .attr('transform', 'translate(-8, -22)') - .attr('d', 'm17.49424,0l-14.99506,0c-1.37845,0 -2.49918,1.12072 -2.49918,2.49918l0,11.24629c0,1.37845 1.12072,2.49918 2.49918,2.49918l3.74876,0l0,3.28017c0,0.38269 0.43736,0.60527 0.74585,0.37878l4.8773,-3.65895l5.62315,0c1.37845,0 2.49918,-1.12072 2.49918,-2.49918l0,-11.24629c0,-1.37845 -1.12072,-2.49918 -2.49918,-2.49918z'); + .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z'); } function init() { @@ -102,10 +102,6 @@ export function svgNotes(projection, context, dispatch) { .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; }) .classed('new', function(d) { return d.id < 0; }); - notesEnter - .append('path') - .call(markerPath, 'shadow'); - notesEnter .append('ellipse') .attr('cx', 0.5) @@ -114,6 +110,10 @@ export function svgNotes(projection, context, dispatch) { .attr('ry', 3) .attr('class', 'stroke'); + notesEnter + .append('path') + .call(markerPath, 'shadow'); + notesEnter .append('use') .attr('class', 'note-fill') From 3abca299b54db955ab5e67a8cdfd4a4fd6e75e6a Mon Sep 17 00:00:00 2001 From: Thomas Hervey Date: Tue, 24 Jul 2018 09:17:12 -0400 Subject: [PATCH 067/217] cleaned unused vars --- modules/modes/add_note.js | 4 ---- modules/modes/drag_note.js | 32 ++++++-------------------------- modules/modes/select.js | 2 +- 3 files changed, 7 insertions(+), 31 deletions(-) diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index 685dcf3c7..e2aaab7b3 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -3,14 +3,10 @@ import { behaviorDraw } from '../behavior'; import { modeBrowse, modeSelectNote } from './index'; import { osmNote } from '../osm'; import { services } from '../services'; -import { dispatch as d3_dispatch } from 'd3-dispatch'; - export function modeAddNote(context) { - var dispatch = d3_dispatch('change'); - var mode = { id: 'add-note', button: 'note', diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index f51e9bdcc..ed42e8ba7 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -1,25 +1,15 @@ -import _find from 'lodash-es/find'; - import { event as d3_event, select as d3_select } from 'd3-selection'; -import { dispatch as d3_dispatch } from 'd3-dispatch'; - import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; import { geoVecInterp } from '../geo'; -import { t } from '../util/locale'; - import { services } from '../services'; - import { - actionAddMidpoint, - actionConnect, - actionMoveNode, actionNoop } from '../actions'; @@ -30,16 +20,11 @@ import { } from '../behavior'; import { - geoChooseEdge, - geoHasLineIntersections, - geoHasSelfIntersections, geoVecSubtract, geoViewportEdge } from '../geo'; import { modeBrowse, modeSelectNote } from './index'; -import { osmJoinWays, osmNode } from '../osm'; -import { uiFlash } from '../ui'; export function modeDragNote(context) { @@ -51,14 +36,10 @@ export function modeDragNote(context) { .on('hover', context.ui().sidebar.hover); var edit = behaviorEdit(context); - var dispatch = d3_dispatch('redraw', 'change'); - var _nudgeInterval; var _restoreSelectedNoteID = []; - var _wasMidpoint = false; var _isCancelled = false; var _activeEntity; - var _startLoc; var _lastLoc; @@ -112,7 +93,6 @@ export function modeDragNote(context) { function start(entity) { _activeEntity = entity; - _startLoc = entity.loc; context.surface().selectAll('.note-' + _activeEntity.id) .classed('active', true); @@ -130,12 +110,12 @@ export function modeDragNote(context) { _lastLoc = context.projection.invert(d3_event.point); doMove(entity); - // var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); - // if (nudge) { - // startNudge(entity, nudge); - // } else { - // stopNudge(); - // } + var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); + if (nudge) { + startNudge(entity, nudge); + } else { + stopNudge(); + } } diff --git a/modules/modes/select.js b/modules/modes/select.js index 917fa9548..57f9b18b9 100644 --- a/modules/modes/select.js +++ b/modules/modes/select.js @@ -65,7 +65,7 @@ export function modeSelect(context, selectedIDs) { behaviorSelect(context), behaviorLasso(context), modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior, - modeDragNote(context).restoreSelectedNoteID(selectedIDs).behavior // TODO: - likely remove + modeDragNote(context).restoreSelectedNoteID(selectedIDs).behavior ]; var inspector; var editMenu; From 45f01a638f2f4ee32d78538b3345b0194c1d312e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 11:36:08 -0400 Subject: [PATCH 068/217] Mention Bing Streetside in help text --- data/core.yaml | 2 +- dist/locales/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 7767695bd..01758a331 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -797,7 +797,7 @@ en: offset_change: "Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment." streetlevel: title: Street Level Photos - intro: "Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org)." + intro: "Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), and [OpenStreetCam](https://www.openstreetcam.org)." using_h: "Using Street Level Photos" using: "To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers." photos: "When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken." diff --git a/dist/locales/en.json b/dist/locales/en.json index 2fbf4fde3..683d76d88 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -944,7 +944,7 @@ }, "streetlevel": { "title": "Street Level Photos", - "intro": "Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), and [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Using Street Level Photos", "using": "To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.", "photos": "When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.", From 640596340e596b1b9fd312ca55708cc93362c4a7 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 12:38:51 -0400 Subject: [PATCH 069/217] Improve the add-note icon in help, minor changes to help text --- css/65_data.css | 3 +++ css/80_app.css | 13 +++++++++++-- data/core.yaml | 9 +++++---- dist/locales/en.json | 9 +++++---- modules/ui/help.js | 6 ++++-- svg/iD-sprite/icons/icon-note.svg | 2 +- 6 files changed, 29 insertions(+), 13 deletions(-) diff --git a/css/65_data.css b/css/65_data.css index bae3c4818..962311fee 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -20,16 +20,19 @@ .layer-notes .note .note-fill { color: #ff3300; stroke: #333; + stroke-width: 40px; } .note-header-icon.new .note-fill, .layer-notes .note.new .note-fill { color: #ffee00; stroke: #333; + stroke-width: 40px; } .note-header-icon.closed .note-fill, .layer-notes .note.closed .note-fill { color: #55dd00; stroke: #333; + stroke-width: 40px; } /* slight adjustments to preset icon for note icons */ diff --git a/css/80_app.css b/css/80_app.css index dc7c00f7a..6558bb99c 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -588,19 +588,28 @@ button.save.has-count .count::before { right: -6px; } +.help-wrap svg.icon.pre-text.add-note, button.add-note svg.icon { height: 15px; width: 15px; color: rgba(0,0,0,0.25); - stroke-width: 60; - stroke: black; + stroke: #333; + stroke-width: 60px; margin-top: 3px; +} +button.add-note svg.icon { + margin-left: unset; margin-right: 7px; } [dir='rtl'] button.add-note svg.icon { margin-left: 7px; margin-right: unset; } +.help-wrap svg.icon.pre-text.add-note { + margin-left: 3px; + margin-right: 3px; +} + /* Icons */ diff --git a/data/core.yaml b/data/core.yaml index 01758a331..df3ba1d3f 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -779,13 +779,14 @@ en: boundary_add: "To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation." notes: title: Notes - intro: "*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel or press the shortcut key `` to enable the notes layer." + intro: "*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer." add_note_h: "Adding Notes" add_note: "To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`." - move_note: "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location. Once acceptable, give the note a description and click `Add Note`." + move_note: "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location." update_note_h: "Closing, Reopening, and Commenting" - update_note: "An existing note can be updated by closing it, reopening it, or commenting on it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original or a previous issue is not resolved, or that there is a new issue. A comment on a note is for discussion." - update_note_command: "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed. Notes are not features and updates must be saved individually." + update_note: "An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved." + save_note_h: "Saving Notes" + save_note: "You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap." imagery: title: Background Imagery intro: "The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data." diff --git a/dist/locales/en.json b/dist/locales/en.json index 683d76d88..1d8e703e6 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -924,13 +924,14 @@ }, "notes": { "title": "Notes", - "intro": "*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel or press the shortcut key `` to enable the notes layer.", + "intro": "*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.", "add_note_h": "Adding Notes", "add_note": "To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.", - "move_note": "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location. Once acceptable, give the note a description and click `Add Note`.", + "move_note": "Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.", "update_note_h": "Closing, Reopening, and Commenting", - "update_note": "An existing note can be updated by closing it, reopening it, or commenting on it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original or a previous issue is not resolved, or that there is a new issue. A comment on a note is for discussion.", - "update_note_command": "To update a note, {leftclick} left-click on the note to select it and show the edit menu, then update as needed. Notes are not features and updates must be saved individually." + "update_note": "An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.", + "save_note_h": "Saving Notes", + "save_note": "You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap." }, "imagery": { "title": "Background Imagery", diff --git a/modules/ui/help.js b/modules/ui/help.js index a5901b2a9..29942ca2a 100644 --- a/modules/ui/help.js +++ b/modules/ui/help.js @@ -154,7 +154,8 @@ export function uiHelp(context) { 'move_note', 'update_note_h', 'update_note', - 'update_note_command' + 'save_note_h', + 'save_note' ]], ['imagery', [ @@ -222,6 +223,7 @@ export function uiHelp(context) { 'help.relations.boundary_h': 3, 'help.notes.add_note_h': 3, 'help.notes.update_note_h': 3, + 'help.notes.save_note_h': 3, 'help.imagery.sources_h': 3, 'help.imagery.offsets_h': 3, 'help.streetlevel.using_h': 3, @@ -232,7 +234,7 @@ export function uiHelp(context) { point: icon('#iD-icon-point', 'pre-text'), line: icon('#iD-icon-line', 'pre-text'), area: icon('#iD-icon-area', 'pre-text'), - note: icon('#iD-icon-note', 'pre-text'), + note: icon('#iD-icon-note', 'pre-text add-note'), plus: icon('#iD-icon-plus', 'pre-text'), minus: icon('#iD-icon-minus', 'pre-text'), orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'), diff --git a/svg/iD-sprite/icons/icon-note.svg b/svg/iD-sprite/icons/icon-note.svg index 11033f707..c531a3212 100644 --- a/svg/iD-sprite/icons/icon-note.svg +++ b/svg/iD-sprite/icons/icon-note.svg @@ -1,5 +1,5 @@ - + From 89ad6439779b13f3b5561e65b3454e1452253129 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 14:10:00 -0400 Subject: [PATCH 070/217] Let new note generate its own id, instead of using -1 Also stringify the note id (because existing notes from OSM are this way) Also make sure comments is initialized as an Array not an Object Also clarify some of the tests --- modules/modes/add_note.js | 12 ++++------- modules/osm/note.js | 2 +- modules/services/osm.js | 10 ++++----- test/spec/modes/add_note.js | 42 ++++++++++++++++++------------------ test/spec/modes/add_point.js | 4 ++-- 5 files changed, 32 insertions(+), 38 deletions(-) diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index e2aaab7b3..36f3d8989 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -23,15 +23,11 @@ export function modeAddNote(context) { function add(loc) { - var note = osmNote({ - id: -1, - loc: loc, - status: 'open', - comments: {}, - newFeature: true - }); + var osm = services.osm; + if (!osm) return; - services.osm.replaceNote(note); + var note = osmNote({ loc: loc, status: 'open', comments: [] }); + osm.replaceNote(note); context .selectedNoteID(note.id) diff --git a/modules/osm/note.js b/modules/osm/note.js index c11207440..305849cae 100644 --- a/modules/osm/note.js +++ b/modules/osm/note.js @@ -39,7 +39,7 @@ _extend(osmNote.prototype, { } if (!this.id) { - this.id = osmNote.id(); + this.id = osmNote.id() + ''; // as string } return this; diff --git a/modules/services/osm.js b/modules/services/osm.js index 2a3c45041..5a7d42757 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -338,16 +338,14 @@ function parseXML(xml, callback, options) { // replace or remove note from rtree -function updateRtree(item, replace) { // update (or insert) in _noteCache.rtree - +function updateRtree(item, replace) { // NOTE: other checks needed? (e.g., if cache.data.children.length decrements ...) - // remove note _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); - if (replace) { - _noteCache.rtree.insert(item); // add note (updated) - } + if (replace) { + _noteCache.rtree.insert(item); + } } diff --git a/test/spec/modes/add_note.js b/test/spec/modes/add_note.js index 7b1e7a37c..da25a8e09 100644 --- a/test/spec/modes/add_note.js +++ b/test/spec/modes/add_note.js @@ -12,7 +12,7 @@ describe('iD.modeAddNote', function() { beforeEach(function() { var container = d3.select(document.createElement('div')); - context = iD.Context() + context = iD.coreContext() .container(container); context.loadTiles = function () {}; @@ -28,10 +28,9 @@ describe('iD.modeAddNote', function() { describe('clicking the map', function () { it('adds a note', function() { var note = iD.osmNote({ - id: -1, - comments: {}, + id: '-1', + comments: [], loc: [-77.02271, 38.90085], - newFeature: true, status: 'open' }); happen.mousedown(context.surface().node(), {}); @@ -41,23 +40,24 @@ describe('iD.modeAddNote', function() { d3.select('window').on('click.draw-block', null); }); - it('selects the node', function() { - happen.mousedown(context.surface().node(), {}); - happen.mouseup(window, {}); - expect(context.selectedNoteID()).to.eql(-1); - expect(context.mode().id).to.equal('select-note'); - context.mode().exit(); - d3.select('window').on('click.draw-block', null); - }); + // this won't work because draw behavior can only snap to entities, not notes + // it('selects an existing note rather than adding a new one', function() { + // happen.mousedown(context.surface().node(), {}); + // happen.mouseup(window, {}); + // expect(context.selectedNoteID()).to.eql(-1); + // expect(context.mode().id).to.equal('select-note'); + // context.mode().exit(); + // d3.select('window').on('click.draw-block', null); + // }); }); - describe('pressing ⎋', function() { - it('exits to browse mode', function(done) { - happen.keydown(document, {keyCode: 27}); - window.setTimeout(function() { - expect(context.mode().id).to.equal('browse'); - done(); - }, 200); - }); - }); + // describe('pressing ⎋', function() { + // it('exits to browse mode', function(done) { + // happen.keydown(document, {keyCode: 27}); + // window.setTimeout(function() { + // expect(context.mode().id).to.equal('browse'); + // done(); + // }, 200); + // }); + // }); }); diff --git a/test/spec/modes/add_point.js b/test/spec/modes/add_point.js index 66916c577..8954ca63c 100644 --- a/test/spec/modes/add_point.js +++ b/test/spec/modes/add_point.js @@ -18,7 +18,7 @@ describe.skip('iD.modeAddPoint', function() { }); describe('clicking the map', function () { - it('adds a node', function() { + it('adds a point', function() { happen.mousedown(context.surface().node(), {}); happen.mouseup(window, {}); expect(context.changes().created).to.have.length(1); @@ -26,7 +26,7 @@ describe.skip('iD.modeAddPoint', function() { d3.select('window').on('click.draw-block', null); }); - it('selects the node', function() { + it('selects an existing point rather than adding a new one', function() { happen.mousedown(context.surface().node(), {}); happen.mouseup(window, {}); expect(context.mode().id).to.equal('select'); From a406da953d92f448b45316cf95d3348eb9bbc6bc Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 14:26:25 -0400 Subject: [PATCH 071/217] Remove actionMoveNote Notes aren't stored in the graph, so moving them isn't an action --- modules/actions/index.js | 3 +-- modules/actions/move_note.js | 17 ----------------- 2 files changed, 1 insertion(+), 19 deletions(-) delete mode 100644 modules/actions/move_note.js diff --git a/modules/actions/index.js b/modules/actions/index.js index d57c0f5fd..636802d0b 100644 --- a/modules/actions/index.js +++ b/modules/actions/index.js @@ -23,7 +23,6 @@ export { actionMergePolygon } from './merge_polygon'; export { actionMergeRemoteChanges } from './merge_remote_changes'; export { actionMove } from './move'; export { actionMoveNode } from './move_node'; -export { actionMoveNote } from './move_note'; export { actionNoop } from './noop'; export { actionOrthogonalize } from './orthogonalize'; export { actionRestrictTurn } from './restrict_turn'; @@ -34,4 +33,4 @@ export { actionSplit } from './split'; export { actionStraighten } from './straighten'; export { actionUnrestrictTurn } from './unrestrict_turn'; export { actionReflect } from './reflect.js'; -export { actionDetachNode } from './detach_node'; \ No newline at end of file +export { actionDetachNode } from './detach_node'; diff --git a/modules/actions/move_note.js b/modules/actions/move_note.js deleted file mode 100644 index 97d89b97a..000000000 --- a/modules/actions/move_note.js +++ /dev/null @@ -1,17 +0,0 @@ -import { geoVecInterp } from '../geo'; -import { services } from '../services'; - -export function actionMoveNote(noteID, toLoc) { - - var action = function(graph, t) { - if (t === null || !isFinite(t)) t = 1; - t = Math.min(Math.max(+t, 0), 1); - - var note = services.osm.getNote(noteID); - note.move(geoVecInterp(note.loc, toLoc, t)); - }; - - action.transitionable = true; - - return action; -} From 0552a90a9f30e1cdd5c85b35f51bc7153c0f3675 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 14:58:04 -0400 Subject: [PATCH 072/217] Remove category field - it's not an osm tag --- data/presets.yaml | 20 -------- data/presets/fields.json | 1 - data/presets/fields/category.json | 25 ---------- data/taginfo.json | 81 ------------------------------- dist/locales/en.json | 13 ----- modules/services/osm.js | 6 +-- modules/ui/note_editor.js | 56 ++++++++++----------- 7 files changed, 30 insertions(+), 172 deletions(-) delete mode 100644 data/presets/fields/category.json diff --git a/data/presets.yaml b/data/presets.yaml index 1061a765f..a5c716a72 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -304,26 +304,6 @@ en: castle_type: # castle_type=* label: Type - category: - # 'none=*, updateDetails=*, missing=*, wrongLocation=*, groundtruth=*, doesNotExist=*, discussion=*' - label: Category - options: - # discussion=yes - discussion: Needs discussing - # doesNotExist=yes - doesNotExist: Does not or never existed - # groundtruth=yes - groundtruth: Ground truth or needs local confirmation - # missing=yes - missing: Something is missing - # none=yes - none: None - # updateDetails=yes - updateDetails: Update or add details - # wrongLocation=yes - wrongLocation: Wrong location - # category field placeholder - placeholder: Unknown clothes: # clothes=* label: Clothes diff --git a/data/presets/fields.json b/data/presets/fields.json index e1018de87..d295ff913 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -49,7 +49,6 @@ "capacity": {"key": "capacity", "type": "number", "minValue": 0, "label": "Capacity", "placeholder": "50, 100, 200..."}, "cash_in": {"key": "cash_in", "type": "check", "label": "Cash In"}, "castle_type": {"key": "castle_type", "type": "combo", "label": "Type"}, - "category": {"type": "radio", "keys": ["none", "updateDetails", "missing", "wrongLocation", "groundtruth", "doesNotExist", "discussion"], "label": "Category", "placeholder": "Unknown", "strings": {"options": {"none": "None", "updateDetails": "Update or add details", "missing": "Something is missing", "wrongLocation": "Wrong location", "groundtruth": "Ground truth or needs local confirmation", "doesNotExist": "Does not or never existed", "discussion": "Needs discussing"}}}, "clothes": {"key": "clothes", "type": "semiCombo", "label": "Clothes"}, "club": {"key": "club", "type": "typeCombo", "label": "Type"}, "collection_times": {"key": "collection_times", "type": "text", "label": "Collection Times"}, diff --git a/data/presets/fields/category.json b/data/presets/fields/category.json deleted file mode 100644 index 1af4a78b8..000000000 --- a/data/presets/fields/category.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "radio", - "keys": [ - "none", - "updateDetails", - "missing", - "wrongLocation", - "groundtruth", - "doesNotExist", - "discussion" - ], - "label": "Category", - "placeholder": "Unknown", - "strings": { - "options": { - "none": "None", - "updateDetails": "Update or add details", - "missing": "Something is missing", - "wrongLocation": "Wrong location", - "groundtruth": "Ground truth or needs local confirmation", - "doesNotExist": "Does not or never existed", - "discussion": "Needs discussing" - } - } -} diff --git a/data/taginfo.json b/data/taginfo.json index a22acfd27..50d522098 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -6375,87 +6375,6 @@ {"key": "capacity", "description": "Capacity"}, {"key": "cash_in", "description": "Cash In"}, {"key": "castle_type", "description": "Type"}, - {"key": "none", "value": "none", "description": "Category"}, - {"key": "none", "value": "updateDetails", "description": "Category"}, - {"key": "none", "value": "missing", "description": "Category"}, - {"key": "none", "value": "wrongLocation", "description": "Category"}, - {"key": "none", "value": "groundtruth", "description": "Category"}, - {"key": "none", "value": "doesNotExist", "description": "Category"}, - {"key": "none", "value": "discussion", "description": "Category"}, - {"key": "updateDetails", "value": "none", "description": "Category"}, - { - "key": "updateDetails", - "value": "updateDetails", - "description": "Category" - }, - {"key": "updateDetails", "value": "missing", "description": "Category"}, - { - "key": "updateDetails", - "value": "wrongLocation", - "description": "Category" - }, - {"key": "updateDetails", "value": "groundtruth", "description": "Category"}, - { - "key": "updateDetails", - "value": "doesNotExist", - "description": "Category" - }, - {"key": "updateDetails", "value": "discussion", "description": "Category"}, - {"key": "missing", "value": "none", "description": "Category"}, - {"key": "missing", "value": "updateDetails", "description": "Category"}, - {"key": "missing", "value": "missing", "description": "Category"}, - {"key": "missing", "value": "wrongLocation", "description": "Category"}, - {"key": "missing", "value": "groundtruth", "description": "Category"}, - {"key": "missing", "value": "doesNotExist", "description": "Category"}, - {"key": "missing", "value": "discussion", "description": "Category"}, - {"key": "wrongLocation", "value": "none", "description": "Category"}, - { - "key": "wrongLocation", - "value": "updateDetails", - "description": "Category" - }, - {"key": "wrongLocation", "value": "missing", "description": "Category"}, - { - "key": "wrongLocation", - "value": "wrongLocation", - "description": "Category" - }, - {"key": "wrongLocation", "value": "groundtruth", "description": "Category"}, - { - "key": "wrongLocation", - "value": "doesNotExist", - "description": "Category" - }, - {"key": "wrongLocation", "value": "discussion", "description": "Category"}, - {"key": "groundtruth", "value": "none", "description": "Category"}, - {"key": "groundtruth", "value": "updateDetails", "description": "Category"}, - {"key": "groundtruth", "value": "missing", "description": "Category"}, - {"key": "groundtruth", "value": "wrongLocation", "description": "Category"}, - {"key": "groundtruth", "value": "groundtruth", "description": "Category"}, - {"key": "groundtruth", "value": "doesNotExist", "description": "Category"}, - {"key": "groundtruth", "value": "discussion", "description": "Category"}, - {"key": "doesNotExist", "value": "none", "description": "Category"}, - { - "key": "doesNotExist", - "value": "updateDetails", - "description": "Category" - }, - {"key": "doesNotExist", "value": "missing", "description": "Category"}, - { - "key": "doesNotExist", - "value": "wrongLocation", - "description": "Category" - }, - {"key": "doesNotExist", "value": "groundtruth", "description": "Category"}, - {"key": "doesNotExist", "value": "doesNotExist", "description": "Category"}, - {"key": "doesNotExist", "value": "discussion", "description": "Category"}, - {"key": "discussion", "value": "none", "description": "Category"}, - {"key": "discussion", "value": "updateDetails", "description": "Category"}, - {"key": "discussion", "value": "missing", "description": "Category"}, - {"key": "discussion", "value": "wrongLocation", "description": "Category"}, - {"key": "discussion", "value": "groundtruth", "description": "Category"}, - {"key": "discussion", "value": "doesNotExist", "description": "Category"}, - {"key": "discussion", "value": "discussion", "description": "Category"}, {"key": "clothes", "description": "Clothes"}, {"key": "collection_times", "description": "Collection Times"}, {"key": "comment", "description": "Changeset Comment"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 1d8e703e6..ed1de77b6 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1688,19 +1688,6 @@ "castle_type": { "label": "Type" }, - "category": { - "label": "Category", - "placeholder": "Unknown", - "options": { - "none": "None", - "updateDetails": "Update or add details", - "missing": "Something is missing", - "wrongLocation": "Wrong location", - "groundtruth": "Ground truth or needs local confirmation", - "doesNotExist": "Does not or never existed", - "discussion": "Needs discussing" - } - }, "clothes": { "label": "Clothes" }, diff --git a/modules/services/osm.js b/modules/services/osm.js index 5a7d42757..45b49731b 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -885,10 +885,8 @@ export default { var comment = note.newComment; if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; } - var path = '/api/0.6/notes?' + - 'lat=' + note.loc[1] + - '&lon=' + note.loc[0] + - '&' + utilQsString({ text: comment }); + + var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment }); _noteCache.inflightPost[note.id] = oauth.xhr( { method: 'POST', path: path }, diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index 80f2de604..e5d6a081a 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -114,39 +114,39 @@ export function uiNoteEditor(context) { .append('div') .attr('class', 'note-save save-section cf'); - // if new note, show categories to pick from - if (_note.isNew()) { - var presets = context.presets(); + // // if new note, show categories to pick from + // if (_note.isNew()) { + // var presets = context.presets(); - // NOTE: this key isn't a age and therefore there is no documentation (yet) - _fieldsArr = [ - uiField(context, presets.field('category'), null, { show: true, revert: false }), - ]; + // // NOTE: this key isn't a age and therefore there is no documentation (yet) + // _fieldsArr = [ + // uiField(context, presets.field('category'), null, { show: true, revert: false }), + // ]; - _fieldsArr.forEach(function(field) { - field - .on('change', changeCategory); - }); + // _fieldsArr.forEach(function(field) { + // field + // .on('change', changeCategory); + // }); - noteSaveEnter - .append('div') - .attr('class', 'note-category') - .call(formFields.fieldsArr(_fieldsArr)); - } + // noteSaveEnter + // .append('div') + // .attr('class', 'note-category') + // .call(formFields.fieldsArr(_fieldsArr)); + // } - function changeCategory() { - // NOTE: perhaps there is a better way to get value - var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined; + // function changeCategory() { + // // NOTE: perhaps there is a better way to get value + // var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined; - // store the unsaved category with the note itself - _note = _note.update({ newCategory: val }); - var osm = services.osm; - if (osm) { - osm.replaceNote(_note); // update note cache - } - noteSave - .call(noteSaveButtons); - } + // // store the unsaved category with the note itself + // _note = _note.update({ newCategory: val }); + // var osm = services.osm; + // if (osm) { + // osm.replaceNote(_note); // update note cache + // } + // noteSave + // .call(noteSaveButtons); + // } noteSaveEnter .append('h4') From 63614d5909107f5f4fbef248e79a3ee162c18a5a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 15:14:26 -0400 Subject: [PATCH 073/217] formatting --- data/shortcuts.json | 6 ++---- modules/renderer/map.js | 5 ++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/data/shortcuts.json b/data/shortcuts.json index 45ce5aad7..fadc50fca 100644 --- a/data/shortcuts.json +++ b/data/shortcuts.json @@ -165,13 +165,11 @@ "text": "shortcuts.editing.drawing.add_area" }, { - "shortcuts": ["4" - ], + "shortcuts": ["4"], "text": "shortcuts.editing.drawing.add_note" }, { - "shortcuts": ["Left-click","shortcuts.key.space" - ], + "shortcuts": ["Left-click","shortcuts.key.space"], "text": "shortcuts.editing.drawing.place_point" }, { diff --git a/modules/renderer/map.js b/modules/renderer/map.js index 050142720..e19b1d2dd 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -38,7 +38,7 @@ import { svgLines, svgMidpoints, svgPoints, - svgVertices, + svgVertices } from '../svg'; import { uiFlash } from '../ui'; @@ -484,8 +484,7 @@ export function rendererMap(context) { if (map.editable() || map.notesEditable()) { context.loadTiles(projection); drawVector(difference, extent); - } - else { + } else { editOff(); } From b95aa089003244088d09514051b8b4aa2b7124de Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 16:22:21 -0400 Subject: [PATCH 074/217] Add cancel button, simplify button code --- data/core.yaml | 2 +- dist/locales/en.json | 2 +- modules/ui/note_editor.js | 77 +++++++++++++++++++++++---------------- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index df3ba1d3f..3c4d1420b 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -644,7 +644,7 @@ en: report: Report new: New Note newDescription: "Describe the issue." - newNote: Add Note + save: Save Note login: You must log in to change or comment on this note. upload_explanation: "Your comments will be publicly visible to all OpenStreetMap users." upload_explanation_with_user: "Your comments as {user} will be publicly visible to all OpenStreetMap users." diff --git a/dist/locales/en.json b/dist/locales/en.json index ed1de77b6..bff2dd272 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -780,7 +780,7 @@ "report": "Report", "new": "New Note", "newDescription": "Describe the issue.", - "newNote": "Add Note", + "save": "Save Note", "login": "You must log in to change or comment on this note.", "upload_explanation": "Your comments will be publicly visible to all OpenStreetMap users.", "upload_explanation_with_user": "Your comments as {user} will be publicly visible to all OpenStreetMap users." diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index e5d6a081a..235938511 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -9,8 +9,8 @@ import { services } from '../services'; import { modeBrowse } from '../modes'; import { svgIcon } from '../svg'; -import { uiField } from './field'; -import { uiFormFields } from './form_fields'; +// import { uiField } from './field'; +// import { uiFormFields } from './form_fields'; import { uiNoteComments, @@ -30,10 +30,10 @@ export function uiNoteEditor(context) { var noteComments = uiNoteComments(); var noteHeader = uiNoteHeader(); - var formFields = uiFormFields(context); + // var formFields = uiFormFields(context); var _note; - var _fieldsArr; + // var _fieldsArr; function noteEditor(selection) { @@ -48,8 +48,6 @@ export function uiNoteEditor(context) { .append('button') .attr('class', 'fr note-editor-close') .on('click', function() { - var osm = services.osm; - if (_note.isNew()) { osm.removeNote(_note); } // delete new note context.enter(modeBrowse(context)); }) .call(svgIcon('#iD-icon-close')); @@ -297,27 +295,57 @@ export function uiNoteEditor(context) { .append('div') .attr('class', 'buttons'); - buttonEnter - .append('button') - .attr('class', function() { - return _note.isNew() ? 'button add-note-button action' : 'button status-button action'; - }) - .append('span') - .attr('class', 'label'); + if (_note.isNew()) { + buttonEnter + .append('button') + .attr('class', 'button cancel-button secondary-action') + .text(t('confirm.cancel')); + + buttonEnter + .append('button') + .attr('class', 'button save-button action') + .text(t('note.save')); + + } else { + buttonEnter + .append('button') + .attr('class', 'button status-button action'); - if (!_note.isNew()) { buttonEnter .append('button') .attr('class', 'button comment-button action') - .append('span') - .attr('class', 'label') .text(t('note.comment')); } + // update buttonSection = buttonSection .merge(buttonEnter); + buttonSection.select('.cancel-button') // select and propagate data + .on('click.cancel', function(d) { + this.blur(); // avoid keeping focus on the button - #4641 + var osm = services.osm; + if (osm) { + osm.removeNote(d); + } + context.enter(modeBrowse(context)); + }); + + buttonSection.select('.save-button') // select and propagate data + .attr('disabled', function(d) { + return (hasAuth && d.status === 'open' && d.newComment) ? null : true; + }) + .on('click.save', function(d) { + this.blur(); // avoid keeping focus on the button - #4641 + var osm = services.osm; + if (osm) { + osm.postNoteCreate(d, function(err, note) { + dispatch.call('change', note); + }); + } + }); + buttonSection.select('.status-button') // select and propagate data .attr('disabled', (hasAuth ? null : true)) .text(function(d) { @@ -340,7 +368,7 @@ export function uiNoteEditor(context) { .attr('disabled', function(d) { return (hasAuth && d.status === 'open' && d.newComment) ? null : true; }) - .on('click.save', function(d) { + .on('click.comment', function(d) { this.blur(); // avoid keeping focus on the button - #4641 var osm = services.osm; if (osm) { @@ -349,21 +377,6 @@ export function uiNoteEditor(context) { }); } }); - - buttonSection.select('.add-note-button') // select and propagate data - .text(t('note.newNote')) - .attr('disabled', function(d) { - return (d.status === 'open' && d.newComment) ? null : true; - }) - .on('click.save', function(d) { - this.blur(); // avoid keeping focus on the button - #4641 - var osm = services.osm; - if (osm) { - osm.postNoteCreate(d, function(err, note) { - dispatch.call('change', note); - }); - } - }); } From 5d9fc33e2476afcc709298ebfd225d2363da80f7 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 16:22:37 -0400 Subject: [PATCH 075/217] Simplify osm.js postNoteUpload/update --- modules/services/osm.js | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/modules/services/osm.js b/modules/services/osm.js index 45b49731b..3b5121536 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -339,8 +339,6 @@ function parseXML(xml, callback, options) { // replace or remove note from rtree function updateRtree(item, replace) { - // NOTE: other checks needed? (e.g., if cache.data.children.length decrements ...) - _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); if (replace) { @@ -899,9 +897,7 @@ export default { if (err) { return callback(err); } // we get the updated note back, remove from caches and reparse.. - var item = encodeNoteRtree(note); - _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); - delete _noteCache.note[note.id]; + this.removeNote(note); var options = { skipSeen: false }; return parseXML(xml, function(err, results) { @@ -953,9 +949,7 @@ export default { if (err) { return callback(err); } // we get the updated note back, remove from caches and reparse.. - var item = encodeNoteRtree(note); - _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; }); - delete _noteCache.note[note.id]; + this.removeNote(note); var options = { skipSeen: false }; return parseXML(xml, function(err, results) { @@ -1103,8 +1097,7 @@ export default { if (!(note instanceof osmNote) || !note.id) return; delete _noteCache.note[note.id]; - - updateRtree(encodeNoteRtree(note), false); + updateRtree(encodeNoteRtree(note), false); // false = remove }, @@ -1112,10 +1105,8 @@ export default { replaceNote: function(note) { if (!(note instanceof osmNote) || !note.id) return; - _noteCache.note[note.id] = note; // update (or insert) in _noteCache.note - - updateRtree(encodeNoteRtree(note), true); - + _noteCache.note[note.id] = note; + updateRtree(encodeNoteRtree(note), true); // true = replace return note; } From 69ebb978157f337c96b6992bed585d80db87ea55 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 17:17:24 -0400 Subject: [PATCH 076/217] Simplify drag_note mode --- modules/modes/drag_node.js | 3 - modules/modes/drag_note.js | 150 ++++++------------------------------- modules/modes/select.js | 2 +- 3 files changed, 23 insertions(+), 132 deletions(-) diff --git a/modules/modes/drag_node.js b/modules/modes/drag_node.js index f726b9dbb..0327ece06 100644 --- a/modules/modes/drag_node.js +++ b/modules/modes/drag_node.js @@ -446,9 +446,6 @@ export function modeDragNode(context) { context.history() .on('undone.drag-node', null); - context.map() - .on('drawn.drag-node', null); - _activeEntity = null; context.surface() diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index ed42e8ba7..b686e8be2 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -3,28 +3,10 @@ import { select as d3_select } from 'd3-selection'; -import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; - -import { geoVecInterp } from '../geo'; - import { services } from '../services'; - -import { - actionNoop -} from '../actions'; - -import { - behaviorEdit, - behaviorHover, - behaviorDrag -} from '../behavior'; - -import { - geoVecSubtract, - geoViewportEdge -} from '../geo'; - -import { modeBrowse, modeSelectNote } from './index'; +import { behaviorEdit, behaviorDrag } from '../behavior'; +import { geoVecSubtract, geoViewportEdge } from '../geo'; +import { modeSelectNote } from './index'; export function modeDragNote(context) { @@ -32,22 +14,18 @@ export function modeDragNote(context) { id: 'drag-note', button: 'browse' }; - var hover = behaviorHover(context).altDisables(true) - .on('hover', context.ui().sidebar.hover); + var edit = behaviorEdit(context); var _nudgeInterval; - var _restoreSelectedNoteID = []; - var _isCancelled = false; - var _activeEntity; var _lastLoc; - function startNudge(entity, nudge) { + function startNudge(note, nudge) { if (_nudgeInterval) window.clearInterval(_nudgeInterval); _nudgeInterval = window.setInterval(function() { context.pan(nudge); - doMove(entity, nudge); + doMove(note, nudge); }, 50); } @@ -60,94 +38,57 @@ export function modeDragNote(context) { } - function origin(entity) { - return context.projection(entity.loc); + function origin(note) { + return context.projection(note.loc); } - function keydown() { - if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { - if (context.surface().classed('nope')) { - context.surface() - .classed('nope-suppressed', true); - } - context.surface() - .classed('nope', false) - .classed('nope-disabled', true); - } - } - - - function keyup() { - if (d3_event.keyCode === d3_keybinding.modifierCodes.alt) { - if (context.surface().classed('nope-suppressed')) { - context.surface() - .classed('nope', true); - } - context.surface() - .classed('nope-suppressed', false) - .classed('nope-disabled', false); - } - } - - - function start(entity) { - _activeEntity = entity; - - context.surface().selectAll('.note-' + _activeEntity.id) + function start(note) { + context.surface().selectAll('.note-' + note.id) .classed('active', true); context.enter(mode); } - function move(entity) { - if (_isCancelled) return; + function move(note) { d3_event.sourceEvent.stopPropagation(); - - context.surface().classed('nope-disabled', d3_event.sourceEvent.altKey); - _lastLoc = context.projection.invert(d3_event.point); - doMove(entity); + doMove(note); var nudge = geoViewportEdge(d3_event.point, context.map().dimensions()); if (nudge) { - startNudge(entity, nudge); + startNudge(note, nudge); } else { stopNudge(); } - } - function doMove(entity, nudge) { + function doMove(note, nudge) { nudge = nudge || [0, 0]; var currPoint = (d3_event && d3_event.point) || context.projection(_lastLoc); var currMouse = geoVecSubtract(currPoint, nudge); var loc = context.projection.invert(currMouse); - entity = entity.move(geoVecInterp(entity.loc, loc, 1)); + note = note.move(loc); var osm = services.osm; if (osm) { - osm.replaceNote(entity); // update note cache + osm.replaceNote(note); // update note cache } - context.perform(actionNoop()); // TODO: replace with better call for redrawing + // update note on screen (no need to do a full redraw) + context.surface().selectAll('.note-' + note.id) + .attr('transform', 'translate(' + currMouse[0] + ',' + currMouse[1] + ')'); } - function end(entity) { + function end(note) { context - .selectedNoteID(entity.id) - .enter(modeSelectNote(context, entity.id)); - } - - - function cancel() { - drag.cancel(); - context.enter(modeBrowse(context)); + .selectedNoteID(note.id) + .enter(modeSelectNote(context, note.id)); } @@ -161,69 +102,22 @@ export function modeDragNote(context) { mode.enter = function() { - context.install(hover); context.install(edit); - - d3_select(window) - .on('keydown.drawWay', keydown) - .on('keyup.drawWay', keyup); - - context.history() - .on('undone.drag-note', cancel); }; mode.exit = function() { context.ui().sidebar.hover.cancel(); - context.uninstall(hover); context.uninstall(edit); - d3_select(window) - .on('keydown.hover', null) - .on('keyup.hover', null); - - context.history() - .on('undone.drag-note', null); - - context.map() - .on('drawn.drag-note', null); - - _activeEntity = null; - context.surface() - .classed('nope', false) - .classed('nope-suppressed', false) - .classed('nope-disabled', false) .selectAll('.active') .classed('active', false); stopNudge(); }; - - mode.selectedNoteID = function() { - if (!arguments.length) return _activeEntity ? _activeEntity.id : []; - // no assign - return mode; - }; - - - mode.activeID = function() { - if (!arguments.length) return _activeEntity && _activeEntity.id; - // no assign - return mode; - }; - - - mode.restoreSelectedNoteID = function(_) { - if (!arguments.length) return _restoreSelectedNoteID; - _restoreSelectedNoteID = _; - return mode; - }; - - mode.behavior = drag; - return mode; } diff --git a/modules/modes/select.js b/modules/modes/select.js index 57f9b18b9..25e12400f 100644 --- a/modules/modes/select.js +++ b/modules/modes/select.js @@ -65,7 +65,7 @@ export function modeSelect(context, selectedIDs) { behaviorSelect(context), behaviorLasso(context), modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior, - modeDragNote(context).restoreSelectedNoteID(selectedIDs).behavior + modeDragNote(context).behavior ]; var inspector; var editMenu; From 95ea0dbbc94d36db40e6cc4ca9c5e24d218dfa78 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 19:14:34 -0400 Subject: [PATCH 077/217] Force a redraw after adding a note Because notes dont exist in the history or graph, there is no history change event to trigger a redraw, as there would be when adding points and other things. --- modules/modes/add_note.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index 36f3d8989..4d63b8ee0 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -29,6 +29,9 @@ export function modeAddNote(context) { var note = osmNote({ loc: loc, status: 'open', comments: [] }); osm.replaceNote(note); + // force a reraw (there is no history change that would otherwise do this) + context.pan([0,0]); + context .selectedNoteID(note.id) .enter(modeSelectNote(context, note.id).newFeature(true)); From f74d21557ca7081413841d00ddcb372603f2dbde Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 24 Jul 2018 19:34:01 -0400 Subject: [PATCH 078/217] Force redraws after moving a note or cancelling a note similar to 95ea0dbbc, there is no history change event to force a redraw --- modules/modes/drag_note.js | 3 +++ modules/renderer/map.js | 3 +-- modules/ui/note_editor.js | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index b686e8be2..7b1ca0106 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -86,6 +86,9 @@ export function modeDragNote(context) { function end(note) { + // force a reraw (there is no history change that would otherwise do this) + context.pan([0,0]); + context .selectedNoteID(note.id) .enter(modeSelectNote(context, note.id)); diff --git a/modules/renderer/map.js b/modules/renderer/map.js index e19b1d2dd..727ae3323 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -480,8 +480,7 @@ export function rendererMap(context) { .call(drawLayers); // OSM - // NOTE: when `map.notesEditable()` is removed, `redraw()` keep being called on timer - if (map.editable() || map.notesEditable()) { + if (map.editable()) { context.loadTiles(projection); drawVector(difference, extent); } else { diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index 235938511..a6fd9c573 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -330,6 +330,7 @@ export function uiNoteEditor(context) { osm.removeNote(d); } context.enter(modeBrowse(context)); + dispatch.call('change'); }); buttonSection.select('.save-button') // select and propagate data From 395be29d3886e2a52146e672b6557235be8070d1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 25 Jul 2018 10:25:27 -0400 Subject: [PATCH 079/217] Set 'mtbmap-no' as an imagery source that uses 512px tiles (closes #5179) --- data/imagery.json | 1 + data/update_imagery.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/data/imagery.json b/data/imagery.json index b1c9998e8..ffd17b187 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -42137,6 +42137,7 @@ "name": "MTBmap.no", "type": "tms", "template": "https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg", + "tileSize": 512, "zoomExtent": [3, 14], "polygon": [ [ diff --git a/data/update_imagery.js b/data/update_imagery.js index 4375f5d3f..86818c8c8 100644 --- a/data/update_imagery.js +++ b/data/update_imagery.js @@ -96,6 +96,8 @@ sources.concat(whitelist).forEach(function(source) { if (source.id === 'Mapbox') { im.template = im.template.replace('.jpg', '@2x.jpg'); im.tileSize = 512; + } else if (source.id === 'mtbmap-no') { + im.tileSize = 512; } if (source.type === 'wms') { From 11076bf0c59c21db8d97111d2c81414629869cab Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 25 Jul 2018 15:11:43 -0400 Subject: [PATCH 080/217] Calculate correct scale in tiler() for non-256px tile sizes --- modules/renderer/tile_layer.js | 5 ++--- modules/util/tiler.js | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index 454e71400..3df159d3f 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -18,7 +18,7 @@ export function rendererTileLayer(context) { function tileSizeAtZoom(d, z) { - var EPSILON = 0.002; + var EPSILON = 0.002; // close seams return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON; } @@ -272,8 +272,7 @@ export function rendererTileLayer(context) { _source = _; _tileSize = _source.tileSize; _cache = {}; - // tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent); // not yet - tiler.zoomExtent(_source.zoomExtent); + tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent); return background; }; diff --git a/modules/util/tiler.js b/modules/util/tiler.js index 03686c9c9..80f1989f5 100644 --- a/modules/util/tiler.js +++ b/modules/util/tiler.js @@ -35,7 +35,8 @@ export function utilTiler() { function tiler() { var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize); var z0 = bound(Math.round(z)); - var k = Math.pow(2, z - z0 + 8); + var log2ts = Math.log(_tileSize) * Math.LOG2E; + var k = Math.pow(2, z - z0 + log2ts); var origin = [ (_translate[0] - _scale / 2) / k, (_translate[1] - _scale / 2) / k From c63541379c012a9eaa566f97979eb68e20dfe7dc Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 25 Jul 2018 21:15:03 -0400 Subject: [PATCH 081/217] Add building fields for pavilions and shelters in walkthrough (re: #5084) --- data/intro_graph.json | 12 ++++++++++-- data/presets/presets.json | 2 +- data/presets/presets/amenity/pavilion.json | 8 +++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/data/intro_graph.json b/data/intro_graph.json index fcf2b191e..51fce20fa 100644 --- a/data/intro_graph.json +++ b/data/intro_graph.json @@ -21494,7 +21494,8 @@ "id": "w136", "nodes": ["n612", "n613", "n614", "n615", "n612"], "tags": { - "amenity": "shelter" + "amenity": "shelter", + "building": "yes" } }, "w137": { @@ -23457,6 +23458,7 @@ "nodes": ["n2018", "n1626", "n1627", "n2017", "n2018"], "tags": { "amenity": "shelter", + "building": "yes", "shelter_type": "picnic_shelter" } }, @@ -24072,6 +24074,7 @@ "nodes": ["n2050", "n2051", "n2052", "n2053", "n2050"], "tags": { "amenity": "shelter", + "building": "yes", "shelter_type": "picnic_shelter" } }, @@ -24370,6 +24373,7 @@ "nodes": ["n2054", "n2055", "n2056", "n2057", "n2054"], "tags": { "amenity": "shelter", + "building": "yes", "shelter_type": "picnic_shelter" } }, @@ -24753,6 +24757,7 @@ "nodes": ["n217", "n218", "n219", "n220", "n217"], "tags": { "amenity": "shelter", + "building": "yes", "shelter_type": "picnic_shelter" } }, @@ -24835,6 +24840,7 @@ "nodes": ["n221", "n222", "n223", "n224", "n221"], "tags": { "amenity": "shelter", + "building": "yes", "shelter_type": "picnic_shelter" } }, @@ -26081,6 +26087,7 @@ "nodes": ["n3021", "n3022", "n3023", "n3024", "n3021"], "tags": { "amenity": "shelter", + "building": "yes", "shelter_type": "picnic_shelter" } }, @@ -28716,7 +28723,8 @@ "nodes": ["n4669", "n4670", "n4671", "n4672", "n4669"], "tags": { "amenity": "shelter", - "shelter_type": "picnic_shelters" + "building": "yes", + "shelter_type": "picnic_shelter" } }, "w815": { diff --git a/data/presets/presets.json b/data/presets/presets.json index 5c824b596..62e881f36 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -102,7 +102,7 @@ "amenity/parking_entrance": {"icon": "maki-entrance-alt1", "fields": ["access_simple", "ref"], "geometry": ["vertex"], "tags": {"amenity": "parking_entrance"}, "name": "Parking Garage Entrance/Exit"}, "amenity/parking_space": {"fields": ["capacity"], "geometry": ["point", "vertex", "area"], "terms": [], "tags": {"amenity": "parking_space"}, "matchScore": 0.95, "name": "Parking Space"}, "amenity/parking": {"icon": "maki-parking", "fields": ["name", "operator", "parking", "capacity", "fee", "access_simple", "supervised", "park_ride", "surface", "maxstay"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "parking"}, "terms": [], "name": "Car Parking"}, - "amenity/pavilion": {"icon": "maki-shelter", "fields": ["bin", "bench"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "shelter", "shelter_type": "pavilion"}, "name": "Pavilion"}, + "amenity/pavilion": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "shelter", "shelter_type": "pavilion"}, "name": "Pavilion"}, "amenity/pharmacy": {"icon": "maki-pharmacy", "fields": ["name", "operator", "address", "building_area", "drive_through", "opening_hours", "payment_multi", "dispensing"], "geometry": ["point", "area"], "tags": {"amenity": "pharmacy"}, "addTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "removeTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "reference": {"key": "amenity", "value": "pharmacy"}, "terms": ["drug*", "med*", "prescription"], "name": "Pharmacy"}, "amenity/place_of_worship": {"icon": "maki-place-of-worship", "fields": ["name", "religion", "denomination", "address", "building_area", "service_times"], "geometry": ["point", "area"], "terms": ["abbey", "basilica", "bethel", "cathedral", "chancel", "chantry", "chapel", "church", "fold", "house of God", "house of prayer", "house of worship", "minster", "mission", "mosque", "oratory", "parish", "sacellum", "sanctuary", "shrine", "synagogue", "tabernacle", "temple"], "tags": {"amenity": "place_of_worship"}, "name": "Place of Worship"}, "amenity/place_of_worship/buddhist": {"icon": "maki-buddhism", "fields": ["name", "denomination", "building_area", "address", "service_times"], "geometry": ["point", "area"], "terms": ["stupa", "vihara", "monastery", "temple", "pagoda", "zendo", "dojo"], "tags": {"amenity": "place_of_worship", "religion": "buddhist"}, "reference": {"key": "amenity", "value": "place_of_worship"}, "name": "Buddhist Temple"}, diff --git a/data/presets/presets/amenity/pavilion.json b/data/presets/presets/amenity/pavilion.json index b17fe8d5b..ad8474d34 100644 --- a/data/presets/presets/amenity/pavilion.json +++ b/data/presets/presets/amenity/pavilion.json @@ -1,8 +1,10 @@ { "icon": "maki-shelter", "fields": [ - "bin", - "bench" + "name", + "building_area", + "bench", + "bin" ], "geometry": [ "point", @@ -11,7 +13,7 @@ ], "tags": { "amenity": "shelter", - "shelter_type": "pavilion" + "shelter_type": "pavilion" }, "name": "Pavilion" } From 39fc9002b13c511c389f0929d23037d7cdad71c1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 26 Jul 2018 00:46:48 -0400 Subject: [PATCH 082/217] v2.10.0 CHANGELOG --- CHANGELOG.md | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7967d04d3..789f5139e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,113 @@ _Breaking changes, which may affect downstream projects or sites that embed iD, [@xxxx]: https://github.com/xxxx --> +# 2.10.0 +##### Jul 26, 2018 + +#### :mega: Release Highlights +* :memo: You can now create, comment on, and resolve OpenStreetMap notes from within iD! This work was done as part of [Thomas Hervey's 2018 Google Summer of Code project](https://www.openstreetmap.org/user/Thomas_Hervey/diary/44449). Thanks [@thomas-hervey]!
+_Activate the OpenStreetMap notes layer by opening the Map Data pane (shortcut F)_ +* :wrench: We've added a new Detach Node operation to remove a tagged node from a way. Thanks [@Psigio]!
+_With a node selected, use the right-click edit menu to find the Detach command (shortcut E)_ +* :arrow_upper_right: The photo viewer (Mapillary, OpenStreetCam, and Bing Streetside) is now resizeable by dragging any of its edges. Thanks [@kratico]! +_Try activating one of the streetlevel photo layers (shortcut F) and resizing the viewer._ + +[@thomas-hervey]: https://github.com/thomas-hervey +[@Psigio]: https://github.com/Psigio +[@kratico]: https://github.com/kratico + +#### :tada: New Features +* Add support for OpenStreetMap notes ([#2629], [#5107], [#5162], thanks [@thomas-hervey]) +* Add Detach Node operation ([#4320], [#5127], thanks [@Psigio]) +* Add support for high resolution image tile sizes + * This improves the appearance of the Mapbox Satellite layer and fixes the display of MTB-Norway layer ([#5179]) + * :warning: We refactored `d3.geo.tile`->`utilTiler`, `scaleExtent`->`zoomExtent` ([#5104], [#5148], thanks [@thomas-hervey]) + * :warning: `context.loadTiles` and a few other functions have changed arity - they no longer require a `dimensions` argument +* Add ability to resize Mapillary / OpenStreetCam / Bing Streetside photo viewer ([#5138], [#4930], thanks [@kratico]) +* Add "View on Bing Maps" link and Forward/Backward controls to Bing Streetside ([#5125]) + +[#5179]: https://github.com/openstreetmap/iD/issues/5179 +[#5162]: https://github.com/openstreetmap/iD/issues/5162 +[#5148]: https://github.com/openstreetmap/iD/issues/5148 +[#5138]: https://github.com/openstreetmap/iD/issues/5138 +[#5127]: https://github.com/openstreetmap/iD/issues/5127 +[#5125]: https://github.com/openstreetmap/iD/issues/5125 +[#5107]: https://github.com/openstreetmap/iD/issues/5107 +[#5104]: https://github.com/openstreetmap/iD/issues/5104 +[#4930]: https://github.com/openstreetmap/iD/issues/4930 +[#4320]: https://github.com/openstreetmap/iD/issues/4320 +[#2629]: https://github.com/openstreetmap/iD/issues/2629 +[@thomas-hervey]: https://github.com/thomas-hervey +[@Psigio]: https://github.com/Psigio +[@kratico]: https://github.com/kratico + +#### :sparkles: Usability +* Update viewfield to match bearing of Mapillary viewer when viewing panoramic images ([#5161], thanks [@kratico]) +* Increase photo viewer default size for large screens ([#5139], thanks [@kratico]) +* Improve Mapillary viewer attribution display ([#5137], thanks [@kratico]) +* Improve visibility and styling for `footway=crossing` and other special paths ([#5126]) + +[#5161]: https://github.com/openstreetmap/iD/issues/5161 +[#5139]: https://github.com/openstreetmap/iD/issues/5139 +[#5137]: https://github.com/openstreetmap/iD/issues/5137 +[#5126]: https://github.com/openstreetmap/iD/issues/5126 +[@kratico]: https://github.com/kratico + +#### :bug: Bugfixes +* Make sure railway bridges with a `service=*` tag render with dark casing ([#5159]) +* Properly save and restore OSM data caches when entering/leaving the walkthrough +* Avoid errors if Mapillary viewer could not be initialized +* Support reversal of more direction tags (`conveying`, `priority`, etc.) in Reverse action ([#5121]) +* Fix event management of the spinner - it was possible for it to get stuck spinning ([#5107-comment]) +* Add doublequotes to iD-sprite input file param so builds work on Windows ([#5077]) + +[#5159]: https://github.com/openstreetmap/iD/issues/5159 +[#5121]: https://github.com/openstreetmap/iD/issues/5121 +[#5107-comment]: https://github.com/openstreetmap/iD/pull/5107#issuecomment-401617938 +[#5077]: https://github.com/openstreetmap/iD/issues/5077 + +#### :hourglass: Performance +* Use XHR instead of JSONP wherever possible ([#5123], [#5040], thanks [@tomhughes]) +* Check Esri Tilemaps to avoid extra requests for unavailable imagery ([#5116], [#5029], thanks [@jgravois]) + +[#5123]: https://github.com/openstreetmap/iD/issues/5123 +[#5116]: https://github.com/openstreetmap/iD/issues/5116 +[#5040]: https://github.com/openstreetmap/iD/issues/5040 +[#5029]: https://github.com/openstreetmap/iD/issues/5029 +[@tomhughes]: https://github.com/tomhughes +[@jgravois]: https://github.com/jgravois + +#### :mortar_board: Walkthrough / Help +* Add section about OpenStreetMap notes to Help pane ([#5162], thanks [@thomas-hervey]) + +[@thomas-hervey]: https://github.com/thomas-hervey + +#### :rocket: Presets +* Add `aeroway=aerodrome` to Military Airfield preset, adjust terms ([#5164]) +* Add `passenger_information_display` to Bus, Tram platform presets ([#5142], thanks [@AndreasHae]) +* Add `levels` field to `shop=kiosk` preset ([#5131], [#5133], thanks [@vershwal]) +* Add `site_type` to Archaeological Site preset ([#5124], thanks [@JamesKingdom]) +* Add `network` field to ATM preset ([#5119], thanks [@JamesKingdom]) +* Add `cash_in` field to ATM preset ([#5118], thanks [@JamesKingdom]) +* Improve search terms for Entrance preset ([#5130], thanks [@tohaklim]) +* Add `capacity` field to `playground=swing` preset ([#5120], thanks [@tordans]) + +[#5164]: https://github.com/openstreetmap/iD/issues/5164 +[#5142]: https://github.com/openstreetmap/iD/issues/5142 +[#5131]: https://github.com/openstreetmap/iD/issues/5131 +[#5133]: https://github.com/openstreetmap/iD/issues/5133 +[#5124]: https://github.com/openstreetmap/iD/issues/5124 +[#5119]: https://github.com/openstreetmap/iD/issues/5119 +[#5118]: https://github.com/openstreetmap/iD/issues/5118 +[#5130]: https://github.com/openstreetmap/iD/issues/5130 +[#5120]: https://github.com/openstreetmap/iD/issues/5120 +[@AndreasHae]: https://github.com/AndreasHae +[@vershwal]: https://github.com/vershwal +[@JamesKingdom]: https://github.com/JamesKingdom +[@tohaklim]: https://github.com/tohaklim +[@tordans]: https://github.com/tordans + + # 2.9.2 ##### Jun 28, 2018 From 897a6a286c3f618fad706254b14ff338f756448a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 26 Jul 2018 05:02:04 +0000 Subject: [PATCH 083/217] chore(package): update osm-community-index to version 0.4.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6148cea94..21e52a8f4 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "mocha-phantomjs-core": "^2.1.0", "name-suggestion-index": "0.1.6", "npm-run-all": "^4.0.0", - "osm-community-index": "0.4.5", + "osm-community-index": "0.4.6", "phantomjs-prebuilt": "~2.1.11", "request": "^2.85.0", "rollup": "~0.63.2", From df85a6ff6c02b6936002d2e13b22c206e26a73de Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 26 Jul 2018 01:09:39 -0400 Subject: [PATCH 084/217] npm run imagery --- data/imagery.json | 36 ++++++++++++++++++------------------ dist/locales/en.json | 9 +++++++++ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/data/imagery.json b/data/imagery.json index ffd17b187..3d76f2cf4 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -6166,7 +6166,7 @@ "id": "Bonvillars-2013", "name": "Bonvillars Orthophoto 2013", "type": "tms", - "template": "http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png", + "template": "https://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -6180,7 +6180,7 @@ [6.66713, 46.83358] ] ], - "terms_url": "http://osmdata.asitvd.ch/", + "terms_url": "https://osmdata.asitvd.ch/", "terms_text": "Bonvillars - Orthophoto technique 2013" }, { @@ -9342,7 +9342,7 @@ "id": "Cartoriviera-2012", "name": "Cartoriviera - Orthophoto 2012", "type": "tms", - "template": "http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png", + "template": "https://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -10919,7 +10919,7 @@ "id": "Czech_pLPIS", "name": "Czech pLPIS", "type": "wms", - "template": "http://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true", + "template": "https://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true", "projection": "EPSG:4326", "polygon": [ [ @@ -18345,7 +18345,7 @@ "id": "Fiez-2013", "name": "Fiez Orthophoto 2013", "type": "tms", - "template": "http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png", + "template": "https://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -18360,7 +18360,7 @@ [6.62313, 46.82339] ] ], - "terms_url": "http://osmdata.asitvd.ch/", + "terms_url": "https://osmdata.asitvd.ch/", "terms_text": "Fiez - Orthophoto technique 2013" }, { @@ -38286,7 +38286,7 @@ "id": "Lausanne-2012", "name": "Lausanne - Orthophoto technique 2012", "type": "tms", - "template": "http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png", + "template": "https://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -41690,7 +41690,7 @@ [31.90425, 70.43681] ] ], - "terms_url": "http://kart.naturbase.no/", + "terms_url": "https://kart.naturbase.no", "terms_text": "© Miljødirektoratet", "description": "Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen", "icon": "http://www.miljodirektoratet.no/Framework/favicon-32.png", @@ -42244,7 +42244,7 @@ ], "terms_url": "http://www.geodatenservice-muenchen.de/", "terms_text": "Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de", - "icon": "http://www.muenchen.de/media/css/images/favicon_114x114.png" + "icon": "https://www.muenchen.de/media/css/images/favicon_114x114.png" }, { "id": "openlabs-geoportal-public-transport", @@ -46367,7 +46367,7 @@ "id": "OS-OpenData_Locator", "name": "OS OpenData Locator", "type": "tms", - "template": "http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png", + "template": "https://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png", "zoomExtent": [0, 22], "polygon": [ [ @@ -53674,7 +53674,7 @@ "id": "SIGIP-2012", "name": "SIGIP - Orthophoto 2012", "type": "tms", - "template": "http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png", + "template": "https://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -61701,7 +61701,7 @@ "id": "trafikverket-baninfo", "name": "Trafikverket Railway Network", "type": "wms", - "template": "http://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "template": "https://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", "zoomExtent": [7, 20], "polygon": [ @@ -64979,7 +64979,7 @@ "id": "Ville_de_Nyon-HD-2010", "name": "Ville de Nyon - Orthophoto 2010 HD 5cm/pi", "type": "tms", - "template": "http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png", + "template": "https://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png", "endDate": "2010-01-01T00:00:00.000Z", "startDate": "2010-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -65295,7 +65295,7 @@ [9.96805, 47.54631] ] ], - "terms_url": "http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65558,7 +65558,7 @@ [9.96805, 47.54631] ] ], - "terms_url": "http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65604,7 +65604,7 @@ [9.54367, 47.48479] ] ], - "terms_url": "http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65650,7 +65650,7 @@ [9.54367, 47.48479] ] ], - "terms_url": "http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65730,7 +65730,7 @@ [10.17039, 46.82979] ] ], - "terms_url": "http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, diff --git a/dist/locales/en.json b/dist/locales/en.json index bff2dd272..2655f494c 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -7573,6 +7573,10 @@ "description": "Mappers and OpenStreetMap users, around Portland, ME", "extendedDescription": "Maptime is, rather literally, time for mapmaking. Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies." }, + "us-ma-mailinglist": { + "name": "Talk-us-massachusetts Mailing List", + "description": "Email mailing list for the Massachusetts OSM community" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Improve OpenStreetMap in the Cleveland area", @@ -7601,6 +7605,11 @@ "name": "OpenStreetMap NYC", "description": "Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area" }, + "OSM-Portland-forum": { + "name": "OpenStreetMap PDX Google Group", + "description": "Forum and mailing list for OpenStreetMap users in the Portland area", + "extendedDescription": "This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner." + }, "OSM-Portland": { "name": "OpenStreetMap Portland", "description": "Mappers and OpenStreetMap users in the Portland area", From 5f9cad47654e5081b252e47b7be6a466ba7a3d1f Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 26 Jul 2018 01:11:17 -0400 Subject: [PATCH 085/217] npm run translations --- dist/locales/af.json | 1 - dist/locales/ar-AA.json | 1 - dist/locales/ar.json | 9 +- dist/locales/ast.json | 6 +- dist/locales/bg.json | 3 - dist/locales/bn.json | 28 ++- dist/locales/bs.json | 1 - dist/locales/ca.json | 41 +++- dist/locales/ckb.json | 6 +- dist/locales/cs.json | 314 ++++++++++++++++++++++++- dist/locales/da.json | 112 ++++++--- dist/locales/de.json | 220 ++++++++++++------ dist/locales/el.json | 5 - dist/locales/en-GB.json | 5 - dist/locales/eo.json | 112 +++++++-- dist/locales/es.json | 250 +++++++++++++++++++- dist/locales/et.json | 105 ++++++++- dist/locales/eu.json | 5 + dist/locales/fa.json | 71 +++++- dist/locales/fi.json | 91 +++++++- dist/locales/fr.json | 372 ++++++++++++++++++------------ dist/locales/gl.json | 357 +++++++++++++++++++---------- dist/locales/gu.json | 2 - dist/locales/he.json | 97 +++++++- dist/locales/hr.json | 115 +++++++++- dist/locales/hu.json | 27 ++- dist/locales/hy.json | 1 - dist/locales/id.json | 1 - dist/locales/is.json | 252 +++++++++++++++++++- dist/locales/it.json | 102 ++++++++- dist/locales/ja.json | 227 ++++++++++++------ dist/locales/kn.json | 5 - dist/locales/ko.json | 72 +++--- dist/locales/ku.json | 2 - dist/locales/lt.json | 3 - dist/locales/lv.json | 425 ++++++++++++++++++++++++++++++++-- dist/locales/mg.json | 492 +++++++++++++++++++++++++++++++++++++++- dist/locales/mk.json | 2 - dist/locales/ml.json | 2 - dist/locales/ms.json | 3 - dist/locales/nl.json | 86 ++++++- dist/locales/nn.json | 26 ++- dist/locales/no.json | 3 - dist/locales/pl.json | 277 +++++++++++++++++----- dist/locales/pt-BR.json | 141 +++++++++--- dist/locales/pt.json | 9 +- dist/locales/ro.json | 6 +- dist/locales/ru.json | 104 +++++++-- dist/locales/si.json | 1 - dist/locales/sk.json | 4 - dist/locales/sl.json | 12 +- dist/locales/sq.json | 1 - dist/locales/sr.json | 4 - dist/locales/sv.json | 91 +++++++- dist/locales/ta.json | 2 - dist/locales/te.json | 1 - dist/locales/tl.json | 2 - dist/locales/tr.json | 161 ++++++++++++- dist/locales/uk.json | 98 +++++++- dist/locales/vi.json | 96 +++++++- dist/locales/yue.json | 7 +- dist/locales/zh-CN.json | 57 ++++- dist/locales/zh-HK.json | 4 - dist/locales/zh-TW.json | 288 ++++++++++++++++++++++- dist/locales/zh.json | 1 - 65 files changed, 4562 insertions(+), 865 deletions(-) diff --git a/dist/locales/af.json b/dist/locales/af.json index 8266a2aa0..40c3c6c4b 100644 --- a/dist/locales/af.json +++ b/dist/locales/af.json @@ -141,7 +141,6 @@ "redo": { "nothing": "Niks om weer te doen nie." }, - "logout": "voetsek", "loading_auth": "Maak kontak met OpenStreetMap...", "status": { "error": "Kan nie aan die API koppel nie.", diff --git a/dist/locales/ar-AA.json b/dist/locales/ar-AA.json index 0095ae3fb..c50ccbea4 100644 --- a/dist/locales/ar-AA.json +++ b/dist/locales/ar-AA.json @@ -116,7 +116,6 @@ "title": "تقسيم" } }, - "logout": "تسجيل الخروج", "commit": { "upload_explanation": "التغييرات التي قمتم بتحميلها ستكون مرئية على جميع الخرائط التي تستخدم بيانات خريطة الشارع المفتوح.", "cancel": "إلغاء", diff --git a/dist/locales/ar.json b/dist/locales/ar.json index 456ff7c2a..bdefab341 100644 --- a/dist/locales/ar.json +++ b/dist/locales/ar.json @@ -321,8 +321,6 @@ "localized_translation_name": "الاسم" }, "zoom_in_edit": "كبّر الخريطة للتعديل", - "login": "تسجيل دخول", - "logout": "تسجيل خروج", "loading_auth": "جار الإتصال بـ OpenStreetMap ...", "report_a_bug": "أبلغ عن خطأ أو مشكلة", "help_translate": "ساعد في الترجمة", @@ -667,7 +665,6 @@ "cannot_zoom": "لايمكن التصغير أكثر من ذلك في الوضع الحالي.", "full_screen": "التبديل إلى وضع ملء الشاشة", "gpx": { - "local_layer": "ملف محلي", "drag_drop": "اسحب وأفلت ملفات gpx. أو geojson. أو kml. في الصفحة، أو انقر على الزر في اليمين للتصفح واختيار ملف", "zoom": "تكبير إلى الطبقة", "browse": "تصفح لاختيار ملف" @@ -1098,7 +1095,6 @@ "add_point": "نمط \"إضافة نقطة\"", "add_line": "نمط \"إضافة خط\"", "add_area": "نمط \"إضافة مساحة\"", - "place_point": "إضافة نقطة", "disable_snap": "اضغط مع الاستمرار لتعطيل ميزة الانجذاب للنقاط", "stop_line": "إنهاء رسم خط أو مساحة" }, @@ -5170,6 +5166,11 @@ "text": "Maps © Thunderforest, Data © OpenStreetMap contributors" } } + }, + "community": { + "cape-coast-youthmappers": { + "description": "تابعنا على تويتر: {url}" + } } } } \ No newline at end of file diff --git a/dist/locales/ast.json b/dist/locales/ast.json index 36c6b4534..042fd3d26 100644 --- a/dist/locales/ast.json +++ b/dist/locales/ast.json @@ -307,8 +307,6 @@ "localized_translation_name": "Nome" }, "zoom_in_edit": "Averar pa editar", - "login": "aniciu de sesión", - "logout": "zarrar sesión", "loading_auth": "Coneutando con OpenStreetMap...", "report_a_bug": "Informar d'un fallu", "help_translate": "Ayudar a traducir", @@ -619,7 +617,6 @@ "cannot_zoom": "Nun puede alloñase más nel mou actual.", "full_screen": "Conmutar pantalla completa", "gpx": { - "local_layer": "Ficheru llocal", "drag_drop": "Abasna y suelta un ficheru .gpx, .geojson o .kml na páxina, o prime nel botón de la drecha pa restolar", "zoom": "Averar a capa", "browse": "Buscar un ficheru" @@ -742,8 +739,7 @@ "title": "Dibuxar", "add_point": "Mou «amestar puntu»", "add_line": "Mou «amestar llinia»", - "add_area": "Mou «amestar área»", - "place_point": "Asitiar un puntu" + "add_area": "Mou «amestar área»" }, "operations": { "title": "Operaciones" diff --git a/dist/locales/bg.json b/dist/locales/bg.json index 1ee5bdca3..0b9faa7a9 100644 --- a/dist/locales/bg.json +++ b/dist/locales/bg.json @@ -352,8 +352,6 @@ "localized_translation_name": "Име" }, "zoom_in_edit": "Приближете за да редактирате.", - "login": "вход", - "logout": "изход", "loading_auth": "Свързване с OpenStreetMap...", "report_a_bug": "Докладвай грешка", "help_translate": "Помощ за превода", @@ -710,7 +708,6 @@ "cannot_zoom": "Не можете да намалявате повече в текущия режим.", "full_screen": "Превключи на Цял Екран", "gpx": { - "local_layer": "Локален файл", "drag_drop": "Влачете и пуснете .gpx, .geojson или .kml файл в тази страница или кликнете на бутона в дясно, за да разгледате", "zoom": "Приближете към слоя", "browse": "Потърсете файл" diff --git a/dist/locales/bn.json b/dist/locales/bn.json index 45e13029a..02251cdbf 100644 --- a/dist/locales/bn.json +++ b/dist/locales/bn.json @@ -20,6 +20,11 @@ "description": "মানচিত্রে রেস্তোরাঁ, স্মৃতিস্তম্ভ, ডাকবাক্স অথবা অন্য কোন স্থান সংযোজন করুন।", "tail": "বিন্দু সংযোজন করার জন্য মানচিত্রে ক্লিক করুন।" }, + "add_note": { + "title": "টীকা", + "description": "ত্রুটি খুঁজে পেয়েছেন? অন্যান্য ম্যাপারদের জানিয়ে দিন।", + "tail": "টীকা যোগ করার জন্য মানচিত্রে ক্লিক করুন।" + }, "browse": { "title": "ঘুরে ফিরে দেখুন", "description": "মানচিত্র প্যান এবং জুম করুন।" @@ -39,7 +44,8 @@ "annotation": { "point": "একটি বিন্দু সংযোজন করা হয়েছে।", "vertex": "একটি গমনপথে একটি নোড সংযোজন করা হয়েছে।", - "relation": "একটি সম্পর্ক সংযোজন করা হয়েছে।" + "relation": "একটি সম্পর্ক সংযোজন করা হয়েছে।", + "note": "টীকা যোগ করুন।" } }, "start": { @@ -50,7 +56,7 @@ }, "continue": { "key": "A", - "title": "\t\nচালিয়ে যান", + "title": "এগিয়ে যান", "description": "এই রেখাকে প্রলম্বিত করুন.", "not_eligible": "কোন রেখাকে এখানে প্রলম্বিত করা যাবে না.", "annotation": { @@ -192,8 +198,6 @@ "localized_translation_language": "ভাষা বেছে নিন", "localized_translation_name": "নাম" }, - "login": "প্রবেশ করুন", - "logout": "বেরিয়ে যান", "loading_auth": "ওপেনস্ট্রীটম্যাপে সংযোগ করা হচ্ছে ...", "report_a_bug": "সমস্যা প্রতিবেদন করুন", "help_translate": "অনুবাদ সাহায্য", @@ -1403,6 +1407,22 @@ "text": "মানচিত্র © Thunderforest, উপাত্ত © ওপেনস্ট্রীটম্যাপের অবদানকারীগণ" } } + }, + "community": { + "cape-coast-youthmappers": { + "description": "টুইটারে আমাদের অনুসরণ করুন: {url}" + }, + "osm-gh-facebook": { + "name": "ফেসবুকে ঘানা OpenStreetMap", + "description": "OpenStreetMap-এ আগ্রহীদের জন্য ফেসবুক গ্রুপ।" + }, + "osm-gh-twitter": { + "name": "টুইটারে ঘানা OpenStreetMap", + "description": "টুইটারে আমাদের অনুসরণ করুন: {url}" + }, + "talk-gh": { + "name": "Talk-gh মেইলিং লিস্ট" + } } } } \ No newline at end of file diff --git a/dist/locales/bs.json b/dist/locales/bs.json index b857f0e5e..6f8985f46 100644 --- a/dist/locales/bs.json +++ b/dist/locales/bs.json @@ -186,7 +186,6 @@ "localized_translation_language": "Izaberite jezik", "localized_translation_name": "Naziv" }, - "logout": "Odjavite se", "loading_auth": "Povezivanje na OpenStreetMap...", "status": { "error": "Nemoguće povezati na API.", diff --git a/dist/locales/ca.json b/dist/locales/ca.json index cd9df7b1b..5e429e0d6 100644 --- a/dist/locales/ca.json +++ b/dist/locales/ca.json @@ -21,6 +21,9 @@ "description": "Afegiu restaurants, monuments, bústies de correus o altres punts al mapa.", "tail": "Cliqueu al mapa per a afegir un punt." }, + "add_note": { + "tail": "Cliqueu al mapa per a afegir una nota." + }, "browse": { "title": "Navega", "description": "Allunyeu o apropeu el mapa" @@ -297,6 +300,11 @@ "create": "Heu afegit una restricció de gir", "delete": "Heu eliminat una restricció de gir" } + }, + "detach_node": { + "title": "Desconnecta", + "description": "Desconnecta aquest node de les seves línies/àrees.", + "annotation": "S'ha desconnectat un node de les línies/àrees pare." } }, "restriction": { @@ -352,8 +360,8 @@ "localized_translation_name": "Nom" }, "zoom_in_edit": "Apropeu-vos més per editar", - "login": "inicia sessió", - "logout": "Tancar la sessió", + "login": "Inicia la sessió", + "logout": "Tanca la sessió", "loading_auth": "Connectant a OpenStreetMap...", "report_a_bug": "Informa d'un error", "help_translate": "Ajuda a traduir-lo", @@ -709,11 +717,14 @@ "cannot_zoom": "No es pot allunyar més la vista al mode actual.", "full_screen": "Passar a pantalla completa", "gpx": { - "local_layer": "Fitxer local", + "local_layer": "Afegeix un GPX", "drag_drop": "Arrossegueu i deixeu anar un fitxer .gpx, .geojon o .kml a la pàgina, o feuclic al botó de la dreta per a ubicar-lo", "zoom": "Escala a la capa", "browse": "Navega cap a un fitxer" }, + "mvt": { + "local_layer": "Afegeix un MVT" + }, "streetside": { "tooltip": "Fotografies a peu de carrer de Microsoft", "hires": "Alta resolució" @@ -736,6 +747,11 @@ "openstreetcam": { "view_on_openstreetcam": "Visualitzeu la imatge a OpenStreetCam" }, + "note": { + "note": "Nota", + "title": "Edita la nota", + "anonymous": "anònim" + }, "help": { "title": "Ajuda", "key": "H", @@ -1051,8 +1067,7 @@ "title": "Dibuixant", "add_point": "Mode \"Afegir punt\"", "add_line": "Mode \"Afegir línia\"", - "add_area": "Mode \"Afegir Àrea\"", - "place_point": "Seleccioneu un punt" + "add_area": "Mode \"Afegir Àrea\"" }, "operations": { "title": "Operaccions", @@ -5215,6 +5230,22 @@ } }, "community": { + "cape-coast-youthmappers": { + "name": "Universitat de Cape Coast YouthMappers", + "description": "Segueix-nos a Twitter: {url}", + "extendedDescription": "Aquest és l'identificacdor oficial dels Joves Cartografistes de la Universitat de Cape Coast, Ghana. Ens encanten els mapes, les dades obertes i ajudar a les persones vulnerables." + }, + "osm-gh-facebook": { + "name": "OpenStreetMap Ghana a Facebook", + "description": "Grup de Facebook per a gent interessada en OpenStreetMap." + }, + "osm-gh-twitter": { + "name": "OpenStreetMap Ghana a Twitter", + "description": "Segueix-nos a Twitter: {url}" + }, + "talk-gh": { + "name": "Llista de correu Talk-gh" + }, "OSM-India-facebook": { "description": "Millora OpenStreetMap a l'Índia" }, diff --git a/dist/locales/ckb.json b/dist/locales/ckb.json index 312d5611d..ab808b09c 100644 --- a/dist/locales/ckb.json +++ b/dist/locales/ckb.json @@ -23,7 +23,6 @@ "localized_translation_language": "هەڵبژاردنی زمان", "localized_translation_name": "ناو" }, - "logout": "چوونە دەرەوە", "report_a_bug": "ناردنی هەڵە", "help_translate": "یارمەتیدان بۆ وەرگێڕان", "commit": { @@ -84,6 +83,11 @@ "startediting": { "title": "دەستپێکردنی دەستکاری" } + }, + "community": { + "it-twitter": { + "description": "لەسەر تویتەر شوێنمان بکەوە {url}" + } } } } \ No newline at end of file diff --git a/dist/locales/cs.json b/dist/locales/cs.json index 586a5c291..234a4c239 100644 --- a/dist/locales/cs.json +++ b/dist/locales/cs.json @@ -21,6 +21,10 @@ "description": "Přidat do mapy restaurace, poštovní schránky, zastávky či jiné body.", "tail": "Klikněte na mapu a přidejte tak bod." }, + "add_note": { + "title": "Poznámka", + "tail": "Klikněte do mapy pro přidání poznámky." + }, "browse": { "title": "Procházet", "description": "Posunutí a zvětšení mapy." @@ -306,6 +310,11 @@ }, "help": { "indirect": "(nepřímé)", + "turn": { + "no_left_turn": "Zákaz odbočení vlevo {indirect}", + "no_right_turn": "Zákaz odbočení vpravo {indirect}", + "no_u_turn": "Zákaz otáčení {indirect}" + }, "from": "Z", "via": "PŘES", "to": "DO", @@ -331,8 +340,6 @@ "localized_translation_name": "Název" }, "zoom_in_edit": "Pro editaci přibližte", - "login": "přihlášení", - "logout": "odhlásit", "loading_auth": "Připojování na OpenStreetMap…", "report_a_bug": "Nahlásit chybu", "help_translate": "Pomoct s překladem", @@ -636,6 +643,8 @@ "view_on_osm": "Zobrazit změny na OSM", "changeset_id": "Vaše sada změn #: {changeset_id}", "like_osm": "Líbí se Vám OpenStreetMap? Spojte se s ostatními:", + "more": "Více", + "events": "Události", "languages": "Jazyky: {languages}", "tell_us": "Řekněte nám o tom!" }, @@ -686,11 +695,18 @@ "cannot_zoom": "Aktuální nastavení nedovoluje větší zvětšení.", "full_screen": "Na celou obrazovku", "gpx": { - "local_layer": "Místní soubor", + "local_layer": "Přidat GPX", "drag_drop": "Přetáhni a pusť .gpx, .geojson nebo .kml soubor na stránku, nebo klikni tlačítko napravo k prohlížení", "zoom": "Přibliž na vrstvu", "browse": "Hledej soubor" }, + "mvt": { + "local_layer": "Přidat MVT", + "zoom": "Přiblížit na vrstvu" + }, + "streetside": { + "hires": "Vysoké rozlišení" + }, "mapillary_images": { "tooltip": "Fotografie z úrovně ulice z Mapillary", "title": "Vrstva fotografií (Mapillary)" @@ -709,6 +725,19 @@ "openstreetcam": { "view_on_openstreetcam": "Zobrazit tento obrázek na OpenStreetCam" }, + "note": { + "note": "Poznámka", + "title": "Upravit poznámku", + "anonymous": "anonymní", + "closed": "(uzavřeno)", + "commentTitle": "Komentáře", + "newComment": "Nový komentář", + "close": "Zavřít poznámku", + "open": "Znovuotevřít poznámku", + "comment": "Komentář", + "new": "Nová poznámka", + "save": "Uložit poznámku" + }, "help": { "title": "Nápověda", "key": "H", @@ -732,6 +761,7 @@ "title": "Úpravy & ukládání", "select_h": "Výběr", "multiselect_h": "Vícenásobný výběr", + "undo_redo_h": "Zpět - Vpřed", "save_h": "Uložit", "save": "Stiskněte{save} **Uložit** pro ukončení svých úprav a jejich nahrání na OpenStreetMap. Pamatujte na časté ukládání své práce!", "save_validation": "Na obrazovce ukládání budete mít šanci prohlédnout si své úpravy. iD také provede některé základní kontroly ohledně chybějících informací a případně Vám může pomoci návrhy a varováními, pokud se něco nebude zdát v pořádku.", @@ -765,6 +795,30 @@ "square_area_h": "Pravoúhlé rohy", "modify_area_h": "Úprava ploch", "delete_area_h": "Odstraňování ploch" + }, + "relations": { + "title": "Relace", + "edit_relation_h": "Úpravy relací", + "multipolygon_h": "Multipolygony", + "boundary_h": "Hranice" + }, + "streetlevel": { + "title": "Pouliční fotky", + "using_h": "Používání pouličních fotek" + }, + "gps": { + "title": "GPS stopy", + "using_h": "Používání GPS stop" + }, + "field": { + "restrictions": { + "about": { + "title": "O" + }, + "tips": { + "title": "Tipy" + } + } } }, "intro": { @@ -1072,6 +1126,12 @@ "title": "Vybrání prvků", "select_one": "Zvolit jednu vlastnost", "select_multi": "Zvolit více vlastností" + }, + "with_selected": { + "edit_menu": "Přepnout menu úprav" + }, + "vertex_selected": { + "title": "S vybraným uzlem" } }, "editing": { @@ -1081,25 +1141,32 @@ "add_point": "Režim 'Přidat bod'", "add_line": "Režim 'Přidat čáru'", "add_area": "Režim 'Přidat plochu'", - "place_point": "Umístit bod", "disable_snap": "Přidržte pro zakázání přichytávání bodů" }, "operations": { "title": "Operace", "reverse": "Vrátit čáru", - "circularize": "Zakulacení uzavřených čar, nebo ploch" + "circularize": "Zakulacení uzavřených čar, nebo ploch", + "delete": "Smazat zvolené vlastnosti" }, "commands": { "title": "Příkazy", "copy": "Kopírovat vybrané vlastnosti", "paste": "Vložit vybrané vlastnosti", + "undo": "Vrátit poslední akci", + "redo": "Zopakovat poslední akci", "save": "Uložit změny" } }, "tools": { "title": "Nástroje", "info": { - "title": "Informace" + "title": "Informace", + "all": "Přepnout všechny informační panely", + "background": "Přepnout panel pozadí", + "history": "Přepnout panel historie", + "location": "Přepnout panel umístění", + "measurement": "Přepnout panel měření" } } }, @@ -1516,6 +1583,9 @@ "cycleway:right": "Po pravé straně" } }, + "dance/style": { + "label": "Taneční styly" + }, "date": { "label": "Datum" }, @@ -1584,6 +1654,9 @@ "display": { "label": "Zobrazení" }, + "distance": { + "label": "Celková vzdálenost" + }, "dock": { "label": "Typ" }, @@ -1735,6 +1808,25 @@ "label": "Počet košů", "placeholder": "1, 2, 4..." }, + "horse_dressage": { + "options": { + "equestrian": "Ano", + "undefined": "Ne" + } + }, + "horse_riding": { + "options": { + "horse_riding": "Ano", + "undefined": "Ne" + } + }, + "horse_stables": { + "label": "Jezdecká stáj", + "options": { + "stables": "Ano", + "undefined": "Ne" + } + }, "iata": { "label": "IATA" }, @@ -1754,6 +1846,9 @@ "indoor": { "label": "Uvnitř" }, + "industrial": { + "label": "Druh" + }, "information": { "label": "Typ" }, @@ -1874,6 +1969,9 @@ "label": "Povolená rychlost", "placeholder": "40, 50, 60..." }, + "maxspeed/advisory": { + "placeholder": "40, 50, 60…" + }, "maxstay": { "label": "Povoleno zůstat max." }, @@ -2113,6 +2211,9 @@ "recycling_accepts": { "label": "Určení" }, + "ref": { + "label": "Referenční kód" + }, "ref/isil": { "label": "Kód ISIL" }, @@ -2224,6 +2325,17 @@ "shop": { "label": "Typ" }, + "siren/purpose": { + "label": "Účel" + }, + "siren/type": { + "label": "druh", + "options": { + "electronic": "Elektronická", + "other": "Ostatní", + "pneumatic": "Pneumatická" + } + }, "site": { "label": "Typ" }, @@ -2302,6 +2414,7 @@ "placeholder": "Není známo" }, "structure_waterway": { + "label": "Struktura", "options": { "tunnel": "Tunel" }, @@ -2431,7 +2544,8 @@ "auto": "Autotransformátor", "converter": "Převodník", "generator": "Generátor", - "phase_angle_regulator": "Regulátor fázového úhlu" + "phase_angle_regulator": "Regulátor fázového úhlu", + "yes": "Neznámé" } }, "trees": { @@ -2441,6 +2555,9 @@ "label": "Typ", "placeholder": "Výchozí" }, + "usage_rail": { + "label": "Druh použití" + }, "visibility": { "label": "Viditelnost", "options": { @@ -2497,6 +2614,9 @@ "wheelchair": { "label": "Pro vozíčkáře" }, + "wholesale": { + "label": "Velkoobchod" + }, "width": { "label": "Šířka (v metrech)" }, @@ -2524,6 +2644,9 @@ "name": "Reklamní poutač", "terms": "reklama,billboard,plakát" }, + "advertising/column": { + "name": "Reklamní sloup" + }, "aerialway": { "name": "Lanovka/vlek" }, @@ -3026,6 +3149,9 @@ "name": "Automat na cigarety", "terms": "automat,cigarety,prodejní automat" }, + "amenity/vending_machine/coffee": { + "name": "Automat na kávu" + }, "amenity/vending_machine/condoms": { "name": "Automat na kondomy", "terms": "automat,prodejní automat,kondom,prezervativ" @@ -3034,6 +3160,12 @@ "name": "Automat na nápoje", "terms": "automat,prodejní automat,nápoj,nápoje,pití,plechovky,lahve,limonáda,kafe,káva,pivo" }, + "amenity/vending_machine/electronics": { + "name": "Elektronický prodejní automat" + }, + "amenity/vending_machine/elongated_coin": { + "name": "Prodejní automat na mince" + }, "amenity/vending_machine/excrement_bags": { "name": "Automat na pytlíky na exkrementy", "terms": "automat,prodejní automat,pytlík,pes,psí exkrementy,psí hovna,exkrement,hovno,hovínko" @@ -3041,6 +3173,12 @@ "amenity/vending_machine/feminine_hygiene": { "name": "Automat dámské hygieny" }, + "amenity/vending_machine/food": { + "name": "Jídelní automat" + }, + "amenity/vending_machine/ice_cream": { + "name": "Automat na zmrzlinu" + }, "amenity/vending_machine/news_papers": { "name": "Automat na noviny" }, @@ -3099,9 +3237,15 @@ "name": "Plocha silnice", "terms": "plocha silnice,povrch silnice,plocha cesty,povrch cesty" }, + "attraction/amusement_ride": { + "name": "Zábavní jízda" + }, "attraction/animal": { "name": "Zvíře" }, + "attraction/big_wheel": { + "name": "Ruské kolo" + }, "attraction/bumper_car": { "name": "Autodrom" }, @@ -3111,6 +3255,15 @@ "attraction/carousel": { "name": "Kolotoč" }, + "attraction/maze": { + "name": "Bludiště" + }, + "attraction/pirate_ship": { + "name": "Pirátská loď" + }, + "attraction/river_rafting": { + "name": "Říční rafting" + }, "attraction/roller_coaster": { "name": "Horská dráha" }, @@ -3261,6 +3414,12 @@ "building/entrance": { "name": "Vchod/východ (zastaralý tag)" }, + "building/farm": { + "name": "Zemědělský dům" + }, + "building/farm_auxiliary": { + "name": "Zemědělská budova" + }, "building/garage": { "name": "Garáž", "terms": "garáž,garáže,parkování,kryté parkování" @@ -3415,10 +3574,16 @@ "name": "Catering", "terms": "catering,dodavatel občerstvení,dodavatelství občerstvení" }, + "craft/chimney_sweeper": { + "name": "Kominík" + }, "craft/clockmaker": { "name": "Hodinář (ne hodinky)", "terms": "hodinářství,hodinář,hodiny" }, + "craft/confectionery": { + "name": "Cukrář" + }, "craft/distillery": { "name": "Lihovar" }, @@ -3519,6 +3684,9 @@ "name": "Lešenář", "terms": "lešenář,lešenářství,lešení" }, + "craft/sculptor": { + "name": "Sochař" + }, "craft/shoemaker": { "name": "Švec", "terms": "švec,ševcovství,obuvník,obuvnictví" @@ -3572,10 +3740,19 @@ "emergency/destination": { "name": "Vjezd záchranným vozidlům jen do místa" }, + "emergency/fire_alarm": { + "name": "Ohlašovna požárů" + }, + "emergency/fire_extinguisher": { + "name": "Hasící přístroj" + }, "emergency/fire_hydrant": { "name": "Požární hydrant", "terms": "požární hydrant, hasičský hydrant, pumpa" }, + "emergency/first_aid_kit": { + "name": "Lékárnička první pomoci" + }, "emergency/life_ring": { "name": "Kruh života" }, @@ -3592,6 +3769,9 @@ "emergency/private": { "name": "Vjezd záchranným vozidlům jen s povolením" }, + "emergency/siren": { + "name": "Siréna" + }, "emergency/yes": { "name": "Vjezd záchranných vozidel povolen" }, @@ -3681,6 +3861,9 @@ "healthcare/hospice": { "name": "Hospic" }, + "healthcare/laboratory": { + "name": "Zdravotnická laboratoř" + }, "healthcare/midwife": { "name": "Porodní bába", "terms": "dítě,porod,těhotenství" @@ -3986,6 +4169,9 @@ "name": "Hospodářský les", "terms": "les,hospodářský les" }, + "landuse/garages": { + "name": "Garáže" + }, "landuse/grass": { "name": "Tráva", "terms": "tráva" @@ -4084,6 +4270,9 @@ "name": "Rekreační území", "terms": "rekreace,prostranství pro rekreaci,náves,hřiště,obecní zeleň" }, + "landuse/religious": { + "name": "Posvátné území" + }, "landuse/residential": { "name": "Rezidenční oblast", "terms": "obytná oblast,rezidenční oblast,byty,domy,bydlení,obytné,sídelní" @@ -4120,6 +4309,9 @@ "name": "Tančírna", "terms": "taneční sál,tančírna,jive,džajv,swing,tango,waltz,valčík,polka" }, + "leisure/dancing_school": { + "name": "Taneční škola" + }, "leisure/dog_park": { "name": "Psí park", "terms": "park pro psy,psí park" @@ -4290,6 +4482,9 @@ "name": "Štola", "terms": "štola,důl,vstup do dolu,důlní,horní,tunel" }, + "man_made/antenna": { + "name": "Anténa" + }, "man_made/breakwater": { "name": "Vlnolam", "terms": "pobřežní hráz,násep,kameny,molo,zábrana" @@ -4332,10 +4527,16 @@ "name": "Stožár", "terms": "anténa,vysílací věž,BTS,BTSka,mobilní vysílač,vysílač GSM,televizní vysílač,rozhlasový vysílač" }, + "man_made/monitoring_station": { + "name": "Monitorovací stanice" + }, "man_made/observation": { "name": "Rozhledna", "terms": "rozhledna,pozorovatelna,věž" }, + "man_made/observatory": { + "name": "Observatoř" + }, "man_made/petroleum_well": { "name": "Ropný vrt", "terms": "ropa,těžba,těžební,ropný,vrt" @@ -4403,6 +4604,12 @@ "name": "Továrna", "terms": "montáž,výroba,pivovar,auto,závod,továrna,zpracování,rafinerie" }, + "manhole": { + "name": "Šachta" + }, + "manhole/telecom": { + "name": "Telekomunikační šachta" + }, "natural": { "name": "Přírodní objekt", "terms": "příroda,přírodní,naturální,přirozený" @@ -4447,6 +4654,9 @@ "name": "Vřesoviště", "terms": "vřesoviště,vřes" }, + "natural/mud": { + "name": "Bahno" + }, "natural/peak": { "name": "Vrchol", "terms": "hora,vrch,vrchol,vrcholek,kopec,kopeček,kóta,mont,mount,pik" @@ -4519,9 +4729,27 @@ "name": "Kanceláře", "terms": "kancelář,kancelářský,úřad,úřadovna,administrativa,office,sídlo" }, + "office/accountant": { + "name": "Účetnictví" + }, "office/administrative": { "name": "Místní úřad" }, + "office/adoption_agency": { + "name": "Adopční agentura" + }, + "office/advertising_agency": { + "name": "Reklamní agentura" + }, + "office/architect": { + "name": "Kancelář architekta" + }, + "office/association": { + "name": "Kancelář neziskové organizace" + }, + "office/charity": { + "name": "Kancelář charity" + }, "office/coworking": { "name": "Místo pro spolupráci", "terms": "spolupráce,kancelář" @@ -4782,6 +5010,9 @@ "public_transport/station_tram": { "name": "Tramvajová stanice" }, + "public_transport/station_trolleybus": { + "name": "Trolejbusová stanice/terminál" + }, "public_transport/stop_area": { "name": "Oblast zastávky" }, @@ -5173,6 +5404,9 @@ "name": "Klenotnictví", "terms": "zlatnictví,šperky,klenotník,klenoty,klenotnictví,bižutérie,náramky,náušnice,prsteny" }, + "shop/kiosk": { + "name": "Kiosek" + }, "shop/kitchen": { "name": "Kuchyňské studio", "terms": "kuchyně,kuchyňský,kuchyňské linky,kuchyně na míru" @@ -5217,6 +5451,9 @@ "name": "Obchod s motocykly", "terms": "prodejna motocyklů,prodejna motorek,motocykly,motorky" }, + "shop/motorcycle_repair": { + "name": "Opravna motocyklů" + }, "shop/music": { "name": "Obchod s hudbou", "terms": "hudební obchod,obchod s hudbou,cd,lp" @@ -5376,6 +5613,9 @@ "name": "Zbraně a střelivo", "terms": "zbraně,střelivo,pistole,pušky,puška,nůž,nože,army" }, + "shop/wholesale": { + "name": "Velkoobchodní sklad" + }, "shop/window_blind": { "name": "Obchod s roletami", "terms": "roleta,rolety,žaluzie,okenice" @@ -5416,6 +5656,9 @@ "name": "Místo pro karavany", "terms": "místo pro karavany,kemp,camp,camping,karavan" }, + "tourism/chalet": { + "name": "Prázdninová vesnice" + }, "tourism/gallery": { "name": "Galerie umění", "terms": "muzeum umění,galerie umění,umělecká galerie,umělecké muzeum,galerie" @@ -5685,6 +5928,9 @@ } }, "imagery": { + "AGIVFlandersGRB": { + "name": "AGIV Flanders GRB" + }, "Bing": { "description": "Satelitní a letecké snímky.", "name": "Letecké snímky Bing" @@ -5786,6 +6032,18 @@ "US-TIGER-Roads-2017": { "name": "TIGER Roads 2017" }, + "UrbISOrtho2016": { + "name": "UrbIS-Ortho 2016" + }, + "UrbISOrtho2017": { + "name": "UrbIS-Ortho 2017" + }, + "UrbisAdmFR": { + "name": "UrbisAdm FR" + }, + "UrbisAdmNL": { + "name": "UrbisAdm NL" + }, "Waymarked_Trails-Cycling": { "attribution": { "text": "© waymarkedtrails.org, přispěvatelé OpenStreetMap, CC BY-SA 3.0" @@ -5865,22 +6123,62 @@ }, "name": "OpenStreetMap (německý styl)" }, + "osmse-ekonomiska": { + "attribution": { + "text": "© Lantmäteriet" + } + }, "qa_no_address": { "attribution": { "text": "Simon Poole, data © přispěvatelé OpenStreetMap" } }, + "skobbler": { + "name": "skobbler" + }, "stamen-terrain-background": { "name": "Terén Stamen" }, "tf-cycle": { "attribution": { "text": "Mapy © Thunderforest, data © přispěvatelé OpenStreetMap" - } + }, + "name": "Thunderforest OpenCycleMap" }, "tf-landscape": { "attribution": { "text": "Mapy © Thunderforest, data © přispěvatelé OpenStreetMap" + }, + "name": "Thunderforest Landscape" + }, + "trafikverket-baninfo": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-baninfo-option": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat-extra": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat-navn": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat-option": { + "attribution": { + "text": "© Trafikverket, CC0" } } }, diff --git a/dist/locales/da.json b/dist/locales/da.json index 222c1df80..c2be950a5 100644 --- a/dist/locales/da.json +++ b/dist/locales/da.json @@ -135,7 +135,7 @@ }, "connected_to_hidden": { "single": "Dette objekt kan ikke slettes da det er forbundet til et skjult objekt.", - "multiple": "Disse objekter kan ikke blive slettet da nogle af dem er forbundet til skjulte features." + "multiple": "Disse kortobjekter kan ikke slettes, da nogle af dem er forbundet til skjulte kortobjekter." } }, "add_member": { @@ -151,6 +151,7 @@ "line": "Forbandt en vej til en linje.", "area": "Forbandt en vej til et område." }, + "relation": "Disse kortobjekter kan ikke forbindes, da deres relationsroller er i konflikt. ", "restriction": "Disse kortobjekter kan ikke forbindes, da det ville skade en \"{relation}\"-relation." }, "disconnect": { @@ -169,6 +170,8 @@ "annotation": "Fusionerede {n} objekter.", "not_eligible": "Disse objekter kan ikke fusioneres.", "not_adjacent": "Disse objekter kan ikke fusioneres da deres endepunkter ikke er forbundet.", + "restriction": "Disse kortobjekter kan ikke fusioneres, da det ville ødelægge en \"{relation}\"-relation.", + "relation": "Disse kortobjekter kan ikke fusioneres, da deres relationsroller er i konflikt. ", "incomplete_relation": "Disse objekter kan ikke fusioneres, da mindst et af dem ikke er blevet downloadet helt.", "conflicting_tags": "Disse objekter kan ikke fusioneres fordi nogle af deres tags har konfliktende værdier." }, @@ -195,8 +198,8 @@ "multiple": "Disse objekter kan ikke flyttes da der ikke er nok af dem i synligt område." }, "connected_to_hidden": { - "single": "Dette objekt kan ikke flyttes da det er forbundet til en skjult feature.", - "multiple": "Disse objekter kan ikke flyttes da nogle af dem er forbundet til skjulte features." + "single": "Dette kortobjekt kan ikke flyttes, da det er forbundet til et skjult kortobjekt.", + "multiple": "Disse kortobjekter kan ikke flyttes, da nogle af dem er forbundet til skjulte kortobjekter." } }, "reflect": { @@ -237,8 +240,8 @@ "multiple": "Disse objekter kan ikke spejlvendes, da der ikke er nok af dem synligt i den nuværende visning." }, "connected_to_hidden": { - "single": "Dette objekt kan ikke spejlvendes, da det er forbundet med et skjult objekt.", - "multiple": "Disse objekter kan ikke spejlvendes, da nogle af dem er forbundet med skjulte objekter." + "single": "Dette kortobjekt kan ikke spejlvendes, da det er forbundet til et skjult kortobjekt.", + "multiple": "Disse kortobjekter kan ikke spejlvendes, da nogle af dem er forbundet til skjulte kortobjekter." } }, "rotate": { @@ -294,6 +297,13 @@ "create": "Tilføjede en svingbegrænsning", "delete": "Slettede en svingbegrænsning" } + }, + "detach_node": { + "title": "Afkobl", + "description": "Afkobl denne node fra disse linjer/områder.", + "annotation": "Afkoblede en node fra overordnede linjer/områder.", + "restriction": "Denne node kan ikke afkobles, da det ville ødelægge en \"{relation}\"-relation.", + "connected_to_hidden": "Denne node kan ikke afkobles, da den er forbundet til et skjult kortobjekt." } }, "restriction": { @@ -349,8 +359,8 @@ "localized_translation_name": "Navn" }, "zoom_in_edit": "Zoom ind for at redigere", - "login": "login", - "logout": "log ud", + "login": "Log ind", + "logout": "Log ud", "loading_auth": "Forbinder til OpenStreetMap...", "report_a_bug": "Rapporterer en fejl", "help_translate": "Hjælp med at oversætte", @@ -533,6 +543,10 @@ "osm": { "tooltip": "Kortdata fra OpenStreetMap", "title": "OpenStreetMap data" + }, + "notes": { + "tooltip": "Bemærkningsdata fra OpenStreetMap", + "title": "OpenStreetMap-bemærkninger" } }, "fill_area": "Udfyldning af områder", @@ -655,6 +669,7 @@ "changeset_id": "Dit ændringssætnummer: {changeset_id}", "like_osm": "Kan du lide OpenStreetMap? Få kontakt med andre:", "more": "Mere", + "events": "Begivenheder", "languages": "Sprog: {languages}", "missing": "Mangler der noget på listen?", "tell_us": "Fortæl os det!" @@ -694,7 +709,7 @@ "untagged_area": "Område uden tags", "untagged_area_tooltip": "Vælg en objekttype der beskriver hvad slags område dette er.", "untagged_relation": "Ej tagget relation", - "untagged_relation_tooltip": "Vælg en objekttype der beskriver hvad slags relation dette er.", + "untagged_relation_tooltip": "Vælg en objekttype der beskriver hvilken slags relation dette er.", "many_deletions": "Du sletter {n} kortobjekter: {p} noder, {l} linjer, {a} områder, {r} relationer. Er du sikker på at du vil gøre dette? Dette vil slette dem fra kortet som alle andre ser på openstreetmap.org.", "tag_suggests_area": "Tagget {tag} antyder at linjen skulle være et område, men den er ikke et område", "deprecated_tags": "Frarådede tags: {tags}" @@ -706,11 +721,24 @@ "cannot_zoom": "Kan ikke zoome længere ud i nuværende tilstand.", "full_screen": "Skift fuld skærmtilstand", "gpx": { - "local_layer": "Lokal fil", + "local_layer": "Tilføj en GPX", "drag_drop": "Træk og slip en .gpx, .geojson eller .kml ind på siden eller klik på knappen til højre for at browse", "zoom": "Zoom til lag", "browse": "Gennemse efter en fil" }, + "mvt": { + "local_layer": "Tilføj en MVT", + "drag_drop": "Træk og slip en .mvt eller .pbf-fil til siden, eller klik på knappen til højre for at vælge", + "zoom": "Zoom til lag", + "browse": "Vælg en fil" + }, + "streetside": { + "tooltip": "Gadefotos fra Microsoft", + "title": "Foto-overlag (Bing Streetside)", + "report": "Rapporter en privatlivsbekymring angående dette billede", + "view_on_bing": "Vis på Bing Maps", + "hires": "Høj opløsning" + }, "mapillary_images": { "tooltip": "Gadeniveau-billeder fra Mapillary", "title": "Fotooverlægning (Mapillary)" @@ -729,6 +757,24 @@ "openstreetcam": { "view_on_openstreetcam": "Vis dette billede på OpenStreetCam" }, + "note": { + "note": "Bemærkning", + "title": "Rediger bemærkning", + "anonymous": "anonym", + "closed": "(Lukket)", + "commentTitle": "Kommentarer", + "newComment": "Ny kommentar", + "inputPlaceholder": "Skriv en kommentar du vil dele med andre brugere.", + "close": "Luk bemærkning", + "open": "Genåben bemærkning", + "comment": "Kommentar", + "close_comment": "Luk og kommentér", + "open_comment": "Genåben og kommentér", + "report": "Rapportér", + "login": "Du skal logge ind for at ændre eller kommentere denne bemærkning.", + "upload_explanation": "Dine kommentarer vil blive offentligt tilgængelige for alle OpenStreetMap-brugere.", + "upload_explanation_with_user": "Dine kommentarer som bruger {user} vil blive offentligt tilgængelige for alle OpenStreetMap-brugere." + }, "help": { "title": "Hjælp", "key": "H", @@ -780,6 +826,12 @@ "points": { "title": "Punkter" }, + "areas": { + "intro": "*Områder* bruges til at indikere afgrænsningen af større objekter såsom søer, bygninger eller boligområder. Områder bør kortlægges langs kanten af det fysiske objekt de repræsenter, eksempelvis for en bygning langs dens fundament." + }, + "relations": { + "title": "Relationer" + }, "imagery": { "title": "Luftfoto i baggrunden", "intro": "Luftfotoet der vises i baggrunden bagved kortet er en vigtig ressource under redigering af kortet. Dette kan bestå af ortografiske fotos opsamlet fra satellitter, fly eller droner, eller det kan være indskannede historiske kort eller andre frit tilgængelige kildedata.", @@ -965,7 +1017,7 @@ "mouse": "Du kan bruge ethvert pegeredskab til at redigere kortet, men denne gennemgang antager at du har en mus med både en højre og venstre-knap. **Hvis du vil tilslutte en mus, så gør det nu, klik derefter OK.**", "leftclick": "Når du bliver bedt om at klikke eller dobbelt-klikke, menes der venstre museknap. På en trackpad kan det være en nedtrykning af selve fladen, eller et enkelt tryk ovenpå pladen. **Venstreklik {num} gange.**", "rightclick": "Andre gange bliver du bedt om at højreklikke. Dette kan være kontrol-tasten (ctrl) samtidigt med en nedtrykning, eller et dobbelt-tryk ovenpå pladen af en trackpad. Nogle tastaturer har endda en 'menu'-knap som virker ligesom et højreklik. **Højreklik {num} gange.**", - "chapters": "Så langt, så godt! Du kan bruge knapperne i bunden til at springe mellem de forskellige dele af gennemgangren når du har lyst, eller til at genstarte en del hvis du sidder fast. Lad os komme i gang! **Klik '{next}' for at fortsætte.**" + "chapters": "Så langt, så godt! Du kan bruge knapperne i bunden til at springe mellem de forskellige dele af gennemgangen når du har lyst, eller til at genstarte en del hvis du sidder fast. Lad os komme i gang! **Klik '{next}' for at fortsætte.**" }, "navigation": { "title": "Navigation", @@ -1005,6 +1057,7 @@ }, "areas": { "title": "Områder", + "add_playground": "*Områder* bruges til at indikere afgrænsningen af større objekter såsom søer, bygninger eller boligområder.{br}De kan også bruges til mere detaljeret kortlægning af objekter som ellers i første omgang er tilføjet som et punkt. **Klik på {button} Område-knappen for at tilføje et nyt område.** ", "start_playground": "Lad os tilføje denne legeplads til kortet ved at optegne et område. Områder tegnes ved at placere *noder* langs objektets ydre kant. **Klik eller tast mellemrum for at placere den første node i et at legepladsens hjørner.**", "continue_playground": "Fortsæt med at optegne området ved at placere flere noder langs legepladsens kant. Det er fint at forbinde området til de eksisterende stier.{br}Tip: Hvis du holder '{alt}'-knappen ned forbindes noden ikke til andre objekter. **Fortsæt med at optegne legepladsens område.**", "finish_playground": "Afslut området ved at taste retur, eller klikke igen på enten den første eller den sidste node. **Afslut optegningen af legepladsens område.**", @@ -1065,7 +1118,7 @@ "search_tank": "**Søg efter '{preset}'.**", "choose_tank": "**Vælg {preset} fra listen.**", "rightclick_tank": "**Højre-klik for at markere tanken du har tilføjet og vise redigeringsmenuen.**", - "circle_tank": "**Klik på {button} knappen for at lave tanken som en rund cirkel.**", + "circle_tank": "**Klik på {button}-knappen for at lave tanken om til en perfekt cirkel.**", "retry_circle": "Du klikkede ikke på gør rund knappen. Prøv igen.", "play": "Sådan! Øv dig på et par bygninger mere, og prøv nogle af de andre funktioner i redigeringsmenuen. **Når du er klar til at fortsætte til næste del, klik '{next}'.**" }, @@ -1146,7 +1199,7 @@ "next": "Spring til næste node", "first": "Spring til første node", "last": "Spring til sidste node", - "change_parent": "Skift tilhørende vej" + "change_parent": "Skift overordnede vej" } }, "editing": { @@ -1156,15 +1209,15 @@ "add_point": "\"Tilføj punkt\"-tilstand", "add_line": "\"Tilføj linje\"-tilstand", "add_area": "\"Tilføj område\"-tilstand", - "place_point": "Placer et punkt", "disable_snap": "Undlad at 'klistre' til eksisterende punkt", "stop_line": "Afslut tegning af linje eller område" }, "operations": { "title": "Operationer", "continue_line": "Fortsæt linje fra markerede node", - "merge": "Kombiner (sammenflet) markerede kortobjekter", + "merge": "Kombiner (fusioner) markerede kortobjekter", "disconnect": "Separér kortobjekter ved markerede node", + "detach_node": "Afkobl markerede node fra overordnede linjer/områder.", "split": "Opdel linje i to ved markerede node", "reverse": "Vend retning på linje", "move": "Flyt markerede kortobjekter", @@ -4979,6 +5032,9 @@ "name": "Butik", "terms": "Butik, Forretning" }, + "shop/agrarian": { + "name": "Grovvareforretning" + }, "shop/alcohol": { "name": "Vinforhandler", "terms": "Vinforhandler, Vinbutik, Vinforretning" @@ -5005,7 +5061,7 @@ }, "shop/bag": { "name": "Taske/Kuffertbutik", - "terms": "Taske/Kuffertbutik, Lædervareforretning" + "terms": "Taskebutik, Kuffertbutik, Lædervareforretning" }, "shop/bakery": { "name": "Bager", @@ -5017,7 +5073,7 @@ }, "shop/beauty": { "name": "Parfumebutik", - "terms": "Parfumebutik, Skønhedbutik, Materialist" + "terms": "Parfumebutik, Skønhedsbutik" }, "shop/beauty/nails": { "name": "Neglesalon", @@ -5077,15 +5133,15 @@ }, "shop/charity": { "name": "Velgørenhedsbutik", - "terms": "Velgørenhedsbutik" + "terms": "Genbrugsbutik, Velgørenhedsbutik" }, "shop/cheese": { "name": "Ostehandler", "terms": "Ostehandler, Ostebutik, Osteforretning" }, "shop/chemist": { - "name": "Medicinbutik", - "terms": "Medicinbutik, Materialist" + "name": "Materialist", + "terms": "Materialist" }, "shop/chocolate": { "name": "Chokoladeforretning", @@ -5314,8 +5370,8 @@ "terms": "Friluftsudstyrsbutik, Friluftsudstyrsforretning, eventyr,sport,udendørs," }, "shop/paint": { - "name": "Malerforretning", - "terms": "Malerforretning, Malerbutik" + "name": "Farvehandel", + "terms": "Farvehandel, Malerforretning, Malerbutik" }, "shop/pastry": { "name": "Konditori", @@ -5450,7 +5506,7 @@ }, "shop/wine": { "name": "Vinforretning", - "terms": "Vinforretning, Vinbutik" + "terms": "Vinforretning, Vinbutik, Vinhandler" }, "tourism": { "name": "Turisme", @@ -5556,7 +5612,7 @@ }, "traffic_calming/bump": { "name": "Vejbump", - "terms": "Vejbump" + "terms": "Bump, Vejbump" }, "traffic_calming/chicane": { "name": "Trafikchikane", @@ -5784,6 +5840,7 @@ "attribution": { "text": "Vilkår & tilbagemelding" }, + "description": "Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.", "name": "DigitalGlobe Standard ældre fotos" }, "EsriWorldImagery": { @@ -5979,13 +6036,16 @@ }, "community": { "dk-forum": { - "name": "Dansk OpenStreetMap online forum" + "name": "OpenStreetMap Danmark webforum", + "description": "Dansk OpenStreetMap webforum" }, "dk-irc": { - "name": "Dansk OpenStreetMap IRC-kanal" + "name": "OpenStreetMap Danmark IRC", + "description": "Kom ind i kanalen #osm-dk på irc.oftc.net (port 6667)" }, "dk-mailinglist": { - "description": "En email-liste hvor OpenStreetMap i Danmark diskuteres" + "name": "Talk-dk mailinglisten", + "description": "En mailingliste hvor OpenStreetMap i Danmark diskuteres" }, "OSM-Facebook": { "name": "OpenStreetMap på Facebook", diff --git a/dist/locales/de.json b/dist/locales/de.json index 96eae8029..5121b84ed 100644 --- a/dist/locales/de.json +++ b/dist/locales/de.json @@ -21,6 +21,11 @@ "description": "Restaurants, Denkmäler, Briefkästen oder andere Punkte zur Karte hinzufügen.", "tail": "Klicke in die Karte, um einen Punkt hinzuzufügen." }, + "add_note": { + "title": "Hinweis", + "description": "Hast du irgendwo einen Fehler entdeckt? Teile es den anderen Mappern mit.", + "tail": "Klicke auf die Karte, um einen Hinweis hinzuzufügen." + }, "browse": { "title": "Durchsuchen", "description": "Verschiebe und zoome die Karte." @@ -40,7 +45,8 @@ "annotation": { "point": "Punkt hinzugefügt.", "vertex": "Einen Knoten zum Weg hinzugefügt.", - "relation": "Relation hinzugefügt." + "relation": "Relation hinzugefügt.", + "note": "Hinweis hinzugefügt." } }, "start": { @@ -178,8 +184,8 @@ "move": { "title": "Verschieben", "description": { - "single": "Dieses Objekt an eine andere Lage verschieben.", - "multiple": "Diese Objekte an eine andere Lage verschieben." + "single": "Dieses Objekt an eine andere Stelle verschieben.", + "multiple": "Diese Objekte an eine andere Stelle verschieben." }, "key": "M", "annotation": { @@ -297,6 +303,14 @@ "create": "Abbiegebeschränkung hinzugefügt", "delete": "Abbiegebeschränkung gelöscht" } + }, + "detach_node": { + "title": "Trennen", + "key": "E", + "description": "Trenne diesen Knoten von diesen Linien/Flächen.", + "annotation": "Trenne einen Knoten von seinen Linien/Flächen.", + "restriction": "Diese Knoten kann nicht getrennt werden, weil damit eine \"{relation}\" Relation beschädigt werden würde.", + "connected_to_hidden": "Dieser Knoten kann nicht getrennt werden, weil er mit einem versteckten Objekt verbunden ist." } }, "restriction": { @@ -352,7 +366,7 @@ "localized_translation_name": "Name" }, "zoom_in_edit": "Hinein zoomen zum Bearbeiten ", - "login": "Login", + "login": "Anmelden", "logout": "Abmelden", "loading_auth": "Mit OpenStreetMap verbinden …", "report_a_bug": "Einen Fehler melden", @@ -506,7 +520,7 @@ "key": "B", "backgrounds": "Bildmaterial-Quelle", "none": "Leer", - "best_imagery": "Beste bekannte Bildmaterial-Quelle für diese Lage", + "best_imagery": "Beste bekannte Bildmaterial-Quelle für diese Stelle", "switch": "Zu diesem Hintergrund zurückschalten", "custom": "Benutzerdefiniert", "custom_button": "Benutzerdefinierten Hintergrund bearbeiten", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Kartendaten von OpenStreetMap", "title": "OpenStreetMap Daten" + }, + "notes": { + "tooltip": "Hinweise von OpenStreetMap", + "title": "OpenStreetMap Hinweise" } }, "fill_area": "Flächenfüllung", @@ -601,11 +619,11 @@ }, "partial": { "description": "Teilweise Füllung", - "tooltip": "Flächen werden nur am Rand innen gefüllt (Empfohlen für Anfänger)." + "tooltip": "Flächen werden innen entlang der Kanten gefüllt angezeigt. (Empfohlen für Anfänger-Mapper)." }, "full": { "description": "Volle Füllung", - "tooltip": "Flächen werden voll gefüllt angezeigt" + "tooltip": "Flächen werden voll gefüllt angezeigt." } }, "restore": { @@ -710,15 +728,22 @@ "cannot_zoom": "Du kannst im aktuellen Modus nicht weiter heraus zoomen.", "full_screen": "Vollbildmodus ein-/ausschalten", "gpx": { - "local_layer": "Lokale Datei", + "local_layer": "Eine GPX-Datei hinzufügen", "drag_drop": "Zieh eine .gpx, .geojson oder .kml Datei per Drag & Drop auf die Seite oder klicke den Knopf rechts, um nach Dateien zu suchen", - "zoom": "GPS-Track anzeigen", + "zoom": "GPX-Track anzeigen", "browse": "Eine Datei laden" }, + "mvt": { + "local_layer": "Eine MVT-Datei hinzufügen", + "drag_drop": "Zieh eine .mvt oder .pbf Datei per Drag & Drop auf die Seite oder klicke den Knopf rechts, um nach Dateien zu suchen", + "zoom": "MVT-Track anzeigen", + "browse": "Eine Datei aussuchen" + }, "streetside": { "tooltip": "Straßenfotos von Microsoft", "title": "Straßenfotos (Bing Streetside)", "report": "Melde Privatsphäre-Verletzung bei diesem Bild", + "view_on_bing": "Auf Bing Maps ansehen", "hires": "Hochauflösung" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Dieses Bild auf OpenStreetCam ansehen" }, + "note": { + "note": "Hinweis", + "title": "Hinweis bearbeiten", + "anonymous": "Anonym", + "closed": "(geschlossen)", + "commentTitle": "Kommentare", + "newComment": "Neuer Kommentar", + "inputPlaceholder": "Gib einen Kommentar für alle anderen Benutzer ein.", + "close": "Hinweis schließen", + "open": "Hinweis wieder öffnen", + "comment": "Kommentar", + "close_comment": "Kommentieren und schließen", + "open_comment": "Wiedereröffnen und kommentieren", + "report": "Bericht", + "new": "Neuer Hinweis", + "newDescription": "Beschreibe den Fehler.", + "save": "Hinweis speichern", + "login": "Du musst dich anmelden, damit du diesen Hinweis ändern oder kommentieren kannst.", + "upload_explanation": "Deine Kommentare werden für alle OpenStreetMap-Benutzer öffentlich sichtbar sein.", + "upload_explanation_with_user": "Deine Kommentare als {user} werden für alle OpenStreetMap-Benutzer öffentlich sichtbar sein." + }, "help": { "title": "Hilfe", "key": "H", @@ -759,16 +805,16 @@ "navigation_drag": "Du kannst die Karte durch Drücken und Halten der {leftclick} linken Maustaste und Bewegen der Maus verschieben. Du kannst auch die `↓`, `↑`, `←`, `→` Pfeiltasten auf deiner Tastatur benutzen.", "navigation_zoom": "Du kannst durch Scrollen am Mausrad oder am Touchpad oder durch Klicken der {plus} / {minus} Knöpfe rechts oben neben der Karte hinein oder heraus zoomen. Du kannst auch die `+`, `-` Tasten auf der Tastatur benutzen.", "features_h": "Karten-Objekte", - "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte erscheinen, beispielsweise Straßen, Gebäude oder Sehenswürdigkeiten. Alles in der echten Welt kann als ein Objekt in OpenStreetMap abgebildet werden. Objekte werden auf der Karte als *Punkte*, *Linien* oder *Flächen* dargestellt.", + "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte angezeigt werden, beispielsweise Straßen, Gebäude oder Sehenswürdigkeiten. Alles in der echten Welt kann als ein Objekt in OpenStreetMap gezeichnet (gemappt) werden. Objekte werden auf der Karte als *Punkte*, *Linien* oder *Flächen* dargestellt.", "nodes_ways": "In OpenStreetMap werden Punkte manchmal *Knoten* genannt, Linien und Flächen werden manchmal *Wege* genannt." }, "editing": { "title": "Bearbeiten & Speichern", "select_h": "Auswählen", - "select_left_click": "{leftclick} Linksklicke ein Objekt um es auszuwählen. Dadurch wird es mit einem pulsierenden Schimmer hervorgehoben und links im *Objekteditor* werden Details des Objekts wie Name oder Adresse angezeigt.", - "select_right_click": "{rightclick} Rechtsklicke ein Objekt um das *Bearbeitungs-Menü* zu sehen, welches dir die verfügbaren Befehle wie Drehen, Bewegen oder Löschen zeigt.", + "select_left_click": "{leftclick} Klicke auf ein Objekt um es auszuwählen. Dadurch wird es mit einem pulsierenden Schimmer hervorgehoben und links im *Objekteditor* werden Details des Objekts wie Name oder Adresse angezeigt.", + "select_right_click": "{rightclick} Rechtsklicke auf ein Objekt um das *Bearbeitungs-Menü* zu sehen, welches dir die verfügbaren Befehle wie Drehen, Bewegen oder Löschen zeigt.", "multiselect_h": "Mehrfachauswahl", - "multiselect_shift_click": "`{shift}`+{leftclick} Linksklick kann mehrere Objekte gemeinsam auswählen. Damit können diese leicht gemeinsam verschoben, gedreht oder gelöscht werden.", + "multiselect_shift_click": "`{shift}`+{leftclick} Klicken kann mehrere Objekte gemeinsam auswählen. Damit können diese leicht gemeinsam verschoben, gedreht oder gelöscht werden.", "multiselect_lasso": "Eine andere Möglichkeit mehrere Objekte gemeinsam auszuwählen ist die `{shift}` Taste zu halten, dann den {leftclick} linken Mausknopf festzuhalten und mit der Maus ein Auswahl-Lasso um die Objekte zu ziehen. Alle Punkte innerhalb des Auswahl-Lasso werden ausgewählt.", "undo_redo_h": "Rückgängig & Wiederherstellen", "undo_redo": "Deine Bearbeitungen werden lokal in deinem Web Browser gespeichert bis du diese auf dem OpenStreetMap Server speicherst. Du kannst Bearbeitungen durch Klicken des {undo} **Rückgängig** Knopf rückgängig machen und durch Klicken des {redo} **Wiederherstellen** Knopf wiederherstellen.", @@ -776,7 +822,7 @@ "save": "Klicke {save} **Speichern** um deine Bearbeitungen zu beenden und auf dem OpenStreetMap Server zu speichern. Bitte denk daran, deine Arbeit häufig zu speichern!", "save_validation": "Beim Speichern kannst du überprüfen, was du gerade bearbeitet hast. iD macht einfache Prüfungen auf fehlende Daten und kann hilfreiche Vorschläge und Warnungen anzeigen, wenn etwas nicht richtig erscheint.", "upload_h": "Hochladen", - "upload": "Vor dem Hochladen deiner Änderungen musst du einen [Änderungssatz-Kommentar](https://wiki.openstreetmap.org/wiki/DE:Good_changeset_comments) eingeben. Dann klickst du **Upload** um deine Änderungen an OpenStreetMap zu schicken, wo sie in die Karte aufgenommen und öffentlich für alle sichtbar werden.", + "upload": "Vor dem Hochladen deiner Änderungen musst du einen [Änderungssatz-Kommentar](https://wiki.openstreetmap.org/wiki/DE:Good_changeset_comments) eingeben. Dann klicke **Upload** um deine Änderungen an OpenStreetMap zu schicken, wo sie in die Karte aufgenommen und öffentlich für alle sichtbar werden.", "backups_h": "Automatische Sicherungen", "backups": "Wenn du deine Änderungen nicht beenden kannst, beispielsweise weil dein Computer abstürzt oder du den Browser Tag schließt, sind deine Änderungen lokal in deinem Browser gespeichert. Wenn du die Seite wieder öffnest (mit dem gleichen Rechner und Browser) wird dir iD anbieten, deine Änderungen wiederherzustellen.", "keyboard_h": "Tastenkürzel", @@ -788,23 +834,23 @@ "definitions": "Im oberen Bereich wird der Objekttyp angezeigt. Der mittlere Bereich enthält die *Felder* mit den Merkmalen des Objektes wie Name oder Adresse.", "type_h": "Objekttyp", "type": "Du kannst auf den Objekttyp klicken um dem Objekt einem anderen Typ zu geben. Alles in der echten Welt kann als ein Objekt in OpenStreetMap abgebildet werden, daher kannst du aus tausenden Objekttypen wählen.", - "type_picker": "Die Typauswahl zeigt die am häufigsten genutzten Objekttypen wie Park, Spital, Restaurant, Straße oder Gebäude. Du kannst durch Tippen in dem Suchfeld nach dem gewünschten Objekttyp suchen oder das {inspect} **Info** Symbol neben dem Objekttyp anklicken um nähere Informationen zu bekommen.", + "type_picker": "Die Typauswahl zeigt die am häufigsten genutzten Objekttypen wie Park, Spital, Restaurant, Straße oder Gebäude. Du kannst durch Tippen in dem Suchfeld nach dem gewünschten Objekttyp suchen oder das {inspect} **Info** Symbol neben dem Objekttyp klicken um nähere Informationen zu bekommen.", "fields_h": "Felder", "fields_all_fields": "Der Bereich \"Alle Felder\" enthält alle Objektdetails die du bearbeiten kannst. In OpenStreetMap sind alle Felder optional und es ist okay ein Feld leer zu lassen, wenn du unsicher bist.", "fields_example": "Für jeden Objekttyp werden unterschiedliche Felder angezeigt. So können für eine Straße Felder für Oberfläche und Geschwindigkeitsbeschränkung und für ein Restaurant Felder für die angebotene Küche und die Öffnungszeiten angezeigt werden.", - "fields_add_field": "Du kannst auch \"Feld hinzufügen\" anklicken und weitere Felder aus der Dropdown-Liste hinzufügen, beispielsweise Beschreibung, Wikipedia Link, Rollstuhlzugänglichkeit und viele mehr.", + "fields_add_field": "Du kannst auch \"Feld hinzufügen\" klicken und weitere Felder aus der Dropdown-Liste hinzufügen, beispielsweise Beschreibung, Wikipedia Link, Rollstuhlzugänglichkeit und viele mehr.", "tags_h": "Eigenschaften", "tags_all_tags": "Unter den Feldern kannst du den Bereich \"Alle Eigenschaften\" aufklappen und alle OpenStreetMap *Eigenschaften* des ausgewählten Objekts bearbeiten. Jede Eigenschaft besteht aus einem *Schlüssel* und einem *Wert*, damit werden alle in OpenStreetMap gespeicherten Objekte beschrieben.", "tags_resources": "Das Bearbeiten der Eigenschaften von Objekten erfordert detailliertes Wissen über OpenStreetMap. Um mehr über akzeptierte Eigenschaften zu erfahren solltest du dich im [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) oder bei [Taginfo](https://taginfo.openstreetmap.org/) informieren." }, "points": { "title": "Punkte", - "intro": "*Punkte* können zum Darstellen von Objekten wie Geschäften, Restaurants oder Denkmälern benutzt werden. Sie kennzeichnen eine konkrete Lage und beschreiben was sich dort befindet.", + "intro": "*Punkte* können zum Darstellen von Objekten wie Geschäften, Restaurants oder Denkmälern benutzt werden. Sie kennzeichnen eine konkrete Stelle und beschreiben was sich dort befindet.", "add_point_h": "Punkte hinzufügen", "add_point": "Um einen Punkt hinzuzufügen klicke den {point} **Punkt** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `1`. Dadurch wird der Mauszeiger zu einem Kreuz.", - "add_point_finish": "Um den Ort des neuen Punktes auf der Karte festzulegen bewegst du den Mauszeiger an die gewünschte Stelle und drückst die {leftclick} linke Maustaste oder die `Leertaste`.", + "add_point_finish": "Um den neuen Punkt auf der Karte zu platzieren bewegst du den Mauszeiger an die gewünschte Stelle und {leftclick} klickst oder drückst die `Leertaste`.", "move_point_h": "Punkte verschieben", - "move_point": "Um einen Punkt zu verschieben bewegst du den Mauszeiger über den Punkt und drückst und hältst die {leftclick} linke Maustaste, während du den Punkt zu der neuen Lage bewegst.", + "move_point": "Um einen Punkt zu verschieben bewegst du den Mauszeiger über den Punkt und drückst und hältst die {leftclick} linke Maustaste, während du den Punkt zu der neuen Stelle bewegst.", "delete_point_h": "Punkte entfernen", "delete_point": "Du kannst Objekte löschen, die es in der echten Welt nicht gibt. Das Löschen eines Objektes aus OpenStreetMap entfernt es von der Karte die alle benutzen, daher solltest du sicher sein, dass es ein Objekt wirklich nicht gibt, bevor du es löscht.", "delete_point_command": "Um einen Punkt zu löschen, {rightclick} rechtsklicke auf den Punkt um ihn auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {delete} **Löschen** Befehl." @@ -814,21 +860,21 @@ "intro": "*Linien* werden benutzt um Objekte wie Straßen, Eisenbahnschienen oder Flüsse darzustellen. Linien sollen in der Mitte des dargestellten Objekts gezeichnet werden.", "add_line_h": "Linien hinzufügen", "add_line": "Um eine Linie hinzuzufügen klicke den {line} **Linie** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `2`. Dadurch wird der Mauszeiger zu einem Kreuz.", - "add_line_draw": "Dann bewege den Mauszeiger dorthin, wo die Linie beginnen soll und {leftclick} linksklicke oder drücke die `Leertaste` um den ersten Knoten der Linie zu platzieren. Zeichne weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichnens kannst du die Karte verschieben oder hinein zoomen, um mehr Details hinzuzufügen.", + "add_line_draw": "Dann bewege den Mauszeiger dorthin, wo die Linie beginnen soll und {leftclick} klicke oder drücke die `Leertaste` um den ersten Knoten der Linie zu platzieren. Zeichne weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichnens kannst du die Karte verschieben oder hinein zoomen, um mehr Details hinzuzufügen.", "add_line_finish": "Um eine Linie zu beenden drücke `{return}` oder klicke nochmals auf den letzten Knoten.", "modify_line_h": "Linien verändern", - "modify_line_dragnode": "Häufig siehst du Linien die nicht genau gezeichnet sind, beispielweise eine Straße, die nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Linie anzupassen wählst du sie mit {leftclick} linksklick aus. Alle Knoten der Linie werden als kleine Kreise gezeichnet. Du kannst die Knoten an die richtigen Stellen verschieben.", + "modify_line_dragnode": "Häufig siehst du Linien die nicht genau geformt sind, beispielweise eine Straße, die nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Linie anzupassen wählst du sie durch {leftclick} klicken aus. Alle Knoten der Linie werden als kleine Kreise angezeigt. Du kannst die Knoten an bessere Stellen verschieben.", "modify_line_addnode": "Du kannst neue Knoten in einer Linie auch durch {leftclick}**x2** Doppelklicken auf die Linie oder durch Ziehen der kleinen Dreiecke in der Mitte zwischen zwei Knoten erzeugen.", "connect_line_h": "Linien verbinden", "connect_line": "Die richtige Verbindung von Straßen ist wichtig für die Karte und notwendig für das Bereitstellung von Wegbeschreibungen.", - "connect_line_display": "Die Verbindungen von Straßen werden mit kleinen grauen Kreisen gezeichnet. Die Endpunkte von Linien werden mit größeren weisen Kreise gezeichnet, wenn sie nicht mit anderen Objekten verbunden sind.", + "connect_line_display": "Die Verbindungen von Straßen werden mit kleinen grauen Kreisen angezeigt. Die Endpunkte von Linien werden mit größeren weisen Kreise angezeigt, wenn sie nicht mit anderen Objekten verbunden sind.", "connect_line_drag": "Um eine Linie mit einem anderen Objekt zu verbinden, ziehe einen Knoten der Linie auf das andere Objekt bis beide Objekte verbunden sind. Tipp: Du kannst verhindern, dass Knoten mit anderen Objekten verbunden werden, indem du die `{alt}` Taste beim Verschieben gedrückt hältst.", - "connect_line_tag": "Wenn du weißt, dass die Kreuzung eine Ampel oder einen Zebrastreifen hat, kannst du diese erfassen, indem du den Knoten an der Kreuzung auswählst und dann im Objekteditor den richtigen Objekttyp auswählst.", + "connect_line_tag": "Wenn du weißt, dass die Kreuzung eine Ampel oder einen Zebrastreifen hat, kannst du diese zeichnen, indem du den Knoten an der Kreuzung auswählst und dann im Objekteditor den richtigen Objekttyp auswählst.", "disconnect_line_h": "Linien trennen", "disconnect_line_command": "Um eine Straße von einem anderen Objekt zu trennen {rightclick} rechtsklicke auf den Verbindungsknoten und benutze den {disconnect} **Trennen** Befehl aus dem Bearbeitungsmenü.", "move_line_h": "Linien verschieben", - "move_line_command": "Um eine ganze Linie zu verschieben {rightclick} rechtsklicke auf die Linie und benutze den {move} **Verschieben** Befehl aus dem Bearbeitungsmenü. Dann bewege die Maus und {leftclick} linksklicke um die Linie an der neuen Position zu platzieren.", - "move_line_connected": "Linien die mit anderen Objekten verbunden sind bleiben verbunden während du die Linie verschiebst. iD kann verhindern, dass du eine Linie über eine verbundene Linie hinweg schiebst.", + "move_line_command": "Um eine ganze Linie zu verschieben {rightclick} rechtsklicke auf die Linie und benutze den {move} **Verschieben** Befehl aus dem Bearbeitungsmenü. Dann bewege die Maus und {leftclick} klicke um die Linie an der neuen Stelle zu platzieren.", + "move_line_connected": "Linien die mit anderen Objekten verbunden sind bleiben verbunden während du die Linie an eine andere Stelle verschiebst. iD kann verhindern, dass du eine Linie über eine verbundene Linie hinweg schiebst.", "delete_line_h": "Linien entfernen", "delete_line": "Wenn eine Linie als Ganzes unrichtig ist, beispielsweise eine Straße in der echten Welt nicht existiert, kannst du sie löschen. Sei beim Löschen von Objekten vorsichtig: Das von dir benutzte Hintergrund-Bildmaterial kann veraltet sein und die Straße, die falsch aussieht, könnte einfach neu gebaut sein.", "delete_line_command": "Um eine Linie zu löschen, {rightclick} rechtsklicke auf die Linie um sie auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {delete} **Löschen** Befehl." @@ -837,15 +883,15 @@ "title": "Flächen", "intro": "*Flächen* werden benutzt um die Grenzen von Objekten wie Seen, Gebäuden oder Wohngebieten darzustellen. Flächen sollen um die Ränder des Objekts herum gezeichnet werden, beispielsweise um den Grundriss eines Gebäudes.", "point_or_area_h": "Punkte oder Flächen?", - "point_or_area": "Viele Objekte können als Punkte oder Flächen dargestellt werden. Du solltest Gebäude und Wohngebiete wenn möglich als Flächen einzeichnen. Platziere Punkte innerhalb eines Gebäudes um Geschäfte, Einrichtungen und andere Objekte im Gebäude darzustellen.", + "point_or_area": "Viele Objekte können als Punkte oder Flächen gezeichnet werden. Du solltest Gebäude und Wohngebiete wenn möglich als Flächen zeichnen. Platziere Punkte innerhalb eines Gebäudes um Geschäfte, Einrichtungen und andere Objekte im Gebäude darzustellen.", "add_area_h": "Flächen hinzufügen", "add_area_command": "Um eine Fläche hinzuzufügen klicke den {area} **Fläche** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `3`. Dadurch wird der Mauszeiger zu einem Kreuz.", - "add_area_draw": "Dann positioniere den Mauszeiger auf eine Ecke des Objekts und {leftclick} linksklicke oder drücke die `Leertaste` um den ersten Knoten am äußeren Rand der Fläche zu platzieren. Platziere weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichens kannst du die Karte zoomen oder schieben um mehr Details zu zeichnen.", + "add_area_draw": "Dann positioniere den Mauszeiger auf eine Ecke des Objekts und {leftclick} klicke oder drücke die `Leertaste` um den ersten Knoten am äußeren Rand der Fläche zu platzieren. Platziere weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichens kannst du die Karte zoomen oder schieben um mehr Details zu zeichnen.", "add_area_finish": "Um eine Fläche zu beenden drücke `{return}` oder klicke nochmals auf den ersten oder letzten Knoten.", "square_area_h": "Ecken rechtwinklig machen", "square_area_command": "Viele Gebäude und andere Flächen haben rechtwinklige Ecken. Um die Ecken rechtwinklig zu machen, {rightclick} rechtsklicke auf den Rand der Fläche um sie auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {orthogonalize} **Rechtwinklig machen** Befehl.", "modify_area_h": "Flächen verändern", - "modify_area_dragnode": "Häufig siehst du Flächen die nicht genau gezeichnet sind, beispielweise ein Gebäude, das nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Fläche anzupassen wählst du sie mit {leftclick} linksklick aus. Alle Knoten der Fläche werden als kleine Kreise gezeichnet. Du kannst die Knoten an die richtigen Stellen verschieben.", + "modify_area_dragnode": "Häufig siehst du Flächen die nicht genau geformt sind, beispielweise ein Gebäude, das nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Fläche anzupassen wählst du sie mit {leftclick} Klicken aus. Alle Knoten der Fläche werden als kleine Kreise angezeigt. Du kannst die Knoten an bessere Stellen verschieben.", "modify_area_addnode": "Du kannst neue Knoten in einer Fläche auch durch {leftclick}**x2** Doppelklicken am Rand der Fläche oder durch Ziehen der kleinen Dreiecke in der Mitte zwischen zwei Knoten erzeugen.", "delete_area_h": "Flächen löschen", "delete_area": "Wenn eine Fläche als Ganzes unrichtig ist, beispielsweise ein Gebäude in der echten Welt nicht existiert, kannst du es löschen. Sei beim Löschen von Objekten vorsichtig: Das von dir benutzte Hintergrund-Bildmaterial kann veraltet sein und das Gebäude, welches falsch aussieht, könnte einfach neu gebaut sein.", @@ -863,7 +909,7 @@ "relation_types_h": "Typen von Relationen", "multipolygon_h": "Multipolygone", "multipolygon": "Eine Relation vom Typ *Multipolygon* ist eine Gruppe von einem oder mehreren *äußeren* Objekten und einem oder mehreren *inneren* Objekten. Die äußeren Objekte beschreiben den äußeren Rand des Multipolygons, die inneren Objekte beschreiben Teilflächen oder Löcher, die aus dem Multipolygon herausgeschnitten sind.", - "multipolygon_create": "Um ein Multipolygon zu erzeugen, beispielweise ein Gebäude mit einem Innenhof, zeichne sowohl das äußere als auch das innere Objekt entlang dem Rand als Fläche. Dann wähle mit `{shift}`+{leftclick} Linksklick beide Objekte aus und {rightclick} rechtsklicke und benutze den {merge} **Vereinigen** Befehl aus dem Bearbeitungsmenü.", + "multipolygon_create": "Um ein Multipolygon zu erzeugen, beispielweise ein Gebäude mit einem Innenhof, zeichne sowohl das äußere als auch das innere Objekt entlang dem Rand als Fläche. Dann wähle mit `{shift}`+{leftclick} Klick beide Objekte aus und {rightclick} rechtsklicke und benutze den {merge} **Vereinigen** Befehl aus dem Bearbeitungsmenü.", "multipolygon_merge": "Verbinden von mehreren Linien oder Flächen erzeugt ein neues Multipolygon mit allen ausgewählten Objekten als Mitglieder. iD erkennt, welche Objekte in anderen enthalten sind und weist die Rollen innen und außen automatisch zu.", "turn_restriction_h": "Abbiegebeschränkungen", "turn_restriction": "Eine Relation vom Typ *Abbiegebeschränkung* ist eine Gruppe von Straßenabschnitten an einer Kreuzung. Abbiegebeschränkungen bestehen aus einer *von* Straße, einem *via* Knoten und einer *nach* Straße.", @@ -871,35 +917,46 @@ "turn_restriction_editing": "Im Feld \"Abbiegebeschränkungen\" wähle eine \"von\" Straße durch Klicken aus, dann siehst du ob Abbiegen zu allen \"nach\" Straßen erlaubt oder verboten ist. Du kannst das Abbiege-Symbol anklicken um zwischen erlaubt und verboten umzuschalten. iD wird die Relationen automatisch erzeugen und die Rollen \"von\", \"via\" und \"nach\" entsprechend deiner Auswahl vergeben.", "route_h": "Routen", "route": "Eine Relation des Typ *Route* fasst eine oder mehrere Linien zusammen, die gemeinsam ein Streckennetz wie eine Busstrecke, eine Zugstrecke oder eine Autobahnstrecke bilden.", - "route_add": "Um ein Objekt zu einer Route hinzuzufügen, wähle das Objekt aus und scrolle im Objekteditor nach unten zum Bereich \"Alle Relationen\", klicke den {plus} Knopf um dieses Objekt einer nahe gelegenen Relation oder einer neuen Relation hinzuzufügen.", + "route_add": "Um ein Objekt zu einer Route hinzuzufügen, wähle das Objekt aus und scrolle im Objekteditor nach unten zum Bereich \"Alle Relationen\", klicke den {plus} Knopf um dieses Objekt einer in der Nähe vorhandenen oder einer neuen Relation hinzuzufügen.", "boundary_h": "Grenzen", "boundary": "Eine Relation vom Typ *Grenze* fasst eine oder mehrere Linien zusammen, die gemeinsam eine Verwaltungsgrenze bilden.", - "boundary_add": "Um ein Objekt zu einer Grenze hinzuzufügen, wähle das Objekt aus und scrolle im Objekteditor nach unten zum Bereich \"Alle Relationen\", klicke den {plus} Knopf um dieses Objekt einer nahe gelegenen Relation oder einer neuen Relation hinzuzufügen." + "boundary_add": "Um ein Objekt zu einer Grenze hinzuzufügen, wähle das Objekt aus und scrolle im Objekteditor nach unten zum Bereich \"Alle Relationen\", klicke den {plus} Knopf um dieses Objekt einer in der Nähe vorhandenen oder einer neuen Relation hinzuzufügen." + }, + "notes": { + "title": "Hinweise", + "intro": "*Hinweise* werden genutzt, um andere Benutzer darauf aufmerksam zu machen, dass an der markierten Stelle etwas fehlt oder falsch ist. Um bestehende Hinweise anzuzeigen oder neue hinzuzufügen, klicke auf das {data} **Kartendaten**-Symbol und aktiviere die Datenebene OpenStreetMap Hinweise.", + "add_note_h": "Hinweise hinzufügen", + "add_note": "Um einen Hinweis hinzuzufügen klicke den {note} **Hinweis** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `4`. Dadurch wird der Mauszeiger zu einem Kreuz. Führe dann den Mauszeiger an die Stelle, wo der Hinweis hin soll und {leftclick} klickst oder drücke die `Leertaste`. um ihn zu platzieren.", + "move_note": "Nur neue Hinweise können verschoben werden. Dazu bewegst du den Mauszeiger über den Hinweis und drückst und hältst die {leftclick} linke Maustaste, während du den Hinweis zu der neuen Stelle schiebst.", + "update_note_h": "Schließen, Reaktivieren und Kommentieren", + "update_note": "Ein bestehender Hinweis kann kommentiert, geschlossen oder wieder geöffnet werden. Einen Hinweis zu schließen bedeutet, dass das dadurch beschriebene Problem erledigt ist. Einen Hinweis wieder zu öffnen bedeutet, dass das ursprünglich Problem doch nicht erledigt ist.", + "save_note_h": "Hinweise speichern", + "save_note": "Hinweise müssen alle einzeln über den Knopf unter den Hinweis-Kommentaren gespeichert werden. Hinweise sind *nicht* Teil des Änderungssatzes, den du zu OpenStreetMap hochlädst." }, "imagery": { "title": "Hintergrund-Bildmaterial", - "intro": "Das Hintergrund-Bildmaterial welches unter den Kartendaten erscheint ist eine wichtige Quelle zum Bearbeiten. Dieses Bildmaterial kann aus Luftbildern bestehen, die von Satelliten, Flugzeugen oder Drohnen gesammelt wurde, oder es können eingescannte historische Karten oder andere frei erhältliche Quelldaten sein.", + "intro": "Das Hintergrund-Bildmaterial welches unter den Kartendaten erscheint ist eine wichtige Quelle zum Zeichnen. Dieses Bildmaterial kann aus Luftbildern bestehen, die von Satelliten, Flugzeugen oder Drohnen gesammelt wurde, oder es können eingescannte historische Karten oder andere frei erhältliche Quelldaten sein.", "sources_h": "Bildmaterial-Quellen", "choosing": "Um zu sehen, welche Bildmaterial-Quellen zum Bearbeiten verfügbar sind klicke den {layers} **Hintergrundeinstellungen** Knopf auf der rechten Seite der Karte. ", - "sources": "Als Standard sind die [Bing](https://www.bing.com/maps/) Satellitenbilder als Hintergrundbild ausgewählt. Abhängig von der Gegend sind auch andere Bildmaterial-Quellen verfügbar. Sie können neuer sein oder eine höhere Auflösung haben, daher ist es immer sinnvoll zu prüfen, welches Bildmaterial die beste Referenz zum Bearbeiten ist.", + "sources": "Als Standard sind die [Bing](https://www.bing.com/maps/) Satellitenbilder als Hintergrundbild ausgewählt. Abhängig von der Gegend sind auch andere Bildmaterial-Quellen verfügbar. Sie können neuer sein oder eine höhere Auflösung haben, daher ist es immer sinnvoll zu prüfen, welches Bildmaterial die beste Referenz zum Mappen ist.", "offsets_h": "Bildmaterial-Versatz anpassen", "offset": "Bildmaterial ist manchmal geringfügig zu genauen Kartendaten versetzt. Wenn du feststellst, dass viele Wege oder Gebäude gegenüber dem Hintergrund-Bildmaterial versetzt sind, dann kann es sein, dass das Bildmaterial versetzt ist, also verschiebe nicht alle Objekte damit sie zum Hintergrund passen. Stattdessen kannst du den Hintergrund anpassen, damit es zu den bestehenden Daten passt indem du den Bereich „Bildmaterial-Versatz anpassen“ unten in den Hintergrundeinstellungen aufklappst.", "offset_change": "Klicke auf die kleinen Dreiecke um den Bildmaterial-Versatz in kleinen Schritten anzupassen oder halte den linken Mausknopf gedrückt und ziehe innerhalb des grauen Rechtecks um das Bildmaterial zurechtzurücken." }, "streetlevel": { "title": "Straßenfotos", - "intro": "Straßenfotos sind nützlich um Verkehrszeichen, Geschäfte oder andere Details die auf Satellitenbilder und Luftbildern nicht sichtbar sind zu bearbeiten. Der iD Editor unterstützt Straßenfotos von [Mapillary](https://www.mapillary.com) und [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Straßenfotos sind hilfreich für das Zeichnen von Straßenschildern, Geschäften und anderen Details, die man auf Luftbildern nicht sehen kann. Im iD-Editor können die Bilder von [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) und [OpenStreetCam](https://www.openstreetcam.org) angezeigt werden.", "using_h": "Straßenfotos benutzen", - "using": "Um Straßenfotos beim Bearbeiten zu benutzen klicke den {data} **Kartendaten** Knopf auf der rechten Seite der Karte zum Einschalten oder Ausschalten der verfügbaren Bildquellen.", - "photos": "Wenn die Straßenfotos eingeschaltet sind, wird eine Linie entlang der Fotosequenz angezeigt. Bei höheren Zoomstufen zeigt ein Kreis jede Fotoposition an und bei noch höheren Zoomstufen zeigt ein Kegel die Richtung der Kamera während der Aufnahme an.", - "viewer": "Wenn du auf eine Fotoposition klickst erscheint die Fotoanzeige in der linken unteren Ecke der Karte. Die Fotoanzeige enthalt Kontroll-Knöpfe um vorwärts und rückwärts springen zu können. Es zeigt auch den Benutzernamen der Person, die das Foto erstellt hat, wann das Foto erstellt wurde und einen Link, um das Foto auf der Originalseite zu sehen." + "using": "Um Straßenfotos beim Zeichnen zu benutzen klicke den {data} **Kartendaten** Knopf auf der rechten Seite der Karte zum Einschalten oder Ausschalten der verfügbaren Bildquellen.", + "photos": "Wenn die Straßenfotos eingeschaltet sind, wird eine Linie entlang der Fotosequenz angezeigt. Bei höheren Zoomstufen zeigt wird jede Fotoposition durch einen Kreis angezeigt und bei noch höheren Zoomstufen zeigt ein Kegel die Richtung der Kamera während der Aufnahme an.", + "viewer": "Wenn du auf eine Fotoposition klickst erscheint die Fotoanzeige in der linken unteren Ecke der Karte. Die Fotoanzeige enthält Kontroll-Knöpfe um vorwärts und rückwärts springen zu können. Es zeigt auch den Benutzernamen der Person, die das Foto erstellt hat, wann das Foto erstellt wurde und einen Link, um das Foto auf der Originalseite zu sehen." }, "gps": { "title": "GPS Tracks", "intro": "GPS Tracks sind eine wertvolle Datenquelle für OpenStreetMap. Dieser Editor unterstützt lokale *.gpx*, *.geojson* und *.kml* Dateien auf deinem Computer. Du kannst GPS Tracks mit einem Smartphone, einer Sportuhr oder mit anderen GPS-Geräten aufnehmen.", - "survey": "Für Informationen über das Aufzeichnen von GPS-Daten kannst du dir folgende Anleitung zur [Kartierung mit Smartphone, GPS oder Field Paper](http://learnosm.org/de/mobile-mapping/) durchlesen.", + "survey": "Für Informationen über das Aufzeichnen von GPS-Daten kannst du dir folgende Anleitung zur [Kartierung mit Smartphone, GPS oder Field Paper](http://learnosm.org/de/mobile-mapping/) durchlesen.", "using_h": "GPS Tracks verwenden", - "using": "Um einen GPS Track zum Bearbeiten zu verwenden, ziehe ihn einfach auf die Karte. Wenn er erkannt wurde, wird er als helle lila Linie auf der Karte dargestellt. Klicke auf den {data} **Kartendaten** Knopf rechts, um die neue Ebene mit dem Track zu aktivieren/deaktivieren oder den GPS-Track auf der Karte anzuzeigen.", + "using": "Um einen GPS Track zum Zeichnen zu verwenden, ziehe ihn einfach auf die Karte. Wenn er erkannt wurde, wird er als helle lila Linie auf der Karte angezeigt. Klicke auf den {data} **Kartendaten** Knopf rechts, um die neue Ebene mit dem Track zu aktivieren/deaktivieren oder den GPS-Track auf der Karte anzuzeigen.", "tracing": "Der GPS Track wird nicht zu OpenStreetMap hochgeladen. Am besten verwendest du ihn als Orientierung um neue Objekte zu zeichnen.", "upload": "Du kannst auch [deine GPS Tracks zu OpenStreetMap hochladen](https://www.openstreetmap.org/trace/create) damit sie von anderen Benutzern verwendet werden können." }, @@ -915,7 +972,7 @@ }, "inspecting": { "title": "Überprüfen", - "about": "Bewege die Maus über eine **VON** Straße, um zu sehen, ob sie irgendweche Abbiegebeschränkungen hat. Jede mögliche **NACH** Straße wird mit einem farbigen Schatten dargestellt, der anzeigt, ob eine Beschränkung existiert.", + "about": "Bewege die Maus über eine **VON** Straße, um zu sehen, ob sie irgendweche Abbiegebeschränkungen hat. Jede mögliche **NACH** Straße wird mit einem farbigen Schatten angezeigt, der zeigt ob eine Beschränkung besteht.", "from_shadow": "{fromShadow} **VON Straße**", "allow_shadow": "{allowShadow} **NACH erlaubt**", "restrict_shadow": "{restrictShadow} **NACH verboten**", @@ -935,7 +992,7 @@ "title": "Tipps", "simple": "**Bevorzuge einfache anstatt komplexe Beschränkungen.**", "simple_example": "Vermeide beispielsweise Abbiegebeschränkungen \"über Wege\", wenn die Modellierung auch mit einfachen Abbiegebeschränkungen \"über Knoten\" möglich ist.", - "indirect": "**Einige Beschränkungen zeigen den Text \"(indirekt)\" an und sind heller gezeichnet.**", + "indirect": "**Einige Beschränkungen zeigen den Text \"(indirekt)\" an und werden heller angezeigt.**", "indirect_example": "Diese Beschränkungen existieren wegen einer anderen Beschränkung in der Nähe. Zum Beispiel werden durch eine \"Nur Geradeaus\" Beschränkung indirekt ür alle anderen Wege über die Kreuzung \"Keine Kehrtwende\" Beschränkungen erstellt.", "indirect_noedit": "Indirekte Beschränkungen sollte man nicht ändern. Stattdessen sollte man die angrenzende, direkte Beschränkung ändern." } @@ -1088,7 +1145,7 @@ "points_lines_areas": "Objekte werden auf der Karte als Punkte, Linien oder Flächen dargestellt.", "nodes_ways": "In OpenStreetMap werden Punkte manchmal *Knoten* genannt, Linien und Flächen werden manchmal *Wege* genannt.", "click_townhall": "Alle Objekte auf der Karte können durch Klicken ausgewählt werden. **Klicke auf den Punkt um ihn zu auszuwählen.**", - "selected_townhall": "Super! Der Punkt ist jetzt ausgewählt. Ausgewählte Objekte werden mit einem pulsierenden Schimmer gezeichnet.", + "selected_townhall": "Super! Der Punkt ist jetzt ausgewählt. Ausgewählte Objekte werden mit einem pulsierenden Schimmer angezeigt.", "editor_townhall": "Wenn ein Objekt ausgewählt ist wird der *Objekteditor* neben der Karte angezeigt.", "preset_townhall": "Der obere Teil des Objekteditors zeigt den Typ des Objekts. Dieser Punkt ist ein {preset}.", "fields_townhall": "Der mittlere Bereich des Objekteditors enthält *Felder* mit den Merkmalen des Objektes wie Name oder Adresse.", @@ -1101,8 +1158,8 @@ }, "points": { "title": "Punkte", - "add_point": "*Punkte* können benutzt werden um Objekte wie Geschäfte, Restaurants oder Denkmäler darzustellen.{br}Sie kennzeichnen eine konkrete Lage und beschreiben was dort ist. **Klicke auf {button} Punkt um einen neuen Punkt zu zeichnen.**", - "place_point": "Um den neuen Punkt auf der Karte zu positionieren bewege den Mauszeiger auf die gewünschte Position des Punktes und klicke oder drücke die Leertaste. **Bewege den Mauszeiger über dieses Gebäude und klicke oder drücke die Leertaste.**", + "add_point": "*Punkte* können benutzt werden um Objekte wie Geschäfte, Restaurants oder Denkmäler darzustellen.{br}Sie kennzeichnen eine konkrete Stelle und beschreiben was dort ist. **Klicke auf {button} Punkt um einen neuen Punkt zu zeichnen.**", + "place_point": "Um den neuen Punkt auf der Karte zu platzieren bewege den Mauszeiger auf die gewünschte Position des Punktes und klicke oder drücke die Leertaste. **Bewege den Mauszeiger über dieses Gebäude und klicke oder drücke die Leertaste.**", "search_cafe": "Es gibt viele verschiedene Objekte die als Punkte dargestellt werden können. Der gerade hinzugefügte Punkt ist ein Café. **Suche nach '{preset}'.**", "choose_cafe": "**Wähle {preset} aus der Liste.**", "feature_editor": "Der Punkt ist nun ein Café. Mit dem Objekteditor kannst du mehr Information über das Café eingeben.", @@ -1118,8 +1175,8 @@ }, "areas": { "title": "Flächen", - "add_playground": "*Flächen* werden benutzt um die Grenzen von Objekten wie Seen, Gebäuden oder Wohngebieten darzustellen.{br}Sie können auch benutzt werden um Objekte, die normalerweise als Punkte gezeichnet werden, genauer darzustellen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**", - "start_playground": "Zeichne diesen Spielplatz als Fläche auf der Karte ein. Flächen werden gezeichnet indem *Knoten* entlang des äußeren Randes des Objekte gezeichnet werden. **Klicke oder drücke die Leertaste um den ersten Knoten an einer Ecke des Spielplatzes zu zeichnen.**", + "add_playground": "*Flächen* werden benutzt um die Grenzen von Objekten wie Seen, Gebäuden oder Wohngebieten darzustellen.{br}Sie können auch benutzt werden um Objekte, die normalerweise als Punkte gezeichnet werden, genauer zu zeichnen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**", + "start_playground": "Zeichne diesen Spielplatz als Fläche auf der Karte. Flächen werden gezeichnet, indem *Knoten* entlang des äußeren Randes des Objekte gezeichnet werden. **Klicke oder drücke die Leertaste um den ersten Knoten an einer Ecke des Spielplatzes zu zeichnen.**", "continue_playground": "Setze das Zeichnen der Fläche fort, indem du Knoten entlang des Randes des Spielplatzes setzt. Es ist okay, wenn du die Fläche mit bestehenden Fußwegen verbindest.{br}Tipp: Wenn du die '{alt}' Taste gedrückt hältst, kannst du verhindern, dass die Knoten sich mit anderen Objekten verbinden. **Setze das Zeichnen der Fläche für den Spielplatz fort.**", "finish_playground": "Beende die Fläche durch Drücken von Enter oder nochmal Klicken auf den ersten oder letzten Knoten. **Beende das Zeichnen der Fläche für den Spielplatz.**", "search_playground": "**Suche nach '{preset}'.**", @@ -1128,25 +1185,25 @@ "choose_field": "**Wähle {field} aus der Liste.**", "retry_add_field": "Du hast das Feld {field} nicht ausgewählt. Versuche es nochmals.", "describe_playground": "**Füge eine Beschreibung ein, dann klicke auf {button} Knopf um den Objekteditor zu schließen.**", - "play": "Gut gemacht! Versuche mehr Flächen zu zeichnen und suche nach anderen Flächentypen du zu OpenStreetMap hinzufügen kannst. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**" + "play": "Gut gemacht! Versuche noch ein paar Flächen zu zeichnen und schau welche anderen Flächentypen du noch zu OpenStreetMap hinzufügen kannst. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**" }, "lines": { "title": "Linien", "add_line": "*Linien* werden benutzt um Objekt wie Straßen, Eisenbahnschienen oder Flüsse darzustellen. **Klicke auf {button} Linie um eine neue Linie zu zeichnen.**", - "start_line": "Hier gibt es eine Straße die in OpenStreetMap fehlt.{br}Zeichne sie ein! In OpenStreetMap soll die Linie in der Mitte der Straße gezeichnet werden. Du kannst die Karte während des Zeichnens verschieben, wenn das notwendig ist. **Beginne die neue Linie durch Klicken auf das obere Ende der fehlenden Straße.**", - "intersect": "Du kannst neue Knoten durch Klicken oder Drücken der Leertaste erzeugen.{br} Straßen und viele andere Typen von Linien sind Teil eines größeren Netzwerks. Es ist wichtig dass diese Linien verbunden sind, damit Routing-Anwendungen richtig funktionieren. **Klicke auf {name} um eine Kreuzung zu erzeugt, die beide Linien verbindet.**", + "start_line": "Hier fehlt eine Straße in OpenStreetMap. Lass sie uns zeichnen!{br}In OpenStreetMap soll die Linie in der Mitte der Straße gezeichnet werden. Du kannst die Karte während des Zeichnens verschieben, wenn das notwendig ist. **Beginne die neue Linie durch Klicken auf das obere Ende der fehlenden Straße.**", + "intersect": "Klicke oder Drücke die Leertaste um neue Knoten zur Linien hinzuzufügen.{br} Straßen und viele andere Typen von Linien sind Teil eines größeren Netzwerks. Es ist wichtig dass diese Linien verbunden sind, damit Routing-Anwendungen richtig funktionieren. **Klicke auf {name} um eine Kreuzung zu erzeugt, die beide Linien verbindet.**", "retry_intersect": "Diese Straße soll {name} kreuzen. Versuch es nochmals!", - "continue_line": "Setze das Zeichnen der Linie für die neue Straße fort. Du kannst die Karte verschieben, wenn das notwendig ist.{br}Wenn du fertig gezeichnet hast klicke nochmals auf den letzten Knoten. **Beende das Zeichnen der Straße.**", + "continue_line": "Setze das Zeichnen der Linie für die neue Straße fort. Du kannst die Karte verschieben, wenn das notwendig ist.{br}Wenn du fertig bist klicke nochmals auf den letzten Knoten. **Beende das Zeichnen der Straße.**", "choose_category_road": "**Wähle {category} aus der Liste.**", "choose_preset_residential": "Es gibt viele verschiedene Typen von Straßen, diese ist eine Anliegerstraße. **Wähle {preset}.**", "retry_preset_residential": "Du hast nicht {preset} ausgewählt. **Klicke hier um erneut zu wählen.**", "name_road": "**Gib dieser Straße einen Namen, dann drücke Escape oder Enter oder klicke den {button} Knopf um den Objekteditor zu schließen.**", - "did_name_road": "Sieht gut aus! Jetzt wirst du lernen, wie die den Zustand einer Linie verbessern kannst.", - "update_line": "Manchmal musst du den Zustand einer bestehenden Linie ändern. Hier ist eine Straße die nicht ganz richtig aussieht.", - "add_node": "Du kannst weitere Knoten zu einer Linie hinzufügen, um den Zustand einer Linie zu verbessern. Eine Möglichkeit um neue Knoten zu zeichnen ist ein Doppelklick auf die Stelle der Linie, wo der neue Knoten entstehen soll. **Doppelklicke auf die Linie um einen neuen Knoten zu erzeugen.**", - "start_drag_endpoint": "Wenn eine Linie ausgewählt ist, kannst du jeden Knoten dieser Linie durch Klicken und Festhalten des linken Mausknopfs verschieben. **Schieb den letzten Knoten der Linie dorthin, wo sich diese Straßen kreuzen sollen.**", + "did_name_road": "Sieht gut aus! Jetzt wirst du lernen, wie die Form einer Linie verbessern kannst.", + "update_line": "Manchmal musst du die Form einer bestehenden Linie ändern. Hier ist eine Straße die nicht ganz richtig aussieht.", + "add_node": "Du kannst weitere Knoten zu einer Linie hinzufügen, um die Form einer Linie zu verbessern. Eine Möglichkeit um neue Knoten zu zeichnen ist ein Doppelklick auf die Stelle der Linie, wo der neue Knoten entstehen soll. **Doppelklicke auf die Linie um einen neuen Knoten zu erzeugen.**", + "start_drag_endpoint": "Wenn eine Linie ausgewählt ist, kannst du jeden Knoten dieser Linie durch Klicken und Festhalten des linken Mausknopfs verschieben. **Schiebe den letzten Knoten der Linie dorthin, wo sich diese Straßen kreuzen sollen.**", "finish_drag_endpoint": "Hier sieht es gut aus. **Lass den Mausknopf aus, um das Verschieben zu beenden.**", - "start_drag_midpoint": "Kleine Dreiecke werden am *Mittelpunkt* zwischen zwei Knoten angezeigt. Eine weitere Möglichkeit um einen neuen Knoten zu erzeugen ist das Verschieben dieses Mittelpunkts zu einer neuen Lage. **Schiebe den Mittelpunkt und erzeuge damit einen neuen Knoten in der Straßenkurve.**", + "start_drag_midpoint": "Kleine Dreiecke werden am *Mittelpunkt* zwischen zwei Knoten angezeigt. Eine weitere Möglichkeit um einen neuen Knoten zu erzeugen ist das Verschieben dieses Mittelpunkts zu einer neuen Stelle. **Schiebe den Mittelpunkt und erzeuge damit einen neuen Knoten in der Straßenkurve.**", "continue_drag_midpoint": "Diese Linie sieht viel besser aus! Setze das Anpassen der Linie durch Doppelklicken oder Verschieben von Mittelpunkten fort, bis die Kurve dem Straßenverlauf folgt. **Wenn Dir die Linie gefällt, klicke OK.**", "delete_lines": "Wenn es Straßen in der echten Welt nicht gibt, kannst du die zugehörigen Linien löschen.{br}Hier hat die Stadt eine {street} geplant, aber nie gebaut. Du kannst diesen Teil der Karte verbessern, wenn du die zusätzlichen Linien löschst.", "rightclick_intersection": "Die letzte bestehende Straße ist {street1}, daher wirst du die {street2} an dieser Kreuzung *teilen* und alles darüber löschen. **Rechtsklicke auf den Kreuzungs-Knoten.**", @@ -1163,7 +1220,7 @@ "buildings": { "title": "Gebäude", "add_building": "OpenStreetMap ist die größte Gebäude-Datenbank der Welt.{br}Du kannst helfen diese Datenbank zu verbessern, indem du Gebäude einzeichnest, die in der Karte noch fehlen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**", - "start_building": "Zeichne dieses Gebäude in der Karte ein, indem du seinen Umriss nachzeichnest.{br}Gebäude sollten entlang ihrer Grundfläche so genau wie möglich gezeichnet werden. **Klick oder drücke die Leertaste um den Startknoten auf einer Ecke des Gebäudes zu zeichnen.**", + "start_building": "Zeichne dieses Gebäude, indem du seinen Umriss nachzeichnest.{br}Gebäude sollten entlang ihrer Grundfläche so genau wie möglich gezeichnet werden. **Klicke oder drücke die Leertaste um den Startknoten auf einer Ecke des Gebäudes zu zeichnen.**", "continue_building": "Erstelle weitere Knoten um den Umriss des Gebäudes nachzuzeichnen. Du kannst hinein zoomen, wenn du mehr Details zeichnen willst.{br}Beende das Gebäude durch Drücken von Enter oder nochmal Klicken auf den ersten oder letzten Knoten.**Beende den Umriss des Gebäudes.**", "retry_building": "Es sieht so aus als hättest du die Knoten nicht auf die Ecken des Gebäudes gesetzt. Versuche es noch einmal!", "choose_category_building": "**Wähle {category} aus der Liste.**", @@ -1172,9 +1229,9 @@ "rightclick_building": "**Rechtsklicke das gerade erzeugte Gebäude um es auszuwählen und zeige das Bearbeitungs-Menü.**", "square_building": "Das gerade gezeichnete Haus sieht besser aus, wenn es perfekt rechtwinklige Ecken hat. **Klicke auf {button} Knopf um die Gebäudeecken rechtwinklig zu machen.**", "retry_square": "Du hast nicht den Rechtwinklig-Machen-Knopf geklickt. Versuch es noch einmal.", - "done_square": "Siehst du wie die Ecken des Gebäudes auf die richtige Stelle rücken? Lass uns einen weiteren nützlichen Trick lernen.", + "done_square": "Siehst du wie die Ecken des Gebäudes auf die richtige Stelle gerückt sind? Lass uns einen weiteren nützlichen Trick lernen.", "add_tank": "Als Nächstes wirst du einen kreisrunden Tank zeichnen. **Klicke auf {button} Fläche um eine neue Fläche zu zeichnen.**", - "start_tank": "Du musst keinen perfekten Kreis zeichnen. Zeichne einfach eine Fläche innerhalb des Tanks die seinen Rand berührt. **Klicke oder drücke die Leertaste um den ersten Knoten an Rand des Tanks zu zeichnen.**", + "start_tank": "Keine Sorge, du musst keinen perfekten Kreis zeichnen. Zeichne einfach eine Fläche innerhalb des Tanks, die seinen Rand berührt. **Klicke oder drücke die Leertaste um den ersten Knoten an Rand des Tanks zu zeichnen.**", "continue_tank": "Zeichne noch zwei weitere Knoten am Rand. Der Kreis wird außerhalb der gezeichneten Knoten erzeugt.{br}Beende die Fläche durch Drücken von Enter oder nochmal Klicken auf den ersten oder letzten Knoten.**Zeichne den Tank fertig.**", "search_tank": "**Suche nach '{preset}'.**", "choose_tank": "**Wähle {preset} von der Liste.**", @@ -1188,7 +1245,7 @@ "help": "Du bist nun bereit OpenStreetMap zu bearbeiten!{br}Du kannst mit dem {button} Hilfe-Knopf oder der '{key}'-Taste mehr Dokumentation ansehen und diesen Rundgang wieder aufrufen.", "shortcuts": "Du kannst eine Liste der Befehle zusammen mit ihren Tastenkürzeln durch Drücken der '{key}'-Taste ansehen.", "save": "Vergiss nicht, regelmäßig zu speichern, um die Änderungen zu OpenStreetMap hochzuladen!", - "start": "Beginne mit dem Bearbeiten!" + "start": "Beginne mit dem Mappen!" } }, "shortcuts": { @@ -1270,7 +1327,8 @@ "add_point": "'Neuen Punkt hinzufügen' (Modus)", "add_line": "'Neue Linie hinzufügen' (Modus)", "add_area": "'Neue Fläche hinzufügen' (Modus)", - "place_point": "Punkt platzieren", + "add_note": "'Neuen Hinweis hinzufügen' (Modus)", + "place_point": "Hinweis oder Punkt platzieren", "disable_snap": "Festhalten um Punkt beim Platzieren nicht zu vereinigen", "stop_line": "Zeichnen einer Linie oder Fläche beenden" }, @@ -1279,6 +1337,7 @@ "continue_line": "Linie am ausgewählten Knoten fortsetzen", "merge": "Vereinige die ausgewählten Objekte", "disconnect": "Objekte am ausgewählten Knoten trennen", + "detach_node": "Trenne den ausgewählten Knoten von seinen Linien/Flächen.", "split": "Linie am ausgewählten Knoten in zwei Linien teilen", "reverse": "Richtung der Linie umdrehen", "move": "Ausgewählte Objekte verschieben", @@ -1623,6 +1682,9 @@ "label": "Kapazität", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Bargeldannahme" + }, "castle_type": { "label": "Typ" }, @@ -2278,6 +2340,9 @@ "underground": "Tiefgarage" } }, + "passenger_information_display": { + "label": "Fahrgastinformationssystem (Abfahrtsmonitor)" + }, "payment_multi": { "label": "Zahlungsarten" }, @@ -2510,6 +2575,9 @@ "site": { "label": "Typ" }, + "site_type": { + "label": "Anlagentyp" + }, "smoking": { "label": "Rauchen", "options": { @@ -2867,7 +2935,7 @@ "terms": "Materialseilbahn, Lastenseilbahn" }, "aerialway/magic_carpet": { - "name": "KInderskilift", + "name": "Kinderskilift", "terms": "Kinderskilift, Zauberteppichlift, Babylift" }, "aerialway/mixed_lift": { @@ -4586,8 +4654,8 @@ "terms": "Obstplantage, Streuobstwiese, Obstgarten" }, "landuse/plant_nursery": { - "name": "Anpflanzung, Baumschule", - "terms": "Betriebskindergarten, Werkskindergarten, Betriebskinderkrippe, Werkskinderkrippe" + "name": "Baumschule, Anzucht von Pflanzen", + "terms": "Baumschule, Anzucht, Anbaufläche, Plantage, Blumen, Sträucher, Rosen, Ziergehölze, Obstgehölze, Forstpflanzen, Gärtnerei" }, "landuse/quarry": { "name": "Steinbruch", @@ -4690,8 +4758,8 @@ "terms": "Reck,Reckstange" }, "leisure/fitness_station/horizontal_ladder": { - "name": "Klettergerüst", - "terms": "Klettergerüst" + "name": "Hangelleiter", + "terms": "Klettergerüst, Klimmzüge, Leiter, Kletterleiter, Trimm Dich Pfad" }, "leisure/fitness_station/hyperextension": { "name": "Hyperextension-Bank", @@ -5379,7 +5447,7 @@ "terms": "Korbschaukel" }, "playground/climbing_frame": { - "name": "Klettergerüst", + "name": "Klettergerüst / Seilspinne", "terms": "Klettergerüst, Seilspinne, Raumnetz" }, "playground/cushion": { @@ -6615,7 +6683,7 @@ "attribution": { "text": "Bedingungen & Feedback" }, - "description": "DigitalGlobe-Premium ist ein Mosaik zusammengesetzt aus der DigitalGlobe basemap wobei ausgewählte Regionen ander Quellen haben, entweder +Vivid oder regionspezifische Quellen, Auflösung 50cm oder besser und häufigeren laufenden Updates.", + "description": "DigitalGlobe-Premium ist ein Mosaik zusammengesetzt aus der DigitalGlobe basemap, wobei ausgewählte Regionen mit +Vivid oder regionspezifischen Quellen aufgefüllt sind, Auflösung 50cm oder besser und häufiger aktualisiert.", "name": "DigitalGlobe Premium Bildmaterial" }, "DigitalGlobe-Premium-vintage": { @@ -6629,6 +6697,7 @@ "attribution": { "text": "Bedingungen & Feedback" }, + "description": "DigitalGlobe-Standard ist eine kuratierte Zusammenstellung von Luftbildern, die 86% der weltweiten Landmasse abdecken, Auflösung 30-60cm soweit verfügbar; aufgefüllt mit Landsat Satelitenbildern. Durchschnittliches Alter ist 2,31 Jahre, manche Gebiete werden zwei mal pro Jahr erneuert.", "name": "DigitalGlobe Standard Bildmaterial" }, "DigitalGlobe-Standard-vintage": { @@ -6918,17 +6987,17 @@ "community": { "cape-coast-youthmappers": { "name": "Universität von Cape Coast YouthMappers", - "description": "Folge uns auf Twitter {url}", - "extendedDescription": "Das ist der offizielle handle für die Gruppe der Jungen Mapper der Universität von Cape Coast, Ghana. Wir lieben Karten, Offene Daten und Unterstützung für die Schutzlosen" + "description": "Folge uns auf Twitter: {url}", + "extendedDescription": "Das ist der offizielle Handle für die Gruppe junger Mapper der Universität von Cape Coast, Ghana. Wir lieben Karten, offene Daten und Unterstützung für die Schutzlosen." }, "osm-gh-facebook": { "name": "OpenStreetMap Ghana auf Facebook", "description": "Facebook Grupep für Menschen mit Interesse an OpenStreetMap.", - "extendedDescription": "Gemeischaft der Mapper in Ghana Förderung von OpenStreetMap und den Humanitarian OpenStreetMap Team (HOT) Projecten in Ghana. Schließ dich uns an!" + "extendedDescription": "Gemeinschaft der Mapper in Ghana, Förderung von OpenStreetMap und den Projekten des Humanitarian OpenStreetMap Team (HOT) in Ghana. Schließ dich uns an!" }, "osm-gh-twitter": { "name": "OpenStreetMap Ghana auf Twitter", - "description": "Folge uns auf Twitter {url}" + "description": "Folge uns auf Twitter: {url}" }, "talk-gh": { "name": "Talk-gh Mailing Liste", @@ -7451,6 +7520,10 @@ "description": "Mapper und OpenStreetMap Benutzer in und um Portland, USA", "extendedDescription": "Maptime ist - ziemlich wörtlich - Zeit zum Mappen. Unsere Ziel ist die Türen für kartografische Möglichkeiten für alle Interessierten zu öffenen, wir stellen Zeit und Raum zum gemeinschaftlichen Lernen, Erkunden und zur Kartenerzeugung bereit und benutzen gemeinsam Mapping Tools und Technologien." }, + "us-ma-mailinglist": { + "name": "Talk-us-massachusetts Mailing Liste", + "description": "Mailing Liste für die Massachusetts (USA) OSM Gemeinschaft" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Verbessere OpenStreetMap in Cleveland, USA", @@ -7479,6 +7552,11 @@ "name": "OpenStreetMap New York City", "description": "Mapper und OpenStreetMap Benutzer, Entwickler und Liebhaber in der Metroplregion New York" }, + "OSM-Portland-forum": { + "name": "OpenStreetMap PDX Google Gruppe", + "description": "Forum und Mailing-Liste der OpenStreetMap Gemeinschaft im Gebiet von Portland", + "extendedDescription": "Diese Gruppe erleichtert Verbesserungen für OpenStreetMap um Anwendungen wie der Open Trip Planner zu unterstützen." + }, "OSM-Portland": { "name": "OpenStreetMap Portland, USA", "description": "Mapper und OpenStreetMap Benutzer in Portland", diff --git a/dist/locales/el.json b/dist/locales/el.json index 9b4fe5f24..07377dbb4 100644 --- a/dist/locales/el.json +++ b/dist/locales/el.json @@ -313,8 +313,6 @@ "localized_translation_name": "Όνομα" }, "zoom_in_edit": "Μεγέθυνση για επεξεργασία", - "login": "σύνδεση", - "logout": "Αποσύνδεση", "loading_auth": "Σύνδεση στο OpenStreetMap...", "report_a_bug": "Αναφορά σφάλματος", "help_translate": "Βοηθήστε στη μετάφραση", @@ -655,7 +653,6 @@ "cannot_zoom": "Δεν είναι δυνατή μεγαλύτερη σμίκρυνση στην τρέχουσα κατάσταση λειτουργίας.", "full_screen": "Αλλάξτε σε Πλήρη Οθόνη", "gpx": { - "local_layer": "Τοπικό αρχείο", "drag_drop": "Σύρετε και αποθέστε ένα αρχείο .gpx, .geojson ή .kml στη σελίδα ή κάντε κλικ στο κουμπί στα δεξιά για να περιηγηθείτε", "zoom": "Μεγένθυνε στη στρώση", "browse": "Αναζητήστε ένα αρχείο" @@ -822,7 +819,6 @@ }, "streetlevel": { "title": "Φωτογραφίες Επιπέδου Δρόμου", - "intro": "Οι φωτογραφίες στο επίπεδο του δρόμου είναι χρήσιμες για τη χαρτογράφηση φαανριών, επιχειρήσεων και άλλων λεπτομερειών που δεν μπορείτε να δείτε από δορυφορικές εικόνες και αεροφωτογραφίες. Ο επεξεργαστής iD υποστηρίζει φωτογραφίες στο επίπεδο του δρόμου από το [Mapillary] (https://www.mapillary.com) και το [OpenStreetCam] (https://www.openstreetcam.org).", "using_h": "Χρήση Φωτογραφιών Επιπέδου Δρόμου", "using": "Για να χρησιμοποιήσετε τις φωτογραφίες στο επίπεδο του δρόμου για χαρτογράφηση, κάντε κλικ στον πίνακα {δεδομένα} **Δεδομένα χάρτη** στο πλάι του χάρτη για να ενεργοποιήσετε ή να απενεργοποιήσετε τα διαθέσιμα επίπεδα φωτογραφιών.", "photos": "Όταν είναι ενεργοποιημένο, το επίπεδο φωτογραφιών εμφανίζει μια γραμμή κατά μήκος της ακολουθίας φωτογραφιών. Σε υψηλότερα επίπεδα μεγέθυνσης, ένας κύκλος σημειώνει την κάθε θέση φωτογραφίας και σε ακόμη υψηλότερα επίπεδα μεγέθυνσης ένας κώνος δείχνει την κατεύθυνση στην οποία βρισκόταν η φωτογραφική μηχανή κατά τη λήψη της φωτογραφίας.", @@ -1105,7 +1101,6 @@ "add_point": "Λειτουργία \"Προσθήκη σημείου\"", "add_line": "Λειτουργία \"Προσθήκη γραμμής\"", "add_area": "Λειτουργία \"Προσθήκη περιοχής\"", - "place_point": "Τοποθετήστε ένα σημείο", "stop_line": "Τερματισμός σχεδιασμού μιας γραμμής ή μια περιοχής" }, "operations": { diff --git a/dist/locales/en-GB.json b/dist/locales/en-GB.json index 1f8a8f888..eb12b4afd 100644 --- a/dist/locales/en-GB.json +++ b/dist/locales/en-GB.json @@ -352,8 +352,6 @@ "localized_translation_name": "Name" }, "zoom_in_edit": "Zoom in to edit", - "login": "login", - "logout": "logout", "loading_auth": "Connecting to OpenStreetMap...", "report_a_bug": "Report a bug", "help_translate": "Help translate", @@ -710,7 +708,6 @@ "cannot_zoom": "Cannot zoom out further in current mode.", "full_screen": "Toggle Full Screen", "gpx": { - "local_layer": "Local file", "drag_drop": "Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse", "zoom": "Zoom to layer", "browse": "Browse for a file" @@ -885,7 +882,6 @@ }, "streetlevel": { "title": "Street Level Photos", - "intro": "Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Mapillary](https://www.mapillary.com) and [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Using Street Level Photos", "using": "To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.", "photos": "When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.", @@ -1267,7 +1263,6 @@ "add_point": "'Add point' mode", "add_line": "'Add line' mode", "add_area": "'Add area' mode", - "place_point": "Place a point", "disable_snap": "Hold to disable point snapping", "stop_line": "Finish drawing a line or area" }, diff --git a/dist/locales/eo.json b/dist/locales/eo.json index 0ba5da93c..29059e119 100644 --- a/dist/locales/eo.json +++ b/dist/locales/eo.json @@ -21,6 +21,11 @@ "description": "Aldoni restoraciojn, monumentojn, poŝtkestojn aŭ aliajn punktojn al la mapo.", "tail": "Klaku sur la mapo por aldoni punkton." }, + "add_note": { + "title": "Rimarko", + "description": "Ĉu vi rimarkis problemon? Sciigu aliajn mapigistojn.", + "tail": "Klaku sur la mapo por aldoni rimarkon." + }, "browse": { "title": "Foliumi", "description": "Aldirekti kaj pligrandigi la mapon." @@ -40,7 +45,8 @@ "annotation": { "point": "Aldonis punkton.", "vertex": "Aldonis nodon al linio/areo.", - "relation": "Aldonis rilaton." + "relation": "Aldonis rilaton.", + "note": "Aldonis rimarkon." } }, "start": { @@ -297,6 +303,14 @@ "create": "Aldonis turnan limigon.", "delete": "Forigis turnan limigon." } + }, + "detach_node": { + "title": "Apartigi", + "key": "E", + "description": "Apartigi tiun ĉi nodon de tiujn ĉi linioj/areoj.", + "annotation": "Apartigis nodon de superaj linioj/areoj.", + "restriction": "Tiu ĉi nodo ne povas esti apartigita, ĉar tio ĉi detruus la rilaton “{relation}”.", + "connected_to_hidden": "Tiu ĉi nodo ne povas esti apartigita, ĉar ĝi estas kunigita al kaŝita elemento." } }, "restriction": { @@ -352,8 +366,8 @@ "localized_translation_name": "Nomo" }, "zoom_in_edit": "Pligrandigu por redakti", - "login": "ensaluti", - "logout": "elsaluti", + "login": "Ensaluti", + "logout": "Elsaluti", "loading_auth": "Konektado al OpenStreetMap…", "report_a_bug": "Raporti eraron", "help_translate": "Helpi traduki", @@ -461,7 +475,7 @@ "no_documentation_key": "Estas neniu disponebla dokumentaro pri ĉi tiu ŝlosilo", "documentation_redirect": "Ĉi tiu dokumentara paĝo estis movita al nova loko", "show_more": "Montri pli", - "view_on_osm": "Vidi en openstreetmap.org", + "view_on_osm": "Montri ĉe openstreetmap.org", "all_fields": "Ĉiuj kampoj", "all_tags": "Ĉiuj etikedoj", "all_members": "Ĉiuj anoj", @@ -470,7 +484,7 @@ "role": "Rolo", "choose": "Elektu specon de objekto", "results": "{n} rezultoj por {search}", - "reference": "Vidi en la vikio de OpenStreetMap", + "reference": "Montri ĉe OpenStreetMap-vikio", "back_tooltip": "Ŝanĝi objekton", "remove": "Forigi", "search": "Serĉi", @@ -535,6 +549,10 @@ "osm": { "tooltip": "Map-datumoj el OpenStreetMap", "title": "OpenStreetMap-datumoj" + }, + "notes": { + "tooltip": "Rimarkoj el OpenStreetMap", + "title": "OpenStreetMap-rimarkoj" } }, "fill_area": "Plenigi areojn", @@ -708,15 +726,22 @@ "cannot_zoom": "Ne povas plie plibonigi en nuna reĝimo.", "full_screen": "Baskuligi plenekranon", "gpx": { - "local_layer": "Loka dosiero", + "local_layer": "Aldoni GPX", "drag_drop": "Ŝovu kaj demetu .gpx, geojson aŭ .kml dosieron sur la paĝon, aŭ klaku la butonon ĉe dekstre por foliumi", "zoom": "Pligrandigi tavolon", "browse": "Esplori por dosieron" }, + "mvt": { + "local_layer": "Aldoni MVT", + "drag_drop": "Ŝovu kaj demetu .mvt aŭ .pbf dosieron sur la paĝon, aŭ klaku la butonon ĉe dekstre por esplori", + "zoom": "Pligrandigi tavolon", + "browse": "Esplori por dosieron" + }, "streetside": { "tooltip": "Strat-nivelaj fotoj de Microsoft", "title": "Fotara surtavolo (Bing Streetside)", "report": "Raporti privatecan problemon pri tiu ĉi foto", + "view_on_bing": "Montri ĉe Bing Mapoj", "hires": "Alta distingivo" }, "mapillary_images": { @@ -737,6 +762,27 @@ "openstreetcam": { "view_on_openstreetcam": "Montri tiun ĉi bildon ĉe OpenStreetCam" }, + "note": { + "note": "Rimarko", + "title": "Redakti rimarkon", + "anonymous": "anonimulo", + "closed": "(fermita)", + "commentTitle": "Komentoj", + "newComment": "Nova komento", + "inputPlaceholder": "Skribu komenton por sciigi aliajn uzantojn.", + "close": "Fermi rimarkon", + "open": "Remalfermi rimarkon", + "comment": "Komenti", + "close_comment": "Fermi kaj komenti", + "open_comment": "Remalfermi kaj komenti", + "report": "Raporti", + "new": "Nova rimarko", + "newDescription": "Priskribu la problemon.", + "save": "Konservi rimarkon", + "login": "Vi devas ensaluti por ŝanĝi aŭ komenti tiun ĉi rimarkon.", + "upload_explanation": "Viaj komentoj estos publike videblaj al ĉiuj uzantoj de OpenStreetMap.", + "upload_explanation_with_user": "Viaj komentoj kiel {user} estos publike videblaj al ĉiuj uzantoj de OpenStreetMap." + }, "help": { "title": "Helpo", "key": "H", @@ -874,6 +920,17 @@ "boundary": "Rilato “limo” estas grupo da unu aŭ pli liniaj objektoj kiuj kune formas administran limon.", "boundary_add": "Por aldoni objekton al liman rilaton, elektu ĝin kaj ŝovumu suben ĝis la sekcio “ĉiuj rilatoj” de la odjekt-redaktilo, sekve klaku la butonon {plus} aldoni por aldoni tiun ĉi objekton al proksima ekzistanta rilato aŭ al nova rilato." }, + "notes": { + "title": "Rimarkoj", + "intro": "“Rimarkoj” estas uzataj por informi aliajn uzantojn, ke objekto bezonas riparon aŭ kontrolon. Rimarko markas difinitan lokon sur la mapo. Por vidigi ekzistajn rimarkojn aŭ krei iun novan, klaku la panelon {data} **map-datumoj** por aktivigi la tavolon de rimarkoj.", + "add_note_h": "Aldoni rimarkojn", + "add_note": "Por aldoni rimarkon, klaku la butonon {note} **rimarko** sur la ilobreto supre de mapo aŭ premu la fulmoklavon `4`. Tiel la mus-kursoro ŝanĝiĝos al kruc-simbolo. Por loki novan rimarkon al la mapo, celu la mus-kursoron tien, kien la rimarko estu, kaj sekve {leftclick} maldekstre-klaku aŭ premu la `spacostangon`.", + "move_note": "Oni povas movi nur novajn rimarkon. Por movi rimarkon, direktu la mus-kursoron al la nova rimarko, kaj premtenu la {leftclick} maldekstran mus-butonon ŝovante la rimarkon al nova loko.", + "update_note_h": "Fermi, remalfermi aŭ komenti", + "update_note": "Ekzistan rimarkon oni povas aktualigi per ĝin fermi, remalfermi aŭ komenti. Fermado de rimarko indikas, ke la problemo estas solvita. Remalfermado de rimarko indikas, ke la originala problemo plue ne estas solvita.", + "save_note_h": "Konservi rimarkon", + "save_note": "Vi devas konservi ĉiun rimarkon aparte per butonoj sub komentoj de rimarko. Redaktoj de rimarkoj **ne** estas ampleksataj en ŝanĝaroj, kiujn vi alŝutas al OpenStreetMap." + }, "imagery": { "title": "Fona fotaro", "intro": "Fona fotaro videbla malantaŭ map-datumoj estas grava fonto por mapigi. Tiu ĉi fotaro povas esti kolektita per satelitoj, aviadiloj aŭ flugrobotoj, aŭ ĝi povas esti skanita historia mapo aŭ aliaj libere disponeblaj datumoj.", @@ -886,7 +943,7 @@ }, "streetlevel": { "title": "Strat-nivelaj fotoj", - "intro": "Strat-nivelaj fotoj estas uzeblaj por mapigi trafiksignojn, firmaojn kaj aliajn detalojn nevideblajn sur satelita fotaro. La redaktilo iD subtenas strat-nivelaj fotoj de [Mapillary](https://www.mapillary.com) kaj [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Strat-nivelaj fotoj estas uzeblaj por mapigi trafiksignojn, firmaojn kaj aliajn detalojn nevideblajn sur satelita fotaro. La redaktilo iD subtenas strat-nivelaj fotoj de [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) kaj [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Uzi strat-nivelajn fotojn", "using": "Por uzi strat-nivelajn fotojn por mapigi, klaku la panelon {data} **map-datumoj** flanke de la mapo por aktivigi aŭ malaktivigi disponeblajn fotajn tavolojn.", "photos": "Kiam aktiva la fota tavolo vidigas linion laŭlonge de serio de fotoj. Ĉe pligrandigo cirkleto markos pozicion de ĉiu foto kaj ĉe eĉ pli granda pligrandigo konuso markos direkton de objektivo de fotilo je kiam foto estis farita.", @@ -1265,10 +1322,11 @@ "title": "Redaktado", "drawing": { "title": "Desegni", - "add_point": "'Aldoni punkton'-reĝimo", - "add_line": "'Aldoni linion'-reĝimo", - "add_area": "'Aldoni areo'-reĝimo", - "place_point": "Enmeti punkton", + "add_point": "‘Aldoni punkton’-reĝimo", + "add_line": "‘Aldoni linion’-reĝimo", + "add_area": "‘Aldoni areon’-reĝimo", + "add_note": "‘Aldoni rimarkon’-reĝimo", + "place_point": "Enmeti punkton aŭ rimarkon", "disable_snap": "Premteni por ne kapti punktojn", "stop_line": "Fini desegni linion aŭ areon" }, @@ -1277,6 +1335,7 @@ "continue_line": "Pluigi linion ĉe elektita nodo", "merge": "Kunfandi elektitajn objektojn", "disconnect": "Malkunigi objektojn de elektita nodo", + "detach_node": "Apartigi elektitan nodon de superaj linioj/areoj", "split": "Disduigi linon de elektita nodo", "reverse": "Inversigi linion", "move": "Movi elektitajn objektojn", @@ -1621,6 +1680,9 @@ "label": "Enhaveco", "placeholder": "50, 100, 200…" }, + "cash_in": { + "label": "Enpagoj" + }, "castle_type": { "label": "Speco" }, @@ -2276,6 +2338,9 @@ "underground": "Subtera" } }, + "passenger_information_display": { + "label": "Elektronika tabulo de forveturoj" + }, "payment_multi": { "label": "Pagmanieroj" }, @@ -2508,6 +2573,9 @@ "site": { "label": "Speco" }, + "site_type": { + "label": "Speco" + }, "smoking": { "label": "Fumado", "options": { @@ -3049,8 +3117,8 @@ "terms": "horlogho,horlogxo,tempmezurilo" }, "amenity/college": { - "name": "Kolegia (mezlerneja) tereno", - "terms": "kolegio,mezlernejo,mezgrada lernejo" + "name": "Tereno de postmezgrada lernejo (ISCED 4)", + "terms": "kolegio,mezlernejo,mezgrada lernejo,studejo" }, "amenity/community_centre": { "name": "Komunuma centro", @@ -3143,7 +3211,7 @@ "terms": "interreta kafejo,retumejo" }, "amenity/kindergarten": { - "name": "Infanĝardena tereno", + "name": "Tereno de infanĝardeno (ISCED 0)", "terms": "infanoghardeno,infanogxardeno,antaŭlernejo,kindergarteno,infanĝardeno,infanghardeno,infangxardeno,infanvartejo,lernludejo" }, "amenity/library": { @@ -3289,7 +3357,7 @@ "terms": "kampadejo,malpruaĵo" }, "amenity/school": { - "name": "Lerneja tereno", + "name": "Tereno de lernejo (ISCED 1-3)", "terms": "lernejo,edukejo,instruejo" }, "amenity/scrapyard": { @@ -3355,7 +3423,7 @@ "terms": "urbdomo,magistrato,magistratejo,urba registaro" }, "amenity/university": { - "name": "Universitata tereno", + "name": "Tereno de altgrada lernejo (ISCED 5-7)", "terms": "universitato,altgrada lernejo,instruejo,politeĥniko,politekniko,altlernejo,studejo" }, "amenity/vending_machine": { @@ -3648,8 +3716,8 @@ "terms": "biblioteko,komunuma centro,civila konstruaĵo,civitana konstruaĵo" }, "building/college": { - "name": "Kolegia konstruaĵo", - "terms": "kolegio,universitato,politeĥniko,politekniko" + "name": "Konstruaĵo de postmezgrada lernejo", + "terms": "kolegio,universitato,politeĥniko,politekniko,studejo" }, "building/commercial": { "name": "Oficeja konstruaĵo", @@ -3715,8 +3783,8 @@ "terms": "industrio,fabriko" }, "building/kindergarten": { - "name": "Infanĝardena konstruaĵo", - "terms": "infanghardeno,infangxardeno,infanoĝardeno,antaŭlernejo,kindergarteno" + "name": "Konstruaĵo de infanĝardeno", + "terms": "infanghardeno,infangxardeno,infanoĝardeno,antaŭlernejo,kindergarteno,infanĝardeno" }, "building/mosque": { "name": "Moskea konstruaĵo", @@ -3743,7 +3811,7 @@ "terms": "ruinoj,konstruaĵaĉo,domaĉo" }, "building/school": { - "name": "Lerneja konstruaĵo", + "name": "Konstruaĵo de lernejo", "terms": "lernejo,edukejo,instruejo" }, "building/semidetached_house": { @@ -3786,7 +3854,7 @@ "terms": "aŭtobusstacio,stacio,stacidomo,busstacio,flughaveno.haveno" }, "building/university": { - "name": "Universitata konstruaĵo", + "name": "Konstruaĵo de altgrada lernejo", "terms": "universitato,kolegio,politeĥniko,politekniko,altlernejo,alta lernejo" }, "building/warehouse": { diff --git a/dist/locales/es.json b/dist/locales/es.json index 144900a9e..89b3b40fd 100644 --- a/dist/locales/es.json +++ b/dist/locales/es.json @@ -21,6 +21,11 @@ "description": "Añade restaurantes, monumentos, buzones postales, negocios u otros puntos al mapa.", "tail": "Haga clic en el mapa para añadir un punto." }, + "add_note": { + "title": "Nota", + "description": "¿Has encontrado un problema? Deja que otros mapeadores lo sepan.", + "tail": "Haz clic en el mapa para añadir una nota." + }, "browse": { "title": "Navegar", "description": "Desplazar y acercar el mapa." @@ -40,7 +45,8 @@ "annotation": { "point": "Punto añadido.", "vertex": "Nodo añadido a una vía.", - "relation": "Relación añadida." + "relation": "Relación añadida.", + "note": "Nota añadir." } }, "start": { @@ -297,6 +303,14 @@ "create": "Restricción de giro añadida", "delete": "Restricción de giro eliminada" } + }, + "detach_node": { + "title": "Desconectar", + "key": "E", + "description": "Desconectar este nodo de estas líneas/áreas.", + "annotation": "Desconectado un nodo de las líneas/áreas padre.", + "restriction": "Este nodo no se puede desconectar porque podría afectar a una relación \"{relation}\".", + "connected_to_hidden": "Este nodo no se puede desconectar porque está conectado a un elemento oculto." } }, "restriction": { @@ -352,7 +366,7 @@ "localized_translation_name": "Nombre" }, "zoom_in_edit": "Acercar para editar", - "login": "iniciar sesión", + "login": "Iniciar sesión", "logout": "Cerrar sesión", "loading_auth": "Conectando a OpenStreetMap...", "report_a_bug": "Reportar un error", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Datos del mapa de OpenStreetMap", "title": "Datos de OpenStreetMap" + }, + "notes": { + "tooltip": "Datos de Notas de OpenStreetMap", + "title": "Notas de OpenStreetMap" } }, "fill_area": "Pintar las áreas", @@ -710,15 +728,23 @@ "cannot_zoom": "No se puede alejar más la imagen en el modo actual.", "full_screen": "Cambiar a pantalla completa", "gpx": { - "local_layer": "Archivo local", + "local_layer": "Añadir un GPX", "drag_drop": "Arrastre y suelte un archivo .gpx, .geojson o .kml en la página o haga clic en el botón a la derecha para explorar", "zoom": "Acercar a la capa", "browse": "Buscar un archivo" }, + "mvt": { + "local_layer": "Añadir un MVT", + "drag_drop": "Arrastre y suelte un archivo .mvt o .pbf en la página, o haga clic en el botón de la derecha para navegar", + "zoom": "Acercar a la capa", + "browse": "Buscar un archivo" + }, "streetside": { "tooltip": "Fotografías Streetside de Microsoft", "title": "Capa de fotos (Bing Streetside)", - "report": "Informar un problema de privacidad con esta imagen" + "report": "Informar un problema de privacidad con esta imagen", + "view_on_bing": "Ver en Bing Maps", + "hires": "Alta resolución" }, "mapillary_images": { "tooltip": "Fotos a nivel calle de Mapillary", @@ -738,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Ver esta imagen en OpenStreetCam" }, + "note": { + "note": "Nota", + "title": "Editar nota", + "anonymous": "anónimo", + "closed": "(Cerrada)", + "commentTitle": "Comentarios", + "newComment": "Nuevo comentario", + "inputPlaceholder": "Ingrese un comentario para compartir con otros usuarios.", + "close": "Cerrar nota", + "open": "Reabrir nota", + "comment": "Comentar", + "close_comment": "Cerrar y comentar", + "open_comment": "Reabrir y comentar", + "report": "Informar", + "new": "Nueva Nota", + "newDescription": "Describir el problema.", + "save": "Guardar la Nota", + "login": "Debe iniciar sesión para cambiar o comentar esta nota.", + "upload_explanation": "Sus comentarios serán públicamente visibles para todos los usuarios de OpenStreetMap.", + "upload_explanation_with_user": "Sus comentarios como {user} serán públicamente visibles para todos los usuarios de OpenStreetMap." + }, "help": { "title": "Ayuda", "key": "H", @@ -875,6 +922,17 @@ "boundary": "Una relación *límite* es un grupo de uno o más elementos de línea que juntas forman un límite administrativo.", "boundary_add": "Para agregar un elemento a una relación de límite, seleccione el elemento y desplácese hacia abajo a la sección \"Todas las relaciones\" del editor de elemento, luego haga clic en el botón {plus} agregar para agregar este elemento a una relación cercana existente o a una nueva relación." }, + "notes": { + "title": "Notas", + "intro": "Las *Notas* se usan para a alertar a otros usuarios que un elemento debe ser corregido o requiere atención. Las notas señalan una localización específica en el mapa. Para ver las notas existentes o añadir nuevas, haz clic en el panel {data} **Datos del mapa** para activar la capa de notas de OpenStreetMap.", + "add_note_h": "Añadiendo Notas", + "add_note": "Para añadir una nueva nota, haz clic en el botón {note} **Nota** en la barra de herramientas sobre el mapa, o presione la tecla de método abreviado `4`. Esto cambiará el cursor del ratón a un símbolo de cruz. Para colocar la nueva nota en el mana, posiciona el cursor del ratón donde deba ir la nota y, a continuación, haz clic con el botón izquierdo del ratón o presiona `Espacio`.", + "move_note": "Sólo se pueden mover las nuevas notas. Para mover una nota, coloca el cursor del ratón sobre la nueva nota, luego mantén presionado el {leftclick} botón izquierdo del ratón mientras arrastra el punto a su nueva ubicación.", + "update_note_h": "Cerrando, Reabriendo y Comentando", + "update_note": "Se puede actualizar una nota cerrándola, reabriéndola, o añadiéndole un comentario. Cerrar la nota indica que el problema ha sido resuelto. Reabrirla que el problema original no ha sido resuelto.", + "save_note_h": "Guardando las Notas", + "save_note": "Debes guardar las ediciones de cualquier nota de forma individual haciendo clic en los botones que se encuentran bajo los comentarios de la nota. Las ediciones de notas **no** se incluyen en los conjuntos de cambios que se suben a OpenStreetMap." + }, "imagery": { "title": "Imágenes de fondo", "intro": "Las imágenes de fondo que aparecen debajo de los datos del mapa son un recurso importante para el mapeo. Estas imágenes pueden ser fotografías aéreas recopiladas de satélites, aviones y aviones no tripulados, o pueden escanearse mapas históricos u otros datos de origen disponibles libremente.", @@ -887,7 +945,7 @@ }, "streetlevel": { "title": "Fotos a nivel de calle", - "intro": "Las fotos a nivel de calle son útiles para mapear señales de tráfico, negocios y otros detalles que no se pueden ver desde imágenes satelitales y aéreas. El editor iD admite fotos a nivel de calle de [Mapillary](https://www.mapillary.com) y [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Las fotos a nivel de calle son útiles para mapear señales de tráfico, negocios y otros detalles que no se pueden ver desde imágenes satelitales y aéreas. El editor iD admite fotos a nivel de calle de [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) y [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Usar fotos a nivel de calle", "using": "Para usar fotos a nivel de calle para mapear, haga clic en el panel {data} **Datos de mapa** en el lateral del mapa para habilitar o deshabilitar las capas de fotos disponibles.", "photos": "Cuando está habilitada, la capa de la foto muestra una línea a lo largo de la secuencia de fotos. En niveles de zoom más altos, se indica con un círculo en cada foto la ubicación, y en niveles de zoom aún más altos, se indica con un cono la dirección que estaba mirando la cámara cuando se tomó la foto.", @@ -1269,7 +1327,8 @@ "add_point": "Modo 'añadir punto'", "add_line": "Modo 'añadir línea'", "add_area": "Modo 'añadir área'", - "place_point": "Coloca un punto", + "add_note": "Modo 'Añadir nota'", + "place_point": "Coloca un punto o una nota", "disable_snap": "Mantener presionado para desactivar el ajuste de punto", "stop_line": "Finaliza el dibujo de una línea o área" }, @@ -1278,6 +1337,7 @@ "continue_line": "Continua una línea en el nodo seleccionado", "merge": "Combina (fusiona) los elementos seleccionados", "disconnect": "Desconecta los elementos en el nodo seleccionado", + "detach_node": "Desconectar el nodo seleccionado de las líneas/áreas padre.", "split": "Divida una línea en dos en el nodo seleccionado", "reverse": "Invierte una línea", "move": "Mueve los elementos seleccionados", @@ -1571,6 +1631,9 @@ "board_type": { "label": "Tipo" }, + "booth": { + "label": "Cabina" + }, "boules": { "label": "Tipo" }, @@ -1619,6 +1682,9 @@ "label": "Capacidad", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Pagar en efectivo" + }, "castle_type": { "label": "Tipo" }, @@ -2274,6 +2340,9 @@ "underground": "Subterráneo" } }, + "passenger_information_display": { + "label": "Pantalla de información del pasajero" + }, "payment_multi": { "label": "Formas de pago" }, @@ -2492,9 +2561,23 @@ "shop": { "label": "Tipo" }, + "siren/purpose": { + "label": "Propósito" + }, + "siren/type": { + "label": "Tipo", + "options": { + "electronic": "Elctrónica", + "other": "Otros", + "pneumatic": "Neumática" + } + }, "site": { "label": "Tipo" }, + "site_type": { + "label": "Tipo de sitio" + }, "smoking": { "label": "Fumar", "options": { @@ -4001,6 +4084,10 @@ "emergency/destination": { "name": "Acceso de emergencia como destino" }, + "emergency/fire_alarm": { + "name": "Alarma anti incendios", + "terms": "'alarma de incendios'" + }, "emergency/fire_extinguisher": { "name": "Extintor de incendios", "terms": "Extintor de incendios, incendio, fuego, matafuego" @@ -4009,10 +4096,18 @@ "name": "Hidrante contra incendios", "terms": "boca de incendio,hidrante de incendio, hidrante contra incendios" }, + "emergency/first_aid_kit": { + "name": "Kit de primeros auxilios", + "terms": "'kit de primeros auxilios' 'botiquín de primeros auxilios'" + }, "emergency/life_ring": { "name": "Salvavidas", "terms": "boya, boya salvavidas, anillo kisby, anillo kisby, boya perry" }, + "emergency/lifeguard": { + "name": "Salvavidas", + "terms": "'salvavidas'" + }, "emergency/no": { "name": "Acceso de emergencia no permitido" }, @@ -4026,6 +4121,10 @@ "emergency/private": { "name": "Acceso de emergencia privado" }, + "emergency/siren": { + "name": "Sirena", + "terms": "'alarma' 'sirena'" + }, "emergency/water_tank": { "name": "Depósito de agua de emergencia", "terms": "tanque de agua, cisterna, depósito, deposito" @@ -6561,6 +6660,24 @@ } }, "imagery": { + "AGIV": { + "attribution": { + "text": "Orthophoto Flanders más reciente © AGIV" + }, + "name": "Imágenes aéreas más recientes de AGIV Flanders" + }, + "AGIV10cm": { + "attribution": { + "text": "Orthophoto Flanders © AGIV" + }, + "name": "Imágenes aéreas de AGIV Flandes 2013-2015 10cm" + }, + "AGIVFlandersGRB": { + "attribution": { + "text": "GRB Flanders © AGIV" + }, + "name": "AGIV Flanders GRB" + }, "Bing": { "description": "Imágenes satelitales y aéreas.", "name": "Imágenes aéreas Bing" @@ -6569,6 +6686,7 @@ "attribution": { "text": "Términos y comentarios" }, + "description": "DigitalGlobe-Premium es un mosaico compuesto por el mapa base de DigitalGlobe con regiones seleccionadas llenas de imágenes con +Vivid o de áreas de interés personalizadas, resolución de 50 cm o superior, y actualizadas con mayor frecuencia con actualizaciones continuas.", "name": "Imágenes DigitalGlobe Premium" }, "DigitalGlobe-Premium-vintage": { @@ -6582,6 +6700,7 @@ "attribution": { "text": "Términos y comentarios" }, + "description": "DigitalGlobe-Standard es un conjunto de imágenes seleccionadas que cubren el 86% de la superficie terrestre, con una resolución de 30-60 cm, donde esté disponible, rellenado por Landsat. La antigüedad promedio es de 2.31 años, con algunas áreas actualizadas 2 veces por año.", "name": "Imágenes DigitalGlobe Standard" }, "DigitalGlobe-Standard-vintage": { @@ -6661,6 +6780,12 @@ }, "name": "Inspector OSM: Etiquetado" }, + "SPW_ORTHO_LAST": { + "name": "Imágenes aéreas más recientes de SPW(allonie)" + }, + "SPW_PICC": { + "name": "Imágenes numéricas PICC de SPW(allonie)" + }, "US-TIGER-Roads-2012": { "name": "Carreteras TIGER 2012" }, @@ -6676,6 +6801,30 @@ "description": "Carretera: marco verde = sin clasificar. marco marrón = pista. Superficie: grava = relleno marrón claro, asfalto = negro, pavimentado = gris, tierra = blanco, hormigón = azul, hierba/pasto = verde. Estacional = barras blancas", "name": "Superposición de carreteras forestales de los EE.UU." }, + "UrbISOrtho2016": { + "attribution": { + "text": "Realizado por medio de Brussels UrbIS®© - Distribución y Copyright CIRB" + }, + "name": "UrbIS-Ortho 2016" + }, + "UrbISOrtho2017": { + "attribution": { + "text": "Realizado por medio de Brussels UrbIS®© - Distribución y Copyright CIRB" + }, + "name": "UrbIS-Ortho 2017" + }, + "UrbisAdmFR": { + "attribution": { + "text": "Realizado por medio de Brussels UrbIS®© - Distribución y Copyright CIRB" + }, + "name": "UrbisAdm FR" + }, + "UrbisAdmNL": { + "attribution": { + "text": "Realizado por medio de Brussels UrbIS®© - Distribución y Copyright CIRB" + }, + "name": "UrbisAdm NL" + }, "Waymarked_Trails-Cycling": { "attribution": { "text": "© waymarkedtrails.org, colaboradores de OpenStreetMap, CC by-SA 3.0" @@ -6758,6 +6907,13 @@ }, "name": "OpenStreetMap (estilo alemán)" }, + "osmse-ekonomiska": { + "attribution": { + "text": "© Lantmäteriet" + }, + "description": "Escaneo de ´mapas económicos´ ca 1950-1980", + "name": "Mapa económico Landmäteriet (histórico)" + }, "qa_no_address": { "attribution": { "text": "Simon Poole, datos © contribuidores OpenStreetMap" @@ -6787,13 +6943,55 @@ "text": "Mapas © Thunderforest, datos © contribuidores OpenStreetMap" }, "name": "Thunderforest Landscape" + }, + "trafikverket-baninfo": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Red de trenes de Suecia, incluyendo apartaderos", + "name": "Red de trenes de Trafikverket" + }, + "trafikverket-baninfo-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Red de trenes de Suecia, con múltiples opciones de capas sobre el mapa", + "name": "Trafikverket Railway Network options" + }, + "trafikverket-vagnat": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Red de carreteras sueca NVDB", + "name": "Red de carreteras Trafikverket" + }, + "trafikverket-vagnat-extra": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Detalles adicionales de la NVDB sueca: referencia de autopista, reductores de tráfico, área de descanso, parada de autobús, puente, túnel, cámara de velocidad", + "name": "Trafikverket Road Network extra" + }, + "trafikverket-vagnat-navn": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Nombres de calles suecas NVDB", + "name": "Trafikverket Street Names" + }, + "trafikverket-vagnat-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Red de carreteras suecas NVDB con varias opciones de capas de mapas", + "name": "Trafikverket Road Network options" } }, "community": { "cape-coast-youthmappers": { "name": "Universidad de Cape Coast YouthMappers", "description": "Síguenos en Twitter en {url}", - "extendedDescription": "Este es el identificador oficial del capítulo de Jóvenes Cartografistas de la Universidad de Cape Coast, Ghana. Nos encantan los mapas, los datos abiertos y ayudar a los vulnerables." + "extendedDescription": "Este es el identificador oficial del capítulo de Jóvenes Cartografistas de la Universidad de Cape Coast, Ghana. Nos encantan los mapas, los datos abiertos y ayudar a las personas vulnerables." }, "osm-gh-facebook": { "name": "OpenStreetMap Ghana en Facebook", @@ -7030,6 +7228,18 @@ "name": "Twitter OpenStreetMap Bélgica", "description": "OSM Bélgica en Twitter: @osm_be" }, + "hr-facebook": { + "name": "Grupo de Facebook de OpenStreetMap de Croacia", + "description": "Grupo de Facebook de OpenStreetMap de Croacia" + }, + "hr-irc": { + "name": "OpenStreetMap Croacia en IRC", + "description": "Únete a #osm-hr en irc.freenode.org (puerto 6667)" + }, + "hr-mailinglist": { + "name": "Lista de correo Talk-hr", + "description": "Lista de correo Talk-hr" + }, "czech-community": { "name": "Comunidad checa OSM", "description": "Portal de mapas, sitio web y contactos sobre miembros de OSM en Chequia" @@ -7200,6 +7410,14 @@ "name": "Foro de OpenStreetMap Polonia", "description": "Foro de la comunidad polaca OpenStreetMap" }, + "si-forum": { + "name": "Foro de OpenStreetMap Eslovenia", + "description": "Foro de la comunidad OpenStreetMap en Eslovenia" + }, + "si-mailinglist": { + "name": "Lista de correo de OpenStreetMap en Eslovenia", + "description": "Lista de correo de la comunidad de OpenStreetMap en Eslovenia" + }, "OSM-ES-mailinglist": { "name": "Lista de correo Talk-es", "description": "Una lista de correo para discutir OpenStreetMap en España" @@ -7305,6 +7523,10 @@ "description": "Mapeadores y usuarios de OpenStreetMap, en Portland, ME", "extendedDescription": "Maptime es, literalmente, el momento de hacer mapas. Nuestra misión es abrir las puertas de la posibilidad cartográfica a cualquier persona interesada creando un tiempo y espacio para el aprendizaje colaborativo, la exploración y la creación de mapas utilizando herramientas y tecnologías de mapeo." }, + "us-ma-mailinglist": { + "name": "Lista de correo de Talk-us-massachusetts", + "description": "Lista de correo de la comunidad OSM de Massachusetts" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Mejore OpenStreetMap en el área de Cleveland", @@ -7333,6 +7555,11 @@ "name": "OpenStreetMap NYC", "description": "Mapeadores y usuarios de OpenStreetMap, desarrolladores y entusiastas en el área Metropolitana de Nueva York" }, + "OSM-Portland-forum": { + "name": "Grupo de Google de OpenStreetMap PDX", + "description": "Foro y lista de correo para usuarios de OpenStreetMap en el área de Portland", + "extendedDescription": "Este grupo es para facilitar las mejoras en OpenStreetMap en el área de Portland, Oregon, para dar soporte a aplicaciones como Open Trip Planner." + }, "OSM-Portland": { "name": "OpenStreetMap Portland", "description": "Mapeadores y usuarios de OpenStreetMap en el área de Portland", @@ -7364,7 +7591,14 @@ "OSM-US": { "name": "OpenStreetMap EE.UU.", "description": "Ayudamos a crecer y mejorar OpenStreetMap en los Estados Unidos.", - "extendedDescription": "Apoyamos OpenStreetMap celebrando conferencias anuales, proporcionando recursos comunitarios, creando alianzas y dando a conocer. Únase a OpenStreetMap EE.UU. aquí: {signupUrl}" + "extendedDescription": "Apoyamos OpenStreetMap celebrando conferencias anuales, proporcionando recursos comunitarios, creando alianzas y dando a conocer. Únase a OpenStreetMap EE.UU. aquí: {signupUrl}", + "events": { + "sotmus2018": { + "name": "State of the Map EE.UU. 2018", + "description": "Únase a la comunidad de OpenStreetMap en State of the Map EE.UU. en Detroit, Michigan. Conéctese con otros mapeadores, empresas, agencias gubernamentales y organizaciones sin fines de lucro, todos colaborando en torno al mapa del mundo libre y editable.", + "where": "Detroit, Michigan" + } + } }, "OSM-Utah": { "name": "OpenStreetMap Utah", diff --git a/dist/locales/et.json b/dist/locales/et.json index 4cd265ad0..230161913 100644 --- a/dist/locales/et.json +++ b/dist/locales/et.json @@ -1,5 +1,10 @@ { "et": { + "icons": { + "information": "info", + "remove": "eemalda", + "undo": "tühista" + }, "modes": { "add_area": { "title": "Ala", @@ -16,6 +21,11 @@ "description": "Lisa kaardile restorane, monumente, postkaste ja muid punkte.", "tail": "Klõpsa kaardil, et lisada punkt." }, + "add_note": { + "title": "Teade", + "description": "Avastasid vea? Anna teistele kaardistajatele sellest märku.", + "tail": "Klõpsa kaardil, et lisada teade." + }, "browse": { "title": "Sirvi", "description": "Nihuta ja suumi kaarti." @@ -32,7 +42,8 @@ "annotation": { "point": "Punkt lisatud.", "vertex": "Joonele lisatud sõlm.", - "relation": "Relatsioon lisatud." + "relation": "Relatsioon lisatud.", + "note": "Teade lisatud." } }, "start": { @@ -265,6 +276,9 @@ "create": "Lisatud pöörde piirang", "delete": "Kustutatud pöörde piirang" } + }, + "detach_node": { + "title": "Võta lahti" } }, "undo": { @@ -315,18 +329,44 @@ }, "info_panels": { "background": { + "title": "Taust", "source": "Allikas", "description": "Kirjeldus", "resolution": "Resolutsioon", - "accuracy": "Täpsus" + "accuracy": "Täpsus", + "unknown": "Teadmata" }, "history": { "title": "Ajalugu", + "selected": "{n} valitud", + "no_history": "Ajalugu puudub (uus detail)", "version": "Versioon", "last_edit": "Viimane muudatus", "edited_by": "Muutis", "changeset": "Muudatuskogum", - "unknown": "Teadmata" + "unknown": "Teadmata", + "link_text": "Ajalugu openstreetmap.org'is." + }, + "location": { + "key": "A", + "title": "Asukoht", + "unknown_location": "Teadmata asukoht" + }, + "measurement": { + "key": "M", + "title": "Mõõtmine", + "selected": "{n} valitud", + "geometry": "Geomeetria", + "closed_line": "suletud joon", + "closed_area": "suletud ala", + "center": "Keskpunkt", + "perimeter": "Välisäär", + "length": "Pikkus", + "area": "Ala", + "centroid": "Tsentroid", + "location": "Asukoht", + "metric": "Meeter", + "imperial": "Inglise" } }, "geometry": { @@ -419,6 +459,10 @@ "osm": { "tooltip": "Kaardiandmed OpenStreetMapist", "title": "OpenStreetMapi andmed" + }, + "notes": { + "tooltip": "Teate andmed OpenStreetMapist", + "title": "OpenStreetMap teated" } }, "fill_area": "Täida alad", @@ -568,11 +612,24 @@ "cannot_zoom": "Ei ole võimalik rohkem välja suumida selles vaates.", "full_screen": "Lülita täisekraanile", "gpx": { - "local_layer": "Lokaalne fail", + "local_layer": "Lisa GPX", "drag_drop": "Lohista lehele .gpx-, .geojson- või .kml-fail või klõpsa nuppu paremal, et sirvida", "zoom": "Suumi kihini", "browse": "Sirvi faili" }, + "mvt": { + "local_layer": "Lisa MVT", + "drag_drop": "Lohista lehele .mvt või .pbf fail või klõpsa nuppu paremal, et sirvida", + "zoom": "Suumi kihini", + "browse": "Lehitse arvutist" + }, + "streetside": { + "tooltip": "Tänava-tasandi fotod Microsoftilt", + "title": "Fotokate (Bing Streetside)", + "report": "Teata privaatsusmurest selle pildiga", + "view_on_bing": "Vaata Bing Mapsis", + "hires": "Kõrge resolutsioon" + }, "mapillary_images": { "tooltip": "Tänavatasandi fotod Mapillaryst", "title": "Fotokate (Mapillary)" @@ -588,10 +645,34 @@ "tooltip": "Tänavatasandi fotod OpenStreetCamist", "title": "Fotokate (OpenStreetCam)" }, + "note": { + "note": "Märge", + "title": "Muuda märget", + "anonymous": "anonüümne", + "closed": "(Suletud)", + "commentTitle": "Kommentaarid", + "newComment": "Uus kommentaar", + "inputPlaceholder": "Lisa kommentaar teistega jagamiseks.", + "close": "Sulge märge", + "open": "Taasava märge", + "comment": "Kommentaar", + "close_comment": "Sulge ja kommenteeri", + "open_comment": "Taasava ja kommenteeri", + "report": "Teavita", + "new": "Uus märge", + "newDescription": "Kirjelda mure.", + "save": "Salvesta teade", + "login": "Sa pead olema sisse logitud, et muuta või kommenteerida seda teadet.", + "upload_explanation": "Sinu kommentaarid on avalikult nähtavad kõigile OpenStreetMapi kasutajatele.", + "upload_explanation_with_user": "Sinu kommentaarid kasutajana {user} on avalikult nähtavad kõigile OpenStreetMapi kasutajatele." + }, "help": { "title": "Abi", "editing": { "keyboard_h": "Kiirklahvid" + }, + "notes": { + "title": "Teated" } }, "intro": { @@ -1490,8 +1571,8 @@ "name": "Kolledžiala" }, "amenity/community_centre": { - "name": "Kultuurikeskus", - "terms": "keskus,üritused,hall,rahvamaja,kogukonna keskus,külakeskus" + "name": "Kogukonna keskus", + "terms": "keskus,üritused,hall,rahvamaja,kultuurikeskus,külakeskus,spordikeskus,külamaja" }, "amenity/compressed_air": { "name": "Suruõhk", @@ -2668,6 +2749,10 @@ "man_made/chimney": { "name": "Korsten" }, + "man_made/clearcut": { + "name": "Raiesmik", + "terms": "lageraie,raiestik,kännustik" + }, "man_made/crane": { "name": "Kraana" }, @@ -2781,6 +2866,10 @@ "name": "Mäetipp", "terms": "tipp" }, + "natural/reef": { + "name": "Kari", + "terms": "riff,korall" + }, "natural/ridge": { "name": "Mäehari", "terms": "seljandik,mäeseljandik,seljak,mäetipp,tipp" @@ -3261,6 +3350,10 @@ "name": "Mootorrattapood", "terms": "tsiklid" }, + "shop/motorcycle_repair": { + "name": "Mootorratta remondikoda", + "terms": "remont,hooldus" + }, "shop/music": { "name": "Muusikapood" }, diff --git a/dist/locales/eu.json b/dist/locales/eu.json index c22d72cd4..dd5d679d5 100644 --- a/dist/locales/eu.json +++ b/dist/locales/eu.json @@ -1,5 +1,10 @@ { "eu": { + "icons": { + "information": "info", + "remove": "kendu", + "undo": "ezeztatu" + }, "modes": { "add_area": { "title": "Lekua", diff --git a/dist/locales/fa.json b/dist/locales/fa.json index dd1de6194..641b7169f 100644 --- a/dist/locales/fa.json +++ b/dist/locales/fa.json @@ -316,8 +316,6 @@ "localized_translation_name": "نام" }, "zoom_in_edit": "برای ویرایش زوم کنید", - "login": "ورود", - "logout": "خروج", "loading_auth": "در حال اتصال به OpenStreetMap...", "report_a_bug": "گزارش یک اشکال", "help_translate": "کمک به ترجمه", @@ -468,8 +466,13 @@ "overlays": "پوشش ها", "imagery_source_faq": "اطلاعات تصویر / گزارش یک مشکل", "reset": "باز نشاندن", + "display_options": "گزینه‌های نمایش", "brightness": "روشنایی", + "contrast": "پادنمایی", + "saturation": "سیری", + "sharpness": "آشکاری", "minimap": { + "description": "نمایش نقشهٔ کوچک", "tooltip": "برای پیدا کردن محل منطقه نشان داده شده، یک نقشه کوچک نمایی نشان بده", "key": "/" }, @@ -477,11 +480,11 @@ "offset": "برای تنظیم افست تصاویر، محدوده خاکستری زیر را بکشید یا مقادیر را به متر در کادر زیر وارد کنید." }, "map_data": { - "title": "نقشه داده", - "description": "نقشه داده", + "title": "داده‌های نقشه", + "description": "داده‌های نقشه", "key": "F", - "data_layers": "لایها داده ها", - "fill_area": "محدوده‌ها را پر کنید", + "data_layers": "لایه‌های داده", + "fill_area": "پُری محدوده‌ها", "map_features": "عناصر نقشه", "autohidden": "این عناصر به صورت خودکار مخفی شدند چون تعداد زیادی از آنها بر روی صفحه نمایش میافت. برای ویرایش آنها زوم کنید." }, @@ -531,7 +534,7 @@ "tooltip": "پیشنهاد شده، در حال ساخت و ساز، رها شده، تخریب شده و غیره." }, "others": { - "description": "دیگران", + "description": "سایر", "tooltip": "هر چیز دیگر" } }, @@ -652,7 +655,7 @@ "open_source_h": "سورس باز" }, "overview": { - "navigation_h": "مسیریابی", + "navigation_h": "حرکت در نقشه", "features_h": "ویژگی‌های نقشه" }, "editing": { @@ -779,7 +782,7 @@ "or": "-یا-", "browsing": { "navigation": { - "title": "مسیریابی" + "title": "حرکت در نقشه" }, "help": { "title": "کمک" @@ -791,7 +794,6 @@ "title": "نقشه برداری", "add_line": "حالت 'افزودن خط'", "add_area": "حالت 'افزودن ناحیه'", - "place_point": "ایجاد نقطه", "stop_line": "اتمام رسم خط یا ناحیه" }, "operations": { @@ -3075,6 +3077,9 @@ "emergency/fire_hydrant": { "name": "آتش نشانی" }, + "emergency/lifeguard": { + "name": "نجات غریق" + }, "emergency/no": { "name": "دسترسی اظطراری خیر" }, @@ -3168,6 +3173,9 @@ "healthcare/psychotherapist": { "name": "روان‎‌درمانگر" }, + "healthcare/rehabilitation": { + "name": "توانبخشی" + }, "healthcare/speech_therapist": { "name": "گفتار درمان" }, @@ -3569,7 +3577,7 @@ "name": "زمین بازی" }, "leisure/resort": { - "name": "پر رفت‌آمد", + "name": "مجتمع تفریحی", "terms": "مکان پررفت‌آمد, اماکن پر رفت آمد,مکان‌های مطرح" }, "leisure/sauna": { @@ -3635,9 +3643,15 @@ "man_made/lighthouse": { "name": "فانوس دریایی" }, + "man_made/mast": { + "name": "دکل مخابراتی" + }, "man_made/observation": { "name": "برج رصد" }, + "man_made/observatory": { + "name": "رصد خانه" + }, "man_made/petroleum_well": { "name": "چاه نفت" }, @@ -3804,8 +3818,11 @@ "office/financial": { "name": "اداره مالی" }, + "office/forestry": { + "name": "دفتر جنگلداری" + }, "office/government": { - "name": "اداره دولتی" + "name": "دفتر دولتی" }, "office/government/register_office": { "name": "اداره ثبت" @@ -3894,9 +3911,18 @@ "place/village": { "name": "روستا" }, + "playground/roundabout": { + "name": "چرخ و فلک" + }, + "playground/seesaw": { + "name": "الاکلنگ" + }, "playground/slide": { "name": "سرسره" }, + "playground/swing": { + "name": "تاب" + }, "point": { "name": "نقطه" }, @@ -4315,6 +4341,9 @@ "shop/ticket": { "name": "بلیط فروشی" }, + "shop/tiles": { + "name": "کاشی فروشی" + }, "shop/tobacco": { "name": "فروشگاه مواد افیونی تنباکو" }, @@ -4842,6 +4871,24 @@ "cape-coast-youthmappers": { "description": "ما را در توییتر دنبال کنید: {url}" }, + "OSM-IDN-facebook": { + "description": "بهبود OpenStreetMap در اندونزی" + }, + "OSM-japan-facebook": { + "name": "انجمن OpenStreetMap ژاپن", + "description": "نقشه برداران و کاربران OpenStreetMap در ژاپن" + }, + "OSM-japan-twitter": { + "description": "هشتگ در توییتر" + }, + "OSM-Nepal-facebook": { + "name": "OpenStreetMap نپال", + "description": "بهبود OpenStreetMap در نپال" + }, + "OSM-LKA-facebook": { + "name": "OpenStreetMap سری لانکا", + "description": "بهبود OpenStreetMap   در سری لانکا" + }, "Central-Pennsylvania-OSM": { "name": "پنسیلوانیا مرکزی OSM", "description": "جامعه نقشه برداری آنلاین بر اساس کالج ایالتی، پنسیلوانیا" diff --git a/dist/locales/fi.json b/dist/locales/fi.json index 80b30fcf6..6a51d488f 100644 --- a/dist/locales/fi.json +++ b/dist/locales/fi.json @@ -348,8 +348,6 @@ "localized_translation_name": "Nimi" }, "zoom_in_edit": "Aloita muokkaaminen lähentämällä karttaa", - "login": "kirjaudu", - "logout": "kirjaudu ulos", "loading_auth": "Yhdistetään OpenStreetMap-palveluun...", "report_a_bug": "Ilmoita ongelmasta", "help_translate": "Auta kääntämisessä", @@ -702,7 +700,6 @@ "cannot_zoom": "Nykyisessä tilassa ei voi loitontaa enempää.", "full_screen": "Koko näytön tila", "gpx": { - "local_layer": "Paikallinen tiedosto", "drag_drop": "Vedä ja pudota gpx-, geojson- tai kml-tiedosto tälle sivulle tai selaa tiedostoja napsauttamalla painiketta oikealla.", "zoom": "Sovita tasoon", "browse": "Selaa tiedostoja" @@ -1066,7 +1063,6 @@ "add_point": "Uusi paikkapiste", "add_line": "Uusi viiva", "add_area": "Uusi alue", - "place_point": "Sijoita piste", "stop_line": "Viivan tai alueen viimeinen piste" }, "operations": { @@ -1349,6 +1345,9 @@ "board_type": { "label": "Tyyppi" }, + "booth": { + "label": "Koppi" + }, "boules": { "label": "Tyyppi" }, @@ -1358,6 +1357,9 @@ "brand": { "label": "Brändi" }, + "brewery": { + "label": "Hanaoluita" + }, "bridge": { "label": "Tyyppi", "placeholder": "Oletus" @@ -1737,6 +1739,14 @@ "common": "Helppo: Ei ongelmia tai haasteita (oletus)", "critical": "Rajallinen: Saavutettavissa vain kokeneille ratsastajille ja hevosille. Merkittäviä esteitä. Sillat tulee tarkastaa huolella.", "dangerous": "Vaarallinen: Saavutettavissa vain erittäin kokeneille ratsastajille ja hevosille hyvällä säällä. Jalkaisin." + }, + "placeholder": "Vaikea, vaarallinen..." + }, + "horse_stables": { + "label": "Hevostalli", + "options": { + "stables": "Kyllä", + "undefined": "Ei" } }, "iata": { @@ -1758,6 +1768,9 @@ "indoor": { "label": "Sisätila" }, + "industrial": { + "label": "Tyyppi" + }, "information": { "label": "Tyyppi" }, @@ -1786,6 +1799,9 @@ "kerb": { "label": "Reunakiveyksen muoto" }, + "label": { + "label": "Nimike" + }, "lamp_type": { "label": "Tyyppi" }, @@ -1797,7 +1813,8 @@ "placeholder": "1, 2, 3..." }, "layer": { - "label": "Kerros" + "label": "Kerros", + "placeholder": "0" }, "leaf_cycle": { "label": "Lehtien pudotuskierto", @@ -1875,7 +1892,8 @@ "placeholder": "40, 50, 60..." }, "maxspeed/advisory": { - "label": "Suositusnopeus" + "label": "Suositusnopeus", + "placeholder": "40, 50, 60..." }, "maxstay": { "label": "Sallittu enimmäisaika" @@ -1974,6 +1992,7 @@ "oneway": { "label": "Yksisuuntaisuus", "options": { + "alternating": "Vaihteleva", "no": "Ei", "reversible": "Epäsäännöllisesti vaihtuva", "undefined": "Oletettavasti ei", @@ -2021,6 +2040,9 @@ "payment_multi": { "label": "Maksutavat" }, + "phases": { + "placeholder": "1, 2, 3..." + }, "phone": { "label": "Puhelin", "placeholder": "+358 40 123 4567" @@ -2100,6 +2122,9 @@ "railway": { "label": "Tyyppi" }, + "railway/position": { + "placeholder": "Etäisyys yhden desimaalin tarkkuudella (123.4)" + }, "railway/signal/direction": { "label": "Vaikuttaa kulkusuunnassa", "options": { @@ -2225,6 +2250,12 @@ "shop": { "label": "Tyyppi" }, + "siren/type": { + "label": "Tyyppi", + "options": { + "pneumatic": "Pneumaattinen" + } + }, "site": { "label": "Tyyppi" }, @@ -2432,6 +2463,7 @@ "transformer": { "label": "Tyyppi", "options": { + "auxiliary": "Avustava", "converter": "Muuntaja", "distribution": "Jakauma", "generator": "Generaattori" @@ -4491,6 +4523,9 @@ "office/private_investigator": { "name": "Yksityisetsivä" }, + "office/quango": { + "name": "Kansalaisjärjestön toimisto" + }, "office/research": { "name": "Tutkimustoimisto" }, @@ -5387,6 +5422,15 @@ "type/restriction/no_u_turn": { "name": "Ei saa tehdä U-käännöstä" }, + "type/restriction/only_left_turn": { + "name": "Kääntyminen vain vasemmalle" + }, + "type/restriction/only_right_turn": { + "name": "Kääntyminen vain oikealle" + }, + "type/restriction/only_straight_on": { + "name": "Pakollinen ajosuunta suoraan" + }, "type/route": { "name": "Reitti", "terms": "matkareitti, rengasreitti, lenkki, kulkuohjeet, ohjaus, reititys, navigointi, kurssi, traili" @@ -5609,6 +5653,9 @@ "description": "Keltainen = Tekijänoikeudeton kartta-aineisto Yhdysvaltain väestönlaskentaviranomaiselta. Punainen = Aineisto ei löydy OpenStreetMapista", "name": "TIGER Roads 2017" }, + "US_Forest_Service_roads_overlay": { + "description": "Valtatie: Vihreä kehys = luokittelematon. Ruskea kehys = track. Pinta: gravel = vaaleanruskea täyttö, asfaltti = musta, pinnoitettu = harmaa, ground =white, concrete = blue, grass = green. Seasonal = white bars" + }, "Waymarked_Trails-Cycling": { "attribution": { "text": "© waymarkedtrails.org, OpenStreetMapin tekijät, CC by-SA 3.0" @@ -5643,6 +5690,7 @@ "attribution": { "text": "basemap.at" }, + "description": "Itävallan taustakartta, Itävallan hallinnon tietoihin pohjautuva.", "name": "basemap.at" }, "basemap.at-orthofoto": { @@ -5688,6 +5736,11 @@ }, "name": "OpenStreetMap (saksalainen tyyli)" }, + "osmse-ekonomiska": { + "attribution": { + "text": "© Lantmäteriet" + } + }, "qa_no_address": { "attribution": { "text": "Simon Poole, aineisto ©OpenStreetMapin tekijät" @@ -5710,9 +5763,35 @@ "text": "Kartat © Thunderforest, Aineisto © OpenStreetMapin tekijät" }, "name": "Thunderforest-maisema" + }, + "trafikverket-baninfo": { + "description": "Ruotsin rautatieverkosto, sivuraiteet mukaanlukien." + }, + "trafikverket-baninfo-option": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat-navn": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Ruotsinkieliset NVDB:n tiennimet" } }, "community": { + "OSM-BGD-facebook": { + "name": "OpenStreetMap Bangladesh", + "description": "Paranna Bangladeshin OpenStreetMapia" + }, + "OSM-India-facebook": { + "description": "Paranna Intian OpenStreetMapia" + }, "it-twitter": { "description": "Seuraa Twitter-tiliämme osoitteessa {url}" }, diff --git a/dist/locales/fr.json b/dist/locales/fr.json index 732b835c7..d3b133340 100644 --- a/dist/locales/fr.json +++ b/dist/locales/fr.json @@ -21,6 +21,11 @@ "description": "Ajouter des restaurants, des monuments, des boîtes aux lettres ou d'autres points à la carte.", "tail": "Cliquez sur la carte pour ajouter un point tel qu'un restaurant ou un monument." }, + "add_note": { + "title": "Note", + "description": "Vous avez repéré une erreur ? Faîtes-le savoir aux autres cartographes.", + "tail": "CLiquez sur la earte pour ajouter une note." + }, "browse": { "title": "Naviguer", "description": "Naviguer ou zoomer sur la carte." @@ -32,7 +37,7 @@ "tail": " Cliquez pour ajouter des nœuds à la ligne. Cliquez sur d'autres lignes pour y connecter la ligne, et double-cliquez pour terminer la ligne." }, "drag_node": { - "connected_to_hidden": "Ceci ne peut être édité parce que c'est connecté à un élément caché." + "connected_to_hidden": "Cet élément ne peut être modifié parce qu'il est connecté à un élément caché." } }, "operations": { @@ -40,7 +45,8 @@ "annotation": { "point": "ajout d'un point.", "vertex": "ajout d'un nœud à une ligne.", - "relation": "création d'une relation." + "relation": "création d'une relation.", + "note": "Note ajoutée." } }, "start": { @@ -152,7 +158,7 @@ "area": "connexion d'un chemin à un polygone." }, "relation": "Ces éléments ne peuvent être connectés car ils ont des rôles de relations conflictuels.", - "restriction": "Ces éléments ne peuvent être connectés car cela endommagerait une relation \"{relation}\"." + "restriction": "Ces éléments ne peuvent être connectés car cela endommagerait une relation « {relation} »." }, "disconnect": { "title": "Séparer", @@ -170,10 +176,10 @@ "annotation": "fusion de {n} éléments.", "not_eligible": "Ces éléments ne peuvent pas être fusionnés.", "not_adjacent": "Ces éléments ne peuvent être fusionnés car leurs extrémités ne sont pas connectés.", - "restriction": "Ces éléments ne peuvent être fusionnés car cela endommagerait une relation \"{relation}\".", + "restriction": "Ces éléments ne peuvent être fusionnés car cela endommagerait une relation « {relation} ».", "relation": "Ces éléments ne peuvent être fusionnés car leurs rôles sont incompatibles dans une relation.", "incomplete_relation": "Ces éléments ne peuvent pas être fusionnés parce qu'au moins l'un d'entre eux n'a pas été complètement téléchargé.", - "conflicting_tags": "Ces éléments ne peuvent être fusionnés car certains de leurs tags ont des valeurs conflictuelles." + "conflicting_tags": "Ces éléments ne peuvent être fusionnés car certains de leurs attributs ont des valeurs conflictuelles." }, "move": { "title": "Déplacer", @@ -297,6 +303,14 @@ "create": "interdiction de tourner ajoutée.", "delete": "interdiction de tourner supprimée." } + }, + "detach_node": { + "title": "Séparer", + "key": "E", + "description": "Séparer ce nœud de ces lignes ou polygones", + "annotation": "Séparation d'un nœud de ses lignes ou polygones parents.", + "restriction": "Ce nœud ne peut pas être séparé car cela endommagerait une relation « {relation} ».", + "connected_to_hidden": "Ce nœud ne peut pas être séparé car il est connecté à un élément caché." } }, "restriction": { @@ -332,19 +346,19 @@ "via_names": "{via} {viaNames}", "select_from": "Cliquez pour sélectionner un segment {from}", "select_from_name": "Cliquez pour sélectionner {from} {fromName}", - "toggle": "Cliquez pour « {turn} »" + "toggle": "Cliquez pour « {turn} »" } }, "undo": { - "tooltip": "Annuler : {action}", + "tooltip": "Annuler : {action}", "nothing": "Rien à annuler." }, "redo": { - "tooltip": "Rétablir : {action}", + "tooltip": "Rétablir : {action}", "nothing": "Rien à rétablir." }, - "tooltip_keyhint": "Raccourci :", - "browser_notice": "Cet éditeur est supporté sous Firefox, Chrome, safari, Opera, et Internet Explorer 11 et supérieur. Veuillez s'il vous plaît mettre à jour votre navigateur ou utiliser Potlach 2 pour éditer la carte.", + "tooltip_keyhint": "Raccourci :", + "browser_notice": "Cet éditeur est supporté sous Firefox, Chrome, safari, Opera, et Internet Explorer 11 et supérieur. Veuillez s'il vous plaît mettre à jour votre navigateur ou utiliser Potlach 2 pour modifier la carte.", "translate": { "translate": "Traduire", "localized_translation_label": "Nom multi-langues", @@ -352,18 +366,18 @@ "localized_translation_name": "Nom" }, "zoom_in_edit": " Zoomer pour Modifier ", - "login": "identifiant", + "login": "Connexion", "logout": "Déconnexion", - "loading_auth": "Connexion à OpenStreetMap...", + "loading_auth": "Connexion à OpenStreetMap…", "report_a_bug": "Rapporter un bug", "help_translate": "Aider à traduire", "feature_info": { "hidden_warning": "{count} éléments cachés", - "hidden_details": "Ces éléments sont actuellement cachés : {details}" + "hidden_details": "Ces éléments sont actuellement cachés : {details}" }, "status": { "error": "Impossible de se connecter au serveur d'API.", - "offline": "Le serveur d'API est hors ligne. Veuillez essayer d'éditer plus tard.", + "offline": "Le serveur d'API est hors ligne. Essayez de modifier plus tard.", "readonly": "Le serveur d'API est en lecture seule. Vous devez attendre pour enregistrer vos changements.", "rateLimit": "Le serveur d'API limite les connexions anonymes. Vous pouvez résoudre ce problème en vous connectant." }, @@ -374,7 +388,7 @@ "request_review": "Je souhaite que quelqu'un vérifie mes modifications", "save": "Envoyer", "cancel": "Annuler", - "changes": "{count} modification(s) :", + "changes": "{count} modification(s) :", "download_changes": "Télécharger le fichier osmChange", "warnings": "Attention", "modified": "Modifié", @@ -382,7 +396,7 @@ "created": "Créé", "about_changeset_comments": "À propos des commentaires de groupe de modifications", "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/FR:Bons_commentaires_de_groupe_de_modifications", - "google_warning": "Vous avez mentionné Google dans ce commentaire : rappelez-vous que copier depuis Google Maps est strictement interdit.", + "google_warning": "Vous avez mentionné Google dans ce commentaire : rappelez-vous que copier depuis Google Maps est strictement interdit.", "google_warning_link": "https://www.openstreetmap.org/copyright" }, "contributors": { @@ -412,7 +426,7 @@ "selected": "{n} dans la sélection", "no_history": "Pas d'historique (Nouvel élément)", "version": "Version", - "last_edit": "Dernière édition", + "last_edit": "Dernière modification", "edited_by": "Edité par", "changeset": "Groupe de modification", "unknown": "Inconnu", @@ -449,27 +463,27 @@ "relation": "relation" }, "geocoder": { - "search": "Rechercher dans le monde entier...", + "search": "Rechercher dans le monde entier…", "no_results_visible": "Aucun résultat sur la zone visible de la carte", "no_results_worldwide": "Aucun résultat trouvé" }, "geolocate": { "title": "Me localiser", - "locating": "En cours de localisation, veuillez patienter..." + "locating": "Localisation, veuillez patienter…" }, "inspector": { "no_documentation_combination": "Aucune documentation n'est disponible pour cette combinaison d'étiquettes", "no_documentation_key": "Aucune documentation n'est disponible pour cette clé", "documentation_redirect": "Cette documentation a été redirigée vers une nouvelle page", "show_more": "Plus d'informations", - "view_on_osm": "Visualiser sur openstreetmap.org", - "all_fields": "Tous les tags", - "all_tags": "Tous les tags", + "view_on_osm": "Consulter sur openstreetmap.org", + "all_fields": "Tous les champs", + "all_tags": "Tous les attributs", "all_members": "Tous les membres", "all_relations": "Toutes les relations", - "new_relation": "Nouvelle relation...", + "new_relation": "Nouvelle relation…", "role": "Rôle", - "choose": "Que souhaitez vous ajouter?", + "choose": "Que souhaitez-vous ajouter ?", "results": "{n} résultats pour {search}", "reference": "Consulter sur le Wiki d'OpenStreetMap", "back_tooltip": "Changer l'objet", @@ -498,7 +512,7 @@ "way": "Chemin", "relation": "Relation", "location": "Endroit", - "add_fields": "Ajouter un tag :" + "add_fields": "Ajouter un attribut :" }, "background": { "title": "Fond de carte", @@ -510,7 +524,7 @@ "switch": "Revenir à cet arrière-plan", "custom": "Personnalisé", "custom_button": "Modifier le fond personnalisé", - "custom_prompt": "Entrez un modèle URL de tuile. Les symboles valide sont : \n - {zoom} ou {z}, {x}, {y} pour schéma de tuile Z/X/Y\n- {-y} ou {ty} pour basculer vers le style de coordonées TMS Y\n- {u} pour le schéma quadri-tuiles\n- {switch:a,b,c} pour le multiplexage de serveur DNS\n\nExemple:\n{example}", + "custom_prompt": "Entrez un modèle URL de tuile. Les symboles valide sont : \n - {zoom} ou {z}, {x}, {y} pour le schéma de tuile Z/X/Y\n - {-y} ou {ty} pour basculer vers le style de coordonnés TMS Y\n - {u} pour le schéma quadri-tuiles\n - {switch:a,b,c} pour le multiplexage de serveurs DNS\n\nExemple:\n{example}", "overlays": "Calques", "imagery_source_faq": "Info imagerie / Signaler un problème", "reset": "réinitialiser", @@ -525,7 +539,7 @@ "key": "/" }, "fix_misalignment": "Ajuster le décalage du fond de carte", - "offset": "«Glissez» partout dans la zone grise ci-dessous pour ajuster le décalage d'image, ou entrez les valeurs de décalage en mètres." + "offset": "« Glissez » partout dans la zone grise ci-dessous pour ajuster le décalage d'image, ou entrez les valeurs de décalage en mètres." }, "map_data": { "title": "Données cartographiques", @@ -536,11 +550,15 @@ "osm": { "tooltip": "Données de cartes d'OpenStreetMap", "title": "Données OpenStreetMap" + }, + "notes": { + "tooltip": "Données des notes d'OpenStreetMap", + "title": "Notes d'OpenStreetMap" } }, "fill_area": "Remplissage des zones", "map_features": "Éléments de la carte", - "autohidden": "Ces éléments ont été automatiquement cachés parce qu'un trop grand nombre d'entre eux seraient affichés à l'écran. Vous pouvez zoomer pour les éditer.", + "autohidden": "Ces éléments ont été automatiquement cachés parce qu'un trop grand nombre d'entre eux seraient affichés à l'écran. Vous pouvez zoomer pour les modifier.", "osmhidden": "Ces éléments ont été automatiquement cachés parce que le calque OpenStreetMap est caché." }, "feature": { @@ -610,19 +628,19 @@ }, "restore": { "heading": "Vous avez des changements non sauvegardés.", - "description": "Vous avez des changements non sauvegardés d'une précédente édition. Souhaitez-vous restaurer ces changements ?", + "description": "Vous avez des changements non sauvegardés d'une session précédente. Souhaitez-vous restaurer ces changements ?", "restore": "Restaurer mes modifications", "reset": "Abandonner mes modifications" }, "save": { - "title": "Sauvegarder...", + "title": "Sauvegarder…", "help": "Vérifiez vos modifications avant de pouvoir les envoyer sur OpenStreetMap afin qu'elles soient visibles par les autres contributeurs.", "no_changes": "Aucune modification à sauvegarder", "error": "Des erreurs sont survenues en tentant de sauvegarder", "status_code": "Le serveur a renvoyé le code de statut {code}", "unknown_error_details": "Veuillez vérifier que votre ordinateur est connecté au réseau.", - "uploading": "Envoi des modifications vers OpenStreetMap...", - "conflict_progress": "Détection des conflits: {num} de {total}", + "uploading": "Envoi des modifications vers OpenStreetMap…", + "conflict_progress": "Détection des conflits : {num} de {total}", "unsaved_changes": "Vous avez des modifications non enregistrées", "conflict": { "header": "Résoudre les modifications conflictuelles", @@ -644,7 +662,7 @@ "location": "Cet élément a été déplacé à la fois par vous et {user}.", "nodelist": "Les nœuds ont été changés à la fois par vous et {user}", "memberlist": "Les membres de la relation ont été changés à la fois par vous et {user}", - "tags": "Vous avez changé le tag {tag} en \"{local}\" et {user} l'a changé en \"{remote}\"." + "tags": "Vous avez changé l'attribut {tag} en « {local} » et {user} l'a changé en « {remote} »." } }, "success": { @@ -655,13 +673,13 @@ "help_link_text": "Détails", "help_link_url": "https://wiki.openstreetmap.org/wiki/FR:FAQ#Je_viens_juste_de_faire_quelques_changements_sur_la_carte._Comment_puis-je_les_voir_.3F", "view_on_osm": "Voir les changements sur OSM", - "changeset_id": "Votre numéro d'ensemble de modification : {changeset_id}", - "like_osm": "Vous aimez OpenStreetMap ? Retrouvez d'autres contributeurs :", + "changeset_id": "Votre numéro d'ensemble de modification : {changeset_id}", + "like_osm": "Vous aimez OpenStreetMap ? Retrouvez d'autres contributeurs :", "more": "Plus", "events": "Événements", - "languages": "Langues: {languages}", - "missing": "Quelque-chose manque-t-il dans cette liste ?", - "tell_us": "Dîtes-nous en plus !" + "languages": "Langues : {languages}", + "missing": "Quelque-chose manque-t-il dans cette liste ?", + "tell_us": "Dîtes-nous en plus !" }, "confirm": { "okay": "OK", @@ -675,7 +693,7 @@ }, "source_switch": { "live": "live", - "lose_changes": "Vos dernières modifications n'ont pas été sauvées. Si vous changez de serveur de carte, celles-ci seront perdues. Êtes-vous sûr de vouloir changer de serveur de carte ?", + "lose_changes": "Vos dernières modifications n'ont pas été sauvées. Si vous changez de serveur de carte, celles-ci seront perdues. Êtes-vous sûr de vouloir changer de serveur de carte ?", "dev": "dev" }, "version": { @@ -699,9 +717,9 @@ "untagged_area_tooltip": "Sélectionnez un type d'élément pour décrire cette surface.", "untagged_relation": "Relation sans attributs", "untagged_relation_tooltip": "Sélectionnez un type d’entité décrivant ce qu’est cette relation.", - "many_deletions": "Vous êtes en train de supprimer {n} éléments : {p} nœuds, {l} lignes, {a} polygones et {r} relations. En êtes-vous sûr ? Ils seront supprimés de la carte que tout le monde voit sur openstreetmap.org.", + "many_deletions": "Vous êtes en train de supprimer {n} éléments : {p} nœuds, {l} lignes, {a} polygones et {r} relations. En êtes-vous sûr ? Ils seront supprimés de la carte que tout le monde voit sur openstreetmap.org.", "tag_suggests_area": "Cet attribut {tag} suppose que cette ligne devrait être un polygone, or ce n'est pas le cas", - "deprecated_tags": "Attributs obsolètes : {tags}" + "deprecated_tags": "Attributs obsolètes : {tags}" }, "zoom": { "in": "Zoomer", @@ -710,15 +728,22 @@ "cannot_zoom": "Impossible de zoomer plus en arrière dans ce mode.", "full_screen": "Afficher/cacher le plein écran", "gpx": { - "local_layer": "Fichier local", + "local_layer": "Ajouter un fichier GPX", "drag_drop": "Glissez-déposez un fichier .gpx, .geojson ou .kml sur la page, ou cliquez sur le bouton de droite pour le rechercher dans votre ordinateur.", "zoom": "Zoomer sur la couche", "browse": "Sélectionnez un fichier" }, + "mvt": { + "local_layer": "Ajouter un fichier MVT", + "drag_drop": "Glissez-déposez un fichier .mvt ou .pbf sur la page ou cliquez sur le bouton à droite pour naviguer dans vos fichiers.", + "zoom": "Zoomer sur la couche", + "browse": "Sélectionner un fichier" + }, "streetside": { "tooltip": "Photos Streetside de Microsoft", "title": "Sucouche photo (Bing Streetside)", "report": "Signaler un problème relatif à la vie privée sur cette image", + "view_on_bing": "Consulter sur Bing Maps", "hires": "Haute résolution" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Voir cette image sur OpenStreetCam" }, + "note": { + "note": "Note", + "title": "Modifier la note", + "anonymous": "anonyme", + "closed": "(Fermée)", + "commentTitle": "Commentaires", + "newComment": "Nouveau commentaire", + "inputPlaceholder": "Saisissez un commentaire à partager avec d'autres utilisateurs.", + "close": "Fermer la note", + "open": "Ré-ouvrir la note", + "comment": "Commentaire", + "close_comment": "Commenter et fermer", + "open_comment": "Commenter et ré-ouvrir", + "report": "Signaler", + "new": "Nouvelle note", + "newDescription": "Décrivez le problème.", + "save": "Enregistrer la note", + "login": "Vous devez vous connecter pour modifier la note ou la commenter.", + "upload_explanation": "Vos commentaires seront visibles publiquement par les utilisateurs d'OpenStreetMap.", + "upload_explanation_with_user": "Vous commentaires en tant que {user} seront visibles publiquement par tous les utilisateurs d'OpenStreetMap." + }, "help": { "title": "Aide", "key": "H", @@ -748,7 +794,7 @@ "open_data_h": "Données libres", "open_data": "Les modifications que vous faites sur cette carte seront visibles par tous les utilisateurs d'OpenStreetMap. Vos modification peuvent se baser sur vos connaissances personnelles, des enquêtes de terrain, des images aériennes ou des photos prises dans la rue. Copier des informations de sources commerciales telles que Google Maps [is strictly forbidden] (https://www.openstreetmap.org/copyright).", "before_start_h": "Avant de commencer", - "before_start": "Vous devez maîtriser OpenStreetMap et cet éditeur avant de commencer à modifier. iD comprend un guide pour vous apprendre les bases de la modification d'OpenStreetMap. Cliquez sur « Commencer le tutoriel » sur cet écran pour suivre le guide - cela ne prend que 15 minutes environ.", + "before_start": "Vous devez maîtriser OpenStreetMap et cet éditeur avant de commencer à modifier. iD comprend un guide pour vous apprendre les bases de la modification d'OpenStreetMap. Cliquez sur « Commencer le tutoriel » sur cet écran pour suivre le guide - cela ne prend que 15 minutes environ.", "open_source_h": "Open source", "open_source": "L'éditeur iD est un projet collaboratif open source, et vous êtes en train d'utiliser la version {version}. Le code source est disponible [sur GitHub](https://github.com/openstreetmap/iD).", "open_source_help": "Vous pouvez contribuer à iD en [traduisant](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) ou en [déclarant des bugs](https://github.com/openstreetmap/iD/issues)." @@ -773,7 +819,7 @@ "undo_redo_h": "Annuler & Rétablir", "undo_redo": "Vos modifications sont enregistrées localement dans votre navigateur tant que vous ne les envoyez pas sur les serveurs d'OpenStreetMap. Vous pouvez annuler vos action en appuyant sur le bouton {undo} **Annuler** et les refaire en appuyant sur le bouton {redo} **Refaire**.", "save_h": "Sauvegarder", - "save": "Cliquez sur {save} **Enregistrer** pour envoyer vos modifications à OpenStreetMap. Enregistrez fréquemment !", + "save": "Cliquez sur {save} **Enregistrer** pour envoyer vos modifications à OpenStreetMap. Enregistrez fréquemment !", "save_validation": "Sur l'écran de sauvegarde vous pourrez revoir ce que vous avez fait. iD effectuera aussi des vérifications de base pour chercher des informations manquantes et peut vous faire des suggestions ou vous avertir si quelque chose n'a pas l'air correct.", "upload_h": "Téléverser", "upload": "Avant d'envoyer vous changements vous devez entrer un [commentaire sur l'ensemble de changements](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Ensuite cliquez sur **Envoyer** pour envoyer vous changements à OpenStreetMap où ils seront ajoutés à la carte et deviendront visibles pour tout le monde.", @@ -784,18 +830,18 @@ }, "feature_editor": { "title": "Éditeur d'élément", - "intro": "*L'éditeur d'élément* apparaît à coté de la carte et permet de voir et d'éditer les informations relatives à l'élément sélectionne", + "intro": "*L'éditeur d'élément* apparaît à coté de la carte et permet de voir et de modifier les informations relatives à l'élément sélectionné.", "definitions": "La première section indique le type d'élément. La seconde contient les *champs* qui indiquent les attributs de l'élément, comme son nom ou son adresse.", "type_h": "Type d'élément", "type": "Vous pouvez cliquer sur le type d'un élément pour le changer pour un autre type. Tout ce qui exist dans le monde réel peut être ajouter dans OpenStreetMap, Il y a donc de milliers de types possibles", "type_picker": "Le sélectionneur de type affiche les types d'éléments les plus fréquents, tels que les parcs, hôpitaux, restaurants, routes et bâtiments. Vous pouvez tout cherchez en tapant ce que vous voulez dans le champs de recherche. Vous pouvez aussi cliquer sur l'icône {inspect} **Info** à côté du type de l'élément pour en apprendre plus.", "fields_h": "Champs", - "fields_all_fields": "La section *Tous les champs* contient toutes les informations qui peuvent être éditées. Dans OpenStreetMap, tous les champs sont facultatifs. Vous pouvez toujours les laisser vides en cas de doute.", + "fields_all_fields": "La section « Tous les champs » contient toutes les informations qui peuvent être modifiées. Dans OpenStreetMap, tous les champs sont facultatifs. Vous pouvez toujours les laisser vides en cas de doute.", "fields_example": "Chaque type d’élément affichera des champs différents. Par exemple, une route peut afficher des champs pour le type de surface et la limitation de vitesse et un restaurant peut afficher des champs pour le type de nourriture servie et ses horaires d'ouverture.", - "fields_add_field": "Vous pouvez aussi cliquer sur le menu déroulant \"Ajouter un champ\" pour ajouter plus d'informations, comme une description, un lien Wikipédia, un accès handicapé, et cetera...", - "tags_h": "Tags", - "tags_all_tags": "En dessous de la partie avec les champs, vous pouvez développer la section « Tous les tags » pour modifier les *tags* OpenStreetMap de l’élément sélectionné. Chaque tag consiste en une *clef* et une *valeur*, des données qui définissent tous les éléments enregistrés dans OpenStreetMap.", - "tags_resources": "Vous aurez besoin d'un niveau de connaissance intermédiaire sur OpenStreetMap pour modifier les tags d'un élément. Vous devriez consulter des ressources comme le [Wiki d’OpenStreetMap](https://wiki.openstreetmap.org/wiki/Main_Page) ou [Taginfo](https://taginfo.openstreetmap.org/) pour en apprendre plus sur les pratiques de tagging acceptées dans OpenStreetMap." + "fields_add_field": "Vous pouvez aussi cliquer sur le menu déroulant « Ajouter un champ » pour ajouter plus d'informations, comme une description, un lien Wikipédia, un accès handicapé, et cetera…", + "tags_h": "Attributs", + "tags_all_tags": "En dessous de la partie avec les champs, vous pouvez développer la section « Tous les attributs » pour modifier les *attributs* OpenStreetMap de l’élément sélectionné. Chaque tag consiste en une *clef* et une *valeur*, des données qui définissent tous les éléments enregistrés dans OpenStreetMap.", + "tags_resources": "Vous aurez besoin d'un niveau de connaissance intermédiaire sur OpenStreetMap pour modifier les attributs d'un élément. Vous devriez consulter des ressources comme le [Wiki d’OpenStreetMap](https://wiki.openstreetmap.org/wiki/Main_Page) ou [Taginfo](https://taginfo.openstreetmap.org/) pour en apprendre plus sur les pratiques de tagging acceptées dans OpenStreetMap." }, "points": { "title": "Points", @@ -822,7 +868,7 @@ "connect_line_h": "Connecter des lignes", "connect_line": "Il est important que les routes soient connectées correctement pour la carte, et essentiel pour la navigation.", "connect_line_display": "Les connexions entre plusieurs routes sont matérialisées avec des cercles gris. Les points d'une ligne qui ne sont connectés à rien apparaissent comme des cercles blancs, plus grands.", - "connect_line_drag": "Pour connecter une ligne à un autre élément, faites glisser l'un des nœuds de la ligne vers cet élément jusqu'à ce qu'ils s'accrochent ensemble. Astuce: vous pouvez maintenir la touche `{alt}` enfoncée pour empêcher les nœuds de se connecter à d'autres éléments.", + "connect_line_drag": "Pour connecter une ligne à un autre élément, faites glisser l'un des nœuds de la ligne vers cet élément jusqu'à ce qu'ils s'accrochent ensemble. Astuce : vous pouvez maintenir la touche `{alt}` enfoncée pour empêcher les nœuds de se connecter à d'autres éléments.", "connect_line_tag": "Si le croisement a un feu de signalisation ou un passage pour piétons, vous pouvez l'ajouter en sélectionnant le nœud de connexion et en utilisant l'éditeur d'élément pour choisir le type d'élément correct.", "disconnect_line_h": "Séparer des lignes", "disconnect_line_command": "Pour déconnecter une route d'un autre élément, faites un clic droit {rightclick} sur le nœud de connexion et sélectionnez la commande **Déconnecter** {disconnect} dans le menu d'édition.", @@ -836,7 +882,7 @@ "areas": { "title": "Polygones", "intro": "Les *polygones* sont utilisés pour montrer les délimitations d'éléments comme des lacs, des bâtiments et des zones résidentielles. Les polygones doivent être dessinés le long du bord des éléments qu'ils représentent, par exemple autour du pied d'un bâtiment.", - "point_or_area_h": "Des points ou un polygone ?", + "point_or_area_h": "Des points ou un polygone ?", "point_or_area": "De nombreux éléments peuvent être représentés par des points ou des polygones. Vous devriez cartographier les bâtiments et les contours de propriétés avec des polygones lorsque c'est possible. Placez des points à l'intérieur d'un bâtiment pour représenter des entreprises, des équipements et d'autres éléments se trouvant à l'intérieur.", "add_area_h": "Ajouter des polygones", "add_area_command": "Pour ajouter un polygone, cliquez sur le bouton **Polygone** {area} de la barre d'outils au-dessus de la carte, ou pressez la touche `3`. Cela transformera le curseur de la souris en une croix.", @@ -854,41 +900,52 @@ "relations": { "title": "Relations", "intro": "Une *relation* est un élément spécial dans OpenStreetMap qui regroupe ensemble d'autres éléments. Les éléments qui appartiennent à une relation sont appelés *membres*, et chacun de ces membres peut avoir un *rôle* dans la relation.", - "edit_relation_h": "Éditer des Relations", - "edit_relation": "Au bas de l'éditeur d'éléments, vous pouvez développer la section \"Toutes les relations\" pour voir si l'élément sélectionné est membre d'une ou plusieurs relations. Vous pouvez alors cliquer sur la relation pour la sélectionner et l'éditer.", - "edit_relation_add": "Pour ajouter un élément à une relation, sélectionnez cet élément, puis cliquez sur le bouton d'ajout {plus} dans la section \"Toutes les relations\" de l'éditeur d'éléments. Vous pouvez choisir la relation dans une liste contenant les relations présentes aux environs, ou bien en créer une nouvelle avec l'option \"Nouvelle relation...\".", + "edit_relation_h": "Modifier des Relations", + "edit_relation": "Au bas de l'éditeur d'éléments, vous pouvez développer la section « Toutes les relations » pour voir si l'élément sélectionné est membre d'une ou plusieurs relations. Vous pouvez alors cliquer sur la relation pour la sélectionner et la modifier.", + "edit_relation_add": "Pour ajouter un élément à une relation, sélectionnez cet élément, puis cliquez sur le bouton d'ajout {plus} dans la section « Toutes les relations » de l'éditeur d'éléments. Vous pouvez choisir la relation dans une liste contenant les relations présentes aux environs, ou bien en créer une nouvelle avec l'option « Nouvelle relation… ».", "edit_relation_delete": "Vous pouvez également cliquer sur le bouton **Supprimer** {delete} pour supprimer un élément d'une relation. Si vous supprimez tous les éléments d'une relation, celle-ci sera automatiquement supprimée.", "maintain_relation_h": "Maintenir des Relations", - "maintain_relation": "La plupart du temps, iD maintient automatiquement les relations lorsque vous éditez.\nVous devez toutefois faire attention quand vous remplacez des éléments qui sont membres de relations. Par exemple, si vous supprimez la section d'une route et que vous en créez une nouvelle pour la remplacer, vous devez impérativement ajouter la nouvelle section aux mêmes relations que l'ancienne (itinéraires, interdictions de tourner, etc...).", + "maintain_relation": "La plupart du temps, iD maintient automatiquement les relations lors de l'édition.\nVous devez toutefois faire attention quand vous remplacez des éléments qui sont membres de relations. Par exemple, si vous supprimez la section d'une route et que vous en créez une nouvelle pour la remplacer, vous devez impérativement ajouter la nouvelle section aux mêmes relations que l'ancienne (itinéraires, interdictions de tourner, etc…).", "relation_types_h": "Types de Relation", "multipolygon_h": "Multipolygones", "multipolygon": "Une relation *multipolygone* est un groupe d'un ou plusieurs éléments *extérieurs* et d'un ou plusieurs éléments intérieurs. Les éléments extérieurs définissent les bords extérieurs du multipolygone, et les éléments intérieurs définissent les sous-polygones ou les trous à l'intérieur du multipolygone.", "multipolygon_create": "Pour créer un multipolygone, par exemple un bâtiment avec un trou au milieu, dessinez le bord externe comme une aire et le bord intérieur comme une ligne ou un autre type d'aire. Ensuite, `{shift}`+{leftclick} cliquez-gauche pour sélectionner les deux éléments, {rightclick} cliquez-droit pour ouvrir le menu d'édition et sélectionnez la commande {merge} **Fusionner**.", "multipolygon_merge": "La fusion de plusieurs lignes ou polygones créera une nouvelle relation multipolygone avec comme membres tous les polygones sélectionnés. iD choisira automatiquement les rôles intérieur et extérieur, en fonction des éléments contenus à l'intérieur d'autres éléments.", "turn_restriction_h": "Interdictions de tourner", - "turn_restriction": "Une relation *restriction de tourner* est un groupe formé de plusieurs segments de routes à une intersection. Elle comporte une route *depuis*, un nœud ou des routes *via*, et une route *vers*.", - "turn_restriction_field": "Pour éditer les restrictions de tourner, sélectionnez un nœud où se croisent au moins deux routes. L'éditeur d'élément affichera alors un champ spécial \"Interdictions de tourner\" contenant un modèle de l'intersection.", - "turn_restriction_editing": "Dans le champ \"restrictions de tourner\", cliquez pour sélectionner une route \"depuis\", et voyez s'il est autorisé ou non de tourner sur une ou plusieurs routes \"vers\". Vous pouvez cliquer sur l'icône de direction pour basculer la position entre autorisé et interdit. iD créera automatiquement les relations et mettra à jour les rôles selon votre saisie.", + "turn_restriction": "Une relation *interdiction de tourner* est un groupe formé de plusieurs segments de routes à une intersection. Elle comporte une route *depuis*, un nœud ou des routes *via*, et une route *vers*.", + "turn_restriction_field": "Pour modifier les interdictions de tourner, sélectionnez un nœud où se croisent au moins deux routes. L'éditeur d'élément affichera alors un champ spécial « Interdictions de tourner » contenant un modèle de l'intersection.", + "turn_restriction_editing": "Dans le champ « interdictions de tourner », cliquez pour sélectionner une route « depuis », et voyez s'il est autorisé ou non de tourner sur une ou plusieurs routes « vers ». Vous pouvez cliquer sur l'icône de direction pour basculer la position entre autorisé et interdit. iD créera automatiquement les relations et mettra à jour les rôles selon votre saisie.", "route_h": "Itinéraires", "route": "Une relation *itinéraire* est un groupe d'une ou plusieurs lignes formant ensemble un réseau, comme un itinéraire de bus, un itinéraire ferroviaire, ou un itinéraire routier.", - "route_add": "Pour ajouter un élément à une relation itinéraire, sélectionnez cet élément, puis cliquez sur le bouton d'ajout {plus} dans la section \"Toutes les relations\" de l'éditeur d'éléments. Vous pouvez choisir la relation parmi celles présentes aux environs, ou bien en créer une nouvelle.", + "route_add": "Pour ajouter un élément à une relation itinéraire, sélectionnez cet élément, puis cliquez sur le bouton d'ajout {plus} dans la section « Toutes les relations » de l'éditeur d'éléments. Vous pouvez choisir la relation parmi celles présentes aux environs, ou bien en créer une nouvelle.", "boundary_h": "Frontières", "boundary": "Une relation *frontière* est un groupe d'une ou plusieurs lignes formant ensemble une frontière administrative.", - "boundary_add": "Pour ajouter un élément à une relation frontière, sélectionnez cet élément, puis cliquez sur le bouton d'ajout {plus} dans la section \"Toutes les relations\" de l'éditeur d'éléments. Vous pouvez choisir la relation parmi celles présentes aux environs, ou bien en créer une nouvelle." + "boundary_add": "Pour ajouter un élément à une relation frontière, sélectionnez cet élément, puis cliquez sur le bouton d'ajout {plus} dans la section « Toutes les relations » de l'éditeur d'éléments. Vous pouvez choisir la relation parmi celles présentes aux environs, ou bien en créer une nouvelle." + }, + "notes": { + "title": "Notes", + "intro": "Les *notes* sont utiles pour alerter les autres utilisateurs qu'un élément a besoin de correction ou d'attention. Les notes marquent un emplacement spécifique sur la carte. Pour voir les notes existantes ou en ajouter une nouvelle, cliquez sur le panneau {data} **Données de carte** pour activer la couche des notes OpenStreetMap.", + "add_note_h": "Ajout de notes", + "add_note": "Pour ajouter une note, cliquez sur le bouton {note} **Note** dans la barre d'outils au dessus de la carte ou appuyez sur la touche raccourci `4`. Le curseur se ehangera en une croix. Pour placer la nouvelle note sur la carte, placez le curseur là où elle devrait se trouver puis faîtes un {leftclick} clic gauche ou appuyez sur la barre espace.", + "move_note": "Seules les nouvelles notes peuvent être repositionnées. Pour déplacer une note, placez votre curseur au-dessus puis enfoncez le {leftclick} bouton gauche de la souris et gardez-le enfoncé pendant que vous déplacez la note à son nouvel emplacement.", + "update_note_h": "Fermer, réouvrir et commenter", + "update_note": "On peut mettre à jour une note existante en la fermant, en la rouvrant ou en lui ajoutant un commentaire. Fermer la note indique que le problème a été résolu. La réouvrir indique que le problème de départ n'est pas résolu.", + "save_note_h": "Enregistrer ses notes", + "save_note": "Vous devez sfenregistrer chaque modification de note individuellement en cliquant sur les boutons sous les commentaires. Les modifications que vous apportez aux notes ne font **pas** partie des groupes de modifications que vous envoyez à OpenStreetMap." }, "imagery": { "title": "Fond de carte", "intro": "Le fond de carte qui apparaît sous les données est un élément important pour cartographier. Il peut s'agir de photos aériennes émanant de satellites, d'avions, et de drones, ou de cartes historiques scannées, ou encore de toute autre source de données libre.", "sources_h": "Sources des images", - "choosing": "Pour voir quelles sources sont disponibles pour éditer, cliquez sur le bouton **Paramètres du fond de carte** {layers} sur le côté de la carte.", - "sources": "Par défaut, une image satellite [Bing Maps](https://www.bing.com/maps/) est affichée en arrière-plan. Selon le lieu où vous éditez, d'autres images peuvent être disponibles. Certaines peuvent être plus récentes ou avec une meilleure résolution, si bien qu'il est utile de vérifier quelle est la meilleure image à utiliser pour cartographier.", + "choosing": "Pour voir quelles sources sont disponibles à l'édition, cliquez sur le bouton **Paramètres du fond de carte** {layers} sur le côté de la carte.", + "sources": "Par défaut, une image satellite [Bing Maps](https://www.bing.com/maps/) est affichée en arrière-plan. Selon le lieu que vous modifiez, d'autres images peuvent être disponibles. Certaines peuvent être plus récentes ou avec une meilleure résolution, si bien qu'il est utile de vérifier quelle est la meilleure image à utiliser pour cartographier.", "offsets_h": "Ajustement du fond de carte", - "offset": "L'imagerie est parfois légèrement décalée par rapport aux données précises de la carte. Si vous constatez que de nombreuses routes ou de nombreux bâtiments sont décalés par rapport au fond de carte, c'est peut-être que l'imagerie n'est pas correctement alignée. Plutôt que de déplacer à tort les éléments de la carte, vous pouvez ajuster le fond de carte en utilisant la section \"Ajuster le décalage du fond de carte\" en bas du panneau Paramètres du fond de carte.", + "offset": "L'imagerie est parfois légèrement décalée par rapport aux données précises de la carte. Si vous constatez que de nombreuses routes ou de nombreux bâtiments sont décalés par rapport au fond de carte, c'est peut-être que l'imagerie n'est pas correctement alignée. Plutôt que de déplacer à tort les éléments de la carte, vous pouvez ajuster le fond de carte en utilisant la section « Ajuster le décalage du fond de carte » en bas du panneau Paramètres du fond de carte.", "offset_change": "Cliquez sur les petits triangles pour ajuster finement le décalage de l'imagerie, ou maintenez enfoncé le bouton gauche de la souris et faites glisser l'image jusqu'à ce qu'elle soit correctement alignée." }, "streetlevel": { "title": "Photos de la rue", - "intro": "Les photos de la rue sont utiles pour cartographier la signalisation routière, les commerces, et d'autres détails que l'on ne peut pas voir sur l'imagerie aérienne. L'éditeur iD prend en charge les photos de la rue de [Mapillary](https://www.mapillary.com) et [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Les imageries au niveau de la rue sont utiles pour cartographier les panneaux de signalisation, les commerces et d'autres détails qu'on ne peut pas voir sur les images satellites ou aériennes. L'éditeur iD supporte les photos au niveau de la rue de [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) et [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Utiliser des photos de la rue.", "using": "Pour utiliser les photos de la rue, cliquez sur le bouton **Données cartographiques** {data} sur le bord de la carte. Cela permettra d'activer ou de désactiver les surcouches photographiques disponibles.", "photos": "Lorsque cela est activé, la couche photo montre une ligne entre les séquences de photo. Aux niveaux de zoom élevés, un cercle marque l'emplacement de chaque photo et aux zooms encore plus élevés, un cône indique la direction de l'appareil photo lorsque la photo a été prise.", @@ -905,28 +962,28 @@ }, "field": { "restrictions": { - "title": "Aide des restrictions de tourner", + "title": "Aide des interdictions de tourner", "about": { "title": "À propos", - "about": "Ce champ vous permet d'inspecter et de modifier les restrictions de tourner. Il affiche un modèle de l'intersection sélectionnée avec les routes connectées proches.", - "from_via_to": "Une restriction de tourner contient toujours: un **chemin DEPUIS**, un **chemin VERS**, et soit un **nœud VIA**, soit un ou plusieurs **chemins VIA**.", - "maxdist": "Le curseur \"{distField}\" contrôle la distance jusqu'à laquelle chercher des routes connectées supplémentaires.", - "maxvia": "Le curseur \"{viaField}\" ajuste le nombre de chemins via à inclure dans la recherche. (Astuce: plus c'est simple, mieux c'est)" + "about": "Ce champ vous permet d'inspecter et de modifier les interdictions de tourner. Il affiche un modèle de l'intersection sélectionnée avec les routes connectées proches.", + "from_via_to": "Une interdiction de tourner contient toujours : un **chemin DEPUIS**, un **chemin VERS**, et soit un **nœud VIA**, soit un ou plusieurs **chemins VIA**.", + "maxdist": "Le curseur « {distField} » contrôle la distance jusqu'à laquelle chercher des routes connectées supplémentaires.", + "maxvia": "Le curseur « {viaField} » ajuste le nombre de chemins via à inclure dans la recherche. (Astuce : plus c'est simple, mieux c'est)" }, "inspecting": { "title": "Inspecter", - "about": "Survolez avec le curseur un segment **DEPUIS** pour voir s'il est soumis à des restrictions de tourner. Toutes les destinations possibles **VERS** seront ombrées et montreront si une restriction existe.", + "about": "Survolez avec le curseur un segment **DEPUIS** pour voir s'il est soumis à des interdictions de tourner. Toutes les destinations possibles **VERS** seront ombrées et montreront si une restriction existe.", "from_shadow": "{fromShadow} **DEPUIS le segment**", "allow_shadow": "{allowShadow} **VERS autorisé**", "restrict_shadow": "{restrictShadow} **VERS interdit**", "only_shadow": "{onlyShadow} **VERS uniquement**", - "restricted": "\"Interdit\" signifie qu'il y a une restriction de direction, par exemple \"Interdit de tourner à gauche\".", - "only": "\"Uniquement\" signifie qu'un véhicule empruntant ce chemin n'a pas d'autre choix de direction, par exemple \"Direction obligatoire\"." + "restricted": "« Interdit » signifie qu'il y a une interdiction de tourner, par exemple « Interdit de tourner à gauche ».", + "only": "« Uniquement » signifie qu'un véhicule empruntant ce chemin n'a pas d'autre choix de direction, par exemple « Direction obligatoire »." }, "modifying": { "title": "Modifier", - "about": "Pour modifier les restrictions de tourner, commencez par cliquer sur l'un des segments **DEPUIS** pour le sélectionner. Celui-ci va clignoter, et toutes les directions possibles **VERS** vont apparaître avec un symbole.", - "indicators": "Puis cliquez sur un symbole de direction pour le basculer entre \"autorisé\", \"interdit\", et \"uniquement\".", + "about": "Pour modifier les interdictions de tourner, commencez par cliquer sur l'un des segments **DEPUIS** pour le sélectionner. Celui-ci va clignoter, et toutes les directions possibles **VERS** vont apparaître avec un symbole.", + "indicators": "Puis cliquez sur un symbole de direction pour le basculer entre « autorisé », « interdit », et « uniquement ».", "allow_turn": "{allowTurn} **VERS autorisé**", "restrict_turn": "{restrictTurn} **VERS interdit**", "only_turn": "{onlyTurn} **VERS uniquement**" @@ -935,9 +992,9 @@ "title": "Astuces", "simple": "**Privilégiez les restrictions simples plutôt que les complexes.**", "simple_example": "Par exemple, évitez de créer une restriction par un chemin via si un simple nœud via est suffisant.", - "indirect": "**Certaines restrictions affichent le texte \"(indirect)\" et sont dessinées en transparence.**", - "indirect_example": "Ces restrictions existent à cause d'une autre restriction proche. Par exemple, une restriction \"Obligation d'aller tout droit\" créera indirectement des restrictions \"Interdiction de tourner\" pour tous les autres chemins de l'intersection.", - "indirect_noedit": "Vous ne pouvez pas éditer les restrictions indirectes. À la place, éditez la restriction directe la plus proche." + "indirect": "**Certaines interdictions affichent le texte « (indirect) » et sont dessinées en transparence.**", + "indirect_example": "Ces interdictions existent à cause d'une autre restriction proche. Par exemple, une restriction « Obligation d'aller tout droit » créera indirectement des restrictions « Interdiction de tourner » pour tous les autres chemins de l'intersection.", + "indirect_noedit": "Vous ne pouvez pas modifier les interdictions indirectes. À la place, modifiez la restriction directe la plus proche." } } } @@ -1077,8 +1134,8 @@ "words": "Cette visite guidée va vous présenter de nouveaux mots et concepts. Lorsque ce sera le cas, ils seront en *italique*.", "mouse": "Vous pouvez utiliser n'importe quel périphérique de saisie pour modifier la carte, mais cette visite guidée part du principe que vous avez une souris avec des boutons gauche et droit. **Si vous voulez connecter une souris, faites-le maintenant puis cliquez sur OK.** ", "leftclick": "Lorsque cette visite guidée vous demande de cliquer ou de double-cliquer, cela veut dire avec le bouton de gauche. Sur un pavé tactile, cela peut correspondre à un clic simple ou à taper avec un doigt. **Faites {num} clics gauche.**", - "rightclick": "Parfois, il faudra effectuer un clic droit. Cela peut aussi être un clic avec la touche Ctrl, ou taper avec deux doigts sur un pavé tactile. Le clavier peut même avoir une touche \"menu\" qui fonctionne comme un clic droit. **Faites {num} clics droits.**", - "chapters": "Parfait, continuons ! Vous pouvez utiliser le bandeau ci-dessous pour recommencer une section en cas de problème ou choisir une autre section. C'est parti ! **Cliquez sur \"{next}\" pour continuer.**" + "rightclick": "Parfois, il faudra effectuer un clic droit. Cela peut aussi être un clic avec la touche Ctrl, ou taper avec deux doigts sur un pavé tactile. Le clavier peut même avoir une touche « menu » qui fonctionne comme un clic droit. **Faites {num} clics droits.**", + "chapters": "Parfait, continuons ! Vous pouvez utiliser le bandeau ci-dessous pour recommencer une section en cas de problème ou choisir une autre section. C'est parti ! **Cliquez sur « {next} » pour continuer.**" }, "navigation": { "title": "Navigation", @@ -1093,42 +1150,42 @@ "preset_townhall": "La partie supérieure de l'éditeur d'élément affiche le type d’élément. Ce point est de type {preset}.", "fields_townhall": "La partie intermédiaire de l'éditeur d'élément contient les attributs de l'élément, comme son nom ou son adresse.", "close_townhall": "**Fermez l'éditeur d'élément avec la touche d'échappement ou en cliquant sur le bouton {button} dans le coin supérieur.**", - "search_street": "Vous pouvez chercher des éléments dans la vue courante ou dans le monde entier. **Cherchez \"{name}\"**", + "search_street": "Vous pouvez chercher des éléments dans la vue courante ou dans le monde entier. **Cherchez « {name} »**", "choose_street": "**Choisissez la {name} dans la liste pour la sélectionner.**", "selected_street": "Bien ! La *{name}* est maintenant sélectionnée.", - "editor_street": "Les champs affichés pour une rue sont différents que ceux pour une mairie / hôtel de ville.{br}Pour la rue sélectionnée, l'éditeur d'élément affiche des champs comme \"{field1}\" et \"{field2}\". **Fermez l'éditeur de fonctionnalité avec la touche d'échappement ou en cliquant sur le bouton {button}**", - "play": "Essayez de déplacer la carte et de sélectionner d'autres éléments pour voir les types d'objets qui peuvent être ajoutés à OpenStreetMap. **Pour passer au chapitre suivant, cliquez sur \"{next}\".**" + "editor_street": "Les champs affichés pour une rue sont différents que ceux pour une mairie / hôtel de ville.{br}Pour la rue sélectionnée, l'éditeur d'élément affiche des champs comme « {field1} » et « {field2} ». **Fermez l'éditeur de fonctionnalité avec la touche d'échappement ou en cliquant sur le bouton {button}**", + "play": "Essayez de déplacer la carte et de sélectionner d'autres éléments pour voir les types d'objets qui peuvent être ajoutés à OpenStreetMap. **Pour passer au chapitre suivant, cliquez sur « {next} ».**" }, "points": { "title": "Points", "add_point": "Les *points* peuvent être utilisés pour représenter des éléments comme des magasins, restaurants et monuments.{br}Ils marquent une position précise et décrivent ce qu'il s'y trouve. **Cliquez sur le bouton {button} Point pour ajouter un nouveau point.**", "place_point": "Pour placer un nouveau point sur la carte, placez le curseur de la souris à l'endroit désiré, puis faites un clic gauche ou appuyez sur la barre d'espace. **Déplacez le curseur sur ce bâtiment, puis faites un clic gauche ou appuyez sur la barre d'espace.**", - "search_cafe": "Beaucoup d'éléments peuvent être représentés, chacun par un point. Le point que vous venez d'ajouter est un café. **Cherchez \"{preset}\"**", - "choose_cafe": "**Choisissez \"{preset}\" dans la liste.**", + "search_cafe": "Beaucoup d'éléments peuvent être représentés, chacun par un point. Le point que vous venez d'ajouter est un café. **Cherchez « {preset} »**", + "choose_cafe": "**Choisissez « {preset} » dans la liste.**", "feature_editor": "Le point est maintenant marqué comme un café. En utilisant l'éditeur d'élément, vous pouvez ajouter d'autres informations sur ce café.", "add_name": "Dans OpenStreetMap, tous les champs sont optionnels. En cas de doute ou pour une partie inconnue, un champ peut être laissé vide.{br}Supposons que vous connaissiez ce café et son nom. **Ajoutez un nom pour le café.**", "add_close": "L'éditeur d'élément se rappellera automatiquement de toutes vos modifications. **Après avoir ajouté le nom, appuyez sur la touche d'échappement, Entrée ou cliquez sur le bouton {button} pour fermer l'éditeur d'élément.**", - "reselect": "Souvent des points existent déjà mais ils peuvent parfois contenir des erreurs ou être incomplets. Vous pouvez éditer ces points. **Cliquez sur le café que vous venez de créer.**", + "reselect": "Souvent des points existent déjà mais ils peuvent parfois contenir des erreurs ou être incomplets. Vous pouvez modifier ces points. **Cliquez sur le café que vous venez de créer.**", "update": "Ajoutons des détails sur ce café. Vous pouvez modifier le nom, préciser le type de cuisine ou son adresse. **Modifiez les informations du café**", "update_close": "**Lorsque vous avez terminé vos modifications, appuyez sur la touche d'échappement ou Entrée ou cliquez sur le bouton {button} pour fermer l'éditeur d'élément.**", "rightclick": "Vous pouvez effectuer un clic droit sur un élément pour voir le *menu d'édition*, qui fournit une liste d'opérations disponibles. **Effectuer un clic droit pour sélectionner le point créé et afficher son menu d'édition.**", "delete": "Il est possible de supprimer des éléments qui n'existent pas réellement.{br}Supprimer un élément d'OpenStreetMap le retirera de la carte pour tout le monde, il faut donc être sûr de la disparition effective de l'objet réel avant de supprimer l'élément correspondant. **Cliquez sur le bouton {button} pour supprimer le point.**", "undo": "Vous pouvez à tout moment annuler les dernières modifications tant que rien n'a été sauvegardé sur OpenStreetMap. **Cliquez sur le bouton {button} pour annuler la suppression du point et le faire revenir.**", - "play": "Maintenant que vous savez comment créer et éditer des points, vous pouvez vous entraîner avec quelques points supplémentaires ! **Pour passer au chapitre suivant, cliquez sur \"{next}\".**" + "play": "Maintenant que vous savez comment créer et modifier des points, vous pouvez vous entraîner avec quelques points supplémentaires ! **Pour passer au chapitre suivant, cliquez sur « {next} ».**" }, "areas": { "title": "Polygones", "add_playground": "Les *Polygones* sont utilisés pour montrer les limites d'éléments comme les lacs, les bâtiments, et les zones résidentielles. {br}Ils peuvent aussi être utilisés pour cartographier finement des éléments représentés normalement par des points. **Cliquez sur le bouton Polygone {button} pour ajouter un nouveau polygone.**", "start_playground": "Ajoutons une aire de jeu pour enfant sur la carte en dessinant un polygone. Les polygones sont dessinés en plaçant des *nœuds* pour définir les bords de l'élément. **Cliquez ou appuyez sur la barre d'espace pour placer le premier nœud sur l'un des angles de l'aire de jeu.**", - "continue_playground": "Continuez à dessiner le polygone en plaçant d'autres nœuds le long de l'aire de jeu. Vous pouvez connecter le polygone au chemin piéton existant. {br} Astuce : Vous pouvez maintenir la touche {Alt} pour éviter aux nœuds de se connecter à d'autres éléments. ** continuez à dessiner le polygone de l'aire de jeux **", + "continue_playground": "Continuez à dessiner le polygone en plaçant d'autres nœuds le long de l'aire de jeu. Vous pouvez connecter le polygone au chemin piéton existant. {br} Astuce : Vous pouvez maintenir la touche {Alt} pour éviter aux nœuds de se connecter à d'autres éléments. ** continuez à dessiner le polygone de l'aire de jeux **", "finish_playground": "Terminez le polygone avec la touche Entrée ou en cliquant une nouvelle fois sur son premier ou son dernier nœud. **Terminez le polygone d'aire de jeu.**", - "search_playground": "**Cherchez \"{preset}\".**", - "choose_playground": "**Choisissez \"{preset}\" dans la liste.**", + "search_playground": "**Cherchez « {preset} ».**", + "choose_playground": "**Choisissez « {preset} » dans la liste.**", "add_field": "L'aire de jeu n'a pas de nom officiel, donc ce champ sera laissé vide.{br}À la place, ajoutons des détails additionnels dans le champ Description. **Ouvrez la liste Ajouter champ.**", - "choose_field": "**Choisissez \"{field}\" dans la liste.**", + "choose_field": "**Choisissez « {field} » dans la liste.**", "retry_add_field": "Vous n'avez pas sélectionné le champ {field}. Essayez encore.", "describe_playground": "**Ajoutez une description, puis cliquez le bouton {button} pour fermer l'éditeur d'éléments.**", - "play": "Bravo ! Essayez de dessiner quelques polygones et surfaces supplémentaires et regardez d'autres types d'éléments que vous pouvez ajouter à OpenStreetMap. **Pour passer au chapitre suivant, cliquez sur \"{next}\".**" + "play": "Bravo ! Essayez de dessiner quelques polygones et surfaces supplémentaires et regardez d'autres types d'éléments que vous pouvez ajouter à OpenStreetMap. **Pour passer au chapitre suivant, cliquez sur « {next} ».**" }, "lines": { "title": "Lignes", @@ -1137,7 +1194,7 @@ "intersect": "Cliquez, ou appuyez sur la barre d'espace, pour ajouter de nouveaux points à cette ligne.{br}Les routes font parties d'un réseau. C'est le cas également pour de nombreux autres types de lignes. Il est important que ces lignes soit connectées correctement pour les applications de navigation. **Cliquez sur la ligne {name} pour créer une intersection connectant les 2 lignes.**", "retry_intersect": "La nouvelle route doit croiser la ligne {name}. Essayez à nouveau !", "continue_line": "Continuez de tracer la ligne de la nouvelle route. Vous pouvez également déplacer la carte et zoomer si nécessaire.{br}Quand vous avez fini de tracer, cliquez à nouveau sur le dernier nœud. **Terminez de tracer la route.**", - "choose_category_road": "**Choisissez \"{category}\" dans la liste**", + "choose_category_road": "**Choisissez « {category} » dans la liste**", "choose_preset_residential": "Il existe de nombreux types de routes, mais celle-ci est une route résidentielle. **Choisissez le type {preset}.**", "retry_preset_residential": "Vous n'avez pas sélectionné le type {preset}. **Cliquez ici pour choisir à nouveau**", "name_road": "**Donnez un nom à cette route, puis appuyez sur la touche d'échappement, Entrée, ou cliquez sur le bouton {button} pour fermer l'éditeur d'objet.**", @@ -1158,7 +1215,7 @@ "multi_rightclick": "Bien ! Les deux lignes à supprimer sont maintenant sélectionnées. **Faites un clic droit sur l'une des lignes pour afficher le menu d'édition.**", "multi_delete": "**Cliquez sur le bouton {button} pour supprimer les lignes en trop.**", "retry_delete": "Vous n'avez pas cliqué sur le bouton Effacer. Réessayez.", - "play": "Bravo ! Utilisez ce que vous avez appris dans ce chapitre pour vous entraîner à modifier d'autres lignes. **Pour passer au chapitre suivant, cliquez sur \"{next}\".**" + "play": "Bravo ! Utilisez ce que vous avez appris dans ce chapitre pour vous entraîner à modifier d'autres lignes. **Pour passer au chapitre suivant, cliquez sur « {next} ».**" }, "buildings": { "title": "Bâtiments", @@ -1166,8 +1223,8 @@ "start_building": "Ajoutons cette maison à la carte en dessinant ses contours.{br}Les bâtiments doivent être dessinés de la façon la plus précise possible en suivant leur forme. **Cliquez ou appuyez sur la barre d'espace pour placer un nœud de départ sur l'un des coins du bâtiment.**", "continue_building": "Ajoutez d'autres nœuds pour tracer le contour du bâtiment. Rappelez-vous que vous pouvez zoomer pour voir plus de détails. {br}Terminez le bâtiment en appuyant sur Entrée, ou en cliquant sur le premier ou le dernier nœud. **Terminez le tracé du bâtiment.**", "retry_building": "Quelques difficultés pour placer les points aux coins du bâtiment ? Réessayez !", - "choose_category_building": "**Choisissez \"{category}\" dans la liste.**", - "choose_preset_house": "Les types de bâtiments possibles sont très variés, mais celui-ci est une maison.{br}Lorsque vous avez un doute, choisissez simplement le type générique \"Bâtiment\". **Choisissez le type \"{preset}\"**", + "choose_category_building": "**Choisissez « {category} » dans la liste.**", + "choose_preset_house": "Les types de bâtiments possibles sont très variés, mais celui-ci est une maison.{br}Lorsque vous avez un doute, choisissez simplement le type générique « Bâtiment ». **Choisissez le type « {preset} »**", "close": "**Appuyez sur la touche d'échappement ou cliquez le bouton {button} pour fermer l'éditeur d'objet.**", "rightclick_building": "**Faites un clic droit pour sélectionner le bâtiment que vous avez créé et afficher le menu d'édition.**", "square_building": "La maison sera encore mieux tracée si les coins sont des angles droits. **Cliquez sur le bouton {button} pour ajuster automatiquement la forme du bâtiment avec des angles droits.**", @@ -1176,16 +1233,16 @@ "add_tank": "Nous allons tracer ce réservoir rond. **Cliquez sur le bouton {button} Polygone pour ajouter un nouveau polygone.**", "start_tank": "Comment tracer un cercle parfait ? Commencez par un polygone simple, avec seulement quelques nœuds bien placés sur le contour. **Cliquez ou appuyez sur la barre d'espace pour ajouter le premier nœud sur le contour du réservoir.**", "continue_tank": "Ajoutez quelques nœuds supplémentaires le long du bord. Le cercle sera créé à l'extérieur des nœuds que vous dessinez.{br}Terminez le polygone en appuyant sur Entrée ou en cliquant à nouveau sur le premier ou le dernier nœud. **Terminez de tracer le réservoir.**", - "search_tank": "**Cherchez \"{preset}\"**", - "choose_tank": "**Choisissez \"{preset}\" dans la liste.**", + "search_tank": "**Cherchez « {preset} »**", + "choose_tank": "**Choisissez « {preset} » dans la liste.**", "rightclick_tank": "**Faites un clic droit pour sélectionner le polygone du réservoir que vous avez créé et afficher le menu d'édition.**", "circle_tank": "**Cliquez sur le bouton {button} pour ajuster la forme du réservoir et former automatiquement un cercle.**", "retry_circle": "Vous n'avez pas cliqué sur le bouton Arrondir / rendre circulaire. Réessayez.", - "play": "Bravo ! Entraînez-vous à tracer quelques bâtiments supplémentaires, et essayez quelques-unes des autres commandes du menu d'édition. **Pour passer au chapitre suivant, cliquez sur \"{next}\".**" + "play": "Bravo ! Entraînez-vous à tracer quelques bâtiments supplémentaires, et essayez quelques-unes des autres commandes du menu d'édition. **Pour passer au chapitre suivant, cliquez sur « {next} ».**" }, "startediting": { "title": "Sortir du tutoriel et contribuer", - "help": "Vous êtes maintenant prêt pour contribuer à OpenStreetMap !{br}Vous pouvez recommencer ce tutorial à tout moment ou lire plus de documentation en cliquant sur le bouton Aide {button} ou en appuyant sur la touche '{key}'.", + "help": "Vous êtes maintenant prêt pour contribuer à OpenStreetMap !{br}Vous pouvez recommencer ce tutoriel à tout moment ou lire plus de documentation en cliquant sur le bouton Aide {button} ou en appuyant sur la touche « {key} ».", "shortcuts": "Vous pouvez voir une liste des commandes avec leurs raccourcis claviers en appuyant sur la touche '{key}'.", "save": "N'oubliez pas de sauver régulièrement vos modifications !", "start": "Commencer à cartographier !" @@ -1270,7 +1327,8 @@ "add_point": "Mode 'Ajouter un point'", "add_line": "Mode 'Ajouter une ligne'", "add_area": "Mode 'Ajouter un polygone'", - "place_point": "Placer un point", + "add_note": "Mode 'Ajouter une note'", + "place_point": "Placer un point ou une note", "disable_snap": "Désactiver l'attraction des points à proximité", "stop_line": "Terminer de tracer une ligne ou un polygone" }, @@ -1279,6 +1337,7 @@ "continue_line": "Reprendre le tracé d'une ligne à partir du point sélectionné", "merge": "Fusionner les éléments sélectionnés", "disconnect": "Déconnecter les éléments au nœud sélectionné", + "detach_node": "Séparer le nœud choisi de ses chemins ou polygones parents", "split": "Couper une ligne en deux au nœud sélectionné", "reverse": "Inverser une ligne", "move": "Déplacer les éléments sélectionnés", @@ -1572,6 +1631,9 @@ "board_type": { "label": "Type" }, + "booth": { + "label": "Type de cabine" + }, "boules": { "label": "Type" }, @@ -1620,6 +1682,9 @@ "label": "Capacité", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Dépôt" + }, "castle_type": { "label": "Type" }, @@ -1968,12 +2033,12 @@ "horse_scale": { "label": "Difficulté à cheval", "options": { - "common": "Facile : pas de problème ou de difficulté. (par défaut)", - "critical": "Limite : passable uniquement pour des cavaliers et des chevaux expérimentés. Obstacles majeurs. Les ponts devraient être examinés avec attention.", - "dangerous": "Dangereux : passable uniquement pour des cavaliers et des chevaux très expérimentés et seulement par beau temps. Descendre du cheval.", - "demanding": "Utiliser avec prudence : voie inégale, passages difficiles occasionnels.", - "difficult": "Difficile : voie étroite et exposée. Peut contenir des obstacles par dessus lesquels passer et des passages étroits.", - "impossible": "Impossible : Vois ou pont impossible à franchir pour les chevaux. Trop étroit, support insuffisant, obstacles comme des échelles. Danger de mort." + "common": "Facile : pas de problème ou de difficulté. (par défaut)", + "critical": "Limite : passable uniquement pour des cavaliers et des chevaux expérimentés. Obstacles majeurs. Les ponts devraient être examinés avec attention.", + "dangerous": "Dangereux : passable uniquement pour des cavaliers et des chevaux très expérimentés et seulement par beau temps. Descendre du cheval.", + "demanding": "Utiliser avec prudence : voie inégale, passages difficiles occasionnels.", + "difficult": "Difficile : voie étroite et exposée. Peut contenir des obstacles par dessus lesquels passer et des passages étroits.", + "impossible": "Impossible : Voie ou pont impossible à franchir pour les chevaux. Trop étroit, support insuffisant, obstacles comme des échelles. Danger de mort." }, "placeholder": "Difficile, Dangereux..." }, @@ -2145,13 +2210,13 @@ "mtb/scale": { "label": "Difficulté VTT", "options": { - "0": "0 : Gravier/terre battue, grandes courbes, pas d'obstacles", - "1": "1 : Sol parfois meuble, courbes grandes à sérrées, petits obstacles", - "2": "2 : Sol souvent meuble, épingles à cheveux faciles, petits sauts", - "3": "3 : Revêtement glissant, épingles serrées, grosses ruptures de pente ", - "4": "4 : Revêtement avec des rochers, des épingles à cheveux dangereuses", - "5": "5 : Difficulté maximale, champs de blocs, glissements de terrain", - "6": "6 : Non praticable, ou seulement par les meilleurs vététistes" + "0": "0 : Gravier/terre battue, grandes courbes, pas d'obstacles", + "1": "1 : Sol parfois meuble, courbes grandes à sérrées, petits obstacles", + "2": "2 : Sol souvent meuble, épingles à cheveux faciles, petits sauts", + "3": "3 : Revêtement glissant, épingles serrées, grosses ruptures de pente ", + "4": "4 : Revêtement avec des rochers, des épingles à cheveux dangereuses", + "5": "5 : Difficulté maximale, champs de blocs, glissements de terrain", + "6": "6 : Non praticable, ou seulement par les meilleurs vététistes" }, "placeholder": "0, 1, 2, 3..." }, @@ -2169,12 +2234,12 @@ "mtb/scale/uphill": { "label": "Difficulté VTT en montée", "options": { - "0": "0 : Inclinaison < 10 % , sol compact, pas d'obstacles", - "1": "1 : Inclinaison < 15 %, sol compact, quelques petits obstacles", - "2": "2 : Inclinaison < 20 %, revêtement stable, pierres/racines", - "3": "3 : Inclinaison < 25 %, revêtement variable, pierres/branches", - "4": "4 : Inclinaison < 30 %, conditions difficiles, rochers/branches", - "5": "5 : Abrupt, le vélo doit généralement être porté ou poussé" + "0": "0 : Inclinaison < 10 % , sol compact, pas d'obstacles", + "1": "1 : Inclinaison < 15 %, sol compact, quelques petits obstacles", + "2": "2 : Inclinaison < 20 %, revêtement stable, pierres/racines", + "3": "3 : Inclinaison < 25 %, revêtement variable, pierres/branches", + "4": "4 : Inclinaison < 30 %, conditions difficiles, rochers/branches", + "5": "5 : Abrupt, le vélo doit généralement être porté ou poussé" }, "placeholder": "0, 1, 2, 3..." }, @@ -2233,7 +2298,7 @@ "alternating": "En alternance", "no": "Non", "reversible": "Réversible", - "undefined": "Par défaut : Non", + "undefined": "Par défaut : Non", "yes": "Oui" } }, @@ -2243,7 +2308,7 @@ "alternating": "En alternance", "no": "Non", "reversible": "Réversible", - "undefined": "Par défaut : Oui", + "undefined": "Par défaut : Oui", "yes": "Oui" } }, @@ -2275,6 +2340,9 @@ "underground": "Souterrain" } }, + "passenger_information_display": { + "label": "Affichage d'informations aux voyageurs" + }, "payment_multi": { "label": "Types de paiement" }, @@ -2439,12 +2507,12 @@ "sac_scale": { "label": "Difficulté de la randonnée", "options": { - "alpine_hiking": "T4 : randonnée alpine", - "demanding_alpine_hiking": "T5 : randonnée alpine exigeante", - "demanding_mountain_hiking": "T3 : randonnée de montagne exigeante", - "difficult_alpine_hiking": "T6 : randonnée alpine difficile", - "hiking": "T1 : randonnée", - "mountain_hiking": "T2 : randonnée de montagne" + "alpine_hiking": "T4 : randonnée alpine", + "demanding_alpine_hiking": "T5 : randonnée alpine exigeante", + "demanding_mountain_hiking": "T3 : randonnée de montagne exigeante", + "difficult_alpine_hiking": "T6 : randonnée alpine difficile", + "hiking": "T1 : randonnée", + "mountain_hiking": "T2 : randonnée de montagne" }, "placeholder": "Randonnée de montagne, randonnée alpine…" }, @@ -2507,10 +2575,13 @@ "site": { "label": "Type de site" }, + "site_type": { + "label": "Type de Site" + }, "smoking": { "label": "Fumeur", "options": { - "dedicated": "Réservé aux fumeurs (ex. : club de fumeurs)", + "dedicated": "Réservé aux fumeurs (ex. : club de fumeurs)", "isolated": "Zone non-fumeur et fumeur dans des salles réservées, isolées physiquement", "no": "Interdiction de fumer", "outside": "Autorisé en extérieur", @@ -2522,14 +2593,14 @@ "smoothness": { "label": "Régularité du sol, aptitude à rouler sur la surface", "options": { - "bad": "À roues, robuste : VTT, voiture, pousse-pousse", - "excellent": "À roulettes : rollers, patins, planche à roulettes", - "good": "À roues fines : vélo de course", + "bad": "À roues, robuste : VTT, voiture, pousse-pousse", + "excellent": "À roulettes : rollers, patins, planche à roulettes", + "good": "À roues fines : vélo de course", "horrible": "Véhicule tout-terrain lourd", "impassable": "Infranchissable / pas de véhicules à roues", - "intermediate": "À roues : vélo de ville, fauteuil roulant, voiture avec faible garde au sol", + "intermediate": "À roues : vélo de ville, fauteuil roulant, voiture avec faible garde au sol", "very_bad": "Véhicule à garde au sol élevée, véhicule tout-terrain léger", - "very_horrible": "Véhicule spécifique tout-terrain : tracteur, 4x4" + "very_horrible": "Véhicule spécifique tout-terrain : tracteur, 4x4" }, "placeholder": "Roulettes, roues, tout-terrain, …" }, @@ -2614,7 +2685,7 @@ "options": { "ALPR": "Lecture automatique de plaque d'immatriculation", "camera": "Caméra de surveillance", - "guard": "Humain : gardien, vigile" + "guard": "Humain : gardien, vigile" } }, "surveillance/zone": { @@ -2700,12 +2771,12 @@ "trail_visibility": { "label": "Visibilité du sentier", "options": { - "bad": "Mauvais : pas de balisage, sentier parfois non visible", - "excellent": "Excellent : chemin clairement identifiable ou balisage fréquent", - "good": "Bon : balisage globalement visible", - "horrible": "Horrible : sentier souvent non visible, nécessite de s'orienter", - "intermediate": "Intermédiaire : peu de balisage, sentier identifiable", - "no": "Non : pas de sentier visible, nécessite de bonnes compétences d'orientation" + "bad": "Mauvais : pas de balisage, sentier parfois non visible", + "excellent": "Excellent : chemin clairement identifiable ou balisage fréquent", + "good": "Bon : balisage globalement visible", + "horrible": "Horrible : sentier souvent non visible, nécessite de s'orienter", + "intermediate": "Intermédiaire : peu de balisage, sentier identifiable", + "no": "Non : pas de sentier visible, nécessite de bonnes compétences d'orientation" }, "placeholder": "Excellent, bon, mauvais…" }, @@ -3975,7 +4046,8 @@ "name": "Accessible aux services d'urgences" }, "emergency/fire_alarm": { - "name": "Boîte d'alarme incendie" + "name": "Boîte d'alarme incendie", + "terms": "Alarme, incendie, boîte, feu, sécurité" }, "emergency/fire_extinguisher": { "name": "Extincteur d'incendie", @@ -4437,7 +4509,7 @@ }, "landuse/farmland": { "name": "Zone agricole", - "terms": "Terre agricole : cultures et élevage" + "terms": "Terre agricole : cultures et élevage" }, "landuse/farmyard": { "name": "Cour de ferme", @@ -4915,7 +4987,7 @@ }, "man_made/storage_tank": { "name": "Réservoir de stockage", - "terms": "Silo de stockage" + "terms": "Silo de stockage,réservoir,citerne" }, "man_made/surveillance": { "name": "Caméra de surveillance", @@ -6159,7 +6231,7 @@ }, "tourism/artwork": { "name": "Œuvre d'art", - "terms": "Œuvre d'art,Œuvre artistique,statue,peinture,sculpture,fresque,mosaïque" + "terms": "Œuvre d'art,Œuvre artistique,statue,peinture,sculpture,fresque,mosaïque,graffiti" }, "tourism/attraction": { "name": "Attraction touristique", @@ -6517,6 +6589,7 @@ "attribution": { "text": "Termes & commentaires" }, + "description": "DigitalGlobe-Standard est un ensemble organisé d'images, fournies par Landsat, couvrant 86% de la surface de la Terre, avec une résolution de 30-60cm lorsque disponible. L'âge moyen de ces images est 2,31 ans, avec certaines régions mises à jour 2 fois par an.", "name": "Images DigitalGlobe standard" }, "DigitalGlobe-Standard-vintage": { @@ -7339,6 +7412,10 @@ "description": "Cartographes et utilisateurs d'OpenStreetMap autour de Portland, ME", "extendedDescription": "Maptime est, plutôt littéralement, l'heure de cartographier. Notre mission est d'ouvrir les portes des possibilités cartographiques à tous ceux qui sont intéressés par la création d'un temps et d'un espace collaboratif d'apprentissage, d'exploration et de création de cartes avec des outils et des technologies de cartographie." }, + "us-ma-mailinglist": { + "name": "Liste de diffusion talk-us-massachusetts", + "description": "Il s'agit de la liste de diffusion pour la communauté du Massachusetts d'OSM" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Améliorez OpenStreetMap dans la région de Cleveland", @@ -7367,6 +7444,11 @@ "name": "OpenStreetMap NYC", "description": "Cartographes et utilisateurs d'OpenStreetMap, développeurs et passionnés dans la région métropolitaine de New York" }, + "OSM-Portland-forum": { + "name": "Groupe Google OpenStreetMap PDX", + "description": "Forum et liste de diffusion pour les utilisateurs d'OpenStreetMap dans la région de Portland", + "extendedDescription": "Ce groupe a pour objectif de faciliter les contributions à OpenStreetMap dans la région de Portland, Oregon, et de soutenir des applications comme Open Trip Planner." + }, "OSM-Portland": { "name": "OpenStreetMap Portland", "description": "Cartographes et utilisateurs d'OpenStreetMap dans la région de Portland", diff --git a/dist/locales/gl.json b/dist/locales/gl.json index 043ccc927..8a8464177 100644 --- a/dist/locales/gl.json +++ b/dist/locales/gl.json @@ -23,13 +23,13 @@ }, "browse": { "title": "Buscar", - "description": "Desprazar e facer zoom no mapa." + "description": "Desprazar e ampliar o mapa." }, "draw_area": { - "tail": "Fai clic para engadir vértices á túa área. Fai clic no primeiro vértice para finalizar a área." + "tail": "Fai clic para engadir nós á túa área. Fai clic no primeiro nó para finalizar a área." }, "draw_line": { - "tail": "Fai clic para engadir máis vértices á liña. Fai clic noutras liñas para conectalas, e fai dobre clic para rematar a liña." + "tail": "Fai clic para engadir máis nós á liña. Fai clic noutras liñas para conectalas, e fai dobre clic para rematar a liña." }, "drag_node": { "connected_to_hidden": "Isto non se pode editar xa que está conectado cun elemento oculto." @@ -39,7 +39,7 @@ "add": { "annotation": { "point": "Punto engadido.", - "vertex": "Vértice engadido a unha vía.", + "vertex": "Engadiuse un nó a unha vía.", "relation": "Relación engadida." } }, @@ -53,8 +53,8 @@ "key": "A", "title": "Continuar", "description": "Continuar esta liña.", - "not_eligible": "Ningunha liña se pode continuar aquí.", - "multiple": "Aquí pódense continuar varias liñas. Para escoller unha delas, pulsa a tecla de Maiúsculas e fai clic na liña para seleccionala.", + "not_eligible": "Ningunha liña pode continuar desde aquí.", + "multiple": "Desde aquí poden continuar varias liñas. Para escoller unha delas, preme a tecla de Maiúsculas e fai clic na liña para seleccionala.", "annotation": { "line": "Liña continuada.", "area": "Área continuada." @@ -77,8 +77,8 @@ }, "key": "O", "annotation": { - "line": "Liña redondeada.", - "area": "Área redondeada." + "line": "Facer unha liña redondeada.", + "area": "Facer unha área circular." }, "not_closed": "Isto non se pode redondear porque non é un bucle.", "too_large": "Isto non se pode redondear porque non está completamente visible.", @@ -95,8 +95,8 @@ "line": "Escuadradas as esquinas dunha liña.", "area": "Escuadradas as esquinas dunha área." }, - "not_squarish": "Isto non se pode escuadrar porque non ten forma cadrada.", - "too_large": "Isto non se pode escuadrar porque non está completamente visible.", + "not_squarish": "Isto non se pode facer cadrado porque non ten forma cadrada.", + "too_large": "Isto non se pode facer cadrado porque non está completamente visible.", "connected_to_hidden": "Isto non se pode facer cadrado xa que está conectado cun elemento oculto." }, "straighten": { @@ -115,7 +115,7 @@ }, "annotation": { "point": "Punto borrado.", - "vertex": "Eliminado un nodo dunha vía.", + "vertex": "Borrouse un nó dunha vía.", "line": "Liña borrada", "area": "Área borrada.", "relation": "Relación borrada.", @@ -126,51 +126,51 @@ "multiple": "Estes elementos non poden ser borrados porque non son totalmente visibles." }, "incomplete_relation": { - "single": "Este elemento non pode ser eliminado porque aínda non foi completamente baixado.", - "multiple": "Estes elementos non poden ser eliminados por non estar totalmente baixados." + "single": "Este elemento non se pode borrar porque aínda non se acabou de descargar.", + "multiple": "Este elementos non se pode borrar porque aínda non se acabou de descargar." }, "part_of_relation": { - "single": "Este elemento non pode ser eliminado porque é parte dunha relación maior. Debes primeiro eliminalo da relación.", - "multiple": "Estes elementos non poden ser eliminados porque son parte de relacións maiores. Debes en primeiro lugar eliminalos das relacións." + "single": "Este elemento non se pode borrar porque forma parte dunha relación maior. Primeiro tes que eliminalo desa relación.", + "multiple": "Este elementos non se pode borrar porque forma parte dunha relación maior. Primeiro tes que eliminalo desa relación." }, "connected_to_hidden": { - "single": "Este elemento non poden ser borrado porque está conectado cun elemento agochado.", - "multiple": "Estes elementos non poden ser borrados porque conectan con elementos agochados." + "single": "Este elemento non se pode borrar porque está conectado cun elemento agochado.", + "multiple": "Estes elementos non se pode borrar porque conectan con elementos agochados." } }, "add_member": { - "annotation": "Membro engadido a unha relación." + "annotation": "Engadiuse un membro a unha relación." }, "delete_member": { - "annotation": "Membro quitado dunha relación." + "annotation": "Retirouse un membro a unha relación." }, "connect": { "annotation": { - "point": "Conectada unha vía a un punto.", - "vertex": "Conectada unha vía a outra.", - "line": "Conectada unha vía a unha liña.", - "area": "Conectada unha vía a unha área." + "point": "Conectouse unha vía a un punto.", + "vertex": "Conectouse unha vía coa outra.", + "line": "Conectouse unha vía a unha liña.", + "area": "Conectouse unha vía a unha área." }, - "relation": "Estes elementos non se poden conectar porque teñen roles de relación contraditorios.", - "restriction": "Estes elementos non se poden conectar porque se danaría a relación \"{relation}\"." + "relation": "Estes elementos non se poden conectar porque teñen uns roles asociados que se contradín.", + "restriction": "Estes elementos non se poden conectar porque afectaría á relación \"{relation}\"." }, "disconnect": { "title": "Desconectar", - "description": "Desconectar estas liñas/áreas entre si.", + "description": "Desconectar estas liñas/áreas unha da outra.", "key": "D", "annotation": "Liñas/áreas desconectadas.", - "not_connected": "Aquí non hai liñas/áreas suficientes para poder desconectar.", + "not_connected": "Aquí non hai liñas/áreas suficientes como para poder desconectar.", "connected_to_hidden": "Isto non se pode desconectar xa que está conectado cun elemento oculto.", "relation": "Isto non pode ser desconectado porque liga os membros dunha relación." }, "merge": { "title": "Unir.", - "description": "Unir estos elementos.", + "description": "Unir estes elementos.", "key": "C", "annotation": "Unidos {n} elementos.", "not_eligible": "Estes elementos non se poden unir.", - "not_adjacent": "Estos elementos non se poden fusionar porque os seus extremos non están ligados.", - "restriction": "Estes elementos non se poden combinar porque se danaría a relación \"{relation}\".", + "not_adjacent": "Estes elementos non se poden unir porque os seus extremos non están ligados.", + "restriction": "Estes elementos non se poden unir porque se danaría a relación \"{relation}\".", "relation": "Estes elementos non se poden combinar porque teñen roles de relación contraditorios.", "incomplete_relation": "Estes elementos non se poden unir porque cando menos un deles non se descargou completamente.", "conflicting_tags": "Estes elementos non se poden unir porque algunhas das súas etiquetas teñen valores contraditorios." @@ -184,21 +184,21 @@ "key": "M", "annotation": { "point": "Punto movido.", - "vertex": "Movido un vértice a unha vía.", + "vertex": "Moveuse un nó nunha vía.", "line": "Liña movida.", "area": "Área movida.", "multiple": "Movidos múltiplos elementos." }, "incomplete_relation": { "single": "Este elemento non pode ser movido porque non foi completamente baixado.", - "multiple": "Estes elementos non ponden ser movidos poque non foron completamente baixados." + "multiple": "Estes elementos non poden ser movidos porque non foron completamente baixados." }, "too_large": { "single": "Este elemento non pode ser movido porque actualmente non é completamente visible.", "multiple": "Estes elementos non poden ser movidos porque actualmente non son completamente visibles." }, "connected_to_hidden": { - "single": "Este elemento non pode ser movido proque está ligado a un elemento agochado.", + "single": "Este elemento non pode ser movido porque está ligado a un elemento agochado.", "multiple": "Estes elementos non poden ser movidos porque están ligados a elementos agochados." } }, @@ -209,12 +209,12 @@ }, "description": { "long": { - "single": "Reflexar este elemento a través do seu eixo lonxitudinal.", - "multiple": "Reflexar estes elementos a través do seu eixo lonxitudinal." + "single": "Reflectir este elemento a través do seu eixo lonxitudinal.", + "multiple": "Reflectir estes elementos a través do seu eixo lonxitudinal." }, "short": { - "single": "Reflexar este elemento a través do seu eixo curto.", - "multiple": "Reflexar estes elementos a través dos seus eixos curtos." + "single": "Reflectir este elemento a través do seu eixo curto.", + "multiple": "Reflectir estes elementos a través dos seus eixos curtos." } }, "key": { @@ -223,32 +223,32 @@ }, "annotation": { "long": { - "single": "Reflexado un elemento ao través do eixo lonxitudinal.", - "multiple": "Reflexados mútiplos elementos a través dos eixos lonxitudinais." + "single": "Reflectido un elemento ao través do eixo lonxitudinal.", + "multiple": "Reflectidos múltiples elementos a través dos eixos lonxitudinais." }, "short": { - "single": "Reflexado o elemento ao través do eixo curto.", - "multiple": "Reflexados múltiples elementos a través dos seus eixos curtos." + "single": "Reflectido o elemento ao través do eixo curto.", + "multiple": "Reflectidos múltiples elementos a través dos seus eixos curtos." } }, "incomplete_relation": { - "single": "Este elemento non pode ser reflexado porque non foi completamente baixado.", - "multiple": "Estes elementos non poden ser reflexados porque non foron completamente baixados." + "single": "Este elemento non pode ser reflectido porque non foi completamente baixado.", + "multiple": "Estes elementos non poden ser reflectidos porque non foron completamente baixados." }, "too_large": { - "single": "Este elemento non pode ser reflexado porque actualmente non está completamente visible.", - "multiple": "Estes elementos non poden ser reflexados porque actualmente non están completamente visibles." + "single": "Este elemento non pode ser reflectidos porque actualmente non está completamente visible.", + "multiple": "Estes elementos non poden ser reflectidos porque actualmente non están completamente visibles." }, "connected_to_hidden": { - "single": "Este elemento non pode ser reflexado porque está ligado a un elemento agochado.", - "multiple": "Estes elementos non poden ser reflexados porque algúns están ligados a elementos agochados." + "single": "Este elemento non pode ser reflectidos porque está ligado a un elemento agochado.", + "multiple": "Estes elementos non poden ser reflectidos porque algúns están ligados a elementos agochados." } }, "rotate": { "title": "Rotar.", "description": { "single": "Rotar este elemento ao redor do seu punto central.", - "multiple": "Rotar estos elementos ao redor dos seus puntos centrais." + "multiple": "Rotar estes elementos ao redor dos seus puntos centrais." }, "key": "R", "annotation": { @@ -278,9 +278,9 @@ "split": { "title": "Dividir", "description": { - "line": "Dividir esta liña en dúas neste vértice.", + "line": "Dividir esta liña en dúas neste nó.", "area": "Dividir o límite desta área en dous.", - "multiple": "Dividir as liñas/límites da área en dous neste vértice" + "multiple": "Dividir en dous as liñas/límites da área neste nó." }, "key": "X", "annotation": { @@ -304,7 +304,7 @@ "distance": "Distancia", "distance_up_to": "Ata {distance}", "via": "A través de", - "via_node_only": "Só nodo", + "via_node_only": "Só nó", "via_up_to_one": "Ata 1 vía", "via_up_to_two": "Ata 2 vías" }, @@ -352,10 +352,10 @@ "localized_translation_name": "Nome" }, "zoom_in_edit": "Fai zoom para editar", - "login": "loguear", - "logout": "saír", + "login": "Acceder", + "logout": "Saír", "loading_auth": "Conectando con OpenStreetMap...", - "report_a_bug": "Reportar bug", + "report_a_bug": "Informar do erro", "help_translate": "Axuda a traducir", "feature_info": { "hidden_warning": "{count} elementos agochados", @@ -365,7 +365,7 @@ "error": "Non se puido conectar coa API.", "offline": "A API non está en liña. Por favor, intenta editar máis tarde.", "readonly": "A API está en modo de só lectura. Necesitarás esperar para gardar os teus cambios.", - "rateLimit": "A API limita conexións anónimas. Podes evitar isto logueándote." + "rateLimit": "A API limita conexións anónimas. Podes evitar isto rexistrándote." }, "commit": { "title": "Subir a OpenStreetMap", @@ -438,7 +438,7 @@ "location": "Localización", "metric": "Métrico", "imperial": "Imperial", - "node_count": "Número de nodos" + "node_count": "Número de nós" } }, "geometry": { @@ -471,11 +471,11 @@ "role": "Rol", "choose": "Escolle o tipo de elemento", "results": "{n} resultados para {search}", - "reference": "Ver na Wiki de OpenStreetMap", + "reference": "Ver na wiki de OpenStreetMap", "back_tooltip": "Trocar tipo de elemento", "remove": "Eliminar", "search": "Buscar", - "multiselect": "Elexir elementos", + "multiselect": "Elixir elementos", "unknown": "Descoñecido", "incomplete": "", "feature_list": "Buscar elementos", @@ -494,7 +494,7 @@ }, "add": "Engadir", "none": "Ningún", - "node": "Vértice", + "node": "Nó", "way": "Vía", "relation": "Relación", "location": "Localización", @@ -510,7 +510,7 @@ "switch": "Voltar a este fondo", "custom": "Personalizado", "custom_button": "Editar fondo personalizado", - "custom_prompt": "Introducir unha plantilla URL de mosaico. Os tokens válidos son:\n - {zoom}/{z}, {x}, {y} para o esquema de mosaico Z/X/Y\n - {-y} ou {ty} para coordenadas Y invertidas estilo TMS\n - {u} para o esquema quadtile\n - {switch:a,b,c} para multiplexado de servidores DNS\n\nExemplo:\n{example}", + "custom_prompt": "Introducir un modelo URL de mosaico. Os tokens válidos son:\n - {zoom}/{z}, {x}, {y} para o esquema de mosaico Z/X/Y\n - {-y} ou {ty} para coordenadas Y invertidas estilo TMS\n - {u} para o esquema quadtile\n - {switch:a,b,c} para multiplexado de servidores DNS\n\nExemplo:\n{example}", "overlays": "Superposicións", "imagery_source_faq": "Información das imaxes/Informar dun problema", "reset": "reiniciar", @@ -525,7 +525,7 @@ "key": "/" }, "fix_misalignment": "Axustar offset da imaxe", - "offset": "Arrastre en calquera parte da área gris de embaixo para axustar o desplazamento de imaxes ou ingrese os valores de desplazamento en metros." + "offset": "Arrastre en calquera parte da área gris de embaixo para axustar o desplazamento de imaxes ou ingrese os valores de desprazamento en metros." }, "map_data": { "title": "Datos de mapa", @@ -536,6 +536,10 @@ "osm": { "tooltip": "Datos de mapa do OpenStreetMap", "title": "Datos OpenStreetMap" + }, + "notes": { + "tooltip": "Nota de datos de OpenStreetMap", + "title": "Notas de OpenStreetMap" } }, "fill_area": "Encher as áreas", @@ -620,7 +624,7 @@ "no_changes": "Non hai cambios para gardar.", "error": "Houbo erros ao se intentar gardar. ", "status_code": "O servidor devolveu a referencia de estado {code}", - "unknown_error_details": "Asegúrate de que estás conectado a internet.", + "unknown_error_details": "Asegúrate de que estás conectado a Internet.", "uploading": "Subindo trocos a OpenStreetMap...", "conflict_progress": "Comprobando conflitos: {num} de {total}", "unsaved_changes": "Tes cambios sen gardar", @@ -642,7 +646,7 @@ "conflict": { "deleted": "Este elemento foi borrado por {user}.", "location": "Este elemento foi movido por ambos ti e {user}.", - "nodelist": "Este obxecto cambiáchedelo ti e {user}.", + "nodelist": "Os nós cambiástelos tanto ti coma {user}.", "memberlist": "Os elementos da relación modificáronnos {user} e máis vostede,", "tags": "Cambiaches a etiqueta {tag} a \"{local}\" e {user} cambiouna para \"{remote}\"." } @@ -669,7 +673,7 @@ }, "splash": { "welcome": "Benvido ao editor de OpenStreetMap iD", - "text": "iD é unha amigable pero potente ferramenta para contribuir ao mellor mapa libre do mundo. Esta é a versión {version}. Para obter máis información visita {website} e informa de erros en {github}.", + "text": "iD é unha amigable pero potente ferramenta para contribuír ao mellor mapa libre do mundo. Esta é a versión {version}. Para obter máis información visita {website} e informa de erros en {github}.", "walkthrough": "Comezar o titorial", "start": "Editar agora" }, @@ -699,7 +703,7 @@ "untagged_area_tooltip": "Escolle un tipo de elemento que describa o que é esta área.", "untagged_relation": "Relación sen etiquetar", "untagged_relation_tooltip": "Escolle un tipo de elemento que describa o que é esta relación.", - "many_deletions": "Estás borrando {n} elementos: {p} nodos, {l} liñas, {a} áreas e {r} relacións. Estás seguro de querer facelo? Esta acción eliminaraos do mapa e ninguén os verá en openstreetmap.org.", + "many_deletions": "Estás borrando {n} elementos: {p} nós, {l} liñas, {a} áreas e {r} relacións. Estás seguro de querer facelo? Esta acción eliminaraos do mapa e ninguén os verá en openstreetmap.org.", "tag_suggests_area": "A etiqueta {tag} suxire que a liña debería ser unha área, pero non é unha área.", "deprecated_tags": "Etiquetas obsoletas: {tags}" }, @@ -710,15 +714,23 @@ "cannot_zoom": "Non se pode reducir máis no modo actual.", "full_screen": "Pasar a pantalla completa", "gpx": { - "local_layer": "Arquivo local", + "local_layer": "Engadir un GPX", "drag_drop": "Arrastra e solta un ficheiro .gpx, .geojson ou .kml sobre a páxina, ou fai clic no botón da dereita para buscalo", "zoom": "Zoom na capa", - "browse": "Buscar un arquivo" + "browse": "Buscar un ficheiro" + }, + "mvt": { + "local_layer": "Engadir un MVT", + "drag_drop": "Arrastra e solta un ficheiro .mvt ou .pbf sobre a páxina, ou fai clic no botón da dereita para buscalo", + "zoom": "Ampliar á capa", + "browse": "Buscar un ficheiro" }, "streetside": { "tooltip": "Fotos Streetside de Microsoft", "title": "Superposición de fotos (Bing Streetside)", - "report": "Informar dun problema de privacidade con esta imaxe" + "report": "Informar dun problema de privacidade con esta imaxe", + "view_on_bing": "Ver en Bing Maps", + "hires": "Alta resolución" }, "mapillary_images": { "tooltip": "Fotos ao nivel da rúa de Mapillary", @@ -738,25 +750,115 @@ "openstreetcam": { "view_on_openstreetcam": "Ver esta imaxe en OpenStreetCam" }, + "note": { + "note": "Nota", + "title": "Editar nota", + "anonymous": "anónimo", + "closed": "(Pechado)", + "commentTitle": "Comentarios", + "newComment": "Novo comentario", + "inputPlaceholder": "Introducir un comentario para compartir con outros usuarios.", + "close": "Pechar a nota", + "open": "Volver a abrir a nota", + "comment": "Comentar", + "close_comment": "Pechar e comentar", + "open_comment": "Volver a abrir e comentar", + "report": "Informar dun problema", + "login": "Debe acceder para poder facer cambios ou comentarios nesta nota.", + "upload_explanation": "Os seus comentarios serán públicos e visibles para calquera usuario de OpenStreetMap.", + "upload_explanation_with_user": "Os seus comentarios como {user} serán públicos e visibles para todos os usuarios de OpenStreetMap." + }, "help": { "title": "Axuda", "key": "H", "help": { "title": "Axuda", - "welcome": "Benvido ao editor iD para [OpenStreetMap] (https://www.openstreetmap.org/). Con este editor podes actualizar OpenStreetMap directamente desde o teu navegador." + "welcome": "Benvido ao editor iD para [OpenStreetMap] (https://www.openstreetmap.org/). Con este editor podes actualizar OpenStreetMap directamente desde o teu navegador.", + "open_data_h": "Abrir datos", + "before_start_h": "Antes de que comeces", + "open_source_h": "Código aberto" + }, + "overview": { + "title": "Resumo", + "navigation_h": "Navegación", + "navigation_zoom": "Podes facer ampliar ou afastarte dunha zona arrastrando co ratón ou trackpad, ou premendo nos botóns de {plus}/{minus} que aparecen no lateral do mapa. Ademais podes empregar as teclas `+`, `-` .", + "features_h": "Características do mapa", + "features": "Usámola palabra *elementos* para describir as cousas que aparecen no mapa, como estradas, construcións ou puntos de interese. Calquera cousa do mundo real poden cartografarse como un elemento en OpenStreetMap. Os elementos do mapa represéntanse usando *puntos*, *liñas* ou *áreas*.", + "nodes_ways": "En OpenStreetMap, aos puntos ás veces chámaselles *nós*, e as liñas e áreas *camiños*." + }, + "editing": { + "title": "Editar e gardar", + "select_h": "Seleccionar", + "multiselect_h": "Selección múltiple", + "undo_redo_h": "Desfacer e refacer", + "save_h": "Gardar", + "upload_h": "Subir", + "backups_h": "Copias de seguridade automáticas", + "keyboard_h": "Atallos de teclado" + }, + "feature_editor": { + "title": "Editor preferido", + "type_h": "Tipo preferido", + "fields_h": "Campos", + "tags_h": "Etiquetas" + }, + "points": { + "title": "Puntos", + "add_point_h": "Engadindo puntos", + "move_point_h": "Movendo puntos", + "delete_point_h": "Eliminando puntos" + }, + "lines": { + "title": "Liñas", + "add_line_h": "Engadindo liñas", + "modify_line_h": "Modificando as liñas", + "connect_line_h": "Conectando as liñas", + "disconnect_line_h": "Desconectando as liñas", + "move_line_h": "Movendo as liñas", + "delete_line_h": "Eliminando as liñas" + }, + "areas": { + "title": "Áreas", + "point_or_area_h": "Puntos ou áreas?", + "add_area_h": "Engadindo áreas", + "square_area_h": "Esquinas cadradas", + "modify_area_h": "Modificando áreas", + "delete_area_h": "Eliminando áreas" + }, + "relations": { + "title": "Relacións", + "edit_relation_h": "Editando as relacións", + "maintain_relation_h": "Mantendo as relacións", + "relation_types_h": "Tipos de relacións", + "multipolygon_h": "Multipolígonos", + "turn_restriction_h": "Cambiar as restricións", + "route_h": "Rutas", + "boundary_h": "Fronteiras" + }, + "imagery": { + "title": "Imaxe de fondo", + "sources_h": "Fontes de imaxes" + }, + "streetlevel": { + "title": "Fotos a nivel de rúa", + "using_h": "Usando as fotos a nivel de rúa" + }, + "gps": { + "title": "Pistas de GPS", + "using_h": "Usando as pistas de GPS" }, "field": { "restrictions": { "title": "Axuda das restricións de xiro", "about": { "title": "Acerca de", - "about": "Este campo permíteche inspecionar e modificar restricións de xiro. Mostra un modelo da intersección seleccionada, incluíndo outras estradas conectadas próximas.", + "about": "Este campo permíteche inspeccionar e modificar restricións de xiro. Mostra un modelo da intersección seleccionada, incluíndo outras estradas conectadas próximas.", "from_via_to": "Unha restrición de xiro sempre contén: unha **vía DESDE**, unha **vía CARA A** e un **nodo A TRAVÉS DE** ou unha ou varias **vías A TRAVÉS DE**.", "maxdist": "A barra de desprazamento \"{distField}\" controla ata onde se vai buscar por máis estradas conectadas.", - "maxvia": "A barra de desprazamento \"{viaField}\" axusta cántas vías intermedias poden ser incluídas na busca. (Consello: canto máis simple, mellor)" + "maxvia": "A barra de desprazamento \"{viaField}\" axusta cantas vías intermedias poden ser incluídas na busca. (Consello: canto máis simple, mellor)" }, "inspecting": { - "title": "Inspecionar", + "title": "Inspeccionar", "about": "Sitúate sobre calquera segmento **DESDE** para ver se ten restricións de xiro. Cada destino **CARA A** posible debuxarase cunha sombra coloreada indicando se existe algunha restrición de xiro.", "from_shadow": "{fromShadow} **segmento DESDE**", "allow_shadow": "{allowShadow} **CARA A permitido**", @@ -767,7 +869,7 @@ }, "modifying": { "title": "Modificar", - "about": "Para modificar restricións de xiro, primeiro fai clic en calquera segmento **DESDE** para selecionalo. O segmento selecionado parpadeará, e todos os destinos **CARA A** posibles mostraranse como símbolos de xiro.", + "about": "Para modificar restricións de xiro, primeiro fai clic en calquera segmento **DESDE** para seleccionalo. O segmento seleccionado parpadeará, e todos os destinos **CARA A** posibles mostraranse como símbolos de xiro.", "indicators": "Logo, fai clic nun símbolo de xiro para alternalo entre \"Permitido, \"Prohibido\" e \"Obrigatorio\".", "allow_turn": "{allowTurn} **CARA A permitido**", "restrict_turn": "{restrictTurn} **CARA A prohibido**", @@ -778,8 +880,8 @@ "simple": "**Intenta usar restricións simples en lugar de restricións máis complexas.**", "simple_example": "Por exemplo, se podes establecer o elemento intermedio simplemente cun nodo, evita facelo cunha vía.", "indirect": "**Algunhas restricións mostran o texto \"(indirecta)\" e aparecen cunha cor máis tenue.**", - "indirect_example": "Estas restricións existen debido a outra restrición cercana. Por exemplo, unha restrición de \"Obrigatorio seguir recto\" creará indirectamente restricións de \"Prohibido xirar\" para tódalas demáis rutas da intersección.", - "indirect_noedit": "Non podes modificar restricións indirectas. En lugar diso, modifica a restrición directa cercana." + "indirect_example": "Estas restricións existen debido a outra restrición cercana. Por exemplo, unha restrición de \"Obrigatorio seguir recto\" creará indirectamente restricións de \"Prohibido xirar\" para tódalas demais rutas da intersección.", + "indirect_noedit": "Non podes modificar restricións indirectas. En lugar diso, modifica a restrición directa próxima." } } } @@ -918,7 +1020,7 @@ "practice": "Tódolos datos nesta explicación paso a paso son para practicar, e as edicións que se fan non serán gardadas.", "words": "Esta explicación paso a paso vai introducir algúns novos conceptos. Cando introducimos unha nova palabra, usaremos *cursiva*.", "mouse": "Podes empregar calquera dispositivo de entrada para editar o mapa, mais este paso a paso asume que ten un rato con botóns esquerdo e dereito non necesario en mac. **Se queres conectar un rato, faino agora, a continuación, prema en OK.**", - "leftclick": "Cando no tutorial se lle pida facer clic ou facer dobre clic, refírese ao botón esquerdo. Nun trackpad debe facerse un clic sinxelo ou toque cun dedo. **Clic esquerdo {num} veces.**", + "leftclick": "Cando no titorial se lle pida facer clic ou facer dobre clic, refírese ao botón esquerdo. Nun trackpad debe facerse un clic sinxelo ou toque cun dedo. **Clic esquerdo {num} veces.**", "rightclick": "Ás veces pedimos facer clic co botón dereito. Debe facerse ás veces como control esquerdo ou dous dedos nun trackpad. O teclado ata pode ter unha tecla \"menú\" que funciona como botón dereito do rato. **Clic dereito {num} veces.**", "chapters": "Es bo meu! Podes usar os botóns de abaixo para saltar capítulos en calquera momento ou para reiniciar un capítulo se queda preso. Imos comezar! **Prema '{next}' para continuar. **" }, @@ -926,11 +1028,11 @@ "title": "Navegación", "drag": "A zona principal do mapa mostra os datos do OpenStreetMap enriba dun fondo. {br} Pode arrastrar o mapa premendo e sostendo o botón esquerdo do rato mentres move o rato arredor. Tamén pode usar as frechas do teclado. ** Arrastre o mapa! **", "zoom": "Podes facer zoom fora da zona de desprazamento coa roda do rato ou o trackpad, ou premendo nos botóns {plus} / {minus}. **Fai zoom no mapa!**", - "features": "Usámola palabra *elementos* para describir as cousas que aparecen no mapa. Calquer cousa do mundo real poden mapearse como un elemento en OpenStreetMap.", + "features": "Usámola palabra *elementos* para describir as cousas que aparecen no mapa. Calquera cousa do mundo real pode cartografarse como un elemento en OpenStreetMap.", "points_lines_areas": "Os elementos do mapa están representados empregando *puntos, liñas ou áreas.*", "nodes_ways": "Ás veces, en OpenStreetMap os puntos son chamados *nodos*, e as liñas e áreas son chamadas *vías*.", "click_townhall": "Tódolos elementos do mapa poden ser seleccionados facendo clic neles. **Fai clic sobre o punto para seleccionalo.**", - "selected_townhall": "Meu! O punto está agora seleccionado. Os elementos seleccionados son deseñados cun brillo pulsante.", + "selected_townhall": "Meu! O punto está agora seleccionado. Os elementos seleccionados son deseñados cun brillo escintilante.", "editor_townhall": "Cando os elementos son seleccionados, o *editor de elementos* é amosado ao lado do mapa.", "preset_townhall": "A parte alta do editor de elementos amosa o tipo de elemento. Este punto é o {preset}.", "fields_townhall": "A parte media do editor de elementos conten *campos* que mostran os atributos do elemento, tales como o nome e enderezo.", @@ -944,25 +1046,25 @@ "points": { "title": "Puntos", "add_point": "Os *puntos* poden ser empregados para representar elementos tales como tendas, restaurantes e monumentos.{br}Marcan a localización específica e describen que son. **Pincha no botón {button} Punto para engadir un novo punto.**", - "place_point": "Para poñer o novo punto no mapa, sitúa o cursor do rato onde o debería estar o punto, e logo fai clic co botón esquerdo ou preme a barra espaciadora. **Move o punteiro do rato sobre este edificio, entón fai clic co botón esquerdo ou preme a barra espaciadora.**", + "place_point": "Para poñer o novo punto no mapa, sitúa o cursor do rato onde o debería estar o punto, e logo fai clic co botón esquerdo ou preme a barra espaciadora. **Move o punteiro do rato sobre este edificio, entón fai clic co botón esquerdo ou preme a barra de espazo**", "search_cafe": "Hai moitos elementos diferentes que se poden representar como puntos. O punto que acabas de engadir é unha cafetería. **Busca '{preset}'.**", "choose_cafe": "**Escolle {preset} da lista.**", "feature_editor": "O punto está marcado agora como unha cafetería. Usando o editor de elementos, podemos engadir máis información sobre a cafetería.", "add_name": "En OpenStreetMap tódolos campos son opcionais, e non está mal deixar un campo en branco se non estás seguro del.{br}Imos supoñer que tes coñecemento local sobre esta cafetería e coñeces o nome. **Engade o nome da cafetería.**", - "add_close": "O editor de elementos lembrará tódolos trocos automáticamente. **Cando remates de engadir o nome, pulsa Esc, Enter, ou fai clic no botón {button} para pechar o editor de elementos.**", + "add_close": "O editor de elementos lembrará tódolos trocos automaticamente. **Cando remates de engadir o nome, pulsa Esc, Enter, ou fai clic no botón {button} para pechar o editor de elementos.**", "reselect": "A miúdo os puntos xa existen, pero teñen erros ou están incompletos. Podemos editar puntos existentes. **Selecciona a cafetería que acabas de crear.**", "update": "Imos cubrir algúns detalles sobre esta cafetería. Podes cambiar o seu nome, engadir o tipo de cociña, ou engadir un enderezo. **Cambiar a información do café.**", - "update_close": "**Cando remates de actualizar o café, pulsa escape, enter, ou fai click no botón {button} para pechar o editor de elementos.**", + "update_close": "**Cando remates de actualizar o café, pulsa escape, enter, ou fai clic no botón {button} para pechar o editor de elementos.**", "rightclick": "Podes facer clic co botón dereito en calquera elemento para ver o *menú de edición*, o cal amosa unha listaxe de operacións de edición dispoñibles. **Fai clic co botón dereito para seleccionar o punto que creaches e amosar o menú de edición.**", - "delete": "Está ben borrar elementos que non existen no mundo real.{br}Borrando un elemento de OpenStreetMap quítalo do mapa que todos usan, polo tanto debes estar certo de que un elemento realmente non existe antes de borralo. **Clica no botón {button} para borrar o punto.**", + "delete": "Está ben borrar elementos que non existen no mundo real.{br}Borrando un elemento de OpenStreetMap quítalo do mapa que todos usan, polo tanto debes estar certo de que un elemento realmente non existe antes de borralo. **Preme no botón {button} para borrar o punto.**", "undo": "Sempre podes desfacer calquera modificación mentres non gardes as túas edicións en OpenStreetMap. **Fai clic no botón {button} para anular a eliminación volver a ter o punto.**", "play": "Agora que xa sabes como crear e editar puntos, tenta crear uns poucos puntos máis para practicar! **Canto esteas preparado para continuar co novo capítulo, fai clic en '{next}'.**" }, "areas": { "title": "Áreas", "add_playground": "As *áreas* son usadas para amosar límites de elementos tales como lagoas, edificios e zonas residenciais.{br}Tamén poden ser empregadas para cartografar con maior detalle moitos dos elementos que normalmente cartografarías como puntos. **Fai clic no botón {button} Área para engadir unha nova área.**", - "start_playground": "Engadamos este parque infantil ao mapa debuxando unha área. As áreas debúxanse colocando *nodos* ao longo do bordo exterior do elemento. **Fai clic ou preme a barra espaciadora para poñer un nodo inicial nunha das esquinas do parque infantil.**", - "continue_playground": "Continúa debuxando a área colocando máis nodos ao longo do bordo do parque infantil. Está ben conectar a área cos camiños peonís existentes.{br}Consello: podes manter presa a tecla '{alt}' para evitar que os nodos se conecten nos elemetos próximos. **Continúa a debuxar a área do parque infantil.**", + "start_playground": "Engadamos este parque infantil ao mapa debuxando unha área. As áreas debúxanse colocando *nodos* ao longo do bordo exterior do elemento. **Fai clic ou preme a barra de espazo para poñer un nodo inicial nunha das esquinas do parque infantil.**", + "continue_playground": "Continúa debuxando a área colocando máis nodos ao longo do bordo do parque infantil. Está ben conectar a área cos camiños peonís existentes.{br}Consello: podes manter presa a tecla '{alt}' para evitar que os nodos se conecten nos elementos próximos. **Continúa a debuxar a área do parque infantil.**", "finish_playground": "Remata a área premendo enter, ou facendo clic outra vez no último ou no primeiro nodo. **Remata de debuxar a área para o parque infantil.**", "search_playground": "**Busca '{preset}'.**", "choose_playground": "**Elixe {preset} da lista.**", @@ -976,12 +1078,12 @@ "title": "Liñas", "add_line": "As *liñas* empréganse para representar elementos tales como estradas, vías ou ríos. **Fai clic no botón {button} Liña para engadir unha nova liña.**", "start_line": "Aquí está unha estada incompleta. Debemos engadila!{br}En OpenStreetMap, as liñas deben ser debuxadas polo centro da estrada. Podes mover e facer zoom no mapa mentres debuxas, se é necesario. **Inicia a nova liña facendo clic no punto final superior desta estrada incompleta.**", - "intersect": "Fai clic ou preme a barra espaciadora para engadir máis nodos á liña.{br}As estradas e moitos outros tipos de liñas forman parte dun rede máis grande. É importante que esas liñas estean correctamente ligadas para que as aplicacións de enrutamento poidan funcionar. **Fai clic sobre {name} para crear a intersección e ligar as dúas liñas.**", + "intersect": "Fai clic ou preme a barra de espazo para engadir máis nodos á liña.{br}As estradas e moitos outros tipos de liñas forman parte dun rede máis grande. É importante que esas liñas estean correctamente ligadas para que as aplicacións de enrutamento poidan funcionar. **Fai clic sobre {name} para crear a intersección e ligar as dúas liñas.**", "retry_intersect": "A estrada necesita ligar con {name}. Volve tentalo!", "continue_line": "Continúa debuxando a liña para a nova estrada. Lembra que podes mover e facer zoom no mapa se o necesitas.{br}Cando remates de debuxar fai clic no último nodo outra vez. **Remata de debuxar a estrada.**", "choose_category_road": "**Escolla {category} na lista.**", "choose_preset_residential": "Hai varios tipos diferentes de estradas, pero esta é unha rúa residencial. **Escolle o tipo {preset}.**", - "retry_preset_residential": "Non seleccionales o tipo {preset}. **Fai clic aquí para volver a elixir.**", + "retry_preset_residential": "Non seleccionaches o tipo {preset}. **Fai clic aquí para volver a elixir.**", "name_road": "**Dálle un nome á estrada, logo pulsa escape, enter, ou fai clic no botón {button} para pechar o editor de elementos.**", "did_name_road": "Parece Bo! Agora aprenderemos como actualizar as formas dunha liña.", "update_line": "Algunhas veces necesitaremos cambiar a forma dunha liña existente. Aquí hai unha estrada que non parece correcta.", @@ -989,8 +1091,8 @@ "start_drag_endpoint": "Cando unha liña estea seleccionada podes mover calquera dos seus nodos facendo clic e mantendo o botón esquerdo do rato mentres arrastras. **Arrastra o punto final no lugar onde as estradas deberían intersectar.**", "finish_drag_endpoint": "Este lugar parece bo. **Solta o botón esquerdo para rematar de arrastrar.**", "start_drag_midpoint": "Móstranse pequenos triángulos nos *puntos intermedios* entre os nodos. Outra forma de crear novos nodos é arrastrando un punto intermedio cara unha nova localización. **Arrastra o triángulo do punto intermedio para crear un novo nodo ao longo da curva da estrada.**", - "continue_drag_midpoint": "Esta liña parece moito mellor! Continua axustando a liña facendo dobre clic ou arrastrando puntos intermedios ata que a curva coincida coa forma da estrada. **Cando estés contento coa forma da liña, fai clic en OK.**", - "delete_lines": "Está ben borrar liñas de estradas non existentes no mundo real.{br}Aquí hai un exemplo onde a cidade planificou {street} pero non se chegou a construir. Nós podemos mellorar esta parte do mapa eliminando as liñas que sobren.", + "continue_drag_midpoint": "Esta liña parece moito mellor! Continua axustando a liña facendo dobre clic ou arrastrando puntos intermedios ata que a curva coincida coa forma da estrada. **Cando esteas contento coa forma da liña, fai clic en OK.**", + "delete_lines": "Está ben borrar liñas de estradas non existentes no mundo real.{br}Aquí hai un exemplo onde a cidade planificou {street} pero non se chegou a construír. Nós podemos mellorar esta parte do mapa eliminando as liñas que sobren.", "rightclick_intersection": "A última estrada real é {street1}, así que podemos *dividir* {street2} nesta intersección e borrar todo o que haxa por enriba dela. **Fai clic co botón dereito no nodo da intersección.**", "split_intersection": "**Fai clic no botón {button} para dividir {street}.**", "retry_split": "Non pinchaches no botón dividir. Volve tentalo.", @@ -1004,7 +1106,7 @@ }, "buildings": { "title": "Edificios", - "add_building": "OpenStreetMap é a maior e máis ampla base de datos mundial de edificios.{br} Podes axudar a aumentar esta base de datos trazando edificios que non están aínda mapeados. **Pinchar no botón {button} Área para engadir nova área.**", + "add_building": "OpenStreetMap é a maior e máis ampla base de datos mundial de edificios.{br} Podes axudar a aumentar esta base de datos trazando edificios que non están aínda cartografados. **Preme no botón {button} Área para engadir nova área.**", "start_building": "Imos engadir esta casa ao mapa, trazando o seu contorno. {br}Os edificios deberán ser trazados ao redor da súa pegada coa maior precisión posible. **Fai clic ou preme a barra de espazo para poñer un nó inicial nun dos cantos do edificio. **", "continue_building": "Continúa editando máis nodos para trazar o perímetro do edificio. Lembra que podes facer zoom se queres engadir máis detalles.{br}Remata o edificio premendo enter ou facendo clic outra vez no primeiro ou último nodo. **Remata de trazar o edificio.**", "retry_building": "Parece que tivo algúns problemas poñendo os nós nas esquinas do edificio. Probe de novo!", @@ -1016,8 +1118,8 @@ "retry_square": "Ti non premiches no botón Escuadrar. Volve tentalo.", "done_square": "Ves como os cantos do edificio se colocaron no seu sitio? Imos aprender outro truco útil.", "add_tank": "Agora trazaremos este depósito circular.**Fai clic no botón {button} Área para engadir unha nova área.**", - "start_tank": "Non te preocupes, non tes que debuxar un círculo perfecto. Simplemente debuxa unha área dentro do depósito que toque o seu bordo. **Clic ou preme a barra espaciadora para colocar un nodo inicial sobre o bordo do depósito.**", - "continue_tank": "Engade uns poucos nodos ao redor da forma. O círcuclo será creado por fóra dos nodos que debuxes.{br}Remata a área presionado enter, ou facendo click outra vez no primeiro ou último nodo. **Remata de debuxar o recinto.**", + "start_tank": "Non te preocupes, non tes que debuxar un círculo perfecto. Simplemente debuxa unha área dentro do depósito que toque o seu bordo. **Clic ou preme a barra de espazo para colocar un nodo inicial sobre o bordo do depósito.**", + "continue_tank": "Engade uns poucos nodos ao redor da forma. O círculo será creado por fóra dos nodos que debuxes.{br}Remata a área premendo enter, ou facendo clic outra vez no primeiro ou último nodo. **Remata de debuxar o recinto.**", "search_tank": "**Busca '{preset}'.**", "choose_tank": "**Elixe {preset} da lista.**", "rightclick_tank": "**Fai clic co botón dereito para seleccionar o tanque de almacenamento que creaches e mostrar o menú de edición.**", @@ -1030,7 +1132,7 @@ "help": "Agora estás listo para editar OpenStreetMap! {br} Pode reproducir este paseo en calquera momento ou ver máis documentación premendo no botón {button} Axuda ou premendo a tecla '{key}'.", "shortcuts": "Podes ver unha lista de comandos xunto cos seus atallos de teclado premendo a tecla '{key}'.", "save": "Non te esquezas de gardar regularmente os teus cambios!", - "start": "Comeza a cartografiar!" + "start": "Comeza a cartografar!" } }, "shortcuts": { @@ -1055,8 +1157,8 @@ "pgdn": "PáxAd", "pgup": "PáxAt", "return": "Retorno", - "shift": "Maius", - "space": "Espacio" + "shift": "Maiús", + "space": "Espazo" }, "gesture": { "drag": "arrastrar" @@ -1093,7 +1195,7 @@ "search": "Buscar elementos que coincidan cun texto de busca" }, "with_selected": { - "title": "Con elementos selecionados", + "title": "Con elementos seleccionados", "edit_menu": "Alternar menú edición" }, "vertex_selected": { @@ -1112,14 +1214,13 @@ "add_point": "Modo 'engadir punto'", "add_line": "Modo 'engadir liña'", "add_area": "Modo 'engadir área'", - "place_point": "Situar un punto", "disable_snap": "Manter premido para desactivar o axuste do punto", "stop_line": "Rematar de debuxar unha liña ou área" }, "operations": { "title": "Operacións", "continue_line": "Continuar unha liña no nodo seleccionado", - "merge": "Combinar (unir) os elementos selecionados", + "merge": "Combinar (unir) os elementos seleccionados", "disconnect": "Desligar elementos no nodo seleccionado", "split": "Dividir unha liña en dúas no nodo seleccionado", "reverse": "Inverter unha liña", @@ -1127,8 +1228,8 @@ "rotate": "Rotar elementos seleccionados", "orthogonalize": "Endereitar liña / Escuadrar esquinas", "circularize": "Arredondar unha liña pechada ou área", - "reflect_long": "Reflexar elementos através dun eixo longo", - "reflect_short": "Reflexar elementos através dun eixo curto", + "reflect_long": "Reflectir elementos centrados nun eixo longo", + "reflect_short": "Reflectir elementos centrados nun eixo curto", "delete": "Borrar elementos seleccionados" }, "commands": { @@ -1965,7 +2066,7 @@ "0": "0: Grava sólida/terra compactada, sen obstáculos, curvas amplas", "1": "1: Algunha superficie solta, pequenos obstáculos, curvas amplas", "2": "2: Moita superficie solta, grandes obstáculos, curvas cerradas fáciles", - "3": "3: Superficie escorregadia, grandes obstáculos, curvas cerradas axustadas", + "3": "3: Superficie escorregadiza, grandes obstáculos, curvas cerradas axustadas", "4": "4: Superficie solta ou pedras, curvas cerradas perigosas", "5": "5: Dificultade máxima, campos de pedras, desprendementos de terra", "6": "6: Non practicable excepto polos mellores ciclistas de montaña" @@ -2087,7 +2188,7 @@ "garage_boxes": "Garaxe Boxes", "lane": "Carril na estrada", "multi-storey": "Multinivel", - "sheds": "Galpóns", + "sheds": "Pendellos", "surface": "Superficie", "underground": "Subterráneo" } @@ -2248,7 +2349,7 @@ "placeholder": "Sendeirismo de montaña, sendeirismo alpino" }, "sanitary_dump_station": { - "label": "Área de desagüe para caravanas" + "label": "Área de desaugue para caravanas" }, "seasonal": { "label": "Estacional" @@ -2566,7 +2667,7 @@ "label": "Tipo" }, "wheelchair": { - "label": "Acceso para silla de rodas" + "label": "Acceso para cadeira de rodas" }, "width": { "label": "Ancho (Metros)" @@ -2690,7 +2791,7 @@ }, "amenity/animal_shelter": { "name": "Refuxio de animais", - "terms": "refuxio, animais, mascotas, perrera, adopción" + "terms": "refuxio, animais, mascotas, canceira, adopción" }, "amenity/arts_centre": { "name": "Centro de arte", @@ -2722,7 +2823,7 @@ }, "amenity/bicycle_rental": { "name": "Alugamento de bicicletas", - "terms": "bici, bicicleta, aluguer, préstamo" + "terms": "bici, bicicleta, alugueiro, préstamo" }, "amenity/bicycle_repair_station": { "name": "Lugar para ferramentas de reparación de bicicletas", @@ -2761,7 +2862,7 @@ }, "amenity/casino": { "name": "Casino", - "terms": "casino, xogo, ruleta, poker, cartas, tragaperras, comecartos" + "terms": "casino, xogo, ruleta, póker, cartas, tragaperras, comecartos" }, "amenity/charging_station": { "name": "Estación de carga", @@ -2793,7 +2894,7 @@ }, "amenity/compressed_air": { "name": "Aire comprimido", - "terms": "aire, neumáticos, inflado de rodas, inchado de rodas" + "terms": "aire, pneumáticos, inflado de rodas, inchado de rodas" }, "amenity/courthouse": { "name": "Pazo de xustiza", @@ -2823,7 +2924,7 @@ }, "amenity/driving_school": { "name": "Autoescola", - "terms": "autoescola, escola de conducción, carné de conducir" + "terms": "autoescola, escola de condución, carné de conducir" }, "amenity/embassy": { "name": "Embaixada" @@ -2883,8 +2984,8 @@ "terms": "mercado, mercadillo, plaza" }, "amenity/monastery": { - "name": "Zona de monasterio", - "terms": "monasterio, área de monasterio, igrexa, capela" + "name": "Zona de mosteiro", + "terms": "mosteiro, área de mosteiro, igrexa, capela" }, "amenity/motorcycle_parking": { "name": "Aparcamento de motos", @@ -2939,13 +3040,13 @@ "name": "Mesquita" }, "amenity/place_of_worship/shinto": { - "name": "Santuario sintoísta" + "name": "Santuario xintoísta" }, "amenity/place_of_worship/sikh": { "name": "Templo Sikh" }, "amenity/place_of_worship/taoist": { - "name": "Templo Taoista" + "name": "Templo Taoísta" }, "amenity/planetarium": { "name": "Planetario" @@ -2975,15 +3076,15 @@ "terms": "baños, servizos, duchas" }, "amenity/public_bookcase": { - "name": "Estantería pública", - "terms": "estantería, biblioteca, pública, libre, libros" + "name": "Estante pública", + "terms": "estante, andel, libraría, biblioteca, pública, libre, libros" }, "amenity/ranger_station": { - "name": "Estación de gardabosques" + "name": "Estación de garda de bosques" }, "amenity/recycling": { "name": "Contenedor de reciclaxe", - "terms": "reciclaxe, contenedor, lixo, basura, orgánico, plásticos, vidrio, punto limpo" + "terms": "reciclaxe, contedor, lixo, basura, orgánico, plásticos, vidro, punto limpo" }, "amenity/recycling_centre": { "name": "Centro de Reciclaxe", @@ -3008,7 +3109,7 @@ }, "amenity/shelter": { "name": "Abrigo", - "terms": "abrigo, refuxio, cuberto, gazebo" + "terms": "abrigo, refuxio, cuberto, pavillón, gazebo" }, "amenity/shower": { "name": "Ducha", @@ -5408,7 +5509,7 @@ "attribution": { "text": "© Geofabrik GmbH, contribuidores do OpenStreetMap, CC-BY-SA" }, - "name": "OSM Inspector: Ruteiros" + "name": "OSM Inspector: Roteiros" }, "OSM_Inspector-Tagging": { "attribution": { @@ -5531,9 +5632,29 @@ "OSM-br-twitter": { "description": "Seguenos no Twitter na seguinte ligazón {url}" }, + "OSM-Facebook": { + "name": "OpenStreetMap no Facebook", + "description": "Dános un Gústame no Facebook para ver novas e actualizacións sobre OpenStreetMap" + }, + "OSM-help": { + "name": "Axuda de OpenStreetMap", + "description": "Fai unha pregunta e obtén respostas no sitio de preguntas e respostas de OSM xestionado pola comunidade." + }, "OSM-Reddit": { "name": "OpenStreetMap no Reddit", "description": "/r/openstreetmap/ é un bo sitio para aprender máis sobre OpenStreetMap. Pregúntanos calquera cousa!" + }, + "OSM-Telegram": { + "name": "Telegram do OpenStreetMap", + "description": "Únete no Telegram ao supergrupo global do OpenStreetMap en {url}" + }, + "OSM-Twitter": { + "name": "Twitter do OpenStreetMap", + "description": "Síguenos no Twitter en {url}" + }, + "OSMF": { + "name": "Fundación OpenStreetMap", + "description": "OSMF é unha organización sen ánimo de lucro establecida no Reino Unido que dá soporte ao proxecto OpenStreetMap" } } } diff --git a/dist/locales/gu.json b/dist/locales/gu.json index 8bc964b1a..a18d41060 100644 --- a/dist/locales/gu.json +++ b/dist/locales/gu.json @@ -133,8 +133,6 @@ "localized_translation_language": "ભાષા પસંદ કરો", "localized_translation_name": "નામ" }, - "login": "પ્રવેશ", - "logout": "બહાર નીકળો", "loading_auth": "ઓપનસ્ટ્રીટમેપ સાથે જોડાય છે...", "report_a_bug": "ક્ષતિની નોંધ કરાવો", "help_translate": "ભાષાંતર કરવામાં મદદ કરો", diff --git a/dist/locales/he.json b/dist/locales/he.json index 56fe8d7e1..5ca75b686 100644 --- a/dist/locales/he.json +++ b/dist/locales/he.json @@ -21,6 +21,11 @@ "description": "ניתן להוסיף מסעדות, אתרי מורשת, תיבות דואר ונקודות אחרות למפה.", "tail": "יש ללחוץ על המפה כדי להוסיף נקודה." }, + "add_note": { + "title": "הערה", + "description": "הבחנת בתקלה? כדאי לדווח לשאר הממפים.", + "tail": "יש ללחוץ על המפה כדי להוסיף הערה." + }, "browse": { "title": "עיון", "description": "ניתן להזיז את המפה ולהתמקד בה." @@ -40,7 +45,8 @@ "annotation": { "point": "נוספה נקודה.", "vertex": "נוספה נקודה לדרך.", - "relation": "נוסף קשר." + "relation": "נוסף קשר.", + "note": "נוספה הערה." } }, "start": { @@ -297,6 +303,14 @@ "create": "נוספה הגבלת פנייה", "delete": "נמחקה הגבלת פנייה" } + }, + "detach_node": { + "title": "הפרדה", + "key": "פ", + "description": "הפרדת הצומת הזה מהקווים/שטחים האלה.", + "annotation": "צומת הופרדה מקווי/שטחי הורה.", + "restriction": "לא ניתן לנתק את הצומת הזה כיוון שזה יפגע ביחס „{relation}”.", + "connected_to_hidden": "לא ניתן לנתק את הצומת הזה כיוון שהוא מחובר לתכונה נסתרת." } }, "restriction": { @@ -536,6 +550,10 @@ "osm": { "tooltip": "נתוני מפה מ־OpenStreetMap", "title": "נתוני OpenStreetMap" + }, + "notes": { + "tooltip": "נתוני הערה מ־OpenStreetMap", + "title": "הערות OpenStreetMap" } }, "fill_area": "אזורי מילוי", @@ -710,15 +728,22 @@ "cannot_zoom": "לא ניתן להתקרב יותר במצב הנוכחי.", "full_screen": "החלפת מצב מסך מלא", "gpx": { - "local_layer": "קובץ מקומי", + "local_layer": "תוסיף GPX", "drag_drop": "יש לגרור ולהשליך קובצי ‎.gpx,‏ ‎.geojson או ‎.kml לעמוד או ללחוץ על הכפתור שמשמאל לעיון", "zoom": "התקרבות לשכבה", "browse": "עיון אחר קובץ" }, + "mvt": { + "local_layer": "תוסיף MVT", + "drag_drop": "גרור והורד קובץ .mvt או .pbf או לחץ על כפתור", + "zoom": "התמקד לשכבה", + "browse": "חפש קובץ" + }, "streetside": { "tooltip": "תמונות של Streetside מבית Microsoft", "title": "שכבת תמונות (Bing Streetside)", "report": "דיווח על בעיית פרטיות עם תמונה זו", + "view_on_bing": "הצגה במפות Bing", "hires": "רזולוציה גבוהה" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "צפייה בתמונה הזאת ב־OpenStreetCam" }, + "note": { + "note": "הערה", + "title": "עריכת הערה", + "anonymous": "אלמוני", + "closed": "(נסגרה)", + "commentTitle": "תגובות", + "newComment": "תגובה חדשה", + "inputPlaceholder": "נא להקליד תגובה שתשותף עם משתמשים אחרים.", + "close": "סגירת הערה", + "open": "פתיחת הערה מחדש", + "comment": "תגובה", + "close_comment": "סגירה והוספת תגובה", + "open_comment": "פתיחה מחדש והוספת תגובה", + "report": "דיוו", + "new": "הערה חדשה", + "newDescription": "תיאור הבעיה.", + "save": "שמירת ההערה", + "login": "עליך להיכנס כדי לשנות או להגיב על ההערה הזאת.", + "upload_explanation": "התגובות שלך יופיעו בפני כל משתמשי OpenStreetMap.", + "upload_explanation_with_user": "ההערות שלך בתור {user} תהיינה זמינות באופן ציבורי לכל משתמשי OpenStreetMap." + }, "help": { "title": "עזרה", "key": "H", @@ -876,6 +922,17 @@ "boundary": "יחס *גבול* הוא קבוצה של תכונה אחת או יותר מסוג קו שמייצרות גבול מנהלי יחד.", "boundary_add": "כדי להוסיף תכונה ליחס גבול, יש לבחור את התכונה ולגלול לאגף „כל היחסים” בעורך התכונות ואז ללחוץ על {plus} כפתור ההוספה כדי להוסיף את התכונה הזאת ליחס קרוב נוכחי או ליחס חדש." }, + "notes": { + "title": "הערות", + "intro": "*הערות* משמשות להודיע למשתמשים אחרים שתכונה מסוימת דורשת תיקון או תשומת לב. הערות מסמנות מיקום מסוים במפה. כדי לצפות בהערות קיימות או להוסיף חדשות, יש ללחות על לוח {data} **נתוני מפה** כדי להפעיל את שכבת ההערות של OpenStreetMap.", + "add_note_h": "הוספת הערות", + "add_note": "כדי להוסיף הערה חדשה יש ללחוץ על הכפתור {note} **הערה** בסרגל הכלים שמעל למפה או ללחוץ על מקש הקיצור `4`. פעולה זו תשנה את סמן העכבר לסמל של צלב. כדי להציב הערה חדשה על המפה, יש למקם את סמן העכבר במקום ההערה המיועד, לאחר מכן יש ללחוץ במיקום זה עם {leftclick} הלחצן השמאלי בעכבר או ללחוץ על `רווח`.", + "move_note": "ניתן להעביר הערות חדשות בלבד. כדי להעביר הערה, עליך להציב את סמן העכבר על ההערה החדשה, לאחר מכן ללחוץ ולהחזיק את הכפתור השמאלי {leftclick} בעכבר בעת גרירת ההערה למיקומה החדש.", + "update_note_h": "סגירה, פתיחה מחדש והוספת תגובות", + "update_note": "ניתן לעדכן הערה קיימת על ידי סגירתה, פתיחתה מחדש או הוספת תגובה עליה. סגירת הערה מציינת שהתקלה נפתרה. פתיחה הערה מחדש מציינת כי הבעיה המקורית טרם נפתרה.", + "save_note_h": "שמירת הערות", + "save_note": "עליך לשמור כל עריכה בנפרד על ידי לחיצה על הכפתורים שמתחת לתגובות על ההערות. עריכות של הערות **אינן** נכללות בערכות השינויים שנשלחות על ידיך ל־OpenStreetMap." + }, "imagery": { "title": "תמונות רקע", "intro": "צילום הרקע שמופיע מתחת לנתוני המפה הוא מקור חשוב למיפוי. התמונה הזאת יכולה להיות צילומי אוויר שנאספו דרך לוויינים, מטוסים ורחפנים או סריקת מפות היסטוריות או נתוני מקור חופשיים שזמינים לציבור הרחב.", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "תמונות ברמת רחוב", - "intro": "תמונות ברמת רחוב שימושיות למיפוי תמרורים, בתי עסק ופרטים נוספים שלא ניתן לראות מהלוויין ובצילום אווירי. עורך iD תומך בתמונות ברמת רחוב בעזרת [Mapillary](https://www.mapillary.com) ו־[OpenStreetCam](https://www.openstreetcam.org).", + "intro": "תמונות ברמת הרחוב יעילות למיפוי תמרורים, בתי עסק ופרטים נוספים שלא ניתן לראות מלוויין או תצלומי אוויר. העורך iD תומך בתמונות ברמת רחוב מ־[Bing Streetside](https://www.microsoft.com/en-us/maps/streetside),‏ [Mapillary](https://www.mapillary.com), ו־[OpenStreetCam](https://www.openstreetcam.org).", "using_h": "שימוש בתמונות ברמת רחוב", "using": "כדי להשתמש בתמונות ברמת רחוב לטובת מיפוי, יש ללחוץ על הלוח {data} **נתוני מפה**  לצד המפה כדי להפעיל או להשבית את שכבות התמונות הזמינות.", "photos": "כשאפשרות זו פעילה, שכבת התמונה מציגה קו לאורך סדרה של תמונות. ברמות תקריב גבוהות יותר, עיגול מסמן כל מיקום של תמונה, וברמות תקריב יותר גדולות, חרוט מציין את המיקום אליו פנתה המצלמה כאשר התמונה צולמה.", @@ -1270,7 +1327,8 @@ "add_point": "מצב ‚הוספת נקודה’", "add_line": "מצב ‚הוספת קו’", "add_area": "מצב ’הוספת שטח’", - "place_point": "הצבת נקודה", + "add_note": "מצב ‚הוספת הערה’", + "place_point": "הצבת נקודה או הערה", "disable_snap": "יש להחזיק כדי להשבית הצמדת נקודות", "stop_line": "סיום ציור קו או שטח" }, @@ -1279,6 +1337,7 @@ "continue_line": "להמשיך את הקו במפרק הנבחר", "merge": "שילוב (מיזוג) התכונות הנבחרות", "disconnect": "ניתוק תכונות במפרק הנבחר", + "detach_node": "הפרדת הצומת הנבחר מקווי/שטחי הורה", "split": "פיצול קו לשניים במפרק הנבחר", "reverse": "היפוך כיוון קו", "move": "העברת התכונות הנבחרות", @@ -1623,6 +1682,9 @@ "label": "קיבולת", "placeholder": "50, 100, 200…" }, + "cash_in": { + "label": "הפקדה" + }, "castle_type": { "label": "סוג" }, @@ -2013,7 +2075,7 @@ "label": "סוג" }, "inscription": { - "label": "חריטה" + "label": "כתובת" }, "intermittent": { "label": "תקופתי" @@ -2278,6 +2340,9 @@ "underground": "תת־קרקעי" } }, + "passenger_information_display": { + "label": "תצוגת נתוני נוסעים" + }, "payment_multi": { "label": "צורות תשלום" }, @@ -2510,6 +2575,9 @@ "site": { "label": "סוג" }, + "site_type": { + "label": "סוג אתר" + }, "smoking": { "label": "העישון מותר", "options": { @@ -4423,8 +4491,8 @@ "terms": "מונומנט" }, "historic/ruins": { - "name": "אתר חורבן", - "terms": "אתר חורבן" + "name": "חורבות", + "terms": "אתר חורבן,חורבה" }, "historic/tomb": { "name": "קבר", @@ -4490,7 +4558,7 @@ "terms": "חצר חקלאית" }, "landuse/forest": { - "name": "יער", + "name": "יער נטוע", "terms": "יער" }, "landuse/garages": { @@ -4582,7 +4650,7 @@ "terms": "אזור אימונים" }, "landuse/orchard": { - "name": "פרדס", + "name": "מטע", "terms": "פרדס" }, "landuse/plant_nursery": { @@ -5141,7 +5209,7 @@ "terms": "ביצה" }, "natural/wood": { - "name": "יער", + "name": "חורש טבעי", "terms": "יער" }, "noexit/yes": { @@ -7441,6 +7509,10 @@ "description": "ממפים ומשתמשי OpenStreetMap סביב פורטלנד, מיין", "extendedDescription": "Maptime כשמו כן הוא, זמן ליצירת מפות. המטרה שלנו היא לפתוח את הדלת לאפשרויות מגוונות ליצירת מפות לכל מי שמעוניין על ידי יצירת מקום ללמידה שיתופית, חקירה ויצירת מפות באמצעות כלים וטכנולוגיות למיפוי." }, + "us-ma-mailinglist": { + "name": "קבוצת הדיוור Talk-us-massachusetts", + "description": "רשימת דיוור בדוא״ל לקהילת OSM במסצ׳וסטס" + }, "OpenCleveland-meetup": { "name": "קליבלנד פתוחה", "description": "שיפור OpenStreetMap באזור קליבלנד", @@ -7469,6 +7541,11 @@ "name": "OpenStreetMap העיר ניו יורק", "description": "ממפי, משתמשי, מפתחי וחובבי OpenStreetMap באיזור המטרופולין של ניו יורק " }, + "OSM-Portland-forum": { + "name": "קבוצת ה־Google של OpenStreetMap בפורטלנד", + "description": "פורום ורשימת דיוור למשתמשים OpenStreetMap באזור פורטלנד", + "extendedDescription": "קבוצה זו מיועדת לקדם שיפורים ל־OpenStreetMap באזור של פורטלנד, אורגון כדי לתמוך ביישומים כגון Open Trip Planner." + }, "OSM-Portland": { "name": "OpenStreetMap פורטלנד", "description": "ממפים ומשתמשים ב־OpenStreetMap באזור פורטלנד", diff --git a/dist/locales/hr.json b/dist/locales/hr.json index 38ced63cf..e0794fac4 100644 --- a/dist/locales/hr.json +++ b/dist/locales/hr.json @@ -1,5 +1,9 @@ { "hr": { + "icons": { + "information": "info", + "remove": "ukloni" + }, "modes": { "add_area": { "title": "Područje", @@ -25,6 +29,9 @@ }, "draw_line": { "tail": "Klikni za dodavanje više točaka linije. Klikni na druge linije da ih spojiš i dvaput klikni da završiš liniju." + }, + "drag_node": { + "connected_to_hidden": "Ovo se ne može uređivati jer je spojeno na skriveni element karte." } }, "operations": { @@ -285,6 +292,21 @@ "create": "Zabrana skretanja je dodana", "delete": "Zabrana skretanja je uklonjena" } + }, + "detach_node": { + "title": "Odvoji", + "key": "E", + "description": "Odvoji ovaj čvor s ovih linija/područja." + } + }, + "restriction": { + "controls": { + "distance": "Udaljenost" + }, + "help": { + "from": "POLAZIŠTE", + "via": "PREKO", + "to": "ODREDIŠTE" } }, "undo": { @@ -295,7 +317,7 @@ "tooltip": "Ponovi: {action}", "nothing": "Nema ništa za ponoviti." }, - "tooltip_keyhint": "Prečac:", + "tooltip_keyhint": "Kratica:", "browser_notice": "Ovaj uređivač je podržan u Firefoxu, Chromeu, Safariju, Operi i Internet Exploreru 11 ili novijoj verziji. Molim nadogradi svoj internet preglednik ili koristi Potlatch 2 program za uređivanje karte.", "translate": { "translate": "Prevedi", @@ -303,8 +325,7 @@ "localized_translation_language": "Odaberi jezik", "localized_translation_name": "Ime" }, - "login": "prijava", - "logout": "odjava", + "zoom_in_edit": "Približi za uređivanje", "loading_auth": "Spajanje na OpenStreetMap...", "report_a_bug": "Prijavi grešku", "help_translate": "Pomozi prevesti iD uređivač", @@ -331,12 +352,39 @@ "created": "Stvoreno", "about_changeset_comments": "O komentarima promjena", "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments", - "google_warning": "Spomenuo/la si Google u ovom komentaru: molim te zapamti da je kopiranje s Google karata strogo zabranjeno." + "google_warning": "Spomenuo/la si Google u ovom komentaru: molim te zapamti da je kopiranje s Google karata strogo zabranjeno.", + "google_warning_link": "https://www.openstreetmap.org/copyright" }, "contributors": { "list": "Uređivali {users}", "truncated_list": "Uređivali {users} i {count} drugih" }, + "info_panels": { + "key": "I", + "background": { + "key": "B", + "title": "Pozadina", + "zoom": "Zum", + "source": "Izvor", + "description": "Opis", + "resolution": "Rezolucija", + "accuracy": "Preciznost" + }, + "history": { + "key": "H", + "title": "Povijest", + "version": "Verzija" + }, + "location": { + "key": "L", + "title": "Lokacija" + }, + "measurement": { + "key": "M", + "geometry": "Geometrija", + "area": "Područje" + } + }, "geometry": { "point": "točka", "vertex": "čvor", @@ -562,17 +610,19 @@ "deprecated_tags": "Zastarjele oznake: {tags}" }, "zoom": { - "in": "Povećaj prikaz", - "out": "Smanji prikaz" + "in": "Približi", + "out": "Udalji" }, "cannot_zoom": "Nije moguće više udaljiti u trenutnom môdu.", "full_screen": "Slika preko cijelog zaslona", "gpx": { - "local_layer": "Lokalna datoteka", "drag_drop": "Dovuci i ispusti .gpx, .geojson ili .kml datoteku na stranicu ili klikni gumb s desne strane za pretraživanje datoteka.", "zoom": "Približi na sloj", "browse": "Potraži datoteku" }, + "mvt": { + "zoom": "Približi na sloj" + }, "mapillary_images": { "tooltip": "Ulične fotografije s Mapillary servisa", "title": "Foto preklop (Mapillary)" @@ -597,6 +647,13 @@ "title": "Pregled", "navigation_h": "Navigacija", "features_h": "Elementi karte" + }, + "editing": { + "keyboard_h": "Tipkovne kratice", + "keyboard": "Možeš vidjeti popis tipkovnih kratica kada pritisneš tipku `?`." + }, + "areas": { + "title": "Područja" } }, "intro": { @@ -845,8 +902,8 @@ } }, "shortcuts": { - "title": "Tipkovni prečaci", - "tooltip": "Prikaži tipkovne prečace.", + "title": "Tipkovne kratice", + "tooltip": "Prikaži tipkovne kratice.", "key": { "alt": "Alt", "backspace": "Backspace", @@ -882,7 +939,7 @@ "help": { "title": "Pomoć", "help": "Prikaži pomoć/dokumentaciju", - "keyboard": "Prikaži tipkovne prečace" + "keyboard": "Prikaži tipkovne kratice" }, "display_options": { "title": "Postavke prikaza", @@ -919,7 +976,6 @@ "add_point": "Dodaj točku", "add_line": "Dodaj liniju", "add_area": "Dodaj područje", - "place_point": "Postavi točku", "disable_snap": "Drži za deaktiviranje hvatanja na elemente", "stop_line": "Završi crtanje linije ili područja" }, @@ -948,6 +1004,12 @@ } } }, + "units": { + "north": "S", + "south": "J", + "east": "I", + "west": "Z" + }, "presets": { "categories": { "category-barrier": { @@ -3719,12 +3781,34 @@ }, "name": "DigitalGlobe Premium snimke" }, + "DigitalGlobe-Premium-vintage": { + "attribution": { + "text": "Uvjeti i povratne informacije" + } + }, "DigitalGlobe-Standard": { "attribution": { "text": "Uvjeti i povratne informacije" }, "name": "DigitalGlobe Standard snimke" }, + "DigitalGlobe-Standard-vintage": { + "attribution": { + "text": "Uvjeti i povratne informacije" + } + }, + "EsriWorldImagery": { + "attribution": { + "text": "Uvjeti i povratne informacije" + }, + "description": "Esri svijet snimke", + "name": "Esri svijet snimke" + }, + "EsriWorldImageryClarity": { + "attribution": { + "text": "Uvjeti i povratne informacije" + } + }, "MAPNIK": { "attribution": { "text": "© OpenStreetMap doprinositelji, CC-BY-SA" @@ -3781,6 +3865,15 @@ }, "name": "OSM Inspector: Označavanje" }, + "US-TIGER-Roads-2012": { + "name": "TIGER ceste 2012" + }, + "US-TIGER-Roads-2014": { + "name": "TIGER ceste 2014" + }, + "US-TIGER-Roads-2017": { + "name": "TIGER ceste 2017" + }, "Waymarked_Trails-Cycling": { "name": "Waymarked Trails: Biciklizam" }, diff --git a/dist/locales/hu.json b/dist/locales/hu.json index c92f871cb..ff9384ecc 100644 --- a/dist/locales/hu.json +++ b/dist/locales/hu.json @@ -346,8 +346,6 @@ "localized_translation_name": "Név" }, "zoom_in_edit": "Nagyíts a szerkesztéshez", - "login": "bejelentkezés", - "logout": "kijelentkezés", "loading_auth": "Csatlakozás az OpenStreetMap kiszolgálóhoz…", "report_a_bug": "Hibajelentés", "help_translate": "Segíts a fordításban", @@ -696,7 +694,6 @@ "cannot_zoom": "Nem lehet jobban távolítani ebben a módban.", "full_screen": "Váltás teljes képernyőre", "gpx": { - "local_layer": "Helyi fájl", "drag_drop": "Húzzon és ejtsen egy .gpx, .geojson vagy .kml fájlt az oldalra, vagy kattintson a jobb oldalon lévő gombra a tallózáshoz", "zoom": "Nagyítás a rétegre", "browse": "Tallózzon egy fájlt" @@ -1136,7 +1133,6 @@ "add_point": "„Pont hozzáadás” mód", "add_line": "„Vonal hozzáadás” mód", "add_area": "„Terület hozzáadás” mód", - "place_point": "Helyezz el egy pontot", "disable_snap": "Tartsd a pont illesztés kikapcsolásához", "stop_line": "Fejezd be a vonal vagy terület rajzolását" }, @@ -1438,6 +1434,9 @@ "board_type": { "label": "Típus" }, + "booth": { + "label": "Fülke" + }, "boules": { "label": "Típus" }, @@ -2505,7 +2504,7 @@ "label": "Típus" }, "tracktype": { - "label": "Úttípus", + "label": "Mezőgazdasági/erdészeti út típusa", "options": { "grade1": "Szilárd: burkolt vagy tömör felületű makadámút", "grade2": "Főképp szilárd: murvával/kővel tömörített földút", @@ -2913,8 +2912,8 @@ "terms": "jogosítvány, KRESZ" }, "amenity/embassy": { - "name": "Nagykövetség", - "terms": "Követség, Konzulátus, külképviselet" + "name": "Külképviselet", + "terms": "nagykövetség, követség, konzulátus, külképviselet" }, "amenity/fast_food": { "name": "Gyorsétterem", @@ -4078,8 +4077,8 @@ "terms": "Harmadrendű főút csatlakozás" }, "highway/track": { - "name": "Nem karbantartott földút", - "terms": "földút,nem karbantartott" + "name": "Nem karbantartott mezőgazdasági/erdészeti út", + "terms": "erdészeti út, földút, mezőgazdasági út, tanyasi út, földút" }, "highway/traffic_mirror": { "name": "Közlekedési tükör", @@ -4328,6 +4327,10 @@ "name": "Felnőtt játékközpont", "terms": "játékterem" }, + "leisure/beach_resort": { + "name": "Fürdőhely, vízparti strand", + "terms": "strand, fürdő, vízpart, tengerpart" + }, "leisure/bird_hide": { "name": "Madárles", "terms": "madárles" @@ -4433,7 +4436,7 @@ "terms": "Kosárlabdapálya" }, "leisure/pitch/beachvolleyball": { - "name": "Strandröplabda pálya", + "name": "Strandröplabdapálya", "terms": "strand,röplabda,röpi,pálya" }, "leisure/pitch/bowls": { @@ -4675,8 +4678,8 @@ "terms": "Öböl" }, "natural/beach": { - "name": "Strand", - "terms": "Strand" + "name": "Természetes strand", + "terms": "Strand, vízpart, tengerpart, fürdőhely" }, "natural/cave_entrance": { "name": "Barlangbejárat", diff --git a/dist/locales/hy.json b/dist/locales/hy.json index 0e66fa737..48759d332 100644 --- a/dist/locales/hy.json +++ b/dist/locales/hy.json @@ -204,7 +204,6 @@ "localized_translation_language": "Ընտրել լեզուն", "localized_translation_name": "Անուն" }, - "logout": "ելք", "loading_auth": "Կապւում է ՕփենՍթրիթՄէփը…", "report_a_bug": "Հաղորդել ծրագրի վրիպակի մասին տեղեկատւութիւն", "help_translate": "Օգնիր թարգմանել", diff --git a/dist/locales/id.json b/dist/locales/id.json index 55c8ac334..dcfb62955 100644 --- a/dist/locales/id.json +++ b/dist/locales/id.json @@ -212,7 +212,6 @@ "localized_translation_language": "Pilih Bahasa", "localized_translation_name": "Nama" }, - "logout": "keluar", "loading_auth": "Menghubungkan dengan OpenStreetMap...", "report_a_bug": "Laporkan bug", "help_translate": "Bantu menerjemahkan", diff --git a/dist/locales/is.json b/dist/locales/is.json index 3c3e91076..a3323155e 100644 --- a/dist/locales/is.json +++ b/dist/locales/is.json @@ -21,12 +21,17 @@ "description": "Bættu veitingastöðum, minnismerkjum, póstkössum eða öðrum punktum við kortið.", "tail": "Smelltu á kortið til að bæta við punkti." }, + "add_note": { + "title": "Minnispunktur", + "description": "Fannstu hnökra? Láttu annað kortagerðarfólk vita.", + "tail": "Smelltu á kortið til að bæta við minnispunkti." + }, "browse": { "title": "Fletta", "description": "Hliðraðu til og renndu að kortinu." }, "draw_area": { - "tail": "Smelltu til að bæta hnúta við svæðið. Smelltu á fyrsta hnútinn til að klára svæðið." + "tail": "Smelltu til að bæta hnútum við svæðið. Smelltu á fyrsta hnútinn til að klára svæðið." }, "draw_line": { "tail": "Smelltu til að bæta fleiri hnútum við línuna. Smelltu á aðrar línur til að tengjast þeim, og tvísmelltu til að klára línuna." @@ -40,7 +45,8 @@ "annotation": { "point": "Bætti punkti við.", "vertex": "Bætti hnúti við leið.", - "relation": "Bætti við venslum." + "relation": "Bætti við venslum.", + "note": "Bætti við minnispunkti." } }, "start": { @@ -115,7 +121,7 @@ }, "annotation": { "point": "Eyddi punkti.", - "vertex": "Eyddi hnút af leið.", + "vertex": "Eyddi hnúti af leið.", "line": "Eyddi línu.", "area": "Eyddi svæði.", "relation": "Eyddi venslum.", @@ -297,6 +303,14 @@ "create": "Bætti við takmörkunum á beygju", "delete": "Eyddi takmörkunum á beygju" } + }, + "detach_node": { + "title": "Losa", + "key": "E", + "description": "Losa þennan hnút frá þessum línum/svæðum.", + "annotation": "Losaði hnút frá yfirliggjandi línum/svæðum.", + "restriction": "Ekki er hægt að losa þetta atriði því það myndi skemma \"{relation}\" vensl.", + "connected_to_hidden": "Ekki er hægt að losa þetta atriði þar sem það er tengt földu eigindi." } }, "restriction": { @@ -352,8 +366,8 @@ "localized_translation_name": "Nafn" }, "zoom_in_edit": "Renndu að til að breyta", - "login": "innskráning", - "logout": "útskráning", + "login": "Skrá inn", + "logout": "Skrá út", "loading_auth": "Tengist við OpenStreetMap...", "report_a_bug": "Tilkynna villu", "help_translate": "Hjálpa til við að þýða", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Kortagögn frá OpenStreetMap", "title": "OpenStreetMap-gögn" + }, + "notes": { + "tooltip": "Gögn minnispunkts frá OpenStreetMap", + "title": "OpenStreetMap minnispunktar" } }, "fill_area": "Fylla svæði", @@ -710,11 +728,24 @@ "cannot_zoom": "Get ekki rennt lengra frá í núverandi ham.", "full_screen": "Víxla skjáfylli af/á", "gpx": { - "local_layer": "Skrá á tölvunni", + "local_layer": "Bæta við GPX", "drag_drop": "Dragðu og slepptu .gpx, .geojson eða .kml-skrá á síðuna, eða smelltu á hnappinn til hægri til að leita að skrá", "zoom": "Renna að lagi", "browse": "Finna skrá" }, + "mvt": { + "local_layer": "Bæta við MVT", + "drag_drop": "Dragðu og slepptu .mvt eða pbf skrá á síðuna eða smelltu á takkann til hægri til að fletta", + "zoom": "Renna að lagi", + "browse": "Finna skrá" + }, + "streetside": { + "tooltip": "Ljósmyndir í götuhæð frá Microsoft", + "title": "Ljósmyndaþekja (Bing Streetside)", + "report": "Sendu tilkynningu um að þú efist um að mynd þessi virði reglur um meðferð persónuupplýsinga", + "view_on_bing": "Skoða á Bing Maps", + "hires": "Háupplausn" + }, "mapillary_images": { "tooltip": "Ljósmyndir í götuhæð frá Mapillary", "title": "Ljósmyndaþekja (Mapillary)" @@ -733,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Skoða þessa mynd á OpenStreetCam" }, + "note": { + "note": "Minnispunktur", + "title": "Breyta minnispunkti", + "anonymous": "nafnlaus", + "closed": "(lokað)", + "commentTitle": "Athugasemdir", + "newComment": "Ný athugasemd", + "inputPlaceholder": "Settu inn athugasemd sem deilt er með öðrum notendum.", + "close": "Loka minnispunkti", + "open": "Enduropna minnispunkt", + "comment": "Athugasemd", + "close_comment": "Loka og gera athugasemd", + "open_comment": "Enduropna og gera athugasemd", + "report": "Tilkynna", + "new": "Nýr minnispunktur", + "newDescription": "Lýstu vandamálinu.", + "save": "Vista minnispunkt", + "login": "Þú verður að skrá þig inn til að breyta eða gera athugasemd við þennan minnispunkt.", + "upload_explanation": "Athugasemdir sem þú gerir verða sýnilegar öllum notendum OpenStreetMap.", + "upload_explanation_with_user": "Athugasemdir sem þú gerir sem {user} verða sýnilegar öllum notendum OpenStreetMap." + }, "help": { "title": "Hjálp", "key": "H", @@ -833,7 +885,7 @@ "point_or_area_h": "Punktar eða svæði?", "point_or_area": "Mörg fyrirbæri er hægt að tákna bæði sem punkt eða sem svæði. Meginreglan er að teikna byggingar og lóðir sem svæði þegar það er mögulegt. Settu síðan punkta inn í svæði byggingar til að tákna fyrirtæki, aðstöðu og annað slíkt sem staðsett er inni í byggingunni.", "add_area_h": "Bæta við svæðum", - "add_area_command": "Til að bæta við cvæði, smelltu á {area} **Svæði** hnappinn á verkfærastikunni fyrir ofan kortið, eða ýttu á flýtilykilinn `3`. Þá breytist músarbendillinn í krossmið.", + "add_area_command": "Til að bæta við svæði, smelltu á {area} **Svæði** hnappinn á verkfærastikunni fyrir ofan kortið, eða ýttu á flýtilykilinn `3`. Þá breytist músarbendillinn í krossmið.", "add_area_draw": "Næst skaltu setja bendilinn á eitt horn fitjunnar og {leftclick} vinstri-smella eða ýta á `Bilslá` til að fara að setja hnúta eftir útjaðri svæðisins. Haltu áfram að setja fleiri hnúta með því að smella eða ýta á `Bilslá`. Á meðan þessu stendur, geturðu breytt aðdrættinum eða dregið til kortið til að geta bætt við fleiri atriðum.", "add_area_finish": "Til að ljúka svæði, ýttu á `{return}` eða smelltu aftur á annað hvort fyrsta eða síðasta hnútinn.", "square_area_h": "Rétt horn", @@ -870,6 +922,17 @@ "boundary": "Venslin *svæðamörk* er hópur einnar eða fleiri línufitja sem saman mynda stjórnsýslutengd mörk svæða.", "boundary_add": "Til að bæta fitju við svæðamarkavensl, veldu þá fitjuna og skrunaðu niður í hlutann \"Öll vensl\" í fitjuritlinum, smelltu síðan á {plus} plúshnappinn til að bæta þessari fitju við einhver nærliggjandi vensl eða í ný vensl." }, + "notes": { + "title": "Minnispunktar", + "intro": "*Minnispunktar* eru notaðir til að láta aðra notendur vita af eigindum sem krefjast viðgerða eða athygli. Minnispunktur tengist tiltekinni staðsetningu á kortinu. Til að skoða fyrirliggjandi minnispunkta eða til að bæta við nýjum, smelltu þá á {data} **Kortagögn** spjaldið til að virkja minnispunktalagið í OpenStreetMap.", + "add_note_h": "Bæta við minnispunktum", + "add_note": "Til að bæta við nýjum minnispunkti, smelltu á {note} **Minnispunktur** hnappinn á verkfærastikunni fyrir ofan kortið, eða ýttu á flýtilykilinn `4`. Þá breytist músarbendillinn í krossmið. Til að staðsetja nýja minnispunktinn á kortinu, settu þá músarbendilinn þar sem minnispunkturinn ætti að vera, síðan skaltu {leftclick} vinstri-smella eða ýta á `Bilslá`.", + "move_note": "Einungis er hægt að færa nýja minnispunkta. Til að færa minnispunkt, staðsettu þá músarbendilinn yfir minnispunktinum, ýttu og haltu niðri {leftclick} vinstri músarhnappnum á meðan minnispunkturinn er dreginn yfir á nýju staðsetninguna.", + "update_note_h": "Lokun, enduropnun og gerð athugasemda", + "update_note": "Hægt er að uppfæra fyrirliggjandi minnispunkt með því að loka honum, enduropna hann, eða með því að bæta athugasemd við hann. Lokun minnispunkts þýðir að vandamál hefur verið leyst. Enduropnun minnispunkts þýðir að upphaflegt vandamál hefur ekki verið leyst.", + "save_note_h": "Vista minnispunkta", + "save_note": "Þú verður að vista allar athugasemdir við minnispunkt hverja fyrir sig, með því að smella á hnappana fyrir neðan athugasemdirnar. Breytingar á minnispunktum eru **ekki** innifaldar í breytingasettum sem þú sendir inn á OpenStreetMap." + }, "imagery": { "title": "Bakgrunnsmyndir", "intro": "Bakgrunnsmyndefnið sem birtist fyrir aftan kortagögnin er mikilvæg tilföng í kortagerð. Þetta geta verið loftmyndir teknar af gervitunglum, flugvélum eða drónum, nú eða söguleg landakort eða önnur tiltæk gögn.", @@ -882,7 +945,7 @@ }, "streetlevel": { "title": "Ljósmyndir í götuhæð", - "intro": "Ljósmyndir teknar í götuhæð nýtast vel við að setja inn upplýsingar um umferðarmerki, fyrirtæki og önnur fyrirbæri sem ekki er gott að átta sig á af gervihnattamyndum og loftmyndum. iD ritillinn styður ljósmyndir í götuhæð frá [Mapillary](https://www.mapillary.com) og [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Ljósmyndir teknar í götuhæð nýtast vel við að setja inn upplýsingar um umferðarmerki, fyrirtæki og önnur fyrirbæri sem ekki er gott að átta sig á af gervihnattamyndum og loftmyndum. iD ritillinn styður ljósmyndir í götuhæð frá [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) og [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Nota ljósmyndir í götuhæð", "using": "Til að nota ljósmyndir í götuhæð við kortagerð, smelltu á spjaldið {data} **Kortagögn** við hlið kortsins til að virkja tiltæk myndalög eða gera þau óvirk.", "photos": "Þegar það er virkt, sýnir myndalag línu meðfram myndarununni. Við hærri aðdráttarstig merkir hringur staðsetningu hverrar myndar, og við enn hærri aðdráttarstig birtist keila sem sýnir stefnuna sem myndavélinni var beint í þegar myndin var tekin.", @@ -1264,7 +1327,8 @@ "add_point": "'Bæta við punkti' hamur", "add_line": "'Bæta við línu' hamur", "add_area": "'Bæta við svæði' hamur", - "place_point": "Setja punkt", + "add_note": "'Bæta við minnispunkti' hamur", + "place_point": "Setja punkt eða minnispunkt", "disable_snap": "Halda niðri til að koma í veg fyrir grip í punkta", "stop_line": "Ljúka við að teikna línu eða svæði" }, @@ -1273,6 +1337,7 @@ "continue_line": "Halda áfram með línu við valinn hnút", "merge": "Sameina (setja saman) valdar fitjur", "disconnect": "Aftengja fitjur við valinn hnút", + "detach_node": "Losa hnút frá yfirliggjandi línum/svæðum", "split": "Aðskilja línu í tvennt við valinn hnút", "reverse": "Snúa við línu", "move": "Færa valdar fitjur", @@ -1949,12 +2014,14 @@ } }, "horse_riding": { + "label": "Hestaferðir", "options": { "horse_riding": "Já", "undefined": "Nei" } }, "horse_scale": { + "label": "Erfiðleikastig reiðmennsku", "options": { "common": "Auðvelt: Engin vandamál eða erfiðleikar. (sjálfgefið)" }, @@ -2476,6 +2543,15 @@ "shop": { "label": "Tegund" }, + "siren/purpose": { + "label": "Tilgangur" + }, + "siren/type": { + "label": "Tegund", + "options": { + "other": "Annað" + } + }, "site": { "label": "Tegund" }, @@ -3705,9 +3781,15 @@ "emergency/destination": { "name": "Neyðaraðgangur ef í fararleið" }, + "emergency/fire_extinguisher": { + "name": "Slökkvitæki" + }, "emergency/fire_hydrant": { "name": "Brunahani" }, + "emergency/first_aid_kit": { + "name": "Skyndihjálparkassi" + }, "emergency/life_ring": { "name": "Bjarghringur" }, @@ -3723,6 +3805,9 @@ "emergency/private": { "name": "Einka neyðaraðgangur" }, + "emergency/siren": { + "name": "Sírena" + }, "emergency/water_tank": { "name": "Neyðarvatnstankur" }, @@ -5241,6 +5326,9 @@ "shop/motorcycle": { "name": "Mótorhjólaverslun" }, + "shop/motorcycle_repair": { + "name": "Mótorhjólaviðgerðaverslun" + }, "shop/music": { "name": "Tónlistarbúð" }, @@ -5632,6 +5720,24 @@ } }, "imagery": { + "AGIV": { + "attribution": { + "text": "Nýjast frá Orthophoto Flanders © AGIV" + }, + "name": "Nýjustu loftmyndir frá AGIV Flanders" + }, + "AGIV10cm": { + "attribution": { + "text": "Orthophoto Flanders © AGIV" + }, + "name": "AGIV Flanders 2013-2015 loftmyndir 10cm" + }, + "AGIVFlandersGRB": { + "attribution": { + "text": "GRB Flanders © AGIV" + }, + "name": "AGIV Flanders GRB" + }, "Bing": { "description": "Gervihnatta- og loftmyndir.", "name": "Loftmyndir frá Bing" @@ -5732,6 +5838,12 @@ }, "name": "OSM Inspector: Merkingar" }, + "SPW_ORTHO_LAST": { + "name": "Nýjustu loftmyndir frá SPW(allonie)" + }, + "SPW_PICC": { + "name": "SPW(allonie) PICC stafrænar loftmyndir" + }, "US-TIGER-Roads-2012": { "name": "TIGER vegir 2012" }, @@ -5747,6 +5859,30 @@ "description": "Vegur: Grænn útjaðar = óflokkað. Brúnn útjaðar = slóði. Yfirborð: möl = ljósbrún fylling, malbik = svart, hellur = grátt, jarðvegur = hvítt, steypa = blátt, gras = grænt. Árstíðabundið = hvítar rendur", "name": "U.S. Forest vegayfirlag" }, + "UrbISOrtho2016": { + "attribution": { + "text": "Framkvæmt með tilstilli Brussels UrbIS®© - Dreifing & höfundarréttur CIRB" + }, + "name": "UrbIS-Ortho 2016" + }, + "UrbISOrtho2017": { + "attribution": { + "text": "Framkvæmt með tilstilli Brussels UrbIS®© - Dreifing & höfundarréttur CIRB" + }, + "name": "UrbIS-Ortho 2017" + }, + "UrbisAdmFR": { + "attribution": { + "text": "Framkvæmt með tilstilli Brussels UrbIS®© - Dreifing & höfundarréttur CIRB" + }, + "name": "UrbisAdm FR" + }, + "UrbisAdmNL": { + "attribution": { + "text": "Framkvæmt með tilstilli Brussels UrbIS®© - Dreifing & höfundarréttur CIRB" + }, + "name": "UrbisAdm NL" + }, "Waymarked_Trails-Cycling": { "attribution": { "text": "© waymarkedtrails.org, þátttakendur í OpenStreetMap, CC by-SA 3.0" @@ -5829,6 +5965,13 @@ }, "name": "OpenStreetMap (þýskur stíll)" }, + "osmse-ekonomiska": { + "attribution": { + "text": "© Lantmäteriet" + }, + "description": "Skönnun á ´Hagfræðikortum´ u.þ.b. 1950-1980", + "name": "Lantmäteriet hagfræðikort (söguleg)" + }, "qa_no_address": { "attribution": { "text": "Simon Poole, gögn eru með © þátttakendur í OpenStreetMap" @@ -5858,6 +6001,47 @@ "text": "Kort © Thunderforest, gögn eru með © þátttakendur í OpenStreetMap" }, "name": "Thunderforest landslag" + }, + "trafikverket-baninfo": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Sænska járnbrautakerfið, þ.m.t. hliðarspor", + "name": "Trafikverket járnbrautakerfið" + }, + "trafikverket-baninfo-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Sænska járnbrautakerfið með ýmsum valkostum fyrir kortalög", + "name": "Valkostir fyrir Trafikverket járnbrautakerfið" + }, + "trafikverket-vagnat": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Sænska NVDB vegakerfið", + "name": "Trafikverket vegakerfið" + }, + "trafikverket-vagnat-extra": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "name": "Viðbætur fyrir Trafikverket vegakerfið" + }, + "trafikverket-vagnat-navn": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Götuheiti sænska NVDB", + "name": "Götuheiti fyrir Trafikverket" + }, + "trafikverket-vagnat-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Sænska vegakerfið með ýmsum valkostum fyrir kortalög", + "name": "Valkostir fyrir Trafikverket vegakerfið" } }, "community": { @@ -5945,7 +6129,20 @@ "description": "Twitter-hópur OpenStreetMap í Belgíu: @osm_be" }, "talk-cz-mailinglist": { - "description": "Talk-ja er opinber póstlisti tékkneska OSM-hópsins" + "name": "Tékkneski póstlistinn (talk-cz)", + "description": "Talk-cz er opinber póstlisti tékkneska OSM-hópsins" + }, + "dk-forum": { + "name": "Vefspjall (forum) OpenStreetMap Danmörk", + "description": "Vefspjall (forum) OpenStreetMap Danmörk" + }, + "dk-irc": { + "name": "IRC-rás OpenStreetMap Danmörk", + "description": "Taktu þátt á #osm-dk á irc.oftc.net (gátt 6667)" + }, + "dk-mailinglist": { + "name": "Talk-dk póstlistinn", + "description": "Póstlisti til að ræða OpenStreetMap í Danmörku" }, "fr-twitter": { "name": "Twitter-hópur OpenStreetMap í Frakklandi", @@ -5967,10 +6164,20 @@ "description": "Telegram-hópur OpenStreetMap Spánn" }, "se-facebook": { - "name": "OpenStreetMap Sweden Facebook" + "name": "OpenStreetMap Sweden Facebook", + "description": "OpenStreetMap í Svíþjóð á Facebook" + }, + "se-forum": { + "name": "Vefspjall (forum) OpenStreetMap Svíþjóð", + "description": "Vefspjall (forum) OpenStreetMap Svíþjóð" + }, + "se-irc": { + "name": "IRC-rás OpenStreetMap Svíþjóð", + "description": "Taktu þátt á #osm-se á irc.oftc.net (gátt 6667)" }, "se-mailinglist": { - "name": "Talk-se póstlistinn" + "name": "Talk-se póstlistinn", + "description": "Póstlisti til að ræða OpenStreetMap í Svíþjóð" }, "se-twitter": { "name": "Twitter-hópur OpenStreetMap í Svíþjóð", @@ -6106,14 +6313,32 @@ "name": "Twitter-hópur OpenStreetMap Argentína", "description": "Fylgstu með okkur á Twitter á {url}" }, + "Bahia-telegram": { + "extendedDescription": "Gakktu til liðs við teymið til að læra meira um OpenStreetMap, spyrja spurninga eða taka þátt í fundum. Allir eru velkomnir!" + }, + "DF-telegram": { + "extendedDescription": "Gakktu til liðs við teymið til að læra meira um OpenStreetMap, spyrja spurninga eða taka þátt í fundum. Allir eru velkomnir!" + }, + "OSM-br-telegram": { + "extendedDescription": "Gakktu til liðs við teymið til að læra meira um OpenStreetMap, spyrja spurninga eða taka þátt í fundum. Allir eru velkomnir!" + }, "OSM-br-twitter": { "name": "Twitter-hópur OpenStreetMap í Brasilíu", "description": "Fylgstu með okkur á Twitter á {url}" }, + "OSM-CL-facebook": { + "extendedDescription": "Gakktu til liðs við teymið til að læra meira um OpenStreetMap, spyrja spurninga eða taka þátt í fundum. Allir eru velkomnir!" + }, + "OSM-CL-telegram": { + "extendedDescription": "Gakktu til liðs við teymið til að læra meira um OpenStreetMap, spyrja spurninga eða taka þátt í fundum. Allir eru velkomnir!" + }, "OSM-CL-twitter": { "name": "Twitter-hópur OpenStreetMap í Síle", "description": "Fylgstu með okkur á Twitter á {url}" }, + "OSM-CO-facebook": { + "extendedDescription": "Gakktu til liðs við teymið til að læra meira um OpenStreetMap. Allir eru velkomnir!" + }, "OSM-CO-mailinglist": { "name": "Talk-co póstlistinn" }, @@ -6144,6 +6369,9 @@ "name": "OpenStreetMap á Reddit", "description": "/r/openstreetmap/ er góður staður til að læra meira um OpenStreetMap. Spurðu okkur um allt milli himins og jarðar!" }, + "OSM-Telegram": { + "name": "Telegram fyrir OpenStreetMap" + }, "OSM-Twitter": { "name": "Twitter-hópur OpenStreetMap", "description": "Fylgstu með okkur á Twitter á {url}" diff --git a/dist/locales/it.json b/dist/locales/it.json index 65810689a..a53f0a321 100644 --- a/dist/locales/it.json +++ b/dist/locales/it.json @@ -21,6 +21,11 @@ "description": "Aggiungi alla mappa ristoranti, monumenti, cassette postali o altri punti.", "tail": "Clicca sulla mappa per inserire un punto." }, + "add_note": { + "title": "Nota", + "description": "Hai trovato un errore? Segnalalo agli altri mappatori.", + "tail": "Clicca sulla mappa per aggiungere una nota." + }, "browse": { "title": "Naviga", "description": "Muovi ed ingrandisci la mappa." @@ -40,7 +45,8 @@ "annotation": { "point": "Aggiunto un punto.", "vertex": "Aggiunto un nodo ad una strada.", - "relation": "Aggiunta una relazione." + "relation": "Aggiunta una relazione.", + "note": "Una nota aggiunta." } }, "start": { @@ -270,7 +276,7 @@ } }, "reverse": { - "title": "Inverti Direzione", + "title": "Inverti direzione", "description": "Inverti il senso di direzione di questa linea.", "key": "V", "annotation": "Cambiato verso ad una linea." @@ -297,6 +303,14 @@ "create": "Limitazione aggiunta", "delete": "Limitazione rimossa" } + }, + "detach_node": { + "title": "Stacca", + "key": "E", + "description": "Stacca questo nodo da linee/aree.", + "annotation": "Un nodo staccato da una linea/area genitore.", + "restriction": "Questo nodo non può essere staccato perché ciò danneggerebbe una relazione “{relation}”.", + "connected_to_hidden": "Questo nodo non può essere staccato perché è collegato ad un elemento nascosto." } }, "restriction": { @@ -352,8 +366,8 @@ "localized_translation_name": "Nome" }, "zoom_in_edit": "Ingrandisci per modificare", - "login": "accedi", - "logout": "esci", + "login": "Accedi", + "logout": "Esci", "loading_auth": "Connettendomi ad OpenStreetMap...", "report_a_bug": "Segnala un bug", "help_translate": "Aiuta nelle traduzioni", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Dati delle mappe da OpenStreetMap", "title": "Dati OpenStreetMap" + }, + "notes": { + "tooltip": "Dati delle note da OpenStreetMap", + "title": "Note di OpenStreetMap" } }, "fill_area": "Riempimento aree", @@ -707,18 +725,25 @@ "in": "Ingrandisci", "out": "Rimpicciolisci" }, - "cannot_zoom": "Impossibile fare zooCannot zoom out further in current mode.", + "cannot_zoom": "Impossibile rimpicciolire ulteriormente nella modalità attuale.", "full_screen": "Passa a schermo intero", "gpx": { - "local_layer": "File locale", + "local_layer": "Aggiungi GPX", "drag_drop": "Trascina e rilascia un file .gpx, .geojson o .kml sulla pagina o clicca il pulsante a destra per sceglierne uno", "zoom": "Zoom sul livello", "browse": "Scegli un file" }, + "mvt": { + "local_layer": "Aggiungi MVT", + "drag_drop": "Trascina e rilascia un file .mvt o .pbf sulla pagina oppure clicca il pulsante a destra per sceglierne uno", + "zoom": "Ingrandisci sul livello", + "browse": "Scegli un file" + }, "streetside": { "tooltip": "Foto Streetside da Microsoft", "title": "Foto sovrimpresse (Bing Streetside)", "report": "Segnala un problema di privacy su questa foto", + "view_on_bing": "Vedi su Bing Maps", "hires": "Alta risoluzione" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Visualizza questa immagine con OpenStreetCam" }, + "note": { + "note": "Nota", + "title": "Modifica nota", + "anonymous": "anonimo", + "closed": "(Chiusa)", + "commentTitle": "Commenti", + "newComment": "Nuovo commento", + "inputPlaceholder": "Inserire un commento da condividere con gli altri utenti.", + "close": "Chiudi nota", + "open": "Riapri nota", + "comment": "Commenta", + "close_comment": "Chiudi e commenta", + "open_comment": "Riapri e commenta", + "report": "Segnala", + "new": "Nuova nota", + "newDescription": "Descrivi il problema.", + "save": "Salva nota", + "login": "Per poter modificare o commentare questa nota devi aver effettuato l’accesso.", + "upload_explanation": "I tuoi commenti saranno visibili pubblicamente da tutti gli utenti di OpenStreetMap.", + "upload_explanation_with_user": "I tuoi commenti come utente {user} saranno visibili pubblicamente da tutti gli utenti di OpenStreetMap." + }, "help": { "title": "Aiuto", "key": "H", @@ -876,6 +922,17 @@ "boundary": "Una relazione *Confine* consiste in un gruppo di uno o più elementi linea che insieme formano un confine amministrativo.", "boundary_add": "Per aggiungere un elemento ad una relazione confine, seleziona l'elemento e scorri verso il basso fino alla sezione \"Tutte le relazioni\" dell'editor dell'elemento, poi clicca sul pulsante {plus} aggiungi per aggiungere l'elemento ad una relazione vicina già esistente o per crearne una nuova." }, + "notes": { + "title": "Note", + "intro": "Le *note* servono per far sapere agli altri utenti che un elemento della mappa ha bisogno di essere controllato o corretto. Le note segnano una posizione specifica della mappa. Per vedere le note esistenti o aggiungerne di nuove, clicca sul pannello {data} **Dati della mappa** e abilita il livello delle note OpenStreetMap. ", + "add_note_h": "Aggiunta di note", + "add_note": "Per aggiungere una nuova nota, clicca il pulsante {note} **Nota** sulla barra degli strumenti sopra la mappa oppure premi la scorciatoia da tastiera `4`. Il cursore del mouse diventerà un simbolo a forma di croce. Per piazzare una nuova nota sulla mappa, posiziona il cursore del mouse dove deve stare la nota e poi clicca col {leftclick} tasto sinistro del mouse oppure premi `Spazio`.", + "move_note": "Solo le nuove note possono essere spostate. Per muovere una nota, posiziona il cursore del mouse sulla nuova nota e poi premi e tieni premuto il {leftclick} tasto sinistro del mouse mentre la sposti nella sua nuova posizione.", + "update_note_h": "Chiusura, riapertura e aggiunta di commenti", + "update_note": "Una nota esistente può essere aggiornata chiudendola, riaprendola oppure commentandola. La chiusura di una nota indica che il problema è stato risolto. La riapertura di una nota indica che il problema originale non è stato risolto.", + "save_note_h": "Salvataggio delle note", + "save_note": "Devi effettuare il salvataggio delle modifiche alle note per ogni nota cliccando nei pulsanti sotto ai commenti della nota. Le modifiche alle note **non** sono incluse nei gruppi di modifica che carichi su OpenStreetMap." + }, "imagery": { "title": "Immagini di sfondo", "intro": "Le immagini di sfondo che appaiono dietro i dati della mappa sono una risorsa importante per il mappatore. Queste immagini possono essere foto aeree scattate da satelliti, aeroplani o droni oppure ancora mappe antiche digitalizzate o dati fruibili liberamente.", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "Foto a livello stradale", - "intro": "Le foto a livello stradale sono utili per mappare segnali stradali, attività commerciali e altri dettagli che non si possono vedere da foto satellitari o aeree. L'editor iD è compatibile con le foto a livello stradale di [Mapillary](https://www.mapillary.com) e [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Le foto a livello stradale sono utili per mappare segnali stradali, attività commerciali e altri dettagli che non si possono vedere da foto satellitari o aeree. L’editor iD è compatibile con le foto a livello stradale di [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) e [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Utilizzo delle foto a livello stradale", "using": "Per usare le foto a livello stradale, clicca sul pannello {data} **Dati mappa** a lato della mappa per abilitare o disabilitare i livelli di foto disponibili.", "photos": "Quando abilitato, il livello delle foto mostra una linea lungo la sequenza di foto. A livelli di ingrandimento maggiori, un cerchio indica il punto in cui ogni foto è stata scattata, mentre a livelli di ingrandimento ancora più grandi, un cono mostra la direzione della fotocamera al momento dello scatto.", @@ -1267,10 +1324,11 @@ "title": "Modifica", "drawing": { "title": "Disegna", - "add_point": "modo 'aggiungi punto'", - "add_line": "modo 'aggiungi linea'", - "add_area": "modo 'aggiungi area'", - "place_point": "Fai un punto", + "add_point": "modo ‘aggiungi punto’", + "add_line": "modo ‘aggiungi linea’", + "add_area": "modo ‘aggiungi area’", + "add_note": "modo ‘Aggiungi nota’", + "place_point": "Posiziona un nodo o una nota", "disable_snap": "Tieni premuto per disabilitare l'ancoraggio ai nodi preesistenti", "stop_line": "Termine disegno di una linea o di un'area" }, @@ -1279,6 +1337,7 @@ "continue_line": "Continua una linea dal nodo selezionato", "merge": "Unisci (fondi) gli elementi selezionati", "disconnect": "Disconnetti gli elementi dal nodo selezionato", + "detach_node": "Stacca il nodo selezionato da linee/aree genitore", "split": "Spezza una linea in due sul nodo selezionato", "reverse": "Inverti la direzione di una linea", "move": "Sposta gli elementi selezionati", @@ -1623,6 +1682,9 @@ "label": "Capienza", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Versamenti" + }, "castle_type": { "label": "Tipo" }, @@ -2278,6 +2340,9 @@ "underground": "Sotterraneo" } }, + "passenger_information_display": { + "label": "Display arrivi/partenze" + }, "payment_multi": { "label": "Tipologie di pagamento" }, @@ -2510,6 +2575,9 @@ "site": { "label": "Tipo" }, + "site_type": { + "label": "Tipo di sito" + }, "smoking": { "label": "Zona fumatori", "options": { @@ -4889,7 +4957,7 @@ }, "man_made/observatory": { "name": "Osservatorio", - "terms": "osservatorio,astronomico,meteorologico,vulcanologico,osservatorio meteorologico,osservatorio astronomico,radiotelescopio" + "terms": "osservatorio,astronomico,meteorologico,vulcanologico,osservatorio meteorologico,osservatorio astronomico,radiotelescopio,specola" }, "man_made/petroleum_well": { "name": "Pozzo petrolifero", @@ -6487,6 +6555,7 @@ "attribution": { "text": "Termini & Feedback" }, + "description": "DigitalGlobe-Standard è un set curato di immagini che copre l’86% della terra emersa mondiale, con risoluzione disponibile dai 30 ai 60cm e copertura alternativa che usa Landsat. L’età media è di 2,31 anni anche se alcune aree vengono aggiornate due volte l’anno.", "name": "Immagini DigitalGlobe Standard" }, "DigitalGlobe-Standard-vintage": { @@ -7309,6 +7378,10 @@ "description": "Mappatori e utenti OpenStreetMap nei dintorni di Portland, Maine", "extendedDescription": "Maptime è letteralmente tempo per la mappatura. La nostra missione è quella di aprire le porte della cartografia a chiunque sia interessato, creando un posto e dei momenti per l’apprendimento collaborativo, l’esplorazione, la creazione di mappe usando strumenti e tecnologie per la mappatura." }, + "us-ma-mailinglist": { + "name": "Mailinglist Talk-us-massachusetts", + "description": "Mailinglist per la comunità OSM del Massachusetts" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Miglioriamo OpenStreetMap nell’area di Cleveland", @@ -7337,6 +7410,11 @@ "name": "OpenStreetMap NYC", "description": "Mappatori e utenti OpenStreetMap, sviluppatori e appassionati nell'area Metropolitana di New York" }, + "OSM-Portland-forum": { + "name": "Gruppo Google di OpenStreetMap PDX", + "description": "Forum e mailinglist degli utenti di OpenStreetMap nell’area di Portland", + "extendedDescription": "Questo gruppo serve a facilitare i miglioramenti di OpenStreetMap nell’area di Portland (stato dell’Oregon) e per sostenere applicazioni come Open trip Planner." + }, "OSM-Portland": { "name": "OpenStreetMap Portland", "description": "Mappatori e utenti OpenStreetMap nell'area di Portland", diff --git a/dist/locales/ja.json b/dist/locales/ja.json index 252eafc6d..9aeb817da 100644 --- a/dist/locales/ja.json +++ b/dist/locales/ja.json @@ -21,6 +21,11 @@ "description": "レストランや記念碑、郵便ボックス等、ポイント情報を追加", "tail": "クリックした地点にポイントを追加します" }, + "add_note": { + "title": "メモ", + "description": "問題を指摘したら他のマッパーに知らせましょう。", + "tail": "マップをクリックしてメモを追加します。" + }, "browse": { "title": "ブラウズ", "description": "マップの拡大縮小" @@ -40,7 +45,8 @@ "annotation": { "point": "ポイントの追加", "vertex": "ウェイへのノード追加", - "relation": "リレーションを追加しました。" + "relation": "リレーションを追加しました。", + "note": "メモを追加しました。" } }, "start": { @@ -156,7 +162,7 @@ }, "disconnect": { "title": "接続解除", - "description": "ウェイの接続を解除して切り離す", + "description": "ウェイの接続を解除して切り離します。", "key": "D", "annotation": "ウェイの接続を解除", "not_connected": "ライン/エリアの接続を解除できません", @@ -297,6 +303,14 @@ "create": "進行方向制限を追加しました", "delete": "進行方向制限を削除しました" } + }, + "detach_node": { + "title": "取り外し", + "key": "E", + "description": "このノードをライン/エリアから取り外します。", + "annotation": "ノードを元のライン/エリアから取り外す。", + "restriction": "\"{relation}\" リレーションを壊してしまうため、このノードは取り外しできません。", + "connected_to_hidden": "このノードは非表示の地物に接続しているため、削除できません。" } }, "restriction": { @@ -369,8 +383,8 @@ }, "commit": { "title": "OpenStreetMapへアップロード", - "upload_explanation": "あなたがアップロードした編集内容は、OpenStreetMapを利用しているすべてのユーザが閲覧できるようになります。", - "upload_explanation_with_user": "編集した内容を {user} アカウントでアップロードし、OpenStreetMapを利用しているすべてのユーザが閲覧できるようにします。", + "upload_explanation": "あなたがアップロードした編集内容は、OpenStreetMapのデータを利用しているすべてのマップで閲覧できるようになります。", + "upload_explanation_with_user": " {user} アカウントでアップロードした編集内容は、OpenStreetMapを利用しているすべてのマップで閲覧できるようになります。", "request_review": "編集のレビューを希望します。", "save": "アップロード", "cancel": "キャンセル", @@ -534,8 +548,12 @@ "data_layers": "データレイヤの選択", "layers": { "osm": { - "tooltip": "Map data from OpenStreetMap", - "title": "OpenStreetMap data" + "tooltip": "OpenStreetMapのマップデータ", + "title": "OpenStreetMapのデータ" + }, + "notes": { + "tooltip": "OpenStreetMapのメモデータ", + "title": "OpenStreetMapのメモ" } }, "fill_area": "エリアの塗りつぶし有無", @@ -710,15 +728,22 @@ "cannot_zoom": "現在のモードでは、これ以上ズームアウトできません。", "full_screen": "フルスクリーンにする", "gpx": { - "local_layer": "ローカル・ファイル", + "local_layer": "GPXを追加", "drag_drop": "ページ上に .gpx, .geojson, .kml ファイルをドラッグ&ドロップするか、右のボタンを押して参照するかしてください", "zoom": "レイヤにズーム", "browse": "ファイルをブラウズ" }, + "mvt": { + "local_layer": "MVTを追加", + "drag_drop": "ページ上に .mvtや.pbfファイルをドラッグ&ドロップするか、画面右側のボタンをクリックしてください", + "zoom": "レイヤにズーム", + "browse": "ファイルをブラウズ" + }, "streetside": { "tooltip": "Microsoftによる街路写真", "title": "写真の重ね合わせ(Bing街路)", "report": "この画像のプライバシーについてレポートする", + "view_on_bing": "Bing 地図で確認", "hires": "高解像度" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "この画像をOpenStreetCamで見る" }, + "note": { + "note": "メモ", + "title": "メモを編集", + "anonymous": "匿名ユーザー", + "closed": "(クローズ済)", + "commentTitle": "コメント", + "newComment": "新しいコメント", + "inputPlaceholder": "他のユーザーと共有するコメントを入力。", + "close": "メモをクローズ", + "open": "メモを再オープン", + "comment": "コメント", + "close_comment": "クローズしてコメント", + "open_comment": "再オープンしてコメント", + "report": "報告", + "new": "新しいメモ", + "newDescription": "問題の内容を記述します。", + "save": "メモを保存", + "login": "ログインしないとこのメモを変更したりコメントをつけたりできません。", + "upload_explanation": "あなたのコメントはOpenStreetMap の全ユーザーに公開されます。", + "upload_explanation_with_user": "{user} としてのあなたのコメントはOpenStreetMap の全ユーザーに公開されます。" + }, "help": { "title": "ヘルプ", "key": "H", @@ -876,6 +922,17 @@ "boundary": "*境界*リレーションは、行政界を形成するひとつ以上のラインの地物のグループです。", "boundary_add": "ある地物を境界リレーションに追加するには、その地物を選んで地物エディタの「すべてのリレーション」セクションまで下にスクロールして、{plus}追加ボタンをクリックして近くにある既存のリレーションまたは新しいリレーションに追加します。 " }, + "notes": { + "title": "メモ", + "intro": "*メモ*は修正や連絡が必要な地物について、他のユーザーにアラートを送るために使います。メモはマップ上に指定された位置を示します。既存のメモを閲覧したり新しく追加する場合には、{data} **地図データ**パネルをクリックしてOpenStreetMapメモのレイヤを有効化してください。", + "add_note_h": "メモの追加", + "add_note": "新しいメモを追加する際には、マップ上部にあるツールバーの{note} **メモ**ボタンをクリックするか、ショートカットキー`4`を押してください。するとマウスカーソルのシンボルが十字型に変わります。新しいメモをマップに置く際には、マウスカーソルをメモがあるべき場所に置いて、{leftclick}左クリックするか、スペースキーを押してください。", + "move_note": "新しいメモだけが移動できます。メモを動かす際には、新しいメモの上にマウスカーソルを置いて、{leftclick}左マウスボタンを押したままメモを新しい位置にドラッグします。", + "update_note_h": "クローズ、再オープン、コメント", + "update_note": "既存のメモはクローズ済にしたり、再オープンしたり、コメントを追加したりして更新することができます。メモのクローズは問題が解決されたことを示します。メモの再オープンは元々の問題が解決されていないことを示します。", + "save_note_h": "メモの保存", + "save_note": "メモを編集したら、メモのコメントの下にあるボタンをクリックして個々に保存しなければなりません。メモの編集はOpenStreetMapにアップロードする変更セットには含まれ**ません**。" + }, "imagery": { "title": "背景画像", "intro": "マップデータの下に表示される背景画像はマッピングの重要な情報源です。この画像は宇宙衛星、航空機、ドローンによって収集された写真の場合や、歴史的な地図をスキャンしたものであったりその他のフリーに利用できる情報源のデータであったりします。", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "街路写真", - "intro": "衛星/航空写真では見えない交通標識、ビジネスの種類、その他の詳細情報などをマッピングするのには街路写真が役立ちます。iDエディタは[Mapillary](https://www.mapillary.com)や[OpenStreetCam](https://www.openstreetcam.org)の街路写真をサポートしています。", + "intro": "衛星/航空写真では見えない交通標識、ビジネスの種類、その他の詳細情報などをマッピングするのには街路写真が役立ちます。iDエディタは[Bing Streetside](https://www.microsoft.com/en-us/maps/streetside)や[Mapillary](https://www.mapillary.com)や[OpenStreetCam](https://www.openstreetcam.org)の街路写真をサポートしています。", "using_h": "街路写真の利用", "using": "街路写真をマッピングに利用するには、マップ脇にある{data}**地図データ設定**パネルをクリックして利用可能な写真レイヤを有効化/無効化してください。", "photos": "有効化すると、写真レイヤには写真の撮影順に沿ったラインが表示されます。高ズームレベルでは、各写真の位置に円形のマークがあり、より高ズームレベルでは撮影時のカメラの向きが円錐形で示されます。", @@ -1270,7 +1327,8 @@ "add_point": "「ポイントの追加」モード", "add_line": "「ラインの追加」モード", "add_area": "「エリアの追加」モード", - "place_point": "ポイントを配置", + "add_note": "「メモの追加」モード", + "place_point": "ポイントまたはメモを置く", "disable_snap": "押下中はポイント接近時の自動接続(SNAP)を無効化", "stop_line": "ラインやエリアの描画を終了" }, @@ -1279,6 +1337,7 @@ "continue_line": "選択モードでラインを継続", "merge": "選択した地物を連結(マージ)", "disconnect": "選択したノードで地物を切り離し", + "detach_node": "選択したノードを元のライン/エリアから取り外す。", "split": "選択したノードでラインを2つに分割", "reverse": "ラインを反転", "move": "選択した地物を移動", @@ -1623,6 +1682,9 @@ "label": "収容数", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "入金" + }, "castle_type": { "label": "種類" }, @@ -1970,6 +2032,14 @@ }, "horse_scale": { "label": "乗馬の難易度", + "options": { + "common": "簡易: 問題や難しさは無い。(既定値)", + "critical": "ボーダーライン: 経験のある騎手と馬なら通過可能。大きな障害物あり。橋は要注意。", + "dangerous": "危険: よく熟練した騎手と馬で好天時のみ通過可能。馬から下りる。", + "demanding": "注意して利用: でこぼこな道、たまに困難な通路。", + "difficult": "困難: 狭くて荒れた道。乗り越えるべき障害物や狭い通路の可能性あり。", + "impossible": "通過不能: 馬では道または橋が通過できない。極端に狭い、サポート不足、はしごのような障害物。生命の危険あり。" + }, "placeholder": "困難, 危険..." }, "horse_stables": { @@ -2270,6 +2340,9 @@ "underground": "地下" } }, + "passenger_information_display": { + "label": "乗客向け情報掲示板" + }, "payment_multi": { "label": "支払の種類" }, @@ -2502,6 +2575,9 @@ "site": { "label": "種類" }, + "site_type": { + "label": "遺跡の種類" + }, "smoking": { "label": "喫煙の可否", "options": { @@ -3429,7 +3505,7 @@ }, "amenity/veterinary": { "name": "獣医", - "terms": "獣医, ペット医, 病院, 医療, 動物病院" + "terms": "獣医, ペット医, 病院, 医療, 動物病院, 犬猫病院, 動物" }, "amenity/waste/dog_excrement": { "name": "犬の便入れ", @@ -4013,8 +4089,8 @@ "terms": "火災通報ボックス, 火災通報装置" }, "emergency/fire_extinguisher": { - "name": "消化器", - "terms": "消化器" + "name": "消火器", + "terms": "消火器" }, "emergency/fire_hydrant": { "name": "消火栓/消防水利", @@ -5469,127 +5545,127 @@ "terms": "変圧器" }, "public_transport/linear_platform": { - "name": "交通機関の乗り場", - "terms": "プラットホーム, 待合所, 乗り場" + "name": "交通機関のプラットホーム/のりば", + "terms": "プラットホーム, 待合所, 乗り場, ホーム, 駅, 乗降所, 停車場, 停留所, のりば" }, "public_transport/linear_platform_aerialway": { - "name": "ロープウェイ(乗り場)", - "terms": "ロープウェイ, チェアリフト, 牽引リフト, スキーリフト, リフト" + "name": "ロープウェイのりば/プラットホーム", + "terms": "ロープウェイ, チェアリフト, 牽引リフト, スキーリフト, リフト, のりば, ホーム, プラットホーム, 索道駅, 駅" }, "public_transport/linear_platform_bus": { - "name": "バス(乗り場)", - "terms": "バス停, バス乗り場, バスのりば, バス" + "name": "バスのりば/プラットホーム", + "terms": "バス停, バス乗り場, バスのりば, バス, BRT, バスターミナル, バスステーション, バスストップ, BS, のりば, ホーム, プラットホーム, 停留所, 駅" }, "public_transport/linear_platform_ferry": { - "name": "フェリー(乗り場)", - "terms": "フェリー乗り場, フェリー" + "name": "旅客船のりば/プラットホーム", + "terms": "フェリー乗り場, フェリー, 港, 船着場, 船, 客船, 旅客船, フェリーターミナル, 舟, 連絡船, 渡し船, 渡船, のりば, ホーム, プラットホーム" }, "public_transport/linear_platform_light_rail": { - "name": "ライトレール(乗り場)", - "terms": "ライトレール乗り場, ライトレール" + "name": "ライトレールのりば/プラットホーム", + "terms": "ライトレール乗り場, ライトレール, LRT, 路面電車, トラム, 駅, 停留所, 電停, 停車場, 乗降所, のりば, ホーム, プラットホーム" }, "public_transport/linear_platform_monorail": { - "name": "モノレール(乗り場)", - "terms": "モノレール乗り場, モノレール" + "name": "モノレールのりば/プラットホーム", + "terms": "モノレール乗り場, モノレール, 駅, 停車場, 停留場, のりば, ホーム, プラットホーム" }, "public_transport/linear_platform_subway": { - "name": "地下鉄(乗り場)", - "terms": "地下鉄乗り場, 地下鉄" + "name": "地下鉄のりば/プラットホーム", + "terms": "地下鉄乗り場, 地下鉄, のりば, ホーム, プラットホーム, 駅, メトロ, 地下駅, 地下鉄駅, 停車場, 停留場" }, "public_transport/linear_platform_train": { - "name": "鉄道(乗り場)", - "terms": "鉄道乗り場, 鉄道, 列車, 電車" + "name": "鉄道のりば/プラットホーム", + "terms": "鉄道乗り場, 鉄道, 列車, 電車, のりば, ホーム, プラットホーム, 駅, 停車場, 停留場" }, "public_transport/linear_platform_tram": { - "name": "トラム(乗り場)", - "terms": "トラム乗り場, トラム" + "name": "路面電車のりば/プラットホーム", + "terms": "トラム乗り場, トラム, 路面電車, LRT, ライトレール, 市電, ちんちん電車, チンチン電車, のりば, ホーム, プラットホーム, 駅, 電停, 停留場, 停車場, 乗降所" }, "public_transport/linear_platform_trolleybus": { - "name": "トロリーバス(乗り場)", - "terms": "トロリーバス乗り場, トロリーバス" + "name": "トロリーバスのりば/プラットホーム", + "terms": "トロリーバス乗り場, トロリーバス, のりば, ホーム, プラットホーム, バス停, バス乗り場, バスのりば, バス, バスターミナル, バスステーション, バスストップ, BS, のりば, ホーム, プラットホーム, 停留所" }, "public_transport/platform": { - "name": "交通機関の乗り場(全般)", - "terms": "交通機関の乗り場, 乗り場, プラットホーム" + "name": "交通機関(全般)の乗り場/プラットホーム", + "terms": "プラットホーム, 待合所, 乗り場, ホーム, 駅, 乗降所, 停車場, 停留所, 電停, のりば" }, "public_transport/platform_aerialway": { - "name": "ロープウェイ(乗り場)", - "terms": "ロープウェイ, チェアリフト, 牽引リフト, スキーリフト, リフト" + "name": "ロープウェイのりば/プラットホーム", + "terms": "ロープウェイ, チェアリフト, 牽引リフト, スキーリフト, リフト, のりば, ホーム, プラットホーム, 索道駅, 駅" }, "public_transport/platform_bus": { - "name": "バス停(乗り場)", - "terms": "バス停, バス, バス停留所, バス乗り場" + "name": "バス停のりば/プラットホーム", + "terms": "バス停, バス乗り場, バスのりば, バス, BRT, バスターミナル, バスステーション, バスストップ, BS, のりば, ホーム, プラットホーム, 停留所, 駅" }, "public_transport/platform_ferry": { - "name": "フェリー(乗り場)", - "terms": "フェリー乗り場, フェリー" + "name": "旅客船のりば/プラットホーム", + "terms": "フェリー乗り場, フェリー, 港, 船着場, 船, 客船, 旅客船, フェリーターミナル, 舟, 連絡船, 渡し船, 渡船, のりば, ホーム, プラットホーム" }, "public_transport/platform_light_rail": { - "name": "ライトレール(乗り場)", - "terms": "ライトレール乗り場, ライトレール" + "name": "ライトレールのりば/プラットホーム", + "terms": "ライトレール乗り場, ライトレール, LRT, 路面電車, トラム, 駅, 停留所, 電停, 停車場, 乗降所, のりば, ホーム, プラットホーム" }, "public_transport/platform_monorail": { - "name": "モノレール(乗り場)", - "terms": "モノレール乗り場, モノレール" + "name": "モノレールのりば/プラットホーム", + "terms": "モノレール乗り場, モノレール, 駅, 停車場, 停留場, のりば, ホーム, プラットホーム" }, "public_transport/platform_subway": { - "name": "地下鉄(乗り場)", - "terms": "地下鉄乗り場, 地下鉄, プラットホーム" + "name": "地下鉄のりば/プラットホーム", + "terms": "地下鉄乗り場, 地下鉄, のりば, ホーム, プラットホーム, 駅, メトロ, 地下駅, 地下鉄駅, 停車場, 停留場" }, "public_transport/platform_train": { - "name": "鉄道(乗り場)", - "terms": "鉄道乗り場, 鉄道, 電車, 列車, プラットホーム" + "name": "鉄道のりば/プラットホーム", + "terms": "鉄道乗り場, 鉄道, 列車, 電車, のりば, ホーム, プラットホーム, 駅, 停車場, 停留場" }, "public_transport/platform_tram": { - "name": "トラム(乗り場)", - "terms": "トラム乗り場, トラム" + "name": "路面電車のりば/プラットホーム", + "terms": "トラム乗り場, トラム, 路面電車, LRT, ライトレール, 市電, ちんちん電車, チンチン電車, のりば, ホーム, プラットホーム, 駅, 電停, 停留場, 停車場, 乗降所" }, "public_transport/platform_trolleybus": { - "name": "トロリーバス(乗り場)", - "terms": "トロリーバス乗り場, トロリーバス" + "name": "トロリーバスのりば/プラットホーム", + "terms": "トロリーバス乗り場, トロリーバス, のりば, ホーム, プラットホーム, バス停, バス乗り場, バスのりば, バス, バスターミナル, バスステーション, バスストップ, BS, のりば, ホーム, プラットホーム, 停留所" }, "public_transport/station": { - "name": "駅(全般)", - "terms": "駅" + "name": "交通機関(全般)の駅", + "terms": "駅, 停留所, 停車場, 乗降所, のりば" }, "public_transport/station_aerialway": { - "name": "ロープウェイ(駅)", + "name": "ロープウェイの駅", "terms": "ロープウェイ駅, ロープウェイ, リフト, スキーリフト, チェアリフト, 牽引リフト" }, "public_transport/station_bus": { - "name": "バス(駅/ターミナル)", + "name": "バスターミナル/バスの駅", "terms": "バス, バスターミナル, バスステーション" }, "public_transport/station_ferry": { - "name": "フェリー(駅/ターミナル)", + "name": "旅客船ターミナル/旅客港", "terms": "フェリーターミナル, フェリー" }, "public_transport/station_light_rail": { - "name": "ライトレール(駅)", + "name": "ライトレールの駅", "terms": "ライトレール駅, ライトレール" }, "public_transport/station_monorail": { - "name": "モノレール(駅)", + "name": "モノレールの駅", "terms": "モノレール駅, モノレール" }, "public_transport/station_subway": { - "name": "地下鉄(駅)", + "name": "地下鉄の駅", "terms": "地下鉄駅, 地下鉄, サブウェイ" }, "public_transport/station_train": { - "name": "鉄道(駅)", + "name": "鉄道の停車場/駅", "terms": "鉄道駅, 鉄道, 駅, 電車, 列車" }, "public_transport/station_train_halt": { - "name": "小駅(英国用)", + "name": "鉄道の停留所/駅", "terms": "小さな駅, 小駅, 駅, 鉄道" }, "public_transport/station_tram": { - "name": "トラム(駅)", + "name": "路面電車の駅", "terms": "トラム駅, トラム" }, "public_transport/station_trolleybus": { - "name": "トロリーバス(駅/ターミナル)", + "name": "トロリーバスターミナル/駅", "terms": "トロリーバス, トロリーバスターミナル" }, "public_transport/stop_area": { @@ -5645,7 +5721,7 @@ }, "railway/buffer_stop": { "name": "車止め(鉄道)", - "terms": "車止め," + "terms": "車止め" }, "railway/crossing": { "name": "踏切 (歩道)", @@ -5664,7 +5740,7 @@ "terms": "ケーブルカー" }, "railway/halt": { - "name": "小駅(英国用)" + "name": "鉄道駅(停留場)" }, "railway/level_crossing": { "name": "踏切 (車道)", @@ -5687,11 +5763,11 @@ "terms": "モノレール" }, "railway/narrow_gauge": { - "name": "軽便鉄道", - "terms": "軽便鉄道, ナローゲージ, 線路" + "name": "ナローゲージ", + "terms": "軽便鉄道, ナローゲージ, 線路, 特殊狭軌, 狭軌" }, "railway/platform": { - "name": "鉄道停車場 / プラットホーム" + "name": "プラットホーム(旧)" }, "railway/rail": { "name": "線路", @@ -5796,7 +5872,7 @@ }, "shop/bed": { "name": "寝具店", - "terms": "ベッド店, マットレス店, 寝具店, 家具, 枕" + "terms": "ベッド店, マットレス店, 寝具店, 家具, 枕, ふとん, 布団, ふとん店" }, "shop/beverages": { "name": "飲料店", @@ -6257,7 +6333,7 @@ }, "tourism/apartment": { "name": "リゾートマンション", - "terms": "リゾートマンション, リゾート, 別荘, 保養" + "terms": "リゾートマンション, リゾート, 別荘, 保養, 保養所, 保養施設" }, "tourism/aquarium": { "name": "水族館", @@ -7447,6 +7523,10 @@ "description": "Mappers and OpenStreetMap users, around Portland, ME", "extendedDescription": "Maptime is, rather literally, time for mapmaking. Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies." }, + "us-ma-mailinglist": { + "name": "Talk-us-massachusetts Mailing List", + "description": "Email mailing list for the Massachusetts OSM community" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Improve OpenStreetMap in the Cleveland area", @@ -7475,6 +7555,11 @@ "name": "OpenStreetMap NYC", "description": "Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area" }, + "OSM-Portland-forum": { + "name": "OpenStreetMap PDX Google Group", + "description": "Forum and mailing list for OpenStreetMap users in the Portland area", + "extendedDescription": "This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner." + }, "OSM-Portland": { "name": "OpenStreetMap Portland", "description": "Mappers and OpenStreetMap users in the Portland area", diff --git a/dist/locales/kn.json b/dist/locales/kn.json index f9a2dba57..d4c001a4c 100644 --- a/dist/locales/kn.json +++ b/dist/locales/kn.json @@ -307,8 +307,6 @@ "localized_translation_name": "ಹೆಸರು" }, "zoom_in_edit": "ಪರಿಷ್ಕರಿಸಲು zoom ಮಾಡಿ", - "login": "ಲಾಗಿನ್", - "logout": "ಹೊರನಡೆ", "loading_auth": "ಓಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ.....", "report_a_bug": "ದೋಷವನ್ನು ವಿವರಿಸಿ. ", "help_translate": "ಅನುವಾದಕ್ಕೆ ನೀವು ಸಹಾಯಮಾಡಿ. ", @@ -566,9 +564,6 @@ "deprecated_tags": "‍ಉಪಯೋಗಿಸದ ಗುರುತುಪಟ್ಟಿಗಳು: {tags}" }, "full_screen": "‍ಪೂರ್ಣ ಪರದೆಗೆ ಹಿಂದಿರುಗು", - "gpx": { - "local_layer": "ಸ್ಥಳೀಯ ಕಡತ" - }, "mapillary_images": { "tooltip": "ರಸ್ತೆ ಮಟ್ಟದ ಚಿತ್ರಗಳು ಮ್ಯಾಪಿಲರೀ ಇಂದ ", "title": "ಚಿತ್ರಗಳ ಹೊ‍ದಿಕೆ (Mapillary)" diff --git a/dist/locales/ko.json b/dist/locales/ko.json index 082f11991..4b63dfcf7 100644 --- a/dist/locales/ko.json +++ b/dist/locales/ko.json @@ -318,13 +318,11 @@ "browser_notice": "이 편집기는 파이어폭스, 크롬, 사파리, 오페라와 인터넷 익스플로러 11을 지원합니다. 지도를 편집하려면 사용하고 있는 브라우저를 업그레이드하거나 Potlatch 2를 사용하세요.", "translate": { "translate": "번역", - "localized_translation_label": "다언어 이름", + "localized_translation_label": "다국어 이름", "localized_translation_language": "언어 선택", "localized_translation_name": "이름" }, "zoom_in_edit": "편집하려면 확대하세요", - "login": "로그인", - "logout": "로그아웃", "loading_auth": "오픈스트리트맵에 연결 중...", "report_a_bug": "버그 제보하기", "help_translate": "번역 돕기", @@ -677,7 +675,6 @@ "cannot_zoom": "현재 모드에서 더 축소할 수 없습니다.", "full_screen": "전체 화면 전환", "gpx": { - "local_layer": "로컬 파일", "drag_drop": "페이지에서 .gpx, .geojson 또는 .kml 파일을 끌어 놓거나 오른쪽에 있는 찾아보기 버튼을 클릭하세요.", "zoom": "레이어 확대", "browse": "파일 찾아보기" @@ -1024,7 +1021,6 @@ "add_point": "'점 추가' 모드", "add_line": "'선 추가' 모드", "add_area": "'공간 추가' 모드", - "place_point": "점 놓기", "disable_snap": "점에 붙는기능 끄기", "stop_line": "선 또는 공간 그리기 끝내기" }, @@ -1578,7 +1574,7 @@ "green": "초록색", "lane": "차선", "parking_lot": "주차장", - "sidewalk": "도보" + "sidewalk": "인도" } }, "fire_hydrant/type": { @@ -2713,7 +2709,7 @@ "terms": "시계방" }, "amenity/college": { - "name": "단기대학·전문학교 부지", + "name": "전문대학 부지", "terms": "직업전문학교 부지" }, "amenity/community_centre": { @@ -3270,7 +3266,7 @@ "terms": "교회 건물" }, "building/college": { - "name": "단기대학·전문학교 건물", + "name": "전문대학 건물", "terms": "직업전문학교 건물" }, "building/commercial": { @@ -3306,6 +3302,9 @@ "name": "차고들", "terms": "차고들" }, + "building/grandstand": { + "name": "그랜드스탠드" + }, "building/greenhouse": { "name": "온실", "terms": "비닐 하우스" @@ -3623,10 +3622,16 @@ "emergency/destination": { "name": "비상시 접근 도착지" }, + "emergency/fire_extinguisher": { + "name": "소화기" + }, "emergency/fire_hydrant": { "name": "소화전", "terms": "소화전" }, + "emergency/first_aid_kit": { + "name": "구급상자" + }, "emergency/life_ring": { "name": "구명부환", "terms": "구명부표" @@ -3644,6 +3649,9 @@ "emergency/private": { "name": "민간 비상시 접근지" }, + "emergency/siren": { + "name": "사이렌" + }, "emergency/yes": { "name": "비상시 접근 가능" }, @@ -3660,7 +3668,7 @@ "terms": "보행자용 횡단보도" }, "footway/sidewalk": { - "name": "도보", + "name": "인도", "terms": "인도" }, "ford": { @@ -3807,8 +3815,8 @@ "terms": "양보 표지" }, "highway/living_street": { - "name": "주택가", - "terms": "주택가" + "name": "주택가 거리", + "terms": "주택가 거리" }, "highway/mini_roundabout": { "name": "소형 회전교차로", @@ -3816,7 +3824,7 @@ }, "highway/motorway": { "name": "고속도로", - "terms": "고속도로, 자동차 전용도로" + "terms": "고속도로" }, "highway/motorway_junction": { "name": "고속도로 분기점 / 출구", @@ -3824,7 +3832,7 @@ }, "highway/motorway_link": { "name": "고속도로 연결로", - "terms": "고속도로 연결로, 자동차 전용도로 연결로" + "terms": "고속도로 연결로" }, "highway/path": { "name": "경로", @@ -3837,12 +3845,12 @@ "name": "보행자 거리" }, "highway/primary": { - "name": "주요 도로", - "terms": "주요 도로" + "name": "1차 도로", + "terms": "1차 도로" }, "highway/primary_link": { - "name": "주요 연결로", - "terms": "주요 연결로" + "name": "1차 도로 연결로", + "terms": "1차 도로 연결로" }, "highway/raceway": { "name": "경기트렉 (모터 스포츠)", @@ -3861,16 +3869,16 @@ "terms": "알 수 없는 도로, 미확인 도로" }, "highway/secondary": { - "name": "보조 도로", - "terms": "보조 도로" + "name": "2차 도로", + "terms": "2차 도로" }, "highway/secondary_link": { - "name": "보조 연결로", - "terms": "보조 연결로" + "name": "2차 도로 연결로", + "terms": "2차 도로 연결로" }, "highway/service": { - "name": "이면도로", - "terms": "이면도로" + "name": "접근 도로", + "terms": "접근 도로" }, "highway/service/alley": { "name": "골목", @@ -3917,8 +3925,8 @@ "terms": "3차 도로" }, "highway/tertiary_link": { - "name": "3차 연결로", - "terms": "3차 연결로" + "name": "3차 도로 연결로", + "terms": "3차 도로 연결로" }, "highway/track": { "name": "농·임도", @@ -3933,12 +3941,12 @@ "terms": "교통신호" }, "highway/trunk": { - "name": "간선 도로", - "terms": "간선 도로" + "name": "고속화도로", + "terms": "고속화도로" }, "highway/trunk_link": { - "name": "간선 연결로", - "terms": "간선 연결로" + "name": "고속화도로 연결로", + "terms": "고속화도로 연결로" }, "highway/turning_circle": { "name": "선회권", @@ -4154,10 +4162,10 @@ }, "landuse/residential": { "name": "주거 지역", - "terms": "주거지역" + "terms": "주거 지역" }, "landuse/retail": { - "name": "소매점 지역", + "name": "소매 지역", "terms": "상업 지역" }, "landuse/vineyard": { @@ -4988,7 +4996,7 @@ "terms": "배,보트,부두,페리,잔교,대중교통,역,터미널" }, "public_transport/station_light_rail": { - "name": "경전철 역", + "name": "경전철역", "terms": "전기,경전철,라이트 레일,대중교통,철도,선로,역,터미널,트롤리" }, "public_transport/station_monorail": { diff --git a/dist/locales/ku.json b/dist/locales/ku.json index cfb02583f..1dc30bfea 100644 --- a/dist/locales/ku.json +++ b/dist/locales/ku.json @@ -49,8 +49,6 @@ "localized_translation_name": "Nav" }, "zoom_in_edit": "Ji bo guherandinê nêzîk bike", - "login": "têkeve", - "logout": "derkeve", "commit": { "save": "Bişîne", "cancel": "Betal bike", diff --git a/dist/locales/lt.json b/dist/locales/lt.json index 8bb0abafa..4495bc5f7 100644 --- a/dist/locales/lt.json +++ b/dist/locales/lt.json @@ -303,8 +303,6 @@ "localized_translation_language": "Pasirinkti kalbą", "localized_translation_name": "Pavadinimas" }, - "login": "prisijungti", - "logout": "atsijungti", "loading_auth": "Jungiamasi prie OpenStreetMap...", "report_a_bug": "Pranešti apie klaidą", "help_translate": "Padėkite versti", @@ -562,7 +560,6 @@ "cannot_zoom": "Negalima atitolinti šiame režime.", "full_screen": "Perjungti pilną ekraną", "gpx": { - "local_layer": "Vietinis failas", "drag_drop": "Tempkite ir numeskite .gpx, .geojson arba .kml failą ant puslapio arba spauskite mygtuką dešinėje, kad naršytumėte", "zoom": "Išdidinti sluoksnį", "browse": "Naršyti failo" diff --git a/dist/locales/lv.json b/dist/locales/lv.json index 889bb73f4..eeb8c6ca8 100644 --- a/dist/locales/lv.json +++ b/dist/locales/lv.json @@ -90,7 +90,8 @@ "area": "Apgabala leņķi pārvedoti par taisnleņķiem." }, "not_squarish": "Šo objektu nevar pārveidot par kvadrātu, jo tas nav kvadrātformas.", - "too_large": "Šo objektu nevar pārveidot par kvadrātu, jo tas nav pietiekami redzams." + "too_large": "Šo objektu nevar pārveidot par kvadrātu, jo tas nav pietiekami redzams.", + "connected_to_hidden": "Šo nevar padarīt par kvadrātveida, jo tas ir pievienots pie slēpta objekta." }, "straighten": { "title": "Iztaisnot", @@ -113,6 +114,18 @@ "area": "Apgabals dzēsts.", "relation": "Relācija dzēsta.", "multiple": "Izdzēsti {n} objekti." + }, + "too_large": { + "single": "Šo objektu nevar dzēst, jo tas nav pietiekami redzams.", + "multiple": "Šos objektus nevar dzēst, jo tie nav pietiekami redzami." + }, + "incomplete_relation": { + "single": "Šo objektu nevar dzēst, jo tas nav pilnībā lejuplādēts.", + "multiple": "Šos objektus nevar dzēst, jo tie nav pilnībā lejupielādēti." + }, + "connected_to_hidden": { + "single": "Šo objektu nevar dzēst, jo tas ir pievienots paslēptam objektam.", + "multiple": "Šos objektus nevar dzēst, jo daži no tiem ir pievienoti paslēptiem objektiem." } }, "add_member": { @@ -127,7 +140,8 @@ "vertex": "Līnija savienota ar citu.", "line": "Līnija savienota ar līniju.", "area": "Līnija savienota ar apgabalu." - } + }, + "restriction": "Šos objektus nevar savienot, jo tas bojātu \"{relation}\" relāciju." }, "disconnect": { "title": "Atvienot", @@ -140,6 +154,7 @@ "title": "Sapludināt", "description": "Apvienot šos objektus.", "key": "C", + "annotation": "Apvienoja {n} objektus.", "not_eligible": "Šos objektus nevar apvienot." }, "move": { @@ -192,6 +207,14 @@ "line": "Līnija pagriezta.", "area": "Apgabals pagriezts.", "multiple": "Pagrieza vairākus objektus" + }, + "incomplete_relation": { + "single": "Šo objektu nevar pagriezt, jo tas nav pilnībā lejuplādēts.", + "multiple": "Šos objektus nevar pagriezt, jo tie nav pilnībā lejupielādēti." + }, + "too_large": { + "single": "Šo objektu nevar pagriezt, jo tas nav pietiekami redzams.", + "multiple": "Šos objektus nevar pagriezt, jo tie nav pietiekami redzami." } }, "reverse": { @@ -203,6 +226,7 @@ "split": { "title": "Sadalīt", "description": { + "line": "Sadalīt šo līniju divās daļās šajā punktā.", "area": "Sadalīt šī apgabala robežu divās daļās." }, "key": "X", @@ -244,8 +268,6 @@ "localized_translation_name": "Vārds" }, "zoom_in_edit": "Pietuvini lai labotu", - "login": "Ienākt", - "logout": "Iziet", "loading_auth": "Savienojas ar OpenStreetMap...", "report_a_bug": "Ziņot par kļūdu", "help_translate": "Palīdzi tulkot", @@ -518,9 +540,17 @@ }, "streetlevel": { "title": "Ielas līmeņa attēli" + }, + "field": { + "restrictions": { + "modifying": { + "title": "Rediģē" + } + } } }, "intro": { + "ok": "Labi", "graph": { "block_number": "", "county": "", @@ -532,7 +562,10 @@ "state": "", "subdistrict": "", "suburb": "", - "countrycode": "lv" + "countrycode": "lv", + "name": { + "pizza-hut": "Čilli pica" + } }, "navigation": { "title": "Navigācija" @@ -546,12 +579,25 @@ "lines": { "title": "Līnijas" }, + "buildings": { + "title": "Ēkas" + }, "startediting": { + "title": "Sākt rediģēt", + "help": "Tu tagad esi gatavs rediģēt OpenStreetMap!{br}Tu vari atskaņot šo walkthrough jebkurā laikā, vai arī apskatīt papildus dokumentāciju spiežot {button} Palīdzības pogu vai spiežot '{key}' taustiņu.", "save": "Neizmirstiet regulāri saglabāt izmaiņas!", "start": "Sāc kartēt!" } }, "shortcuts": { + "title": "Klavietūras īsinājumtaustiņi", + "tooltip": "Rādīt īsinājumtaustiņu ekrānu.", + "toggle": { + "key": "?" + }, + "key": { + "alt": "Alt" + }, "browsing": { "navigation": { "zoom": "Tuvināt / Tālināt" @@ -647,7 +693,11 @@ "exit": "Izeja" } }, + "aerialway/capacity": { + "placeholder": "500, 2500, 5000..." + }, "aerialway/duration": { + "label": "Ilgums (minūtēs)", "placeholder": "1, 2, 3..." }, "aerialway/heating": { @@ -2793,6 +2843,9 @@ "tourism/attraction": { "name": "Tūrisma objekts" }, + "tourism/camp_site": { + "name": "Kempinga vieta" + }, "tourism/gallery": { "name": "Mākslas galerija" }, @@ -2838,6 +2891,21 @@ "traffic_calming/bump": { "name": "Guļošais Policists" }, + "traffic_calming/hump": { + "name": "Guļošais Policists" + }, + "type/boundary": { + "name": "Robeža" + }, + "type/boundary/administrative": { + "name": "Administratīvā robeža" + }, + "type/restriction": { + "name": "Aizliegums" + }, + "vertex": { + "name": "Cits" + }, "waterway": { "name": "Ūdensceļš" }, @@ -3207,8 +3275,17 @@ "name": "OpenStreetMap Gana Twitterī", "description": "Seko mums Twitterī: {url}" }, + "talk-gh": { + "name": "Talk-gh E-pasta saraksts", + "description": "Talk-gh ir Oficiāls E-Pasta saraksts Ganas OSM kopienai." + }, "osm-mg-facebook": { - "name": "OpenStreetMap Madagaskaras Facebook Grupa" + "name": "OpenStreetMap Madagaskaras Facebook Grupa", + "description": "Malgašu Facebook grupa cilvēkiem, kas interesējas par OpenStreetMap." + }, + "talk-mg": { + "name": "Talk-mg E-pasta liste", + "description": "Vieta, kur Madagaskaras OpenStreetMap lietotāji, kopienas un kartētāji var dalīties un diskutēt." }, "OSM-BGD-facebook": { "name": "OpenStreetMap Bangladeša", @@ -3216,30 +3293,39 @@ "extendedDescription": "Kartē Bangladešā? Ir jautājumi, vai gribi sazināties ar mūsu kopienu? Pievienojies {url}. Visi ir gaidīti!" }, "OSM-India-facebook": { + "name": "OpenStreetMap Indija - Apkārtnes kartēšana", "description": "Uzlabo OpenStreetMap Indijā", "extendedDescription": "Kartē indijā? Ir jautājumi, gribi sazināties ar mūsu kopienu? Pievienojies {url}. Visi ir gaidīti!", "events": { "sotmasia2018": { + "name": "State of the Map Āzija 2018", + "description": "Pievienojies 2018. gada OpenStreetMap State of the Map Asia konferencei Indijā.", "where": "Indijas Vadības Institūts, Bengalūru, Indija" } } }, "OSM-india-mailinglist": { - "name": "OpenStreetMap Indijas Adresātu Saraksts" + "name": "OpenStreetMap Indijas Adresātu Saraksts", + "description": "Talk-in ir Oficiāls E-Pasta saraksts Indiešu OSM kopienai." }, "OSM-india-twitter": { "name": "OpenStreetMap Indija Twiteris", "description": "Mēs esam viena tvīta attālumā: {url}" }, "OSM-India-Puducherry-Facebook": { - "name": "Brīvas Programmatūras un Aparatūras Kustība - Facebook" + "name": "Brīvas Programmatūras un Aparatūras Kustība - Facebook", + "description": "FSHM Facebook lapa, lai uzzinātu par kopienas notikumiem un aktivitātēm", + "extendedDescription": "FSHM organizē saietus jebkam, kas ir saistīts ar brīvu programmatūru/aparatūru, tehnoloģiju, aktīvismu un OpenStreetMap. Facebook lapa ir labākais veids kā turēties kontaktā ar mūsu notikumiem." }, "OSM-India-Puducherry-Matrix": { - "name": "Brīvas Programmatūras un Aparatūras Kustība - Matrix" + "name": "Brīvas Programmatūras un Aparatūras Kustība - Matrix", + "description": "FSHM Riot grupa, lai diskutētu, dalītos un atjaunotu kartēšanas aktivitātes un notikumus ap Pudučerri.", + "extendedDescription": "FSHM kopienas biedri dalās ar saviem OSM labojumiem / pieredzi caur Riot.im grupu. Šo grupu arī izmanto lai diskutētu par brīvu aparatūru / programmatūru, tehnoloģiju un aktīvismu. " }, "OSM-IDN-facebook": { "name": "OpenStreetMap Indonēzija", - "description": "Uzlabo OpenStreetMap Indonēzijā" + "description": "Uzlabo OpenStreetMap Indonēzijā", + "extendedDescription": "Kartē Indonēzijā? Ir jautājumi, gribi sazināties ar mūsu kopienu? Pievienojies {url}. Visi ir gaidīti!" }, "OSM-japan-facebook": { "name": "OpenStreetMap Japānas Kopiena", @@ -3262,7 +3348,8 @@ "description": "Neoficiāls Kanāls priekš OpenStreetMap kartētājiem, kopienām un lietotājiem Korejā, kur dalīties un diskutēt." }, "OSM-MY-facebook": { - "name": "OpenStreetMap Malaizija Facebookā" + "name": "OpenStreetMap Malaizija Facebookā", + "description": "Čatam par jebko, kas ir saistīts ar OpenStreetMap!" }, "OSM-MY-forum": { "name": "OpenStreetMap Malaizijas forums", @@ -3292,6 +3379,7 @@ "description": "Esiet sveicināti OpenStreetMap Filipīnās, kur mēs aicinām visus Filipīniešus pievienoties un atbalstīt OpenStreetMap projektu." }, "OSM-PH-mailinglist": { + "name": "Talk-ph E-pasta liste", "description": "Adresātu saraksts, kur var diskutēt par OpenStreetMap Filipīnās" }, "OSM-PH-slack": { @@ -3316,10 +3404,17 @@ "extendedDescription": "Kartē Šrilankā? Ir jautājumi, vai gribi sazināties ar mūsu kopienu? Pievienojies {Url}. Visi ir gaidīti!" }, "OSM-TW-facebook": { - "name": "OpenStreetMap Taivānas Kopiena" + "name": "OpenStreetMap Taivānas Kopiena", + "description": "Facebook grupa OpenStreetMap kartētājiem, lai diskutētu par notikumiem Taivānā." }, "OSM-TW-mailinglist": { - "name": "OpenStreetMap Taivānas Adresātu Saraksts" + "name": "OpenStreetMap Taivānas Adresātu Saraksts", + "description": "Talk-tw ir Oficiāls E-Pasta saraksts, kur kopienas var diskutēt par notikumiem Taivānā." + }, + "OSM-TH-CNX-meetup": { + "name": "OSM saiets Chiang Mai", + "description": "Neregulārs OpenStreetMap kopienas saiets Chiang Mai", + "extendedDescription": "OpenStreetMap kopienas biedri satiekas ik pa pāris mēnešiem Chiang Mai. Sazienies ar mums un apskati {url} lai redzētu kad notiek nākošais saiets." }, "OSM-TH-facebook": { "name": "OpenStreetMap TH Facebook grupa", @@ -3334,7 +3429,9 @@ "description": "OpenStreetMap Albānijas forums" }, "al-maptime-tirana": { - "description": "Ap kartēšanu organizēti sociālie notikumi - iesācēji laipni lūgti!" + "name": "Maptime Tirāna", + "description": "Ap kartēšanu organizēti sociālie notikumi - iesācēji laipni lūgti!", + "extendedDescription": "Maptime ir atvērta mācību vide visiem zināšanu līmeņiem, dodot mācību atbalstu iesācējiem. Maptime ir gan elastīgs, gan strukturēts, veidojot vietu kartēšanas konsultācijām, darbnīcām, ejošiem projektiem ar vienu mērķi un neatkarīgam/sadarbīgam darba laikam." }, "al-telegram": { "name": "OSM Albānijas Telegram kanāls", @@ -3344,15 +3441,33 @@ "name": "OpenStreetMap Austrijas Forums", "description": "Oficiālais forums priekš OpenStreetMap jautājumiem Austrijā un apkārt tai!" }, + "at-mailinglist": { + "name": "Talk-ph E-pasta liste", + "description": "Talk-at ir Oficiāls E-Pasta saraksts Austrijas OSM kopienai." + }, + "at-twitter": { + "name": "OpenStreetMap Austrija Twiteris", + "description": "OpenStreetMap Austrija Twitterī: {url}" + }, + "osmgraz-meetup": { + "name": "OSM kopienas saiets Grācā", + "description": "Ikmēneša saiets OpenStreetMap kopienai Grācā" + }, + "osmgraz-twitter": { + "name": "OSM Grācas kopienas twitteris", + "description": "OpenStreetMap Grācas kopienas twitteris" + }, "osm-at": { - "name": "OpenStreetMap Austrija" + "name": "OpenStreetMap Austrija", + "description": "Platforma informācijai par OpenStreetMap Austrijā" }, "byosm": { "name": "OpenStreetMap Baltkrievija", "description": "OpenStreetMap Baltkrievijas telegram čats" }, "be-facebook": { - "name": "OpenStreetMap BE Kopiena" + "name": "OpenStreetMap BE Kopiena", + "description": "Kartētāji un OpenStreetMap lietotāju Facebook Beļģijā" }, "be-forum": { "name": "OpenStreetMap BE forums", @@ -3363,8 +3478,14 @@ "description": "Pievienojies #osmbe kanālam irc.oftc.net serverī (6667 ports)", "extendedDescription": "Pievienojies #osmbe kanālam irc.oftc.net serverī (6667 ports), tas ir savienots ar Matrix čata kanālu" }, + "be-mailinglist": { + "name": "Talk-mg E-pasta saraksts", + "description": "Talk-be ir Oficiāls E-Pasta saraksts Beļģijas OSM kopienai." + }, "be-maptime": { - "description": "Ap kartēšanu organizēti sociālie notikumi - iesācēji laipni lūgti!" + "name": "Maptime Beļģija", + "description": "Ap kartēšanu organizēti sociālie notikumi - iesācēji laipni lūgti!", + "extendedDescription": "Maptime ir atvērta mācību vide visiem zināšanu līmeņiem, dodot mācību atbalstu iesācējiem. Maptime ir gan elastīgs, gan strukturēts, veidojot vietu kartēšanas konsultācijām, darbnīcām, ejošiem projektiem ar vienu mērķi un neatkarīgam/sadarbīgam darba laikam." }, "be-matrix": { "name": "OpenStreetMap BE Matrix kanāls", @@ -3388,17 +3509,26 @@ "name": "OpenStreetMap Horvātijas IRC", "description": "Pievienojies kanālam #osm-hr, serverī irc.freenode.org (6667 ports)" }, + "hr-mailinglist": { + "name": "Talk-hr E-pasta saraksts", + "description": "Talk-mg e-pasta saraksts" + }, "czech-community": { "name": "Čehijas OSM Kopiena", "description": "Kartes portāls, mājaslapa un kontakinformācija OSM biedriem Čehijā" }, "osmcz-facebook": { - "name": "OpenStreetMap CZ Facebookā" + "name": "OpenStreetMap CZ Facebookā", + "description": "Seko Čehu kopienai Facebook - ieskaitot tulkotu WeeklyOSM!" }, "osmcz-twitter": { "name": "Čehu twitteris @osmcz", "description": "Seko Čehu kopienai Twitterī - ieskaitot tulkotu WeeklyOSM!" }, + "talk-cz-mailinglist": { + "name": "Čehu e-pasta saraksts (talk-cz)", + "description": "Talk-cz ir Oficiāls E-Pasta saraksts Čehu OSM kopienai" + }, "dk-forum": { "name": "OpenStreetMap Dānijas interneta forums", "description": "OpenStreetMap Dānijas interneta forums" @@ -3407,6 +3537,22 @@ "name": "OpenStreetMap Dānijas IRC", "description": "Pievienojies #osm-dk kanālam irc.oftc.net serverī (6667 ports)" }, + "dk-mailinglist": { + "name": "Talk-dk E-pasta saraksts", + "description": "E-pasta saraksts, kur var diskutēt par OpenStreetMap Dānijā" + }, + "fi-forum": { + "name": "OpenStreetMap FI forums", + "description": "OpenStreetMap Somijas interneta forums" + }, + "fi-irc": { + "name": "OpenStreetMap Somijas IRC", + "description": "Pievienojies #osm-fi kanālam irc.oftc.net serverī (6667 ports)" + }, + "fi-mailinglist": { + "name": "Talk-fi E-pasta saraksts", + "description": "Talk-fi ir Oficiāls E-Pasta saraksts Austrijas OSM kopienai." + }, "fr-facebook": { "name": "OpenStreetMap Francijas Facebook lapa", "description": "OpenStreetMap Francijas Facebook lapa" @@ -3419,10 +3565,18 @@ "name": "OpenStreetMap Francijas IRC", "description": "Pievienojies #osm-fr kanālam irc.oftc.net serverī (6667 ports)" }, + "fr-mailinglist": { + "name": "Talk-fr E-pasta saraksts", + "description": "Talk-fr e-pasta saraksts" + }, "fr-twitter": { "name": "OpenStreetMap Francija Twitterī", "description": "OpenStreetMap Francija Twitterī: {url}" }, + "de-berlin-mailinglist": { + "name": "Berlīnes e-pasta saraksts", + "description": "Šis ir e-pasta saraksts Berlīnes OSM kopienai" + }, "de-berlin-meetup": { "name": "OpenStreetMap Berlīnes-Brandenburgas Saiets", "description": "Kartētāji un OpenStreetMap lietotāji Berlīnes apkārtnē" @@ -3443,37 +3597,264 @@ "name": "OpenStreetMap Vācijas IRC", "description": "Pievienojies #osm-de kanālam irc.oftc.net serverī (6667 ports)" }, + "de-mailinglist": { + "name": "Talk-de E-pasta saraksts", + "description": "Talk-de ir Oficiāls E-Pasta saraksts Vācijas OSM kopienai" + }, + "de-ostwestfalen-lippe-mailinglist": { + "name": "OWL e-pasta saraksts" + }, + "de-telegram": { + "name": "OpenStreetMap Vācijas Telegram", + "description": "Pievienojies OpenStreetMap Vācijas Telegram supergrupai šeit: {url}" + }, + "osm-de": { + "name": "OpenStreetMap Vācija", + "description": "Platforma informācijai par OpenStreetMap Vācijā" + }, + "hu-facebook": { + "name": "OpenStreetMap HU Facebookā.", + "description": "Kartētāji un OpenStreetMap lietotāju Facebook Ungārijā" + }, + "hu-forum": { + "name": "OpenStreetMap HU forums", + "description": "OpenStreetMap Ungārijas interneta forums" + }, + "hu-meetup": { + "name": "OpenStreetMap Ungārijas saiets", + "description": "Platforma saietu organizēšanai Ungārijā" + }, + "it-facebook": { + "name": "OpenStreetMap Itālijas Facebooks ", + "description": "Pievinojies OpenStreetMap Itālijas kopienai Facebookā" + }, + "it-irc": { + "name": "OpenStreetMap Itālijas IRC", + "description": "Pievienojies #osm-it kanālam irc.oftc.net serverī (6667 ports)" + }, + "it-mailinglist": { + "name": "Talk-it E-pasta saraksts", + "description": "Talk-it ir Oficiāls E-Pasta saraksts Itāļu OSM kopienai." + }, + "it-telegram": { + "name": "@OpenStreetMapItalia Telegram", + "description": "OpenStreetMap itālijas Telegram čats" + }, + "it-twitter": { + "name": "OpenStreetMap Itālijas Twiteris", + "description": "Seko mums Twitterī: {url}" + }, + "OSM-Rome-meetup": { + "name": "Incontro Mappatori Romani", + "description": "Uzlabo OpenStreetMap Romas apkārtnē" + }, + "South-Tyrol-Mailing-List": { + "name": "OpenStreetMap Dienvidtiroles e-pasta saraksts", + "description": "OpenStreetMap Itālijas reģionālais saziņas saraksts Dienvidtirolei" + }, + "talk-it-lazio": { + "name": "OpenStreetMap IT Lazio", + "description": "Visi ir laipni aicināti! Piesakies {signupUrl}", + "extendedDescription": "E-pasta saraksts kartētājiem Romā un Lazio apkārtnē." + }, + "Trentino-Mailing-List": { + "name": "OpenStreetMap Trentino e-pasta saraksts", + "description": "OpenStreetMap Itālijas reģionālais saziņas saraksts Trentino" + }, "no-forum": { "name": "OpenStreetMap Norvēģijas interneta forums", "description": "OpenStreetMap Norvēģijas interneta forums" }, "no-irc": { - "name": "OpenStreetMap Norvēģijas IRC" + "name": "OpenStreetMap Norvēģijas IRC", + "description": "Čata telpa kartētājiem un OpenStreetMap lietotājiem, izstrādātājiem un entuziastiem Norvēģijā" + }, + "no-mailinglist": { + "name": "OpenStreetMap Norvēģijas e-pasta saraksts", + "description": "E-pasta saraskts OpenStreetMap kartētājiem, lietotājiem, izstrādātājiem un entuziastiem Norvēģijā" + }, + "OSM-PL-facebook-group": { + "name": "OpenStreetMap Polijas Facebook grupa", + "description": "Grupas kartētājiem un OpenStreetMap lietotājiem Polijā" + }, + "OSM-PL-forum": { + "name": "OpenStreetMap Polijas forums", + "description": "Forums OpenStreetMap Polijas kopienai" + }, + "si-forum": { + "name": "OpenStreetMap Slovēnijas Forums", + "description": "Forums OpenStreetMap Slovēnijas kopienai" + }, + "si-mailinglist": { + "name": "OpenStreetMap Slovēnijas e-pasta saraksts", + "description": "E-pasta saraksts Slovēnijas OpenStreetMap kopienai" + }, + "OSM-ES-mailinglist": { + "name": "Talk-es e-pasta saraksts", + "description": "E-pasta saraksts, kur var diskutēt par OpenStreetMap Spānijā" + }, + "OSM-ES-telegram": { + "name": "@OSMes Telegrammā", + "description": "OpenStreetMap Spānijas telegram čats" + }, + "osm-se": { + "name": "OpenStreetMap.se", + "description": "Nodrošina OSM servisus un informāciju vietējai Zviedrijas kopienai" + }, + "se-facebook": { + "name": "OpenStreetMap Zviedrijas Facebooks", + "description": "OpenStreetMap Zviedrija Facebookā." + }, + "se-forum": { + "name": "OpenStreetMap Zviedrijas interneta forums", + "description": "OpenStreetMap Zviedrijas interneta forums" + }, + "se-irc": { + "name": "OpenStreetMap Zviedrijas IRC", + "description": "Pievienojies #osm.se kanālam irc.oftc.net serverī (6667 ports)" + }, + "se-mailinglist": { + "name": "Talk-se E-pasta saraksts", + "description": "E-pasta saraksts, kur var diskutēt par OpenStreetMap Zviedrijā" + }, + "se-twitter": { + "name": "OpenStreetMap Zviedrija Twitterī", + "description": "Seko mums Twitterī: {url}" + }, + "gb-mailinglist": { + "name": "Talk-gb E-pasta saraksts" }, "gb-irc": { - "description": "Pievienojies #osm-gb kanālam irc.oftc.net serverī (6667 ports)" + "description": "Pievienojies #osm-gb kanālam irc.oftc.net serverī (6667 ports)", + "extendedDescription": "Pievienojies #osm-gb kanālam irc.oftc.net serverī (6667 ports), Lūdzu esi pacietīgs un pagaidi pāris minūtes pirms uzdod jautājumu" + }, + "OSM-CA-Slack": { + "name": "OSM-CA Slack", + "description": "Visi ir laipni aicināti! Piesakies {signupUrl}" + }, + "OSM-Vancouver-meetup": { + "name": "OpenStreetMap Vankūvera", + "description": "Kartētāji un OpenStreetMap lietotāji Vankūveras, BC apkārtnē" + }, + "OSM-CU-telegram": { + "name": "OSM Kubas Telegram", + "description": "OpenStreetMap Kubas Telegram čats" + }, + "Central-Pennsylvania-OSM": { + "name": "Centrālās Pensilvānijas OSM" + }, + "Maptime-ME-meetup": { + "name": "MaptimeME" + }, + "PHXGeo-twitter": { + "description": "Seko mums Twitterī: {url}" + }, + "talk-au": { + "name": "Talk-au E-pasta saraksts" + }, + "OSM-AR-mailinglist": { + "name": "Talk-ar E-pasta saraksts", + "description": "Vēsturisks e-pasta saraksts. Gandrīz vai vispār netiek lietots." + }, + "OSM-AR-twitter": { + "description": "Seko mums Twitterī: {url}" + }, + "OSM-BO-mailinglist": { + "name": "Talk-bo E-pasta saraksts" + }, + "OSM-br-mailinglist": { + "name": "Talk-br E-pasta saraksts" + }, + "OSM-br-twitter": { + "description": "Seko mums Twitterī: {url}" + }, + "OSM-CL-mailinglist": { + "name": "Talk-cl E-pasta saraksts" + }, + "OSM-CL-twitter": { + "description": "Seko mums Twitterī: {url}" + }, + "OSM-CO-facebook": { + "extendedDescription": "Pievienojies kopienai lai uzzinātu vairāk par OpenStreetMap. Visi ir gaidīti!" + }, + "OSM-CO-mailinglist": { + "name": "Talk-co E-pasta liste" + }, + "OSM-CO-telegram": { + "name": "OSM Kolumbija Telegram", + "description": "OpenStreetMap Kolumbijas Telegram čats" + }, + "OSM-CO-twitter": { + "name": "OpenStreetMap Kolumbijas Twiteris", + "description": "Seko mums Twitterī: {url}" + }, + "OSM-CO": { + "name": "OpenStreetMap Kolumbija" + }, + "OSM-EC-telegram": { + "name": "OSM Ekvadora Telegrammā", + "description": "OpenStreetMap Ekvadoras Telegram čats" + }, + "OSM-PY-telegram": { + "name": "OSM Paragvaja Telegrammā", + "description": "OpenStreetMap Paragvajas Telegram čats" + }, + "OSM-PE-facebook": { + "name": "OpenStreetMap Peru Facebookā.", + "description": "Pievinojies OpenStreetMap Peru kopienai Facebookā" + }, + "OSM-PE-mailinglist": { + "name": "Talk-pe E-pasta saraksts", + "description": "Oficiāls E-Pasta saraksts OpenStreetMap Peru kopienai" + }, + "OSM-PE-matrix": { + "name": "OpenStreetMap Peru Matrix čats", + "description": "Čato ar citiem OpenStreetMap Peru kopienas biedriem Matrixā." + }, + "OSM-PE-telegram": { + "name": "OpenStreetMap Peru Telegram", + "description": "Pievienojies OpenStreetMap Peru kopienai Telegram" }, "OSM-PE-twitter": { "name": "OpenStreetMap Peru Twiteris", "description": "Seko mums Twitterī: {url}" }, + "OSM-PE": { + "name": "OpenStreetMap Peru", + "description": "Jaunumi un resursi OpenStreetMap Peru kopienai" + }, "OSM-Facebook": { "name": "OpenStreetMap Facebookā.", "description": "Spied patīk facebookā, lai saņemtu ziņas un atjauninājumus par OpenStreetMap." }, "OSM-help": { - "name": "OpenStreetMap Palīdzība" + "name": "OpenStreetMap Palīdzība", + "description": "Uzdod jautājumu un saņem atbildes OpenStreetMap kopienas balstītajā jautājumu un atbilžu lapā.", + "extendedDescription": "{url} ir visiem kam vajadzīga palīdzība ar OpenStreetMap. Vai nu tu esi iesācējs, vai arī tev ir tehnisks jautājums, mēs esam šeit lai palīdzētu!" }, "OSM-Reddit": { "name": "OpenStreetMap Redditā.", "description": "/r/openstreetmap ir laba vieta, kur var uzzināt vairāk par OpenStreetMap. Jautājiet mums jebko!" }, "OSM-Telegram": { - "name": "OpenStreetMap Telegram" + "name": "OpenStreetMap Telegram", + "description": "Pievienojies OpenStreetMap Telegram globālai supergrupai šeit: {url}" }, "OSM-Twitter": { "name": "OpenStreetMap Twiteris", "description": "Seko mums Twitterī: {url}" + }, + "OSMF": { + "name": "OpenStreetMap Fonds", + "description": "OSMF ir Lielbritānijā bāzēta bezpeļņas organizācija, kas atbalsta OpenStreetMap Projektu", + "extendedDescription": "OSMF atbalsta OpenStreetMap vācot līdzekļus, uzturot serverus kas nodrošina OSM, organizējot ikgadējo State of the Map konferenci, kā arī koordinējot brīvprātīgos, kas uztur un atjaunina OSM. Tu vari parādīt atbalstu un izpaust savu balsi OpenStreetMap virzienā paliekot par OSMF biedru šeit: {signupUrl}", + "events": { + "sotm2018": { + "name": "State of the Map 2018", + "description": "Pievienojies mums 3 dienām Milānā, Itālijā Ikgadējai OpenStreetMap konferecei, kas apvieno kopienu, ļauj socializēties, dalīties un mācīties.", + "where": "Milāna, Itālija" + } + } } } } diff --git a/dist/locales/mg.json b/dist/locales/mg.json index 27258c8c0..ffd1e454d 100644 --- a/dist/locales/mg.json +++ b/dist/locales/mg.json @@ -18,8 +18,14 @@ }, "add_point": { "title": "Teboka", + "description": "Hanampy toeram-pisakafoana, toerana miavaka, boatim-paositra na teboka hafa ao amin'ny sarintany.", "tail": "Tsindrio eo amin'ny sarintany raha hanampy teboka." }, + "add_note": { + "title": "Fanamarihana", + "description": "Misy tsy mety hitanao ve? Teneno ny mpanao sarintany hafa.", + "tail": "Tsindrio eo amin'ny sarintany raha hanampy fanamarihana." + }, "browse": { "title": "Hisava.", "description": "Akisaho ary hakaikezo ny sarintany." @@ -39,7 +45,8 @@ "annotation": { "point": "Nanampy teboka.", "vertex": "Nanampy vona.", - "relation": "Nanampy fifandraisana." + "relation": "Nanampy fifandraisana.", + "note": "Nanampy fanamarihana." } }, "start": { @@ -150,7 +157,8 @@ "annotation": "Nanambatra singa {n}.", "not_eligible": "Tsy mety atambatra ireto singa ireto.", "not_adjacent": "Tsy mety atambatra ireto singa ireto satria tsy mifampitohy ny faran'izy ireo.", - "incomplete_relation": "Tsy mety atambatra ireto singa ireto satria misy tsy azo manontolo tamin'ny nakàna azy." + "incomplete_relation": "Tsy mety atambatra ireto singa ireto satria misy tsy azo manontolo tamin'ny nakàna azy.", + "conflicting_tags": "Tsy mety atambatra ireo singa ireo satria mifanipaka ny tenifototra voafaritra sasany." }, "move": { "title": "Hamindra", @@ -180,9 +188,45 @@ } }, "reflect": { + "title": { + "long": "Hamototra araka ny lavany.", + "short": "Hamototra araka ny hafohiny." + }, + "description": { + "long": { + "single": "Hamototra ito singa ito manodidina ny lavany.", + "multiple": "Hamototra ireto singa ireto manodidina ny lavany." + }, + "short": { + "single": "Hamototra ito singa ito manodidina ny hafohiny.", + "multiple": "Hamototra ireto singa ireto manodidina ny hafohiny." + } + }, "key": { "long": "T", "short": "Y" + }, + "annotation": { + "long": { + "single": "Namototra ilay singa manodidina ny halavany.", + "multiple": "Namototra ireo singa manodidina ny halavany." + }, + "short": { + "single": "Namototra ilay singa manodidina ny hafohiny.", + "multiple": "Namototra ireo singa manodidina ny hafohiny." + } + }, + "incomplete_relation": { + "single": "Tsy mety afototra ito singa ito satria mbola tsy azo manontolo.", + "multiple": "Tsy mety afototra ireo singa ireo satria mbola tsy azo manontolo." + }, + "too_large": { + "single": "Tsy mety afototra ito singa ito satria tsy ampy ny faritra miseho aminy.", + "multiple": "Tsy mety afototra ireo singa ireo satria tsy ampy ny faritra miseho aminy." + }, + "connected_to_hidden": { + "single": "Tsy mety afototra ito singa ito satria mipetaka amina singa tsy miseho.", + "multiple": "Tsy mety afototra ireo singa ireo satria mipetaka amina singa tsy miseho ny sasany aminy." } }, "rotate": { @@ -191,6 +235,7 @@ "single": "Hanodina an'ito singa ito manodidina ny ivony.", "multiple": "Hanodina an'ireto singa ireto manodidina ny ivony." }, + "key": "R", "annotation": { "line": "Nanodina an'ilay tsipika.", "area": "Nanodina an'ilay faritra.", @@ -212,14 +257,17 @@ "reverse": { "title": "Hamototra", "description": "Hamototra ny fizotran'ito tsipika ito.", + "key": "V", "annotation": "Namototra an'ilay tsipika." }, "split": { "title": "Hizara", "description": { "line": "Hizara an'ito tsipika ito ho roa eto amin'ito vona ito.", - "area": "Hizara ny sisin'ito faritra ito ho roa." + "area": "Hizara ny sisin'ito faritra ito ho roa.", + "multiple": "Hanapaka ny tsipika/sisin'ny faritra ho roa eto amin'ity teboka ity." }, + "key": "X", "annotation": { "line": "Hanapaka tsipika", "area": "Hanapaka sisina faritra", @@ -228,6 +276,19 @@ "not_eligible": "Tsy mety tapahana amin'ny fanombohany na ny fiafarany ny tsipika.", "multiple_ways": "Misy tsipika maro loatra eto ka tsy mety tapahana.", "connected_to_hidden": "Tsy mety tapahana ity satria mifampitohy amina zavatra tsy miseho." + }, + "restriction": { + "annotation": { + "create": "Nanampy fameperam-pihodinana", + "delete": "Nanala ilay fameperam-pihodinana" + } + }, + "detach_node": { + "title": "Hanendaka", + "key": "E", + "description": "Hanendaka ito vona ito avy amin'ireo tsipika/faritra.", + "annotation": "Nanendaka ilay vona tamin'ireo tsipika/faritra nisy azy.", + "connected_to_hidden": "Tsy mety endahana ito vona ito satria mipetaka amina singa tsy miseho." } }, "restriction": { @@ -238,25 +299,433 @@ "via_node_only": "Teboka ihany" }, "help": { + "indirect": "(an-kolaka)", + "turn": { + "no_left_turn": "TSY MISY Fihodinana Miankavia {indirect}", + "no_right_turn": "TSY MISY Fihodinana Miankavanana {indirect}", + "no_u_turn": "TSY MISY Fihodinana Manao U {indirect}", + "no_straight_on": "TSY MISY Fandrosoana Mahitsy {indirect}", + "only_left_turn": "Mihodina Miankavia IHANY {indirect}", + "only_right_turn": "Mihodina Miankavanana IHANY {indirect}", + "only_u_turn": "Mihodina Manao U IHANY {indirect}", + "only_straight_on": "Mandroso Mahitsy IHANY {indirect}", + "allowed_left_turn": "Mahazo mihodina miankavia {indirect}", + "allowed_right_turn": "Mahazo mihodina miankavanana {indirect}", + "allowed_u_turn": "Mahazo mihodina manao U {indirect}", + "allowed_straight_on": "Mahazo mandroso mahitsy {indirect}" + }, "from": "AVY AO", "via": "MANARAKA NY", "to": "HATRAO" } }, + "undo": { + "tooltip": "Hanafoana ny: {action}", + "nothing": "Tsy misy hofoanana." + }, + "redo": { + "tooltip": "Hamerina ny: {action}", + "nothing": "Tsy misy haverina." + }, + "tooltip_keyhint": "Tsindry maika:", + "browser_notice": "Ao amin'ny navigateur Firefox, Chrome, Safari, Opera ary Internet Explorer 11 na amboniny ihany no mandeha ity fitaovana ity. Havaozy azafady ny navigateur ampiasainao na mampiasà Potlatch 2 hahafahanao manova ny sarintany.", + "translate": { + "translate": "Handika", + "localized_translation_label": "Ananarana amin'ny fiteny maromaro", + "localized_translation_language": "Hisafidy fiteny", + "localized_translation_name": "Anarana" + }, "zoom_in_edit": "Hakaikezo raha hanova", + "login": "Hiditra", + "logout": "Hivoaka", + "loading_auth": "An-dalam-pifandraisana amin'ny OpenStreetMap...", + "report_a_bug": "Hampita tsy fetezana", + "help_translate": "Hanampy handika", + "feature_info": { + "hidden_warning": "Singa miafina {count}", + "hidden_details": "Miafina ireto singa ireto zao: {details}" + }, + "status": { + "error": "Tsy afaka mifandray amin'ny API.", + "offline": "Tsy mandeha ny API amin'izao. Manandràmana indray mandeha rehefa afaka kelikely.", + "readonly": "Maody mamaky fotsiny ny API. Mila miandry ianao hihazonana ny fanovana nataonao.", + "rateLimit": "Mametra ny fifandraisana avy amin'olon-tsy fantatra ny API. Azonao andramana atao ny miditra amin'ny alalan'ny kaontinao." + }, + "commit": { + "title": "Handefa mankany amin'ny OpenStreetMap", + "upload_explanation": "Ny fanovana alefanao dia ho hita amin'ny sarintany rehetra izay mampiasa ny angon-drakitra OpenStreetMap.", + "upload_explanation_with_user": "Ny fanovana alefanao amin'ny maha {user} anao dia ho hita amin'ny sarintany rehetra izay mampiasa ny angon-drakitra OpenStreetMap.", + "request_review": "Tiako hisy hanamarina ny fanovana nataoko.", + "save": "Handefa", + "cancel": "Hanafoana", + "changes": "Fanovana {count}", + "download_changes": "Haka ny rakitra osmChange", + "warnings": "Fampitandremana", + "modified": "Voaova", + "deleted": "Voafafa", + "created": "Voaforona", + "about_changeset_comments": "Mombamomba ny fanehoan-kevitra ao amin'ny vondron'ova", + "google_warning": "Voalazanao ao amin'ity fanehoan-kevitra ity ny hoe Google: tadidio fa tsy azo atao tanteraka ny mandika avy amin'ny Google Maps." + }, + "contributors": { + "list": "Fanovana nataon'i {users}", + "truncated_list": "Fanovana nataon'i {users} sy {count} hafa" + }, "info_panels": { + "key": "I", "background": { - "zoom": "Hakaiky" + "key": "B", + "title": "Lafika", + "zoom": "Hakaiky", + "source": "Loharano", + "description": "Famariparitana", + "unknown": "Tsy fantatra", + "show_tiles": "Hampiseho ny kapila", + "hide_tiles": "Hanafina ny kapila" + }, + "history": { + "key": "H", + "title": "Raki-panovana", + "selected": "{n} voafidy", + "no_history": "Tsy Misy Raki-panovana (Singa Vaovao)", + "last_edit": "Fanovana Farany", + "edited_by": "Fanovana Nataon'i", + "changeset": "Vondron'ova", + "unknown": "Tsy fantatra", + "link_text": "Raki-panovana ao amin'ny openstreetmap.org" + }, + "location": { + "key": "L", + "title": "Toerana", + "unknown_location": "Tsy Fantatra ny Toerana" + }, + "measurement": { + "key": "M", + "title": "Fandrefesana", + "selected": "{n} voafidy", + "geometry": "Bika", + "closed_line": "tsipika mihidy", + "closed_area": "faritra mihidy", + "center": "Ivo", + "perimeter": "Manodidina", + "length": "Halava", + "area": "Velarana", + "location": "Toerana", + "node_count": "Isan'ny vona" } }, + "geometry": { + "point": "teboka", + "line": "tsipika", + "area": "faritra" + }, + "geocoder": { + "search": "Hitady maneran-tany...", + "no_results_visible": "Tsy nisy vokatra teo amin'ny faritra miseho amin'ny sarintany", + "no_results_worldwide": "Tsy nisy vokatra hita" + }, + "geolocate": { + "title": "Hampiseho ny Toerana Misy Ahy", + "locating": "Andraso fa mbola mamantatra ny toerana..." + }, + "inspector": { + "no_documentation_combination": "Tsy misy tahirin-kevitra fantatra momba an'ity fitambarana tag ity", + "no_documentation_key": "Tsy misy tahirin-kevitra fantatra momba ity clé ity", + "documentation_redirect": "Ity tahirin-kevitra ity dia niova ho any amina pejy vaovao", + "show_more": "Hampiseho Misimisy Kokoa", + "view_on_osm": "Hijery ao amin'ny openstreetmap.org", + "all_fields": "Ny saha rehetra", + "all_tags": "Ny tags rehetra", + "all_members": "Ny mpikambana rehetra", + "role": "Anjara asa", + "choose": "Safidio ny karazan'ny singa", + "results": "Vokatra {n} hoan'ny {search}", + "reference": "Hijery ao amin'ny OpenStreetMap Wiki", + "back_tooltip": "Hanova ny singa", + "remove": "Hanala", + "search": "Hikaroka", + "multiselect": "Singa voafidy", + "unknown": "Tsy fantatra", + "feature_list": "Hikaroka singa", + "edit": "Hanova ny singa", + "check": { + "yes": "Eny", + "no": "Tsia", + "reverser": "Hanova ny fizotra" + }, + "radio": { + "structure": { + "type": "Karazany", + "default": "Tsy miova", + "layer": "Sosona" + } + }, + "add": "Hanampy", + "none": "Tsy misy", + "node": "Vona", + "way": "Làlana", + "location": "Toerana", + "add_fields": "Hanampy saha:" + }, + "background": { + "title": "Lafika", + "description": "Fikirana ny lafika", + "key": "B", + "backgrounds": "Lafika", + "none": "Tsy misy", + "best_imagery": "Ny loharanon-tsary tsara indrindra fantatra hoan'ity toerana ity", + "switch": "Hiverina amin'ity lafika ity", + "custom": "Manokana", + "custom_button": "Hanova ny sosona manokana", + "custom_prompt": "Ampidiro ny modelin'ny URL. Ny famantarana azo ampiasaina dia:\n - {zoom} or {z}, {x}, {y} hoan'ny tetika Z/X/Y an'ny kapila\n - {-y} or {ty} hoan'ny coordonnées Y endrika TMS mivadika\n - {u} hoan'ny tetika quadtile\n - {switch:a,b,c} hoan'ny DNS server multiplexing\n\nOhatra:\n{example}", + "overlays": "Rakotra", + "imagery_source_faq": "Fanazavana Momba ny Sary / Hampita Olana", + "reset": "Hamerina amin'ny voalohany", + "display_options": "Safidy Momba ny Fisehoana", + "brightness": "Hazava", + "contrast": "Fifanalaviran-kazavana", + "saturation": "Haben'ny loko", + "sharpness": "Haranitra", + "minimap": { + "description": "Hampiseho ny sarintany kely", + "tooltip": "Hampiseho sarintany jerena lavitra mba hanampy amin'ny fahitana ny toerana misy ny sarintany miseho." + }, + "fix_misalignment": "Hanamboatra ny fihitsin'ny ny sary", + "offset": "Akisaho mankany amin'izay tianao eo amin'ny faritra volondavenona eto ambany mba hanovana ny fihitsin'ny sary, na ampidiro ny sandan'ny fikisahana amin'ny metatra." + }, + "map_data": { + "title": "Angon-draki-tsarintany", + "description": "Angon-draki-tsarintany", + "key": "F", + "data_layers": "Sosona Angon-drakitra", + "layers": { + "osm": { + "tooltip": "Angon-draki-tsarintany avy amin'ny OpenStreetMap", + "title": "Angon-drakitra OpenStreetMap" + }, + "notes": { + "tooltip": "Angon-drakitra momba ny fanamarihana avy amin'ny OpenStreetMap", + "title": "Fanamarihana OpenStreetMap" + } + }, + "fill_area": "Hameno ireo Faritra", + "map_features": "Singa ao amin'ny Sarintany", + "autohidden": "Fanahy iniana nafenina ireo singa ireo satria maro loatra no ho niseho teo amin'ny efijery. Hakaikezo raha hanova azy ireo.", + "osmhidden": "Fanahy iniana nafenina ireo singa ireo satria miafina ny sosona OpenStreetMap." + }, + "feature": { + "points": { + "description": "Teboka", + "tooltip": "Toerana" + }, + "traffic_roads": { + "tooltip": "Arabe, Làlana, sns." + }, + "service_roads": { + "description": "Làlana Mankamina Tranon'olona", + "tooltip": "Làlana Mankamina Tranon'olona, Làlana Miditra Amina Toeram-pihantsonana, Làlan-tsarety, sns." + }, + "paths": { + "description": "Làla-masaka", + "tooltip": "Làlana amin'ny Sisin'arabe, Làlan'ny Mpandeha an-tongotra, Làlan'ny Bisikileta, sns." + }, + "buildings": { + "description": "Trano", + "tooltip": "Trano, Toeram-pialofana, Garazy, sns." + }, + "landuse": { + "description": "Momba izay Mandrakotra ny Tany", + "tooltip": "Ala, Tanimboly, Valan-javaboary, Faritra Fonenana, Tsena, sns." + }, + "boundaries": { + "description": "Sisiny", + "tooltip": "Sisintany" + }, + "water": { + "description": "Momba ny Rano", + "tooltip": "Renirano, Farihy, Kamory, Dobo, sns." + }, + "rail": { + "description": "Momba ny Lalam-by", + "tooltip": "Lalam-by" + }, + "power": { + "description": "Momba ny Herinaratra", + "tooltip": "Fitarihana Herinaratra, Toeram-pamokarana Herinaratra, Tobin-herinaratra, sns." + }, + "past_future": { + "description": "Lasa/Ho avy", + "tooltip": "Andalam-pangatahana, Fanamboarana, Tsy Miasa Intsony, Rava, sns." + }, + "others": { + "description": "Hafa", + "tooltip": "Izay Zavatra Hafa Rehetra" + } + }, + "area_fill": { + "wireframe": { + "description": "Tsy feno (Endrika Tariby)", + "tooltip": "Ny fampiharana ny endrika tariby dia manamora ny fahitana ny sary lafika ao ambany.", + "key": "W" + }, + "partial": { + "description": "Feno amin'ny Ampahany" + }, + "full": { + "description": "Feno Tanteraka", + "tooltip": "Natao miseho feno tanteraka ireo faritra." + } + }, + "restore": { + "heading": "Misy fanovana nataonao mbola tsy voatahiry", + "description": "Tianao haverina ve ny fanovana mbola tsy voatahiry tamin'izay nataonao teo aloha?", + "restore": "Hamerina ny fanovana nataoko", + "reset": "Hamela ny fanovana nataoko" + }, + "save": { + "title": "Hitahiry", + "help": "Hamarino ny fanovana nataonao ary alefaso any amin'ny OpenStreetMap, mba ho hitan'ny mpampiasa hafa.", + "no_changes": "Tsy misy fanovana hotahirizina.", + "error": "Nisy tsy nety tamin'ny fanandramana hitahiry ny fanovana", + "unknown_error_details": "Hamarino azafady hoe mandeha ny fifandraisana internet ampiasainao.", + "uploading": "Eo am-pandefasana ny fanovana mankany amin'ny OpenStreetMap...", + "conflict_progress": "Mitady ireo fifanindriana: {num} amin'ny {total}", + "unsaved_changes": "Misy fanovana nataonao mbola tsy voatahiry", + "conflict": { + "header": "Handamina ny fanovana mifanindry", + "count": "Fifanindriana {num} amin'ny {total}", + "previous": "< Teo Aloha", + "next": "Manaraka >", + "keep_local": "Hihazona ny ahy", + "keep_remote": "Hampiasa ny azy", + "restore": "Hamerina", + "delete": "Hamela ho Voafafa", + "download_changes": "Na alaivo ny rakitra osmChange", + "done": "Voalamina ny fifanindriana rehetra!", + "help": "Nisy mpampiasa hafa nanova ny sasany amin'ny singan-tsarintany novainao.\nTsindio ny tsirairay amin'ireo singa eto ambany hahafantaranao misimisy kokoa momba ny fifanindriana, dia misafidia na hihazona\nny fanovana nataonao na ny an'ny mpampiasa hafa.\n" + } + }, + "merge_remote_changes": { + "conflict": { + "deleted": "Nofafan'i {user} ity singa ity.", + "location": "Samy nanova toerana ity singa ity ianareo sy {user}.", + "nodelist": "Samy nanova ireo vona ianareo sy {user}.", + "tags": "Novainao ho \"{local}\" ny tag {tag} nefa i {user} nanova azy ho \"{remote}\"." + } + }, + "success": { + "just_edited": "Efa nanova an'i OpenStreetMap izay!", + "thank_you": "Misaotra anao manatsara ny sarintany.", + "thank_you_location": "Misaotra anao manatsara ny sarintany manodidina an'i {where}.", + "help_html": "Tokony hiseho ao amin'ny OpenStreetMap ny fanovana nataonao ao anatin'ny minitra vitsivitsy. Mety ho elaela kosa ny sarintany any amin'ny toeran-kafa vao miova.", + "help_link_text": "Antsipiriany", + "view_on_osm": "Hijery ny Fiovana ao amin'ny OSM", + "changeset_id": "Ny vondron'ova nataonao #: {changeset_id}", + "like_osm": "Tianao ve i OpenStreetMap? Mifandraisa amin'ny hafa:", + "more": "Misimisy kokoa", + "events": "Hetsika", + "languages": "Fiteny: {languages}", + "missing": "Misy banga ve ito lisitra ito?", + "tell_us": "Teneno!" + }, + "confirm": { + "okay": "OK", + "cancel": "Hanafoana" + }, + "splash": { + "welcome": "Tongasoa eto amin'ny éditeur OpenStreetMap iD", + "text": "iD dia fitaovana mora ampiasaina nefa matanjaka mba handraisana anjara amin'ny sarintany misokatra tsara indrindra eto an-tany. Ity dia fivoahana faha {version}. Raha te hahalala misimisy kokoa dia tsidiho ny {website} ary tatero ao amin'ny {github} ny tsy fetezana.", + "walkthrough": "Hanomboka ny Fanoroana", + "start": "Hanova amin'izay" + }, + "source_switch": { + "lose_changes": "Misy fanovana nataonao mbola tsy voatahiry. Raha mivery any amin'ny sarintany ianao dia very ireo. Azonao antoka ve fa te hiverina any amin'ny sarintany tokoa ianao?" + }, + "version": { + "whats_new": "Inona no zava-baovao ao amin'ny iD fivoahana faha {version}" + }, + "tag_reference": { + "description": "Famariparitana", + "on_wiki": "{tag} ao amin'ny wiki.osm.org", + "used_with": "ampiasaina miaraka amin'ny {type}" + }, + "validations": { + "disconnected_highway": "Nanasaraka ny làlana", + "disconnected_highway_tooltip": "Ny làlana dia tokony hifandray amin'ny làlana hafa na amin'ny fidirana amina trano.", + "untagged_point": "Teboka tsy misy tag", + "untagged_point_tooltip": "Safidio izay karana singa mahalaza hoe inona ito teboka ito.", + "untagged_line": "Tsipika tsy misy tag", + "untagged_line_tooltip": "Safidio izay karazana singa mahalaza hoe inona ito tsipika ito.", + "untagged_area": "Faritra tsy misy tag", + "untagged_area_tooltip": "Safidio izay karana singa mahalaza hoe inona ito faritra ito.", + "untagged_relation": "Relation tsy misy tag", + "untagged_relation_tooltip": "Safidio izay karana singa mahalaza hoe inona ito relation ito.", + "many_deletions": "Eo am-pamafana singa {n} ianao: teboka {p}, tsipika {l}, faritra {a}, relations {r}. Azonao antoka ve izay ataonao? Ity dia hamafa azy ireo tao amin'ny sarintany izay hitan'ny olon-drehetra ao amin'ny openstreetmap.org.", + "deprecated_tags": "Tags tsy fampiasa intsony: {tags}" + }, "zoom": { "in": "Hanakaiky", "out": "Hanalavitra" }, "cannot_zoom": "Tsy afaka manalavitra noho izao intsony amin'ity maody ity.", + "full_screen": "Hameno ny Efijery", "gpx": { + "local_layer": "Hanampy GPX", "zoom": "Hanangeza araky ny sosona" }, + "mvt": { + "zoom": "Hanangeza araky ny sosona" + }, + "note": { + "note": "Fanamarihana", + "title": "Hanova ny fanamarihana", + "anonymous": "olon-tsy fantatra", + "closed": "(Mikatona)", + "commentTitle": "Fanehoan-kevitra", + "newComment": "Fanehoan-kevitra Vaovao", + "inputPlaceholder": "Mampidira fanehoan-kevitra hozaraina amin'ny mpampiasa hafa.", + "close": "Hanakatona ny fanamarihana", + "open": "Hanokatra ny fanamarihana indray", + "comment": "Fanehoan-kevitra", + "close_comment": "Hanakatona sy Haneho Hevitra", + "open_comment": "Hanokatra Indray sy Haneho Hevitra", + "report": "Hitatitra", + "new": "Fanamarihana Vaovao", + "newDescription": "Hazavao ny tsy fetezana", + "save": "Hitahiry ny Fanamarihana", + "login": "Mila miditra amin'ny alalan'ny kaontinao ianao mba ho afaka hanova na haneho hevitra amin'ity fanamarihana ity.", + "upload_explanation": "Ny fanehoan-kevitrao dia ho hitan'ny besinimaro mampiasa ny OpenStreetMap.", + "upload_explanation_with_user": "Ny fanehoan-kevitrao amin'ny maha {user} anao dia ho hitan'ny besinimaro mampiasa ny OpenStreetMap." + }, + "help": { + "title": "Fanampiana", + "key": "H", + "help": { + "title": "Fanampiana", + "welcome": "Tongasoa eto amin'ny éditeur iD hoan'ny [OpenStreetMap] (https://www.openstreetmap.org/). Amin'ny alalan'ity éditeur ity ianao dia afaka manova an'i OpenStreetMap avy ato amin'ny navigateur ampiasainao.", + "open_data_h": "Hanokatra Rakitra", + "open_data": "Ny fanovana ataonao amin'ity sarintany ity dia ho hitan'ny olona rehetra mampiasa ny OpenStreetMap. Azonao atao miorina amin'ny fahalalana manokana, ny fidinana ifotony, na ny sary avy eny ambony na ny sary ety amin'ny tany, ny fanovana ataonao. [Tsy azo atao mihitsy] (https://www.openstreetmap.org/copyright) ny mandika avy amin'ny loharano natao hitadiavam-bola toy ny Google Maps.", + "before_start_h": "Alohan'ny hanombohanao", + "before_start": "Tokony ho efa mifankazatra ny OpenStreetMap sy ity éditeur ity ianao mialohan'ny hanaovanao fanovana. Misy fanoroana atolotr'i iD hampianarana anao ny fototra amin'ny fanovana an'i OpenStreetMap. Tsindrio eo amin'ny \"Hanomboka ny Fanoroana\" eto amin'ity efijery ity raha hanomboka hianatra - 15 minitra eo ho eo fotsiny ny halavan'ilay izy.", + "open_source_h": "Hanokatra Loharano", + "open_source_help": "Afaka manampy ny iD ianao amin'ny alalan'ny [fandikàna](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) na [fitaterana tsy fetezana](https://github.com/openstreetmap/iD/issues)." + }, + "overview": { + "title": "Jery Ankapobeny", + "navigation_h": "Fivezivezena", + "navigation_drag": "Raha hanakisaka ny sarintany dia tsindrio maharitra ny {leftclick} bokotra havian'ny souris ary akisaho ny souris. Azonao ampiasaina ihany koa ireo bokotra `↓`, `↑`, `←`, `→` an'ny clavier.", + "navigation_zoom": "Raha hijery manakaiky na manalavitra dia ampiasao ny bokotra mihodina amin'ny souris na ny trackpad, na ampiasao ireo bokotra {plus} / {minus} etsy amin'ny sarintany. Azonao ampiasaina koa ireo bokotra `+`, `-` eo amin'ny clavier anao.", + "features_h": "Singa ao amin'ny Sarintany", + "features": "Ampiasaintsika ny teny hoe *singa* mba hilazana ireo zavatra izay miseho eo amin'ny sarintany, toy ny làlana, trano na toerana. Azo ampidirina ho singa ao amin'ny OpenStreetMap avokoa izay zavatra misy rehetra amin'ny tontolo tena izy. Ireo singa ao amin'ny sarintany dia aseho amin'ny alalan'ny *teboka*, *tsipika*, na *faritra*.", + "nodes_ways": "Ao amin'ny OpenStreetMap, ny teboka indraindray dia antsoina koa hoe *vona*, ary ny tsipika sy sy ny faritra dia antsoina indraindray hoe *soritra*." + }, + "editing": { + "title": "Manova & Mitahiry", + "select_h": "Hisafidy", + "select_left_click": "{leftclick} Tsindrio amin'ny alalan'ny bokotra havia amin'ny souris eo amin'ny singa iray raha hisafidy azy io. Hisongadina izy avy eo, ary hiseho eo amin'ny takelaka etsy amin'ny sisiny ny mombamomba ilay singa, toy ny anarany na ny adiresiny.", + "save_h": "Hitahiry" + } + }, "intro": { "graph": { "block_number": "", @@ -277,6 +746,21 @@ "navigation": { "zoom": "Hanakaiky / Hanalavitra" } + }, + "editing": { + "commands": { + "save": "Hitahiry ny fanovana" + } + } + }, + "community": { + "osm-mg-facebook": { + "name": "Vondrona Facebook OpenStreetMap Madagascar", + "description": "Vondrona Facebook malagasy ho an'izay liana amin'ny OpenStreetMap." + }, + "talk-mg": { + "name": "Mailaka fiseraserana Talk-mg", + "description": "Toerana ahafahan'ny mpandray anjara sy ny mpampiasa ny OpenStreetMap eto Madagasikara mifanakalo hevitra sy miresaka." } } } diff --git a/dist/locales/mk.json b/dist/locales/mk.json index cc7b52e6a..4a0d6e39d 100644 --- a/dist/locales/mk.json +++ b/dist/locales/mk.json @@ -211,8 +211,6 @@ "localized_translation_language": "Изберете јазик", "localized_translation_name": "Име" }, - "login": "најава", - "logout": "одјава", "loading_auth": "Се поврзувам со OpenStreetMap...", "report_a_bug": "Пријави грешка", "help_translate": "Помогнете со преводот", diff --git a/dist/locales/ml.json b/dist/locales/ml.json index 240ef1e41..e3efad3bd 100644 --- a/dist/locales/ml.json +++ b/dist/locales/ml.json @@ -55,8 +55,6 @@ "title": "രണ്ടായി പിരിയുക" } }, - "login": "ലോഗിൻ", - "logout": "പുറത്തുകടക്കുക", "geometry": { "point": "ബിന്ദു", "line": "രേഖ", diff --git a/dist/locales/ms.json b/dist/locales/ms.json index a9133d13b..ef240854d 100644 --- a/dist/locales/ms.json +++ b/dist/locales/ms.json @@ -304,8 +304,6 @@ "localized_translation_name": "Nama" }, "zoom_in_edit": "Zum lebih dekat untuk menyunting", - "login": "log masuk", - "logout": "log keluar", "loading_auth": "Berhubung ke OpenStreetMap...", "report_a_bug": "Laporkan suatu pepijat", "help_translate": "Bantu penterjemahan", @@ -626,7 +624,6 @@ "cannot_zoom": "Had zum jauh telah dicapai dalam mod yang sedang dipakai.", "full_screen": "Togol Skrin Penuh", "gpx": { - "local_layer": "Fail tempatan", "drag_drop": "Tarik dan lepaskan suatu fail .gpx, .geojson atau .kml masuk halaman ini, atau klik butang di sebelah kanan untuk mengimbas", "zoom": "Zum ke lapisan", "browse": "Semak imbas untuk fail" diff --git a/dist/locales/nl.json b/dist/locales/nl.json index 92874b895..c4823fd98 100644 --- a/dist/locales/nl.json +++ b/dist/locales/nl.json @@ -21,6 +21,11 @@ "description": "Voeg restaurants, monumenten, brievenbussen of andere punten toe aan de kaart.", "tail": "Klik in de kaart om een punt toe te voegen." }, + "add_note": { + "title": "Opmerking bij kaart", + "description": "Een probleem gezien? Laat het aan andere mappers weten.", + "tail": "Klik op de kaart om een \"Opmerking bij kaart\" te maken." + }, "browse": { "title": "Blader", "description": "Verschuif de kaart en zoom in of uit." @@ -40,7 +45,8 @@ "annotation": { "point": "Punt toegevoegd.", "vertex": "Knoop aan een weg toegevoegd.", - "relation": "Relatie toegevoegd." + "relation": "Relatie toegevoegd.", + "note": "Opmerking bij kaart gemaakt." } }, "start": { @@ -297,6 +303,13 @@ "create": "Afslagbeperking toegevoegd", "delete": "Afslagbeperking weggehaald" } + }, + "detach_node": { + "title": "Losmaken", + "description": "Maak dit punt los van deze lijnen/vlakken.", + "annotation": "Punt losgemaakt van deze lijnen/vlakken.", + "restriction": "Dit punt kan niet losgemaakt worden omdat het een \"{relation}\" relatie zou beschadigen.", + "connected_to_hidden": "Dit punt kan niet losgemaakt worden omdat het verbonden is met een verborgen object." } }, "restriction": { @@ -352,8 +365,8 @@ "localized_translation_name": "Naam" }, "zoom_in_edit": "Zoom in om te bewerken", - "login": "Log in", - "logout": "Afmelden", + "login": "Inloggen", + "logout": "Uitloggen", "loading_auth": "Aan het verbinden met OpenStreetMap …", "report_a_bug": "Meld een bug", "help_translate": "Help vertalen", @@ -536,6 +549,10 @@ "osm": { "tooltip": "Kaartgegevens van OpenStreetMap", "title": "OpenStreetMap-gegevens" + }, + "notes": { + "tooltip": "Kaartopmerking van OpenStreetMap", + "title": "Kaartopmerkingen van OpenStreetMap" } }, "fill_area": "Vlakken inkleuren", @@ -710,11 +727,24 @@ "cannot_zoom": "Kan niet verder uitzoomen in huidige modus", "full_screen": "Volledig scherm aan/uit", "gpx": { - "local_layer": "Lokaal bestand", + "local_layer": "GPX toevoegen", "drag_drop": "Sleep een .gpx-, .geojson- of .kml-bestand naar deze pagina of klik op de knop rechts om te bladeren", "zoom": "Laag in beeld brengen", "browse": "Selecteer een bestand" }, + "mvt": { + "local_layer": "MVT toevoegen", + "drag_drop": "Sleep een .mvt of .pbf bestand naar deze pagina, of klik op de knop rechts om te browsen.", + "zoom": "Laag in beeld brengen", + "browse": "Selecteer een bestand" + }, + "streetside": { + "tooltip": "Foto's op straatniveau van Mircrosoft", + "title": "Fotolaag (Bing Streetside)", + "report": "Rapporteer een privacy-issue met deze afbeelding", + "view_on_bing": "Bekijk op Bing Maps", + "hires": "Hoge resolutie" + }, "mapillary_images": { "tooltip": "Foto's op straatniveau van Mapillary", "title": "Fotolaag (Mapillary)" @@ -733,6 +763,27 @@ "openstreetcam": { "view_on_openstreetcam": "Bekijk deze afbeelding op OpenStreetCam" }, + "note": { + "note": "Kaartopmerking", + "title": "Kaartopmerking bewerken", + "anonymous": "anoniem", + "closed": "(Gesloten)", + "commentTitle": "Commentaren", + "newComment": "Nieuwe commentaar", + "inputPlaceholder": "Voeg een commentaar toe om te delen met anderen.", + "close": "Kaartopmerking afsluiten", + "open": "Kaartopmerking heropenen", + "comment": "Voeg commentaar toe", + "close_comment": "Sluiten met commentaar", + "open_comment": "Heropen met commentaar", + "report": "Melden", + "new": "Nieuwe kaartopmerking", + "newDescription": "Omschrijf het probleem.", + "save": "Kaartopmerking opslaan", + "login": "Je moet ingelogd zijn om deze kaartopmerking te veranderen of becommentariëren.", + "upload_explanation": "Je commentaren zullen zichtbaar zijn voor alle OpenStreetMap gebruikers.", + "upload_explanation_with_user": "Je commentaren als {user} zullen zichtbaar zijn voor alle OpenStreetMap gebruikers." + }, "help": { "title": "Hulp", "key": "H", @@ -870,6 +921,17 @@ "boundary": "Een of *grens*-relatie (Engels: *boundary*) is een groep van een of meerdere lijnen die samen een administratieve grens vormen.", "boundary_add": "Om een object aan een grensrelatie toe te voegen, selecteer je het \nobject en klik je op de {plus}-knop in het \"Alle relaties\"-gedeelte van \nde objectbewerker. Je kan nu kiezen uit een lijst van relaties in de \nbuurt of een nieuwe aanmaken met \"Nieuwe relatie …\"" }, + "notes": { + "title": "Kaartopmerkingen", + "intro": "*Kaartopmerkingen* of Notes worden gebruikt om andere gebruikers te wijzen op een object dat verbeterd moet worden. Kaaropmerkingen duiden een specifieke plaats op de kaart aan. Om bestaande kaartopmerkingen te zien of er nieuwe toe te voegen, klik op het {data} **Kaartgegevens** paneel om de OpenStreetMap Kaartopmerkingen laag te activeren.", + "add_note_h": "Kaartopmerkingen toevoegen", + "add_note": "Om een nieuwe kaartopmerking toe te voegen, klik {note} **Kaartopmerking** knop op de toolbar boven de kaart, of klik op de sneltoets `4`. Dit zal de muisaanwijzer vervangen door een kruisje. Om de nieuwe kaartopmerking te maken, ga naar de juiste plaats en {leftclick} klik met je linkermuisknop of toets `Spatiebalk`.", + "move_note": "Enkel nieuwe kaartopmerkingen kunnen verplaatst worden. Om te verplaatsen, zet je muisaanwijzer boven de nieuwe kaartopmerking, {leftclick} klik met je linkermuisnknop en hou ingeduwd terwijl je de kaartopmerking verplaatst naar zijn nieuwe plaats.", + "update_note_h": "Sluiten, Heropenen en Becommentariëren", + "update_note": "Een bestaande kaartopmerking kan bijgewerkt worden door ze te sluiten, te heropenen of een commentaar toe te voegen. De kaartopmerking sluiten geeft aan dat het probleem is opgelost. Heropenen betekent dat het originele probleem niet is opgelost.", + "save_note_h": "Kaartopmerkingen opslaan", + "save_note": "Je moet bewerkingen van kaartopmerkingen individueel opslaan door op de knoppen onder de commentaren bij de kaartopmerking te klikken. Bewerking van kaartopmerkingen worden **niet** mee opgeslagen met wijzigingen aan de kaart zel die je oplaadt naar OpenStreetMap." + }, "imagery": { "title": "Achtergrondbeelden", "intro": "Het achtergrondbeeld dat onder de kaartdata verschijnt, is een belangrijke bron voor het karteren. Deze beelden kunnen luchtfoto's zijn van satellieten, vliegtuigen en drones, het kunnen ingescande historische kaarten zijn of andere vrij beschikbare brondata.", @@ -882,7 +944,7 @@ }, "streetlevel": { "title": "Foto's op straatniveau", - "intro": "Foto's op straatniveau zijn nuttig voor het in kaart brengen van verkeersborden, bedrijven en andere details die niet zichtbaar zijn op luchtfoto's. iD ondersteunt dergelijke foto's van [Mapillary](https://www.mapillary.com) en [OpenStreetCam](https://www.openstreetcam.org). Gebruik nooit Google Streetview, de wettelijke consequenties daarvan zijn namelijk niet duidelijk.", + "intro": "Foto's op straatniveau zijn nuttig voor het in kaart brengen van verkeersborden, bedrijven en andere details die niet zichtbaar zijn op luchtfoto's. iD ondersteunt dergelijke foto's van [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) en [OpenStreetCam](https://www.openstreetcam.org). Gebruik nooit Google Streetview, de wettelijke consequenties daarvan zijn namelijk niet duidelijk.", "using_h": "Foto's op straatniveau gebruiken", "using": "Om foto's op straatniveau te gebruiken, klik je op {data} **Kaartgegevens** naast de kaart om het betreffende paneel te openen. Daar kan je beschikbare foto lagen aan of uit te zetten.", "photos": "Als je de fotolaag aanzet, worden lijnen langs fotoreeksen getoond. Wanneer je meer inzoomt, wordt op elke fotolocatie een cirkel getoond. Na nog meer inzoomen wordt een kegel zichtbaar die de richting van de camera aangeeft op het moment dat de foto gemaakt werd (maar die is vaak onnauwkeurig).", @@ -1264,7 +1326,8 @@ "add_point": "'Punt toevoegen'-modus", "add_line": "'Lijn toevoegen'-modus", "add_area": "'Vlak toevoegen'-modus", - "place_point": "Punt plaatsen", + "add_note": "Modus 'Kaartopmerking toevoegen'", + "place_point": "Plaats punt of kaartopmerking", "disable_snap": "Ingedrukt houden om punt-magnetisme uit te zetten", "stop_line": "Tekenen van lijn of vlak beëindigen" }, @@ -1273,6 +1336,7 @@ "continue_line": "Lijn verderzetten bij geselecteerde knoop", "merge": "Geselecteerde objecten samenvoegen", "disconnect": "Objecten bij geselecteerde knoop losmaken", + "detach_node": "Geslecteerd punt losmaken van de lijn of het vlak waar het toe behoort", "split": "Lijn bij geselecteerde knoop in twee splitsen", "reverse": "Lijn omkeren", "move": "Geselecteerde objecten verplaatsen", @@ -6680,18 +6744,22 @@ }, "community": { "cape-coast-youthmappers": { - "description": "Volg ons op Twitter: {url}" + "name": "University of Cape Coast YouthMappers", + "description": "Volg ons op Twitter: {url}", + "extendedDescription": "Dit is officiële account van de afdeling van Youth Mappers van de University of Cape Coast, Ghana. We houden van kaarten, open data en het helpen van kwetsbaren." }, "osm-gh-facebook": { "name": "OpenStreetMap Ghana op Facebook", - "description": "Facebook-groep voor mensen met interesse in OpenStreetMap." + "description": "Facebook-groep voor mensen met interesse in OpenStreetMap.", + "extendedDescription": "Mappers van de Ghaneese gemeenschap. We promoten projecten van OpenStreetMap en het Humanitarian OpenStreetMap Team (HOT) in Ghana. Sluit je aan." }, "osm-gh-twitter": { "name": "OpenStreetMap Ghana op Twitter", "description": "Volg ons op Twitter: {url}" }, "talk-gh": { - "name": "Talk-gh mailinglijst" + "name": "Talk-gh mailinglijst", + "description": "Talk-gh is de officiële mailing list van de Ghanese OSM community." }, "osm-mg-facebook": { "name": "OpenStreetMap Madagascar-Facebookgroep", diff --git a/dist/locales/nn.json b/dist/locales/nn.json index dbaeff710..24dd515db 100644 --- a/dist/locales/nn.json +++ b/dist/locales/nn.json @@ -2,11 +2,18 @@ "nn": { "icons": { "information": "info", - "remove": "fjern" + "remove": "fjern", + "undo": "angre" }, "modes": { "add_area": { "title": "Område" + }, + "add_line": { + "title": "Linje" + }, + "add_point": { + "title": "Punkt" } }, "operations": { @@ -46,8 +53,6 @@ "localized_translation_name": "Namn" }, "zoom_in_edit": "Zoom inn for å redigere", - "login": "Logg inn", - "logout": "Logg ut", "report_a_bug": "Rapporter ein feil", "help_translate": "Hjelp til med å omsette", "commit": { @@ -235,9 +240,24 @@ } }, "imagery": { + "DigitalGlobe-Premium": { + "attribution": { + "text": "Villkår og tilbakemelding" + } + }, + "DigitalGlobe-Premium-vintage": { + "attribution": { + "text": "Vilkår og tilbakemelding" + } + }, "MAPNIK": { "name": "OpenStreetMap (standard)" } + }, + "community": { + "osm-gh-twitter": { + "description": "Følg oss på Twitter: {url}" + } } } } \ No newline at end of file diff --git a/dist/locales/no.json b/dist/locales/no.json index 47ca0725d..97dcd8c48 100644 --- a/dist/locales/no.json +++ b/dist/locales/no.json @@ -326,8 +326,6 @@ "localized_translation_name": "Navn" }, "zoom_in_edit": "Zoom inn for å redigere", - "login": "logg inn", - "logout": "logg ut", "loading_auth": "Kobler til OpenStreetMap...", "report_a_bug": "Rapporter feil", "help_translate": "Hjelp til med oversettelse", @@ -643,7 +641,6 @@ "cannot_zoom": "Kan ikke zoome ut lenger i gjeldende modus.", "full_screen": "Skru av/på fullskjerm.", "gpx": { - "local_layer": "Lokal fil", "drag_drop": "Dra og slipp en .gpx, .geojson eller .kml-fil på siden, eller trykk knappen til høyre for å bla etter fil", "zoom": "Zoom til lag", "browse": "Bla etter en fil" diff --git a/dist/locales/pl.json b/dist/locales/pl.json index 6635d820f..7029afefc 100644 --- a/dist/locales/pl.json +++ b/dist/locales/pl.json @@ -21,6 +21,11 @@ "description": "Dodaje do mapy restauracje, pomniki, skrzynki pocztowe i inne punkty.", "tail": "Kliknij mapę, aby dodać punkt." }, + "add_note": { + "title": "Uwaga", + "description": "Problem na mapie? Poinformuj o tym innych mapujących.", + "tail": "Kliknij na mapie by dodać uwagę." + }, "browse": { "title": "Przeglądaj", "description": "Przesuwaj i zmieniaj przybliżenie mapy." @@ -39,8 +44,9 @@ "add": { "annotation": { "point": "Dodano punkt.", - "vertex": "Dodano węzeł do linii.", - "relation": "Dodano relację." + "vertex": "Dodano punkt do linii.", + "relation": "Dodano relację.", + "note": "Uwaga dodana." } }, "start": { @@ -111,7 +117,7 @@ "title": "Usuń", "description": { "single": "Trwale usuwa ten obiekt.", - "multiple": "Trwale uwsuwa te obiekty." + "multiple": "Trwale usuwa te obiekty." }, "annotation": { "point": "Usunięto węzeł.", @@ -119,7 +125,7 @@ "line": "Usunięto linię.", "area": "Usunięto obszar.", "relation": "Usunięto relację.", - "multiple": "Usunięto {n} obiektów." + "multiple": "Usunięto {n} obiekty/obiektów." }, "too_large": { "single": "Ten obiekt nie może być usunięty, ponieważ nie jest wystarczająco widoczny.", @@ -152,7 +158,7 @@ "area": "Połączono drogę z obszarem." }, "relation": "Te obiekty nie mogą zostać połączone, ponieważ mają sprzeczne role w relacji.", - "restriction": "Te obiekty nie mogą zostać połączone, ponieważ popsułobby to relację „{relation}”." + "restriction": "Te obiekty nie mogą zostać połączone, ponieważ uszkodziłoby to relację „{relation}”." }, "disconnect": { "title": "Rozłącz", @@ -170,7 +176,7 @@ "annotation": "Scal {n} obiektów.", "not_eligible": "Te obiekty nie mogą zostać scalone.", "not_adjacent": "Tych obiektów nie można scalić, ponieważ ich węzły nie są połączone.", - "restriction": "Te obiekty nie mogą zostać scalone, ponieważ popsułobby to relację „{relation}”.", + "restriction": "Te obiekty nie mogą zostać scalone, ponieważ uszkodziłoby to relację „{relation}”.", "relation": "Te obiekty nie mogą zostać scalone, ponieważ mają sprzeczne role w relacji.", "incomplete_relation": "Tych obiektów nie można scalić, ponieważ przynajmniej jeden z nich nie został w pełni pobrany.", "conflicting_tags": "Tego obiektu nie można scalić, ponieważ ich tagi mają sprzeczne wartości." @@ -236,7 +242,7 @@ "multiple": "Nie można odbić obiektów, ponieważ nie zostały całkowicie pobrane." }, "too_large": { - "single": "Nie można odbić obiektów, ponieważ nie jest wystarczająco widoczny.", + "single": "Nie można odbić obiektu, ponieważ nie jest wystarczająco widoczny.", "multiple": "Nie można odbić obiektów, ponieważ nie są wystarczająco widoczne." }, "connected_to_hidden": { @@ -297,19 +303,26 @@ "create": "Dodano zakaz/nakaz skrętu", "delete": "Usunięto zakaz/nakaz skrętu" } + }, + "detach_node": { + "title": "Odłącz węzeł.", + "description": "Odłącza ten węzeł od tych linii/obszarów.", + "annotation": "Odłącza węzeł od linii/obszarów.", + "restriction": "Ten węzeł nie może być odłączony, gdyż spowodowałoby to uszkodzenie relacji \"{relation}\".", + "connected_to_hidden": "Ten węzeł nie może być odłączony, gdyż jest połączony z ukrytym obiektem." } }, "restriction": { "controls": { "distance": "Odległość", - "distance_up_to": "Do {distance}", + "distance_up_to": "Nie więcej niż {distance}", "via": "Przez", - "via_node_only": "Tylko węzły", - "via_up_to_one": "Do 1 linii", - "via_up_to_two": "Do 2 linii" + "via_node_only": "Tylko węzeł", + "via_up_to_one": "Nie więcej niż 1 odcinek", + "via_up_to_two": "Nie więcej niż 2 odcinki" }, "help": { - "indirect": "(niebezpośredni)", + "indirect": "(pośredni)", "turn": { "no_left_turn": "Zakaz skrętu w lewo {indirect}", "no_right_turn": "Zakaz skrętu w prawo {indirect}", @@ -319,20 +332,20 @@ "only_right_turn": "Nakaz skrętu w prawo {indirect}", "only_u_turn": "Nakaz zawracania {indirect}", "only_straight_on": "Nakaz jazdy prosto {indirect}", - "allowed_left_turn": "Zezwolony skręt w lewo {indirect}", - "allowed_right_turn": "Zezwolony skręt w prawo {indirect}", - "allowed_u_turn": "Zezwolone zawracanie {indirect}", - "allowed_straight_on": "Zezwolona jazda prosto {indirect}" + "allowed_left_turn": "Skręt w lewo dozwolony {indirect}", + "allowed_right_turn": "Skręt w prawo dozwolony {indirect}", + "allowed_u_turn": "Zawracanie dozwolone {indirect}", + "allowed_straight_on": "Jazda prosto dozwolona {indirect}" }, - "from": "Z", + "from": "OD", "via": "PRZEZ", "to": "DO", "from_name": "{from}: {fromName}", "from_name_to_name": "{from}: {fromName}, {to}: {toName}", "via_names": "{via}: {viaNames}", - "select_from": "Kiliknij aby wybrać element „{from}”", - "select_from_name": "Kilkin aby wybrać {from} {fromName}", - "toggle": "Kilknij aby zastosować „{turn}”" + "select_from": "Kliknij, by wybrać odcinek {from}", + "select_from_name": "Kliknij, by wybrać {from} {fromName}", + "toggle": "Kliknij, by zastosować „{turn}”" } }, "undo": { @@ -352,8 +365,8 @@ "localized_translation_name": "Nazwa" }, "zoom_in_edit": "Przybliż, aby edytować", - "login": "login", - "logout": "wyloguj", + "login": "Logowanie", + "logout": "Wylogowanie", "loading_auth": "Łączenie z OpenStreetMap...", "report_a_bug": "Zgłoś błąd", "help_translate": "Pomóż przetłumaczyć", @@ -510,7 +523,7 @@ "switch": "Wróć do tego podkładu", "custom": "Własne", "custom_button": "Edycja własnego podkładu", - "custom_prompt": "Wprowadź szablon dla URL kafelków mapy. Obsługiwane symbole:\n - {zoom}/{z}, {x}, {y} dla schematu adresowania kafelkówZ/X/Y\n - {-y}/{ty} dla odwróconej współrzędnej Y w adresowaniu TMS\n - {u} dla QuadTiles\n - {switch:a,b,c} dla multipleksacji serwerów na poziomie DNS\n\nPrzykład:\n{example}", + "custom_prompt": "Wprowadź szablon dla URL kafelka mapy. Obsługiwane symbole:\n - {zoom}/{z}, {x}, {y} dla schematu adresowania kafelkówZ/X/Y\n - {-y} lub {ty} dla odwróconej współrzędnej Y w adresowaniu TMS\n - {u} dla QuadTiles\n - {switch:a,b,c} dla multipleksacji serwerów na poziomie DNS\n\nPrzykład:\n{example}", "overlays": "Nakładki", "imagery_source_faq": "Informacje o obrazie / Zgłoś problem", "reset": "Przywraca ustawienia", @@ -536,6 +549,10 @@ "osm": { "tooltip": "Dane map z OpenStreetMap", "title": "Dane OpenStreetMap" + }, + "notes": { + "tooltip": "Uwagi z OpenStreetMap", + "title": "Uwagi OpenStreetMap" } }, "fill_area": "Wypełnianie obszarów", @@ -635,7 +652,7 @@ "delete": "Pozostaw usunięty", "download_changes": "Lub pobierz plik zmian na OSM", "done": "Rozwiązano wszystkie konflikty !", - "help": "Inny użytkownik zmienił te same obiekty co ty.\nKlinknij na każdym z nich, aby uzyskać więcej informacji o konflikcie i wybrać\nczy zostawić twoją wersję, czy wersję innego użytkownika.\n" + "help": "Inny użytkownik zmienił te same obiekty co ty.\nKlikając na każdym z poniższych obiektów uzyskasz więcej informacji o powstałym konflikcie i będziesz mógł zdecydować, czy mają zostać zapisane zmiany twoje czy tego innego użytkownika.\n\n" } }, "merge_remote_changes": { @@ -698,7 +715,7 @@ "untagged_area": "Nieoznaczony obszar", "untagged_area_tooltip": "Wybierz typ obiektu, który opisuje czym jest ten obszar.", "untagged_relation": "Pusta relacja - brak znaczników", - "untagged_relation_tooltip": "Wybierz typ obiektu, który opisuje czym jest ta relacja.", + "untagged_relation_tooltip": "Wybierz rodzaj obiektu, który opisuje, czym jest ta relacja.", "many_deletions": "Usuwasz {n} obiekty/obiektów: {p} węzłów, {l} linii, {a} obszarów, {r} relacji. Na pewno chcesz to zrobić? To spowoduje, że znikną one z mapy, którą wszyscy widzą na openstreetmap.org.", "tag_suggests_area": "Znacznik {tag} sugeruje, że linia powinna być obszarem, ale nim nie jest.", "deprecated_tags": "Przestarzałe znaczniki: {tags}" @@ -710,16 +727,23 @@ "cannot_zoom": "Nie można bardziej oddalić widoku w obecnym trybie.", "full_screen": "Tryb pełnoekranowy", "gpx": { - "local_layer": "Lokalny plik", - "drag_drop": "Przeciągnij i upuść plik .gpx, .geojson lub .kml na stronę lub kliknij przycisk po prawej by go wybrać", + "local_layer": "Dodaj plik GPX", + "drag_drop": "Przeciągnij i upuść plik .gpx, .geojson lub .kml na stronę lub kliknij przycisk po prawej, by go wybrać", "zoom": "Przybliż do warstwy", "browse": "Wczytaj plik" }, + "mvt": { + "local_layer": "Dodaj plik MVT", + "drag_drop": "Przeciągnij i upuść plik .mvt lub .pbf na stronę, lub wybierz plik klikając na przycisk po prawej stronie", + "zoom": "Przybliż do tej warstwy", + "browse": "Wybierz plik" + }, "streetside": { - "tooltip": "Zdjęcia poziomu ulicy od Microsoft", - "title": "Zdjęcia poziomu ulicy (Bing Streetside)", - "report": "Zgłoś naruszenie prywatności w tym zdjęciu", - "hires": "Wyższa rozdzielczość" + "tooltip": "Zdjęcia ulic od Microsoftu", + "title": "Nakładka zdjęciowa (ulice z Bing)", + "report": "Zgłoś naruszenie prywatności na tym zdjęciu", + "view_on_bing": "Zobacz na mapie Bing", + "hires": "Wysoka rozdzielczość" }, "mapillary_images": { "tooltip": "Zdjęcia z serwisu Mapillary", @@ -739,6 +763,26 @@ "openstreetcam": { "view_on_openstreetcam": "Zobacz to zdjęcie na OpenStreetCam" }, + "note": { + "note": "Uwaga", + "title": "Edycja uwagi", + "anonymous": "anonimowo", + "closed": "(Zamknięta)", + "commentTitle": "Komentarze", + "newComment": "Nowy komentarz", + "close": "Rozwiąż uwagę", + "open": "Ponownie otwórz uwagę", + "comment": "Komentarz", + "close_comment": "Rozwiąż i skomentuj", + "open_comment": "Ponownie otwórz i skomentuj", + "report": "Zgłoś", + "new": "Nowa uwaga", + "newDescription": "Opisz problem.", + "save": "Zapisz uwagę", + "login": "Musisz się zalogować by zmienić stan lub skomentować uwagę.", + "upload_explanation": "Twoje komentarze będą widoczne dla wszystkich korzystających z OpenStreetMap.", + "upload_explanation_with_user": "Twoje komentarze jako {user} będą widoczne dla wszystkich użytkowników OpenStreetMap." + }, "help": { "title": "Pomoc", "key": "H", @@ -759,19 +803,20 @@ "navigation_drag": "Możesz przeciągnąć mapę, naciskając i przytrzymując {leftclick} lewym przyciskiem myszy i poruszając myszą. Możesz także użyć klawiszy strzałek `↓ ',` ↑ `,` ← `,` → `na klawiaturze.", "navigation_zoom": "Możesz powiększać i pomniejszać obraz, przewijając kółkiem myszy lub trackpadem, albo klikając przyciski {plus} / {minus} wzdłuż boku mapy. Możesz także użyć klawiszy `+`, `-` na klawiaturze.", "features_h": "Właściwości mapy", - "features": "Używamy określenia *obiekty* aby opisać rzeczy pojawijające się na mapie, jak drogi, budynki, pounkty zainteresowań. Wszystkie obiekty z rzeczywistego świata można zmapować, czyli odwzorować, w OpenStreetMap. Obiekty są prezentowane na mapie za pomocą *węzłów*, *linii* i *obszarów*.", + "features": "Używamy określenia *obiekty*, aby opisać rzeczy pojawiające się na mapie, jak drogi, budynki, użyteczne miejsca. Wszystkie obiekty z rzeczywistego świata można zmapować, czyli odwzorować, w postaci obiektu w OpenStreetMap. Obiekty te są prezentowane na mapie za pomocą *punktów*, *linii* i *obszarów*.", "nodes_ways": "W OpenStreetmap punkty są czasami nazywane * węzłami *, a linie i obszary są czasami nazywane * drogami *." }, "editing": { "title": "Edytowanie i zapisywanie", "select_h": "Wybierz", - "select_left_click": "{leftclick} Kilknij lewy przyciskiem myszy na obiekcie, aby go wybrać. Taki element zostanie podświetlony, a boczny panel wyświetli jego atrybuty, np. nazwę i adres.", - "select_right_click": "{rightclick} Kilknij prawym przyciskiem myszy na obiekcie aby wyświetlić menu edycji, które pokazuje możliwe do wykonania akcje, jak np. obót, przesunięcie czy usunięcie.", + "select_left_click": "{leftclick} Kliknij lewym przyciskiem myszy na obiekcie, aby go wybrać. Taki element zostanie podświetlony, a boczny panel wyświetli jego atrybuty, np. nazwę i adres.", + "select_right_click": "{rightclick} Kliknij prawym przyciskiem myszy na obiekcie, aby wyświetlić menu edycji, które pokazuje możliwe do wykonania akcje, jak np. obrót, przesunięcie czy usunięcie.", "multiselect_h": "wielokrotny wybór", - "multiselect_shift_click": "`{shift}`+{leftclick} trzymając shift i wybierając obiekty za pomocą LPM pozwala zaznaczać wiele obiektów. Pomaga to w przesuwaiu lub usuwaniu wielu elementów na raz.", - "multiselect_lasso": "Innym sposobem aby zaznaczyć wiele obiektów jest przytrzymanie klawisza `{shift}` i {leftclick} i narysawnie myszą lasso wokół obiektów, które mają być wybrane. Wszystkie węzły wewnątrz lasso zostaną zaznaczone.", + "multiselect_shift_click": "`{shift}`+{leftclick} trzymając shift i klikając lewym przyciskiem myszy wybiera wiele obiektów jednocześnie. Pomaga to w przesuwaniu lub usuwaniu wielu elementów na raz.", + "multiselect_lasso": "Innym sposobem na zaznaczenie wielu obiektów jest przytrzymanie klawisza `{shift}`, następnie naciśnięcie i trzymanie {leftclick} lewego przycisku myszy, i rysowanie tak myszą lasso wokół obiektów, które mają być wybrane. Wszystkie punkty wewnątrz lasso zostaną wybrane.", "undo_redo_h": "Cofnij & Wykonaj ponowniep", "save_h": "Zapisz", + "save": "Naciśnij {save} **Zapisz** by zakończyć edytowanie i wysłać zmiany do OpenStreetMap. Pamiętaj, by regularnie zapisywać swoją pracę!", "upload_h": "Wyślij", "backups_h": "Automatyczne kopie zapasowe", "keyboard_h": "Skróty klawiszowe", @@ -811,7 +856,7 @@ "edit_relation_h": "Edytowanie relacji", "relation_types_h": "Rodzaje relacji", "multipolygon_h": "Wielokąty", - "turn_restriction_h": "Ograniczenia skrętu", + "turn_restriction_h": "Zakazy/nakazy skrętu", "route_h": "Trasy", "boundary_h": "Granice" }, @@ -835,8 +880,28 @@ }, "field": { "restrictions": { + "title": "Pomoc dla zakazów/nakazów skrętu", + "about": { + "title": "Ogólnie", + "about": "To pole pozwala na sprawdzenie i modyfikację nakazów/zakazów skrętu. Wyświetlany jest model wybranego skrzyżowania, wliczając w to pobliskie połączone drogi.", + "from_via_to": "Nakaz/zakaz skrętu zawsze zawiera: jedną **drogę OD**, jedną **drogę DO**, oraz albo jeden **węzeł PRZEZ** lub jedną lub więcej **dróg PRZEZ**.", + "maxdist": "Suwak \"{distField}\" określa, jak daleko szukać dodatkowych, połączonych dróg.", + "maxvia": "Suwak \"{viaField}\" ustala jak wiele dróg \"przez\" ma być możliwych do użycia. Wskazówka: im mniej, tym lepiej." + }, + "inspecting": { + "title": "Sprawdzanie", + "from_shadow": "{fromShadow} **część OD**", + "allow_shadow": "{allowShadow} **TO Allowed**", + "only_shadow": "{onlyShadow} **tylko DO**" + }, + "modifying": { + "title": "Edytowanie", + "only_turn": "{onlyTurn} **tylko DO**" + }, "tips": { - "title": "Wskazówki" + "title": "Wskazówki", + "simple": "**Staraj się stosować proste, a nie rozbudowane zakazy/nakazy skrętu.**", + "simple_example": "Na przykład zamiast używać odcinka drogi w roli PRZEZ, użyj węzła, o ile jest to na danym skrzyżowaniu możliwe." } } } @@ -1168,7 +1233,6 @@ "add_point": "Tryb 'Dodawanie punktu'", "add_line": "Tryb 'Dodawanie linii'", "add_area": "Tryb 'Dodawanie obszaru'", - "place_point": "Umieść punkt", "disable_snap": "Przytrzymaj, by wyłączyć przyciąganie do punktu", "stop_line": "Zakończ rysowanie linii lub obszaru" }, @@ -1339,7 +1403,7 @@ "housename": "Nazwa domu", "housenumber": "123", "housenumber!jp": "Nr budynku/działki", - "neighbourhood": "Okręg", + "neighbourhood": "Osiedle", "neighbourhood!jp": "Chōme/Aza/Koaza", "place": "Miejsc. (adres bez ulicy)", "postcode": "Kod pocztowy", @@ -1493,7 +1557,7 @@ "label": "Budynek" }, "bunker_type": { - "label": "Typ" + "label": "Rodzaj" }, "cables": { "label": "Kable", @@ -1519,7 +1583,7 @@ "placeholder": "50, 100, 200..." }, "castle_type": { - "label": "Typ" + "label": "Rodzaj" }, "clothes": { "label": "Ubrania" @@ -1749,10 +1813,10 @@ "label": "Rodzaj" }, "fire_hydrant/position": { - "label": "Pozycja", + "label": "Lokalizacja", "options": { "green": "Zieleń", - "lane": "Ulica", + "lane": "Jezdnia", "parking_lot": "Miejsce parkingowe", "sidewalk": "Chodnik" } @@ -2119,9 +2183,9 @@ "oneway": { "label": "Jednokierunkowa", "options": { - "alternating": "Ruch Wachadłowy", + "alternating": "Ruch wahadłowy", "no": "Nie", - "reversible": "Okresowo Zmieniana", + "reversible": "Okresowo zmieniana", "undefined": "Domyślnie nie", "yes": "Tak" } @@ -2129,9 +2193,9 @@ "oneway_yes": { "label": "Jednokierunkowa", "options": { - "alternating": "Ruch Wachadłowy", + "alternating": "Ruch wahadłowy", "no": "Nie", - "reversible": "Okresowo Zmieniana", + "reversible": "Okresowo zmieniana", "undefined": "Domyślnie tak", "yes": "Tak" } @@ -2382,8 +2446,14 @@ "shop": { "label": "Typ" }, + "siren/purpose": { + "label": "Przeznaczenie" + }, "siren/type": { - "label": "Rodzaj" + "label": "Rodzaj", + "options": { + "other": "Inny" + } }, "site": { "label": "Typ" @@ -2800,6 +2870,10 @@ "name": "Terminal pasażerski", "terms": "port lotniczy, terminal lotniczy, terminal pasażerski, terminal" }, + "allotments/plot": { + "name": "Działka ogrodowa", + "terms": "działka,ogródek" + }, "amenity": { "name": "Usługa" }, @@ -3486,7 +3560,7 @@ "terms": "stodoła" }, "building/boathouse": { - "name": "Dom Na Wodzie", + "name": "Łódź mieszkalna", "terms": "houseboat,boathouse,na wodzie" }, "building/bungalow": { @@ -3555,6 +3629,10 @@ "name": "Garaże", "terms": "garaże" }, + "building/grandstand": { + "name": "Trybuna (budynek)", + "terms": "trybuna,trybuny" + }, "building/greenhouse": { "name": "Szklarnia", "terms": "Szklarnia" @@ -4018,6 +4096,9 @@ "name": "Hospicjum", "terms": "hospicjum" }, + "healthcare/laboratory": { + "name": "Laboratorium medyczne" + }, "healthcare/midwife": { "name": "Położna", "terms": "położna" @@ -4482,6 +4563,10 @@ "name": "Czatownia ornitologiczna", "terms": "ornitologia, ptaki" }, + "leisure/bleachers": { + "name": "Trybuna (odkryta)", + "terms": "trybuna,trybuny" + }, "leisure/bowling_alley": { "name": "Kręgielnia", "terms": "Kręgle" @@ -4905,6 +4990,9 @@ "name": "Szczyt", "terms": "szczyt,wierzchołek" }, + "natural/reef": { + "name": "Rafa" + }, "natural/ridge": { "name": "Grzbiet Górski", "terms": "grzbiet, grzbiet górski" @@ -5291,6 +5379,9 @@ "public_transport/platform_tram": { "name": "Przystanek tramwajowy / peron" }, + "public_transport/station_aerialway": { + "name": "Stacja publicznej kolejki linowej" + }, "public_transport/station_bus": { "name": "Dworzec autobusowy", "terms": "dworzec autobusowy, pks" @@ -5593,7 +5684,7 @@ "terms": "dom towarowy,dom handlowy" }, "shop/doityourself": { - "name": "Sklep dla majsterkowiczów", + "name": "Market budowlany/sklep dla majsterkowiczów", "terms": "sklep dla majsterkowiczów" }, "shop/dry_cleaning": { @@ -6246,6 +6337,24 @@ } }, "imagery": { + "AGIV": { + "attribution": { + "text": "Najnowsza ortofotomapa Flandrii © AGIV" + }, + "name": "Najnowsze zdjęcia lotnicze AGIV Flandria" + }, + "AGIV10cm": { + "attribution": { + "text": "Ortofotomapa Flandrii © AGIV" + }, + "name": "AGIV Flandria, zdjęcia lotnicze 2013-2015, 10cm" + }, + "AGIVFlandersGRB": { + "attribution": { + "text": "GRB Flandria © AGIV" + }, + "name": "AGIV Flandria GRB" + }, "Bing": { "description": "Zdjęcia satelitarne i lotnicze Bing.", "name": "Bing (satelitarne)" @@ -6267,6 +6376,7 @@ "attribution": { "text": "Warunki użytkowania i opinia" }, + "description": "DigitalGlobe-Standard to wyselekcjonowane obrazy pokrywające 86% lądu na Ziemi, czasem nawet o rozdzielczości 30-60cm na piksel, uzupełnione obrazami z Landsat. Średni wiek zdjeć to 2,31 roku, a niektóre obszary są uaktualniane dwa razy w roku.", "name": "DigitalGlobe Standard (satelitarne)" }, "DigitalGlobe-Standard-vintage": { @@ -6458,7 +6568,9 @@ "osmse-ekonomiska": { "attribution": { "text": "© Lantmäteriet" - } + }, + "description": "Skan \"Map ekonomicznych\" ok. 1950-1980", + "name": "Mapa ekonomiczna Lantmäteriet (historyczna)" }, "qa_no_address": { "attribution": { @@ -6493,7 +6605,9 @@ "trafikverket-baninfo": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "description": "Szwedzka sieć kolejowa, uwzględnia bocznice", + "name": "Sieć kolejowa Trafikverket" }, "trafikverket-baninfo-option": { "attribution": { @@ -6513,12 +6627,14 @@ "trafikverket-vagnat-navn": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "description": "Szwedzkie nazwy ulic NVDB" }, "trafikverket-vagnat-option": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "description": "Szwedzka sieć drogoa NVDV z wieloma warstwami mapowymi" } }, "community": { @@ -6548,12 +6664,20 @@ "description": "Ulepsz OpenStreetMap w Bangladeszu" }, "OSM-India-facebook": { - "description": "Ulepsz OpenStreetMap w Indiach" + "description": "Ulepsz OpenStreetMap w Indiach", + "events": { + "sotmasia2018": { + "name": "State of the Map Azja 2018" + } + } }, "OSM-india-mailinglist": { "name": "Lista dyskusyjna OpenStreetMap Indie", "description": "Talk-in to oficjalna mailingowa lista dyskusyjna społeczności OSM w Indiach" }, + "OSM-india-twitter": { + "name": "OpenStreetMap India Twitter" + }, "OSM-IDN-facebook": { "name": "OpenStreetMap Indonezja", "description": "Ulepsz OpenStreetMap w Indonezji" @@ -6613,9 +6737,15 @@ "name": "Lista dyskusyjna Talk-be", "description": "Talk-be to oficjalna mailingowa lista dyskusyjna belgijskiej społeczności OSM " }, + "be-maptime": { + "name": "Maptime Belgia" + }, "be-matrix": { "description": "Wszyscy mapujący są mile widziani!" }, + "hr-facebook": { + "description": "OpenStreetMap Chorwacja - grupa Facebookowa" + }, "czech-community": { "name": "Czeska społeczność OSM" }, @@ -6651,7 +6781,11 @@ "name": "Lista dyskusyjna OWL" }, "osm-de": { - "name": "OpenStreetMap Niemcy" + "name": "OpenStreetMap Niemcy", + "description": "Miejsce z informacjami o OpenStreetMap w Niemczech" + }, + "hu-facebook": { + "name": "OpenStreetMap Węgry na Facebook'u" }, "it-mailinglist": { "name": "Lista dyskusyjna Talk-it" @@ -6663,7 +6797,8 @@ "name": "Lista dyskusyjna OpenStreetMap dla Południowego Tyrolu" }, "no-mailinglist": { - "name": "Lista dyskusyjna OpenStreetMap Norwegia" + "name": "Lista dyskusyjna OpenStreetMap Norwegia", + "description": "Lista dyskusyjna dla mapujących i użytkownków OpenStreetMap w Norwegii" }, "OSM-PL-facebook-group": { "name": "OpenStreetMap Polska na Facebooku", @@ -6673,6 +6808,14 @@ "name": "Forum OpenStreetMap Polska", "description": "Forum dyskusyjne polskiej społeczności OpenStreetMap" }, + "si-forum": { + "name": "Forum OpenStreetMap Słowenia", + "description": "Forum społeczności OpenStreetMap w Słowenii" + }, + "si-mailinglist": { + "name": "Mailingowa lista dyskusyjna OpenStreetMap Słowenia", + "description": "Mejlowa lista dyskusyjna społeczności OpenStreetMap w Słowenii" + }, "OSM-ES-mailinglist": { "name": "Lista dyskusyjna Talk-es" }, @@ -6740,7 +6883,13 @@ "name": "OpenStreetMap US Slack" }, "OSM-US": { - "name": "OpenStreetMap US" + "name": "OpenStreetMap US", + "events": { + "sotmus2018": { + "name": "State of the Map US 2018", + "where": "Detroit, Michigan" + } + } }, "OSM-Utah": { "name": "OpenStreetMap Utah" @@ -6786,7 +6935,7 @@ "name": "Lista dyskusyjna Talk-co" }, "OSM-CO-twitter": { - "name": "OpenStreetMap KolumbiaTwitter", + "name": "OpenStreetMap Kolumbia Twitter", "description": "Obserwuj nas na Twitterze: {url}" }, "OSM-CO": { @@ -6819,6 +6968,10 @@ "name": "OpenStreetMap na Reddit", "description": "/r/openstreetmap/ jest wspaniałym miejscem by dowiedzieć się więcej o OpenStreetMap." }, + "OSM-Telegram": { + "name": "OpenStreetMap na Telegramie", + "description": "Dołącz od globalnej grupy OpenStreetMap na Telegramie na {url}" + }, "OSM-Twitter": { "name": "OpenStreetMap Twitter", "description": "Obserwuj nas na Twitterze: {url}" @@ -6827,7 +6980,9 @@ "name": "Fundacja OpenStreetMap ", "events": { "sotm2018": { - "name": "State of the Map 2018" + "name": "State of the Map 2018", + "description": "Mediolan, Włochy", + "where": "Mediolan, Włochy" } } } diff --git a/dist/locales/pt-BR.json b/dist/locales/pt-BR.json index 2a3b61b39..b132e97c3 100644 --- a/dist/locales/pt-BR.json +++ b/dist/locales/pt-BR.json @@ -21,6 +21,11 @@ "description": "Adicione restaurantes, monumentos, caixas de correio ou outros pontos ao mapa.", "tail": "Clique no mapa para adicionar um ponto." }, + "add_note": { + "title": "Nota", + "description": "Detectou um problema? Deixe outros mapeadores saberem.", + "tail": "Clique no mapa para adicionar uma nota." + }, "browse": { "title": "Navegar", "description": "Mover e ampliar o mapa." @@ -40,7 +45,8 @@ "annotation": { "point": "Adicionou um ponto.", "vertex": "Adicionou um ponto numa linha.", - "relation": "Adicionou uma relação." + "relation": "Adicionou uma relação.", + "note": "Adicionou uma nota." } }, "start": { @@ -297,6 +303,14 @@ "create": "Adicionada uma restrição de curva", "delete": "Excluída uma restrição de curva" } + }, + "detach_node": { + "title": "Desanexar", + "key": "E", + "description": "Desanexe esse nó dessas linhas/áreas.", + "annotation": "Separou um nó das linhas/áreas.", + "restriction": "Este nó não pode ser desanexado porque danificaria uma relação \"{relation}\".", + "connected_to_hidden": "Este nó não pode ser desanexado porque está conectado a um recurso oculto." } }, "restriction": { @@ -352,8 +366,8 @@ "localized_translation_name": "Nome" }, "zoom_in_edit": "Aproxime o zoom para editar", - "login": "login", - "logout": "sair", + "login": "Entrar", + "logout": "Sair", "loading_auth": "Conectando ao OpenStreetMap...", "report_a_bug": "Reportar um erro", "help_translate": "Ajude na tradução", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Dados do mapa do OpenStreetMap", "title": "Dados do OpenStreetMap" + }, + "notes": { + "tooltip": "Observe as notas no OpenStreetMap", + "title": "Notas do OpenStreetMap" } }, "fill_area": "Areas de Preenchimento", @@ -710,15 +728,22 @@ "cannot_zoom": "Não é possível afastar mais no modo atual.", "full_screen": "Alterar para Tela Cheia", "gpx": { - "local_layer": "Arquivo local", + "local_layer": "Adicionar um GPX", "drag_drop": "Arraste e solte um arquivo .gpx, .geojson ou .kml na página, ou clique o botão à direita para procurar", "zoom": "Aproximar a camada", "browse": "Procurar um arquivo" }, + "mvt": { + "local_layer": "Adicionar um MVT", + "drag_drop": "Arraste e solte um arquivo .mvt ou .pbf na página ou clique no botão à direita para navegar", + "zoom": "Zoom para camada", + "browse": "Procure um arquivo" + }, "streetside": { "tooltip": "Fotos da Streetside da Microsoft", "title": "Sobreposição de fotos (Bing Streetside)", "report": "Denunciar uma preocupação de privacidade com esta imagem", + "view_on_bing": "Visualizar no Bing Maps", "hires": "Alta resolução" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Ver esta imagem no OpenStreetCam" }, + "note": { + "note": "Nota", + "title": "Editar nota", + "anonymous": "anônimo", + "closed": "(Fechado)", + "commentTitle": "Comentários", + "newComment": "Novo comentário", + "inputPlaceholder": "Digite um comentário para compartilhar com outros usuários.", + "close": "Fechar nota", + "open": "Reabrir nota", + "comment": "Comentário", + "close_comment": "Fechar e comentar", + "open_comment": "Reabrir e comentar", + "report": "Reportar", + "new": "Nova nota", + "newDescription": "Descreva o problema.", + "save": "Salvar nota", + "login": "Você deve fazer login para alterar ou comentar esta nota.", + "upload_explanation": "Seus comentários serão publicamente visíveis para todos os usuários do OpenStreetMap.", + "upload_explanation_with_user": "Seus comentários como {user} serão publicamente visíveis para todos os usuários do OpenStreetMap." + }, "help": { "title": "Ajuda", "key": "H", @@ -876,6 +922,17 @@ "boundary": "Uma relação *limite* é um grupo de um ou mais recursos de linha que juntos formam um limite administrativo.", "boundary_add": "Para adicionar um elemento a uma relação de fronteira, selecione o elemento e desça até à secção \"Todas as relações\" do editor de elementos e clique no botão adicionar {plus} para adicionar os elementos próximos que existam na relação ou numa nova relação." }, + "notes": { + "title": "Notas", + "intro": "*Notas* são usadas para alertar outros usuários de que um recurso requer correção ou atenção. As notas marcam uma localização específica no mapa. Para visualizar anotações existentes ou adicionar novas anotações, clique no painel {data} ** Dados do mapa ** para ativar a camada de anotações do OpenStreetMap.", + "add_note_h": "Adicionando Notas", + "add_note": "Para adicionar uma nova nota, clique no botão {nota} **Nota** na barra de ferramentas acima do mapa ou pressione a tecla de atalho `4`. Isso mudará o cursor do mouse para um símbolo cruzado. Para colocar a nova nota no mapa, posicione o cursor do mouse onde a nota deve ir, então {leftclick} clique com o botão esquerdo ou pressione `Space`.", + "move_note": "Apenas novas notas podem ser movidas. Para mover uma nota, coloque o cursor do mouse sobre a nova nota, depois pressione e segure o botão esquerdo do mouse enquanto arrasta a nota para o novo local.", + "update_note_h": "Encerramento, Reabertura e Comentando", + "update_note": "Uma nota existente pode ser atualizada ao fechá-la, reabri-la ou adicionar um comentário a ela. Fechar uma nota indica que o problema foi resolvido. A reabertura de uma anotação indica que o problema original não foi resolvido.", + "save_note_h": "Salvando Notas", + "save_note": "Você deve salvar qualquer nota editada individualmente clicando nos botões abaixo dos comentários da nota. As edições de nota **não** estão incluídas nos conjuntos de alterações que você envia ao OpenStreetMap." + }, "imagery": { "title": "Imagens de Fundo", "intro": "As imagens de fundo que aparecem abaixo dos dados do mapa são um recurso importante para o mapeamento. Essas imagens podem ser fotos aéreas coletadas de satélites, aviões e drones, ou podem ser mapas históricos digitalizados ou outros dados de fonte disponíveis gratuitamente.", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "Fotos de Rua", - "intro": "As imagens ao nível de rua são bastante úteis para mapear sinais de trânsito, negócios e outros detalhes que não são visíveis em imagens aéreas ou de satélite. O editor iD suporta imagens ao nível de rua do [Mapillary](https://www.mapillary.com) e do [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "As fotos no nível da rua são úteis para mapear sinais de trânsito, empresas e outros detalhes que você não consegue ver de imagens aéreas e de satélite. O editor iD suporta fotos de nível de rua de [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), e [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Usando Fotos de Rua", "using": "Para utilizar imagens ao nível de rua para mapear, clique no painel {data} **Dados do mapa** ao lado do mapa para ativar ou desativar a camada de imagens de rua que estão disponíveis.", "photos": "Quando ativado, a camada de foto exibe uma linha ao longo da seqüência de fotos. Em níveis de zoom mais altos, um círculo marca em cada local da foto e, em níveis de zoom ainda maiores, um cone indica a direção em que a câmera estava voltada quando a foto foi tirada.", @@ -1270,7 +1327,8 @@ "add_point": "modo 'Adicionar ponto' ", "add_line": "modo 'Adicionar linha'", "add_area": "modo 'Adicionar area'", - "place_point": "Adicione um ponto", + "add_note": "Modo 'Adicionar nota'", + "place_point": "Coloque um ponto ou nota", "disable_snap": "Pressione para desabilitar o agarramento de nós", "stop_line": "Concluir desenhando uma linha ou área" }, @@ -1279,6 +1337,7 @@ "continue_line": "Continuar a linha no nó selecionado", "merge": "Combinar (juntar) elementos selecionados", "disconnect": "Desconectar elementos no nó selecionado", + "detach_node": "Desanexar o nó selecionado das linhas/áreas", "split": "Dividir a linha em duas no nó selecionado", "reverse": "Reverter a linha", "move": "Mover elementos selecionados", @@ -1623,6 +1682,9 @@ "label": "Capacidade", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Dinheiro em" + }, "castle_type": { "label": "Tipo" }, @@ -2278,6 +2340,9 @@ "underground": "Subterrâneo" } }, + "passenger_information_display": { + "label": "Exposição de informação do passageiro" + }, "payment_multi": { "label": "Tipos de Pagamento" }, @@ -2510,6 +2575,9 @@ "site": { "label": "Tipo" }, + "site_type": { + "label": "Tipo de site" + }, "smoking": { "label": "Fumantes", "options": { @@ -3393,7 +3461,8 @@ "name": "Máquina de Venda de Comida" }, "amenity/vending_machine/fuel": { - "name": "Bomba de Gasolina" + "name": "Bomba de Gasolina", + "terms": "bomba de gasolina,bomba de combustível,bomba de diesel,gasolina,combustível,propano,diesel,biodiesel" }, "amenity/vending_machine/ice_cream": { "name": "Máquina de Venda de Sorvete" @@ -4014,7 +4083,8 @@ "terms": "salva-vidas, salva vidas, bóia" }, "emergency/lifeguard": { - "name": "Salva-vidas" + "name": "Salva-vidas", + "terms": "salva-vidas,salva vidas,guarda-vidas,guarda vidas,bombeiro,resgate,cpr,rcp,rcr" }, "emergency/no": { "name": "Acesso de Emergência Não Permitido" @@ -4595,7 +4665,7 @@ }, "leisure/amusement_arcade": { "name": "Fliperama", - "terms": "Fliperama, parque de diversões" + "terms": "Fliperama, parque de diversões, vídeo game, jogos, jogos eletrônicos, console" }, "leisure/beach_resort": { "name": "Resort em Praia" @@ -4988,11 +5058,11 @@ }, "natural/bay": { "name": "Baía", - "terms": "baía, enseada" + "terms": "baía, enseada, mar, costa, água" }, "natural/beach": { "name": "Praia", - "terms": "praia, areia" + "terms": "praia, areia, cobertura de solo, mar, solo" }, "natural/cave_entrance": { "name": "Entrada de caverna", @@ -5000,7 +5070,7 @@ }, "natural/cliff": { "name": "Penhasco", - "terms": "Penhasco, Falésia, Cânion" + "terms": "Penhasco, Falésia, Cânion, acidente geográfico, morro, montanha" }, "natural/coastline": { "name": "Orla Marítima", @@ -5008,7 +5078,7 @@ }, "natural/fell": { "name": "Encosta", - "terms": "Fell, Morro, Cerro, Coxilha, Montanha, Outeiro" + "terms": "Fell, Morro, Cerro, Coxilha, Montanha, Outeiro, acidente geográfico" }, "natural/glacier": { "name": "Geleira", @@ -5016,21 +5086,23 @@ }, "natural/grassland": { "name": "Pradaria", - "terms": "Pradaria" + "terms": "Pradaria, vegetação, vegetação rasteira, gramínea" }, "natural/heath": { "name": "Urzal", - "terms": "Urzal" + "terms": "Urzal, vegetação, arbustos, charneca" }, "natural/mud": { - "name": "Lama" + "name": "Lama", + "terms": "solo, lamaçal, mangue, lama, cobertura de solo" }, "natural/peak": { "name": "Cume", "terms": "Pico, Topo de Montanha, Serra, Montanha, Monte" }, "natural/reef": { - "name": "Recife" + "name": "Recife", + "terms": "coral, recife, mar, rocha, solo, arrecife, recife de corais, corais" }, "natural/ridge": { "name": "Cumeeira", @@ -5050,7 +5122,7 @@ }, "natural/scrub": { "name": "Arbustos", - "terms": "Moita, Arbusto, Matagal" + "terms": "Moita, Arbusto, Matagal, vegetação" }, "natural/spring": { "name": "Nascente", @@ -5058,11 +5130,11 @@ }, "natural/tree": { "name": "Árvore", - "terms": "Árvore" + "terms": "Árvore, vegetação, planta" }, "natural/tree_row": { "name": "Fileira de árvores", - "terms": "Fileira de árvores" + "terms": "Fileira de árvores, vegetação, plantas" }, "natural/volcano": { "name": "Vulcão", @@ -5074,23 +5146,23 @@ }, "natural/water/lake": { "name": "Lago", - "terms": "Lago, laguna, lacustre" + "terms": "Lago, laguna, lacustre, água, lagoa" }, "natural/water/pond": { "name": "Lagoa", - "terms": "Lagoa" + "terms": "Lagoa, lago, água, lacustre" }, "natural/water/reservoir": { "name": "Represa", - "terms": "Lago Artificial, Albufeira, Açude" + "terms": "Lago Artificial, Albufeira, Açude, lago, água, lacustre, barragem" }, "natural/wetland": { "name": "Zona Úmida", - "terms": "zona úmida, pântano, charco, paul, sapal, turfa" + "terms": "zona úmida, pântano, charco, paul, sapal, turfa, solo, cobertura de solo" }, "natural/wood": { "name": "Mata Nativa", - "terms": "floresta, bosque, selva" + "terms": "floresta, bosque, selva, vegetação, fauna" }, "noexit/yes": { "name": "Rua sem Saída", @@ -5310,6 +5382,9 @@ "name": "Povoado", "terms": "vila, povoado, distrito, aldeia" }, + "playground/balance_beam": { + "name": "Jogar saldo de feixe" + }, "playground/basket_spinner": { "name": "Girador de cesta" }, @@ -5534,6 +5609,9 @@ "public_transport/stop_position_bus": { "name": "Local de parada de ônibus" }, + "public_transport/stop_position_ferry": { + "name": "Localização de parada de balsa " + }, "public_transport/stop_position_light_rail": { "name": "Local de parada do VLT" }, @@ -6519,28 +6597,28 @@ "text": "Termos e Comentários" }, "description": "O DigitalGlobe-Premium é um mosaico composto de mapa base DigitalGlobe com regiões selecionadas preenchidas com imagens Vivid ou personalizadas de área de interesse, resolução de 50 cm ou superior, e atualizadas com mais frequência com atualizações contínuas.", - "name": "Imagens premium da DigitalGlobe" + "name": "Imagens DigitalGlobe Premium" }, "DigitalGlobe-Premium-vintage": { "attribution": { "text": "Termos e Comentários" }, "description": "Limites de imagens e datas de captura. Os rótulos aparecem no nível de zoom 13 e superior.", - "name": "Data das imagens de satélite premium da DigitalGlobe" + "name": "Data das imagens de satélite DigitalGlobe Premium" }, "DigitalGlobe-Standard": { "attribution": { "text": "Termos e Comentários" }, "description": "O DigitalGlobe-Standard é um conjunto curado de imagens que cobre 86% da massa terrestre do planeta, com resolução de 30-60 cm onde disponível, provida pela Landsat. A idade média é de 2,31 anos, com algumas áreas atualizadas 2x por ano.", - "name": "Imagens comuns da DigitalGlobe" + "name": "Imagens DigitalGlobe Standard" }, "DigitalGlobe-Standard-vintage": { "attribution": { "text": "Termos e Comentários" }, "description": "Limites de imagens e datas de captura. Os rótulos aparecem no nível de zoom 13 e superior.", - "name": "Data das imagens de satélite comuns da DigitalGlobe" + "name": "Data das imagens de satélite DigitalGlobe Standard" }, "EsriWorldImagery": { "attribution": { @@ -7036,6 +7114,9 @@ "talk-au": { "name": "Lista de Discussão Talk-au" }, + "OSM-AR-facebook": { + "name": "Facebook OpenStreetMap Argentina" + }, "OSM-AR-mailinglist": { "name": "Lista de Discussão Talk-ar", "description": "Lista histórica. Em desuso hoje." @@ -7054,6 +7135,8 @@ "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" }, "DF-telegram": { + "name": "Grupo de Telegram do OpenStreetMap Brasília", + "description": "Participe do grupo de Telegram do OpenStreetMap Brasília", "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" }, "OSM-br-mailinglist": { diff --git a/dist/locales/pt.json b/dist/locales/pt.json index 7e915b06f..f93d9f43f 100644 --- a/dist/locales/pt.json +++ b/dist/locales/pt.json @@ -352,8 +352,6 @@ "localized_translation_name": "Nome" }, "zoom_in_edit": "Aproxime para editar", - "login": "Iniciar sessão", - "logout": "Terminar sessão", "loading_auth": "A fazer a ligação ao OpenStreetMap...", "report_a_bug": "Reportar um bug.", "help_translate": "Ajudar a traduzir.", @@ -710,7 +708,6 @@ "cannot_zoom": "Não é possível afastar mais no modo atual.", "full_screen": "Edição em ecrã inteiro.", "gpx": { - "local_layer": "Ficheiro local", "drag_drop": "Arraste e largue um ficheiro .gpx, .geojson ou .kml na página ou clique no botão da direita para selecionar um", "zoom": "Aproximar para a camada", "browse": "Encontrar ficheiro" @@ -888,7 +885,6 @@ }, "streetlevel": { "title": "Imagens ao nível de rua", - "intro": "As imagens ao nível de rua são bastante úteis para mapear sinais de trânsito, negócios e outros detalhes que não são visíveis em imagens aéreas ou de satélite. O editor iD suporta imagens ao nível de rua do [Mapillary](https://www.mapillary.com) e do [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Utilizar imagens ao nível de rua", "using": "Para utilizar imagens ao nível de rua para mapear, clique no painel {data} **Dados do mapa** ao lado do mapa para ativar ou desativar a camada de imagens de rua que estão disponíveis.", "photos": "Quando ativada, a camada de imagens de rua mostrará uma linha com uma sequência de imagens. Em níveis de aproximação mais elevados, surgirá um marcador com a forma dum circulo que mostrará a localização de cada fotografia, quanto maior a aproximação, surgirá um cone que mostra a direção que a câmara estava apontada quando a imagem foi capturada. ", @@ -1262,7 +1258,6 @@ "add_point": "Modo 'adicionar ponto'", "add_line": "Modo 'adicionar linha'", "add_area": "Modo 'adicionar área'", - "place_point": "Colocar um ponto", "disable_snap": "Manter para desativar atração a pontos", "stop_line": "Terminar de desenhar uma linha ou área" }, @@ -3108,6 +3103,10 @@ "name": "Biblioteca", "terms": "Biblioteca, Livros, Consulta, Publica" }, + "amenity/love_hotel": { + "name": "Motel só para casais", + "terms": "Motel" + }, "amenity/marketplace": { "name": "Mercado / Feira", "terms": "Bazar, Minimercado" diff --git a/dist/locales/ro.json b/dist/locales/ro.json index 939c66cce..50109b663 100644 --- a/dist/locales/ro.json +++ b/dist/locales/ro.json @@ -227,8 +227,6 @@ "localized_translation_language": "Alege limba", "localized_translation_name": "Nume" }, - "login": "login", - "logout": "logout", "loading_auth": "Conectare la OpenStreetMap..", "report_a_bug": "Raportează o greșeală", "help_translate": "Ajută la traducere", @@ -492,7 +490,6 @@ "deprecated_tags": "Tag-uri învechite: {tags}" }, "gpx": { - "local_layer": "Fișier local", "zoom": "Mărește la strat", "browse": "Caută fișier" }, @@ -702,8 +699,7 @@ "editing": { "title": "Editare", "drawing": { - "title": "Desenare", - "place_point": "Plasează und punct" + "title": "Desenare" }, "operations": { "title": "Operațiuni", diff --git a/dist/locales/ru.json b/dist/locales/ru.json index 989e353c2..e728bada3 100644 --- a/dist/locales/ru.json +++ b/dist/locales/ru.json @@ -21,6 +21,11 @@ "description": "Нанести на карту рестораны, памятники, почтовые ящики или другие точки.", "tail": "Нажмите на карту, чтобы добавить точку." }, + "add_note": { + "title": "Заметка", + "description": "Заметили проблему? Сообщите о ней другим участникам.", + "tail": "Нажмите на карту, чтобы добавить точку." + }, "browse": { "title": "Обзор", "description": "Двигать и масштабировать карту." @@ -40,7 +45,8 @@ "annotation": { "point": "Добавлена точка.", "vertex": "В линию добавлена точка.", - "relation": "Добавлено отношние." + "relation": "Добавлено отношние.", + "note": "Добавлена заметка." } }, "start": { @@ -297,6 +303,13 @@ "create": "Добавлен запрет манёвра", "delete": "Удалён запрет манёвра" } + }, + "detach_node": { + "title": "Отсоединить", + "description": "Отсоединить эту точку от этих линий/полигонов", + "annotation": "Точка отсоединена от родительской линии/полигона.", + "restriction": "Эту точку невозможно отсоединить, потому что это повредит отношение \"{relation}\"", + "connected_to_hidden": "Эту точку невозможно отсоединить, потому что она принадлежит скрытому объекту." } }, "restriction": { @@ -352,8 +365,8 @@ "localized_translation_name": "Название" }, "zoom_in_edit": "Приблизьте для редактирования", - "login": "войти", - "logout": "выйти", + "login": "Войти", + "logout": "Выйти", "loading_auth": "Подключение к OpenStreetMap…", "report_a_bug": "Сообщить об ошибке", "help_translate": "Помочь перевести", @@ -536,6 +549,10 @@ "osm": { "tooltip": "Картографические данные OpenStreetMap", "title": "Данные OpenStreetMap" + }, + "notes": { + "tooltip": "Данные с заметками OpenStreetMap", + "title": "Заметки OpenStreetMap" } }, "fill_area": "Заливать полигоны", @@ -710,15 +727,22 @@ "cannot_zoom": "В текущем режиме дальнейшее отдаление невозможно.", "full_screen": "Во весь экран", "gpx": { - "local_layer": "Локальный файл", + "local_layer": "Добавить GPX", "drag_drop": "Перетащите .gpx, .geojson или .kml файл на страницу или нажмите кнопку справа для его выбора", "zoom": "Приблизиться к слою", "browse": "Выбрать файл" }, + "mvt": { + "local_layer": "Добавить MVT", + "drag_drop": "Перетащите .mvt либо .pbf файл на страницу, или нажмите кнопку справа для просмотра", + "zoom": "Приблизиться к слою", + "browse": "Выбрать файл" + }, "streetside": { "tooltip": "Уличные фото от Microsoft", "title": "Слой с фото (Bing Streetside)", "report": "Сообщить обеспокоенность о приватности в этом изображении", + "view_on_bing": "Посмотреть на картах Bing", "hires": "Высокое разрешение" }, "mapillary_images": { @@ -739,6 +763,27 @@ "openstreetcam": { "view_on_openstreetcam": "Посмотреть это изображение на OpenStreetCam" }, + "note": { + "note": "Заметка", + "title": "Изменить заметку", + "anonymous": "анонимно", + "closed": "(Закрыта)", + "commentTitle": "Комментарии", + "newComment": "Новый комментарий", + "inputPlaceholder": "Введите комментарий и поделитесь им с другими пользователями.", + "close": "Закрыть заметку", + "open": "Переоткрыть заметку", + "comment": "Прокомментировать", + "close_comment": "Закрыть и прокомментировать", + "open_comment": "Переоткрыть и прокомментировать", + "report": "Пожаловаться", + "new": "Новая заметка", + "newDescription": "Опишите проблему.", + "save": "Сохранить заметку", + "login": "Вам нужно войти, чтобы изменить или оставить комментарий этой заметке.", + "upload_explanation": "Ваши комментарии будут видны всем пользователем OpenStreetMap.", + "upload_explanation_with_user": "Ваши комментарии от имени {user} будут видны всем пользователям OpenStreetMap." + }, "help": { "title": "Справка", "key": "H", @@ -876,6 +921,17 @@ "boundary": "Отношение *граница* — это группа из одного и более линейного объекта, которые вместе образуют административную границу.", "boundary_add": "Чтобы добавить объект к отношению границы, выберите объект и прокрутите вниз до секции \"Все отношения\" в редакторе объектов, затем нажмите на кнопку {plus}, чтобы добавить выбранный объект к ближайшим существующим или новому отношению." }, + "notes": { + "title": "Заметки", + "intro": "*Заметки* используются для того, чтобы оповестить пользователей, что объект требуется исправить либо уделить ему внимание. Заметки помечают определенное местоположение на карте. Чтобы посмотреть существующие заметки или добавить новые, нажмите на панель {data} **Данные карты**, чтобы включить слой Заметки OpenStreetMap.", + "add_note_h": "Добавление заметок", + "add_note": "Чтобы добавить заметку, нажмите кнопку {note} **Заметка** на панели инструментов вверху карты, или используйте горячую клавишу `4`. После нажатия курсор у мышки изменится на символ перекрестия. Чтобы разместить новую заметку на карте, перместите курсор в место, где должна быть заметка, затем нажмите {leftclick} левой кнопкой мыши или нажмите `Пробел`.", + "move_note": "Только новые заметки могут быть перемещены. Чтобы переместить заметку, поместите курсор мыши над заметкой, затем нажмите и удерживайте {leftclick} левую кнопку мыши, пока перетаскиваете заметку на её новое место.", + "update_note_h": "Закрытие, переоткрытие и комментирование", + "update_note": "Существующие заметки можно обновить, закрыв их, переоткрыв их или добавив к ним комментарий. Закрытие заметки означает, что проблема была решена. Переоткрытие заметки означает, что проблема решена не была.", + "save_note_h": "Сохранение заметок", + "save_note": "Изменение каждой заметки нужно сохранять по отдельности, нажимая кнопки, расположенные ниже комментариев заметки. Изменения заметок **не** попадают в пакеты правок, которые вы загружаете в OpenStreetMap." + }, "imagery": { "title": "Фоновые изображения", "intro": "Фоновые изображения, отображаемые под картографическими данными, — важный источник для картографирования. Этими изображениями могут быть снимки с воздуха, собранные спутниками, самолетами или беспилотными летательными аппаратами, или это может быть отсканированная историческая карта или любой другой свободно распростаняемый источник информации.", @@ -888,7 +944,7 @@ }, "streetlevel": { "title": "Панорамы улиц", - "intro": "Уличные панорамы полезны для картографирования дорожных знаков, бизнесов и других подробностей, которых не видно на спутниковых снимках и снимках с воздуха. Редактор iD поддерживает панорамы из [Mapillary](https://www.mapillary.com) и [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Уличные панорамы полезны для картографирования дорожных знаков, бизнесов и других подробностей, которых не видно на спутниковых снимках и снимках с воздуха. Редактор iD поддерживает панорамы из [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) и [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Использование панорам улиц", "using": "Для использования уличных панорам для картографирования нажмите на панель {data} **Данные карты** сбоку от карты, чтобы включить или выключить слой с доступными фотографиями.", "photos": "Когда включён, слой фото отображает линию вдоль череды фотографий. На крупных зумах видны круглые отметки в месте каждой фотографии, а на ещё более крупных зумах — индикатор в виде конуса, отображающий направление камеры во время съёмки.", @@ -972,6 +1028,7 @@ "10th-avenue": "10-я авеню", "11th-avenue": "11-я авеню", "12th-avenue": "12-я авеню", + "access-point-employment": "Использование точек доступа", "adams-street": "улица Адамса", "andrews-elementary-school": "Начальная школа Эндрюс", "andrews-street": "улица Эндрюс", @@ -985,6 +1042,7 @@ "conservation-park": "Заповедник", "constantine-street": "улица Константин", "cushman-street": "улица Кушман", + "dollar-tree": "Все по $1", "douglas-avenue": "Дуглас-авеню", "east-street": "Восточная улица", "elm-street": "улица Вязов", @@ -1064,7 +1122,8 @@ "wheeler-street": "улица Уилер", "william-towing": "Эвакуаторы Уильяма", "willow-drive": "Ивовый переулок", - "wood-street": "Древняя улица" + "wood-street": "Древняя улица", + "world-fare": "World Fare" } }, "welcome": { @@ -1267,7 +1326,8 @@ "add_point": "Режим “Нанести точку”", "add_line": "Режим “Нанести линию”", "add_area": "Режим “Добавить полигон”", - "place_point": "Добавить точку", + "add_note": "Режим 'Добавить заметку'", + "place_point": "Разместите точку или заметку", "disable_snap": "При удержании отключает режим прилипания точек", "stop_line": "Завершить линию или полигон" }, @@ -1276,6 +1336,7 @@ "continue_line": "Продолжить линию в выделенной точке", "merge": "Объединить выделенные объекты", "disconnect": "Отсоединить объект в выделенной точке", + "detach_node": "Отсоединить выбранную точку от родительской линий/полигонов", "split": "Разрезать линию в выделенной точке", "reverse": "Изменить направление линии", "move": "Переместить выделенные объекты", @@ -1451,7 +1512,8 @@ "subdistrict": "Подрайон", "subdistrict!vn": "Район/комуна/поселение", "suburb": "Пригород", - "suburb!jp": "Район" + "suburb!jp": "Район", + "unit": "Номер комнаты/офиса" } }, "admin_level": { @@ -1619,6 +1681,9 @@ "label": "Вместимость", "placeholder": "50, 100, 200…" }, + "cash_in": { + "label": "Приём наличных" + }, "castle_type": { "label": "Тип" }, @@ -2273,6 +2338,9 @@ "underground": "Подземная" } }, + "passenger_information_display": { + "label": "Табло прибытия/отправления" + }, "payment_multi": { "label": "Способы оплаты" }, @@ -2505,6 +2573,9 @@ "site": { "label": "Тип" }, + "site_type": { + "label": "Тип места" + }, "smoking": { "label": "Курение", "options": { @@ -3174,7 +3245,7 @@ "terms": "парковка, паркинг, автостоянка, автомобильная парковка" }, "amenity/parking_entrance": { - "name": "Въезд/Выезд с автопарковки", + "name": "Въезд/выезд с парковки", "terms": "стоянка, въезд, выезд, автомобиль, машина, парковка, паркинг" }, "amenity/parking_space": { @@ -3406,8 +3477,8 @@ "terms": "автомат посылок, почтомат, почтовый автомат" }, "amenity/vending_machine/parking_tickets": { - "name": "Автомат по продаже парковочных билетов", - "terms": "паркомат" + "name": "Паркомат", + "terms": "паркомат, парковочные билеты, оплата за парковку, автомат оплаты за парковку" }, "amenity/vending_machine/public_transport_tickets": { "name": "Автомат по продаже проездных билетов", @@ -4279,7 +4350,7 @@ }, "highway/service/parking_aisle": { "name": "Между рядами парковки", - "terms": "парковочный проезд, проезд на парковке" + "terms": "парковочный проезд, проезд по парковке" }, "highway/services": { "name": "Места для починки автомобиля и отдыха водителей", @@ -4523,7 +4594,7 @@ "terms": "карьер, каменоломня, открытая разработка" }, "landuse/railway": { - "name": "Железнодорожный корридор", + "name": "Железнодорожный коридор", "terms": "Земли, используемые для размещения жележнодорожных объектов" }, "landuse/recreation_ground": { @@ -4959,7 +5030,7 @@ }, "natural/grassland": { "name": "Луг", - "terms": "Травяной луг, Луговина, Лужок, Выкос, Перелесье, травяной покров, травянистый поуров" + "terms": "Травяной луг, Луговина, Лужок, Выкос, Перелесье, травяной покров, травянистый покров, трава" }, "natural/heath": { "name": "Вересковая пустошь", @@ -6400,7 +6471,7 @@ "attribution": { "text": "Условия и обратная связь" }, - "description": "DigitalGlobe-Premium — собранная из кусков базовой подложки DigitalGlobe с избранными регионами в +Vivid или избранными областями с интересными снимками, 50см разрешение или лучше, обновляется более чаще с текущими обновлениями.", + "description": "DigitalGlobe-Premium — собранная из кусков базовой подложки DigitalGlobe с избранными регионами в +Vivid или избранными областями с интересными снимками, 50см разрешение или лучше, обновляется более чаще по мере получения свежих снимков.", "name": "Премиум снимки DigitalGlobe" }, "DigitalGlobe-Premium-vintage": { @@ -6414,6 +6485,7 @@ "attribution": { "text": "Условия и обратная связь" }, + "description": "DigitalGlobe-Standard — подобранный набор снимков, покрывающий 86% поверхности суши, с 30-60см разрешением, где это доступно, дополненный Landsat-ом. Средний возраст — 2.31 года, с некоторыми областями, которые обновляются дважды в год.", "name": "Стандартные снимки DigitalGlobe" }, "DigitalGlobe-Standard-vintage": { @@ -6691,7 +6763,7 @@ "description": "Нажмите Like на нашей странице в Facebook, чтобы подписаться на новости и обновления про OpenStreetMap." }, "OSM-help": { - "name": "OpenStreetMap Помощь", + "name": "Помощь OpenStreetMap", "description": "Задайте вопрос и получите ответы на сайте вопросов и ответов, поддерживаемом OSM сообществом.", "extendedDescription": "{url} для всех нуждающихся в помощи касательно OpenStreetMap. Начинающий ли вы участник или у вас возник технический вопрос — здесь вам помогут!" }, diff --git a/dist/locales/si.json b/dist/locales/si.json index 92f64f921..ce9a91ac8 100644 --- a/dist/locales/si.json +++ b/dist/locales/si.json @@ -197,7 +197,6 @@ "localized_translation_language": "භාෂාවක් තෝරාගන්න", "localized_translation_name": "නම" }, - "logout": "ඉවත් වන්න ", "loading_auth": "OpenStreetMap වෙත සම්බන්ද වෙමින්...", "feature_info": { "hidden_warning": "සෙගවුන ලක්ෂණ {count} ක්", diff --git a/dist/locales/sk.json b/dist/locales/sk.json index bf465448d..0a0a14ac4 100644 --- a/dist/locales/sk.json +++ b/dist/locales/sk.json @@ -303,8 +303,6 @@ "localized_translation_language": "Zvoľte jazyk", "localized_translation_name": "Meno" }, - "login": "prihlásenie", - "logout": "odhlásiť", "loading_auth": "Pripája sa k OpenStreetMap...", "report_a_bug": "Nahlásiť chybu", "help_translate": "Pomoc s prekladom", @@ -626,7 +624,6 @@ "cannot_zoom": "V tomto móde nemožno viac oddialiť.", "full_screen": "Prepni na plnú obrazovku", "gpx": { - "local_layer": "Lokálny súbor", "drag_drop": "Pretiahnite a pustite .gpx, .geojson or .kml súbor na stránku, alebo kliknite na tlačítko napravo pre výber", "zoom": "Priblížiť na vrstvu", "browse": "Vybrať súbor" @@ -972,7 +969,6 @@ "add_point": "\"Pridať bod\" mód", "add_line": "\"Pridať čiaru\" mód", "add_area": "\"Pridať plochu\" mód", - "place_point": "Umiestniť bod", "disable_snap": "Podržanie zruší prichytávanie k bodu", "stop_line": "Dokončiť kreslenie čiary alebo plochy" }, diff --git a/dist/locales/sl.json b/dist/locales/sl.json index 46b812f4f..31b13a217 100644 --- a/dist/locales/sl.json +++ b/dist/locales/sl.json @@ -314,8 +314,6 @@ "localized_translation_name": "Naziv" }, "zoom_in_edit": "Približaj za urejanje", - "login": "prijava", - "logout": "odjava", "loading_auth": "Vzpostavljanje povezave z OpenStreetMap ...", "report_a_bug": "Pošlji sporočilo napaki", "help_translate": "Sodelujte pri prevodu", @@ -656,7 +654,6 @@ "cannot_zoom": "V trenutnem načinu nadaljnje oddaljevanje pogleda ni mogoče.", "full_screen": "Preklopi celozaslonski način", "gpx": { - "local_layer": "Krajevna datoteka", "drag_drop": "Povlecite datoteko .gpx, .geojson ali .khm na stran, ali pa kliknite gumb na desni za brskanje med datotekami.", "zoom": "Približaj plasti", "browse": "Prebrskaj za datoteko" @@ -1026,7 +1023,6 @@ "add_point": "Način dodajanja »Točk« ", "add_line": "Način dodajanja »Črt« ", "add_area": "Način dodajanja »Mnogokotnikov« ", - "place_point": "Postavi točko", "disable_snap": "Zadržite tipko za onemogočanje lepljenja točk", "stop_line": "Končaj risanje črte ali površine" }, @@ -5086,6 +5082,14 @@ "osm-mg-facebook": { "name": "Facebook skupina OpenStreetMap Madagaskar" }, + "si-forum": { + "name": "Slovenski OpenStreetMap forum", + "description": "Forum skupnosti OpenStreetMap v Sloveniji" + }, + "si-mailinglist": { + "name": "Slovenski OpenStreetMap dopisni seznam", + "description": "Dopisni seznam slovenske OpenStreetMap skupnosti" + }, "OSM-help": { "name": "Pomoč OpenStreetMap" }, diff --git a/dist/locales/sq.json b/dist/locales/sq.json index 6e5aa4f0e..d485962a4 100644 --- a/dist/locales/sq.json +++ b/dist/locales/sq.json @@ -192,7 +192,6 @@ "localized_translation_language": "Zgjidhni gdjuhën", "localized_translation_name": "Emër" }, - "logout": "dil", "loading_auth": "Lidh me OpenStreetMap...", "feature_info": { "hidden_warning": "{count} tipare të fshehura", diff --git a/dist/locales/sr.json b/dist/locales/sr.json index 3727760ce..62a24de0e 100644 --- a/dist/locales/sr.json +++ b/dist/locales/sr.json @@ -303,8 +303,6 @@ "localized_translation_language": "Изабери језик", "localized_translation_name": "Назив" }, - "login": "пријава", - "logout": "одјава", "loading_auth": "Повезивање са Опенстритмап...", "report_a_bug": "Пријавите проблем", "help_translate": "Помозите у превођењу", @@ -621,7 +619,6 @@ "cannot_zoom": "Не можете даље умањивати у тренутном режиму.", "full_screen": "Укључи / искључи приказ на целом екрану", "gpx": { - "local_layer": "Локална датотека", "drag_drop": "Превуците и отпустите .gpx, .geojson или .kml датотеку на страницу или кликните на дугме здесна за претраживање", "zoom": "Приближи до слоја", "browse": "Претражите за датотеком" @@ -793,7 +790,6 @@ "add_point": "Додај чвор", "add_line": "Додај путању", "add_area": "Додај област", - "place_point": "Постави чвор", "disable_snap": "Задржи за онемогућавање померања чвора", "stop_line": "Заврши цртање путање или области" }, diff --git a/dist/locales/sv.json b/dist/locales/sv.json index f578defb0..47f16e597 100644 --- a/dist/locales/sv.json +++ b/dist/locales/sv.json @@ -21,6 +21,11 @@ "description": "Lägg till restauranger, butiker, postlådor och andra punkter på kartan.", "tail": "Klicka på kartan för att lägga till en punkt." }, + "add_note": { + "title": "Notering", + "description": "Hittat ett problem? Låt andra kartläggare få veta det. ", + "tail": "Klicka på kartan för att lägga till en notering. " + }, "browse": { "title": "Navigera", "description": "Panorera och zooma kartan." @@ -40,7 +45,8 @@ "annotation": { "point": "Lade till en punkt.", "vertex": "Lade till en nod till en linje.", - "relation": "Lade till en relation." + "relation": "Lade till en relation.", + "note": "Lägg till en notering. " } }, "start": { @@ -297,6 +303,14 @@ "create": "Lade till en svängrestriktion", "delete": "Raderade en svängrestriktion" } + }, + "detach_node": { + "title": "Koppla isär", + "key": "E", + "description": "Koppla isär denna nod från dessa linjer/områden.", + "annotation": "Koppla isär en nod från föräldralinjer/-områden.", + "restriction": "Denna nod kan inte kopplas isär då det skulle skada en \"{relation}\"-relation.", + "connected_to_hidden": "Denna nod kan inte kopplas isär då den är kopplad till ett dolt objekt." } }, "restriction": { @@ -353,7 +367,7 @@ }, "zoom_in_edit": "Zooma in för att redigera", "login": "Logga in", - "logout": "logga ut", + "logout": "Logga ut", "loading_auth": "Ansluter till OpenStreetMap...", "report_a_bug": "Rapportera ett fel", "help_translate": "Hjälp till och översätta", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Kartdata från OpenStreetMap", "title": "OpenStreetMap-data" + }, + "notes": { + "tooltip": "Noteringar från OpenStreetMap", + "title": "OpenStreetMap-noteringar" } }, "fill_area": "Fyllda områden", @@ -710,15 +728,22 @@ "cannot_zoom": "Går ej att zooma ut ytterligare i nuvarande läge. ", "full_screen": "Växla fullskärm", "gpx": { - "local_layer": "Lokal fil", + "local_layer": "Lägg till en GPX", "drag_drop": "Dra och släpp en .gpx-, .geojson- eller .kml-fil på sidan, eller klicka på knappen till höger för att bläddra", "zoom": "Zooma till lager", "browse": "Bläddra efter en fil" }, + "mvt": { + "local_layer": "Lägg till en MVT", + "drag_drop": "Drag och släpp en .mvt- eller .pbf-fil på sidan, eller klicka på knappen till höger för att bläddra.", + "zoom": "Zooma till lager", + "browse": "Bläddra efter en fil" + }, "streetside": { "tooltip": "Gatubilder från Microsoft", "title": "Bildlager (Bing Streetside)", "report": "Rapportera ett integritetsproblem med den här bilden", + "view_on_bing": "Visa på Bing Maps", "hires": "Hög upplösning" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Visa denna bild på OpenStreetCam" }, + "note": { + "note": "Notering", + "title": "Ändra notering", + "anonymous": "anonym", + "closed": "(Stängd)", + "commentTitle": "Kommentarer", + "newComment": "Ny kommentar", + "inputPlaceholder": "Skriv en kommentar att dela med andra användare.", + "close": "Stäng notering", + "open": "Öppna notering igen", + "comment": "Kommentera", + "close_comment": "Stäng och kommentera", + "open_comment": "Öppna igen och kommentera", + "report": "Anmäl", + "new": "Ny notering", + "newDescription": "Beskriv problemet. ", + "save": "Spara notering", + "login": "Du måste logga in för att ändra eller kommentera den här noteringen.", + "upload_explanation": "Dina kommentarer kommer att vara synliga för alla OpenStreetMap-användare.", + "upload_explanation_with_user": "Dina kommentarer som {user} kommer att vara synliga för alla OpenStreetMap-användare." + }, "help": { "title": "Hjälp", "key": "H", @@ -876,6 +922,17 @@ "boundary": "En *gräns*-relation är en grupp av en eller flera linjer som tillsammans formar en administrativ gräns.", "boundary_add": "För att lägga till ett objekt till en gräns-relation, välj objektet och bläddra ned till sektionen \"Alla relationer\" i objektredigeraren. Klicka sedan på knappen {plus} **Lägg till** för att lägga till detta objekt till en närliggande existerande relation eller en ny relation." }, + "notes": { + "title": "Noteringar", + "intro": "*Noteringar* används för att uppmärksamma andra användare att ett objekt behöver fixas eller bearbetas. Noteringar markerar en specifik plats på kartan. För att se existerande noteringar eller lägga till nya, klicka på panelen {data} **Kartdata** för att aktivera lagret OpenStreetMap-noteringar. ", + "add_note_h": "Lägga till noteringar", + "add_note": "För att lägga till en ny notering, klicka på knappen {note} **Notering** i verktygsraden ovanför kartan, eller trycka kortkommandot `4`. Detta kommer att ändra muspekaren till ett kryss. För att placera den nya noteringen på kartan, placera muspekaren där noteringen ska vara och vänsterklicka {leftclick} eller tryck `Mellanslag`. ", + "move_note": "Bara nya noteringar kan flyttas. För att flytta en notering, placera muspekaren över den nya noteringen och tryck sedan och håll ned {leftclick} vänster musknapp medan du dra noteringen till dess nya placering. ", + "update_note_h": "Stänga, återöppna och kommentera", + "update_note": "En existerande notering kan uppdateras genom att stänga den, återöppna den, eller genom att lägga till en kommentar till den. Genom att stänga en notering indikerar du att problemet har lösts. Genom att återöppna en notering indikerar du att det ursprungliga problemet inte är löst. ", + "save_note_h": "Spara noteringar", + "save_note": "Du måste spara alla ändringar du gör på noteringar individuellt genom att klicka på knapparna under noteringens kommentarer. Ändringar på noteringar inkluderas **inte** i ändringset du laddar upp till OpenStreetMap." + }, "imagery": { "title": "Bakgrundsbilder", "intro": "Bakgrundsbilderna som visas under kartdata är en viktig källa vid kartläggning. Dessa bilder kan vara flygfoton insamlade med satellit, flygplan eller drönare, eller så kan det vara inskannade historiska kartor eller andra fritt tillgängliga källor.", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "Gatubilder", - "intro": "Gatubilder är användbart vid kartläggning av trafikmärken, företag och andra detaljer som du inte kan se från satellit- eller flygbilder. iD stöder gatubilder från [Mapillary](https://www.mapillary.com) och [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Gatufoton är användbara vid kartläggning av trafikmärken, företag, och andra detaljer du inte ser på satelit- eller flygfoton. iD stöder gatufoton från [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) och [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Använda gatubilder", "using": "För att använda gatubilder för kartläggning, klicka på panelen {data} **Kartdata** vid sidan av kartan för att aktivera eller avaktivera tillgängliga bildlager.", "photos": "När aktiverad visar bildlagret en linje längst sekvensen av bilder. Vid högre inzoomning visas en cirkel för varje bild, och vid ännu högre zoom-nivå visar en kon riktningen kameran hade när bilden togs.", @@ -1270,7 +1327,8 @@ "add_point": "'Lägg till punkt'-läge", "add_line": "'Lägg till linje'-läge", "add_area": "'Lägg till område'-läge", - "place_point": "Placera en punkt", + "add_note": "'Lägg till notering'-läge", + "place_point": "Placera en punkt eller notering", "disable_snap": "Hindra att punkter kopplas samman", "stop_line": "Slutför linje eller område" }, @@ -1279,6 +1337,7 @@ "continue_line": "Fortsätt en linje från markerad nod", "merge": "Kombinera (sammanfoga) markerade objekt", "disconnect": "Koppla isär objekt vid markerad nod", + "detach_node": "Koppla isär vald nod från förälderlinjer/-områden", "split": "Dela en linje i två vid markerad nod", "reverse": "Byt riktning på en linje", "move": "Flytta markerade objekt", @@ -1623,6 +1682,9 @@ "label": "Kapacitet", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Insättning av pengar" + }, "castle_type": { "label": "Typ" }, @@ -2278,6 +2340,9 @@ "underground": "Underjordisk" } }, + "passenger_information_display": { + "label": "Passagerarinformationssystem" + }, "payment_multi": { "label": "Betalningssätt" }, @@ -2510,6 +2575,9 @@ "site": { "label": "Typ" }, + "site_type": { + "label": "Typ av arkeologisk plats" + }, "smoking": { "label": "Rökning", "options": { @@ -4275,7 +4343,7 @@ "terms": "Stig, gång, led, spår, gångväg, vandringsled, vandra, vandring, promenad, löparbana, motionsspår" }, "highway/pedestrian_area": { - "name": "Gångfartsområde", + "name": "Gågateområde", "terms": "Gångfartsområde, gångfart, centrum, plaza, torg, gångväg, gångområde, gågata, gårdsgata" }, "highway/pedestrian_line": { @@ -5740,7 +5808,7 @@ "terms": "Relation, relaterat, förbindelse, förhållande, samband, anknytning, koppling, kontext" }, "roundabout": { - "name": "Rondell" + "name": "Cirkulationsplats" }, "route/ferry": { "name": "Färjerutt", @@ -7455,6 +7523,10 @@ "description": "Kartläggare och OpenStreetMap-användare runt Portland, Maine", "extendedDescription": "Maptime ger, ganska bokstavligen, tid för kartläggning. Vårt uppdrag är att öppna dörrarna för kartografiska möjligheter för alla som är intresserade av att skapa tid och utrymme för samarbete, utforskning och kartskapande med hjälp av kartläggningsverktyg och -teknik." }, + "us-ma-mailinglist": { + "name": "E-postlistan Talk-us-massachusetts", + "description": "E-postlista for OSM-gemenskapen i Massachusetts" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Förbättra OpenStreetMap kring Cleveland", @@ -7483,6 +7555,11 @@ "name": "OpenStreetMap NYC", "description": "Kartläggare och OpenStreetMap-användare, utvecklare och entusiaster runt storstadsregionen New Yorks." }, + "OSM-Portland-forum": { + "name": "OpenStreetMap PDX på Google Group", + "description": "Forum och e-postlista för OpenStreetMap-användare runt Portland", + "extendedDescription": "Denna grupp syfta till att samordna förbättringar av OpenStreetMap runt Portland, Oregon, för att stöda tillämpningar så som Open Trip Planer." + }, "OSM-Portland": { "name": "OpenStreetMap Portland", "description": "Kartläggare och OpenStreetMap-användare runt Portland", diff --git a/dist/locales/ta.json b/dist/locales/ta.json index a34da8f31..2eae144ba 100644 --- a/dist/locales/ta.json +++ b/dist/locales/ta.json @@ -108,8 +108,6 @@ "localized_translation_language": "மொழியை தேர்ந்தெடு", "localized_translation_name": "பெயர்" }, - "login": "உள் நுழை", - "logout": "விடுபதிகை", "help_translate": "மொழிப்பெயர்க்க உதவவும்.", "commit": { "cancel": "ரத்து", diff --git a/dist/locales/te.json b/dist/locales/te.json index ccef0a449..127147a5b 100644 --- a/dist/locales/te.json +++ b/dist/locales/te.json @@ -208,7 +208,6 @@ "localized_translation_language": "భాషను ఎంచుకోండి", "localized_translation_name": "పేరు" }, - "logout": "నిష్క్రమించు", "loading_auth": "ఓపెన్‌స్ట్రీట్‌మ్యాపుకి అనుసంధానిస్తున్నాం…", "help_translate": "అనువాదనకు సహకరించండి", "feature_info": { diff --git a/dist/locales/tl.json b/dist/locales/tl.json index d5a8b1b91..abd006350 100644 --- a/dist/locales/tl.json +++ b/dist/locales/tl.json @@ -290,8 +290,6 @@ "localized_translation_language": "Pumili ng wika", "localized_translation_name": "Pangalan" }, - "login": "mag-login", - "logout": "Mag-logout", "loading_auth": "Kumokonekta sa OpenStreetMap ...", "report_a_bug": "Magulat ng bug.", "help_translate": "Tumulong sa pagasasalin.", diff --git a/dist/locales/tr.json b/dist/locales/tr.json index e6d9a1f81..574c00957 100644 --- a/dist/locales/tr.json +++ b/dist/locales/tr.json @@ -1,5 +1,10 @@ { "tr": { + "icons": { + "information": "bilgi", + "remove": "kaldır", + "undo": "geri al" + }, "modes": { "add_area": { "title": "Alan", @@ -16,6 +21,10 @@ "description": "Restoran, anıt ya da posta kutusunu haritaya ekle.", "tail": "Nokta eklemek için haritaya tıkla." }, + "add_note": { + "title": "Not", + "tail": "Not bırakmak için haritaya tıklayın." + }, "browse": { "title": "Gözat", "description": "Harita üzerinde dolaş ve bir alana yaklaş." @@ -35,7 +44,8 @@ "annotation": { "point": "Nokta eklendi.", "vertex": "Çizgiye bir bağlantı noktası eklendi.", - "relation": "Bir küme eklendi." + "relation": "Bir küme eklendi.", + "note": "Not eklendi" } }, "start": { @@ -288,6 +298,19 @@ "create": "Bir dönüş kısıtlaması eklendi.", "delete": "Bir dönüş kısıtlaması silindi" } + }, + "detach_node": { + "title": "Ayırt" + } + }, + "restriction": { + "controls": { + "distance": "Uzaklık", + "via": "Üzerinden", + "via_node_only": "Sadece nokta" + }, + "help": { + "indirect": "(dolaylı)" } }, "undo": { @@ -307,8 +330,8 @@ "localized_translation_name": "İsim" }, "zoom_in_edit": "Düzenlemek için yakınlaştırın", - "login": "giriş yap", - "logout": "çıkış yap", + "login": "Giriş Yap", + "logout": "Çıkış", "loading_auth": "OpenStreetMap'e bağlanıyor...", "report_a_bug": "Hata bildir", "help_translate": "Çeviriye yardım et", @@ -489,6 +512,10 @@ "osm": { "tooltip": "OpenStreetMap'ten harita verisi", "title": "OpenStreetMap verisi" + }, + "notes": { + "tooltip": "OpenStreetMap'ın Not Verileri", + "title": "OpenStreetMap'ın Notları" } }, "fill_area": "Alanları Doldur", @@ -601,8 +628,19 @@ }, "success": { "just_edited": "OpenStreetMap'te bir değişiklik yaptın!", + "thank_you": "Haritayı iyileştirdiğiniz için teşekkür ederiz.", + "thank_you_location": "{where} çevresindeki haritayı iyileştirdiğiniz için teşekkür ederiz.", + "help_html": "Değişiklikleriniz birkaç dakika içinde OpenStreetMap'da görünmelidir. Başka sitelerden haritaların güncellesi daha uzun sürebilir.", "help_link_text": "Detaylar", - "help_link_url": "Yaptığın değişiklikleri nasıl görebileceğine dair detaylı bilgiyi şu adreste bulabilirsin - İngilizce: https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F" + "help_link_url": "Yaptığın değişiklikleri nasıl görebileceğine dair detaylı bilgiyi şu adreste bulabilirsin - İngilizce: https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F", + "view_on_osm": "Değişiklikleri OSM üzerinde gör", + "changeset_id": "Değişiklik Takımı #: {changeset_id}", + "like_osm": "OpenStreetMap beğendin mi? Başkalarıyla bağlantı kur:", + "more": "Daha fazla", + "events": "Etkinlikler", + "languages": "Diller: {languages}", + "missing": "Bu listede eksik bir şey mi var?", + "tell_us": "Bize söyle!" }, "confirm": { "okay": "Tamam", @@ -650,11 +688,14 @@ "cannot_zoom": "Bu modda daha fazla uzaklaşılamaz.", "full_screen": "Tam Ekran", "gpx": { - "local_layer": "Dosya", + "local_layer": "GPX rotası ekle", "drag_drop": ".gpx, .geojson or .kml formatında bir dosya sürükle ve bırak ya da sağdaki tuşa basarak bir dosya seç", "zoom": "Yakınlaş", "browse": "Dosya seç" }, + "mvt": { + "local_layer": "MVT dosyası ekle" + }, "mapillary_images": { "tooltip": "Mapilary'den sokak fotoğrafları", "title": "Fotoğraf Katmanı (Mapilary)" @@ -673,6 +714,24 @@ "openstreetcam": { "view_on_openstreetcam": "Bu imajı OpenStreetCam'de görüntüleyin" }, + "note": { + "note": "Not", + "title": "Notu düzenle", + "anonymous": "kimliği belirsiz", + "closed": "(Kapalı)", + "commentTitle": "Yorumlar", + "newComment": "Yeni Yorum", + "close": "Notu Kapat", + "open": "Notu Tekrar Aç", + "comment": "Yorum", + "close_comment": "Yorum yazıp Kapat", + "report": "Bildir", + "new": "Yeni Not", + "newDescription": "Sorunu açıklayın.", + "save": "Notu Kaydet", + "login": "Bu notu değiştirmek veya yorum yapmak için oturum açmanız gerekir.", + "upload_explanation": "Yorumlarınız genel olarak tüm OpenStreetMap kullanıcılarına görünür olacaktır." + }, "help": { "title": "Yardım", "key": "H", @@ -1041,7 +1100,6 @@ "add_point": "'Nokta ekle' modu", "add_line": "'Çizgi ekle' modu", "add_area": "'Alan ekle' modu", - "place_point": "Bir nokta yerleştir", "disable_snap": "Nokta bitiştirmeyi iptal etmek için basılı tutun", "stop_line": "Çizgi ya da alan çizimini tamamla" }, @@ -6042,6 +6100,97 @@ }, "name": "Thunderforest Arazi" } + }, + "community": { + "cape-coast-youthmappers": { + "name": "Cape Coast Üniversitesi YouthMappers", + "description": "Bizi Twitter'dan takip edin: {url}", + "extendedDescription": "Bu, Gana'daki Cape Coast Üniversitesi'nin Gençlik Haritacıları bölümünün resmi tanıtıcısıdır. haritaları seviyoruz, verileri açıyoruz ve savunmasızlığa yardımcı oluyoruz." + }, + "osm-gh-facebook": { + "name": "OpenStreetMap Gana Facebook'ta", + "description": "OpenStreetMap ile ilgilenen kişilerin Faceboo grubu." + }, + "osm-gh-twitter": { + "name": "OpenStreetMap Gana Twitter'da", + "description": "Bizi Twitter'dan takip edin: {url}" + }, + "talk-gh": { + "name": "Talk-gh E-posta listesi", + "description": "Talk-gh, Gana OSM topluluğunun resmi posta listesidir." + }, + "osm-mg-facebook": { + "name": "OpenStreetMap Madagaskar Facebook Grubu", + "description": "OpenStreetMap ile ilgilenen insanlar için Malagasy Facebook grubu." + }, + "talk-mg": { + "name": "Talk-mg E-posta listesi", + "description": "Paylaşmak ve tartışmak için Madagaskar'daki OpenStreetMap katılımcıları, toplulukları ve kullanıcıları için yer." + }, + "OSM-BGD-facebook": { + "name": "OpenStreetMap Bangladeş", + "description": "Bangladeşteki OpenStreetMap'ı geliştirin", + "extendedDescription": "Bangladeş'te Haritalama Sorularınız var mı, buradan toplumla bağlantı kurmak mı istiyorsunuz? {Url} adresinden bize katılın. Hoşgeldiniz!" + }, + "OSM-India-facebook": { + "name": "OpenStreetMap Hindistan - Katılımcı mahalle haritalaması", + "description": "Hindistan'da OpenStreetMap'i geliştirin", + "extendedDescription": "Hindistan'da haritalama mı? Sorularınız var mı, buradan toplumla bağlantı kurmak mı istiyorsunuz? {Url} adresinden bize katılın. Hoşgeldiniz!", + "events": { + "sotmasia2018": { + "name": "Asya 2018 Haritanın Durumu ", + "where": "Hint Enstitüsü Yönetimi, Bangalore, Hindistan" + } + } + }, + "OSM-india-mailinglist": { + "name": "OpenStreetMap Hindistan Posta Listesi", + "description": "Konuşma, Hindistan Topluluğu için resmi Posta Listesi" + }, + "OSM-india-twitter": { + "name": "OpenStreetMap Hindistan Twitter'ı", + "description": "Sadece bir tweet uzağındayız: {url}" + }, + "OSM-India-Puducherry-Facebook": { + "description": "Topluluk etkinlikleri, aktiviteleri hakkında bilgi edinmek için FSHM Facebook sayfası", + "extendedDescription": "FSHM, özgür yazılım / donanım, teknoloji, aktivizm ve OpenStreetMap ile ilgili etkinlikler düzenlemektedir. FB sayfası, etkinlikleriyle iletişim kurmanın en iyi yoludur." + }, + "OSM-India-Puducherry-Matrix": { + "description": "FSHM Riot grubu, Puducherry'deki ve çevresindeki haritalama etkinliklerini, olaylarını tartışmak, paylaşmak ve güncellemek için", + "extendedDescription": "FSHM topluluk üyeleri kendi OSM haritalama güncellemelerini / deneyimlerini Riot.im grubu aracılığıyla paylaşıyor, bu grup aynı zamanda özgür yazılım / donanım, teknoloji ve aktivizm ile ilgili konuları tartışmak için de kullanılıyor." + }, + "OSM-IDN-facebook": { + "name": "OpenStreetMap Endonezya", + "description": "Endonezya'da OpenStreetMap'ı geliştirin", + "extendedDescription": "Endonezya'da haritalama mı? Sorularınız var mı, buradan toplumla bağlantı kurmak mı istiyorsunuz? {Url} adresinden bize katılın. Hoşgeldiniz!" + }, + "OSM-japan-facebook": { + "name": "OpenStreetMap Japonya Topluluğu", + "description": "Japonya'daki Mappers ve OpenStreetMap kullanıcıları" + }, + "OSM-japan-mailinglist": { + "name": "OpenStreetMap Japonya Posta Listesi" + }, + "OSM-japan-twitter": { + "name": "OpenStreetMap Japonya'nın Twitter'ı", + "description": "Twitter'daki Hashtag: {url}" + }, + "OSM-japan-website": { + "name": "OpenStreetMap Japonya", + "description": "Japonya'daki Mappers ve OpenStreetMap kullanıcıları" + }, + "OSM-korea-telegram": { + "name": "OSM Kore Telegram Kanalı", + "description": "Kore'deki OpenStreetMap katılımcıları, toplulukları ve kullanıcılarını paylaşmak ve tartışmak için Resmi Olmayan bir Kanal." + }, + "OSM-MY-facebook": { + "name": "Facebook'ta OpenStreetMap Malezya", + "description": "OpenStreetMap ile ilgili herhangi bir şey hakkında sohbet için!" + }, + "OSM-MY-forum": { + "name": "OpenStreetMap Malezya Forumu", + "description": "Resmi OpenStreetMap Malezya Forumu" + } } } } \ No newline at end of file diff --git a/dist/locales/uk.json b/dist/locales/uk.json index 406317afe..3b675ee9b 100644 --- a/dist/locales/uk.json +++ b/dist/locales/uk.json @@ -21,6 +21,11 @@ "description": "Додати ресторани, пам’ятники, поштові скрині, чи інші точки на мапу.", "tail": "Клацніть на мапу, щоб поставити точку." }, + "add_note": { + "title": "Нотатка", + "description": "Виявлено проблему? Дайте знати іншим картографам.", + "tail": "Клацніть на карту, щоб додати нотатку." + }, "browse": { "title": "Перегляд", "description": "Пересування та масштабування мапи." @@ -40,7 +45,8 @@ "annotation": { "point": "Додано точку.", "vertex": "Точку додано до лінії.", - "relation": "Додано зв’язок" + "relation": "Додано зв’язок", + "note": "Нотатку додано." } }, "start": { @@ -297,6 +303,14 @@ "create": "Додано заборону повороту", "delete": "Заборону повороту видалено" } + }, + "detach_node": { + "title": "Від'єднати", + "key": "E", + "description": "Від'єднати виділену точку від ліній/полігонів.", + "annotation": "точку від'єднано від ліній/полігонів", + "restriction": "Цю точку не можливо від'єднати, це може зруйнувати звʼязок \"{relation}\".", + "connected_to_hidden": "Цю точку не можливо від'єднати, бо вона є частиною прихованого об'єкта." } }, "restriction": { @@ -352,8 +366,8 @@ "localized_translation_name": "Назва" }, "zoom_in_edit": "Наблизтесь, щоб редагувати", - "login": "вхід", - "logout": "вийти", + "login": "Ввійти", + "logout": "Вийти", "loading_auth": "З’єднання з OpenStreetMap…", "report_a_bug": "Повідомити про помилку", "help_translate": "Допомогти перекласти", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Дані мапи з OpenStreetMap", "title": "Дані OpenStreetMap" + }, + "notes": { + "tooltip": "Нотатки з OpenStreetMap", + "title": "Нотатки OpenStreetMap" } }, "fill_area": "Заливка полігонів", @@ -710,15 +728,22 @@ "cannot_zoom": "Не можливо зменшити масштаб в поточному режимі.", "full_screen": "Розвернути на весь екран", "gpx": { - "local_layer": "Локальний файл", + "local_layer": "Додати GPX", "drag_drop": "Перетягніть файл .gpx, .geojson або .kml на сторінку чи клацніть кнопку праворуч для вибору файлу", "zoom": "Масштабувати до шару", "browse": "Вибрати файл" }, + "mvt": { + "local_layer": "Додати MVT", + "drag_drop": "Перетягніть файл .mvt або .pbf на сторінку чи натисніть кнопку праворуч для вибору файлу", + "zoom": "Наблизити до шару", + "browse": "Виберіть файл" + }, "streetside": { "tooltip": "Streetside фото від Microsoft", "title": "Фото шар (Bing Streetside)", "report": "Повідомити про порущення конфіденційності щодо цього зображення", + "view_on_bing": "Переглянути на Bing Картах", "hires": "Висока якість" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Переглянути цей знімок на OpenStreetCam" }, + "note": { + "note": "Нотатка", + "title": "Редагувати нотатку", + "anonymous": "анонімно", + "closed": "(Закриті)", + "commentTitle": "Коментарі", + "newComment": "Новий коментар", + "inputPlaceholder": "Додайте коментар для поширення інформації для інших учасників.", + "close": "Закрити нотатку", + "open": "Перевідкрити нотатку", + "comment": "Коментар", + "close_comment": "Коментувати та закрити", + "open_comment": "Коментувати та перевідкрити", + "report": "Повідомити", + "new": "Нова нотатка", + "newDescription": "Опишіть проблему.", + "save": "Зберегти нотатку", + "login": "Вам потрібно увійти для того щоб змінити стан або додати власний коментар до нотатки.", + "upload_explanation": "Ваші коментарі будуть доступні всім користувачам OpenStreetMap.", + "upload_explanation_with_user": "Ваші коментарі під ім'ям {user} будуть доступні всім користувачам OpenStreetMap." + }, "help": { "title": "Довідка", "key": "H", @@ -876,6 +922,17 @@ "boundary": "До складу в'язка *boundary* входить один чи більше лінійних об'єктів, що разом утворюють адміністративний кордон.", "boundary_add": "Для додавання об'єкта до зв'язку адміністративного кордону, виділіть потрібний об'єкт, прогорніть редактор до розділу \"Всі зв'язки\", клацніть кнопку {plus} щоб додати об'єкт до одного зі зв'язків поруч або створити новий зв'язок." }, + "notes": { + "title": "Нотатки", + "intro": "*Примітки* використовуються для попередження інших користувачів про необхідність виправлення або для привертання уваги. Нотатки позначають певне місце на карті. Щоб переглянути існуючі нотатки або додати нові, натисніть панель {data} **Дані**, щоб увімкнути шар нотаток OpenStreetMap.", + "add_note_h": "Додавання приміток", + "add_note": "Щоб додати нову нотатку, натисніть кнопку {note} ** Нотатка ** на панелі інструментів над картою або натисніть клавішу `4`. Це змінить курсор миші на символ хреста. Щоб помістити нову нотатку на карту, розмістіть курсор миші, де повинна бути примітка, потім {leftclick} клацніть лівою кнопкою миші або натисніть клавішу \"Пропуск\".", + "move_note": "Можна переміщувати лише нові нотатки. Щоб перемістити нотатку, наведіть курсор миші на нову нотатку, а потім натисніть і утримуйте {leftclick} ліву кнопку миші, перетягуючи примітку до її нового розташування.", + "update_note_h": "Закриття, повторне відкриття та коментування", + "update_note": "Існуючу нотатку можна змінити завершенням її, відновленням або додаванням до неї коментаря. Завершення замітки вказує на те, що проблема була вирішена. Відновлення нотатки означає, що оригінальна проблема не вирішена.", + "save_note_h": "Зберегти всі Нотатки", + "save_note": "Ви повинні зберегти будь-які зміни приміток індивідуально, натиснувши кнопки під примітками коментарів. Примітки **не** включені в набори змін, які ви завантажуєте в OpenStreetMap." + }, "imagery": { "title": "Фонове зображення", "intro": "Фонове зображення, що показується під даними – є важливим ресурсом для мапінгу. Це можуть бути аерофотознімки зі супутників, літаків та дронів; або ж це скановані історичні мапи чи інші вільно доступні джерела даних.", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "Знімки з вулиць", - "intro": "Знімки з вулиць дуже корисні для додавання інформації про дорожні знаки, об'єкти інфраструктури, магазини та інших деталей, які не можна побачити на аерофотознімках. iD підтримує роботу зі знімками [Mapillary](https://www.mapillary.com) та [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Знімки з вулиць дуже корисні для додавання інформації про дорожні знаки, об'єкти інфраструктури, магазини та інших деталей, які не можна побачити на аерофотознімках. Редактор iD підтримує фотографії вулиць з [Bing Streetside] (https://www.microsoft.com/en-us/maps/streetside), [Mapillary] (https://www.mapillary.com) та [OpenStreetCam ] (https://www.openstreetcam.org).", "using_h": "Використання знімків з вулиць", "using": "Для використання знімків з вулиць для мапінгу, поставте на панелі {data} **Дані мапи** позначку навпроти потрібного шару.", "photos": "Після активації відповідного шару, ви побачите на мапі лінію вздовж якої була зроблена послідовність знімків. На докладних рівнях масштабу, кола покажуть місця в яких знімки були зроблені, наблизившись ще, ви побачите конуси, що вкажуть в якому напрямку була розташована камера під час знімання.", @@ -1270,7 +1327,8 @@ "add_point": "Режим 'Додавання точок'", "add_line": "Режим 'Додавання ліній'", "add_area": "Режим 'Додавання полігонів'", - "place_point": "Додати точку на мапу", + "add_note": "Режим \"Додати нотатку\"", + "place_point": "Додати точку або примітку", "disable_snap": "Утримувати для вимкнення прилипання", "stop_line": "Закінчення креслення лінії/полігона" }, @@ -1279,6 +1337,7 @@ "continue_line": "Продовжити лінію від виділеної точки", "merge": "Обʼєднати (злити) виділені обʼєкти", "disconnect": "Розʼєднати обʼєкти у виділеній точці", + "detach_node": "Від'єднати виділену точку від ліній/полігонів", "split": "Розрізати лінію на дві у виділеній точці", "reverse": "Розвернути напрямок лінії", "move": "Перемістити виділені обʼєкти", @@ -1623,6 +1682,9 @@ "label": "Міськість", "placeholder": "50, 100, 200…" }, + "cash_in": { + "label": "Купюроприймач" + }, "castle_type": { "label": "Тип" }, @@ -2278,6 +2340,9 @@ "underground": "Підземна" } }, + "passenger_information_display": { + "label": "Інформтабло про рух транспорту" + }, "payment_multi": { "label": "Види розрахунків" }, @@ -2510,6 +2575,9 @@ "site": { "label": "Тип" }, + "site_type": { + "label": "Тип археологічної пам'ятки" + }, "smoking": { "label": "Паління", "options": { @@ -7137,7 +7205,17 @@ "description": "Приєднуйтесь до #osmbe на irc.oftc.net (port 6667)" }, "be-mailinglist": { - "name": "Talk-be Список розсилки" + "name": "Talk-be Список розсилки", + "description": "Talk-be є офіційним списком розсилки для бельгійської спільноти OSM" + }, + "be-maptime": { + "name": "Maptime Бельгія" + }, + "be-matrix": { + "description": "Ласкаво просимо усіх картографів!" + }, + "be-meetup": { + "extendedDescription": "Фізичні зустрічі з іншими дуже корисні, картографи задають питання і багато чого навчаються. Особливо приємно бачити нових авторів!" }, "be-twitter": { "name": "OpenStreetMap Бельгія Twitter", @@ -7259,6 +7337,9 @@ "Western-Slope-facebook": { "name": "Western Slope OSM Facebook" }, + "Maptime-Australia-Slack": { + "name": "Slack Maptime Австралія" + }, "talk-au": { "name": "Talk-au Список розсилки" }, @@ -7295,6 +7376,9 @@ "name": "OpenStreetMap Чилі Twitter", "description": "Приєднуйтесь до нас у Twitter: {url}" }, + "Maptime-Bogota": { + "name": "Maptime Богота" + }, "OSM-CO-facebook": { "name": "OpenStreetMap Колумбія у Facebook", "description": "Приєднуйтесь до спільноти OpenStreetMap Колумбія у Facebook" diff --git a/dist/locales/vi.json b/dist/locales/vi.json index 2f037c955..3ffb17117 100644 --- a/dist/locales/vi.json +++ b/dist/locales/vi.json @@ -21,6 +21,11 @@ "description": "Thêm nhà hàng, đài tưởng niệm, hòm thư, hoặc địa điểm khác vào bản đồ.", "tail": "Nhấn vào bản đồ để thêm địa điểm." }, + "add_note": { + "title": "Ghi chú", + "description": "Nhận ra khuyết điểm? Hãy báo cho người khác biết.", + "tail": "Nhấn chuột vào bản đồ để đăng ghi chú." + }, "browse": { "title": "Xem", "description": "Di chuyển và thu phóng bản đồ." @@ -40,7 +45,8 @@ "annotation": { "point": "thêm địa điểm", "vertex": "thêm nốt vào lối", - "relation": "thêm quan hệ" + "relation": "thêm quan hệ", + "note": "đăng ghi chú" } }, "start": { @@ -297,6 +303,14 @@ "create": "thêm hạn chế rẽ", "delete": "bỏ hạn chế rẽ" } + }, + "detach_node": { + "title": "Rút trích", + "key": "R", + "description": "Rút trích điểm riêng từ các đường kẻ hoặc vùng này.", + "annotation": "rút trích điểm từ đường kẻ hoặc vùng", + "restriction": "Không thể rút trích nốt này vì điều này sẽ làm hư một quan hệ “{relation}”.", + "connected_to_hidden": "Không thể rút trích nốt này vì nó nối liền với một đối tượng ẩn." } }, "restriction": { @@ -352,8 +366,8 @@ "localized_translation_name": "Tên" }, "zoom_in_edit": "Phong to để sửa đổi", - "login": "đăng nhập", - "logout": "đăng xuất", + "login": "Đăng nhập", + "logout": "Đăng xuất", "loading_auth": "Đang kết nối với OpenStreetMap…", "report_a_bug": "Báo cáo lỗi", "help_translate": "Hợp tác biên dịch", @@ -536,6 +550,10 @@ "osm": { "tooltip": "Dữ liệu từ OpenStreetMap", "title": "Dữ liệu OpenStreetMap" + }, + "notes": { + "tooltip": "Dữ liệu ghi chú từ OpenStreetMap", + "title": "Ghi chú OpenStreetMap" } }, "fill_area": "Cách Tô màu các Vùng", @@ -710,15 +728,22 @@ "cannot_zoom": "Không thể thu nhỏ hơn trong chế độ hiện tại.", "full_screen": "Bật/tắt Chế độ Toàn màn hình", "gpx": { - "local_layer": "Tập tin địa phương", + "local_layer": "Thêm GPX", "drag_drop": "Kéo thả một tập tin .gpx, .geojson, hoặc .kml vào trang hoặc bấm nút bên phải để duyệt", "zoom": "Phóng vừa lớp", "browse": "Duyệt tập tin" }, + "mvt": { + "local_layer": "Thêm MVT", + "drag_drop": "Kéo thả tập tin .mvt hoặc .pbf vào trang, hoặc bấm nút bên phải để duyệt tập tin", + "zoom": "Phong vừa lớp", + "browse": "Duyệt tập tin" + }, "streetside": { "tooltip": "Hình ảnh Streetside của Microsoft", "title": "Lớp phủ Hình ảnh (Bing Streetside)", "report": "Báo cáo lo ngại riêng tư trong hình", + "view_on_bing": "Xem tại Bản đồ Bing", "hires": "Độ phân giải cao" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "Xem hình này trên OpenStreetCam" }, + "note": { + "note": "Ghi chú", + "title": "Sửa ghi chú", + "anonymous": "vô danh", + "closed": "(Giải quyết)", + "commentTitle": "Bình luận", + "newComment": "Bình luận Mới", + "inputPlaceholder": "Nhập lời bình luận để người dùng khác xem.", + "close": "Giải quyết Ghi chú", + "open": "Mở lại Ghi chú", + "comment": "Bình luận", + "close_comment": "Giải quyết và Bình luận", + "open_comment": "Mở lại và Bình luận", + "report": "Báo cáo", + "new": "Ghi chú Mới", + "newDescription": "Miêu tả khuyết điểm.", + "save": "Lưu Ghi chú", + "login": "Bạn phải đăng nhập để thay đổi hoặc bình luận về ghi chú này.", + "upload_explanation": "Lời bình luận của bạn sẽ xuất hiện để mọi người dùng OpenStreetMap xem.", + "upload_explanation_with_user": "Lời bình luận bạn đăng lên dưới tên {user} sẽ xuất hiện để mọi người dùng OpenStreetMap xem." + }, "help": { "title": "Trợ giúp", "key": "H", @@ -876,6 +922,17 @@ "boundary": "Quan hệ *biên giới* nhóm lại một hay nhiều đường kẻ thành biên giới của một đơn vị hành chính.", "boundary_add": "Để xếp một đối tượng vào một quan hệ biên giới, chọn đối tượng và bấm nút {plus} **Thêm** trong phần “Tất cả các quan hệ” của thanh bên. Bạn có thể chọn quan hệ từ một danh sách quan hệ lân cận hoặc tạo một quan hệ mới dùng mục “Quan hệ mới…”. " }, + "notes": { + "title": "Ghi chú", + "intro": "Lời *ghi chú* báo động cho người dùng khác rằng một đối tượng nào đó cần được sửa chữa hoặc một địa điểm cần được chú ý. Một lời ghi chú ứng với một địa điểm cụ thể trên bản đồ. Để xem các ghi chú đã tồn tại hoặc đăng ghi chú mới, bấm nút {data} **Dữ liệu Bản đồ** ở bên phải của bản đồ để kích hoạt lớp phủ ghi chú OpenStreetMap.", + "add_note_h": "Đăng Ghi chú", + "add_note": "Để tạo ghi chú mới, bấm nút {note} **Ghi chú** trên thanh công cụ bên trên bản đồ hoặc bấm phím tắt `4`. Con trỏ sẽ biến thành chữ thập. Để đặt ghi chú mới trên bản đồ, đặt con trỏ tại vị trí muốn ghi chú, rồi {leftclick} nhấn chuột trái hoặc bấm `Dấu cách`.", + "move_note": "Để di chuyển một ghi chú mới, đặt con trỏ trên nó và kéo nó đến vị trí khác dùng {leftclick} chuột trái. Không thể di chuyển một ghi chú đã được đăng.", + "update_note_h": "Giải quyết, Mở lại, và Bình luận", + "update_note": "Bạn có thể cập nhật ghi chú bằng cách giải quyết, mở lại, hoặc đăng lời bình luận. Đánh dấu giải quyết đối với lời ghi chú nếu khuyết điểm đã được khắc phục. Mở lại ghi chú nếu khuyết điểm vẫn chưa được khắc phục.", + "save_note_h": "Đăng Ghi chú", + "save_note": "Bạn phải đăng mỗi một thay đổi ghi chú bằng cách bấm nút bên dưới các bình luận của ghi chú. Lưu ý rằng việc đăng bộ thay đổi lên OpenStreetMap sẽ **không** bao gồm các thay đổi ghi chú." + }, "imagery": { "title": "Hình nền", "intro": "Hình nền đằng sau bản đồ là tài nguyên quan trọng trong việc vẽ bản đồ. Hình nền có thể chụp từ vệ tinh, máy bay, và máy bay không người lái, hoặc quét từ sách bản đồ lịch sử, hoặc lấy từ cơ sở dữ liệu mở.", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "Hình ảnh Cấp phố", - "intro": "Hình ảnh cấp phố giúp bạn bổ sung bảng giao thông, kinh doanh, và nhiều chi tiết không nhìn được từ hình ảnh chụp từ không trung hoặc vệ tinh. Chương trình iD lấy hình ảnh cấp phố nguồn mở từ [Mapillary](https://www.mapillary.com) và [OpenStreetCam](https://www.openstreetcam.org).", + "intro": "Hình ảnh cấp phố giúp bạn bổ sung bảng giao thông, kinh doanh, và nhiều chi tiết không nhìn được từ hình ảnh chụp từ không trung hoặc vệ tinh. Chương trình iD lấy hình ảnh cấp phố nguồn mở từ [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), và [OpenStreetCam](https://www.openstreetcam.org).", "using_h": "Sử dụng Hình ảnh Cấp phố", "using": "Để sử dụng hình ảnh cấp phố trong việc vẽ bản đồ, bấm nút {data} **Dữ liệu Bản đồ** ở bên phải của bản đồ và bật các lớp dữ liệu có sẵn.", "photos": "Khi lớp hình ảnh được kích hoạt, bản đồ hiển thị đường kẻ theo đường đi của các máy chụp hình. Nếu phóng to đủ mức, mỗi vị trí chụp hình được đánh dấu bằng hình tròn. Nếu phóng to hơn, một hình nón cho biết hương nhìn vào lúc chụp hình.", @@ -1270,7 +1327,8 @@ "add_point": "Chế độ “thêm địa điểm”", "add_line": "Chế độ “thêm đường kẻ”", "add_area": "Chế độ “thêm vùng”", - "place_point": "Đặt địa điểm hoặc nốt", + "add_note": "Chế độ tạo ghi chú", + "place_point": "Đặt địa điểm hoặc tạo ghi chú", "disable_snap": "Giữ xuống để tránh nối liền với đối tượng khác khi đặt địa điểm hoặc nốt", "stop_line": "Kết thúc vẽ đường kẻ hoặc vùng" }, @@ -1279,6 +1337,7 @@ "continue_line": "Vẽ tiếp đường kẻ từ nốt được chọn", "merge": "Gộp các đối tượng được chọn", "disconnect": "Tháo gỡ các đối tượng tại nốt được chọn", + "detach_node": "Rút trích điểm từ nốt được chọn trên đường kẻ hoặc vùng", "split": "Cắt đôi các đường kẻ tại nốt được chọn", "reverse": "Đảo ngược chiều đường kẻ", "move": "Di chuyển các đối tượng được chọn", @@ -1623,6 +1682,9 @@ "label": "Sức chứa", "placeholder": "50, 100, 200…" }, + "cash_in": { + "label": "Nhận tiền" + }, "castle_type": { "label": "Kiểu" }, @@ -2278,6 +2340,9 @@ "underground": "Ngầm" } }, + "passenger_information_display": { + "label": "Hệ thống Thông tin Hành khách" + }, "payment_multi": { "label": "Phương thức Thanh toán" }, @@ -2510,6 +2575,9 @@ "site": { "label": "Loại" }, + "site_type": { + "label": "Loại Di chỉ" + }, "smoking": { "label": "Hút thuốc", "options": { @@ -4403,8 +4471,8 @@ "terms": "nơi lịch sử, tưởng niệm lịch sử, kỷ niệm lịch sử, kỉ niệm lịch sử, noi lich su, tuong niem lich su, ky niem lich su, ki niem lich su" }, "historic/archaeological_site": { - "name": "Khu vực Khảo cổ", - "terms": "khu vực khảo cổ, khẩo cổ học, khu vuc khao co, khao co hoc" + "name": "Di chỉ Khảo cổ", + "terms": "di chỉ khảo cổ, di chỉ, địa điểm khảo cổ học, khu vực khảo cổ, khẩo cổ học, di chi khao co, di chi, dia diem khao co hoc, khu vuc khao co, khao co hoc" }, "historic/boundary_stone": { "name": "Mốc Biên giới", @@ -6632,6 +6700,7 @@ "attribution": { "text": "Điều khoản & Phản hồi" }, + "description": "DigitalGlobe Tiêu chuẩn là tập hợp hình ảnh được lựa chọn chiếm 86% tổng diện tích đất đai của Trái Đất có độ phân giải 30–60 cm ở nơi nào có sẵn; ở nơi nào không có sẵn thì có hình ảnh Landsat thay thế. Hình ảnh được chụp cách đây trung bình 2,31 năm, một số khu vực được cập nhật mỗi năm hai lần.", "name": "DigitalGlobe Tiêu chuẩn" }, "DigitalGlobe-Standard-vintage": { @@ -7437,6 +7506,10 @@ "description": "Những người lập bản đồ và người dùng OpenStreetMap ở vùng Portland, Maine", "extendedDescription": "Maptime đúng là thì giờ để lập bản đồ. Chúng ta nhằm mục đích mở cửa bản đồ học để cho mọi người có quan tâm có thể lập bản đồ, bằng cách để dành thì giờ và không gian để cộng tác tìm hiểu, khám phá, và lập bản đồ dùng công cụ và công nghệ bản đồ." }, + "us-ma-mailinglist": { + "name": "Danh sách thư talk-us-massachusetts", + "description": "Danh sách thư của cộng đồng OSM tại Massachusetts" + }, "OpenCleveland-meetup": { "name": "Open Cleveland", "description": "Cải thiện OpenStreetMap tại khu vực Cleveland", @@ -7465,6 +7538,10 @@ "name": "OpenStreetMap Thành phố New York", "description": "Những người lập bản đồ và những người sử dụng, nhà phát triển, và người hâm mộ OpenStreetMap ở khu vực đô thị New York" }, + "OSM-Portland-forum": { + "name": "Nhóm Google OpenStreetMap PDX", + "description": "Diễn đàn và danh sách thư của những người OpenStreetMap ở vùng Portland" + }, "OSM-Portland": { "name": "OpenStreetMap Portland", "description": "Những người lập bản đồ và người dùng OpenStreetMap ở vùng Portland", @@ -7611,7 +7688,8 @@ "description": "Theo dõi chúng tôi trên Twitter: {url}" }, "Maptime-Bogota": { - "name": "Maptime Bogotá" + "name": "Maptime Bogotá", + "description": "Chúng ta là nhóm người lập bản đồ quan tâm đến việc đóng góp vào OpenStreetMap ở vùng Bogotá." }, "OSM-CO-facebook": { "name": "Facebook OpenStreetMap Colombia", diff --git a/dist/locales/yue.json b/dist/locales/yue.json index 7d6b4bc16..e28faf229 100644 --- a/dist/locales/yue.json +++ b/dist/locales/yue.json @@ -234,7 +234,6 @@ "localized_translation_name": "名" }, "zoom_in_edit": "放大去修改", - "logout": "簽走", "loading_auth": "駁上去公家街圖⋯⋯", "report_a_bug": "報錯", "help_translate": "幫手繙", @@ -468,7 +467,8 @@ "splash": { "welcome": "歡迎來到艾第公家街圖造圖。", "text": "艾第爾件架生,易用之時,亦功用多多,用來投稿修改去,世界至好,任用嘅世界地圖片。現時版本係{version}。想多啲資料,睇下 {website}同埋去{github}報告出錯。", - "walkthrough": "開始逐步解釋" + "walkthrough": "開始逐步解釋", + "start": "卽改" }, "source_switch": { "live": "運行之中", @@ -2633,6 +2633,9 @@ "name": "地方", "terms": "Locality,地方,地點,地點(無人定居)" }, + "place/square": { + "name": "前地" + }, "place/town": { "name": "鎮", "terms": "Town,城鎮,市鎮,鎮" diff --git a/dist/locales/zh-CN.json b/dist/locales/zh-CN.json index 89e9ccdc4..90f09a64b 100644 --- a/dist/locales/zh-CN.json +++ b/dist/locales/zh-CN.json @@ -21,6 +21,11 @@ "description": "添加餐馆、纪念碑、邮筒或其他点到地图上。", "tail": "在地图上单击,添加一个点。" }, + "add_note": { + "title": "笔记", + "description": "发现有问题的地方?告知其他绘图者。", + "tail": "在地图上点击,添加一条笔记。" + }, "browse": { "title": "浏览", "description": "移动和缩放地图。" @@ -40,7 +45,8 @@ "annotation": { "point": "添加点。", "vertex": "添加节点到路径。", - "relation": "添加关系。" + "relation": "添加关系。", + "note": "添加笔记。" } }, "start": { @@ -297,6 +303,14 @@ "create": "添加转向限制", "delete": "删除转向限制" } + }, + "detach_node": { + "title": "隔离", + "key": "E", + "description": "将该节点从路径/区域中隔离。", + "annotation": "从父路径/区域中隔离了一个节点。", + "restriction": "该节点无法被隔离,因为这样会破坏“{relation}”关系。", + "connected_to_hidden": "该节点无法被隔离,因为其与一隐藏要素相连。" } }, "restriction": { @@ -536,6 +550,10 @@ "osm": { "tooltip": "来自 OpenStreetMap 的地图数据", "title": "OpenStreetMap 数据" + }, + "notes": { + "tooltip": "来自 OpenStreetMap 的笔记", + "title": "OpenStreetMap 笔记" } }, "fill_area": "填充区域", @@ -710,15 +728,22 @@ "cannot_zoom": "在此模式下不能再缩小", "full_screen": "切换全屏", "gpx": { - "local_layer": "本地文件", + "local_layer": "上传 GPX 文件", "drag_drop": "将.gpx、.geojson或.kml文件拖放到页面上,或单击右侧的按钮浏览", "zoom": "缩放到图层", "browse": "浏览文件" }, + "mvt": { + "local_layer": "上传 MVT 文件", + "drag_drop": "将 .mvt 或 .pbf 文件拖放到页面上,或单击右侧的按钮浏览", + "zoom": "缩放到图层", + "browse": "浏览文件" + }, "streetside": { "tooltip": "来自微软公司的街景照片", "title": "照片叠加层 (必应 Streetside)", "report": "报告该图像的隐私问题", + "view_on_bing": "在必应地图上查看", "hires": "高分辨率" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "在 OpenStreetCam 上查看该图像" }, + "note": { + "note": "笔记", + "title": "编辑笔记", + "anonymous": "匿名用户", + "closed": "(已关闭)", + "commentTitle": "评论", + "newComment": "发表新评论", + "inputPlaceholder": "输入评论并分享给其他用户。", + "close": "解决笔记", + "open": "重启笔记", + "comment": "评论", + "close_comment": "解决并评论", + "open_comment": "重启并评论", + "report": "举报", + "new": "新笔记", + "newDescription": "描述该处的问题或错误。", + "save": "保存笔记", + "login": "你必须登录才能修改或评论该笔记。", + "upload_explanation": "你的评论将会对所有 OpenStreetMap 用户公开可见。", + "upload_explanation_with_user": "{user},你的评论将会对所有 OpenStreetMap 用户公开可见。" + }, "help": { "title": "帮助", "key": "H", @@ -797,6 +843,9 @@ "relations": { "title": "关系" }, + "notes": { + "title": "笔记" + }, "imagery": { "title": "背景影像", "intro": "显示在地图数据下方的背景影像,是绘图过程中的重要资源。它们可以收集自卫星、飞机和无人机的航空照片,或扫描自历史地图,或来自其他可自由使用的数据源。", @@ -1153,7 +1202,8 @@ "add_point": "'增加 点' 模式", "add_line": "'增加 线' 模式", "add_area": "'增加区域' 模式", - "place_point": "放置一个点", + "add_note": "'增加笔记' 模式", + "place_point": "放置一个节点或一条笔记", "disable_snap": "按住以禁用节点吸附", "stop_line": "完成绘制线段或区域" }, @@ -1162,6 +1212,7 @@ "continue_line": "在选中节点上继续绘制线", "merge": "合并选中的要素", "disconnect": "在选中节点上分离要素", + "detach_node": "将选中的节点从其父路径/区域中隔离", "split": "在选中节点上分割线", "reverse": "反转线的方向", "move": "移动选中的要素", diff --git a/dist/locales/zh-HK.json b/dist/locales/zh-HK.json index c59599d1d..39fd3c932 100644 --- a/dist/locales/zh-HK.json +++ b/dist/locales/zh-HK.json @@ -322,8 +322,6 @@ "localized_translation_name": "名稱" }, "zoom_in_edit": "放大以編輯", - "login": "登入", - "logout": "登出", "loading_auth": "正在連接 OpenStreetMap...", "report_a_bug": "報告錯誤", "help_translate": "協助翻譯", @@ -656,7 +654,6 @@ "cannot_zoom": "在這個模式下不能再縮小。", "full_screen": "切換全螢幕", "gpx": { - "local_layer": "本機檔案", "drag_drop": "拖移一個 .gpx, .geojson 或者 .kml 檔案到頁面或者按右側按鈕瀏覽。", "zoom": "放大至圖層", "browse": "瀏覽檔案" @@ -1043,7 +1040,6 @@ "add_point": "'增加節'模式", "add_line": "'增加線'模式", "add_area": "'增加範圍'模式", - "place_point": "放置一個點", "disable_snap": "長按可停用點捕捉", "stop_line": "完成繪製線或範圍" }, diff --git a/dist/locales/zh-TW.json b/dist/locales/zh-TW.json index 98c4339e8..1f6ee55a6 100644 --- a/dist/locales/zh-TW.json +++ b/dist/locales/zh-TW.json @@ -21,6 +21,11 @@ "description": "新增餐廳、古蹪、郵箱或其他事物至地圖上。", "tail": "點擊地圖以新增一個點。" }, + "add_note": { + "title": "備註", + "description": "發現了問題?讓其他製圖者知道。", + "tail": "在地圖上點擊以新增備註。" + }, "browse": { "title": "瀏覽", "description": "平移及縮放地圖。" @@ -40,7 +45,8 @@ "annotation": { "point": "已新增一點。", "vertex": "已新增一節點至路徑上。", - "relation": "已新增一項關係。" + "relation": "已新增一項關係。", + "note": "已新增備註。" } }, "start": { @@ -297,6 +303,14 @@ "create": "已增加轉向限制", "delete": "已移除轉向限制" } + }, + "detach_node": { + "title": "分離", + "key": "E", + "description": "從這些線/區域分離此節點。", + "annotation": "已從父母線/區域分離節點", + "restriction": "此節點無法被分離,因為它會毀損「{relation}」關係。", + "connected_to_hidden": "此節點無法被分離,因為它連接到隱藏的圖徽。" } }, "restriction": { @@ -536,6 +550,10 @@ "osm": { "tooltip": "來自開放街圖的地圖資料", "title": "開放街圖資料" + }, + "notes": { + "tooltip": "從開放街圖而來的註記資料", + "title": "開放街圖註記" } }, "fill_area": "填充選項", @@ -710,15 +728,22 @@ "cannot_zoom": "在此模式下不能再縮小。", "full_screen": "啟動全螢幕", "gpx": { - "local_layer": "本機檔案", + "local_layer": "新增 GPX", "drag_drop": "拖放一個 .gpx, .geojson 或是 .kml 檔案到此頁面上,或是點選按鈕以瀏覽", "zoom": "縮放到圖層", "browse": "瀏覽檔案" }, + "mvt": { + "local_layer": "新增 MVT", + "drag_drop": "將 .mvt 或 .pbf 拖曳到此頁面,或是點選右邊的按鈕以瀏覽", + "zoom": "縮放至圖層", + "browse": "瀏覽檔案" + }, "streetside": { "tooltip": "微軟的街景照片", "title": "照片覆蓋層 (Bing Streetside)", "report": "回報關於此照片的隱私疑慮", + "view_on_bing": "在 Bing Maps 上檢視", "hires": "高解析度" }, "mapillary_images": { @@ -739,6 +764,27 @@ "openstreetcam": { "view_on_openstreetcam": "在 OpenStreetCam 檢視這張圖片" }, + "note": { + "note": "註記", + "title": "編輯註記", + "anonymous": "匿名", + "closed": "(已關閉)", + "commentTitle": "評論", + "newComment": "新評論", + "inputPlaceholder": "輸入評論以與其他使用者分享。", + "close": "關閉註記", + "open": "重新開啟註記", + "comment": "評論", + "close_comment": "關閉並評論", + "open_comment": "重新開啟並評論", + "report": "回報", + "new": "新的備註", + "newDescription": "描述問題。", + "save": "儲存備註", + "login": "您必須登入以變更或評論此註記。", + "upload_explanation": "您的評論將會讓所有開放街圖的使用者都可以看到。", + "upload_explanation_with_user": "您對 {user} 的評論將會讓所有開放街圖的使用者都可以看到。" + }, "help": { "title": "說明文件", "key": "H", @@ -876,6 +922,17 @@ "boundary": "*邊界*關聯是一個由一個或多個線段圖徵組成的行政邊界。", "boundary_add": "要增加圖徵到邊界關聯,選擇圖徵在圖徵編輯器,向下滾動到\"所有關係\"部分,接著點 {plus} 加號按鈕,增加圖徵到鄰近已存在或是新的關聯中。" }, + "notes": { + "title": "備註", + "intro": "*備註*是用於警告其他使用者有圖徽需要修復或注意。備註會在地圖上特定位置標記。要檢視既有的備註或加入新的,點擊 {data} **地圖圖資**面板以啟用開放街圖備註層。", + "add_note_h": "新增備註", + "add_note": "要加入新的備註,在地圖上的工具列點擊 {note} **備註**按鈕,或是按下鍵盤快捷鍵 `4`。這將會把您的滑鼠游標變更為十字符號。要在地圖上放置新的備註,將滑鼠游標放到要新增備註的地方,然後 {leftclick} 用左鍵點擊或按下 `Space` 鍵。", + "move_note": "僅有新的備註可以移動。要移動備註,將滑鼠游標放到新的備註上,然後按住 {leftclick} 滑鼠左鍵,並將備註拖曳到新的位置。", + "update_note_h": "關閉、重新開啟與評論", + "update_note": "既有的備註可以透過將其關閉、重新開啟或是對它新增評論來更新。關閉備註是指出問題已經解決。重新開啟備註則是指出原本的問題沒有被解決。", + "save_note_h": "儲存備註", + "save_note": "您必須分別儲存任何備註的編輯,只要按下在評論下方的按鈕就可以了。備註編輯**不**會包含在您上傳至開放街圖的變更集中。" + }, "imagery": { "title": "背景影像", "intro": "背景影像出現在地圖資料下方,是繪製地圖時相當重要的資源。這些影像可能是從衛星、飛機和無人機收集的空拍影像,或是掃描歷史地圖或是其他自由可用的來源資料。", @@ -888,7 +945,7 @@ }, "streetlevel": { "title": "街景照片", - "intro": "街景影像很適合拿來繪製交通號誌、商家以及其他從衛星和空拍影像難以看到的細節。iD 編輯器支援 [Mapillary](https://www.mapillary.com) 和[OpenStreetCam](https://www.openstreetcam.org) 的街景影像。", + "intro": "街道級的照片對於繪製交通號誌與其他您無法在衛星照片或航空照片上看到的細節來說很有用。iD 編輯器支援了從 [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside)、[Mapillary](https://www.mapillary.com) 與 [OpenStreetCam](https://www.openstreetcam.org) 而來的街道級照片。", "using_h": "使用街景照片", "using": "要使用街景影像來畫地圖,點地圖旁 {data} **地圖資料**面板,切換不同的影像圖層。", "photos": "當啟用時,圖片圖層會顯示有一連串有圖片沿著一條線,在更高的縮放程度,圓圈標示代表圖片的位置,而在更高的縮放下面,方向標示會顯示照片拍攝時的鏡頭方向。", @@ -1270,7 +1327,8 @@ "add_point": "'增加節點'模式", "add_line": "'增加線段'模式", "add_area": "'增加區域'模式", - "place_point": "放置一個點", + "add_note": "「新增備註」模式", + "place_point": "放置點或備註", "disable_snap": "按住可禁用點捕捉模式", "stop_line": "完成繪製線段或區域" }, @@ -1279,6 +1337,7 @@ "continue_line": "從選擇節點繼續繪製線條", "merge": "合併選擇圖徵", "disconnect": "在選擇節點斷開圖徵", + "detach_node": "從父母線/區域分離選定的節點", "split": "從選擇節點分割成兩條線段", "reverse": "反轉線條", "move": "移動選擇圖徵", @@ -1572,6 +1631,9 @@ "board_type": { "label": "種類" }, + "booth": { + "label": "亭子" + }, "boules": { "label": "類型" }, @@ -1620,6 +1682,9 @@ "label": "容量", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "存款" + }, "castle_type": { "label": "種類" }, @@ -2275,6 +2340,9 @@ "underground": "地下" } }, + "passenger_information_display": { + "label": "乘客資訊顯示器" + }, "payment_multi": { "label": "付款種類" }, @@ -2399,7 +2467,7 @@ "label": "站台編號" }, "ref_road_number": { - "label": "道路邊號" + "label": "道路編號" }, "ref_route": { "label": "路線編號" @@ -2507,6 +2575,9 @@ "site": { "label": "種類" }, + "site_type": { + "label": "遺址類型" + }, "smoking": { "label": "吸煙", "options": { @@ -4012,6 +4083,10 @@ "emergency/destination": { "name": "緊急通道目的地" }, + "emergency/fire_alarm": { + "name": "火災警鈴", + "terms": "火警警報點" + }, "emergency/fire_extinguisher": { "name": "滅火器", "terms": "滅火器" @@ -4028,6 +4103,10 @@ "name": "救生圈", "terms": "救生圈" }, + "emergency/lifeguard": { + "name": "救生員", + "terms": "救生員" + }, "emergency/no": { "name": "不開放緊急通行" }, @@ -6009,8 +6088,8 @@ "terms": "銀樓,首飾店" }, "shop/kiosk": { - "name": "書報攤", - "terms": "售貨亭" + "name": "販賣亭", + "terms": "書報攤,零售亭,售貨亭" }, "shop/kitchen": { "name": "廚房設計行", @@ -6936,7 +7015,8 @@ }, "OSM-BGD-facebook": { "name": "開放街圖孟加拉", - "description": "改進孟加拉的開放街圖" + "description": "改進孟加拉的開放街圖", + "extendedDescription": "在孟加拉畫地圖嗎?想要問問題,想要與社群連結?請加入 {url},所有人都歡迎噢! " }, "OSM-India-facebook": { "name": "開放街圖印度 - 參與社區畫圖", @@ -7272,7 +7352,70 @@ "description": "匈牙利舉行聚會的平台" }, "it-facebook": { - "name": "開放街圖義大利 Facebook" + "name": "開放街圖義大利 Facebook", + "description": "加入開放街圖義大利社群 Facebook" + }, + "it-irc": { + "name": "開放街圖義大利 IRC", + "description": "在 irc.oftc.net (port 6667) 上面加入 #osm-it" + }, + "it-mailinglist": { + "name": "Talk-it 郵件論壇", + "description": "Talk-at 是義大利社群的官方郵件論壇 " + }, + "it-telegram": { + "name": "開放街圖義大利在 Telegram", + "description": "開放街圖義大利 Telegram 聊天室" + }, + "it-twitter": { + "name": "開放街圖義大利 Twitter", + "description": "在 {url} 上追隨我們的 Twitter" + }, + "OSM-Rome-meetup": { + "name": "Incontro Mappatori Romani", + "description": "改善羅馬區域的 OpenStreetMap", + "extendedDescription": "我們是一群熱情討論和分享自由地理資料集知識的人,特別是開放街圖的資料,以及管理、編輯和顯示地理資料的開放地理空間軟體,以及在拉吉歐推廣的團體。" + }, + "South-Tyrol-Mailing-List": { + "name": "開放街圖波爾察諾的郵件論壇", + "description": "開放街圖義大利波爾察諾地區的郵件論壇" + }, + "talk-it-lazio": { + "name": "開放街圖義大利拉吉歐", + "description": "歡迎所有人加入!在 {signupUrl} 註冊", + "extendedDescription": "羅馬和拉吉歐區域的郵件論壇" + }, + "Trentino-Mailing-List": { + "name": "開放街圖特倫托的郵件論壇", + "description": "開放街圖義大利特倫托地區的郵件論壇" + }, + "no-forum": { + "name": "開放街圖挪威網頁論壇", + "description": "開放街圖挪威的網頁論壇" + }, + "no-irc": { + "name": "開放街圖挪威 IRC", + "description": "在挪威的圖客與 OpenStreetMap 使用者、開發者與愛好者" + }, + "no-mailinglist": { + "name": "開放街圖挪威郵件論壇", + "description": "在挪威的圖客與 OpenStreetMap 使用者、開發者與愛好者的郵件論壇" + }, + "OSM-PL-facebook-group": { + "name": "開放街圖波蘭 Facebook 社團", + "description": "波蘭的開放街圖圖客和使用者社團" + }, + "OSM-PL-forum": { + "name": "開放街圖波蘭論壇", + "description": "開放街圖波蘭社群的論壇" + }, + "si-forum": { + "name": "開放街圖斯洛維尼亞論壇", + "description": "開放街圖斯洛維尼亞社群的論壇" + }, + "si-mailinglist": { + "name": "開放街圖斯洛維尼亞郵件論壇", + "description": "開放街圖在斯洛維尼亞的郵件論壇" }, "OSM-ES-mailinglist": { "name": "Talk-es 郵件論壇", @@ -7282,9 +7425,45 @@ "name": "Telegram 上的 @OSMes", "description": "開放街圖西班牙 Telegram 聊天室" }, + "osm-se": { + "name": "OpenStreetMap.se", + "description": "提供瑞典在地社群 OSM 服務和資訊" + }, + "se-facebook": { + "name": "開放街圖瑞典 Facebook", + "description": "開放街圖瑞典的 Facebook" + }, + "se-forum": { + "name": "開放街圖瑞典網頁論壇", + "description": "開放街圖瑞典的網頁論壇" + }, + "se-irc": { + "name": "開放街圖瑞典 IRC", + "description": "在 irc.oftc.net (port 6667) 上面加入 #osm.se" + }, + "se-mailinglist": { + "name": "Talk-se 郵件論壇", + "description": "討論開放街圖在瑞典事物的郵件論壇" + }, + "se-twitter": { + "name": "開放街圖瑞典 Twitter", + "description": "追隨我們的 Twitter: {url} " + }, "Nottingham-OSM-pub-meetup": { "name": "East Midlands (諾丁漢) 酒吧每月聚會", - "description": "East Midlands 圖客和使用者的社交聚會" + "description": "East Midlands 圖客和使用者的社交聚會", + "extendedDescription": "一開始 2011 年 3 月時有一群人在諾丁罕開始聚會,後來則大多在德比,以及不時在東密德蘭的其他地方。大多是社交性質的聚會,但也是相當好詢問有關地方 OSM 或是一般性質問題。在夏季時我們通常會趁有日光時在聚會場地附近出外畫地圖,這群人有個特別興趣,就是繪製公共空間,不時會為了畫地圖而聚會。" + }, + "gb-irc": { + "extendedDescription": "在 irc.oftc.net (port 6667) 加入 #osm-gb,如果你問了問題,請耐心等候數分鐘等待回應" + }, + "OSM-CU-telegram": { + "name": "OSM 古巴在 Telegram", + "description": "開放街圖古巴 Telegram 聊天室" + }, + "OSM-NI-telegram": { + "name": "OSM 尼加拉瓜在 Telegram", + "description": "開放街圖尼加拉瓜 Telegram 聊天室" }, "Bay-Area-OpenStreetMappers": { "name": "灣區的 OpenStreetMap 圖客", @@ -7346,6 +7525,10 @@ "name": "開放街圖西雅圖", "description": "在西雅圖的圖客與開放街圖使用者" }, + "OSM-SoCal": { + "name": "開放街圖南加州", + "description": "讓我們玩樂吧,並且貢獻畫洛杉磯一帶,以及學習有關畫地圖的一切!" + }, "OSM-South-Bay": { "name": "OSM South Bay", "description": "由為聖荷西寫程式主辦的地圖之夜", @@ -7363,7 +7546,14 @@ "OSM-US": { "name": "開放街圖美國", "description": "我們協助美國的開放街圖成長茁壯並改善它。", - "extendedDescription": "我們透過舉辦年度研討會、提供社群資源、建立合作關係以及推廣來支援開放街圖。在此加入開放街圖美國:{signupUrl}" + "extendedDescription": "我們透過舉辦年度研討會、提供社群資源、建立合作關係以及推廣來支援開放街圖。在此加入開放街圖美國:{signupUrl}", + "events": { + "sotmus2018": { + "name": "State of the Map US 2018", + "description": "加入在密西根底特律的 State of the Map US 開放街圖社群大會,與其他圖客、公司、政府機關以及非營利組織交流,都圍繞貢獻全球的免費編輯地圖。", + "where": "密西根底特律" + } + } }, "OSM-Utah": { "name": "開放街圖猶他", @@ -7397,6 +7587,47 @@ "name": "Maptime Australia Slack", "description": "在 {signupUrl} 註冊" }, + "Bahia-telegram": { + "name": "開放街圖巴伊亞 Telegram", + "description": "加入開放街圖巴伊亞 Telegram 聊天室", + "extendedDescription": "加入社群學習更多關於開放街圖的事情,詢問問題或是參加聚會,歡迎所有人噢!" + }, + "DF-telegram": { + "name": "開放街圖巴西利亞 Telegram", + "description": "加入開放街圖巴西利亞 Telegram 聊天室", + "extendedDescription": "加入社群學習更多關於開放街圖的事情,詢問問題或是參加聚會,歡迎所有人噢!" + }, + "OSM-br-mailinglist": { + "name": "Talk-br 郵件論壇", + "description": "討論開放街圖在巴西事物的郵件論壇" + }, + "OSM-br-telegram": { + "name": "開放街圖巴西 Telegram", + "description": "加入開放街圖巴西 Telegram 聊天室", + "extendedDescription": "加入社群學習更多關於開放街圖的事情,詢問問題或是參加聚會,歡迎所有人噢!" + }, + "OSM-br-twitter": { + "name": "開放街圖巴西 Twitter", + "description": "在 {url} 上追隨我們的 Twitter" + }, + "OSM-CL-facebook": { + "name": "開放街圖智利 Facebook", + "description": "加入開放街圖智利社群 Facebook", + "extendedDescription": "加入社群學習更多關於開放街圖的事情,詢問問題或是參加聚會,歡迎所有人噢!" + }, + "OSM-CL-mailinglist": { + "name": "Talk-cl 郵件論壇", + "description": "討論開放街圖在智利事物的郵件論壇" + }, + "OSM-CL-telegram": { + "name": "開放街圖智利 Telegram", + "description": "加入開放街圖智利 Telegram 聊天室", + "extendedDescription": "加入社群學習更多關於開放街圖的事情,詢問問題或是參加聚會,歡迎所有人噢!" + }, + "OSM-CL-twitter": { + "name": "開放街圖智利 Twitter", + "description": "在 {url} 上追隨我們的 Twitter" + }, "Maptime-Bogota": { "name": "Maptime Bogotá", "description": "我們是一群關心波哥大一帶開放街圖狀況的圖客。", @@ -7404,7 +7635,36 @@ }, "OSM-CO-facebook": { "name": "開放街圖哥倫比亞 Facebook", - "description": "加入開放街圖哥倫比亞社群 Facebook" + "description": "加入開放街圖哥倫比亞社群 Facebook", + "extendedDescription": "加入社群學習更多關於開放街圖的事情,歡迎所有人噢!" + }, + "OSM-CO-mailinglist": { + "name": "Talk-co 郵件論壇", + "description": "討論開放街圖在哥倫比亞事物的郵件論壇" + }, + "OSM-CO-telegram": { + "name": "OSM 哥倫比亞在 Telegram", + "description": "開放街圖哥倫比亞 Telegram 聊天室" + }, + "OSM-CO-twitter": { + "name": "開放街圖哥倫比亞 Twitter", + "description": "在 {url} 上追隨我們的 Twitter" + }, + "OSM-CO": { + "name": "開放街圖哥倫比亞", + "description": "開放街圖哥倫比亞社群和 OSMCo 基金會的消息" + }, + "OSM-EC-telegram": { + "name": "OSM 厄瓜多在 Telegram", + "description": "開放街圖厄瓜多 Telegram 聊天室" + }, + "OSM-PY-telegram": { + "name": "OSM 巴拉圭在 Telegram", + "description": "開放街圖厄瓜多 Telegram 聊天室" + }, + "OSM-PE-facebook": { + "name": "開放街圖祕魯 Facebook", + "description": "加入開放街圖祕魯社群 Facebook" }, "OSM-PE-mailinglist": { "name": "Talk-pe 郵件論壇", @@ -7439,6 +7699,10 @@ "name": "在 Reddit 上的 OpenStreetMap", "description": "/r/openstreetmap/ 是一個取得更多關於 OpenStreetMap 資訊的好地方。什麼事都能問!" }, + "OSM-Telegram": { + "name": "開放街圖 Telegram", + "description": "加入開放街圖 Telegram 超級聊天室 {url}" + }, "OSM-Twitter": { "name": "開放街圖 Twitter", "description": "在 {url} 上追隨我們的 Twitter" diff --git a/dist/locales/zh.json b/dist/locales/zh.json index 84c71a9fb..01f2ac14c 100644 --- a/dist/locales/zh.json +++ b/dist/locales/zh.json @@ -164,7 +164,6 @@ "localized_translation_language": "选择语言", "localized_translation_name": "名称" }, - "logout": "退出", "loading_auth": "连接OpenStreetMap...", "status": { "error": "无法连接到API。", From c1978c071320466d58d86d3bc1cb77c796c72023 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 26 Jul 2018 01:12:48 -0400 Subject: [PATCH 086/217] v2.10.0 --- modules/core/context.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/context.js b/modules/core/context.js index 31dbe7deb..ad03eef3f 100644 --- a/modules/core/context.js +++ b/modules/core/context.js @@ -53,7 +53,7 @@ export function setAreaKeys(value) { export function coreContext() { var context = {}; - context.version = '2.9.2'; + context.version = '2.10.0'; // create a special translation that contains the keys in place of the strings var tkeys = _cloneDeep(dataEn); diff --git a/package.json b/package.json index 21e52a8f4..c9ba56231 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iD", - "version": "2.9.2", + "version": "2.10.0", "description": "A friendly editor for OpenStreetMap", "main": "iD.js", "repository": "openstreetmap/iD", From 0a0de5970074d40c2880dcf1b50419db4de0edbb Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 26 Jul 2018 01:26:22 -0400 Subject: [PATCH 087/217] Better regex for true version numbers --- modules/ui/version.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ui/version.js b/modules/ui/version.js index d62dfd498..673db5b5e 100644 --- a/modules/ui/version.js +++ b/modules/ui/version.js @@ -4,15 +4,15 @@ import { tooltip } from '../util/tooltip'; // these are module variables so they are preserved through a ui.restart() -var sawVersion = null, - isNewVersion = false, - isNewUser = false; +var sawVersion = null; +var isNewVersion = false; +var isNewUser = false; export function uiVersion(context) { - var currVersion = context.version, - matchedVersion = currVersion.match(/\d\.\d\.\d.*/); + var currVersion = context.version; + var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/); if (sawVersion === null && matchedVersion !== null) { isNewVersion = (context.storage('sawVersion') !== currVersion); From ee05e47c9508e44f375c270ee06c1a1982dd4266 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 26 Jul 2018 01:42:43 -0400 Subject: [PATCH 088/217] Add a linebreak --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 789f5139e..fe41a2800 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ _Breaking changes, which may affect downstream projects or sites that embed iD, _Activate the OpenStreetMap notes layer by opening the Map Data pane (shortcut F)_ * :wrench: We've added a new Detach Node operation to remove a tagged node from a way. Thanks [@Psigio]!
_With a node selected, use the right-click edit menu to find the Detach command (shortcut E)_ -* :arrow_upper_right: The photo viewer (Mapillary, OpenStreetCam, and Bing Streetside) is now resizeable by dragging any of its edges. Thanks [@kratico]! +* :arrow_upper_right: The photo viewer (Mapillary, OpenStreetCam, and Bing Streetside) is now resizeable by dragging any of its edges. Thanks [@kratico]!
_Try activating one of the streetlevel photo layers (shortcut F) and resizing the viewer._ [@thomas-hervey]: https://github.com/thomas-hervey From 4e2f2fad8d6505c5e8392db16b08bc4c03cdc2c5 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 27 Jul 2018 23:03:50 +0200 Subject: [PATCH 089/217] Remove pannellum streetside files from `dist/` We can bundle them just like mapillary-js, which we install from npm --- .gitignore | 1 + RELEASING.md | 2 +- dist/pannellum-streetside/pannellum.css | 2 - dist/pannellum-streetside/pannellum.htm | 107 ------------------------ dist/pannellum-streetside/pannellum.js | 101 ---------------------- 5 files changed, 2 insertions(+), 211 deletions(-) delete mode 100644 dist/pannellum-streetside/pannellum.css delete mode 100644 dist/pannellum-streetside/pannellum.htm delete mode 100644 dist/pannellum-streetside/pannellum.js diff --git a/.gitignore b/.gitignore index 99c77f496..c293e302e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ /dist/*.map /dist/img/*.svg /dist/mapillary-js/ +/dist/pannellum-streetside/ /node_modules/ /.tx/tmp/ npm-debug.log diff --git a/RELEASING.md b/RELEASING.md index 345926048..6439d3053 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -32,7 +32,7 @@ $ git push origin master $ git checkout release $ git reset --hard master $ npm run all -$ git add -f dist/*.css dist/*.js dist/img/*.svg dist/mapillary-js/ +$ git add -f dist/*.css dist/*.js dist/img/*.svg dist/mapillary-js/ dist/pannellum-streetside/ $ git commit -m 'Check in build' $ git tag vA.B.C $ git push origin -f release vA.B.C diff --git a/dist/pannellum-streetside/pannellum.css b/dist/pannellum-streetside/pannellum.css deleted file mode 100644 index ece3c5e0c..000000000 --- a/dist/pannellum-streetside/pannellum.css +++ /dev/null @@ -1,2 +0,0 @@ -/* Pannellum 2.4.1, https://github.com/mpetroff/pannellum */ -.pnlm-container{margin:0;padding:0;overflow:hidden;position:relative;cursor:default;width:100%;height:100%;font-family:Helvetica,"Nimbus Sans L","Liberation Sans",Arial,sans-serif;background:#f4f4f4 url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2267%22%20height%3D%22100%22%20viewBox%3D%220%200%2067%20100%22%3E%0A%3Cpath%20stroke%3D%22%23ccc%22%20fill%3D%22none%22%20d%3D%22M33.5%2C50%2C0%2C63%2C33.5%2C75%2C67%2C63%2C33.5%2C50m-33.5-50%2C67%2C25m-0.5%2C0%2C0%2C75m-66.5-75%2C67-25m-33.5%2C75%2C0%2C25m0-100%2C0%2C50%22%2F%3E%0A%3C%2Fsvg%3E%0A') repeat;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;outline:0;line-height:1.4;contain:content;touch-action:none}.pnlm-container *{box-sizing:content-box}.pnlm-ui{position:absolute;width:100%;height:100%;z-index:1}.pnlm-grab{cursor:grab;cursor:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2226%22%20width%3D%2226%22%3E%0A%3Cpath%20stroke%3D%22%23000%22%20stroke-width%3D%221px%22%20fill%3D%22%23fff%22%20d%3D%22m15.3%2020.5s6.38-6.73%204.64-8.24-3.47%201.01-3.47%201.01%203.61-5.72%201.41-6.49c-2.2-0.769-3.33%204.36-3.33%204.36s0.873-5.76-1.06-5.76-1.58%205.39-1.58%205.39-0.574-4.59-2.18-4.12c-1.61%200.468-0.572%205.51-0.572%205.51s-1.58-4.89-2.93-3.79c-1.35%201.11%200.258%205.25%200.572%206.62%200.836%202.43%202.03%202.94%202.17%205.55%22%2F%3E%0A%3C%2Fsvg%3E%0A') 12 8,default}.pnlm-grabbing{cursor:grabbing;cursor:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2226%22%20width%3D%2226%22%3E%0A%3Cpath%20stroke%3D%22%23000%22%20stroke-width%3D%221px%22%20fill%3D%22%23fff%22%20d%3D%22m15.3%2020.5s5.07-5.29%203.77-6.74c-1.31-1.45-2.53%200.14-2.53%200.14s2.74-3.29%200.535-4.06c-2.2-0.769-2.52%201.3-2.52%201.3s0.81-2.13-1.12-2.13-1.52%201.77-1.52%201.77-0.261-1.59-1.87-1.12c-1.61%200.468-0.874%202.17-0.874%202.17s-0.651-1.55-2-0.445c-1.35%201.11-0.68%202.25-0.365%203.62%200.836%202.43%202.03%202.94%202.17%205.55%22%2F%3E%0A%3C%2Fsvg%3E%0A') 12 8,default}.pnlm-sprite{background-image:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2226%22%20height%3D%22208%22%3E%0A%3Ccircle%20fill-opacity%3D%22.78%22%20cy%3D%22117%22%20cx%3D%2213%22%20r%3D%2211%22%20fill%3D%22%23fff%22%2F%3E%0A%3Ccircle%20fill-opacity%3D%22.78%22%20cy%3D%22143%22%20cx%3D%2213%22%20r%3D%2211%22%20fill%3D%22%23fff%22%2F%3E%0A%3Ccircle%20cy%3D%22169%22%20cx%3D%2213%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%0A%3Ccircle%20cy%3D%22195%22%20cx%3D%2213%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%0A%3Ccircle%20cx%3D%2213%22%20cy%3D%22195%22%20r%3D%222.5%22%2F%3E%0A%3Cpath%20d%3D%22m5%2083v6h2v-4h4v-2zm10%200v2h4v4h2v-6zm-5%205v6h6v-6zm-5%205v6h6v-2h-4v-4zm14%200v4h-4v2h6v-6z%22%2F%3E%0A%3Cpath%20d%3D%22m13%20110a7%207%200%200%200%20-7%207%207%207%200%200%200%207%207%207%207%200%200%200%207%20-7%207%207%200%200%200%20-7%20-7zm-1%203h2v2h-2zm0%203h2v5h-2z%22%2F%3E%0A%3Cpath%20d%3D%22m5%2057v6h2v-4h4v-2zm10%200v2h4v4h2v-6zm-10%2010v6h6v-2h-4v-4zm14%200v4h-4v2h6v-6z%22%2F%3E%0A%3Cpath%20d%3D%22m17%2038v2h-8v-2z%22%2F%3E%0A%3Cpath%20d%3D%22m12%209v3h-3v2h3v3h2v-3h3v-2h-3v-3z%22%2F%3E%0A%3Cpath%20d%3D%22m13%20136-6.125%206.125h4.375v7.875h3.5v-7.875h4.375z%22%2F%3E%0A%3Cpath%20d%3D%22m10.428%20173.33v-5.77l5-2.89v5.77zm1-1.73%203-1.73-3.001-1.74z%22%2F%3E%0A%3C%2Fsvg%3E%0A')}.pnlm-container:-moz-full-screen{height:100%!important;width:100%!important;position:static!important}.pnlm-container:-webkit-full-screen{height:100%!important;width:100%!important;position:static!important}.pnlm-container:-ms-fullscreen{height:100%!important;width:100%!important;position:static!important}.pnlm-container:fullscreen{height:100%!important;width:100%!important;position:static!important}.pnlm-render-container{cursor:inherit;position:absolute;height:100%;width:100%}.pnlm-controls{margin-top:4px;background-color:#fff;border:1px solid #999;border-color:rgba(0,0,0,0.4);border-radius:3px;cursor:pointer;z-index:2;-webkit-transform:translateZ(9999px);transform:translateZ(9999px)}.pnlm-control:hover{background-color:#f8f8f8}.pnlm-controls-container{position:absolute;top:0;left:4px;z-index:1}.pnlm-zoom-controls{width:26px;height:52px}.pnlm-zoom-in{width:100%;height:50%;position:absolute;top:0;border-radius:3px 3px 0 0}.pnlm-zoom-out{width:100%;height:50%;position:absolute;bottom:0;background-position:0 -26px;border-top:1px solid #ddd;border-top-color:rgba(0,0,0,0.10);border-radius:0 0 3px 3px}.pnlm-fullscreen-toggle-button,.pnlm-orientation-button,.pnlm-hot-spot-debug-indicator{width:26px;height:26px}.pnlm-hot-spot-debug-indicator{position:absolute;top:50%;left:50%;width:26px;height:26px;margin:-13px 0 0 -13px;background-color:rgba(255,255,255,0.5);border-radius:13px;display:none}.pnlm-orientation-button-inactive{background-position:0 -156px}.pnlm-orientation-button-active{background-position:0 -182px}.pnlm-fullscreen-toggle-button-inactive{background-position:0 -52px}.pnlm-fullscreen-toggle-button-active{background-position:0 -78px}.pnlm-panorama-info{position:absolute;bottom:4px;background-color:rgba(0,0,0,0.7);border-radius:0 3px 3px 0;padding-right:10px;color:#fff;text-align:left;display:none;z-index:2;-webkit-transform:translateZ(9999px);transform:translateZ(9999px)}.pnlm-title-box{position:relative;font-size:20px;display:table;padding-left:5px;margin-bottom:3px}.pnlm-author-box{position:relative;font-size:12px;display:table;padding-left:5px}.pnlm-load-box{position:absolute;top:50%;left:50%;width:200px;height:150px;margin:-75px 0 0 -100px;background-color:rgba(0,0,0,0.7);border-radius:3px;text-align:center;font-size:20px;display:none;color:#fff}.pnlm-load-box p{margin:20px 0}.pnlm-lbox{position:absolute;top:50%;left:50%;width:20px;height:20px;margin:-10px 0 0 -10px;display:none}.pnlm-loading{animation-duration:1.5s;-webkit-animation-duration:1.5s;animation-name:pnlm-mv;-webkit-animation-name:pnlm-mv;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;animation-timing-function:linear;-webkit-animation-timing-function:linear;height:10px;width:10px;background-color:#fff;position:relative}@keyframes pnlm-mv{from{left:0;top:0}25%{left:10px;top:0}50%{left:10px;top:10px}75%{left:0;top:10px}to{left:0;top:0}}@-webkit-keyframes pnlm-mv{from{left:0;top:0}25%{left:10px;top:0}50%{left:10px;top:10px}75%{left:0;top:10px}to{left:0;top:0}}.pnlm-load-button{position:absolute;top:50%;left:50%;width:200px;height:100px;margin:-50px 0 0 -100px;background-color:rgba(0,0,0,.7);border-radius:3px;text-align:center;font-size:20px;display:table;color:#fff;cursor:pointer}.pnlm-load-button:hover{background-color:rgba(0,0,0,.8)}.pnlm-load-button p{display:table-cell;vertical-align:middle}.pnlm-info-box{font-size:15px;position:absolute;top:50%;left:50%;width:200px;height:150px;margin:-75px 0 0 -100px;background-color:#000;border-radius:3px;display:table;text-align:center;color:#fff;table-layout:fixed}.pnlm-info-box a{color:#fff;word-wrap:break-word;overflow-wrap:break-word}.pnlm-info-box p{display:table-cell;vertical-align:middle;padding:0 5px 0 5px}.pnlm-error-msg{display:none}.pnlm-about-msg{font-size:11px;line-height:11px;color:#fff;padding:5px 8px 5px 8px;background:rgba(0,0,0,0.7);border-radius:3px;position:absolute;top:50px;left:50px;display:none;opacity:0;-moz-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;z-index:1}.pnlm-about-msg a:link,.pnlm-about-msg a:visited{color:#fff}.pnlm-about-msg a:hover,.pnlm-about-msg a:active{color:#eee}.pnlm-hotspot-base{position:absolute;visibility:hidden;cursor:default;vertical-align:middle;top:0;z-index:1}.pnlm-hotspot{height:26px;width:26px;border-radius:13px}.pnlm-hotspot:hover{background-color:rgba(255,255,255,0.2)}.pnlm-hotspot.pnlm-info{background-position:0 -104px}.pnlm-hotspot.pnlm-scene{background-position:0 -130px}div.pnlm-tooltip span{visibility:hidden;position:absolute;border-radius:3px;background-color:rgba(0,0,0,0.7);color:#fff;text-align:center;max-width:200px;padding:5px 10px;margin-left:-220px;cursor:default}div.pnlm-tooltip:hover span{visibility:visible}div.pnlm-tooltip:hover span:after{content:'';position:absolute;width:0;height:0;border-width:10px;border-style:solid;border-color:rgba(0,0,0,0.7) transparent transparent transparent;bottom:-20px;left:-10px;margin:0 50%}.pnlm-compass{position:absolute;width:50px;height:50px;right:4px;bottom:4px;border-radius:25px;background-image:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2250%22%20width%3D%2250%22%3E%0A%3Cpath%20d%3D%22m24.5078%206-3.2578%2018h7.5l-3.25781-18h-0.984376zm-3.2578%2020%203.2578%2018h0.9844l3.2578-18h-7.5zm1.19531%200.9941h5.10938l-2.5547%2014.1075-2.5547-14.1075z%22%2F%3E%0A%3C%2Fsvg%3E%0A');cursor:default;display:none}.pnlm-world{position:absolute;left:50%;top:50%}.pnlm-face{position:absolute;-webkit-transform-origin:0 0;transform-origin:0 0}.pnlm-dragfix,.pnlm-preview-img{position:absolute;height:100%;width:100%}.pnlm-preview-img{background-size:cover;background-position:center}.pnlm-lbar{width:150px;margin:0 auto;border:#fff 1px solid;height:6px}.pnlm-lbar-fill{background:#fff;height:100%;width:0}.pnlm-lmsg{font-size:12px}.pnlm-fade-img{position:absolute;top:0;left:0} \ No newline at end of file diff --git a/dist/pannellum-streetside/pannellum.htm b/dist/pannellum-streetside/pannellum.htm deleted file mode 100644 index cee7b845c..000000000 --- a/dist/pannellum-streetside/pannellum.htm +++ /dev/null @@ -1,107 +0,0 @@ - - -Pannellum
\ No newline at end of file diff --git a/dist/pannellum-streetside/pannellum.js b/dist/pannellum-streetside/pannellum.js deleted file mode 100644 index ba60e9474..000000000 --- a/dist/pannellum-streetside/pannellum.js +++ /dev/null @@ -1,101 +0,0 @@ -// Pannellum 2.4.1, https://github.com/mpetroff/pannellum -window.libpannellum=function(J,f,m){function Ba(P){function bb(a,e){return 1==a.level&&1!=e.level?-1:1==e.level&&1!=a.level?1:e.timestamp-a.timestamp}function W(a,e){return a.level!=e.level?a.level-e.level:a.diff-e.diff}function X(a,e,d,f,p,c){this.vertices=a;this.side=e;this.level=d;this.x=f;this.y=p;this.path=c.replace("%s",e).replace("%l",d).replace("%x",f).replace("%y",p)}function Y(a,e,f,m,p){var c;var g=e.vertices;c=ea(a,g.slice(0,3));var t=ea(a,g.slice(3,6)),z=ea(a,g.slice(6,9)),g=ea(a,g.slice(9, -12)),y=c[0]+t[0]+z[0]+g[0];-4==y||4==y?c=!1:(y=c[1]+t[1]+z[1]+g[1],c=-4==y||4==y?!1:4!=c[2]+t[2]+z[2]+g[2]);if(c){c=e.vertices;t=c[0]+c[3]+c[6]+c[9];z=c[1]+c[4]+c[7]+c[10];g=c[2]+c[5]+c[8]+c[11];y=Math.sqrt(t*t+z*z+g*g);g=Math.asin(g/y);t=Math.atan2(z,t)-m;t+=t>Math.PI?-2*Math.PI:t<-Math.PI?2*Math.PI:0;t=Math.abs(t);e.diff=Math.acos(Math.sin(f)*Math.sin(g)+Math.cos(f)*Math.cos(g)*Math.cos(t));t=!1;for(z=0;zf&&(c[0]=-1);1p&&(c[1]=-1);1d||1l;l++)d[4*(h+a.width)+l]=d[4*(h+2*a.width)+l],d[4*(h+a.width*(a.height-2))+l]=d[4*(h+a.width*(a.height-3))+l];for(h=2;hl;l++)d[4*(h*a.width+1)+l]=d[4*(h*a.width+2)+l],d[4*((h+1)*a.width-2)+l]=d[4*((h+1)*a.width- -3)+l];for(l=0;4>l;l++)d[4*(a.width+1)+l]=d[4*(2*a.width+2)+l],d[4*(2*a.width-2)+l]=d[4*(3*a.width-3)+l],d[4*(a.width*(a.height-2)+1)+l]=d[4*(a.width*(a.height-3)+2)+l],d[4*(a.width*(a.height-1)-2)+l]=d[4*(a.width*(a.height-2)-3)+l];for(h=1;hl;l++)d[4*h+l]=d[4*(h+a.width)+l],d[4*(h+a.width*(a.height-1))+l]=d[4*(h+a.width*(a.height-2))+l];for(h=1;hl;l++)d[h*a.width*4+l]=d[4*(h*a.width+1)+l],d[4*((h+1)*a.width-1)+l]=d[4*((h+1)*a.width-2)+l];for(l=0;4> -l;l++)d[l]=d[4*(a.width+1)+l],d[4*(a.width-1)+l]=d[4*(2*a.width-2)+l],d[a.width*(a.height-1)*4+l]=d[4*(a.width*(a.height-2)+1)+l],d[4*(a.width*a.height-1)+l]=d[4*(a.width*(a.height-1)-2)+l];c.putImageData(e,0,0);y++;6==y&&(na=this.width,P.appendChild(R),g())};for(h=0;6>h;h++)c=new Image,c.crossOrigin=Z.crossOrigin?Z.crossOrigin:"anonymous",c.side=h,c.onload=p,c.src="multires"==G?encodeURI(ja.replace("%s",z[h])+"."+s.extension):encodeURI(s[h].src)}else{if(!a)throw console.log("Error: no WebGL support detected!"), -{type:"no webgl"};s.fullpath=s.basePath?s.basePath+s.path:s.path;s.invTileResolution=1/s.tileResolution;e=Ca();ua=[];for(h=0;6>h;h++)ua[h]=e.slice(12*h,12*h+12),e=Ca();if("equirectangular"==G){if(h=Math.max(s.width,s.height),e=a.getParameter(a.MAX_TEXTURE_SIZE),h>e)throw console.log("Error: The image is too big; it's "+h+"px wide, but this device's maximum supported width is "+e+"px."),{type:"webgl size error",width:h,maxWidth:e};}else if("cubemap"==G&&(h=s[0].width,e=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE), -h>e))throw console.log("Error: The cube face image is too big; it's "+h+"px wide, but this device's maximum supported width is "+e+"px."),{type:"webgl size error",width:h,maxWidth:e};t===m||t.horizonPitch===m&&t.horizonRoll===m||(fa=[t.horizonPitch==m?0:t.horizonPitch,t.horizonRoll==m?0:t.horizonRoll]);h=a.TEXTURE_2D;a.viewport(0,0,a.drawingBufferWidth,a.drawingBufferHeight);V=a.createShader(a.VERTEX_SHADER);e=r;"multires"==G&&(e=v);a.shaderSource(V,e);a.compileShader(V);N=a.createShader(a.FRAGMENT_SHADER); -e=Na;"cubemap"==G?(h=a.TEXTURE_CUBE_MAP,e=Oa):"multires"==G&&(e=oa);a.shaderSource(N,e);a.compileShader(N);d=a.createProgram();a.attachShader(d,V);a.attachShader(d,N);a.linkProgram(d);a.getShaderParameter(V,a.COMPILE_STATUS)||console.log(a.getShaderInfoLog(V));a.getShaderParameter(N,a.COMPILE_STATUS)||console.log(a.getShaderInfoLog(N));a.getProgramParameter(d,a.LINK_STATUS)||console.log(a.getProgramInfoLog(d));a.useProgram(d);d.drawInProgress=!1;d.texCoordLocation=a.getAttribLocation(d,"a_texCoord"); -a.enableVertexAttribArray(d.texCoordLocation);"multires"!=G?(ka||(ka=a.createBuffer()),a.bindBuffer(a.ARRAY_BUFFER,ka),a.bufferData(a.ARRAY_BUFFER,new Float32Array([-1,1,1,1,1,-1,-1,1,1,-1,-1,-1]),a.STATIC_DRAW),a.vertexAttribPointer(d.texCoordLocation,2,a.FLOAT,!1,0,0),d.aspectRatio=a.getUniformLocation(d,"u_aspectRatio"),a.uniform1f(d.aspectRatio,a.drawingBufferWidth/a.drawingBufferHeight),d.psi=a.getUniformLocation(d,"u_psi"),d.theta=a.getUniformLocation(d,"u_theta"),d.f=a.getUniformLocation(d, -"u_f"),d.h=a.getUniformLocation(d,"u_h"),d.v=a.getUniformLocation(d,"u_v"),d.vo=a.getUniformLocation(d,"u_vo"),d.rot=a.getUniformLocation(d,"u_rot"),a.uniform1f(d.h,ja/(2*Math.PI)),a.uniform1f(d.v,p/Math.PI),a.uniform1f(d.vo,c/Math.PI*2),"equirectangular"==G&&(d.backgroundColor=a.getUniformLocation(d,"u_backgroundColor"),a.uniform4fv(d.backgroundColor,(t.backgroundColor?t.backgroundColor:[0,0,0]).concat([1]))),d.texture=a.createTexture(),a.bindTexture(h,d.texture),"cubemap"==G?(a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X, -0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s[1]),a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_X,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s[3]),a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_Y,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s[4]),a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_Y,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s[5]),a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_Z,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s[0]),a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_Z,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s[2])):a.texImage2D(h,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s),a.texParameteri(h,a.TEXTURE_WRAP_S, -a.CLAMP_TO_EDGE),a.texParameteri(h,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.texParameteri(h,a.TEXTURE_MIN_FILTER,a.LINEAR),a.texParameteri(h,a.TEXTURE_MAG_FILTER,a.LINEAR)):(d.vertPosLocation=a.getAttribLocation(d,"a_vertCoord"),a.enableVertexAttribArray(d.vertPosLocation),F||(F=a.createBuffer()),ba||(ba=a.createBuffer()),Da||(Da=a.createBuffer()),a.bindBuffer(a.ARRAY_BUFFER,ba),a.bufferData(a.ARRAY_BUFFER,new Float32Array([0,0,1,0,1,1,0,1]),a.STATIC_DRAW),a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,Da),a.bufferData(a.ELEMENT_ARRAY_BUFFER, -new Uint16Array([0,1,2,0,2,3]),a.STATIC_DRAW),d.perspUniform=a.getUniformLocation(d,"u_perspMatrix"),d.cubeUniform=a.getUniformLocation(d,"u_cubeMatrix"),d.level=-1,d.currentNodes=[],d.nodeCache=[],d.nodeCacheTimestamp=0);ja=a.getError();if(0!==ja)throw console.log("Error: Something went wrong with WebGL!",ja),{type:"webgl error"};g()}};this.destroy=function(){P!==m&&(A!==m&&P.contains(A)&&P.removeChild(A),R!==m&&P.contains(R)&&P.removeChild(R));if(a){var d=a.getExtension("WEBGL_lose_context");d&& -d.loseContext()}};this.resize=function(){var h=J.devicePixelRatio||1;A.width=A.clientWidth*h;A.height=A.clientHeight*h;a&&(1286==a.getError()&&ta(),a.viewport(0,0,a.drawingBufferWidth,a.drawingBufferHeight),"multires"!=G&&a.uniform1f(d.aspectRatio,A.clientWidth/A.clientHeight))};this.resize();this.setPose=function(a,d){fa=[a,d]};this.render=function(h,e,f,r){var p;p=0;r===m&&(r={});r.roll&&(p=r.roll);if(fa!==m){var c=fa[0],g=fa[1],t=h,z=e,y=Math.cos(g)*Math.sin(h)*Math.sin(c)+Math.cos(h)*(Math.cos(c)* -Math.cos(e)+Math.sin(g)*Math.sin(c)*Math.sin(e)),v=-Math.sin(h)*Math.sin(g)+Math.cos(h)*Math.cos(g)*Math.sin(e);h=Math.cos(g)*Math.cos(c)*Math.sin(h)+Math.cos(h)*(-Math.cos(e)*Math.sin(c)+Math.cos(c)*Math.sin(g)*Math.sin(e));h=Math.asin(Math.max(Math.min(h,1),-1));e=Math.atan2(v,y);c=[Math.cos(t)*(Math.sin(g)*Math.sin(c)*Math.cos(z)-Math.cos(c)*Math.sin(z)),Math.cos(t)*Math.cos(g)*Math.cos(z),Math.cos(t)*(Math.cos(c)*Math.sin(g)*Math.cos(z)+Math.sin(z)*Math.sin(c))];g=[-Math.cos(h)*Math.sin(e),Math.cos(h)* -Math.cos(e)];g=Math.acos(Math.max(Math.min((c[0]*g[0]+c[1]*g[1])/(Math.sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2])*Math.sqrt(g[0]*g[0]+g[1]*g[1])),1),-1));0>c[2]&&(g=2*Math.PI-g);p+=g}if(a||"multires"!=G&&"cubemap"!=G){if("multires"!=G)f=2*Math.atan(Math.tan(0.5*f)/(a.drawingBufferWidth/a.drawingBufferHeight)),f=1/Math.tan(0.5*f),a.uniform1f(d.psi,e),a.uniform1f(d.theta,h),a.uniform1f(d.rot,p),a.uniform1f(d.f,f),!0===va&&"equirectangular"==G&&(a.bindTexture(a.TEXTURE_2D,d.texture),a.texImage2D(a.TEXTURE_2D, -0,a.RGB,a.RGB,a.UNSIGNED_BYTE,s)),a.drawArrays(a.TRIANGLES,0,6);else{c=a.drawingBufferWidth/a.drawingBufferHeight;g=2*Math.atan(Math.tan(f/2)*a.drawingBufferHeight/a.drawingBufferWidth);g=1/Math.tan(g/2);c=[g/c,0,0,0,0,g,0,0,0,0,100.1/-99.9,20/-99.9,0,0,-1,0];for(g=1;gs.tileResolution*Math.pow(2,g-1)*Math.tan(f/2)*0.707;)g++;d.level=g;g=[1,0,0,0,1,0,0,0,1];g=ra(g,-p,"z");g=ra(g,-h,"x");g=ra(g,e,"y");g=[g[0],g[1],g[2],0,g[3],g[4],g[5],0,g[6],g[7],g[8],0,0,0,0,1];a.uniformMatrix4fv(d.perspUniform, -!1,new Float32Array(sa(c)));a.uniformMatrix4fv(d.cubeUniform,!1,new Float32Array(sa(g)));c=[c[0]*g[0],c[0]*g[1],c[0]*g[2],0,c[5]*g[4],c[5]*g[5],c[5]*g[6],0,c[10]*g[8],c[10]*g[9],c[10]*g[10],c[11],-g[8],-g[9],-g[10],0];d.nodeCache.sort(bb);if(200d.currentNodes.length+50)for(g=d.nodeCache.splice(200,d.nodeCache.length-200),p=0;pp;p++)t=new X(ua[p],g[p],1,0,0,s.fullpath), -Y(c,t,h,e,f);d.currentNodes.sort(W);for(p=0;pp;p++)f=R.querySelector(".pnlm-"+e[p]+"face").style,f.webkitTransform=h+r[e[p]],f.transform=h+r[e[p]]};this.isLoading=function(){if(a&&"multires"==G)for(var f=0;fu;u++)O.push(new Image),O[u].crossOrigin=b.crossOrigin;n.load.lbox.style.display= -"block";n.load.lbar.style.display="none"}else if("multires"==b.type)u=JSON.parse(JSON.stringify(b.multiRes)),b.basePath&&b.multiRes.basePath&&!/^(?:[a-z]+:)?\/\//i.test(b.multiRes.basePath)?u.basePath=b.basePath+b.multiRes.basePath:b.multiRes.basePath?u.basePath=b.multiRes.basePath:b.basePath&&(u.basePath=b.basePath),O=u;else if(!0===b.dynamic)O=b.panorama;else{if(b.panorama===m){W(b.strings.noPanoramaError);return}O=new Image}if("cubemap"==b.type)for(var ca=6,c=function(){ca--;0===ca&&P()},d=function(a){var u= -f.createElement("a");u.href=a.target.src;u.innerHTML=u.href;W(b.strings.fileAccessError.replace("%s",u.outerHTML))},u=0;uc||65536")+12),e=function(a){var u;0<=d.indexOf(a+'="')?(u=d.substring(d.indexOf(a+'="')+a.length+2),u=u.substring(0,u.indexOf('"'))): -0<=d.indexOf(a+">")&&(u=d.substring(d.indexOf(a+">")+a.length+1),u=u.substring(0,u.indexOf("<")));return u!==m?Number(u):null},ca=e("GPano:FullPanoWidthPixels"),c=e("GPano:CroppedAreaImageWidthPixels"),f=e("GPano:FullPanoHeightPixels"),g=e("GPano:CroppedAreaImageHeightPixels"),h=e("GPano:CroppedAreaTopPixels"),l=e("GPano:PoseHeadingDegrees"),p=e("GPano:PosePitchDegrees"),e=e("GPano:PoseRollDegrees");null!==ca&&null!==c&&null!==f&&null!==g&&null!==h&&(0>da.indexOf("haov")&&(b.haov=c/ca*360),0>da.indexOf("vaov")&& -(b.vaov=g/f*180),0>da.indexOf("vOffset")&&(b.vOffset=-180*((h+g/2)/f-0.5)),null!==l&&0>da.indexOf("northOffset")&&(b.northOffset=l,!1!==b.compass&&(b.compass=!0)),null!==p&&null!==e&&(0>da.indexOf("horizonPitch")&&(b.horizonPitch=p),0>da.indexOf("horizonRoll")&&(b.horizonRoll=e)))}O.src=J.URL.createObjectURL(a)});k.readAsBinaryString!==m?k.readAsBinaryString(a):k.readAsText(a)}function W(a){a===m&&(a=b.strings.genericWebGLError);n.errorMsg.innerHTML="

"+a+"

";w.load.style.display="none";n.load.box.style.display= -"none";n.errorMsg.style.display="table";Pa=!0;M.style.display="none";ga("error",a)}function X(a){var b=Y(a);ha.style.left=b.x+"px";ha.style.top=b.y+"px";clearTimeout(X.t1);clearTimeout(X.t2);ha.style.display="block";ha.style.opacity=1;X.t1=setTimeout(function(){ha.style.opacity=0},2E3);X.t2=setTimeout(function(){ha.style.display="none"},2500);a.preventDefault()}function Y(a){var b=r.getBoundingClientRect(),c={};c.x=a.clientX-b.left;c.y=a.clientY-b.top;return c}function Ca(a){a.preventDefault();r.focus(); -if(K&&b.draggable){var k=Y(a);if(b.hotSpotDebug){var c=sa(a);console.log("Pitch: "+c[0]+", Yaw: "+c[1]+", Center Pitch: "+b.pitch+", Center Yaw: "+b.yaw+", HFOV: "+b.hfov)}Ja();l();b.roll=0;x.hfov=0;la=!0;S=Date.now();xa=k.x;ya=k.y;Qa=b.yaw;Ra=b.pitch;C.classList.add("pnlm-grabbing");C.classList.remove("pnlm-grab");ga("mousedown",a);F()}}function ra(a){b.minHfov===b.hfov?za.setHfov(wa,1E3):(a=sa(a),za.lookAt(a[0],a[1],b.minHfov,1E3))}function sa(a){var k=Y(a);a=B.getCanvas();var c=a.clientWidth,d= -a.clientHeight;a=k.x/c*2-1;var d=(1-k.y/d*2)*d/c,e=1/Math.tan(b.hfov*Math.PI/360),f=Math.sin(b.pitch*Math.PI/180),g=Math.cos(b.pitch*Math.PI/180),k=e*g-d*f,c=Math.sqrt(a*a+k*k),d=180*Math.atan((d*g+e*f)/c)/Math.PI;a=180*Math.atan2(a/c,k/c)/Math.PI+b.yaw;-180>a&&(a+=360);180a.wheelDelta?1:-1):a.wheelDelta?(U(b.hfov-0.05*a.wheelDelta),x.hfov=0>a.wheelDelta?1:-1):a.detail&&(U(b.hfov+1.5*a.detail),x.hfov=0Za.indexOf(k)||(a.preventDefault(), -27==k?Ga&&z():s(k,!0))}function ua(){for(var a=0;10>a;a++)q[a]=!1}function fa(a){var b=a.which||a.keycode;0>Za.indexOf(b)||(a.preventDefault(),s(b,!1))}function s(a,b){var c=!1;switch(a){case 109:case 189:case 17:case 173:q[0]!=b&&(c=!0);q[0]=b;break;case 107:case 187:case 16:case 61:q[1]!=b&&(c=!0);q[1]=b;break;case 38:q[2]!=b&&(c=!0);q[2]=b;break;case 87:q[6]!=b&&(c=!0);q[6]=b;break;case 40:q[3]!=b&&(c=!0);q[3]=b;break;case 83:q[7]!=b&&(c=!0);q[7]=b;break;case 37:q[4]!=b&&(c=!0);q[4]=b;break;case 65:q[8]!= -b&&(c=!0);q[8]=b;break;case 39:q[5]!=b&&(c=!0);q[5]=b;break;case 68:q[9]!=b&&(c=!0),q[9]=b}c&&b&&(ia="undefined"!==typeof performance&&performance.now()?performance.now():Date.now(),F())}function G(){if(K){var a=!1,k=b.pitch,c=b.yaw,d=b.hfov,e;e="undefined"!==typeof performance&&performance.now()?performance.now():Date.now();ia===m&&(ia=e);var f=(e-ia)*b.hfov/1700,f=Math.min(f,1);q[0]&&!0===b.keyboardZoom&&(U(b.hfov+(0.8*x.hfov+0.5)*f),a=!0);q[1]&&!0===b.keyboardZoom&&(U(b.hfov+(0.8*x.hfov-0.2)*f), -a=!0);if(q[2]||q[6])b.pitch+=(0.8*x.pitch+0.2)*f,a=!0;if(q[3]||q[7])b.pitch+=(0.8*x.pitch-0.2)*f,a=!0;if(q[4]||q[8])b.yaw+=(0.8*x.yaw-0.2)*f,a=!0;if(q[5]||q[9])b.yaw+=(0.8*x.yaw+0.2)*f,a=!0;a&&(S=Date.now());Date.now();if(b.autoRotate){if(0.001=b.autoRotateStopDelay&&(b.autoRotateStopDelay=!1,$=b.autoRotate, -b.autoRotate=0))}L.pitch&&(va("pitch"),k=b.pitch);L.yaw&&(va("yaw"),c=b.yaw);L.hfov&&(va("hfov"),d=b.hfov);0k.startPosition&&c>=k.endPosition||k.endPositionb.autoRotateInactivityDelay&&!b.autoRotate&&(b.autoRotate=$,za.lookAt(Ea,m,wa,3E3)), -requestAnimationFrame(ba);else if(B&&(B.isLoading()||!0===b.dynamic&&$a))requestAnimationFrame(ba);else{Ta=!1;ia=m;var a=b.autoRotateInactivityDelay-(Date.now()-S);0b.yaw&&(b.yaw+=360);a=b.yaw;var k=b.maxYaw-b.minYaw,d=-180,e=180;360>k&&(d=b.minYaw+b.hfov/2,e=b.maxYaw-b.hfov/2,kaa?aa+=1:10===aa?(ab=c[2]/Math.PI*180+b.yaw,aa=!0,requestAnimationFrame(ba)):(b.pitch=c[0]/Math.PI*180,b.roll=-c[1]/Math.PI*180,b.yaw=-c[2]/Math.PI*180+ab)}function h(){try{var a={};b.horizonPitch!==m&&(a.horizonPitch=b.horizonPitch*Math.PI/180);b.horizonRoll!==m&&(a.horizonRoll=b.horizonRoll*Math.PI/180);b.backgroundColor!==m&&(a.backgroundColor= -b.backgroundColor);B.init(O,b.type,b.dynamic,b.haov*Math.PI/180,b.vaov*Math.PI/180,b.vOffset*Math.PI/180,e,a);!0!==b.dynamic&&(O=m)}catch(c){if("webgl error"==c.type||"no webgl"==c.type)W();else if("webgl size error"==c.type)W(b.strings.textureSizeError.replace("%s",c.width).replace("%s",c.maxWidth));else throw W(b.strings.unknownError),c;}}function e(){if(b.sceneFadeDuration&&B.fadeImg!==m){B.fadeImg.style.opacity=0;var a=B.fadeImg;delete B.fadeImg;setTimeout(function(){M.removeChild(a);ga("scenechangefadedone")}, -b.sceneFadeDuration)}Ha.style.display=b.compass?"inline":"none";ja();n.load.box.style.display="none";qa!==m&&(M.removeChild(qa),qa=m);K=!0;ga("load");F()}function Ia(a){a.pitch=Number(a.pitch)||0;a.yaw=Number(a.yaw)||0;var c=f.createElement("div");c.className="pnlm-hotspot-base";c.className=a.cssClass?c.className+(" "+a.cssClass):c.className+(" pnlm-hotspot pnlm-sprite pnlm-"+D(a.type));var d=f.createElement("span");a.text&&(d.innerHTML=D(a.text));var e;if(a.video){e=f.createElement("video");var g= -a.video;b.basePath&&!oa(g)&&(g=b.basePath+g);e.src=encodeURI(g);e.controls=!0;e.style.width=a.width+"px";M.appendChild(c);d.appendChild(e)}else if(a.image){g=a.image;b.basePath&&!oa(g)&&(g=b.basePath+g);e=f.createElement("a");e.href=encodeURI(a.URL?a.URL:g);e.target="_blank";d.appendChild(e);var h=f.createElement("img");h.src=encodeURI(g);h.style.width=a.width+"px";h.style.paddingTop="5px";M.appendChild(c);e.appendChild(h);d.style.maxWidth="initial"}else a.URL?(e=f.createElement("a"),e.href=encodeURI(a.URL), -e.target="_blank",M.appendChild(e),c.style.cursor="pointer",d.style.cursor="pointer",e.appendChild(c)):(a.sceneId&&(c.onclick=c.ontouchend=function(){c.clicked||(c.clicked=!0,I(a.sceneId,a.targetPitch,a.targetYaw,a.targetHfov));return!1},c.style.cursor="pointer",d.style.cursor="pointer"),M.appendChild(c));if(a.createTooltipFunc)a.createTooltipFunc(c,a.createTooltipArgs);else if(a.text||a.video||a.image)c.classList.add("pnlm-tooltip"),c.appendChild(d),d.style.width=d.scrollWidth-20+"px",d.style.marginLeft= --(d.scrollWidth-c.offsetWidth)/2+"px",d.style.marginTop=-d.scrollHeight-12+"px";a.clickHandlerFunc&&(c.addEventListener("click",function(b){a.clickHandlerFunc(b,a.clickHandlerArgs)},"false"),c.style.cursor="pointer",d.style.cursor="pointer");a.div=c}function ja(){Va||(b.hotSpots?(b.hotSpots=b.hotSpots.sort(function(a,b){return a.pitch=a.yaw&&-90=h||(90=a.yaw)&&0>=h)a.div.style.visibility="hidden";else{var l=Math.sin((-a.yaw+b.yaw)*Math.PI/180),p=Math.tan(b.hfov*Math.PI/360);a.div.style.visibility="visible";var m=B.getCanvas(),n=m.clientWidth, -m=m.clientHeight,c=[-n/p*l*d/h/2,-n/p*(c*f-d*g*e)/h/2],d=Math.sin(b.roll*Math.PI/180),e=Math.cos(b.roll*Math.PI/180),c=[c[0]*e-c[1]*d,c[0]*d+c[1]*e];c[0]+=(n-a.div.offsetWidth)/2;c[1]+=(m-a.div.offsetHeight)/2;n="translate("+c[0]+"px, "+c[1]+"px) translateZ(9999px) rotate("+b.roll+"deg)";a.div.style.webkitTransform=n;a.div.style.MozTransform=n;a.div.style.transform=n}}function g(a){b={};var c,d,e="haov vaov vOffset northOffset horizonPitch horizonRoll".split(" ");da=[];for(c in Wa)Wa.hasOwnProperty(c)&& -(b[c]=Wa[c]);for(c in v.default)if(v.default.hasOwnProperty(c))if("strings"==c)for(d in v.default.strings)v.default.strings.hasOwnProperty(d)&&(b.strings[d]=D(v.default.strings[d]));else b[c]=v.default[c],0<=e.indexOf(c)&&da.push(c);if(null!==a&&""!==a&&v.scenes&&v.scenes[a]){var f=v.scenes[a];for(c in f)if(f.hasOwnProperty(c))if("strings"==c)for(d in f.strings)f.strings.hasOwnProperty(d)&&(b.strings[d]=D(f.strings[d]));else b[c]=f[c],0<=e.indexOf(c)&&da.push(c);b.scene=a}for(c in v)if(v.hasOwnProperty(c))if("strings"== -c)for(d in v.strings)v.strings.hasOwnProperty(d)&&(b.strings[d]=D(v.strings[d]));else b[c]=v[c],0<=e.indexOf(c)&&da.push(c)}function t(a){if((a=a?a:!1)&&"preview"in b){var c=b.preview;b.basePath&&!oa(c)&&(c=b.basePath+c);qa=f.createElement("div");qa.className="pnlm-preview-img";qa.style.backgroundImage="url('"+encodeURI(c)+"')";M.appendChild(qa)}var c=b.title,d=b.author;a&&("previewTitle"in b&&(b.title=b.previewTitle),"previewAuthor"in b&&(b.author=b.previewAuthor));b.hasOwnProperty("title")||(n.title.innerHTML= -"");b.hasOwnProperty("author")||(n.author.innerHTML="");b.hasOwnProperty("title")||b.hasOwnProperty("author")||(n.container.style.display="none");w.load.innerHTML="

"+b.strings.loadButtonLabel+"

";n.load.boxp.innerHTML=b.strings.loadingLabel;for(var e in b)if(b.hasOwnProperty(e))switch(e){case "title":n.title.innerHTML=D(b[e]);n.container.style.display="inline";break;case "author":n.author.innerHTML=b.strings.bylineLabel.replace("%s",D(b[e]));n.container.style.display="inline";break;case "fallback":n.errorMsg.innerHTML= -'

Your browser does not support WebGL.
Click here to view this panorama in an alternative viewer.

';break;case "hfov":U(Number(b[e]));break;case "autoLoad":!0===b[e]&&B===m&&(n.load.box.style.display="inline",w.load.style.display="none",Na());break;case "showZoomCtrl":w.zoom.style.display=b[e]&&!1!=b.showControls?"block":"none";break;case "showFullscreenCtrl":w.fullscreen.style.display=b[e]&&!1!=b.showControls&&("fullscreen"in f||"mozFullScreen"in -f||"webkitIsFullScreen"in f||"msFullscreenElement"in f)?"block":"none";break;case "hotSpotDebug":Xa.style.display=b[e]?"block":"none";break;case "showControls":b[e]||(w.orientation.style.display="none",w.zoom.style.display="none",w.fullscreen.style.display="none");break;case "orientationOnByDefault":b[e]&&(pa===m?Ya=!0:!0===pa&&Ka())}a&&(c?b.title=c:delete b.title,d?b.author=d:delete b.author)}function z(){if(K&&!Pa)if(Ga)f.exitFullscreen?f.exitFullscreen():f.mozCancelFullScreen?f.mozCancelFullScreen(): -f.webkitCancelFullScreen?f.webkitCancelFullScreen():f.msExitFullscreen&&f.msExitFullscreen();else try{r.requestFullscreen?r.requestFullscreen():r.mozRequestFullScreen?r.mozRequestFullScreen():r.msRequestFullscreen?r.msRequestFullscreen():r.webkitRequestFullScreen()}catch(a){}}function y(){f.fullscreen||f.mozFullScreen||f.webkitIsFullScreen||f.msFullscreenElement?(w.fullscreen.classList.add("pnlm-fullscreen-toggle-button-active"),Ga=!0):(w.fullscreen.classList.remove("pnlm-fullscreen-toggle-button-active"), -Ga=!1);B.resize();U(b.hfov);F()}function E(a){var c=b.minHfov;"multires"==b.type&&B&&(c=Math.min(c,B.getCanvas().width/(b.multiRes.cubeResolution/90*0.9)));return c>b.maxHfov?(console.log("HFOV bounds do not make sense (minHfov > maxHfov)."),b.hfov):ab.maxHfov?b.maxHfov:a}function U(a){b.hfov=E(a)}function Ja(){L={};$=b.autoRotate?b.autoRotate:$;b.autoRotate=!1}function Q(){Pa&&(n.load.box.style.display="none",n.errorMsg.style.display="none",Pa=!1,ga("errorcleared"));K=!1;w.load.style.display= -"none";n.load.box.style.display="inline";Na()}function I(a,c,d,e,f){K=!1;L={};var h,l;if(b.sceneFadeDuration&&!f&&(h=B.render(b.pitch*Math.PI/180,b.yaw*Math.PI/180,b.hfov*Math.PI/180,{returnImage:!0}),h!==m)){f=new Image;f.className="pnlm-fade-img";f.style.transition="opacity "+b.sceneFadeDuration/1E3+"s";f.style.width="100%";f.style.height="100%";f.onload=function(){I(a,c,d,e,!0)};f.src=h;M.appendChild(f);B.fadeImg=f;return}f="same"===c?b.pitch:c;h="same"===d?b.yaw:"sameAzimuth"===d?b.yaw+(b.northOffset|| -0)-(v.scenes[a].northOffset||0):d;l="same"===e?b.hfov:e;p();g(a);x.yaw=x.pitch=x.hfov=0;t();f!==m&&(b.pitch=f);h!==m&&(b.yaw=h);l!==m&&(b.hfov=l);ga("scenechange",a);Q()}function l(){J.removeEventListener("deviceorientation",Ma);w.orientation.classList.remove("pnlm-orientation-button-active");aa=!1}function Ka(){aa=1;J.addEventListener("deviceorientation",Ma);w.orientation.classList.add("pnlm-orientation-button-active")}function D(a){return v.escapeHTML?String(a).split(/&/g).join("&").split('"').join(""").split("'").join("'").split("<").join("<").split(">").join(">").split("/").join("/").split("\n").join("
"): -String(a).split("\n").join("
")}function ga(a){if(a in T)for(var b=T[a].length;0a?2*a*a:-1+(4-2*a)*a},draggable:!0,disableKeyboardCtrl:!1,crossOrigin:"anonymous",strings:{loadButtonLabel:"Click to
Load
Panorama",loadingLabel:"Loading...",bylineLabel:"by %s",noPanoramaError:"No panorama image was specified.", -fileAccessError:"The file %s could not be accessed.",malformedURLError:"There is something wrong with the panorama URL.",iOS8WebGLError:"Due to iOS 8's broken WebGL implementation, only progressive encoded JPEGs work for your device (this panorama uses standard encoding).",genericWebGLError:"Your browser does not have the necessary WebGL support to display this panorama.",textureSizeError:"This panorama is too big for your device! It's %spx wide, but your device only supports images up to %spx wide. Try another device. (If you're the author, try scaling down the image.)", -unknownError:"Unknown error. Check developer console."}},Za=[16,17,27,37,38,39,40,61,65,68,83,87,107,109,173,187,189];r="string"===typeof r?f.getElementById(r):r;r.classList.add("pnlm-container");r.tabIndex=0;var C=f.createElement("div");C.className="pnlm-ui";r.appendChild(C);var M=f.createElement("div");M.className="pnlm-render-container";r.appendChild(M);var H=f.createElement("div");H.className="pnlm-dragfix";C.appendChild(H);var ha=f.createElement("span");ha.className="pnlm-about-msg";ha.innerHTML= -'Pannellum 2.4.1';C.appendChild(ha);H.addEventListener("contextmenu",X);var n={},Xa=f.createElement("div");Xa.className="pnlm-sprite pnlm-hot-spot-debug-indicator";C.appendChild(Xa);n.container=f.createElement("div");n.container.className="pnlm-panorama-info";n.title=f.createElement("div");n.title.className="pnlm-title-box";n.container.appendChild(n.title);n.author=f.createElement("div");n.author.className="pnlm-author-box";n.container.appendChild(n.author); -C.appendChild(n.container);n.load={};n.load.box=f.createElement("div");n.load.box.className="pnlm-load-box";n.load.boxp=f.createElement("p");n.load.box.appendChild(n.load.boxp);n.load.lbox=f.createElement("div");n.load.lbox.className="pnlm-lbox";n.load.lbox.innerHTML='
';n.load.box.appendChild(n.load.lbox);n.load.lbar=f.createElement("div");n.load.lbar.className="pnlm-lbar";n.load.lbarFill=f.createElement("div");n.load.lbarFill.className="pnlm-lbar-fill";n.load.lbar.appendChild(n.load.lbarFill); -n.load.box.appendChild(n.load.lbar);n.load.msg=f.createElement("p");n.load.msg.className="pnlm-lmsg";n.load.box.appendChild(n.load.msg);C.appendChild(n.load.box);n.errorMsg=f.createElement("div");n.errorMsg.className="pnlm-error-msg pnlm-info-box";C.appendChild(n.errorMsg);var w={};w.container=f.createElement("div");w.container.className="pnlm-controls-container";C.appendChild(w.container);w.load=f.createElement("div");w.load.className="pnlm-load-button";w.load.addEventListener("click",function(){t(); -Q()});C.appendChild(w.load);w.zoom=f.createElement("div");w.zoom.className="pnlm-zoom-controls pnlm-controls";w.zoomIn=f.createElement("div");w.zoomIn.className="pnlm-zoom-in pnlm-sprite pnlm-control";w.zoomIn.addEventListener("click",function(){K&&(U(b.hfov-5),F())});w.zoom.appendChild(w.zoomIn);w.zoomOut=f.createElement("div");w.zoomOut.className="pnlm-zoom-out pnlm-sprite pnlm-control";w.zoomOut.addEventListener("click",function(){K&&(U(b.hfov+5),F())});w.zoom.appendChild(w.zoomOut);w.container.appendChild(w.zoom); -w.fullscreen=f.createElement("div");w.fullscreen.addEventListener("click",z);w.fullscreen.className="pnlm-fullscreen-toggle-button pnlm-sprite pnlm-fullscreen-toggle-button-inactive pnlm-controls pnlm-control";(f.fullscreenEnabled||f.mozFullScreenEnabled||f.webkitFullscreenEnabled||f.msFullscreenEnabled)&&w.container.appendChild(w.fullscreen);w.orientation=f.createElement("div");w.orientation.addEventListener("click",function(a){aa?l():Ka()});w.orientation.addEventListener("mousedown",function(a){a.stopPropagation()}); -w.orientation.addEventListener("touchstart",function(a){a.stopPropagation()});w.orientation.addEventListener("pointerdown",function(a){a.stopPropagation()});w.orientation.className="pnlm-orientation-button pnlm-orientation-button-inactive pnlm-sprite pnlm-controls pnlm-control";var pa,Ya=!1;J.DeviceOrientationEvent?J.addEventListener("deviceorientation",Oa):pa=!1;var Ha=f.createElement("div");Ha.className="pnlm-compass pnlm-controls pnlm-control";C.appendChild(Ha);v.firstScene?g(v.firstScene):v.default&& -v.default.firstScene?g(v.default.firstScene):g(null);t(!0);var ma=[],Aa=[];Z.prototype.multiply=function(a){return new Z(this.w*a.w-this.x*a.x-this.y*a.y-this.z*a.z,this.x*a.w+this.w*a.x+this.y*a.z-this.z*a.y,this.y*a.w+this.w*a.y+this.z*a.x-this.x*a.z,this.z*a.w+this.w*a.z+this.x*a.y-this.y*a.x)};Z.prototype.toEulerAngles=function(){var a=Math.atan2(2*(this.w*this.x+this.y*this.z),1-2*(this.x*this.x+this.y*this.y)),b=Math.asin(2*(this.w*this.y-this.z*this.x)),c=Math.atan2(2*(this.w*this.z+this.x* -this.y),1-2*(this.y*this.y+this.z*this.z));return[a,b,c]};this.isLoaded=function(){return Boolean(K)};this.getPitch=function(){return b.pitch};this.setPitch=function(a,c,d,e){(c=c==m?1E3:Number(c))?L.pitch={startTime:Date.now(),startPosition:b.pitch,endPosition:a,duration:c,callback:d,callbackArgs:e}:b.pitch=a;F();return this};this.getPitchBounds=function(){return[b.minPitch,b.maxPitch]};this.setPitchBounds=function(a){b.minPitch=Math.max(-90,Math.min(a[0],90));b.maxPitch=Math.max(-90,Math.min(a[1], -90));return this};this.getYaw=function(){return b.yaw};this.setYaw=function(a,c,d,e){c=c==m?1E3:Number(c);a=(a+180)%360-180;c?(180 Date: Sat, 28 Jul 2018 19:27:31 +0200 Subject: [PATCH 090/217] Fix note status string to be translateable (closes #5189) --- data/core.yaml | 5 +++++ dist/locales/en.json | 6 ++++++ modules/ui/note_comments.js | 4 +++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/data/core.yaml b/data/core.yaml index 3c4d1420b..f02885a8f 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -634,6 +634,11 @@ en: anonymous: anonymous closed: "(Closed)" commentTitle: Comments + status: + opened: "opened {when}" + reopened: "reopened {when}" + commented: "commented {when}" + closed: "closed {when}" newComment: New Comment inputPlaceholder: Enter a comment to share with other users. close: Close Note diff --git a/dist/locales/en.json b/dist/locales/en.json index 2655f494c..ea2058f79 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -770,6 +770,12 @@ "anonymous": "anonymous", "closed": "(Closed)", "commentTitle": "Comments", + "status": { + "opened": "opened {when}", + "reopened": "reopened {when}", + "commented": "commented {when}", + "closed": "closed {when}" + }, "newComment": "New Comment", "inputPlaceholder": "Enter a comment to share with other users.", "close": "Close Note", diff --git a/modules/ui/note_comments.js b/modules/ui/note_comments.js index 87649782c..4534ea10b 100644 --- a/modules/ui/note_comments.js +++ b/modules/ui/note_comments.js @@ -61,7 +61,9 @@ export function uiNoteComments() { metadataEnter .append('div') .attr('class', 'comment-date') - .text(function(d) { return d.action + ' ' + localeDateString(d.date); }); + .text(function(d) { + return t('note.status.' + d.action, { when: localeDateString(d.date) }); + }); mainEnter .append('div') From 1eea46f2156dc0dccdcb76aa61fbea234812049f Mon Sep 17 00:00:00 2001 From: vershwal Date: Sun, 29 Jul 2018 11:56:09 +0530 Subject: [PATCH 091/217] loading bufferdata using d3_request --- modules/svg/mvt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/svg/mvt.js b/modules/svg/mvt.js index 7eab31335..ce6a8a540 100644 --- a/modules/svg/mvt.js +++ b/modules/svg/mvt.js @@ -130,7 +130,7 @@ export function svgMvt(projection, context, dispatch) { function vtToGeoJson(bufferdata) { - var tile = new vt.VectorTile(new Protobuf(bufferdata.data)); + var tile = new vt.VectorTile(new Protobuf(bufferdata.data.response)); var layers = Object.keys(tile.layers); if (!Array.isArray(layers)) { layers = [layers]; } From b66f95ffbc4312820eff68d9bf3e1c6c9d773307 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Wed, 1 Aug 2018 01:15:25 +0200 Subject: [PATCH 092/217] add man_made=bunker_silo, closes #5157 --- data/presets.yaml | 5 +++++ data/presets/fields.json | 2 +- data/presets/fields/content.json | 3 ++- data/presets/presets.json | 1 + data/presets/presets/man_made/bunker_silo.json | 18 ++++++++++++++++++ data/taginfo.json | 7 +++++++ dist/locales/en.json | 4 ++++ 7 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 data/presets/presets/man_made/bunker_silo.json diff --git a/data/presets.yaml b/data/presets.yaml index a5c716a72..f736c3a32 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -4112,6 +4112,11 @@ en: # man_made=bridge name: Bridge terms: '' + man_made/bunker_silo: + # man_made=bunker_silo + name: Bunker Silo + # 'terms: Silage,Storage' + terms: '' man_made/chimney: # man_made=chimney name: Chimney diff --git a/data/presets/fields.json b/data/presets/fields.json index d295ff913..0a8b93d1f 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -56,7 +56,7 @@ "communication_multi": {"key": "communication:", "type": "multiCombo", "label": "Communication Types"}, "construction": {"key": "construction", "type": "combo", "label": "Type"}, "contact/webcam": {"key": "contact:webcam", "type": "url", "icon": "website", "label": "Webcam URL", "placeholder": "http://example.com/"}, - "content": {"key": "content", "type": "combo", "label": "Content"}, + "content": {"key": "content", "type": "combo", "label": "Content", "options": ["silage", "water", "oil", "fuel", "slurry", "gas", "manure", "sewage"]}, "country": {"key": "country", "type": "combo", "label": "Country"}, "covered": {"key": "covered", "type": "check", "label": "Covered"}, "craft": {"key": "craft", "type": "typeCombo", "label": "Type"}, diff --git a/data/presets/fields/content.json b/data/presets/fields/content.json index e3710937b..574e19316 100644 --- a/data/presets/fields/content.json +++ b/data/presets/fields/content.json @@ -1,5 +1,6 @@ { "key": "content", "type": "combo", - "label": "Content" + "label": "Content", + "options": ["silage", "water", "oil", "fuel", "slurry", "gas", "manure", "sewage"] } diff --git a/data/presets/presets.json b/data/presets/presets.json index 62e881f36..6371ba1b7 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -530,6 +530,7 @@ "man_made/antenna": {"icon": "temaki-antenna", "fields": ["height", "communication_multi"], "geometry": ["point"], "terms": ["broadcast", "cell phone", "cell", "communication", "mobile phone", "radio", "television", "transmission", "tv"], "tags": {"man_made": "antenna"}, "name": "Antenna"}, "man_made/breakwater": {"geometry": ["line", "area"], "tags": {"man_made": "breakwater"}, "name": "Breakwater"}, "man_made/bridge": {"geometry": ["area"], "tags": {"man_made": "bridge"}, "name": "Bridge"}, + "man_made/bunker_silo": {"icon": "temaki-silo", "fields": ["content"], "geometry": ["point", "area"], "terms": ["Silage", "Storage"], "tags": {"man_made": "bunker_silo"}, "name": "Bunker Silo"}, "man_made/chimney": {"icon": "temaki-chimney", "geometry": ["point", "area"], "tags": {"man_made": "chimney"}, "name": "Chimney"}, "man_made/clearcut": {"icon": "maki-logging", "geometry": ["area"], "tags": {"man_made": "clearcut"}, "terms": ["cut", "forest", "lumber", "tree", "wood"], "name": "Clearcut Forest"}, "man_made/crane": {"icon": "temaki-crane", "fields": ["operator", "height", "crane/type"], "geometry": ["point", "line", "vertex", "area"], "tags": {"man_made": "crane"}, "name": "Crane"}, diff --git a/data/presets/presets/man_made/bunker_silo.json b/data/presets/presets/man_made/bunker_silo.json new file mode 100644 index 000000000..a4bf11536 --- /dev/null +++ b/data/presets/presets/man_made/bunker_silo.json @@ -0,0 +1,18 @@ +{ + "icon": "temaki-silo", + "fields": [ + "content" + ], + "geometry": [ + "point", + "area" + ], + "terms": [ + "Silage", + "Storage" + ], + "tags": { + "man_made": "bunker_silo" + }, + "name": "Bunker Silo" +} diff --git a/data/taginfo.json b/data/taginfo.json index 50d522098..8320ea677 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -3564,6 +3564,13 @@ "description": "Bridge", "object_types": ["area"] }, + { + "key": "man_made", + "value": "bunker_silo", + "description": "Bunker Silo", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/silo.svg?sanitize=true" + }, { "key": "man_made", "value": "chimney", diff --git a/dist/locales/en.json b/dist/locales/en.json index ea2058f79..33a11b6c0 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -5025,6 +5025,10 @@ "name": "Bridge", "terms": "" }, + "man_made/bunker_silo": { + "name": "Bunker Silo", + "terms": "Silage,Storage" + }, "man_made/chimney": { "name": "Chimney", "terms": "" From fdb24e3a5da3b7f21dd761e96673c08ddc0ad8ad Mon Sep 17 00:00:00 2001 From: Tang Zhixiong Date: Wed, 1 Aug 2018 16:43:06 +0800 Subject: [PATCH 093/217] Fix shellbang --- scripts/deploy.sh | 2 +- scripts/txpush.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index f44f6573f..f95ae09e9 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash # This is an example script that shows how to pull the latest version # of iD and replace the version string with a git short hash. diff --git a/scripts/txpush.sh b/scripts/txpush.sh index 5807b321b..1fdfaed6d 100755 --- a/scripts/txpush.sh +++ b/scripts/txpush.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash # This script runs on TravisCI to push new translation strings to transifex From c1bdcf24aa54108aed2cc20f1c2697d4ecb5c347 Mon Sep 17 00:00:00 2001 From: J Guthrie Date: Fri, 3 Aug 2018 01:33:29 +0100 Subject: [PATCH 094/217] Changed parseInt to parseFloat --- modules/ui/fields/input.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/fields/input.js b/modules/ui/fields/input.js index 73023d891..b8c98df56 100644 --- a/modules/ui/fields/input.js +++ b/modules/ui/fields/input.js @@ -92,7 +92,7 @@ export function uiFieldText(field, context) { // parse as a number function parsed(val) { - return parseInt(val || 0, 10) || 0; + return parseFloat(val || 0, 10) || 0; } // clamp number to min/max From 2e6799ac605479692f6526fba09b9080ebbb2a4b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 4 Aug 2018 21:55:14 -0400 Subject: [PATCH 095/217] Don't reverse cardinal direction roles on relations anymore re: https://github.com/openstreetmap/iD/pull/2004#issuecomment-407995998 Per thread https://twitter.com/bhousel/status/1025805098063208448 JOSM has stopped doing this too --- modules/actions/reverse.js | 6 +----- test/spec/actions/reverse.js | 12 ++++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/modules/actions/reverse.js b/modules/actions/reverse.js index d1181c5fc..abbfcb88a 100644 --- a/modules/actions/reverse.js +++ b/modules/actions/reverse.js @@ -40,11 +40,7 @@ export function actionReverse(wayID, options) { forward: 'backward', backward: 'forward', forwards: 'backward', - backwards: 'forward', - north: 'south', - south: 'north', - east: 'west', - west: 'east' + backwards: 'forward' }; var onewayReplacements = { yes: '-1', diff --git a/test/spec/actions/reverse.js b/test/spec/actions/reverse.js index 348179005..df1fd5ea9 100644 --- a/test/spec/actions/reverse.js +++ b/test/spec/actions/reverse.js @@ -286,7 +286,7 @@ describe('iD.actionReverse', function () { .entity('backwards').members[0].role).to.eql('forward', 'backwards'); }); - it('transforms role=north ⟺ role=south in member relations', function () { + it('doesn\'t transform role=north ⟺ role=south in member relations', function () { var graph = iD.coreGraph([ iD.osmNode({id: 'n1'}), iD.osmNode({id: 'n2'}), @@ -296,12 +296,12 @@ describe('iD.actionReverse', function () { ]); expect(iD.actionReverse('w1')(graph) - .entity('north').members[0].role).to.eql('south', 'north'); + .entity('north').members[0].role).to.eql('north', 'north'); expect(iD.actionReverse('w1')(graph) - .entity('south').members[0].role).to.eql('north', 'south'); + .entity('south').members[0].role).to.eql('south', 'south'); }); - it('transforms role=east ⟺ role=west in member relations', function () { + it('doesn\'t transform role=east ⟺ role=west in member relations', function () { var graph = iD.coreGraph([ iD.osmNode({id: 'n1'}), iD.osmNode({id: 'n2'}), @@ -311,9 +311,9 @@ describe('iD.actionReverse', function () { ]); expect(iD.actionReverse('w1')(graph) - .entity('east').members[0].role).to.eql('west', 'east'); + .entity('east').members[0].role).to.eql('east', 'east'); expect(iD.actionReverse('w1')(graph) - .entity('west').members[0].role).to.eql('east', 'west'); + .entity('west').members[0].role).to.eql('west', 'west'); }); it('ignores directionless roles in member relations', function () { From 542f3c523ec329defc71bccad9e2e983a4e1a2c4 Mon Sep 17 00:00:00 2001 From: vershwal Date: Sun, 5 Aug 2018 17:46:48 +0530 Subject: [PATCH 096/217] Custom background --- css/80_app.css | 21 +++++++++++ modules/ui/background.js | 10 +++-- modules/ui/custom.js | 81 ++++++++++++++++++++++++++++++++++++++++ modules/ui/index.js | 1 + 4 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 modules/ui/custom.js diff --git a/css/80_app.css b/css/80_app.css index 6558bb99c..aa788d190 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -4602,3 +4602,24 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { width: 100px; color: #7092ff; } + +.button-ok { + background-color: #6f92ff; /* Green */ + border: none; + color: white; + padding: 15px 15px; + text-align: center; + font-size: 16px; + +} +.button-ok:focus { + background-color: #c1d0ff; +} +.button-cancel { + background-color: #cccccc; /* Green */ + border: none; + color: white; + padding: 15px 15px; + text-align: center; + font-size: 16px; +} diff --git a/modules/ui/background.js b/modules/ui/background.js index 4dac81036..e51768097 100644 --- a/modules/ui/background.js +++ b/modules/ui/background.js @@ -17,10 +17,12 @@ import { svgIcon } from '../svg'; import { uiBackgroundDisplayOptions } from './background_display_options'; import { uiBackgroundOffset } from './background_offset'; import { uiCmd } from './cmd'; +import { uiCustom } from './custom'; import { uiDisclosure } from './disclosure'; import { uiHelp } from './help'; import { uiMapData } from './map_data'; import { uiMapInMap } from './map_in_map'; +import { uiModal } from './modal'; import { uiTooltipHtml } from './tooltipHtml'; import { utilCallWhenIdle } from '../util'; import { tooltip } from '../util/tooltip'; @@ -102,8 +104,8 @@ export function uiBackground(context) { function editCustom() { d3_event.preventDefault(); - var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; - var template = window.prompt( + //var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; + /*var template = window.prompt( t('background.custom_prompt', { example: example }), _customSource.template() || example ); @@ -114,7 +116,9 @@ export function uiBackground(context) { chooseBackground(_customSource); } else { _backgroundList.call(updateLayerSelections); - } + }*/ + context.container() + .call(uiCustom(context)); } diff --git a/modules/ui/custom.js b/modules/ui/custom.js new file mode 100644 index 000000000..5ccaa6c62 --- /dev/null +++ b/modules/ui/custom.js @@ -0,0 +1,81 @@ +import { t } from '../util/locale'; +import { uiIntro } from './intro'; +import { uiModal } from './modal'; + + +export function uiCustom(context) { + + return function(selection) { + + /*if (context.storage('sawCustom')) + return; + + context.storage('sawCustom', true);*/ + + var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; + var modalSelection = uiModal(selection); + + modalSelection.select('.modal') + .attr('class', 'modal-splash modal col6'); + + var introModal = modalSelection.select('.content') + .append('div') + .attr('class', 'fillL'); + + introModal + .append('div') + .attr('class','modal-section cf') + .append('h3').text(t('background.custom_heading')); + + introModal + .append('div') + .attr('class','modal-section') + .append('p').text(t('background.custom_prompt')) + /*.append('p').text(t('background.custom_token1')) + .append('p').text(t('background.custom_token2')) + .append('p').text(t('background.custom_token3')) + .append('p').text(t('background.custom_token4')) + .append('p').text(t('background.custom_example', { example: example }))*/ + .append('textarea'); + + + /*var textAreaWrap = introModal + .append('div') + .attr('class', 'modal-section'); + + var urlArea = textAreaWrap + .append('textarea');*/ + + var buttonWrap = introModal + .append('div') + .attr('class', 'modal-section'); + + + var startEditing = buttonWrap + .append('button') + .attr('class', 'button-cancel') + .on('click', modalSelection.close); + + startEditing + .append('div') + .text('Cancel'); + + var walkthrough = buttonWrap + .append('button') + .attr('class', 'button-ok') + .on('click', function() { + context.container().call(uiIntro(context)); + modalSelection.close(); + }); + + walkthrough + .append('div') + .text('OK'); + + + modalSelection.select('button.close') + .attr('class','hide'); + + + }; +} diff --git a/modules/ui/index.js b/modules/ui/index.js index 35d9a8517..d82ddeca1 100644 --- a/modules/ui/index.js +++ b/modules/ui/index.js @@ -11,6 +11,7 @@ export { uiCommitChanges } from './commit_changes'; export { uiCommitWarnings } from './commit_warnings'; export { uiConfirm } from './confirm'; export { uiConflicts } from './conflicts'; +export { uiCustom } from './custom'; export { uiContributors } from './contributors'; export { uiCurtain } from './curtain'; export { uiDisclosure } from './disclosure'; From 2d058c770cd9d2efcb65c6f13c7955b09ff3ba0f Mon Sep 17 00:00:00 2001 From: vershwal Date: Mon, 6 Aug 2018 02:02:30 +0530 Subject: [PATCH 097/217] Improved UI for custom background. --- modules/ui/background.js | 19 +++++++++---------- modules/ui/custom.js | 25 ++++++++----------------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/modules/ui/background.js b/modules/ui/background.js index e51768097..00e2a9b01 100644 --- a/modules/ui/background.js +++ b/modules/ui/background.js @@ -90,6 +90,7 @@ export function uiBackground(context) { function chooseBackground(d) { if (d.id === 'custom' && !d.template()) { return editCustom(); + } d3_event.preventDefault(); @@ -101,22 +102,19 @@ export function uiBackground(context) { document.activeElement.blur(); } - - function editCustom() { - d3_event.preventDefault(); - //var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; - /*var template = window.prompt( - t('background.custom_prompt', { example: example }), - _customSource.template() || example - ); - + function edit(a, template) { if (template) { context.storage('background-custom-template', template); _customSource.template(template); chooseBackground(_customSource); } else { _backgroundList.call(updateLayerSelections); - }*/ + } + } + + function editCustom() { + d3_event.preventDefault(); + context.container() .call(uiCustom(context)); } @@ -423,6 +421,7 @@ export function uiBackground(context) { uiBackground.hidePane = hidePane; uiBackground.togglePane = togglePane; uiBackground.setVisible = setVisible; + uiBackground.edit = edit; } return background; diff --git a/modules/ui/custom.js b/modules/ui/custom.js index 5ccaa6c62..e85e5b92f 100644 --- a/modules/ui/custom.js +++ b/modules/ui/custom.js @@ -1,5 +1,5 @@ import { t } from '../util/locale'; -import { uiIntro } from './intro'; +import { uiBackground } from './background'; import { uiModal } from './modal'; @@ -7,11 +7,6 @@ export function uiCustom(context) { return function(selection) { - /*if (context.storage('sawCustom')) - return; - - context.storage('sawCustom', true);*/ - var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; var modalSelection = uiModal(selection); @@ -30,12 +25,7 @@ export function uiCustom(context) { introModal .append('div') .attr('class','modal-section') - .append('p').text(t('background.custom_prompt')) - /*.append('p').text(t('background.custom_token1')) - .append('p').text(t('background.custom_token2')) - .append('p').text(t('background.custom_token3')) - .append('p').text(t('background.custom_token4')) - .append('p').text(t('background.custom_example', { example: example }))*/ + .append('p').text(t('background.custom_prompt', { example: example })) .append('textarea'); @@ -51,24 +41,25 @@ export function uiCustom(context) { .attr('class', 'modal-section'); - var startEditing = buttonWrap + var cancelButton = buttonWrap .append('button') .attr('class', 'button-cancel') .on('click', modalSelection.close); - startEditing + cancelButton .append('div') .text('Cancel'); - var walkthrough = buttonWrap + var okButton = buttonWrap .append('button') .attr('class', 'button-ok') .on('click', function() { - context.container().call(uiIntro(context)); + var template = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; + context.container().call(uiBackground.edit, template); modalSelection.close(); }); - walkthrough + okButton .append('div') .text('OK'); From 184e37253c5bb5eec21fde52f73707550f017e7e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 5 Aug 2018 23:37:06 -0400 Subject: [PATCH 098/217] Allow `tourism=artwork` on line geometry And when used on a line, silence `tag_suggests_area` warning (closes #5206) --- data/presets/presets.json | 2 +- data/presets/presets/tourism/artwork.json | 1 + data/taginfo.json | 2 +- dist/locales/en.json | 30 ++++++++++++++++++++++- modules/validations/tag_suggests_area.js | 6 ++++- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index 62e881f36..3383688be 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -873,7 +873,7 @@ "tourism/alpine_hut": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "terms": ["climbing hut"], "tags": {"tourism": "alpine_hut"}, "name": "Alpine Hut"}, "tourism/apartment": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"tourism": "apartment"}, "name": "Guest Apartment / Condo"}, "tourism/aquarium": {"icon": "maki-aquarium", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["fish", "sea", "water"], "tags": {"tourism": "aquarium"}, "name": "Aquarium"}, - "tourism/artwork": {"icon": "maki-art-gallery", "fields": ["name", "artwork_type", "artist"], "geometry": ["point", "vertex", "area"], "tags": {"tourism": "artwork"}, "terms": ["mural", "sculpture", "statue"], "name": "Artwork"}, + "tourism/artwork": {"icon": "maki-art-gallery", "fields": ["name", "artwork_type", "artist"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork"}, "terms": ["mural", "sculpture", "statue"], "name": "Artwork"}, "tourism/attraction": {"icon": "maki-star", "fields": ["name", "operator", "address"], "geometry": ["point", "vertex", "area"], "tags": {"tourism": "attraction"}, "name": "Tourist Attraction"}, "tourism/camp_site": {"icon": "maki-campsite", "fields": ["name", "operator", "address", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["tent", "rv"], "tags": {"tourism": "camp_site"}, "name": "Campground"}, "tourism/caravan_site": {"icon": "maki-bus", "fields": ["name", "operator", "address", "capacity", "fee", "sanitary_dump_station", "power_supply", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["Motor Home", "Camper"], "tags": {"tourism": "caravan_site"}, "name": "RV Park"}, diff --git a/data/presets/presets/tourism/artwork.json b/data/presets/presets/tourism/artwork.json index 996acdb58..324da79fb 100644 --- a/data/presets/presets/tourism/artwork.json +++ b/data/presets/presets/tourism/artwork.json @@ -8,6 +8,7 @@ "geometry": [ "point", "vertex", + "line", "area" ], "tags": { diff --git a/data/taginfo.json b/data/taginfo.json index 50d522098..00b2208d5 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -5717,7 +5717,7 @@ "key": "tourism", "value": "artwork", "description": "Artwork", - "object_types": ["node", "area"], + "object_types": ["node", "way", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/art-gallery-15.svg?sanitize=true" }, { diff --git a/dist/locales/en.json b/dist/locales/en.json index ea2058f79..8da3b8df6 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -6931,6 +6931,27 @@ }, "name": "Hike & Bike" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)", + "name": "Nordic snowmobile overlay" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic of Swedish orthophotos from the period 1949-1970.", + "name": "Lantmäteriet Historic Orthophoto 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic of Swedish orthophotos from the period 1970-1980. To be expanded.", + "name": "Lantmäteriet Historic Orthophoto 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Terms & Feedback" @@ -6968,7 +6989,7 @@ "text": "© Lantmäteriet" }, "description": "Scan of ´Economic maps´ ca 1950-1980", - "name": "Lantmäteriet Economic Map (historic)" + "name": "Lantmäteriet Economic Map ca 1950-1980" }, "qa_no_address": { "attribution": { @@ -6982,6 +7003,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Snowmobile trails", + "name": "Snowmobile map Sweden" + }, "stamen-terrain-background": { "attribution": { "text": "Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL" diff --git a/modules/validations/tag_suggests_area.js b/modules/validations/tag_suggests_area.js index 20b4a402c..a631f4a79 100644 --- a/modules/validations/tag_suggests_area.js +++ b/modules/validations/tag_suggests_area.js @@ -12,7 +12,11 @@ export function validationTagSuggestsArea() { var presence = ['landuse', 'amenities', 'tourism', 'shop']; for (var i = 0; i < presence.length; i++) { if (tags[presence[i]] !== undefined) { - return presence[i] + '=' + tags[presence[i]]; + if (presence[i] === 'tourism' && tags[presence[i]] === 'artwork') { + continue; // exception for tourism=artwork - #5206 + } else { + return presence[i] + '=' + tags[presence[i]]; + } } } From dadd05af8b1c9c732372c2a3c04c30bc56495cca Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 5 Aug 2018 23:51:27 -0400 Subject: [PATCH 099/217] Add `layer` field to a few more presets (closes #5204) - `building=roof` - `power=line` - `power=minor_line` - `man_made=pipeline` --- data/presets/presets.json | 8 ++++---- data/presets/presets/building/roof.json | 3 ++- data/presets/presets/man_made/pipeline.json | 3 ++- data/presets/presets/power/line.json | 3 ++- data/presets/presets/power/minor_line.json | 5 +++-- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index 3383688be..c664269a1 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -238,7 +238,7 @@ "building/public": {"icon": "maki-building", "fields": ["name", "address", "levels", "height", "smoking"], "geometry": ["area"], "tags": {"building": "public"}, "matchScore": 0.5, "name": "Public Building"}, "building/residential": {"icon": "maki-residential-community", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "residential"}, "matchScore": 0.5, "name": "Residential Building"}, "building/retail": {"icon": "maki-commercial", "fields": ["name", "address", "levels", "height", "smoking"], "geometry": ["area"], "tags": {"building": "retail"}, "matchScore": 0.5, "name": "Retail Building"}, - "building/roof": {"icon": "maki-shelter", "fields": ["name", "address"], "geometry": ["area"], "tags": {"building": "roof"}, "matchScore": 0.5, "name": "Roof"}, + "building/roof": {"icon": "maki-shelter", "fields": ["name", "address", "layer"], "geometry": ["area"], "tags": {"building": "roof"}, "matchScore": 0.5, "name": "Roof"}, "building/ruins": {"icon": "temaki-ruins", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "ruins"}, "matchScore": 0.5, "name": "Building Ruins"}, "building/school": {"icon": "maki-building", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "terms": ["academy", "elementary school", "middle school", "high school"], "tags": {"building": "school"}, "matchScore": 0.5, "name": "School Building"}, "building/semidetached_house": {"icon": "maki-home", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "semidetached_house"}, "terms": ["home", "double", "duplex", "twin", "family", "residence", "dwelling"], "matchScore": 0.5, "name": "Semi-Detached House"}, @@ -544,7 +544,7 @@ "man_made/observatory": {"geometry": ["point", "area"], "terms": ["astronomical", "meteorological"], "tags": {"man_made": "observatory"}, "name": "Observatory"}, "man_made/petroleum_well": {"icon": "temaki-storage_tank", "geometry": ["point"], "terms": ["drilling rig", "oil derrick", "oil drill", "oil horse", "oil rig", "oil pump", "petroleum well", "pumpjack"], "tags": {"man_made": "petroleum_well"}, "name": "Oil Well"}, "man_made/pier": {"icon": "iD-highway-footway", "fields": ["name", "surface", "lit", "width", "access"], "geometry": ["line", "area"], "terms": ["dock", "jetty"], "tags": {"man_made": "pier"}, "name": "Pier"}, - "man_made/pipeline": {"icon": "iD-pipeline-line", "fields": ["location", "operator", "substance"], "geometry": ["line"], "tags": {"man_made": "pipeline"}, "name": "Pipeline"}, + "man_made/pipeline": {"icon": "iD-pipeline-line", "fields": ["location", "operator", "substance", "layer"], "geometry": ["line"], "tags": {"man_made": "pipeline"}, "name": "Pipeline"}, "man_made/pumping_station": {"icon": "maki-water", "geometry": ["point", "area"], "tags": {"man_made": "pumping_station"}, "name": "Pumping Station"}, "man_made/silo": {"icon": "temaki-silo", "fields": ["building_area", "crop"], "geometry": ["point", "area"], "terms": ["grain", "corn", "wheat"], "tags": {"man_made": "silo"}, "name": "Silo"}, "man_made/storage_tank": {"icon": "temaki-storage_tank", "fields": ["building_area", "content"], "geometry": ["point", "area"], "terms": ["water", "oil", "gas", "petrol"], "tags": {"man_made": "storage_tank"}, "name": "Storage Tank"}, @@ -666,8 +666,8 @@ "power/generator": {"icon": "temaki-power", "fields": ["operator", "generator/source", "generator/method", "generator/type", "generator/output/electricity", "ref"], "geometry": ["point", "vertex", "area"], "terms": ["hydro", "solar", "turbine", "wind"], "tags": {"power": "generator"}, "name": "Power Generator"}, "power/generator/source_nuclear": {"icon": "temaki-radiation", "fields": ["operator", "generator/source", "generator/method", "generator/type", "generator/output/electricity", "ref"], "geometry": ["point", "vertex", "area"], "terms": ["fission", "generator", "nuclear", "nuke", "reactor"], "tags": {"power": "generator", "generator:source": "nuclear", "generator:method": "fission"}, "reference": {"key": "generator:source", "value": "nuclear"}, "name": "Nuclear Reactor"}, "power/generator/source_wind": {"icon": "temaki-wind_turbine", "fields": ["operator", "generator/source", "generator/method", "generator/type", "generator/output/electricity", "height", "ref"], "geometry": ["point", "vertex", "area"], "terms": ["generator", "turbine", "windmill", "wind"], "tags": {"power": "generator", "generator:source": "wind", "generator:method": "wind_turbine"}, "reference": {"key": "generator:source", "value": "wind"}, "name": "Wind Turbine"}, - "power/line": {"icon": "iD-power-line", "fields": ["name", "operator", "voltage", "ref"], "geometry": ["line"], "tags": {"power": "line"}, "name": "Power Line"}, - "power/minor_line": {"icon": "iD-power-line", "fields": ["name", "operator", "voltage", "ref"], "geometry": ["line"], "tags": {"power": "minor_line"}, "name": "Minor Power Line"}, + "power/line": {"icon": "iD-power-line", "fields": ["name", "operator", "voltage", "ref", "layer"], "geometry": ["line"], "tags": {"power": "line"}, "name": "Power Line"}, + "power/minor_line": {"icon": "iD-power-line", "fields": ["name", "operator", "voltage", "ref", "layer"], "geometry": ["line"], "tags": {"power": "minor_line"}, "name": "Minor Power Line"}, "power/plant": {"icon": "maki-industry", "fields": ["name", "operator", "address", "plant/output/electricity", "start_date"], "geometry": ["area"], "tags": {"power": "plant"}, "addTags": {"power": "plant", "landuse": "industrial"}, "removeTags": {"power": "plant", "landuse": "industrial"}, "terms": ["coal", "gas", "generat*", "hydro", "nuclear", "power", "station"], "name": "Power Station Grounds"}, "power/pole": {"fields": ["ref"], "geometry": ["point", "vertex"], "tags": {"power": "pole"}, "name": "Power Pole"}, "power/substation": {"icon": "temaki-power", "fields": ["substation", "operator", "building", "ref"], "geometry": ["point", "area"], "tags": {"power": "substation"}, "name": "Substation"}, diff --git a/data/presets/presets/building/roof.json b/data/presets/presets/building/roof.json index 1ac19261f..3df90136c 100644 --- a/data/presets/presets/building/roof.json +++ b/data/presets/presets/building/roof.json @@ -2,7 +2,8 @@ "icon": "maki-shelter", "fields": [ "name", - "address" + "address", + "layer" ], "geometry": [ "area" diff --git a/data/presets/presets/man_made/pipeline.json b/data/presets/presets/man_made/pipeline.json index 2106ac717..192855517 100644 --- a/data/presets/presets/man_made/pipeline.json +++ b/data/presets/presets/man_made/pipeline.json @@ -3,7 +3,8 @@ "fields": [ "location", "operator", - "substance" + "substance", + "layer" ], "geometry": [ "line" diff --git a/data/presets/presets/power/line.json b/data/presets/presets/power/line.json index aabbea1e4..bb86c4694 100644 --- a/data/presets/presets/power/line.json +++ b/data/presets/presets/power/line.json @@ -4,7 +4,8 @@ "name", "operator", "voltage", - "ref" + "ref", + "layer" ], "geometry": [ "line" diff --git a/data/presets/presets/power/minor_line.json b/data/presets/presets/power/minor_line.json index d935459de..f96dacbfe 100644 --- a/data/presets/presets/power/minor_line.json +++ b/data/presets/presets/power/minor_line.json @@ -4,9 +4,10 @@ "name", "operator", "voltage", - "ref" + "ref", + "layer" ], - "geometry": [ + "geometry": [ "line" ], "tags": { From 499b2e58af17e1ab98ad3e7291cbd38ba8984a34 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 6 Aug 2018 13:47:07 -0400 Subject: [PATCH 100/217] Support building tags on gasometers and silos --- data/presets/presets.json | 6 +++--- data/presets/presets/man_made/gasometer.json | 4 ++++ data/presets/presets/man_made/silo.json | 4 ++-- data/presets/presets/man_made/storage_tank.json | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index 8c1e5e1f0..c032e2050 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -536,7 +536,7 @@ "man_made/crane": {"icon": "temaki-crane", "fields": ["operator", "height", "crane/type"], "geometry": ["point", "line", "vertex", "area"], "tags": {"man_made": "crane"}, "name": "Crane"}, "man_made/cutline": {"icon": "maki-logging", "geometry": ["line"], "tags": {"man_made": "cutline"}, "name": "Cut line"}, "man_made/flagpole": {"icon": "maki-embassy", "geometry": ["point"], "tags": {"man_made": "flagpole"}, "name": "Flagpole"}, - "man_made/gasometer": {"icon": "temaki-storage_tank", "geometry": ["point", "area"], "terms": ["gas holder"], "tags": {"man_made": "gasometer"}, "name": "Gasometer"}, + "man_made/gasometer": {"icon": "temaki-storage_tank", "fields": ["content", "building_area"], "geometry": ["point", "area"], "terms": ["gas holder"], "tags": {"man_made": "gasometer"}, "name": "Gasometer"}, "man_made/groyne": {"geometry": ["line", "area"], "tags": {"man_made": "groyne"}, "name": "Groyne"}, "man_made/lighthouse": {"icon": "maki-lighthouse", "fields": ["building_area"], "geometry": ["point", "area"], "tags": {"man_made": "lighthouse"}, "name": "Lighthouse"}, "man_made/mast": {"icon": "temaki-antenna", "fields": ["tower/type", "tower/construction", "height", "communication_multi"], "geometry": ["point"], "terms": ["antenna", "broadcast tower", "cell phone tower", "cell tower", "communication mast", "communication tower", "guyed tower", "mobile phone tower", "radio mast", "radio tower", "television tower", "transmission mast", "transmission tower", "tv tower"], "tags": {"man_made": "mast"}, "name": "Mast"}, @@ -547,8 +547,8 @@ "man_made/pier": {"icon": "iD-highway-footway", "fields": ["name", "surface", "lit", "width", "access"], "geometry": ["line", "area"], "terms": ["dock", "jetty"], "tags": {"man_made": "pier"}, "name": "Pier"}, "man_made/pipeline": {"icon": "iD-pipeline-line", "fields": ["location", "operator", "substance", "layer"], "geometry": ["line"], "tags": {"man_made": "pipeline"}, "name": "Pipeline"}, "man_made/pumping_station": {"icon": "maki-water", "geometry": ["point", "area"], "tags": {"man_made": "pumping_station"}, "name": "Pumping Station"}, - "man_made/silo": {"icon": "temaki-silo", "fields": ["building_area", "crop"], "geometry": ["point", "area"], "terms": ["grain", "corn", "wheat"], "tags": {"man_made": "silo"}, "name": "Silo"}, - "man_made/storage_tank": {"icon": "temaki-storage_tank", "fields": ["building_area", "content"], "geometry": ["point", "area"], "terms": ["water", "oil", "gas", "petrol"], "tags": {"man_made": "storage_tank"}, "name": "Storage Tank"}, + "man_made/silo": {"icon": "temaki-silo", "fields": ["crop", "building_area"], "geometry": ["point", "area"], "terms": ["grain", "corn", "wheat"], "tags": {"man_made": "silo"}, "name": "Silo"}, + "man_made/storage_tank": {"icon": "temaki-storage_tank", "fields": ["content", "building_area"], "geometry": ["point", "area"], "terms": ["water", "oil", "gas", "petrol"], "tags": {"man_made": "storage_tank"}, "name": "Storage Tank"}, "man_made/surveillance_camera": {"icon": "maki-attraction", "geometry": ["point", "vertex"], "fields": ["surveillance", "surveillance/type", "camera/type", "camera/mount", "camera/direction", "surveillance/zone", "contact/webcam"], "terms": ["anpr", "alpr", "camera", "car plate recognition", "cctv", "guard", "license plate recognition", "monitoring", "number plate recognition", "security", "video", "webcam"], "tags": {"man_made": "surveillance", "surveillance:type": "camera"}, "name": "Surveillance Camera"}, "man_made/surveillance": {"icon": "maki-attraction", "geometry": ["point", "vertex"], "fields": ["surveillance", "surveillance/type", "surveillance/zone", "direction"], "terms": ["anpr", "alpr", "camera", "car plate recognition", "cctv", "guard", "license plate recognition", "monitoring", "number plate recognition", "security", "video", "webcam"], "tags": {"man_made": "surveillance"}, "name": "Surveillance"}, "man_made/survey_point": {"icon": "maki-monument", "fields": ["ref"], "geometry": ["point", "vertex"], "terms": ["trig point", "triangulation pillar", "trigonometrical station"], "tags": {"man_made": "survey_point"}, "name": "Survey Point"}, diff --git a/data/presets/presets/man_made/gasometer.json b/data/presets/presets/man_made/gasometer.json index 63daf508b..aca591e2e 100644 --- a/data/presets/presets/man_made/gasometer.json +++ b/data/presets/presets/man_made/gasometer.json @@ -1,5 +1,9 @@ { "icon": "temaki-storage_tank", + "fields": [ + "content", + "building_area" + ], "geometry": [ "point", "area" diff --git a/data/presets/presets/man_made/silo.json b/data/presets/presets/man_made/silo.json index a59a67d9e..77e6c899a 100644 --- a/data/presets/presets/man_made/silo.json +++ b/data/presets/presets/man_made/silo.json @@ -1,8 +1,8 @@ { "icon": "temaki-silo", "fields": [ - "building_area", - "crop" + "crop", + "building_area" ], "geometry": [ "point", diff --git a/data/presets/presets/man_made/storage_tank.json b/data/presets/presets/man_made/storage_tank.json index 826fcf6fe..2890e3f60 100644 --- a/data/presets/presets/man_made/storage_tank.json +++ b/data/presets/presets/man_made/storage_tank.json @@ -1,8 +1,8 @@ { "icon": "temaki-storage_tank", "fields": [ - "building_area", - "content" + "content", + "building_area" ], "geometry": [ "point", From 0be1705a0d6cb291ee953a8b2f101aeb47f6f22d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 6 Aug 2018 14:27:32 -0400 Subject: [PATCH 101/217] Disable note and streetview interactivity except in browse/select modes (closes #5202) --- css/60_photos.css | 4 ++++ css/65_data.css | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/css/60_photos.css b/css/60_photos.css index cc853900c..dece57cca 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -88,6 +88,10 @@ /* markers and sequences */ .viewfield-group { + pointer-events: none; +} +.mode-browse .viewfield-group, +.mode-select .viewfield-group { pointer-events: visible; cursor: pointer; } diff --git a/css/65_data.css b/css/65_data.css index 962311fee..7fca3c9e8 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -6,7 +6,8 @@ .layer-notes .note * { pointer-events: none; } -.layer-notes .note .note-fill { +.mode-browse .layer-notes .note .note-fill, +.mode-select .layer-notes .note .note-fill { pointer-events: visible; cursor: pointer; /* Opera */ cursor: url(img/cursor-select-point.png), pointer; /* FF */ From 12f402c48b430e9a8b920767fcdf252f2fafcb32 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 6 Aug 2018 14:45:10 -0400 Subject: [PATCH 102/217] Disable Add Note '4' shortcut when notes layer is not enabled (also return to browse mode if notes or osm layers get disabled) (closes #5190) --- modules/ui/map_data.js | 6 ++++++ modules/ui/modes.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index 149f4693f..974e1c0ba 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -8,6 +8,7 @@ import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; import { svgIcon } from '../svg'; import { t, textDirection } from '../util/locale'; import { tooltip } from '../util/tooltip'; +import { modeBrowse } from '../modes'; import { uiBackground } from './background'; import { uiDisclosure } from './disclosure'; import { uiHelp } from './help'; @@ -75,6 +76,11 @@ export function uiMapData(context) { var layer = layers.layer(which); if (layer) { layer.enabled(enabled); + + if (!enabled && (which === 'osm' || which === 'notes')) { + context.enter(modeBrowse(context)); + } + update(); } } diff --git a/modules/ui/modes.js b/modules/ui/modes.js index dbff2e88e..25aff9f83 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -60,7 +60,7 @@ export function uiModes(context) { modes.forEach(function(mode) { keybinding.on(mode.key, function() { - if (mode.id === 'add-note' && !notesEditable()) return; + if (mode.id === 'add-note' && !(notesEnabled() && notesEditable())) return; if (mode.id !== 'add-note' && !editable()) return; if (mode.id === context.mode().id) { From ff9e60d205b420e7a2032da1eb5c5dbd0ee0df2b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 7 Aug 2018 10:05:12 -0400 Subject: [PATCH 103/217] Submit note comments with cmd+enter (closes #5193) --- modules/modes/select_note.js | 1 + modules/ui/note_editor.js | 134 +++++++++++++++++++++++------------ 2 files changed, 90 insertions(+), 45 deletions(-) diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index 143b57155..c4f6b0bb2 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -129,6 +129,7 @@ export function modeSelectNote(context, selectedNoteID) { context.ui().sidebar .hide(); + context.selectedNoteID(null); }; diff --git a/modules/ui/note_editor.js b/modules/ui/note_editor.js index a6fd9c573..4ebc6e89d 100644 --- a/modules/ui/note_editor.js +++ b/modules/ui/note_editor.js @@ -160,8 +160,9 @@ export function uiNoteEditor(context) { .attr('maxlength', 1000) .property('value', function(d) { return d.newComment; }) .call(utilNoAuto) - .on('input', changeInput) - .on('blur', changeInput); + .on('keydown.note-input', keydown) + .on('input.note-input', changeInput) + .on('blur.note-input', changeInput); // update noteSave = noteSaveEnter @@ -170,6 +171,36 @@ export function uiNoteEditor(context) { .call(noteSaveButtons); + // fast submit if user presses cmd+enter + function keydown() { + if (!(d3_event.keyCode === 13 && d3_event.metaKey)) return; + + var osm = services.osm; + if (!osm) return; + + var hasAuth = osm.authenticated(); + if (!hasAuth) return; + + if (!_note.newComment) return; + + d3_event.preventDefault(); + + d3_select(this) + .on('keydown.note-input', null); + + // focus on button and submit + window.setTimeout(function() { + if (_note.isNew()) { + noteSave.selectAll('.save-button').node().focus(); + clickSave(_note); + } else { + noteSave.selectAll('.comment-button').node().focus(); + clickComment(_note); + } + }, 10); + } + + function changeInput() { var input = d3_select(this); var val = input.property('value').trim() || undefined; @@ -323,29 +354,11 @@ export function uiNoteEditor(context) { .merge(buttonEnter); buttonSection.select('.cancel-button') // select and propagate data - .on('click.cancel', function(d) { - this.blur(); // avoid keeping focus on the button - #4641 - var osm = services.osm; - if (osm) { - osm.removeNote(d); - } - context.enter(modeBrowse(context)); - dispatch.call('change'); - }); + .on('click.cancel', clickCancel); - buttonSection.select('.save-button') // select and propagate data - .attr('disabled', function(d) { - return (hasAuth && d.status === 'open' && d.newComment) ? null : true; - }) - .on('click.save', function(d) { - this.blur(); // avoid keeping focus on the button - #4641 - var osm = services.osm; - if (osm) { - osm.postNoteCreate(d, function(err, note) { - dispatch.call('change', note); - }); - } - }); + buttonSection.select('.save-button') // select and propagate data + .attr('disabled', isSaveDisabled) + .on('click.save', clickSave); buttonSection.select('.status-button') // select and propagate data .attr('disabled', (hasAuth ? null : true)) @@ -354,30 +367,61 @@ export function uiNoteEditor(context) { var andComment = (d.newComment ? '_comment' : ''); return t('note.' + action + andComment); }) - .on('click.status', function(d) { - this.blur(); // avoid keeping focus on the button - #4641 - var osm = services.osm; - if (osm) { - var setStatus = (d.status === 'open' ? 'closed' : 'open'); - osm.postNoteUpdate(d, setStatus, function(err, note) { - dispatch.call('change', note); - }); - } - }); + .on('click.status', clickStatus); buttonSection.select('.comment-button') // select and propagate data - .attr('disabled', function(d) { - return (hasAuth && d.status === 'open' && d.newComment) ? null : true; - }) - .on('click.comment', function(d) { - this.blur(); // avoid keeping focus on the button - #4641 - var osm = services.osm; - if (osm) { - osm.postNoteUpdate(d, d.status, function(err, note) { - dispatch.call('change', note); - }); - } + .attr('disabled', isSaveDisabled) + .on('click.comment', clickComment); + + + function isSaveDisabled(d) { + return (hasAuth && d.status === 'open' && d.newComment) ? null : true; + } + } + + + + function clickCancel(d) { + this.blur(); // avoid keeping focus on the button - #4641 + var osm = services.osm; + if (osm) { + osm.removeNote(d); + } + context.enter(modeBrowse(context)); + dispatch.call('change'); + } + + + function clickSave(d) { + this.blur(); // avoid keeping focus on the button - #4641 + var osm = services.osm; + if (osm) { + osm.postNoteCreate(d, function(err, note) { + dispatch.call('change', note); }); + } + } + + + function clickStatus(d) { + this.blur(); // avoid keeping focus on the button - #4641 + var osm = services.osm; + if (osm) { + var setStatus = (d.status === 'open' ? 'closed' : 'open'); + osm.postNoteUpdate(d, setStatus, function(err, note) { + dispatch.call('change', note); + }); + } + } + + function clickComment(d) { + this.blur(); // avoid keeping focus on the button - #4641 + var osm = services.osm; + if (osm) { + osm.postNoteUpdate(d, d.status, function(err, note) { + dispatch.call('change', note); + }); + } } From f8f1c1f5412e85a0aab71b5e664beb3a89a22f98 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 9 Aug 2018 23:25:06 -0400 Subject: [PATCH 104/217] Ensure both notes and nodes can be dragged in selectNote mode --- css/65_data.css | 3 ++- modules/modes/drag_note.js | 10 +++++----- modules/modes/select_note.js | 6 +++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/css/65_data.css b/css/65_data.css index 7fca3c9e8..38346e8a2 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -7,7 +7,8 @@ pointer-events: none; } .mode-browse .layer-notes .note .note-fill, -.mode-select .layer-notes .note .note-fill { +.mode-select .layer-notes .note .note-fill, +.mode-select-note .layer-notes .note .note-fill { pointer-events: visible; cursor: pointer; /* Opera */ cursor: url(img/cursor-select-point.png), pointer; /* FF */ diff --git a/modules/modes/drag_note.js b/modules/modes/drag_note.js index 7b1ca0106..7f834cb10 100644 --- a/modules/modes/drag_note.js +++ b/modules/modes/drag_note.js @@ -4,6 +4,7 @@ import { } from 'd3-selection'; import { services } from '../services'; +import { actionNoop } from '../actions'; import { behaviorEdit, behaviorDrag } from '../behavior'; import { geoVecSubtract, geoViewportEdge } from '../geo'; import { modeSelectNote } from './index'; @@ -47,7 +48,9 @@ export function modeDragNote(context) { context.surface().selectAll('.note-' + note.id) .classed('active', true); + context.perform(actionNoop()); context.enter(mode); + context.selectedNoteID(note.id); } @@ -79,15 +82,12 @@ export function modeDragNote(context) { osm.replaceNote(note); // update note cache } - // update note on screen (no need to do a full redraw) - context.surface().selectAll('.note-' + note.id) - .attr('transform', 'translate(' + currMouse[0] + ',' + currMouse[1] + ')'); + context.replace(actionNoop()); // trigger redraw } function end(note) { - // force a reraw (there is no history change that would otherwise do this) - context.pan([0,0]); + context.replace(actionNoop()); // trigger redraw context .selectedNoteID(note.id) diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index c4f6b0bb2..c2eb8aba0 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -12,7 +12,10 @@ import { behaviorSelect } from '../behavior'; -import { modeDragNote } from '../modes'; +import { + modeDragNode, + modeDragNote +} from '../modes'; import { services } from '../services'; import { modeBrowse } from './browse'; @@ -41,6 +44,7 @@ export function modeSelectNote(context, selectedNoteID) { behaviorHover(context), behaviorSelect(context), behaviorLasso(context), + modeDragNode(context).behavior, modeDragNote(context).behavior ]; From 9f33ca9a011cea944025909cdd0191def2c77c68 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 9 Aug 2018 23:25:50 -0400 Subject: [PATCH 105/217] Show location of selected Note in Measurement Panel (re: #5158) --- data/core.yaml | 1 + dist/locales/en.json | 3 +- modules/ui/panels/measurement.js | 62 ++++++++++++++++++-------------- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index f02885a8f..d6f342f6e 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -373,6 +373,7 @@ en: line: line area: area relation: relation + note: note geocoder: search: Search worldwide... no_results_visible: No results in visible map area diff --git a/dist/locales/en.json b/dist/locales/en.json index 025731b94..a359e5a68 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -460,7 +460,8 @@ "vertex": "vertex", "line": "line", "area": "area", - "relation": "relation" + "relation": "relation", + "note": "note" }, "geocoder": { "search": "Search worldwide...", diff --git a/modules/ui/panels/measurement.js b/modules/ui/panels/measurement.js index ff7369925..b5400950b 100644 --- a/modules/ui/panels/measurement.js +++ b/modules/ui/panels/measurement.js @@ -11,7 +11,7 @@ import { t } from '../../util/locale'; import { displayArea, displayLength, decimalCoordinatePair, dmsCoordinatePair } from '../../util/units'; import { geoExtent } from '../../geo'; import { utilDetect } from '../../util/detect'; - +import { services } from '../../services'; export function uiPanelMeasurement(context) { @@ -43,21 +43,40 @@ export function uiPanelMeasurement(context) { return result; } + function nodeCount(feature) { if (feature.type === 'LineString') return feature.coordinates.length; - - if (feature.type === 'Polygon') { - return feature.coordinates[0].length - 1; - } + if (feature.type === 'Polygon') return feature.coordinates[0].length - 1; } function redraw(selection) { var resolver = context.graph(); - var selected = _filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }); + var selectedNoteID = context.selectedNoteID(); + var osm = services.osm; + + var selected, center, entity, note, geometry; + + if (selectedNoteID && osm) { // selected 1 note + selected = [ t('note.note') + ' ' + selectedNoteID ]; + note = osm.getNote(selectedNoteID); + center = note.loc; + geometry = 'note'; + + } else { // selected 1..n entities + var extent = geoExtent(); + selected = _filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }); + if (selected.length) { + for (var i = 0; i < selected.length; i++) { + entity = context.entity(selected[i]); + extent._extend(entity.extent(resolver)); + } + center = extent.center(); + geometry = entity.geometry(resolver); + } + } + var singular = selected.length === 1 ? selected[0] : null; - var extent = geoExtent(); - var entity; selection.html(''); @@ -68,19 +87,12 @@ export function uiPanelMeasurement(context) { if (!selected.length) return; - var center; - for (var i = 0; i < selected.length; i++) { - entity = context.entity(selected[i]); - extent._extend(entity.extent(resolver)); - } - center = extent.center(); - var list = selection .append('ul'); var coordItem; - // multiple features, just display extent center.. + // multiple selected features, just display extent center.. if (!singular) { coordItem = list .append('li') @@ -92,16 +104,13 @@ export function uiPanelMeasurement(context) { return; } - // single feature, display details.. - if (!entity) return; - var geometry = entity.geometry(resolver); - + // single selected feature, display details.. if (geometry === 'line' || geometry === 'area') { - var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()), - feature = entity.asGeoJSON(resolver), - length = radiansToMeters(d3_geoLength(toLineString(feature))), - lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')), - centroid = d3_geoCentroid(feature); + var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()); + var feature = entity.asGeoJSON(resolver); + var length = radiansToMeters(d3_geoLength(toLineString(feature))); + var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length')); + var centroid = d3_geoCentroid(feature); list .append('li') @@ -157,7 +166,8 @@ export function uiPanelMeasurement(context) { }); } else { - var centerLabel = t('info_panels.measurement.' + (entity.type === 'node' ? 'location' : 'center')); + var centerLabel = t('info_panels.measurement.' + + (note || entity.type === 'node' ? 'location' : 'center')); list .append('li') From 68ed6b10244c395b0167b29306748e9288458ce4 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 10 Aug 2018 16:49:50 -0400 Subject: [PATCH 106/217] Show selected note details History Panel (re: #5158) --- data/core.yaml | 5 ++ dist/locales/en.json | 7 ++- modules/ui/panels/history.js | 104 ++++++++++++++++++++++++++++------- 3 files changed, 94 insertions(+), 22 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index d6f342f6e..65889192a 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -347,6 +347,11 @@ en: changeset: Changeset unknown: Unknown link_text: History on openstreetmap.org + note_no_history: "No History (New Note)" + note_comments: Comments + note_created_date: Created Date + note_created_user: Created By + note_link_text: Note on openstreetmap.org location: key: L title: Location diff --git a/dist/locales/en.json b/dist/locales/en.json index a359e5a68..ca31f31d8 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -430,7 +430,12 @@ "edited_by": "Edited By", "changeset": "Changeset", "unknown": "Unknown", - "link_text": "History on openstreetmap.org" + "link_text": "History on openstreetmap.org", + "note_no_history": "No History (New Note)", + "note_comments": "Comments", + "note_created_date": "Created Date", + "note_created_user": "Created By", + "note_link_text": "Note on openstreetmap.org" }, "location": { "key": "L", diff --git a/modules/ui/panels/history.js b/modules/ui/panels/history.js index fef7c8804..e8e8fcdcf 100644 --- a/modules/ui/panels/history.js +++ b/modules/ui/panels/history.js @@ -8,21 +8,21 @@ import { utilDetect } from '../../util/detect'; export function uiPanelHistory(context) { var osm; - function displayTimestamp(entity) { - if (!entity.timestamp) return t('info_panels.history.unknown'); + function displayTimestamp(timestamp) { + if (!timestamp) return t('info_panels.history.unknown'); var detected = utilDetect(); var options = { day: 'numeric', month: 'short', year: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric' }; - var d = new Date(entity.timestamp); + var d = new Date(timestamp); if (isNaN(d.getTime())) return t('info_panels.history.unknown'); return d.toLocaleString(detected.locale, options); } - function displayUser(selection, entity) { - if (!entity.user) { + function displayUser(selection, userName) { + if (!userName) { selection .append('span') .text(t('info_panels.history.unknown')); @@ -32,7 +32,7 @@ export function uiPanelHistory(context) { selection .append('span') .attr('class', 'user-name') - .text(entity.user); + .text(userName); var links = selection .append('div') @@ -42,7 +42,7 @@ export function uiPanelHistory(context) { links .append('a') .attr('class', 'user-osm-link') - .attr('href', osm.userURL(entity.user)) + .attr('href', osm.userURL(userName)) .attr('target', '_blank') .attr('tabindex', -1) .text('OSM'); @@ -51,15 +51,15 @@ export function uiPanelHistory(context) { links .append('a') .attr('class', 'user-hdyc-link') - .attr('href', 'https://hdyc.neis-one.org/?' + entity.user) + .attr('href', 'https://hdyc.neis-one.org/?' + userName) .attr('target', '_blank') .attr('tabindex', -1) .text('HDYC'); } - function displayChangeset(selection, entity) { - if (!entity.changeset) { + function displayChangeset(selection, changeset) { + if (!changeset) { selection .append('span') .text(t('info_panels.history.unknown')); @@ -69,7 +69,7 @@ export function uiPanelHistory(context) { selection .append('span') .attr('class', 'changeset-id') - .text(entity.changeset); + .text(changeset); var links = selection .append('div') @@ -79,7 +79,7 @@ export function uiPanelHistory(context) { links .append('a') .attr('class', 'changeset-osm-link') - .attr('href', osm.changesetURL(entity.changeset)) + .attr('href', osm.changesetURL(changeset)) .attr('target', '_blank') .attr('tabindex', -1) .text('OSM'); @@ -88,7 +88,7 @@ export function uiPanelHistory(context) { links .append('a') .attr('class', 'changeset-osmcha-link') - .attr('href', 'https://osmcha.mapbox.com/changesets/' + entity.changeset) + .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset) .attr('target', '_blank') .attr('tabindex', -1) .text('OSMCha'); @@ -96,11 +96,22 @@ export function uiPanelHistory(context) { function redraw(selection) { - var selected = _filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }); - var singular = selected.length === 1 ? selected[0] : null; - + var selectedNoteID = context.selectedNoteID(); osm = context.connection(); + var selected, note, entity; + if (selectedNoteID && osm) { // selected 1 note + selected = [ t('note.note') + ' ' + selectedNoteID ]; + note = osm.getNote(selectedNoteID); + } else { // selected 1..n entities + selected = _filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }); + if (selected.length) { + entity = context.entity(selected[0]); + } + } + + var singular = selected.length === 1 ? selected[0] : null; + selection.html(''); selection @@ -110,9 +121,60 @@ export function uiPanelHistory(context) { if (!singular) return; - var entity = context.entity(singular); + if (entity) { + selection.call(redrawEntity, entity); + } else if (note) { + selection.call(redrawNote, note); + } + } - if (!entity.version) { + + function redrawNote(selection, note) { + if (!note || note.isNew()) { + selection + .append('div') + .text(t('info_panels.history.note_no_history')); + return; + } + + var list = selection + .append('ul'); + + list + .append('li') + .text(t('info_panels.history.note_comments') + ':') + .append('span') + .text(note.comments.length); + + if (note.comments.length) { + list + .append('li') + .text(t('info_panels.history.note_created_date') + ':') + .append('span') + .text(displayTimestamp(note.comments[0].date)); + + list + .append('li') + .text(t('info_panels.history.note_created_user') + ':') + .call(displayUser, note.comments[0].user); + } + + if (osm) { + selection + .append('a') + .attr('class', 'view-history-on-osm') + .attr('target', '_blank') + .attr('tabindex', -1) + .attr('href', osm.noteURL(note.id)) + .call(svgIcon('#iD-icon-out-link', 'inline')) + .append('span') + .text(t('info_panels.history.note_link_text')); + } + } + + + function redrawEntity(selection, entity) { + if (!entity || entity.isNew()) { selection .append('div') .text(t('info_panels.history.no_history')); @@ -132,17 +194,17 @@ export function uiPanelHistory(context) { .append('li') .text(t('info_panels.history.last_edit') + ':') .append('span') - .text(displayTimestamp(entity)); + .text(displayTimestamp(entity.timestamp)); list .append('li') .text(t('info_panels.history.edited_by') + ':') - .call(displayUser, entity); + .call(displayUser, entity.user); list .append('li') .text(t('info_panels.history.changeset') + ':') - .call(displayChangeset, entity); + .call(displayChangeset, entity.changeset); if (osm) { selection From fab4a54c149eee81d30506c965f40aa4562c0b15 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 10 Aug 2018 22:19:40 -0400 Subject: [PATCH 107/217] Redraw measurement and history panels on context mode enter - these panel content were redrawn whenever the map was redrawn, however the map does not necessarily redraw when selecting notes --- modules/ui/panels/history.js | 9 +++++++-- modules/ui/panels/measurement.js | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/ui/panels/history.js b/modules/ui/panels/history.js index e8e8fcdcf..249a2068e 100644 --- a/modules/ui/panels/history.js +++ b/modules/ui/panels/history.js @@ -227,11 +227,16 @@ export function uiPanelHistory(context) { .on('drawn.info-history', function() { selection.call(redraw); }); + + context + .on('enter.info-history', function() { + selection.call(redraw); + }); }; panel.off = function() { - context.map() - .on('drawn.info-history', null); + context.map().on('drawn.info-history', null); + context.on('enter.info-history', null); }; panel.id = 'history'; diff --git a/modules/ui/panels/measurement.js b/modules/ui/panels/measurement.js index b5400950b..aabdf7641 100644 --- a/modules/ui/panels/measurement.js +++ b/modules/ui/panels/measurement.js @@ -193,11 +193,16 @@ export function uiPanelMeasurement(context) { .on('drawn.info-measurement', function() { selection.call(redraw); }); + + context + .on('enter.info-measurement', function() { + selection.call(redraw); + }); }; panel.off = function() { - context.map() - .on('drawn.info-measurement', null); + context.map().on('drawn.info-measurement', null); + context.on('enter.info-measurement', null); }; panel.id = 'measurement'; From 7b4f4fd031b4f7a64be9ac935e9aa50e7062fe54 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 10 Aug 2018 22:26:13 -0400 Subject: [PATCH 108/217] Fix note url link in history panel --- modules/ui/panels/history.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/panels/history.js b/modules/ui/panels/history.js index 249a2068e..133955577 100644 --- a/modules/ui/panels/history.js +++ b/modules/ui/panels/history.js @@ -165,7 +165,7 @@ export function uiPanelHistory(context) { .attr('class', 'view-history-on-osm') .attr('target', '_blank') .attr('tabindex', -1) - .attr('href', osm.noteURL(note.id)) + .attr('href', osm.noteURL(note)) .call(svgIcon('#iD-icon-out-link', 'inline')) .append('span') .text(t('info_panels.history.note_link_text')); From cde4caf168405418d1567921be8d7871b645e6da Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 11 Aug 2018 01:18:30 -0400 Subject: [PATCH 109/217] Moved the custom background code into ui/settings We are going to add a bunch more of these setting screens --- modules/index.js | 1 + modules/ui/background.js | 7 +++---- modules/ui/index.js | 1 - modules/ui/{custom.js => settings/custom_background.js} | 8 ++++---- modules/ui/settings/index.js | 1 + 5 files changed, 9 insertions(+), 9 deletions(-) rename modules/ui/{custom.js => settings/custom_background.js} (91%) create mode 100644 modules/ui/settings/index.js diff --git a/modules/index.js b/modules/index.js index dcd7f276e..da0e95a1e 100644 --- a/modules/index.js +++ b/modules/index.js @@ -15,6 +15,7 @@ export * from './svg/index'; export * from './ui/fields/index'; export * from './ui/intro/index'; export * from './ui/panels/index'; +export * from './ui/settings/index'; export * from './ui/index'; export * from './util/index'; export * from './lib/index'; diff --git a/modules/ui/background.js b/modules/ui/background.js index 00e2a9b01..ea33ef94f 100644 --- a/modules/ui/background.js +++ b/modules/ui/background.js @@ -17,12 +17,12 @@ import { svgIcon } from '../svg'; import { uiBackgroundDisplayOptions } from './background_display_options'; import { uiBackgroundOffset } from './background_offset'; import { uiCmd } from './cmd'; -import { uiCustom } from './custom'; import { uiDisclosure } from './disclosure'; import { uiHelp } from './help'; import { uiMapData } from './map_data'; import { uiMapInMap } from './map_in_map'; import { uiModal } from './modal'; +import { uiSettingsCustomBackground } from './settings/custom_background'; import { uiTooltipHtml } from './tooltipHtml'; import { utilCallWhenIdle } from '../util'; import { tooltip } from '../util/tooltip'; @@ -90,7 +90,6 @@ export function uiBackground(context) { function chooseBackground(d) { if (d.id === 'custom' && !d.template()) { return editCustom(); - } d3_event.preventDefault(); @@ -116,7 +115,7 @@ export function uiBackground(context) { d3_event.preventDefault(); context.container() - .call(uiCustom(context)); + .call(uiSettingsCustomBackground(context)); } @@ -153,7 +152,7 @@ export function uiBackground(context) { .placement((textDirection === 'rtl') ? 'right' : 'left') ) .on('click', editCustom) - .call(svgIcon('#iD-icon-edit')); + .call(svgIcon('#iD-icon-more')); enter.filter(function(d) { return d.best(); }) .append('div') diff --git a/modules/ui/index.js b/modules/ui/index.js index d82ddeca1..35d9a8517 100644 --- a/modules/ui/index.js +++ b/modules/ui/index.js @@ -11,7 +11,6 @@ export { uiCommitChanges } from './commit_changes'; export { uiCommitWarnings } from './commit_warnings'; export { uiConfirm } from './confirm'; export { uiConflicts } from './conflicts'; -export { uiCustom } from './custom'; export { uiContributors } from './contributors'; export { uiCurtain } from './curtain'; export { uiDisclosure } from './disclosure'; diff --git a/modules/ui/custom.js b/modules/ui/settings/custom_background.js similarity index 91% rename from modules/ui/custom.js rename to modules/ui/settings/custom_background.js index e85e5b92f..9e9f51478 100644 --- a/modules/ui/custom.js +++ b/modules/ui/settings/custom_background.js @@ -1,9 +1,9 @@ -import { t } from '../util/locale'; -import { uiBackground } from './background'; -import { uiModal } from './modal'; +import { t } from '../../util/locale'; +import { uiBackground } from '../background'; +import { uiModal } from '../modal'; -export function uiCustom(context) { +export function uiSettingsCustomBackground(context) { return function(selection) { diff --git a/modules/ui/settings/index.js b/modules/ui/settings/index.js new file mode 100644 index 000000000..52579d5d5 --- /dev/null +++ b/modules/ui/settings/index.js @@ -0,0 +1 @@ +export { uiSettingsCustomBackground } from './custom_background'; From 40c0c7d2f56514d75467d4835ad16024b8d0c673 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 11 Aug 2018 01:31:26 -0400 Subject: [PATCH 110/217] Fix the custom background translation strings --- data/core.yaml | 7 +++++-- dist/locales/en.json | 9 +++++++-- modules/ui/background.js | 2 +- modules/ui/settings/custom_background.js | 9 ++++++--- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 65889192a..db06b8ab9 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -434,8 +434,6 @@ en: best_imagery: Best known imagery source for this location switch: Switch back to this background custom: Custom - custom_button: Edit custom background - custom_prompt: "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" overlays: Overlays imagery_source_faq: Imagery Info / Report a Problem reset: reset @@ -514,6 +512,11 @@ en: full: description: Full Fill tooltip: "Areas are drawn fully filled." + settings: + custom_background: + tooltip: Edit custom background + heading: Custom Background Settings + instructions: "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" restore: heading: You have unsaved changes description: "Do you wish to restore unsaved changes from a previous editing session?" diff --git a/dist/locales/en.json b/dist/locales/en.json index ca31f31d8..dced16854 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -529,8 +529,6 @@ "best_imagery": "Best known imagery source for this location", "switch": "Switch back to this background", "custom": "Custom", - "custom_button": "Edit custom background", - "custom_prompt": "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}", "overlays": "Overlays", "imagery_source_faq": "Imagery Info / Report a Problem", "reset": "reset", @@ -632,6 +630,13 @@ "tooltip": "Areas are drawn fully filled." } }, + "settings": { + "custom_background": { + "tooltip": "Edit custom background", + "heading": "Custom Background Settings", + "instructions": "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" + } + }, "restore": { "heading": "You have unsaved changes", "description": "Do you wish to restore unsaved changes from a previous editing session?", diff --git a/modules/ui/background.js b/modules/ui/background.js index ea33ef94f..513ba8cc0 100644 --- a/modules/ui/background.js +++ b/modules/ui/background.js @@ -148,7 +148,7 @@ export function uiBackground(context) { .append('button') .attr('class', 'layer-browse') .call(tooltip() - .title(t('background.custom_button')) + .title(t('settings.custom_background.tooltip')) .placement((textDirection === 'rtl') ? 'right' : 'left') ) .on('click', editCustom) diff --git a/modules/ui/settings/custom_background.js b/modules/ui/settings/custom_background.js index 9e9f51478..09b2955c4 100644 --- a/modules/ui/settings/custom_background.js +++ b/modules/ui/settings/custom_background.js @@ -20,12 +20,16 @@ export function uiSettingsCustomBackground(context) { introModal .append('div') .attr('class','modal-section cf') - .append('h3').text(t('background.custom_heading')); + .append('h3') + .text(t('settings.custom_background.heading')); introModal .append('div') .attr('class','modal-section') - .append('p').text(t('background.custom_prompt', { example: example })) + .append('pre') + .text(t('settings.custom_background.instructions', { example: example })); + + introModal .append('textarea'); @@ -40,7 +44,6 @@ export function uiSettingsCustomBackground(context) { .append('div') .attr('class', 'modal-section'); - var cancelButton = buttonWrap .append('button') .attr('class', 'button-cancel') From 8af6d65e33b6a33d5bd64fea34aa533337b3f93d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 11 Aug 2018 11:38:05 -0400 Subject: [PATCH 111/217] Switch from uiModal to uiConfirm, adjust styles A few things going on in this commit: - uiConfirm already has an OK button, so I'm trying to use that instead of uiModal. - The confirm OK button cancels, which is maybe a problem. I might change it. - Dispatch a change event instead of trying to call a function back in uiBackground - Remove some of the custom css, since we already have some shared button css - add utilNoAuto to textarea (this just prevents autocomplete and other annoying behaviors especially in Safari) --- css/80_app.css | 34 +++----- data/core.yaml | 2 +- dist/locales/en.json | 2 +- modules/ui/confirm.js | 2 +- modules/ui/settings/custom_background.js | 105 +++++++++++------------ 5 files changed, 69 insertions(+), 76 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index aa788d190..2a78bdee8 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -3875,6 +3875,19 @@ svg.mouseclick use.right { } +/* Settings Modals +------------------------------------------------------- */ +.settings-custom-background .instructions { + margin-bottom: 20px; +} +.settings-custom-background textarea { + height: 60px; +} +.settings-custom-background .buttons .button.col3 { + float: none; /* undo float left */ +} + + /* Save Mode ------------------------------------------------------- */ .mode-save a.user-info { @@ -4603,23 +4616,4 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { color: #7092ff; } -.button-ok { - background-color: #6f92ff; /* Green */ - border: none; - color: white; - padding: 15px 15px; - text-align: center; - font-size: 16px; - -} -.button-ok:focus { - background-color: #c1d0ff; -} -.button-cancel { - background-color: #cccccc; /* Green */ - border: none; - color: white; - padding: 15px 15px; - text-align: center; - font-size: 16px; -} + diff --git a/data/core.yaml b/data/core.yaml index db06b8ab9..aa65817ca 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -515,7 +515,7 @@ en: settings: custom_background: tooltip: Edit custom background - heading: Custom Background Settings + header: Custom Background Settings instructions: "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" restore: heading: You have unsaved changes diff --git a/dist/locales/en.json b/dist/locales/en.json index dced16854..228732fc9 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -633,7 +633,7 @@ "settings": { "custom_background": { "tooltip": "Edit custom background", - "heading": "Custom Background Settings", + "header": "Custom Background Settings", "instructions": "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" } }, diff --git a/modules/ui/confirm.js b/modules/ui/confirm.js index 2fd0e4383..8eec4b6cd 100644 --- a/modules/ui/confirm.js +++ b/modules/ui/confirm.js @@ -23,7 +23,7 @@ export function uiConfirm(selection) { modalSelection.okButton = function() { buttons .append('button') - .attr('class', 'action col4') + .attr('class', 'button ok-button action col4') .on('click.confirm', function() { modalSelection.remove(); }) diff --git a/modules/ui/settings/custom_background.js b/modules/ui/settings/custom_background.js index 09b2955c4..bc94661fc 100644 --- a/modules/ui/settings/custom_background.js +++ b/modules/ui/settings/custom_background.js @@ -1,75 +1,74 @@ +import { dispatch as d3_dispatch } from 'd3-dispatch'; + import { t } from '../../util/locale'; -import { uiBackground } from '../background'; -import { uiModal } from '../modal'; +import { uiConfirm } from '../confirm'; +import { utilNoAuto, utilRebind } from '../../util'; export function uiSettingsCustomBackground(context) { + var dispatch = d3_dispatch('change'); - return function(selection) { + function render(selection) { var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; - var modalSelection = uiModal(selection); + var modal = uiConfirm(selection).okButton(); - modalSelection.select('.modal') - .attr('class', 'modal-splash modal col6'); + modal + .classed('settings-custom-background', true); - var introModal = modalSelection.select('.content') - .append('div') - .attr('class', 'fillL'); - - introModal - .append('div') - .attr('class','modal-section cf') + modal.select('.modal-section.header') .append('h3') - .text(t('settings.custom_background.heading')); + .text(t('settings.custom_background.header')); - introModal - .append('div') - .attr('class','modal-section') + + var textSection = modal.select('.modal-section.message-text'); + + textSection .append('pre') + .attr('class', 'instructions') .text(t('settings.custom_background.instructions', { example: example })); - introModal - .append('textarea'); + textSection + .append('textarea') + .call(utilNoAuto); - /*var textAreaWrap = introModal - .append('div') - .attr('class', 'modal-section'); + // insert a cancel button, and adjust the button widths + var buttonSection = modal.select('.modal-section.buttons'); - var urlArea = textAreaWrap - .append('textarea');*/ - - var buttonWrap = introModal - .append('div') - .attr('class', 'modal-section'); - - var cancelButton = buttonWrap - .append('button') - .attr('class', 'button-cancel') - .on('click', modalSelection.close); - - cancelButton - .append('div') - .text('Cancel'); - - var okButton = buttonWrap - .append('button') - .attr('class', 'button-ok') - .on('click', function() { - var template = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; - context.container().call(uiBackground.edit, template); - modalSelection.close(); - }); - - okButton - .append('div') - .text('OK'); + buttonSection + .insert('button', '.ok-button') + .attr('class', 'button col3 cancel-button secondary-action') + .text(t('confirm.cancel')); - modalSelection.select('button.close') - .attr('class','hide'); + buttonSection.select('.cancel-button') + .on('click.cancel', clickCancel); + + buttonSection.select('.ok-button') + .classed('col3', true) + .classed('col4', false) + .attr('disabled', isSaveDisabled) + .on('click.save', clickSave); - }; + function isSaveDisabled() { + return null; + } + + + function clickCancel() { + this.blur(); + modal.close(); + } + + + function clickSave() { + this.blur(); + modal.close(); + dispatch.call('change'); + } + } + + return utilRebind(render, dispatch, 'on'); } From eab7f3660b1eb7c615e37589133d3f874b02c56d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 11 Aug 2018 18:17:07 -0400 Subject: [PATCH 112/217] Put background settings into localstorage and dispatch change event --- css/80_app.css | 7 +++---- data/core.yaml | 4 +++- dist/locales/en.json | 5 ++++- modules/ui/background.js | 20 +++++++++++--------- modules/ui/settings/custom_background.js | 20 ++++++++++++++++---- 5 files changed, 37 insertions(+), 19 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 2a78bdee8..55bf424dc 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2553,6 +2553,8 @@ div.full-screen > button:hover { background-color: #ececec; } +.layer-list li.active button, +.layer-list li.switch button, .layer-list li.active, .layer-list li.switch { background: #e8ebff; @@ -2564,10 +2566,7 @@ div.full-screen > button:hover { float: right; } -[dir='rtl'] .list-item-gpx-browse svg { - transform: rotateY(180deg); -} - +[dir='rtl'] .list-item-gpx-browse svg, [dir='rtl'] .list-item-mvt-browse svg { transform: rotateY(180deg); } diff --git a/data/core.yaml b/data/core.yaml index aa65817ca..62285567c 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -516,7 +516,9 @@ en: custom_background: tooltip: Edit custom background header: Custom Background Settings - instructions: "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" + instructions: "Enter a tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n {-y} or {ty} for flipped TMS-style Y coordinates\n {u} for quadtile scheme\n {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" + template: + placeholder: Enter a url template restore: heading: You have unsaved changes description: "Do you wish to restore unsaved changes from a previous editing session?" diff --git a/dist/locales/en.json b/dist/locales/en.json index 228732fc9..630d9fe07 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -634,7 +634,10 @@ "custom_background": { "tooltip": "Edit custom background", "header": "Custom Background Settings", - "instructions": "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" + "instructions": "Enter a tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n {-y} or {ty} for flipped TMS-style Y coordinates\n {u} for quadtile scheme\n {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}", + "template": { + "placeholder": "Enter a url template" + } } }, "restore": { diff --git a/modules/ui/background.js b/modules/ui/background.js index 513ba8cc0..3dbc1c454 100644 --- a/modules/ui/background.js +++ b/modules/ui/background.js @@ -21,7 +21,6 @@ import { uiDisclosure } from './disclosure'; import { uiHelp } from './help'; import { uiMapData } from './map_data'; import { uiMapInMap } from './map_in_map'; -import { uiModal } from './modal'; import { uiSettingsCustomBackground } from './settings/custom_background'; import { uiTooltipHtml } from './tooltipHtml'; import { utilCallWhenIdle } from '../util'; @@ -43,6 +42,9 @@ export function uiBackground(context) { var backgroundDisplayOptions = uiBackgroundDisplayOptions(context); var backgroundOffset = uiBackgroundOffset(context); + var settingsCustomBackground = uiSettingsCustomBackground(context) + .on('change', customChanged); + function setTooltips(selection) { selection.each(function(d, i, nodes) { @@ -101,21 +103,22 @@ export function uiBackground(context) { document.activeElement.blur(); } - function edit(a, template) { - if (template) { - context.storage('background-custom-template', template); - _customSource.template(template); + + function customChanged(d) { + if (d && d.template) { + _customSource.template(d.template); chooseBackground(_customSource); } else { - _backgroundList.call(updateLayerSelections); + _customSource.template(''); + chooseBackground(context.background().findSource('none')); } } + function editCustom() { d3_event.preventDefault(); - context.container() - .call(uiSettingsCustomBackground(context)); + .call(settingsCustomBackground); } @@ -420,7 +423,6 @@ export function uiBackground(context) { uiBackground.hidePane = hidePane; uiBackground.togglePane = togglePane; uiBackground.setVisible = setVisible; - uiBackground.edit = edit; } return background; diff --git a/modules/ui/settings/custom_background.js b/modules/ui/settings/custom_background.js index bc94661fc..e69176053 100644 --- a/modules/ui/settings/custom_background.js +++ b/modules/ui/settings/custom_background.js @@ -1,3 +1,5 @@ +import _cloneDeep from 'lodash-es/cloneDeep'; + import { dispatch as d3_dispatch } from 'd3-dispatch'; import { t } from '../../util/locale'; @@ -8,8 +10,11 @@ import { utilNoAuto, utilRebind } from '../../util'; export function uiSettingsCustomBackground(context) { var dispatch = d3_dispatch('change'); - function render(selection) { + var _origSettings = { + template: context.storage('background-custom-template') + }; + var _currSettings = _cloneDeep(_origSettings); var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; var modal = uiConfirm(selection).okButton(); @@ -30,7 +35,9 @@ export function uiSettingsCustomBackground(context) { textSection .append('textarea') - .call(utilNoAuto); + .attr('placeholder', t('settings.custom_background.template.placeholder')) + .call(utilNoAuto) + .property('value', _currSettings.template); // insert a cancel button, and adjust the button widths @@ -57,16 +64,21 @@ export function uiSettingsCustomBackground(context) { } + // restore the original template function clickCancel() { + textSection.select('textarea').property('value', _origSettings.template); + context.storage('background-custom-template', _origSettings.template); this.blur(); modal.close(); } - + // accept the current template function clickSave() { + _currSettings.template = textSection.select('textarea').property('value'); + context.storage('background-custom-template', _currSettings.template); this.blur(); modal.close(); - dispatch.call('change'); + dispatch.call('change', this, _currSettings); } } From 930e865b42c3ccc6524ad4b2360c609c8a608869 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 11 Aug 2018 19:15:18 -0400 Subject: [PATCH 113/217] Attempt to prevent users from uploading duplicate changes (closes #5200) This removes a users changes stored in localStorage if they try to close iD while an upload is in progress. It prevents the possiblity that the changeset is eventually accepted and closed, but the user can be prompted to restore those changes the next time they start iD. --- modules/core/context.js | 7 +++++++ modules/services/osm.js | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/modules/core/context.js b/modules/core/context.js index ad03eef3f..bb127b6d9 100644 --- a/modules/core/context.js +++ b/modules/core/context.js @@ -201,6 +201,13 @@ export function coreContext() { var canSave; if (mode && mode.id === 'save') { canSave = false; + + // Attempt to prevent user from creating duplicate changes - see #5200 + if (services.osm && services.osm.isChangesetInflight()) { + history.clearSaved(); + return; + } + } else { canSave = context.selectedIDs().every(function(id) { var entity = context.hasEntity(id); diff --git a/modules/services/osm.js b/modules/services/osm.js index 3b5121536..7579b6051 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -985,6 +985,11 @@ export default { }, + isChangesetInflight: function() { + return !!_changeset.inflight; + }, + + // get/set cached data // This is used to save/restore the state when entering/exiting the walkthrough // Also used for testing purposes. From 8d711981bf85677edd6ed5157e666c1b5246a5e2 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 12 Aug 2018 11:23:38 -0400 Subject: [PATCH 114/217] Change `stars` from integer field to combo, support capital 'S' (closes #5216) --- data/presets/fields.json | 2 +- data/presets/fields/stars.json | 3 +-- modules/services/taginfo.js | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/data/presets/fields.json b/data/presets/fields.json index 0a8b93d1f..ebfc9ddb1 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -252,7 +252,7 @@ "sport_racing_motor": {"key": "sport", "type": "semiCombo", "label": "Sports", "options": ["motor", "karting", "motocross"]}, "sport_racing_nonmotor": {"key": "sport", "type": "semiCombo", "label": "Sports", "options": ["bmx", "cycling", "dog_racing", "horse_racing", "running"]}, "sport": {"key": "sport", "type": "semiCombo", "label": "Sports"}, - "stars": {"key": "stars", "type": "number", "minValue": 0, "label": "Stars"}, + "stars": {"key": "stars", "type": "combo", "label": "Stars"}, "start_date": {"key": "start_date", "type": "text", "universal": true, "label": "Start Date"}, "step_count": {"key": "step_count", "type": "number", "minValue": 0, "label": "Number of Steps"}, "stop": {"key": "stop", "type": "combo", "label": "Stop Type", "strings": {"options": {"all": "All Ways", "minor": "Minor Road"}}}, diff --git a/data/presets/fields/stars.json b/data/presets/fields/stars.json index 2e38d232d..237dee393 100644 --- a/data/presets/fields/stars.json +++ b/data/presets/fields/stars.json @@ -1,6 +1,5 @@ { "key": "stars", - "type": "number", - "minValue": 0, + "type": "combo", "label": "Stars" } diff --git a/modules/services/taginfo.js b/modules/services/taginfo.js index 88c0c6c5b..594cd54a5 100644 --- a/modules/services/taginfo.js +++ b/modules/services/taginfo.js @@ -264,7 +264,7 @@ export default { // A few OSM keys expect values to contain uppercase values (see #3377). // This is not an exhaustive list (e.g. `name` also has uppercase values) // but these are the fields where taginfo value lookup is most useful. - var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|booth|rating|:output|_hours|_times/; + var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|booth|rating|stars|:output|_hours|_times/; var allowUpperCase = (params.key.match(re) !== null); var f = filterValues(allowUpperCase); From bbe86510a37c814d5fb13874d592302d07c0c13b Mon Sep 17 00:00:00 2001 From: john gravois Date: Mon, 13 Aug 2018 09:25:07 -0700 Subject: [PATCH 115/217] remove ?blankTile=false and space from tilemap url to fix 404 --- modules/renderer/background_source.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/renderer/background_source.js b/modules/renderer/background_source.js index 005500a9a..fc8f07967 100644 --- a/modules/renderer/background_source.js +++ b/modules/renderer/background_source.js @@ -330,8 +330,8 @@ rendererBackgroundSource.Esri = function(data) { var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z))); var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z))); - // fetch an 8x8 grid because responses to leverage cache - var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+/, 'tilemap') + '/' + z + '/' + y + ' /' + x + '/8/8'; + // fetch an 8x8 grid to leverage cache + var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8'; // make the request and introspect the response from the tilemap server d3_json(tilemapUrl, function (err, tilemap) { From 64b34e86b793bc08e6834add3fb552398d2b0934 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 13 Aug 2018 14:40:47 -0400 Subject: [PATCH 116/217] Update to rollup v0.64.1 (closes #5210) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9ba56231..2e9f860e3 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "osm-community-index": "0.4.6", "phantomjs-prebuilt": "~2.1.11", "request": "^2.85.0", - "rollup": "~0.63.2", + "rollup": "~0.64.1", "rollup-plugin-commonjs": "^9.0.0", "rollup-plugin-includepaths": "~0.2.3", "rollup-plugin-json": "^3.0.0", From 121287fe9768a94038a0e269a8f10cd2a99786bc Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 13 Aug 2018 15:03:57 -0400 Subject: [PATCH 117/217] Support `access=permit` in access and access_simple fields (closes #5223) --- data/presets.yaml | 19 ++++++++++++------- data/presets/fields.json | 4 ++-- data/presets/fields/access.json | 18 +++++++++++------- data/presets/fields/access_simple.json | 2 +- data/taginfo.json | 9 +++++++++ dist/locales/en.json | 18 +++++++++++------- modules/ui/fields/access.js | 2 +- 7 files changed, 47 insertions(+), 25 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index f736c3a32..14fe61c70 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -36,37 +36,42 @@ en: options: designated: # access=designated - description: Access permitted according to signs or specific local laws + description: Access allowed according to signs or specific local laws # access=designated title: Designated destination: # access=destination - description: Access permitted only to reach a destination + description: Access allowed only to reach a destination # access=destination title: Destination dismount: # access=dismount - description: Access permitted but rider must dismount + description: Access allowed but rider must dismount # access=dismount title: Dismount 'no': # access=no - description: Access not permitted to the general public + description: Access not allowed to the general public # access=no title: Prohibited permissive: # access=permissive - description: Access permitted until such time as the owner revokes the permission + description: Access allowed until such time as the owner revokes the permission # access=permissive title: Permissive + permit: + # access=permit + description: Access allowed only with a valid permit or license + # access=permit + title: Permit private: # access=private - description: Access permitted only with permission of the owner on an individual basis + description: Access allowed only with permission of the owner on an individual basis # access=private title: Private 'yes': # access=yes - description: Access permitted by law; a right of way + description: Access allowed by law; a right of way # access=yes title: Allowed # access field placeholder diff --git a/data/presets/fields.json b/data/presets/fields.json index ebfc9ddb1..8698d74ff 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -1,7 +1,7 @@ { "fields": { - "access_simple": {"key": "access", "type": "combo", "label": "Allowed Access", "options": ["yes", "permissive", "private", "customers", "no"]}, - "access": {"keys": ["access", "foot", "motor_vehicle", "bicycle", "horse"], "reference": {"key": "access"}, "type": "access", "label": "Allowed Access", "placeholder": "Not Specified", "strings": {"types": {"access": "All", "foot": "Foot", "motor_vehicle": "Motor Vehicles", "bicycle": "Bicycles", "horse": "Horses"}, "options": {"yes": {"title": "Allowed", "description": "Access permitted by law; a right of way"}, "no": {"title": "Prohibited", "description": "Access not permitted to the general public"}, "permissive": {"title": "Permissive", "description": "Access permitted until such time as the owner revokes the permission"}, "private": {"title": "Private", "description": "Access permitted only with permission of the owner on an individual basis"}, "designated": {"title": "Designated", "description": "Access permitted according to signs or specific local laws"}, "destination": {"title": "Destination", "description": "Access permitted only to reach a destination"}, "dismount": {"title": "Dismount", "description": "Access permitted but rider must dismount"}}}}, + "access_simple": {"key": "access", "type": "combo", "label": "Allowed Access", "options": ["yes", "permissive", "private", "customers", "permit", "no"]}, + "access": {"keys": ["access", "foot", "motor_vehicle", "bicycle", "horse"], "reference": {"key": "access"}, "type": "access", "label": "Allowed Access", "placeholder": "Not Specified", "strings": {"types": {"access": "All", "foot": "Foot", "motor_vehicle": "Motor Vehicles", "bicycle": "Bicycles", "horse": "Horses"}, "options": {"yes": {"title": "Allowed", "description": "Access allowed by law; a right of way"}, "no": {"title": "Prohibited", "description": "Access not allowed to the general public"}, "permissive": {"title": "Permissive", "description": "Access allowed until such time as the owner revokes the permission"}, "private": {"title": "Private", "description": "Access allowed only with permission of the owner on an individual basis"}, "designated": {"title": "Designated", "description": "Access allowed according to signs or specific local laws"}, "destination": {"title": "Destination", "description": "Access allowed only to reach a destination"}, "dismount": {"title": "Dismount", "description": "Access allowed but rider must dismount"}, "permit": {"title": "Permit", "description": "Access allowed only with a valid permit or license"}}}}, "address": {"type": "address", "keys": ["addr:block_number", "addr:city", "addr:block_number", "addr:conscriptionnumber", "addr:county", "addr:country", "addr:county", "addr:district", "addr:floor", "addr:hamlet", "addr:housename", "addr:housenumber", "addr:neighbourhood", "addr:place", "addr:postcode", "addr:province", "addr:quarter", "addr:state", "addr:street", "addr:subdistrict", "addr:suburb", "addr:unit"], "reference": {"key": "addr"}, "icon": "address", "universal": true, "label": "Address", "strings": {"placeholders": {"block_number": "Block Number", "block_number!jp": "Block No.", "city": "City", "city!jp": "City/Town/Village/Tokyo Special Ward", "city!vn": "City/Town", "conscriptionnumber": "123", "country": "Country", "county": "County", "county!jp": "District", "district": "District", "district!vn": "Arrondissement/Town/District", "floor": "Floor", "hamlet": "Hamlet", "housename": "Housename", "housenumber": "123", "housenumber!jp": "Building No./Lot No.", "neighbourhood": "Neighbourhood", "neighbourhood!jp": "Chōme/Aza/Koaza", "place": "Place", "postcode": "Postcode", "province": "Province", "province!jp": "Prefecture", "quarter": "Quarter", "quarter!jp": "Ōaza/Machi", "state": "State", "street": "Street", "subdistrict": "Subdistrict", "subdistrict!vn": "Ward/Commune/Townlet", "suburb": "Suburb", "suburb!jp": "Ward", "unit": "Unit"}}}, "admin_level": {"key": "admin_level", "type": "number", "minValue": 1, "label": "Admin Level"}, "aerialway": {"key": "aerialway", "type": "typeCombo", "label": "Type"}, diff --git a/data/presets/fields/access.json b/data/presets/fields/access.json index 8615abfa7..776d58ca3 100644 --- a/data/presets/fields/access.json +++ b/data/presets/fields/access.json @@ -15,31 +15,35 @@ "options": { "yes": { "title": "Allowed", - "description": "Access permitted by law; a right of way" + "description": "Access allowed by law; a right of way" }, "no": { "title": "Prohibited", - "description": "Access not permitted to the general public" + "description": "Access not allowed to the general public" }, "permissive": { "title": "Permissive", - "description": "Access permitted until such time as the owner revokes the permission" + "description": "Access allowed until such time as the owner revokes the permission" }, "private": { "title": "Private", - "description": "Access permitted only with permission of the owner on an individual basis" + "description": "Access allowed only with permission of the owner on an individual basis" }, "designated": { "title": "Designated", - "description": "Access permitted according to signs or specific local laws" + "description": "Access allowed according to signs or specific local laws" }, "destination": { "title": "Destination", - "description": "Access permitted only to reach a destination" + "description": "Access allowed only to reach a destination" }, "dismount": { "title": "Dismount", - "description": "Access permitted but rider must dismount" + "description": "Access allowed but rider must dismount" + }, + "permit": { + "title": "Permit", + "description": "Access allowed only with a valid permit or license" } } } diff --git a/data/presets/fields/access_simple.json b/data/presets/fields/access_simple.json index fa6bcbf83..d3ef2cfb8 100644 --- a/data/presets/fields/access_simple.json +++ b/data/presets/fields/access_simple.json @@ -2,5 +2,5 @@ "key": "access", "type": "combo", "label": "Allowed Access", - "options": ["yes", "permissive", "private", "customers", "no"] + "options": ["yes", "permissive", "private", "customers", "permit", "no"] } diff --git a/data/taginfo.json b/data/taginfo.json index d34753815..fbdd0389b 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -6252,6 +6252,7 @@ {"key": "access", "value": "designated", "description": "Allowed Access"}, {"key": "access", "value": "destination", "description": "Allowed Access"}, {"key": "access", "value": "dismount", "description": "Allowed Access"}, + {"key": "access", "value": "permit", "description": "Allowed Access"}, {"key": "foot", "value": "yes", "description": "Allowed Access"}, {"key": "foot", "value": "no", "description": "Allowed Access"}, {"key": "foot", "value": "permissive", "description": "Allowed Access"}, @@ -6259,6 +6260,7 @@ {"key": "foot", "value": "designated", "description": "Allowed Access"}, {"key": "foot", "value": "destination", "description": "Allowed Access"}, {"key": "foot", "value": "dismount", "description": "Allowed Access"}, + {"key": "foot", "value": "permit", "description": "Allowed Access"}, {"key": "motor_vehicle", "value": "yes", "description": "Allowed Access"}, {"key": "motor_vehicle", "value": "no", "description": "Allowed Access"}, { @@ -6286,6 +6288,11 @@ "value": "dismount", "description": "Allowed Access" }, + { + "key": "motor_vehicle", + "value": "permit", + "description": "Allowed Access" + }, {"key": "bicycle", "value": "yes", "description": "Allowed Access"}, {"key": "bicycle", "value": "no", "description": "Allowed Access"}, {"key": "bicycle", "value": "permissive", "description": "Allowed Access"}, @@ -6293,6 +6300,7 @@ {"key": "bicycle", "value": "designated", "description": "Allowed Access"}, {"key": "bicycle", "value": "destination", "description": "Allowed Access"}, {"key": "bicycle", "value": "dismount", "description": "Allowed Access"}, + {"key": "bicycle", "value": "permit", "description": "Allowed Access"}, {"key": "horse", "value": "yes", "description": "Allowed Access"}, {"key": "horse", "value": "no", "description": "Allowed Access"}, {"key": "horse", "value": "permissive", "description": "Allowed Access"}, @@ -6300,6 +6308,7 @@ {"key": "horse", "value": "designated", "description": "Allowed Access"}, {"key": "horse", "value": "destination", "description": "Allowed Access"}, {"key": "horse", "value": "dismount", "description": "Allowed Access"}, + {"key": "horse", "value": "permit", "description": "Allowed Access"}, {"key": "addr:block_number", "description": "Address"}, {"key": "addr:city", "description": "Address"}, {"key": "addr:conscriptionnumber", "description": "Address"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 630d9fe07..ca551b5a0 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1473,31 +1473,35 @@ "options": { "yes": { "title": "Allowed", - "description": "Access permitted by law; a right of way" + "description": "Access allowed by law; a right of way" }, "no": { "title": "Prohibited", - "description": "Access not permitted to the general public" + "description": "Access not allowed to the general public" }, "permissive": { "title": "Permissive", - "description": "Access permitted until such time as the owner revokes the permission" + "description": "Access allowed until such time as the owner revokes the permission" }, "private": { "title": "Private", - "description": "Access permitted only with permission of the owner on an individual basis" + "description": "Access allowed only with permission of the owner on an individual basis" }, "designated": { "title": "Designated", - "description": "Access permitted according to signs or specific local laws" + "description": "Access allowed according to signs or specific local laws" }, "destination": { "title": "Destination", - "description": "Access permitted only to reach a destination" + "description": "Access allowed only to reach a destination" }, "dismount": { "title": "Dismount", - "description": "Access permitted but rider must dismount" + "description": "Access allowed but rider must dismount" + }, + "permit": { + "title": "Permit", + "description": "Access allowed only with a valid permit or license" } } }, diff --git a/modules/ui/fields/access.js b/modules/ui/fields/access.js index 11fa0c29d..4df935d45 100644 --- a/modules/ui/fields/access.js +++ b/modules/ui/fields/access.js @@ -81,7 +81,7 @@ export function uiFieldAccess(field, context) { access.options = function(type) { - var options = ['no', 'permissive', 'private', 'destination']; + var options = ['no', 'permissive', 'private', 'permit', 'destination']; if (type !== 'access') { options.unshift('yes'); From 24f09fd6ecd8cbd1f9665c62fca452a8c7be6288 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 13 Aug 2018 16:11:53 -0400 Subject: [PATCH 118/217] Add simple access field for several presets (campsite, picnic, bbq) --- data/presets/presets.json | 18 +++++++++--------- data/presets/presets/amenity/bbq.json | 3 ++- .../presets/presets/amenity/hunting_stand.json | 3 +++ data/presets/presets/amenity/shower.json | 3 ++- data/presets/presets/leisure/firepit.json | 3 +++ data/presets/presets/leisure/slipway.json | 3 +++ data/presets/presets/tourism/camp_site.json | 1 + data/presets/presets/tourism/picnic_site.json | 2 ++ 8 files changed, 25 insertions(+), 11 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index c032e2050..23a674734 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -48,7 +48,7 @@ "amenity/atm": {"icon": "maki-bank", "fields": ["operator", "network", "cash_in", "currency_multi", "drive_through"], "geometry": ["point", "vertex"], "terms": ["money", "cash", "machine"], "tags": {"amenity": "atm"}, "name": "ATM"}, "amenity/bank": {"icon": "maki-bank", "fields": ["name", "atm", "operator", "address", "building_area", "opening_hours", "drive_through"], "geometry": ["point", "area"], "terms": ["credit union", "check", "deposit", "fund", "investment", "repository", "reserve", "safe", "savings", "stock", "treasury", "trust", "vault"], "tags": {"amenity": "bank"}, "name": "Bank"}, "amenity/bar": {"icon": "maki-bar", "fields": ["name", "operator", "address", "building_area", "opening_hours", "smoking", "outdoor_seating", "brewery"], "geometry": ["point", "area"], "terms": ["dive", "beer", "bier", "booze"], "tags": {"amenity": "bar"}, "name": "Bar"}, - "amenity/bbq": {"icon": "maki-bbq", "fields": ["covered", "fuel"], "geometry": ["point"], "terms": ["bbq", "grill"], "tags": {"amenity": "bbq"}, "name": "Barbecue/Grill"}, + "amenity/bbq": {"icon": "maki-bbq", "fields": ["covered", "fuel", "access_simple"], "geometry": ["point"], "terms": ["bbq", "grill"], "tags": {"amenity": "bbq"}, "name": "Barbecue/Grill"}, "amenity/bench": {"icon": "temaki-bench", "fields": ["backrest"], "geometry": ["point", "vertex", "line"], "terms": ["seat"], "tags": {"amenity": "bench"}, "name": "Bench"}, "amenity/bicycle_parking": {"icon": "maki-bicycle", "fields": ["bicycle_parking", "capacity", "operator", "covered", "access_simple"], "geometry": ["point", "vertex", "area"], "terms": ["bike"], "tags": {"amenity": "bicycle_parking"}, "name": "Bicycle Parking"}, "amenity/bicycle_rental": {"icon": "maki-bicycle", "fields": ["capacity", "network", "operator", "payment_multi"], "geometry": ["point", "vertex", "area"], "terms": ["bike"], "tags": {"amenity": "bicycle_rental"}, "name": "Bicycle Rental"}, @@ -88,7 +88,7 @@ "amenity/grave_yard": {"icon": "maki-cemetery", "fields": ["religion", "denomination"], "geometry": ["point", "area"], "tags": {"amenity": "grave_yard"}, "name": "Graveyard"}, "amenity/grit_bin": {"fields": ["access_simple"], "geometry": ["point", "vertex"], "tags": {"amenity": "grit_bin"}, "terms": ["salt", "sand"], "name": "Grit Bin"}, "amenity/hospital": {"icon": "maki-hospital", "fields": ["name", "operator", "healthcare/speciality", "address", "emergency"], "geometry": ["point", "area"], "terms": ["clinic", "doctor", "emergency room", "health", "infirmary", "institution", "sanatorium", "sanitarium", "sick", "surgery", "ward"], "tags": {"amenity": "hospital"}, "addTags": {"amenity": "hospital", "healthcare": "hospital"}, "removeTags": {"amenity": "hospital", "healthcare": "hospital"}, "reference": {"key": "amenity", "value": "hospital"}, "name": "Hospital Grounds"}, - "amenity/hunting_stand": {"icon": "temaki-binoculars", "geometry": ["point", "vertex", "area"], "terms": ["game", "gun", "lookout", "rifle", "shoot*", "wild", "watch"], "tags": {"amenity": "hunting_stand"}, "name": "Hunting Stand"}, + "amenity/hunting_stand": {"icon": "temaki-binoculars", "fields": ["access_simple"], "geometry": ["point", "vertex", "area"], "terms": ["game", "gun", "lookout", "rifle", "shoot*", "wild", "watch"], "tags": {"amenity": "hunting_stand"}, "name": "Hunting Stand"}, "amenity/ice_cream": {"icon": "maki-ice-cream", "fields": ["name", "address", "building_area", "opening_hours", "takeaway", "delivery", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["gelato", "sorbet", "sherbet", "frozen", "yogurt"], "tags": {"amenity": "ice_cream"}, "name": "Ice Cream Shop"}, "amenity/internet_cafe": {"icon": "temaki-antenna", "fields": ["name", "operator", "address", "building_area", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["cybercafe", "taxiphone", "teleboutique", "coffee", "cafe", "net", "lanhouse"], "tags": {"amenity": "internet_cafe"}, "name": "Internet Cafe"}, "amenity/kindergarten": {"icon": "maki-school", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["kindergarden", "pre-school"], "tags": {"amenity": "kindergarten"}, "name": "Preschool/Kindergarten Grounds"}, @@ -128,7 +128,7 @@ "amenity/sanitary_dump_station": {"icon": "temaki-storage_tank", "fields": ["operator", "access_simple", "fee", "water_point"], "geometry": ["point", "vertex", "area"], "terms": ["Motor Home", "Camper", "Sanitary", "Dump Station", "Elsan", "CDP", "CTDP", "Chemical Toilet"], "tags": {"amenity": "sanitary_dump_station"}, "name": "RV Toilet Disposal"}, "amenity/school": {"icon": "maki-school", "fields": ["name", "operator", "address", "religion", "denomination"], "geometry": ["point", "area"], "terms": ["academy", "elementary school", "middle school", "high school"], "tags": {"amenity": "school"}, "name": "School Grounds"}, "amenity/shelter": {"icon": "maki-shelter", "fields": ["name", "shelter_type", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "terms": ["lean-to", "gazebo", "picnic"], "tags": {"amenity": "shelter"}, "name": "Shelter"}, - "amenity/shower": {"icon": "temaki-shower", "fields": ["operator", "opening_hours", "fee", "supervised", "building_area"], "geometry": ["point", "vertex", "area"], "terms": ["rain closet"], "tags": {"amenity": "shower"}, "name": "Shower"}, + "amenity/shower": {"icon": "temaki-shower", "fields": ["operator", "opening_hours", "fee", "supervised", "building_area", "access_simple"], "geometry": ["point", "vertex", "area"], "terms": ["rain closet"], "tags": {"amenity": "shower"}, "name": "Shower"}, "amenity/smoking_area": {"icon": "fas-smoking", "fields": ["name", "shelter", "bin", "bench", "opening_hours"], "geometry": ["point", "vertex", "area"], "terms": [], "tags": {"amenity": "smoking_area"}, "name": "Smoking Area"}, "amenity/social_facility": {"icon": "temaki-social_facility", "fields": ["name", "operator", "address", "building_area", "social_facility", "social_facility_for", "opening_hours", "wheelchair"], "geometry": ["point", "area"], "terms": [], "tags": {"amenity": "social_facility"}, "name": "Social Facility"}, "amenity/social_facility/food_bank": {"icon": "temaki-social_facility", "fields": ["name", "operator", "address", "building_area", "social_facility", "social_facility_for", "opening_hours"], "geometry": ["point", "area"], "terms": [], "tags": {"amenity": "social_facility", "social_facility": "food_bank"}, "reference": {"key": "social_facility", "value": "food_bank"}, "name": "Food Bank"}, @@ -470,7 +470,7 @@ "leisure/dance": {"icon": "maki-music", "fields": ["name", "operator", "address", "building_area", "dance/style", "opening_hours"], "geometry": ["point", "area"], "terms": ["ballroom", "jive", "swing", "tango", "waltz"], "tags": {"leisure": "dance"}, "name": "Dance Hall"}, "leisure/dancing_school": {"icon": "maki-music", "fields": ["name", "operator", "address", "opening_hours", "dance/style"], "geometry": ["point", "area"], "terms": ["jive", "swing", "tango", "waltz", "dance teaching"], "tags": {"leisure": "dance", "dance:teaching": "yes"}, "reference": {"key": "leisure", "value": "dance"}, "name": "Dance School"}, "leisure/dog_park": {"icon": "maki-dog-park", "geometry": ["point", "area"], "fields": ["name"], "terms": [], "tags": {"leisure": "dog_park"}, "name": "Dog Park"}, - "leisure/firepit": {"icon": "maki-fire-station", "geometry": ["point", "area"], "tags": {"leisure": "firepit"}, "terms": ["fireplace", "campfire"], "name": "Firepit"}, + "leisure/firepit": {"icon": "maki-fire-station", "fields": ["access_simple"], "geometry": ["point", "area"], "tags": {"leisure": "firepit"}, "terms": ["fireplace", "campfire"], "name": "Firepit"}, "leisure/fitness_centre": {"icon": "maki-pitch", "fields": ["name", "sport", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "fitness_centre"}, "terms": ["health", "gym", "leisure", "studio"], "name": "Gym / Fitness Center"}, "leisure/fitness_centre/yoga": {"icon": "maki-pitch", "fields": ["name", "sport", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["studio"], "tags": {"leisure": "fitness_centre", "sport": "yoga"}, "reference": {"key": "sport", "value": "yoga"}, "name": "Yoga Studio"}, "leisure/fitness_station": {"icon": "maki-pitch", "fields": ["fitness_station", "ref", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "fitness_station"}, "addTags": {"leisure": "fitness_station", "sport": "fitness"}, "removeTags": {"leisure": "fitness_station", "sport": "fitness"}, "reference": {"key": "leisure", "value": "fitness_station"}, "terms": ["exercise", "fitness", "gym", "trim trail"], "name": "Outdoor Fitness Station"}, @@ -516,7 +516,7 @@ "leisure/resort": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "resort"}, "name": "Resort"}, "leisure/running_track": {"icon": "maki-pitch", "fields": ["surface", "sport_racing_nonmotor", "lit", "width", "lanes"], "geometry": ["point", "line", "area"], "tags": {"leisure": "track", "sport": "running"}, "terms": ["race*", "running", "sprint", "track"], "name": "Racetrack (Running)"}, "leisure/sauna": {"icon": "fas-thermometer-three-quarters", "fields": ["name", "operator", "address", "opening_hours", "access_simple", "fee"], "geometry": ["point", "area"], "tags": {"leisure": "sauna"}, "name": "Sauna"}, - "leisure/slipway": {"icon": "temaki-beach", "geometry": ["point", "line"], "terms": ["boat launch", "boat ramp"], "tags": {"leisure": "slipway"}, "name": "Slipway"}, + "leisure/slipway": {"icon": "temaki-beach", "fields": ["access_simple"], "geometry": ["point", "line"], "terms": ["boat launch", "boat ramp"], "tags": {"leisure": "slipway"}, "name": "Slipway"}, "leisure/sports_centre": {"icon": "maki-pitch", "fields": ["name", "sport", "building", "address", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "sports_centre"}, "terms": [], "name": "Sports Center / Complex"}, "leisure/sports_centre/swimming": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "building"], "geometry": ["point", "area"], "terms": ["dive", "water"], "tags": {"leisure": "sports_centre", "sport": "swimming"}, "reference": {"key": "sport", "value": "swimming"}, "name": "Swimming Pool Facility"}, "leisure/stadium": {"icon": "maki-pitch", "fields": ["name", "sport", "address"], "geometry": ["point", "area"], "tags": {"leisure": "stadium"}, "name": "Stadium"}, @@ -876,7 +876,7 @@ "tourism/aquarium": {"icon": "maki-aquarium", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["fish", "sea", "water"], "tags": {"tourism": "aquarium"}, "name": "Aquarium"}, "tourism/artwork": {"icon": "maki-art-gallery", "fields": ["name", "artwork_type", "artist"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork"}, "terms": ["mural", "sculpture", "statue"], "name": "Artwork"}, "tourism/attraction": {"icon": "maki-star", "fields": ["name", "operator", "address"], "geometry": ["point", "vertex", "area"], "tags": {"tourism": "attraction"}, "name": "Tourist Attraction"}, - "tourism/camp_site": {"icon": "maki-campsite", "fields": ["name", "operator", "address", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["tent", "rv"], "tags": {"tourism": "camp_site"}, "name": "Campground"}, + "tourism/camp_site": {"icon": "maki-campsite", "fields": ["name", "operator", "address", "access_simple", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["tent", "rv"], "tags": {"tourism": "camp_site"}, "name": "Campground"}, "tourism/caravan_site": {"icon": "maki-bus", "fields": ["name", "operator", "address", "capacity", "fee", "sanitary_dump_station", "power_supply", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["Motor Home", "Camper"], "tags": {"tourism": "caravan_site"}, "name": "RV Park"}, "tourism/chalet": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area", "smoking", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "terms": ["holiday", "holiday cottage", "holiday home", "vacation", "vacation home"], "tags": {"tourism": "chalet"}, "name": "Holiday Cottage"}, "tourism/gallery": {"icon": "maki-art-gallery", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["art*", "exhibit*", "paint*", "photo*", "sculpt*"], "tags": {"tourism": "gallery"}, "name": "Art Gallery"}, @@ -890,7 +890,7 @@ "tourism/information/office": {"icon": "maki-information", "fields": ["name", "operator", "address", "building_area"], "geometry": ["point", "vertex", "area"], "tags": {"tourism": "information", "information": "office"}, "reference": {"key": "information", "value": "office"}, "name": "Tourist Information Office"}, "tourism/motel": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"tourism": "motel"}, "name": "Motel"}, "tourism/museum": {"icon": "maki-museum", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["art*", "exhibit*", "gallery", "foundation", "hall", "institution", "paint*", "photo*", "sculpt*"], "tags": {"tourism": "museum"}, "name": "Museum"}, - "tourism/picnic_site": {"icon": "maki-picnic-site", "fields": ["name", "operator", "address", "smoking"], "geometry": ["point", "vertex", "area"], "terms": ["camp"], "tags": {"tourism": "picnic_site"}, "name": "Picnic Site"}, + "tourism/picnic_site": {"icon": "maki-picnic-site", "fields": ["name", "operator", "address", "access_simple", "capacity", "smoking"], "geometry": ["point", "vertex", "area"], "terms": ["camp"], "tags": {"tourism": "picnic_site"}, "name": "Picnic Site"}, "tourism/theme_park": {"icon": "maki-amusement-park", "fields": ["name", "operator", "address", "opening_hours"], "geometry": ["point", "area"], "tags": {"tourism": "theme_park"}, "name": "Theme Park"}, "tourism/trail_riding_station": {"icon": "maki-horse-riding", "fields": ["name", "horse_stables", "horse_riding", "horse_dressage", "address", "phone", "website", "description"], "geometry": ["point", "area"], "tags": {"tourism": "trail_riding_station"}, "name": "Trail Riding Station", "matchScore": 2}, "tourism/viewpoint": {"icon": "temaki-binoculars", "geometry": ["point", "vertex"], "fields": ["direction"], "tags": {"tourism": "viewpoint"}, "name": "Viewpoint"}, @@ -4312,8 +4312,8 @@ "tourism/attraction/Хозяйственный двор": {"tags": {"name": "Хозяйственный двор", "tourism": "attraction"}, "name": "Хозяйственный двор", "icon": "maki-star", "geometry": ["point", "vertex", "area"], "fields": ["name", "operator", "address"], "suggestion": true}, "tourism/attraction/Часовня": {"tags": {"name": "Часовня", "tourism": "attraction"}, "name": "Часовня", "icon": "maki-star", "geometry": ["point", "vertex", "area"], "fields": ["name", "operator", "address"], "suggestion": true}, "tourism/attraction/дольмен": {"tags": {"name": "дольмен", "tourism": "attraction"}, "name": "дольмен", "icon": "maki-star", "geometry": ["point", "vertex", "area"], "fields": ["name", "operator", "address"], "suggestion": true}, - "tourism/camp_site/Camping Municipal": {"tags": {"name": "Camping Municipal", "tourism": "camp_site"}, "name": "Camping Municipal", "icon": "maki-campsite", "geometry": ["point", "vertex", "area"], "fields": ["name", "operator", "address", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "suggestion": true}, - "tourism/camp_site/Camping municipal": {"tags": {"name": "Camping municipal", "tourism": "camp_site"}, "name": "Camping municipal", "icon": "maki-campsite", "geometry": ["point", "vertex", "area"], "fields": ["name", "operator", "address", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "suggestion": true}, + "tourism/camp_site/Camping Municipal": {"tags": {"name": "Camping Municipal", "tourism": "camp_site"}, "name": "Camping Municipal", "icon": "maki-campsite", "geometry": ["point", "vertex", "area"], "fields": ["name", "operator", "address", "access_simple", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "suggestion": true}, + "tourism/camp_site/Camping municipal": {"tags": {"name": "Camping municipal", "tourism": "camp_site"}, "name": "Camping municipal", "icon": "maki-campsite", "geometry": ["point", "vertex", "area"], "fields": ["name", "operator", "address", "access_simple", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "suggestion": true}, "tourism/guest_house/Home": {"tags": {"name": "Home", "tourism": "guest_house"}, "name": "Home", "icon": "maki-lodging", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "suggestion": true}, "tourism/guest_house/OW Bielanka": {"tags": {"name": "OW Bielanka", "tourism": "guest_house"}, "name": "OW Bielanka", "icon": "maki-lodging", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "suggestion": true}, "tourism/hostel/Albergue de Peregrinos": {"tags": {"name": "Albergue de Peregrinos", "tourism": "hostel"}, "name": "Albergue de Peregrinos", "icon": "maki-lodging", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "suggestion": true}, diff --git a/data/presets/presets/amenity/bbq.json b/data/presets/presets/amenity/bbq.json index 7a5efffef..3ce13554d 100644 --- a/data/presets/presets/amenity/bbq.json +++ b/data/presets/presets/amenity/bbq.json @@ -2,7 +2,8 @@ "icon": "maki-bbq", "fields": [ "covered", - "fuel" + "fuel", + "access_simple" ], "geometry": [ "point" diff --git a/data/presets/presets/amenity/hunting_stand.json b/data/presets/presets/amenity/hunting_stand.json index 34d696e8f..00e3a754e 100644 --- a/data/presets/presets/amenity/hunting_stand.json +++ b/data/presets/presets/amenity/hunting_stand.json @@ -1,5 +1,8 @@ { "icon": "temaki-binoculars", + "fields": [ + "access_simple" + ], "geometry": [ "point", "vertex", diff --git a/data/presets/presets/amenity/shower.json b/data/presets/presets/amenity/shower.json index 9584ec2f4..c6fd4f8ee 100644 --- a/data/presets/presets/amenity/shower.json +++ b/data/presets/presets/amenity/shower.json @@ -5,7 +5,8 @@ "opening_hours", "fee", "supervised", - "building_area" + "building_area", + "access_simple" ], "geometry": [ "point", diff --git a/data/presets/presets/leisure/firepit.json b/data/presets/presets/leisure/firepit.json index ae8fb256f..cbe165258 100644 --- a/data/presets/presets/leisure/firepit.json +++ b/data/presets/presets/leisure/firepit.json @@ -1,5 +1,8 @@ { "icon": "maki-fire-station", + "fields": [ + "access_simple" + ], "geometry": [ "point", "area" diff --git a/data/presets/presets/leisure/slipway.json b/data/presets/presets/leisure/slipway.json index 82f3c0622..6dd0cc13b 100644 --- a/data/presets/presets/leisure/slipway.json +++ b/data/presets/presets/leisure/slipway.json @@ -1,5 +1,8 @@ { "icon": "temaki-beach", + "fields": [ + "access_simple" + ], "geometry": [ "point", "line" diff --git a/data/presets/presets/tourism/camp_site.json b/data/presets/presets/tourism/camp_site.json index 404166c1c..116bc2271 100644 --- a/data/presets/presets/tourism/camp_site.json +++ b/data/presets/presets/tourism/camp_site.json @@ -4,6 +4,7 @@ "name", "operator", "address", + "access_simple", "capacity", "fee", "internet_access", diff --git a/data/presets/presets/tourism/picnic_site.json b/data/presets/presets/tourism/picnic_site.json index 564838d47..b0e3c85c6 100644 --- a/data/presets/presets/tourism/picnic_site.json +++ b/data/presets/presets/tourism/picnic_site.json @@ -4,6 +4,8 @@ "name", "operator", "address", + "access_simple", + "capacity", "smoking" ], "geometry": [ From a0a54395a720dba072139b6b481b8cc5b30eaadb Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 16 Aug 2018 10:16:33 -0400 Subject: [PATCH 119/217] Fix issue completing uploads that reuse an existing open changeset (closes #5228) --- modules/services/osm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/services/osm.js b/modules/services/osm.js index 7579b6051..9e4f355a8 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -552,7 +552,7 @@ export default { return callback({ message: 'Changeset already inflight', status: -2 }, changeset); } else if (_changeset.open) { // reuse existing open changeset.. - return createdChangeset(null, _changeset.open); + return createdChangeset.call(this, null, _changeset.open); } else { // Open a new changeset.. var options = { From ef0636ad01521035963ae4782fa150122b416d85 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 16 Aug 2018 11:07:38 -0400 Subject: [PATCH 120/217] For fields that use entityID, recreate field if entityID changes (closes #5229, closes #4898) --- modules/ui/field.js | 3 ++ modules/ui/form_fields.js | 15 ++++--- modules/ui/preset_editor.js | 78 ++++++++++++++++++------------------- 3 files changed, 49 insertions(+), 47 deletions(-) diff --git a/modules/ui/field.js b/modules/ui/field.js index a430c2f97..585e38bb8 100644 --- a/modules/ui/field.js +++ b/modules/ui/field.js @@ -34,12 +34,15 @@ export function uiField(context, presetField, entity, options) { var _tags = {}; + // field implementation field.impl = uiFields[field.type](field, context) .on('change', function(t, onInput) { dispatch.call('change', field, t, onInput); }); + // if this field cares about the entity, pass it along if (entity && field.impl.entity) { + field.entityID = entity.id; field.impl.entity(entity); } diff --git a/modules/ui/form_fields.js b/modules/ui/form_fields.js index e2c6de218..0bf150b22 100644 --- a/modules/ui/form_fields.js +++ b/modules/ui/form_fields.js @@ -6,7 +6,7 @@ import { utilGetSetValue, utilNoAuto } from '../util'; export function uiFormFields(context) { - var fieldsArr; + var _fieldsArr; function formFields(selection, klass) { @@ -15,9 +15,8 @@ export function uiFormFields(context) { function render(selection, klass) { - - var shown = fieldsArr.filter(function(field) { return field.isShown(); }), - notShown = fieldsArr.filter(function(field) { return !field.isShown(); }); + var shown = _fieldsArr.filter(function(field) { return field.isShown(); }); + var notShown = _fieldsArr.filter(function(field) { return !field.isShown(); }); var container = selection.selectAll('.form-fields-container') .data([0]); @@ -29,7 +28,7 @@ export function uiFormFields(context) { var fields = container.selectAll('.wrap-form-field') - .data(shown, function(d) { return d.id; }); + .data(shown, function(d) { return d.id + (d.entityID || ''); }); fields.exit() .remove(); @@ -112,9 +111,9 @@ export function uiFormFields(context) { } - formFields.fieldsArr = function(_) { - if (!arguments.length) return fieldsArr; - fieldsArr = _; + formFields.fieldsArr = function(val) { + if (!arguments.length) return _fieldsArr; + _fieldsArr = val; return formFields; }; diff --git a/modules/ui/preset_editor.js b/modules/ui/preset_editor.js index 602278507..b6ba50cc1 100644 --- a/modules/ui/preset_editor.js +++ b/modules/ui/preset_editor.js @@ -14,13 +14,13 @@ import { utilRebind } from '../util'; export function uiPresetEditor(context) { - var dispatch = d3_dispatch('change'), - formFields = uiFormFields(context), - state, - fieldsArr, - preset, - tags, - entityId; + var dispatch = d3_dispatch('change'); + var formFields = uiFormFields(context); + var _state; + var _fieldsArr; + var _preset; + var _tags; + var _entityID; function presetEditor(selection) { @@ -32,36 +32,36 @@ export function uiPresetEditor(context) { function render(selection) { - if (!fieldsArr) { - var entity = context.entity(entityId), - geometry = context.geometry(entityId), - presets = context.presets(); + if (!_fieldsArr) { + var entity = context.entity(_entityID); + var geometry = context.geometry(_entityID); + var presets = context.presets(); - fieldsArr = []; + _fieldsArr = []; - preset.fields.forEach(function(field) { + _preset.fields.forEach(function(field) { if (field.matchGeometry(geometry)) { - fieldsArr.push( + _fieldsArr.push( uiField(context, field, entity) ); } }); if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) { - fieldsArr.push( + _fieldsArr.push( uiField(context, presets.field('restrictions'), entity) ); } presets.universal().forEach(function(field) { - if (preset.fields.indexOf(field) === -1) { - fieldsArr.push( + if (_preset.fields.indexOf(field) === -1) { + _fieldsArr.push( uiField(context, field, entity, { show: false }) ); } }); - fieldsArr.forEach(function(field) { + _fieldsArr.forEach(function(field) { field .on('change', function(t, onInput) { dispatch.call('change', field, t, onInput); @@ -69,15 +69,15 @@ export function uiPresetEditor(context) { }); } - fieldsArr.forEach(function(field) { + _fieldsArr.forEach(function(field) { field - .state(state) - .tags(tags); + .state(_state) + .tags(_tags); }); selection - .call(formFields.fieldsArr(fieldsArr), 'inspector-inner fillL3'); + .call(formFields.fieldsArr(_fieldsArr), 'inspector-inner fillL3'); selection.selectAll('.wrap-form-field input') @@ -90,35 +90,35 @@ export function uiPresetEditor(context) { } - presetEditor.preset = function(_) { - if (!arguments.length) return preset; - if (preset && preset.id === _.id) return presetEditor; - preset = _; - fieldsArr = null; + presetEditor.preset = function(val) { + if (!arguments.length) return _preset; + if (_preset && _preset.id === val.id) return presetEditor; + _preset = val; + _fieldsArr = null; return presetEditor; }; - presetEditor.state = function(_) { - if (!arguments.length) return state; - state = _; + presetEditor.state = function(val) { + if (!arguments.length) return _state; + _state = val; return presetEditor; }; - presetEditor.tags = function(_) { - if (!arguments.length) return tags; - tags = _; - // Don't reset fieldsArr here. + presetEditor.tags = function(val) { + if (!arguments.length) return _tags; + _tags = val; + // Don't reset _fieldsArr here. return presetEditor; }; - presetEditor.entityID = function(_) { - if (!arguments.length) return entityId; - if (entityId === _) return presetEditor; - entityId = _; - fieldsArr = null; + presetEditor.entityID = function(val) { + if (!arguments.length) return _entityID; + if (_entityID === val) return presetEditor; + _entityID = val; + _fieldsArr = null; return presetEditor; }; From 8b3637e55debac652ac57abe7e331b1d33dade4a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 16 Aug 2018 16:26:01 -0400 Subject: [PATCH 121/217] Speedup imagery index with which-polygon (closes #5226) --- data/index.js | 16 +++++---- modules/renderer/background.js | 47 +++++++++++++++++++++++---- modules/renderer/background_source.js | 18 ++-------- modules/svg/debug.js | 21 ++---------- 4 files changed, 54 insertions(+), 48 deletions(-) diff --git a/data/index.js b/data/index.js index 92cd0a335..0423aa9b4 100644 --- a/data/index.js +++ b/data/index.js @@ -1,3 +1,5 @@ +import _values from 'lodash-es/values'; + export { wikipedia as dataWikipedia } from 'wmf-sitematrix'; export { default as dataSuggestions } from 'name-suggestion-index/name-suggestions.json'; @@ -24,31 +26,31 @@ import { categories } from './presets/categories.json'; import { fields } from './presets/fields.json'; import { geoArea as d3_geoArea } from 'd3-geo'; -import _values from 'lodash-es/values'; import whichPolygon from 'which-polygon'; -var features = _values(ociFeatures).map(function(feature) { - // workaround for which-polygon - // only supports `properties`, not `id` + +// index the osm-community-index +var ociFeatureCollection = _values(ociFeatures).map(function(feature) { + // workaround for which-polygon: only supports `properties`, not `id` // https://github.com/mapbox/which-polygon/pull/6 feature.properties = { id: feature.id, area: d3_geoArea(feature) // also precompute areas }; - return feature; }); + export var data = { community: { features: ociFeatures, resources: ociResources, query: whichPolygon({ type: 'FeatureCollection', - features: features + features: ociFeatureCollection }) }, - imagery: dataImagery, + imagery: dataImagery, //legacy presets: { presets: presets, defaults: defaults, diff --git a/modules/renderer/background.js b/modules/renderer/background.js index 644986cad..71325195f 100644 --- a/modules/renderer/background.js +++ b/modules/renderer/background.js @@ -1,9 +1,12 @@ import _find from 'lodash-es/find'; +import _omit from 'lodash-es/omit'; import { dispatch as d3_dispatch } from 'd3-dispatch'; import { interpolateNumber as d3_interpolateNumber } from 'd3-interpolate'; import { select as d3_select } from 'd3-selection'; +import whichPolygon from 'which-polygon'; + import { data } from '../../data'; import { geoExtent, geoMetersToOffset, geoOffsetToMeters} from '../geo'; import { rendererBackgroundSource } from './background_source'; @@ -209,18 +212,24 @@ export function rendererBackground(context) { background.sources = function(extent) { + if (!data.imagery || !data.imagery.query) return []; // called before init()? + + var matchIDs = {}; + var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || []; + matchImagery.forEach(function(d) { matchIDs[d.id] = true; }); + return _backgroundSources.filter(function(source) { - return source.intersects(extent); + return matchIDs[source.id]; }); }; - background.dimensions = function(_) { - if (!_) return; - baseLayer.dimensions(_); + background.dimensions = function(d) { + if (!d) return; + baseLayer.dimensions(d); _overlayLayers.forEach(function(layer) { - layer.dimensions(_); + layer.dimensions(d); }); }; @@ -366,15 +375,39 @@ export function rendererBackground(context) { return geoExtent([args[2], args[1]]); } - var dataImagery = data.imagery || []; var q = utilStringQs(window.location.hash.substring(1)); var requested = q.background || q.layer; var extent = parseMap(q.map); var first; var best; + + data.imagery = data.imagery || []; + data.imagery.features = {}; + + // build efficient index and querying for data.imagery + var world = [[[-180, -90], [-180, 90], [180, 90], [180, -90], [-180, -90]]]; + var features = data.imagery.map(function(source) { + var feature = { + type: 'Feature', + id: source.id, + properties: _omit(source, ['polygon']), + geometry: { + type: 'MultiPolygon', + coordinates: [ source.polygon || world ] + } + }; + data.imagery.features[source.id] = feature; + return feature; + }); + data.imagery.query = whichPolygon({ + type: 'FeatureCollection', + features: features + }); + + // Add all the available imagery sources - _backgroundSources = dataImagery.map(function(source) { + _backgroundSources = data.imagery.map(function(source) { if (source.type === 'bing') { return rendererBackgroundSource.Bing(source, dispatch); } else if (/^EsriWorldImagery/.test(source.id)) { diff --git a/modules/renderer/background_source.js b/modules/renderer/background_source.js index fc8f07967..f3e2d5014 100644 --- a/modules/renderer/background_source.js +++ b/modules/renderer/background_source.js @@ -9,13 +9,7 @@ import { import { json as d3_json } from 'd3-request'; import { t } from '../util/locale'; - -import { - geoExtent, - geoPolygonIntersectsPolygon, - geoSphericalDistance -} from '../geo'; - +import { geoExtent, geoSphericalDistance } from '../geo'; import { utilDetect } from '../util/detect'; @@ -116,7 +110,7 @@ export function rendererBackgroundSource(data) { var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize))); switch (this.projection) { - case 'EPSG:4326': // todo: alternative codes of WGS 84? + case 'EPSG:4326': return { x: lon * 180 / Math.PI, y: lat * 180 / Math.PI @@ -162,14 +156,6 @@ export function rendererBackgroundSource(data) { }; - source.intersects = function(extent) { - extent = extent.polygon(); - return !data.polygon || data.polygon.some(function(polygon) { - return geoPolygonIntersectsPolygon(polygon, extent, true); - }); - }; - - source.validZoom = function(z) { return source.zoomExtent[0] <= z && (source.overzoom || source.zoomExtent[1] > z); diff --git a/modules/svg/debug.js b/modules/svg/debug.js index 26e6e112e..8476991ff 100644 --- a/modules/svg/debug.js +++ b/modules/svg/debug.js @@ -2,22 +2,12 @@ import _values from 'lodash-es/values'; import { select as d3_select } from 'd3-selection'; -import { geoPolygonIntersectsPolygon } from '../geo'; import { data, dataImperial, dataDriveLeft } from '../../data'; import { svgPath } from './index'; export function svgDebug(projection, context) { - function multipolygons(imagery) { - return imagery.map(function(data) { - return { - type: 'MultiPolygon', - coordinates: [ data.polygon ] - }; - }); - } - function drawDebug(selection) { var showsTile = context.getDebug('tile'); var showsCollision = context.getDebug('collision'); @@ -89,16 +79,11 @@ export function svgDebug(projection, context) { var extent = context.map().extent(); - var dataImagery = data.imagery || []; - var availableImagery = showsImagery && multipolygons(dataImagery.filter(function(source) { - if (!source.polygon) return false; - return source.polygon.some(function(polygon) { - return geoPolygonIntersectsPolygon(polygon, extent, true); - }); - })); + var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || []; + var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; }); var imagery = layer.selectAll('path.debug-imagery') - .data(showsImagery ? availableImagery : []); + .data(features); imagery.exit() .remove(); From 52c3858b4899dad0c84bccbf3168618623d6edbd Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 17 Aug 2018 09:00:15 +0000 Subject: [PATCH 122/217] fix(package): update marked to version 0.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2e9f860e3..312868496 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@mapbox/vector-tile": "^1.3.1", "diacritics": "1.3.0", "lodash-es": "4.17.10", - "marked": "0.4.0", + "marked": "0.5.0", "node-diff3": "1.0.0", "osm-auth": "1.0.2", "pannellum": "2.4.1", From 4b446e9e780be4b932647ea6ebe4dc700b49ff28 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 17 Aug 2018 13:03:07 -0400 Subject: [PATCH 123/217] WIP merge 'gpx' and 'mvt' layers into single 'data' layer --- ARCHITECTURE.md | 2 +- css/20_map.css | 44 ++------ css/80_app.css | 3 +- modules/renderer/background.js | 23 +--- modules/svg/{gpx.js => data.js} | 175 +++++++++++++++++++++--------- modules/svg/index.js | 3 +- modules/svg/layers.js | 6 +- modules/ui/map_data.js | 120 ++++---------------- modules/ui/map_in_map.js | 6 +- test/index.html | 5 +- test/spec/svg/{gpx.js => data.js} | 36 +++--- test/spec/svg/layers.js | 15 ++- 12 files changed, 191 insertions(+), 247 deletions(-) rename modules/svg/{gpx.js => data.js} (53%) rename test/spec/svg/{gpx.js => data.js} (69%) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index be802579e..e88be04cc 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -324,7 +324,7 @@ correspondence with entities: * `iD.svgLayers` - sets up a number of layers that ensure that map elements appear in an appropriate z-order. * `iD.svgOsm` - sets up the OSM-specific data layers -* `iD.svgGpx` - draws gpx traces +* `iD.svgData` - draws any other overlaid vector data (gpx, kml, geojson, mvt, pbf) * `iD.svgDebug` - draws debugging information ### Other UI diff --git a/css/20_map.css b/css/20_map.css index 6ec2927ba..ce45960a9 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -307,60 +307,30 @@ g.turn circle { } -/* GPX Paths */ +/* Other Data (gpx, kml, geojson, mvt, pbf) */ -.layer-gpx { +.layer-geojson { pointer-events: none; } -path.gpx { +.layer-geojson path { stroke: #ff26d4; stroke-width: 2; fill: none; } -text.gpxlabel-halo, -text.gpxlabel { +.layer-geojson text.label-halo, +.layer-geojson text.label { font-size: 10px; font-weight: bold; dominant-baseline: middle; } -text.gpxlabel { +.layer-geojson text.label { fill: #ff26d4; } -text.gpxlabel-halo { - opacity: 0.7; - stroke: #000; - stroke-width: 5px; - stroke-miterlimit: 1; -} - -/* MVT Paths */ - -.layer-mvt { - pointer-events: none; -} - -path.mvt { - stroke: #ff26d4; - stroke-width: 2; - fill: none; -} - -text.mvtlabel-halo, -text.mvtlabel { - font-size: 10px; - font-weight: bold; - dominant-baseline: middle; -} - -text.mvtlabel { - fill: #ff26d4; -} - -text.mvtlabel-halo { +.layer-geojson text.label-halo { opacity: 0.7; stroke: #000; stroke-width: 5px; diff --git a/css/80_app.css b/css/80_app.css index 55bf424dc..7749c193c 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2566,8 +2566,7 @@ div.full-screen > button:hover { float: right; } -[dir='rtl'] .list-item-gpx-browse svg, -[dir='rtl'] .list-item-mvt-browse svg { +[dir='rtl'] .list-item-data-browse svg { transform: rotateY(180deg); } diff --git a/modules/renderer/background.js b/modules/renderer/background.js index 71325195f..ff9010004 100644 --- a/modules/renderer/background.js +++ b/modules/renderer/background.js @@ -171,10 +171,10 @@ export function rendererBackground(context) { .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); }) .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); }); - var gpx = context.layers().layer('gpx'); - if (gpx && gpx.enabled() && gpx.hasGpx()) { + var data = context.layers().layer('data'); + if (data && data.enabled() && data.hasData()) { // Include a string like '.gpx data file' or '.geojson data file' - var match = gpx.getSrc().match(/(kml|gpx|(?:geo)?json)$/i); + var match = data.getSrc().match(/(kml|gpx|pbf|mvt|(?:geo)?json)$/i); var extension = match ? ('.' + match[0].toLowerCase() + ' ') : ''; imageryUsed.push(extension + 'data file'); } @@ -184,14 +184,6 @@ export function rendererBackground(context) { imageryUsed.push('Bing Streetside'); } - var mvt = context.layers().layer('mvt'); - if (mvt && mvt.enabled() && mvt.hasMvt()) { - // Include a string like '.mvt data file' or '.geojson data file' - var matchmvt = mvt.getSrc().match(/(pbf|mvt|(?:geo)?json)$/i); - var extensionmvt = matchmvt ? ('.' + matchmvt[0].toLowerCase() + ' ') : ''; - imageryUsed.push(extensionmvt + 'data file'); - } - var mapillary_images = context.layers().layer('mapillary-images'); if (mapillary_images && mapillary_images.enabled()) { imageryUsed.push('Mapillary Images'); @@ -464,19 +456,12 @@ export function rendererBackground(context) { }); if (q.gpx) { - var gpx = context.layers().layer('gpx'); + var gpx = context.layers().layer('data'); if (gpx) { gpx.url(q.gpx); } } - if (q.mvt) { - var mvt = context.layers().layer('mvt'); - if (mvt) { - mvt.url(q.mvt); - } - } - if (q.offset) { var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) { return !isNaN(n) && n; diff --git a/modules/svg/gpx.js b/modules/svg/data.js similarity index 53% rename from modules/svg/gpx.js rename to modules/svg/data.js index cfd785742..350d5d76a 100644 --- a/modules/svg/gpx.js +++ b/modules/svg/data.js @@ -4,16 +4,24 @@ import _reduce from 'lodash-es/reduce'; import _union from 'lodash-es/union'; import { geoBounds as d3_geoBounds } from 'd3-geo'; -import { text as d3_text } from 'd3-request'; + +import { + request as d3_request, + text as d3_text +} from 'd3-request'; + import { event as d3_event, select as d3_select } from 'd3-selection'; +import toGeoJSON from '@mapbox/togeojson'; +import vt from '@mapbox/vector-tile'; +import Protobuf from 'pbf'; + import { geoExtent, geoPolygonIntersectsPolygon } from '../geo'; import { svgPath } from './index'; import { utilDetect } from '../util/detect'; -import toGeoJSON from '@mapbox/togeojson'; var _initialized = false; @@ -21,7 +29,7 @@ var _enabled = false; var _geojson; -export function svgGpx(projection, context, dispatch) { +export function svgData(projection, context, dispatch) { var _showLabels = true; var detected = utilDetect(); var layer; @@ -42,24 +50,24 @@ export function svgGpx(projection, context, dispatch) { d3_select('body') .attr('dropzone', 'copy') - .on('drop.localgpx', function() { + .on('drop.svgData', function() { d3_event.stopPropagation(); d3_event.preventDefault(); if (!detected.filedrop) return; - drawGpx.files(d3_event.dataTransfer.files); + drawData.files(d3_event.dataTransfer.files); }) - .on('dragenter.localgpx', over) - .on('dragexit.localgpx', over) - .on('dragover.localgpx', over); + .on('dragenter.svgData', over) + .on('dragexit.svgData', over) + .on('dragover.svgData', over); _initialized = true; } - function drawGpx(selection) { + function drawData(selection) { var getPath = svgPath(projection).geojson; - layer = selection.selectAll('.layer-gpx') + layer = selection.selectAll('.layer-geojson') .data(_enabled ? [0] : []); layer.exit() @@ -67,7 +75,7 @@ export function svgGpx(projection, context, dispatch) { layer = layer.enter() .append('g') - .attr('class', 'layer-gpx') + .attr('class', 'layer-geojson') .merge(layer); @@ -80,7 +88,7 @@ export function svgGpx(projection, context, dispatch) { paths = paths.enter() .append('path') - .attr('class', 'gpx') + .attr('class', 'pathdata') .merge(paths); paths @@ -91,8 +99,8 @@ export function svgGpx(projection, context, dispatch) { labelData = labelData.filter(getPath); layer - .call(drawLabels, 'gpxlabel-halo', labelData) - .call(drawLabels, 'gpxlabel', labelData); + .call(drawLabels, 'label-halo', labelData) + .call(drawLabels, 'label', labelData); function drawLabels(selection, textClass, data) { @@ -126,11 +134,6 @@ export function svgGpx(projection, context, dispatch) { } - function toDom(x) { - return (new DOMParser()).parseFromString(x, 'text/xml'); - } - - function getExtension(fileName) { if (fileName === undefined) { return ''; @@ -145,43 +148,76 @@ export function svgGpx(projection, context, dispatch) { } - function parseSaveAndZoom(extension, data, src) { + function toDom(textdata) { + return (new DOMParser()).parseFromString(textdata, 'text/xml'); + } + + + function vtToGeoJSON(bufferdata) { + var tile = new vt.VectorTile(new Protobuf(bufferdata.data.response)); + var layers = Object.keys(tile.layers); + if (!Array.isArray(layers)) { layers = [layers]; } + + var collection = {type: 'FeatureCollection', features: []}; + + layers.forEach(function (layerID) { + var layer = tile.layers[layerID]; + if (layer) { + for (var i = 0; i < layer.length; i++) { + var feature = layer.feature(i).toGeoJSON(bufferdata.zxy[2], bufferdata.zxy[3], bufferdata.zxy[1]); + if (layers.length > 1) feature.properties.vt_layer = layerID; + collection.features.push(feature); + } + } + }); + + return collection; + } + + + function parseSaveAndZoom(extension, data, name) { switch (extension) { - default: - drawGpx.geojson(toGeoJSON.gpx(toDom(data)), src).fitZoom(); + case '.gpx': + drawData.geojson(toGeoJSON.gpx(toDom(data)), name).fitZoom(); break; case '.kml': - drawGpx.geojson(toGeoJSON.kml(toDom(data)), src).fitZoom(); + drawData.geojson(toGeoJSON.kml(toDom(data)), name).fitZoom(); + break; + case '.pbf': + drawData.geojson(vtToGeoJSON(data), name).fitZoom(); + break; + case '.mvt': + drawData.geojson(vtToGeoJSON(data), name).fitZoom(); break; case '.geojson': case '.json': - drawGpx.geojson(JSON.parse(data), src).fitZoom(); + drawData.geojson(JSON.parse(data), name).fitZoom(); break; } } - drawGpx.showLabels = function(_) { + drawData.showLabels = function(val) { if (!arguments.length) return _showLabels; - _showLabels = _; + _showLabels = val; return this; }; - drawGpx.enabled = function(_) { + drawData.enabled = function(val) { if (!arguments.length) return _enabled; - _enabled = _; + _enabled = val; dispatch.call('change'); return this; }; - drawGpx.hasGpx = function() { + drawData.hasData = function() { return (!(_isEmpty(_geojson) || _isEmpty(_geojson.features))); }; - drawGpx.geojson = function(gj, src) { + drawData.geojson = function(gj, src) { if (!arguments.length) return _geojson; if (_isEmpty(gj) || _isEmpty(gj.features)) return this; _geojson = gj; @@ -191,41 +227,82 @@ export function svgGpx(projection, context, dispatch) { }; - drawGpx.url = function(url) { - d3_text(url, function(err, data) { - if (!err) { - var extension = getExtension(url); - parseSaveAndZoom(extension, data, url); - } - }); + drawData.url = function(url) { + var extension = getExtension(url); + if (extension === 'mvt' || extension === 'pbf') { + d3_request(url) + .responseType('arraybuffer') + .get(function(err, data) { + if (err || !data) return; + _src = url; + var match = url.match(/(pbf|mvt)/i); + var extension = match ? ('.' + match[0].toLowerCase()) : ''; + var zxy = url.match(/\/(\d+)\/(\d+)\/(\d+)/); + var bufferdata = { + data : data, + zxy : zxy + }; + parseSaveAndZoom(extension, bufferdata); + }); + } else { + d3_text(url, function(err, data) { + if (!err) { + parseSaveAndZoom(extension, data, url); + } + }); + } + return this; }; - drawGpx.files = function(fileList) { + drawData.files = function(fileList) { if (!fileList.length) return this; var f = fileList[0]; var reader = new FileReader(); + var extension = getExtension(f.name); - reader.onload = (function(file) { - var extension = getExtension(file.name); - return function (e) { - parseSaveAndZoom(extension, e.target.result, file.name); - }; - })(f); + if (extension === 'mvt' || extension === 'pbf') { + reader.onload = (function(file) { + return; // todo find x,y,z + var data = []; + var zxy = [0,0,0]; + + _src = file.name; + var extension = getExtension(file.name); + var bufferdata = { + data: data, + zxy: zxy + }; + return function (e) { + bufferdata.data = e.target.result; + parseSaveAndZoom(extension, bufferdata); + }; + })(f); + + reader.readAsArrayBuffer(f); + + } else { + reader.onload = (function(file) { + return function (e) { + parseSaveAndZoom(extension, e.target.result, file.name); + }; + })(f); + + reader.readAsText(f); + } - reader.readAsText(f); return this; }; - drawGpx.getSrc = function () { + drawData.getSrc = function() { return _src; }; - drawGpx.fitZoom = function() { - if (!this.hasGpx()) return this; + drawData.fitZoom = function() { + if (!this.hasData()) return this; var map = context.map(); var viewport = map.trimmedExtent().polygon(); @@ -262,5 +339,5 @@ export function svgGpx(projection, context, dispatch) { init(); - return drawGpx; + return drawData; } diff --git a/modules/svg/index.js b/modules/svg/index.js index c7760b2aa..4b1bd37a3 100644 --- a/modules/svg/index.js +++ b/modules/svg/index.js @@ -1,8 +1,7 @@ export { svgAreas } from './areas.js'; +export { svgData } from './data.js'; export { svgDebug } from './debug.js'; export { svgDefs } from './defs.js'; -export { svgGpx } from './gpx.js'; -export { svgMvt } from './mvt.js'; export { svgIcon } from './icon.js'; export { svgLabels } from './labels.js'; export { svgLayers } from './layers.js'; diff --git a/modules/svg/layers.js b/modules/svg/layers.js index 31067aea2..7493cc695 100644 --- a/modules/svg/layers.js +++ b/modules/svg/layers.js @@ -7,10 +7,9 @@ import _reject from 'lodash-es/reject'; import { dispatch as d3_dispatch } from 'd3-dispatch'; import { select as d3_select } from 'd3-selection'; +import { svgData } from './data'; import { svgDebug } from './debug'; -import { svgGpx } from './gpx'; import { svgStreetside } from './streetside'; -import { svgMvt } from './mvt'; import { svgMapillaryImages } from './mapillary_images'; import { svgMapillarySigns } from './mapillary_signs'; import { svgOpenstreetcamImages } from './openstreetcam_images'; @@ -26,8 +25,7 @@ export function svgLayers(projection, context) { var layers = [ { id: 'osm', layer: svgOsm(projection, context, dispatch) }, { id: 'notes', layer: svgNotes(projection, context, dispatch) }, - { id: 'gpx', layer: svgGpx(projection, context, dispatch) }, - { id: 'mvt', layer: svgMvt(projection, context, dispatch) }, + { id: 'data', layer: svgData(projection, context, dispatch) }, { id: 'streetside', layer: svgStreetside(projection, context, dispatch)}, { id: 'mapillary-images', layer: svgMapillaryImages(projection, context, dispatch) }, { id: 'mapillary-signs', layer: svgMapillarySigns(projection, context, dispatch) }, diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index 974e1c0ba..d1f86a7b1 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -207,14 +207,14 @@ export function uiMapData(context) { } - function drawGpxItem(selection) { - var gpx = layers.layer('gpx'); - var hasGpx = gpx && gpx.hasGpx(); - var showsGpx = hasGpx && gpx.enabled(); + function drawDataItems(selection) { + var dataLayer = layers.layer('data'); + var hasData = dataLayer && dataLayer.hasData(); + var showsData = hasData && dataLayer.enabled(); var ul = selection - .selectAll('.layer-list-gpx') - .data(gpx ? [0] : []); + .selectAll('.layer-list-data') + .data(dataLayer ? [0] : []); // Exit ul.exit() @@ -223,15 +223,15 @@ export function uiMapData(context) { // Enter var ulEnter = ul.enter() .append('ul') - .attr('class', 'layer-list layer-list-gpx'); + .attr('class', 'layer-list layer-list-data'); var liEnter = ulEnter .append('li') - .attr('class', 'list-item-gpx'); + .attr('class', 'list-item-data'); liEnter .append('button') - .attr('class', 'list-item-gpx-extent') + .attr('class', 'list-item-data-extent') .call(tooltip() .title(t('gpx.zoom')) .placement((textDirection === 'rtl') ? 'right' : 'left') @@ -239,13 +239,13 @@ export function uiMapData(context) { .on('click', function() { d3_event.preventDefault(); d3_event.stopPropagation(); - gpx.fitZoom(); + dataLayer.fitZoom(); }) .call(svgIcon('#iD-icon-search')); liEnter .append('button') - .attr('class', 'list-item-gpx-browse') + .attr('class', 'list-item-data-browse') .call(tooltip() .title(t('gpx.browse')) .placement((textDirection === 'rtl') ? 'right' : 'left') @@ -254,7 +254,7 @@ export function uiMapData(context) { d3_select(document.createElement('input')) .attr('type', 'file') .on('change', function() { - gpx.files(d3_event.target.files); + dataLayer.files(d3_event.target.files); }) .node().click(); }) @@ -270,7 +270,7 @@ export function uiMapData(context) { labelEnter .append('input') .attr('type', 'checkbox') - .on('change', function() { toggleLayer('gpx'); }); + .on('change', function() { toggleLayer('data'); }); labelEnter .append('span') @@ -280,96 +280,15 @@ export function uiMapData(context) { ul = ul .merge(ulEnter); - ul.selectAll('.list-item-gpx') - .classed('active', showsGpx) + ul.selectAll('.list-item-data') + .classed('active', showsData) .selectAll('label') - .classed('deemphasize', !hasGpx) + .classed('deemphasize', !hasData) .selectAll('input') - .property('disabled', !hasGpx) - .property('checked', showsGpx); + .property('disabled', !hasData) + .property('checked', showsData); } - function drawMvtItem(selection) { - var mvt = layers.layer('mvt'), - hasMvt = mvt && mvt.hasMvt(), - showsMvt = hasMvt && mvt.enabled(); - - var ul = selection - .selectAll('.layer-list-mvt') - .data(mvt ? [0] : []); - - // Exit - ul.exit() - .remove(); - - // Enter - var ulEnter = ul.enter() - .append('ul') - .attr('class', 'layer-list layer-list-mvt'); - - var liEnter = ulEnter - .append('li') - .attr('class', 'list-item-mvt'); - - liEnter - .append('button') - .attr('class', 'list-item-mvt-extent') - .call(tooltip() - .title(t('mvt.zoom')) - .placement((textDirection === 'rtl') ? 'right' : 'left') - ) - .on('click', function() { - d3_event.preventDefault(); - d3_event.stopPropagation(); - mvt.fitZoom(); - }) - .call(svgIcon('#iD-icon-search')); - - liEnter - .append('button') - .attr('class', 'list-item-mvt-browse') - .call(tooltip() - .title(t('mvt.browse')) - .placement((textDirection === 'rtl') ? 'right' : 'left') - ) - .on('click', function() { - d3_select(document.createElement('input')) - .attr('type', 'file') - .on('change', function() { - mvt.files(d3_event.target.files); - }) - .node().click(); - }) - .call(svgIcon('#iD-icon-geolocate')); - - var labelEnter = liEnter - .append('label') - .call(tooltip() - .title(t('mvt.drag_drop')) - .placement('top') - ); - - labelEnter - .append('input') - .attr('type', 'checkbox') - .on('change', function() { toggleLayer('mvt'); }); - - labelEnter - .append('span') - .text(t('mvt.local_layer')); - - // Update - ul = ul - .merge(ulEnter); - - ul.selectAll('.list-item-mvt') - .classed('active', showsMvt) - .selectAll('label') - .classed('deemphasize', !hasMvt) - .selectAll('input') - .property('disabled', !hasMvt) - .property('checked', showsMvt); - } function drawListItems(selection, data, type, name, change, active) { var items = selection.selectAll('li') @@ -462,8 +381,7 @@ export function uiMapData(context) { _dataLayerContainer .call(drawOsmItems) .call(drawPhotoItems) - .call(drawGpxItem); - // .call(drawMvtItem); + .call(drawDataItems); _fillList .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill); diff --git a/modules/ui/map_in_map.js b/modules/ui/map_in_map.js index 3e056e4b0..139f41f6c 100644 --- a/modules/ui/map_in_map.js +++ b/modules/ui/map_in_map.js @@ -22,7 +22,7 @@ import { } from '../geo'; import { rendererTileLayer } from '../renderer'; -import { svgDebug, svgGpx } from '../svg'; +import { svgDebug, svgData } from '../svg'; import { utilSetTransform } from '../util'; import { utilGetDimensions } from '../util/dimensions'; @@ -33,7 +33,7 @@ export function uiMapInMap(context) { var backgroundLayer = rendererTileLayer(context); var overlayLayers = {}; var projection = geoRawMercator(); - var gpxLayer = svgGpx(projection, context).showLabels(false); + var dataLayer = svgData(projection, context).showLabels(false); var debugLayer = svgDebug(projection, context); var zoom = d3_zoom() .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)]) @@ -242,7 +242,7 @@ export function uiMapInMap(context) { .append('svg') .attr('class', 'map-in-map-data') .merge(dataLayers) - .call(gpxLayer) + .call(dataLayer) .call(debugLayer); diff --git a/test/index.html b/test/index.html index 6832766ee..abcf0ed83 100644 --- a/test/index.html +++ b/test/index.html @@ -115,12 +115,11 @@ - + - @@ -149,4 +148,4 @@ - \ No newline at end of file + diff --git a/test/spec/svg/gpx.js b/test/spec/svg/data.js similarity index 69% rename from test/spec/svg/gpx.js rename to test/spec/svg/data.js index cb101af22..fa92be0d5 100644 --- a/test/spec/svg/gpx.js +++ b/test/spec/svg/data.js @@ -1,4 +1,4 @@ -describe('iD.svgGpx', function () { +describe('iD.svgData', function () { var context; var surface; var dispatch = d3.dispatch('change'); @@ -41,19 +41,19 @@ describe('iD.svgGpx', function () { }); - it('creates layer-gpx', function () { - var render = iD.svgGpx(projection, context, dispatch); + it('creates layer-geojson', function () { + var render = iD.svgData(projection, context, dispatch); surface.call(render); - var layers = surface.selectAll('g.layer-gpx').nodes(); + var layers = surface.selectAll('g.layer-geojson').nodes(); expect(layers.length).to.eql(1); }); it('draws geojson', function () { - var render = iD.svgGpx(projection, context, dispatch).geojson(gj); + var render = iD.svgData(projection, context, dispatch).geojson(gj); surface.call(render); - var path = surface.selectAll('path.gpx'); + var path = surface.selectAll('path'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); }); @@ -61,30 +61,30 @@ describe('iD.svgGpx', function () { describe('#files', function() { it('handles gpx files', function () { var files = '../../data/gpxtest.gpx'; - var render = iD.svgGpx(projection, context, dispatch).files(files); + var render = iD.svgData(projection, context, dispatch).files(files); surface.call(render); - var path = surface.selectAll('path.gpx'); + var path = surface.selectAll('path'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); }); it('handles geojson files', function () { var files = '../../data/gpxtest.json'; - var render = iD.svgGpx(projection, context, dispatch).files(files); + var render = iD.svgData(projection, context, dispatch).files(files); surface.call(render); - var path = surface.selectAll('path.gpx'); + var path = surface.selectAll('path'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); }); it('handles kml files', function () { var files = '../../data/gpxtest.kml'; - var render = iD.svgGpx(projection, context, dispatch).files(files); + var render = iD.svgData(projection, context, dispatch).files(files); surface.call(render); - var path = surface.selectAll('path.gpx'); + var path = surface.selectAll('path'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); }); @@ -93,25 +93,25 @@ describe('iD.svgGpx', function () { describe('#showLabels', function() { it('shows labels by default', function () { - var render = iD.svgGpx(projection, context, dispatch).geojson(gj); + var render = iD.svgData(projection, context, dispatch).geojson(gj); surface.call(render); - var label = surface.selectAll('text.gpxlabel'); + var label = surface.selectAll('text.label'); expect(label.nodes().length).to.eql(1); expect(label.text()).to.eql('New Jersey'); - var halo = surface.selectAll('text.gpxlabel-halo'); + var halo = surface.selectAll('text.label-halo'); expect(halo.nodes().length).to.eql(1); expect(halo.text()).to.eql('New Jersey'); }); it('hides labels with showLabels(false)', function () { - var render = iD.svgGpx(projection, context, dispatch).geojson(gj).showLabels(false); + var render = iD.svgData(projection, context, dispatch).geojson(gj).showLabels(false); surface.call(render); - expect(surface.selectAll('text.gpxlabel').empty()).to.be.ok; - expect(surface.selectAll('text.gpxlabel-halo').empty()).to.be.ok; + expect(surface.selectAll('text.label').empty()).to.be.ok; + expect(surface.selectAll('text.label-halo').empty()).to.be.ok; }); }); diff --git a/test/spec/svg/layers.js b/test/spec/svg/layers.js index 3feba3472..cc327edf1 100644 --- a/test/spec/svg/layers.js +++ b/test/spec/svg/layers.js @@ -26,16 +26,15 @@ describe('iD.svgLayers', function () { it('creates default data layers', function () { container.call(iD.svgLayers(projection, context)); var nodes = container.selectAll('svg .data-layer').nodes(); - expect(nodes.length).to.eql(9); + expect(nodes.length).to.eql(8); expect(d3.select(nodes[0]).classed('data-layer-osm')).to.be.true; expect(d3.select(nodes[1]).classed('data-layer-notes')).to.be.true; - expect(d3.select(nodes[2]).classed('data-layer-gpx')).to.be.true; - expect(d3.select(nodes[3]).classed('data-layer-mvt')).to.be.true; - expect(d3.select(nodes[4]).classed('data-layer-streetside')).to.be.true; - expect(d3.select(nodes[5]).classed('data-layer-mapillary-images')).to.be.true; - expect(d3.select(nodes[6]).classed('data-layer-mapillary-signs')).to.be.true; - expect(d3.select(nodes[7]).classed('data-layer-openstreetcam-images')).to.be.true; - expect(d3.select(nodes[8]).classed('data-layer-debug')).to.be.true; + expect(d3.select(nodes[2]).classed('data-layer-data')).to.be.true; + expect(d3.select(nodes[3]).classed('data-layer-streetside')).to.be.true; + expect(d3.select(nodes[4]).classed('data-layer-mapillary-images')).to.be.true; + expect(d3.select(nodes[5]).classed('data-layer-mapillary-signs')).to.be.true; + expect(d3.select(nodes[6]).classed('data-layer-openstreetcam-images')).to.be.true; + expect(d3.select(nodes[7]).classed('data-layer-debug')).to.be.true; }); }); From 0ae4099ff651ec1ca76961d86af662111d76008e Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 17 Aug 2018 17:26:12 -0400 Subject: [PATCH 124/217] Add custom data settings modal with file picker or vector tile url --- css/80_app.css | 20 +++- data/core.yaml | 10 ++ dist/locales/en.json | 13 +++ modules/ui/map_data.js | 69 ++++++++++---- modules/ui/settings/custom_background.js | 9 +- modules/ui/settings/custom_data.js | 113 +++++++++++++++++++++++ modules/ui/settings/index.js | 1 + 7 files changed, 207 insertions(+), 28 deletions(-) create mode 100644 modules/ui/settings/custom_data.js diff --git a/css/80_app.css b/css/80_app.css index 7749c193c..c33de8c30 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -3875,16 +3875,26 @@ svg.mouseclick use.right { /* Settings Modals ------------------------------------------------------- */ -.settings-custom-background .instructions { - margin-bottom: 20px; -} -.settings-custom-background textarea { +.settings-modal textarea { height: 60px; } -.settings-custom-background .buttons .button.col3 { +.settings-modal .buttons .button.col3 { float: none; /* undo float left */ } +.settings-custom-background .instructions-template { + margin-bottom: 20px; +} + + +.settings-custom-data .instructions-file { + margin-bottom: 10px; +} +.settings-custom-data .field-file, +.settings-custom-data .instructions-template { + margin-bottom: 20px; +} + /* Save Mode ------------------------------------------------------- */ diff --git a/data/core.yaml b/data/core.yaml index 62285567c..0faecc857 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -519,6 +519,16 @@ en: instructions: "Enter a tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n {-y} or {ty} for flipped TMS-style Y coordinates\n {u} for quadtile scheme\n {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}" template: placeholder: Enter a url template + custom_data: + tooltip: Edit custom data layer + header: Custom Data Settings + file: + instructions: "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson/.json, .pbf, .mvt" + label: "Browse files" + or: "Or" + template: + instructions: "Enter a vector tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme" + placeholder: Enter a url template restore: heading: You have unsaved changes description: "Do you wish to restore unsaved changes from a previous editing session?" diff --git a/dist/locales/en.json b/dist/locales/en.json index ca551b5a0..8489e25b1 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -638,6 +638,19 @@ "template": { "placeholder": "Enter a url template" } + }, + "custom_data": { + "tooltip": "Edit custom data layer", + "header": "Custom Data Settings", + "file": { + "instructions": "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson/.json, .pbf, .mvt", + "label": "Browse files" + }, + "or": "Or", + "template": { + "instructions": "Enter a vector tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme", + "placeholder": "Enter a url template" + } } }, "restore": { diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index d1f86a7b1..ad4ba47fd 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -12,6 +12,7 @@ import { modeBrowse } from '../modes'; import { uiBackground } from './background'; import { uiDisclosure } from './disclosure'; import { uiHelp } from './help'; +import { uiSettingsCustomData } from './settings/custom_data'; import { uiTooltipHtml } from './tooltipHtml'; @@ -21,6 +22,9 @@ export function uiMapData(context) { var layers = context.layers(); var fills = ['wireframe', 'partial', 'full']; + var settingsCustomData = uiSettingsCustomData(context) + .on('change', customChanged); + var _fillSelected = context.storage('area-fill') || 'partial'; var _shown = false; var _dataLayerContainer = d3_select(null); @@ -207,7 +211,7 @@ export function uiMapData(context) { } - function drawDataItems(selection) { + function drawCustomDataItems(selection) { var dataLayer = layers.layer('data'); var hasData = dataLayer && dataLayer.hasData(); var showsData = hasData && dataLayer.enabled(); @@ -231,7 +235,15 @@ export function uiMapData(context) { liEnter .append('button') - .attr('class', 'list-item-data-extent') + .call(tooltip() + .title(t('settings.custom_data.tooltip')) + .placement((textDirection === 'rtl') ? 'right' : 'left') + ) + .on('click', editCustom) + .call(svgIcon('#iD-icon-more')); + + liEnter + .append('button') .call(tooltip() .title(t('gpx.zoom')) .placement((textDirection === 'rtl') ? 'right' : 'left') @@ -243,22 +255,22 @@ export function uiMapData(context) { }) .call(svgIcon('#iD-icon-search')); - liEnter - .append('button') - .attr('class', 'list-item-data-browse') - .call(tooltip() - .title(t('gpx.browse')) - .placement((textDirection === 'rtl') ? 'right' : 'left') - ) - .on('click', function() { - d3_select(document.createElement('input')) - .attr('type', 'file') - .on('change', function() { - dataLayer.files(d3_event.target.files); - }) - .node().click(); - }) - .call(svgIcon('#iD-icon-geolocate')); + // liEnter + // .append('button') + // .attr('class', 'list-item-data-browse') + // .call(tooltip() + // .title(t('gpx.browse')) + // .placement((textDirection === 'rtl') ? 'right' : 'left') + // ) + // .on('click', function() { + // d3_select(document.createElement('input')) + // .attr('type', 'file') + // .on('change', function() { + // dataLayer.files(d3_event.target.files); + // }) + // .node().click(); + // }) + // .call(svgIcon('#iD-icon-geolocate')); var labelEnter = liEnter .append('label') @@ -290,6 +302,25 @@ export function uiMapData(context) { } + function editCustom() { + d3_event.preventDefault(); + context.container() + .call(settingsCustomData); + } + + + function customChanged(d) { +console.log('custom was changed'); + // if (d && d.template) { + // _customSource.template(d.template); + // chooseBackground(_customSource); + // } else { + // _customSource.template(''); + // chooseBackground(context.background().findSource('none')); + // } + } + + function drawListItems(selection, data, type, name, change, active) { var items = selection.selectAll('li') .data(data); @@ -381,7 +412,7 @@ export function uiMapData(context) { _dataLayerContainer .call(drawOsmItems) .call(drawPhotoItems) - .call(drawDataItems); + .call(drawCustomDataItems); _fillList .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill); diff --git a/modules/ui/settings/custom_background.js b/modules/ui/settings/custom_background.js index e69176053..9b2fc4e05 100644 --- a/modules/ui/settings/custom_background.js +++ b/modules/ui/settings/custom_background.js @@ -19,7 +19,7 @@ export function uiSettingsCustomBackground(context) { var modal = uiConfirm(selection).okButton(); modal - .classed('settings-custom-background', true); + .classed('settings-modal settings-custom-background', true); modal.select('.modal-section.header') .append('h3') @@ -30,11 +30,12 @@ export function uiSettingsCustomBackground(context) { textSection .append('pre') - .attr('class', 'instructions') + .attr('class', 'instructions-template') .text(t('settings.custom_background.instructions', { example: example })); textSection .append('textarea') + .attr('class', 'field-template') .attr('placeholder', t('settings.custom_background.template.placeholder')) .call(utilNoAuto) .property('value', _currSettings.template); @@ -66,7 +67,7 @@ export function uiSettingsCustomBackground(context) { // restore the original template function clickCancel() { - textSection.select('textarea').property('value', _origSettings.template); + textSection.select('.field-template').property('value', _origSettings.template); context.storage('background-custom-template', _origSettings.template); this.blur(); modal.close(); @@ -74,7 +75,7 @@ export function uiSettingsCustomBackground(context) { // accept the current template function clickSave() { - _currSettings.template = textSection.select('textarea').property('value'); + _currSettings.template = textSection.select('.field-template').property('value'); context.storage('background-custom-template', _currSettings.template); this.blur(); modal.close(); diff --git a/modules/ui/settings/custom_data.js b/modules/ui/settings/custom_data.js new file mode 100644 index 000000000..26c7039c2 --- /dev/null +++ b/modules/ui/settings/custom_data.js @@ -0,0 +1,113 @@ +import _cloneDeep from 'lodash-es/cloneDeep'; + +import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { event as d3_event } from 'd3-selection'; + +import { t } from '../../util/locale'; +import { uiConfirm } from '../confirm'; +import { utilNoAuto, utilRebind } from '../../util'; + + +export function uiSettingsCustomData(context) { + var dispatch = d3_dispatch('change'); + + function render(selection) { + var _origSettings = { + file: context.storage('settings-custom-data-file'), + template: context.storage('settings-custom-data-template') + }; + var _currSettings = _cloneDeep(_origSettings); + // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; + var modal = uiConfirm(selection).okButton(); + + modal + .classed('settings-modal settings-custom-data', true); + + modal.select('.modal-section.header') + .append('h3') + .text(t('settings.custom_data.header')); + + + var textSection = modal.select('.modal-section.message-text'); + + textSection + .append('pre') + .attr('class', 'instructions-file') + .text(t('settings.custom_data.file.instructions')); + + textSection + .append('input') + .attr('class', 'field-file') + .attr('type', 'file') + .on('change', function() { + var files = d3_event.target.files; + if (files && files.length) { + _currSettings.file = files[0]; + } else { + _currSettings.file = undefined; + } + }); + + textSection + .append('h4') + .text(t('settings.custom_data.or')); + + textSection + .append('pre') + .attr('class', 'instructions-template') + .text(t('settings.custom_data.template.instructions')); + + textSection + .append('textarea') + .attr('class', 'field-template') + .attr('placeholder', t('settings.custom_data.template.placeholder')) + .call(utilNoAuto) + .property('value', _currSettings.template); + + + // insert a cancel button, and adjust the button widths + var buttonSection = modal.select('.modal-section.buttons'); + + buttonSection + .insert('button', '.ok-button') + .attr('class', 'button col3 cancel-button secondary-action') + .text(t('confirm.cancel')); + + + buttonSection.select('.cancel-button') + .on('click.cancel', clickCancel); + + buttonSection.select('.ok-button') + .classed('col3', true) + .classed('col4', false) + .attr('disabled', isSaveDisabled) + .on('click.save', clickSave); + + + function isSaveDisabled() { + return null; + } + + + // restore the original template + function clickCancel() { + textSection.select('.field-template').property('value', _origSettings.template); + context.storage('settings-custom-data-template', _origSettings.template); + context.storage('settings-custom-data-file', _origSettings.file); + this.blur(); + modal.close(); + } + + // accept the current template + function clickSave() { + _currSettings.template = textSection.select('.field-template').property('value'); + context.storage('settings-custom-data-template', _currSettings.template); + context.storage('settings-custom-data-file', _currSettings.file); + this.blur(); + modal.close(); + dispatch.call('change', this, _currSettings); + } + } + + return utilRebind(render, dispatch, 'on'); +} diff --git a/modules/ui/settings/index.js b/modules/ui/settings/index.js index 52579d5d5..b8a047b26 100644 --- a/modules/ui/settings/index.js +++ b/modules/ui/settings/index.js @@ -1 +1,2 @@ export { uiSettingsCustomBackground } from './custom_background'; +export { uiSettingsCustomData } from './custom_data'; From 4cfd5b0078f0b170c7fd25c6341c090af69d8093 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 18 Aug 2018 08:33:43 -0400 Subject: [PATCH 125/217] Update custom data text strings --- data/core.yaml | 14 ++++---------- dist/locales/en.json | 17 +++++------------ modules/ui/map_data.js | 23 +++-------------------- 3 files changed, 12 insertions(+), 42 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 0faecc857..5d68d0340 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -460,6 +460,10 @@ en: notes: tooltip: Note data from OpenStreetMap title: OpenStreetMap notes + custom: + tooltip: "Drag and drop a data file onto the page, or click the button to setup" + title: Custom Map Data + zoom: Zoom to data fill_area: Fill Areas map_features: Map Features autohidden: "These features have been automatically hidden because too many would be shown on the screen. You can zoom in to edit them." @@ -620,16 +624,6 @@ en: out: Zoom out cannot_zoom: "Cannot zoom out further in current mode." full_screen: Toggle Full Screen - gpx: - local_layer: "Add a GPX" - drag_drop: "Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse" - zoom: "Zoom to layer" - browse: "Browse for a file" - mvt: - local_layer: "Add a MVT" - drag_drop: "Drag and drop a .mvt or .pbf file on the page, or click the button to the right to browse" - zoom: "Zoom to layer" - browse: "Browse for a file" streetside: tooltip: "Streetside photos from Microsoft" title: "Photo Overlay (Bing Streetside)" diff --git a/dist/locales/en.json b/dist/locales/en.json index 8489e25b1..0e247edf1 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -558,6 +558,11 @@ "notes": { "tooltip": "Note data from OpenStreetMap", "title": "OpenStreetMap notes" + }, + "custom": { + "tooltip": "Drag and drop a data file onto the page, or click the button to setup", + "title": "Custom Map Data", + "zoom": "Zoom to data" } }, "fill_area": "Fill Areas", @@ -754,18 +759,6 @@ }, "cannot_zoom": "Cannot zoom out further in current mode.", "full_screen": "Toggle Full Screen", - "gpx": { - "local_layer": "Add a GPX", - "drag_drop": "Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse", - "zoom": "Zoom to layer", - "browse": "Browse for a file" - }, - "mvt": { - "local_layer": "Add a MVT", - "drag_drop": "Drag and drop a .mvt or .pbf file on the page, or click the button to the right to browse", - "zoom": "Zoom to layer", - "browse": "Browse for a file" - }, "streetside": { "tooltip": "Streetside photos from Microsoft", "title": "Photo Overlay (Bing Streetside)", diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index ad4ba47fd..0f8ff4e9c 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -245,7 +245,7 @@ export function uiMapData(context) { liEnter .append('button') .call(tooltip() - .title(t('gpx.zoom')) + .title(t('map_data.layers.custom.zoom')) .placement((textDirection === 'rtl') ? 'right' : 'left') ) .on('click', function() { @@ -255,27 +255,10 @@ export function uiMapData(context) { }) .call(svgIcon('#iD-icon-search')); - // liEnter - // .append('button') - // .attr('class', 'list-item-data-browse') - // .call(tooltip() - // .title(t('gpx.browse')) - // .placement((textDirection === 'rtl') ? 'right' : 'left') - // ) - // .on('click', function() { - // d3_select(document.createElement('input')) - // .attr('type', 'file') - // .on('change', function() { - // dataLayer.files(d3_event.target.files); - // }) - // .node().click(); - // }) - // .call(svgIcon('#iD-icon-geolocate')); - var labelEnter = liEnter .append('label') .call(tooltip() - .title(t('gpx.drag_drop')) + .title(t('map_data.layers.custom.tooltip')) .placement('top') ); @@ -286,7 +269,7 @@ export function uiMapData(context) { labelEnter .append('span') - .text(t('gpx.local_layer')); + .text(t('map_data.layers.custom.title')); // Update ul = ul From 9802b2f8317ce3e3986a4b4a002b6a5774720340 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 18 Aug 2018 10:57:26 -0400 Subject: [PATCH 126/217] Restore 'custom' and 'none' options to background imagery list (closes #5226) --- modules/renderer/background.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/renderer/background.js b/modules/renderer/background.js index ff9010004..b227784ca 100644 --- a/modules/renderer/background.js +++ b/modules/renderer/background.js @@ -211,7 +211,7 @@ export function rendererBackground(context) { matchImagery.forEach(function(d) { matchIDs[d.id] = true; }); return _backgroundSources.filter(function(source) { - return matchIDs[source.id]; + return matchIDs[source.id] || !source.polygon; // no polygon = worldwide }); }; @@ -378,20 +378,18 @@ export function rendererBackground(context) { data.imagery.features = {}; // build efficient index and querying for data.imagery - var world = [[[-180, -90], [-180, 90], [180, 90], [180, -90], [-180, -90]]]; var features = data.imagery.map(function(source) { + if (!source.polygon) return null; var feature = { type: 'Feature', - id: source.id, - properties: _omit(source, ['polygon']), - geometry: { - type: 'MultiPolygon', - coordinates: [ source.polygon || world ] - } + properties: { id: source.id }, + geometry: { type: 'MultiPolygon', coordinates: [ source.polygon ] } }; + data.imagery.features[source.id] = feature; return feature; - }); + }).filter(Boolean); + data.imagery.query = whichPolygon({ type: 'FeatureCollection', features: features From ed851fb61b308dee09cf79eb376e0a44d3018075 Mon Sep 17 00:00:00 2001 From: rene78 <36115705+rene78@users.noreply.github.com> Date: Sat, 18 Aug 2018 21:18:14 +0200 Subject: [PATCH 127/217] Create badminton.json --- .../presets/leisure/pitch/badminton.json | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 data/presets/presets/leisure/pitch/badminton.json diff --git a/data/presets/presets/leisure/pitch/badminton.json b/data/presets/presets/leisure/pitch/badminton.json new file mode 100644 index 000000000..8d5851686 --- /dev/null +++ b/data/presets/presets/leisure/pitch/badminton.json @@ -0,0 +1,23 @@ +{ + "icon": "maki-tennis", + "fields": [ + "name", + "surface", + "lit", + "access_simple" + ], + "geometry": [ + "point", + "area" + ], + "tags": { + "leisure": "pitch", + "sport": "badminton" + }, + "reference": { + "key": "sport", + "value": "badminton" + }, + "terms": [], + "name": "Badminton Court" +} From 0840b8dff90576147bb2c324f9b5d15afafd9261 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 19 Aug 2018 00:31:08 -0400 Subject: [PATCH 128/217] More work on custom map data --- data/core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/core.yaml b/data/core.yaml index 5d68d0340..eaa11519b 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -525,7 +525,7 @@ en: placeholder: Enter a url template custom_data: tooltip: Edit custom data layer - header: Custom Data Settings + header: Custom Map Data Settings file: instructions: "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson/.json, .pbf, .mvt" label: "Browse files" From 92e095ec68ad9135909bc38352fe337f7fb29e0d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 19 Aug 2018 00:40:59 -0400 Subject: [PATCH 129/217] Use Biergarten as the preset name, and don't add building=yes (closes #5232) --- data/presets.yaml | 4 ++-- data/presets/presets.json | 2 +- data/presets/presets/amenity/biergarten.json | 4 ++-- data/taginfo.json | 2 +- dist/locales/en.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index 14fe61c70..34682e7c6 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -1932,9 +1932,9 @@ en: terms: '' amenity/biergarten: # amenity=biergarten - name: Beer Garden + name: Biergarten # 'terms: beer,bier,booze' - terms: '' + terms: '' amenity/boat_rental: # amenity=boat_rental name: Boat Rental diff --git a/data/presets/presets.json b/data/presets/presets.json index 23a674734..92514f134 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -53,7 +53,7 @@ "amenity/bicycle_parking": {"icon": "maki-bicycle", "fields": ["bicycle_parking", "capacity", "operator", "covered", "access_simple"], "geometry": ["point", "vertex", "area"], "terms": ["bike"], "tags": {"amenity": "bicycle_parking"}, "name": "Bicycle Parking"}, "amenity/bicycle_rental": {"icon": "maki-bicycle", "fields": ["capacity", "network", "operator", "payment_multi"], "geometry": ["point", "vertex", "area"], "terms": ["bike"], "tags": {"amenity": "bicycle_rental"}, "name": "Bicycle Rental"}, "amenity/bicycle_repair_station": {"icon": "maki-bicycle", "fields": ["operator", "brand", "opening_hours", "fee", "service/bicycle"], "geometry": ["point", "vertex"], "terms": ["bike", "repair", "chain", "pump"], "tags": {"amenity": "bicycle_repair_station"}, "name": "Bicycle Repair Tool Stand"}, - "amenity/biergarten": {"icon": "maki-beer", "fields": ["name", "address", "building_area", "opening_hours", "smoking", "outdoor_seating", "brewery"], "geometry": ["point", "area"], "tags": {"amenity": "biergarten"}, "terms": ["beer", "bier", "booze"], "name": "Beer Garden"}, + "amenity/biergarten": {"icon": "maki-beer", "fields": ["name", "address", "building", "opening_hours", "smoking", "outdoor_seating", "brewery"], "geometry": ["point", "area"], "tags": {"amenity": "biergarten"}, "terms": ["beer", "bier", "booze"], "name": "Biergarten"}, "amenity/boat_rental": {"fields": ["name", "operator", "payment_multi"], "geometry": ["point", "area"], "tags": {"amenity": "boat_rental"}, "name": "Boat Rental"}, "amenity/bureau_de_change": {"icon": "maki-bank", "fields": ["name", "currency_multi", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["bureau de change", "money changer"], "tags": {"amenity": "bureau_de_change"}, "name": "Currency Exchange"}, "amenity/cafe": {"icon": "maki-cafe", "fields": ["name", "cuisine", "address", "building_area", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["bistro", "coffee", "tea"], "tags": {"amenity": "cafe"}, "name": "Cafe"}, diff --git a/data/presets/presets/amenity/biergarten.json b/data/presets/presets/amenity/biergarten.json index 894220df5..5913f3819 100644 --- a/data/presets/presets/amenity/biergarten.json +++ b/data/presets/presets/amenity/biergarten.json @@ -3,7 +3,7 @@ "fields": [ "name", "address", - "building_area", + "building", "opening_hours", "smoking", "outdoor_seating", @@ -21,5 +21,5 @@ "bier", "booze" ], - "name": "Beer Garden" + "name": "Biergarten" } diff --git a/data/taginfo.json b/data/taginfo.json index fbdd0389b..bf4a65fd3 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -348,7 +348,7 @@ { "key": "amenity", "value": "biergarten", - "description": "Beer Garden", + "description": "Biergarten", "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/beer-15.svg?sanitize=true" }, diff --git a/dist/locales/en.json b/dist/locales/en.json index ca551b5a0..01726e4d6 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -3136,7 +3136,7 @@ "terms": "bike,repair,chain,pump" }, "amenity/biergarten": { - "name": "Beer Garden", + "name": "Biergarten", "terms": "beer,bier,booze" }, "amenity/boat_rental": { From db877ba8bbf3946e1c96996b259add0861a26dac Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 19 Aug 2018 00:45:37 -0400 Subject: [PATCH 130/217] Add `listed_status` to whitelist of tags that autocomplete uppercase (closes #5231) --- modules/services/taginfo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/services/taginfo.js b/modules/services/taginfo.js index 594cd54a5..cc8df7041 100644 --- a/modules/services/taginfo.js +++ b/modules/services/taginfo.js @@ -264,7 +264,7 @@ export default { // A few OSM keys expect values to contain uppercase values (see #3377). // This is not an exhaustive list (e.g. `name` also has uppercase values) // but these are the fields where taginfo value lookup is most useful. - var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|booth|rating|stars|:output|_hours|_times/; + var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/; var allowUpperCase = (params.key.match(re) !== null); var f = filterValues(allowUpperCase); From 151aca246de31698c8a93e6f760cdc0a76b90ced Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 19 Aug 2018 17:10:06 -0400 Subject: [PATCH 131/217] Add "apothecary" as a search term for pharmacies and chemists (closes #5235) --- data/presets.yaml | 4 ++-- data/presets/presets.json | 4 ++-- data/presets/presets/amenity/pharmacy.json | 1 + data/presets/presets/shop/chemist.json | 1 + dist/locales/en.json | 4 ++-- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index 34682e7c6..988131d7c 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -2174,7 +2174,7 @@ en: amenity/pharmacy: # amenity=pharmacy name: Pharmacy - # 'terms: drug*,med*,prescription' + # 'terms: apothecary,drug*,med*,prescription' terms: '' amenity/place_of_worship: # amenity=place_of_worship @@ -5231,7 +5231,7 @@ en: shop/chemist: # shop=chemist name: Drugstore - # 'terms: med*,drug*,gift' + # 'terms: apothecary,med*,drug*,gift' terms: '' shop/chocolate: # shop=chocolate diff --git a/data/presets/presets.json b/data/presets/presets.json index 92514f134..24743ec07 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -103,7 +103,7 @@ "amenity/parking_space": {"fields": ["capacity"], "geometry": ["point", "vertex", "area"], "terms": [], "tags": {"amenity": "parking_space"}, "matchScore": 0.95, "name": "Parking Space"}, "amenity/parking": {"icon": "maki-parking", "fields": ["name", "operator", "parking", "capacity", "fee", "access_simple", "supervised", "park_ride", "surface", "maxstay"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "parking"}, "terms": [], "name": "Car Parking"}, "amenity/pavilion": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "shelter", "shelter_type": "pavilion"}, "name": "Pavilion"}, - "amenity/pharmacy": {"icon": "maki-pharmacy", "fields": ["name", "operator", "address", "building_area", "drive_through", "opening_hours", "payment_multi", "dispensing"], "geometry": ["point", "area"], "tags": {"amenity": "pharmacy"}, "addTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "removeTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "reference": {"key": "amenity", "value": "pharmacy"}, "terms": ["drug*", "med*", "prescription"], "name": "Pharmacy"}, + "amenity/pharmacy": {"icon": "maki-pharmacy", "fields": ["name", "operator", "address", "building_area", "drive_through", "opening_hours", "payment_multi", "dispensing"], "geometry": ["point", "area"], "tags": {"amenity": "pharmacy"}, "addTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "removeTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "reference": {"key": "amenity", "value": "pharmacy"}, "terms": ["apothecary", "drug*", "med*", "prescription"], "name": "Pharmacy"}, "amenity/place_of_worship": {"icon": "maki-place-of-worship", "fields": ["name", "religion", "denomination", "address", "building_area", "service_times"], "geometry": ["point", "area"], "terms": ["abbey", "basilica", "bethel", "cathedral", "chancel", "chantry", "chapel", "church", "fold", "house of God", "house of prayer", "house of worship", "minster", "mission", "mosque", "oratory", "parish", "sacellum", "sanctuary", "shrine", "synagogue", "tabernacle", "temple"], "tags": {"amenity": "place_of_worship"}, "name": "Place of Worship"}, "amenity/place_of_worship/buddhist": {"icon": "maki-buddhism", "fields": ["name", "denomination", "building_area", "address", "service_times"], "geometry": ["point", "area"], "terms": ["stupa", "vihara", "monastery", "temple", "pagoda", "zendo", "dojo"], "tags": {"amenity": "place_of_worship", "religion": "buddhist"}, "reference": {"key": "amenity", "value": "place_of_worship"}, "name": "Buddhist Temple"}, "amenity/place_of_worship/christian": {"icon": "maki-religious-christian", "fields": ["name", "denomination", "building_area", "address", "service_times"], "geometry": ["point", "area"], "terms": ["christian", "abbey", "basilica", "bethel", "cathedral", "chancel", "chantry", "chapel", "fold", "house of God", "house of prayer", "house of worship", "minster", "mission", "oratory", "parish", "sacellum", "sanctuary", "shrine", "tabernacle", "temple"], "tags": {"amenity": "place_of_worship", "religion": "christian"}, "reference": {"key": "amenity", "value": "place_of_worship"}, "name": "Church"}, @@ -773,7 +773,7 @@ "shop/carpet": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["rug"], "tags": {"shop": "carpet"}, "name": "Carpet Store"}, "shop/charity": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "second_hand", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["thrift", "op shop", "nonprofit"], "tags": {"shop": "charity"}, "name": "Charity Store"}, "shop/cheese": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "cheese"}, "name": "Cheese Store"}, - "shop/chemist": {"icon": "maki-grocery", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "chemist"}, "terms": ["med*", "drug*", "gift"], "name": "Drugstore"}, + "shop/chemist": {"icon": "maki-grocery", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "chemist"}, "terms": ["apothecary", "med*", "drug*", "gift"], "name": "Drugstore"}, "shop/chocolate": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "chocolate"}, "name": "Chocolate Store"}, "shop/clothes": {"icon": "maki-clothing-store", "fields": ["name", "clothes", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "clothes"}, "name": "Clothing Store"}, "shop/coffee": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "coffee"}, "name": "Coffee Store"}, diff --git a/data/presets/presets/amenity/pharmacy.json b/data/presets/presets/amenity/pharmacy.json index b12d69ae9..69f0a5d9e 100644 --- a/data/presets/presets/amenity/pharmacy.json +++ b/data/presets/presets/amenity/pharmacy.json @@ -30,6 +30,7 @@ "value": "pharmacy" }, "terms": [ + "apothecary", "drug*", "med*", "prescription" diff --git a/data/presets/presets/shop/chemist.json b/data/presets/presets/shop/chemist.json index 7f0302acb..f093f4610 100644 --- a/data/presets/presets/shop/chemist.json +++ b/data/presets/presets/shop/chemist.json @@ -16,6 +16,7 @@ "shop": "chemist" }, "terms": [ + "apothecary", "med*", "drug*", "gift" diff --git a/dist/locales/en.json b/dist/locales/en.json index 01726e4d6..587aa0b0f 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -3337,7 +3337,7 @@ }, "amenity/pharmacy": { "name": "Pharmacy", - "terms": "drug*,med*,prescription" + "terms": "apothecary,drug*,med*,prescription" }, "amenity/place_of_worship": { "name": "Place of Worship", @@ -6017,7 +6017,7 @@ }, "shop/chemist": { "name": "Drugstore", - "terms": "med*,drug*,gift" + "terms": "apothecary,med*,drug*,gift" }, "shop/chocolate": { "name": "Chocolate Store", From d8d782154f168b7efd85ceb6331d5c004b0c3ba6 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Mon, 20 Aug 2018 10:41:47 +0000 Subject: [PATCH 132/217] Add Using GitHub and Git --- CONTRIBUTING.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d43a07547..64ea71ba9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -366,3 +366,47 @@ The `iD.js` and `iD.min.js` files in this project are autogenerated - don't edit 2. Run lint and tests with `npm test` 3. Commit your changes with an informative commit message 4. [Submit a pull request](https://help.github.com/articles/using-pull-requests) to the `openstreetmap/iD` project. + +## Using GitHub and git + +If you are new to GitHub or git you can read the [GitHub Guides](https://guides.github.com) +"Understanding the GitHub Flow", "Git Handbook" and "Forking Projects" could be especially intresting to you. + +## Step by Step + +Addtionaly here is a step-by-step workflow example for beginners: + +1. [Login](https://github.com/login) to your GitHub account or [create](https://services.github.com/on-demand/intro-to-github/create-github-account) a GitHub account, if you do not already have one. + +2. Go to the [iD main repository](https://github.com/openstreetmap/iD) and fork iD into your GitHub account (Fork is top right). + +3. Set up [Git](https://help.github.com/articles/set-up-git/) and prepare for Authenticating with GitHub from Git. + +4. Clone or download your local copy of iD from your GitHub account using https `git clone https://github.com:/iD.git` or using ssh `git clone git@github.com:/iD.git`. In your local copy you'll have a "remote" called origin. + +5. Switch to the iD directory, create a working branch (choose a descriptive name) and switch to it : `cd iD ; git checkout -b `. Never do anything in master branch. + +6. Edit file(s) and try your change locally (See above). + +7. Add Files and commit them `git add ; git commit -m "Description of what you did"` .. repeat repeat as needed.. + +8. Push Changes to your GitHub account `git push --set-upstream origin master` + +9. Go to GitHub for your fork of iD at https://github.com/ ; git branch -d ` + +## Restart with another PR after some while + +If you did not use your copy of iD for some while, other Pull Request gets merged and you dont have the latest version of iD. You can replace your master with whatever is in our master. If you have not done so yet: Add the main repo as an "upstream" remote: +`git remote add upstream git@github.com:openstreetmap/iD.git` +Then change to the master branch and get everything from upstream (the main repository) +`git checkout master ; git fetch --all && git reset --hard upstream/master` + From e758fd50c9f6359466e2d99d253600557a332c36 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Mon, 20 Aug 2018 10:58:42 +0000 Subject: [PATCH 133/217] More Information about pushing to origin --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 64ea71ba9..25d94f06b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -390,7 +390,7 @@ Addtionaly here is a step-by-step workflow example for beginners: 7. Add Files and commit them `git add ; git commit -m "Description of what you did"` .. repeat repeat as needed.. -8. Push Changes to your GitHub account `git push --set-upstream origin master` +8. Push Changes to your GitHub account `git push origin `. The next push also works without the branche name: `git push origin`. 9. Go to GitHub for your fork of iD at https://github.com/ Date: Mon, 20 Aug 2018 11:05:45 +0000 Subject: [PATCH 134/217] improved spelling --- CONTRIBUTING.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 25d94f06b..7f2c594d7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -370,11 +370,11 @@ The `iD.js` and `iD.min.js` files in this project are autogenerated - don't edit ## Using GitHub and git If you are new to GitHub or git you can read the [GitHub Guides](https://guides.github.com) -"Understanding the GitHub Flow", "Git Handbook" and "Forking Projects" could be especially intresting to you. +"Understanding the GitHub Flow", "Git Handbook" and "Forking Projects" could be especially interesting to you. ## Step by Step -Addtionaly here is a step-by-step workflow example for beginners: +Additionally here is a step-by-step workflow example for beginners: 1. [Login](https://github.com/login) to your GitHub account or [create](https://services.github.com/on-demand/intro-to-github/create-github-account) a GitHub account, if you do not already have one. @@ -388,24 +388,24 @@ Addtionaly here is a step-by-step workflow example for beginners: 6. Edit file(s) and try your change locally (See above). -7. Add Files and commit them `git add ; git commit -m "Description of what you did"` .. repeat repeat as needed.. +7. Add Files and commit them `git add ; git commit -m "Description of what you did"` .. repeat as needed .. -8. Push Changes to your GitHub account `git push origin `. The next push also works without the branche name: `git push origin`. +8. Push Changes to your GitHub account `git push origin `. The next push also works without the branch name: `git push origin`. 9. Go to GitHub for your fork of iD at https://github.com/ ; git branch -d ` +`git push --delete origin ; git branch -d ` ## Restart with another PR after some while -If you did not use your copy of iD for some while, other Pull Request gets merged and you dont have the latest version of iD. You can replace your master with whatever is in our master. If you have not done so yet: Add the main repo as an "upstream" remote: +If you did not use your copy of iD for some while, other Pull Request gets merged and you don't have the latest version of iD. You can replace your master with whatever is in our master. If you have not done so yet: Add the main repo as an "upstream" remote: `git remote add upstream git@github.com:openstreetmap/iD.git` Then change to the master branch and get everything from upstream (the main repository) `git checkout master ; git fetch --all && git reset --hard upstream/master` From 9009d55fd1023111d9e90c81610b5e7e26c1764c Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 20 Aug 2018 21:54:00 -0400 Subject: [PATCH 135/217] Add a vector tile service --- dist/locales/en.json | 2 +- modules/renderer/background.js | 1 - modules/services/index.js | 3 + modules/services/vector_tile.js | 147 ++++++++++++++++++++++++++++++++ 4 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 modules/services/vector_tile.js diff --git a/dist/locales/en.json b/dist/locales/en.json index 0e247edf1..97b5a1693 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -646,7 +646,7 @@ }, "custom_data": { "tooltip": "Edit custom data layer", - "header": "Custom Data Settings", + "header": "Custom Map Data Settings", "file": { "instructions": "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson/.json, .pbf, .mvt", "label": "Browse files" diff --git a/modules/renderer/background.js b/modules/renderer/background.js index b227784ca..2754c1001 100644 --- a/modules/renderer/background.js +++ b/modules/renderer/background.js @@ -1,5 +1,4 @@ import _find from 'lodash-es/find'; -import _omit from 'lodash-es/omit'; import { dispatch as d3_dispatch } from 'd3-dispatch'; import { interpolateNumber as d3_interpolateNumber } from 'd3-interpolate'; diff --git a/modules/services/index.js b/modules/services/index.js index 789628ed5..83cc8114b 100644 --- a/modules/services/index.js +++ b/modules/services/index.js @@ -4,6 +4,7 @@ import serviceOpenstreetcam from './openstreetcam'; import serviceOsm from './osm'; import serviceStreetside from './streetside'; import serviceTaginfo from './taginfo'; +import serviceVectorTile from './vector_tile'; import serviceWikidata from './wikidata'; import serviceWikipedia from './wikipedia'; @@ -14,6 +15,7 @@ export var services = { osm: serviceOsm, streetside: serviceStreetside, taginfo: serviceTaginfo, + vectorTile: serviceVectorTile, wikidata: serviceWikidata, wikipedia: serviceWikipedia }; @@ -25,6 +27,7 @@ export { serviceOsm, serviceStreetside, serviceTaginfo, + serviceVectorTile, serviceWikidata, serviceWikipedia }; diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js new file mode 100644 index 000000000..03c1dbd42 --- /dev/null +++ b/modules/services/vector_tile.js @@ -0,0 +1,147 @@ +import _find from 'lodash-es/find'; +import _forEach from 'lodash-es/forEach'; + +import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { request as d3_request } from 'd3-request'; + +import Protobuf from 'pbf'; +import vt from '@mapbox/vector-tile'; + +import { utilRebind, utilTiler } from '../util'; + + +var tiler = utilTiler().tileSize(512); +var dispatch = d3_dispatch('loadedData'); +var _vtCache; + + +function abortRequest(i) { + i.abort(); +} + + +function vtToGeoJSON(bufferdata) { + var tile = new vt.VectorTile(new Protobuf(bufferdata.data.response)); + var layers = Object.keys(tile.layers); + if (!Array.isArray(layers)) { layers = [layers]; } + + var collection = { type: 'FeatureCollection', features: [] }; + + layers.forEach(function (layerID) { + var layer = tile.layers[layerID]; + if (layer) { + for (var i = 0; i < layer.length; i++) { + var feature = layer.feature(i).toGeoJSON(bufferdata.zxy[2], bufferdata.zxy[3], bufferdata.zxy[1]); + if (layers.length > 1) feature.properties.vt_layer = layerID; + collection.features.push(feature); + } + } + }); + + return collection; +} + + +function loadTile(source, tile) { + if (source.loaded[tile.id] || source.inflight[tile.id]) return; + + var url = source.template + .replace('{x}', tile.xyz[0]) + .replace('{y}', tile.xyz[1]) + // TMS-flipped y coordinate + .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1) + .replace(/\{z(oom)?\}/, tile.xyz[2]) + .replace(/\{switch:([^}]+)\}/, function(s, r) { + var subdomains = r.split(','); + return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length]; + }); + + + source.inflight[tile.id] = d3_request(url) + .responseType('arraybuffer') + .get(function(err, data) { + source.loaded[tile.id] = true; + delete source.inflight[tile.id]; + if (err || !data) return; + + source.loaded[tile.id] = { + bufferdata: data, + geojson: vtToGeoJSON(data) + }; + + dispatch.call('loadedData'); + }); +} + + +export default { + + init: function() { + if (!_vtCache) { + this.reset(); + } + + this.event = utilRebind(this, dispatch, 'on'); + }, + + + reset: function() { + for (var sourceID in _vtCache) { + var source = _vtCache[sourceID]; + if (source && source.inflight) { + _forEach(source.inflight, abortRequest); + } + } + + _vtCache = {}; + }, + + + addSource: function(sourceID, template) { + _vtCache[sourceID] = { template: template, inflight: {}, loaded: {} }; + return _vtCache[sourceID]; + }, + + + data: function(sourceID, projection) { + var source = _vtCache[sourceID]; + if (!source) return []; + + // for now, return the FeatureCollection for each tile + var tiles = tiler.getTiles(projection); + return tiles.map(function(tile) { + var loaded = source.loaded[tile.id]; + return loaded && loaded.geojson; + }).filter(Boolean); + }, + + + loadTiles: function(sourceID, template, projection) { + var source = _vtCache[sourceID]; + if (!source) { + source = this.addSource(sourceID, template); + } + + var tiles = tiler.getTiles(projection); + + // abort inflight requests that are no longer needed + _forEach(source.inflight, function(v, k) { + var wanted = _find(tiles, function(tile) { return k === tile.id; }); + + if (!wanted) { + abortRequest(v); + delete source.inflight[k]; + } + }); + + tiles.forEach(function(tile) { + loadTile(source, tile); + }); + }, + + + cache: function() { + return _vtCache; + } + +}; From 575c98ab282d1d0c6a201170122815fc95e19500 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 21 Aug 2018 01:25:24 -0400 Subject: [PATCH 136/217] Accept both file and vector tile url templates from settings screen --- css/20_map.css | 12 +- modules/svg/data.js | 204 ++++++++++++++++++++--------- modules/ui/map_data.js | 15 +-- modules/ui/settings/custom_data.js | 20 ++- test/spec/svg/data.js | 4 +- 5 files changed, 172 insertions(+), 83 deletions(-) diff --git a/css/20_map.css b/css/20_map.css index ce45960a9..79c127555 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -309,28 +309,28 @@ g.turn circle { /* Other Data (gpx, kml, geojson, mvt, pbf) */ -.layer-geojson { +.layer-mapdata { pointer-events: none; } -.layer-geojson path { +.layer-mapdata path { stroke: #ff26d4; stroke-width: 2; fill: none; } -.layer-geojson text.label-halo, -.layer-geojson text.label { +.layer-mapdata text.label-halo, +.layer-mapdata text.label { font-size: 10px; font-weight: bold; dominant-baseline: middle; } -.layer-geojson text.label { +.layer-mapdata text.label { fill: #ff26d4; } -.layer-geojson text.label-halo { +.layer-mapdata text.label-halo { opacity: 0.7; stroke: #000; stroke-width: 5px; diff --git a/modules/svg/data.js b/modules/svg/data.js index 350d5d76a..f773ba9d0 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -2,6 +2,7 @@ import _flatten from 'lodash-es/flatten'; import _isEmpty from 'lodash-es/isEmpty'; import _reduce from 'lodash-es/reduce'; import _union from 'lodash-es/union'; +import _throttle from 'lodash-es/throttle'; import { geoBounds as d3_geoBounds } from 'd3-geo'; @@ -20,6 +21,7 @@ import vt from '@mapbox/vector-tile'; import Protobuf from 'pbf'; import { geoExtent, geoPolygonIntersectsPolygon } from '../geo'; +import { services } from '../services'; import { svgPath } from './index'; import { utilDetect } from '../util/detect'; @@ -30,9 +32,13 @@ var _geojson; export function svgData(projection, context, dispatch) { + var throttledRedraw = _throttle(function () { dispatch.call('change'); }, 1000); var _showLabels = true; var detected = utilDetect(); - var layer; + var layer = d3_select(null); + var _vtService; + var _fileList; + var _template; // todo, if template is set, use vectorTile service var _src; @@ -54,7 +60,7 @@ export function svgData(projection, context, dispatch) { d3_event.stopPropagation(); d3_event.preventDefault(); if (!detected.filedrop) return; - drawData.files(d3_event.dataTransfer.files); + drawData.fileList(d3_event.dataTransfer.files); }) .on('dragenter.svgData', over) .on('dragexit.svgData', over) @@ -64,24 +70,71 @@ export function svgData(projection, context, dispatch) { } + function getService() { + if (services.vectorTile && !_vtService) { + _vtService = services.vectorTile; + _vtService.event.on('loadedData', throttledRedraw); + } else if (!services.vectorTile && _vtService) { + _vtService = null; + } + + return _vtService; + } + + + function showLayer() { + layerOn(); + + layer + .style('opacity', 0) + .transition() + .duration(250) + .style('opacity', 1) + .on('end', function () { dispatch.call('change'); }); + } + + + function hideLayer() { + throttledRedraw.cancel(); + + layer + .transition() + .duration(250) + .style('opacity', 0) + .on('end', layerOff); + } + + + function layerOn() { + layer.style('display', 'block'); + } + + + function layerOff() { + layer.selectAll('.viewfield-group').remove(); + layer.style('display', 'none'); + } + + function drawData(selection) { var getPath = svgPath(projection).geojson; + var hasData = drawData.hasData(); - layer = selection.selectAll('.layer-geojson') - .data(_enabled ? [0] : []); + layer = selection.selectAll('.layer-mapdata') + .data(_enabled && hasData ? [0] : []); layer.exit() .remove(); layer = layer.enter() .append('g') - .attr('class', 'layer-geojson') + .attr('class', 'layer-mapdata') .merge(layer); var paths = layer .selectAll('path') - .data([_geojson]); + .data(hasData ? [_geojson] : []); paths.exit() .remove(); @@ -95,7 +148,7 @@ export function svgData(projection, context, dispatch) { .attr('d', getPath); - var labelData = _showLabels && _geojson.features ? _geojson.features : []; + var labelData = (_showLabels && hasData && _geojson.features) || []; labelData = labelData.filter(getPath); layer @@ -175,26 +228,34 @@ export function svgData(projection, context, dispatch) { } - function parseSaveAndZoom(extension, data, name) { + drawData.setFile = function(extension, data, src) { + var gj; switch (extension) { case '.gpx': - drawData.geojson(toGeoJSON.gpx(toDom(data)), name).fitZoom(); + gj = toGeoJSON.gpx(toDom(data)); break; case '.kml': - drawData.geojson(toGeoJSON.kml(toDom(data)), name).fitZoom(); + gj = toGeoJSON.kml(toDom(data)); break; case '.pbf': - drawData.geojson(vtToGeoJSON(data), name).fitZoom(); + gj = vtToGeoJSON(data); break; case '.mvt': - drawData.geojson(vtToGeoJSON(data), name).fitZoom(); + gj = vtToGeoJSON(data); break; case '.geojson': case '.json': - drawData.geojson(JSON.parse(data), name).fitZoom(); + gj = JSON.parse(data); break; } - } + + if (!gj || _isEmpty(gj) || _isEmpty(gj.features)) return; + _geojson = gj; + _src = src || 'unknown.geojson'; + + dispatch.call('change'); + return this.fitZoom(); + }; drawData.showLabels = function(val) { @@ -207,6 +268,12 @@ export function svgData(projection, context, dispatch) { drawData.enabled = function(val) { if (!arguments.length) return _enabled; _enabled = val; + if (_enabled) { + showLayer(); + } else { + hideLayer(); + } + dispatch.call('change'); return this; }; @@ -217,16 +284,74 @@ export function svgData(projection, context, dispatch) { }; + drawData.template = function(val) { + if (!arguments.length) return _template; + + _template = val; + _fileList = null; + _geojson = null; + _src = 'vector tiles'; + + dispatch.call('change'); + return this; + }; + + drawData.geojson = function(gj, src) { if (!arguments.length) return _geojson; - if (_isEmpty(gj) || _isEmpty(gj.features)) return this; + + _template = null; + _fileList = null; _geojson = gj; _src = src || 'unknown.geojson'; + dispatch.call('change'); return this; }; + drawData.fileList = function(fileList) { + if (!arguments.length) return _fileList; + + _template = null; + _fileList = fileList; + _geojson = null; + _src = null; + + if (!fileList || !fileList.length) return this; + var f = fileList[0]; + var reader = new FileReader(); + var extension = getExtension(f.name); + + if (extension === 'mvt' || extension === 'pbf') { + reader.onload = (function(file) { + return; // todo find x,y,z + var data = []; + var zxy = [0,0,0]; + + var bufferdata = { data: data, zxy: zxy }; + return function (e) { + bufferdata.data = e.target.result; + drawData.setFile(extension, bufferdata, file.name); + }; + })(f); + + reader.readAsArrayBuffer(f); + + } else { + reader.onload = (function(file) { + return function (e) { + drawData.setFile(extension, e.target.result, file.name); + }; + })(f); + + reader.readAsText(f); + } + + return this; + }; + + drawData.url = function(url) { var extension = getExtension(url); if (extension === 'mvt' || extension === 'pbf') { @@ -238,16 +363,13 @@ export function svgData(projection, context, dispatch) { var match = url.match(/(pbf|mvt)/i); var extension = match ? ('.' + match[0].toLowerCase()) : ''; var zxy = url.match(/\/(\d+)\/(\d+)\/(\d+)/); - var bufferdata = { - data : data, - zxy : zxy - }; - parseSaveAndZoom(extension, bufferdata); + var bufferdata = { data : data, zxy : zxy }; + drawData.setFile(extension, bufferdata, url); }); } else { d3_text(url, function(err, data) { if (!err) { - parseSaveAndZoom(extension, data, url); + drawData.setFile(extension, data, url); } }); } @@ -256,46 +378,6 @@ export function svgData(projection, context, dispatch) { }; - drawData.files = function(fileList) { - if (!fileList.length) return this; - var f = fileList[0]; - var reader = new FileReader(); - var extension = getExtension(f.name); - - if (extension === 'mvt' || extension === 'pbf') { - reader.onload = (function(file) { - return; // todo find x,y,z - var data = []; - var zxy = [0,0,0]; - - _src = file.name; - var extension = getExtension(file.name); - var bufferdata = { - data: data, - zxy: zxy - }; - return function (e) { - bufferdata.data = e.target.result; - parseSaveAndZoom(extension, bufferdata); - }; - })(f); - - reader.readAsArrayBuffer(f); - - } else { - reader.onload = (function(file) { - return function (e) { - parseSaveAndZoom(extension, e.target.result, file.name); - }; - })(f); - - reader.readAsText(f); - } - - return this; - }; - - drawData.getSrc = function() { return _src; }; diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index 0f8ff4e9c..8eec067ff 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -293,14 +293,13 @@ export function uiMapData(context) { function customChanged(d) { -console.log('custom was changed'); - // if (d && d.template) { - // _customSource.template(d.template); - // chooseBackground(_customSource); - // } else { - // _customSource.template(''); - // chooseBackground(context.background().findSource('none')); - // } + var dataLayer = layers.layer('data'); + + if (d && d.template) { + dataLayer.template(d.template); + } else if (d && d.fileList) { + dataLayer.fileList(d.fileList); + } } diff --git a/modules/ui/settings/custom_data.js b/modules/ui/settings/custom_data.js index 26c7039c2..ffa454588 100644 --- a/modules/ui/settings/custom_data.js +++ b/modules/ui/settings/custom_data.js @@ -12,11 +12,13 @@ export function uiSettingsCustomData(context) { var dispatch = d3_dispatch('change'); function render(selection) { + var dataLayer = context.layers().layer('data'); var _origSettings = { - file: context.storage('settings-custom-data-file'), + fileList: (dataLayer && dataLayer.fileList()) || null, template: context.storage('settings-custom-data-template') }; var _currSettings = _cloneDeep(_origSettings); + // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png'; var modal = uiConfirm(selection).okButton(); @@ -39,12 +41,15 @@ export function uiSettingsCustomData(context) { .append('input') .attr('class', 'field-file') .attr('type', 'file') + .property('files', _currSettings.fileList) // works for all except IE11 .on('change', function() { var files = d3_event.target.files; if (files && files.length) { - _currSettings.file = files[0]; + _currSettings.template = ''; + textSection.select('.field-template').property('value', ''); + _currSettings.fileList = files; } else { - _currSettings.file = undefined; + _currSettings.fileList = null; } }); @@ -93,16 +98,19 @@ export function uiSettingsCustomData(context) { function clickCancel() { textSection.select('.field-template').property('value', _origSettings.template); context.storage('settings-custom-data-template', _origSettings.template); - context.storage('settings-custom-data-file', _origSettings.file); this.blur(); modal.close(); } // accept the current template function clickSave() { - _currSettings.template = textSection.select('.field-template').property('value'); + _currSettings.template = textSection.select('.field-template').property('value').trim(); + + // one or the other but not both + if (_currSettings.template) { _currSettings.fileList = null; } + if (_currSettings.fileList) { _currSettings.template = ''; } + context.storage('settings-custom-data-template', _currSettings.template); - context.storage('settings-custom-data-file', _currSettings.file); this.blur(); modal.close(); dispatch.call('change', this, _currSettings); diff --git a/test/spec/svg/data.js b/test/spec/svg/data.js index fa92be0d5..8068fc18b 100644 --- a/test/spec/svg/data.js +++ b/test/spec/svg/data.js @@ -41,11 +41,11 @@ describe('iD.svgData', function () { }); - it('creates layer-geojson', function () { + it('creates layer-mapdata', function () { var render = iD.svgData(projection, context, dispatch); surface.call(render); - var layers = surface.selectAll('g.layer-geojson').nodes(); + var layers = surface.selectAll('g.layer-mapdata').nodes(); expect(layers.length).to.eql(1); }); From 1f5066bde19ddc2f9a63d9160682033b5b6e9a89 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Tue, 21 Aug 2018 10:05:27 +0200 Subject: [PATCH 137/217] Add Submitting from Browser to CONTRIBUTNG.md --- CONTRIBUTING.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7f2c594d7..29703ac58 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -392,7 +392,7 @@ Additionally here is a step-by-step workflow example for beginners: 8. Push Changes to your GitHub account `git push origin `. The next push also works without the branch name: `git push origin`. -9. Go to GitHub for your fork of iD at https://github.com//iD. GitHub will already know about your recently pushed branch, and ask if you want to create a Pull Request for it. 10. Your Pull Request will be seen by the maintainers of iD. They can merge it or ask for changes. You can update your Pull Request with Steps 7 and 8, Step 9 is required only once per Pull Request. @@ -406,7 +406,17 @@ you can clean up by deleting the branch from your GitHub-iD-Clone and your local ## Restart with another PR after some while If you did not use your copy of iD for some while, other Pull Request gets merged and you don't have the latest version of iD. You can replace your master with whatever is in our master. If you have not done so yet: Add the main repo as an "upstream" remote: + `git remote add upstream git@github.com:openstreetmap/iD.git` + Then change to the master branch and get everything from upstream (the main repository) + `git checkout master ; git fetch --all && git reset --hard upstream/master` + +## Submitting directly on GitHub (Documentation, Spell fixes, etc.) + +If you want to submit with need of testing, you can do this in GitHub without git. +You also need a GitHub account but you can submit directly from your Browser, see +this [GitHub Help Article](https://help.github.com/articles/editing-files-in-another-user-s-repository/). +Please don't use this to change Code and create untested Pull Requests. From e35031760d3b9ff60729273fb5a1c95ee77fe864 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Tue, 21 Aug 2018 10:38:53 +0200 Subject: [PATCH 138/217] Improve spelling, wording and style --- CONTRIBUTING.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 29703ac58..f7f168bbf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,7 +62,7 @@ Issues that have a big impact or matter most to _new mappers_. [priority_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Apriority Red labels are for **bugs**. These are things that we want fixed, but might be a bit more -complicted than the green action items. +complicated than the green action items. * [![bug][bug]][bug_link] [![bug-release-blocker][bug-release-blocker]][bug-release-blocker_link] @@ -182,6 +182,7 @@ Work in Progress. Don't start work on these, somebody else already did! [bluesky_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Abluesky [wip_link]: https://github.com/openstreetmap/iD/issues?q=is%3Aopen+is%3Aissue+label%3Awip + ## Verifying Bug Fixes To verify a bug fix (or test a new feature), use the [master deployment](http://preview.ideditor.com/master/) @@ -191,6 +192,7 @@ latest code and translation strings. The deployments on openstreetmap.org and http://preview.ideditor.com/release/ are updated only with stable releases. Issues that are marked fixed in the tracker may still be present. + ## Translating Translations are managed using the @@ -243,6 +245,7 @@ These are separate translations for uniformity reasons and because some language may translate "type" differently in "type of aeroway" and "type of amenity", for example. + ## Adding New Strings for Translation or Updating Existing Strings iD translates strings with a `t` function - `t('foo.bar')` translate the key @@ -334,6 +337,7 @@ Test your code and make sure it passes. 2. run `npm install` 3. run `npm test` to see whether your tests pass or fail. + ## Building / Installing You can rebuild iD completely with the command `npm run all`. @@ -367,12 +371,13 @@ The `iD.js` and `iD.min.js` files in this project are autogenerated - don't edit 3. Commit your changes with an informative commit message 4. [Submit a pull request](https://help.github.com/articles/using-pull-requests) to the `openstreetmap/iD` project. + ## Using GitHub and git If you are new to GitHub or git you can read the [GitHub Guides](https://guides.github.com) "Understanding the GitHub Flow", "Git Handbook" and "Forking Projects" could be especially interesting to you. -## Step by Step +# Step by Step Additionally here is a step-by-step workflow example for beginners: @@ -396,14 +401,14 @@ Additionally here is a step-by-step workflow example for beginners: 10. Your Pull Request will be seen by the maintainers of iD. They can merge it or ask for changes. You can update your Pull Request with Steps 7 and 8, Step 9 is required only once per Pull Request. -## Clean Up +# Clean Up After your Pull Request gets merged into the main repository you can clean up by deleting the branch from your GitHub-iD-Clone and your local directory `git push --delete origin ; git branch -d ` -## Restart with another PR after some while +# Restart with another PR after some while If you did not use your copy of iD for some while, other Pull Request gets merged and you don't have the latest version of iD. You can replace your master with whatever is in our master. If you have not done so yet: Add the main repo as an "upstream" remote: @@ -413,10 +418,8 @@ Then change to the master branch and get everything from upstream (the main repo `git checkout master ; git fetch --all && git reset --hard upstream/master` +# Submitting directly in the Browser -## Submitting directly on GitHub (Documentation, Spell fixes, etc.) - -If you want to submit with need of testing, you can do this in GitHub without git. -You also need a GitHub account but you can submit directly from your Browser, see -this [GitHub Help Article](https://help.github.com/articles/editing-files-in-another-user-s-repository/). +If you want to submit Documentation, Spelling improvements, etc. which do not need testing, +you can do this with your browser in GitHub. You also need a GitHub account and this [GitHub Help Article](https://help.github.com/articles/editing-files-in-another-user-s-repository/). Please don't use this to change Code and create untested Pull Requests. From 459fb3fcc6db3807d510485030f3754708e81be6 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Tue, 21 Aug 2018 11:54:26 +0200 Subject: [PATCH 139/217] Step by Step workflow with Browser --- CONTRIBUTING.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7f168bbf..b622fa7ae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -418,8 +418,28 @@ Then change to the master branch and get everything from upstream (the main repo `git checkout master ; git fetch --all && git reset --hard upstream/master` -# Submitting directly in the Browser + +## Submitting directly in the Browser If you want to submit Documentation, Spelling improvements, etc. which do not need testing, -you can do this with your browser in GitHub. You also need a GitHub account and this [GitHub Help Article](https://help.github.com/articles/editing-files-in-another-user-s-repository/). +you can do this with your browser in GitHub. You also need a GitHub account and this [Article about Editing](https://help.github.com/articles/editing-files-in-another-user-s-repository/). +You might also finde this [about Pull Requests](https://help.github.com/articles/about-pull-requests/) usefull. Please don't use this to change Code and create untested Pull Requests. + +# Step by Step with Browser + +Additionally here is a step-by-step workflow example for beginners: + +1. [Login](https://github.com/login) to your GitHub account or [create](https://services.github.com/on-demand/intro-to-github/create-github-account) a GitHub account, if you do not already have one. + +2. Go to the [iD main repository](https://github.com/openstreetmap/iD) and fork iD into your GitHub account (Fork is top right). + +3. Create a New Branch by clicking on "Branch: master" and entering the name of a new branch (choose a descriptive name) + +4. Navigate to the file you want to edit and click on "Edit this file" and apply your changes to the file. Alternatively, you could also "Create a new file" + +5. When finished editing the file enter a commit text (and description if there is more to describe), commit directly to the newly created branch. + +6. Navigate back to your "id" project - https://github.com/{{user}}/iD + +7. Follow https://help.github.com/articles/about-pull-requests/ to create a new pull request for your change From 28f34e941407ad20c92828fecfac26be76d7bb60 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Tue, 21 Aug 2018 12:01:38 +0200 Subject: [PATCH 140/217] improve wording and structure --- CONTRIBUTING.md | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b622fa7ae..e882ce581 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -377,7 +377,7 @@ The `iD.js` and `iD.min.js` files in this project are autogenerated - don't edit If you are new to GitHub or git you can read the [GitHub Guides](https://guides.github.com) "Understanding the GitHub Flow", "Git Handbook" and "Forking Projects" could be especially interesting to you. -# Step by Step +### Step by Step Additionally here is a step-by-step workflow example for beginners: @@ -387,7 +387,7 @@ Additionally here is a step-by-step workflow example for beginners: 3. Set up [Git](https://help.github.com/articles/set-up-git/) and prepare for Authenticating with GitHub from Git. -4. Clone or download your local copy of iD from your GitHub account using https `git clone https://github.com:/iD.git` or using ssh `git clone git@github.com:/iD.git`. In your local copy you'll have a "remote" called origin. +4. Clone or download your local copy of iD from your GitHub account using https `git clone https://github.com:/iD.git` or using ssh `git clone git@github.com:{{yourgithubaccount}}/iD.git`. In your local copy you'll have a "remote" called origin. 5. Switch to the iD directory, create a working branch (choose a descriptive name) and switch to it : `cd iD ; git checkout -b `. Never do anything in master branch. @@ -397,18 +397,18 @@ Additionally here is a step-by-step workflow example for beginners: 8. Push Changes to your GitHub account `git push origin `. The next push also works without the branch name: `git push origin`. -9. Go to GitHub for your fork of iD at https://github.com//iD. GitHub will already know about your recently pushed branch, and ask if you want to create a Pull Request for it. +9. Go to GitHub for your fork of iD at https://github.com/{{yourgithubaccount}}/iD. GitHub will already know about your recently pushed branch, and ask if you want to create a Pull Request for it. 10. Your Pull Request will be seen by the maintainers of iD. They can merge it or ask for changes. You can update your Pull Request with Steps 7 and 8, Step 9 is required only once per Pull Request. -# Clean Up +### Clean Up After your Pull Request gets merged into the main repository you can clean up by deleting the branch from your GitHub-iD-Clone and your local directory `git push --delete origin ; git branch -d ` -# Restart with another PR after some while +### Restart with another PR after some while If you did not use your copy of iD for some while, other Pull Request gets merged and you don't have the latest version of iD. You can replace your master with whatever is in our master. If you have not done so yet: Add the main repo as an "upstream" remote: @@ -422,11 +422,10 @@ Then change to the master branch and get everything from upstream (the main repo ## Submitting directly in the Browser If you want to submit Documentation, Spelling improvements, etc. which do not need testing, -you can do this with your browser in GitHub. You also need a GitHub account and this [Article about Editing](https://help.github.com/articles/editing-files-in-another-user-s-repository/). -You might also finde this [about Pull Requests](https://help.github.com/articles/about-pull-requests/) usefull. -Please don't use this to change Code and create untested Pull Requests. +you can do this with your browser in GitHub. Please don't use this to change Code and create untested Pull Requests. +You also need a GitHub account and may find this [Article about Editing](https://help.github.com/articles/editing-files-in-another-user-s-repository/) and this [Article about Pull Requests](https://help.github.com/articles/about-pull-requests/) usefull. -# Step by Step with Browser +### Step by Step with Browser Additionally here is a step-by-step workflow example for beginners: @@ -434,12 +433,12 @@ Additionally here is a step-by-step workflow example for beginners: 2. Go to the [iD main repository](https://github.com/openstreetmap/iD) and fork iD into your GitHub account (Fork is top right). -3. Create a New Branch by clicking on "Branch: master" and entering the name of a new branch (choose a descriptive name) +3. Create a New Branch by clicking on "Branch: master" and entering the name of a new branch (choose a descriptive name). -4. Navigate to the file you want to edit and click on "Edit this file" and apply your changes to the file. Alternatively, you could also "Create a new file" +4. Navigate to the file you want to edit and click on "Edit this file" and apply your changes to the file. Alternatively, you could also "Create a new file". -5. When finished editing the file enter a commit text (and description if there is more to describe), commit directly to the newly created branch. +5. When finished editing the file enter a commit text (the description is optional) and commit directly to the newly created branch. You may repeat 4 and 5 until all required changes are commited. -6. Navigate back to your "id" project - https://github.com/{{user}}/iD +6. Navigate back to your "id" project - https://github.com/{{yourgithubaccount}}/iD -7. Follow https://help.github.com/articles/about-pull-requests/ to create a new pull request for your change +7. Follow this [Article about Pull Requests](https://help.github.com/articles/about-pull-requests/) to create a new pull request for your change From a80e512f59574a292c670a3651469404e654cc3c Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 21 Aug 2018 09:23:20 -0400 Subject: [PATCH 141/217] npm run build for new preset --- data/presets.yaml | 4 ++++ data/presets/presets.json | 1 + data/taginfo.json | 7 +++++++ dist/locales/en.json | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/data/presets.yaml b/data/presets.yaml index 988131d7c..60c5b5d0a 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -3980,6 +3980,10 @@ en: # 'leisure=pitch, sport=american_football' name: American Football Field terms: '' + leisure/pitch/badminton: + # 'leisure=pitch, sport=badminton' + name: Badminton Court + terms: '' leisure/pitch/baseball: # 'leisure=pitch, sport=baseball' name: Baseball Diamond diff --git a/data/presets/presets.json b/data/presets/presets.json index 24743ec07..453609b97 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -498,6 +498,7 @@ "leisure/picnic_table": {"icon": "maki-picnic-site", "geometry": ["point"], "tags": {"leisure": "picnic_table"}, "terms": ["bench"], "name": "Picnic Table"}, "leisure/pitch": {"icon": "maki-pitch", "fields": ["name", "sport", "surface", "lit"], "geometry": ["point", "area"], "tags": {"leisure": "pitch"}, "terms": ["field"], "name": "Sport Pitch"}, "leisure/pitch/american_football": {"icon": "maki-america-football", "fields": ["name", "surface", "lit"], "geometry": ["point", "area"], "tags": {"leisure": "pitch", "sport": "american_football"}, "reference": {"key": "sport", "value": "american_football"}, "terms": [], "name": "American Football Field"}, + "leisure/pitch/badminton": {"icon": "maki-tennis", "fields": ["name", "surface", "lit", "access_simple"], "geometry": ["point", "area"], "tags": {"leisure": "pitch", "sport": "badminton"}, "reference": {"key": "sport", "value": "badminton"}, "terms": [], "name": "Badminton Court"}, "leisure/pitch/baseball": {"icon": "maki-baseball", "fields": ["name", "lit"], "geometry": ["point", "area"], "tags": {"leisure": "pitch", "sport": "baseball"}, "reference": {"key": "sport", "value": "baseball"}, "terms": [], "name": "Baseball Diamond"}, "leisure/pitch/basketball": {"icon": "maki-basketball", "fields": ["name", "surface", "hoops", "lit", "access_simple"], "geometry": ["point", "area"], "tags": {"leisure": "pitch", "sport": "basketball"}, "reference": {"key": "sport", "value": "basketball"}, "terms": [], "name": "Basketball Court"}, "leisure/pitch/beachvolleyball": {"icon": "maki-basketball", "fields": ["name", "surface", "lit"], "geometry": ["point", "area"], "tags": {"leisure": "pitch", "sport": "beachvolleyball"}, "addTags": {"leisure": "pitch", "sport": "beachvolleyball", "surface": "sand"}, "removeTags": {"leisure": "pitch", "sport": "beachvolleyball", "surface": "sand"}, "reference": {"key": "sport", "value": "beachvolleyball"}, "terms": ["volleyball"], "name": "Beach Volleyball Court"}, diff --git a/data/taginfo.json b/data/taginfo.json index bf4a65fd3..c9f9ec2a8 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -3351,6 +3351,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/america-football-15.svg?sanitize=true" }, + { + "key": "sport", + "value": "badminton", + "description": "Badminton Court", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/tennis-15.svg?sanitize=true" + }, { "key": "sport", "value": "baseball", diff --git a/dist/locales/en.json b/dist/locales/en.json index 587aa0b0f..b2cf54e11 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -4915,6 +4915,10 @@ "name": "American Football Field", "terms": "" }, + "leisure/pitch/badminton": { + "name": "Badminton Court", + "terms": "" + }, "leisure/pitch/baseball": { "name": "Baseball Diamond", "terms": "" From 3eb4d919871b47a1e9f4f6bf62c4ad0dba20e2c0 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 21 Aug 2018 18:44:05 -0400 Subject: [PATCH 142/217] Now supports fetching data from vector tile url --- data/core.yaml | 8 +- dist/locales/en.json | 8 +- modules/services/vector_tile.js | 11 +- modules/svg/data.js | 165 ++++++++++++----------------- modules/ui/map_data.js | 4 +- modules/ui/settings/custom_data.js | 32 +++--- 6 files changed, 104 insertions(+), 124 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index eaa11519b..5472f81d1 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -527,12 +527,12 @@ en: tooltip: Edit custom data layer header: Custom Map Data Settings file: - instructions: "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson/.json, .pbf, .mvt" + instructions: "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson, .json" label: "Browse files" or: "Or" - template: - instructions: "Enter a vector tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme" - placeholder: Enter a url template + url: + instructions: "Enter a data file URL or vector tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme" + placeholder: Enter a url restore: heading: You have unsaved changes description: "Do you wish to restore unsaved changes from a previous editing session?" diff --git a/dist/locales/en.json b/dist/locales/en.json index 97b5a1693..516b67eb9 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -648,13 +648,13 @@ "tooltip": "Edit custom data layer", "header": "Custom Map Data Settings", "file": { - "instructions": "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson/.json, .pbf, .mvt", + "instructions": "Choose a local data file. Supported types are:\n .gpx, .kml, .geojson, .json", "label": "Browse files" }, "or": "Or", - "template": { - "instructions": "Enter a vector tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme", - "placeholder": "Enter a url template" + "url": { + "instructions": "Enter a data file URL or vector tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme", + "placeholder": "Enter a url" } } }, diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js index 03c1dbd42..4c0556d5e 100644 --- a/modules/services/vector_tile.js +++ b/modules/services/vector_tile.js @@ -31,7 +31,7 @@ function vtToGeoJSON(bufferdata) { var layer = tile.layers[layerID]; if (layer) { for (var i = 0; i < layer.length; i++) { - var feature = layer.feature(i).toGeoJSON(bufferdata.zxy[2], bufferdata.zxy[3], bufferdata.zxy[1]); + var feature = layer.feature(i).toGeoJSON(bufferdata.xyz[0], bufferdata.xyz[1], bufferdata.xyz[2]); if (layers.length > 1) feature.properties.vt_layer = layerID; collection.features.push(feature); } @@ -64,9 +64,14 @@ function loadTile(source, tile) { delete source.inflight[tile.id]; if (err || !data) return; + var bufferdata = { + data: data, + xyz: tile.xyz + }; + source.loaded[tile.id] = { - bufferdata: data, - geojson: vtToGeoJSON(data) + bufferdata: bufferdata, + geojson: vtToGeoJSON(bufferdata) }; dispatch.call('loadedData'); diff --git a/modules/svg/data.js b/modules/svg/data.js index f773ba9d0..1cf4061fd 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -5,11 +5,7 @@ import _union from 'lodash-es/union'; import _throttle from 'lodash-es/throttle'; import { geoBounds as d3_geoBounds } from 'd3-geo'; - -import { - request as d3_request, - text as d3_text -} from 'd3-request'; +import { text as d3_text } from 'd3-request'; import { event as d3_event, @@ -17,8 +13,6 @@ import { } from 'd3-selection'; import toGeoJSON from '@mapbox/togeojson'; -import vt from '@mapbox/vector-tile'; -import Protobuf from 'pbf'; import { geoExtent, geoPolygonIntersectsPolygon } from '../geo'; import { services } from '../services'; @@ -38,7 +32,7 @@ export function svgData(projection, context, dispatch) { var layer = d3_select(null); var _vtService; var _fileList; - var _template; // todo, if template is set, use vectorTile service + var _template; var _src; @@ -117,6 +111,7 @@ export function svgData(projection, context, dispatch) { function drawData(selection) { + var vtService = getService(); var getPath = svgPath(projection).geojson; var hasData = drawData.hasData(); @@ -132,9 +127,18 @@ export function svgData(projection, context, dispatch) { .merge(layer); + var geoData; + if (_template && vtService) { // fetch data from vector tile service + var sourceID = _template; + vtService.loadTiles(sourceID, _template, projection); + geoData = vtService.data(sourceID, projection); + } else { + geoData = _geojson ? [_geojson] : []; + } + var paths = layer .selectAll('path') - .data(hasData ? [_geojson] : []); + .data(geoData); paths.exit() .remove(); @@ -148,8 +152,17 @@ export function svgData(projection, context, dispatch) { .attr('d', getPath); - var labelData = (_showLabels && hasData && _geojson.features) || []; - labelData = labelData.filter(getPath); + var labelData = []; + if (_showLabels) { + geoData.forEach(function(f) { + if (f.type === 'FeatureCollection') { + labelData = labelData.concat(f.features); + } else { + labelData.push(f); + } + }); + labelData = labelData.filter(getPath); + } layer .call(drawLabels, 'label-halo', labelData) @@ -188,60 +201,33 @@ export function svgData(projection, context, dispatch) { function getExtension(fileName) { - if (fileName === undefined) { - return ''; - } + if (!fileName) return; var lastDotIndex = fileName.lastIndexOf('.'); - if (lastDotIndex < 0) { - return ''; - } + if (lastDotIndex < 0) return; return fileName.substr(lastDotIndex); } - function toDom(textdata) { + function xmlToDom(textdata) { return (new DOMParser()).parseFromString(textdata, 'text/xml'); } - function vtToGeoJSON(bufferdata) { - var tile = new vt.VectorTile(new Protobuf(bufferdata.data.response)); - var layers = Object.keys(tile.layers); - if (!Array.isArray(layers)) { layers = [layers]; } - - var collection = {type: 'FeatureCollection', features: []}; - - layers.forEach(function (layerID) { - var layer = tile.layers[layerID]; - if (layer) { - for (var i = 0; i < layer.length; i++) { - var feature = layer.feature(i).toGeoJSON(bufferdata.zxy[2], bufferdata.zxy[3], bufferdata.zxy[1]); - if (layers.length > 1) feature.properties.vt_layer = layerID; - collection.features.push(feature); - } - } - }); - - return collection; - } - - drawData.setFile = function(extension, data, src) { + _template = null; + _fileList = null; + _geojson = null; + _src = null; + var gj; switch (extension) { case '.gpx': - gj = toGeoJSON.gpx(toDom(data)); + gj = toGeoJSON.gpx(xmlToDom(data)); break; case '.kml': - gj = toGeoJSON.kml(toDom(data)); - break; - case '.pbf': - gj = vtToGeoJSON(data); - break; - case '.mvt': - gj = vtToGeoJSON(data); + gj = toGeoJSON.kml(xmlToDom(data)); break; case '.geojson': case '.json': @@ -249,17 +235,19 @@ export function svgData(projection, context, dispatch) { break; } - if (!gj || _isEmpty(gj) || _isEmpty(gj.features)) return; - _geojson = gj; - _src = src || 'unknown.geojson'; + if (!_isEmpty(gj)) { + _geojson = gj; + _src = src || 'unknown.geojson'; + return this.fitZoom(); + } dispatch.call('change'); - return this.fitZoom(); }; drawData.showLabels = function(val) { if (!arguments.length) return _showLabels; + _showLabels = val; return this; }; @@ -267,6 +255,7 @@ export function svgData(projection, context, dispatch) { drawData.enabled = function(val) { if (!arguments.length) return _enabled; + _enabled = val; if (_enabled) { showLayer(); @@ -280,7 +269,7 @@ export function svgData(projection, context, dispatch) { drawData.hasData = function() { - return (!(_isEmpty(_geojson) || _isEmpty(_geojson.features))); + return !!(_template || _geojson); }; @@ -302,8 +291,13 @@ export function svgData(projection, context, dispatch) { _template = null; _fileList = null; - _geojson = gj; - _src = src || 'unknown.geojson'; + _geojson = null; + _src = null; + + if (!_isEmpty(gj)) { + _geojson = gj; + _src = src || 'unknown.geojson'; + } dispatch.call('change'); return this; @@ -320,58 +314,38 @@ export function svgData(projection, context, dispatch) { if (!fileList || !fileList.length) return this; var f = fileList[0]; - var reader = new FileReader(); var extension = getExtension(f.name); + var reader = new FileReader(); + reader.onload = (function(file) { + return function(e) { + drawData.setFile(extension, e.target.result, file.name); + }; + })(f); - if (extension === 'mvt' || extension === 'pbf') { - reader.onload = (function(file) { - return; // todo find x,y,z - var data = []; - var zxy = [0,0,0]; - - var bufferdata = { data: data, zxy: zxy }; - return function (e) { - bufferdata.data = e.target.result; - drawData.setFile(extension, bufferdata, file.name); - }; - })(f); - - reader.readAsArrayBuffer(f); - - } else { - reader.onload = (function(file) { - return function (e) { - drawData.setFile(extension, e.target.result, file.name); - }; - })(f); - - reader.readAsText(f); - } + reader.readAsText(f); return this; }; drawData.url = function(url) { + _template = null; + _fileList = null; + _geojson = null; + _src = null; + var extension = getExtension(url); - if (extension === 'mvt' || extension === 'pbf') { - d3_request(url) - .responseType('arraybuffer') - .get(function(err, data) { - if (err || !data) return; - _src = url; - var match = url.match(/(pbf|mvt)/i); - var extension = match ? ('.' + match[0].toLowerCase()) : ''; - var zxy = url.match(/\/(\d+)\/(\d+)\/(\d+)/); - var bufferdata = { data : data, zxy : zxy }; - drawData.setFile(extension, bufferdata, url); - }); - } else { + var re = /\.(gpx|kml|(geo)?json)$/i; + if (re.test(extension)) { + _template = null; d3_text(url, function(err, data) { if (!err) { drawData.setFile(extension, data, url); } }); + + } else { + drawData.template(url); } return this; @@ -379,12 +353,13 @@ export function svgData(projection, context, dispatch) { drawData.getSrc = function() { - return _src; + return _src || ''; }; drawData.fitZoom = function() { - if (!this.hasData()) return this; + // note: only works on a FeatureCollection + if (_isEmpty(_geojson) || _isEmpty(_geojson.features)) return; var map = context.map(); var viewport = map.trimmedExtent().polygon(); diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index 8eec067ff..d76cc1c4d 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -295,8 +295,8 @@ export function uiMapData(context) { function customChanged(d) { var dataLayer = layers.layer('data'); - if (d && d.template) { - dataLayer.template(d.template); + if (d && d.url) { + dataLayer.url(d.url); } else if (d && d.fileList) { dataLayer.fileList(d.fileList); } diff --git a/modules/ui/settings/custom_data.js b/modules/ui/settings/custom_data.js index ffa454588..090a9ec42 100644 --- a/modules/ui/settings/custom_data.js +++ b/modules/ui/settings/custom_data.js @@ -15,7 +15,7 @@ export function uiSettingsCustomData(context) { var dataLayer = context.layers().layer('data'); var _origSettings = { fileList: (dataLayer && dataLayer.fileList()) || null, - template: context.storage('settings-custom-data-template') + url: context.storage('settings-custom-data-url') }; var _currSettings = _cloneDeep(_origSettings); @@ -45,8 +45,8 @@ export function uiSettingsCustomData(context) { .on('change', function() { var files = d3_event.target.files; if (files && files.length) { - _currSettings.template = ''; - textSection.select('.field-template').property('value', ''); + _currSettings.url = ''; + textSection.select('.field-url').property('value', ''); _currSettings.fileList = files; } else { _currSettings.fileList = null; @@ -59,15 +59,15 @@ export function uiSettingsCustomData(context) { textSection .append('pre') - .attr('class', 'instructions-template') - .text(t('settings.custom_data.template.instructions')); + .attr('class', 'instructions-url') + .text(t('settings.custom_data.url.instructions')); textSection .append('textarea') - .attr('class', 'field-template') - .attr('placeholder', t('settings.custom_data.template.placeholder')) + .attr('class', 'field-url') + .attr('placeholder', t('settings.custom_data.url.placeholder')) .call(utilNoAuto) - .property('value', _currSettings.template); + .property('value', _currSettings.url); // insert a cancel button, and adjust the button widths @@ -94,23 +94,23 @@ export function uiSettingsCustomData(context) { } - // restore the original template + // restore the original url function clickCancel() { - textSection.select('.field-template').property('value', _origSettings.template); - context.storage('settings-custom-data-template', _origSettings.template); + textSection.select('.field-url').property('value', _origSettings.url); + context.storage('settings-custom-data-url', _origSettings.url); this.blur(); modal.close(); } - // accept the current template + // accept the current url function clickSave() { - _currSettings.template = textSection.select('.field-template').property('value').trim(); + _currSettings.url = textSection.select('.field-url').property('value').trim(); // one or the other but not both - if (_currSettings.template) { _currSettings.fileList = null; } - if (_currSettings.fileList) { _currSettings.template = ''; } + if (_currSettings.url) { _currSettings.fileList = null; } + if (_currSettings.fileList) { _currSettings.url = ''; } - context.storage('settings-custom-data-template', _currSettings.template); + context.storage('settings-custom-data-url', _currSettings.url); this.blur(); modal.close(); dispatch.call('change', this, _currSettings); From 80b583a6f0e77dcd2033307b02aaa903af4ff88f Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 22 Aug 2018 23:16:31 -0400 Subject: [PATCH 143/217] WIP on feature deduplication across tile boundaries It seems like the ids stored in the features are not reliable, so I'm trying to generate ids --- modules/services/vector_tile.js | 59 +++++++++++--------- modules/svg/data.js | 97 ++++++++++++++++++++++----------- modules/svg/helpers.js | 12 +++- modules/util/index.js | 3 +- modules/util/util.js | 16 ++++++ 5 files changed, 128 insertions(+), 59 deletions(-) diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js index 4c0556d5e..e6de67d87 100644 --- a/modules/services/vector_tile.js +++ b/modules/services/vector_tile.js @@ -7,7 +7,7 @@ import { request as d3_request } from 'd3-request'; import Protobuf from 'pbf'; import vt from '@mapbox/vector-tile'; -import { utilRebind, utilTiler } from '../util'; +import { utilHashcode, utilRebind, utilTiler } from '../util'; var tiler = utilTiler().tileSize(512); @@ -20,25 +20,28 @@ function abortRequest(i) { } -function vtToGeoJSON(bufferdata) { - var tile = new vt.VectorTile(new Protobuf(bufferdata.data.response)); - var layers = Object.keys(tile.layers); +function vtToGeoJSON(data, tile) { + var vectorTile = new vt.VectorTile(new Protobuf(data.response)); + var layers = Object.keys(vectorTile.layers); if (!Array.isArray(layers)) { layers = [layers]; } - var collection = { type: 'FeatureCollection', features: [] }; - - layers.forEach(function (layerID) { - var layer = tile.layers[layerID]; + var features = []; + layers.forEach(function(layerID) { + var layer = vectorTile.layers[layerID]; if (layer) { for (var i = 0; i < layer.length; i++) { - var feature = layer.feature(i).toGeoJSON(bufferdata.xyz[0], bufferdata.xyz[1], bufferdata.xyz[2]); - if (layers.length > 1) feature.properties.vt_layer = layerID; - collection.features.push(feature); + var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); + if (layers.length > 1) { + feature.properties.vt_layer = layerID; + } + // force unique id generation + feature.__hashcode__ = utilHashcode(JSON.stringify(feature)); + features.push(feature); } } }); - return collection; + return features; } @@ -60,18 +63,13 @@ function loadTile(source, tile) { source.inflight[tile.id] = d3_request(url) .responseType('arraybuffer') .get(function(err, data) { - source.loaded[tile.id] = true; + source.loaded[tile.id] = {}; delete source.inflight[tile.id]; if (err || !data) return; - var bufferdata = { - data: data, - xyz: tile.xyz - }; - source.loaded[tile.id] = { - bufferdata: bufferdata, - geojson: vtToGeoJSON(bufferdata) + data: data, + features: vtToGeoJSON(data, tile) }; dispatch.call('loadedData'); @@ -112,12 +110,23 @@ export default { var source = _vtCache[sourceID]; if (!source) return []; - // for now, return the FeatureCollection for each tile var tiles = tiler.getTiles(projection); - return tiles.map(function(tile) { - var loaded = source.loaded[tile.id]; - return loaded && loaded.geojson; - }).filter(Boolean); + var seen = {}; + var results = []; + + for (var i = 0; i < tiles.length; i++) { + var loaded = source.loaded[tiles[i].id]; + if (!loaded || !loaded.features) continue; + + for (var j = 0; j < loaded.features.length; j++) { + var feature = loaded.features[j]; + if (seen[feature.__hashcode__]) continue; + seen[feature.__hashcode__] = true; + results.push(feature); + } + } + + return results; }, diff --git a/modules/svg/data.js b/modules/svg/data.js index 1cf4061fd..6d263233e 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -4,7 +4,11 @@ import _reduce from 'lodash-es/reduce'; import _union from 'lodash-es/union'; import _throttle from 'lodash-es/throttle'; -import { geoBounds as d3_geoBounds } from 'd3-geo'; +import { + geoBounds as d3_geoBounds, + geoPath as d3_geoPath +} from 'd3-geo'; + import { text as d3_text } from 'd3-request'; import { @@ -18,6 +22,7 @@ import { geoExtent, geoPolygonIntersectsPolygon } from '../geo'; import { services } from '../services'; import { svgPath } from './index'; import { utilDetect } from '../util/detect'; +import { utilHashcode } from '../util'; var _initialized = false; @@ -110,6 +115,41 @@ export function svgData(projection, context, dispatch) { } + // ensure that all geojson features in a collection have IDs + function ensureIDs(gj) { + if (!gj) return null; + + if (gj.type === 'FeatureCollection') { + for (var i = 0; i < gj.features.length; i++) { + ensureFeatureID(gj.features[i]); + } + } else { + ensureFeatureID(gj); + } + return gj; + } + + + // ensure that each single Feature object has a unique ID + function ensureFeatureID(feature) { + if (!feature) return; + feature.__hashcode__ = utilHashcode(JSON.stringify(feature)); + return feature; + } + + + // Prefer an array of Features instead of a FeatureCollection + function getFeatures(gj) { + if (!gj) return []; + + if (gj.type === 'FeatureCollection') { + return gj.features; + } else { + return [gj]; + } + } + + function drawData(selection) { var vtService = getService(); var getPath = svgPath(projection).geojson; @@ -133,45 +173,42 @@ export function svgData(projection, context, dispatch) { vtService.loadTiles(sourceID, _template, projection); geoData = vtService.data(sourceID, projection); } else { - geoData = _geojson ? [_geojson] : []; + geoData = getFeatures(_geojson); } + geoData = geoData.filter(getPath); + var paths = layer .selectAll('path') - .data(geoData); + .data(geoData, function(d) { return d.__hashcode__; }); + // exit paths.exit() .remove(); + // enter/update paths = paths.enter() .append('path') .attr('class', 'pathdata') - .merge(paths); - - paths + .merge(paths) .attr('d', getPath); - var labelData = []; if (_showLabels) { - geoData.forEach(function(f) { - if (f.type === 'FeatureCollection') { - labelData = labelData.concat(f.features); - } else { - labelData.push(f); - } - }); - labelData = labelData.filter(getPath); + layer + .call(drawLabels, 'label-halo', geoData) + .call(drawLabels, 'label', geoData); } - layer - .call(drawLabels, 'label-halo', labelData) - .call(drawLabels, 'label', labelData); - function drawLabels(selection, textClass, data) { + var labelPath = d3_geoPath(projection); + var labelData = data.filter(function(d) { + return d.properties && (d.properties.desc || d.properties.name); + }); + var labels = selection.selectAll('text.' + textClass) - .data(data); + .data(labelData, function(d) { return d.__hashcode__; }); // exit labels.exit() @@ -183,17 +220,14 @@ export function svgData(projection, context, dispatch) { .attr('class', textClass) .merge(labels) .text(function(d) { - if (d.properties) { - return d.properties.desc || d.properties.name; - } - return null; + return d.properties.desc || d.properties.name; }) .attr('x', function(d) { - var centroid = getPath.centroid(d); + var centroid = labelPath.centroid(d); return centroid[0] + 11; }) .attr('y', function(d) { - var centroid = getPath.centroid(d); + var centroid = labelPath.centroid(d); return centroid[1]; }); } @@ -236,7 +270,7 @@ export function svgData(projection, context, dispatch) { } if (!_isEmpty(gj)) { - _geojson = gj; + _geojson = ensureIDs(gj); _src = src || 'unknown.geojson'; return this.fitZoom(); } @@ -295,7 +329,7 @@ export function svgData(projection, context, dispatch) { _src = null; if (!_isEmpty(gj)) { - _geojson = gj; + _geojson = ensureIDs(gj); _src = src || 'unknown.geojson'; } @@ -343,7 +377,6 @@ export function svgData(projection, context, dispatch) { drawData.setFile(extension, data, url); } }); - } else { drawData.template(url); } @@ -358,12 +391,12 @@ export function svgData(projection, context, dispatch) { drawData.fitZoom = function() { - // note: only works on a FeatureCollection - if (_isEmpty(_geojson) || _isEmpty(_geojson.features)) return; + var features = getFeatures(_geojson); + if (!features.length) return; var map = context.map(); var viewport = map.trimmedExtent().polygon(); - var coords = _reduce(_geojson.features, function(coords, feature) { + var coords = _reduce(features, function(coords, feature) { var c = feature.geometry.coordinates; /* eslint-disable no-fallthrough */ diff --git a/modules/svg/helpers.js b/modules/svg/helpers.js index fe57f3926..c450e00f8 100644 --- a/modules/svg/helpers.js +++ b/modules/svg/helpers.js @@ -168,7 +168,17 @@ export function svgPath(projection, graph, isArea) { } }; - svgpath.geojson = path; + svgpath.geojson = function(d) { + if (d.id !== undefined) { + if (d.id in cache) { + return cache[d.id]; + } else { + return cache[d.id] = path(d); + } + } else { + return path(d); + } + }; return svgpath; } diff --git a/modules/util/index.js b/modules/util/index.js index bc06a0a41..16460cd14 100644 --- a/modules/util/index.js +++ b/modules/util/index.js @@ -12,6 +12,7 @@ export { utilFunctor } from './util'; export { utilGetAllNodes } from './util'; export { utilGetPrototypeOf } from './util'; export { utilGetSetValue } from './get_set_value'; +export { utilHashcode } from './util'; export { utilIdleWorker } from './idle_worker'; export { utilNoAuto } from './util'; export { utilPrefixCSSProperty } from './util'; @@ -25,4 +26,4 @@ export { utilSuggestNames } from './suggest_names'; export { utilTagText } from './util'; export { utilTiler } from './tiler'; export { utilTriggerEvent } from './trigger_event'; -export { utilWrap } from './util'; \ No newline at end of file +export { utilWrap } from './util'; diff --git a/modules/util/util.js b/modules/util/util.js index cf226f5ee..6b03c9f4c 100644 --- a/modules/util/util.js +++ b/modules/util/util.js @@ -266,3 +266,19 @@ export function utilNoAuto(selection) { .attr('autocapitalize', 'off') .attr('spellcheck', isText ? 'true' : 'false'); } + + +// https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript +// https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ +export function utilHashcode(str) { + var hash = 0; + if (str.length === 0) { + return hash; + } + for (var i = 0; i < str.length; i++) { + var char = str.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; // Convert to 32bit integer + } + return hash; +} From bc18f538a01cbc7f6bad9a1784c10c0a5750055d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 23 Aug 2018 01:13:03 -0400 Subject: [PATCH 144/217] Use geojson hashcode instead of id for path cache --- modules/svg/helpers.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/svg/helpers.js b/modules/svg/helpers.js index c450e00f8..54929d9eb 100644 --- a/modules/svg/helpers.js +++ b/modules/svg/helpers.js @@ -169,11 +169,11 @@ export function svgPath(projection, graph, isArea) { }; svgpath.geojson = function(d) { - if (d.id !== undefined) { - if (d.id in cache) { - return cache[d.id]; + if (d.__hashcode__ !== undefined) { + if (d.__hashcode__ in cache) { + return cache[d.__hashcode__]; } else { - return cache[d.id] = path(d); + return cache[d.__hashcode__] = path(d); } } else { return path(d); From 0f07393fb3b0919da9f4b7a63864d3b43521a5a1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 23 Aug 2018 11:11:14 -0400 Subject: [PATCH 145/217] Fix data file tests (in both phantom and real browsers) --- modules/services/vector_tile.js | 9 +- modules/svg/data.js | 24 ++- modules/svg/helpers.js | 8 +- modules/svg/mvt.js | 301 -------------------------------- test/data/gpxtest.gpx | 13 -- test/data/gpxtest.json | 23 --- test/data/gpxtest.kml | 22 --- test/data/mvttest.pbf | Bin 24576 -> 0 bytes test/spec/svg/data.js | 160 ++++++++++++----- test/spec/svg/mvt.js | 97 ---------- 10 files changed, 135 insertions(+), 522 deletions(-) delete mode 100644 modules/svg/mvt.js delete mode 100644 test/data/gpxtest.gpx delete mode 100644 test/data/gpxtest.json delete mode 100644 test/data/gpxtest.kml delete mode 100644 test/data/mvttest.pbf delete mode 100644 test/spec/svg/mvt.js diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js index e6de67d87..6c947c918 100644 --- a/modules/services/vector_tile.js +++ b/modules/services/vector_tile.js @@ -34,8 +34,9 @@ function vtToGeoJSON(data, tile) { if (layers.length > 1) { feature.properties.vt_layer = layerID; } - // force unique id generation - feature.__hashcode__ = utilHashcode(JSON.stringify(feature)); + // force some unique id generation + feature.__featurehash__ = utilHashcode(JSON.stringify(feature)); + feature.__propertyhash__ = utilHashcode(JSON.stringify(feature.properties || {})); features.push(feature); } } @@ -120,8 +121,8 @@ export default { for (var j = 0; j < loaded.features.length; j++) { var feature = loaded.features[j]; - if (seen[feature.__hashcode__]) continue; - seen[feature.__hashcode__] = true; + if (seen[feature.__featurehash__]) continue; + seen[feature.__featurehash__] = true; results.push(feature); } } diff --git a/modules/svg/data.js b/modules/svg/data.js index 6d263233e..38e0c15e0 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -133,7 +133,7 @@ export function svgData(projection, context, dispatch) { // ensure that each single Feature object has a unique ID function ensureFeatureID(feature) { if (!feature) return; - feature.__hashcode__ = utilHashcode(JSON.stringify(feature)); + feature.__featurehash__ = utilHashcode(JSON.stringify(feature)); return feature; } @@ -180,7 +180,7 @@ export function svgData(projection, context, dispatch) { var paths = layer .selectAll('path') - .data(geoData, function(d) { return d.__hashcode__; }); + .data(geoData, function(d) { return d.__featurehash__; }); // exit paths.exit() @@ -194,21 +194,19 @@ export function svgData(projection, context, dispatch) { .attr('d', getPath); - if (_showLabels) { - layer - .call(drawLabels, 'label-halo', geoData) - .call(drawLabels, 'label', geoData); - } + layer + .call(drawLabels, 'label-halo', geoData) + .call(drawLabels, 'label', geoData); function drawLabels(selection, textClass, data) { var labelPath = d3_geoPath(projection); var labelData = data.filter(function(d) { - return d.properties && (d.properties.desc || d.properties.name); + return _showLabels && d.properties && (d.properties.desc || d.properties.name); }); var labels = selection.selectAll('text.' + textClass) - .data(labelData, function(d) { return d.__hashcode__; }); + .data(labelData, function(d) { return d.__featurehash__; }); // exit labels.exit() @@ -272,10 +270,11 @@ export function svgData(projection, context, dispatch) { if (!_isEmpty(gj)) { _geojson = ensureIDs(gj); _src = src || 'unknown.geojson'; - return this.fitZoom(); + this.fitZoom(); } dispatch.call('change'); + return this; }; @@ -373,9 +372,8 @@ export function svgData(projection, context, dispatch) { if (re.test(extension)) { _template = null; d3_text(url, function(err, data) { - if (!err) { - drawData.setFile(extension, data, url); - } + if (err) return; + drawData.setFile(extension, data, url); }); } else { drawData.template(url); diff --git a/modules/svg/helpers.js b/modules/svg/helpers.js index 54929d9eb..6c9bd344a 100644 --- a/modules/svg/helpers.js +++ b/modules/svg/helpers.js @@ -169,11 +169,11 @@ export function svgPath(projection, graph, isArea) { }; svgpath.geojson = function(d) { - if (d.__hashcode__ !== undefined) { - if (d.__hashcode__ in cache) { - return cache[d.__hashcode__]; + if (d.__featurehash__ !== undefined) { + if (d.__featurehash__ in cache) { + return cache[d.__featurehash__]; } else { - return cache[d.__hashcode__] = path(d); + return cache[d.__featurehash__] = path(d); } } else { return path(d); diff --git a/modules/svg/mvt.js b/modules/svg/mvt.js deleted file mode 100644 index ce6a8a540..000000000 --- a/modules/svg/mvt.js +++ /dev/null @@ -1,301 +0,0 @@ -import _flatten from 'lodash-es/flatten'; -import _isEmpty from 'lodash-es/isEmpty'; -import _reduce from 'lodash-es/reduce'; -import _union from 'lodash-es/union'; - -import { geoBounds as d3_geoBounds } from 'd3-geo'; -import { request as d3_request } from 'd3-request'; - -import { - event as d3_event, - select as d3_select -} from 'd3-selection'; - -import vt from '@mapbox/vector-tile'; -import Protobuf from 'pbf'; - -import { geoExtent, geoPolygonIntersectsPolygon } from '../geo'; -import { svgPath } from './index'; -import { utilDetect } from '../util/detect'; - - -var _initialized = false; -var _enabled = false; -var _geojson; - - -export function svgMvt(projection, context, dispatch) { - var _showLabels = true; - var detected = utilDetect(); - var layer; - var _src; - - - function init() { - if (_initialized) return; // run once - - _geojson = {}; - _enabled = true; - - function over() { - d3_event.stopPropagation(); - d3_event.preventDefault(); - d3_event.dataTransfer.dropEffect = 'copy'; - } - - d3_select('body') - .attr('dropzone', 'copy') - .on('drop.localmvt', function() { - d3_event.stopPropagation(); - d3_event.preventDefault(); - if (!detected.filedrop) return; - drawMvt.files(d3_event.dataTransfer.files); - }) - .on('dragenter.localmvt', over) - .on('dragexit.localmvt', over) - .on('dragover.localmvt', over); - - _initialized = true; - } - - - function drawMvt(selection) { - var getPath = svgPath(projection).geojson; - - layer = selection.selectAll('.layer-mvt') - .data(_enabled ? [0] : []); - - layer.exit() - .remove(); - - layer = layer.enter() - .append('g') - .attr('class', 'layer-mvt') - .merge(layer); - - - var paths = layer - .selectAll('path') - .data([_geojson]); - - paths.exit() - .remove(); - - paths = paths.enter() - .append('path') - .attr('class', 'mvt') - .merge(paths); - - paths - .attr('d', getPath); - - - var labelData = _showLabels && _geojson.features ? _geojson.features : []; - labelData = labelData.filter(getPath); - - layer - .call(drawLabels, 'mvtlabel-halo', labelData) - .call(drawLabels, 'mvtlabel', labelData); - - - function drawLabels(selection, textClass, data) { - var labels = selection.selectAll('text.' + textClass) - .data(data); - - // exit - labels.exit() - .remove(); - - // enter/update - labels = labels.enter() - .append('text') - .attr('class', textClass) - .merge(labels) - .text(function(d) { - if (d.properties) { - return d.properties.desc || d.properties.name; - } - return null; - }) - .attr('x', function(d) { - var centroid = getPath.centroid(d); - return centroid[0] + 11; - }) - .attr('y', function(d) { - var centroid = getPath.centroid(d); - return centroid[1]; - }); - } - } - - - function vtToGeoJson(bufferdata) { - var tile = new vt.VectorTile(new Protobuf(bufferdata.data.response)); - var layers = Object.keys(tile.layers); - if (!Array.isArray(layers)) { layers = [layers]; } - - var collection = {type: 'FeatureCollection', features: []}; - - layers.forEach(function (layerID) { - var layer = tile.layers[layerID]; - if (layer) { - for (var i = 0; i < layer.length; i++) { - var feature = layer.feature(i).toGeoJSON(bufferdata.zxy[2], bufferdata.zxy[3], bufferdata.zxy[1]); - if (layers.length > 1) feature.properties.vt_layer = layerID; - collection.features.push(feature); - } - } - }); - return collection; - } - - - function getExtension(fileName) { - if (fileName === undefined) { - return ''; - } - - var lastDotIndex = fileName.lastIndexOf('.'); - if (lastDotIndex < 0) { - return ''; - } - - return fileName.substr(lastDotIndex); - } - - - function parseSaveAndZoom(extension, bufferdata) { - switch (extension) { - case '.pbf': - drawMvt.geojson(vtToGeoJson(bufferdata)).fitZoom(); - break; - case '.mvt': - drawMvt.geojson(vtToGeoJson(bufferdata)).fitZoom(); - break; - } - } - - - drawMvt.showLabels = function(_) { - if (!arguments.length) return _showLabels; - _showLabels = _; - return this; - }; - - - drawMvt.enabled = function(_) { - if (!arguments.length) return _enabled; - _enabled = _; - dispatch.call('change'); - return this; - }; - - - drawMvt.hasMvt = function() { - return (!(_isEmpty(_geojson) || _isEmpty(_geojson.features))); - }; - - - drawMvt.geojson = function(gj) { - if (!arguments.length) return _geojson; - if (_isEmpty(gj) || _isEmpty(gj.features)) return this; - _geojson = gj; - dispatch.call('change'); - return this; - }; - - - drawMvt.url = function(url) { - d3_request(url) - .responseType('arraybuffer') - .get(function(err, data) { - if (err || !data) return; - - _src = url; - var match = url.match(/(pbf|mvt)/i); - var extension = match ? ('.' + match[0].toLowerCase()) : ''; - var zxy = url.match(/\/(\d+)\/(\d+)\/(\d+)/); - var bufferdata = { - data : data, - zxy : zxy - }; - parseSaveAndZoom(extension, bufferdata); - }); - - return this; - }; - - - drawMvt.files = function(fileList) { - if (!fileList.length) return this; - var f = fileList[0], - reader = new FileReader(); - - reader.onload = (function(file) { - -return; // todo find x,y,z -var data = []; -var zxy = [0,0,0]; - - _src = file.name; - var extension = getExtension(file.name); - var bufferdata = { - data: data, - zxy: zxy - }; - return function (e) { - bufferdata.data = e.target.result; - parseSaveAndZoom(extension, bufferdata); - }; - })(f); - - reader.readAsArrayBuffer(f); - return this; - }; - - - drawMvt.getSrc = function () { - return _src; - }; - - - drawMvt.fitZoom = function() { - if (!this.hasMvt()) return this; - - var map = context.map(); - var viewport = map.trimmedExtent().polygon(); - var coords = _reduce(_geojson.features, function(coords, feature) { - var c = feature.geometry.coordinates; - - /* eslint-disable no-fallthrough */ - switch (feature.geometry.type) { - case 'Point': - c = [c]; - case 'MultiPoint': - case 'LineString': - break; - - case 'MultiPolygon': - c = _flatten(c); - case 'Polygon': - case 'MultiLineString': - c = _flatten(c); - break; - } - /* eslint-enable no-fallthrough */ - - return _union(coords, c); - }, []); - - if (!geoPolygonIntersectsPolygon(viewport, coords, true)) { - var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords })); - map.centerZoom(extent.center(), map.trimmedExtentZoom(extent)); - } - - return this; - }; - - - init(); - return drawMvt; -} diff --git a/test/data/gpxtest.gpx b/test/data/gpxtest.gpx deleted file mode 100644 index 0df3c35d5..000000000 --- a/test/data/gpxtest.gpx +++ /dev/null @@ -1,13 +0,0 @@ - - - - - New Jersey - - N.J. - 19717.8 - New Jersey - 316973311 - - - diff --git a/test/data/gpxtest.json b/test/data/gpxtest.json deleted file mode 100644 index 4982aa6c3..000000000 --- a/test/data/gpxtest.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [ - -74.38928604125977, - 40.150275473401365 - ] - }, - "properties": { - "abbr": "N.J.", - "area": 19717.8, - "name": "New Jersey", - "name_en": "New Jersey", - "osm_id": 316973311 - }, - "id": 316973311 - } - ] -} diff --git a/test/data/gpxtest.kml b/test/data/gpxtest.kml deleted file mode 100644 index 5acf1ad16..000000000 --- a/test/data/gpxtest.kml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - -gpxtest - - New Jersey - - N.J. - 19717.8 - New Jersey - 316973311 - - -74.3892860412598,40.1502754734014 - - - diff --git a/test/data/mvttest.pbf b/test/data/mvttest.pbf deleted file mode 100644 index 63858a7a95cc69bbca67f9ba98ddd88fa0f8ada7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 zcmeI4eQXnD9LMjyy|(K!nOz-odUP&q^Hz52-heorqb3{6#>+4$!Exf00e*l5C8%|;J-&;ttfdbD%dTi z9*P>Np(tKY_NGkT)Uso#Z9}lNC#dwaKG+#lvX4}np{N?^8&yf0ssX{~UFKzXmq+4# z#;6&I8ol#TN=$dMsjGecrl8W^wI;Y(S*W8V;#Mi8R6dbN#CoH~h!It3g>WJ|9E+z5 z$;6JTHeT|2%Gj{gdt8qhF~ijRbW;~{4MHlA?lYB?N|LD>=4@UsR@-jPohV6JJATn@ ztyH!qB@#D{0VBCc+f7NV@umzBr-Y)3P*poCdCSV!0c+HZq|7I`XzWau3RXaw z=&)hMRb*}MaMdyBM|2*&i&y9;&|b72wW0t{!UhC@01yBIKmZ5;0U!VbfWZHpz}_bv zg6F{4yd3hWim%T|g_Ds%Gm?mt zBP11z#K{^B7i&pLA5E9EdR**}7|}k`-MCK=g_5MrMl%_S50I96($Gn!Yd97%k|aZx zVvFmLOs`=Lw$Lz82CPgtArj(Pf)%(gCfhv?Ye)Chk&GeG5|?r!g66er~?- zLd^jqfmd6}F;Zb&0x$7=s!unu?$EGlWO{7K%2~kh6f<>5Lu`*%JC1Q-_kefMMx2CuBY0lYMj_C)q#+6NhfTqm@n9pPo%qJ$c;@5;r=1Yp`59WiR zez%?Xl#+9l7%`IgVyUz7CA}ehRrIB5n(F<5=9P8LjcR?ZUu&qXYidw)B^8M;Ssga; zmjcOLhgGfKCGw@WrSB50-YM{Ow|@MUgg+LtF7YCk z_f!zp*-5hgN49YWCEZutJq7O-)VXF{h0a}$pB<0NAIkOi8M_-Fh7AY+0U!VbfB+D< zH3W7SB8la=$zu1C50-y&_W`@rEyo|Oetp}wq3#v0RJPanKi$6WP^i7Lqndjzcyelk zIyQCoW}-IBdd-ddP_K7=;itH@}il-hHHi!e={lc%U87nS7XHVfDDBx!EnHSsa# zLeJ-isU#%h^}=Qb9HQE5~(0TknCpCai%IWA9n-hBG^X^xQxqnj)}PEL~T@?>$I)XW{bD)Ef{ z8C9ZcSjld;=TFV_1((d+)B46XqQ*hqXqrK; zvE?Xp(b%$bIcaQps2mOvyO&sEUXo=TvMhED*=dCBIyM?%pNvE!Y)}ztgqhM%s)?2Yfv=u`V-M2>tg@_ diff --git a/test/spec/svg/data.js b/test/spec/svg/data.js index 8068fc18b..323420756 100644 --- a/test/spec/svg/data.js +++ b/test/spec/svg/data.js @@ -7,29 +7,78 @@ describe('iD.svgData', function () { .scale(iD.geoZoomToScale(17)) .clipExtent([[0, 0], [1000, 1000]]); - var gj = { - 'type': 'FeatureCollection', - 'features': [ - { - 'type': 'Feature', - 'id': 316973311, - 'geometry': { - 'type': 'Point', - 'coordinates': [ - -74.38928604125977, - 40.150275473401365 - ] - }, - 'properties': { - 'abbr': 'N.J.', - 'area': 19717.8, - 'name': 'New Jersey', - 'name_en': 'New Jersey', - 'osm_id': 316973311 - } - } - ] - }; + var geojson = + '{' + + ' "type": "FeatureCollection",' + + ' "features": [' + + ' {' + + ' "type": "Feature",' + + ' "geometry": {' + + ' "type": "Point",' + + ' "coordinates": [-74.38928604125977, 40.150275473401365]' + + ' },' + + ' "properties": {' + + ' "abbr": "N.J.",' + + ' "area": 19717.8,' + + ' "name": "New Jersey",' + + ' "name_en": "New Jersey",' + + ' "osm_id": 316973311' + + ' },' + + ' "id": 316973311' + + ' }' + + ' ]' + + '}'; + + var gj = JSON.parse(geojson); + + var gpx = + '' + + '' + + '' + + '' + + ' New Jersey' + + ' ' + + ' N.J.' + + ' 19717.8' + + ' New Jersey' + + ' 316973311' + + ' ' + + '' + + ''; + + var kml = + '' + + '' + + '' + + '' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + + 'gpxtest' + + ' ' + + ' New Jersey' + + ' ' + + ' N.J.' + + ' 19717.8' + + ' New Jersey' + + ' 316973311' + + ' ' + + ' -74.3892860412598,40.1502754734014' + + ' ' + + '' + + '' + + ''; + + + // this is because PhantomJS hasn't implemented a proper File constructor + function makeFile(contents, fileName, mimeType) { + var blob = new Blob([contents], { type: mimeType }); + blob.lastModifiedDate = new Date(); + blob.name = fileName; + return blob; + } beforeEach(function () { context = iD.coreContext(); @@ -58,35 +107,56 @@ describe('iD.svgData', function () { expect(path.attr('d')).to.match(/^M.*z$/); }); - describe('#files', function() { - it('handles gpx files', function () { - var files = '../../data/gpxtest.gpx'; - var render = iD.svgData(projection, context, dispatch).files(files); - surface.call(render); + describe('#fileList', function() { + it('handles gpx files', function (done) { + var files = [ makeFile(gpx, 'test.gpx', 'application/gpx+xml') ]; + var render = iD.svgData(projection, context, dispatch); + var spy = sinon.spy(); + dispatch.on('change', spy); + render.fileList(files); - var path = surface.selectAll('path'); - expect(path.nodes().length).to.eql(1); - expect(path.attr('d')).to.match(/^M.*z$/); + window.setTimeout(function() { + expect(spy).to.have.been.calledOnce; + surface.call(render); + var path = surface.selectAll('path'); + expect(path.nodes().length).to.eql(1); + expect(path.attr('d')).to.match(/^M.*z$/); + done(); + }, 200); }); - it('handles geojson files', function () { - var files = '../../data/gpxtest.json'; - var render = iD.svgData(projection, context, dispatch).files(files); - surface.call(render); + it('handles kml files', function (done) { + var files = [ makeFile(kml, 'test.kml', 'application/vnd.google-earth.kml+xml') ]; + var render = iD.svgData(projection, context, dispatch); + var spy = sinon.spy(); + dispatch.on('change', spy); + render.fileList(files); - var path = surface.selectAll('path'); - expect(path.nodes().length).to.eql(1); - expect(path.attr('d')).to.match(/^M.*z$/); + window.setTimeout(function() { + expect(spy).to.have.been.calledOnce; + surface.call(render); + var path = surface.selectAll('path'); + expect(path.nodes().length).to.eql(1); + expect(path.attr('d')).to.match(/^M.*z$/); + done(); + }, 200); }); - it('handles kml files', function () { - var files = '../../data/gpxtest.kml'; - var render = iD.svgData(projection, context, dispatch).files(files); - surface.call(render); + it('handles geojson files', function (done) { + var files = [ makeFile(geojson, 'test.geojson', 'application/vnd.geo+json') ]; + var render = iD.svgData(projection, context, dispatch); + var spy = sinon.spy(); + dispatch.on('change', spy); + render.fileList(files); - var path = surface.selectAll('path'); - expect(path.nodes().length).to.eql(1); - expect(path.attr('d')).to.match(/^M.*z$/); + window.setTimeout(function() { + expect(spy).to.have.been.calledOnce; + surface.call(render); + var path = surface.selectAll('path'); + expect(path.nodes().length).to.eql(1); + expect(path.attr('d')).to.match(/^M.*z$/); + done(); + }, 200); }); }); diff --git a/test/spec/svg/mvt.js b/test/spec/svg/mvt.js deleted file mode 100644 index e5ab522aa..000000000 --- a/test/spec/svg/mvt.js +++ /dev/null @@ -1,97 +0,0 @@ -describe('iD.svgMvt', function () { - var context; - var surface; - var dispatch = d3.dispatch('change'); - var projection = iD.geoRawMercator() - .translate([6934098.868981334, 4092682.5519805425]) - .scale(iD.geoZoomToScale(17)) - .clipExtent([[0, 0], [1000, 1000]]); - - - var gj = { - 'type': 'FeatureCollection', - 'features': [ - { - 'type': 'Feature', - 'id': 316973311, - 'geometry': { - 'type': 'Point', - 'coordinates': [ - -74.38928604125977, - 40.150275473401365 - ] - }, - 'properties': { - 'abbr': 'N.J.', - 'area': 19717.8, - 'name': 'New Jersey', - 'name_en': 'New Jersey', - 'osm_id': 316973311 - } - } - ] - }; - - beforeEach(function () { - context = iD.coreContext(); - d3.select(document.createElement('div')) - .attr('id', 'map') - .call(context.map().centerZoom([-74.389286, 40.1502754], 17)); - - surface = context.surface(); - }); - - it('creates layer-mvt', function () { - var render = iD.svgMvt(projection, context, dispatch); - surface.call(render); - - var layers = surface.selectAll('g.layer-mvt').nodes(); - expect(layers.length).to.eql(1); - }); - - it('draws geojson', function () { - var render = iD.svgMvt(projection, context, dispatch).geojson(gj); - surface.call(render); - - var path = surface.selectAll('path.mvt'); - expect(path.nodes().length).to.eql(1); - expect(path.attr('d')).to.match(/^M.*z$/); - }); - - describe('#url', function() { - it('handles pbf url', function () { - var url = '../../data/mvttest.pbf'; - var render = iD.svgMvt(projection, context, dispatch).url(url); - surface.call(render); - - var path = surface.selectAll('path.mvt'); - expect(path.nodes().length).to.eql(1); - expect(path.attr('d')).to.match(/^M.*z$/); - }); - }); - - describe('#showLabels', function() { - it('shows labels by default', function () { - var render = iD.svgMvt(projection, context, dispatch).geojson(gj); - surface.call(render); - - var label = surface.selectAll('text.mvtlabel'); - expect(label.nodes().length).to.eql(1); - expect(label.text()).to.eql('New Jersey'); - - var halo = surface.selectAll('text.mvtlabel-halo'); - expect(halo.nodes().length).to.eql(1); - expect(halo.text()).to.eql('New Jersey'); - }); - - - it('hides labels with showLabels(false)', function () { - var render = iD.svgMvt(projection, context, dispatch).geojson(gj).showLabels(false); - surface.call(render); - - expect(surface.selectAll('text.mvtlabel').empty()).to.be.ok; - expect(surface.selectAll('text.mvtlabel-halo').empty()).to.be.ok; - }); - }); - -}); From 259e410b43e6f65c24217b4d127c7bd2c1f0a470 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 23 Aug 2018 13:03:18 -0400 Subject: [PATCH 146/217] Clip polygons to tile boundaries --- modules/services/vector_tile.js | 4 ++++ package.json | 1 + 2 files changed, 5 insertions(+) diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js index 6c947c918..01ac65148 100644 --- a/modules/services/vector_tile.js +++ b/modules/services/vector_tile.js @@ -4,6 +4,7 @@ import _forEach from 'lodash-es/forEach'; import { dispatch as d3_dispatch } from 'd3-dispatch'; import { request as d3_request } from 'd3-request'; +import bboxClip from '@turf/bbox-clip'; import Protobuf from 'pbf'; import vt from '@mapbox/vector-tile'; @@ -34,6 +35,9 @@ function vtToGeoJSON(data, tile) { if (layers.length > 1) { feature.properties.vt_layer = layerID; } + // clip to tile bounds + feature = bboxClip(feature, tile.extent.rectangle()); + // force some unique id generation feature.__featurehash__ = utilHashcode(JSON.stringify(feature)); feature.__propertyhash__ = utilHashcode(JSON.stringify(feature.properties || {})); diff --git a/package.json b/package.json index 312868496..d87e1818d 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@mapbox/sexagesimal": "1.1.0", "@mapbox/togeojson": "0.16.0", "@mapbox/vector-tile": "^1.3.1", + "@turf/bbox-clip": "^6.0.0", "diacritics": "1.3.0", "lodash-es": "4.17.10", "marked": "0.5.0", From b0f86cdf31c3b35e18139a7ee7758fdb81cfd882 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 23 Aug 2018 22:03:51 -0400 Subject: [PATCH 147/217] Merge matching polygons across tile boundaries --- build_src.js | 5 +- modules/services/vector_tile.js | 87 +++++++++++++++++++++++++-------- modules/svg/data.js | 3 +- package.json | 2 + 4 files changed, 75 insertions(+), 22 deletions(-) diff --git a/build_src.js b/build_src.js index 425eb6120..347bb922b 100644 --- a/build_src.js +++ b/build_src.js @@ -27,7 +27,10 @@ module.exports = function buildSrc() { input: './modules/id.js', plugins: [ includePaths( { - paths: ['node_modules/d3/node_modules'] // npm2 or windows + paths: ['node_modules/d3/node_modules'], // npm2 or windows + include: { + 'martinez-polygon-clipping': 'node_modules/martinez-polygon-clipping/dist/martinez.umd.js' + } }), nodeResolve({ module: true, diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js index 01ac65148..d5a5e2fc9 100644 --- a/modules/services/vector_tile.js +++ b/modules/services/vector_tile.js @@ -1,17 +1,21 @@ import _find from 'lodash-es/find'; +import _isEqual from 'lodash-es/isEqual'; import _forEach from 'lodash-es/forEach'; import { dispatch as d3_dispatch } from 'd3-dispatch'; import { request as d3_request } from 'd3-request'; -import bboxClip from '@turf/bbox-clip'; +import turf_bboxClip from '@turf/bbox-clip'; +import stringify from 'fast-json-stable-stringify'; +import martinez from 'martinez-polygon-clipping'; + import Protobuf from 'pbf'; import vt from '@mapbox/vector-tile'; import { utilHashcode, utilRebind, utilTiler } from '../util'; -var tiler = utilTiler().tileSize(512); +var tiler = utilTiler().tileSize(512).margin(1); var dispatch = d3_dispatch('loadedData'); var _vtCache; @@ -21,7 +25,7 @@ function abortRequest(i) { } -function vtToGeoJSON(data, tile) { +function vtToGeoJSON(data, tile, mergeCache) { var vectorTile = new vt.VectorTile(new Protobuf(data.response)); var layers = Object.keys(vectorTile.layers); if (!Array.isArray(layers)) { layers = [layers]; } @@ -32,16 +36,58 @@ function vtToGeoJSON(data, tile) { if (layer) { for (var i = 0; i < layer.length; i++) { var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); + var geometry = feature.geometry; if (layers.length > 1) { feature.properties.vt_layer = layerID; } - // clip to tile bounds - feature = bboxClip(feature, tile.extent.rectangle()); + + // Treat all Polygons as MultiPolygons + if (geometry.type === 'Polygon') { + geometry.type = 'MultiPolygon'; + geometry.coordinates = [geometry.coordinates]; + } + + // Clip to tile bounds + if (geometry.type === 'MultiPolygon') { + var isClipped = false; + var featureClip = turf_bboxClip(feature, tile.extent.rectangle()); + if (!_isEqual(feature.geometry, featureClip.geometry)) { + // feature = featureClip; + isClipped = true; + } + if (!feature.geometry.coordinates.length) continue; // not actually on this tile + if (!feature.geometry.coordinates[0].length) continue; // not actually on this tile + } // force some unique id generation - feature.__featurehash__ = utilHashcode(JSON.stringify(feature)); - feature.__propertyhash__ = utilHashcode(JSON.stringify(feature.properties || {})); + var featurehash = utilHashcode(stringify(feature)); + var propertyhash = utilHashcode(stringify(feature.properties || {})); + feature.__featurehash__ = featurehash; + feature.__propertyhash__ = propertyhash; features.push(feature); + + // Clipped Polygons at same zoom with identical properties can get merged + if (isClipped && geometry.type === 'MultiPolygon') { + var merged = mergeCache[propertyhash]; + if (merged && merged.length) { + var other = merged[0]; + var coords = martinez.union( + feature.geometry.coordinates, other.geometry.coordinates + ); + + if (!coords || !coords.length) { + continue; // something failed in martinez union + } + + merged.push(feature); + for (var j = 0; j < merged.length; j++) { // all these features get... + merged[j].geometry.coordinates = coords; // same coords + merged[j].__featurehash__ = featurehash; // same hash, so deduplication works + } + } else { + mergeCache[propertyhash] = [feature]; + } + } } } }); @@ -64,19 +110,19 @@ function loadTile(source, tile) { return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length]; }); - source.inflight[tile.id] = d3_request(url) .responseType('arraybuffer') .get(function(err, data) { - source.loaded[tile.id] = {}; + source.loaded[tile.id] = []; delete source.inflight[tile.id]; if (err || !data) return; - source.loaded[tile.id] = { - data: data, - features: vtToGeoJSON(data, tile) - }; + var z = tile.xyz[2]; + if (!source.canMerge[z]) { + source.canMerge[z] = {}; // initialize mergeCache + } + source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]); dispatch.call('loadedData'); }); } @@ -106,7 +152,7 @@ export default { addSource: function(sourceID, template) { - _vtCache[sourceID] = { template: template, inflight: {}, loaded: {} }; + _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} }; return _vtCache[sourceID]; }, @@ -120,13 +166,14 @@ export default { var results = []; for (var i = 0; i < tiles.length; i++) { - var loaded = source.loaded[tiles[i].id]; - if (!loaded || !loaded.features) continue; + var features = source.loaded[tiles[i].id]; + if (!features || !features.length) continue; - for (var j = 0; j < loaded.features.length; j++) { - var feature = loaded.features[j]; - if (seen[feature.__featurehash__]) continue; - seen[feature.__featurehash__] = true; + for (var j = 0; j < features.length; j++) { + var feature = features[j]; + var hash = feature.__featurehash__; + if (seen[hash]) continue; + seen[hash] = true; results.push(feature); } } diff --git a/modules/svg/data.js b/modules/svg/data.js index 38e0c15e0..581da8fc7 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -16,6 +16,7 @@ import { select as d3_select } from 'd3-selection'; +import stringify from 'fast-json-stable-stringify'; import toGeoJSON from '@mapbox/togeojson'; import { geoExtent, geoPolygonIntersectsPolygon } from '../geo'; @@ -133,7 +134,7 @@ export function svgData(projection, context, dispatch) { // ensure that each single Feature object has a unique ID function ensureFeatureID(feature) { if (!feature) return; - feature.__featurehash__ = utilHashcode(JSON.stringify(feature)); + feature.__featurehash__ = utilHashcode(stringify(feature)); return feature; } diff --git a/package.json b/package.json index d87e1818d..a037d7b76 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,10 @@ "@mapbox/vector-tile": "^1.3.1", "@turf/bbox-clip": "^6.0.0", "diacritics": "1.3.0", + "fast-json-stable-stringify": "2.0.0", "lodash-es": "4.17.10", "marked": "0.5.0", + "martinez-polygon-clipping": "0.5.0", "node-diff3": "1.0.0", "osm-auth": "1.0.2", "pannellum": "2.4.1", From ec80e44280abb75550da9a2a78fed7386d18f739 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 23 Aug 2018 23:12:55 -0400 Subject: [PATCH 148/217] Add notes about ES6 (re: #5246) --- CONTRIBUTING.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e882ce581..d86178082 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -290,17 +290,25 @@ you're going to update the presets, [review the Presets README](/data/presets/RE ## JavaScript -We use the [Airbnb style for JavaScript](https://github.com/airbnb/javascript) with -only one difference: +iD uses ES5 syntax throughout the code, with one exception: +[ES6 modules](http://exploringjs.com/es6/ch_modules.html) using `import` and +`export` constructs. These are processed by [Rollup.js](https://rollupjs.org/guide/en) +and not present in the distributed iD bundle. -**4 space soft tabs always for JavaScript, not 2.** +ES5 syntax is required for: +* IE11, which about 15-20% of our users still use +* PhantomJS which runs our tests (it would be great to replace this!) + +We will introduce ES6 syntax eventually when it makes sense to do so. + +We use the [ES5 Airbnb style guide for JavaScript](https://github.com/airbnb/javascript/tree/es5-deprecated/es5) with +only one difference: **4 space soft tabs always for JavaScript, not 2.** No aligned `=`, no aligned arguments, spaces are either indents or the 1 space between expressions. No hard tabs, ever. JavaScript code should pass through [ESLint](http://eslint.org/) with no -warnings. iD uses [ES6 modules](http://exploringjs.com/es6/ch_modules.html) to -handle connect code together, so we support `import` and `export` constructs. +warnings. ## HTML From 48e233e4a3d6d8f88fa33e6464a757d755efb53a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 24 Aug 2018 10:39:03 -0400 Subject: [PATCH 149/217] Move some css rules around, add hash and geometry.type to css classlist --- css/20_map.css | 30 ------- css/65_data.css | 141 ++++++-------------------------- css/80_app.css | 129 ++++++++++++++++++++++++++++- modules/services/vector_tile.js | 6 +- modules/svg/data.js | 13 ++- 5 files changed, 166 insertions(+), 153 deletions(-) diff --git a/css/20_map.css b/css/20_map.css index 79c127555..13c72a12b 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -306,33 +306,3 @@ g.turn circle { stroke: #68f; } - -/* Other Data (gpx, kml, geojson, mvt, pbf) */ - -.layer-mapdata { - pointer-events: none; -} - -.layer-mapdata path { - stroke: #ff26d4; - stroke-width: 2; - fill: none; -} - -.layer-mapdata text.label-halo, -.layer-mapdata text.label { - font-size: 10px; - font-weight: bold; - dominant-baseline: middle; -} - -.layer-mapdata text.label { - fill: #ff26d4; -} - -.layer-mapdata text.label-halo { - opacity: 0.7; - stroke: #000; - stroke-width: 5px; - stroke-miterlimit: 1; -} diff --git a/css/65_data.css b/css/65_data.css index 38346e8a2..fcf5d3a66 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -41,140 +41,49 @@ .note-header-icon .preset-icon-28 { top: 18px; } - .note-header-icon .note-icon-annotation { position: absolute; top: 22px; left: 22px; margin: auto; } - .note-header-icon .note-icon-annotation .icon { width: 15px; height: 15px; } -/* OSM Note UI */ -.note-header { - background-color: #f6f6f6; - border-radius: 5px; - border: 1px solid #ccc; - display: flex; - flex-flow: row nowrap; - align-items: center; +/* Custom Map Data (geojson, gpx, kml, vector tile) */ + +.layer-mapdata { + pointer-events: none; } -.note-header-icon { - background-color: #fff; - padding: 10px; - flex: 0 0 62px; - position: relative; - width: 60px; - height: 60px; - border-right: 1px solid #ccc; - border-radius: 5px 0 0 5px; +.layer-mapdata path { + stroke: #ff26d4; + stroke-width: 2; + fill: none; } -[dir='rtl'] .note-header-icon { - border-right: unset; - border-left: 1px solid #ccc; - border-radius: 0 5px 5px 0; +.layer-mapdata path.MultiPolygon, +.layer-mapdata path.Polygon { + stroke-width: 1; + fill: #ff26d4; + fill-opacity: 0.2; } -.note-header-icon .icon-wrap { - position: absolute; - top: 0px; -} - -.note-header-label { - background-color: #f6f6f6; - padding: 0 15px; - flex: 1 1 100%; - font-size: 14px; +.layer-mapdata text.label-halo, +.layer-mapdata text.label { + font-size: 10px; font-weight: bold; - border-radius: 0 5px 5px 0; + dominant-baseline: middle; } -[dir='rtl'] .note-header-label { - border-radius: 5px 0 0 5px; +.layer-mapdata text.label { + fill: #ff26d4; +} +.layer-mapdata text.label-halo { + opacity: 0.7; + stroke: #000; + stroke-width: 5px; + stroke-miterlimit: 1; } -.note-category { - margin: 20px 0px; -} - -.comments-container { - background: #ececec; - padding: 1px 10px; - border-radius: 8px; - margin-top: 20px; -} - -.comment { - background-color: #fff; - border-radius: 5px; - border: 1px solid #ccc; - margin: 10px auto; - display: flex; - flex-flow: row nowrap; -} -.comment-avatar { - padding: 10px; - flex: 0 0 62px; -} -.comment-avatar .icon.comment-avatar-icon { - width: 40px; - height: 40px; - object-fit: cover; - border: 1px solid #ccc; - border-radius: 20px; -} -.comment-main { - padding: 10px 10px 10px 0; - flex: 1 1 100%; - flex-flow: column nowrap; - overflow: hidden; - overflow-wrap: break-word; -} -[dir='rtl'] .comment-main { - padding: 10px 0 10px 10px; -} - -.comment-metadata { - flex-flow: row nowrap; - justify-content: space-between; -} -.comment-author { - font-weight: bold; - color: #333; -} -.comment-date { - color: #aaa; -} -.comment-text { - color: #333; - margin-top: 10px; - overflow-y: auto; - max-height: 250px; -} -.comment-text::-webkit-scrollbar { - border-left: none; -} - -.note-save { - padding: 10px; -} - -.note-save #new-comment-input { - width: 100%; - height: 100px; - max-height: 300px; - min-height: 100px; -} - -.note-save .detail-section { - margin: 10px 0; -} - -.note-report { - float: right; -} diff --git a/css/80_app.css b/css/80_app.css index c33de8c30..0894a06fd 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1204,7 +1204,7 @@ a.hide-toggle { } -/* preset form basics */ +/* Preset Editor */ .preset-editor { overflow: hidden; @@ -2415,6 +2415,133 @@ input.key-trap { border: 1px solid rgba(0,0,0,0); } + +/* OSM Note UI */ +.note-header { + background-color: #f6f6f6; + border-radius: 5px; + border: 1px solid #ccc; + display: flex; + flex-flow: row nowrap; + align-items: center; +} + +.note-header-icon { + background-color: #fff; + padding: 10px; + flex: 0 0 62px; + position: relative; + width: 60px; + height: 60px; + border-right: 1px solid #ccc; + border-radius: 5px 0 0 5px; +} +[dir='rtl'] .note-header-icon { + border-right: unset; + border-left: 1px solid #ccc; + border-radius: 0 5px 5px 0; +} + +.note-header-icon .icon-wrap { + position: absolute; + top: 0px; +} + +.note-header-label { + background-color: #f6f6f6; + padding: 0 15px; + flex: 1 1 100%; + font-size: 14px; + font-weight: bold; + border-radius: 0 5px 5px 0; +} +[dir='rtl'] .note-header-label { + border-radius: 5px 0 0 5px; +} + +.note-category { + margin: 20px 0px; +} + +.comments-container { + background: #ececec; + padding: 1px 10px; + border-radius: 8px; + margin-top: 20px; +} + +.comment { + background-color: #fff; + border-radius: 5px; + border: 1px solid #ccc; + margin: 10px auto; + display: flex; + flex-flow: row nowrap; +} +.comment-avatar { + padding: 10px; + flex: 0 0 62px; +} +.comment-avatar .icon.comment-avatar-icon { + width: 40px; + height: 40px; + object-fit: cover; + border: 1px solid #ccc; + border-radius: 20px; +} +.comment-main { + padding: 10px 10px 10px 0; + flex: 1 1 100%; + flex-flow: column nowrap; + overflow: hidden; + overflow-wrap: break-word; +} +[dir='rtl'] .comment-main { + padding: 10px 0 10px 10px; +} + +.comment-metadata { + flex-flow: row nowrap; + justify-content: space-between; +} +.comment-author { + font-weight: bold; + color: #333; +} +.comment-date { + color: #aaa; +} +.comment-text { + color: #333; + margin-top: 10px; + overflow-y: auto; + max-height: 250px; +} +.comment-text::-webkit-scrollbar { + border-left: none; +} + +.note-save { + padding: 10px; +} + +.note-save #new-comment-input { + width: 100%; + height: 100px; + max-height: 300px; + min-height: 100px; +} + +.note-save .detail-section { + margin: 10px 0; +} + +.note-report { + float: right; +} + + + /* Fullscreen button */ div.full-screen { float: right; diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js index d5a5e2fc9..1239dd06b 100644 --- a/modules/services/vector_tile.js +++ b/modules/services/vector_tile.js @@ -37,9 +37,6 @@ function vtToGeoJSON(data, tile, mergeCache) { for (var i = 0; i < layer.length; i++) { var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]); var geometry = feature.geometry; - if (layers.length > 1) { - feature.properties.vt_layer = layerID; - } // Treat all Polygons as MultiPolygons if (geometry.type === 'Polygon') { @@ -59,9 +56,10 @@ function vtToGeoJSON(data, tile, mergeCache) { if (!feature.geometry.coordinates[0].length) continue; // not actually on this tile } - // force some unique id generation + // Generate some unique IDs and add some metadata var featurehash = utilHashcode(stringify(feature)); var propertyhash = utilHashcode(stringify(feature.properties || {})); + feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_'); feature.__featurehash__ = featurehash; feature.__propertyhash__ = propertyhash; features.push(feature); diff --git a/modules/svg/data.js b/modules/svg/data.js index 581da8fc7..8ae1ab4fc 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -151,6 +151,15 @@ export function svgData(projection, context, dispatch) { } + function featureClasses(d) { + return [ + 'data' + d.__featurehash__, + d.geometry.type, + d.__layerID__ || '' + ].join(' '); + } + + function drawData(selection) { var vtService = getService(); var getPath = svgPath(projection).geojson; @@ -190,7 +199,7 @@ export function svgData(projection, context, dispatch) { // enter/update paths = paths.enter() .append('path') - .attr('class', 'pathdata') + .attr('class', function(d) { return 'pathdata ' + featureClasses(d); }) .merge(paths) .attr('d', getPath); @@ -216,7 +225,7 @@ export function svgData(projection, context, dispatch) { // enter/update labels = labels.enter() .append('text') - .attr('class', textClass) + .attr('class', function(d) { return textClass + ' ' + featureClasses(d); }) .merge(labels) .text(function(d) { return d.properties.desc || d.properties.name; From 7714e88f3ddf2debeecf727627526ae598602793 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 24 Aug 2018 14:07:00 -0400 Subject: [PATCH 150/217] Support data area filling (full/partial/wireframe), shadow strokes --- css/65_data.css | 27 ++++++++++++--- css/70_fills.css | 5 +++ modules/svg/areas.js | 4 +-- modules/svg/data.js | 79 ++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 102 insertions(+), 13 deletions(-) diff --git a/css/65_data.css b/css/65_data.css index fcf5d3a66..6be709a5f 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -59,16 +59,33 @@ pointer-events: none; } -.layer-mapdata path { +.layer-mapdata path.shadow { + stroke: #f6634f; + stroke-width: 16; + stroke-opacity: 0; + fill: none; +} +.layer-mapdata path.shadow.related:not(.selected), +.layer-mapdata path.shadow.hover:not(.selected) { + stroke-opacity: 0.4; +} +.layer-mapdata path.shadow.selected { + stroke-opacity: 0.7; +} + +.layer-mapdata path.stroke { stroke: #ff26d4; stroke-width: 2; fill: none; } -.layer-mapdata path.MultiPolygon, -.layer-mapdata path.Polygon { - stroke-width: 1; + +.layer-mapdata path.fill { + stroke-width: 0; + stroke-opacity: 0.3; + stroke: #ff26d4; fill: #ff26d4; - fill-opacity: 0.2; + fill-opacity: 0.3; + fill-rule: evenodd; } .layer-mapdata text.label-halo, diff --git a/css/70_fills.css b/css/70_fills.css index 5b0996de8..fa6e58cf8 100644 --- a/css/70_fills.css +++ b/css/70_fills.css @@ -7,6 +7,11 @@ stroke-dasharray: none !important; fill: none !important; } +.low-zoom.fill-wireframe .layer-mapdata path.stroke, +.fill-wireframe .layer-mapdata path.stroke { + stroke-width: 2 !important; + stroke-opacity: 1 !important; +} .low-zoom.fill-wireframe path.shadow, .fill-wireframe path.shadow { diff --git a/modules/svg/areas.js b/modules/svg/areas.js index 01a12de7f..546919ecd 100644 --- a/modules/svg/areas.js +++ b/modules/svg/areas.js @@ -132,7 +132,7 @@ export function svgAreas(projection, context) { fill: areas }; - var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath') + var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm') .filter(filter) .data(data.clip, osmEntity.key); @@ -141,7 +141,7 @@ export function svgAreas(projection, context) { var clipPathsEnter = clipPaths.enter() .append('clipPath') - .attr('class', 'clipPath') + .attr('class', 'clipPath-osm') .attr('id', function(entity) { return entity.id + '-clippath'; }); clipPathsEnter diff --git a/modules/svg/data.js b/modules/svg/data.js index 8ae1ab4fc..80f97b1d3 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -151,6 +151,21 @@ export function svgData(projection, context, dispatch) { } + function featureKey(d) { + return d.__featurehash__; + } + + + function isPolygon(d) { + return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon'; + } + + + function clipPathID(d) { + return 'data-' + d.__featurehash__ + '-clippath'; + } + + function featureClasses(d) { return [ 'data' + d.__featurehash__, @@ -176,8 +191,12 @@ export function svgData(projection, context, dispatch) { .attr('class', 'layer-mapdata') .merge(layer); + var surface = context.surface(); + if (!surface || surface.empty()) return; // not ready to draw yet, starting up - var geoData; + + // Gather data + var geoData, polygonData; if (_template && vtService) { // fetch data from vector tile service var sourceID = _template; vtService.loadTiles(sourceID, _template, projection); @@ -186,11 +205,50 @@ export function svgData(projection, context, dispatch) { geoData = getFeatures(_geojson); } geoData = geoData.filter(getPath); + polygonData = geoData.filter(isPolygon); - var paths = layer + // Draw clip paths for polygons + var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data') + .data(polygonData, featureKey); + + clipPaths.exit() + .remove(); + + var clipPathsEnter = clipPaths.enter() + .append('clipPath') + .attr('class', 'clipPath-data') + .attr('id', clipPathID); + + clipPathsEnter + .append('path'); + + clipPaths.merge(clipPathsEnter) + .selectAll('path') + .attr('d', getPath); + + + // Draw fill, shadow, stroke layers + var datagroups = layer + .selectAll('g.datagroup') + .data(['fill', 'shadow', 'stroke']); + + datagroups = datagroups.enter() + .append('g') + .attr('class', function(d) { return 'datagroup datagroup-' + d; }) + .merge(datagroups); + + + // Draw paths + var pathData = { + shadow: geoData, + stroke: geoData, + fill: polygonData + }; + + var paths = datagroups .selectAll('path') - .data(geoData, function(d) { return d.__featurehash__; }); + .data(function(layer) { return pathData[layer]; }, featureKey); // exit paths.exit() @@ -199,11 +257,20 @@ export function svgData(projection, context, dispatch) { // enter/update paths = paths.enter() .append('path') - .attr('class', function(d) { return 'pathdata ' + featureClasses(d); }) + .attr('class', function(d) { + var datagroup = this.parentNode.__data__; + var area = (datagroup === 'fill' ? 'area ' : ''); + return 'pathdata ' + area + datagroup + ' ' + featureClasses(d); + }) + .attr('clip-path', function(d) { + var datagroup = this.parentNode.__data__; + return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null; + }) .merge(paths) .attr('d', getPath); + // Draw labels layer .call(drawLabels, 'label-halo', geoData) .call(drawLabels, 'label', geoData); @@ -216,7 +283,7 @@ export function svgData(projection, context, dispatch) { }); var labels = selection.selectAll('text.' + textClass) - .data(labelData, function(d) { return d.__featurehash__; }); + .data(labelData, featureKey); // exit labels.exit() @@ -312,7 +379,7 @@ export function svgData(projection, context, dispatch) { drawData.hasData = function() { - return !!(_template || _geojson); + return !!(_template || !_isEmpty(_geojson)); }; From a9aca707b61643f3770ff737ecb925059cc334c3 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 00:04:52 -0400 Subject: [PATCH 151/217] Support hovering on data features --- css/65_data.css | 12 ++++++++++- modules/behavior/hover.js | 42 ++++++++++++++++++++++----------------- modules/svg/data.js | 10 +++++----- modules/ui/sidebar.js | 28 +++++++++++++------------- 4 files changed, 54 insertions(+), 38 deletions(-) diff --git a/css/65_data.css b/css/65_data.css index 6be709a5f..1cf8de123 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -60,12 +60,18 @@ } .layer-mapdata path.shadow { + pointer-events: stroke; stroke: #f6634f; stroke-width: 16; stroke-opacity: 0; fill: none; } -.layer-mapdata path.shadow.related:not(.selected), +.layer-mapdata path.MultiPoint.shadow, +.layer-mapdata path.Point.shadow { + pointer-events: fill; + fill: #f6634f; + fill-opacity: 0; +} .layer-mapdata path.shadow.hover:not(.selected) { stroke-opacity: 0.4; } @@ -97,6 +103,10 @@ .layer-mapdata text.label { fill: #ff26d4; } +.layer-mapdata text.label.hover, +.layer-mapdata text.label.selected { + fill: #f6634f; +} .layer-mapdata text.label-halo { opacity: 0.7; stroke: #000; diff --git a/modules/behavior/hover.js b/modules/behavior/hover.js index d086ac72c..9b2000e62 100644 --- a/modules/behavior/hover.js +++ b/modules/behavior/hover.js @@ -110,13 +110,32 @@ export function behaviorHover(context) { _selection.selectAll('.hover-suppressed') .classed('hover-suppressed', false); - var entity; - if (datum instanceof osmNote || datum instanceof osmEntity) { + // What are we hovering over? + var entity, selector; + if (datum && datum.__featurehash__) { entity = datum; - } else { - entity = datum && datum.properties && datum.properties.entity; + selector = '.data' + datum.__featurehash__; + + } else if (datum instanceof osmNote) { + entity = datum; + selector = '.note-' + datum.id; + + } else if (datum instanceof osmEntity) { + entity = datum; + selector = '.' + entity.id; + if (entity.type === 'relation') { + entity.members.forEach(function(member) { selector += ', .' + member.id; }); + } + + } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) { + entity = datum.properties.entity; + selector = '.' + entity.id; + if (entity.type === 'relation') { + entity.members.forEach(function(member) { selector += ', .' + member.id; }); + } } + // Update hover state and dispatch event if (entity && entity.id !== _newId) { // If drawing a way, don't hover on a node that was just placed. #3974 var mode = context.mode() && context.mode().id; @@ -125,24 +144,11 @@ export function behaviorHover(context) { return; } - var selector = (datum instanceof osmNote) ? 'note-' + entity.id : '.' + entity.id; - - if (entity.type === 'relation') { - entity.members.forEach(function(member) { - selector += ', .' + member.id; - }); - } - var suppressed = _altDisables && d3_event && d3_event.altKey; - _selection.selectAll(selector) .classed(suppressed ? 'hover-suppressed' : 'hover', true); - if (datum instanceof osmNote) { - dispatch.call('hover', this, !suppressed && entity); - } else { - dispatch.call('hover', this, !suppressed && entity.id); - } + dispatch.call('hover', this, !suppressed && entity); } else { dispatch.call('hover', this, null); diff --git a/modules/svg/data.js b/modules/svg/data.js index 80f97b1d3..b902a7648 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -170,8 +170,9 @@ export function svgData(projection, context, dispatch) { return [ 'data' + d.__featurehash__, d.geometry.type, + isPolygon(d) ? 'area' : '', d.__layerID__ || '' - ].join(' '); + ].filter(Boolean).join(' '); } @@ -228,7 +229,7 @@ export function svgData(projection, context, dispatch) { .attr('d', getPath); - // Draw fill, shadow, stroke layers + // Draw fill, shadow, stroke layers var datagroups = layer .selectAll('g.datagroup') .data(['fill', 'shadow', 'stroke']); @@ -239,7 +240,7 @@ export function svgData(projection, context, dispatch) { .merge(datagroups); - // Draw paths + // Draw paths var pathData = { shadow: geoData, stroke: geoData, @@ -259,8 +260,7 @@ export function svgData(projection, context, dispatch) { .append('path') .attr('class', function(d) { var datagroup = this.parentNode.__data__; - var area = (datagroup === 'fill' ? 'area ' : ''); - return 'pathdata ' + area + datagroup + ' ' + featureClasses(d); + return 'pathdata ' + datagroup + ' ' + featureClasses(d); }) .attr('clip-path', function(d) { var datagroup = this.parentNode.__data__; diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index 02035d905..cb972eb10 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -2,7 +2,7 @@ import _throttle from 'lodash-es/throttle'; import { selectAll as d3_selectAll } from 'd3-selection'; -import { osmNote } from '../osm'; +import { osmEntity, osmNote } from '../osm'; import { uiFeatureList } from './feature_list'; import { uiInspector } from './inspector'; import { uiNoteEditor } from './note_editor'; @@ -13,7 +13,6 @@ export function uiSidebar(context) { var noteEditor = uiNoteEditor(context); var _current; var _wasNote = false; - // var layer = d3_select(null); function sidebar(selection) { @@ -22,26 +21,27 @@ export function uiSidebar(context) { .attr('class', 'feature-list-pane') .call(uiFeatureList(context)); - var inspectorWrap = selection .append('div') .attr('class', 'inspector-hidden inspector-wrap fr'); - function hover(what) { - if ((what instanceof osmNote) && (context.mode().id !== 'drag-note')) { - // TODO: figure out why `what` isn't an updated note. Won't hover since .loc doesn't match - _wasNote = true; - var notes = d3_selectAll('.note'); - notes - .classed('hover', function(d) { return d === what; }); + function hover(datum) { + if (datum && datum.__featurehash__) { // hovering on data + console.log ('hover on data ' + datum.__featurehash__); + // show something - sidebar.show(noteEditor.note(what)); + } else if (datum instanceof osmNote) { + if (context.mode().id === 'drag-note') return; + _wasNote = true; + + sidebar + .show(noteEditor.note(datum)); selection.selectAll('.sidebar-component') .classed('inspector-hover', true); - } else if (!_current && context.hasEntity(what)) { + } else if (!_current && (datum instanceof osmEntity)) { featureListWrap .classed('inspector-hidden', true); @@ -49,10 +49,10 @@ export function uiSidebar(context) { .classed('inspector-hidden', false) .classed('inspector-hover', true); - if (inspector.entityID() !== what || inspector.state() !== 'hover') { + if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') { inspector .state('hover') - .entityID(what); + .entityID(datum.id); inspectorWrap .call(inspector); From 7241e073445458e73b184687cab04a46c3396cfc Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 00:12:21 -0400 Subject: [PATCH 152/217] Return shallow clones of features, because the hashes may change If we return the original feature, and then change the hash later as the feature merges with another, d3 won't exit/enter because it is joining on the new hash, not the originally hash. --- modules/services/vector_tile.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/services/vector_tile.js b/modules/services/vector_tile.js index 1239dd06b..d34a5181a 100644 --- a/modules/services/vector_tile.js +++ b/modules/services/vector_tile.js @@ -1,3 +1,4 @@ +import _clone from 'lodash-es/clone'; import _find from 'lodash-es/find'; import _isEqual from 'lodash-es/isEqual'; import _forEach from 'lodash-es/forEach'; @@ -172,7 +173,10 @@ export default { var hash = feature.__featurehash__; if (seen[hash]) continue; seen[hash] = true; - results.push(feature); + + // return a shallow clone, because the hash may change + // later if this feature gets merged with another + results.push(_clone(feature)); } } From 0a82ab125e24166dd7470894ac58c813aab5afc8 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 10:10:04 -0400 Subject: [PATCH 153/217] Add uiDataEditor for inspecting custom map data --- css/80_app.css | 57 ++++++++++++++++++++++++++ modules/behavior/hover.js | 6 +-- modules/ui/data_editor.js | 79 ++++++++++++++++++++++++++++++++++++ modules/ui/data_header.js | 47 +++++++++++++++++++++ modules/ui/index.js | 2 + modules/ui/raw_tag_editor.js | 59 +++++++++++++-------------- modules/ui/sidebar.js | 31 ++++++++++---- 7 files changed, 237 insertions(+), 44 deletions(-) create mode 100644 modules/ui/data_editor.js create mode 100644 modules/ui/data_header.js diff --git a/css/80_app.css b/css/80_app.css index 0894a06fd..958b0e24d 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -717,6 +717,7 @@ button.add-note svg.icon { } .field-help-title button.close, +.sidebar-component .header button.data-editor-close, .sidebar-component .header button.note-editor-close, .entity-editor-pane .header button.preset-close, .preset-list-pane .header button.preset-choose { @@ -725,6 +726,7 @@ button.add-note svg.icon { top: 0; } [dir='rtl'] .field-help-title button.close, +[dir='rtl'] .sidebar-component .header button.data-editor-close, [dir='rtl'] .sidebar-component .header button.note-editor-close, [dir='rtl'] .entity-editor-pane .header button.preset-close, [dir='rtl'] .preset-list-pane .header button.preset-choose { @@ -1392,6 +1394,10 @@ a.hide-toggle { .inspector-hover .tag-row .form-field.input-wrap-position { width: 50%; } +.inspector-hover .tag-row .key-wrap, +.inspector-hover .tag-row .input-wrap-position { + height: 31px; +} .inspector-hover .tag-row:first-child input.value { border-top-right-radius: 4px; @@ -2541,6 +2547,57 @@ input.key-trap { } +/* Map Data Inspector */ +.data-header { + background-color: #f6f6f6; + border-radius: 5px; + border: 1px solid #ccc; + display: flex; + flex-flow: row nowrap; + align-items: center; +} + +.data-header-icon { + background-color: #fff; + padding: 10px; + flex: 0 0 62px; + position: relative; + width: 60px; + height: 60px; + border-right: 1px solid #ccc; + border-radius: 5px 0 0 5px; +} +[dir='rtl'] .data-header-icon { + border-right: unset; + border-left: 1px solid #ccc; + border-radius: 0 5px 5px 0; +} + +.data-header-icon .icon-wrap { + position: absolute; + top: 0px; +} + +.data-header-label { + background-color: #f6f6f6; + padding: 0 15px; + flex: 1 1 100%; + font-size: 14px; + font-weight: bold; + border-radius: 0 5px 5px 0; +} +[dir='rtl'] .data-header-label { + border-radius: 5px 0 0 5px; +} + +/* tag editor - no buttons */ +.data-editor.raw-tag-editor button { + display: none; +} +.data-editor.raw-tag-editor .tag-row .input-wrap-position { + width: 50%; +} + /* Fullscreen button */ div.full-screen { diff --git a/modules/behavior/hover.js b/modules/behavior/hover.js index 9b2000e62..99d12a9dc 100644 --- a/modules/behavior/hover.js +++ b/modules/behavior/hover.js @@ -6,10 +6,7 @@ import { } from 'd3-selection'; import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; -import { - osmEntity, - osmNote -} from '../osm'; +import { osmEntity, osmNote } from '../osm'; import { utilRebind } from '../util/rebind'; @@ -154,7 +151,6 @@ export function behaviorHover(context) { dispatch.call('hover', this, null); } } - }; diff --git a/modules/ui/data_editor.js b/modules/ui/data_editor.js new file mode 100644 index 000000000..9adf0a528 --- /dev/null +++ b/modules/ui/data_editor.js @@ -0,0 +1,79 @@ +import { t } from '../util/locale'; +import { modeBrowse } from '../modes'; +import { svgIcon } from '../svg'; + +import { + uiDataHeader, + uiRawTagEditor +} from './index'; + + +export function uiDataEditor(context) { + var dataHeader = uiDataHeader(); + var rawTagEditor = uiRawTagEditor(context); + var _datum; + + + function dataEditor(selection) { + var header = selection.selectAll('.header') + .data([0]); + + var headerEnter = header.enter() + .append('div') + .attr('class', 'header fillL'); + + headerEnter + .append('button') + .attr('class', 'fr data-editor-close') + .on('click', function() { + context.enter(modeBrowse(context)); + }) + .call(svgIcon('#iD-icon-close')); + + headerEnter + .append('h3') + .text(t('map_data.title')); + + + var body = selection.selectAll('.body') + .data([0]); + + body = body.enter() + .append('div') + .attr('class', 'body') + .merge(body); + + var editor = body.selectAll('.data-editor') + .data([0]); + + editor = editor.enter() + .append('div') + .attr('class', 'modal-section data-editor') + .merge(editor) + .call(dataHeader.datum(_datum)); + + var rte = body.selectAll('.raw-tag-editor') + .data([0]); + + rte.enter() + .append('div') + .attr('class', 'inspector-border raw-tag-editor inspector-inner data-editor') + .merge(rte) + .call(rawTagEditor + .expanded(true) + .readOnlyTags([/./]) + .tags((_datum && _datum.properties) || {}) + .state('hover') + ); + } + + + dataEditor.datum = function(val) { + if (!arguments.length) return _datum; + _datum = val; + return this; + }; + + + return dataEditor; +} diff --git a/modules/ui/data_header.js b/modules/ui/data_header.js new file mode 100644 index 000000000..fec0026af --- /dev/null +++ b/modules/ui/data_header.js @@ -0,0 +1,47 @@ +import { t } from '../util/locale'; +import { svgIcon } from '../svg'; + + +export function uiDataHeader() { + var _datum; + + + function dataHeader(selection) { + var header = selection.selectAll('.data-header') + .data( + (_datum ? [_datum] : []), + function(d) { return d.__featurehash__; } + ); + + header.exit() + .remove(); + + var headerEnter = header.enter() + .append('div') + .attr('class', 'data-header'); + + var iconEnter = headerEnter + .append('div') + .attr('class', 'data-header-icon'); + + iconEnter + .append('div') + .attr('class', 'preset-icon-28') + .call(svgIcon('#iD-icon-data', 'note-fill')); + + headerEnter + .append('div') + .attr('class', 'data-header-label') + .text(t('map_data.layers.custom.title')); + } + + + dataHeader.datum = function(val) { + if (!arguments.length) return _datum; + _datum = val; + return this; + }; + + + return dataHeader; +} diff --git a/modules/ui/index.js b/modules/ui/index.js index 35d9a8517..3c2641519 100644 --- a/modules/ui/index.js +++ b/modules/ui/index.js @@ -13,6 +13,8 @@ export { uiConfirm } from './confirm'; export { uiConflicts } from './conflicts'; export { uiContributors } from './contributors'; export { uiCurtain } from './curtain'; +export { uiDataEditor } from './data_editor'; +export { uiDataHeader } from './data_header'; export { uiDisclosure } from './disclosure'; export { uiEditMenu } from './edit_menu'; export { uiEntityEditor } from './entity_editor'; diff --git a/modules/ui/raw_tag_editor.js b/modules/ui/raw_tag_editor.js index 85a7f786e..d5a4fb23a 100644 --- a/modules/ui/raw_tag_editor.js +++ b/modules/ui/raw_tag_editor.js @@ -24,17 +24,17 @@ import { export function uiRawTagEditor(context) { - var taginfo = services.taginfo, - dispatch = d3_dispatch('change'), - _readOnlyTags = [], - _showBlank = false, - _updatePreference = true, - _expanded = false, - _newRow, - _state, - _preset, - _tags, - _entityID; + var taginfo = services.taginfo; + var dispatch = d3_dispatch('change'); + var _readOnlyTags = []; + var _showBlank = false; + var _updatePreference = true; + var _expanded = false; + var _newRow; + var _state; + var _preset; + var _tags; + var _entityID; function rawTagEditor(selection) { @@ -148,16 +148,16 @@ export function uiRawTagEditor(context) { items .each(function(tag) { - var row = d3_select(this), - key = row.select('input.key'), // propagate bound data to child - value = row.select('input.value'); // propagate bound data to child + var row = d3_select(this); + var key = row.select('input.key'); // propagate bound data to child + var value = row.select('input.value'); // propagate bound data to child if (_entityID && taginfo) { bindTypeahead(key, value); } - var isRelation = (_entityID && context.entity(_entityID).type === 'relation'), - reference; + var isRelation = (_entityID && context.entity(_entityID).type === 'relation'); + var reference; if (isRelation && tag.key === 'type') { reference = uiTagReference({ rtype: tag.value }, context); @@ -239,8 +239,8 @@ export function uiRawTagEditor(context) { function sort(value, data) { - var sameletter = [], - other = []; + var sameletter = []; + var other = []; for (var i = 0; i < data.length; i++) { if (data[i].value.substring(0, value.length) === value) { sameletter.push(data[i]); @@ -265,10 +265,9 @@ export function uiRawTagEditor(context) { function keyChange(d) { - var kOld = d.key, - kNew = this.value.trim(), - tag = {}; - + var kOld = d.key; + var kNew = this.value.trim(); + var tag = {}; if (isReadOnly({ key: kNew })) { this.value = kOld; @@ -276,17 +275,17 @@ export function uiRawTagEditor(context) { } if (kNew && kNew !== kOld) { - var match = kNew.match(/^(.*?)(?:_(\d+))?$/), - base = match[1], - suffix = +(match[2] || 1); + var match = kNew.match(/^(.*?)(?:_(\d+))?$/); + var base = match[1]; + var suffix = +(match[2] || 1); while (_tags[kNew]) { // rename key if already in use kNew = base + '_' + suffix++; } if (_includes(kNew, '=')) { - var splitStr = kNew.split('=').map(function(str) { return str.trim(); }), - key = splitStr[0], - value = splitStr[1]; + var splitStr = kNew.split('=').map(function(str) { return str.trim(); }); + var key = splitStr[0]; + var value = splitStr[1]; kNew = key; d.value = value; @@ -295,9 +294,9 @@ export function uiRawTagEditor(context) { tag[kOld] = undefined; tag[kNew] = d.value; - d.key = kNew; // Maintain DOM identity through the subsequent update. + d.key = kNew; // Maintain DOM identity through the subsequent update. - if (_newRow === kOld) { // see if this row is still a new row + if (_newRow === kOld) { // see if this row is still a new row _newRow = ((d.value === '' || kNew === '') ? kNew : undefined); } diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index cb972eb10..33b3df5c0 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -2,16 +2,25 @@ import _throttle from 'lodash-es/throttle'; import { selectAll as d3_selectAll } from 'd3-selection'; -import { osmEntity, osmNote } from '../osm'; -import { uiFeatureList } from './feature_list'; -import { uiInspector } from './inspector'; -import { uiNoteEditor } from './note_editor'; +import { + osmEntity, + osmNote +} from '../osm'; + +import { + uiDataEditor, + uiFeatureList, + uiInspector, + uiNoteEditor +} from './index'; export function uiSidebar(context) { var inspector = uiInspector(context); + var dataEditor = uiDataEditor(context); var noteEditor = uiNoteEditor(context); var _current; + var _wasData = false; var _wasNote = false; @@ -28,8 +37,12 @@ export function uiSidebar(context) { function hover(datum) { if (datum && datum.__featurehash__) { // hovering on data - console.log ('hover on data ' + datum.__featurehash__); - // show something + _wasData = true; + sidebar + .show(dataEditor.datum(datum)); + + selection.selectAll('.sidebar-component') + .classed('inspector-hover', true); } else if (datum instanceof osmNote) { if (context.mode().id === 'drag-note') return; @@ -66,10 +79,10 @@ export function uiSidebar(context) { inspector .state('hide'); - } else if (_wasNote) { + } else if (_wasData || _wasNote) { _wasNote = false; - d3_selectAll('.note') - .classed('hover', false); + _wasData = false; + d3_selectAll('.note').classed('hover', false); sidebar.hide(); } } From cc938698e8bf13fdb5fa99255a59a26d327d4f5a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 11:14:04 -0400 Subject: [PATCH 154/217] Add ability to select custom data --- css/65_data.css | 1 + css/80_app.css | 5 +- modules/behavior/select.js | 7 ++- modules/modes/browse.js | 8 +-- modules/modes/index.js | 1 + modules/modes/rotate.js | 8 +-- modules/modes/select.js | 9 +--- modules/modes/select_data.js | 97 ++++++++++++++++++++++++++++++++++++ modules/modes/select_note.js | 75 +++++++++++++--------------- modules/renderer/map.js | 2 +- modules/svg/data.js | 12 +++-- modules/ui/data_editor.js | 2 +- 12 files changed, 158 insertions(+), 69 deletions(-) create mode 100644 modules/modes/select_data.js diff --git a/css/65_data.css b/css/65_data.css index 1cf8de123..24af906c4 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -8,6 +8,7 @@ } .mode-browse .layer-notes .note .note-fill, .mode-select .layer-notes .note .note-fill, +.mode-select-data .layer-notes .note .note-fill, .mode-select-note .layer-notes .note .note-fill { pointer-events: visible; cursor: pointer; /* Opera */ diff --git a/css/80_app.css b/css/80_app.css index 958b0e24d..0f51f871b 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2594,6 +2594,7 @@ input.key-trap { .data-editor.raw-tag-editor button { display: none; } +.data-editor.raw-tag-editor .tag-row .key-wrap, .data-editor.raw-tag-editor .tag-row .input-wrap-position { width: 50%; } @@ -4060,7 +4061,7 @@ svg.mouseclick use.right { /* Settings Modals ------------------------------------------------------- */ .settings-modal textarea { - height: 60px; + height: 70px; } .settings-modal .buttons .button.col3 { float: none; /* undo float left */ @@ -4071,7 +4072,7 @@ svg.mouseclick use.right { } -.settings-custom-data .instructions-file { +.settings-custom-data .instructions-url { margin-bottom: 10px; } .settings-custom-data .field-file, diff --git a/modules/behavior/select.js b/modules/behavior/select.js index 9e0b3fee9..1dd051e65 100644 --- a/modules/behavior/select.js +++ b/modules/behavior/select.js @@ -11,6 +11,7 @@ import { geoVecLength } from '../geo'; import { modeBrowse, modeSelect, + modeSelectData, modeSelectNote } from '../modes'; @@ -157,13 +158,17 @@ export function behaviorSelect(context) { } } + } else if (datum && datum.__featurehash__ && !isMultiselect) { // clicked Data.. + context + .selectedNoteID(null) + .enter(modeSelectData(context, datum)); + } else if (datum instanceof osmNote && !isMultiselect) { // clicked a Note.. context .selectedNoteID(datum.id) .enter(modeSelectNote(context, datum.id)); } else { // clicked nothing.. - context.selectedNoteID(null); if (!isMultiselect && mode.id !== 'browse') { context.enter(modeBrowse(context)); diff --git a/modules/modes/browse.js b/modules/modes/browse.js index 72484df62..acd9cc6f3 100644 --- a/modules/modes/browse.js +++ b/modules/modes/browse.js @@ -30,9 +30,7 @@ export function modeBrowse(context) { mode.enter = function() { - behaviors.forEach(function(behavior) { - context.install(behavior); - }); + behaviors.forEach(context.install); // Get focus on the body. if (document.activeElement && document.activeElement.blur) { @@ -49,9 +47,7 @@ export function modeBrowse(context) { mode.exit = function() { context.ui().sidebar.hover.cancel(); - behaviors.forEach(function(behavior) { - context.uninstall(behavior); - }); + behaviors.forEach(context.uninstall); if (sidebar) { context.ui().sidebar.hide(); diff --git a/modules/modes/index.js b/modules/modes/index.js index 83838c4e1..af440c4c2 100644 --- a/modules/modes/index.js +++ b/modules/modes/index.js @@ -11,4 +11,5 @@ export { modeMove } from './move'; export { modeRotate } from './rotate'; export { modeSave } from './save'; export { modeSelect } from './select'; +export { modeSelectData } from './select_data'; export { modeSelectNote } from './select_note'; diff --git a/modules/modes/rotate.js b/modules/modes/rotate.js index 4addaed88..12cac0fdd 100644 --- a/modules/modes/rotate.js +++ b/modules/modes/rotate.js @@ -120,9 +120,7 @@ export function modeRotate(context, entityIDs) { mode.enter = function() { - behaviors.forEach(function(behavior) { - context.install(behavior); - }); + behaviors.forEach(context.install); context.surface() .on('mousemove.rotate', doRotate) @@ -141,9 +139,7 @@ export function modeRotate(context, entityIDs) { mode.exit = function() { - behaviors.forEach(function(behavior) { - context.uninstall(behavior); - }); + behaviors.forEach(context.uninstall); context.surface() .on('mousemove.rotate', null) diff --git a/modules/modes/select.js b/modules/modes/select.js index 25e12400f..1d19eccc3 100644 --- a/modules/modes/select.js +++ b/modules/modes/select.js @@ -451,9 +451,7 @@ export function modeSelect(context, selectedIDs) { } }); - behaviors.forEach(function(behavior) { - context.install(behavior); - }); + behaviors.forEach(context.install); keybinding .on(['[', 'pgup'], previousVertex) @@ -522,10 +520,7 @@ export function modeSelect(context, selectedIDs) { if (timeout) window.clearTimeout(timeout); if (inspector) wrap.call(inspector.close); - behaviors.forEach(function(behavior) { - context.uninstall(behavior); - }); - + behaviors.forEach(context.uninstall); keybinding.off(); closeMenu(); editMenu = undefined; diff --git a/modules/modes/select_data.js b/modules/modes/select_data.js new file mode 100644 index 000000000..1e433660d --- /dev/null +++ b/modules/modes/select_data.js @@ -0,0 +1,97 @@ +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + +import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; + +import { + behaviorBreathe, + behaviorHover, + behaviorLasso, + behaviorSelect +} from '../behavior'; + +import { + modeDragNode, + modeDragNote +} from '../modes'; + +import { modeBrowse } from './browse'; +import { uiDataEditor } from '../ui'; + + +export function modeSelectData(context, selectedDatum) { + var mode = { + id: 'select-data', + button: 'browse' + }; + + var keybinding = d3_keybinding('select-data'); + var dataEditor = uiDataEditor(context); + + var behaviors = [ + behaviorBreathe(context), + behaviorHover(context), + behaviorSelect(context), + behaviorLasso(context), + modeDragNode(context).behavior, + modeDragNote(context).behavior + ]; + + + // class the data as selected, or return to browse mode if the data is gone + function selectData(drawn) { + var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__); + + if (selection.empty()) { + // Return to browse mode if selected DOM elements have + // disappeared because the user moved them out of view.. + var source = d3_event && d3_event.type === 'zoom' && d3_event.sourceEvent; + if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) { + context.enter(modeBrowse(context)); + } + } else { + selection.classed('selected', true); + } + } + + + function esc() { + context.enter(modeBrowse(context)); + } + + + mode.enter = function() { + behaviors.forEach(context.install); + keybinding.on('⎋', esc, true); + d3_select(document).call(keybinding); + + selectData(); + + context.ui().sidebar + .show(dataEditor.datum(selectedDatum)); + + context.map() + .on('drawn.select-data', selectData); + }; + + + mode.exit = function() { + behaviors.forEach(context.uninstall); + keybinding.off(); + + context.surface() + .selectAll('.layer-mapdata .selected') + .classed('selected hover', false); + + context.map() + .on('drawn.select-data', null); + + context.ui().sidebar + .hide(); + }; + + + return mode; +} diff --git a/modules/modes/select_note.js b/modules/modes/select_note.js index c2eb8aba0..36246a207 100644 --- a/modules/modes/select_note.js +++ b/modules/modes/select_note.js @@ -60,52 +60,48 @@ export function modeSelectNote(context, selectedNoteID) { return note; } + + // class the note as selected, or return to browse mode if the note is gone + function selectNote(drawn) { + if (!checkSelectedID()) return; + + var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID); + + if (selection.empty()) { + // Return to browse mode if selected DOM elements have + // disappeared because the user moved them out of view.. + var source = d3_event && d3_event.type === 'zoom' && d3_event.sourceEvent; + if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) { + context.enter(modeBrowse(context)); + } + + } else { + selection + .classed('selected', true); + context.selectedNoteID(selectedNoteID); + } + } + + + function esc() { + context.enter(modeBrowse(context)); + } + + mode.newFeature = function(_) { if (!arguments.length) return newFeature; newFeature = _; return mode; }; + mode.enter = function() { - - // class the note as selected, or return to browse mode if the note is gone - function selectNote(drawn) { - if (!checkSelectedID()) return; - - var selection = context.surface() - .selectAll('.note-' + selectedNoteID); - - if (selection.empty()) { - // Return to browse mode if selected DOM elements have - // disappeared because the user moved them out of view.. - var source = d3_event && d3_event.type === 'zoom' && d3_event.sourceEvent; - if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) { - context.enter(modeBrowse(context)); - } - - } else { - selection - .classed('selected', true); - context.selectedNoteID(selectedNoteID); - } - } - - function esc() { - context.enter(modeBrowse(context)); - } - var note = checkSelectedID(); if (!note) return; - behaviors.forEach(function(behavior) { - context.install(behavior); - }); - - keybinding - .on('⎋', esc, true); - - d3_select(document) - .call(keybinding); + behaviors.forEach(context.install); + keybinding.on('⎋', esc, true); + d3_select(document).call(keybinding); selectNote(); @@ -118,14 +114,11 @@ export function modeSelectNote(context, selectedNoteID) { mode.exit = function() { - behaviors.forEach(function(behavior) { - context.uninstall(behavior); - }); - + behaviors.forEach(context.uninstall); keybinding.off(); context.surface() - .selectAll('.note.selected') + .selectAll('.layer-notes .selected') .classed('selected hover', false); context.map() diff --git a/modules/renderer/map.js b/modules/renderer/map.js index 727ae3323..2878d8a48 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -348,7 +348,7 @@ export function rendererMap(context) { surface.selectAll('.layer-osm *').remove(); var mode = context.mode(); - if (mode && mode.id !== 'save' && mode.id !== 'select-note') { + if (mode && mode.id !== 'save' && mode.id !== 'select-note' && mode.id !== 'select-data') { context.enter(modeBrowse(context)); } diff --git a/modules/svg/data.js b/modules/svg/data.js index b902a7648..8be1a551c 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -179,6 +179,7 @@ export function svgData(projection, context, dispatch) { function drawData(selection) { var vtService = getService(); var getPath = svgPath(projection).geojson; + var getAreaPath = svgPath(projection, null, true).geojson; var hasData = drawData.hasData(); layer = selection.selectAll('.layer-mapdata') @@ -226,7 +227,7 @@ export function svgData(projection, context, dispatch) { clipPaths.merge(clipPathsEnter) .selectAll('path') - .attr('d', getPath); + .attr('d', getAreaPath); // Draw fill, shadow, stroke layers @@ -242,9 +243,9 @@ export function svgData(projection, context, dispatch) { // Draw paths var pathData = { + fill: polygonData, shadow: geoData, - stroke: geoData, - fill: polygonData + stroke: geoData }; var paths = datagroups @@ -267,7 +268,10 @@ export function svgData(projection, context, dispatch) { return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null; }) .merge(paths) - .attr('d', getPath); + .attr('d', function(d) { + var datagroup = this.parentNode.__data__; + return datagroup === 'fill' ? getAreaPath(d) : getPath(d); + }); // Draw labels diff --git a/modules/ui/data_editor.js b/modules/ui/data_editor.js index 9adf0a528..593517de6 100644 --- a/modules/ui/data_editor.js +++ b/modules/ui/data_editor.js @@ -46,7 +46,7 @@ export function uiDataEditor(context) { var editor = body.selectAll('.data-editor') .data([0]); - editor = editor.enter() + editor.enter() .append('div') .attr('class', 'modal-section data-editor') .merge(editor) From 5368aa1972edcbc7a76ca876cc7535ec68a82c4d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 11:30:06 -0400 Subject: [PATCH 155/217] Update data layer tests to check for both shadow and stroke paths --- test/spec/svg/data.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/test/spec/svg/data.js b/test/spec/svg/data.js index 323420756..426854409 100644 --- a/test/spec/svg/data.js +++ b/test/spec/svg/data.js @@ -91,7 +91,7 @@ describe('iD.svgData', function () { it('creates layer-mapdata', function () { - var render = iD.svgData(projection, context, dispatch); + var render = iD.svgData(projection, context, dispatch).geojson(gj); surface.call(render); var layers = surface.selectAll('g.layer-mapdata').nodes(); @@ -102,7 +102,11 @@ describe('iD.svgData', function () { var render = iD.svgData(projection, context, dispatch).geojson(gj); surface.call(render); - var path = surface.selectAll('path'); + var path; + path = surface.selectAll('path.shadow'); + expect(path.nodes().length).to.eql(1); + expect(path.attr('d')).to.match(/^M.*z$/); + path = surface.selectAll('path.stroke'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); }); @@ -118,7 +122,11 @@ describe('iD.svgData', function () { window.setTimeout(function() { expect(spy).to.have.been.calledOnce; surface.call(render); - var path = surface.selectAll('path'); + var path; + path = surface.selectAll('path.shadow'); + expect(path.nodes().length).to.eql(1); + expect(path.attr('d')).to.match(/^M.*z$/); + path = surface.selectAll('path.stroke'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); done(); @@ -135,7 +143,11 @@ describe('iD.svgData', function () { window.setTimeout(function() { expect(spy).to.have.been.calledOnce; surface.call(render); - var path = surface.selectAll('path'); + var path; + path = surface.selectAll('path.shadow'); + expect(path.nodes().length).to.eql(1); + expect(path.attr('d')).to.match(/^M.*z$/); + path = surface.selectAll('path.stroke'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); done(); @@ -152,7 +164,11 @@ describe('iD.svgData', function () { window.setTimeout(function() { expect(spy).to.have.been.calledOnce; surface.call(render); - var path = surface.selectAll('path'); + var path; + path = surface.selectAll('path.shadow'); + expect(path.nodes().length).to.eql(1); + expect(path.attr('d')).to.match(/^M.*z$/); + path = surface.selectAll('path.stroke'); expect(path.nodes().length).to.eql(1); expect(path.attr('d')).to.match(/^M.*z$/); done(); From c28c3ba57ba84dc78b5ce31265c9d67105275b77 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 13:41:43 -0400 Subject: [PATCH 156/217] Test vector tile templates against OSM's imagery blacklist --- modules/renderer/background.js | 5 +---- modules/svg/data.js | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/modules/renderer/background.js b/modules/renderer/background.js index 2754c1001..4b71ddfe1 100644 --- a/modules/renderer/background.js +++ b/modules/renderer/background.js @@ -172,10 +172,7 @@ export function rendererBackground(context) { var data = context.layers().layer('data'); if (data && data.enabled() && data.hasData()) { - // Include a string like '.gpx data file' or '.geojson data file' - var match = data.getSrc().match(/(kml|gpx|pbf|mvt|(?:geo)?json)$/i); - var extension = match ? ('.' + match[0].toLowerCase() + ' ') : ''; - imageryUsed.push(extension + 'data file'); + imageryUsed.push(data.getSrc()); } var streetside = context.layers().layer('streetside'); diff --git a/modules/svg/data.js b/modules/svg/data.js index 8be1a551c..0193c90f0 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -350,7 +350,7 @@ export function svgData(projection, context, dispatch) { if (!_isEmpty(gj)) { _geojson = ensureIDs(gj); - _src = src || 'unknown.geojson'; + _src = extension + ' data file'; this.fitZoom(); } @@ -387,13 +387,39 @@ export function svgData(projection, context, dispatch) { }; - drawData.template = function(val) { + drawData.template = function(val, src) { if (!arguments.length) return _template; + // test source against OSM imagery blacklists.. + var osm = context.connection(); + if (osm) { + var blacklists = osm.imageryBlacklists(); + var fail = false; + var tested = 0; + var regex; + + for (var i = 0; i < blacklists.length; i++) { + try { + regex = new RegExp(blacklists[i]); + fail = regex.test(val); + tested++; + if (fail) break; + } catch (e) { + /* noop */ + } + } + + // ensure at least one test was run. + if (!tested) { + regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'); + fail = regex.test(val); + } + } + _template = val; _fileList = null; _geojson = null; - _src = 'vector tiles'; + _src = src || 'vectortile:' + val; dispatch.call('change'); return this; From 6f969b3fb4572136c02355567d4e8ebbd2a789e3 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 13:59:26 -0400 Subject: [PATCH 157/217] Strip off querystring and hash from vector tile source string These usually contain access tokens and other information that really doesn't add anything, and needn't appear in the imagery_used changeset tag --- modules/svg/data.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/svg/data.js b/modules/svg/data.js index 0193c90f0..b4ee1a7ac 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -328,7 +328,7 @@ export function svgData(projection, context, dispatch) { } - drawData.setFile = function(extension, data, src) { + drawData.setFile = function(extension, data) { _template = null; _fileList = null; _geojson = null; @@ -419,7 +419,10 @@ export function svgData(projection, context, dispatch) { _template = val; _fileList = null; _geojson = null; - _src = src || 'vectortile:' + val; + + // strip off the querystring/hash from the template, + // it often includes the access token + _src = src || ('vectortile:' + val.split(/[?#]/)[0]); dispatch.call('change'); return this; @@ -456,9 +459,9 @@ export function svgData(projection, context, dispatch) { var f = fileList[0]; var extension = getExtension(f.name); var reader = new FileReader(); - reader.onload = (function(file) { + reader.onload = (function() { return function(e) { - drawData.setFile(extension, e.target.result, file.name); + drawData.setFile(extension, e.target.result); }; })(f); @@ -480,7 +483,7 @@ export function svgData(projection, context, dispatch) { _template = null; d3_text(url, function(err, data) { if (err) return; - drawData.setFile(extension, data, url); + drawData.setFile(extension, data); }); } else { drawData.template(url); From 243743e844aa2f539682383f027ce133fc915523 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 15:11:13 -0400 Subject: [PATCH 158/217] Add sample vector tile layers for Detroit Mapping Challenge --- modules/ui/map_data.js | 100 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 6 deletions(-) diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index d76cc1c4d..72f7f1078 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -147,10 +147,8 @@ export function uiMapData(context) { // Update - li = li - .merge(liEnter); - li + .merge(liEnter) .classed('active', layerEnabled) .selectAll('input') .property('checked', layerEnabled); @@ -201,16 +199,105 @@ export function uiMapData(context) { // Update - li = li - .merge(liEnter); - li + .merge(liEnter) .classed('active', function (d) { return d.layer.enabled(); }) .selectAll('input') .property('checked', function (d) { return d.layer.enabled(); }); } + // Beta feature - sample vector layers to support Detroit Mapping Challenge + // https://github.com/osmus/detroit-mapping-challenge + function drawVectorItems(selection) { + var vtData = [ + { + name: 'Detroit Neighborhoods/Parks', + src: 'neighborhoods-parks', + tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.', + template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA' + }, { + name: 'Detroit Composite POIs', + src: 'composite-poi', + tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.', + template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA' + }, { + name: 'Detroit All-The-Places POIs', + src: 'alltheplaces-poi', + tooltip: 'Public domain business location data created by web scrapers.', + template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA' + } + ]; + + var dataLayer = layers.layer('data'); + + var header = selection.selectAll('.layer-list-vectortile-header') + .data([0]); + + header.enter() + .append('h4') + .attr('class', 'layer-list-vectortile-header') + .text('Vector Tiles (beta)'); + + var ul = selection + .selectAll('.layer-list-vectortile') + .data([0]); + + ul = ul.enter() + .append('ul') + .attr('class', 'layer-list layer-list-vectortile') + .merge(ul); + + var li = ul.selectAll('.list-item') + .data(vtData); + + li.exit() + .remove(); + + var liEnter = li.enter() + .append('li') + .attr('class', function(d) { return 'list-item list-item-' + d.src; }); + + var labelEnter = liEnter + .append('label') + .each(function(d) { + d3_select(this).call( + tooltip().title(d.tooltip).placement('bottom') + ); + }); + + labelEnter + .append('input') + .attr('type', 'radio') + .attr('name', 'vectortile') + .on('change', selectVTLayer); + + labelEnter + .append('span') + .text(function(d) { return d.name; }); + + // Update + li + .merge(liEnter) + .classed('active', isVTLayerSelected) + .selectAll('input') + .property('checked', isVTLayerSelected); + + + function isVTLayerSelected(d) { + return dataLayer && dataLayer.template() === d.template; + } + + function selectVTLayer(d) { + context.storage('settings-custom-data-url', d.template); + if (dataLayer) { + dataLayer.template(d.template, d.src); + dataLayer.enabled(true); + } + } + } + + function drawCustomDataItems(selection) { var dataLayer = layers.layer('data'); var hasData = dataLayer && dataLayer.hasData(); @@ -394,6 +481,7 @@ export function uiMapData(context) { _dataLayerContainer .call(drawOsmItems) .call(drawPhotoItems) + .call(drawVectorItems) // beta - detroit mapping challenge .call(drawCustomDataItems); _fillList From df10e09037699cec39658fc3360d89545ad63784 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 15:12:23 -0400 Subject: [PATCH 159/217] Use tooltip 'top' for consistency with other things on this list --- modules/ui/map_data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index 72f7f1078..e886bf231 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -262,7 +262,7 @@ export function uiMapData(context) { .append('label') .each(function(d) { d3_select(this).call( - tooltip().title(d.tooltip).placement('bottom') + tooltip().title(d.tooltip).placement('top') ); }); From 12e0b399a1550db3371a627e1db41195744f9e5b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 21:03:11 -0400 Subject: [PATCH 160/217] Only show Detroit vector tiles when map is around Detroit Also adds an "About" link to the github page. --- css/80_app.css | 385 +++++++++++++++++++---------------------- modules/ui/map_data.js | 51 ++++-- 2 files changed, 217 insertions(+), 219 deletions(-) diff --git a/css/80_app.css b/css/80_app.css index 0f51f871b..8fb0f17b0 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -1,6 +1,5 @@ /* Basics ------------------------------------------------------- */ - /* Opera misbehaves when the window is resized vertically unless 100% width + height are applied to both html and body. https://gist.github.com/jfirebaugh/bd225bcfdd3a633850c4 @@ -202,7 +201,6 @@ a:hover { /* Forms ------------------------------------------------------- */ - textarea { resize: vertical; font:normal 12px/20px "-apple-system", BlinkMacSystemFont, @@ -288,7 +286,6 @@ table.tags, table.tags td, table.tags th { /* Grid ------------------------------------------------------- */ - .col0 { float: left; width: 04.1666%; } .col1 { float: left; width: 08.3333%; } .col2 { float: left; width: 16.6666%; } @@ -305,7 +302,6 @@ table.tags, table.tags td, table.tags th { /* UI Lists ------------------------------------------------------- */ - ul li { list-style: none;} .toggle-list > label { @@ -348,22 +344,18 @@ ul li { list-style: none;} background: #fff; color: #333; } - .fillL2 { background: #f6f6f6; color: #333; } - .fillL3 { background: #ececec; color: #333; } - .fillD { background: rgba(0,0,0,.5); color: #fff; } - .fillD2 { background: rgba(0,0,0,.75); color: #fff; @@ -396,31 +388,9 @@ li.hide { background-size: 5px 5px; } -.panewrap { - position: absolute; - width: 200%; - height: 100%; - right: -100%; -} - - -.pane { - position: absolute; - width: 50%; - top: 0; - bottom: 30px; -} - -.pane:first-child { - left: 0; -} - -.pane:last-child { - right: 0; -} - -/* Buttons */ +/* Buttons +------------------------------------------------------- */ button { text-align: center; line-height: 20px; @@ -611,8 +581,8 @@ button.add-note svg.icon { } -/* Icons */ - +/* Icons +------------------------------------------------------- */ .icon { vertical-align: top; width: 20px; @@ -664,9 +634,8 @@ button.add-note svg.icon { } -/* ToolBar / Persistent UI Elements +/* Toolbar / Persistent UI Elements ------------------------------------------------------- */ - #bar { position: fixed; padding: 10px 0; @@ -687,7 +656,6 @@ button.add-note svg.icon { /* Header for modals / panes ------------------------------------------------------- */ - .header { border-bottom: 1px solid #ccc; height: 60px; @@ -775,7 +743,6 @@ button.add-note svg.icon { justify-content: space-between; list-style: none; display: flex; - } .footer > a { @@ -791,9 +758,8 @@ button.add-note svg.icon { } -/* Hide-Toggle +/* Hide/Toggle collapsable sections (aka Disclosure) ------------------------------------------------------- */ - .hide-toggle .icon.pre-text { vertical-align: text-top; width: 16px; @@ -814,9 +780,8 @@ a.hide-toggle { } -/* Inspector +/* Sidebar / Inspector ------------------------------------------------------- */ - #sidebar { position: relative; float: left; @@ -838,6 +803,28 @@ a.hide-toggle { right: 0; } +.panewrap { + position: absolute; + width: 200%; + height: 100%; + right: -100%; +} + +.pane { + position: absolute; + width: 50%; + top: 0; + bottom: 30px; +} + +.pane:first-child { + left: 0; +} + +.pane:last-child { + right: 0; +} + .inspector-wrap { width: 100%; height: 100%; @@ -859,15 +846,12 @@ a.hide-toggle { .feature-list-pane .inspector-body { top: 120px; } - .preset-list-pane .inspector-body { top: 120px; } - .entity-editor-pane .inspector-body { top: 60px; } - .selection-list-pane .inspector-body { top: 60px; } @@ -903,12 +887,12 @@ a.hide-toggle { font-weight: bold; } -/* Feature list */ +/* Feature List / Search Results +------------------------------------------------------- */ .feature-list { width: 100%; } - .no-results-item, .geocode-item, .feature-list-item { @@ -977,11 +961,8 @@ a.hide-toggle { } -/* Presets +/* Preset List and Icons ------------------------------------------------------- */ - -/* Preset grid */ - .preset-list { width: 100%; padding: 20px 20px 10px 20px; @@ -1159,7 +1140,6 @@ a.hide-toggle { .preset-list-item button.tag-reference-button:hover { background: #f1f1f1; } - .preset-list-item button.tag-reference-button .icon { opacity: .5; } @@ -1206,27 +1186,23 @@ a.hide-toggle { } -/* Preset Editor */ - +/* Entity/Preset Editor +------------------------------------------------------- */ .preset-editor { overflow: hidden; padding-bottom: 10px; } - .preset-editor a.hide-toggle { margin: 0 20px 5px 20px; } - .preset-editor .form-fields-container { padding: 10px; margin: 0 10px 10px 10px; border-radius: 8px; } - .preset-editor .form-fields-container:empty { display: none; } - .entity-editor-pane .preset-list-item .preset-list-button-wrap { margin-bottom: 0; } @@ -1326,8 +1302,8 @@ a.hide-toggle { border-bottom: 1px solid #ccc } -/* Preset form (hover mode) */ - +/* Inspector (hover styles) +------------------------------------------------------- */ .inspector-hover .checkselect label:last-of-type, .inspector-hover .preset-input-wrap .label, .inspector-hover .form-field-multicombo, @@ -1462,8 +1438,8 @@ a.hide-toggle { overflow: hidden; } -/* adding additional preset fields */ - +/* More Fields dropdown +------------------------------------------------------- */ .more-fields { padding: 0 20px 20px 20px; font-weight: bold; @@ -1499,10 +1475,8 @@ a.hide-toggle { } -/* preset form access */ -/* preset form cycleway */ -/* preset form structure extras */ - +/* Field - Access, Cycleway, Structure +------------------------------------------------------- */ .structure-extras-wrap li, .form-field-cycleway .preset-input-wrap li, .form-field-access .preset-input-wrap li { @@ -1571,8 +1545,8 @@ a.hide-toggle { } -/* preset form multicombo */ - +/* Field - Multicombo +------------------------------------------------------- */ .form-field-multicombo { border: 1px solid #cfcfcf; border-top: 0px; @@ -1582,11 +1556,9 @@ a.hide-toggle { border-radius: 0 0 4px 4px; overflow: hidden; } - .form-field-multicombo:focus { border-bottom: 0px; } - .form-field-multicombo.active { border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; @@ -1631,8 +1603,8 @@ a.hide-toggle { } -/* preset form numbers */ - +/* Field - Numeric +------------------------------------------------------- */ input[type=number] { position: relative; padding-right: 20%; @@ -1685,13 +1657,11 @@ input[type=number] { left: 0; right: 0; bottom: 0; top: 0; margin: auto; } - .spin-control button.decrement::after { border-top: 5px solid #ccc; border-left: 5px solid transparent; border-right: 5px solid transparent; } - .spin-control button.increment::after { border-bottom: 5px solid #ccc; border-left: 5px solid transparent; @@ -1699,27 +1669,23 @@ input[type=number] { } -/* preset form checkbox */ - +/* Field - Checkbox +------------------------------------------------------- */ .checkselect label:last-of-type { display: block; background: #fff; padding: 5px 10px; color: #7092ff; } - .checkselect label:hover { background: #f1f1f1; } - .checkselect .set { color: inherit; } - .checkselect label:not(.set) input[type="checkbox"] { opacity: .5; } - .checkselect .reverser.button { display: block; float: right; @@ -1735,21 +1701,23 @@ input[type=number] { display: none; } -/* Preset form radio button */ +/* Field - Radio button +------------------------------------------------------- */ .toggle-list button.remove { border-radius: 0 0 3px 3px; } - .toggle-list button.remove .icon { position: absolute; left: 5px; } - .toggle-list button.remove::before { content: none; } + +/* Field - Maxspeed +------------------------------------------------------- */ #preset-input-maxspeed_advisory, #preset-input-maxspeed { border-right: none; @@ -1771,7 +1739,9 @@ input[type=number] { border-radius: 0 0 0 4px; } -/* Wikipedia field */ + +/* Field - Wikipedia +------------------------------------------------------- */ .form-field .wiki-lang { border-radius: 0; } @@ -1791,7 +1761,9 @@ input[type=number] { left: 32px; } -/* Localized field */ + +/* Field - Localized Name +------------------------------------------------------- */ .form-field .localized-main { padding-right: 12%; } @@ -1822,7 +1794,6 @@ input[type=number] { .form-field .localized-wrap { padding: 0 10px; } - .form-field .localized-wrap .entry { position: relative; overflow: hidden; @@ -1845,18 +1816,17 @@ input[type=number] { border-radius: 0; border-top-width: 0; } - .form-field .localized-wrap .entry .localized-value { border-top-width: 0; border-radius: 0 0 4px 4px; } - .form-field .localized-wrap .form-label button { border-top-right-radius: 3px; } -/* Preset form address */ +/* Field - Address +------------------------------------------------------- */ .addr-row input { border-right: 0; border-bottom: 0; @@ -1895,8 +1865,9 @@ input[type=number] { border-radius: 0 0 0 4px; } -/* Restrictions editor */ +/* Field - Restriction Editor +------------------------------------------------------- */ .form-field-restrictions .restriction-controls-container { background-color: #fff; border-top: 1px solid #ccc; @@ -1986,8 +1957,9 @@ input[type=number] { color: #78f; } -/* Changeset editor while comment text is empty */ +/* Field - Changeset Comment +------------------------------------------------------- */ .form-field-comment:not(.present) #preset-input-comment { border-color: rgb(230, 100, 100); } @@ -2008,8 +1980,9 @@ input[type=number] { border-color: rgb(230, 100, 100); } -/* combobox dropdown */ +/* Field - Combobox +------------------------------------------------------- */ div.combobox { z-index: 9999; display: none; @@ -2066,8 +2039,9 @@ div.combobox { border-right: 5px solid transparent; } -/* Field Help */ +/* Field Help +------------------------------------------------------- */ .field-help-body { display: block; position: absolute; @@ -2167,8 +2141,8 @@ div.combobox { } -/* Raw Tag Editor */ - +/* Raw Tag Editor +------------------------------------------------------- */ .tag-list { padding-top: 10px; } @@ -2294,7 +2268,6 @@ div.combobox { } /* Adding form fields to tag editor */ - .raw-tag-editor .add-tag { width: 40%; height: 30px; @@ -2312,7 +2285,6 @@ div.combobox { } /* Tag reference */ - button.minor.tag-reference-loading { background-color: #f5f5f5; } @@ -2374,8 +2346,8 @@ img.tag-reference-wiki-image { } -/* Raw relation membership editor */ - +/* Raw Member / Membership Editor +------------------------------------------------------- */ .raw-member-editor .member-list li:first-child, .raw-membership-editor .member-list li:first-child { padding-top: 10px; @@ -2422,7 +2394,8 @@ input.key-trap { } -/* OSM Note UI */ +/* OSM Note Editor +------------------------------------------------------- */ .note-header { background-color: #f6f6f6; border-radius: 5px; @@ -2547,7 +2520,8 @@ input.key-trap { } -/* Map Data Inspector */ +/* Custom Data Editor +------------------------------------------------------- */ .data-header { background-color: #f6f6f6; border-radius: 5px; @@ -2600,29 +2574,8 @@ input.key-trap { } -/* Fullscreen button */ -div.full-screen { - float: right; - width: 40px; - margin-right: 10px; -} - -div.full-screen .tooltip { - min-width: 160px; -} - -div.full-screen > button, div.full-screen > button.active { - width: 40px; - height: 40px; - background: transparent; -} - -div.full-screen > button:hover { - background-color: rgba(0, 0, 0, .8); -} - -/* Map Controls */ - +/* Map Controls +------------------------------------------------------- */ .map-controls { right: 0; top: 132px; @@ -2650,7 +2603,32 @@ div.full-screen > button:hover { background: #7092ff; } -/* Zoomer */ + +/* Fullscreen Button (disabled) +------------------------------------------------------- */ +div.full-screen { + float: right; + width: 40px; + margin-right: 10px; +} + +div.full-screen .tooltip { + min-width: 160px; +} + +div.full-screen > button, div.full-screen > button.active { + width: 40px; + height: 40px; + background: transparent; +} + +div.full-screen > button:hover { + background-color: rgba(0, 0, 0, .8); +} + + +/* Zoom Buttons +------------------------------------------------------- */ .zoombuttons > button.zoom-in { border-radius: 4px 0 0 0; } @@ -2658,7 +2636,9 @@ div.full-screen > button:hover { border-radius: 0 4px 0 0; } -/* Geolocator */ + +/* Geolocate Button +------------------------------------------------------- */ .geolocate-control { margin-bottom: 10px; } @@ -2669,7 +2649,9 @@ div.full-screen > button:hover { border-radius: 0 0 4px 0; } -/* Pane Buttons */ + +/* Background / Map Data / Help Pane buttons +------------------------------------------------------- */ .help-control > button { border-radius: 0 0 0 4px; } @@ -2689,8 +2671,8 @@ div.full-screen > button:hover { } -/* Background / Map Data Settings */ - +/* Background / Map Data Settings +------------------------------------------------------- */ .map-data-control, .background-control { position: relative; @@ -2721,19 +2703,15 @@ div.full-screen > button:hover { .layer-list > li:first-child { border-radius: 3px 3px 0 0; } - .layer-list > li:last-child { border-radius: 0 0 3px 3px; } - .layer-list > li:only-child { border-radius: 3px; } - .layer-list li:not(:last-child) { border-bottom: 1px solid #ccc; } - .layer-list li:hover { background-color: #ececec; } @@ -2774,9 +2752,45 @@ div.full-screen > button:hover { text-overflow: ellipsis; } +.map-data-control .layer-list button, +.background-control .layer-list button { + float: right; + height: 100%; + width: 10%; + border-left: 1px solid #ccc; + border-radius: 0; +} +[dir='rtl'] .map-data-control .layer-list button, +[dir='rtl'] .background-control .layer-list button { + float: left; + border-left: none; + border-right: 1px solid #ccc; +} -/* Background Display Options */ +.map-data-control .layer-list button .icon, +.background-control .layer-list button .icon { + opacity: 0.5; +} +.map-data-control .layer-list button:first-of-type, +.background-control .layer-list button:first-of-type { + border-radius: 0 3px 3px 0; +} +[dir='rtl'] .map-data-control .layer-list button:first-of-type, +[dir='rtl'] .background-control .layer-list button:first-of-type { + border-radius: 3px 0 0 3px; +} + +.map-data-control .vectortile-container .vectortile-header { + padding-bottom: 5px; +} +.map-data-control .vectortile-container .vectortile-footer { + padding-bottom: 10px; +} + + +/* Background - Display Options Sliders +------------------------------------------------------- */ .display-options-container { padding: 10px; } @@ -2809,8 +2823,8 @@ div.full-screen > button:hover { } -/* Adjust Alignment controls */ - +/* Background - Adjust Alignment +------------------------------------------------------- */ .background-control .nudge-container { border: 1px solid #ccc; border-radius: 4px; @@ -2937,36 +2951,8 @@ div.full-screen > button:hover { } -.map-data-control .layer-list button, -.background-control .layer-list button { - float: right; - height: 100%; - width: 10%; - border-left: 1px solid #ccc; - border-radius: 0; -} -[dir='rtl'] .map-data-control .layer-list button, -[dir='rtl'] .background-control .layer-list button { - float: left; - border-left: none; - border-right: 1px solid #ccc; -} - -.map-data-control .layer-list button .icon, -.background-control .layer-list button .icon { - opacity: 0.5; -} - -.map-data-control .layer-list button:first-of-type, -.background-control .layer-list button:first-of-type { - border-radius: 0 3px 3px 0; -} -[dir='rtl'] .map-data-control .layer-list button:first-of-type, -[dir='rtl'] .background-control .layer-list button:first-of-type { - border-radius: 3px 0 0 3px; -} - -/* Side panes */ +/* Side Panes - Background / Map Data / Help +------------------------------------------------------- */ .map-pane { position: fixed; top: 60px; @@ -3012,9 +2998,9 @@ div.full-screen > button:hover { padding-bottom: 15px; } -/* Help */ - +/* Help +------------------------------------------------------- */ .help-wrap p { font-size: 15px; margin-bottom: 20px; @@ -3115,9 +3101,8 @@ div.full-screen > button:hover { } -/* Tiles +/* Raster Background Tiles ------------------------------------------------------- */ - img.tile { position: absolute; transform-origin: 0 0; @@ -3177,7 +3162,6 @@ img.tile-debug { /* Map ------------------------------------------------------- */ - #map { position: relative; overflow: hidden; @@ -3205,6 +3189,7 @@ img.tile-debug { bottom: 0; } + /* Map-In-Map ------------------------------------------------------- */ .map-in-map { @@ -3262,7 +3247,7 @@ img.tile-debug { } -/* Debug +/* Debug Data ------------------------------------------------------- */ .debug { stroke: currentColor; @@ -3301,7 +3286,8 @@ img.tile-debug { padding: 0 5px; } -/* Info Box + +/* Information Panels ------------------------------------------------------- */ .info-panels { display: flex; @@ -3358,7 +3344,6 @@ img.tile-debug { .panel-title button.close:hover { color: #fff; } - .panel-title button.close .icon { height: 20px; width: 16px; @@ -3407,9 +3392,8 @@ img.tile-debug { } -/* About Section +/* About Section, Attribution, Footer ------------------------------------------------------- */ - #about { width: 100%; position: absolute; @@ -3474,8 +3458,9 @@ img.tile-debug { height: 30px; } -/* footer flash message */ +/* Footer - Flash messages +------------------------------------------------------- */ #flash-wrap { display: flex; flex: 0 0 100%; @@ -3557,8 +3542,8 @@ img.tile-debug { } -/* footer scale */ - +/* Footer - Scale bar, About, Source Switcher +------------------------------------------------------- */ #scale-block { vertical-align: bottom; width: 250px; @@ -3604,7 +3589,6 @@ img.tile-debug { shape-rendering: crispEdges; } - #about-list { text-align: right; margin-right: 10px; @@ -3633,7 +3617,6 @@ img.tile-debug { padding: 5px 5px 5px 0; } - #about-list li:last-child { border-left: 0; margin-left: 0; @@ -3686,8 +3669,8 @@ img.tile-debug { color: #ccf; } -/* Notification Badges */ - +/* Notification Badges +------------------------------------------------------- */ /* For an icon (e.g. new version) */ .badge { display: inline-block; @@ -3734,9 +3717,8 @@ img.tile-debug { } -/* Modals +/* Modals / Prompts ------------------------------------------------------- */ - .modal { top: 40px; display: inline-block; @@ -3752,7 +3734,6 @@ img.tile-debug { .modal .loader { margin-bottom: 10px; } - .modal .description { text-align: center; } @@ -3766,7 +3747,6 @@ img.tile-debug { right: 0; overflow: auto; } - .shaded:before { content:''; background: rgba(0,0,0,0.5); @@ -3778,11 +3758,9 @@ img.tile-debug { padding: 20px; border-bottom: 1px solid #ccc; } - .modal-section.header h3 { padding: 0; } - .modal-section.buttons { text-align: center; } @@ -3856,7 +3834,7 @@ img.tile-debug { color: #e06c5e; } -/* Success Modal +/* Success Screen / Community Index ------------------------------------------------------- */ .save-success.body { overflow-y: scroll; @@ -4071,7 +4049,6 @@ svg.mouseclick use.right { margin-bottom: 20px; } - .settings-custom-data .instructions-url { margin-bottom: 10px; } @@ -4178,9 +4155,9 @@ svg.mouseclick use.right { .changeset-list li:first-child { border-top: 0;} + /* Conflict resolution ------------------------------------------------------- */ - .conflicts-help { padding: 20px; background-color: #ffffbb; @@ -4228,9 +4205,9 @@ svg.mouseclick use.right { height: 30px; } -/* Notices -------------------------------------------------------- */ +/* Notices (Zoom in to Edit) +------------------------------------------------------- */ .notice { position: absolute; top: 45px; @@ -4262,9 +4239,9 @@ svg.mouseclick use.right { margin-right: 0; } + /* Tooltips ------------------------------------------------------- */ - .tooltip { position: absolute; display: none; @@ -4505,8 +4482,8 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { } -/* radial menu (deprecated) */ - +/* Contextual Radial Menu (deprecated) +------------------------------------------------------- */ .radial-menu-tooltip { opacity: 0.8; display: none; @@ -4544,8 +4521,9 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { color: rgba(40,40,40,.5); } -/* edit menu */ +/* Contextual Edit Menu +------------------------------------------------------- */ .edit-menu-tooltip { display: none; position: absolute; @@ -4579,13 +4557,14 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { color: #79f; pointer-events: none; } - .edit-menu-item.disabled use { fill: rgba(32,32,32,.2); color: rgba(40,40,40,.2); } +/* Lasso +------------------------------------------------------- */ .lasso-path { fill-opacity: 0.3; stroke: #fff; @@ -4594,22 +4573,19 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { stroke-dasharray: 5, 5; } + /* Media Queries ------------------------------------------------------- */ - @media only screen and (max-width: 840px) { /* override hide for save button */ #bar .save .label { display: block;} } - @media screen and (max-width: 1200px) { .user-list { display: none !important; } } - @media screen and (max-width: 1000px) { #userLink { display: none !important; } } - @media screen and (max-width: 900px) { #scale-block { display: none !important; } } @@ -4617,7 +4593,6 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { /* Scrollbars ----------------------------------------------------- */ - ::-webkit-scrollbar { height: 20px; overflow: visible; @@ -4644,9 +4619,9 @@ li.hide + li.version .badge .tooltip .tooltip-arrow { background-color: rgba(0,0,0,.05); } + /* Intro walkthrough ----------------------------------------------------- */ - .curtain-darkness { pointer-events: all; fill-opacity: 0.7; diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index e886bf231..d69e04c76 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -8,6 +8,7 @@ import { d3keybinding as d3_keybinding } from '../lib/d3.keybinding.js'; import { svgIcon } from '../svg'; import { t, textDirection } from '../util/locale'; import { tooltip } from '../util/tooltip'; +import { geoExtent } from '../geo'; import { modeBrowse } from '../modes'; import { uiBackground } from './background'; import { uiDisclosure } from './disclosure'; @@ -210,6 +211,7 @@ export function uiMapData(context) { // Beta feature - sample vector layers to support Detroit Mapping Challenge // https://github.com/osmus/detroit-mapping-challenge function drawVectorItems(selection) { + var dataLayer = layers.layer('data'); var vtData = [ { name: 'Detroit Neighborhoods/Parks', @@ -229,24 +231,45 @@ export function uiMapData(context) { } ]; - var dataLayer = layers.layer('data'); + // Only show this if the map is around Detroit.. + var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]); + var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center())); - var header = selection.selectAll('.layer-list-vectortile-header') - .data([0]); + var container = selection.selectAll('.vectortile-container') + .data(showVectorItems ? [0] : []); - header.enter() + container.exit() + .remove(); + + var containerEnter = container.enter() + .append('div') + .attr('class', 'vectortile-container'); + + containerEnter .append('h4') - .attr('class', 'layer-list-vectortile-header') - .text('Vector Tiles (beta)'); + .attr('class', 'vectortile-header') + .text('Detroit Vector Tiles (Beta)'); - var ul = selection - .selectAll('.layer-list-vectortile') - .data([0]); - - ul = ul.enter() + containerEnter .append('ul') .attr('class', 'layer-list layer-list-vectortile') - .merge(ul); + + containerEnter + .append('div') + .attr('class', 'vectortile-footer') + .append('a') + .attr('target', '_blank') + .attr('tabindex', -1) + .call(svgIcon('#iD-icon-out-link', 'inline')) + .attr('href', 'https://github.com/osmus/detroit-mapping-challenge') + .append('span') + .text('About these layers'); + + container = container + .merge(containerEnter); + + + var ul = container.selectAll('.layer-list-vectortile'); var li = ul.selectAll('.list-item') .data(vtData); @@ -481,8 +504,8 @@ export function uiMapData(context) { _dataLayerContainer .call(drawOsmItems) .call(drawPhotoItems) - .call(drawVectorItems) // beta - detroit mapping challenge - .call(drawCustomDataItems); + .call(drawCustomDataItems) + .call(drawVectorItems); // Beta - Detroit mapping challenge _fillList .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill); From 73b754d8ad7a0245ee6b2aba607513fc0a055ca4 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 21:23:27 -0400 Subject: [PATCH 161/217] Fix shadow colors on restriction editor help svgs (closes #5248) --- svg/iD-sprite/turns/turn-shadow.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svg/iD-sprite/turns/turn-shadow.svg b/svg/iD-sprite/turns/turn-shadow.svg index c4468ec89..d777a36d7 100644 --- a/svg/iD-sprite/turns/turn-shadow.svg +++ b/svg/iD-sprite/turns/turn-shadow.svg @@ -1,7 +1,7 @@ - + From a08e23cb526c43f94372c846d1cff53cb3312cc2 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sat, 25 Aug 2018 21:33:06 -0400 Subject: [PATCH 162/217] Pacify eslint --- modules/ui/map_data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index d69e04c76..369f8554f 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -252,7 +252,7 @@ export function uiMapData(context) { containerEnter .append('ul') - .attr('class', 'layer-list layer-list-vectortile') + .attr('class', 'layer-list layer-list-vectortile'); containerEnter .append('div') From 78f0349f15ea051da646cf6bcd08d4d8c3885545 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 25 Aug 2018 14:15:06 +0000 Subject: [PATCH 163/217] chore(package): update rollup to version 0.65.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a037d7b76..b454309e4 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "osm-community-index": "0.4.6", "phantomjs-prebuilt": "~2.1.11", "request": "^2.85.0", - "rollup": "~0.64.1", + "rollup": "~0.65.0", "rollup-plugin-commonjs": "^9.0.0", "rollup-plugin-includepaths": "~0.2.3", "rollup-plugin-json": "^3.0.0", From 2ebce1e7f7fbd37aa9df8896d0ad7c8d91e3e011 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sun, 26 Aug 2018 04:19:48 +0000 Subject: [PATCH 164/217] chore(package): update osm-community-index to version 0.4.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b454309e4..f0794001d 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "mocha-phantomjs-core": "^2.1.0", "name-suggestion-index": "0.1.6", "npm-run-all": "^4.0.0", - "osm-community-index": "0.4.6", + "osm-community-index": "0.4.7", "phantomjs-prebuilt": "~2.1.11", "request": "^2.85.0", "rollup": "~0.65.0", From dbdf5332ee9b8d3e78dfcc8e298edf35fdc1e1d8 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 26 Aug 2018 02:07:44 -0400 Subject: [PATCH 165/217] Update en.json with new community index strings --- dist/locales/en.json | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/dist/locales/en.json b/dist/locales/en.json index 0a98578ff..6c8156086 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -7104,6 +7104,14 @@ } }, "community": { + "bw-facebook": { + "name": "Mapping Botswana on Facebook", + "description": "Page of OpenStreetMap in Botswana" + }, + "bw-twitter": { + "name": "Mapping Botswana on Twitter", + "description": "Twitter of OpenStreetMap in Botswana" + }, "cape-coast-youthmappers": { "name": "University of Cape Coast YouthMappers", "description": "Follow us on Twitter: {url}", @@ -7468,6 +7476,18 @@ "name": "OpenStreetMap Hungary Meetup", "description": "The platform for organizing meetups in Hungary" }, + "is-facebook": { + "name": "OSM Iceland on Facebook", + "description": "Page of OpenStreetMap in Iceland" + }, + "is-mailinglist": { + "name": "Talk-is Mailing List", + "description": "Talk-is is the official mailing list for the Icelandic OSM community" + }, + "is-twitter": { + "name": "OSM Iceland on Twittter", + "description": "Twitter of OpenStreetMap in Iceland" + }, "it-facebook": { "name": "OpenStreetMap Italy Facebook", "description": "Join the OpenStreetMap Italy community on Facebook" @@ -7809,6 +7829,11 @@ "name": "OpenStreetMap Brasil Twitter", "description": "Follow us on Twitter at {url}" }, + "RS-telegram": { + "name": "OpenStreetMap Rio Grande do Sul Telegram Group", + "description": "Join the OpenStreetMap Rio Grande do Sul community on Telegram", + "extendedDescription": "Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!" + }, "OSM-CL-facebook": { "name": "OpenStreetMap Chile Facebook", "description": "Join the OpenStreetMap Chile community on Facebook", @@ -7885,6 +7910,29 @@ "name": "OpenStreetMap Peru", "description": "News and resources for the OpenStreetMap Peru community" }, + "LATAM-Facebook": { + "name": "OpenStreetMap Latam Facebook", + "description": "OpenStreetMap Latam on Facebook" + }, + "LATAM-Telegram": { + "name": "OpenStreetMap Latam Telegram", + "description": "OpenStreetMap Telegram for Latin America" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Latam Twitter", + "description": "Follow us on Twitter at {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "Supporting OpenStreetMap in Latin America", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.", + "where": "Buenos Aires, Argentina" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap on Facebook", "description": "Like us on Facebook for news and updates about OpenStreetMap." From 3952992c71c37e4dbed28a8dc63c464a4b50fc6b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 26 Aug 2018 02:08:06 -0400 Subject: [PATCH 166/217] 2.11.0 CHANGELOG --- CHANGELOG.md | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe41a2800..537ec831c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,110 @@ _Breaking changes, which may affect downstream projects or sites that embed iD, [@xxxx]: https://github.com/xxxx --> +# 2.11.0 +##### Aug 26, 2018 + +#### :mega: Release Highlights +* :1234: We've rolled out support for vector tiles in iD! This work was done as part of [Princi Vershwal's 2018 Google Summer of Code project](https://medium.com/@vershwal/vector-tile-support-for-openstreetmaps-id-editor-40b1cb77f63b). Thanks [@vershwal]!
+_Opening the Map Data pane (shortcut F) and choose "Custom Map Data" to add a vector tile source._ +* :trophy: To get ready for [State of the Map US](https://2018.stateofthemap.us/), let's make Detroit, USA the [best mapped city in the world](https://www.openstreetmap.us/2018/07/detroit-mapping-challenge-sotmus2018/)! iD includes 3 vector tile layers of public data, built by [@jonahadkins], to support the Detroit Mapping Challenge. More info is available on the [osmus/detroid-mapping-challenge repository](https://github.com/osmus/detroit-mapping-challenge).
+_When mapping around Detroit, try out the special Detroit vector tile layers on the Map Data pane (shortcut F)_ + +[@vershwal]: https://github.com/vershwal +[@jonahadkins]: https://github.com/jonahadkins + +#### :tada: New Features +* Add support for vector tile data ([#3742], [#5072], [#5243], thanks [@vershwal] and [@geohacker]) + * Replaced the "GPX"/"Local Data" layer with "Custom Map Data" on Map Data pane. + * We've added several vector tile sources to the Map Data pane. They will be available if the user is editing around Detroit. This is a "Beta" feature to demonstrate the technology. (thanks [@jonahadkins]) + * :warning: We refactored `svgGpx`->`svgData` module, which now handles both data files and data from vector tile urls. (Important: the URL parameter for loading gpx files has **not** changed, and remains compatible with applications like the HOT Task Manager). + * Added `serviceVectorTile` for fetching and caching data from vector tile servers, and merging and deduplicating features that cross tile boundaries. + +[#5243]: https://github.com/openstreetmap/iD/issues/5243 +[#5072]: https://github.com/openstreetmap/iD/issues/5072 +[#3742]: https://github.com/openstreetmap/iD/issues/3742 +[@vershwal]: https://github.com/vershwal +[@geohacker]: https://github.com/geohacker +[@jonahadkins]: https://github.com/jonahadkins + +#### :sparkles: Usability +* Replace "Custom Imagery" alert box with a modal settings screen ([#5207], thanks [@vershwal]) + * This allows the user to see more of the url template, and makes copy/pasting easier. ([#4802], [#4806]) +* Show selected note details on the History Panel ([#5158]) +* Show location of selected note on the Measurement Panel ([#5158]) +* Allow submit note comments with shortcut cmd+enter ([#5193]) +* Disable note and streetview interactivity while the user is drawing ([#5202]) + +[#5207]: https://github.com/openstreetmap/iD/issues/5207 +[#5202]: https://github.com/openstreetmap/iD/issues/5202 +[#5193]: https://github.com/openstreetmap/iD/issues/5193 +[#5158]: https://github.com/openstreetmap/iD/issues/5158 +[#4806]: https://github.com/openstreetmap/iD/issues/4806 +[#4802]: https://github.com/openstreetmap/iD/issues/4802 +[@vershwal]: https://github.com/vershwal + +#### :bug: Bugfixes +* Fix dragging of points and notes while a note is selected +* Fix shadow colors on restriction editor help screens ([#5248]) +* Fix errors when using certain fields after saving to OSM or switching live/dev server ([#4898], [#5229]) +* Fix issue causing uploads to never complete, when reusing an existing open changeset, e.g. conflict resolution (#5228) +* Fix 404 not found error when fetching metadata for Esri background imagery ([#5222], thanks [@jgravois]) +* Prevent users from restoring history and saving duplicate changes after they start uploading a changeset ([#5200]) +* Disable Add Note '4' shortcut when notes layer is not enabled ([#5190]) +* Don't reverse cardinal direction roles on relations anymore ([#2004-comment]) +* Allow float/decimal values for height field ([#5184], [#5198], thanks [@jguthrie100]) + +[#5248]: https://github.com/openstreetmap/iD/issues/5248 +[#5229]: https://github.com/openstreetmap/iD/issues/5229 +[#5228]: https://github.com/openstreetmap/iD/issues/5228 +[#5222]: https://github.com/openstreetmap/iD/issues/5222 +[#5200]: https://github.com/openstreetmap/iD/issues/5200 +[#5198]: https://github.com/openstreetmap/iD/issues/5198 +[#5190]: https://github.com/openstreetmap/iD/issues/5190 +[#5184]: https://github.com/openstreetmap/iD/issues/5184 +[#4898]: https://github.com/openstreetmap/iD/issues/4898 +[#2004-comment]: https://github.com/openstreetmap/iD/pull/2004#issuecomment-407995998 +[@jgravois]: https://github.com/jgravois +[@jguthrie100]: https://github.com/jguthrie100 + +#### :earth_asia: Localization +* Fix note status string to be translateable ([#5189]) + +[#5189]: https://github.com/openstreetmap/iD/issues/5189 + +#### :hourglass: Performance +* Speedup imagery index with which-polygon ([#5226]) + +[#5226]: https://github.com/openstreetmap/iD/issues/5226 + +#### :rocket: Presets +* Add "apothecary" as a search term for pharmacies and chemists ([#5235]) +* Add `listed_status` to whitelist of tags that autocomplete uppercase ([#5231]) +* Use Biergarten as the preset name, and don't add `building=yes` ([#5232]) +* Add preset for `sport=badminton` ([#5233], thanks [@rene78]) +* Add simple `access` field for several presets (campsite, picnic, bbq) +* Support `access=permit` in `access` and `access_simple` fields ([#5223]) +* Change `stars` from integer field to combo, support capital 'S' ([#5216]) +* Support building tags on gasometers and silos +* Add preset for `man_made=bunker_silo` ([#5157], [#5195], thanks [@manfredbrandl]) +* Add `layer` field to a few more presets ([#5204], thanks [@Lukas458]) +* Allow `tourism=artwork` on line geometry, silence `tag_suggests_area` warning ([#5206]) + +[#5235]: https://github.com/openstreetmap/iD/issues/5235 +[#5233]: https://github.com/openstreetmap/iD/issues/5233 +[#5232]: https://github.com/openstreetmap/iD/issues/5232 +[#5231]: https://github.com/openstreetmap/iD/issues/5231 +[#5223]: https://github.com/openstreetmap/iD/issues/5223 +[#5216]: https://github.com/openstreetmap/iD/issues/5216 +[#5206]: https://github.com/openstreetmap/iD/issues/5206 +[#5204]: https://github.com/openstreetmap/iD/issues/5204 +[#5195]: https://github.com/openstreetmap/iD/issues/5195 +[#5157]: https://github.com/openstreetmap/iD/issues/5157 +[@rene78]: https://github.com/rene78 +[@manfredbrandl]: https://github.com/manfredbrandl +[@Lukas458]: https://github.com/Lukas458 + + # 2.10.0 ##### Jul 26, 2018 @@ -44,7 +148,7 @@ _Try activating one of the streetlevel photo layers (shortcut F) and [@kratico]: https://github.com/kratico #### :tada: New Features -* Add support for OpenStreetMap notes ([#2629], [#5107], [#5162], thanks [@thomas-hervey]) +* Add support for OpenStreetMap notes ([#2629], [#5107], [#5162], thanks [@thomas-hervey] and [@kamicut]) * Add Detach Node operation ([#4320], [#5127], thanks [@Psigio]) * Add support for high resolution image tile sizes * This improves the appearance of the Mapbox Satellite layer and fixes the display of MTB-Norway layer ([#5179]) @@ -65,6 +169,7 @@ _Try activating one of the streetlevel photo layers (shortcut F) and [#4320]: https://github.com/openstreetmap/iD/issues/4320 [#2629]: https://github.com/openstreetmap/iD/issues/2629 [@thomas-hervey]: https://github.com/thomas-hervey +[@kamicut]: https://github.com/kamicut [@Psigio]: https://github.com/Psigio [@kratico]: https://github.com/kratico From c8dd656a57d1997249dfccb8e7b2527be00be641 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 26 Aug 2018 02:15:17 -0400 Subject: [PATCH 167/217] npm run imagery --- data/imagery.json | 1259 +++++++++++++++++++++++------------------- dist/locales/en.json | 8 +- 2 files changed, 680 insertions(+), 587 deletions(-) diff --git a/data/imagery.json b/data/imagery.json index 3d76f2cf4..7da6bb315 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -5776,8 +5776,8 @@ "name": "Berlin aerial photography 2015", "type": "tms", "template": "https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png", - "endDate": "2015-01-01T00:00:00.000Z", - "startDate": "2015-01-01T00:00:00.000Z", + "endDate": "2015-08-03T00:00:00.000Z", + "startDate": "2015-08-02T00:00:00.000Z", "polygon": [ [ [13.11068, 52.59538], @@ -5850,8 +5850,8 @@ "name": "Berlin aerial photography 2016", "type": "tms", "template": "https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png", - "endDate": "2016-01-01T00:00:00.000Z", - "startDate": "2016-01-01T00:00:00.000Z", + "endDate": "2016-04-03T00:00:00.000Z", + "startDate": "2016-04-02T00:00:00.000Z", "polygon": [ [ [13.29535, 52.392], @@ -5922,13 +5922,90 @@ ], "terms_text": "Geoportal Berlin/Digitale farbige Orthophotos 2016" }, + { + "id": "Berlin-2016-infrared", + "name": "Berlin aerial photography 2016 (infrared)", + "type": "tms", + "template": "https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png", + "endDate": "2016-04-03T00:00:00.000Z", + "startDate": "2016-04-02T00:00:00.000Z", + "polygon": [ + [ + [13.29535, 52.392], + [13.29502, 52.40083], + [13.19206, 52.39937], + [13.19241, 52.39035], + [13.14839, 52.3897], + [13.14877, 52.38046], + [13.11926, 52.38001], + [13.11888, 52.38921], + [13.08906, 52.40693], + [13.07431, 52.4067], + [13.07356, 52.42447], + [13.10259, 52.43394], + [13.10073, 52.47912], + [13.11534, 52.47934], + [13.11055, 52.59579], + [13.13972, 52.60527], + [13.18403, 52.60593], + [13.21212, 52.63346], + [13.27041, 52.65222], + [13.26973, 52.67025], + [13.31405, 52.67086], + [13.32953, 52.65323], + [13.43315, 52.65458], + [13.43254, 52.67251], + [13.44682, 52.68189], + [13.50593, 52.68261], + [13.50681, 52.65545], + [13.53643, 52.6558], + [13.53757, 52.61964], + [13.52288, 52.61946], + [13.52345, 52.6017], + [13.53842, 52.59279], + [13.56782, 52.59313], + [13.59798, 52.58464], + [13.5988, 52.55755], + [13.62826, 52.55788], + [13.65822, 52.53124], + [13.67314, 52.53139], + [13.67365, 52.51359], + [13.65912, 52.51344], + [13.65989, 52.48661], + [13.68929, 52.48692], + [13.7188, 52.47807], + [13.73406, 52.4604], + [13.7636, 52.46069], + [13.76454, 52.42482], + [13.75027, 52.42468], + [13.75097, 52.39814], + [13.70722, 52.37923], + [13.70772, 52.36111], + [13.67826, 52.36081], + [13.67876, 52.34302], + [13.66428, 52.34287], + [13.66454, 52.33367], + [13.62038, 52.33319], + [13.61959, 52.36012], + [13.58956, 52.37786], + [13.5313, 52.37719], + [13.53103, 52.38581], + [13.44254, 52.38473], + [13.42861, 52.36674], + [13.38418, 52.36617], + [13.35417, 52.39279], + [13.29535, 52.392] + ] + ], + "terms_text": "Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2016" + }, { "id": "Berlin-2017", "name": "Berlin aerial photography 2017", "type": "tms", "template": "https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png", - "endDate": "2017-01-01T00:00:00.000Z", - "startDate": "2017-01-01T00:00:00.000Z", + "endDate": "2017-03-28T00:00:00.000Z", + "startDate": "2017-03-27T00:00:00.000Z", "polygon": [ [ [13.29535, 52.392], @@ -5997,16 +6074,15 @@ [13.29535, 52.392] ] ], - "terms_text": "Geoportal Berlin/Digitale farbige Orthophotos 2017", - "best": true + "terms_text": "Geoportal Berlin/Digitale farbige Orthophotos 2017" }, { - "id": "Berlin-2017-infrared", - "name": "Berlin aerial photography 2017 (infrared)", + "id": "Berlin-2018", + "name": "Berlin aerial photography 2018", "type": "tms", - "template": "https://tiles.codefor.de/berlin-2017i/{zoom}/{x}/{y}.png", - "endDate": "2017-01-01T00:00:00.000Z", - "startDate": "2017-01-01T00:00:00.000Z", + "template": "https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png", + "endDate": "2018-04-07T00:00:00.000Z", + "startDate": "2018-03-19T00:00:00.000Z", "polygon": [ [ [13.29535, 52.392], @@ -6075,7 +6151,8 @@ [13.29535, 52.392] ] ], - "terms_text": "Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2017" + "terms_text": "Geoportal Berlin/Digitale farbige Orthophotos 2018", + "best": true }, { "id": "Bing", @@ -6166,7 +6243,7 @@ "id": "Bonvillars-2013", "name": "Bonvillars Orthophoto 2013", "type": "tms", - "template": "https://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png", + "template": "http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -6180,7 +6257,7 @@ [6.66713, 46.83358] ] ], - "terms_url": "https://osmdata.asitvd.ch/", + "terms_url": "http://osmdata.asitvd.ch/", "terms_text": "Bonvillars - Orthophoto technique 2013" }, { @@ -9342,7 +9419,7 @@ "id": "Cartoriviera-2012", "name": "Cartoriviera - Orthophoto 2012", "type": "tms", - "template": "https://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png", + "template": "http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -18345,7 +18422,7 @@ "id": "Fiez-2013", "name": "Fiez Orthophoto 2013", "type": "tms", - "template": "https://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png", + "template": "http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png", "endDate": "2013-01-01T00:00:00.000Z", "startDate": "2013-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -18360,7 +18437,7 @@ [6.62313, 46.82339] ] ], - "terms_url": "https://osmdata.asitvd.ch/", + "terms_url": "http://osmdata.asitvd.ch/", "terms_text": "Fiez - Orthophoto technique 2013" }, { @@ -22714,7 +22791,7 @@ [15.9751, 54.37092] ] ], - "terms_url": "http://geoportal.gov.pl/web/guest/regulamin", + "terms_url": "https://geoportal.gov.pl/web/guest/regulamin", "terms_text": "Główny Urząd Geodezji i Kartografii", "best": true, "icon": "https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png" @@ -24355,6 +24432,37 @@ "terms_text": "SRTM", "overlay": true }, + { + "id": "hri-orto", + "name": "HRI Orthophoto", + "type": "wms", + "template": "https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "projection": "EPSG:3857", + "zoomExtent": [0, 19], + "polygon": [ + [ + [24.26948, 59.8593], + [24.26674, 60.22549], + [24.55307, 60.36703], + [24.50363, 60.49038], + [24.76387, 60.60079], + [25.00625, 60.54175], + [24.90051, 60.38197], + [24.9884, 60.35073], + [25.06943, 60.44096], + [25.17517, 60.45248], + [25.18066, 60.34122], + [25.27954, 60.2943], + [25.19577, 60.08813], + [24.26948, 59.8593] + ] + ], + "terms_url": "https://www.hsy.fi/", + "terms_text": "© Helsingin kaupunkiympäristön toimiala", + "best": true, + "description": "Ortophotos from Helsinki Region Infoshare", + "icon": "https://github.com/osmlab/editor-layer-index/blob/gh-pages/sources/europe/fi/hri_logo.png" + }, { "id": "IBGE_DF_Addresses", "name": "IBGE Distrito Federal", @@ -37922,7 +38030,7 @@ }, { "id": "osmse-ekonomiska", - "name": "Lantmäteriet Economic Map (historic)", + "name": "Lantmäteriet Economic Map 1950–1980", "type": "tms", "template": "https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg", "zoomExtent": [3, 17], @@ -37947,7 +38055,7 @@ ], "terms_url": "https://www.lantmateriet.se", "terms_text": "© Lantmäteriet", - "description": "Scan of ´Economic maps´ ca 1950-1980", + "description": "Scan of \"Economic maps\" ca. 1950–1980", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png" }, { @@ -37982,7 +38090,7 @@ ], "terms_url": "https://www.lantmateriet.se/", "terms_text": "© Lantmäteriet, CC0", - "description": "Mosaic of Swedish orthophotos from the period 1949-1970.", + "description": "Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png" }, { @@ -38009,7 +38117,7 @@ ], "terms_url": "https://www.lantmateriet.se/", "terms_text": "© Lantmäteriet, CC0", - "description": "Mosaic of Swedish orthophotos from the period 1970-1980. To be expanded.", + "description": "Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png" }, { @@ -38286,7 +38394,7 @@ "id": "Lausanne-2012", "name": "Lausanne - Orthophoto technique 2012", "type": "tms", - "template": "https://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png", + "template": "http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -40406,7 +40514,7 @@ "id": "mainzlatestaerialimagery", "name": "Mainz latest aerial imagery", "type": "wms", - "template": "https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "template": "https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:4326", "zoomExtent": [17, 22], "polygon": [ @@ -41084,6 +41192,190 @@ "terms_text": "DoIT, MD iMap, MDP", "description": "Maryland State Highway Administration road features and additional Maryland focused landmarks" }, + { + "id": "MCGIS-County-NAIP-Imagery-2015", + "name": "Mesa County GIS NAIP 2015", + "type": "wms", + "template": "https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "projection": "EPSG:4326", + "endDate": "2015-01-01T00:00:00.000Z", + "startDate": "2015-01-01T00:00:00.000Z", + "zoomExtent": [0, 20], + "polygon": [ + [ + [-109.06765, 39.37875], + [-107.37012, 39.37962], + [-107.36995, 39.18422], + [-107.49574, 39.18416], + [-107.49568, 39.12133], + [-107.62081, 39.12126], + [-107.62076, 39.05974], + [-107.68231, 39.05971], + [-107.68226, 38.99652], + [-107.81774, 38.99645], + [-107.81779, 39.05859], + [-107.86948, 39.05856], + [-107.86943, 38.99769], + [-108.05698, 38.99759], + [-108.05688, 38.87126], + [-108.18204, 38.8712], + [-108.18198, 38.8081], + [-108.37142, 38.808], + [-108.3711, 38.43452], + [-109.06685, 38.43416], + [-109.06765, 39.37875] + ] + ], + "terms_url": "http://gis.mesacounty.us/", + "terms_text": "Mesa County GIS", + "icon": "https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png" + }, + { + "id": "MCGIS-County-NAIP-Imagery-2017", + "name": "Mesa County GIS NAIP 2017", + "type": "wms", + "template": "https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "projection": "EPSG:4326", + "endDate": "2017-10-24T00:00:00.000Z", + "startDate": "2017-08-26T00:00:00.000Z", + "zoomExtent": [0, 13], + "polygon": [ + [ + [-109.06765, 39.37875], + [-107.37012, 39.37962], + [-107.36995, 39.18422], + [-107.49574, 39.18416], + [-107.49568, 39.12133], + [-107.62081, 39.12126], + [-107.62076, 39.05974], + [-107.68231, 39.05971], + [-107.68226, 38.99652], + [-107.81774, 38.99645], + [-107.81779, 39.05859], + [-107.86948, 39.05856], + [-107.86943, 38.99769], + [-108.05698, 38.99759], + [-108.05688, 38.87126], + [-108.18204, 38.8712], + [-108.18198, 38.8081], + [-108.37142, 38.808], + [-108.3711, 38.43452], + [-109.06685, 38.43416], + [-109.06765, 39.37875] + ] + ], + "terms_url": "http://gis.mesacounty.us/", + "terms_text": "Mesa County GIS", + "icon": "https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png" + }, + { + "id": "MCGIS-County-Valleywide-Imagery-2018", + "name": "Mesa County GIS Valleywide 2018", + "type": "wms", + "template": "https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "projection": "EPSG:4326", + "endDate": "2018-01-01T00:00:00.000Z", + "startDate": "2018-01-01T00:00:00.000Z", + "zoomExtent": [0, 20], + "polygon": [ + [ + [-108.93915, 39.23931], + [-108.86841, 39.23846], + [-108.86843, 39.23734], + [-108.81245, 39.23666], + [-108.81274, 39.22256], + [-108.79405, 39.22234], + [-108.79432, 39.20857], + [-108.70096, 39.20745], + [-108.70123, 39.1939], + [-108.60764, 39.19277], + [-108.60791, 39.17906], + [-108.58915, 39.17884], + [-108.58943, 39.1649], + [-108.53332, 39.16422], + [-108.53361, 39.14993], + [-108.51461, 39.14971], + [-108.51489, 39.13611], + [-108.44076, 39.13522], + [-108.44104, 39.12109], + [-108.42192, 39.12086], + [-108.42201, 39.1163], + [-108.3984, 39.11602], + [-108.39798, 39.13708], + [-108.32446, 39.13619], + [-108.32416, 39.15107], + [-108.30718, 39.15087], + [-108.3066, 39.18], + [-108.28866, 39.17979], + [-108.28807, 39.20939], + [-108.26868, 39.20916], + [-108.26957, 39.16484], + [-108.2864, 39.16505], + [-108.28699, 39.13571], + [-108.30312, 39.13591], + [-108.3038, 39.10194], + [-108.32335, 39.10218], + [-108.32328, 39.10574], + [-108.32914, 39.10581], + [-108.32943, 39.09121], + [-108.34736, 39.09142], + [-108.34764, 39.07715], + [-108.36637, 39.07738], + [-108.36666, 39.06268], + [-108.38569, 39.06291], + [-108.38599, 39.04799], + [-108.42216, 39.04843], + [-108.42245, 39.03377], + [-108.44051, 39.03399], + [-108.44137, 38.99101], + [-108.42193, 38.99077], + [-108.42252, 38.96127], + [-108.44162, 38.9615], + [-108.44133, 38.97595], + [-108.46034, 38.97618], + [-108.46006, 38.99024], + [-108.47877, 38.99047], + [-108.47848, 39.00485], + [-108.51515, 39.0053], + [-108.51519, 39.00287], + [-108.51825, 39.00291], + [-108.51821, 39.00517], + [-108.53414, 39.00536], + [-108.53397, 39.0139], + [-108.54342, 39.01401], + [-108.54336, 39.01733], + [-108.5455, 39.01735], + [-108.54548, 39.01855], + [-108.65864, 39.01991], + [-108.65778, 39.06287], + [-108.67867, 39.06313], + [-108.67837, 39.07793], + [-108.69699, 39.07816], + [-108.69671, 39.09203], + [-108.71557, 39.09225], + [-108.71529, 39.10619], + [-108.7388, 39.10648], + [-108.73853, 39.12033], + [-108.75744, 39.12056], + [-108.75686, 39.14927], + [-108.79422, 39.14972], + [-108.79393, 39.16386], + [-108.83224, 39.16432], + [-108.83196, 39.17845], + [-108.85061, 39.17868], + [-108.85033, 39.19302], + [-108.86938, 39.19325], + [-108.86906, 39.20925], + [-108.90237, 39.20965], + [-108.90208, 39.22384], + [-108.93946, 39.22429], + [-108.93915, 39.23931] + ] + ], + "terms_url": "http://gis.mesacounty.us/", + "terms_text": "Mesa County GIS", + "icon": "https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png" + }, { "id": "Metropole_Ruhr_RVR-DOP10", "name": "Metropole Ruhr: Luftbilder (10 cm)", @@ -42581,142 +42873,22 @@ "zoomExtent": [0, 15], "polygon": [ [ - [120.45706, 26.39706], - [120.44256, 26.3708], - [120.44713, 26.35315], - [120.4673, 26.34058], - [120.49787, 26.33409], - [120.5141, 26.34016], - [120.53412, 26.36416], - [120.5297, 26.38421], - [120.49567, 26.40158], - [120.45706, 26.39706] - ], - [ - [119.90072, 25.98586], - [119.89601, 25.96489], - [119.91313, 25.94704], - [119.95035, 25.92785], - [119.99056, 25.92606], - [120.01984, 25.93633], - [120.02778, 25.95574], - [120.02753, 25.98452], - [119.99899, 26.00103], - [119.94043, 26.00281], - [119.90072, 25.98586] - ], - [ - [122.089, 24.5485], - [121.709, 23.4541], - [121.717, 22.698], - [121.818, 21.95], - [121.803, 21.8735], - [121.759, 21.8087], - [121.694, 21.7653], - [120.861, 21.5631], - [120.815, 21.5576], - [120.739, 21.5728], - [120.661, 21.6296], - [120.202, 22.1809], - [119.27, 23.0542], - [119.153, 23.2049], - [119.128, 23.2485], - [119.103, 23.4], - [119.118, 23.4765], - [119.137, 23.512], - [119.361, 23.8885], - [119.406, 23.9407], - [120.968, 25.2284], - [121.408, 25.4687], - [121.989, 25.8147], - [122.065, 25.8299], - [122.141, 25.8147], - [122.216, 25.7663], - [122.26, 25.7015], - [122.297, 25.48], - [122.196, 24.9696], - [122.089, 24.5485] - ], - [ - [116.6855, 20.85476], - [116.63091, 20.81496], - [116.59417, 20.76008], - [116.57972, 20.69675], - [116.58931, 20.63259], - [116.62177, 20.57534], - [116.67319, 20.53192], - [116.73737, 20.50758], - [116.80657, 20.50527], - [116.87244, 20.52526], - [116.92703, 20.56514], - [116.96377, 20.62008], - [116.97822, 20.68345], - [116.96863, 20.74759], - [116.93617, 20.80477], - [116.88475, 20.84811], - [116.82057, 20.8724], - [116.75137, 20.87471], - [116.6855, 20.85476] - ], - [ - [118.22615, 24.45633], - [118.29364, 24.45385], - [118.28515, 24.4751], - [118.30974, 24.49168], - [118.37677, 24.47293], - [118.41009, 24.53323], - [118.4479, 24.52841], - [118.47464, 24.45993], - [118.51299, 24.43155], - [118.50658, 24.42023], - [118.48116, 24.43324], - [118.46106, 24.40892], - [118.42615, 24.39704], - [118.39701, 24.42842], - [118.37656, 24.42584], - [118.33976, 24.38146], - [118.30319, 24.37058], - [118.25742, 24.41392], - [118.13813, 24.37248], - [118.16173, 24.40224], - [118.20942, 24.41396], - [118.18958, 24.43522], - [118.21763, 24.43021], - [118.22615, 24.45633] - ], - [ - [120.22345, 26.30045], - [120.25508, 26.31004], - [120.26989, 26.33687], - [120.25919, 26.36522], - [120.22925, 26.37848], - [120.19762, 26.3689], - [120.18282, 26.34207], - [120.19352, 26.31372], - [120.22345, 26.30045] - ], - [ - [119.43745, 25.00475], - [119.4342, 24.98862], - [119.45419, 24.97226], - [119.48274, 24.97184], - [119.48984, 24.99379], - [119.47159, 25.00692], - [119.43745, 25.00475] - ], - [ - [119.88699, 26.18038], - [119.89323, 26.12031], - [119.92851, 26.10802], - [119.97794, 26.12236], - [120.03668, 26.15173], - [120.10981, 26.21349], - [120.11927, 26.27137], - [120.06292, 26.31726], - [119.99237, 26.31649], - [119.94677, 26.28988], - [119.90204, 26.24398], - [119.88699, 26.18038] + [121.2237, 25.76997], + [122.2251, 26.60305], + [122.9312, 22.57058], + [120.6771, 20.72799], + [118.2509, 23.26265], + [118.3036, 23.30751], + [118.1978, 24.34453], + [118.1036, 24.36172], + [118.2283, 24.49486], + [118.4416, 24.55302], + [118.6024, 24.46068], + [120.0474, 25.38843], + [119.8935, 25.78169], + [119.787, 26.2048], + [120.4578, 26.53253], + [121.2237, 25.76997] ] ], "terms_url": "https://maps.nlsc.gov.tw", @@ -46367,7 +46539,7 @@ "id": "OS-OpenData_Locator", "name": "OS OpenData Locator", "type": "tms", - "template": "https://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png", + "template": "http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png", "zoomExtent": [0, 22], "polygon": [ [ @@ -49222,7 +49394,7 @@ "id": "e-mapa.net-buildings", "name": "polska.e-mapa.net: Buildings", "type": "wms", - "template": "http://wms.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "template": "http://wms02.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", "zoomExtent": [0, 19], "polygon": [ @@ -51265,8 +51437,8 @@ "name": "San Juan Metro Area: 2013 USACE Orthophotos", "type": "tms", "template": "http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg", - "endDate": "2013-01-01T00:00:00.000Z", - "startDate": "2013-01-01T00:00:00.000Z", + "endDate": "2013-03-15T00:00:00.000Z", + "startDate": "2013-03-13T00:00:00.000Z", "zoomExtent": [0, 20], "polygon": [ [ @@ -53674,7 +53846,7 @@ "id": "SIGIP-2012", "name": "SIGIP - Orthophoto 2012", "type": "tms", - "template": "https://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png", + "template": "http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png", "endDate": "2012-01-01T00:00:00.000Z", "startDate": "2012-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -58509,142 +58681,22 @@ "zoomExtent": [0, 15], "polygon": [ [ - [120.45706, 26.39706], - [120.44256, 26.3708], - [120.44713, 26.35315], - [120.4673, 26.34058], - [120.49787, 26.33409], - [120.5141, 26.34016], - [120.53412, 26.36416], - [120.5297, 26.38421], - [120.49567, 26.40158], - [120.45706, 26.39706] - ], - [ - [119.90072, 25.98586], - [119.89601, 25.96489], - [119.91313, 25.94704], - [119.95035, 25.92785], - [119.99056, 25.92606], - [120.01984, 25.93633], - [120.02778, 25.95574], - [120.02753, 25.98452], - [119.99899, 26.00103], - [119.94043, 26.00281], - [119.90072, 25.98586] - ], - [ - [122.089, 24.5485], - [121.709, 23.4541], - [121.717, 22.698], - [121.818, 21.95], - [121.803, 21.8735], - [121.759, 21.8087], - [121.694, 21.7653], - [120.861, 21.5631], - [120.815, 21.5576], - [120.739, 21.5728], - [120.661, 21.6296], - [120.202, 22.1809], - [119.27, 23.0542], - [119.153, 23.2049], - [119.128, 23.2485], - [119.103, 23.4], - [119.118, 23.4765], - [119.137, 23.512], - [119.361, 23.8885], - [119.406, 23.9407], - [120.968, 25.2284], - [121.408, 25.4687], - [121.989, 25.8147], - [122.065, 25.8299], - [122.141, 25.8147], - [122.216, 25.7663], - [122.26, 25.7015], - [122.297, 25.48], - [122.196, 24.9696], - [122.089, 24.5485] - ], - [ - [116.6855, 20.85476], - [116.63091, 20.81496], - [116.59417, 20.76008], - [116.57972, 20.69675], - [116.58931, 20.63259], - [116.62177, 20.57534], - [116.67319, 20.53192], - [116.73737, 20.50758], - [116.80657, 20.50527], - [116.87244, 20.52526], - [116.92703, 20.56514], - [116.96377, 20.62008], - [116.97822, 20.68345], - [116.96863, 20.74759], - [116.93617, 20.80477], - [116.88475, 20.84811], - [116.82057, 20.8724], - [116.75137, 20.87471], - [116.6855, 20.85476] - ], - [ - [118.22615, 24.45633], - [118.29364, 24.45385], - [118.28515, 24.4751], - [118.30974, 24.49168], - [118.37677, 24.47293], - [118.41009, 24.53323], - [118.4479, 24.52841], - [118.47464, 24.45993], - [118.51299, 24.43155], - [118.50658, 24.42023], - [118.48116, 24.43324], - [118.46106, 24.40892], - [118.42615, 24.39704], - [118.39701, 24.42842], - [118.37656, 24.42584], - [118.33976, 24.38146], - [118.30319, 24.37058], - [118.25742, 24.41392], - [118.13813, 24.37248], - [118.16173, 24.40224], - [118.20942, 24.41396], - [118.18958, 24.43522], - [118.21763, 24.43021], - [118.22615, 24.45633] - ], - [ - [120.22345, 26.30045], - [120.25508, 26.31004], - [120.26989, 26.33687], - [120.25919, 26.36522], - [120.22925, 26.37848], - [120.19762, 26.3689], - [120.18282, 26.34207], - [120.19352, 26.31372], - [120.22345, 26.30045] - ], - [ - [119.43745, 25.00475], - [119.4342, 24.98862], - [119.45419, 24.97226], - [119.48274, 24.97184], - [119.48984, 24.99379], - [119.47159, 25.00692], - [119.43745, 25.00475] - ], - [ - [119.88699, 26.18038], - [119.89323, 26.12031], - [119.92851, 26.10802], - [119.97794, 26.12236], - [120.03668, 26.15173], - [120.10981, 26.21349], - [120.11927, 26.27137], - [120.06292, 26.31726], - [119.99237, 26.31649], - [119.94677, 26.28988], - [119.90204, 26.24398], - [119.88699, 26.18038] + [121.2237, 25.76997], + [122.2251, 26.60305], + [122.9312, 22.57058], + [120.6771, 20.72799], + [118.2509, 23.26265], + [118.3036, 23.30751], + [118.1978, 24.34453], + [118.1036, 24.36172], + [118.2283, 24.49486], + [118.4416, 24.55302], + [118.6024, 24.46068], + [120.0474, 25.38843], + [119.8935, 25.78169], + [119.787, 26.2048], + [120.4578, 26.53253], + [121.2237, 25.76997] ] ], "terms_url": "https://maps.nlsc.gov.tw/", @@ -58655,146 +58707,26 @@ "id": "TW_NLSC_WMS_LANDSECT", "name": "Taiwan Land-Section Data", "type": "wms", - "template": "https://maps.nlsc.gov.tw/S_Maps/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "template": "https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", "polygon": [ [ - [120.45706, 26.39706], - [120.44256, 26.3708], - [120.44713, 26.35315], - [120.4673, 26.34058], - [120.49787, 26.33409], - [120.5141, 26.34016], - [120.53412, 26.36416], - [120.5297, 26.38421], - [120.49567, 26.40158], - [120.45706, 26.39706] - ], - [ - [119.90072, 25.98586], - [119.89601, 25.96489], - [119.91313, 25.94704], - [119.95035, 25.92785], - [119.99056, 25.92606], - [120.01984, 25.93633], - [120.02778, 25.95574], - [120.02753, 25.98452], - [119.99899, 26.00103], - [119.94043, 26.00281], - [119.90072, 25.98586] - ], - [ - [122.089, 24.5485], - [121.709, 23.4541], - [121.717, 22.698], - [121.818, 21.95], - [121.803, 21.8735], - [121.759, 21.8087], - [121.694, 21.7653], - [120.861, 21.5631], - [120.815, 21.5576], - [120.739, 21.5728], - [120.661, 21.6296], - [120.202, 22.1809], - [119.27, 23.0542], - [119.153, 23.2049], - [119.128, 23.2485], - [119.103, 23.4], - [119.118, 23.4765], - [119.137, 23.512], - [119.361, 23.8885], - [119.406, 23.9407], - [120.968, 25.2284], - [121.408, 25.4687], - [121.989, 25.8147], - [122.065, 25.8299], - [122.141, 25.8147], - [122.216, 25.7663], - [122.26, 25.7015], - [122.297, 25.48], - [122.196, 24.9696], - [122.089, 24.5485] - ], - [ - [116.6855, 20.85476], - [116.63091, 20.81496], - [116.59417, 20.76008], - [116.57972, 20.69675], - [116.58931, 20.63259], - [116.62177, 20.57534], - [116.67319, 20.53192], - [116.73737, 20.50758], - [116.80657, 20.50527], - [116.87244, 20.52526], - [116.92703, 20.56514], - [116.96377, 20.62008], - [116.97822, 20.68345], - [116.96863, 20.74759], - [116.93617, 20.80477], - [116.88475, 20.84811], - [116.82057, 20.8724], - [116.75137, 20.87471], - [116.6855, 20.85476] - ], - [ - [118.22615, 24.45633], - [118.29364, 24.45385], - [118.28515, 24.4751], - [118.30974, 24.49168], - [118.37677, 24.47293], - [118.41009, 24.53323], - [118.4479, 24.52841], - [118.47464, 24.45993], - [118.51299, 24.43155], - [118.50658, 24.42023], - [118.48116, 24.43324], - [118.46106, 24.40892], - [118.42615, 24.39704], - [118.39701, 24.42842], - [118.37656, 24.42584], - [118.33976, 24.38146], - [118.30319, 24.37058], - [118.25742, 24.41392], - [118.13813, 24.37248], - [118.16173, 24.40224], - [118.20942, 24.41396], - [118.18958, 24.43522], - [118.21763, 24.43021], - [118.22615, 24.45633] - ], - [ - [120.22345, 26.30045], - [120.25508, 26.31004], - [120.26989, 26.33687], - [120.25919, 26.36522], - [120.22925, 26.37848], - [120.19762, 26.3689], - [120.18282, 26.34207], - [120.19352, 26.31372], - [120.22345, 26.30045] - ], - [ - [119.43745, 25.00475], - [119.4342, 24.98862], - [119.45419, 24.97226], - [119.48274, 24.97184], - [119.48984, 24.99379], - [119.47159, 25.00692], - [119.43745, 25.00475] - ], - [ - [119.88699, 26.18038], - [119.89323, 26.12031], - [119.92851, 26.10802], - [119.97794, 26.12236], - [120.03668, 26.15173], - [120.10981, 26.21349], - [120.11927, 26.27137], - [120.06292, 26.31726], - [119.99237, 26.31649], - [119.94677, 26.28988], - [119.90204, 26.24398], - [119.88699, 26.18038] + [121.2237, 25.76997], + [122.2251, 26.60305], + [122.9312, 22.57058], + [120.6771, 20.72799], + [118.2509, 23.26265], + [118.3036, 23.30751], + [118.1978, 24.34453], + [118.1036, 24.36172], + [118.2283, 24.49486], + [118.4416, 24.55302], + [118.6024, 24.46068], + [120.0474, 25.38843], + [119.8935, 25.78169], + [119.787, 26.2048], + [120.4578, 26.53253], + [121.2237, 25.76997] ] ], "terms_url": "https://maps.nlsc.gov.tw/", @@ -58805,146 +58737,26 @@ "id": "TW_NLSC_WMS_Village", "name": "Taiwan Village Boundaries", "type": "wms", - "template": "https://maps.nlsc.gov.tw/S_Maps/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", + "template": "https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}", "projection": "EPSG:3857", "polygon": [ [ - [120.45706, 26.39706], - [120.44256, 26.3708], - [120.44713, 26.35315], - [120.4673, 26.34058], - [120.49787, 26.33409], - [120.5141, 26.34016], - [120.53412, 26.36416], - [120.5297, 26.38421], - [120.49567, 26.40158], - [120.45706, 26.39706] - ], - [ - [119.90072, 25.98586], - [119.89601, 25.96489], - [119.91313, 25.94704], - [119.95035, 25.92785], - [119.99056, 25.92606], - [120.01984, 25.93633], - [120.02778, 25.95574], - [120.02753, 25.98452], - [119.99899, 26.00103], - [119.94043, 26.00281], - [119.90072, 25.98586] - ], - [ - [122.089, 24.5485], - [121.709, 23.4541], - [121.717, 22.698], - [121.818, 21.95], - [121.803, 21.8735], - [121.759, 21.8087], - [121.694, 21.7653], - [120.861, 21.5631], - [120.815, 21.5576], - [120.739, 21.5728], - [120.661, 21.6296], - [120.202, 22.1809], - [119.27, 23.0542], - [119.153, 23.2049], - [119.128, 23.2485], - [119.103, 23.4], - [119.118, 23.4765], - [119.137, 23.512], - [119.361, 23.8885], - [119.406, 23.9407], - [120.968, 25.2284], - [121.408, 25.4687], - [121.989, 25.8147], - [122.065, 25.8299], - [122.141, 25.8147], - [122.216, 25.7663], - [122.26, 25.7015], - [122.297, 25.48], - [122.196, 24.9696], - [122.089, 24.5485] - ], - [ - [116.6855, 20.85476], - [116.63091, 20.81496], - [116.59417, 20.76008], - [116.57972, 20.69675], - [116.58931, 20.63259], - [116.62177, 20.57534], - [116.67319, 20.53192], - [116.73737, 20.50758], - [116.80657, 20.50527], - [116.87244, 20.52526], - [116.92703, 20.56514], - [116.96377, 20.62008], - [116.97822, 20.68345], - [116.96863, 20.74759], - [116.93617, 20.80477], - [116.88475, 20.84811], - [116.82057, 20.8724], - [116.75137, 20.87471], - [116.6855, 20.85476] - ], - [ - [118.22615, 24.45633], - [118.29364, 24.45385], - [118.28515, 24.4751], - [118.30974, 24.49168], - [118.37677, 24.47293], - [118.41009, 24.53323], - [118.4479, 24.52841], - [118.47464, 24.45993], - [118.51299, 24.43155], - [118.50658, 24.42023], - [118.48116, 24.43324], - [118.46106, 24.40892], - [118.42615, 24.39704], - [118.39701, 24.42842], - [118.37656, 24.42584], - [118.33976, 24.38146], - [118.30319, 24.37058], - [118.25742, 24.41392], - [118.13813, 24.37248], - [118.16173, 24.40224], - [118.20942, 24.41396], - [118.18958, 24.43522], - [118.21763, 24.43021], - [118.22615, 24.45633] - ], - [ - [120.22345, 26.30045], - [120.25508, 26.31004], - [120.26989, 26.33687], - [120.25919, 26.36522], - [120.22925, 26.37848], - [120.19762, 26.3689], - [120.18282, 26.34207], - [120.19352, 26.31372], - [120.22345, 26.30045] - ], - [ - [119.43745, 25.00475], - [119.4342, 24.98862], - [119.45419, 24.97226], - [119.48274, 24.97184], - [119.48984, 24.99379], - [119.47159, 25.00692], - [119.43745, 25.00475] - ], - [ - [119.88699, 26.18038], - [119.89323, 26.12031], - [119.92851, 26.10802], - [119.97794, 26.12236], - [120.03668, 26.15173], - [120.10981, 26.21349], - [120.11927, 26.27137], - [120.06292, 26.31726], - [119.99237, 26.31649], - [119.94677, 26.28988], - [119.90204, 26.24398], - [119.88699, 26.18038] + [121.2237, 25.76997], + [122.2251, 26.60305], + [122.9312, 22.57058], + [120.6771, 20.72799], + [118.2509, 23.26265], + [118.3036, 23.30751], + [118.1978, 24.34453], + [118.1036, 24.36172], + [118.2283, 24.49486], + [118.4416, 24.55302], + [118.6024, 24.46068], + [120.0474, 25.38843], + [119.8935, 25.78169], + [119.787, 26.2048], + [120.4578, 26.53253], + [121.2237, 25.76997] ] ], "terms_url": "https://maps.nlsc.gov.tw/", @@ -64979,7 +64791,7 @@ "id": "Ville_de_Nyon-HD-2010", "name": "Ville de Nyon - Orthophoto 2010 HD 5cm/pi", "type": "tms", - "template": "https://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png", + "template": "http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png", "endDate": "2010-01-01T00:00:00.000Z", "startDate": "2010-01-01T00:00:00.000Z", "zoomExtent": [14, 20], @@ -65036,6 +64848,287 @@ "terms_url": "http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911", "terms_text": "Ville de Nyon" }, + { + "id": "VGIN-BuildingFootprints_WM", + "name": "Virginia Building Footprint Map Service", + "type": "tms", + "template": "https://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Building_Footprints/MapServer/tile/{zoom}/{y}/{x}", + "endDate": "2018-06-01T00:00:00.000Z", + "startDate": "2015-05-01T00:00:00.000Z", + "zoomExtent": [0, 20], + "polygon": [ + [ + [-83.64853, 36.6023], + [-79.9118, 36.55819], + [-75.90179, 36.56701], + [-75.8606, 36.985], + [-75.19867, 38.0178], + [-76.15448, 37.99183], + [-76.25336, 37.92253], + [-76.62689, 38.1648], + [-76.90704, 38.22524], + [-77.05536, 38.42132], + [-77.19818, 38.37396], + [-77.28333, 38.3675], + [-77.31628, 38.45789], + [-77.25586, 38.58253], + [-77.15698, 38.61043], + [-77.11853, 38.68337], + [-77.0636, 38.69409], + [-77.05811, 38.82259], + [-77.07458, 38.88462], + [-77.20367, 38.99357], + [-77.3822, 39.07038], + [-77.47833, 39.09809], + [-77.53876, 39.16627], + [-77.4646, 39.23651], + [-77.59918, 39.30455], + [-77.74475, 39.33005], + [-77.84637, 39.14284], + [-78.36273, 39.45528], + [-78.3847, 39.36616], + [-78.36548, 39.32792], + [-78.4671, 39.19182], + [-78.60168, 39.03199], + [-78.69232, 38.94659], + [-78.89282, 38.76479], + [-78.99719, 38.8504], + [-79.13727, 38.68551], + [-79.31854, 38.42993], + [-79.5108, 38.46004], + [-79.56299, 38.54817], + [-79.65637, 38.58253], + [-79.71954, 38.50519], + [-79.70856, 38.44068], + [-79.94476, 38.16911], + [-80.00519, 38.0243], + [-80.21942, 37.83148], + [-80.32379, 37.67513], + [-80.22766, 37.62511], + [-80.36224, 37.56417], + [-80.32928, 37.52498], + [-80.49408, 37.42907], + [-80.53253, 37.48794], + [-80.78522, 37.37889], + [-80.86487, 37.43561], + [-80.9198, 37.39635], + [-80.88135, 37.36143], + [-81.02692, 37.28935], + [-81.26038, 37.25219], + [-81.37024, 37.34396], + [-81.47736, 37.26312], + [-81.55426, 37.22595], + [-81.71906, 37.20189], + [-81.98273, 37.42689], + [-81.96899, 37.55329], + [-82.40845, 37.26531], + [-82.74078, 37.13186], + [-82.73529, 37.05299], + [-82.90283, 36.985], + [-82.87811, 36.90818], + [-83.02643, 36.85765], + [-83.07587, 36.85765], + [-83.16101, 36.74989], + [-83.44666, 36.69265], + [-83.61145, 36.64418], + [-83.63892, 36.63592], + [-83.69385, 36.61222], + [-83.70003, 36.6023], + [-83.64853, 36.6023] + ] + ], + "terms_url": "https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339", + "terms_text": "Virginia Geographic Information Network (VGIN)", + "description": "Virginia Building Footprint Map Service", + "overlay": true + }, + { + "id": "VGIN-Imagery_WM", + "name": "Virginia Imagery Service - Most Recent, WGS Web Mercator (VBMP)", + "type": "tms", + "template": "https://gismaps.vita.virginia.gov/arcgis/rest/services/MostRecentImagery/MostRecentImagery_WGS/MapServer/tile/{zoom}/{y}/{x}", + "endDate": "2018-08-01T00:00:00.000Z", + "startDate": "2013-04-01T00:00:00.000Z", + "zoomExtent": [0, 20], + "polygon": [ + [ + [-83.64853, 36.6023], + [-79.9118, 36.55819], + [-75.90179, 36.56701], + [-75.8606, 36.985], + [-75.19867, 38.0178], + [-76.15448, 37.99183], + [-76.25336, 37.92253], + [-76.62689, 38.1648], + [-76.90704, 38.22524], + [-77.05536, 38.42132], + [-77.19818, 38.37396], + [-77.28333, 38.3675], + [-77.31628, 38.45789], + [-77.25586, 38.58253], + [-77.15698, 38.61043], + [-77.11853, 38.68337], + [-77.0636, 38.69409], + [-77.05811, 38.82259], + [-77.07458, 38.88462], + [-77.20367, 38.99357], + [-77.3822, 39.07038], + [-77.47833, 39.09809], + [-77.53876, 39.16627], + [-77.4646, 39.23651], + [-77.59918, 39.30455], + [-77.74475, 39.33005], + [-77.84637, 39.14284], + [-78.36273, 39.45528], + [-78.3847, 39.36616], + [-78.36548, 39.32792], + [-78.4671, 39.19182], + [-78.60168, 39.03199], + [-78.69232, 38.94659], + [-78.89282, 38.76479], + [-78.99719, 38.8504], + [-79.13727, 38.68551], + [-79.31854, 38.42993], + [-79.5108, 38.46004], + [-79.56299, 38.54817], + [-79.65637, 38.58253], + [-79.71954, 38.50519], + [-79.70856, 38.44068], + [-79.94476, 38.16911], + [-80.00519, 38.0243], + [-80.21942, 37.83148], + [-80.32379, 37.67513], + [-80.22766, 37.62511], + [-80.36224, 37.56417], + [-80.32928, 37.52498], + [-80.49408, 37.42907], + [-80.53253, 37.48794], + [-80.78522, 37.37889], + [-80.86487, 37.43561], + [-80.9198, 37.39635], + [-80.88135, 37.36143], + [-81.02692, 37.28935], + [-81.26038, 37.25219], + [-81.37024, 37.34396], + [-81.47736, 37.26312], + [-81.55426, 37.22595], + [-81.71906, 37.20189], + [-81.98273, 37.42689], + [-81.96899, 37.55329], + [-82.40845, 37.26531], + [-82.74078, 37.13186], + [-82.73529, 37.05299], + [-82.90283, 36.985], + [-82.87811, 36.90818], + [-83.02643, 36.85765], + [-83.07587, 36.85765], + [-83.16101, 36.74989], + [-83.44666, 36.69265], + [-83.61145, 36.64418], + [-83.63892, 36.63592], + [-83.69385, 36.61222], + [-83.70003, 36.6023], + [-83.64853, 36.6023] + ] + ], + "terms_url": "https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1", + "terms_text": "Virginia Geographic Information Network (VGIN)", + "description": "The most recently available VBMP orthoimagery for all of Virginia." + }, + { + "id": "VGIN-PropertyLines_WM", + "name": "Virginia Tax Parcels Map Service", + "type": "tms", + "template": "https://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Parcels/MapServer/tile/{zoom}/{y}/{x}", + "endDate": "2018-06-01T00:00:00.000Z", + "startDate": "2015-05-01T00:00:00.000Z", + "zoomExtent": [0, 20], + "polygon": [ + [ + [-83.64853, 36.6023], + [-79.9118, 36.55819], + [-75.90179, 36.56701], + [-75.8606, 36.985], + [-75.19867, 38.0178], + [-76.15448, 37.99183], + [-76.25336, 37.92253], + [-76.62689, 38.1648], + [-76.90704, 38.22524], + [-77.05536, 38.42132], + [-77.19818, 38.37396], + [-77.28333, 38.3675], + [-77.31628, 38.45789], + [-77.25586, 38.58253], + [-77.15698, 38.61043], + [-77.11853, 38.68337], + [-77.0636, 38.69409], + [-77.05811, 38.82259], + [-77.07458, 38.88462], + [-77.20367, 38.99357], + [-77.3822, 39.07038], + [-77.47833, 39.09809], + [-77.53876, 39.16627], + [-77.4646, 39.23651], + [-77.59918, 39.30455], + [-77.74475, 39.33005], + [-77.84637, 39.14284], + [-78.36273, 39.45528], + [-78.3847, 39.36616], + [-78.36548, 39.32792], + [-78.4671, 39.19182], + [-78.60168, 39.03199], + [-78.69232, 38.94659], + [-78.89282, 38.76479], + [-78.99719, 38.8504], + [-79.13727, 38.68551], + [-79.31854, 38.42993], + [-79.5108, 38.46004], + [-79.56299, 38.54817], + [-79.65637, 38.58253], + [-79.71954, 38.50519], + [-79.70856, 38.44068], + [-79.94476, 38.16911], + [-80.00519, 38.0243], + [-80.21942, 37.83148], + [-80.32379, 37.67513], + [-80.22766, 37.62511], + [-80.36224, 37.56417], + [-80.32928, 37.52498], + [-80.49408, 37.42907], + [-80.53253, 37.48794], + [-80.78522, 37.37889], + [-80.86487, 37.43561], + [-80.9198, 37.39635], + [-80.88135, 37.36143], + [-81.02692, 37.28935], + [-81.26038, 37.25219], + [-81.37024, 37.34396], + [-81.47736, 37.26312], + [-81.55426, 37.22595], + [-81.71906, 37.20189], + [-81.98273, 37.42689], + [-81.96899, 37.55329], + [-82.40845, 37.26531], + [-82.74078, 37.13186], + [-82.73529, 37.05299], + [-82.90283, 36.985], + [-82.87811, 36.90818], + [-83.02643, 36.85765], + [-83.07587, 36.85765], + [-83.16101, 36.74989], + [-83.44666, 36.69265], + [-83.61145, 36.64418], + [-83.63892, 36.63592], + [-83.69385, 36.61222], + [-83.70003, 36.6023], + [-83.64853, 36.6023] + ] + ], + "terms_url": "https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690", + "terms_text": "Virginia Geographic Information Network (VGIN)", + "description": "A statewide Parcel service showing property ownership outlines where available", + "overlay": true + }, { "id": "vogis.cnv.at-DGM", "name": "VoGIS: DGM (Terrain model)", @@ -65295,7 +65388,7 @@ [9.96805, 47.54631] ] ], - "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65558,7 +65651,7 @@ [9.96805, 47.54631] ] ], - "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65604,7 +65697,7 @@ [9.54367, 47.48479] ] ], - "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65650,7 +65743,7 @@ [9.54367, 47.48479] ] ], - "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, @@ -65730,7 +65823,7 @@ [10.17039, 46.82979] ] ], - "terms_url": "https://www.vorarlberg.atvorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", + "terms_url": "https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm", "terms_text": "Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at", "icon": "https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png" }, diff --git a/dist/locales/en.json b/dist/locales/en.json index 6c8156086..4b8c46cb2 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -6974,14 +6974,14 @@ "attribution": { "text": "© Lantmäteriet, CC0" }, - "description": "Mosaic of Swedish orthophotos from the period 1949-1970.", + "description": "Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.", "name": "Lantmäteriet Historic Orthophoto 1960" }, "lantmateriet-orto1975": { "attribution": { "text": "© Lantmäteriet, CC0" }, - "description": "Mosaic of Swedish orthophotos from the period 1970-1980. To be expanded.", + "description": "Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.", "name": "Lantmäteriet Historic Orthophoto 1975" }, "mapbox_locator_overlay": { @@ -7020,8 +7020,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Scan of ´Economic maps´ ca 1950-1980", - "name": "Lantmäteriet Economic Map ca 1950-1980" + "description": "Scan of \"Economic maps\" ca. 1950–1980", + "name": "Lantmäteriet Economic Map 1950–1980" }, "qa_no_address": { "attribution": { From f6104c2f604d14f2f17c98197768b3199f4e862d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 26 Aug 2018 02:17:11 -0400 Subject: [PATCH 168/217] npm run translations --- data/locales.json | 1 + dist/locales/af.json | 7 - dist/locales/ar.json | 19 +- dist/locales/ast.json | 17 - dist/locales/bg.json | 14 - dist/locales/bn.json | 8 - dist/locales/bs.json | 6 - dist/locales/ca.json | 268 +++++++-- dist/locales/cs.json | 276 +++++++-- dist/locales/cy.json | 5 - dist/locales/da.json | 35 +- dist/locales/de.json | 266 +++++--- dist/locales/el.json | 56 +- dist/locales/en-AU.json | 17 + dist/locales/en-GB.json | 17 - dist/locales/eo.json | 331 +++++++++- dist/locales/es.json | 215 +++++-- dist/locales/et.json | 24 - dist/locales/fa.json | 14 - dist/locales/fi.json | 384 ++++++++---- dist/locales/fr.json | 153 +++-- dist/locales/gl.json | 50 +- dist/locales/he.json | 116 +++- dist/locales/hr.json | 386 ++++++++++-- dist/locales/hu.json | 87 ++- dist/locales/hy.json | 8 - dist/locales/id.json | 10 - dist/locales/is.json | 28 +- dist/locales/it.json | 137 ++++- dist/locales/ja.json | 220 +++++-- dist/locales/kn.json | 5 - dist/locales/ko.json | 83 ++- dist/locales/lt.json | 13 - dist/locales/lv.json | 1085 +++++++++++++++++++++++++++++---- dist/locales/mg.json | 44 +- dist/locales/mk.json | 11 - dist/locales/ms.json | 10 - dist/locales/nl.json | 410 +++++++++++-- dist/locales/nn.json | 1 - dist/locales/no.json | 12 - dist/locales/pl.json | 1272 +++++++++++++++++++++++++++++++++------ dist/locales/pt-BR.json | 548 ++++++++++++++--- dist/locales/pt.json | 178 +++++- dist/locales/ro.json | 81 ++- dist/locales/ru.json | 94 ++- dist/locales/si.json | 1 - dist/locales/sk.json | 17 - dist/locales/sl.json | 168 +++++- dist/locales/sq.json | 23 +- dist/locales/sr.json | 13 - dist/locales/sv.json | 240 +++++--- dist/locales/ta.json | 1 - dist/locales/th.json | 7 - dist/locales/tl.json | 8 - dist/locales/tr.json | 21 - dist/locales/uk.json | 291 ++++++++- dist/locales/vi.json | 108 +++- dist/locales/yue.json | 8 - dist/locales/zh-CN.json | 86 +-- dist/locales/zh-HK.json | 17 - dist/locales/zh-TW.json | 250 +++++++- dist/locales/zh.json | 6 - 62 files changed, 6550 insertions(+), 1737 deletions(-) create mode 100644 dist/locales/en-AU.json diff --git a/data/locales.json b/data/locales.json index 52d27a861..9195f329e 100644 --- a/data/locales.json +++ b/data/locales.json @@ -16,6 +16,7 @@ "de": {"rtl": false}, "dv": {"rtl": true}, "el": {"rtl": false}, + "en-AU": {"rtl": false}, "en-GB": {"rtl": false}, "eo": {"rtl": false}, "es": {"rtl": false}, diff --git a/dist/locales/af.json b/dist/locales/af.json index 40c3c6c4b..c9dbb6c00 100644 --- a/dist/locales/af.json +++ b/dist/locales/af.json @@ -233,22 +233,15 @@ "access": { "options": { "designated": { - "description": "Voorgeskrewe toegang", "title": "Toegewys" }, "destination": { - "description": "Beperkte toegang", "title": "Eindbestemming" }, "no": { - "description": "Geen toegang vir algemene publiek", "title": "Toegang Verbode" }, - "permissive": { - "description": "Voorwaardelike toegang" - }, "private": { - "description": "Toegang slegs soos gereël met eienaar", "title": "Privaat" }, "yes": { diff --git a/dist/locales/ar.json b/dist/locales/ar.json index bdefab341..07aaa21f3 100644 --- a/dist/locales/ar.json +++ b/dist/locales/ar.json @@ -467,7 +467,6 @@ "best_imagery": "أفضل مصدر صور معروف لهذه المنطقة", "switch": "رجوع إلى هذه الخلفية.", "custom": "مخصص", - "custom_button": "تحرير خلفية مخصصة", "overlays": "التراكبات", "imagery_source_faq": "معلومات الصور / الإبلاغ عن مشكلة", "reset": "إعادة الضبط", @@ -664,11 +663,6 @@ }, "cannot_zoom": "لايمكن التصغير أكثر من ذلك في الوضع الحالي.", "full_screen": "التبديل إلى وضع ملء الشاشة", - "gpx": { - "drag_drop": "اسحب وأفلت ملفات gpx. أو geojson. أو kml. في الصفحة، أو انقر على الزر في اليمين للتصفح واختيار ملف", - "zoom": "تكبير إلى الطبقة", - "browse": "تصفح لاختيار ملف" - }, "streetside": { "tooltip": "صور الشوراع من ميكروسوفت", "title": "طبقات الصور (Bing Streetside)", @@ -771,7 +765,13 @@ "add_line_draw": "ثم، ضع مؤشر الفأرة حيث ينبغي أن يبدأ رسم الخط وانقر على الزر الأيسر {leftclick} أو اضغط على مفتاح المسافة `Space` لبدء وضع العُقد على طول الخط. استمر بوضع المزيد من العُقد عن طريق الضغط على مفتاح المسافة `Space`. أثناء الرسم يمكنك تكبير الخريطة وتصغيرها كما يمكنك سحب الخريطة من أجل إضافة المزيد من التفاصيل.", "add_line_finish": "لإنهاء رسم خط، اضغط على مفتاح الإدخال `{return}` أو انقر مجددا بزرّ الفأرة الأيسر {leftclick} على آخر عقدة للخط.", "modify_line_h": "تعديل الخطوط", + "modify_line_dragnode": "في كثير من الأحيان قد تجد خطوطا مرسومة بشكل غير سليم، على سبيل المثال قد تجد طريقا غير متطابق مع صور الخلفية.\nلتصحيح شكل الخط، اضغط بالزر الأيسر {leftclick} على الخط لاختياره، ستظهر العُقد المكونة للخط المختار كدوائر صغيرة، ثم يمكنك سحب هذه العُقد ونقلها للموضع المطلوب.", + "modify_line_addnode": "يمكنك أيضا إنشاء عُقدة جديدة على أي خط إما بالضغط المزدوج بالزر الأيسر {leftclick} على الخط وفي الموضع المراد إضافة العُقدة عنده، أو عن طريق سحب المثلثات الصغيرة التي تكون موجودة على الخط في منتصف العُقد.", "connect_line_h": "وصل الخطوط", + "connect_line": "وجود طُرق متصلة بشكل سليم مُهم للخريطة وأساسي لتوفير اتجاهات القيادة.", + "connect_line_display": "الروابط بين الطرق تكون مرسومة كدوائر رمادية. ونقاط النهاية للخطوط تكون مرسومة كدوائر بيضاء أكبر قليلا إذا كانت غير متصلة بأي شيء.", + "connect_line_drag": "لربط خط بعنصر آخر، اسحب أحد العُقد المكونة للخط إلى العنصر الآخر حتى يندمج كلا العنصرين معًا.\nتلميح: يمكنك الضغط مع الاستمرار على مفتاح `{alt}` لمنع العُقد من الاندماج بالعناصر الأخرى.", + "connect_line_tag": "إذا كنت تعرف أن رابط طريق ما عبارة عن إشارة مرورية أو مكان عبور مشاة، يمكنك إضافة ذلك إلى الرابط عن طريق الضغط على عُقدة الربط واستخدام محرر العناصر لاختيار نوع العنصر الصحيح.", "disconnect_line_h": "فصل الخطوط", "move_line_h": "تحريك ونقل الخطوط", "delete_line_h": "حذف وإزالة الخطوط" @@ -1201,31 +1201,24 @@ "label": "وصول مسموح", "options": { "designated": { - "description": "الدخول مصرح به وفقا لعلامات أو قوانين محلية مخصصة.", "title": "مخصص" }, "destination": { - "description": "الدخول مسموح به فقط للوصول إلى وجهة معينة", "title": "الوجهة" }, "dismount": { - "description": "الدخول مسموح ولكن على السائق أن يترجل", "title": "مترجل" }, "no": { - "description": "الدخول ليس مسموحا به للعامة", "title": "محظور" }, "permissive": { - "description": "الدخول مسموح به حتى يلغى المالك هذا الترخيص.", "title": "مرخص" }, "private": { - "description": "الدخول مسموح به فقط بإذن من المالك على أساس فردي.", "title": "خاص" }, "yes": { - "description": "الدخول مسموح به بنص القانون، حق الطريق", "title": "مسموح" } }, diff --git a/dist/locales/ast.json b/dist/locales/ast.json index 042fd3d26..a5b9dd38a 100644 --- a/dist/locales/ast.json +++ b/dist/locales/ast.json @@ -457,7 +457,6 @@ "best_imagery": "La meyor fonte d'imáxenes pa esti lugar", "switch": "Volver a esti fondu", "custom": "Personalizáu", - "custom_button": "Editar fondu personalizáu", "reset": "reaniciar", "minimap": { "tooltip": "Amuesa un mapa alloñáu p'ayudar a alcontrar l'área que se ve actualmente.", @@ -616,11 +615,6 @@ }, "cannot_zoom": "Nun puede alloñase más nel mou actual.", "full_screen": "Conmutar pantalla completa", - "gpx": { - "drag_drop": "Abasna y suelta un ficheru .gpx, .geojson o .kml na páxina, o prime nel botón de la drecha pa restolar", - "zoom": "Averar a capa", - "browse": "Buscar un ficheru" - }, "mapillary_images": { "tooltip": "Fotos a nivel de rúa de Mapillary", "title": "Capa de fotos (Mapillary)" @@ -806,31 +800,24 @@ "label": "Accesu permitíu", "options": { "designated": { - "description": "Accesu permitíu acordies con señales o lleis llocales especifiques", "title": "Designáu" }, "destination": { - "description": "Accesu permitíu sólo de pasu a un destín", "title": "Destín" }, "dismount": { - "description": "Accesu permitíu pero tien de desmontar", "title": "Desmontáu" }, "no": { - "description": "Accesu nun permitíu al públicu en xeneral", "title": "Torgáu" }, "permissive": { - "description": "Accesu permitíu mentanto'l propietariu nun quite'l permisu", "title": "Permisivu" }, "private": { - "description": "Accesu permitíu sólo col permisu del propietariu de manera individual", "title": "Priváu" }, "yes": { - "description": "Accesu permitíu por llei; un drechu de pasu", "title": "Permitíu" } }, @@ -2195,10 +2182,6 @@ "amenity/bicycle_repair_station": { "name": "Caballete pa reparar bicicletes" }, - "amenity/biergarten": { - "name": "Cervecería al aire llibre", - "terms": "Biergarten" - }, "amenity/boat_rental": { "name": "Alquiler de barcos", "terms": "Alquiler de veleros, Alquiler de lanches" diff --git a/dist/locales/bg.json b/dist/locales/bg.json index 0b9faa7a9..f58414731 100644 --- a/dist/locales/bg.json +++ b/dist/locales/bg.json @@ -507,8 +507,6 @@ "best_imagery": "Най-известен източник на изображения за това местоположение", "switch": "Превключете обратно на тази базова карта", "custom": "Обичаен", - "custom_button": "Редактирайте персонализираната базова карта", - "custom_prompt": "Въведете URL шаблон за тайлове. Валидни токени са:\n - {zoom} или {z}, {x}, {y} за Z/X/Y тайл схема\n - {-y} или {ty} за обърнати TMS Y координати\n - {u} за куадтайл схема\n - {switch:a,b,c} за DNS сървърно мултиплексиране\n\nПример:\n{example}", "overlays": "Подложки", "imagery_source_faq": "Информация за изображение / Докладвайте проблем", "reset": "презареждане", @@ -707,11 +705,6 @@ }, "cannot_zoom": "Не можете да намалявате повече в текущия режим.", "full_screen": "Превключи на Цял Екран", - "gpx": { - "drag_drop": "Влачете и пуснете .gpx, .geojson или .kml файл в тази страница или кликнете на бутона в дясно, за да разгледате", - "zoom": "Приближете към слоя", - "browse": "Потърсете файл" - }, "mapillary_images": { "tooltip": "Снимки за ниво на улицата от Mapillary", "title": "Фото слой (Mapillary)" @@ -873,31 +866,24 @@ "label": "Разрешен достъп", "options": { "designated": { - "description": "Достъпът позволен според указателни табели или специфични местни разпоредби", "title": "По предназначение" }, "destination": { - "description": "Достъпът разрешен само за достигане до дестинация", "title": "До дестинация" }, "dismount": { - "description": "Достъпът разрешен, но ездачът или колоездачът трябва да е слязъл.", "title": "Слизане" }, "no": { - "description": "Забранен публичният достъп", "title": "Забранен" }, "permissive": { - "description": "Достъпът позволен докато собственика позволява", "title": "Частичен" }, "private": { - "description": "Достъпът разрешен само с позволение на собственика", "title": "Частен" }, "yes": { - "description": "Достъпът позволен с нормативен акт; право на преминаване", "title": "Разрешен" } }, diff --git a/dist/locales/bn.json b/dist/locales/bn.json index 02251cdbf..560c62f28 100644 --- a/dist/locales/bn.json +++ b/dist/locales/bn.json @@ -423,27 +423,19 @@ "fields": { "access": { "options": { - "designated": { - "description": "কোন চিহ্ন বা স্থানীয় অাইন অনুযায়ী প্রবেশ অনুমোদিত" - }, "destination": { - "description": "শুধুমাত্র কোন গন্তব্যে পৌছানোর জন্য প্রবেশ অনুমোদিত", "title": "গন্তব্য" }, "no": { - "description": "জনসাধারনের প্রবেশ অনুমোদিত নয়", "title": "নিষিদ্ধ" }, "permissive": { - "description": "প্রবেশ অনুমোদিত, যতক্ষন অব্দি এর মালিক অনুমতি প্রত্যাহার না করছেন", "title": "অনুমতিসূচক" }, "private": { - "description": "প্রত্যেক ব্যক্তির জন্য মালিকের অনুমতি থাকলে প্রবেশ অনুমোদিত", "title": "একান্ত" }, "yes": { - "description": "অাইনানুসারে প্রবেশ অনুমোদিত", "title": "অনুমোদিত" } }, diff --git a/dist/locales/bs.json b/dist/locales/bs.json index 6f8985f46..d287c05c1 100644 --- a/dist/locales/bs.json +++ b/dist/locales/bs.json @@ -317,27 +317,21 @@ "access": { "options": { "designated": { - "description": "Pristup dozvoljen u skladu sa saobraćajnim znakovima ili posebnim lokalnim zakonima", "title": "Namjenski" }, "destination": { - "description": "Pristup dozvoljen samo kako bi se dostiglo odredište", "title": "Odredište" }, "no": { - "description": "Pristup nije dozvoljen za širu javnost", "title": "Zabranjeno" }, "permissive": { - "description": "Pristup dozvoljen sve dok vlasnik ne povuče dozvolu", "title": "Propustljiv" }, "private": { - "description": "Pristup dozvoljen samo uz dozvolu vlasnika na ličnoj bazi", "title": "Privatan" }, "yes": { - "description": "Pristup dozvoljen zakonom: pravo prvenstva prolaza", "title": "Dozvoljeno" } }, diff --git a/dist/locales/ca.json b/dist/locales/ca.json index 5e429e0d6..8cf3c2dd6 100644 --- a/dist/locales/ca.json +++ b/dist/locales/ca.json @@ -22,6 +22,7 @@ "tail": "Cliqueu al mapa per a afegir un punt." }, "add_note": { + "title": "Nota", "tail": "Cliqueu al mapa per a afegir una nota." }, "browse": { @@ -424,7 +425,10 @@ "edited_by": "Modificat per", "changeset": "Conjunt de modificacions", "unknown": "Desconegut", - "link_text": "Història a openstreetmap.og" + "link_text": "Història a openstreetmap.og", + "note_comments": "Comentaris", + "note_created_user": "Creat per", + "note_link_text": "Nota a openstreetmap.org" }, "location": { "key": "L", @@ -454,7 +458,8 @@ "vertex": "vèrtex", "line": "línia", "area": "àrea", - "relation": "relació" + "relation": "relació", + "note": "nota" }, "geocoder": { "search": "Cerca mundialment...", @@ -517,7 +522,6 @@ "best_imagery": "Font d'imatgeria millor coneguda per a aquesta ubicació", "switch": "Senyals de trànsit ", "custom": "Personalitzar", - "custom_button": "Editar el fons personalitzat", "overlays": "Capes", "imagery_source_faq": "Informació d'imatge / Comunicar un problema", "reset": "reiniciar", @@ -716,15 +720,6 @@ }, "cannot_zoom": "No es pot allunyar més la vista al mode actual.", "full_screen": "Passar a pantalla completa", - "gpx": { - "local_layer": "Afegeix un GPX", - "drag_drop": "Arrossegueu i deixeu anar un fitxer .gpx, .geojon o .kml a la pàgina, o feuclic al botó de la dreta per a ubicar-lo", - "zoom": "Escala a la capa", - "browse": "Navega cap a un fitxer" - }, - "mvt": { - "local_layer": "Afegeix un MVT" - }, "streetside": { "tooltip": "Fotografies a peu de carrer de Microsoft", "hires": "Alta resolució" @@ -750,7 +745,10 @@ "note": { "note": "Nota", "title": "Edita la nota", - "anonymous": "anònim" + "anonymous": "anònim", + "closed": "(tancat)", + "commentTitle": "Comentaris", + "comment": "Comentari" }, "help": { "title": "Ajuda", @@ -1166,31 +1164,24 @@ "label": "Accés permès", "options": { "designated": { - "description": "Accés garantit seguint les normes de les senyals o les normes locals específiques.", "title": "Específic" }, "destination": { - "description": "Accés permès només per arribar a un destí", "title": "Destinació" }, "dismount": { - "description": "Accés permès però el pilot ha de baixar del mitjà ", "title": "Baixar del mitjà de transport" }, "no": { - "description": "No es permet l'accés al públic en general", "title": "Prohibit" }, "permissive": { - "description": "Accés garantit fins que el propietari ho prohibeixi.", "title": "Permissiu" }, "private": { - "description": "Accés permès només amb autorització individualitzada del propietari", "title": "Privat" }, "yes": { - "description": "Accés garantit per llei; us dona dret de pas", "title": "Permès" } }, @@ -1737,6 +1728,9 @@ "undefined": "No" } }, + "horse_scale": { + "placeholder": "Difícil, perillós..." + }, "horse_stables": { "options": { "stables": "Sí", @@ -1985,7 +1979,9 @@ "oneway": { "label": "Sentit únic", "options": { + "alternating": "Alternat", "no": "No", + "reversible": "Reversible", "undefined": "Sobreentès que no", "yes": "Sí" } @@ -1993,7 +1989,9 @@ "oneway_yes": { "label": "Sentit únic", "options": { + "alternating": "Alternat", "no": "No", + "reversible": "Reversible", "undefined": "Sobreentès que sí", "yes": "Sí" } @@ -2034,6 +2032,7 @@ "placeholder": "1, 2, 3..." }, "phone": { + "label": "Telèfon", "placeholder": "+31 42 123 4567" }, "piste/difficulty": { @@ -2233,6 +2232,17 @@ "shop": { "label": "Tipus" }, + "siren/purpose": { + "label": "Propòsit" + }, + "siren/type": { + "label": "Tipus", + "options": { + "electronic": "Electrònica", + "other": "Altres", + "pneumatic": "Pneumàtica" + } + }, "site": { "label": "Tipus" }, @@ -2457,8 +2467,12 @@ "usage_rail": { "label": "Tipus d'ús", "options": { + "branch": "Branca", "industrial": "Industrial", - "military": "Militar" + "main": "Principal", + "military": "Militar", + "test": "Proves", + "tourism": "Turisme" } }, "vending": { @@ -2676,9 +2690,6 @@ "amenity/bicycle_repair_station": { "name": "Lloc de reparació de Bicicletes" }, - "amenity/biergarten": { - "name": "Biergarten" - }, "amenity/boat_rental": { "name": "Lloguer d'embarcacions" }, @@ -2999,6 +3010,9 @@ "amenity/vending_machine/cigarettes": { "name": "Màquina de tabac" }, + "amenity/vending_machine/coffee": { + "name": "Expenedora de cafè" + }, "amenity/vending_machine/condoms": { "name": "Expenedor de preservatius" }, @@ -3011,6 +3025,12 @@ "amenity/vending_machine/feminine_hygiene": { "name": "Màquina de vènding d'articles d'higiene femenina" }, + "amenity/vending_machine/fuel": { + "name": "Sortidor de benzina" + }, + "amenity/vending_machine/ice_cream": { + "name": "Expenedora de gelats" + }, "amenity/vending_machine/news_papers": { "name": "Màquina expenedora de diaris" }, @@ -3026,6 +3046,9 @@ "amenity/vending_machine/public_transport_tickets": { "name": "Màquina de venda de títols de transport públic" }, + "amenity/vending_machine/stamps": { + "name": "Expenedora de segells" + }, "amenity/vending_machine/sweets": { "name": "Màquina de vènding de comestibles" }, @@ -3067,6 +3090,15 @@ "attraction/pirate_ship": { "name": "Vaixell pirata" }, + "attraction/roller_coaster": { + "name": "Muntanya russa" + }, + "attraction/train": { + "name": "Tren turístic" + }, + "attraction/water_slide": { + "name": "tobogan d'aigua" + }, "barrier": { "name": "Barrera", "terms": "Tanca, Valla, Paret, Seto, Tancament, Filferrada, Reixat, Reixa" @@ -4104,7 +4136,7 @@ "terms": "Pic, cim, cimadal, pollegó, agulla." }, "natural/saddle": { - "name": "Seient" + "name": "Collada" }, "natural/sand": { "name": "Sorra" @@ -5002,6 +5034,24 @@ } }, "imagery": { + "AGIV": { + "attribution": { + "text": "Ortofoto de Flandes més recent © AGIV" + }, + "name": "imatgeria aèria més recent AGIV Flandes" + }, + "AGIV10cm": { + "attribution": { + "text": "Ortofoto Flandes © AGIV" + }, + "name": "AGIV Flandes 2013-2015 imatgeria aèria 10cm" + }, + "AGIVFlandersGRB": { + "attribution": { + "text": "GRB Flandes © AGIV" + }, + "name": "AGIV Flandes GRB" + }, "Bing": { "description": "Imatges aèries i de satèl·lit.", "name": "Imatges aèries de Bing" @@ -5010,6 +5060,7 @@ "attribution": { "text": "Termes i comentaris" }, + "description": "DigitalGlobe-Premium és un mosaic compost del mapa base de DigitalGlobe amb algunes regions millorades amb +Vivid o imatgeria personalitzada de l'àrea d'interès, resolució de 50cm o millor, i actualitzada freqüentment.", "name": "Imatges de DigitalGlobe Premium" }, "DigitalGlobe-Premium-vintage": { @@ -5023,6 +5074,7 @@ "attribution": { "text": "Termes i comentaris" }, + "description": "DigitalGlobe-Standard és un conjunt d'imatgeria seleccionat que cobreix un 86% de la superfície terrestre, amb una resolució d'entre 30 i 60cm allà on és disponible i completat pel Landsat. De mitjana l'edat és de 2,31 anys, i algunes zones s'actualitzen dues vegades cada any.", "name": "Imatges de DigitalGlobe estàndard" }, "DigitalGlobe-Standard-vintage": { @@ -5036,21 +5088,21 @@ "attribution": { "text": "Termes i comentaris" }, - "description": "Imatges aèries de Esri", - "name": "Imatges aèries de Esri" + "description": "Imatges aèries d'Esri", + "name": "Imatges aèries d'Esri" }, "EsriWorldImageryClarity": { "attribution": { - "text": "Termes & Comentaris" + "text": "Termes i comentaris" }, - "description": " L'arxiu Esri pot ser més clar i acotat que la capa per defecte ", - "name": "Imatges aèries de Esri (Claredat) Beta" + "description": " L'arxiu Esri pot ser més clar i acurat que la capa per defecte.", + "name": "Imatges aèries d'Esri (Claredat) Beta" }, "MAPNIK": { "attribution": { - "text": "© OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© col·laboradors d'OpenStreetMap, CC-BY-SA" }, - "description": "La capa d'OpenStreetmap predeterminada", + "description": "La capa d'OpenStreetMap predeterminada.", "name": "OpenStreetMap (Estàndard)" }, "Mapbox": { @@ -5062,46 +5114,52 @@ }, "OSM_Inspector-Addresses": { "attribution": { - "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© Geofabrik GmbH, col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "Inspector OSM: Adreces" }, "OSM_Inspector-Geometry": { "attribution": { - "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© Geofabrik GmbH, col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "Inspector OSM: Geometria" }, "OSM_Inspector-Highways": { "attribution": { - "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© Geofabrik GmbH, col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "Inspector OSM: Carreteres" }, "OSM_Inspector-Multipolygon": { "attribution": { - "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© Geofabrik GmbH, col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "Inspector OSM: Àrea" }, "OSM_Inspector-Places": { "attribution": { - "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© Geofabrik GmbH, col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "Inspector OSM: Llocs" }, "OSM_Inspector-Routing": { "attribution": { - "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© Geofabrik GmbH, col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "Inspector OSM: Planificació de ruta" }, "OSM_Inspector-Tagging": { "attribution": { - "text": "© Geofabrik GmbH, OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© Geofabrik GmbH, col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "Inspector OSM: Etiquetatge" }, + "SPW_ORTHO_LAST": { + "name": "imatgeria aèria més recent de SPW (Valònia)" + }, + "SPW_PICC": { + "name": "imatgeria numèrica PICC de SPW (Valònia)" + }, "US-TIGER-Roads-2012": { "name": "Carreteres TIGER 2012" }, @@ -5114,35 +5172,60 @@ "name": "Carreteres TIGER 2017" }, "US_Forest_Service_roads_overlay": { + "description": "Carretera: Contorn verd = sense classificar. Contorn marró = pista. Superfície: grava = emplenat marró clar, Asfalt = negre, pavimentat = gris, terra = blanc, ciment = blau, gespa = verd. Estacional = franges blanques", "name": "Capa superposada dels Camins Forestals dels EUA" }, + "UrbISOrtho2016": { + "attribution": { + "text": "Realitzat gràcies a Brussels UrbIS®© - Distribució i copyright CIRB" + }, + "name": "UrbIS-Ortho 2016" + }, + "UrbISOrtho2017": { + "attribution": { + "text": "Realitzat gràcies a Brussels UrbIS®© - Distribució i copyright CIRB" + }, + "name": "UrbIS-Ortho 2017" + }, + "UrbisAdmFR": { + "attribution": { + "text": "Realitzat gràcies a Brussels UrbIS®© - Distribució i copyright CIRB" + }, + "name": "UrbisAdm FR" + }, + "UrbisAdmNL": { + "attribution": { + "text": "Realitzat gràcies a Brussels UrbIS®© - Distribució i copyright CIRB" + }, + "name": "UrbisAdm NL" + }, "Waymarked_Trails-Cycling": { "attribution": { - "text": "© waymarkedtrails.org, OpenStreetMap contribuïdors, CC by-SA 3.0" + "text": "© waymarkedtrails.org, col·laboradors d'OpenStreetMap, CC by-SA 3.0" }, "name": "Waymarked Trails: Ciclisme" }, "Waymarked_Trails-Hiking": { "attribution": { - "text": "© waymarkedtrails.org, OpenStreetMap contribuïdors, CC by-SA 3.0" + "text": "© waymarkedtrails.org, col·laboradors d'OpenStreetMap, CC by-SA 3.0" }, "name": "Waymarked Trails: Senderisme" }, "Waymarked_Trails-MTB": { "attribution": { - "text": "© waymarkedtrails.org, OpenStreetMap contribuïdors, CC by-SA 3.0" + "text": "© waymarkedtrails.org, col·laboradors d'OpenStreetMap, CC by-SA 3.0" }, "name": "Waymarked Trails: Ciclisme de Muntanya" }, "Waymarked_Trails-Skating": { "attribution": { - "text": "© waymarkedtrails.org, OpenStreetMap contribuïdors, CC by-SA 3.0" + "text": "© waymarkedtrails.org, col·laboradors d'OpenStreetMap, CC by-SA 3.0" }, "name": "Waymarked Trails: Patinatge" }, "Waymarked_Trails-Winter_Sports": { "attribution": { - "text": "© waymarkedtrails.org, OpenStreetMap contribuïdors, CC by-SA 3.0" + "text": "© waymarkedtrails.org, col·laboradors d'OpenStreetMap, CC by-SA 3.0" }, "name": "Waymarked Trails: Esports d'hivern" }, @@ -5157,47 +5240,75 @@ "attribution": { "text": "basemap.at" }, - "description": "Capa d'ortofoto proveïda per basemap.at. \"Successora\" de geoimage.at imagery.", + "description": "Capa d'ortofoto proveïda per basemap.at. \"Successora\" de la imatgeria de geoimage.at.", "name": "Ortofoto basemap.at " }, "hike_n_bike": { "attribution": { - "text": "© OpenStreetMap col·laboradors" + "text": "© col·laboradors d'OpenStreetMap" }, "name": "Excursió i bicicleta" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Camins de motoneu de Kelkkareitit.fi des d'OSM (àrea nòrdica de cobertura)", + "name": "capa nòrdica de motoneu" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic d'ortofotos sueques del període 1955-1965. Poden coincidir imatges antigues i noves.", + "name": "Ortofoto històrica de Lantmäteriet 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic d'ortofotos sueques del període 1970-1980. Es troba en construcció.", + "name": "Ortofoto històrica de Lantmäteriet 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Termes i comentaris" }, - "description": "Visualitza característiques importants per ajudar a orientar-te.", + "description": "Visualitza característiques importants per a ajudar a orientar-vos.", "name": "Localitzador superposat" }, "openpt_map": { "attribution": { - "text": "© OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "OpenPT Map (superposat)" }, "osm-gps": { "attribution": { - "text": "© OpenStreetMap col·laboradors" + "text": "© col·laboradors d'OpenStreetMap" }, "description": "Traces GPS públiques pujades a OpenStreetMap.", "name": "Traces GPS d'OpenStreetMap" }, "osm-mapnik-black_and_white": { "attribution": { - "text": "© OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "OpenStreetMap (Estàndard Blanc i Negre)" }, "osm-mapnik-german_style": { "attribution": { - "text": "© OpenStreetMap col·laboradors, CC-BY-SA" + "text": "© col·laboradors d'OpenStreetMap, CC-BY-SA" }, "name": "OpenStreetMap (Estil alemany)" }, + "osmse-ekonomiska": { + "attribution": { + "text": "© Lantmäteriet" + }, + "description": "Escaneig de «mapes econòmics» ca. 1950–1980", + "name": "Mapa econòmic de Lantmäteriet 1950–1980" + }, "qa_no_address": { "attribution": { "text": "Simon Poole, Dades ©OpenStreetMap col·laboradors" @@ -5206,10 +5317,17 @@ }, "skobbler": { "attribution": { - "text": "© Quadrícules: skobbler Dades del mapa: OpenStreetMap col·laboradors" + "text": "© Quadrícules: skobbler Dades del mapa: col·laboradors d'OpenStreetMap" }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Camins de motoneu", + "name": "Mapa de motoneu de Suècia" + }, "stamen-terrain-background": { "attribution": { "text": "Quadrícula de mapes de Stamen Design, sota CC BY 3.0. Dades d'OpenStreetMap, sota ODbL" @@ -5218,15 +5336,57 @@ }, "tf-cycle": { "attribution": { - "text": "Mapes © Thunderforest, Dades © OpenStreetMap col·laboradors" + "text": "Mapes © Thunderforest, Dades © col·laboradors d'OpenStreetMap" }, "name": "Thunderforest OpenCycleMap" }, "tf-landscape": { "attribution": { - "text": "Mapes © Thunderforest, Dades © OpenStreetMap col·laboradors" + "text": "Mapes © Thunderforest, Dades © col·laboradors d'OpenStreetMap" }, "name": "Thunderforest Landscape" + }, + "trafikverket-baninfo": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Xarxa ferroviària sueca, incloses les vies auxiliars", + "name": "Xarxa ferroviària de Trafikverket" + }, + "trafikverket-baninfo-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Xarxa ferroviària sueca amb diverses opcions per a capes de mapes", + "name": "Opcions de la xarxa ferroviària de Trafikverket" + }, + "trafikverket-vagnat": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Xarxa viària sueca de NVDB", + "name": "Xarxa viària de Trafikverket" + }, + "trafikverket-vagnat-extra": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Detalls addicionals del NVDB suec: referències d'autopistes, reductors de velocitat, àrees de descans, parades d'autobús, ponts, túnels, càmeres de velocitat", + "name": "Xarxa viària extra de Trafikverket" + }, + "trafikverket-vagnat-navn": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Noms de carrer suecs de NVDB", + "name": "Noms de carrer de Trafikverket" + }, + "trafikverket-vagnat-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Xarxa de carreteres sueca de NVDB amb diverses opcions per a capes de mapes", + "name": "Opcions de la xarxa viària de Trafikverket" } }, "community": { diff --git a/dist/locales/cs.json b/dist/locales/cs.json index 234a4c239..802156e2f 100644 --- a/dist/locales/cs.json +++ b/dist/locales/cs.json @@ -23,6 +23,7 @@ }, "add_note": { "title": "Poznámka", + "description": "Zjistili jste problém? Dejte vědět ostatním mapovačům.", "tail": "Klikněte do mapy pro přidání poznámky." }, "browse": { @@ -44,7 +45,8 @@ "annotation": { "point": "Přidán bod.", "vertex": "Přidán bod k linii.", - "relation": "Přidána relace." + "relation": "Přidána relace.", + "note": "Přidána poznámka." } }, "start": { @@ -320,7 +322,8 @@ "to": "DO", "from_name": "{from} {fromName}", "from_name_to_name": "{from} {fromName} {to} {toName}", - "via_names": "{via} {viaNames}" + "via_names": "{via} {viaNames}", + "toggle": "Klikněte pro \"{turn}\"" } }, "undo": { @@ -340,6 +343,8 @@ "localized_translation_name": "Název" }, "zoom_in_edit": "Pro editaci přibližte", + "login": "Přihlásit", + "logout": "Odhlásit", "loading_auth": "Připojování na OpenStreetMap…", "report_a_bug": "Nahlásit chybu", "help_translate": "Pomoct s překladem", @@ -495,8 +500,6 @@ "best_imagery": "Nejlepší známý zdroj podkladů pro toto místo", "switch": "Přepnout zpět na toto pozadí", "custom": "Vlastní", - "custom_button": "Editovat vlastní pozadí", - "custom_prompt": "Vložte šablonu pro URL dlaždic. Platné proměnné jsou:\n- {zoom} nebo {z}, {x}, {y} u schématu Z/X/Y\n- {-y} nebo {y} u prohozených souřadnic Y typu TMS\n- {u} u schématu hierarchicky čtvrcených dlaždic\n- {switch:a,b,c} u multiplexingu serveru DNS\n\nPříklad:\n{example}", "overlays": "Překryvné vrstvy", "imagery_source_faq": "O podkladu / Nahlásit problém", "reset": "vrátit na začátek", @@ -694,16 +697,6 @@ }, "cannot_zoom": "Aktuální nastavení nedovoluje větší zvětšení.", "full_screen": "Na celou obrazovku", - "gpx": { - "local_layer": "Přidat GPX", - "drag_drop": "Přetáhni a pusť .gpx, .geojson nebo .kml soubor na stránku, nebo klikni tlačítko napravo k prohlížení", - "zoom": "Přibliž na vrstvu", - "browse": "Hledej soubor" - }, - "mvt": { - "local_layer": "Přidat MVT", - "zoom": "Přiblížit na vrstvu" - }, "streetside": { "hires": "Vysoké rozlišení" }, @@ -1242,31 +1235,34 @@ "label": "Povolený vstup/vjezd", "options": { "designated": { - "description": "Přístup je povolen podle značení či místních předpisů", "title": "Vyhrazen" }, "destination": { - "description": "Průjezd zakázán, průchod zakázán apod.", + "description": "Přístup je povolen pouze k dosažení cíle", "title": "Jen do místa" }, "dismount": { - "description": "Vstup povolen, ale cyklista (jezdec apod.) musí sesednout", + "description": "Přístup je povolen, ale jezdec musí sesednout", "title": "Sesednout" }, "no": { - "description": "Přístup širší veřejnosti zakázán", + "description": "Přístup není veřejnosti povolen", "title": "Zakázán" }, "permissive": { - "description": "Vstup je povolen do té doby, než majitel povolení zruší", + "description": "Přístup je povolen, dokud majitel povolení nezamítne", "title": "Do odvolání" }, + "permit": { + "description": "Přístup povolen pouze s platným oprávněním nebo licencí", + "title": "Na povolení" + }, "private": { - "description": "Přístup je povolen jen s individuálním svolením majitele", + "description": "Přístup povolen pouze s individuálním povolením vlastníka", "title": "S povolením" }, "yes": { - "description": "Přístup oficiálně, ze zákona povolen", + "description": "Přístup povolen právem; právo na cestu", "title": "Povolen" } }, @@ -1432,6 +1428,9 @@ "board_type": { "label": "Typ" }, + "booth": { + "label": "Stánek" + }, "boules": { "label": "Typ" }, @@ -1480,6 +1479,9 @@ "label": "Kapacita", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Hotovost" + }, "castle_type": { "label": "Typ" }, @@ -1820,6 +1822,9 @@ "undefined": "Ne" } }, + "horse_scale": { + "placeholder": "Obtížné, nebezpečné…" + }, "horse_stables": { "label": "Jezdecká stáj", "options": { @@ -2556,7 +2561,16 @@ "placeholder": "Výchozí" }, "usage_rail": { - "label": "Druh použití" + "label": "Druh použití", + "options": { + "industrial": "Průmysl", + "military": "Armáda", + "test": "Test", + "tourism": "Turismus" + } + }, + "vending": { + "label": "Druhy zboží" }, "visibility": { "label": "Viditelnost", @@ -2577,6 +2591,7 @@ "volcano/type": { "label": "Druh sopky", "options": { + "shield": "Štít", "stratovolcano": "Stratovulkán" } }, @@ -2783,10 +2798,6 @@ "name": "Montážní stojan na kola", "terms": "stojan,kolo,stojan na kolo,montážní stojan,opravna kol,cykloopravna,samoobslužná opravna kol" }, - "amenity/biergarten": { - "name": "Pivní zahrádka", - "terms": "zahrádka,venku,posezení,pivo,pod širým nebem" - }, "amenity/boat_rental": { "name": "Půjčovna lodí", "terms": "půjčovna lodí,půjčovna loděk,půjčovna člunů" @@ -3792,7 +3803,8 @@ "terms": "přechod pro chodce,zebra,přechod,přechod pro pěší" }, "footway/crosswalk-raised": { - "name": "Příčný práh s přechodem" + "name": "Zvýšený přechod pro chodce typu zebra", + "terms": "zpomalovací stůl s přechodem typu zebra,rychlostní stůl s přechodem typu zebra" }, "footway/sidewalk": { "name": "Chodník po straně silnice", @@ -3906,12 +3918,17 @@ "name": "Bod přechodu pro chodce", "terms": "přechod,zebra" }, + "highway/crossing-raised": { + "name": "Bod zvýšeného přechodu pro chodce", + "terms": "zpomalovací stůl s přechodem,rychlostní stůl s přechodem" + }, "highway/crosswalk": { "name": "Bod přechodu typu zebra", "terms": "přechod pro chodce,zebra,přechod,přechod pro pěší" }, "highway/crosswalk-raised": { - "name": "Příčný práh s přechodem" + "name": "Bod zvýšeného přechodu pro chodce typu zebra", + "terms": "zpomalovací stůl s přechodem typu zebra,rychlostní stůl s přechodem typu zebra" }, "highway/cycleway": { "name": "Cyklostezka", @@ -3949,6 +3966,10 @@ "name": "Dálnice - nájezd", "terms": "nájezd,sjezd,výjezd,příjezd,rampa,exit" }, + "highway/passing_place": { + "name": "Místo k vyhýbání", + "terms": "vyhýbací záliv" + }, "highway/path": { "name": "Pěšina", "terms": "cesta" @@ -5928,7 +5949,22 @@ } }, "imagery": { + "AGIV": { + "attribution": { + "text": "Nejaktuálnější ortofoto Flanders © AGIV" + }, + "name": "Nejaktuálnější letecké snímky AGIV Flanders" + }, + "AGIV10cm": { + "attribution": { + "text": "Ortofoto Flanders © AGIV" + }, + "name": "10cm letecké snímky AGIV Flanders 2013-2015" + }, "AGIVFlandersGRB": { + "attribution": { + "text": "GRB Flanders © AGIV" + }, "name": "AGIV Flanders GRB" }, "Bing": { @@ -5948,7 +5984,7 @@ }, "DigitalGlobe-Standard": { "attribution": { - "text": "Podmínky použití & zpětná vazba" + "text": "Podmínky použití a zpětná vazba" }, "name": "Standardní snímky DigitalGlobe" }, @@ -5959,13 +5995,17 @@ }, "EsriWorldImagery": { "attribution": { - "text": "Podmínky použití & zpětná vazba" - } + "text": "Podmínky použití a zpětná vazba" + }, + "description": "Světové snímky Esri.", + "name": "Světové snímky Esri" }, "EsriWorldImageryClarity": { "attribution": { "text": "Podmínky použití a zpětná vazba" - } + }, + "description": "Archivní snímky Esri, které mohou být čistší a přesnější jak výchozí vrstva.", + "name": "Světové snímky Esri (Clarity) Beta" }, "MAPNIK": { "attribution": { @@ -6023,6 +6063,9 @@ }, "name": "OSM Inspektor: Štítkování" }, + "SPW_ORTHO_LAST": { + "name": "Nejaktuálnější snímky SPW(allonie)" + }, "US-TIGER-Roads-2012": { "name": "TIGER Roads 2012" }, @@ -6094,7 +6137,7 @@ }, "mapbox_locator_overlay": { "attribution": { - "text": "Podmínky použití & zpětná vazba" + "text": "Podmínky použití a zpětná vazba" }, "name": "Překryv lokátoru" }, @@ -6134,6 +6177,9 @@ } }, "skobbler": { + "attribution": { + "text": "© Dlaždice: skobbler, mapová data: přispěvatelé OpenStreetMap" + }, "name": "skobbler" }, "stamen-terrain-background": { @@ -6154,7 +6200,8 @@ "trafikverket-baninfo": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "name": "Železniční síť Trafikverket" }, "trafikverket-baninfo-option": { "attribution": { @@ -6164,7 +6211,8 @@ "trafikverket-vagnat": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "name": "Silniční síť Trafikverket" }, "trafikverket-vagnat-extra": { "attribution": { @@ -6174,18 +6222,148 @@ "trafikverket-vagnat-navn": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "name": "Názvy ulic Trafikverket" }, "trafikverket-vagnat-option": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "name": "Volby silniční sítě Trafikverket" } }, "community": { + "cape-coast-youthmappers": { + "name": "YouthMappers univerzity v Cape Coast", + "description": "Sledujte nás na Twitteru: {url}" + }, + "osm-gh-facebook": { + "name": "OpenStreetMap Ghana na Facebooku", + "description": "Facebooková skupina pro lidi zajímající se o OpenStreetMap." + }, + "osm-gh-twitter": { + "name": "OpenStreetMap Ghana na Twitteru", + "description": "Sledujte nás na Twitteru: {url}" + }, + "osm-mg-facebook": { + "name": "Facebooková skupina OpenStreetMap Madagaskar" + }, + "OSM-BGD-facebook": { + "name": "OpenStreetMap Bangladéš", + "description": "Vylepšete OpenStreetMap v Bangladéši" + }, + "OSM-India-facebook": { + "description": "Vylepšete OpenStreetMap v Indii" + }, + "OSM-india-twitter": { + "name": "Twitter OpenStreetMap Indie", + "description": "Zrovna jsme vytweetli: {url}" + }, + "OSM-IDN-facebook": { + "name": "OpenStreetMap Indonésie", + "description": "Vylepšete OpenStreetMap v Indonésii" + }, + "OSM-japan-facebook": { + "name": "Japonská komunita OpenStreetMap", + "description": "Mapovači a uživatelé OpenStreetMap v Japonsku" + }, + "OSM-japan-twitter": { + "name": "Twitter OpenStreetMap Japonsko", + "description": "Hashtag na Twitteru: {url}" + }, + "OSM-japan-website": { + "name": "OpenStreetMap Japonsko", + "description": "Mapovači a uživatelé OpenStreetMap v Japonsku" + }, + "OSM-korea-telegram": { + "name": "Telegramový kanál OSM Korea" + }, + "OSM-MY-facebook": { + "name": "OpenStreetMap Malajsie na Facebooku", + "description": "Pro chatování o čemkoliv ohledně OpenStreetMap!" + }, + "OSM-MY-forum": { + "name": "Malajské fórum OpenStreetMap", + "description": "Oficiální malajské fórum OpenStreetMap" + }, + "OSM-MY-matrix": { + "description": "Všichni mapovači jsou vítáni! Zaregistrujte se na {signupUrl}" + }, + "OSM-MNG-facebook": { + "name": "OpenStreetMap Mongolsko", + "description": "Vylepšete OpenStreetMap v Mongolsku" + }, + "OSM-MMR-facebook": { + "name": "OpenStreetMap Myanmar", + "description": "Vylepšete OpenStreetMap v Myanmaru" + }, + "OSM-Nepal-facebook": { + "name": "OpenStreetMap Nepál", + "description": "Vylepšete OpenStreetMap v Nepálu" + }, + "OSM-LKA-facebook": { + "name": "OpenStreetMap Srí Lanka", + "description": "Vylepšete OpenStreetMap na Srí Lance" + }, + "OSM-TW-facebook": { + "name": "Tchajwanská komunita OpenStreetMap" + }, + "al-forum": { + "name": "Albánské fórum OSM", + "description": "Albánské fórum OpenStreetMap" + }, + "at-twitter": { + "name": "Twitter OpenStreetMap Rakousko", + "description": "OpenStreetMap Rakousko na Twitteru: {url}" + }, + "osm-at": { + "name": "OpenStreetMap Rakousko" + }, + "byosm": { + "name": "OpenStreetMap Bělorusko" + }, + "be-facebook": { + "description": "Mapovači a uživatelé OpenStreetMap v Belgii" + }, + "czech-community": { + "name": "Česká OSM komunita", + "description": "Mapový portál, webové stránky a kontakty na členy OSM v ČR" + }, + "osmcz-facebook": { + "name": "OpenStreetMap CZ na Facebooku" + }, + "osmcz-twitter": { + "name": "Český twitter @osmcz" + }, "talk-cz-mailinglist": { + "name": "Český mailing list (talk-cz)", "description": "Talk-cz je hlavní komunikační kanál české komunity" }, + "dk-forum": { + "name": "Webové fórum OpenStreetMap Dánsko" + }, + "fr-twitter": { + "name": "OpenStreetMap Francie na Twitteru", + "description": "OpenStreetMap Francie na Twitteru: {url}" + }, + "de-berlin-meetup": { + "description": "Mapovači a uživatelé OpenStreetMap v oblasti Berlína" + }, + "de-berlin-twitter": { + "description": "Sledujte nás na Twitteru: {url}" + }, + "hu-facebook": { + "description": "Mapovači a uživatelé OpenStreetMap v Maďarsku" + }, + "it-facebook": { + "name": "Facebook OpenStreetMap Itálie" + }, + "it-twitter": { + "description": "Sledujte nás na Twitteru na {url}" + }, + "OSM-Rome-meetup": { + "description": "Vylepšete OpenStreetMap na území Říma" + }, "Bay-Area-OpenStreetMappers": { "name": "Bay Area OpenStreetMappers", "description": "Vylepšete OpenStreetMap v Bay Area" @@ -6203,20 +6381,42 @@ "name": "Mapování DC", "description": "Vylepšete OpenStreetMap na území DC" }, + "OpenCleveland-meetup": { + "description": "Vylepšete OpenStreetMap na území Clevelandu" + }, + "OSM-Boston": { + "description": "Mapovači a uživatelé OpenStreetMap na území Bostonu" + }, "OSM-Chattanooga": { "name": "OSM Chattanooga", "description": "Uživatelská skupina OpenStreetMap pro Chatanoogu" }, + "OSM-Colorado": { + "description": "Mapovači a uživatelé OpenStreetMap ve státě Colorado, USA" + }, "OSM-NYC": { "name": "OpenStreetMap NYC" }, "OSM-Portland": { - "name": "OpenStreetMap Portland" + "name": "OpenStreetMap Portland", + "description": "Mapovači a uživatelé OpenStreetMap na území Portlandu" + }, + "OSM-Seattle": { + "description": "Mapovači a uživatelé OpenStreetMap na území Seattlu" + }, + "OSM-Tampa-Bay": { + "description": "Mapovači a uživatelé OpenStreetMap na území Tampa Bay" }, "OSM-US-Slack": { "name": "OpenStreetMap US Slack", "description": "Všichni jsou vítaní! Přihlaste se na {signupUrl}" }, + "OSM-Utah": { + "description": "Mapovači a uživatelé OpenStreetMap na území Salt Lake City" + }, + "OSM-Wyoming": { + "description": "Mapovači a uživatelé OpenStreetMap ve státě Wyoming" + }, "Maptime-Australia-Slack": { "name": "Maptime Australia Slack", "description": "Přihlaste se na {signupUrl}" diff --git a/dist/locales/cy.json b/dist/locales/cy.json index c8e3c485b..9591d9733 100644 --- a/dist/locales/cy.json +++ b/dist/locales/cy.json @@ -136,15 +136,10 @@ "label": "Yn Caniatau Mynediad", "options": { "designated": { - "description": "Yn caniatau mynediad yn ôl arwyddion neu is-ddeddfau lleol", "title": "Dynodedig" }, "destination": { - "description": "Yn caniatau mynediad ond i gyrraedd cyrchfan", "title": "Cyrchfan" - }, - "no": { - "description": "Dim caniatad mynediad i'r cyhoedd" } } }, diff --git a/dist/locales/da.json b/dist/locales/da.json index c2be950a5..7687233cf 100644 --- a/dist/locales/da.json +++ b/dist/locales/da.json @@ -516,8 +516,6 @@ "best_imagery": "Bedst kendte luftfotokilde for denne her lokalitet", "switch": "Skift tilbage til denne baggrund", "custom": "Brugerdefineret", - "custom_button": "Rediger brugerdefineret baggrund", - "custom_prompt": "Indtast en URL-skabelon for kort-fliser. Gyldige formater er:\n - {zoom} eller {z}, {x}, {y} for Z/X/Y flise-skemaer\n - {-y} eller {ty} for omvendte Y-koordinater i TMS-stil\n - {u} for quad-flise-skemaer\n - {switch:a,b,c} for multipleksning af DNS-opslag\n\nEksempel:\n{example}", "overlays": "Overlægninger", "imagery_source_faq": "Luftfoto-information / anmeld problem", "reset": "nulstil", @@ -720,18 +718,6 @@ }, "cannot_zoom": "Kan ikke zoome længere ud i nuværende tilstand.", "full_screen": "Skift fuld skærmtilstand", - "gpx": { - "local_layer": "Tilføj en GPX", - "drag_drop": "Træk og slip en .gpx, .geojson eller .kml ind på siden eller klik på knappen til højre for at browse", - "zoom": "Zoom til lag", - "browse": "Gennemse efter en fil" - }, - "mvt": { - "local_layer": "Tilføj en MVT", - "drag_drop": "Træk og slip en .mvt eller .pbf-fil til siden, eller klik på knappen til højre for at vælge", - "zoom": "Zoom til lag", - "browse": "Vælg en fil" - }, "streetside": { "tooltip": "Gadefotos fra Microsoft", "title": "Foto-overlag (Bing Streetside)", @@ -1321,31 +1307,24 @@ "label": "Tilladt adgang", "options": { "designated": { - "description": "Adgang tilladt ifølge trafikskilte eller lokale bestemmelser", "title": "Bestemt netop til dette formål" }, "destination": { - "description": "Ærindekørsel tilladt", "title": "Destination" }, "dismount": { - "description": "Kørsel forbudt, cyklist skal trække", "title": "Trækken tilladt" }, "no": { - "description": "Adgang ikke tilladt for offentligheden", "title": "Forbudt" }, "permissive": { - "description": "Adgang tilladt indtil ejer tilbagekalder tilladelsen", "title": "Adgang efter tilladelse" }, "private": { - "description": "Adgang kun tilladt ved udstedelse af individuelle tilladelser fra ejer", "title": "Privat" }, "yes": { - "description": "Adgang tilladt ifølge loven", "title": "Tilladt" } }, @@ -2822,10 +2801,6 @@ "name": "Cykelreparationsværktøj", "terms": "Cykelreparationsværktøj" }, - "amenity/biergarten": { - "name": "Ølhave", - "terms": "Ølhave, Ølstue" - }, "amenity/boat_rental": { "name": "Bådudlejning", "terms": "Bådudlejning, lystbådudlejning" @@ -3002,7 +2977,7 @@ }, "amenity/motorcycle_parking": { "name": "Motorcykelparkering", - "terms": "Motorcykelparkering" + "terms": "Motorcykelparkering,mc,parkering,motorcykel" }, "amenity/music_school": { "name": "Musikskole", @@ -5125,7 +5100,7 @@ }, "shop/car_repair": { "name": "Autoværksted", - "terms": "Autoværksted, Bilværksted" + "terms": "Autoværksted, Bilværksted,automekaniker,mekaniker" }, "shop/carpet": { "name": "Tæppeforhandler", @@ -5339,7 +5314,11 @@ }, "shop/motorcycle": { "name": "Motorcykelforhandler", - "terms": "Motorcykelforhandler" + "terms": "Motorcykelforhandler,mc,forretning,motorcykel" + }, + "shop/motorcycle_repair": { + "name": "Motorcykelværksted", + "terms": "mekaniker,mc,værksted,mc værksted,motorcykel" }, "shop/music": { "name": "Musikbutik", diff --git a/dist/locales/de.json b/dist/locales/de.json index 5121b84ed..d5f381845 100644 --- a/dist/locales/de.json +++ b/dist/locales/de.json @@ -23,7 +23,7 @@ }, "add_note": { "title": "Hinweis", - "description": "Hast du irgendwo einen Fehler entdeckt? Teile es den anderen Mappern mit.", + "description": "Hast du irgendwo einen Fehler entdeckt? Teile es den anderen Benutzern mit.", "tail": "Klicke auf die Karte, um einen Hinweis hinzuzufügen." }, "browse": { @@ -430,7 +430,12 @@ "edited_by": "Bearbeitet von", "changeset": "Änderungssatz", "unknown": "Unbekannt", - "link_text": "Chronik auf openstreetmap.org" + "link_text": "Chronik auf openstreetmap.org", + "note_no_history": "Keine Chronik (Neuer Hinweis)", + "note_comments": "Kommentare", + "note_created_date": "Erstellt am", + "note_created_user": "Erstellt von", + "note_link_text": "Hinweis auf openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "Knoten", "line": "Linie", "area": "Fläche", - "relation": "Relation" + "relation": "Relation", + "note": "Hinweis" }, "geocoder": { "search": "Weltweit suchen …", @@ -518,17 +524,15 @@ "title": "Hintergrund", "description": "Hintergrundeinstellungen", "key": "B", - "backgrounds": "Bildmaterial-Quelle", + "backgrounds": "Hintergrund-Quellen", "none": "Leer", "best_imagery": "Beste bekannte Bildmaterial-Quelle für diese Stelle", "switch": "Zu diesem Hintergrund zurückschalten", "custom": "Benutzerdefiniert", - "custom_button": "Benutzerdefinierten Hintergrund bearbeiten", - "custom_prompt": "Gib eine Kachel-URL-Vorlage ein. Gültige Variablen sind:\n - {zoom} oder {z}, {x}, {y} für das Z/X/Y Kachel-Schema\n - {-y} oder {ty} für umgedrehte TMS-Stil Y-Koordinaten\n - {u} für das Quadtile Schema\n - {switch:a,b,c} für DNS-Server Multiplexing\n\nBeispiel:\n{example}", "overlays": "Überlagerungen", "imagery_source_faq": "Bildmaterialinformation / Problem melden", "reset": "Zurücksetzen", - "display_options": "Bildmaterial-Optionen", + "display_options": "Anzeige-Optionen", "brightness": "Helligkeit", "contrast": "Kontrast", "saturation": "Sättigung", @@ -538,8 +542,8 @@ "tooltip": "Zeige eine herausgezoomte Karte zum Auffinden des angezeigten Kartenausschnitts.", "key": "/" }, - "fix_misalignment": "Bildmaterial-Versatz anpassen", - "offset": "Ziehe irgendwo im grauen Bereich um den Versatz des Bildmaterials anzupassen oder gib die Versatz-Werte in Metern ein." + "fix_misalignment": "Hintergrund-Versatz anpassen", + "offset": "Ziehe irgendwo unterhalbe im grauen Bereich um den Versatz des Bildmaterials anzupassen oder gib die Versatz-Werte in Metern ein." }, "map_data": { "title": "Kartendaten", @@ -554,6 +558,11 @@ "notes": { "tooltip": "Hinweise von OpenStreetMap", "title": "OpenStreetMap Hinweise" + }, + "custom": { + "tooltip": "Ziehe ein Datenfile per Drag & Drop auf die Seite oder klicke den Knopf zum Einstellen", + "title": "Benutzerdefinierte Kartendaten", + "zoom": "Zoome zu den Daten" } }, "fill_area": "Flächenfüllung", @@ -619,13 +628,36 @@ }, "partial": { "description": "Teilweise Füllung", - "tooltip": "Flächen werden innen entlang der Kanten gefüllt angezeigt. (Empfohlen für Anfänger-Mapper)." + "tooltip": "Flächen werden innen entlang der Kanten gefüllt angezeigt. (Empfohlen für Anfänger)." }, "full": { "description": "Volle Füllung", "tooltip": "Flächen werden voll gefüllt angezeigt." } }, + "settings": { + "custom_background": { + "tooltip": "Bearbeite benutzerdefinierten Hintergrund", + "header": "Einstellungen des benutzerdefinierten Hintergrunds", + "instructions": "Gib eine Kachel-URL-Vorlage ein. Gültige Variablen sind:\n- {zoom} oder {z}, {x}, {y} für das Z/X/Y Kachel-Schema\n- {-y} oder {ty} für umgedrehte TMS-Stil Y-Koordinaten\n- {u} für das Quadtile Schema\n- {switch:a,b,c} für DNS-Server Multiplexing\n\nBeispiel:\n{example}", + "template": { + "placeholder": "Gib eine URL-Vorlage ein" + } + }, + "custom_data": { + "tooltip": "Bearbeite benutzerdefinierte Kartendaten", + "header": "Einstellungen für benutzerdefinierte Kartendaten", + "file": { + "instructions": "Wähle ein lokales Datenfile. Unterstützte Typen sind:\n .gpx, .kml, .geojson und .json", + "label": "Durchsuche Files" + }, + "or": "Oder", + "url": { + "instructions": "Gib eine Datenfile-URL oder eine Vektor-Kachel-URL ein. Gültige Variablen sind:\n{zoom} oder {z}, {x}, {y} für das Z/X/Y Kachel-Schema", + "placeholder": "Gib eine URL ein" + } + } + }, "restore": { "heading": "Ungesicherte Änderungen vorhanden", "description": "Willst du die ungesicherten Änderungen aus einer früheren Bearbeitungs-Sitzung wiederherstellen?", @@ -727,18 +759,6 @@ }, "cannot_zoom": "Du kannst im aktuellen Modus nicht weiter heraus zoomen.", "full_screen": "Vollbildmodus ein-/ausschalten", - "gpx": { - "local_layer": "Eine GPX-Datei hinzufügen", - "drag_drop": "Zieh eine .gpx, .geojson oder .kml Datei per Drag & Drop auf die Seite oder klicke den Knopf rechts, um nach Dateien zu suchen", - "zoom": "GPX-Track anzeigen", - "browse": "Eine Datei laden" - }, - "mvt": { - "local_layer": "Eine MVT-Datei hinzufügen", - "drag_drop": "Zieh eine .mvt oder .pbf Datei per Drag & Drop auf die Seite oder klicke den Knopf rechts, um nach Dateien zu suchen", - "zoom": "MVT-Track anzeigen", - "browse": "Eine Datei aussuchen" - }, "streetside": { "tooltip": "Straßenfotos von Microsoft", "title": "Straßenfotos (Bing Streetside)", @@ -770,14 +790,20 @@ "anonymous": "Anonym", "closed": "(geschlossen)", "commentTitle": "Kommentare", + "status": { + "opened": "geöffnet {when}", + "reopened": "wieder geöffnet {when}", + "commented": "kommentiert {when}", + "closed": "geschlossen {when}" + }, "newComment": "Neuer Kommentar", "inputPlaceholder": "Gib einen Kommentar für alle anderen Benutzer ein.", "close": "Hinweis schließen", "open": "Hinweis wieder öffnen", "comment": "Kommentar", "close_comment": "Kommentieren und schließen", - "open_comment": "Wiedereröffnen und kommentieren", - "report": "Bericht", + "open_comment": "Wieder öffnen und kommentieren", + "report": "Melden", "new": "Neuer Hinweis", "newDescription": "Beschreibe den Fehler.", "save": "Hinweis speichern", @@ -805,7 +831,7 @@ "navigation_drag": "Du kannst die Karte durch Drücken und Halten der {leftclick} linken Maustaste und Bewegen der Maus verschieben. Du kannst auch die `↓`, `↑`, `←`, `→` Pfeiltasten auf deiner Tastatur benutzen.", "navigation_zoom": "Du kannst durch Scrollen am Mausrad oder am Touchpad oder durch Klicken der {plus} / {minus} Knöpfe rechts oben neben der Karte hinein oder heraus zoomen. Du kannst auch die `+`, `-` Tasten auf der Tastatur benutzen.", "features_h": "Karten-Objekte", - "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte angezeigt werden, beispielsweise Straßen, Gebäude oder Sehenswürdigkeiten. Alles in der echten Welt kann als ein Objekt in OpenStreetMap gezeichnet (gemappt) werden. Objekte werden auf der Karte als *Punkte*, *Linien* oder *Flächen* dargestellt.", + "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte angezeigt werden, beispielsweise Straßen, Gebäude oder Sehenswürdigkeiten. Alles in der echten Welt kann als ein Objekt in OpenStreetMap gezeichnet werden. Objekte werden auf der Karte als *Punkte*, *Linien* oder *Flächen* dargestellt.", "nodes_ways": "In OpenStreetMap werden Punkte manchmal *Knoten* genannt, Linien und Flächen werden manchmal *Wege* genannt." }, "editing": { @@ -815,7 +841,7 @@ "select_right_click": "{rightclick} Rechtsklicke auf ein Objekt um das *Bearbeitungs-Menü* zu sehen, welches dir die verfügbaren Befehle wie Drehen, Bewegen oder Löschen zeigt.", "multiselect_h": "Mehrfachauswahl", "multiselect_shift_click": "`{shift}`+{leftclick} Klicken kann mehrere Objekte gemeinsam auswählen. Damit können diese leicht gemeinsam verschoben, gedreht oder gelöscht werden.", - "multiselect_lasso": "Eine andere Möglichkeit mehrere Objekte gemeinsam auszuwählen ist die `{shift}` Taste zu halten, dann den {leftclick} linken Mausknopf festzuhalten und mit der Maus ein Auswahl-Lasso um die Objekte zu ziehen. Alle Punkte innerhalb des Auswahl-Lasso werden ausgewählt.", + "multiselect_lasso": "Eine andere Möglichkeit mehrere Objekte gemeinsam auszuwählen ist die `{shift}` Taste zu halten, dann die {leftclick} linke Maustaste festzuhalten und mit der Maus ein Auswahl-Lasso um die Objekte zu ziehen. Alle Punkte innerhalb des Auswahl-Lasso werden ausgewählt.", "undo_redo_h": "Rückgängig & Wiederherstellen", "undo_redo": "Deine Bearbeitungen werden lokal in deinem Web Browser gespeichert bis du diese auf dem OpenStreetMap Server speicherst. Du kannst Bearbeitungen durch Klicken des {undo} **Rückgängig** Knopf rückgängig machen und durch Klicken des {redo} **Wiederherstellen** Knopf wiederherstellen.", "save_h": "Speichern", @@ -860,15 +886,15 @@ "intro": "*Linien* werden benutzt um Objekte wie Straßen, Eisenbahnschienen oder Flüsse darzustellen. Linien sollen in der Mitte des dargestellten Objekts gezeichnet werden.", "add_line_h": "Linien hinzufügen", "add_line": "Um eine Linie hinzuzufügen klicke den {line} **Linie** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `2`. Dadurch wird der Mauszeiger zu einem Kreuz.", - "add_line_draw": "Dann bewege den Mauszeiger dorthin, wo die Linie beginnen soll und {leftclick} klicke oder drücke die `Leertaste` um den ersten Knoten der Linie zu platzieren. Zeichne weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichnens kannst du die Karte verschieben oder hinein zoomen, um mehr Details hinzuzufügen.", + "add_line_draw": "Dann bewege den Mauszeiger dorthin, wo die Linie beginnen soll und {leftclick} klicke oder drücke die `Leertaste` um den ersten Knoten der Linie zu platzieren. Zeichne weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichnens kannst du die Karte zoomen oder ziehen, um mehr Details hinzuzufügen.", "add_line_finish": "Um eine Linie zu beenden drücke `{return}` oder klicke nochmals auf den letzten Knoten.", "modify_line_h": "Linien verändern", - "modify_line_dragnode": "Häufig siehst du Linien die nicht genau geformt sind, beispielweise eine Straße, die nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Linie anzupassen wählst du sie durch {leftclick} klicken aus. Alle Knoten der Linie werden als kleine Kreise angezeigt. Du kannst die Knoten an bessere Stellen verschieben.", + "modify_line_dragnode": "Häufig siehst du Linien die nicht genau geformt sind, beispielweise eine Straße, die nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Linie anzupassen wählst du sie durch {leftclick} klicken aus. Alle Knoten der Linie werden als kleine Kreise angezeigt. Du kannst die Knoten an bessere Stellen ziehen.", "modify_line_addnode": "Du kannst neue Knoten in einer Linie auch durch {leftclick}**x2** Doppelklicken auf die Linie oder durch Ziehen der kleinen Dreiecke in der Mitte zwischen zwei Knoten erzeugen.", "connect_line_h": "Linien verbinden", "connect_line": "Die richtige Verbindung von Straßen ist wichtig für die Karte und notwendig für das Bereitstellung von Wegbeschreibungen.", "connect_line_display": "Die Verbindungen von Straßen werden mit kleinen grauen Kreisen angezeigt. Die Endpunkte von Linien werden mit größeren weisen Kreise angezeigt, wenn sie nicht mit anderen Objekten verbunden sind.", - "connect_line_drag": "Um eine Linie mit einem anderen Objekt zu verbinden, ziehe einen Knoten der Linie auf das andere Objekt bis beide Objekte verbunden sind. Tipp: Du kannst verhindern, dass Knoten mit anderen Objekten verbunden werden, indem du die `{alt}` Taste beim Verschieben gedrückt hältst.", + "connect_line_drag": "Um eine Linie mit einem anderen Objekt zu verbinden, ziehe einen Knoten der Linie auf das andere Objekt bis beide Objekte verbunden sind. Tipp: Du kannst verhindern, dass Knoten mit anderen Objekten verbunden werden, indem du die `{alt}` Taste beim Ziehen gedrückt hältst.", "connect_line_tag": "Wenn du weißt, dass die Kreuzung eine Ampel oder einen Zebrastreifen hat, kannst du diese zeichnen, indem du den Knoten an der Kreuzung auswählst und dann im Objekteditor den richtigen Objekttyp auswählst.", "disconnect_line_h": "Linien trennen", "disconnect_line_command": "Um eine Straße von einem anderen Objekt zu trennen {rightclick} rechtsklicke auf den Verbindungsknoten und benutze den {disconnect} **Trennen** Befehl aus dem Bearbeitungsmenü.", @@ -886,12 +912,12 @@ "point_or_area": "Viele Objekte können als Punkte oder Flächen gezeichnet werden. Du solltest Gebäude und Wohngebiete wenn möglich als Flächen zeichnen. Platziere Punkte innerhalb eines Gebäudes um Geschäfte, Einrichtungen und andere Objekte im Gebäude darzustellen.", "add_area_h": "Flächen hinzufügen", "add_area_command": "Um eine Fläche hinzuzufügen klicke den {area} **Fläche** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `3`. Dadurch wird der Mauszeiger zu einem Kreuz.", - "add_area_draw": "Dann positioniere den Mauszeiger auf eine Ecke des Objekts und {leftclick} klicke oder drücke die `Leertaste` um den ersten Knoten am äußeren Rand der Fläche zu platzieren. Platziere weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichens kannst du die Karte zoomen oder schieben um mehr Details zu zeichnen.", + "add_area_draw": "Dann positioniere den Mauszeiger auf eine Ecke des Objekts und {leftclick} klicke oder drücke die `Leertaste` um den ersten Knoten am äußeren Rand der Fläche zu platzieren. Platziere weitere Knoten durch Klicken oder Drücken der `Leertaste`. Während des Zeichens kannst du die Karte zoomen oder ziehen um mehr Details zu zeichnen.", "add_area_finish": "Um eine Fläche zu beenden drücke `{return}` oder klicke nochmals auf den ersten oder letzten Knoten.", "square_area_h": "Ecken rechtwinklig machen", "square_area_command": "Viele Gebäude und andere Flächen haben rechtwinklige Ecken. Um die Ecken rechtwinklig zu machen, {rightclick} rechtsklicke auf den Rand der Fläche um sie auszuwählen und das Bearbeitungsmenü anzuzeigen und benutze den {orthogonalize} **Rechtwinklig machen** Befehl.", "modify_area_h": "Flächen verändern", - "modify_area_dragnode": "Häufig siehst du Flächen die nicht genau geformt sind, beispielweise ein Gebäude, das nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Fläche anzupassen wählst du sie mit {leftclick} Klicken aus. Alle Knoten der Fläche werden als kleine Kreise angezeigt. Du kannst die Knoten an bessere Stellen verschieben.", + "modify_area_dragnode": "Häufig siehst du Flächen die nicht genau geformt sind, beispielweise ein Gebäude, das nicht mit dem Hintergrund-Bildmaterial zusammenpasst. Um die Form der Fläche anzupassen wählst du sie mit {leftclick} Klicken aus. Alle Knoten der Fläche werden als kleine Kreise angezeigt. Du kannst die Knoten an bessere Stellen ziehen.", "modify_area_addnode": "Du kannst neue Knoten in einer Fläche auch durch {leftclick}**x2** Doppelklicken am Rand der Fläche oder durch Ziehen der kleinen Dreiecke in der Mitte zwischen zwei Knoten erzeugen.", "delete_area_h": "Flächen löschen", "delete_area": "Wenn eine Fläche als Ganzes unrichtig ist, beispielsweise ein Gebäude in der echten Welt nicht existiert, kannst du es löschen. Sei beim Löschen von Objekten vorsichtig: Das von dir benutzte Hintergrund-Bildmaterial kann veraltet sein und das Gebäude, welches falsch aussieht, könnte einfach neu gebaut sein.", @@ -928,7 +954,7 @@ "add_note_h": "Hinweise hinzufügen", "add_note": "Um einen Hinweis hinzuzufügen klicke den {note} **Hinweis** Knopf auf der Werkzeugleiste über der Karte oder drücke die Taste `4`. Dadurch wird der Mauszeiger zu einem Kreuz. Führe dann den Mauszeiger an die Stelle, wo der Hinweis hin soll und {leftclick} klickst oder drücke die `Leertaste`. um ihn zu platzieren.", "move_note": "Nur neue Hinweise können verschoben werden. Dazu bewegst du den Mauszeiger über den Hinweis und drückst und hältst die {leftclick} linke Maustaste, während du den Hinweis zu der neuen Stelle schiebst.", - "update_note_h": "Schließen, Reaktivieren und Kommentieren", + "update_note_h": "Schließen, Wieder öffnen und Kommentieren", "update_note": "Ein bestehender Hinweis kann kommentiert, geschlossen oder wieder geöffnet werden. Einen Hinweis zu schließen bedeutet, dass das dadurch beschriebene Problem erledigt ist. Einen Hinweis wieder zu öffnen bedeutet, dass das ursprünglich Problem doch nicht erledigt ist.", "save_note_h": "Hinweise speichern", "save_note": "Hinweise müssen alle einzeln über den Knopf unter den Hinweis-Kommentaren gespeichert werden. Hinweise sind *nicht* Teil des Änderungssatzes, den du zu OpenStreetMap hochlädst." @@ -938,10 +964,10 @@ "intro": "Das Hintergrund-Bildmaterial welches unter den Kartendaten erscheint ist eine wichtige Quelle zum Zeichnen. Dieses Bildmaterial kann aus Luftbildern bestehen, die von Satelliten, Flugzeugen oder Drohnen gesammelt wurde, oder es können eingescannte historische Karten oder andere frei erhältliche Quelldaten sein.", "sources_h": "Bildmaterial-Quellen", "choosing": "Um zu sehen, welche Bildmaterial-Quellen zum Bearbeiten verfügbar sind klicke den {layers} **Hintergrundeinstellungen** Knopf auf der rechten Seite der Karte. ", - "sources": "Als Standard sind die [Bing](https://www.bing.com/maps/) Satellitenbilder als Hintergrundbild ausgewählt. Abhängig von der Gegend sind auch andere Bildmaterial-Quellen verfügbar. Sie können neuer sein oder eine höhere Auflösung haben, daher ist es immer sinnvoll zu prüfen, welches Bildmaterial die beste Referenz zum Mappen ist.", + "sources": "Als Standard sind die [Bing](https://www.bing.com/maps/) Satellitenbilder als Hintergrundbild ausgewählt. Abhängig von der Gegend sind auch andere Bildmaterial-Quellen verfügbar. Sie können neuer sein oder eine höhere Auflösung haben, daher ist es immer sinnvoll zu prüfen, welches Bildmaterial die beste Referenz zum Bearbeiten ist.", "offsets_h": "Bildmaterial-Versatz anpassen", "offset": "Bildmaterial ist manchmal geringfügig zu genauen Kartendaten versetzt. Wenn du feststellst, dass viele Wege oder Gebäude gegenüber dem Hintergrund-Bildmaterial versetzt sind, dann kann es sein, dass das Bildmaterial versetzt ist, also verschiebe nicht alle Objekte damit sie zum Hintergrund passen. Stattdessen kannst du den Hintergrund anpassen, damit es zu den bestehenden Daten passt indem du den Bereich „Bildmaterial-Versatz anpassen“ unten in den Hintergrundeinstellungen aufklappst.", - "offset_change": "Klicke auf die kleinen Dreiecke um den Bildmaterial-Versatz in kleinen Schritten anzupassen oder halte den linken Mausknopf gedrückt und ziehe innerhalb des grauen Rechtecks um das Bildmaterial zurechtzurücken." + "offset_change": "Klicke auf die kleinen Dreiecke um den Bildmaterial-Versatz in kleinen Schritten anzupassen oder halte die linke Maustaste gedrückt und ziehe innerhalb des grauen Rechtecks um das Bildmaterial zurechtzurücken." }, "streetlevel": { "title": "Straßenfotos", @@ -952,13 +978,13 @@ "viewer": "Wenn du auf eine Fotoposition klickst erscheint die Fotoanzeige in der linken unteren Ecke der Karte. Die Fotoanzeige enthält Kontroll-Knöpfe um vorwärts und rückwärts springen zu können. Es zeigt auch den Benutzernamen der Person, die das Foto erstellt hat, wann das Foto erstellt wurde und einen Link, um das Foto auf der Originalseite zu sehen." }, "gps": { - "title": "GPS Tracks", - "intro": "GPS Tracks sind eine wertvolle Datenquelle für OpenStreetMap. Dieser Editor unterstützt lokale *.gpx*, *.geojson* und *.kml* Dateien auf deinem Computer. Du kannst GPS Tracks mit einem Smartphone, einer Sportuhr oder mit anderen GPS-Geräten aufnehmen.", + "title": "GPS-Tracks", + "intro": "GPS-Tracks sind eine wertvolle Datenquelle für OpenStreetMap. Dieser Editor unterstützt lokale *.gpx*, *.geojson* und *.kml* Dateien auf deinem Computer. Du kannst GPS-Tracks mit einem Smartphone, einer Sportuhr oder mit anderen GPS-Geräten aufnehmen.", "survey": "Für Informationen über das Aufzeichnen von GPS-Daten kannst du dir folgende Anleitung zur [Kartierung mit Smartphone, GPS oder Field Paper](http://learnosm.org/de/mobile-mapping/) durchlesen.", - "using_h": "GPS Tracks verwenden", - "using": "Um einen GPS Track zum Zeichnen zu verwenden, ziehe ihn einfach auf die Karte. Wenn er erkannt wurde, wird er als helle lila Linie auf der Karte angezeigt. Klicke auf den {data} **Kartendaten** Knopf rechts, um die neue Ebene mit dem Track zu aktivieren/deaktivieren oder den GPS-Track auf der Karte anzuzeigen.", - "tracing": "Der GPS Track wird nicht zu OpenStreetMap hochgeladen. Am besten verwendest du ihn als Orientierung um neue Objekte zu zeichnen.", - "upload": "Du kannst auch [deine GPS Tracks zu OpenStreetMap hochladen](https://www.openstreetmap.org/trace/create) damit sie von anderen Benutzern verwendet werden können." + "using_h": "GPS-Tracks verwenden", + "using": "Um einen GPS-Track zum Zeichnen zu verwenden, ziehe ihn einfach per Drag & Drop auf die Karte. Wenn er erkannt wurde, wird er als helle lila Linie auf der Karte angezeigt. Klicke auf den {data} **Kartendaten** Knopf rechts, um die neue Ebene mit dem Track zu aktivieren/deaktivieren oder den GPS-Track auf der Karte anzuzeigen.", + "tracing": "Der GPS-Track wird nicht zu OpenStreetMap hochgeladen. Am besten verwendest du ihn als Orientierung um neue Objekte zu zeichnen.", + "upload": "Du kannst auch [deine GPS-Tracks zu OpenStreetMap hochladen](https://www.openstreetmap.org/trace/create), damit sie von anderen Benutzern verwendet werden können." }, "field": { "restrictions": { @@ -1139,20 +1165,20 @@ }, "navigation": { "title": "Navigation", - "drag": "Der Kartenbereich zeigt die OpenStreetMap Daten über einem Hintergrund.{br}Du kannst die Karte verschieben, drücke und halte dazu die linke Maustaste, während du die Maus verschiebst. Du kannst auch die Pfeiltasten auf der Tastatur benutzen. **Verschiebe die Karte!**", + "drag": "Der Kartenbereich zeigt die OpenStreetMap Daten über einem Hintergrund.{br}Du kannst die Karte verschieben, drücke und halte dazu die linke Maustaste, während du die Maus bewegst. Du kannst auch die Pfeiltasten auf der Tastatur benutzen. **Verschiebe die Karte!**", "zoom": "Du kannst durch Scrollen am Mausrad oder am Touchpad hinein oder heraus zoomen, du kannst dazu auch die {plus} / {minus} Knöpfe klicken. **Zoome die Karte!**", "features": "Wir benutzen das Wort *Objekte* um die Dinge zu beschreiben die auf der Karte angezeigt werden. Alles in der echten Welt kann als ein Objekt in OpenStreetMap abgebildet werden.", "points_lines_areas": "Objekte werden auf der Karte als Punkte, Linien oder Flächen dargestellt.", "nodes_ways": "In OpenStreetMap werden Punkte manchmal *Knoten* genannt, Linien und Flächen werden manchmal *Wege* genannt.", "click_townhall": "Alle Objekte auf der Karte können durch Klicken ausgewählt werden. **Klicke auf den Punkt um ihn zu auszuwählen.**", - "selected_townhall": "Super! Der Punkt ist jetzt ausgewählt. Ausgewählte Objekte werden mit einem pulsierenden Schimmer angezeigt.", + "selected_townhall": "Sehr gut! Der Punkt ist jetzt ausgewählt. Ausgewählte Objekte werden mit einem pulsierenden Schimmer angezeigt.", "editor_townhall": "Wenn ein Objekt ausgewählt ist wird der *Objekteditor* neben der Karte angezeigt.", "preset_townhall": "Der obere Teil des Objekteditors zeigt den Typ des Objekts. Dieser Punkt ist ein {preset}.", "fields_townhall": "Der mittlere Bereich des Objekteditors enthält *Felder* mit den Merkmalen des Objektes wie Name oder Adresse.", "close_townhall": "**Schließe den Objekteditor durch Drücken von Escape oder durch Klicken auf {button} Knopf in der oberen Ecke.**", "search_street": "Du kannst Objekte in der aktuellen Kartenansicht oder weltweit suchen. **Suche nach '{name}'.**", "choose_street": "**Wähle {name} aus der Liste.**", - "selected_street": "Super! Die {name} ist jetzt ausgewählt.", + "selected_street": "Sehr gut! Die {name} ist jetzt ausgewählt.", "editor_street": "Für die Straße werden andere Felder als für das Rathaus angezeigt.{br}Für diese ausgewählte Straße zeigt der Objekteditor Felder wie {field1} oder {field2}. **Schließe den Objekteditor durch Drücken von Escape oder Klicken auf {button} Knopf.**", "play": "Versuche die Karte zu verschieben und auf andere Objekte zu klicken, damit du siehst welche Dinge zu OpenStreetMap hinzugefügt werden können. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**" }, @@ -1190,22 +1216,22 @@ "lines": { "title": "Linien", "add_line": "*Linien* werden benutzt um Objekt wie Straßen, Eisenbahnschienen oder Flüsse darzustellen. **Klicke auf {button} Linie um eine neue Linie zu zeichnen.**", - "start_line": "Hier fehlt eine Straße in OpenStreetMap. Lass sie uns zeichnen!{br}In OpenStreetMap soll die Linie in der Mitte der Straße gezeichnet werden. Du kannst die Karte während des Zeichnens verschieben, wenn das notwendig ist. **Beginne die neue Linie durch Klicken auf das obere Ende der fehlenden Straße.**", + "start_line": "Hier fehlt eine Straße in OpenStreetMap. Lass sie uns zeichnen!{br}In OpenStreetMap soll die Linie in der Mitte der Straße gezeichnet werden. Du kannst die Karte während des Zeichnens zoomen und ziehen, wenn das notwendig ist. **Beginne die neue Linie durch Klicken auf das obere Ende der fehlenden Straße.**", "intersect": "Klicke oder Drücke die Leertaste um neue Knoten zur Linien hinzuzufügen.{br} Straßen und viele andere Typen von Linien sind Teil eines größeren Netzwerks. Es ist wichtig dass diese Linien verbunden sind, damit Routing-Anwendungen richtig funktionieren. **Klicke auf {name} um eine Kreuzung zu erzeugt, die beide Linien verbindet.**", "retry_intersect": "Diese Straße soll {name} kreuzen. Versuch es nochmals!", - "continue_line": "Setze das Zeichnen der Linie für die neue Straße fort. Du kannst die Karte verschieben, wenn das notwendig ist.{br}Wenn du fertig bist klicke nochmals auf den letzten Knoten. **Beende das Zeichnen der Straße.**", + "continue_line": "Setze das Zeichnen der Linie für die neue Straße fort. Du kannst die Karte zoomen und ziehen, wenn das notwendig ist.{br}Wenn du fertig bist klicke nochmals auf den letzten Knoten. **Beende das Zeichnen der Straße.**", "choose_category_road": "**Wähle {category} aus der Liste.**", - "choose_preset_residential": "Es gibt viele verschiedene Typen von Straßen, diese ist eine Anliegerstraße. **Wähle {preset}.**", + "choose_preset_residential": "Es gibt viele verschiedene Typen von Straßen, diese ist eine Ortsstraße. **Wähle {preset}.**", "retry_preset_residential": "Du hast nicht {preset} ausgewählt. **Klicke hier um erneut zu wählen.**", "name_road": "**Gib dieser Straße einen Namen, dann drücke Escape oder Enter oder klicke den {button} Knopf um den Objekteditor zu schließen.**", "did_name_road": "Sieht gut aus! Jetzt wirst du lernen, wie die Form einer Linie verbessern kannst.", "update_line": "Manchmal musst du die Form einer bestehenden Linie ändern. Hier ist eine Straße die nicht ganz richtig aussieht.", "add_node": "Du kannst weitere Knoten zu einer Linie hinzufügen, um die Form einer Linie zu verbessern. Eine Möglichkeit um neue Knoten zu zeichnen ist ein Doppelklick auf die Stelle der Linie, wo der neue Knoten entstehen soll. **Doppelklicke auf die Linie um einen neuen Knoten zu erzeugen.**", - "start_drag_endpoint": "Wenn eine Linie ausgewählt ist, kannst du jeden Knoten dieser Linie durch Klicken und Festhalten des linken Mausknopfs verschieben. **Schiebe den letzten Knoten der Linie dorthin, wo sich diese Straßen kreuzen sollen.**", - "finish_drag_endpoint": "Hier sieht es gut aus. **Lass den Mausknopf aus, um das Verschieben zu beenden.**", + "start_drag_endpoint": "Wenn eine Linie ausgewählt ist, kannst du jeden Knoten dieser Linie durch Klicken und Festhalten der linken Maustaste verschieben. **Schiebe den letzten Knoten der Linie dorthin, wo sich diese Straßen kreuzen sollen.**", + "finish_drag_endpoint": "Hier sieht es gut aus. **Lass die Maustaste aus, um das Verschieben zu beenden.**", "start_drag_midpoint": "Kleine Dreiecke werden am *Mittelpunkt* zwischen zwei Knoten angezeigt. Eine weitere Möglichkeit um einen neuen Knoten zu erzeugen ist das Verschieben dieses Mittelpunkts zu einer neuen Stelle. **Schiebe den Mittelpunkt und erzeuge damit einen neuen Knoten in der Straßenkurve.**", "continue_drag_midpoint": "Diese Linie sieht viel besser aus! Setze das Anpassen der Linie durch Doppelklicken oder Verschieben von Mittelpunkten fort, bis die Kurve dem Straßenverlauf folgt. **Wenn Dir die Linie gefällt, klicke OK.**", - "delete_lines": "Wenn es Straßen in der echten Welt nicht gibt, kannst du die zugehörigen Linien löschen.{br}Hier hat die Stadt eine {street} geplant, aber nie gebaut. Du kannst diesen Teil der Karte verbessern, wenn du die zusätzlichen Linien löschst.", + "delete_lines": "Wenn es Straßen in der echten Welt nicht gibt, kannst du die zugehörigen Linien löschen.{br}Hier hat die Stadt eine {street} geplant, aber nie gebaut. Du kannst diesen Teil der Karte verbessern, wenn du die fehlerhaften Linien löschst.", "rightclick_intersection": "Die letzte bestehende Straße ist {street1}, daher wirst du die {street2} an dieser Kreuzung *teilen* und alles darüber löschen. **Rechtsklicke auf den Kreuzungs-Knoten.**", "split_intersection": "**Klicke auf {button} Knopf um die {street} zu teilen.**", "retry_split": "Du hast den Teilen-Knopf nicht gedrückt. Versuch es nochmals.", @@ -1213,7 +1239,7 @@ "did_split_single": "**Klicke den oberen Teil von {street2} zum Auswählen.**", "multi_select": "Die {selected} ist jetzt ausgewählt. Wähle zusätzlich die {other1} aus. Du kannst Shift-Klicken um mehrere Objekte zu wählen. **Shift-Klicke auf die {other2}.**", "multi_rightclick": "Gut! Beide zu löschenden Linien sind jetzt ausgewählt. **Rechtsklicke auf eine der beiden Linien um das Bearbeitungs-Menü zu zeigen.**", - "multi_delete": "**Klicke auf {button} Knopf um die zusätzlichen Linien zu löschen.**", + "multi_delete": "**Klicke auf {button} Knopf um die fehlerhaften Linien zu löschen.**", "retry_delete": "Du hast den Löschen-Knopf nicht geklickt. Versuche es nochmals.", "play": "Großartig! Verwende das Gelernte um das Bearbeiten von Linien zu üben. **Wenn du zum nächsten Kapitel willst, klicke '{next}'.**" }, @@ -1245,7 +1271,7 @@ "help": "Du bist nun bereit OpenStreetMap zu bearbeiten!{br}Du kannst mit dem {button} Hilfe-Knopf oder der '{key}'-Taste mehr Dokumentation ansehen und diesen Rundgang wieder aufrufen.", "shortcuts": "Du kannst eine Liste der Befehle zusammen mit ihren Tastenkürzeln durch Drücken der '{key}'-Taste ansehen.", "save": "Vergiss nicht, regelmäßig zu speichern, um die Änderungen zu OpenStreetMap hochzuladen!", - "start": "Beginne mit dem Mappen!" + "start": "Beginne mit dem Bearbeiten!" } }, "shortcuts": { @@ -1441,31 +1467,35 @@ "label": "Erlaubter Zugang", "options": { "designated": { - "description": "Zugang durch Schilder oder bestimmte lokale Gesetze erlaubt", + "description": "Zugang entsprechend lokaler Vorschriften oder Schildern erlaubt", "title": "
rechtsverbindlich vorgesehen / gewidmet
" }, "destination": { - "description": "Zugang nur für Anlieger/Anrainer", + "description": "Zugang erlaubt, Durchgang verboten", "title": "Ziel" }, "dismount": { - "description": "Zutritt erlaubt, aber Radfahrer müssen absteigen", + "description": "Zugang erlaubt, für Fahrräder nur schiebend", "title": "Absteigen" }, "no": { - "description": "Zugang der Allgemeinheit nicht erlaubt", + "description": "Zugang für die Öffentlichkeit verboten", "title": "Verboten" }, "permissive": { - "description": "Zugang solange gewährt, bis der Besitzer seine Erlaubnis zurück nimmt.", + "description": "Zugang bis auf Widerruf", "title": "Geduldet" }, + "permit": { + "description": "Zugang nur mit Erlaubnis nach Zustimmung zu allgemeinen Bedingungen", + "title": "Zugang nur nach Zustimmung zu Nutzungsbedingungen" + }, "private": { - "description": "Zugang nur mit individueller Erlaubnis des Eigentümers", + "description": "Zugang nur nach Zustimmung des Eigentümers auf individueller Basis", "title": "Privat" }, "yes": { - "description": "Zugang gesetzlich erlaubt; Wegerecht", + "description": "Zugang erlaubt laut Gesetz; Wegerecht", "title": "Erlaubt" } }, @@ -1600,7 +1630,7 @@ "label": "Sandbad" }, "bath/type": { - "label": "Spezialität", + "label": "Art der Badeanstalt", "options": { "foot_bath": "Fußbad", "hot_spring": "Therme", @@ -2013,7 +2043,7 @@ "label": "Historische Zivilisation" }, "hoops": { - "label": "Basketball", + "label": "Ringe", "placeholder": "1, 2, 4 ..." }, "horse_dressage": { @@ -2221,7 +2251,7 @@ "placeholder": "0, 1, 2, 3, 4, 5, 6" }, "mtb/scale/imba": { - "label": "IMBA-Schwierigkeitsgrad", + "label": "Bikepark-IMBA-Schwierigkeitsgrad", "options": { "0": "Am einfachsten (weißer Kreis)", "1": "Einfach (grüner Kreis)", @@ -2546,7 +2576,7 @@ "crossover": "Überleitgleis", "siding": "Überhol-/Ausweichgleis", "spur": "Anschluss-/Ladegleis", - "yard": "Nebengleich (Rangier-/Abstellgleis)" + "yard": "Nebengleis (Rangier-/Abstellgleis)" } }, "service_times": { @@ -3241,8 +3271,8 @@ "terms": "Musikschule" }, "amenity/nightclub": { - "name": "Nachtklub", - "terms": "Nachtklub, Etablissement, Nachtlokal" + "name": "Diskothek, Nachtklub", + "terms": "Nachtklub, Etablissement, Nachtlokal, Disko" }, "amenity/nursing_home": { "name": "Pflegeheim" @@ -4841,6 +4871,10 @@ "name": "American-Football-Feld", "terms": "American-Football-Platz" }, + "leisure/pitch/badminton": { + "name": "Badmintonplatz", + "terms": "Badmintonplatz" + }, "leisure/pitch/baseball": { "name": "Baseball-Rautenfeld", "terms": "Baseball-Platz, Baseball-Feld" @@ -4965,6 +4999,10 @@ "name": "Brücke", "terms": "Brücke, Brückenbauwerk, Steg, Übergang" }, + "man_made/bunker_silo": { + "name": "Fahrsilo", + "terms": "offener Schüttgutbunker, Fahrsilokammer" + }, "man_made/chimney": { "name": "Schornstein", "terms": "Schornstein, Kamin" @@ -5404,7 +5442,7 @@ }, "place/locality": { "name": "Örtlichkeit", - "terms": "Ort, Gegend" + "terms": "Ort, Gegend, Flurname, Flur" }, "place/neighbourhood": { "name": "Wohngegend", @@ -5487,8 +5525,8 @@ "terms": "Schaukel" }, "playground/zipwire": { - "name": "Seilrutsche", - "terms": "Seilrutsche" + "name": "Seilbahn Spielplatz", + "terms": "Seilrutsche, Seilbahn, Spielplatz" }, "point": { "name": "Punkt", @@ -5563,16 +5601,16 @@ "terms": "Stadtbahnhaltestelle (Wartebereich), Wartebereich einer Stadtbahnhaltestelle" }, "public_transport/linear_platform_monorail": { - "name": "Einschienenbahnhaltestelle (Wartebereich)", + "name": "Einschienenbahn-Bahnsteig (Wartebereich )", "terms": "Einschienenbahnhaltestelle (Wartebereich), Wartebereich einer Einschienenbahnhaltestelle" }, "public_transport/linear_platform_subway": { - "name": "U-Bahnhaltestelle (Wartebereich)", + "name": "U-Bahn-Bahnsteig (Wartebereich)", "terms": "U-Bahnhaltestelle (Wartebereich), Wartebereich einer U-Bahnhaltestelle" }, "public_transport/linear_platform_train": { - "name": "Eisenbahnhaltestelle (Wartebereich)", - "terms": "Eisenbahnhaltestelle (Wartebereich), Wartebereich einer Eisenbahnhaltestelle" + "name": "Bahnsteig (Wartebereich Eisenbahn)", + "terms": "Bahnsteig (Wartebereich), Eisenbahnhaltestelle (Wartebereich), Wartebereich einer Eisenbahnhaltestelle" }, "public_transport/linear_platform_tram": { "name": "Straßenbahnhaltestelle (Wartebereich)", @@ -6872,6 +6910,27 @@ }, "name": "Hike & Bike" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi Schneemobil Spuren von OSM (Nordische Abdeckung)", + "name": "Nordisches Schneemobil Overlay" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic von schwedischen Orthofotos von 1955–1965. Frühere und spätere Aufnahmen können vorkommen.", + "name": "Lantmäteriet Historische Orthophotos 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic von schwedischen Orthofotos von 1970-1980. Wird noch aufgebaut.", + "name": "Lantmäteriet Historische Orthophotos 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Bedingungen & Feedback" @@ -6908,8 +6967,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Scan der ´Ökonomischen Karten´ circa 1950-1980", - "name": "Lantmäteriet Ökonomische Karte (historisch)" + "description": "Scans von „ökonomischen Karten“ ca. 1950-1980", + "name": "Lantmäteriet ökonomische Karte von 1950–1980" }, "qa_no_address": { "attribution": { @@ -6923,6 +6982,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Schneemobil-Spuren", + "name": "Schneemobil Karte von Schweden" + }, "stamen-terrain-background": { "attribution": { "text": "Kacheln © Stamen Design, CC BY 3.0, Kartendaten © OpenStreetMap-Mitwirkende, ODbL 1.0" @@ -6985,6 +7051,14 @@ } }, "community": { + "bw-facebook": { + "name": "Botswana Mappen auf Facebook", + "description": "Website von OpenStreetMap in Botswana" + }, + "bw-twitter": { + "name": "Botswana Mappen auf Twitter", + "description": "Botswana Mappen auf Twitter" + }, "cape-coast-youthmappers": { "name": "Universität von Cape Coast YouthMappers", "description": "Folge uns auf Twitter: {url}", @@ -7349,6 +7423,18 @@ "name": "OpenStreetMap Ungarn Treffen", "description": "Die Plattform um Treffen in Ungarn zu organisieren" }, + "is-facebook": { + "name": "OSM Island auf Facebook", + "description": "Website von OpenStreetMap in Island" + }, + "is-mailinglist": { + "name": "Talk-is Mailing Liste", + "description": "Talk-is ist die offizielle Mailing Liste für die isländische OSM Gemeinschaft" + }, + "is-twitter": { + "name": "OSM Island auf Twittter", + "description": "Twitter von OpenStreetMap in Island" + }, "it-facebook": { "name": "OpenStreetMap Italien Facebook", "description": "Beteilige dich an der OpenStreetMap Italien Gemeinschaft auf Facebook" @@ -7367,7 +7453,7 @@ }, "it-twitter": { "name": "OpenStreetMap Italien Twitter", - "description": "Folge uns auf Twitter auf {url}" + "description": "Folge uns auf Twitter {url}" }, "OSM-Rome-meetup": { "name": "Einführung für Mapper in Rom", @@ -7690,6 +7776,11 @@ "name": "OpenStreetMap Brasilien Twitter", "description": "Folge uns auf Twitter {url}" }, + "RS-telegram": { + "name": "OpenStreetMap Rio Grande do Sul Telegram Group", + "description": "Beteilige dich an der OpenStreetMap Rio Grande do Sul Gemeinschaft auf Telegram", + "extendedDescription": "Beteilige dich an der Gemeinschaft um mehr über OpenStreetMap zu lernen, zu fragen oder an unseren Treffen teilzunehmen. Alle sind willkommen!" + }, "OSM-CL-facebook": { "name": "OpenStreetMap Chile Facebook", "description": "Beteiligte dich an der OpenStreetMap Chile Gemeinschaft auf Facebook", @@ -7760,12 +7851,35 @@ }, "OSM-PE-twitter": { "name": "OpenStreetMap Peru Twitter", - "description": "Folge uns auf Twitter unter {url}" + "description": "Folge uns auf Twitter {url}" }, "OSM-PE": { "name": "OpenStreetMap Peru", "description": "Neuigkeiten und Quellen für die OpenStreetMap Peru Gemeinschaft" }, + "LATAM-Facebook": { + "name": "OpenStreetMap Lateinamerika Facebook", + "description": "OpenStreetMap Lateinamerika auf Facebook" + }, + "LATAM-Telegram": { + "name": "OpenStreetMap Lateinamerika auf Telegram", + "description": "OpenStreetMap Telegram für Lateinamerika" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Lateinamerika auf Twitter", + "description": "Folge uns auf Twitter {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Lateinamerika", + "description": "Unterstützung für OpenStreetMap in Lateinamerika", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Lateinamerika 2018", + "description": "State of the Lateinamerika ist die jährliche Konferenz für alle Mapper und Benutzer von OpenStreetMap in Lateinamerika. Das Programm beinhaltet Gespräche, Panels, Workshop und Mapathon für OpenStreetMap.", + "where": "Buenos Aires, Argentinien" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap auf Facebook", "description": "Like uns auf Facebook für Nachrichten und Updates über OpenStreetMap." @@ -7785,7 +7899,7 @@ }, "OSM-Twitter": { "name": "OpenStreetMap Twitter", - "description": "Folge uns auf Twitter unter {url}" + "description": "Folge uns auf Twitter {url}" }, "OSMF": { "name": "OpenStreetMap Foundation (OSM Stiftung)", diff --git a/dist/locales/el.json b/dist/locales/el.json index 07377dbb4..918ddc4d1 100644 --- a/dist/locales/el.json +++ b/dist/locales/el.json @@ -21,6 +21,11 @@ "description": "Προσθήκη εστιατορίων, μνημείων, γραμματοκιβωτίων ή άλλων σημείων στον χάρτη.", "tail": "Πατήστε στον χάρτη για να προσθέσετε ένα σημείο." }, + "add_note": { + "title": "Σημείωση", + "description": "Βρήκες κάποιο πρόβλημα; Ενημέρωσε τους χαρτογράφους.", + "tail": "Κλικ στον χάρτη για σημείωση." + }, "browse": { "title": "Επισκόπηση", "description": "Μετακίνηση και εστίαση του χάρτη." @@ -40,7 +45,8 @@ "annotation": { "point": "Προστέθηκε ένα σημείο.", "vertex": "Προστέθηκε κόμβος σε διαδρομή.", - "relation": "Προστέθηκε μια σχέση." + "relation": "Προστέθηκε μια σχέση.", + "note": "Προστέθηκε σημείωση." } }, "start": { @@ -261,6 +267,10 @@ "create": "Προστέθηκε μια απαγόρευση στροφής", "delete": "Διαγράφηκε μια απαγόρευση στροφής" } + }, + "detach_node": { + "title": "Αποσύνδεση", + "description": "Αποσύνδεση αυτού του κόμβου από αυτές τις γραμμές/περιοχές" } }, "restriction": { @@ -313,6 +323,8 @@ "localized_translation_name": "Όνομα" }, "zoom_in_edit": "Μεγέθυνση για επεξεργασία", + "login": "Σύνδεση", + "logout": "Αποσύνδεση", "loading_auth": "Σύνδεση στο OpenStreetMap...", "report_a_bug": "Αναφορά σφάλματος", "help_translate": "Βοηθήστε στη μετάφραση", @@ -370,7 +382,9 @@ "edited_by": "Επεξεργάστηκε από", "changeset": "Πακέτο αλλαγών", "unknown": "Άγνωστο", - "link_text": "Ιστορικό στο openstreetmap.org" + "link_text": "Ιστορικό στο openstreetmap.org", + "note_comments": "Σχόλια", + "note_link_text": "Σημείωση στο openstreetmap.org" }, "location": { "title": "Τοποθεσία", @@ -399,7 +413,8 @@ "vertex": "κορυφή", "line": "γραμμή", "area": "περιοχή", - "relation": "σχέση" + "relation": "σχέση", + "note": "σημείωση" }, "geocoder": { "search": "Αναζήτηση παγκοσμίως...", @@ -461,7 +476,6 @@ "best_imagery": "Η καλύτερη γνωστή πηγή εικόνας για αυτήν την τοποθεσία", "switch": "Επέστρεψε σε αυτό το παρασκήνιο", "custom": "Εξατομικευμένο", - "custom_button": "Επεξεργασία εξατομικευμένου παρασκηνίου", "overlays": "Επικαλύψεις", "imagery_source_faq": "Πληροφορία εικόνας / Αναφορά προβλήματος", "reset": "Μηδενισμός", @@ -486,6 +500,9 @@ "osm": { "tooltip": "Δεδομένα χάρτη από το OpenStreetMap", "title": "Δεδομένα OpenStreetMap" + }, + "notes": { + "title": "σημειώσεις OpenStreetMap" } }, "fill_area": "Γέμισμα περιοχών", @@ -652,10 +669,8 @@ }, "cannot_zoom": "Δεν είναι δυνατή μεγαλύτερη σμίκρυνση στην τρέχουσα κατάσταση λειτουργίας.", "full_screen": "Αλλάξτε σε Πλήρη Οθόνη", - "gpx": { - "drag_drop": "Σύρετε και αποθέστε ένα αρχείο .gpx, .geojson ή .kml στη σελίδα ή κάντε κλικ στο κουμπί στα δεξιά για να περιηγηθείτε", - "zoom": "Μεγένθυνε στη στρώση", - "browse": "Αναζητήστε ένα αρχείο" + "streetside": { + "hires": "Υψηλή ανάλυση" }, "mapillary_images": { "tooltip": "Φωτογραφίες στο επίπεδο του δρόμου από το Mapillary", @@ -675,6 +690,16 @@ "openstreetcam": { "view_on_openstreetcam": "Δείτε αυτήν την εικόνα στο OpenStreetCam" }, + "note": { + "note": "Σημείωση", + "title": "Επεξεργασία σημείωσης", + "commentTitle": "Σχόλια", + "newComment": "Νέο Σχόλιο", + "comment": "Σχόλιο", + "report": "Αναφορά", + "new": "Νέα Σημείωση", + "save": "Αποθήκευση σημείωσης" + }, "help": { "title": "Βοήθεια", "help": { @@ -807,6 +832,9 @@ "boundary": "Η σχέση *όριο* είναι μια ομάδα ενός ή περισσοτέρων χαρακτηριστικών γραμμής που μαζί σχηματίζουν ένα διοικητικό όριο.", "boundary_add": "Για να προσθέσετε ένα χαρακτηριστικό σε μια σχέση ορίων, επιλέξτε το χαρακτηριστικό και μετακινηθείτε προς τα κάτω στην ενότητα \"Όλες οι σχέσεις\" του επεξεργαστή χαρακτηριστικών, και στη συνέχεια κάντε κλικ στο κουμπί προσθήκης {συν} για να προσθέσετε αυτό το χαρακτηριστικό σε μια υπάρχουσα σχέση ή σε μια νέα σχέση." }, + "notes": { + "save_note_h": "Αποθήκευση Σημειώσεων" + }, "imagery": { "title": "Εικόνα Φόντου", "intro": "Οι εικόνες φόντου που εμφανίζονται κάτω από τα δεδομένα χαρτών αποτελούν σημαντική πηγή για τη χαρτογράφηση. Αυτή η εικόνα μπορεί να είναι αεροφωτογραφίες που συλλέγονται από δορυφόρους, αεροπλάνα και drones, ή μπορούν να σαρωθούν ιστορικοί χάρτες ή άλλες ελεύθερες διαθέσιμες πηγές δεδομένων.", @@ -1101,6 +1129,7 @@ "add_point": "Λειτουργία \"Προσθήκη σημείου\"", "add_line": "Λειτουργία \"Προσθήκη γραμμής\"", "add_area": "Λειτουργία \"Προσθήκη περιοχής\"", + "add_note": "Λειτουργία \"Προσθήκη σημείωσης\"", "stop_line": "Τερματισμός σχεδιασμού μιας γραμμής ή μια περιοχής" }, "operations": { @@ -1209,31 +1238,24 @@ "label": "Επιτρεπόμενη Πρόσβαση", "options": { "designated": { - "description": "Η πρόσβαση επιτρέπεται βάσει πινακίδων ή συγκεκριμένων τοπικών νόμων", "title": "Καθορισμένο" }, "destination": { - "description": "Η πρόσβαση επιτρέπεται μόνο για να φτάσετε σε κάποιο προορισμό", "title": "Προορισμός" }, "dismount": { - "description": "Η πρόσβαση επιτρέπεται αλλά ο αναβάτης πρέπει να κατέβει.", "title": "Αποσύνδεση" }, "no": { - "description": "Η πρόσβαση δεν επιτρέπεται στο ευρύ κοινό", "title": "Απαγορεύεται" }, "permissive": { - "description": "Η πρόσβαση επιτρέπεται μέχρι ο ιδιοκτήτης να αναιρέσει την άδεια", "title": "Επιτρεπόμενη" }, "private": { - "description": "Η πρόσβαση επιτρέπεται μόνο με άδεια από τον ιδιοκτήτη σε ατομική βάση", "title": "Ιδιωτική" }, "yes": { - "description": "Η πρόσβαση επιτρέπεται νόμιμα: δικαίωμα διέλευσης", "title": "Επιτρέπεται" } }, @@ -2627,10 +2649,6 @@ "name": "Ενοικιαζόμενα Ποδηλάτα", "terms": "Κοινόχρηστα Ποδήλατα, Ενοικίαση Ποδηλάτων" }, - "amenity/biergarten": { - "name": "Κήπος Μπυραρίας", - "terms": "Υπαίθρια μπιραρία" - }, "amenity/boat_rental": { "name": "Ενοικίαση Σκαφών" }, diff --git a/dist/locales/en-AU.json b/dist/locales/en-AU.json new file mode 100644 index 000000000..7251e1fed --- /dev/null +++ b/dist/locales/en-AU.json @@ -0,0 +1,17 @@ +{ + "en-AU": { + "presets": { + "presets": { + "amenity/fuel": { + "name": "Service Station" + }, + "footway/sidewalk": { + "name": "Footpath" + }, + "tourism/caravan_site": { + "name": "Caravan Site" + } + } + } + } +} \ No newline at end of file diff --git a/dist/locales/en-GB.json b/dist/locales/en-GB.json index eb12b4afd..3c714a8c7 100644 --- a/dist/locales/en-GB.json +++ b/dist/locales/en-GB.json @@ -507,8 +507,6 @@ "best_imagery": "Best known imagery source for this location", "switch": "Switch back to this background", "custom": "Custom", - "custom_button": "Edit custom background", - "custom_prompt": "Enter a tile URL template. Valid tokens are:\n - {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n - {-y} or {ty} for flipped TMS-style Y coordinates\n - {u} for quadtile scheme\n - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}", "overlays": "Overlays", "imagery_source_faq": "Imagery Info / Report a Problem", "reset": "reset", @@ -707,11 +705,6 @@ }, "cannot_zoom": "Cannot zoom out further in current mode.", "full_screen": "Toggle Full Screen", - "gpx": { - "drag_drop": "Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse", - "zoom": "Zoom to layer", - "browse": "Browse for a file" - }, "streetside": { "report": "Report a privacy concern with this image" }, @@ -1374,31 +1367,24 @@ "label": "Allowed Access", "options": { "designated": { - "description": "Access permitted according to signs or specific local laws", "title": "Designated" }, "destination": { - "description": "Access permitted only to reach a destination", "title": "Destination" }, "dismount": { - "description": "Access permitted but rider must dismount", "title": "Dismount" }, "no": { - "description": "Access not permitted to the general public", "title": "Prohibited" }, "permissive": { - "description": "Access permitted until such time as the owner revokes the permission", "title": "Permissive" }, "private": { - "description": "Access permitted only with permission of the owner on an individual basis", "title": "Private" }, "yes": { - "description": "Access permitted by law; a right of way", "title": "Allowed" } }, @@ -2927,9 +2913,6 @@ "amenity/bicycle_repair_station": { "name": "Bicycle Repair Tool Stand" }, - "amenity/biergarten": { - "name": "Beer Garden" - }, "amenity/boat_rental": { "name": "Boat Rental" }, diff --git a/dist/locales/eo.json b/dist/locales/eo.json index 29059e119..6be670f75 100644 --- a/dist/locales/eo.json +++ b/dist/locales/eo.json @@ -429,7 +429,12 @@ "edited_by": "Redaktita de", "changeset": "Ŝanĝaro", "unknown": "Nekonata", - "link_text": "Historio ĉe openstreetmap.org" + "link_text": "Historio ĉe openstreetmap.org", + "note_no_history": "Neniu historio (nova rimarko)", + "note_comments": "Komentoj", + "note_created_date": "Kreita je", + "note_created_user": "Kreita de", + "note_link_text": "Rimarko ĉe openstreetmap.org" }, "location": { "key": "L", @@ -459,7 +464,8 @@ "vertex": "vertico", "line": "linio", "area": "areo", - "relation": "rilato" + "relation": "rilato", + "note": "rimarko" }, "geocoder": { "search": "Serĉi tutmonde…", @@ -522,8 +528,6 @@ "best_imagery": "Plej bona fonto de fotaro por ĉi tiu loko", "switch": "Baskuli reen al ĉi tiu fono", "custom": "Propra", - "custom_button": "Redakti propran fonon", - "custom_prompt": "Entajpu URL-skemon de kaheloj. Ĝustaj ĵetonoj estas:\n - {zoom}/{z}, {x}, {y} por Z/X/Y kahela skemo\n - {-y} aŭ {ty} por renversaj TMS-stilaj Y-koordinatoj\n - {u} por kvarkahela (quadtile) skemo\n - {switch:a,b,c} por DNS-servila kunigado (multiplexing)\n\nEkzemplo:\n{example}", "overlays": "Surtavoloj", "imagery_source_faq": "Pri fotaro / Raporti problemon", "reset": "restarigi", @@ -625,6 +629,16 @@ "tooltip": "Areoj estas bildigataj tute plenigitaj." } }, + "settings": { + "custom_background": { + "tooltip": "Redakti propran fonon", + "header": "Agordoj de propra fono", + "instructions": "Entajpu URL-skemon de kaheloj. Ĝustaj ĵetonoj estas:\n {zoom}/{z}, {x}, {y} por Z/X/Y kahela skemo\n {-y} aŭ {ty} por renversaj TMS-stilaj Y-koordinatoj\n {u} por kvarkahela (quadtile) skemo\n {switch:a,b,c} por DNS-servila kunigado (multiplexing)\n\nEkzemplo:\n{example}", + "template": { + "placeholder": "Redakti ligilon de ŝablono" + } + } + }, "restore": { "heading": "Vi havas nekonservitajn ŝanĝojn", "description": "Ĉu vi volas restarigi nekonservitajn ŝanĝojn de antaŭa redaktada seanco?", @@ -725,18 +739,6 @@ }, "cannot_zoom": "Ne povas plie plibonigi en nuna reĝimo.", "full_screen": "Baskuligi plenekranon", - "gpx": { - "local_layer": "Aldoni GPX", - "drag_drop": "Ŝovu kaj demetu .gpx, geojson aŭ .kml dosieron sur la paĝon, aŭ klaku la butonon ĉe dekstre por foliumi", - "zoom": "Pligrandigi tavolon", - "browse": "Esplori por dosieron" - }, - "mvt": { - "local_layer": "Aldoni MVT", - "drag_drop": "Ŝovu kaj demetu .mvt aŭ .pbf dosieron sur la paĝon, aŭ klaku la butonon ĉe dekstre por esplori", - "zoom": "Pligrandigi tavolon", - "browse": "Esplori por dosieron" - }, "streetside": { "tooltip": "Strat-nivelaj fotoj de Microsoft", "title": "Fotara surtavolo (Bing Streetside)", @@ -768,6 +770,12 @@ "anonymous": "anonimulo", "closed": "(fermita)", "commentTitle": "Komentoj", + "status": { + "opened": "malfermita je {when}", + "reopened": "remalfermita je {when}", + "commented": "komentita je {when}", + "closed": "fermita je {when}" + }, "newComment": "Nova komento", "inputPlaceholder": "Skribu komenton por sciigi aliajn uzantojn.", "close": "Fermi rimarkon", @@ -1458,8 +1466,12 @@ "description": "Aliro estas permesata ĝis la posedanto revokos konsenton", "title": "Verŝajne permesata" }, + "permit": { + "description": "Aliro permesata nur por havantoj de valida paspermeso", + "title": "Paspermeso postulata" + }, "private": { - "description": "Aliro estas permesata nur laŭ individua permeso de la posedanto", + "description": "Aliro permesata nur laŭ permeso de posedanto individue", "title": "Privata" }, "yes": { @@ -4839,6 +4851,10 @@ "name": "Uson-futbala ludkampo", "terms": "futbalo usona,usona futbalo,usona piedpilkado,amerika futbalo" }, + "leisure/pitch/badminton": { + "name": "Badmintona ludkampo", + "terms": "badmintono,volanludo,teniso" + }, "leisure/pitch/baseball": { "name": "Basbala ludkampo", "terms": "basbalo,bazpilkado" @@ -4963,6 +4979,10 @@ "name": "Ponto", "terms": "viadukto" }, + "man_made/bunker_silo": { + "name": "Stokejo senkovra", + "terms": "turstokejo,stokturo,silo,magazeno" + }, "man_made/chimney": { "name": "Kamentubo", "terms": "kameno,fumtubo" @@ -6175,8 +6195,8 @@ "terms": "panejo,bakejo,sukeraĵejo" }, "shop/pawnbroker": { - "name": "Lombardejo", - "terms": "lombardo,monprunto" + "name": "Mon-pruntejo (kontraŭ garantiaĵo)", + "terms": "lombardo,monprunto,lombardejo,pruntejo" }, "shop/perfumery": { "name": "Parfuma vendejo", @@ -6231,8 +6251,8 @@ "terms": "papervarejo" }, "shop/storage_rental": { - "name": "Lombardejo (por-long-tempa)", - "terms": "lombardejo,konservejo" + "name": "Magazena spaco por lui", + "terms": "konservejo,magazeno privata" }, "shop/supermarket": { "name": "Superbazaro", @@ -6668,7 +6688,7 @@ "attribution": { "text": "Aera fotaro pri Flandrujo © AGIV" }, - "name": "Aera fotaro 10cm de Informa Geografia Agentejo de Flandrujo (AGIV/FGIA) de 2013-2015" + "name": "Aera fotaro 10cm de Informa Geografia Agentejo de Flandrujo (AGIV/FGIA) de 2013–2015" }, "AGIVFlandersGRB": { "attribution": { @@ -6698,7 +6718,7 @@ "attribution": { "text": "Kondiĉoj kaj rimarkoj" }, - "description": "DigitalGlobe-Standard estas prizorgata fotaro ampleksanta 86% da tero je distingivo 30-60cm (se disponebla), danke al programo Landsat. Mezuma aĝo de fotaro estas 2,31a, sed kelkaj areoj estas aktualigataj dufoje en jaro.", + "description": "DigitalGlobe-Standard estas prizorgata fotaro ampleksanta 86% da tero je distingivo 30–60cm (se disponebla), danke al programo Landsat. Mezuma aĝo de fotaro estas 2,31a, sed kelkaj areoj estas aktualigataj dufoje en jaro.", "name": "Norma fotaro de DigitalGlobe" }, "DigitalGlobe-Standard-vintage": { @@ -6873,6 +6893,27 @@ }, "name": "Hike & Bike" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Motorsledaj kursoj el OSM en Nordlandoj (Kelkkareitit.fi)", + "name": "Nordlanda motorsleda surtavolo" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Kunmetaĵo de Sveda aera fotaro de jaroj 1955–1965. Pli novaj kaj pli malnovaj fotoj povas esti miksitaj.", + "name": "Lantmäteriet historia aera fotaro 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Kunmetaĵo de Sveda aera fotaro de jaroj 1970–1980. Estos plivastigita.", + "name": "Lantmäteriet historia aera fotaro 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Kondiĉoj kaj rimarkoj" @@ -6909,8 +6950,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Skano de “ekonomia mapo” ~1950-1980", - "name": "Lantmäteriet ekonomia mapo (historia)" + "description": "Skano de “ekonomia mapo” ~1950–1980", + "name": "Lantmäteriet ekonomia mapo ~1950–1980" }, "qa_no_address": { "attribution": { @@ -6924,6 +6965,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Mapo de motorsledaj kursoj", + "name": "Motorsledaj kursoj en Svedujo" + }, "stamen-terrain-background": { "attribution": { "text": "Map-kaheloj de Stamen Design, laŭ CC BY 3.0. Datumoj de OpenStreetMap, laŭ ODbL" @@ -6986,6 +7034,206 @@ } }, "community": { + "bw-facebook": { + "name": "Mapping Botswana ĉe Facebook", + "description": "Facebook-paĝo pri OpenStreetMap en Bocvano" + }, + "bw-twitter": { + "name": "Mapping Botswana ĉe Twitter", + "description": "Twitter-paĝo pri OpenStreetMap en Bocvano" + }, + "cape-coast-youthmappers": { + "name": "UCC YouthMappers", + "description": "Sekvu nin ĉe Twitter: {url}", + "extendedDescription": "Oficiala Twitter-paĝo pri sekcio de Junaj Mapigistoj de Universitato de Cape Coast, Ganao. Ni ŝatas mapojn, malfermajn datumojn kaj helpi al senfortuloj." + }, + "osm-gh-facebook": { + "name": "OpenStreetMap Ghana ĉe Facebook", + "description": "Facebook-grupo por homoj interesantaj pri OpenStreetMap.", + "extendedDescription": "Mapigistoj de Ganao, promociantaj OpenStreetMap kaj HOT-projektojn (Humanitarian OpenStreetMap Team) en Ganao. Aliĝu nin." + }, + "osm-gh-twitter": { + "name": "OpenStreetMap Ghana ĉe Twitter", + "description": "Sekvu nin ĉe Twitter: {url}" + }, + "talk-gh": { + "name": "Dissendolisto talk-gh", + "description": "Talk-gh estas oficiala dissendolisto por OSM-komunumo en Ganao." + }, + "osm-mg-facebook": { + "name": "Facebook-grupo OpenStreetMap Madagascar", + "description": "Facebook-grupo por homoj interesantaj pri OpenStreetMap en Madagaskaro" + }, + "talk-mg": { + "name": "Dissendolisto talk-mg", + "description": "Loko por mapigistoj, komunumoj kaj uzantoj de OpenStreetMap en Madagaskaro por kunhavigi kaj diskuti." + }, + "OSM-BGD-facebook": { + "name": "OpenStreetMap Bangladesh", + "description": "Plibonigi OpenStreetMap en Bangladeŝo", + "extendedDescription": "Ĉu vi mapigas en Bangladeŝo? Ĉu vi havas demandojn aŭ volas kuniĝi al tiu ĉi komunumo? Aliĝu al ni ĉe {url}. Bonvenon ĉiuj!" + }, + "OSM-India-facebook": { + "name": "OpenStreetMap India - Participatory neighborhood mapping", + "description": "Plibonigi OpenStreetMap en Barato", + "extendedDescription": "Ĉu vi mapigas en Barato? Ĉu vi havas demandojn aŭ volas kuniĝi al tiu ĉi komunumo? Aliĝu al ni ĉe {url}. Bonvenon ĉiuj!", + "events": { + "sotmasia2018": { + "name": "State of the Map Asia 2018", + "description": "Kunigu al regiona okazaĵo “State of the Map Asia 2018” en Barato", + "where": "Indian Institute of Management, Bengaluro, Barato" + } + } + }, + "OSM-india-mailinglist": { + "name": "Dissendolisto OpenStreetMap India", + "description": "Talk-in estas oficiala dissendolisto por OSM-komunumo en Barato" + }, + "OSM-india-twitter": { + "name": "OpenStreetMap India ĉe Twitter", + "description": "Apenaŭ unu pepaĵo de vi: {url}" + }, + "OSM-India-Puducherry-Facebook": { + "name": "Free Software Hardware Movement - Facebook", + "description": "Facebook-paĝo de FSHM por informoj pri komunumaj okazaĵoj kaj agado", + "extendedDescription": "FSHM organizas okazaĵojn rilatajn al libera programaro/aparataro, teĥnologio, aktivismo kaj OpenStreetMap. Ĝia FB-paĝo estas la plej bona loko por esti ĝisdata pri ĝiaj okazaĵoj." + }, + "OSM-India-Puducherry-Matrix": { + "name": "Free Software Hardware Movement - Matrix", + "description": "Riot-grupo de FSHM por diskuti, kunhavigi kaj samtempigi mapigan agadon kaj okazaĵojn proksime de Pondiĉero", + "extendedDescription": "Anoj de FSHM-komunumo diskonigas siajn agadojn kaj spertojn de OSM-mapado per la grupo de Riot.im, tiu ĉi grupo estas ankaŭ uzata por diskuti aferojn rilatajn al libera programaro/aparataro, teĥnologio kaj aktivismo." + }, + "OSM-IDN-facebook": { + "name": "OpenStreetMap Indonesia", + "description": "Plibonigi OpenStreetMap en Indonezio", + "extendedDescription": "Ĉu vi mapigas en Indonezio? Ĉu vi havas demandojn aŭ volas kuniĝi al tiu ĉi komunumo? Aliĝu al ni ĉe {Url}. Bonvenon ĉiuj!" + }, + "OSM-japan-facebook": { + "name": "OpenStreetMap Japan Community", + "description": "Mapigistoj kaj uzantoj de OpenStreetMap en Japanujo" + }, + "OSM-japan-mailinglist": { + "name": "Dissendolisto OpenStreetMap Japanujo", + "description": "Talk-ja estas oficiala dissendolisto por OSM-komunumo en Japanujo" + }, + "OSM-japan-twitter": { + "name": "OpenStreetMap Japanujo ĉe Twitter", + "description": "Kradvorto ĉe Twitter: {url}" + }, + "OSM-japan-website": { + "name": "OpenStreetMap Japan", + "description": "Mapigistoj kaj uzantoj de OpenStreetMap en Japanujo" + }, + "OSM-korea-telegram": { + "name": "Telegram-kanalo OSM Korea", + "description": "Neoficiala kanalo por kontribuantoj, komunumoj kaj uzantoj de OpenStreetMap en Koreujo por kunhavigi kaj diskuti" + }, + "OSM-MY-facebook": { + "name": "OpenStreetMap Malaysia ĉe Facebook", + "description": "Por babili pri ĉio rilata al OpenStreetMap!" + }, + "OSM-MY-forum": { + "name": "Forumo OpenStreetMap Malaysia", + "description": "Oficiala forumo OpenStreetMap Malajzio" + }, + "OSM-MY-matrix": { + "name": "Riot-kanalo OpenStreetMap Malaysia", + "description": "Ĉiuj mapigistoj estas akceptindaj! Aniĝu ĉe {signupUrl}" + }, + "OSM-MNG-facebook": { + "name": "OpenStreetMap Mongolia", + "description": "Plibonigi OpenStreetMap en Mongolujo", + "extendedDescription": "Ĉu vi mapigas en Mongolujo? Ĉu vi havas demandojn aŭ volas kuniĝi al tiu ĉi komunumo? Aliĝu al ni ĉe {Url}. Bonvenon ĉiuj!" + }, + "OSM-MMR-facebook": { + "name": "OpenStreetMap Myanmar", + "description": "Plibonigi OpenStreetMap en Mjanmao/Birmo", + "extendedDescription": "Ĉu vi mapigas en Mjanmao/Birmo? Ĉu vi havas demandojn aŭ volas kuniĝi al tiu ĉi komunumo? Aliĝu al ni ĉe {Url}. Bonvenon ĉiuj!" + }, + "OSM-Nepal-facebook": { + "name": "OpenStreetMap Nepal", + "description": "Plibonigi OpenStreetMap en Nepalo", + "extendedDescription": "Ĉu vi mapigas en Nepalo? Ĉu vi havas demandojn aŭ volas kuniĝi al tiu ĉi komunumo? Aliĝu al ni ĉe {Url}. Bonvenon ĉiuj!" + }, + "OSM-PH-facebook": { + "name": "OpenStreetMap Philippines ĉe Facebook", + "description": "Bonvenon al OpenStreetMap Philippines – tie ĉi ni instigas ĉiujn filipinanojn al kontribui al la projekto OpenStreetMap." + }, + "OSM-PH-mailinglist": { + "name": "Dissendolisto talk-ph", + "description": "Dissendolisto por diskuti pri OpenStreetMap en Filipinoj" + }, + "OSM-PH-slack": { + "name": "OpenStreetMap PH ĉe Slack", + "description": "Bonvenon al ĉiuj! Aliĝu al ni ĉe {signupUrl}" + }, + "OSM-PH-telegram": { + "name": "OpenStreetMap PH ĉe Telegram", + "description": "Neoficiala loka komunumo ĉe Telegramo por kontribuantoj kaj ŝatantoj de OpenStreetMap en Filipinoj" + }, + "OSM-RU-forum": { + "name": "Forumo OpenStreetMap RU", + "description": "Forum-sekcio OpenStreetMap Rusujo" + }, + "OSM-RU-telegram": { + "name": "OpenStreetMap RU ĉe Telegram", + "description": "Telegram-grupo OpenStreetMap Rusujo" + }, + "OSM-LKA-facebook": { + "name": "OpenStreetMap Sri Lanka", + "description": "Plibonigi OpenStreetMap en Srilanko", + "extendedDescription": "Ĉu vi mapigas en Srilanko? Ĉu vi havas demandojn aŭ volas kuniĝi al tiu ĉi komunumo? Aliĝu al ni ĉe {Url}. Bonvenon ĉiuj!" + }, + "OSM-TW-facebook": { + "name": "OpenStreetMap Taiwan", + "description": "Facebook-grupo por mapigistoj kaj uzantoj de OpenStreetMap por diskuti aferojn pri Tajvano." + }, + "OSM-TW-mailinglist": { + "name": "Dissendolisto OpenStreetMap Tajvano", + "description": "Talk-tw estas oficiala dissendolisto por diskuti OSM-rilatajn aferojn pri Tajvano" + }, + "OSM-TH-CNX-meetup": { + "name": "OSM-renkonto en Ĉiang Mai", + "description": "Neregulaj renkontoj de OpenStreetMap-komunumo en Ĉiang Mai", + "extendedDescription": "Anoj de la OpenStreetMap-komunumo renkontiĝas je kelkaj monatoj en Ĉiang Mai. Sekvu nin ĉe {url} por scii pri la sekva renkontiĝo" + }, + "OSM-TH-facebook": { + "name": "Facebook-grupo OpenStreetMap TH", + "description": "Facebook-grupo por mapigistoj en Tajlando" + }, + "OSM-TH-forum": { + "name": "Forumo OpenStreetMap TH", + "description": "Forum-sekcio OpenStreetMap Tajlando" + }, + "al-forum": { + "name": "Forumo OpenStreetMap Albanujo", + "description": "Forum-sekcio OpenStreetMap Albanujo" + }, + "al-maptime-tirana": { + "name": "Maptime Tirana", + "description": "Sociaj okazaĵoj organizitaj por mapigi – komencantoj estas akceptindaj!", + "extendedDescription": "Maptime estas malferma lernada medio por ĉiuj niveloj de scio, kiu precipe preparita por komencantoj. Maptime estas kaj fleksebla kaj strukturebla, liverante lokon por mapigaj gvidiloj, instruadoj, nunaj projektoj kun difinita komuna celo, per aŭ individua aŭ kolektiva laboro." + }, + "al-telegram": { + "name": "Telegram-kanalo OSM Albanujo", + "description": "Telegram-grupo OpenStreetMap Albanujo" + }, + "at-forum": { + "name": "Forumo OpenStreetMap Österreich", + "description": "La oficiala forumo por aferoj pri OpenStreetMap en Aŭstrujo" + }, + "at-mailinglist": { + "name": "Dissendolisto talk-at", + "description": "Talk-at estas oficiala dissendolisto por OSM-komunumo en Aŭstrujo" + }, + "at-twitter": { + "name": "OpenStreetMap AT ĉe Twitter", + "description": "OpenStreetMap Aŭstrujo ĉe Twitter: {url}" + }, + "osmgraz-meetup": { + "name": "Kunveno en Graz", + "description": "Ĉiumonata renkonto de OpenStreetMap-komunumo en Graz" + }, "OSM-PL-facebook-group": { "name": "Facebook-grupo OpenStreetMap Polska", "description": "Grupo por mapigistoj kaj uzantoj de OpenStreetMap en Polujo." @@ -6994,6 +7242,37 @@ "name": "Forum-sekcio OpenStreetMap Polska", "description": "Diskutejo por pola komunumo de OpenStreetMap" }, + "OSM-US": { + "events": { + "sotmus2018": { + "name": "State of the Map US 2018", + "description": "Kunigu al la OpenStreetMap-komunumo ĉe «State of the Map US» en Detrojto, Miĉigano. Aliĝu al aliaj mapigistoj, komerco, organizaĵoj registaraj kaj ne-profit-celaj – ĉiuj kunlaborantaj pri libera kaj redaktebla mapo de la mondo." + } + } + }, + "LATAM-Facebook": { + "name": "OpenStreetMap Latam Facebook", + "description": "OpenStreetMap Latam ĉe Facebook" + }, + "LATAM-Telegram": { + "name": "OpenStreetMap Latam Telegram", + "description": "Telegram-grupo por OpenStreetMap en Latinameriko" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Latam Twitter", + "description": "Sekvu nin ĉe Twitter ĉe {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "Subteni OpenStreetMap en Latinameriko", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam estas ĉiujara konferenco por ĉiuj uzantoj kaj mapigistoj de OpenStreetMap en Latinameriko, La programo enhavas parolojn, panelajn diskutojn, laboroj kaj kunajn mapigadojn rilatajn al OepnStreetMap.", + "where": "Bonaero, Argentino" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap ĉe Facebook", "description": "Ŝatu nin ĉe Facebook por akiri novaĵojn pri OpenStreetMap." @@ -7022,7 +7301,7 @@ "events": { "sotm2018": { "name": "State of the Map 2018", - "description": "Kunigu nin por 3 tagoj en Milano, Italujo por la ĉiujaran internacian konferencon pri OpenStreetMap por kunigi ĉiujn en la komunumo por sociumi, diskonigi kaj lerni.", + "description": "Kunigu nin por 3 tagoj en Milano, Italujo por la ĉiujara internacia konferenco pri OpenStreetMap por kunigi ĉiujn en la komunumo por sociumi, diskonigi kaj lerni.", "where": "Milano, Italujo" } } diff --git a/dist/locales/es.json b/dist/locales/es.json index 89b3b40fd..d05649eec 100644 --- a/dist/locales/es.json +++ b/dist/locales/es.json @@ -23,8 +23,8 @@ }, "add_note": { "title": "Nota", - "description": "¿Has encontrado un problema? Deja que otros mapeadores lo sepan.", - "tail": "Haz clic en el mapa para añadir una nota." + "description": "¿Encontró un problema? Permite que otros mapeadores lo sepan.", + "tail": "Haga clic en el mapa para agregar una nota." }, "browse": { "title": "Navegar", @@ -46,7 +46,7 @@ "point": "Punto añadido.", "vertex": "Nodo añadido a una vía.", "relation": "Relación añadida.", - "note": "Nota añadir." + "note": "Agregó una nota." } }, "start": { @@ -305,12 +305,12 @@ } }, "detach_node": { - "title": "Desconectar", + "title": "Separar", "key": "E", - "description": "Desconectar este nodo de estas líneas/áreas.", - "annotation": "Desconectado un nodo de las líneas/áreas padre.", - "restriction": "Este nodo no se puede desconectar porque podría afectar a una relación \"{relation}\".", - "connected_to_hidden": "Este nodo no se puede desconectar porque está conectado a un elemento oculto." + "description": "Separe este nodo de estas líneas / áreas.", + "annotation": "Separó un nodo de líneas / áreas padre.", + "restriction": "Este nodo no se puede separar porque dañaría una relación \"{relation}\".", + "connected_to_hidden": "Este nodo no se puede separar porque está conectado a un elemento oculto." } }, "restriction": { @@ -390,7 +390,7 @@ "cancel": "Cancelar", "changes": "{count} Cambios", "download_changes": "Descargar archivo osmChange", - "warnings": "Avisos", + "warnings": "Advertencias", "modified": "Modificado", "deleted": "Eliminado", "created": "Creado", @@ -430,7 +430,12 @@ "edited_by": "Editado por", "changeset": "Conjunto de cambios", "unknown": "Desconocido", - "link_text": "Historial en openstreetmap.org" + "link_text": "Historial en openstreetmap.org", + "note_no_history": "Sin historial (Nota nueva)", + "note_comments": "Comentarios", + "note_created_date": "Fecha de creación", + "note_created_user": "Creado por", + "note_link_text": "Nota en openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "vértice", "line": "línea", "area": "área", - "relation": "relación" + "relation": "relación", + "note": "nota" }, "geocoder": { "search": "Buscar mundialmente…", @@ -523,9 +529,7 @@ "best_imagery": "La mejor fuente de imágenes para esta ubicación", "switch": "Volver a este fondo", "custom": "Personalizado", - "custom_button": "Editar fondo personalizado", - "custom_prompt": "Ingrese una plantilla de URL de tesela. Los tokens válidos son:\n  - {zoom} o {z}, {x}, {y} para el esquema de tesela Z/X/Y\n  - {-y} o {ty} para las coordenadas Y invertidas estilo TMS\n  - {u} para el esquema quadtile\n  - {switch: a, b, c} para la multiplexación del servidor DNS\n\nEjemplo:\n{example}", - "overlays": "Superposiciones", + "overlays": "Capas", "imagery_source_faq": "Información de imágenes / Informar un problema", "reset": "reiniciar", "display_options": "Opciones de pantalla", @@ -583,7 +587,7 @@ "tooltip": "Edificios, garajes, cobertizos, etc." }, "landuse": { - "description": "Elementos de uso de suelo", + "description": "Elementos de uso del suelo", "tooltip": "Bosques, tierras de cultivo, parques, áreas residenciales, áreas comerciales, etc." }, "boundaries": { @@ -626,6 +630,16 @@ "tooltip": "Áreas se dibujan totalmente rellenas." } }, + "settings": { + "custom_background": { + "tooltip": "Editar fondo personalizado", + "header": "Ajustes de fondo personalizado", + "instructions": "Ingrese una plantilla de URL de tesela. Los tokens válidos son:\n {zoom} o {z}, {x}, {y} para el esquema de tesela Z/X/Y\n {-y} o {ty} para las coordenadas Y invertidas estilo TMS\n {u} para el esquema cuádruple\n {switch: a, b, c} para multiplexación de servidores DNS\n\nEjemplo:\n{example}", + "template": { + "placeholder": "Ingrese una plantilla de url" + } + } + }, "restore": { "heading": "Tiene cambios sin guardar", "description": "¿Quiere recuperar los cambios no guardados de una sesión de edición previa?", @@ -727,18 +741,6 @@ }, "cannot_zoom": "No se puede alejar más la imagen en el modo actual.", "full_screen": "Cambiar a pantalla completa", - "gpx": { - "local_layer": "Añadir un GPX", - "drag_drop": "Arrastre y suelte un archivo .gpx, .geojson o .kml en la página o haga clic en el botón a la derecha para explorar", - "zoom": "Acercar a la capa", - "browse": "Buscar un archivo" - }, - "mvt": { - "local_layer": "Añadir un MVT", - "drag_drop": "Arrastre y suelte un archivo .mvt o .pbf en la página, o haga clic en el botón de la derecha para navegar", - "zoom": "Acercar a la capa", - "browse": "Buscar un archivo" - }, "streetside": { "tooltip": "Fotografías Streetside de Microsoft", "title": "Capa de fotos (Bing Streetside)", @@ -770,6 +772,12 @@ "anonymous": "anónimo", "closed": "(Cerrada)", "commentTitle": "Comentarios", + "status": { + "opened": "abierto {when}", + "reopened": "reabierto {when}", + "commented": "comentado {when}", + "closed": "cerrado {when}" + }, "newComment": "Nuevo comentario", "inputPlaceholder": "Ingrese un comentario para compartir con otros usuarios.", "close": "Cerrar nota", @@ -778,9 +786,9 @@ "close_comment": "Cerrar y comentar", "open_comment": "Reabrir y comentar", "report": "Informar", - "new": "Nueva Nota", - "newDescription": "Describir el problema.", - "save": "Guardar la Nota", + "new": "Nueva nota", + "newDescription": "Describa el problema.", + "save": "Guardar nota", "login": "Debe iniciar sesión para cambiar o comentar esta nota.", "upload_explanation": "Sus comentarios serán públicamente visibles para todos los usuarios de OpenStreetMap.", "upload_explanation_with_user": "Sus comentarios como {user} serán públicamente visibles para todos los usuarios de OpenStreetMap." @@ -822,7 +830,7 @@ "save": "Haga clic en {save} **Guardar** para finalizar los cambios y enviarlos a OpenStreetMap. ¡Debe recordar guardar el trabajo frecuentemente!", "save_validation": "En la pantalla de guardar se tiene la oportunidad de revisar lo realizado. iD también realizará algunas verificaciones básicas de datos faltantes y puede ofrecer sugerencias y advertencias útiles si algo no parece correcto.", "upload_h": "Subir", - "upload": "Antes de cargar los cambios, debe ingresar un [comentario del conjunto de cambios](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). A continuación, haga clic en **Subir** para enviar sus cambios a OpenStreetMap, donde se fusionarán en el mapa y serán públicamente visibles para todos.", + "upload": "Antes de cargar los cambios, debe ingresar un [comentario del conjunto de cambios](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). A continuación, haga clic en **Subir** para enviar sus cambios a OpenStreetMap, donde se combinarán en el mapa y serán públicamente visibles para todos.", "backups_h": "Copias de respaldo automáticas", "backups": "Si no logra finalizar las ediciones de una sola vez, por ejemplo si su computadora falla o cierra el navegador, sus ediciones aun se mantendrán en la memoria del navegador. Podrá regresar luego (utilizando el mismo navegador en la misma computadora) y iD le dará la opción de restaurar su trabajo.", "keyboard_h": "Atajos de teclado", @@ -851,7 +859,7 @@ "add_point_finish": "Para colocar el nuevo punto en el mapa, coloque el cursor del mouse donde debe ir el punto, luego haga clic con el botón izquierdo del ratón o presione `Espacio`.", "move_point_h": "Moviendo puntos", "move_point": "Para mover un punto, coloque el cursor del mouse sobre el punto y luego mantenga presionado el botón izquierdo del ratón mientras arrastra el punto a su nueva ubicación.", - "delete_point_h": "Borrando puntos", + "delete_point_h": "Eliminando puntos", "delete_point": "Está bien eliminar los elementos que no existen en el mundo real. Al eliminar un elemento de OpenStreetMap, se elimina del mapa que todos utilizan, por lo que debe asegurarse de que el elemento realmente no exista antes de eliminarlo.", "delete_point_command": "Para eliminar un punto, haga clic con el botón derecho en el punto para seleccionarlo y mostrar el menú de edición, luego use el comando {delete} **Borrar*." }, @@ -875,7 +883,7 @@ "move_line_h": "Moviendo líneas", "move_line_command": "Para mover una línea completa, haga clic con el botón derecho en la línea y seleccione el comando {move} **Mover** del menú de edición. A continuación, mueva el ratón y haga clic con el {leftclic} botón izquierdo para colocar la línea en una nueva ubicación.", "move_line_connected": "Las líneas que están conectadas a otros elementos permanecerán conectadas a mientras mueva la línea a una nueva ubicación. iD puede evitar que mueva una línea a través de otra línea conectada.", - "delete_line_h": "Borrando líneas", + "delete_line_h": "Eliminando líneas", "delete_line": "Si una línea esta completamente incorrecta, por ejemplo, una ruta que no existe en el mundo real, está bien borrarla. Tenga cuidado al eliminar elementos: las imágenes de fondo que está utilizando podrían estar desactualizadas, y una carretera que parece estar mal podría simplemente estar recién construida.", "delete_line_command": "Para eliminar una línea, haga clic con el botón derecho en la línea para seleccionarla y mostrar el menú de edición, luego use el comando {delete} **Borrar**." }, @@ -893,7 +901,7 @@ "modify_area_h": "Modificación de áreas", "modify_area_dragnode": "A menudo, verá áreas que no tienen la forma correcta, por ejemplo, un edificio que no coincide con las imágenes de fondo. Para ajustar la forma de un área, primero, haga clic en el {leftclick} botón izquierdo del ratón para seleccionarla. Todos los nodos del área se dibujarán como pequeños círculos. A continuación, puede arrastrar los nodos a ubicaciones mejores.", "modify_area_addnode": "También puede crear nuevos nodos a lo largo de un área mediante {leftclick} **x2** haciendo doble clic en el borde del área o arrastrando los triángulos pequeños en los puntos medios entre los nodos.", - "delete_area_h": "Eliminado de áreas", + "delete_area_h": "Eliminando áreas", "delete_area": "Si un área es completamente incorrecta, por ejemplo, un edificio que no existe en el mundo real, está bien que se elimine. Tenga cuidado al eliminar elementos: las imágenes de fondo que está utilizando pueden estar desactualizadas, y un edificio que parece incorrecto podría simplemente estar recién construido.", "delete_area_command": "Para eliminar un área, haga clic con el {rightclick} botón derecho en el área para seleccionarla y mostrar el menú de edición, luego use el comando {delete} **Eliminar**." }, @@ -902,14 +910,14 @@ "intro": "Una *relación* es un tipo especial de elemento en OpenStreetMap que agrupa otros elementos. Los elementos que pertenecen a una relación se llaman *miembros*, y cada miembro puede tener un *rol* en la relación.", "edit_relation_h": "Edición de relaciones", "edit_relation": "En la parte inferior del editor de elementos, puede expandir la sección \"Todas las relaciones\" para ver si el elemento seleccionado es miembro de alguna relación. A continuación, puede hacer clic en la relación para seleccionarla y editarla.", - "edit_relation_add": "Para agregar un elemento a una relación, seleccione la función y luego haga clic en el botón {plus} agregar en la sección \"Todas las relaciones\" del editor de funciones. Puede elegir de una lista de relaciones cercanas, o elegir la opción \"Nueva relación...\".", + "edit_relation_add": "Para agregar un elemento a una relación, seleccione el elemento y luego haga clic en el botón {plus} agregar en la sección \"Todas las relaciones\" del editor de funciones. Puede elegir de una lista de relaciones cercanas, o elegir la opción \"Nueva relación...\".", "edit_relation_delete": "También puede hacer clic en el botón {delete} **Eliminar** para eliminar el elemento seleccionado de la relación. Si elimina todos los miembros de una relación, la relación se eliminará automáticamente.", "maintain_relation_h": "Mantener relaciones", "maintain_relation": "En su mayor parte, iD mantendrá relaciones automáticamente mientras edita. Debe tener cuidado al reemplazar los elementos que podrían ser miembros de las relaciones. Por ejemplo, si elimina una sección de la carretera y dibuja una nueva sección de la carretera para reemplazarla, debe agregar la nueva sección a las mismas relaciones (rutas, restricciones de giro, etc.) que la original.", "relation_types_h": "Tipos de relación", "multipolygon_h": "Multipolígonos", "multipolygon": "Una relación *multipolígono* es un grupo de uno o más elementos *externos* y uno o más elementos internos. Los elementos externos definen los bordes exteriores del multipolígono, y los elementos internos definen subáreas o agujeros recortados desde el interior del multipolígono.", - "multipolygon_create": "Para crear un multipolígono, por ejemplo, un edificio con un agujero, dibuje el borde externo como un área y el borde interior como una línea o un tipo diferente de área. Luego `{shift}`+{leftclick} haga clic con el botón izquierdo para seleccionar ambas funciones, haga clic con el botón derecho en el menú para mostrar el menú de edición y seleccione el comando {merge} **Combinar**.", + "multipolygon_create": "Para crear un multipolígono, por ejemplo, un edificio con un agujero, dibuje el borde externo como un área y el borde interior como una línea o un tipo diferente de área. Luego `{shift}`+{leftclick} haga clic con el botón izquierdo para seleccionar ambos elementos, haga clic con el {rightclick} botón derecho en el menú para mostrar el menú de edición y seleccione el comando {merge} **Combinar**.", "multipolygon_merge": "Combinar varias líneas o áreas creará una nueva relación multipolígono con todas las áreas seleccionadas como miembros. iD elegirá los roles internos y externos de forma automática, en función de los elementos que se encuentran dentro de otros elementos.", "turn_restriction_h": "Restricciones de giro", "turn_restriction": "Una relación de *restricción de giro* es un grupo de varios segmentos de camino en una intersección. Las restricciones de giro constan de un camino *desde*, nodo o carreteras *vía*, y un camino *hasta*.", @@ -924,14 +932,14 @@ }, "notes": { "title": "Notas", - "intro": "Las *Notas* se usan para a alertar a otros usuarios que un elemento debe ser corregido o requiere atención. Las notas señalan una localización específica en el mapa. Para ver las notas existentes o añadir nuevas, haz clic en el panel {data} **Datos del mapa** para activar la capa de notas de OpenStreetMap.", - "add_note_h": "Añadiendo Notas", - "add_note": "Para añadir una nueva nota, haz clic en el botón {note} **Nota** en la barra de herramientas sobre el mapa, o presione la tecla de método abreviado `4`. Esto cambiará el cursor del ratón a un símbolo de cruz. Para colocar la nueva nota en el mana, posiciona el cursor del ratón donde deba ir la nota y, a continuación, haz clic con el botón izquierdo del ratón o presiona `Espacio`.", - "move_note": "Sólo se pueden mover las nuevas notas. Para mover una nota, coloca el cursor del ratón sobre la nueva nota, luego mantén presionado el {leftclick} botón izquierdo del ratón mientras arrastra el punto a su nueva ubicación.", - "update_note_h": "Cerrando, Reabriendo y Comentando", - "update_note": "Se puede actualizar una nota cerrándola, reabriéndola, o añadiéndole un comentario. Cerrar la nota indica que el problema ha sido resuelto. Reabrirla que el problema original no ha sido resuelto.", - "save_note_h": "Guardando las Notas", - "save_note": "Debes guardar las ediciones de cualquier nota de forma individual haciendo clic en los botones que se encuentran bajo los comentarios de la nota. Las ediciones de notas **no** se incluyen en los conjuntos de cambios que se suben a OpenStreetMap." + "intro": "Las *Notas* se usan para a alertar a otros usuarios que un elemento debe ser corregido o requiere atención. Las notas señalan una ubicación específica en el mapa. Para ver las notas existentes o añadir nuevas, haga clic en el panel {data} **Datos del mapa** para activar la capa de notas de OpenStreetMap.", + "add_note_h": "Añadiendo notas", + "add_note": "Para agregar una nueva nota, haga clic en el botón {note} **Nota** en la barra de herramientas sobre el mapa, o presione la tecla de atajo `4`. Esto cambiará el cursor del ratón a un símbolo de cruz. Para colocar la nueva nota en el mapa, coloque el cursor del mouse donde debe ir la nota, luego haga clic con el {leftclick} botón izquierdo del ratón o presione `Espacio`.", + "move_note": "Solo se pueden mover las notas nuevas. Para mover una nota, coloque el cursor del ratón sobre la nueva nota, luego presione y mantenga presionado el {leftclick} botón izquierdo del ratón mientras arrastra la nota a su nueva ubicación.", + "update_note_h": "Cierre, reapertura y comentarios", + "update_note": "Una nota existente se puede actualizar cerrándola, volviendo a abrirla o añadiéndole un comentario. Cerrar una nota indica que el problema se ha resuelto. La reapertura de una nota indica que el problema original no está resuelto.", + "save_note_h": "Guardar notas", + "save_note": "Debe guardar las ediciones de notas de forma individual haciendo clic en los botones que se encuentran debajo de los comentarios de la nota. Las ediciones de nota **no** se incluyen en los conjuntos de cambios que se suben a OpenStreetMap." }, "imagery": { "title": "Imágenes de fondo", @@ -983,7 +991,7 @@ "modifying": { "title": "Modificando", "about": "Para modificar las restricciones de giro, primero haga clic en cualquier segmento de partida **DESDE** para seleccionarlo. El segmento seleccionado emitirá un pulso, y todos los posibles destinos **HASTA** aparecerán como símbolos de giro.", - "indicators": "Luego, haga clic en un símbolo de giro para alternar entre \"Permitido\", \"Restringido\" y \"Solo\".", + "indicators": "Luego, hacer clic en un señal de giro para alternar entre \"Permitido\", \"Restringido\" y \"Solo\".", "allow_turn": "{allowTurn} **HASTA Permitido**", "restrict_turn": "{restrictTurn} **HASTA Restringido**", "only_turn": "{onlyTurn} **HASTA Solo**" @@ -1281,8 +1289,8 @@ "title": "Navegando", "navigation": { "title": "Navegación", - "pan": "Panorámica del mapa", - "pan_more": "Panorámica del mapa a una pantalla", + "pan": "Desplazar el mapa", + "pan_more": "Desplazar el mapa de a una pantalla", "zoom": "Acercar / Alejar", "zoom_more": "Acercar / Alejar un montón" }, @@ -1301,7 +1309,7 @@ "minimap": "Alterna el minimapa" }, "selecting": { - "title": "Seleccionando elementos", + "title": "Seleccionar elementos", "select_one": "Selecciona un solo elemento", "select_multi": "Selecciona múltiples elementos", "lasso": "Dibuja un lazo de selección alrededor de los elementos", @@ -1328,7 +1336,7 @@ "add_line": "Modo 'añadir línea'", "add_area": "Modo 'añadir área'", "add_note": "Modo 'Añadir nota'", - "place_point": "Coloca un punto o una nota", + "place_point": "Coloque un punto o nota", "disable_snap": "Mantener presionado para desactivar el ajuste de punto", "stop_line": "Finaliza el dibujo de una línea o área" }, @@ -1337,7 +1345,7 @@ "continue_line": "Continua una línea en el nodo seleccionado", "merge": "Combina (fusiona) los elementos seleccionados", "disconnect": "Desconecta los elementos en el nodo seleccionado", - "detach_node": "Desconectar el nodo seleccionado de las líneas/áreas padre.", + "detach_node": "Separar el nodo seleccionado de las líneas / áreas padre", "split": "Divida una línea en dos en el nodo seleccionado", "reverse": "Invierte una línea", "move": "Mueve los elementos seleccionados", @@ -1418,7 +1426,7 @@ "name": "Elementos de sendero" }, "category-rail": { - "name": "Elementos de ferrocarril" + "name": "Elementos de riel" }, "category-restriction": { "name": "Elementos de restricción" @@ -1441,11 +1449,11 @@ "label": "Acceso permitido", "options": { "designated": { - "description": "Acceso permitido según señales u ordenanzas locales específicas", + "description": "Acceso permitido según señales o leyes locales específicas", "title": "Designado" }, "destination": { - "description": "Acceso permitido sólo para llegar a un destino", + "description": "Acceso permitido solo para llegar a un destino", "title": "Destino" }, "dismount": { @@ -1457,15 +1465,19 @@ "title": "Prohibido" }, "permissive": { - "description": "Acceso permitido hasta el momento en que el propietario revoque el permiso", + "description": "Acceso permitido hasta que el propietario revoque el permiso", "title": "Permisivo" }, + "permit": { + "description": "Acceso permitido solo con un permiso o licencia válida", + "title": "Permiso" + }, "private": { - "description": "Acceso permitido sólo con permiso del propietario de manera individual", + "description": "Acceso permitido solo con el permiso del propietario de forma individual", "title": "Privado" }, "yes": { - "description": "Acceso permitido por ley; un derecho de paso", + "description": "Acceso permitido por la ley; un derecho de paso", "title": "Permitido" } }, @@ -3052,7 +3064,7 @@ "terms": "reparación, estación, puesto, bicicletería, taller, bicicleta, bici, cadena, bomba, inflador" }, "amenity/biergarten": { - "name": "Bar al aire libre", + "name": "Biergarten (Bar al aire libre)", "terms": "cerveza, bar, terraza, jardín, al aire libre, biergarten" }, "amenity/boat_rental": { @@ -3528,8 +3540,8 @@ "terms": "casa rodante, autocaravana, caravana, motorhome, camper, agua potable, agua, recarga" }, "amenity/watering_place": { - "name": "Lugar con agua para animales", - "terms": "agua, animales, bebedero, estanque, posa" + "name": "Abrevadero para animales", + "terms": "agua, animales, bebedero, estanque, posa, abrevadero, pilón, fuente, manantial, pozo" }, "area": { "name": "Área", @@ -4841,6 +4853,10 @@ "name": "Campo de fútbol americano", "terms": "cancha, campo, fútbol, football, americano, gridiron" }, + "leisure/pitch/badminton": { + "name": "Cancha de bádminton", + "terms": "bádminton, badminton, cancha" + }, "leisure/pitch/baseball": { "name": "Diamante de béisbol", "terms": "campo de beisbol, béisbol, beisbol, baseball" @@ -4965,6 +4981,10 @@ "name": "Puente", "terms": "puente" }, + "man_made/bunker_silo": { + "name": "Silo búnker", + "terms": "silo búnker, silo, bunker" + }, "man_made/chimney": { "name": "Chimenea", "terms": "chimenea, fogón, fuego" @@ -6875,6 +6895,27 @@ }, "name": "Hike & Bike" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi caminos de motonieve de OSM (cobertura nórdica)", + "name": "Capa de transparencia motonieve nórdica" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaico de ortofotos suecas del período 1955-1965. Se pueden obtener imágenes más antiguas y más nuevas.", + "name": "Ortofotos históricas Lantmäteriet 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaico de ortofotos suecas del período 1970-1980. En construcción.", + "name": "Lantmäteriet Orthofoto Histórico 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Términos y comentarios" @@ -6911,8 +6952,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Escaneo de ´mapas económicos´ ca 1950-1980", - "name": "Mapa económico Landmäteriet (histórico)" + "description": "Escaneo de \"mapas económicos\" ca. 1950-1980", + "name": "Mapa económico de Lantmäteriet 1950-1980" }, "qa_no_address": { "attribution": { @@ -6926,6 +6967,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Caminos de motonieve", + "name": "Mapa de motonieve Suecia" + }, "stamen-terrain-background": { "attribution": { "text": "Teselas del mapa de Stamen Design, bajo CC BY 3.0. Datos de OpenStreetMap, bajo ODbL" @@ -6988,6 +7036,14 @@ } }, "community": { + "bw-facebook": { + "name": "Mapeo de Botswana en Facebook", + "description": "Página de OpenStreetMap en Botswana" + }, + "bw-twitter": { + "name": "Mapeo de Botswana en Twitter", + "description": "Twitter de OpenStreetMap en Botswana" + }, "cape-coast-youthmappers": { "name": "Universidad de Cape Coast YouthMappers", "description": "Síguenos en Twitter en {url}", @@ -7220,7 +7276,7 @@ "extendedDescription": "La mayoría de las charlas ocurren en el canal \"OpenStreetMap Belgium\". ¡Puede preguntar cualquier cosa allí! Las otras salas son para temas específicos." }, "be-meetup": { - "name": "Meetup de encuentro OpenStreetMap Bélgica", + "name": "Meetup de OpenStreetMap Bélgica", "description": "Reuniones en la vida real de todos los interesados en OpenStreetMap", "extendedDescription": "Las reuniones presenciales son geniales para conocer a otros mapeadores, hacerles preguntas y aprender mucho. ¡Son especialmente bienvenidos los nuevos contribuidores!" }, @@ -7352,6 +7408,18 @@ "name": "Meetup de OpenStreetMap Hungría", "description": "La plataforma para organizar encuentros en Hungría" }, + "is-facebook": { + "name": "OSM Islandia en Facebook", + "description": "Página de OpenStreetMap en Islandia" + }, + "is-mailinglist": { + "name": "Lista de correo de Talk-is", + "description": "Talk-is es la lista de correo oficial de la comunidad islandesa OSM" + }, + "is-twitter": { + "name": "OSM Islandia en Twitter", + "description": "Twitter de OpenStreetMap en Islandia" + }, "it-facebook": { "name": "Facebook de OpenStreetMap Italia", "description": "Únase a la comunidad de OpenStreetMap Italia en Facebook" @@ -7769,6 +7837,29 @@ "name": "OpenStreetMap Perú", "description": "Noticias y recursos para la comunidad de OpenStreetMap Perú" }, + "LATAM-Facebook": { + "name": "Facebook de OpenStreetMap Latam", + "description": "OpenStreetMap Latam en Facebook" + }, + "LATAM-Telegram": { + "name": "Telegram de OpenStreetMap Latam", + "description": "Telegram de OpenStreetMap para América Latina" + }, + "LATAM-Twitter": { + "name": "Twitter de OpenStreetMap Latam", + "description": "Síganos en Twitter en {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "Soporte de OpenStreetMap en América Latina", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam es la conferencia anual para todos los creadores de mapas y usuarios de OpenStreetMap en América Latina. El programa incluye charlas, paneles, talleres y mapatones relacionados con OpenStreetMap.", + "where": "Buenos Aires, Argentina" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap en Facebook", "description": "Dénos me gusta en Facebook para recibir noticias y actualizaciones sobre OpenStreetMap." diff --git a/dist/locales/et.json b/dist/locales/et.json index 230161913..e93d8ae29 100644 --- a/dist/locales/et.json +++ b/dist/locales/et.json @@ -434,8 +434,6 @@ "none": "Puudub", "switch": "Vaheta tagasi selle tausta vastu", "custom": "Kohandatud", - "custom_button": "Muuda kohandatud tausta", - "custom_prompt": "Sisesta paanide internetiaadressi vormel. Sobivad järgmised sõned:\n - {zoom} või {z}, {x}, {y}, kui kasutad paaniskeemi Z/X/Y\n - {-y} või {ty}, kui kasutad TMS-skeemi ümberpööratud Y-koordinaate\n - {u}, kui kasutad ruutpaani skeemi (quadtile)\n - {switch:a,b,c}, kui kasutad DNS-serveri multipleksimist\n\nNäide:\n{example}", "overlays": "Ülekatted", "imagery_source_faq": "Pildimaterjali teave / teata probleemist", "reset": "lähtesta", @@ -611,18 +609,6 @@ }, "cannot_zoom": "Ei ole võimalik rohkem välja suumida selles vaates.", "full_screen": "Lülita täisekraanile", - "gpx": { - "local_layer": "Lisa GPX", - "drag_drop": "Lohista lehele .gpx-, .geojson- või .kml-fail või klõpsa nuppu paremal, et sirvida", - "zoom": "Suumi kihini", - "browse": "Sirvi faili" - }, - "mvt": { - "local_layer": "Lisa MVT", - "drag_drop": "Lohista lehele .mvt või .pbf fail või klõpsa nuppu paremal, et sirvida", - "zoom": "Suumi kihini", - "browse": "Lehitse arvutist" - }, "streetside": { "tooltip": "Tänava-tasandi fotod Microsoftilt", "title": "Fotokate (Bing Streetside)", @@ -766,31 +752,24 @@ "label": "Pääs lubatud", "options": { "designated": { - "description": "Pääs lubatud märkide või kohalike eriseadustega", "title": "Määratud" }, "destination": { - "description": "Pääs lubatud ainult sihtpunkti jõudmiseks", "title": "Sihtkoht" }, "dismount": { - "description": "Pääs lubatud, kui liikleja tuleb sadulast maha", "title": "Sadulast maas" }, "no": { - "description": "Avalik juurdepääs puudub", "title": "Keelatud" }, "permissive": { - "description": "Juurdepääs on lubatud ajani, mil omanik tühistab loa", "title": "Omanik lubab" }, "private": { - "description": "Juurdepääs lubatud ainult omaniku eriloal", "title": "Era" }, "yes": { - "description": "Juurdepääs seaduse alusel; igameheõigus", "title": "Lubatud" } }, @@ -1515,9 +1494,6 @@ "amenity/bicycle_repair_station": { "name": "Jalgrattaremondi pukk" }, - "amenity/biergarten": { - "name": "Õlleaed" - }, "amenity/boat_rental": { "name": "Paadi laenutus" }, diff --git a/dist/locales/fa.json b/dist/locales/fa.json index 641b7169f..e0c84fdb5 100644 --- a/dist/locales/fa.json +++ b/dist/locales/fa.json @@ -462,7 +462,6 @@ "best_imagery": "بهترین منبع تصویری شناخته شده برای این مکان", "switch": "بازگشت به این پس‌زمینه", "custom": "سفارشی", - "custom_button": "ویرایش پشت زمینه سفارشی", "overlays": "پوشش ها", "imagery_source_faq": "اطلاعات تصویر / گزارش یک مشکل", "reset": "باز نشاندن", @@ -632,9 +631,6 @@ }, "cannot_zoom": "در حالت فعلی بیش از این نمیتوان کوچک نمایی کرد.", "full_screen": "تعویض صفحه‌نمایش کامل", - "gpx": { - "browse": "جستجو برای فایل" - }, "mapillary_images": { "tooltip": "عکس‌های خیابانی از Mapillary", "title": "لایه پوشش عکس (Mapillary)" @@ -883,31 +879,24 @@ "label": "دسترسی مجاز", "options": { "designated": { - "description": "دسترسی با توجه به علائم و قوانین محلی مجاز است", "title": "تعیین شده" }, "destination": { - "description": "دسترسی فقط برای رسیدن به مقصدی مجاز است", "title": "مقصد" }, "dismount": { - "description": "دسترسی تنها با پیاده شدن راننده مجاز است", "title": "پیاده کردن" }, "no": { - "description": "دسترسی برای عموم مردم مجاز نیست", "title": "ممنوع" }, "permissive": { - "description": "دسترسی تا وقتی صاحبش مجوز را لغو نکند مجاز است", "title": "مجاز" }, "private": { - "description": "دسترسی فقط با اجازه از صاحب بصورت انفرادی مجاز است", "title": "خصوصی" }, "yes": { - "description": "دسترسی مجاز طبق قانون: حق از راه", "title": "مجاز" } }, @@ -2380,9 +2369,6 @@ "amenity/bicycle_repair_station": { "name": "ایستگاه تعمیر دوچرخه" }, - "amenity/biergarten": { - "name": "باغ آبجو" - }, "amenity/boat_rental": { "name": "کرایه قایق" }, diff --git a/dist/locales/fi.json b/dist/locales/fi.json index 6a51d488f..daff1961f 100644 --- a/dist/locales/fi.json +++ b/dist/locales/fi.json @@ -21,6 +21,11 @@ "description": "Lisää ravintoloita, turistinähtävyyksiä, postilaatikoita ja muita paikkapisteitä kartalle.", "tail": "Lisää paikkapiste napsauttamalla karttaa." }, + "add_note": { + "title": "Karttailmoitus", + "description": "Huomasitko virheen? Kerro siitä muille kartoittajille.", + "tail": "Tee karttailmoitus napsauttamalla karttaa." + }, "browse": { "title": "Selaa", "description": "Loitonna, lähennä ja panoroi karttaa." @@ -40,7 +45,8 @@ "annotation": { "point": "Paikkapiste lisätty.", "vertex": "Piste lisätty viivaan.", - "relation": "Relaatio lisätty." + "relation": "Relaatio lisätty.", + "note": "Karttailmoitus lisättiin." } }, "start": { @@ -348,6 +354,8 @@ "localized_translation_name": "Nimi" }, "zoom_in_edit": "Aloita muokkaaminen lähentämällä karttaa", + "login": "Kirjaudu sisään", + "logout": "Kirjaudu ulos", "loading_auth": "Yhdistetään OpenStreetMap-palveluun...", "report_a_bug": "Ilmoita ongelmasta", "help_translate": "Auta kääntämisessä", @@ -402,12 +410,18 @@ "key": "H", "title": "Historia", "selected": "{n} valittu", + "no_history": "Ei historiaa (tuore karttakohde)", "version": "Versio", "last_edit": "Viimeisin muokkaus", "edited_by": "Muokkaaja", "changeset": "Muutoskokoelma", "unknown": "Ei tiedossa", - "link_text": "Muutoshistoria openstreetmap.org-sivustolla" + "link_text": "Muutoshistoria openstreetmap.org-sivustolla", + "note_no_history": "Ei historiaa (tuore karttailmoitus)", + "note_comments": "Kommentit", + "note_created_date": "Lähetetty", + "note_created_user": "Lähettäjä", + "note_link_text": "Karttailmoitus OpenStreetMapissa" }, "location": { "key": "L", @@ -437,7 +451,8 @@ "vertex": "keskipiste", "line": "viiva", "area": "alue", - "relation": "relaatio" + "relation": "relaatio", + "note": "karttailmoitus" }, "geocoder": { "search": "Etsi maailmanlaajuisesti...", @@ -456,7 +471,7 @@ "view_on_osm": "Näytä openstreetmap.org-sivustolla", "all_fields": "Kaikki kentät", "all_tags": "Kaikki ominaisuustiedot", - "all_members": "Kaikki osapuolet", + "all_members": "Kaikki jäsenet", "all_relations": "Kaikki relaatiot", "new_relation": "Uusi relaatio...", "role": "Rooli", @@ -500,7 +515,6 @@ "best_imagery": "Paras ilmakuvalähde tälle sijainnille", "switch": "Vaihda takaisin tähän taustaan", "custom": "Mukautettu", - "custom_button": "Muokkaa omaa taustaa", "overlays": "Lisänäkymät", "imagery_source_faq": "Tietoja aineistosta / Ilmoita ongelmasta", "reset": "Palauta", @@ -526,6 +540,10 @@ "osm": { "tooltip": "Näytä OpenStreetMapin kartta-aineisto", "title": "OpenStreetMapin kartta-aineisto" + }, + "notes": { + "tooltip": "Näytä OpenStreetMapin karttailmoitukset", + "title": "OpenStreetMapin karttailmoitukset" } }, "fill_area": "Alueen taustatäyttö", @@ -598,6 +616,16 @@ "tooltip": "Alueen taustatäyttö on käytössä koko alueen laajuudella." } }, + "settings": { + "custom_background": { + "tooltip": "Muokkaa mukautettua taustaa", + "header": "Mukautetun taustan asetukset", + "instructions": "Syötä taustakartan osoite. Käytettävissä olevat muuttujat:\n {zoom} tai {z}, {x}, {y} Z/X/Y-koordinaatistoa varten\n {-y} tai {ty} TMS-tyylin käännettyjä y-koordinaatteja varten\n {u} neloisrakennetta varten\n {switch:a,b,c} DNS-palvelimen multipleksointia varten\n\nEsimerkki:\n{example}", + "template": { + "placeholder": "Syötä taustakartan osoite" + } + } + }, "restore": { "heading": "Kaikkia muutoksia ei ole tallennettu", "description": "Haluatko palauttaa tallentamattomat muutokset edelliseltä muokkauskerralta?", @@ -699,10 +727,12 @@ }, "cannot_zoom": "Nykyisessä tilassa ei voi loitontaa enempää.", "full_screen": "Koko näytön tila", - "gpx": { - "drag_drop": "Vedä ja pudota gpx-, geojson- tai kml-tiedosto tälle sivulle tai selaa tiedostoja napsauttamalla painiketta oikealla.", - "zoom": "Sovita tasoon", - "browse": "Selaa tiedostoja" + "streetside": { + "tooltip": "Microsoftin katunäkymäkuvat", + "title": "Kuvakerros (Bing-katunäkymä)", + "report": "Ilmoita kuvan yksityisyysloukkauksesta", + "view_on_bing": "Näytä Bing-kartoissa", + "hires": "Korkearesoluutio" }, "mapillary_images": { "tooltip": "Katunäkymäkuvat (Mapillary)", @@ -722,6 +752,33 @@ "openstreetcam": { "view_on_openstreetcam": "Näytä tämä kuva OpenStreetCam-palvelussa" }, + "note": { + "note": "Karttailmoitus", + "title": "Muokkaa karttailmoitusta", + "anonymous": "tuntematon", + "closed": "(Ratkaistu)", + "commentTitle": "Kommentit", + "status": { + "opened": "avattu {when}", + "reopened": "avattu uudelleen {when}", + "commented": "kommentoitu {when}", + "closed": "ratkaistu {when}" + }, + "newComment": "Uusi kommentti", + "inputPlaceholder": "Jaa mielipiteesi muille käyttäjille kommentoimalla.", + "close": "Ratkaise", + "open": "Avaa uudelleen", + "comment": "Kommentoi", + "close_comment": "Ratkaise ja kommentoi", + "open_comment": "Avaa uudelleen ja kommentoi", + "report": "Ilmoita", + "new": "Uusi karttailmoitus", + "newDescription": "Kuvaile ongelmaa", + "save": "Tallenna", + "login": "Muokkaa tai kommentoi ilmoitusta kirjautumalla sisään.", + "upload_explanation": "Kommentti näkyy kaikille OpenStreetMapin käyttäjille.", + "upload_explanation_with_user": "Kommentti käyttäjänä {user} näkyy kaikille OpenStreetMapin käyttäjille." + }, "help": { "title": "Ohje", "key": "H", @@ -729,21 +786,21 @@ "title": "Ohje", "welcome": "Tervetuloa [OpenStreetMapin](https://www.openstreetmap.org/) iD-kartanmuokkausohjelmaan, jolla OpenStreetMap-aineistoa voi muokata suoraan selaimessa.", "open_data_h": "Avoin data", - "open_data": "Tekemäsi muokkaukset näkyvät kaikille käyttäjille. Muokkauksesi voi perustua paikallistuntemukseen, paikan päällä tehtyihin havaintoihin tai ilmakuva- ja katutasokuvamateriaaleihin. Tietojen kopiointi kaupallisista lähteistä, kuten Google-kartoista [on ehdottomasti kielletty] (https://www.openstreetmap.org/copyright).", + "open_data": "Tekemäsi muokkaukset näkyvät kaikille käyttäjille. Muokkauksesi voi perustua paikallistuntemukseen, paikan päällä tehtyihin havaintoihin tai ilmakuva- ja katutasokuvamateriaaleihin. Tietojen kopiointi kaupallisista lähteistä, kuten Google-kartoista, [on ehdottomasti kielletty](https://www.openstreetmap.org/copyright).", "before_start_h": "Ennen aloittamista", - "before_start": "Tutustu OpenStreetMapiin ja tähän muokkausohjelmaan ennen muokkaamisen aloittamista. iD-ohjelmassa on aloitusopas, jonka avulla voit harjoitella interaktiivisesti OpenStreetMapin muokkaamista. Aloita harjoittelu napsauttamalla Aloita aloitusopas - se vie vain 15 minuuttia.", + "before_start": "Tutustu huolellisesti OpenStreetMapiin ja tähän muokkausohjelmaan ennen muokkaamisen aloittamista. Tämän kartanmuokkausohjelman aloitusoppaan avulla voit harjoitella interaktiivisesti OpenStreetMapin muokkaamista. Aloita harjoittelu napsauttamalla Aloita aloitusopas - se vie vain 15 minuuttia.", "open_source_h": "Avoin lähdekoodi", "open_source": "Tämä avoimen lähdekoodin iD-ohjelman versio {version} perustuu vapaaehtoisten käyttäjien työhön. Lähdekoodi on saatavilla [GitHub-palvelusta](https://github.com/openstreetmap/iD).", - "open_source_help": "Voit osallistua projektiin auttamalla ohjelman [kääntämisessä](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) tai [raportoida ongelmista](https://github.com/openstreetmap/iD/issues)." + "open_source_help": "Voit osallistua projektiin auttamalla ohjelman [kääntämisessä](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) tai [ilmoittamalla ohjelmistovirheistä](https://github.com/openstreetmap/iD/issues)." }, "overview": { "title": "Perusteet", "navigation_h": "Liikkuminen", - "navigation_drag": "Liiku kartalla painamalla ja pitämällä pohjassa {leftclick} hiiren vasenta painiketta ja liikuttelemalla hiirtä. Voit myös käyttää näppäimistön nuolinäppäimiä `↓`, `↑`, `←`, `→` .", - "navigation_zoom": "Loitonna tai lähennä hiiren rullalla, kosketuslevyllä tai napsauttamalla {plus} ja {minus} -painikkeita karttaikkunan oikeassa laidassa. Voit myös käyttää näppäimistön `+`, `-` -näppäimiä. ", + "navigation_drag": "Liiku kartalla pitämällä pohjassa {leftclick} hiiren vasenta painiketta ja liikuttelemalla hiirtä. Voit myös käyttää näppäimistön nuolinäppäimiä `↓`, `↑`, `←` ja `→`.", + "navigation_zoom": "Loitonna ja lähennä hiiren rullalla, kosketuslevyllä tai napsauttamalla {plus} ja {minus} -painikkeita karttaikkunan oikeassa laidassa. Voit myös käyttää näppäimistön näppäimiä `+` ja `-`.", "features_h": "Karttaominaisuudet", - "features": "Kartalla näkyviä teitä, rakennuksia ja muita paikkoja kutsutaan *karttakohteiksi* tai lyhyemmin *kohteiksi*. Kaikki maailmassa olemassa olevat kohteet voidaan lisätä OpenStreetMapiin. Karttakohteet jaetaan *pisteisiin*, *viivoihin* ja *alueisiin*.", - "nodes_ways": "OpenstreetMapissa pisteet jaetaan vielä *viivapisteiksi* ja *paikkapisteiksi* riippuen siitä, onko se viivan osana vai itsenäinen paikkaa kuvaava piste." + "features": "Kartalla näkyviä teitä, rakennuksia ja muita paikkoja kutsutaan *karttakohteiksi* tai lyhyemmin *kohteiksi*. Kaikki maailmassa olemassa olevat kohteet voidaan lisätä OpenStreetMapiin. Karttakohteet jaetaan niiden muodon mukaan *pisteisiin*, *viivoihin* ja *alueisiin*.", + "nodes_ways": "OpenstreetMapissa pisteet jaetaan vielä *viivapisteiksi* ja *paikkapisteiksi* riippuen siitä, onko piste viivan osana vai itsenäinen paikkaa kuvaava piste." }, "editing": { "title": "Muokkaaminen ja tallentaminen", @@ -752,93 +809,150 @@ "select_right_click": "Avaa toimintovalikko napsauttamalla kohdetta hiiren {rightclick} oikealla painikkeella. Valikon kautta voi esimerkiksi kääntää, siirtää ja poistaa kohteen.", "multiselect_h": "Usean kohteen valitseminen", "multiselect_shift_click": "Valitse useita karttakohteita painamalla `{shift}`+{leftclick} hiiren vasenta painiketta. Useiden kohteiden poistaminen tai siirtäminen helpottuu.", - "multiselect_lasso": "Vaihtoehtoisesti pidä `{shift}`-näppäin pohjassa ja samanaikaisesti pidä {leftclick} hiiren vasen painike pohjassa ja vedä alue haluttujen kohteiden yli.", + "multiselect_lasso": "Vaihtoehtoisesti pidä sekä `{shift}`-näppäin että {leftclick} hiiren vasen painike pohjassa ja vedä alue kohteiden yli. Kaikki alueen sisään jäävät kohteet valitaan.", "undo_redo_h": "Kumoa ja tee uudelleen", "undo_redo": "Muokkaukset tallennetaan väliaikaisesti tietokoneellesi, kunnes tallennat ne OpenStreetMapin palvelimelle. Kumoa yksittäisiä muokkauksia napsauttamalla {undo} **Kumoa**-painiketta ja kumoa toiminnon kumoaminen napsauttamalla {redo} **Tee uudelleen** -painiketta.", "save_h": "Tallentaminen", - "save": "Lähetä ja tallenna muutokset muokkaukset OpenStreetMapin palvelimelle napsauttamalla {save} **Tallenna** . Muista tallentaa muokkaukset säännöllisesti!", - "save_validation": "Tallennettaessa iD käy läpi muokkaukset ja etsii perustasoisia virheitä, jolloin voit tarkistaa ja korjata puutteet ja virheet.", + "save": "Lähetä ja tallenna muutokset muokkaukset OpenStreetMapin palvelimelle napsauttamalla {save} **Tallenna**. Muista tallentaa muokkaukset säännöllisesti!", + "save_validation": "Tallennettaessa iD käy muutokset läpi perustasoisten virheiden varalta, minkä jälkeen voit tarkistaa ja korjata puutteet ja virheet.", "upload_h": "Lähettäminen", "upload": "Ennen muutosten lähettämistä sinun pitää kuvailla [karttaan tehtyjä muutoksia](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Lopulta voit lähettää muutokset OpenStreetMapiin napsauttamalla **Tallenna**. Tällöin ne ovat julkisesti kaikkien nähtävissä perinteisessä karttanäkymässä muutaman minuutin kuluttua.", "backups_h": "Automaattinen varmuuskopiointi", - "backups": "Jos et voi viimeistellä muokkauksia samalla kerralla esimerkiksi tietokoneesi hajottua tai suljettuasi selaimen välilehden, on muokkaukset kuitenkin tallennettu selaimen muistiin. Voit palata myöhemmin samalla selaimella ja tietokoneella ja palauttaa tallentamattomat muutokset.", + "backups": "Jos et voi viimeistellä muokkauksia yhdellä kerralla esimerkiksi tietokoneesi rikkouduttua tai suljettuasi vahingossa selaimen välilehden, on muokkaukset kuitenkin tallennettu selaimen muistiin. Voit palata myöhemmin samalla selaimella ja tietokoneella ja palauttaa tallentamattomat muutokset.", "keyboard_h": "Pikanäppäimet", "keyboard": "Avaa lista kaikista pikanäppäimistä painamalla `?`-näppäintä" }, "feature_editor": { "title": "Kohdemuokkain", - "intro": "*Kohdemuokkain* näkyy muokkausnäkymän vasemmassa laidassa. Sitä käytetään karttakohteen ominaisuuksien tarkasteluun ja muokkaamiseen.", + "intro": "*Kohdemuokkain* näkyy karttaikkunan vasemmassa laidassa. Sitä käytetään karttakohteen ominaisuuksien tarkasteluun ja muokkaamiseen.", "definitions": "Yläosassa näkyy karttakohteen tyyppi. Keskiosa sisältää *kenttiä*, jotka kuvaavat kohteen ominaisuuksia, kuten nimen ja osoitteen. ", - "type_h": "Ominaisuustyyppi", - "type": "Voit klikata karttakohteen tyyppiä vaihtaaksesi kohteen eri tyyppiseksi. Kaikki, mikä on olemassa, voidaan lisätä OpenStreetMapiin, joten on olemassa tuhansia kohdetyyppejä joista valita.", + "type_h": "Kohdetyyppi", + "type": "Vaihda karttakohteen tyyppiä napsauttamalla kohdemuokkaimen yläosasta nykyistä tyypiä. Erilaisia kohdetyyppejä on tuhansia, joten tutustu huolella vaihtoehtoihin ja valitse kaikista kuvaavin kohdetyyppi.", "type_picker": "Kohdemuokkain näyttää kaikkein tavallisimmat kohdetyypit kuten puistot, sairaalat, ravintolat, tiet ja rakennukset. Voit hakea mitä tyyppiä tahansa kirjoittamalla hakulaatikkoon, mitä olet etsimässä. Voit myös klikata {inspect} **Tietoa** -ikonia kohteen tyypin vieressä saadaksesi kohdetyypistä lisätietoa.", "fields_h": "Kentät", - "fields_all_fields": "\"Kaikki kentät\" -osa sisältää kaikki karttakohteen tiedot, joita voit muokata. OpenStreetMapissa kaikkien kenttien täyttäminen on vapaavalintaista, ja voit jättää kentän tyhjäksi jos olet epävarma.", - "fields_example": "Eri tyyppisille karttakohteille näkyy erilaiset kentät. Esimerkiksi tien kohdalla näkyy kentät tien päällysteelle ja nopeusrajoitukselle, kun taas ravintolan kohdalla näkyy kentät aukioloajoille ja sille, millaista ruokaa ravintola tarjoaa.", - "fields_add_field": "Voit klikata myös \"Lisää kenttä\" -pudotusvalikkoa lisätäksesi uusia kenttiä, kuten kuvauksen, Wikipedia-linkin, esteettömyyden pyörätuolin käyttäjille ja niin edelleen. ", - "tags_h": "Tägit eli ominaisuustiedot", - "tags_all_tags": "Voit laajentaa kenttien alapuolella olevan \"Kaikki ominaisuustiedot\" -osan lisätäksesi karttakohteelle mitä tahansa OpenStreetMapin *tägejä* ja muokataksesi niitä. Jokainen tägi sisältää *avaimen* ja *arvon*, tietotyypit jotka määrittävät kaikki OpenStreetMapiin tallennetut karttakohteet.", - "tags_resources": "Karttakohteiden muokkaaminen edellyttää perustason osaamista OpenStreetMapin ominaisuuksista. Lisätietoa erilaisista ominaisuuksista ja karttakohteista on saatavilla esimerkiksi [OpenStreetMapin Wikistä](https://wiki.openstreetmap.org/wiki/Fi:Main_Page) tai [Taginfo-sivustolla](https://taginfo.openstreetmap.org/)." + "fields_all_fields": "Kaikki kentät -osio sisältää kaikki muokattavissa olevat karttakohteen ominaisuudet. Minkään kentän täyttäminen ei ole pakollista.", + "fields_example": "Kohdemuokkain näyttää kohdetyypin mukaan erilaisia kenttiä. Esimerkiksi tielle voi muokata nopeusrajoitusta ja päällystemateriaalia, kun taas ravintolan kohdalla näkyy kentät aukioloajoille ja ruokavalikoimalle.", + "fields_add_field": "Lisää uusia kenttiä napsauttamalla Lisää kenttä -pudotusvalikkoa: saatavilla on esimerkiksi kuvaus, Wikipedia-artikkelin linkki ja esteettömyyskuvaus.", + "tags_h": "Ominaisuustiedot", + "tags_all_tags": "Kenttien alapuolella olevassa Kaikki ominaisuustiedot -osiossa voi muokata kaikkia OpenStreetMap-palvelussa käytettäviä *ominaisuustietoja*. Jokainen ominaisuustieto koostuu kahdesta osasta: *avaimesta* ja *arvosta*. Avain näytetään Kaikki ominaisuustiedot -osiossa vasemmassa sarakkeessa ja arvo oikeassa sarakkeessa.", + "tags_resources": "Karttakohteiden muokkaaminen edellyttää perustason osaamista OpenStreetMapin ominaisuuksista. Lisätietoa erilaisista ominaisuuksista ja karttakohteista on saatavilla esimerkiksi [OpenStreetMapin Wikistä](https://wiki.openstreetmap.org/wiki/Fi:Main_Page) ja [Taginfo-sivustolla](https://taginfo.openstreetmap.org/)." }, "points": { "title": "Paikkapisteet", - "intro": "*Paikkapisteillä* voidaan merkitä kauppojen, ravintoloiden ja patsaiden kaltaisia karttakohteita. Niillä on yksittäinen sijainti ja ne kertovat, mitä siellä on.", + "intro": "*Paikkapisteillä* voidaan merkitä kauppojen, ravintoloiden ja patsaiden kaltaisia karttakohteita, joilla on pistemäinen sijainti.", "add_point_h": "Paikkapisteiden lisääminen", - "add_point": "Lisätäksesi paikkapisteen, klikkaa {point} **Paikkapiste** -painiketta työkalupalkissa kartan yläpuolella, tai paina pikanäppäintä `1`. Tämä muuttaa hiiren osoittimen ristimäiseksi.", - "add_point_finish": "Sijoittaaksesi uuden paikkapisteen kartalle, vie hiiri sinne, mihin haluat paikkapisteen, ja paina {leftclick} hiiren vasenta painiketta tai `Välilyönti` -näppäintä.", - "move_point_h": "Paikkapisteiden liikuttaminen", - "move_point": "Liikuttaaksesi paikkapistettä, aseta hiiren osoitin pisteen päälle ja paina {leftclick} hiiren vasenta painiketta. Pidä painike pohjassa ja raahaa paikkapiste uuteen sijaintiin.", + "add_point": "Lisää paikkapiste napsauttamalla {point} **Paikkapiste** -painiketta yläpalkista tai painamalla pikanäppäintä `1`. Hiiren osoitin muuttuu ristin muotoiseksi.", + "add_point_finish": "Vie hiiri kartalla haluttuun kohtaan ja napsauta {leftclick} hiiren vasenta painiketta tai paina `Välilyönti` -näppäintä.", + "move_point_h": "Paikkapisteiden siirtäminen", + "move_point": "Siirrä paikkapistettä viemällä hiiren osoitin sen päälle ja paina {leftclick} hiiren vasenta painiketta. Pidä painike pohjassa ja raahaa paikkapiste uuteen sijaintiin.", "delete_point_h": "Paikkapisteiden poistaminen", - "delete_point": "Voit poistaa kohteita, joita ei ole oikeasti olemassa. Kohteen poistaminen poistaa sen muidenkin kartalta, joten varmista ennen poistamista, että kohdetta ei todella ole.", - "delete_point_command": "Poistaaksesi pisteen, klikkaa pistettä {rightclick} hiiren oikealla näppäimellä ja valitse avautuvasta pikavalikosta {delete} **Poista**." + "delete_point": "Voit poistaa kohteita, joita ei ole oikeasti olemassa. Kohteen poistaminen poistaa sen muidenkin kartalta, joten poista vain kohteita joista olet täysin varma.", + "delete_point_command": "Poista paikkapiste napsauttamalla {rightclick} hiiren oikealla näppäimellä ja valitse toimintovalikosta {delete} **Poista**." }, "lines": { "title": "Viivat", "intro": "*Viivoilla* merkitään esimerkiksi katuja, rautateitä ja jokia. Viivat pitäisi piirtää niiden esittämän kohteen keskilinjaa pitkin.", "add_line_h": "Viivojen lisääminen", - "add_line": "Lisätäksesi viivan, klikkaa {line} **Viiva** -painiketta työkalupalkissa kartan yläpuolella, tai paina pikanäppäintä `2`. Tämä muuttaa hiiren osoittimen ristimäiseksi.", - "add_line_draw": "Seuraavaksi siirrä hiiren osoitin sinne, mistä haluat viivan alkavan, ja paina {leftclick} hiiren vasenta painiketta tai `Välilyönti` -näppäintä. Lisää viivan loput pisteet klikkaamalla tai `Välilyönti` -näppäimellä. Voit lähentää, loitontaa tai raahata karttaa piirtäessäsi.", - "add_line_finish": "Lopettaaksesi viivan piirtämisen, paina `{Enter}` tai klikkaa viivan viimeistä pistettä uudestaan.", + "add_line": "Lisää viiva napsauttamalla {line} **Viiva** -painiketta yläpalkista tai painamalla pikanäppäintä `2`. Hiiren osoitin muuttuu ristin muotoiseksi.", + "add_line_draw": "Siirrä hiiren osoitin viivan aloituspisteeseen ja paina {leftclick} hiiren vasenta painiketta tai `Välilyönti`-näppäintä. Lisää viivan loput pisteet napsauttamalla kutakin tai `Välilyönti`-näppäimellä. Voit lähentää, loitontaa tai raahata karttaa piirtämisen aikana.", + "add_line_finish": "Lopeta viivan piirtäminen painamalla `{Enter}` tai napsauttamalla viivan viimeistä pistettä uudestaan.", "modify_line_h": "Viivojen muokkaaminen", - "modify_line_dragnode": "Viivat eivät usein ole oikean muotoisia, esimerkiksi tie ei vastaa ilmakuvaa. Muokataksesi viivan muotoa, ensin valitse viiva {leftclick} hiiren vasemmalla painikkeella. Tämä saa viivan pisteet näkymään pieninä ympyröinä. Sitten voit raahata pisteet parempiin sijainteihin.", - "modify_line_addnode": "Voit myös luoda viivaan uusia pisteitä joko {leftclick}**x2** kaksoisklikkaamalla viivaa tai raahamalla viivan pisteiden välissä olevaa pikkukolmiota.", + "modify_line_dragnode": "Viivat eivät usein ole aivan oikean muotoisia: esimerkiksi tie ei vastaa ilmakuvaa. Aloita viivan muotoilu napsauttamalla viivaa {leftclick} hiiren vasemmalla painikkeella. Viivapisteet tulevat näkyviin pieninä ympyröinä, joita raahamalla voit muotoilla viivaa uudelleen.", + "modify_line_addnode": "Voit myös lisätä viivapisteitä joko {leftclick}**x 2** kaksoisnapsauttamalla viivaa tai raahamalla viivan pisteiden välissä olevaa pikkukolmiota.", "connect_line_h": "Viivojen yhdistäminen", - "connect_line": "Teiden yhdistyminen oikein on tärkeää kartalla ja välttämätöntä ajo-ohjeiden tarjoamisessa.", + "connect_line": "Teiden yhdistyminen oikein on tärkeää kartalla ja välttämätöntä reittiohjeiden määrittämistä varten.", "connect_line_display": "Teiden risteykset näkyvät harmaina ympyröinä. Jos viivojen päätepisteet eivät yhdisty mihinkään, ne näkyvät suurempina valkoisina ympyröinä.", - "connect_line_drag": "Yhdistääksesi viivan toiseen kohteeseen, raahaa yksi viivan pisteistä toisen kohteen päälle, kunnes kohteet tarttuvat yhteen. Vinkki: Voit estää karttakohteen yhdistymisen muihin kohteisiin pitämällä `{alt}`-painiketta pohjassa.", - "connect_line_tag": "Jos tiedät, että risteyksessä on liikennevalot tai suojatie, voit lisätä ne valitsemalla tiet yhdistävän pisteen ja käyttämällä kohdemuokkainta.", + "connect_line_drag": "Yhdistä viiva toiseen kohteeseen raahaamalla viivapiste toisen kohteen päälle, kunnes kohteet tarttuvat yhteen. Vinkki: Voit estää karttakohteen yhdistymisen muihin kohteisiin pitämällä `{alt}`-painiketta pohjassa.", + "connect_line_tag": "Jos risteyksessä on liikennevalot tai suojatie, voit lisätä ne kohdemuokkaimessa napsauttamalla tiet yhdistävää pistettä.", "disconnect_line_h": "Viivojen erottaminen", - "disconnect_line_command": "Erottaaksesi tien toisesta kohteesta, klikkaa kohteet yhdistävää pistettä {rightclick} hiiren oikealla näppäimellä ja valitse avautuvasta pikavalikosta {disconnect} **Erota**.", - "move_line_h": "Viivojen liikuttaminen", - "move_line_command": "Liikuttaaksesi kokonaista viivaa, klikkaa viivaa {rightclick} hiiren oikealla näppäimellä ja valitse avautuvasta pikavalikosta {move} **Siirrä**. Sitten liikuta hiirtä ja paina {leftclick} hiiren vasenta painiketta asettaaksesi viivan uuteen paikkaan.", + "disconnect_line_command": "Erota kaksi tietä toisistaan napsauttamalla yhdistävää pistettä {rightclick} hiiren oikealla näppäimellä ja valitsemalla toimintovalikosta {disconnect} **Erota**.", + "move_line_h": "Viivojen siirtäminen", + "move_line_command": "Siirrä kokonainen viiva uuteen paikkaan napsauttamalla viivaa {rightclick} hiiren oikealla näppäimellä ja valitsemalla toimintovalikosta {move} **Siirrä**. Siirrä viivaa hiirtä liikuttamalla uuteen paikkaan ja vahvista sijainti painamalla {leftclick} hiiren vasenta painiketta.", "move_line_connected": "Viivat, jotka ovat yhdistyneinä toisiin kohteisiin, pysyvät yhdistyneinä, kun liikutat viivan uuteen paikkaan. iD estää sinua siirtämästä viivaa toisen yhdistetyn viivan yli.", "delete_line_h": "Viivojen poistaminen", - "delete_line": "Voit poistaa viivan jos se on täysin virheellinen, esimerkiksi tien jota ei ole oikeasti olemassa. Ole varovainen poistaessasi kohteita: ilmakuva saattaa olla vanhentunut ja virheelliseltä näyttävä tie taas uusi.", - "delete_line_command": "Poistaaksesi viivan, klikkaa viivaa {rightclick} hiiren oikealla näppäimellä ja valitse avautuvasta pikavalikosta {delete} **Poista**." + "delete_line": "Voit poistaa viivan jos se on täysin virheellinen, esimerkiksi tien jota ei ole oikeasti olemassa. Ole varovainen poistaessasi kohteita: ilmakuva saattaa olla vanhentunut ja virheelliseltä näyttävä tie taas olla uusi.", + "delete_line_command": "Poista viiva napsauttamalla sitä {rightclick} hiiren oikealla näppäimellä ja valitsemalla toimintovalikosta {delete} **Poista**." }, "areas": { "title": "Alueet", - "intro": "*Alueilla* kuvataan sellaisten kohteiden kuin järvien, rakennusten ja asuinalueiden rajoja. Alueet pitäisi piirtää kulkemaan niiden esittämän kohteen rajaa pitkin, esimerkiksi rakennuksen pohjan ympäri.", + "intro": "*Alueilla* esitetään esimerkiksi järvien, rakennusten ja asuinalueiden rajoja. Alueet piirretään niiden esittämän kohteen ympärille, esimerkiksi rakennuksen seiniä pitkin.", "point_or_area_h": "Paikkapiste vai alue?", - "point_or_area": "Monet kohteet voi esittää niin paikkapisteinä kuin alueinakin. Sinun pitäisi kartoittaa esimerkiksi rakennukset ja maankäytölliset rajat alueiksi aina kun mahdollista. Voit sijoittaa paikkapisteitä rakennuksen alueen sisäpuolelle esittämään yrityksiä, palveluita ja muita rakennuksen sisällä olevia kohteita.", + "point_or_area": "Monet kohteet voi esittää niin paikkapisteinä kuin alueinakin. Rakennukset ja maankäytölliset rajat tulee lähtökohtaisesti merkitä aina alueina. Voit sijoittaa paikkapisteitä rakennuksen alueen sisäpuolelle esittämään yrityksiä, palveluita ja muita rakennuksen sisällä olevia kohteita.", "add_area_h": "Alueiden lisääminen", - "add_area_command": "Lisätäksesi alueen, klikkaa {area} **Alue** -painiketta työkalupalkissa kartan yläpuolella, tai paina pikanäppäintä `3`. Tämä muuttaa hiiren kursorin ristimäiseksi.", - "add_area_draw": "Seuraavaksi siirrä hiiren kursori yhteen alueen kulmista, ja paina {leftclick} hiiren vasenta painiketta tai `Välilyönti` -näppäintä. Lisää alueen rajan loput pisteet klikkaamalla tai `Välilyönti` -näppäimellä. Voit lähentää, loitontaa tai raahata karttaa piirtäessäsi.", - "add_area_finish": "Lopettaaksesi alueen piirtämisen, paina `{Enter}` tai klikkaa alueen rajan ensimmäistä tai viimeistä pistettä uudestaan.", - "square_area_h": "Muuttaminen suorakulmaiseksi", - "square_area_command": "Monilla aluemaisilla kohteilla kuten rakennuksilla on suorat kulmat. Muuttaaksesi alueen kulmat suoriksi, klikkaa alueen reunaa {rightclick} hiiren oikealla näppäimellä ja valitse avautuvasta pikavalikosta {orthogonalize} **Muuta suorakulmaiseksi**.", + "add_area_command": "Lisää alue napsauttamalla {line} **Alue** -painiketta yläpalkista tai painamalla pikanäppäintä `3`. Hiiren osoitin muuttuu ristin muotoiseksi.", + "add_area_draw": "Siirrä hiiren osoitin alueen kulmaan ja paina {leftclick} hiiren vasenta painiketta tai `Välilyönti`-näppäintä. Lisää alueen rajaa pitkin loput pisteet napsauttamalla kutakin tai `Välilyönti`-näppäimellä. Voit lähentää, loitontaa tai raahata karttaa piirtämisen aikana.", + "add_area_finish": "Lopeta alueen piirtäminen painamalla `{Enter}` tai napsauttamalla viivan viimeistä pistettä uudestaan.", + "square_area_h": "Suorakulmaiseksi muuttaminen", + "square_area_command": "Monilla aluemaisilla kohteilla kuten rakennuksilla on suorat kulmat. Muuta alueen kulmat suoriksi napsauttamalla alueen reunaa {rightclick} hiiren oikealla painikkeella ja valitsemalla toimintovalikosta {orthogonalize} **Muuta suorakulmaiseksi**.", "modify_area_h": "Alueiden muokkaaminen", - "modify_area_dragnode": "Alueet eivät usein ole oikean muotoisia, esimerkiksi rakennus ei vastaa ilmakuvaa. Muokataksesi alueen muotoa, ensin valitse alue {leftclick} hiiren vasemmalla painikkeella. Tämä saa alueen pisteet näkymään pieninä ympyröinä. Sitten voit raahata pisteet parempiin sijainteihin.", - "modify_area_addnode": "Voit myös luoda alueeseen uusia pisteitä joko {leftclick}**x2** kaksoisklikkaamalla alueen reunaa tai raahamalla alueen reunan pisteiden välissä olevia pikkukolmioita.", + "modify_area_dragnode": "Alueet eivät usein ole aivan oikean muotoisia: esimerkiksi rakennus ei vastaa ilmakuvaa. Aloita viivan muotoilu napsauttamalla aluetta {leftclick} hiiren vasemmalla painikkeella. Alueen muodostavat viivapisteet tulevat näkyviin pieninä ympyröinä, joita raahamalla voit muotoilla viivaa uudelleen.", + "modify_area_addnode": "Voit myös lisätä viivapisteitä joko {leftclick}**x 2** kaksoisnapsauttamalla aluetta rajaavaa viivaa tai raahamalla viivapisteiden välissä olevaa pikkukolmiota.", "delete_area_h": "Alueiden poistaminen", "delete_area": "Voit poistaa alueen jos se on täysin virheellinen, esimerkiksi rakennuksen jota ei ole oikeasti olemassa. Ole varovainen poistaessasi kohteita: ilmakuva saattaa olla vanhentunut ja virheelliseltä näyttävä rakennus taas uusi.", - "delete_area_command": "Poistaaksesi alueen, klikkaa aluetta {rightclick} hiiren oikealla näppäimellä ja valitse avautuvasta pikavalikosta {delete} **Poista**." + "delete_area_command": "Poista alue napsauttamalla sitä {rightclick} hiiren oikealla näppäimellä ja valitsemalla toimintovalikosta {delete} **Poista**." }, "relations": { - "relation_types_h": "Relaatiotyypit" + "title": "Relaatiot", + "intro": "*Relaatioilla* ryhmitellään johonkin ominaisuuteen liittyviä karttakohteita toisiinsa. Relaatioon kuuluvia karttakohteita kutsutaan *jäseniksi*, ja jokaisella jäsenellä on *rooli* relaatiossa.", + "edit_relation_h": "Relaatioiden muokkaaminen", + "edit_relation": "Alimmaisena kohdemuokkaimessa on Kaikki relaatiot -osio, josta näkyy kyseisen karttakohteen kaikki mahdolliset relaatiojäsenyydet. Voit muokata relaatiota napsauttamalla sitä.", + "edit_relation_add": "Voit lisätä karttakohteen jonkin relaation jäseneksi napsauttamalla {plus}-painiketta Kaikki relaatiot -osiossa. Pudotusvalikossa esitetään lähistöllä käytettyjä relaatioita; voit myös luoda täysin uuden relaation valitsemalla Uusi relaatio.", + "edit_relation_delete": "Voit poistaa karttakohteen relaatiosta napsauttamalla {delete} **Poista**. Jos poistat relaation viimeisen jäsenen eikä relaatio koostu enää yhdestäkään karttakohteesta, myös itse relaatio poistetaan automaattisesti.", + "maintain_relation_h": "Relaatioiden hallinta", + "maintain_relation": "Relaatiot päivittyvät pitkälti automaattisesti karttaan tehtyjen muutosten mukaisesti. Ole kuitenkin tarkkana, kun korvaat relaation jäseninä olevia karttakohteita kokonaan uusilla: jos esimerkiksi poistat kadun ja piirrät sen uudestaan toiselle linjaukselle, joudut lisäämään käsin kaikki mahdolliset relaatiot, kuten linja-autolinjat ja kääntymisrajoitukset, uudelle katuosuudelle.", + "relation_types_h": "Relaatiotyypit", + "multipolygon_h": "Monikulmiot", + "multipolygon": "*Monikulmio* on yhdestä tai useammasta ulkorajasta (outer) sekä yhdestä tai useammasta sisärajasta (inner) koostuva relaatio. Outer-relaatioilla määritellään monikulmion ulkorajat ja inner-relaatioilla monikulmion sisällä olevia alueita, jotka eivät kuulu monikulmioon. Tällainen kohde voi olla esimerkiksi sisäpihallinen rakennus.", + "multipolygon_create": "Luo monikulmio piirtämällä ulkoraja, esimerkiksi rakennuksen ulkoseinät, alueena ja sisärajat, esimerkiksi sisäpihat, viivoina. Valitse kumpikin kohde samanaikaisesti näppäinyhdistelmällä `{shift}`+{leftclick}, sitten avaa toimintovalikko {rightclick} napsauttamalla hiiren oikealla painikkeella ja valitse {merge} **Linkitä**.", + "multipolygon_merge": "Useampien viivojen tai alueiden linkittäminen luo monikulmiorelaation, jossa kaikki valitut viivat tai alueet ovat jäseninä. Sisä- ja ulkorajat määritetään automaattisesti.", + "turn_restriction_h": "Kääntymisrajoitukset", + "turn_restriction": "*Kääntymisrajoitus* on useiden tieosuuksien muodostama relaatio niiden risteämäkohdassa. Kääntymisrajoituksien merkitsemiseen käytetään operaattoreita *mistä*, *kautta* ja *mihin*.", + "turn_restriction_field": "Aloita kääntymisrajoituksen muokkaaminen napsauttamalla vähintään kahden tien risteystä. Avautuvassa kohdemuokkaimessa on näkymä Kääntymisrajoitukset, jossa esitetään havainnekuva valitusta risteyksestä.", + "turn_restriction_editing": "Valitse ensimmäiseksi tie, jolta kääntymisrajoitus vaikuttaa kääntymismahdollisuuksiin. Näet tällöin, mitä teitä on mahdollista valita kääntymisrajoituksen mihin-teiksi. Voit vaihtaa sallitun ja kielletyn kääntymissuunnan välillä napsauttamalla kääntymiskuvakkeita.", + "route_h": "Reitit", + "route": "*Reitti* on yhden tai useita viivoja sisältävä relaatio, jolla voidaan esitää linja-auto- ja junalinjoja sekä kansainvälisiä tiereittejä.", + "route_add": "Kohdemuokkaimen Kaikki relaatiot -osiossa napsauta {plus}-painiketta, jolloin luettelossa näytetään lähistöllä käytetyt reittirelaatiot. Lisää kyseinen tie reittirelaation osaksi napsauttamalla sitä luettelosta. Voit myös luoda kokonaan uuden relaation.", + "boundary_h": "Rajat", + "boundary": "*Rajarelaatio* on yksi tai useampi viiva, jotka yhdessä muodostavat hallinnollisen rajan. Tällainen raja voi olla esimerkiksi kaupunginosa tai valtio.", + "boundary_add": "Lisää karttakohde rajarelaation osaksi napsauttamalla karttakohdetta ja sitten avautuvan karttamuokkaimen alaosan Kaikki relaatiot -osiosta {plus}-painiketta. Valitse pudotusvalikosta jokin lähellä olevista relaatioista, hae relaatiota hakutoiminnolla tai luo kokonaan uusi relaatio." + }, + "notes": { + "title": "Karttailmoitukset", + "intro": "*Karttailmoituksella* voi ilmoittaa kartalla olevista virheistä muille käyttäjille. Selaa jo luotuja karttailmoituksia tai luo uusia napsauttamalla {data} **Kartta-aineisto** ikkunan oikeasta laidasta ja sitten valitsemalla \"OpenStreetMapin karttailmoitukset\".", + "add_note_h": "Karttailmoituksen tekeminen", + "add_note": "Lähetä karttailmoitus napsauttamalla {note} **Karttailmoitus** ylälaidan palkista tai pikanäppäimellä `4`. Hiiren osoitin muuttuu ristinmuotoiseksi. {leftclick} Napsauta virheen sijaintia kartalla tai vie hiiri sen kohdalla ja paina `Välilyöntiä`.", + "move_note": "Vain lähettämättömien karttailmoitusten sijaintia voi muuttaa. Muuta karttailmoituksen sijaintia napsauttamalla ja pitämällä pohjassa {leftclick} hiiren vasemmalla painikkeella sekä vetämällä uuteen sijaintiin.", + "update_note_h": "Ratkaiseminen, uudelleenavaaminen ja kommentointi", + "update_note": "Rekisteröityä karttailmoitusta voi päivittää ratkaisemalla, kommentoimalla tai avaamalla sen uudelleen. Tapauksen ratkaiseminen tarkoittaa, että ongelma on korjattu. Uudelleenavattu tapaus voi tarkoittaa esimerkiksi sitä, että ongelma on ilmennyt pian uudelleen tai sitä ei ole korjattu kokonaan.", + "save_note_h": "Karttailmoituksen tallentaminen", + "save_note": "Jokainen karttailmoitus tulee tallentaa erikseen sen kommenttien alapuolella olevilla painikkeilla. Karttailmoitukset **eivät** siis sisälly muutoskokoelmiin, joilla muokataan OpenStreetMap-karttaa." + }, + "imagery": { + "title": "Ilmakuvat", + "intro": "Kartoittamisen tukena käytettävät ilmakuvat kartta-aineiston taustalla ovat tärkeä apu karttojen lähteenä. Ilmakuvat voivat olla kirjaimellisesti satelliteilla, lentokoneilla ja miehittämättömillä ilma-aluksilla kerättyä aineistoa tai vaihtoehtoisesti historiallisista kartoista muista vapaasti hyödynnettävistä lähteistä kerättyä aineistoa.", + "sources_h": "Palveluntarjoajat", + "choosing": "Tutustu saatavilla oleviin palveluihin napsauttamalla {layers} **Taustan asetukset** oikeasta laidasta.", + "sources": "Oletuksena taustakuvana on [Bing-karttojen](https://www.bing.com/maps/) satelliittikuvaaineisto. Sijainnista riippuen saatavilla saattaa olla myös muuta, mahdollisesti tuoreempaa tai korkealaatuisempaa aineistoa, joten eri vaihtoehtojen kokeileminen kannattaa.", + "offsets_h": "Ilmakuvavirheen korjaaminen", + "offset": "Joskus ilmakuva ei osu tarkalleen kerättyyn kartta-aineistoon. Jos virhe on selvästi järjestelmällinen, voi vika olla myös ilmakuva- eikä kerätyssä kartta-aineistossa. Älä lähde siirtämään kaikkia karttakohteita, vaan kokeile säätää ilmakuvan asemointia kartta-aineiston mukaiseksi Korjaa ilmakuvavirhe -toiminnolla, joka löytyy alimmaisena Taustan asetukset -näkymästä.", + "offset_change": "Liikuttele ilmakuvaa napsauttelemalla pieniä kolmioita tai vetämällä {leftclick} hiiren vasemmalla painikkeella harmaata suorakulmiota. Asemoi ilmakuva ja kartta-aineisto ilmakuvavirheen korjaamiseksi." + }, + "streetlevel": { + "title": "Katunäkymäkuvat", + "intro": "Katunäkymäkuvat ovat käytännöllisiä liikennemerkkien, kauppojen ja muiden yksityiskohtien kartoittamisessa, kun ilmakuvien tarkkuus ei ole riittävä. iD-karttaohjelmassa hyödynnettävissä ovat [Bing-katunäkymäpalvelun](https://www.microsoft.com/en-us/maps/streetside), [Mapillaryn](https://www.mapillary.com) ja [OpenStreetCamin](https://www.openstreetcam.org) kuva-aineisto.", + "using_h": "Katunäkymäkuvien käyttö", + "using": "Valitse oikeasta laidasta {data} **Kartta-aineisto**. Tässä näkymässä voit vaihtaa erilaisten tausta-aineistojen välillä.", + "photos": "Kun katunäkymäkuvat on valittu näkyviin ja niitä on saatavilla, näkyy kyseinen tie korostettuna. Lähelle suurennettuna jokainen kuva näkyy ympyränä, ja kaikista lähimpänä maanpintaa ympyrän ympärillä oleva kolmio näyttää kuvan suunnan.", + "viewer": "Kuva avautuu sitä napsauttamalla kartan alalaitaan. Kuvan ympärillä on nuolet, joita napsauttamalla voi siirtyä edelliseen ja seuraavaan kuvaan. Lisäksi siinä esitetään kuvan ottaneen käyttäjän nimi, kuvauspäivämäärä ja linkki alkuperäiseen kuvaan." }, "gps": { - "title": "GPS-jäljet" + "title": "GPS-jäljet", + "intro": "Käyttäjien keräämät GPS-jäljet ovat arvokasta lähdemateriaalia OSM-karttaprojektille. Tämä ohjelma tukee *.gpx-*, *.geojson-* ja *.kml*-tiedostomuotoja. Voit kerätä GPS-jälkiä älypuhelimella tai -kellolla sekä muilla GPS- tai Glonass-laitteilla.", + "survey": "Tutustu [käyttäjiemme kokeilemiin tapoihin](https://wiki.openstreetmap.org/wiki/Fi:Karttatietojen_ker%C3%A4%C3%A4minen) kartta-aineiston keräämiseen muun muassa älypuhelimella, GPS-laitteella ja paperilla.", + "using_h": "GPS-jälkien käyttö", + "using": "Vedä ja pudota GPS-jälkitiedosto kartanmuokkausnäkymään, jolloin GPS-jäljet ilmestyvät kartalle violetteina viivoina. Voit piilottaa ja palauttaa jäljet takaisin näkyviin oikean laidan {data} **Kartta-aineisto** -näkymästä.", + "tracing": "Tällä tavalla hyödynnettyinä GPS-jälkiä ei tallenneta OpenStreetMapiin. Hyödynnä siis kaikki jälkien tarjoama aineisto samantien!", + "upload": "Jos aineisto on laajempi eikä sen hyödyntäminen ole mahdollista ensimmäisellä kerralla tai siitä voi olla hyötyä myös muille käyttäjille, se kannattaa [tallentaa OpenStreetMapin jälkitietokantaan](https://www.openstreetmap.org/trace/create) kaikkien kartoittajien tausta-aineistoksi." }, "field": { "restrictions": { @@ -901,26 +1015,27 @@ "practice": "Voit harjoitella vapaasti, sillä tämän aloitusoppaan aikana tekemäsi muutokset eivät tallennu muiden nähtäville.", "words": "Aloitusoppaassa esitellään keskeisintä OpenStreetMapissa käytettävää termistöä, joka on *kursivoitu*.", "mouse": "Karttaa voi muokata millä tahansa laitteella, mutta suosittelemme tämän aloitusoppaan käyttöön kahdella painikkeella varustettua hiirtä. **Jos haluat kytkeä hiiren, tee se nyt ja napsauta OK.**", - "leftclick": "Jos pyydämme sinua kaksoisnapsauttamaan, tee se hiiren vasemmalla painikkeella. Kosketuslevyllä sama toiminto saattaa olla yksi napsautus tai hipaisu. **Kaksoisnapsauta missä tahansa {num} kertaa.**", - "rightclick": "Joskus pyydämme napsauttamaan hiiren oikealla painikkeella. Joissakin laitteissa se voi edellyttää Ctrl-painikkeen painamista samanaikaisesti, kosketuslevyllä kahden sormen napautusta tai kosketusnäytöllä pitkää painallusta. Osassa näppäimistöjä voi olla myös erillinen painike. **Napsauta hiiren oikeaa painiketta {num} kertaa.**", + "leftclick": "Jos pyydämme sinua napsauttamaan tai kaksoisnapsauttamaan, tee se hiiren vasemmalla painikkeella. Kosketuslevyllä sama toiminto saattaa olla yksi napsautus tai hipaisu. **Napsauta hiiren vasemmalla painikkeella missä tahansa {num} kertaa.**", + "rightclick": "Joskus pyydämme napsauttamaan hiiren oikealla painikkeella. Joissakin laitteissa se voi edellyttää Ctrl-painikkeen painamista samanaikaisesti, kosketuslevyllä kahden sormen napautusta tai kosketusnäytöllä pitkää painallusta. Joissakin näppäimistöissä voi olla myös erillinen painike. **Napsauta hiiren oikeaa painiketta {num} kertaa.**", "chapters": "Hyvä! Nyt puhumme yhteistä kieltä. Alaosan painikkeilla voit helposti ohittaa joitakin aloitusoppaan osioita tai kerrata edellisen uudelleen. Aloitetaan! **Jatka napsauttamalla \"{next}\".**" }, "navigation": { "title": "Käyttöliittymä", - "drag": "Kartalla näkyy OpenStreetMapiin piirretyt kohteet taustakuvan päällä.{br}Liiku kartalla pitämällä hiiren vasen painike pohjassa ja liikuta hiirtä. Voit myös käyttää näppäimistön nuolinäppäimiä. **Vedä karttaa!**", + "drag": "Kartalla näkyy OpenStreetMapiin piirretyt kohteet taustakuvan päällä.{br}Liiku kartalla pitämällä hiiren vasen painike pohjassa ja liikuttamalla hiirtä. Voit myös käyttää näppäimistön nuolinäppäimiä. **Vedä karttaa!**", + "zoom": "Lähennä ja loitonna karttaa hiiren rullalla, kosketuslevyllä tai näppäimistön näppäimillä {plus} ja {minus}. **Lähennä tai loitonna karttaa!**", "features": "Kartalla näkyviä paikkoja ja kohteita kutsutaan *karttakohteiksi*. Mikä tahansa todellisuudessa olemassa oleva kohde voidaan merkitä OpenStreetMapiin karttakohteena.", - "points_lines_areas": "Karttakohde voidaan merkitä *pisteenä, viivana tai alueena*.", + "points_lines_areas": "Karttakohde voidaan merkitä *pisteenä, viivana* tai *alueena*.", "nodes_ways": "Pisteet jaetaan vielä *viivapisteiksi* ja *paikkapisteiksi* riippuen siitä, onko se viivan osana vai itsenäinen paikkaa kuvaava piste.", "click_townhall": "Minkä tahansa karttakohteen voi valita napsauttamalla sitä. **Valitse paikkapiste napsauttamalla sitä.**", "selected_townhall": "Hienoa! Paikkapiste on nyt valittu, jolloin se on korostettu sykkivällä hehkulla.", "editor_townhall": "Kun karttakohde on valittu, kartan rinnalle avautuu *kohdemuokkain*.", "preset_townhall": "Sen yläosassa näkyy karttakohteen tyyppi. Esimerkiksi tämä paikkapiste näyttäisi olevan {preset}.", "fields_townhall": "Kohdemuokkain koostuu *kentistä*, joilla kuvataan karttakohteen ominaisuuksia, kuten nimi ja osoite.", - "close_townhall": "**Sulje kohdemuokkain napauttamalla näppäimistöstä Esc tai napsauttamalla {button}-painiketta yläkulmasta.**", + "close_townhall": "**Sulje kohdemuokkain painamalla näppäimistöstä Esc tai napsauttamalla {button}-painiketta yläkulmasta.**", "search_street": "Tällä hakukentällä voit hakea kohteita nykyisestä näkymästä tai maailmanlaajuisesti. **Etsi hakusanalla \"{name}\".**", "choose_street": "**Valitse {name} napsauttamalla sitä listalta.**", "selected_street": "Hyvä! {name} on valittu.", - "editor_street": "Kadun kohdemuokkainnäkymä on hieman erilainen verrattuna kaupungintaloon.{br}Muokattavia tietoja ovat esimerkiksi \"{field1}\" ja \"{field2}\". **Sulje kohdemuokkain painamalla Esc näppäimistöstä tai napsauttamalla {button}-painiketta.**", + "editor_street": "Kadun kohdemuokkainnäkymä on hieman erilainen kaupungintaloon verrattuna.{br}Muokattavia tietoja ovat esimerkiksi \"{field1}\" ja \"{field2}\". **Sulje kohdemuokkain painamalla näppäimistön Esc-painiketta tai napsauttamalla {button}-painiketta.**", "play": "Siirtele hieman karttaa ja tutustu kartalla oleviin paikkapisteisiin, jotta saat kuvan millaisia paikkoja OpenStreetMapissa on. **Kun olet valmis, napsauta \"{next}\".**" }, "points": { @@ -930,35 +1045,41 @@ "search_cafe": "Paikkapisteet soveltuvat hyvin monenlaisten karttakohteiden merkitsemiseen. Äsken lisäämäsi piste on kahvila. **Etsi \"{preset}\".**", "choose_cafe": "**Valitse {preset} listalta.**", "feature_editor": "Piste on nyt merkitty kahvilaksi. Kohdemuokkaimella voi täydentää sen tietoja.", - "add_name": "OpenStreetMapissa minkään kentän täyttäminen ei ole pakollista, ja voit jättää kenttiä tyhjäksi.{br}Kuvitellaan, että tunnet tämän kahvilan paikallistuntemukselta ja muistat sen nimen. **Kirjoita kahvilalle nimi.**", + "add_name": "OpenStreetMapissa minkään kentän täyttäminen ei ole pakollista, eli voit jättää kenttiä tyhjäksi.{br}Kuvitellaan, että tunnet tämän kahvilan paikallistuntemukselta ja muistat sen nimen. **Kirjoita kahvilalle nimi.**", "add_close": "Kohdemuokkain tallentaa muutokset automaattisesti. **Kun olet kirjoittanut nimen, sulje kohdemuokkain painamalla Esc- tai Enter-näppäintä tai napsauttamalla {button}-painiketta.**", "reselect": "Usein paikkapisteet on jo lisätty kartalle, mutta niiden tiedot voivat olla vanhentuneita tai puutteellisia. Näitä tietoja voi korjata tai täydentää. **Valitse äsken luomasi kahvila napsauttamalla sitä.**", "update": "Lisätään kahvilalle tietoja. Voit vaihtaa nimen, lisätä keittiökulttuurin tai osoitteen. **Muuta kahvilan tietoja.**", - "rightclick": "Napsauttamalla karttakohdetta hiiren oikealla painikkeella näkyviin tulee pikavalikko, jossa näytetään käytettävissä olevat muokkaustoiminnot. **Avaa pikavalikko napsauttamalla paikkapistettä hiiren oikealla painikkeella.**", + "update_close": "**Kun olet valmis, sulje kohdemuokkain painamalla Esc- tai Enter-näppäintä tai napsauttamalla {button}-painiketta.**", + "rightclick": "Napsauttamalla karttakohdetta hiiren oikealla painikkeella näkyviin tulee toimintovalikko, jossa on käytettävissä olevat muokkaustoiminnot. **Avaa toimintovalikko napsauttamalla paikkapistettä hiiren oikealla painikkeella.**", "delete": "Poista karttakohteet, joita ei ole enää tai ole koskaan ollutkaan olemassa.{br}Poistaessasi karttakohteen se poistetaan kaikken näkemästä OpenStreetMap-tietokannasta, joten älä tee muutoksia ilman täydellistä varmuutta. **Poista paikkapiste napsauttamalla {button}-painiketta.**", "undo": "Voit kumota minkä tahansa muutoksen, kunnes tallennat ja lähetät muutokset OpenStreetMap-tietokantaan. **Kumoa poisto ja palauta paikkapiste napsauttamalla {button}-painiketta.**", - "play": "Homma hallussa! Harjoittele nyt luomalla muutamia uusia paikkapisteitä. **Kun olet valmis, napsauta \"{next}\".**" + "play": "Homma hallussa! Harjoittele nyt luomalla muutamia uusia paikkapisteitä. **Kun olet valmis, napsauta {next}.**" }, "areas": { "title": "Alueet", + "add_playground": "*Alueilla* merkitään esimerkiksi järvien, rakennusten ja asuinalueiden rajoja.{br}Lisäksi paikkapisteet voi yleensä merkitä myös tarkemmin alueina. **Luo uusi alue napsauttamalla {button}-painiketta.**", "start_playground": "Lisää tämä leikkipuisto kartalle piirtämällä alue. Alueet koostuvat alueen ulkoreunaa rajaavista *viivapisteistä*. **Osoita aloituspisteen paikka napsauttamalla kartalla tai painamalla välilyöntiä jossakin leikkipuiston nurkassa.**", + "continue_playground": "Jatka alueen piirtämistä sijoittamalla viivapisteitä leikkipuiston reunoille. Napsauta myös leikkipuistoon johtavan polun kohdalla.{br}Vinkki: Voit estää karttakohteen yhdistymisen muihiin kohteisiin pitämällä Alt-painiketta pohjassa. **Jatka leikkipuiston piirtämistä.**", + "finish_playground": "Viimeistele alue napsauttamalla ensimmäistä tai viimeistä viivapistettä uudelleen tai painamalla Enteriä. **Lopeta leikkipuiston piirtäminen.**", "search_playground": "**Etsi hakusanalla \"{preset}\".**", "choose_playground": "**Valitse {preset} listalta.**", "add_field": "Leikkipuistolla ei ole virallista nimeä, joten ei kirjoiteta Nimi-kenttään mitään.{br}Lisää sen sijaan leikkipuiston tietoja Kuvaus-kenttään. **Avaa Lisää kenttä -pudotusluettelo.**", "choose_field": "**Valitse {field} listalta.**", "retry_add_field": "Et valinnut {field}-kenttää. Yritetäänpä uudelleen.", "describe_playground": "**Kirjoita kuvaus ja sulje sitten kohdemuokkain napsauttamalla {button}-painiketta.**", - "play": "Loistohomma! Piirtele vielä pari muuta aluetta ja tutustu, millaisia alueita voit lisätä OpenStreetMapin. **Kun olet valmis, napsauta \"{next}\".**" + "play": "Loistohomma! Piirtele vielä pari muuta aluetta ja tutustu, millaisia alueita voit lisätä OpenStreetMapin. **Kun olet valmis, napsauta {next}.**" }, "lines": { "title": "Viivat", "add_line": "*Viivoilla* merkitään esimerkiksi katuja, rautateitä ja jokia. **Aloita uuden viivan piirtäminen napsauttamalla {button} Viiva.**", "start_line": "Tästä puuttuu tie, lisää se kartalle!{br}OpenStreetMapissa piirrä viiva tien keskilinjaa pitkin. Voit tarvittaessa lähentää, loitontaa ja siirrellä karttaa piirtämisen aikana. **Aloita viiva napsauttamalla kartalta puuttuvan tien pohjoispäätyä.**", - "intersect": "Jatka viivaa napsauttamalla lisää viivapisteitä. Voit myös käyttää välilyöntiä.{br}Kadut ovat muiden viivojen tavoit usein osa laajempaa verkostoa. Uusien viivojen yhdistäminen olemassa olevaan verkostoon on tärkeää muun muassa reititysohjelmistojen oikean toiminnan vuoksi. **Yhdistä uusi katu nykyiseen verkostoon napsauttamalla {name}a.**", + "intersect": "Jatka viivaa napsauttamalla lisää viivapisteitä. Voit myös käyttää välilyöntiä.{br}Kadut ovat muiden viivojen tavoin usein osa laajempaa verkostoa. Uusien viivojen yhdistäminen olemassa olevaan verkostoon on tärkeää muun muassa reititysohjelmistojen oikean toiminnan vuoksi. **Yhdistä uusi katu nykyiseen verkostoon napsauttamalla {name}iä.**", "retry_intersect": "Katu tulee yhdistää {name}uun, kokeile uudestaan!", "continue_line": "Jatka uuden kadun piirtämistä. Muista, että voit tarvittaessa lähentää, loitontaa tai liikutella karttaa.{br}Napsauta lopuksi viimeistä viivapistettä uudelleen. **Lopeta kadun piirtäminen.**", + "choose_category_road": "**Valitse {category} listalta.**", "choose_preset_residential": "Teitä ja katuja on monenlaisia, mutta nyt kyseessä on asuinaluekatu. **Valitse {preset}.**", "retry_preset_residential": "Et valinnut katutyypiksi {preset}a. **Palaa takaisin napsauttamalla tästä.**", + "name_road": "**Anna kadulle nimi ja sulje sitten kohdemuokkain napsauttamalla {button}-painiketta tai painamalla Enter- tai Esc-näppäintä.**", "did_name_road": "Hyvältä näyttää! Harjoitellaanpa sitten jo luodun viivan uudelleenmuotoilua.", "update_line": "Joskus on tarpeen muuttaa olemassa olevan viivan muotoa. Esimerkiksi tämä katu näyttäisi olevan liian suora todellisuuteen nähden.", "add_node": "Viivaa ei tarvitse poistaa, vaan lisäämällä viivapisteitä sen muotoa voidaan muuttaa. Helpointa on kaksoisnapsauttaa viivaa, jolloin viivaan tulee uusi liikuteltava viivapiste. **Luo uusi viivapiste kaksoisnapsauttamalla viivaa.**", @@ -966,19 +1087,35 @@ "finish_drag_endpoint": "Nyt on parempi. **Vahvista viivapisteen uusi paikka vapauttamalla hiiren painike.**", "start_drag_midpoint": "Kahden viivapisteen puolivälissä on pieni kolmio. Voit luoda uuden viivapisteen myös tarttumalla pikkukolmioon ja vetämällä sen haluttuun kohtaan. **Tartu pikkukolmioon ja vedä sillä tie mutkan suuntaiseksi.**", "continue_drag_midpoint": "No nyt alkaa näyttää hyvältä! Jatka kuitenkin vielä jommallakummalla tyylillä, kunnes katu on ilmakuvan mukainen. **Kun olet valmis, napsauta OK.**", - "delete_lines": "Jos katua ei ole olemassa, se tulee poistaa kartalta.{br}Esimerkiksi {street}a suunniteltiin toteutettavaksi, mutta sitä ei koskaan rakennettu. Kartan käyttökelpoisuutta voi parantaa helposti ja nopeasti poistamalla turhat kohteet.", + "delete_lines": "Jos katua ei ole olemassa, se tulee poistaa kartalta.{br}Esimerkiksi {street} suunniteltiin toteutettavaksi, mutta sitä ei koskaan rakennettu. Kartan käyttökelpoisuutta voi parantaa helposti ja nopeasti poistamalla turhat kohteet.", "rightclick_intersection": "Ylin oikeasti rakennettu katu on {street1}, joten *jaa* {street2} *kahtia* tässä risteyksessä, ja poista kaikki sen yläpuolelta. **Napsauta risteyskohtaa hiiren oikealla painikkeella.**", "split_intersection": "**Jaa {street} kahteen osaan napsauttamalla {button}-painiketta.**", "retry_split": "Et napsauttanut Jaa-painiketta, yritä uudelleen.", + "did_split_multi": "Hyvin menee! {street1} on nyt jaettu kahteen osaan, joista ylemmän voi poistaa. **Napsauta {street2}iä ja poista sen yläosa.**", "did_split_single": "**Valitse {street2} (sen yläosa!) napsauttamalla sitä.**", "multi_select": "{selected} on nyt valittu, ja valitaan myös {other1}. Napsauta sitä pitäen samalla Shift-näppäin pohjassa. **Napsauta {other2}a ja pidä Shift-näppäin pohjassa.**", "multi_rightclick": "Näin! Molemmat poistettavat kadut on nyt valittu. **Napsauta jompaakumpaa katua hiiren oikealla painikkeella.**", "multi_delete": "**Poista kadut napsauttamalla {button}-painiketta.**", "retry_delete": "Et napsauttanut Poista-painiketta, yritä uudelleen.", - "play": "Hienoa! Harjoittele viivoihin liittyviä toimintoja nyt piirtämällä lisää ja muokkaamalla muita viivoja. **Kun olet valmis, napsauta \"{next}\".**" + "play": "Hienoa! Harjoittele viivoihin liittyviä toimintoja nyt piirtämällä lisää ja muokkaamalla muita viivoja. **Kun olet valmis, napsauta {next}.**" }, "buildings": { - "title": "Rakennukset" + "title": "Rakennukset", + "add_building": "OpenStreetMap on maailman laajin rakennustietokanta.{br}Voit osallistua sen parantamiseen piirtämällä kartalta puuttuvia rakennuksia. **Lisää uusi alue napsauttamalla {button} Alue.**", + "start_building": "Lisätään tämä talo kartalle piirtämällä sen ulkorajat.{br}Rakennukset tulisi piirtää mahdollisimman tarkasti niiden seinälinjaa mukaillen. **Napsauta hiirellä tai vie hiiren osoitin rakennuksen nurkan kohdalle ja paina välilyöntiä.**", + "continue_building": "Jatka lisäämällä viivapisteitä rakennuksen seinälinjaa pitkin. Muista, että voit tarvittaessa lähentää karttaa tarkempien yksityiskohtien havaitsemiseksi.{br}Viimeistele rakennus painamalla enteriä tai napsauttamalla uudelleen ensimmäistä tai viimeistä viivapistettä. **Lopeta rakennuksen piirtäminen.**", + "retry_building": "Nyt ei mennytkään ihan putkeen. Ei se mitään, kokeile rohkeasti uudelleen!", + "choose_category_building": "**Valitse {category} listalta.**", + "choose_preset_house": "Rakennuksiakin on monenlaisia, mutta tämä on selvästi omakotitalo.{br}Jos et ole varma, voit valita vain yleispiirteisemmän ominaisuustyypin Rakennus. **Valitse ominaisuustyyppi {preset].**", + "close": "**Sulje kohdemuokkain painamalla Esc-näppäintä tai napsauttamalla {button}-painiketta.**", + "rightclick_building": "**Avaa nyt toimintovalikko napsauttamalla taloa hiiren oikealla painikkeella.**", + "square_building": "Rakennus näyttää vieläkin komeammalta puhtaasti suorakulmaisena. **Muuta rakennuksen kulmat suorakulmaiseksi napsauttamalla {button}-painiketta.**", + "retry_square": "Napsautit väärää painiketta, yritä uudelleen.", + "done_square": "Huomasitko, kuinka talon kulmat asettuivat paikoilleen? Harjoitellaan vielä toinen näppärä kikka.", + "add_tank": "Piirretäänpä seuraavaksi tämä ympyränmuotoinen varastosäiliö. **Aloita alueen piirtäminen valitsemalla {button} Alue.**", + "start_tank": "Älä suotta piirrä liian täydellistä ympyrää: riittää, että piirrät karkean ympyrän, joka on oikeankokoinen eli säiliön reunat koskettavat ympyrän kehää. **Sijoita ensimmäinen piste viemällä osoitin säiliön reunalle ja sitten napsauttamalla hiiren vasemmalla painikkeella tai painamalla välilyöntiä.**", + "continue_tank": "Lisää vielä muutama viivapiste säiliön reunaa pitkin. Seuraavassa vaiheessa luomme ympyrän piirtämäsi viivan perusteella.{br}Viimeistele alue painamalla Enteriä tai napsauttamalla ensimmäistä tai viimeistä viivapistettä uudelleen. **Lopeta säiliön piirtäminen.**", + "choose_tank": "**Valitse {preset} listalta.**" }, "startediting": { "title": "Aloita kartanmuokkaus!", @@ -1033,7 +1170,7 @@ "title": "Näyttöasetukset", "background": "Näytä taustan asetukset", "background_switch": "Vaihda takaisin viimeisimpään taustaan", - "map_data": "Näytä karttatietoasetukset", + "map_data": "Näytä kartta-aineistoasetukset", "fullscreen": "Siirry koko näytön tilaan", "wireframe": "Muuta alueen taustatäyttö -asetusta", "minimap": "Ota pienoiskartta käyttöön/pois käytöstä" @@ -1042,11 +1179,12 @@ "title": "Kohteiden valitseminen", "select_one": "Valitse yksi karttakohde", "select_multi": "Valitse useita karttakohteita", - "lasso": "Vedä valintaruutu kohteiden päälle" + "lasso": "Vedä valintaruutu kohteiden päälle", + "search": "Hae kohteen nimellä" }, "with_selected": { "title": "Kohde valittuna", - "edit_menu": "Näytä/piilota pikatoiminnot" + "edit_menu": "Näytä/piilota toimintovalikko" }, "vertex_selected": { "title": "Piste valittuna", @@ -1063,6 +1201,9 @@ "add_point": "Uusi paikkapiste", "add_line": "Uusi viiva", "add_area": "Uusi alue", + "add_note": "Uusi karttailmoitus", + "place_point": "Sijoita piste tai karttailmoitus", + "disable_snap": "Estä tarttuminen muihin karttakohteisiin", "stop_line": "Viivan tai alueen viimeinen piste" }, "operations": { @@ -1105,7 +1246,11 @@ "meters": "{quantity} m", "kilometers": "{quantity} km", "square_meters": "{quantity} m²", - "square_kilometers": "{quantity} km²" + "square_kilometers": "{quantity} km²", + "north": "P", + "south": "E", + "east": "I", + "west": "L" }, "presets": { "categories": { @@ -1157,31 +1302,24 @@ "label": "Käyttöoikeus", "options": { "designated": { - "description": "Liikennemerkki tai erityinen paikallinen säädös sallii pääsyn", "title": "Tarkoitettu" }, "destination": { - "description": "Pääsy sallittu vain, jos kohde on alueella", "title": "Läpikulku" }, "dismount": { - "description": "Pääsy sallittu, mutta ajoneuvon kuljettajan on jalkauduttava", "title": "Jalkautumisvelvollisuus" }, "no": { - "description": "Ei pääsyä ilman erityislupaa", "title": "Kielletty" }, "permissive": { - "description": "Pääsy sallittu, kunnes omistaja peruuttaa luvan", "title": "Luvanvarainen" }, "private": { - "description": "Pääsy sallittu vain omistajan erityisluvalla", "title": "Yksityinen" }, "yes": { - "description": "Laki sallii pääsyn alueelle", "title": "Sallittu" } }, @@ -1396,6 +1534,9 @@ "label": "Paikkamäärä", "placeholder": "5, 10, 20, 100..." }, + "cash_in": { + "label": "Käteisen talletus" + }, "castle_type": { "label": "Tyyppi" }, @@ -2044,7 +2185,7 @@ "placeholder": "1, 2, 3..." }, "phone": { - "label": "Puhelin", + "label": "Puhelinnumero", "placeholder": "+358 40 123 4567" }, "piste/difficulty": { @@ -2159,7 +2300,7 @@ "label": "Tienumero" }, "ref_route": { - "label": "Reittinumero" + "label": "Linjanumero" }, "ref_runway": { "label": "Kiitoratanumero", @@ -2700,10 +2841,6 @@ "name": "Polkupyörän huoltoteline", "terms": "teline, pidike, huolto, pyörä, polkupyörä, pyörän, polkupyörän" }, - "amenity/biergarten": { - "name": "Ulkoilmaolutravintola", - "terms": "ravintola, olut, terassi, juoma, juomaterassi, juottola, juomala, alkoholi, juominen, olutterassi" - }, "amenity/boat_rental": { "name": "Venevuokraamo", "terms": "vene, laiva, paatti, jolla, veneenvuokraus, venevuokra, vuokra, venevuokraus, venevuokraamo, veneenvuokraamo" @@ -2720,15 +2857,16 @@ "terms": "Kahvila, Kahvitupa, Teehuone" }, "amenity/car_pooling": { - "name": "Yhteiskäyttöauton noutopiste", - "terms": "yhteiskäyttö, jako, jakaminen, jakamis, auto, jakoauto, yhteisauto, vuokra, vuokra-auto, vuokraaminen, vuokraus, ajoneuvo" + "name": "Kimppakyyti", + "terms": "yhteiskäyttö, jako, jakaminen, jakamis, auto, jakoauto, yhteisauto, vuokra, vuokra-auto, vuokraaminen, vuokraus, ajoneuvo, kimppa" }, "amenity/car_rental": { "name": "Autonvuokraus", "terms": "autovuokraamo, autonvuokraus, auton vuokraus, auto, vuokra-auto, auton vuokraaminen, vuokraaminen" }, "amenity/car_sharing": { - "name": "Kimppakyyti" + "name": "Yhteiskäyttöauto", + "terms": "yhteiskäyttö, jako, jakaminen, jakamis, auto, jakoauto, yhteisauto, vuokra, vuokra-auto, vuokraaminen, vuokraus, ajoneuvo, sunfleet, drivenow" }, "amenity/car_wash": { "name": "Autopesula", @@ -4041,6 +4179,9 @@ "leisure/adult_gaming_centre": { "name": "Uhkapelipelaamo" }, + "leisure/beach_resort": { + "name": "Rantalomakohde" + }, "leisure/bird_hide": { "name": "Lintutorni" }, @@ -4327,10 +4468,11 @@ "name": "Paljas kallio" }, "natural/bay": { - "name": "Satama" + "name": "Lahti" }, "natural/beach": { - "name": "Ranta" + "name": "Ranta", + "terms": "uimaranta, hiekkaranta, uiminen, uima, uinti" }, "natural/cave_entrance": { "name": "Luolan suuaukko" @@ -5548,7 +5690,7 @@ }, "imagery": { "Bing": { - "description": "Satelliitti- ja ilmakuvat.", + "description": "Satelliitti- ja ilmakuvat", "name": "Bing-ilmakuvat" }, "DigitalGlobe-Premium": { @@ -5597,7 +5739,7 @@ "attribution": { "text": "Käyttöehdot ja palaute" }, - "description": "Satelliitti- ja ilmakuvat.", + "description": "Satelliitti- ja ilmakuvat", "name": "Mapbox-satelliittikuvat" }, "OSM_Inspector-Addresses": { @@ -5705,11 +5847,28 @@ }, "name": "Vaellus ja pyöräily" }, + "kelkkareitit": { + "description": "Kelkkareitit.fi-moottorikelkkareitit Pohjoismaissa", + "name": "Pohjoismaiset moottorikelkkareitit" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Maanmittauslaitos, CC0" + }, + "name": "Maanmittauslaitoksen historiallinen ortokuva vuodelta 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Maanmittauslaitos, CC0" + }, + "name": "Maanmittauslaitoksen historiallinen ortokuva vuodelta 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Käyttöehdot ja palaute" }, - "description": "Korostaa tärkeimpiä kohteita." + "description": "Näyttää merkittävimmät karttakohteet kauas loitonnettaessa", + "name": "Karkean sijainnin lisänäkymä" }, "openpt_map": { "attribution": { @@ -5739,7 +5898,8 @@ "osmse-ekonomiska": { "attribution": { "text": "© Lantmäteriet" - } + }, + "name": "Maanmittauslaitoksen talouskartta 1950–1980" }, "qa_no_address": { "attribution": { @@ -5752,6 +5912,10 @@ "text": "© Karttakuvat: skobbler Kartta-aineisto: OpenStreetMapin tekijät" } }, + "skoterleder": { + "description": "Moottorikelkkareitit", + "name": "Ruotsin moottorikelkkareitit" + }, "tf-cycle": { "attribution": { "text": "Kartat © Thunderforest, Aineisto © OpenStreetMapin tekijät" @@ -5792,6 +5956,24 @@ "OSM-India-facebook": { "description": "Paranna Intian OpenStreetMapia" }, + "fi-forum": { + "name": "OpenStreetMap Suomen keskustelualue", + "description": "OpenStreetMap Suomen keskustelualue verkossa" + }, + "fi-irc": { + "name": "OpenStreetMap Suomen irc-kanava", + "description": "Osallistu #osm-fi-kanavalle osoitteessa irc.oftc.net (portti 6667)" + }, + "fi-mailinglist": { + "name": "Talk-fi-sähköpostituslista", + "description": "Talk-fi on Suomen OSM-yhteisön virallinen sähköpostituslista" + }, + "de-mailinglist": { + "description": "Talk-de on Saksan OSM-yhteisön virallinen sähköpostituslista" + }, + "it-mailinglist": { + "description": "Talk-it on Italian OSM-yhteisön virallinen sähköpostituslista" + }, "it-twitter": { "description": "Seuraa Twitter-tiliämme osoitteessa {url}" }, diff --git a/dist/locales/fr.json b/dist/locales/fr.json index d3b133340..e086ce84c 100644 --- a/dist/locales/fr.json +++ b/dist/locales/fr.json @@ -23,7 +23,7 @@ }, "add_note": { "title": "Note", - "description": "Vous avez repéré une erreur ? Faîtes-le savoir aux autres cartographes.", + "description": "Vous avez repéré une erreur ? Faites-le savoir aux autres cartographes.", "tail": "CLiquez sur la earte pour ajouter une note." }, "browse": { @@ -430,7 +430,12 @@ "edited_by": "Edité par", "changeset": "Groupe de modification", "unknown": "Inconnu", - "link_text": "Historique sur openstreetmap.org" + "link_text": "Historique sur openstreetmap.org", + "note_no_history": "Pas d'historique (nouvelle note)", + "note_comments": "Commentaires", + "note_created_date": "Date de création", + "note_created_user": "Crée pare", + "note_link_text": "Note sur openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "sommet", "line": "ligne", "area": "polygone", - "relation": "relation" + "relation": "relation", + "note": "note" }, "geocoder": { "search": "Rechercher dans le monde entier…", @@ -523,8 +529,6 @@ "best_imagery": "Meilleur fond de carte connu pour cet endroit", "switch": "Revenir à cet arrière-plan", "custom": "Personnalisé", - "custom_button": "Modifier le fond personnalisé", - "custom_prompt": "Entrez un modèle URL de tuile. Les symboles valide sont : \n - {zoom} ou {z}, {x}, {y} pour le schéma de tuile Z/X/Y\n - {-y} ou {ty} pour basculer vers le style de coordonnés TMS Y\n - {u} pour le schéma quadri-tuiles\n - {switch:a,b,c} pour le multiplexage de serveurs DNS\n\nExemple:\n{example}", "overlays": "Calques", "imagery_source_faq": "Info imagerie / Signaler un problème", "reset": "réinitialiser", @@ -727,18 +731,6 @@ }, "cannot_zoom": "Impossible de zoomer plus en arrière dans ce mode.", "full_screen": "Afficher/cacher le plein écran", - "gpx": { - "local_layer": "Ajouter un fichier GPX", - "drag_drop": "Glissez-déposez un fichier .gpx, .geojson ou .kml sur la page, ou cliquez sur le bouton de droite pour le rechercher dans votre ordinateur.", - "zoom": "Zoomer sur la couche", - "browse": "Sélectionnez un fichier" - }, - "mvt": { - "local_layer": "Ajouter un fichier MVT", - "drag_drop": "Glissez-déposez un fichier .mvt ou .pbf sur la page ou cliquez sur le bouton à droite pour naviguer dans vos fichiers.", - "zoom": "Zoomer sur la couche", - "browse": "Sélectionner un fichier" - }, "streetside": { "tooltip": "Photos Streetside de Microsoft", "title": "Sucouche photo (Bing Streetside)", @@ -770,6 +762,12 @@ "anonymous": "anonyme", "closed": "(Fermée)", "commentTitle": "Commentaires", + "status": { + "opened": "ouverte {when}", + "reopened": "réouverte {when}", + "commented": "commentée {when}", + "closed": "fermée {when}" + }, "newComment": "Nouveau commentaire", "inputPlaceholder": "Saisissez un commentaire à partager avec d'autres utilisateurs.", "close": "Fermer la note", @@ -1441,31 +1439,35 @@ "label": "Accès autorisé", "options": { "designated": { - "description": "Accès autorisé par des panneaux ou par une réglementation locale", + "description": "Accès autorisé selon la signalisation ou la réglementation locale ", "title": "Prévu spécifiquement pour certains types de véhicules" }, "destination": { - "description": "Circulation interdite, sauf pour accéder aux zones desservies", + "description": "Accès autorisé uniquement pour atteindre une destination", "title": "Interdit sauf riverains" }, "dismount": { - "description": "Accès autorisé mais mettre pied à terre", + "description": "Accès autorisé avec pied à terre", "title": "Mettre pied à terre" }, "no": { - "description": "Accès interdit au public", + "description": "Accès non autorisé au public", "title": "Interdit" }, "permissive": { - "description": "Accès laissé libre par le propriétaire, révocable à tout moment", + "description": "Accès autorisé jusqu'à ce que le propriétaire révoques la permission", "title": "Accès toléré" }, + "permit": { + "description": "Accès autorisés uniquement avec une licence ou permis valide", + "title": "Permis" + }, "private": { - "description": "Accès autorisé sur demande au propriétaire", + "description": "Accès autorisés uniquement sur autorisation nominative du propriétaire", "title": "Privé" }, "yes": { - "description": "Accès autorisé par servitude de passage", + "description": "Accès autorisé par la loi ; droit de passage", "title": "Autorisé" } }, @@ -3050,10 +3052,6 @@ "name": "Stand d'outils de réparation de vélos", "terms": "Magasin de vélos, Atelier de réparation de vélos, bicycle repair station" }, - "amenity/biergarten": { - "name": "Brasserie de plein air - Biergarten", - "terms": "Brasserie, bière, boissons alcolisées, biergarten" - }, "amenity/boat_rental": { "name": "Location de bateau", "terms": "Location de bateaux, boat rental" @@ -3351,8 +3349,8 @@ "terms": "Station de vidange, sanitaires, mobilehome ,camping, toilettes chimiques" }, "amenity/school": { - "name": "Établissement scolaire - élémentaire ou secondaire", - "terms": "école élémentaire, école primaire, collège, lycée, \ncycles primaires et secondaires, enseignements élémentaire et secondaire, \nenseignement élémentaire, enseignement secondaire, \nétablissement d'enseignement élémentaire, établissement d'enseignement secondaire, \nécole, écoliers, CP-CE1-CE2-CM1-CM2, college, lycee, school" + "name": "École élémentaire ou secondaire", + "terms": "école élémentaire, école primaire, école secondaire, collège, lycée, \ncycles primaires et secondaires, enseignements élémentaire et secondaire, \nenseignement élémentaire, enseignement secondaire, \nétablissement d'enseignement élémentaire, établissement d'enseignement secondaire,\nécole, écoliers, CP-CE1-CE2-CM1-CM2, ecole, college, lycee, school" }, "amenity/scrapyard": { "name": "Casse automobile" @@ -4915,6 +4913,10 @@ "name": "Pont", "terms": "Pont" }, + "man_made/bunker_silo": { + "name": "Silo-couloir", + "terms": "Silo-couloir, trémie" + }, "man_made/chimney": { "name": "Cheminée", "terms": "Cheminée" @@ -6764,6 +6766,25 @@ }, "name": "Randonnée & Vélo" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Chemins motoneige de Kelkkareitit.fi depuis les données OSM (couverture nordique)", + "name": "Surcouche motoneige nordique" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "name": "Ortophotos historiques Lantmäteriet 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "name": "Ortophotos historiques Lantmäteriet 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Termes & commentaires" @@ -6799,9 +6820,7 @@ "osmse-ekonomiska": { "attribution": { "text": "© Lantmäteriet" - }, - "description": "Numérisation de ´Economic maps´ de 1950-1980", - "name": "Carte économique (historique) de Lantmäteriet" + } }, "qa_no_address": { "attribution": { @@ -6815,6 +6834,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Chemins motoneige", + "name": "Carte motoneige en Suède" + }, "stamen-terrain-background": { "attribution": { "text": "Tuiles par Stamen Design, sous CC-BY 3.0. Données par OpenStreetMap, sous ODbL" @@ -6877,9 +6903,17 @@ } }, "community": { + "bw-facebook": { + "name": "Mapping Botswana sur Facebook", + "description": "Page OpenStreetMap au Botswana" + }, + "bw-twitter": { + "name": "Mapping Botswana sur Twitter", + "description": "Fil Twitter OpenStreetMap au Botswana" + }, "cape-coast-youthmappers": { "name": "YouthMappers de l'université de Cape Coast", - "description": "Suivez-nous sur Twitter: {url}", + "description": "Suivez-nous sur Twitter : {url}", "extendedDescription": "C'est le compte officiel du cahpitre Youth Mappers de l'université de Cape Coast, au Ghana. Nous aimons les cartes, la donnée libre et aider les communautés vulnérables." }, "osm-gh-facebook": { @@ -6889,7 +6923,7 @@ }, "osm-gh-twitter": { "name": "OpenStreetMap Ghana sur Twitter", - "description": "Suivez-nous sur Twitter: {url}" + "description": "Suivez-nous sur Twitter : {url}" }, "talk-gh": { "name": "Liste de diffusion Talk-gh", @@ -6953,7 +6987,7 @@ }, "OSM-japan-twitter": { "name": "Fil Twitter d'OpenStreetMap Japon", - "description": "Hashtag sur Twitter: {url}" + "description": "Hashtag sur Twitter : {url}" }, "OSM-japan-website": { "name": "OpenStreetMap Japon", @@ -7063,7 +7097,7 @@ }, "at-twitter": { "name": "Fil Twitter d'OpenStreetMap Autriche", - "description": "OpenStreetMap Autriche sur Twitter: {url}" + "description": "OpenStreetMap Autriche sur Twitter : {url}" }, "osmgraz-meetup": { "name": "Rencontres OSM communautaires de Graz", @@ -7115,7 +7149,7 @@ }, "be-twitter": { "name": "Fil Twitter d'OpenStreetMap Belgique", - "description": "OSM Belgique sur Twitter: @osm_be" + "description": "OSM Belgique sur Twitter : @osm_be" }, "hr-facebook": { "name": "Groupe Facebook d'OpenStreetMap Croatie", @@ -7139,7 +7173,7 @@ }, "osmcz-twitter": { "name": "Twitter tchèque @osmcz", - "description": "Suivez la communauté tchèque sur Twitter - dont la traduction des HebdoOSM !" + "description": "Suivez la communauté tchèque sur Twitter — dont la traduction des HebdoOSM !" }, "talk-cz-mailinglist": { "name": "Liste de diffusion tchèque (talk-cz)", @@ -7187,7 +7221,7 @@ }, "fr-twitter": { "name": "OpenStreetMap France sur Twitter", - "description": "OpenStreetMap France sur Twitter: {url}" + "description": "OpenStreetMap France sur Twitter : {url}" }, "de-berlin-mailinglist": { "name": "Liste de diffusion pour Berlin", @@ -7203,7 +7237,7 @@ }, "de-berlin-twitter": { "name": "Fil Twitter d'OpenStreetMap Berlin", - "description": "Suivez-nous sur Twitter: {url}" + "description": "Suivez-nous sur Twitter : {url}" }, "de-forum": { "name": "Forum d'OpenStreetMap DE", @@ -7241,6 +7275,18 @@ "name": "Réunion d'OpenStreetMap Hongrie", "description": "La plate-forme pour l'organisation des réunions en Hongrie" }, + "is-facebook": { + "name": "OSM Islande sur Facebook", + "description": "Page OpenStreetMap en Islande" + }, + "is-mailinglist": { + "name": "Liste de diffusion Talk-is", + "description": "Talk-is est la liste de diffusion officielle pour la communauté OSM islandaise" + }, + "is-twitter": { + "name": "OSM Islande sur Twitter", + "description": "Fil Twitter d'OpenStreetMap en Islande" + }, "it-facebook": { "name": "Facebook d'OpenStreetMap Italie", "description": "Rejoignez la communauté italienne d'OpenStreetMap sur Facebook" @@ -7337,7 +7383,7 @@ }, "se-twitter": { "name": "OpenStreetMap Suède sur Twitter", - "description": "Suivez-nous sur Twitter: {url}" + "description": "Suivez-nous sur Twitter : {url}" }, "Nottingham-OSM-pub-meetup": { "name": "Rencontres mensuelles dans un pub de East Midlands (Nottingham)", @@ -7658,6 +7704,29 @@ "name": "OpenStreetMap Pérou", "description": "Nouvelles et ressources pour la communauté d'OpenStreetMap au Pérou" }, + "LATAM-Facebook": { + "name": "Facebook d'OpenStreetMap Amérique Latine", + "description": "OpenStreetMap Amérique Latine sur Facebook" + }, + "LATAM-Telegram": { + "name": "Télégram d'OpenStreetMap Amérique Latine", + "description": "Télégram OpenStreetMap pour l'Amérique Latine" + }, + "LATAM-Twitter": { + "name": "Fil Twitter d'OpenStreetMap Amérique Latine", + "description": "Suivez-nous sur Twitter à l'adresse {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Amérique Latine", + "description": "Supporte OpenStreetMap en Amérique Latine", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "Le State of the Map Latam est la conférence annuelle pour tous les cartographes et les utilisateurs d'OpenStreetMap en Amérique Latine. Le programme comprend des présentations, des tables rondes, des ateliers et des mapathons sur le thème d'OpenStreetMap.", + "where": "Buenos Aires, Argentine" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap sur Facebook", "description": "Mettez-nous un « j'aime » sur Facebook pour recevoir des nouvelles d'OpenStreetMap." diff --git a/dist/locales/gl.json b/dist/locales/gl.json index 8a8464177..e20021525 100644 --- a/dist/locales/gl.json +++ b/dist/locales/gl.json @@ -21,6 +21,11 @@ "description": "Engadir restaurantes, monumentos, caixas do correo ou outros puntos ao mapa.", "tail": "Fai clic no mapa para engadir un punto." }, + "add_note": { + "title": "Nota", + "description": "Atopaches un problema? Faillo saber a outros mapeadores.", + "tail": "Fai clic no mapa para engadir unha nota." + }, "browse": { "title": "Buscar", "description": "Desprazar e ampliar o mapa." @@ -40,7 +45,8 @@ "annotation": { "point": "Punto engadido.", "vertex": "Engadiuse un nó a unha vía.", - "relation": "Relación engadida." + "relation": "Relación engadida.", + "note": "Nota engadida." } }, "start": { @@ -297,6 +303,10 @@ "create": "Engadida unha restrición de xiro.", "delete": "Eliminada unha restrición de xiro." } + }, + "detach_node": { + "title": "Extraer", + "key": "E" } }, "restriction": { @@ -509,8 +519,6 @@ "best_imagery": "Mellor fonte de imaxes coñecida deste sitio", "switch": "Voltar a este fondo", "custom": "Personalizado", - "custom_button": "Editar fondo personalizado", - "custom_prompt": "Introducir un modelo URL de mosaico. Os tokens válidos son:\n - {zoom}/{z}, {x}, {y} para o esquema de mosaico Z/X/Y\n - {-y} ou {ty} para coordenadas Y invertidas estilo TMS\n - {u} para o esquema quadtile\n - {switch:a,b,c} para multiplexado de servidores DNS\n\nExemplo:\n{example}", "overlays": "Superposicións", "imagery_source_faq": "Información das imaxes/Informar dun problema", "reset": "reiniciar", @@ -538,7 +546,7 @@ "title": "Datos OpenStreetMap" }, "notes": { - "tooltip": "Nota de datos de OpenStreetMap", + "tooltip": "Datos das notas de OpenStreetMap", "title": "Notas de OpenStreetMap" } }, @@ -713,18 +721,6 @@ }, "cannot_zoom": "Non se pode reducir máis no modo actual.", "full_screen": "Pasar a pantalla completa", - "gpx": { - "local_layer": "Engadir un GPX", - "drag_drop": "Arrastra e solta un ficheiro .gpx, .geojson ou .kml sobre a páxina, ou fai clic no botón da dereita para buscalo", - "zoom": "Zoom na capa", - "browse": "Buscar un ficheiro" - }, - "mvt": { - "local_layer": "Engadir un MVT", - "drag_drop": "Arrastra e solta un ficheiro .mvt ou .pbf sobre a páxina, ou fai clic no botón da dereita para buscalo", - "zoom": "Ampliar á capa", - "browse": "Buscar un ficheiro" - }, "streetside": { "tooltip": "Fotos Streetside de Microsoft", "title": "Superposición de fotos (Bing Streetside)", @@ -756,6 +752,12 @@ "anonymous": "anónimo", "closed": "(Pechado)", "commentTitle": "Comentarios", + "status": { + "opened": "aberta {when}", + "reopened": "reaberta {when}", + "commented": "comentada {when}", + "closed": "pechada {when}" + }, "newComment": "Novo comentario", "inputPlaceholder": "Introducir un comentario para compartir con outros usuarios.", "close": "Pechar a nota", @@ -764,6 +766,9 @@ "close_comment": "Pechar e comentar", "open_comment": "Volver a abrir e comentar", "report": "Informar dun problema", + "new": "Nova nota", + "newDescription": "Describe o problema.", + "save": "Gardar nota", "login": "Debe acceder para poder facer cambios ou comentarios nesta nota.", "upload_explanation": "Os seus comentarios serán públicos e visibles para calquera usuario de OpenStreetMap.", "upload_explanation_with_user": "Os seus comentarios como {user} serán públicos e visibles para todos os usuarios de OpenStreetMap." @@ -1214,6 +1219,8 @@ "add_point": "Modo 'engadir punto'", "add_line": "Modo 'engadir liña'", "add_area": "Modo 'engadir área'", + "add_note": "Modo 'engadir nota'", + "place_point": "Situar un punto ou unha nota", "disable_snap": "Manter premido para desactivar o axuste do punto", "stop_line": "Rematar de debuxar unha liña ou área" }, @@ -1325,31 +1332,24 @@ "label": "Permítese o acceso", "options": { "designated": { - "description": "Acceso libre e regulado por sinais e ordenanzas locais", "title": "Designado" }, "destination": { - "description": "Acceso permitido só para chegar a un destino determinado", "title": "Destino" }, "dismount": { - "description": "Permítese o acceso mais sempre a pé", "title": "Baixar ou desmontar" }, "no": { - "description": "Acceso restrinxido ao público xeral", "title": "Prohibido" }, "permissive": { - "description": "Acceso permitido até que o propietario revogue o permiso", "title": "Permisivo" }, "private": { - "description": "Acceso permitido só coa autorización do propietario de forma individual", "title": "Privado" }, "yes": { - "description": "Acceso permitido pola lei; un dereito de paso", "title": "Permitido" } }, @@ -2829,10 +2829,6 @@ "name": "Lugar para ferramentas de reparación de bicicletas", "terms": "bici, bicicleta, reparación, inchar" }, - "amenity/biergarten": { - "name": "Xardín da cervexa", - "terms": "cervexa, alcohol, biergarten" - }, "amenity/boat_rental": { "name": "Aluguer de botes", "terms": "aluguer, bote, barca, lancha" diff --git a/dist/locales/he.json b/dist/locales/he.json index 5ca75b686..573e53146 100644 --- a/dist/locales/he.json +++ b/dist/locales/he.json @@ -430,7 +430,12 @@ "edited_by": "נערך על ידי", "changeset": "ערכת שינויים", "unknown": "לא ידוע", - "link_text": "היסטוריה ב־openstreetmap.org" + "link_text": "היסטוריה ב־openstreetmap.org", + "note_no_history": "אין היסטוריה (הערה חדשה)", + "note_comments": "תגובות", + "note_created_date": "מועד יצירה", + "note_created_user": "נוצר על ידי", + "note_link_text": "הערה ב־openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "קודקוד", "line": "קו", "area": "שטח", - "relation": "יחס" + "relation": "יחס", + "note": "הערה" }, "geocoder": { "search": "חיפוש בכל העולם…", @@ -523,8 +529,6 @@ "best_imagery": "מקור התמונה המוכר והטוב ביותר למיקום זה", "switch": "חזרה לרקע זה", "custom": "התאמה אישית", - "custom_button": "עריכת רקע בהתאמה אישית", - "custom_prompt": "נא להקליד כתובת תבנית. האסימונים התקניים הם:\n - {zoom} או {z}, {x}, {y} לסכימת אריחים מסוג Z/X/Y\n - {‎-y} או {ty} לנקודות ציון הפוכות בציר Y בסגנון TMS\n - {u} לסכימת אריחים מרובעת (QuadTile)\n - {switch:a,b,c} למעבר בין DNS של שרתים\n\nדוגמה:\n{example}", "overlays": "שכבות על", "imagery_source_faq": "פרטי צילום / דיווח על תקלה", "reset": "איפוס", @@ -626,6 +630,16 @@ "tooltip": "השטחים מצויירים עם מילוי מלא." } }, + "settings": { + "custom_background": { + "tooltip": "עריכת רקע בהתאמה אישית", + "header": "הגדרות רקע בהתאמה אישית", + "instructions": "נא להקליד כתובת תבנית. האסימונים התקניים הם:\n {zoom} או {z}, {x}, {y} לסכימת אריחים מסוג Z/X/Y\n {‎-y} או {ty} לנקודות ציון הפוכות בציר Y בסגנון TMS\n {u} לסכימת אריחים מרובעת (QuadTile)\n {switch:a,b,c} למעבר בין DNS של שרתים\n\nדוגמה:\n{example}", + "template": { + "placeholder": "נא להקליד תבנית כתובת" + } + } + }, "restore": { "heading": "יש לך שינויים שלא נשמרו", "description": "לשחזר שינויים שלא נשמרו מהפעלות עריכה קודמות?", @@ -727,18 +741,6 @@ }, "cannot_zoom": "לא ניתן להתקרב יותר במצב הנוכחי.", "full_screen": "החלפת מצב מסך מלא", - "gpx": { - "local_layer": "תוסיף GPX", - "drag_drop": "יש לגרור ולהשליך קובצי ‎.gpx,‏ ‎.geojson או ‎.kml לעמוד או ללחוץ על הכפתור שמשמאל לעיון", - "zoom": "התקרבות לשכבה", - "browse": "עיון אחר קובץ" - }, - "mvt": { - "local_layer": "תוסיף MVT", - "drag_drop": "גרור והורד קובץ .mvt או .pbf או לחץ על כפתור", - "zoom": "התמקד לשכבה", - "browse": "חפש קובץ" - }, "streetside": { "tooltip": "תמונות של Streetside מבית Microsoft", "title": "שכבת תמונות (Bing Streetside)", @@ -770,6 +772,12 @@ "anonymous": "אלמוני", "closed": "(נסגרה)", "commentTitle": "תגובות", + "status": { + "opened": "נפתח {when}", + "reopened": "נפתח מחדש {when}", + "commented": "נוסף תגובה {when}", + "closed": "נסגר {when}" + }, "newComment": "תגובה חדשה", "inputPlaceholder": "נא להקליד תגובה שתשותף עם משתמשים אחרים.", "close": "סגירת הערה", @@ -777,7 +785,7 @@ "comment": "תגובה", "close_comment": "סגירה והוספת תגובה", "open_comment": "פתיחה מחדש והוספת תגובה", - "report": "דיוו", + "report": "דיוח", "new": "הערה חדשה", "newDescription": "תיאור הבעיה.", "save": "שמירת ההערה", @@ -1327,7 +1335,7 @@ "add_point": "מצב ‚הוספת נקודה’", "add_line": "מצב ‚הוספת קו’", "add_area": "מצב ’הוספת שטח’", - "add_note": "מצב ‚הוספת הערה’", + "add_note": "מצב ’הוספת הערה’", "place_point": "הצבת נקודה או הערה", "disable_snap": "יש להחזיק כדי להשבית הצמדת נקודות", "stop_line": "סיום ציור קו או שטח" @@ -1441,31 +1449,34 @@ "label": "הכניסה מותרת", "options": { "designated": { - "description": "הגישה מותרת לפי שילוט או חוקים מקומיים", + "description": "הגישה מותרת בהתאם לשילוט או חוקים מקומיים מסוימים", "title": "מיועד" }, "destination": { - "description": "הגישה מותרת רק כדי להגיע לאזור בהמשך", + "description": "הגישה מותרת רק לצורך הגעה ליעד", "title": "יעד" }, "dismount": { - "description": "הגישה מותרת ללא רכיבה", + "description": "הגישה מותרת אך ללא רכיבה", "title": "ירידה מסוס/אופניים" }, "no": { - "description": "הכניסה אסורה לקהל הרחב", + "description": "הגישה לציבור חסומה", "title": "הכניסה אסורה" }, "permissive": { - "description": "הגישה מותרת כל עוד בעל המקום עוד מרשה זאת", + "description": "הגישה מותרת עד להודעה חדשה", "title": "מתירני" }, + "permit": { + "description": "הגישה מותרת רק עם רישיון או היתר בתוקף", + "title": "היתר" + }, "private": { - "description": "הכניסה מותרת רק עם אישור מבעל המקום על בסיס פרטני", + "description": "הגישה מותרת רק עם הרשאת הבעלים באופן פרטני", "title": "פרטי" }, "yes": { - "description": "הכניסה מותרת לפי חוק", "title": "מותר" } }, @@ -3052,8 +3063,8 @@ "terms": "עמדת תיקון אופניים" }, "amenity/biergarten": { - "name": "גן בירה", - "terms": "גינת בירה,ביר גארדן,ביר גרדן" + "name": "ביר גרדן", + "terms": "בירגרטן, גן בירה, בירגרדן, ביר גארדן" }, "amenity/boat_rental": { "name": "השכרת סירה", @@ -4841,6 +4852,10 @@ "name": "מגרש פוטבול", "terms": "מגרש פוטבול" }, + "leisure/pitch/badminton": { + "name": "מגרש בדמינטון", + "terms": "בדמינטון,כדור נוצה" + }, "leisure/pitch/baseball": { "name": "מגרש בייסבול", "terms": "מגרש כדור בסיס" @@ -6896,9 +6911,7 @@ "osmse-ekonomiska": { "attribution": { "text": "© Lantmäteriet" - }, - "description": "סריקה של ´מפות כלכליות´ סביב 1950-1980", - "name": "המפה הכלכלית של Lantmäteriet (היסטורי)" + } }, "qa_no_address": { "attribution": { @@ -6974,6 +6987,14 @@ } }, "community": { + "bw-facebook": { + "name": "מיפוי בוטסואנה בפייסבוק", + "description": "העמוד של OpenStreetMap בבוטסואנה" + }, + "bw-twitter": { + "name": "מיפוי בוטסואנה בטוויטר", + "description": "הטוויטר של OpenStreetMap בבוטסואנה" + }, "cape-coast-youthmappers": { "name": "הממפים הצעירים של אוניברסיטת קייפ קוסט", "description": "ניתן לעקוב אחרינו בטוויטר: {url}", @@ -7338,6 +7359,18 @@ "name": "קבוצת המפגשים של OpenStreetMap הונגרי", "description": "הפלטפורמה לכינוס מפגשים בהונגריה" }, + "is-facebook": { + "name": "OSM איסלנד בפייסבוק", + "description": "העמוד של OpenStreetMap באיסלנד" + }, + "is-mailinglist": { + "name": "קבוצת הדיוור Talk-is", + "description": "Talk-is היא קבוצת הדיוור הרשמית של קהילת OSM האיסלנדית" + }, + "is-twitter": { + "name": "OSM איסלנד בטוויטר", + "description": "הטוויטר של OpenStreetMap באיסלנד" + }, "it-facebook": { "name": "הפייסבוק של OpenStreetMap איטליה", "description": "ניתן להצטרף לקהילה של OpenStreetMap איטליה בפייסבוק" @@ -7755,6 +7788,29 @@ "name": "OpenStreetMap פרו", "description": "חדשות ומשאבים לקהילת OpenStreetMap פרו" }, + "LATAM-Facebook": { + "name": " הפייסבוק של OpenStreetMap אמריקה הלטינית", + "description": "OpenStreetMap אמריקה הלטינית בפייסבוק" + }, + "LATAM-Telegram": { + "name": "הטלגרם של OpenStreetMap אמריקה הלטינית", + "description": "טלגרם של OpenStreetMap עבור אמריקה הלטינית" + }, + "LATAM-Twitter": { + "name": "הטוויטר של OpenStreetMap אמריקה הלטינית", + "description": "ניתן לעקוב אחרינו בטוויטר בכתובת {url}" + }, + "osm-latam": { + "name": "OpenStreetMap אמריקה הלטינית", + "description": "תמיכה ב־OpenStreetMap באמריקה הלטינית", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam הוא הכנס השנתי של כל הממפים והמשתמשים ב־OpenStreetMap באמריקה הלטינית. התכנית כוללת הרצאות בזק, פאנלים, סדנאות ומפאתונים (האקתונים של מיפוי) שקשורים ב־OpenStreetMap.", + "where": "בואנוס איירס, ארגנטינה" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap בפייסבוק", "description": "ניתן לעשות לנו ‚לייק’ בפייסבוק כדי לקבל חדשות ועדכונים על OpenStreetMap." diff --git a/dist/locales/hr.json b/dist/locales/hr.json index e0794fac4..9f1a29624 100644 --- a/dist/locales/hr.json +++ b/dist/locales/hr.json @@ -2,7 +2,8 @@ "hr": { "icons": { "information": "info", - "remove": "ukloni" + "remove": "ukloni", + "undo": "poništi" }, "modes": { "add_area": { @@ -20,6 +21,11 @@ "description": "Dodaj restorane, spomenike, poštanske sandučiće ili druge točke na kartu.", "tail": "Klikni na kartu za dodavanje točke." }, + "add_note": { + "title": "Bilješka", + "description": "Primijetio/la si grešku? Obavijesti druge doprinositelje.", + "tail": "Klikni na kartu za dodavanje bilješke." + }, "browse": { "title": "Pretraži", "description": "Pomiči i približi ili udalji prikaz karte." @@ -39,7 +45,8 @@ "annotation": { "point": "Točka je dodana.", "vertex": "Putu je dodana točka.", - "relation": "Relacija je dodana." + "relation": "Relacija je dodana.", + "note": "Bilješka je dodana." } }, "start": { @@ -149,7 +156,9 @@ "vertex": "Put povezan na drugi put.", "line": "Put je spojen na liniju.", "area": "Put je spojen na područje." - } + }, + "relation": "Ovi elementi se ne mogu povezati jer imaju konfliktne uloge u relacijama.", + "restriction": "Ovi elementi se ne mogu povezati jer bi to oštetilo relaciju: \"{relation}\"." }, "disconnect": { "title": "Razdvoji", @@ -167,6 +176,8 @@ "annotation": "{n} elemenata je spojeno.", "not_eligible": "Ovi elementi se ne mogu spojiti.", "not_adjacent": "Ovi elementi se ne mogu spojiti jer njihove krajnje točke nisu spojene.", + "restriction": "Ovi elementi se ne mogu spojiti jer bi to oštetilo relaciju: \"{relation}\".", + "relation": "Ovi elementi se ne mogu spojiti jer imaju konfliktne uloge u relacijama.", "incomplete_relation": "Ovi se elementi ne mogu spojiti jer bar jedan od njih nije potpuno preuzet s interneta.", "conflicting_tags": "Ovi elementi se ne mogu spojiti jer se neke njihove oznake ne podudaraju." }, @@ -179,7 +190,7 @@ "key": "M", "annotation": { "point": "Točka je premještena.", - "vertex": "Točka je premještena na put.", + "vertex": "Točka unutar puta je premještena.", "line": "Linija je premještena.", "area": "Područje je premješteno.", "multiple": "Više elemenata je premješteno." @@ -296,17 +307,44 @@ "detach_node": { "title": "Odvoji", "key": "E", - "description": "Odvoji ovaj čvor s ovih linija/područja." + "description": "Odvoji ovaj čvor s ovih linija/područja.", + "annotation": "Čvor je odvojen s roditeljskih linija/područja.", + "restriction": "Ovaj čvor se ne može odvojiti jer bi to oštetilo relaciju: \"{relation}\".", + "connected_to_hidden": "Ovaj čvor se ne može odvojiti jer je spojen na skriveni element." } }, "restriction": { "controls": { - "distance": "Udaljenost" + "distance": "Udaljenost", + "distance_up_to": "Do {distance}", + "via": "Preko", + "via_node_only": "Samo točka" }, "help": { + "indirect": "(posredno)", + "turn": { + "no_left_turn": "BEZ lijevih skretanja {indirect}", + "no_right_turn": "BEZ desnih skretnja {indirect}", + "no_u_turn": "BEZ polukružnog okretanja {indirect}", + "no_straight_on": "BEZ prolaska ravno {indirect}", + "only_left_turn": "SAMO lijeva skretanja {indirect}", + "only_right_turn": "SAMO desna skretanja {indirect}", + "only_u_turn": "SAMO polukružna okretanja {indirect}", + "only_straight_on": "SAMO prolazak ravno {indirect}", + "allowed_left_turn": "Lijevo skretanje dozvoljeno {indirect}", + "allowed_right_turn": "Desno skretanje dozvoljeno {indirect}", + "allowed_u_turn": "Polukružno okretanje dozvoljeno {indirect}", + "allowed_straight_on": "Dozvoljen prolazak ravno {indirect}" + }, "from": "POLAZIŠTE", "via": "PREKO", - "to": "ODREDIŠTE" + "to": "ODREDIŠTE", + "from_name": "{from} {fromName}", + "from_name_to_name": "{from} {fromName} {to} {toName}", + "via_names": "{via} {viaNames}", + "select_from": "Klikni za odabiranje segmenta {from}", + "select_from_name": "Klikni za odabiranje {from} {fromName}", + "toggle": "Klikni za \"{turn}\"" } }, "undo": { @@ -326,6 +364,8 @@ "localized_translation_name": "Ime" }, "zoom_in_edit": "Približi za uređivanje", + "login": "Prijava", + "logout": "Odjava", "loading_auth": "Spajanje na OpenStreetMap...", "report_a_bug": "Prijavi grešku", "help_translate": "Pomozi prevesti iD uređivač", @@ -343,11 +383,13 @@ "title": "Postavi na OpenStreetMap", "upload_explanation": "Promjene koje postaviš biti će vidljive na svim kartama koje koriste podatke OpenStreetMapa.", "upload_explanation_with_user": "Promjene koje postaviš kao {user} biti će vidljive na svim kartama koje koriste podatke OpenStreetMapa.", + "request_review": "Želim da netko pregleda moja uređivanja.", "save": "Postavi", "cancel": "Otkaži", "changes": "{count} Promjena", + "download_changes": "Preuzmi osmChange datoteku promjena", "warnings": "Upozorenja", - "modified": "Promijenjeno", + "modified": "Uređeno", "deleted": "Obrisano", "created": "Stvoreno", "about_changeset_comments": "O komentarima promjena", @@ -365,24 +407,50 @@ "key": "B", "title": "Pozadina", "zoom": "Zum", + "vintage": "Starost", "source": "Izvor", "description": "Opis", "resolution": "Rezolucija", - "accuracy": "Preciznost" + "accuracy": "Preciznost", + "unknown": "Nepoznato", + "show_tiles": "Prikaži sličice", + "hide_tiles": "Sakrij sličice", + "show_vintage": "Prikaži starost", + "hide_vintage": "Sakrij starost" }, "history": { "key": "H", "title": "Povijest", - "version": "Verzija" + "selected": "{n} odabranih", + "no_history": "Bez povijesti (Novi element)", + "version": "Verzija", + "last_edit": "Posljednje uređivanje", + "edited_by": "Uređeno od", + "changeset": "Promjena", + "unknown": "Nepoznat", + "link_text": "Povijest na openstreetmap.org" }, "location": { "key": "L", - "title": "Lokacija" + "title": "Lokacija", + "unknown_location": "Nepoznata lokacija" }, "measurement": { "key": "M", + "title": "Mjerenje", + "selected": "{n} odabranih", "geometry": "Geometrija", - "area": "Područje" + "closed_line": "zatvorena linija", + "closed_area": "zatvoreno područje", + "center": "Centar", + "perimeter": "Opseg", + "length": "Duljina", + "area": "Površina", + "centroid": "Centroid", + "location": "Lokacija", + "metric": "Metrički", + "imperial": "Imperijalno", + "node_count": "Broj točaka" } }, "geometry": { @@ -447,14 +515,24 @@ "background": { "title": "Podloga", "description": "Postavke podloge", + "key": "B", + "backgrounds": "Pozadine", "none": "Nijedna", "best_imagery": "Najpoznatiji izvornik snimaka za ovo područje", "switch": "Vrati nazad na ovu podlogu", "custom": "Podesivo", - "custom_button": "Uredi prilagođenu podlogu", + "overlays": "Preklopi", + "imagery_source_faq": "Info o snimcima / Prijavi problem", "reset": "resetiraj", + "display_options": "Postavke prikaza", + "brightness": "Svjetlina", + "contrast": "Kontrast", + "saturation": "Zasićenost", + "sharpness": "Oštrina", "minimap": { - "tooltip": "Prikaži udaljeni prikaz karte za lakše lociranje trenutno prikazanog područja." + "description": "Pokaži mini kartu", + "tooltip": "Prikaži udaljeni prikaz karte za lakše lociranje trenutno prikazanog područja.", + "key": "/" }, "fix_misalignment": "Popravi odstupanje snimaka", "offset": "Pomakni bilo gdje na donjem sivom području za usklađivanje snimaka, ili unesi iznose odstupanja u metrima." @@ -462,7 +540,17 @@ "map_data": { "title": "Podaci karte", "description": "Podaci karte", + "key": "F", "data_layers": "Slojevi podataka", + "layers": { + "osm": { + "tooltip": "Podaci karte sa OpenStreetMapa", + "title": "OpenStreetMap podaci" + }, + "notes": { + "title": "OpenStreetMap bilješke" + } + }, "fill_area": "Ispuni područja", "map_features": "Elementi karte", "autohidden": "Ovi elementi su automatski skriveni jer ih je previše za prikaz na zaslonu. Možeš približiti prikaz za njihovo uređivanje." @@ -520,7 +608,8 @@ "area_fill": { "wireframe": { "description": "Bez ispune (žičani način)", - "tooltip": "Omogućavanjem žičanog načina jednostavnije je vidjeti snimke koje služe kao podloga za kartiranje." + "tooltip": "Omogućavanjem žičanog načina jednostavnije je vidjeti snimke koje služe kao podloga za kartiranje.", + "key": "W" }, "partial": { "description": "Djelomična ispuna", @@ -533,7 +622,9 @@ }, "restore": { "heading": "Imaš nespremljenih promjena", - "description": "Želiš li vratiti nespremljene promjene od posljednji puta kada si uređivao/la?" + "description": "Želiš li vratiti nespremljene promjene od posljednji puta kada si uređivao/la?", + "restore": "Vrati moje promjene", + "reset": "Zanemari moje promjene" }, "save": { "title": "Spremi", @@ -543,6 +634,7 @@ "status_code": "Poslužitelj je vratio status kôd {code}", "unknown_error_details": "Molim provjeri jesi li spojen na internet.", "uploading": "Postavljam promjene na OpenStreetMap...", + "conflict_progress": "Provjeravam konflikte: {num} od {total}", "unsaved_changes": "Imaš nespremljenih promjena.", "conflict": { "header": "Riješi konfliktna uređivanja", @@ -553,6 +645,7 @@ "keep_remote": "Koristi njihovo", "restore": "Vrati", "delete": "Ostavi obrisano", + "download_changes": "Ili preuzmi osmChange datoteku", "done": "Sve nedoumice su riješene!", "help": "Drugi korisnik je uredio neke elemente karte koje si i ti uredio/la.\nKlikni na svaki element ispod za dobivanje više detalja o konfliktu i odaberi treba li zadržati\ntvoje promjene ili promjene drugog korisnika.\n" } @@ -568,8 +661,19 @@ }, "success": { "just_edited": "Upravo si uredio/la OpenStreetMap!", + "thank_you": "Hvala ti za poboljšanje karte.", + "thank_you_location": "Hvala ti za poboljšanje karte u blizini {where}.", + "help_html": "Tvoje promjene bi se trebale pojaviti na OpenStreetMapu kroz par minuta. Druge karte će trebati više vremena za ažuriranje podataka.", "help_link_text": "Detalji", - "help_link_url": "https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F" + "help_link_url": "https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F", + "view_on_osm": "Pogledaj promjene na OSM", + "changeset_id": "Tvoje promjene #: {changeset_id}", + "like_osm": "Sviđa ti se OpenStreetMap? Poveži se sa ostalima:", + "more": "Više", + "events": "Događaji", + "languages": "Jezici: {languages}", + "missing": "Je li nešto nedostaje na ovom popisu?", + "tell_us": "Reci nam!" }, "confirm": { "okay": "U redu", @@ -578,7 +682,8 @@ "splash": { "welcome": "Dobrodošli na iD OpenStreetMap uređivač", "text": "iD je vrlo jednostavan ali moćan alat za doprinošenje najboljoj besplatnoj karti svijeta. Ovo je verzija {version}. Za više informacija pogledaj {website} i prijavi greške u softveru na {github}.", - "walkthrough": "Počni prohod" + "walkthrough": "Počni prohod", + "start": "Odmah uređuj" }, "source_switch": { "live": "uživo", @@ -606,6 +711,7 @@ "untagged_area_tooltip": "Odaberi element karte koji opisuje što ovo područje predstavlja.", "untagged_relation": "Neoznačena relacija", "untagged_relation_tooltip": "Odaberi element karte koji opisuje što ova relacija predstavlja.", + "many_deletions": "Brišeš {n} elemenata: {p} točaka, {l} linija, {a} područja, {r} relacija. Jesi li siguran/na da želiš to učiniti? Time ćeš obrisati elemente sa karte koju svi vide na openstreetmap.org.", "tag_suggests_area": "Oznaka {tag} ukazuje da bi linija trebala biti područje, ali nije područje", "deprecated_tags": "Zastarjele oznake: {tags}" }, @@ -615,13 +721,12 @@ }, "cannot_zoom": "Nije moguće više udaljiti u trenutnom môdu.", "full_screen": "Slika preko cijelog zaslona", - "gpx": { - "drag_drop": "Dovuci i ispusti .gpx, .geojson ili .kml datoteku na stranicu ili klikni gumb s desne strane za pretraživanje datoteka.", - "zoom": "Približi na sloj", - "browse": "Potraži datoteku" - }, - "mvt": { - "zoom": "Približi na sloj" + "streetside": { + "tooltip": "Ulične fotografije od Microsofta", + "title": "Foto preklop (Bing Streetside)", + "report": "Prijavi problem sa privatnosti na ovoj slici", + "view_on_bing": "Pogledaj na Bing Maps karti", + "hires": "Visoka rezolucija" }, "mapillary_images": { "tooltip": "Ulične fotografije s Mapillary servisa", @@ -634,6 +739,37 @@ "mapillary": { "view_on_mapillary": "Pogledaj ovu sliku na Mapillary" }, + "openstreetcam_images": { + "tooltip": "Ulične fotografije s OpenStreetCam servisa", + "title": "Foto preklop (OpenStreetCam)" + }, + "openstreetcam": { + "view_on_openstreetcam": "Pogledaj ovu sliku na OpenStreetCam" + }, + "note": { + "note": "Bilješka", + "title": "Uredi bilješku", + "anonymous": "anoniman", + "closed": "(Zatvoreno)", + "commentTitle": "Komentari", + "status": { + "opened": "otvoreno {when}", + "reopened": "ponovno otvoreno {when}", + "commented": "komentirano {when}", + "closed": "zatvoreno {when}" + }, + "newComment": "Novi komentar", + "inputPlaceholder": "Unesi komentar kako bi ga podijelio sa drugim korisnicima.", + "close": "Zatvori bilješku", + "open": "Ponovno otvori bilješku", + "comment": "Komentar", + "close_comment": "Zatvori i dodaj komentar", + "open_comment": "Ponovno otvori i komentiraj", + "report": "Prijavi", + "new": "Nova bilješka", + "newDescription": "Opiši problem.", + "save": "Spremi bilješku" + }, "help": { "title": "Pomoć", "key": "H", @@ -646,14 +782,104 @@ "overview": { "title": "Pregled", "navigation_h": "Navigacija", - "features_h": "Elementi karte" + "features_h": "Elementi karte", + "nodes_ways": "Na OpenStreetMapu, točke se ponekad nazivaju *čvorovi*, a linije i područja su ponekad navedeni kao *putevi*." }, "editing": { + "title": "Uređivanje i spremanje", + "select_h": "Odaberi", + "multiselect_h": "Višestruko odabiranje", + "undo_redo_h": "Poništi i ponovi", + "save_h": "Spremi", + "upload_h": "Spremi", + "backups_h": "Automatske sigurnosne kopije", "keyboard_h": "Tipkovne kratice", "keyboard": "Možeš vidjeti popis tipkovnih kratica kada pritisneš tipku `?`." }, + "feature_editor": { + "title": "Uređivač elemenata", + "type_h": "Vrsta elementa", + "fields_h": "Polja", + "tags_h": "Oznake" + }, + "points": { + "title": "Točke", + "add_point_h": "Dodavanje točaka", + "move_point_h": "Pomicanje točaka", + "delete_point_h": "Brisanje točaka" + }, + "lines": { + "title": "Linije", + "add_line_h": "Dodavanje linija", + "add_line_finish": "Za završavanje linije, pritisni `{return}` ili ponovno klikni na posljednju točku.", + "modify_line_h": "Uređivanje linija", + "connect_line_h": "Spajanje linija", + "disconnect_line_h": "Razdvajanje linija", + "move_line_h": "Pomicanje linija", + "delete_line_h": "Brisanje linija" + }, "areas": { - "title": "Područja" + "title": "Područja", + "intro": "*Područja* se koriste za prikaz granica elemenata poput jezera, zgrada i naseljenih područja. Područja se trebaju iscrtati oko ruba elementa kojeg prikazuju, npr. oko temelja zgrade.", + "point_or_area_h": "Točke ili područja?", + "add_area_h": "Dodavanje područja", + "square_area_h": "Stavi pod pravi kut ćoškove", + "modify_area_h": "Uređivanje područja", + "delete_area_h": "Brisanje područja" + }, + "relations": { + "title": "Relacije", + "edit_relation_h": "Uređivanje relacija", + "maintain_relation_h": "Održavanje relacija", + "relation_types_h": "Vrste relacija", + "multipolygon_h": "Multipoligoni", + "multipolygon_create": "Za stvaranje multipoligona, npr. zgrade sa \"rupom\", nacrtaj vanjski rub područja i unutarnju granicu kao liniju ili kao područje druge vrste, npr. travnjak. Zatim `{shift}`+{leftclick} lijevi-klik za odabiranje oba elementa, {rightclick} desni-klik za prikaz izbornika za uređivanje i odaberi {merge} **Spoji** naredbu. ", + "turn_restriction_h": "Zabrane skretanja", + "route_h": "Rute", + "boundary_h": "Granice" + }, + "notes": { + "title": "Bilješke", + "add_note_h": "Dodavanje bilješki", + "update_note_h": "Zatvaranje, ponovno otvaranje i komentiranje", + "save_note_h": "Spremanje bilješki" + }, + "imagery": { + "title": "Pozadinske snimke", + "sources_h": "Izvornici snimaka", + "offsets_h": "Podešavanje odstupanja snimaka" + }, + "streetlevel": { + "title": "Ulične fotografije", + "using_h": "Korištenje uličnih fotografija" + }, + "gps": { + "title": "GNSS tragovi", + "using_h": "Korištenje GNSS tragova" + }, + "field": { + "restrictions": { + "title": "Pomoć za zabrane skretanja", + "about": { + "title": "O zabranama" + }, + "inspecting": { + "title": "Uvid", + "from_shadow": "{fromShadow} **Segment POLAZIŠTE**", + "allow_shadow": "{allowShadow} **Dozvoljeno ODREDIŠTE**", + "restrict_shadow": "{restrictShadow} **Zabranjeno ODREDIŠTE**", + "only_shadow": "{onlyShadow} **Samo ODREDIŠTE**" + }, + "modifying": { + "title": "Uređivanje", + "allow_turn": "{allowTurn} **Dozvoljeno ODREDIŠTE**", + "restrict_turn": "{restrictTurn} **Zabranjeno ODREDIŠTE**", + "only_turn": "{onlyTurn} **Samo ODREDIŠTE**" + }, + "tips": { + "title": "Savjeti" + } + } } }, "intro": { @@ -789,7 +1015,7 @@ "welcome": "Dobrodošao/la! Ovaj prohod će te naučiti osnovama uređivanja OpenStreetMapa.", "practice": "Svi podaci u ovom prohodu su samo za vježbu i bilo kakve promjene koje napraviš neće se spremiti.", "words": "Ovaj prohod će ti predstaviti neke nove riječi i koncepte. Kad predstavimo novu riječ, koristit ćemo *kurziv*.", - "mouse": "Možeš koristiti bilo koji uređaj za unos kako bi uredio/la kartu, ali ovaj prohod pretpostavlja da koristiš miš sa lijevom i desnom tipkom. **Ako želiš spojiti miša, napravi to sada i onda klikni na U redu.**", + "mouse": "Možeš koristiti bilo koji uređaj za unos kako bi uredio/la kartu, ali ovaj prohod pretpostavlja da koristiš miš sa lijevom i desnom tipkom. **Ako želiš spojiti miša, napravi to sada i onda klikni na: U redu.**", "leftclick": "Kada te ovaj prohod zatraži da klikneš ili dvoklikneš, podrazumjeva se da je to s lijevom tipkom miša. Na trackpadu to može biti jedan klik ili klik jednim prstom. **Klikni lijevom tipkom miša {num} puta.**", "rightclick": "Nekad ćemo te zamoliti da klikneš desnu tipku na mišu. To može biti isto kao i Ctrl-klik ili klik s dva prsta na trackpadu. Tvoja tipkovnica možda ima i tipku 'menu' (obično desno od razmaknice) koja radi kao desni klik. **Klikni desnom tipkom miša {num} puta.**", "chapters": "Zasad nam ide odlično! Možeš koristiti gumbe ispod za preskakanje poglavlja u bilo kojem trenutku ili za ponavljanje poglavlja ispočetka ako zapneš. Počnimo! **Klikni '{next}' za nastavak.**" @@ -828,11 +1054,13 @@ "rightclick": "Desnom tipkom miša možeš kliknuti na element za dobivanje *izbornika za uređivanje* koji prikazuje listu operacija koje možeš odraditi. **Desnom tipkom miša odaberi točku koju si napravio/la za prikazivanje izbornika.**", "delete": "U redu je obrisati elemente koji ne postoje u stvarnom svijetu.{br}Brisanje elementa s OpenStreetMapa ga briše s karte koju svi koriste, zato je potrebno biti siguran da element više ne postoji prije nego ga obrišeš. **Klikni na gumb {button} za brisanje točke.", "undo": "Uvijek možeš poništiti svoje promjene dok god ne snimiš svoje uređivanje na OpenStreetMap. **Klikni na gumb {button} za poništavanje brisanja i vraćanje točke nazad.** ", - "play": "Sad kada znaš kako stvoriti i urediti točke, pokušaj stvoriti još neke točke za vježbu! **Kad si spreman/a nastaviti na sljedeće poglavlje, klikni '{next}'.**" + "play": "Sada kada znaš kako stvoriti i urediti točke, pokušaj stvoriti još neke točke za vježbu! **Kad si spreman/a nastaviti na sljedeće poglavlje, klikni '{next}'.**" }, "areas": { "title": "Područja", + "add_playground": "*Područja* se koriste za prikaz granica elemenata karte kao što su jezera, zgrade i naseljena područja.{br}Također se mogu koristiti za detaljnije kartiranje mnogih elemenata karte koje bi inače kartirali kao točke. **Klikni na gumb {button} Područje za dodavanje novog područja.**", "start_playground": "Idemo dodati ovo igralište na kartu crtajući područje. Područja se crtaju postavljanjem *čvorova* uzduž vanjske granice elementa. **Klikni ili pritisni razmaknicu za postavljanje početnog čvora na jedan od uglova igrališta.**", + "continue_playground": "Nastavi crtati područje postavljanjem ostalih čvorova uzduž ruba igrališta. U redu je povezati područje na postojeće pješačke staze.{br}Savjet: Možeš držati tipku '{alt}' na tipkovnici da spriječiš povezivanje čvora s drugim elementima karte. **Nastavi crtati područje igrališta.** ", "finish_playground": "Završi crtanje područja pritiskom tipke enter, ili tako da ponovno klikneš na početni ili posljednji čvor. **Završi crtanje područja igrališta.**", "search_playground": "**Nađi '{preset}' pomoću tražilice.**", "choose_playground": "**Odaberi {preset} sa liste.**", @@ -859,7 +1087,7 @@ "start_drag_endpoint": "Kada je linija odabrana, možeš povući bilo koji njezin čvor tako da klikneš na njega i držiš stisnutu lijevu tipku miša dok ga premještaš. **Povuci krajnju točku na ispravno mjesto gdje bi trebalo biti raskrižje ulica.**", "finish_drag_endpoint": "Ovo mjesto se čini u redu. **Otpusti lijevu tipku miša za završavanje pomaka.** ", "start_drag_midpoint": "Mali trokut je iscrtan na *srednjoj točki* između dva čvora. Drugi način za stvaranje novog čvora je povući tu srednju točku na novu lokaciju. **Povuci središnji trokut za stvaranje novog čvora duž zavoja ceste.**", - "continue_drag_midpoint": "Ova linija izgleda puno bolje! Nastavi prilagođavati ovu liniju dvoklikom ili povlačenjem središnjeg trokuta dok krivulja ne bude odgovarala obliku ceste. **Kada si zadovoljan/a s izgledom linije, klikni na U redu.**", + "continue_drag_midpoint": "Ova linija izgleda puno bolje! Nastavi prilagođavati ovu liniju dvoklikom ili povlačenjem središnjeg trokuta dok krivulja ne bude odgovarala obliku ceste. **Kada si zadovoljan/a s izgledom linije, klikni na: U redu.**", "delete_lines": "Linije koje ne postoje u stvarosti se mogu obrisati.{br}Ovdje imamo primjer s ulicom {street} koju je grad isplanirao, ali nije nikad izgradio. Možemo ispraviti ovaj dio karte brisanjem linija koje su višak.", "rightclick_intersection": "Posljednja prava ulica je '{street1}', stoga ćemo *razdvojiti* '{street2}' na ovom raskrižju i obrisati sve iznad nje. **Desnom tipkom klikni na čvornu točku raskrižja.**", "split_intersection": "**Klikni na gumb {button} za razvajanje {street}.**", @@ -897,6 +1125,8 @@ }, "startediting": { "title": "Započni uređivanje", + "help": "Sada si spreman/a za uređivanje OpenStreetMap karte!{br}Možeš bilo kada ponoviti ovaj prohod ili potražiti više dokumentacije klikom na gumb {button} Pomoć ili pritiskom tipke '{key}'.", + "shortcuts": "Možeš vidjeti popis naredbi s njihovim tipkovnim kraticama kada pritisneš tipku '{key}'.", "save": "Ne zaboravi redovno spremiti tvoje promjene!", "start": "Počni kartirati!" } @@ -904,6 +1134,9 @@ "shortcuts": { "title": "Tipkovne kratice", "tooltip": "Prikaži tipkovne kratice.", + "toggle": { + "key": "?" + }, "key": { "alt": "Alt", "backspace": "Backspace", @@ -954,7 +1187,8 @@ "title": "Označavanje elemenata", "select_one": "Označavanje pojedinog elementa", "select_multi": "Odabir više elemenata", - "lasso": "Crtanje obruba za odabir elemenata" + "lasso": "Crtanje obruba za odabir elemenata", + "search": "Pronađi elemente koji odgovaraju tekstu" }, "with_selected": { "title": "Sa odabranim elementom", @@ -976,6 +1210,8 @@ "add_point": "Dodaj točku", "add_line": "Dodaj liniju", "add_area": "Dodaj područje", + "add_note": "Dodaj bilješku", + "place_point": "Postavi točku ili bilješku", "disable_snap": "Drži za deaktiviranje hvatanja na elemente", "stop_line": "Završi crtanje linije ili područja" }, @@ -984,6 +1220,7 @@ "continue_line": "Nastavi liniju na odabranoj točki", "merge": "Kombiniraj (spoji) odabrane elemente", "disconnect": "Razdvoji elemente na odabranoj točki", + "detach_node": "Odvoji odabrani čvor s roditeljskih linija/područja", "split": "Razdijeli liniju na dvije u odabranoj točki", "reverse": "Obrni smjer linije", "move": "Premjesti odabrane elemente", @@ -1002,13 +1239,40 @@ "redo": "Ponovi posljednju radnju", "save": "Spremi promjene" } + }, + "tools": { + "title": "Alati", + "info": { + "title": "Informacije", + "all": "Aktiviranje svih informacijskih okvira", + "background": "Aktiviranje okvira pozadina", + "history": "Aktiviranje okvira povijesti", + "location": "Aktiviranje okvira lokacije", + "measurement": "Aktiviranje okvira za mjerenje" + } } }, "units": { + "feet": "{quantity} ft", + "miles": "{quantity} mi", + "square_feet": "{quantity} ft²", + "square_miles": "{quantity} mi²", + "acres": "{quantity} ac", + "meters": "{quantity} m", + "kilometers": "{quantity} km", + "square_meters": "{quantity} m²", + "square_kilometers": "{quantity} km²", + "hectares": "{quantity} ha", + "area_pair": "{area1} ({area2})", + "arcdegrees": "{quantity}°", + "arcminutes": "{quantity}′", + "arcseconds": "{quantity}″", "north": "S", "south": "J", "east": "I", - "west": "Z" + "west": "Z", + "coordinate": "{coordinate}{direction}", + "coordinate_pair": "{latitude}, {longitude}" }, "presets": { "categories": { @@ -1060,31 +1324,24 @@ "label": "Dozvoljen pristup", "options": { "designated": { - "description": "Pristup dozvoljen prema znakovima ili prema lokalnom zakonu", "title": "Označeno" }, "destination": { - "description": "Pristup dozvoljen samo za pristup destinaciji", "title": "Destinacija" }, "dismount": { - "description": "Pristup dozvoljen ali vozač mora sići", "title": "Bez vožnje" }, "no": { - "description": "Pristup nije dozvoljen javnosti", "title": "Zabranjeno" }, "permissive": { - "description": "Pristup dozvoljen dok vlasnik ne zabrani", "title": "Dopustivo" }, "private": { - "description": "Pristup dozvoljen samo s dozvolom vlasnika na pojedinačnoj bazi", "title": "Privatno" }, "yes": { - "description": "Regulirano zakonom, pravilo desne strane", "title": "Dozvoljeno" } }, @@ -1152,7 +1409,7 @@ "placeholder": "2, 4, 8..." }, "aerialway/summer/access": { - "label": "Pristup (ljeto)", + "label": "Pristup (ljeti)", "options": { "both": "Oba", "entry": "Ulaz", @@ -1363,6 +1620,9 @@ "handrail": { "label": "Rukohvat" }, + "height": { + "label": "Visina (u metrima)" + }, "highway": { "label": "Vrsta" }, @@ -1458,10 +1718,10 @@ "label": "Duljina (u metrima)" }, "level": { - "label": "Razina" + "label": "Kat" }, "levels": { - "label": "Razina", + "label": "Broj katova", "placeholder": "2, 4, 6..." }, "lit": { @@ -1473,6 +1733,9 @@ "man_made": { "label": "Vrsta" }, + "maxheight": { + "label": "Max visina" + }, "maxspeed": { "label": "Ograničenje brzine", "placeholder": "40, 50, 60..." @@ -1536,7 +1799,7 @@ "label": "Jednosmjerna", "options": { "no": "Ne", - "undefined": "Pretpostavlja se da je Ne", + "undefined": "Pretpostavka je da nije jednosmjerna", "yes": "Da" } }, @@ -1544,7 +1807,7 @@ "label": "Jednosmjerno", "options": { "no": "Ne", - "undefined": "Pretpostavlja se da je Da", + "undefined": "Pretpostavka je da je jednosmjerna", "yes": "Da" } }, @@ -1573,6 +1836,9 @@ "underground": "Podzemni" } }, + "payment_multi": { + "label": "Načini plaćanja" + }, "phone": { "placeholder": "+385 01 123 4567" }, @@ -1715,6 +1981,9 @@ }, "placeholder": "Mali kotačići, kotači, off-road" }, + "source": { + "label": "Izvornici" + }, "structure": { "label": "Konstrukcija", "options": { @@ -1759,6 +2028,9 @@ "tourism": { "label": "Vrsta" }, + "tourism_attraction": { + "label": "Turizam" + }, "tracktype": { "label": "Vrsta poljskog ili šumskog puta", "options": { @@ -1788,6 +2060,11 @@ "trees": { "label": "Drveće" }, + "usage_rail": { + "options": { + "tourism": "Turizam" + } + }, "water": { "label": "Vrsta" }, @@ -1913,9 +2190,6 @@ "amenity/bicycle_repair_station": { "name": "Stalak sa alatima za bicikle" }, - "amenity/biergarten": { - "name": "Pivnica na otvorenom" - }, "amenity/boat_rental": { "name": "Najam brodova", "terms": "rentanje brodova,rentanje broda,iznajmljivanje brodova,iznajmljivanje broda,najam brodova,najam broda,rentanje čamaca,rentanje čamca,iznajmljivanje čamaca,iznajmljivanje čamca,najam čamaca,najam čamca,rent a boat" @@ -2219,6 +2493,9 @@ "barrier/cycle_barrier": { "name": "Biciklistička prepreka" }, + "barrier/ditch": { + "name": "Rov" + }, "barrier/entrance": { "name": "Ulaz" }, @@ -2232,6 +2509,9 @@ "barrier/hedge": { "name": "Živica" }, + "barrier/kerb": { + "name": "Rubnjak" + }, "barrier/kissing_gate": { "name": "Rotirajući prolaz za ljude" }, @@ -2596,6 +2876,9 @@ "highway/path": { "name": "Staza" }, + "highway/pedestrian_line": { + "name": "Pješačka ulica" + }, "highway/primary": { "name": "Državna cesta" }, @@ -2758,6 +3041,9 @@ "landuse/quarry": { "name": "Kamenolom" }, + "landuse/religious": { + "name": "Religiozno područje" + }, "landuse/residential": { "name": "Stambena zona" }, @@ -3667,7 +3953,7 @@ "name": "Zabranjeno desno skretanje" }, "type/restriction/no_straight_on": { - "name": "Zabranjeno produživanje ravno" + "name": "Zabranjeno prolaženje ravno" }, "type/restriction/no_u_turn": { "name": "Zabranjeno polukružno okretanje" @@ -3801,8 +4087,8 @@ "attribution": { "text": "Uvjeti i povratne informacije" }, - "description": "Esri svijet snimke", - "name": "Esri svijet snimke" + "description": "Esri snimke svijeta.", + "name": "Esri World snimke" }, "EsriWorldImageryClarity": { "attribution": { diff --git a/dist/locales/hu.json b/dist/locales/hu.json index ff9384ecc..7309c933e 100644 --- a/dist/locales/hu.json +++ b/dist/locales/hu.json @@ -21,6 +21,9 @@ "description": "Éttermek, emlékművek, postaládák és egyéb pontok hozzáadása a térképhez.", "tail": "Pont hozzáadásához kattints a térképre." }, + "add_note": { + "tail": "Kattints a térképre egy jegyzet hozzáadásához." + }, "browse": { "title": "Böngészés", "description": "Térkép mozgatása és zoomolás." @@ -346,6 +349,8 @@ "localized_translation_name": "Név" }, "zoom_in_edit": "Nagyíts a szerkesztéshez", + "login": "Bejelentkezés", + "logout": "Kijelentkezés", "loading_auth": "Csatlakozás az OpenStreetMap kiszolgálóhoz…", "report_a_bug": "Hibajelentés", "help_translate": "Segíts a fordításban", @@ -501,7 +506,6 @@ "best_imagery": "Legjobb ismert légifeltétel ehhez a helyszínhez", "switch": "Visszaváltás erre a háttérre", "custom": "Egyéni", - "custom_button": "Egyedi háttér szerkesztése", "overlays": "Előterek", "imagery_source_faq": "Információ a légiképről / Probléma jelentése", "reset": "visszavonás", @@ -693,10 +697,9 @@ }, "cannot_zoom": "Nem lehet jobban távolítani ebben a módban.", "full_screen": "Váltás teljes képernyőre", - "gpx": { - "drag_drop": "Húzzon és ejtsen egy .gpx, .geojson vagy .kml fájlt az oldalra, vagy kattintson a jobb oldalon lévő gombra a tallózáshoz", - "zoom": "Nagyítás a rétegre", - "browse": "Tallózzon egy fájlt" + "streetside": { + "view_on_bing": "Megtekintés a Bing Maps-en", + "hires": "Nagy felbontású" }, "mapillary_images": { "tooltip": "Utcafotók a Mapillary-ből", @@ -716,6 +719,11 @@ "openstreetcam": { "view_on_openstreetcam": "A kép megtekintése az OpenStreetCam weboldalon" }, + "note": { + "note": "Megjegyzés", + "title": "Jegyzet szerkesztése", + "commentTitle": "Megjegyzések" + }, "help": { "title": "Súgó", "key": "H", @@ -802,6 +810,9 @@ }, "modifying": { "title": "Módosítás" + }, + "tips": { + "title": "Tippek" } } } @@ -1244,31 +1255,24 @@ "label": "Behajtás engedélyezett", "options": { "designated": { - "description": "A behajtást tábla vagy helyi jogszabály engedi", "title": "Kijelölt" }, "destination": { - "description": "A behajtás csak a célpont eléréséhez engedélyezett", "title": "Csak célforgalom" }, "dismount": { - "description": "A behajtás engedélyezett, de a vezetőnek le kell szállni", "title": "Leszállás" }, "no": { - "description": "A behajtás általánosságban nem engedélyezett", "title": "Tilos" }, "permissive": { - "description": "A behajtás engedélyezett, amíg a tulajdonos vissza nem vonja az engedélyt", "title": "Megengedett" }, "private": { - "description": "Behajtás csak a tulajdonos engedélyével vagy egyedi elbírálás alapján", "title": "Magántulajdon" }, "yes": { - "description": "A behajtás jogilag engedélyezett; áthaladási jog", "title": "Engedélyezett" } }, @@ -1699,6 +1703,9 @@ "except": { "label": "Kivételek" }, + "faces": { + "label": "Oldalak száma" + }, "fax": { "label": "Fax", "placeholder": "+36 1 123 45 67" @@ -2130,6 +2137,7 @@ "placeholder": "1, 2, 3..." }, "phone": { + "label": "Telefon", "placeholder": "+36 1 123 45 67" }, "piste/difficulty": { @@ -2339,6 +2347,17 @@ "shop": { "label": "Típus" }, + "siren/purpose": { + "label": "Cél" + }, + "siren/type": { + "label": "Típus", + "options": { + "electronic": "Elektromos", + "other": "Egyéb", + "pneumatic": "Pneumatikus" + } + }, "site": { "label": "Típus" }, @@ -2805,10 +2824,6 @@ "name": "Önálló kerékpárszerelő pont", "terms": "kerékpárszerelés, biciklijavítás, bringajavító" }, - "amenity/biergarten": { - "name": "Sörkert", - "terms": "söröző, kerthelyisé" - }, "amenity/boat_rental": { "name": "Hajókölcsönző", "terms": "csónakkölcsönző" @@ -2919,6 +2934,9 @@ "name": "Gyorsétterem", "terms": "pizza, gyros, gyorskajálda, lángos , büfé, hamburger, hot dog" }, + "amenity/ferry_terminal": { + "name": "Kompállomás / Terminál" + }, "amenity/fire_station": { "name": "Tűzoltóság", "terms": "Tűzoltóállomás, tűzoltólaktanya" @@ -3110,6 +3128,10 @@ "name": "Zuhany", "terms": "zuhanyzó,tusoló,fürdő" }, + "amenity/smoking_area": { + "name": "Dohányzó terület", + "terms": "dohányzásra kijelölt hely" + }, "amenity/social_facility": { "name": "Szociális létesítmény", "terms": "Szociális intézmény" @@ -3758,14 +3780,23 @@ "emergency/destination": { "name": "Kivéve célforgalom, vészhelyzetben" }, + "emergency/fire_extinguisher": { + "name": "Tűzoltókészülék" + }, "emergency/fire_hydrant": { "name": "Tűzcsap", "terms": "Tűzcsap, vészhelyzet, tűzoltók, spricni, fecskendő, tömlő" }, + "emergency/first_aid_kit": { + "name": "Elsősegélykészlet" + }, "emergency/life_ring": { "name": "Mentőöv", "terms": "öv,gyűrű,mentés,életmentés" }, + "emergency/lifeguard": { + "name": "Strandőr" + }, "emergency/no": { "name": "Vészhelyzeti használatra tilos" }, @@ -3779,6 +3810,9 @@ "emergency/private": { "name": "Vészhelyzeti használat: magántulajdon" }, + "emergency/siren": { + "name": "Sziréna" + }, "emergency/water_tank": { "name": "Vészhelyzeti víztartály" }, @@ -4347,6 +4381,9 @@ "name": "Táncterem", "terms": "táncterem" }, + "leisure/dancing_school": { + "name": "Tánciskola" + }, "leisure/dog_park": { "name": "Kutyafuttató", "terms": "Kutyasétáltató" @@ -4520,8 +4557,8 @@ "terms": "versenypálya," }, "leisure/water_park": { - "name": "Aquapark", - "terms": "aquapark,vízi szórakoztatópark" + "name": "Élményfürdő", + "terms": "strand,akvapark,aquapark,vízi szórakoztatópark" }, "line": { "name": "Vonal", @@ -4535,6 +4572,9 @@ "name": "Bányatárna (vízszintes)", "terms": "bánya, akna, táró" }, + "man_made/antenna": { + "name": "Antenna" + }, "man_made/breakwater": { "name": "Hullámtörő", "terms": "Hullámtörő" @@ -4585,6 +4625,9 @@ "name": "Kilátótorony", "terms": "kilátó, megfigyelőtorony" }, + "man_made/observatory": { + "name": "Obszervatórium" + }, "man_made/petroleum_well": { "name": "Olajkút", "terms": "olajkút" @@ -4709,6 +4752,9 @@ "name": "Fenyér", "terms": "pusztaság, rét, hangafű, törpecserjés" }, + "natural/mud": { + "name": "Sár" + }, "natural/peak": { "name": "Hegycsúcs", "terms": "Hegycsúcs, hegytető, csúcs" @@ -5220,6 +5266,9 @@ "name": "Üzlet", "terms": "bolt, kereskedés, kiskereskedés" }, + "shop/agrarian": { + "name": "Gazdabolt" + }, "shop/alcohol": { "name": "Alkoholüzlet", "terms": "unikum,pálinka,baileys,konyak,tokaji,vodka,wiszki,whiskey,kosher szilvapálinka,zwack" @@ -5837,7 +5886,7 @@ "terms": "rázó felfestés" }, "traffic_calming/table": { - "name": "KRESZ tábla", + "name": "Megemelt szintű gyalogátjáró", "terms": "sebesség, tábla, lassító" }, "type/boundary": { diff --git a/dist/locales/hy.json b/dist/locales/hy.json index 48759d332..7dbc97e8f 100644 --- a/dist/locales/hy.json +++ b/dist/locales/hy.json @@ -283,7 +283,6 @@ "description": "Ետնանկարի կարգաւորումներ", "none": "Ոչ մի", "custom": "Յատուկ", - "custom_button": "Խմբագրել յատուկ ետնանկարը", "reset": "վերամեկնարկել", "minimap": { "tooltip": "Ցուցադրել փոքրացուած քարտէզը՝ որպէզսի աւելի հեշտ լինի գտնել ներկայումս պատկերուած տեղանքը։" @@ -491,31 +490,24 @@ "label": "Անցումն թոյլատրուած է։", "options": { "designated": { - "description": "Անցումն թոյլ է տրուած ըստ նշանների կամ յատուկ տեղական օրէնքների", "title": "Նշանակուած" }, "destination": { - "description": "Անցումն թոյլ է տրուած միմիայն նշանակէտին հասնելու համար", "title": "Նշանակման վայր" }, "dismount": { - "description": "Անցումն թոյլ է տրուած, սակայն հեծեալը պէտք է իջնի", "title": "Հեծեալի իջնելը" }, "no": { - "description": "Անցումն արգելուած է կողմնակի անձանց համար", "title": "Արգելուած է" }, "permissive": { - "description": "Անցումն թոյլ է տրուած մինչեւ տէրն այն ուժը կորցրած չճանաչի", "title": "Թոյլատրելի" }, "private": { - "description": "Անցումն թոյլ է տրուած միայն ըստ տիրոջ թոյլ տւութեան անհատական հիմքի վրայ", "title": "Մասնաւոր" }, "yes": { - "description": "Անցումն թոյլ է տրուած օրէնքով", "title": "Թոյլատրուած է" } }, diff --git a/dist/locales/id.json b/dist/locales/id.json index dcfb62955..cdbd8f482 100644 --- a/dist/locales/id.json +++ b/dist/locales/id.json @@ -299,7 +299,6 @@ "best_imagery": "Sumber citra terbaik yang diketahui untuk lokasi ini", "switch": "Beralih ke latar belakang ini", "custom": "Custom", - "custom_button": "Ubah tampilan latar kustom", "reset": "ulang", "minimap": { "tooltip": "Menampilkan peta diperkecil untuk membantu penentuan letak area yang sedang dilihat." @@ -487,27 +486,21 @@ "label": "Akses diperbolehkan", "options": { "designated": { - "description": "Akses diperbolehkan sesuai dengan tanda atau peraturan lokal yang spesifik", "title": "Ditunjuk" }, "destination": { - "description": "Akses diperbolehkan hanya untuk mencapai tujuan", "title": "Tujuan" }, "no": { - "description": "Akses terbatas untuk umum", "title": "Terlarang" }, "permissive": { - "description": "Akses diperbolehkan sampai batas pemilik membatalkan izin", "title": "Dibolehkan" }, "private": { - "description": "Akses diperbolehkan hanya dengan perizinan dari pemilik pada tingkatan pribadi", "title": "Pribadi" }, "yes": { - "description": "Akses diperbolehkan oleh hukum; hak pengguna jalan", "title": "Diizinkan" } }, @@ -1108,9 +1101,6 @@ "name": "Penyewaan Sepeda", "terms": "Penyewaan Sepeda" }, - "amenity/biergarten": { - "name": "Taman Bir" - }, "amenity/boat_rental": { "name": "Penyewaan Perahu Boat" }, diff --git a/dist/locales/is.json b/dist/locales/is.json index a3323155e..ca0208141 100644 --- a/dist/locales/is.json +++ b/dist/locales/is.json @@ -523,8 +523,6 @@ "best_imagery": "Best þekkti brunnur myndefnis fyrir þessa staðsetningu", "switch": "Skipta aftur í þennan bakgrunn", "custom": "Sérsniðið", - "custom_button": "Breyta sérsniðnum bakgrunni", - "custom_prompt": "Settu inn sniðmát slóðar á kortatígul. Gild viðföng eru:\n - {zoom} eða {z}, {x}, {y} fyrir Z/X/Y tíglaskema\n - {-y} eða {ty} fyrir flett TMS-stíls Y-hnit\n - {u} fyrir fjórtígla skema (quadtile)\n - {switch:a,b,c} fyrir fléttugreiningu á DNS-þjóni (multiplexing)\n\nDæmi:\n{example}", "overlays": "Þekjur", "imagery_source_faq": "Upplýsingar myndefnis / Tilkynna vandamál", "reset": "endurstilla", @@ -727,18 +725,6 @@ }, "cannot_zoom": "Get ekki rennt lengra frá í núverandi ham.", "full_screen": "Víxla skjáfylli af/á", - "gpx": { - "local_layer": "Bæta við GPX", - "drag_drop": "Dragðu og slepptu .gpx, .geojson eða .kml-skrá á síðuna, eða smelltu á hnappinn til hægri til að leita að skrá", - "zoom": "Renna að lagi", - "browse": "Finna skrá" - }, - "mvt": { - "local_layer": "Bæta við MVT", - "drag_drop": "Dragðu og slepptu .mvt eða pbf skrá á síðuna eða smelltu á takkann til hægri til að fletta", - "zoom": "Renna að lagi", - "browse": "Finna skrá" - }, "streetside": { "tooltip": "Ljósmyndir í götuhæð frá Microsoft", "title": "Ljósmyndaþekja (Bing Streetside)", @@ -1441,31 +1427,24 @@ "label": "Leyfður aðgangur", "options": { "designated": { - "description": "Aðgangur heimill samkvæmt skiltum eða sértækum staðbundnum reglum", "title": "Ætlað fyrir" }, "destination": { - "description": "Aðgangur leyfður aðeins ef í fararleið", "title": "Áfangastaður" }, "dismount": { - "description": "Aðgangur leyfður en það þarf að fara af baki", "title": "Af baki" }, "no": { - "description": "Aðgangur óheimill almenningi", "title": "Aðgangur bannaður" }, "permissive": { - "description": "Aðgangur heimill þar til eigandi dregur leyfi til baka", "title": "Með leyfi" }, "private": { - "description": "Aðgangur heimill eingöngu með samþykki landeiganda", "title": "Einka" }, "yes": { - "description": "Aðgangur leyfður með lögum; leiðarréttur", "title": "Leyft" } }, @@ -2991,9 +2970,6 @@ "amenity/bicycle_repair_station": { "name": "Hjólaviðgerðastandur" }, - "amenity/biergarten": { - "name": "Bjórgarður" - }, "amenity/boat_rental": { "name": "Bátaleiga" }, @@ -5968,9 +5944,7 @@ "osmse-ekonomiska": { "attribution": { "text": "© Lantmäteriet" - }, - "description": "Skönnun á ´Hagfræðikortum´ u.þ.b. 1950-1980", - "name": "Lantmäteriet hagfræðikort (söguleg)" + } }, "qa_no_address": { "attribution": { diff --git a/dist/locales/it.json b/dist/locales/it.json index a53f0a321..cd80b4163 100644 --- a/dist/locales/it.json +++ b/dist/locales/it.json @@ -430,7 +430,12 @@ "edited_by": "Modificato da", "changeset": "Gruppo di modifiche", "unknown": "Sconosciuto", - "link_text": "Cronologia su openstreetmap.org" + "link_text": "Cronologia su openstreetmap.org", + "note_no_history": "Nessuna cronologia (nota nuova)", + "note_comments": "Commenti", + "note_created_date": "Data di creazione", + "note_created_user": "Creata da", + "note_link_text": "Nota su openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "vertice", "line": "linea", "area": "area", - "relation": "relazione" + "relation": "relazione", + "note": "nota" }, "geocoder": { "search": "Cerca in tutto il mondo...", @@ -523,8 +529,6 @@ "best_imagery": "Migliore sorgente di immagini per questo luogo", "switch": "Ritorna a questo sfondo", "custom": "Personalizzato", - "custom_button": "Modifica sfondo personalizzato", - "custom_prompt": "Inserisci un modello di URL per i tasselli. Sono validi i valori:\n- {zoom} oppure {z}, {x}, {y} per il modello dei tasselli Z/X/Y\n- {-y} oppure {ty} per le coordinate Y in stile TMS rovesciato\n- {u} per il modello QuadTile\n- {switch:a,b,c} per il multiplexing del server DNS\n\nEsempio:\n{example}", "overlays": "Livelli sovrapposti", "imagery_source_faq": "Informazioni sulle immagini satellitari / Segnala un problema", "reset": "reset", @@ -626,6 +630,16 @@ "tooltip": "Le aree vengono completamente riempite." } }, + "settings": { + "custom_background": { + "tooltip": "Modifica sfondo personalizzato", + "header": "Impostazioni sfondo personalizzato", + "instructions": "Inserire un modello di URL. I token validi sono:\n{zoom} oppure {z}, {x}, {y} per lo schema dei tasselli Z/X/Y\n{-y} oppure {ty} per le coordinate Y stile TMS rovesciato\n{u} per lo schema quadtile\n{switch:a,b,c} per il bilanciamento del carico via DNS\n\nEsempio:\n{example}", + "template": { + "placeholder": "Inserisci un modello di URL " + } + } + }, "restore": { "heading": "Hai modifiche non salvate", "description": "Hai modifiche non salvate da una sessione precedente. Vuoi ripristinare questi cambiamenti?", @@ -727,18 +741,6 @@ }, "cannot_zoom": "Impossibile rimpicciolire ulteriormente nella modalità attuale.", "full_screen": "Passa a schermo intero", - "gpx": { - "local_layer": "Aggiungi GPX", - "drag_drop": "Trascina e rilascia un file .gpx, .geojson o .kml sulla pagina o clicca il pulsante a destra per sceglierne uno", - "zoom": "Zoom sul livello", - "browse": "Scegli un file" - }, - "mvt": { - "local_layer": "Aggiungi MVT", - "drag_drop": "Trascina e rilascia un file .mvt o .pbf sulla pagina oppure clicca il pulsante a destra per sceglierne uno", - "zoom": "Ingrandisci sul livello", - "browse": "Scegli un file" - }, "streetside": { "tooltip": "Foto Streetside da Microsoft", "title": "Foto sovrimpresse (Bing Streetside)", @@ -770,6 +772,12 @@ "anonymous": "anonimo", "closed": "(Chiusa)", "commentTitle": "Commenti", + "status": { + "opened": "aperta il {when}", + "reopened": "riaperta il {when}", + "commented": "commentata il {when}", + "closed": "chiusa il {when}" + }, "newComment": "Nuovo commento", "inputPlaceholder": "Inserire un commento da condividere con gli altri utenti.", "close": "Chiudi nota", @@ -1441,32 +1449,36 @@ "label": "Accesso consentito", "options": { "designated": { - "description": "Accesso consentito stando ai cartelli stradali od alle norme locali", + "description": "Accesso consentito secondo i cartelli stradali o specifiche norme locali", "title": "Preferenziale" }, "destination": { - "description": "Accesso consentito solo se la destinazione coincide con l'elemento stesso", + "description": "Accesso consentito solo per raggiungere una destinazione", "title": "Destinazione" }, "dismount": { - "description": "Accesso consentito, ma si deve scendere dal veicolo", + "description": "Accesso consentito ma si deve scendere dal veicolo", "title": "Scendere dal veicolo" }, "no": { - "description": "Accesso consentito ai soli autorizzati", + "description": "Accesso non consentito al pubblico", "title": "Vietato" }, "permissive": { "description": "Accesso consentito fino a quando il proprietario lo consente", "title": "Permissivo" }, + "permit": { + "description": "Accesso consentito solo ai possessori di un’autorizzazione o una licenza", + "title": "Autorizzazione" + }, "private": { "description": "Accesso consentito solo con il permesso individuale del proprietario", "title": "Privato" }, "yes": { "description": "Accesso consentito a norma di legge; diritto di passaggio", - "title": "Permesso" + "title": "Consentito" } }, "placeholder": "Non specificato", @@ -3051,10 +3063,6 @@ "name": "Stazione di riparazione biciclette", "terms": "riparazione,bibiclette,meccanico,bici,cicli" }, - "amenity/biergarten": { - "name": "Birreria all'aperto", - "terms": "birreria,distesa" - }, "amenity/boat_rental": { "name": "Noleggio barche", "terms": "noleggio barche,noleggio,barche,porto,negozio" @@ -4910,6 +4918,10 @@ "name": "Ponte", "terms": "ponte,viadotto,pontile,arco,strallato,cavalcavia" }, + "man_made/bunker_silo": { + "name": "Bunker silo", + "terms": "insilato,silaggio,stoccaggio,immagazzinamento,magazzino" + }, "man_made/chimney": { "name": "Ciminiera", "terms": "torre,camino" @@ -6730,6 +6742,27 @@ }, "name": "Hike & Bike" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi piste per motoslitte da OSM (copre l’area scandinava)", + "name": "Motoslitte della Scandinavia (sovrapposta)" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaico di ortofoto svedesi del periodo 1955–1965. Potrebbe contenere foto più antiche o più recenti.", + "name": "Ortofoto storiche di Lantmäteriet, 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaico di ortofoto svedesi del periodo 1970–1980. Non ancora concluso.", + "name": "Ortofoto storiche di Lantmäteriet, 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Termini & Feedback" @@ -6766,8 +6799,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Scansione di ‘Mappe economiche’ ca 1950-1980", - "name": "Mappa economica Lantmäteriet (antica)" + "description": "Digitalizzazione di “Economic maps” ca. 1950–1980", + "name": "Cartina economica Lantmäteriet 1950–1980" }, "qa_no_address": { "attribution": { @@ -6781,6 +6814,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Piste per motoslitte", + "name": "Mappa svedese per motoslitte" + }, "stamen-terrain-background": { "attribution": { "text": "Tasselli della mappa di Stamen Design con licenza CC-BY 3.0. Dati di OpenStreetMap com licenza ODbL" @@ -6843,6 +6883,14 @@ } }, "community": { + "bw-facebook": { + "name": "Mappando il Botswana su Facebook", + "description": "Pagina di OpenStreetMap nel Botswana" + }, + "bw-twitter": { + "name": "Mappando il Botswana su Twitter", + "description": "Twitter di OpenStreetMap nel Botswana" + }, "cape-coast-youthmappers": { "name": "Giovani mappatori dell’università di Cape Coast", "description": "Seguici su Twitter: {url}", @@ -7207,6 +7255,18 @@ "name": "Meetup di OpenStreetMap in Ungheria", "description": "La piattaforma per organizzare incontri in Ungheria" }, + "is-facebook": { + "name": "OSM dell’Islanda su Facebook", + "description": "Pagina di OpenStreetMap in Islanda" + }, + "is-mailinglist": { + "name": "Mailinglist talk-is", + "description": "Talk-is è la mailinglist ufficiale della comunità OSM islandese" + }, + "is-twitter": { + "name": "OSM Islanda su Twitter", + "description": "Twitter di OpenStreetMap in Islanda" + }, "it-facebook": { "name": "Facebook di OpenStreetMap dell’Italia", "description": "Unisciti alla comunità italiana di OpenStreetMap su Facebook" @@ -7624,6 +7684,29 @@ "name": "OpenStreetMap del Perù", "description": "Novità e risorse per la comunità di OpenStreetMap del Perù" }, + "LATAM-Facebook": { + "name": "Facebook di OpenStreetMap dell’America Latina", + "description": "OpenStreetMap dell’America Latina su Facebook" + }, + "LATAM-Telegram": { + "name": "Telegram di OpenStreetMap dell’America Latina", + "description": "Telegram di OpenStreetMap per l’America Latina" + }, + "LATAM-Twitter": { + "name": "Twitter di OpenStreetMap dell’America Latina", + "description": "Seguici su Twitter all’indirizzo {url}" + }, + "osm-latam": { + "name": "OpenStreetMap dell’America Latina", + "description": "Sosteniamo OpenStreetMap in America Latina", + "events": { + "sotm-latam-2018": { + "name": "State of the Map America Latina 2018", + "description": "State of the Map America Latina è la conferenza annuale per tutti i mappatori e gli utenti di OpenStreetMap in America Latina. Il programma include discussioni, gruppi, lezioni e mapathon riguardanti OpenStreetMap.", + "where": "Buenos Aires, Argentina" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap su Facebook", "description": "Metti “Mi piace” su Facebook per notizie e aggiornamenti su OpenStreetMap" diff --git a/dist/locales/ja.json b/dist/locales/ja.json index 9aeb817da..39cca50f9 100644 --- a/dist/locales/ja.json +++ b/dist/locales/ja.json @@ -175,7 +175,7 @@ "key": "C", "annotation": "{n} 個の地物をマージ", "not_eligible": "地物情報がマージできません", - "not_adjacent": "短点が接続されていないため、地物をマージできません。", + "not_adjacent": "端点が接続されていないため、地物をマージできません。", "restriction": "\"{relation}\" リレーションを壊してしまうため、これらの地物はマージできません。", "relation": "リレーションのロールが競合しているため、地物をマージできません", "incomplete_relation": "地物全体がダウンロードされていないため、マージさせることができません。", @@ -430,7 +430,12 @@ "edited_by": "編集者", "changeset": "変更セット", "unknown": "不明", - "link_text": "openstreetmap.org上の履歴" + "link_text": "openstreetmap.org上の履歴", + "note_no_history": "履歴なし(新しいメモ)", + "note_comments": "コメント", + "note_created_date": "作成日", + "note_created_user": "作成者", + "note_link_text": "openstreetmap.orgのメモ" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "交点", "line": "ライン", "area": "エリア", - "relation": "リレーション" + "relation": "リレーション", + "note": "メモ" }, "geocoder": { "search": "世界中のデータから検索", @@ -523,8 +529,6 @@ "best_imagery": "表示中の場所に最適な航空写真", "switch": "背景に切り替え", "custom": "カスタム", - "custom_button": "カスタム背景の設定", - "custom_prompt": "URLテンプレートを入力。正しい形式:\n - {zoom} または {z}, {x}, {y} (Z/X/Y タイルスキーム)\n - {-y} または {ty} (flipped TMS-style Y coordinates)\n - {u} (quadtileスキーム)\n - {switch:a,b,c} (DNS server multiplexing)\n\nサンプル:\n{example}", "overlays": "オーバーレイの選択", "imagery_source_faq": "画像の情報 / 問題を報告", "reset": "設定リセット", @@ -554,6 +558,11 @@ "notes": { "tooltip": "OpenStreetMapのメモデータ", "title": "OpenStreetMapのメモ" + }, + "custom": { + "tooltip": "ページ上にデータファイルをドラッグ&ドロップするか、画面右側のボタンをクリックして設定してください", + "title": "カスタム地図データ", + "zoom": "データにズーム" } }, "fill_area": "エリアの塗りつぶし有無", @@ -626,6 +635,29 @@ "tooltip": "エリアがすべて塗りつぶされます。" } }, + "settings": { + "custom_background": { + "tooltip": "カスタム背景の設定", + "header": "カスタム背景画像設定", + "instructions": "タイルのURLテンプレートを入力。正しい形式:\n - {zoom} または {z}, {x}, {y} (Z/X/Y タイルスキーム)\n - {-y} または {ty} (flipped TMS-style Y coordinates)\n - {u} (quadtileスキーム)\n - {switch:a,b,c} (DNS server multiplexing)\n\nサンプル:\n{example}", + "template": { + "placeholder": "URLテンプレートを入力" + } + }, + "custom_data": { + "tooltip": "カスタムデータレイヤの編集", + "header": "カスタム地図データ設定", + "file": { + "instructions": "ローカルのデータファイルを選択。サポート対象:\n .gpx, .kml, .geojson, .json", + "label": "ファイルをブラウズ" + }, + "or": "または", + "url": { + "instructions": "データファイルのURL、またはベクタータイルのURLテンプレートを入力。有効なトークン:\n {zoom}、またはZ/X/Yタイルスキーマ用 {z}, {x}, {y}", + "placeholder": "URLを入力" + } + } + }, "restore": { "heading": "OSMにアップロードされていない編集内容があります", "description": "前回作業した編集内容がアップロードされていません。編集内容を復元しますか?", @@ -727,18 +759,6 @@ }, "cannot_zoom": "現在のモードでは、これ以上ズームアウトできません。", "full_screen": "フルスクリーンにする", - "gpx": { - "local_layer": "GPXを追加", - "drag_drop": "ページ上に .gpx, .geojson, .kml ファイルをドラッグ&ドロップするか、右のボタンを押して参照するかしてください", - "zoom": "レイヤにズーム", - "browse": "ファイルをブラウズ" - }, - "mvt": { - "local_layer": "MVTを追加", - "drag_drop": "ページ上に .mvtや.pbfファイルをドラッグ&ドロップするか、画面右側のボタンをクリックしてください", - "zoom": "レイヤにズーム", - "browse": "ファイルをブラウズ" - }, "streetside": { "tooltip": "Microsoftによる街路写真", "title": "写真の重ね合わせ(Bing街路)", @@ -770,6 +790,12 @@ "anonymous": "匿名ユーザー", "closed": "(クローズ済)", "commentTitle": "コメント", + "status": { + "opened": "オープン日付 {when}", + "reopened": "再オープン日付 {when}", + "commented": "コメント日付 {when}", + "closed": "クローズ日付 {when}" + }, "newComment": "新しいコメント", "inputPlaceholder": "他のユーザーと共有するコメントを入力。", "close": "メモをクローズ", @@ -1394,13 +1420,13 @@ "presets": { "categories": { "category-barrier": { - "name": "障害物" + "name": "障害物の地物" }, "category-building": { - "name": "建物" + "name": "建物の地物" }, "category-golf": { - "name": "ゴルフ" + "name": "ゴルフの地物" }, "category-landuse": { "name": "土地利用の地物" @@ -1421,13 +1447,13 @@ "name": "線路の地物" }, "category-restriction": { - "name": "進行方向制限" + "name": "進行方向制限の地物" }, "category-road": { "name": "道路の地物" }, "category-route": { - "name": "ルート" + "name": "ルートの地物" }, "category-water-area": { "name": "水域の地物" @@ -1449,7 +1475,7 @@ "title": "目的外通行の禁止" }, "dismount": { - "description": "下車すれば通行可能", + "description": "降りれば通行可能", "title": "下車" }, "no": { @@ -1460,8 +1486,12 @@ "description": "所有者が通行制限しない限り通行可", "title": "所有者許諾あり" }, + "permit": { + "description": "妥当な許可や利用許諾がある場合のみ通行が許可されている", + "title": "許可" + }, "private": { - "description": "通行時には所有者の許可を得る必要がある", + "description": "通行時には所有者から個々に許可を得る必要がある", "title": "私有" }, "yes": { @@ -2159,10 +2189,10 @@ "label": "長さ (m)" }, "level": { - "label": "階数" + "label": "フロア番号(日本の1階は0)" }, "levels": { - "label": "階数", + "label": "総階数", "placeholder": "2, 4, 6..." }, "lit": { @@ -2794,7 +2824,7 @@ } }, "trees": { - "label": "木の数" + "label": "樹種" }, "tunnel": { "label": "種類", @@ -3005,7 +3035,7 @@ }, "amenity/animal_boarding": { "name": "ペットホテル", - "terms": "ペットホテル, 動物, ホテル" + "terms": "ペットホテル, 動物, ホテル, ペット" }, "amenity/animal_breeding": { "name": "動物繁殖施設", @@ -3013,7 +3043,7 @@ }, "amenity/animal_shelter": { "name": "動物保護施設", - "terms": "アニマルシェルター, 動物保護センター, 鳥獣保護施設" + "terms": "アニマルシェルター, 動物保護センター, 鳥獣保護施設, 動物, 鳥獣, アニマル" }, "amenity/arts_centre": { "name": "アートセンター", @@ -3053,7 +3083,7 @@ }, "amenity/biergarten": { "name": "ビアガーデン", - "terms": "ビアガーデン, ビール, 酒, アルコール, 軽食, 呑む, 飲む, 飲食店, 食べる, 食事, 料理, 飲み屋" + "terms": "ビアガーデン, ビアホール, ビール, 酒, 飲む, 呑む, 飲食店, アルコール" }, "amenity/boat_rental": { "name": "貸しボート", @@ -3375,7 +3405,7 @@ }, "amenity/smoking_area": { "name": "喫煙所", - "terms": "喫煙所, 喫煙エリア, たばこ, タバコ, 公園, 駅前, 広場" + "terms": "喫煙所, 喫煙エリア, たばこ, タバコ, 公園, 駅前, 広場, 煙草, 灰皿" }, "amenity/social_facility": { "name": "福祉施設", @@ -3434,7 +3464,7 @@ }, "amenity/vending_machine/cigarettes": { "name": "たばこ自動販売機", - "terms": "たばこ, 自動販売機, 自販機, 嗜好品, タバコ" + "terms": "たばこ, 自動販売機, 自販機, 嗜好品, タバコ, 煙草" }, "amenity/vending_machine/coffee": { "name": "コーヒー自販機", @@ -3505,11 +3535,11 @@ }, "amenity/veterinary": { "name": "獣医", - "terms": "獣医, ペット医, 病院, 医療, 動物病院, 犬猫病院, 動物" + "terms": "獣医, ペット医, 病院, 医療, 動物病院, 犬猫病院, 動物, ペット, 鳥獣, アニマル" }, "amenity/waste/dog_excrement": { "name": "犬の便入れ", - "terms": "犬の便入れ, 動物" + "terms": "犬の便入れ, 動物, ペット, 犬" }, "amenity/waste_basket": { "name": "ゴミ箱", @@ -3529,7 +3559,7 @@ }, "amenity/watering_place": { "name": "動物の水飲み場", - "terms": "動物の水飲み場, 水場" + "terms": "動物の水飲み場, 水場, 動物, ペット" }, "area": { "name": "エリア", @@ -3545,7 +3575,7 @@ }, "attraction/animal": { "name": "動物", - "terms": "動物" + "terms": "動物, アニマル, 鳥獣" }, "attraction/big_wheel": { "name": "大観覧車", @@ -3904,15 +3934,15 @@ }, "craft/carpenter": { "name": "工務店", - "terms": "工務店, 職人, 工房, 大工, リフォーム" + "terms": "工務店, 職人, 工房, 大工, リフォーム, 建具店, 表具店, 指物店, 経師, 建具師, 指物師" }, "craft/carpet_layer": { "name": "畳・カーペット工事店", - "terms": "畳・カーペット工事店, 職人, 工房" + "terms": "畳・カーペット工事店, 職人, 工房, 畳, カーペット, インテリア" }, "craft/caterer": { "name": "仕出し料理店", - "terms": "仕出し料理店, ケータリング, ホカ弁, 弁当" + "terms": "仕出し料理店, ケータリング, ホカ弁, 弁当, 持ち帰り, 持ち帰り専門店, 持帰り, ランチパック, 仕出し, 弁当屋" }, "craft/chimney_sweeper": { "name": "煙突掃除人", @@ -3943,8 +3973,8 @@ "terms": "家電修理店, 電気機器修理店, 修理店, リペアショップ, 職人, 工房" }, "craft/gardener": { - "name": "庭師", - "terms": "庭師, 職人, 工房" + "name": "造園業", + "terms": "庭師, 職人, 工房, 造園, 造園業, 樹木" }, "craft/glaziery": { "name": "ガラス細工師", @@ -4691,7 +4721,7 @@ }, "leisure/adult_gaming_centre": { "name": "遊技場(成人向け)", - "terms": "遊技場, パチンコ, パチスロ, スロット, 娯楽, アダルト, レジャー, パチンコ店, パチンコ屋, スロットルマシン" + "terms": "遊技場, パチンコ, パチスロ, スロット, 娯楽, アダルト, レジャー, パチンコ店, パチンコ屋, スロットマシン, ギャンブル" }, "leisure/amusement_arcade": { "name": "ゲームセンター", @@ -4841,6 +4871,10 @@ "name": "アメリカンフットボール場", "terms": "アメリカンフットボール場, アメフト競技場, スポーツ, 運動, 競技" }, + "leisure/pitch/badminton": { + "name": "バドミントンコート", + "terms": "バドミントンコート, バドミントン場, スポーツ, 運動, 競技" + }, "leisure/pitch/baseball": { "name": "野球場", "terms": "野球場, 球場, スポーツ, 運動, 競技" @@ -4965,6 +4999,10 @@ "name": "橋", "terms": "橋, 橋梁, 高架" }, + "man_made/bunker_silo": { + "name": "バンカーサイロ", + "terms": "バンカーサイロ, サイロ" + }, "man_made/chimney": { "name": "煙突", "terms": "煙突" @@ -5316,7 +5354,7 @@ }, "office/moving_company": { "name": "引っ越し業者", - "terms": "引っ越し業者" + "terms": "引っ越し業者, 引越業者, 引越" }, "office/newspaper": { "name": "新聞社", @@ -5380,7 +5418,7 @@ "name": "地名" }, "place/city": { - "name": "市名", + "name": "市制地方自治体", "terms": "市名, 地名" }, "place/farm": { @@ -5427,11 +5465,11 @@ "terms": "Borough, Suburb, 区, 行政区, 区界" }, "place/town": { - "name": "町", + "name": "町制地方自治体", "terms": "町, 地名" }, "place/village": { - "name": "村", + "name": "村制の地方自治体", "terms": "村, 地名" }, "playground/balance_beam": { @@ -5992,7 +6030,7 @@ }, "shop/e-cigarette": { "name": "電子タバコ店", - "terms": "電子タバコ店, 嗜好品, タバコ, たばこ" + "terms": "電子タバコ店, 嗜好品, タバコ, たばこ, 煙草" }, "shop/electronics": { "name": "家電販売店(小型製品)", @@ -6004,7 +6042,7 @@ }, "shop/fabric": { "name": "生地屋", - "terms": "布地, 織物, 反物, ファブリック店, 生地, 裏地, 衣料, 服, 裁縫, 衣類" + "terms": "布地, 織物, 反物, ファブリック店, 生地, 裏地, 衣料, 服, 裁縫, 衣類, 生地店, 布地店, お店" }, "shop/farm": { "name": "農産物直売所", @@ -6186,11 +6224,11 @@ }, "shop/pet": { "name": "ペットショップ", - "terms": "ペット売り場, ペット, 家禽, ペットショップ, 動物" + "terms": "ペット売り場, ペット, 家禽, ペットショップ, 動物, 愛玩動物" }, "shop/pet_grooming": { "name": "ペット美容室", - "terms": "ペット美容室, 動物美容, ペット, 美容, 犬の美容室, 愛犬美容, 犬, 猫" + "terms": "ペット美容室, 動物美容, ペット, 美容, 犬の美容室, 愛犬美容, 犬, 猫, 動物" }, "shop/photo": { "name": "写真店", @@ -6262,7 +6300,7 @@ }, "shop/tobacco": { "name": "たばこ店", - "terms": "たばこ店, たばこ屋, タバコ, たばこ, 嗜好品" + "terms": "たばこ店, たばこ屋, タバコ, たばこ, 嗜好品, タバコ店, タバコ屋, 煙草" }, "shop/toys": { "name": "玩具店", @@ -6875,6 +6913,27 @@ }, "name": "Hike & Bike" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)", + "name": "Nordic snowmobile オーバーレイ" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.", + "name": "Lantmäteriet Historic Orthophoto 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.", + "name": "Lantmäteriet Historic Orthophoto 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "規約 & フィードバック" @@ -6911,8 +6970,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Scan of ´Economic maps´ ca 1950-1980", - "name": "Lantmäteriet Economic Map (historic)" + "description": "Scan of \"Economic maps\" ca. 1950–1980", + "name": "Lantmäteriet Economic Map 1950–1980" }, "qa_no_address": { "attribution": { @@ -6926,6 +6985,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Snowmobile trails", + "name": "Snowmobile map Sweden" + }, "stamen-terrain-background": { "attribution": { "text": "Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL" @@ -6988,6 +7054,14 @@ } }, "community": { + "bw-facebook": { + "name": "Mapping Botswana on Facebook", + "description": "Page of OpenStreetMap in Botswana" + }, + "bw-twitter": { + "name": "Mapping Botswana on Twitter", + "description": "Twitter of OpenStreetMap in Botswana" + }, "cape-coast-youthmappers": { "name": "University of Cape Coast YouthMappers", "description": "Follow us on Twitter: {url}", @@ -7352,6 +7426,18 @@ "name": "OpenStreetMap Hungary Meetup", "description": "The platform for organizing meetups in Hungary" }, + "is-facebook": { + "name": "OSM Iceland on Facebook", + "description": "Page of OpenStreetMap in Iceland" + }, + "is-mailinglist": { + "name": "Talk-is Mailing List", + "description": "Talk-is is the official mailing list for the Icelandic OSM community" + }, + "is-twitter": { + "name": "OSM Iceland on Twittter", + "description": "Twitter of OpenStreetMap in Iceland" + }, "it-facebook": { "name": "OpenStreetMap Italy Facebook", "description": "Join the OpenStreetMap Italy community on Facebook" @@ -7693,6 +7779,11 @@ "name": "OpenStreetMap Brasil Twitter", "description": "Follow us on Twitter at {url}" }, + "RS-telegram": { + "name": "OpenStreetMap Rio Grande do Sul Telegram Group", + "description": "Join the OpenStreetMap Rio Grande do Sul community on Telegram", + "extendedDescription": "Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!" + }, "OSM-CL-facebook": { "name": "OpenStreetMap Chile Facebook", "description": "Join the OpenStreetMap Chile community on Facebook", @@ -7769,6 +7860,29 @@ "name": "OpenStreetMap Peru", "description": "News and resources for the OpenStreetMap Peru community" }, + "LATAM-Facebook": { + "name": "OpenStreetMap Latam Facebook", + "description": "OpenStreetMap Latam on Facebook" + }, + "LATAM-Telegram": { + "name": "OpenStreetMap Latam Telegram", + "description": "OpenStreetMap Telegram for Latin America" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Latam Twitter", + "description": "Follow us on Twitter at {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "Supporting OpenStreetMap in Latin America", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.", + "where": "Buenos Aires, Argentina" + } + } + }, "OSM-Facebook": { "name": "Facebook上のOpenStreetMap", "description": "Like us on Facebook for news and updates about OpenStreetMap." diff --git a/dist/locales/kn.json b/dist/locales/kn.json index d4c001a4c..6d404796c 100644 --- a/dist/locales/kn.json +++ b/dist/locales/kn.json @@ -431,7 +431,6 @@ "best_imagery": "ಈ ಪ್ರದೇಶಕ್ಕೆ ಅಪ್ರತಿಮ ಉಪಗ್ರಹ ಚಿತ್ರಣ ", "switch": "ಈ ಹಿನ್ನಲೆಗೆ ಹಿಂತಿರುಗಿ ", "custom": "ಅನುಸರಣ", - "custom_button": "ಅನುಸರಣ ಹಿನ್ನಲೆಯನ್ನು ಸಂಪಾದಿಸಿ", "reset": "ಮರುಹೊಂದಿಸು", "minimap": { "key": "/" @@ -762,19 +761,15 @@ "label": "ಅನುಮತಿಸಲಾದ ಪ್ರವೇಶ", "options": { "designated": { - "description": "‍ಪ್ರವೇಶ‍ವು ಸಂಚಾರದ ಚಿಹ್ನೆಗಳಿಗೂ ಹಾಗೂ ಸ್ಥಳೀಯ ಕಾನೂನುಗಳಿಗೆ ಅನುಗುಣವಾಗಿವೆ ", "title": "ನಿಯೋಜಿತ" }, "destination": { - "description": "‍‍ಪ್ರವೇಶ ಅನುಮತಿ ನಿರ್ದಿಷ್ಟ ಸ್ಥಳಕ್ ‍ಮಾತ್ರ", "title": "ತಲಪುದಾಣ" }, "dismount": { - "description": "ೞ್‍", "title": "ಬೇರ್ಪಡಿಸು" }, "no": { - "description": "ಸಾರ್ವಜನಿಕ ಪ್ರವೇಶಕ್ಕೆ ಅನುಮತಿ ಇಲ್ಲ", "title": "ನಿಷೇಧಿಸಲಾಗಿದೆ" }, "permissive": { diff --git a/dist/locales/ko.json b/dist/locales/ko.json index 4b63dfcf7..808286007 100644 --- a/dist/locales/ko.json +++ b/dist/locales/ko.json @@ -477,8 +477,6 @@ "best_imagery": "이 위치의 가장 잘 알려진 사진 자료", "switch": "이 배경으로 복귀합니다", "custom": "사용자 지정", - "custom_button": "사용자 지정 배경 편집", - "custom_prompt": "타일 URL 템플릿을 입력하세요. 올바른 토큰은 다음과 같습니다:\n - Z/X/Y 타일 체계에 대해 {zoom} 또는 {z}, {x}, {y}\n - 뒤집힌 TMS 스타일의 Y좌표용으로 {-y} 또는 {ty}\n - 쿼드 타일 방식으로 {u}\n - 다중 DNS 서버용으로 {switch:a,b,c}\n\n예시는 다음과 같습니다:\n{example}", "overlays": "오버레이", "imagery_source_faq": "이미지 정보 / 버그 신고", "reset": "재설정", @@ -674,11 +672,6 @@ }, "cannot_zoom": "현재 모드에서 더 축소할 수 없습니다.", "full_screen": "전체 화면 전환", - "gpx": { - "drag_drop": "페이지에서 .gpx, .geojson 또는 .kml 파일을 끌어 놓거나 오른쪽에 있는 찾아보기 버튼을 클릭하세요.", - "zoom": "레이어 확대", - "browse": "파일 찾아보기" - }, "mapillary_images": { "tooltip": "Mapillary의 거리 수준 사진", "title": "사진 겹치기 (Mapillary)" @@ -1114,31 +1107,24 @@ "label": "허가된 통행", "options": { "designated": { - "description": "표지판이나 특정 지역 법률에 따라 통행이 허가됩니다", "title": "지정 차종만 통행 허가" }, "destination": { - "description": "목적지에 갈 때에만 통행이 허가됩니다", "title": "목적 외 통행 금지" }, "dismount": { - "description": "통행이 허가되지만 탑승자는 내려야 합니다", "title": "내리기" }, "no": { - "description": "통행이 일반 대중에게 허가되지 않습니다", "title": "제한됨" }, "permissive": { - "description": "소유자가 권한을 해제할 때까지 통행이 허가됩니다", "title": "소유자 허가 필요" }, "private": { - "description": "개별적으로 소유자의 허가로만 통행이 허가됩니다", "title": "사유" }, "yes": { - "description": "통행이 법적으로 허가됩니다; 정당한 이용", "title": "허가됨" } }, @@ -1159,17 +1145,17 @@ "placeholders": { "block_number": "번지", "block_number!jp": "번지", - "city": "도시", + "city": "시", "city!jp": "시/정/촌/도쿄 특별구", - "city!vn": "도시/마을", + "city!vn": "시/읍", "conscriptionnumber": "123", - "country": "나라", + "country": "국가", "county": "군", "county!jp": "군", - "district": "지구", + "district": "구", "district!vn": "구/시사/현", "floor": "층", - "hamlet": "작은 마을", + "hamlet": "반", "housename": "집이름", "housenumber": "123", "housenumber!jp": "건물 번호/장소 번호", @@ -1721,7 +1707,7 @@ "no": "아니오", "terminal": "단말기", "wired": "유선", - "wlan": "와이파이", + "wlan": "Wi-Fi", "yes": "예" } }, @@ -2414,7 +2400,10 @@ "placeholder": "기본값" }, "usage_rail": { - "label": "용도" + "label": "용도", + "options": { + "tourism": "관광" + } }, "vending": { "label": "상품 종류" @@ -2645,10 +2634,6 @@ "name": "자전거 수리 도구", "terms": "자전거 수리 도구 스탠드" }, - "amenity/biergarten": { - "name": "비어 가든", - "terms": "비어 가든" - }, "amenity/boat_rental": { "name": "보트 대여소", "terms": "보트 대여소,보트 렌탈" @@ -3005,7 +2990,7 @@ "terms": "화장실, 아름자리" }, "amenity/townhall": { - "name": "마을회관", + "name": "읍사무소", "terms": "마을회관,주민센터,동사무소" }, "amenity/university": { @@ -3060,8 +3045,8 @@ "terms": "주차권 발권기" }, "amenity/vending_machine/public_transport_tickets": { - "name": "1회용 교통카드·승차권 판매기", - "terms": "1회용 교통카드·승차권 판매기, 대중교통 티켓 발권기" + "name": "대중교통 승차권 발매기", + "terms": "대중교통 승차권 발매기,1회용 승차권 발매기" }, "amenity/vending_machine/stamps": { "name": "우표 자판기" @@ -3254,8 +3239,8 @@ "terms": "오두막집" }, "building/cathedral": { - "name": "성당 건물", - "terms": "성당 건물" + "name": "대성당 건물", + "terms": "대성당 건물" }, "building/chapel": { "name": "예배당 건물", @@ -3776,8 +3761,8 @@ "name": "도로" }, "highway/bridleway": { - "name": "승마로", - "terms": "승마도" + "name": "승마 도로", + "terms": "승마 도로" }, "highway/bus_guideway": { "name": "독립된 버스전용차로", @@ -3799,7 +3784,7 @@ "terms": "횡단보도" }, "highway/cycleway": { - "name": "자전거로", + "name": "자전거 도로", "terms": "자전거 도로" }, "highway/elevator": { @@ -3957,8 +3942,8 @@ "terms": "루프선 (교통섬)" }, "highway/unclassified": { - "name": "비주요/분류되지 않은 도로", - "terms": "비주요/분류되지 않은 도로" + "name": "비주요/미분류 도로", + "terms": "비주요/미분류 도로" }, "historic": { "name": "사적지", @@ -4021,7 +4006,7 @@ "terms": "웅덩이, 분지" }, "landuse/brownfield": { - "name": "브라운필드" + "name": "재개발 부지" }, "landuse/cemetery": { "name": "묘지", @@ -4036,8 +4021,8 @@ "terms": "상업 지역" }, "landuse/construction": { - "name": "공사중", - "terms": "공사중" + "name": "공사 중", + "terms": "공사 중" }, "landuse/farm": { "name": "농토" @@ -4059,7 +4044,7 @@ "terms": "잔디" }, "landuse/greenfield": { - "name": "그린필드" + "name": "미개발 부지" }, "landuse/greenhouse_horticulture": { "name": "온실 원예", @@ -4158,7 +4143,7 @@ "terms": "레크리에이션 지역" }, "landuse/religious": { - "name": "종교 지역" + "name": "종교 부지" }, "landuse/residential": { "name": "주거 지역", @@ -4788,20 +4773,23 @@ "name": "장소" }, "place/city": { - "name": "도시", + "name": "시", "terms": "도시" }, "place/farm": { "name": "농장" }, "place/hamlet": { - "name": "작은 마을", + "name": "반", "terms": "작은 마을" }, "place/island": { "name": "섬", "terms": "섬" }, + "place/islet": { + "name": "작은 섬" + }, "place/isolated_dwelling": { "name": "독립 주택", "terms": "독립 주택" @@ -4827,11 +4815,11 @@ "terms": "자치구 / 교외" }, "place/town": { - "name": "마을", + "name": "읍", "terms": "마을" }, "place/village": { - "name": "촌", + "name": "읍/면/동", "terms": "촌" }, "playground/climbing_frame": { @@ -5022,6 +5010,9 @@ "name": "트롤리버스 터미널", "terms": "버스,전기,대중교통,정거장,터미널,무궤도,전차,트롤리" }, + "public_transport/stop_area": { + "name": "대중교통 정차 구역" + }, "public_transport/stop_position": { "name": "대중교통 정차 위치", "terms": "대중교통" @@ -5860,12 +5851,12 @@ "terms": "해양 화장실 처리" }, "waterway/stream": { - "name": "개울", + "name": "하천", "terms": "개천,시내,하천,물줄기" }, "waterway/stream_intermittent": { "name": "간헐 하천", - "terms": "간헐천" + "terms": "간헐 하천" }, "waterway/water_point": { "name": "해양 식수", diff --git a/dist/locales/lt.json b/dist/locales/lt.json index 4495bc5f7..1d6a10273 100644 --- a/dist/locales/lt.json +++ b/dist/locales/lt.json @@ -401,7 +401,6 @@ "best_imagery": "Geriausia žinoma ortofotografija šiai vietai", "switch": "Persijungti atgal į šį foną", "custom": "Savas", - "custom_button": "Redaguoti pasirinktiną foną", "reset": "iš naujo", "minimap": { "tooltip": "Rodyti atitolintą žemėlapį, kad būtų lengviau rasti šiuo metu rodomą vietą." @@ -559,11 +558,6 @@ }, "cannot_zoom": "Negalima atitolinti šiame režime.", "full_screen": "Perjungti pilną ekraną", - "gpx": { - "drag_drop": "Tempkite ir numeskite .gpx, .geojson arba .kml failą ant puslapio arba spauskite mygtuką dešinėje, kad naršytumėte", - "zoom": "Išdidinti sluoksnį", - "browse": "Naršyti failo" - }, "mapillary_images": { "tooltip": "Gatvės lygio nuotraukos iš Mapillary", "title": "Nuotraukų perdanga (Mapillary)" @@ -710,31 +704,24 @@ "label": "Leidžiamas priėjimas", "options": { "designated": { - "description": "Priėjimas galimas remiantis ženklais ir savitais vietos įstatymais", "title": "Skirtas" }, "destination": { - "description": "Priėjimas leistinas tik atvykti į tikslą", "title": "Tikslinis" }, "dismount": { - "description": "Priėjimas leidžiamas, bet dviratininkas turi nulipti nuo dviračio", "title": "Nulipti" }, "no": { - "description": "Priėjimas draudžiamas plačiajai visuomenei", "title": "Draudžiamas" }, "permissive": { - "description": "Priėjimas leistinas, kai savininkas konkrečiu laiku panaikina draudimą", "title": "Leistinas" }, "private": { - "description": "Priėjimas leistinas tik su savininko leidimu", "title": "Privatus" }, "yes": { - "description": "Priėjimas leidžiamas įstatymų; pirmumo teisė", "title": "Leidžiamas" } }, diff --git a/dist/locales/lv.json b/dist/locales/lv.json index eeb8c6ca8..eef41ac33 100644 --- a/dist/locales/lv.json +++ b/dist/locales/lv.json @@ -21,6 +21,11 @@ "description": "Pievieno restorānus, pieminekļus, veikalus un citus punktus.", "tail": "Klikšķiniet uz kartes, lai pievienotu interešu punktu." }, + "add_note": { + "title": "Piezīme", + "description": "Atradi kļūdu? Pabrīdini citus kartētājus par to.", + "tail": "Klikšķiniet uz kartes lai pievienotu piezīmi." + }, "browse": { "title": "Pārlūkot", "description": "Pārlūko karti." @@ -34,7 +39,8 @@ "annotation": { "point": "Punkts pievienots.", "vertex": "Mezgls pievienots līnijai.", - "relation": "Relācija pievienota." + "relation": "Relācija pievienota.", + "note": "Pievienota piezīme." } }, "start": { @@ -123,6 +129,10 @@ "single": "Šo objektu nevar dzēst, jo tas nav pilnībā lejuplādēts.", "multiple": "Šos objektus nevar dzēst, jo tie nav pilnībā lejupielādēti." }, + "part_of_relation": { + "single": "Šo objektu nevar dzēst jo tā ir daļa no lielākas relācijas. Tev tas ir jānoņem no šīs relācijas vispirms.", + "multiple": "Šos objektu nevar dzēst jo tā ir daļa no lielākas relācijas. Tev tie ir jānoņem no šīs relācijas vispirms." + }, "connected_to_hidden": { "single": "Šo objektu nevar dzēst, jo tas ir pievienots paslēptam objektam.", "multiple": "Šos objektus nevar dzēst, jo daži no tiem ir pievienoti paslēptiem objektiem." @@ -242,6 +252,9 @@ "create": "Pievienoja pagriezienu aizliegumu", "delete": "Izdzēsa pagriezienu aizliegumu" } + }, + "detach_node": { + "key": "E" } }, "restriction": { @@ -249,7 +262,10 @@ "distance": "Attālums" }, "help": { - "indirect": "(netiešs)" + "indirect": "(netiešs)", + "from": "NO", + "via": "AR", + "to": "UZ" } }, "undo": { @@ -264,10 +280,12 @@ "browser_notice": "Šis redaktors atbalsta Firefox, Crome, Safari, Opera un Internet Explorer 11 vai augstāku. Lūdzu atjaunini savu pārlūkprogrammu, vai izmanto Potlatch 2 kartes rediģēšanai.", "translate": { "translate": "Tulkot", + "localized_translation_label": "Daudzvalodu nosaukums", "localized_translation_language": "Izvelties valodu", "localized_translation_name": "Vārds" }, "zoom_in_edit": "Pietuvini lai labotu", + "login": "Ienākt", "loading_auth": "Savienojas ar OpenStreetMap...", "report_a_bug": "Ziņot par kļūdu", "help_translate": "Palīdzi tulkot", @@ -278,7 +296,8 @@ "status": { "error": "Nevarēja savienoties ar API.", "offline": "API ir bezsaistē. Mēģini rediģēt vēlāk.", - "readonly": "API ir tikai lasīšanas režīmā. Tev būs jāuzgaida līdz varēsi saglabāt izmaiņas." + "readonly": "API ir tikai lasīšanas režīmā. Tev būs jāuzgaida līdz varēsi saglabāt izmaiņas.", + "rateLimit": "API ierobežo anonīmos pieslēgumus. To var salabot ienākot savā kontā." }, "commit": { "title": "Augšupielādē uz OpenStreetMap", @@ -292,7 +311,12 @@ "warnings": "Brīdinājumi", "modified": "Mainīts", "deleted": "Dzēsts", - "created": "Izveidots" + "created": "Izveidots", + "google_warning": "Tu pieminēji Google šajā komentārā. Atceries ka kopēšana no Google Kartēm ir stingri aizliegta. " + }, + "contributors": { + "list": "Rediģēja {users}", + "truncated_list": "Rediģēja {users} un vēl {count} lietotāji" }, "info_panels": { "background": { @@ -317,7 +341,13 @@ "version": "Versija", "last_edit": "Pēdējais labojums", "edited_by": "Laboja", - "unknown": "Nezināms" + "changeset": "Izmaiņas", + "unknown": "Nezināms", + "link_text": "Vēsture no openstreetmap.org", + "note_no_history": "Nav vēstures (Jauna piezīme)", + "note_comments": "Komentāri", + "note_created_date": "Izveidošanas datums", + "note_created_user": "Izveidoja" }, "location": { "title": "Atrašanās vieta", @@ -326,6 +356,7 @@ "measurement": { "title": "Mērvienība", "selected": "{n} izvēlēti", + "geometry": "Ģeometrija", "center": "Centrs", "perimeter": "Perimetrs", "length": "Garums", @@ -336,7 +367,8 @@ }, "geometry": { "point": "punkts", - "relation": "relācija" + "relation": "relācija", + "note": "piezīme" }, "geocoder": { "search": "Meklēt pasaulē...", @@ -391,6 +423,8 @@ "description": "Fona iestatījumi", "backgrounds": "Foni", "none": "Nav", + "overlays": "Pārklāji", + "imagery_source_faq": "Attēlu Info / Ziņo par kļūdu", "reset": "Atiestatīt", "display_options": "Displeja iespējas", "brightness": "Spilgtums", @@ -399,9 +433,11 @@ "sharpness": "Asums", "minimap": { "description": "Rādīt Mini Karti", + "tooltip": "Parādīt attālinātu skatu lai palīdzētu atrast pašlaik redzamo vietu.", "key": "/" }, - "fix_misalignment": "Mainīt fona nobīdi" + "fix_misalignment": "Mainīt fona nobīdi", + "offset": "Velc jebkur zemāk esošajā pelēkajā reģionā lai regulētu attēlu nobīdi, vai ievadi nobīdes attālumu numerātiski." }, "map_data": { "title": "Kartes Dati", @@ -412,9 +448,14 @@ "osm": { "tooltip": "Kartes dati no OpenStreetMap", "title": "OpenStreetMap dati" + }, + "notes": { + "title": "OpenStreetMap piezīmes" } }, - "autohidden": "Šie objekti tika automātiski paslēpti, jo pārāk daudz būtu parādijušies uz ekrāna. Pietuvini karti, lai tos parādītu." + "map_features": "Kartes Objekti", + "autohidden": "Šie objekti tika automātiski paslēpti, jo pārāk daudz būtu parādijušies uz ekrāna. Pietuvini karti, lai tos parādītu.", + "osmhidden": "Šie objekti tika automātiski paslēpti jo OpenStreetMap slānis ir paslēpts." }, "feature": { "points": { @@ -431,13 +472,21 @@ "description": "Ēkas" }, "boundaries": { - "description": "Robežas" + "description": "Robežas", + "tooltip": "Administratīvās Robežas" }, "water": { - "description": "Ūdens iespējas" + "description": "Ūdens veidi" }, "rail": { + "description": "Dzelzceļu veidi", "tooltip": "Dzelzceļi" + }, + "power": { + "description": "Elektroenerģijas veidi" + }, + "others": { + "tooltip": "Viss pārējais" } }, "restore": { @@ -457,6 +506,8 @@ "conflict_progress": "Pārbaudam konfliktus: {num} no {total}", "unsaved_changes": "Jums ir nesaglabātas izmaiņas", "conflict": { + "header": "Salabot konfliktējošo rediģējumu", + "count": "Konfliktē {num} no {total}", "previous": "< Iepriekšējais", "next": "Nākošais >", "keep_local": "Paturēt manu", @@ -469,6 +520,7 @@ }, "merge_remote_changes": { "conflict": { + "deleted": "Šo objektu izdzēsa {user}.", "memberlist": "Relāciju locekļus redigēja gan jūs, gan arī {user}." } }, @@ -478,10 +530,13 @@ "thank_you_location": "Paldies ka uzlabojāt karti {where} apkārtnē.", "help_html": "Jūsu izmaiņām vajadzētu parādīties OpenStreetMap pēc pāris minūtēm. Citas kartes var atjaunoties lēnāk.", "help_link_text": "Detaļas", + "help_link_url": "https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F", "view_on_osm": "Apskatīt izmaiņas OSM", + "changeset_id": "Tavs izmaiņu #: {changeset_id}", "like_osm": "Patīk OpenStreetMap? Sazinies ar citiem:", "more": "Vairāk", - "languages": "Valodas: {languages}" + "languages": "Valodas: {languages}", + "tell_us": "Pastāsti mums!" }, "confirm": { "okay": "Labi", @@ -489,6 +544,7 @@ }, "splash": { "welcome": "Laipni lūgti iD OpenStreetMap redaktorā", + "text": "iD ir draudzīgs, bet spēcīgs rīks ar ko var dot savu ieguldījumu pasaules labākajai brīvajai pasaules kartei. Šī ir versija {version}. Papildus informācijai varat skatīt {website} un ziņot par kļūdām {github}.", "start": "Rediģēt tagad" }, "source_switch": { @@ -505,7 +561,9 @@ "used_with": "izmantots kopā ar {type}" }, "validations": { + "disconnected_highway": "Nepievienots ceļš", "untagged_line": "Neapzīmēta līnija", + "untagged_line_tooltip": "Izvēlies tipu, kas vislabāk izskaidro šo līniju.", "untagged_area": "Neapzīmēts apgabals", "tag_suggests_area": "Apzīmējums {tag} parasti tiek lietots apgabaliem, bet objekts nav apgabals", "deprecated_tags": "Novecojuši apzīmējumi: {tags}" @@ -516,10 +574,20 @@ }, "streetside": { "tooltip": "Ielas līmeņa attēli no Microsoft", - "title": "Fotogrāfiju pārklājs (Bing Streetside)" + "title": "Fotogrāfiju pārklājs (Bing Streetside)", + "view_on_bing": "Skatīt Bing kartēs", + "hires": "Augsta izšķirtspēja" }, "mapillary_images": { - "tooltip": "Ielas līmeņa attēli no Mapillary" + "tooltip": "Ielas līmeņa attēli no Mapillary", + "title": "Fotogrāfiju Pārklājs (Mapillary)" + }, + "mapillary_signs": { + "tooltip": "Ceļazīmes no Mapillary (ir jāieslēdz Fotogrāfiju Pārklājs)", + "title": "Ceļazīmju pārklājs (Mapillary)" + }, + "mapillary": { + "view_on_mapillary": "Skatīt šo attēlu Mapillary" }, "openstreetcam_images": { "tooltip": "Ielas līmeņa attēli no OpenStreetCam", @@ -528,28 +596,135 @@ "openstreetcam": { "view_on_openstreetcam": "Skatīt šo attēlu OpenStreetCam" }, + "note": { + "note": "Piezīme", + "title": "Rediģēt piezīmi", + "anonymous": "anonīms", + "closed": "(Aizvērts)", + "commentTitle": "Komentāri", + "status": { + "opened": "atvērts {when}", + "reopened": "atkārtoti atvērts {when}", + "commented": "komentēts {when}", + "closed": "aizvērts {when}" + }, + "newComment": "Jauns komentārs", + "inputPlaceholder": "Ieraksti komentāru, kuru dalīt ar citiem lietotājiem.", + "close": "Aizvērt Piezīmi", + "open": "Atkārtoti atvērt Piezīmi", + "comment": "Komentēt", + "close_comment": "Aizvērt un komentēt", + "open_comment": "Atkārtoti atvērt un komentēt", + "report": "Ziņot", + "new": "Jauna piezīme", + "newDescription": "Izskaidro problēmu.", + "save": "Saglabāt piezīmi", + "login": "Tev ir jāieiet lai rediģētu vai komentētu uz šīs piezīmes.", + "upload_explanation": "Tavi komentāri būs publiski redzami visiem OpenStreetMap lietotājiem.", + "upload_explanation_with_user": "Tavi komentāri kā {user} būs publiski redzami visiem OpenStreetMap lietotājiem." + }, "help": { "title": "Palīdzība", + "key": "H", "help": { + "title": "Palīdzība", "welcome": "Esiet sveicināti iD [OpenStreetMap](https://www.openstreetmap.org/) rediģētājā. Ar šo rediģētāju jūs varat rediģēt OpenStreetMap savā pārlūkprogrammā.", + "open_data_h": "Atvērti dati", + "before_start_h": "Pirms tu sāc", + "open_source_h": "Atvērta Pirmkoda", + "open_source": "iD redaktors ir kopienas atvērta koda projekts, un tu pašlaik izmanto versiju {version}. Pirmkods ir pieejams [GitHubā](https://github.com/openstreetmap/iD).", "open_source_help": "Tu vari palīdzēt iD [tulkojot](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) vai [ziņojot par kļūdām](https://github.com/openstreetmap/iD/issues)." }, + "overview": { + "title": "Pārskats", + "navigation_h": "Navigācija" + }, + "editing": { + "title": "Rediģēšana un saglabāšana", + "select_h": "Izvēle", + "save_h": "Saglabāšana", + "save": "Nospied {save} **Saglabāt** lai pabeigtu rediģēšanu un nosūtītu datus uz OpenStreetMap. Atceries bieži saglabāt datus!", + "save_validation": "Saglabāšanas ekrānā tev būs iespēja pārskatīt ko esi izmainījis. iD arī veiks vienkāršas pārbaudes par trūkstošiem datiem un var dot svarīgus ieteikumus un brīdinājumus ja kaut kas šķiet nepareizs.", + "upload_h": "Augšupielādēt", + "backups_h": "Automātiska rezerves kopija", + "backups": "Ja tu nevari pabeigt rediģēšanu vienā reizē, piemēram ja tavs dators uzkaras, vai arī tu aizver pārlūku, tavas izmaiņas tāpat tiek saglabātas tavas pārlūkprogrammas atmiņā. Tu vari atnākt vēlāk (pie tā paša datora un pārlūkprogrammas) un iD dos tev iespēju atkopt darīto. ", + "keyboard_h": "Klavietūras Īsinājumtaustiņi", + "keyboard": "Tu vari redzēt pilnu īsinājumtaustiņu sarakstu nospiežot '?' taustiņu. " + }, "feature_editor": { "title": "Objektu Redaktors", "type_h": "Objekta Veids" }, + "points": { + "title": "Punkti", + "add_point_h": "Punktu pievienošana", + "move_point_h": "Punktu pārvietošana", + "delete_point_h": "Punktu dzēšana" + }, + "lines": { + "title": "Līnijas", + "add_line_h": "Līniju pievienošana", + "modify_line_h": "Līniju rediģēšana", + "connect_line_h": "Līniju savienošana", + "disconnect_line_h": "Līniju atvienošana", + "move_line_h": "Līniju pārvietošana", + "delete_line_h": "Līniju dzēšana" + }, + "areas": { + "point_or_area_h": "Punkti vai laukumi?", + "add_area_h": "Laukumu pievienošana", + "square_area_h": "Taisnlenķa stūri", + "modify_area_h": "Laukumu rediģēšana", + "delete_area_h": "Laukumu dzēšana" + }, + "relations": { + "title": "Relācijas", + "edit_relation_h": "Relāciju rediģēšana", + "maintain_relation_h": "Relāciju uzturēšana", + "relation_types_h": "Relāciju veidi", + "multipolygon_h": "Multipoligoni", + "turn_restriction_h": "Pagriezienu aizliegumi", + "boundary_h": "Robežas" + }, + "notes": { + "title": "Piezīmes", + "add_note_h": "Piezīmju pievienošana", + "update_note_h": "Aizvēršana, Atkārtota atvēršana un komentēšana", + "save_note_h": "Piezīmju saglabāšana" + }, + "imagery": { + "title": "Fona attēlojums", + "sources_h": "Attēlu avoti", + "offsets_h": "Pieregulē Fona Nobīdi" + }, "streetlevel": { - "title": "Ielas līmeņa attēli" + "title": "Ielas līmeņa attēli", + "using_h": "Ielas līmeņa attēlu izmantošana" + }, + "gps": { + "title": "GPS Treki", + "using_h": "GPS Treku izmantošana" }, "field": { "restrictions": { + "title": "Pagriezienu Aizliegumu Palīdzība", + "about": { + "title": "Par" + }, + "inspecting": { + "title": "Pārbaudīšana" + }, "modifying": { - "title": "Rediģē" + "title": "Rediģēšana" + }, + "tips": { + "title": "Padomi" } } } }, "intro": { + "done": "pabeigts", "ok": "Labi", "graph": { "block_number": "", @@ -580,7 +755,13 @@ "title": "Līnijas" }, "buildings": { - "title": "Ēkas" + "title": "Ēkas", + "square_building": "Māja, kuru tu tikko pievienoji izskatīsies vēl labāk ar perfekti kvadrātainiem stūriem. **Nospied {button} pogu lai padarītu stūrus kvadrātainus.**", + "retry_square": "Tu nenospiedi Kvadrāta pogu. Mēģini vēlreiz.", + "done_square": "Redzi kā ēkas stūri tika automātiski ievirzīti vietā? Iemācīsimies vēl vienu parocīgu triku.", + "add_tank": "Tagad mēs trasēsim šo apaļo degvielas tanku. **Nospied {button} Laukuma pogu lai pievienotu vēl vienu laukumu*", + "start_tank": "Nesatraucies, tev nevajadzēs uzzīmēt perfektu apli. Vienkārši uzzīmē laukumu iekšpusē, kas pieskaras tā malai. **Klikšķini vai nospied space taustiņu lai noliktu sākuma punktu tanka malā.**", + "continue_tank": "Pievieno vēl pāris punktus pa tanka malu. Aplis tiks izveidots ārpus punktiem kurus tu zīmē.{br}Pabeidz laukumu nospiežot Enter taustiņu, vai noklikšķinot atkal uz pirmā vai pēdējā punkta. **Pabeidz tanka trasēšanu.**" }, "startediting": { "title": "Sākt rediģēt", @@ -610,43 +791,58 @@ "delete": "Dzēst izvēlētos objektus" }, "commands": { - "copy": "Kopēt izvēlētos objektus" + "copy": "Kopēt izvēlētos objektus", + "paste": "Ielīmēt kopētos objektus" } } }, "presets": { "categories": { "category-barrier": { - "name": "Barjeru iespējas" + "name": "Barjeru veidi" + }, + "category-building": { + "name": "Ēku veidi" + }, + "category-path": { + "name": "Taku veidi" + }, + "category-rail": { + "name": "Sliežu ceļu veidi" + }, + "category-road": { + "name": "Ceļu veidi" } }, "fields": { "access": { + "label": "Atļauta piekļuve", "options": { "designated": { - "description": "Piekļuve atļauta atbilstoši zīmēm vai speciāliem vietējiem likumiem", + "description": "Atļauta piekļuve saskaņā ar vietējiem likumiem", "title": "Nozīmēts" }, "destination": { + "description": "Atļauta piekļuve tikai lai sasniegtu galamērķi", "title": "Galamērķis" }, "dismount": { - "description": "Piekļuve atļauta, bet braucējam jānokāpj", "title": "Jānokāpj" }, "no": { - "description": "Piekļuve nav atļauta bez speciālā atļaujām ", "title": "Aizliegts" }, "permissive": { "description": "Piekļuve atļauta līdz īpašnieks atsauc atļauju" }, + "permit": { + "description": "Piekļuve atļauta tikai ar derīgu atļauju vai licenzi" + }, "private": { - "description": "Piekļuve atļauta tikai ar īpašnieka atļauju", + "description": "Piekļuve atļauta tikai ar īpašnieka atļauju uz induviduālas bāzes", "title": "Privāts" }, "yes": { - "description": "Piekļuve atļauta ar likumu", "title": "Atļauts" } }, @@ -856,6 +1052,7 @@ "crane/type": { "label": "Celtņa tips", "options": { + "floor-mounted_crane": "Zemē montēts celtnis", "travel_lift": "Pārnēsājamās piestātnes celtnis" } }, @@ -890,6 +1087,7 @@ "title": "Nav" }, "share_busway": { + "description": "Velosipēdu celiņš kopā ar ar autobusu ceļu", "title": "Velosipēdu celiņš kopā ar publiskā transporta joslu" }, "shared_lane": { @@ -961,6 +1159,12 @@ "both": "Abas / Visas" } }, + "dispensing": { + "label": "Izdod recepšu zāles" + }, + "display": { + "label": "Displejs" + }, "distance": { "label": "Kopējais attālums" }, @@ -1440,6 +1644,7 @@ "piste/difficulty": { "label": "Grūtība", "options": { + "extreme": "Ekstrēms (alpīnistu ekipējums vajadzīgs)", "novice": "Iesācēju (Istruktāžas)" }, "placeholder": "Viegls,Vidējs,Grūts" @@ -1469,6 +1674,9 @@ "playground/min_age": { "label": "Min. Vecums" }, + "population": { + "label": "Populācija" + }, "power": { "label": "Tips" }, @@ -1478,20 +1686,46 @@ "railway": { "label": "Tips" }, + "railway/signal/direction": { + "label": "Virziens", + "options": { + "backward": "Atmuguriski", + "both": "Abas / Visas" + } + }, "recycling_accepts": { "label": "Pieņem" }, + "ref": { + "label": "Atsauces kods" + }, + "ref/isil": { + "label": "ISIL kods" + }, + "ref_aeroway_gate": { + "label": "Vārtu numurs" + }, "ref_golf_hole": { + "label": "Bedrītes Numurs", "placeholder": "1-18" }, + "ref_road_number": { + "label": "Ceļa Numurs" + }, "religion": { "label": "Reliģija" }, + "seasonal": { + "label": "Sezonāls" + }, "second_hand": { + "label": "Pārdod lietotus", "options": { "no": "Nē", + "only": "Tikai", "yes": "Jā" - } + }, + "placeholder": "Jā, Nē, Tikai" }, "service": { "label": "Tips" @@ -1502,9 +1736,31 @@ "shop": { "label": "Tips" }, + "siren/purpose": { + "label": "Nolūks" + }, + "siren/type": { + "label": "Tips", + "options": { + "electronic": "Elektroniska", + "other": "Cits", + "pneumatic": "Pneimatiska" + } + }, "smoking": { + "label": "Smēķēšana", + "options": { + "isolated": "Smēķēšanas vietās, fiziski izolētas", + "no": "Aizliegts visur", + "outside": "Atļauts ārpusē", + "separated": "Smēķēšanas vietās, kas nav fiziski izolētas", + "yes": "Atļauts visur" + }, "placeholder": "Nē, Atdalīti, Jā..." }, + "smoothness": { + "label": "Gludums" + }, "sport": { "label": "Sports" }, @@ -1545,9 +1801,15 @@ "substation": { "label": "Tips" }, + "support": { + "label": "Atbalsts" + }, "surface": { "label": "Segums" }, + "surveillance": { + "label": "Uzraudzības veids" + }, "surveillance/type": { "label": "Uzraudzības tips", "options": { @@ -1579,8 +1841,10 @@ }, "toilets/disposal": { "options": { + "bucket": "Spainis", "chemical": "Ķīmiskā", - "flush": "Ūdens Nolaišanas" + "flush": "Ūdens Nolaišanas", + "pitlatrine": "Bedres/Latrīnas" } }, "toll": { @@ -1635,7 +1899,11 @@ "tourism": "Tūrisma" } }, + "vending": { + "label": "Produktu tipi" + }, "visibility": { + "label": "Redzamība", "options": { "area": "Pāri 20m (65 pēdām)", "house": "Līdz 5m (16 pēdas)", @@ -1688,6 +1956,9 @@ } }, "presets": { + "address": { + "name": "Adrese" + }, "advertising/billboard": { "name": "Reklāmas dēlis" }, @@ -1749,14 +2020,12 @@ "name": "Velo stāvvieta" }, "amenity/bicycle_rental": { - "name": "Velonoma" + "name": "Velonoma", + "terms": "velosipēdu" }, "amenity/bicycle_repair_station": { "name": "Velosipēdu Remonta Darbarīku Stends" }, - "amenity/biergarten": { - "name": "Alus Dārzs" - }, "amenity/boat_rental": { "name": "Laivu īre" }, @@ -1767,7 +2036,8 @@ "name": "Autobusu pietura / Terminālis" }, "amenity/cafe": { - "name": "Kafejnīca" + "name": "Kafejnīca", + "terms": "bistro,krogs,kafija,tēja" }, "amenity/car_rental": { "name": "Autonoma" @@ -1779,76 +2049,112 @@ "name": "Kazino" }, "amenity/charging_station": { - "name": "Uzlādes stacija" + "name": "Uzlādes stacija", + "terms": "Elektriskā,Uzlāde,Elektroauto,Superlāde,Zemsprieguma uzlāde" }, "amenity/childcare": { "name": "Bērnistaba / Bērnu aprūpe" }, "amenity/cinema": { - "name": "Kino" + "name": "Kino", + "terms": "kinoteātris,filmas,izrādes,lielekrāna" }, "amenity/clinic": { - "name": "Klīnika" + "name": "Klīnika", + "terms": "medicīna,neatliekama" }, "amenity/clinic/abortion": { "name": "Aborta klīnika" }, + "amenity/clinic/fertility": { + "name": "Fertilitātes Klīnika" + }, "amenity/clock": { "name": "Pulkstenis" }, + "amenity/community_centre": { + "name": "Kopienas centrs" + }, "amenity/compressed_air": { - "name": "Saspiests Gaiss" + "name": "Saspiests Gaiss", + "terms": "Augstspiediena, Riepu uzpilde" }, "amenity/courthouse": { - "name": "Tiesas nams" + "name": "Tiesas nams", + "terms": "tiesnesis,apgabaltiesa" + }, + "amenity/crematorium": { + "name": "Krematorija", + "terms": "bēres, kapi" }, "amenity/dentist": { - "name": "Zobārsts" + "name": "Zobārsts", + "terms": "zobi, ārsts, higēnists" }, "amenity/doctors": { - "name": "Dakteris" + "name": "Dakteris", + "terms": "ārsts, medicīna" }, "amenity/dojo": { - "name": "Dojo / Karatē apmācība" + "name": "Dojo / Karatē apmācība", + "terms": "karatē, skola" }, "amenity/drinking_water": { "name": "Dzeramūdens" }, "amenity/driving_school": { - "name": "Autoskola" + "name": "Autoskola", + "terms": "braukšana,apmācība" }, "amenity/embassy": { "name": "Vēstniecība" }, "amenity/fast_food": { - "name": "Ātrās ēdināšanas iestāde" + "name": "Ātrās ēdināšanas iestāde", + "terms": "restorāns, līdzņemšana" + }, + "amenity/ferry_terminal": { + "name": "Prāmju stacija / Terminālis" }, "amenity/fire_station": { - "name": "Ugunsdzēsēju stacija" + "name": "Ugunsdzēsēju stacija", + "terms": "pažarnieki, depo" }, "amenity/food_court": { - "name": "Ēdnīca" + "name": "Ēdnīca", + "terms": "restorāns,ātrā uzkoda,ēdiens" }, "amenity/fountain": { "name": "Strūklaka" }, "amenity/fuel": { - "name": "Degvielas uzpildes stacija" + "name": "Degvielas uzpildes stacija", + "terms": "degviela,dīzelis,gāze,98,95,uzpilde" }, "amenity/grave_yard": { "name": "Kapi" }, "amenity/grit_bin": { - "name": "Smilšu tvertne" + "name": "Smilšu tvertne", + "terms": "sāls kaste,smilšu kaste,smiltis,sāls,grants" + }, + "amenity/hunting_stand": { + "name": "Medību stends", + "terms": "ieroču, šaušana, šautuve" }, "amenity/ice_cream": { - "name": "Saldējuma Veikals" + "name": "Saldējuma Veikals", + "terms": "sorbejs, saldēts" }, "amenity/internet_cafe": { "name": "Interneta Kafejnīca" }, + "amenity/kindergarten": { + "terms": "bēŗnudārzs,pirmskola" + }, "amenity/library": { - "name": "Bibliotēka" + "name": "Bibliotēka", + "terms": "grāmatas, lasītava" }, "amenity/marketplace": { "name": "Tirgus" @@ -1857,19 +2163,24 @@ "name": "Motociklu stāvvieta" }, "amenity/music_school": { - "name": "Mūzikas skola" + "name": "Mūzikas skola", + "terms": "dziedāšanas skola, mūzikas instrumenti" }, "amenity/nightclub": { - "name": "Naktsklubs" + "name": "Naktsklubs", + "terms": "klubs,deju klubs,dejošana,nakts klubs" }, "amenity/parking": { - "name": "Auto Stāvveita" + "name": "Auto Stāvveita", + "terms": "stāvvieta,stāvieta,parkošanās, piestātne" }, "amenity/pharmacy": { - "name": "Aptieka" + "name": "Aptieka", + "terms": "medicīnas, recepšu" }, "amenity/place_of_worship": { - "name": "Dievnams" + "name": "Dievnams", + "terms": "baziliks, baznīca, katedrāle, kapella, mošeja, lūgšanas, bazilika" }, "amenity/place_of_worship/buddhist": { "name": "Budistu templis" @@ -1893,16 +2204,23 @@ "name": "Planetārijs" }, "amenity/police": { - "name": "Policija" + "name": "Policija", + "terms": "Iecirknis,Detektīvs,Likums,Kruķi,Poliči" }, "amenity/post_box": { - "name": "Pasta kastīte" + "name": "Pasta kastīte", + "terms": "vēstule, pasts, kaste" }, "amenity/post_office": { - "name": "Pasta nodaļa" + "name": "Pasta nodaļa", + "terms": "vēstule, pasts, paciņa" + }, + "amenity/prison": { + "terms": "cietums,ūķis,aizturēšana,kamera" }, "amenity/pub": { - "name": "Krogs" + "name": "Krogs", + "terms": "alkohols, dzeršana, alus" }, "amenity/public_bookcase": { "name": "Publisks Grāmatplaukts" @@ -1916,12 +2234,23 @@ "amenity/restaurant": { "name": "Restorāns" }, + "amenity/shelter": { + "name": "Pajumte" + }, "amenity/shower": { "name": "Duša" }, "amenity/smoking_area": { "name": "Smēķēšanas vieta" }, + "amenity/social_facility/food_bank": { + "name": "Pārtikas banka", + "terms": "ēdiena nodošana,ēdiena banka" + }, + "amenity/social_facility/group_home": { + "name": "Pansionāts", + "terms": "vecs, seniors, uzraudzība" + }, "amenity/studio": { "name": "Studija" }, @@ -1932,10 +2261,12 @@ "name": "Telefons" }, "amenity/theatre": { - "name": "Teātris" + "name": "Teātris", + "terms": "aktieri,uzstāšanās,uzvedums" }, "amenity/toilets": { - "name": "Tualete" + "name": "Tualete", + "terms": "toalete,labierīcības,pisuārs" }, "amenity/townhall": { "name": "Pilsētas dome" @@ -1944,70 +2275,90 @@ "name": "Tirdzniecības automāts" }, "amenity/vending_machine/cigarettes": { - "name": "Cigarešu Tirdzniecības automāts" + "name": "Cigarešu Tirdzniecības automāts", + "terms": "cigrarete, tabaka" }, "amenity/vending_machine/coffee": { - "name": "Kafijas Tirdzniecības automāts" + "name": "Kafijas Tirdzniecības automāts", + "terms": "kafija, kofeīns, ekspresso" }, "amenity/vending_machine/condoms": { "name": "Prezervatīvu Tirdzniecības automāts" }, "amenity/vending_machine/drinks": { - "name": "Dzērienu Tirdzniecības automāts" + "name": "Dzērienu Tirdzniecības automāts", + "terms": "limonāde, sula, dzēriens" }, "amenity/vending_machine/electronics": { - "name": "Elektronikas Tirdzniecības automāts" + "name": "Elektronikas Tirdzniecības automāts", + "terms": "kabelis, telefons, planšete, dators, austiņas, skaļruņi" }, "amenity/vending_machine/elongated_coin": { - "name": "Plakanu Monētu Tirdzniecības automāts" + "name": "Plakanu Monētu Tirdzniecības automāts", + "terms": "monēta,saspiešana,suvenīri,suvenīrs,saplacināt" }, "amenity/vending_machine/excrement_bags": { - "name": "Suņu Maisiņu Tirdzniecības automāts" + "name": "Suņu Maisiņu Tirdzniecības automāts", + "terms": "dzīvnieku,suņu,ekskrementu maisiņu,kaku maisiņu,sūdu" }, "amenity/vending_machine/feminine_hygiene": { - "name": "Sieviešu Higēnas Tirdzniecības automāts" + "name": "Sieviešu Higēnas Tirdzniecības automāts", + "terms": "tampons, ieliknis, biksīšu, sieivešu, menstruāls, personālā apkope" }, "amenity/vending_machine/food": { - "name": "Ēdiena Tirdzniecības automāts" + "name": "Ēdiena Tirdzniecības automāts", + "terms": "pārtika" }, "amenity/vending_machine/fuel": { - "name": "Degvielas sūknis" + "name": "Degvielas sūknis", + "terms": "degviela,dīzelis,gāze,98,95,uzpilde" }, "amenity/vending_machine/ice_cream": { - "name": "Saldējuma Tirdzniecības automāts" + "name": "Saldējuma Tirdzniecības automāts", + "terms": "šokolādes,vaniļas,sasaldēts,auksts" }, "amenity/vending_machine/news_papers": { "name": "Avīžu Tirdzniecības automāts" }, "amenity/vending_machine/newspapers": { - "name": "Avīžu Tirdzniecības automāts" + "name": "Avīžu Tirdzniecības automāts", + "terms": "avīze,laiksraksts,žurnāls,iespiests" }, "amenity/vending_machine/parcel_pickup_dropoff": { - "name": "Pakomāts" + "name": "Pakomāts", + "terms": "paku,saņemšana,sūtīšana,kurjers" }, "amenity/vending_machine/parking_tickets": { - "name": "Stāvvietu Atļauju Tirdzniecības automāts" + "name": "Stāvvietu Atļauju Tirdzniecības automāts", + "terms": "biļete, atļauja" }, "amenity/vending_machine/public_transport_tickets": { - "name": "Tranzītbiļešu Tirdzniecības automāts" + "name": "Tranzītbiļešu Tirdzniecības automāts", + "terms": "autobuss, vilciens, e-talons, transports, biļete, tranvajs, trolejbuss, prāmis, etalons" }, "amenity/vending_machine/stamps": { - "name": "Pastmarku Tirdzniecības automāts" + "name": "Pastmarku Tirdzniecības automāts", + "terms": "pasts, marka, vēstule" }, "amenity/vending_machine/sweets": { - "name": "Saldumu Tirdzniecības automāts" + "name": "Saldumu Tirdzniecības automāts", + "terms": "šokolādes,saldumu,konfekšu,cepumu,batoniņu" }, "amenity/veterinary": { - "name": "Veternārārsts" + "name": "Veternārārsts", + "terms": "klīnika,veterniārā,dzīvienku,veterinārais ārsts" }, "amenity/waste/dog_excrement": { - "name": "Suņu ekskrementu tvertne" + "name": "Suņu ekskrementu tvertne", + "terms": "tvertne,kaste,suņu,kaku,maisiņu,atkritumu" }, "amenity/waste_basket": { - "name": "Atkritumu grozs" + "name": "Atkritumu grozs", + "terms": "miskaste,papīrgrozs,izmestuve,atkritumi" }, "amenity/waste_disposal": { - "name": "Atkritumu konteiners" + "name": "Atkritumu konteiners", + "terms": "miskaste,atkritumi,izgāztuve,tvertne" }, "area": { "name": "Apgabals" @@ -2016,10 +2367,20 @@ "name": "Ceļa segums" }, "attraction/animal": { - "name": "Dzīvnieku" + "name": "Dzīvnieku", + "terms": "zoo, dzīvnieku parks, lauva, tīģeris, žirafe, lācis" + }, + "attraction/big_wheel": { + "name": "Panorāmas rats", + "terms": "rats,atrakcija,bruciens,lielais rats" + }, + "attraction/bungee_jumping": { + "name": "Gumijlēkšana", + "terms": "gumija,augstums,lekšana,lekšanas platforma" }, "attraction/carousel": { - "name": "Karuseļu" + "name": "Karuseļu", + "terms": "Atrakciju,zirgu" }, "attraction/maze": { "name": "Labirints" @@ -2028,22 +2389,31 @@ "name": "Pirātu kuģis" }, "attraction/roller_coaster": { - "name": "Amerikāņu Kalniņi" + "name": "Amerikāņu Kalniņi", + "terms": "atrakcija,brauciens,ātrs" }, "attraction/train": { - "name": "Tūristu vilcieniņš" + "name": "Tūristu vilcieniņš", + "terms": "apskates vilciens,apbrauciena,parka vilciens" }, "attraction/water_slide": { - "name": "Ūdens Slidkalniņš" + "name": "Ūdens Slidkalniņš", + "terms": "ūdens parks,ūdens atrakcija" }, "barrier": { "name": "Barjera" }, "barrier/block": { - "name": "Ēkas daļa" + "name": "Bloks", + "terms": "klucis, gabals" }, "barrier/bollard": { - "name": "Stabs" + "name": "Stabs", + "terms": "stabi,stabiņi" + }, + "barrier/border_control": { + "name": "Robežu Kontrole", + "terms": "pārbaude, kontroles punkts, pases, ieeja, robežkontrole" }, "barrier/city_wall": { "name": "Pilsētas mūri" @@ -2051,6 +2421,10 @@ "barrier/cycle_barrier": { "name": "Veloceliņa barjera" }, + "barrier/ditch": { + "name": "Tranšeja", + "terms": "trenča, bedre" + }, "barrier/entrance": { "name": "Ieeja" }, @@ -2058,16 +2432,19 @@ "name": "Žogs" }, "barrier/gate": { - "name": "Vārti" + "name": "Vārti", + "terms": "žogs" }, "barrier/hedge": { "name": "Krūmi" }, "barrier/kissing_gate": { - "name": "Dubultveramie vārti" + "name": "Dubultveramie vārti", + "terms": "dubultie,abpusējie,dubultvārti" }, "barrier/lift_gate": { - "name": "Lifta ieeja" + "name": "Lifta ieeja", + "terms": "paceļamie,bomja,bomis" }, "barrier/retaining_wall": { "name": "Stiprinājuma siena" @@ -2079,17 +2456,22 @@ "name": "Siena" }, "boundary/administrative": { - "name": "Administratīvā robeža" + "name": "Administratīvā robeža", + "terms": "robeža,novadu robeža,administratīvā teritorija" }, "building": { "name": "Ēka" }, "building/apartments": { - "name": "Dzīvokļi" + "name": "Dzīvokļi", + "terms": "daudzstāvu māja" }, "building/barn": { "name": "Klēts" }, + "building/boathouse": { + "name": "Laivu ēka" + }, "building/bunker": { "name": "Bunkurs" }, @@ -2105,12 +2487,18 @@ "building/church": { "name": "Baznīcas Ēka" }, + "building/commercial": { + "name": "Komerciāla Ēka" + }, "building/dormitory": { "name": "Kopmītnes" }, "building/entrance": { "name": "Ieeja/Izeja" }, + "building/farm_auxiliary": { + "name": "Fermas Ēka" + }, "building/garage": { "name": "Garāža" }, @@ -2121,7 +2509,8 @@ "name": "Tribīnes" }, "building/greenhouse": { - "name": "Siltumnīca" + "name": "Siltumnīca", + "terms": "augi, stikls" }, "building/hospital": { "name": "Slīmnīcas Ēka" @@ -2135,6 +2524,12 @@ "building/industrial": { "name": "Industijas Ēka" }, + "building/kindergarten": { + "name": "Bērnudārza / Pirmskolas ēka" + }, + "building/mosque": { + "name": "Mošejas Ēka" + }, "building/public": { "name": "Publiska Ēka" }, @@ -2151,17 +2546,27 @@ "name": "Ēkas drupas" }, "building/school": { - "name": "Skolas Ēka" + "name": "Skolas Ēka", + "terms": "sākumskola,pamatskola,vidusskola,augstskola,koledža" }, "building/shed": { "name": "Sķūnis" }, "building/stable": { - "name": "Stallis" + "name": "Stallis", + "terms": "zirgu, zirgi, stallis" }, "building/stadium": { "name": "Stadiona Ēka" }, + "building/temple": { + "name": "Tempļa Ēka", + "terms": "templis,reliģija,piemiņa" + }, + "building/terrace": { + "name": "Rindumājas", + "terms": "rindu mājas,mājas" + }, "building/train_station": { "name": "Vilcienu Stacija" }, @@ -2171,30 +2576,49 @@ "building/warehouse": { "name": "Noliktava" }, + "club": { + "name": "Klubs" + }, "craft/basket_maker": { "name": "Grozu veidotājs" }, "craft/beekeeper": { - "name": "Biškopis" + "name": "Biškopis", + "terms": "Bišu kopējs" + }, + "craft/blacksmith": { + "name": "Kalējs", + "terms": "metālkalis,kalis" }, "craft/boatbuilder": { - "name": "Laivu būvētājs" + "name": "Laivu būvētājs", + "terms": "laivenieks,piķotājs" }, "craft/brewery": { - "name": "Darītava" + "name": "Darītava", + "terms": "alkohols,alus,sidrs" + }, + "craft/carpenter": { + "name": "Galdnieks" }, "craft/chimney_sweeper": { - "name": "Skursteņslauķis" + "name": "Skursteņslauķis", + "terms": "Skursteņu slaucītājs" }, "craft/clockmaker": { - "name": "Pulksteņdaris" + "name": "Pulksteņdaris", + "terms": "Pulksteņmeistars" }, "craft/confectionery": { - "name": "Saldumu veidotājs" + "name": "Saldumu veidotājs", + "terms": "Saldumi,Konfektes,Konfekcionārs" }, "craft/electrician": { "name": "Elektriķis" }, + "craft/electronics_repair": { + "name": "Elektronikas remonta darbnīca" + }, "craft/gardener": { "name": "Dārznieks" }, @@ -2214,10 +2638,12 @@ "name": "Krāsotājs" }, "craft/photographer": { - "name": "Fotogrāfs" + "name": "Fotogrāfs", + "terms": "fotogrāfēt" }, "craft/photographic_laboratory": { - "name": "Fotolabratorija" + "name": "Fotolabratorija", + "terms": "attēlu attīstīšana,filmas,filmiņas,3.5mm" }, "craft/plumber": { "name": "Santehniķis" @@ -2237,6 +2663,16 @@ "craft/shoemaker": { "name": "Kurpnieks" }, + "craft/window_construction": { + "name": "Logu izgatavošana" + }, + "craft/winery": { + "name": "Vīna darītava" + }, + "emergency/ambulance_station": { + "name": "Ātrās palīdzības stacija", + "terms": "ambulances stacija,ātrā palīdzība" + }, "emergency/defibrillator": { "name": "Defibrilators" }, @@ -2246,6 +2682,13 @@ "emergency/fire_hydrant": { "name": "Ugunsdzēsības Hidrants" }, + "emergency/first_aid_kit": { + "name": "Pirmās palīdzības aptieciņa", + "terms": "aptieciņa,kompleks,medicīnas,ārkārtas" + }, + "emergency/life_ring": { + "name": "Glābšanas Rinķis" + }, "emergency/lifeguard": { "name": "Glābējs" }, @@ -2259,17 +2702,36 @@ "name": "Ieeja/Izeja" }, "footway/crosswalk": { - "name": "Gājēju Pāreja" + "name": "Gājēju Pāreja", + "terms": "pāreja,zebra" + }, + "footway/crosswalk-raised": { + "name": "Pacelta gājēju pāreja" + }, + "golf/hole": { + "name": "Golfa bedrīte" + }, + "healthcare/birthing_center": { + "name": "Dzemdību nams" }, "healthcare/blood_donation": { "name": "Asinsdonoru Centrs" }, + "healthcare/laboratory": { + "name": "Medicīnas Labrotorija" + }, "healthcare/optometrist": { "name": "Optometrists" }, + "healthcare/speech_therapist": { + "name": "Runas Terapiets" + }, "highway": { "name": "Šoseja" }, + "highway/corridor": { + "name": "Iekštelpu koridors" + }, "highway/crosswalk": { "name": "Gājēju Pāreja" }, @@ -2360,6 +2822,10 @@ "landuse/cemetery": { "name": "Kapsēta" }, + "landuse/commercial": { + "name": "Komercplatība", + "terms": "Komerciāla platība, Komercapgabals" + }, "landuse/construction": { "name": "Būvlaukums" }, @@ -2369,24 +2835,48 @@ "landuse/forest": { "name": "Mežs" }, + "landuse/garages": { + "name": "Garāžu zeme" + }, "landuse/grass": { "name": "Zāle" }, "landuse/harbour": { "name": "Osta" }, + "landuse/industrial/slaughterhouse": { + "name": "Kautuve" + }, + "landuse/landfill": { + "name": "Izgāztuve" + }, "landuse/meadow": { "name": "Pļava" }, "landuse/military": { "name": "Militārā zona" }, + "landuse/military/airfield": { + "name": "Militārais Lidlauks" + }, + "landuse/military/barracks": { + "name": "Kazarmas" + }, + "landuse/military/bunker": { + "name": "Militārais Bunkurs" + }, + "landuse/military/naval_base": { + "name": "Ūdensspēku bāze" + }, "landuse/military/nuclear_explosion_site": { "name": "Atomsprādziena zona" }, "landuse/quarry": { "name": "Karjers" }, + "landuse/residential": { + "name": "Dzīvojamā zona" + }, "landuse/vineyard": { "name": "Vīnogu lauks" }, @@ -2396,18 +2886,46 @@ "leisure/bowling_alley": { "name": "Boulinga Zāle" }, + "leisure/dance": { + "name": "Deju zāle" + }, + "leisure/dancing_school": { + "name": "Deju skola", + "terms": "valsis,tango,deju apmācības,dejošana,svings" + }, "leisure/dog_park": { "name": "Suņu parks" }, + "leisure/firepit": { + "name": "Ugunskura vieta" + }, + "leisure/fitness_centre": { + "name": "Sportazāle / Fitnesa centrs" + }, + "leisure/fitness_centre/yoga": { + "name": "Jogas studija" + }, + "leisure/fitness_station": { + "name": "Brīvdabas fitnesa vieta" + }, "leisure/garden": { "name": "Dārzs" }, "leisure/golf_course": { "name": "Golfa laukums" }, + "leisure/horse_riding": { + "name": "Zirgu jāšanas vieta" + }, + "leisure/ice_rink": { + "name": "Ledus halle" + }, "leisure/park": { "name": "Parks" }, + "leisure/picnic_table": { + "name": "Piknika galds" + }, "leisure/pitch": { "name": "Sporta laukums" }, @@ -2420,12 +2938,27 @@ "leisure/pitch/basketball": { "name": "Basketbola laukums" }, + "leisure/pitch/beachvolleyball": { + "name": "Plūdmales volejbola laukums" + }, + "leisure/pitch/skateboard": { + "name": "Skrituļparks", + "terms": "skootei, skrituļdēļi, skrituļslidas, rampas" + }, "leisure/pitch/soccer": { - "name": "Futbola laukums" + "name": "Futbola laukums", + "terms": "Futbols" + }, + "leisure/pitch/table_tennis": { + "name": "Pingponga galds", + "terms": "galda teniss, pingpongs" }, "leisure/pitch/tennis": { "name": "Tenisa korti" }, + "leisure/pitch/volleyball": { + "name": "Volejbola laukums" + }, "leisure/playground": { "name": "Spēļlaukums" }, @@ -2462,12 +2995,29 @@ "man_made/crane": { "name": "Celtnis" }, + "man_made/flagpole": { + "name": "Karogmasts", + "terms": "karogs,masts" + }, "man_made/lighthouse": { "name": "Bāka" }, "man_made/mast": { "name": "Masts" }, + "man_made/observatory": { + "name": "Observatorija" + }, + "man_made/petroleum_well": { + "name": "Naftas Raktuve" + }, + "man_made/pipeline": { + "name": "Caurule", + "terms": "truba" + }, + "man_made/pumping_station": { + "name": "Pumpētava" + }, "man_made/surveillance": { "name": "Apsardze" }, @@ -2486,21 +3036,40 @@ "man_made/water_tower": { "name": "Ūdenstornis" }, + "man_made/water_well": { + "name": "Ūdens aka", + "terms": "aka,dzeramūdens" + }, + "man_made/watermill": { + "name": "Ūdens Dzirnavas" + }, "man_made/windmill": { "name": "Vējdzirnavas" }, "man_made/works": { "name": "Rūpnīca" }, + "manhole": { + "name": "Kanalizācijas lūka" + }, + "manhole/telecom": { + "name": "Telekomunikāciju lūka" + }, "natural": { "name": "Dabisks" }, + "natural/bare_rock": { + "name": "Pliks Akmens" + }, "natural/bay": { "name": "Līcis" }, "natural/beach": { "name": "Pludmale" }, + "natural/cave_entrance": { + "name": "Alas Ieeja" + }, "natural/cliff": { "name": "Klints" }, @@ -2516,9 +3085,15 @@ "natural/heath": { "name": "Siltums" }, + "natural/mud": { + "name": "Dubļi" + }, "natural/peak": { "name": "Virsotne" }, + "natural/reef": { + "name": "Rifs" + }, "natural/sand": { "name": "Smiltis" }, @@ -2526,7 +3101,8 @@ "name": "Avots" }, "natural/tree": { - "name": "Koks" + "name": "Koks", + "terms": "koki" }, "natural/tree_row": { "name": "Koku rinda" @@ -2552,18 +3128,45 @@ "natural/wood": { "name": "Koks" }, + "noexit/yes": { + "name": "Bez izejas" + }, "office": { "name": "Biroju ēka" }, + "office/adoption_agency": { + "name": "Adopcijas Aģentūra" + }, + "office/architect": { + "name": "Arhitekta birojs" + }, "office/educational_institution": { "name": "Izglītības Iestāde" }, + "office/energy_supplier": { + "name": "Elektrodevēja birojs" + }, + "office/forestry": { + "name": "Mežniecības birojs" + }, + "office/government": { + "name": "Valdības birojs" + }, + "office/government/tax": { + "name": "Ieņēmumu birojs" + }, + "office/insurance": { + "name": "Apdrošināšanas birojs" + }, "office/lawyer/notary": { "name": "Notāru birojs" }, "office/notary": { "name": "Notāru birojs" }, + "office/private_investigator": { + "name": "Privātizmeklētēja birojs" + }, "office/telecommunication": { "name": "Telekomunikāciju birojs" }, @@ -2594,12 +3197,19 @@ "playground/sandpit": { "name": "Smilšukaste" }, + "playground/slide": { + "name": "Slidkalniņš" + }, "playground/swing": { "name": "Šūpoles" }, "power": { "name": "Enerģija" }, + "power/generator": { + "name": "Elektroenerģijas ģenerātors", + "terms": "elektroģenrātors,turbīna,vējs" + }, "power/generator/source_nuclear": { "name": "Atomreaktors" }, @@ -2609,6 +3219,10 @@ "power/line": { "name": "Elektrolīnija" }, + "power/pole": { + "name": "Elektrības stabs", + "terms": "elektrostabs" + }, "power/sub_station": { "name": "Metro stacija" }, @@ -2624,6 +3238,42 @@ "public_transport/linear_platform_bus": { "name": "Autobusu pietura / platforma" }, + "public_transport/linear_platform_ferry": { + "name": "Prāmja pietura / Platforma" + }, + "public_transport/linear_platform_subway": { + "name": "Metro pietura / platforma" + }, + "public_transport/linear_platform_train": { + "name": "Vilciena Pietura / Platforma" + }, + "public_transport/linear_platform_trolleybus": { + "name": "Trolejbusu pietura / platforma" + }, + "public_transport/platform_bus": { + "name": "Autobusu pietura / platforma" + }, + "public_transport/platform_ferry": { + "name": "Prāmja pietura / Platforma" + }, + "public_transport/platform_subway": { + "name": "Metro pietura / platforma" + }, + "public_transport/platform_train": { + "name": "Vilciena Pietura / Platforma" + }, + "public_transport/platform_trolleybus": { + "name": "Trolejbusu pietura / platforma" + }, + "public_transport/station_bus": { + "name": "Autobusu stacija / Terminālis" + }, + "public_transport/station_train": { + "name": "Stacija" + }, + "public_transport/station_trolleybus": { + "name": "Trolejbusu stacija / Terminālis" + }, "railway": { "name": "Vilciens" }, @@ -2633,38 +3283,81 @@ "railway/disused": { "name": "Nelietots dzelzceļš" }, + "railway/miniature": { + "name": "Miniātura dzelzceļš" + }, "railway/monorail": { "name": "Viensliežu vilciens" }, + "railway/narrow_gauge": { + "name": "Šaursliežu dzelzceļš" + }, "railway/rail": { "name": "Sliedes" }, + "railway/station": { + "name": "Vilcienu Stacija" + }, "railway/subway": { "name": "Metro" }, "railway/subway_entrance": { "name": "Metro ieeja" }, + "railway/switch": { + "name": "Pārmiju pārslēgšana", + "terms": "pārmijas" + }, + "railway/train_wash": { + "name": "Vilcienu mazgātuve" + }, "railway/tram": { "name": "Tramvajs" }, + "relation": { + "name": "Relācija" + }, + "roundabout": { + "name": "Aplis" + }, "shop": { "name": "Veikals" }, "shop/alcohol": { "name": "Alkoholisko dzērienu veikals" }, + "shop/antiques": { + "name": "Antikvariāts" + }, + "shop/art": { + "name": "Mākslas veikals" + }, + "shop/bag": { + "name": "Somu / Čemodānu veikals" + }, "shop/bakery": { "name": "Konditoreja" }, "shop/beauty": { "name": "Skaistumveikals" }, + "shop/beauty/nails": { + "name": "Manikīra/Nagu salons" + }, + "shop/beauty/tanning": { + "name": "Solārija Salons", + "terms": "Solārija, Solārijs" + }, + "shop/bed": { + "name": "Gultasveļas / Matraču veikals", + "terms": "gultas preces, gulta" + }, "shop/beverages": { "name": "Dzērienu veikals" }, "shop/bicycle": { - "name": "Velo veikals" + "name": "Velo veikals", + "terms": "velosipēdu, remonts, remonta" }, "shop/books": { "name": "Grāmatu veikals" @@ -2679,13 +3372,15 @@ "name": "Sveču veikals" }, "shop/car": { - "name": "Auto dīleris" + "name": "Auto dīleris", + "terms": "auto, mašīnu, pārdošana" }, "shop/car_parts": { "name": "Auto rezerves daļu veikals" }, "shop/car_repair": { - "name": "Auto remontdarbnīca" + "name": "Auto remontdarbnīca", + "terms": "remonts, serviss, garāža" }, "shop/carpet": { "name": "Paklāju veikals" @@ -2702,8 +3397,12 @@ "shop/clothes": { "name": "Apģērba veikals" }, + "shop/coffee": { + "name": "Kafijas veikals" + }, "shop/computer": { - "name": "Datorveikals" + "name": "Datorveikals", + "terms": "elektronika, datori, datortehnika" }, "shop/confectionery": { "name": "Saldumu veikals" @@ -2714,9 +3413,19 @@ "shop/copyshop": { "name": "Printēšanas veikals" }, + "shop/cosmetics": { + "name": "Kosmētikas veikals" + }, + "shop/craft": { + "name": "Mākslas piederumu veikals", + "terms": "māksla, resursi, krāsas, rāmji, zīmēt" + }, "shop/curtain": { "name": "Aizkaru veikals" }, + "shop/dairy": { + "name": "Piena veikals" + }, "shop/deli": { "name": "Delikateses" }, @@ -2726,9 +3435,15 @@ "shop/dry_cleaning": { "name": "Ķīmiskā tīrītava" }, + "shop/e-cigarette": { + "name": "E-Cigarešu veikals" + }, "shop/electronics": { "name": "Elektronikas veikals" }, + "shop/erotic": { + "name": "Erotiskais veikals" + }, "shop/fabric": { "name": "Audumu veikals" }, @@ -2738,12 +3453,19 @@ "shop/florist": { "name": "Florists" }, + "shop/funeral_directors": { + "name": "Apbedīšanas birojs" + }, "shop/furniture": { "name": "Mēbeļu veikals" }, "shop/garden_centre": { "name": "Dārzkopības veikals" }, + "shop/gas": { + "name": "Gāzes balonu veikals", + "terms": "lpg,propāns,balons,uzpilde,gāze" + }, "shop/gift": { "name": "Dāvanu veikals" }, @@ -2759,9 +3481,15 @@ "shop/kiosk": { "name": "Kiosks" }, + "shop/kitchen": { + "name": "Virtuves dizaina veikals" + }, "shop/laundry": { "name": "Veļas mazgātuve" }, + "shop/leather": { + "name": "Ādas veikals" + }, "shop/locksmith": { "name": "Atslēdznieks" }, @@ -2771,15 +3499,33 @@ "shop/mall": { "name": "Iepirkšanās centrs" }, + "shop/massage": { + "name": "Masāžu veikals" + }, + "shop/medical_supply": { + "name": "Medicīnisko piederumu veikals" + }, "shop/mobile_phone": { "name": "Mobilo telefonu veikals" }, + "shop/money_lender": { + "name": "Naudas Aizdevējs" + }, "shop/motorcycle": { "name": "Motociklu veikals" }, + "shop/motorcycle_repair": { + "name": "Motociklu remonta darbnīca" + }, "shop/music": { "name": "Mūzikas veikals" }, + "shop/musical_instrument": { + "name": "Mūzikas instrumentu veikals" + }, + "shop/newsagent": { + "name": "Avīžu / Žurnālu veikals" + }, "shop/optician": { "name": "Optometrists" }, @@ -2792,6 +3538,12 @@ "shop/pet": { "name": "Dzīvnieku veikals" }, + "shop/photo": { + "name": "Fotogrāfijas veikals" + }, + "shop/radiotechnics": { + "name": "Radio / Elektronisko komponenšu veikals" + }, "shop/shoes": { "name": "Apavu veikals" }, @@ -2807,9 +3559,18 @@ "shop/tattoo": { "name": "Tetovējumu veikals" }, + "shop/tea": { + "name": "Tējas veikals" + }, "shop/ticket": { "name": "Biļešu kase" }, + "shop/tiles": { + "name": "Flīžu veikals" + }, + "shop/tobacco": { + "name": "Tabakas veikals" + }, "shop/toys": { "name": "Rotaļlietu veikals" }, @@ -2831,6 +3592,16 @@ "shop/watches": { "name": "Pulksteņu Veikals" }, + "shop/weapons": { + "name": "Ieroču Veikals" + }, + "shop/window_blind": { + "name": "Logu žalūziju veikals", + "terms": "logi, aizkari, žalūzijas" + }, + "shop/wine": { + "name": "Vīna veikals" + }, "tourism": { "name": "Tūrisms" }, @@ -2886,7 +3657,8 @@ "name": "Skatu punkts" }, "tourism/zoo": { - "name": "Zooloģiskais dārzs" + "name": "Zooloģiskais dārzs", + "terms": "zoodārzs,zoo,dzīvnieku dārzs,dzīvnieki" }, "traffic_calming/bump": { "name": "Guļošais Policists" @@ -2894,6 +3666,9 @@ "traffic_calming/hump": { "name": "Guļošais Policists" }, + "traffic_calming/island": { + "name": "Ceļa saliņa" + }, "type/boundary": { "name": "Robeža" }, @@ -2976,6 +3751,7 @@ "attribution": { "text": "Noteikumi un atsauksmes" }, + "description": "DigitalGlobe-Standard ir kārtota attēlu grupa, kas aptver aptuveni 86% no visas pasaules ar 30-60 cm izsķirtspēju, kur tas ir iespējams. Fona aizpildījumu nodrošina Landsat. Vidējais vecums ir 2.31 gadi, lai gan dažas vietas tiek atjauninātas 2 reizes gadā. ", "name": "DigitalGlobe Standarta Attēli" }, "DigitalGlobe-Standard-vintage": { @@ -3150,6 +3926,27 @@ }, "name": "Pārgājiens un Velo" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi sniegamotociklu takas no OSM (Nordisks pārklājums)", + "name": "Nordisko sniega motociklu pārklājums" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Zviedru ortofoto mozaīka no 1955-1965. gadu perioda. Vecāki un jaunāki attēli var būt redzami.", + "name": "Lantmäteriet Vēsturiskie Ortofoto 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Zviedru ortofoto mozaīka no 1970-1980. gadu perioda. Vēl tiek pielabots.", + "name": "Lantmäteriet Vēsturiskie Ortofoto 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Noteikumi un atsauksmes" @@ -3186,8 +3983,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Skenējums no ´Economic maps´ ca 1950-1980", - "name": "Lantmäteriet Ekonomiskā karte (vēsturiska)" + "description": "Skenējums no \"Economic maps\" ca 1950–1980", + "name": "Lantmäteriet Ekonomiskā karte 1950-1980" }, "qa_no_address": { "attribution": { @@ -3201,6 +3998,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Sniega motociklu takas", + "name": "Sniega motociklu karte Zviedrijā" + }, "stamen-terrain-background": { "attribution": { "text": "Kartes kvadrāti no Stamen Design, zem CC BY 3.0. Dati no OpenStreetMap, zem ODbL" @@ -3263,6 +4067,14 @@ } }, "community": { + "bw-facebook": { + "name": "Kartējam Botsvanu Facebookā", + "description": "OpenStreetMap Botsvana lapa" + }, + "bw-twitter": { + "name": "Kartējam Botsvanu Twitteris", + "description": "Twitteris priekš OpenStreetMap Botswanā" + }, "cape-coast-youthmappers": { "name": "Cape Coasta universitātes YouthMappers", "description": "Seko mums Twitterī: {url}" @@ -3602,7 +4414,8 @@ "description": "Talk-de ir Oficiāls E-Pasta saraksts Vācijas OSM kopienai" }, "de-ostwestfalen-lippe-mailinglist": { - "name": "OWL e-pasta saraksts" + "name": "OWL e-pasta saraksts", + "description": "Šis ir e-pasta saraksts Ostwestfalen-Lippe OSM kopienai" }, "de-telegram": { "name": "OpenStreetMap Vācijas Telegram", @@ -3624,6 +4437,18 @@ "name": "OpenStreetMap Ungārijas saiets", "description": "Platforma saietu organizēšanai Ungārijā" }, + "is-facebook": { + "name": "OSM Islande Facebookā", + "description": "OpenStreetMap Islandes lapa" + }, + "is-mailinglist": { + "name": "Talk-is E-pasta saraksts", + "description": "Talk-is ir oficiāls E-Pasta saraksts Islandiešu OSM kopienai." + }, + "is-twitter": { + "name": "OSM Islande Twitterī", + "description": "Twitteris priekš OpenStreetMap Islandē" + }, "it-facebook": { "name": "OpenStreetMap Itālijas Facebooks ", "description": "Pievinojies OpenStreetMap Itālijas kopienai Facebookā" @@ -3646,7 +4471,8 @@ }, "OSM-Rome-meetup": { "name": "Incontro Mappatori Romani", - "description": "Uzlabo OpenStreetMap Romas apkārtnē" + "description": "Uzlabo OpenStreetMap Romas apkārtnē", + "extendedDescription": "Mēs mērķējam būt resurss kur cilvēki var diskutēt un dalīties ar zināšanām par brīvu ģeogrāfisku datu izmantošanu, itsevišķi OpenStreetMap un Atvērtu ģeotelpisko programmatūru, kas uztur rediģējumus un parāda ģeogrāfiskos datus. Mēs stipri atbalstam to izmantošanu Lazio." }, "South-Tyrol-Mailing-List": { "name": "OpenStreetMap Dienvidtiroles e-pasta saraksts", @@ -3721,10 +4547,19 @@ "name": "OpenStreetMap Zviedrija Twitterī", "description": "Seko mums Twitterī: {url}" }, + "Nottingham-OSM-pub-meetup": { + "name": "Austrummidlendas (Notingemas) Ikmēneša bāra saiets", + "description": "Sociālais saiets priekš Austrummidlendas  kartētājiem un lietotājiem" + }, "gb-mailinglist": { "name": "Talk-gb E-pasta saraksts" }, + "mappa-mercia-group": { + "name": "Mappa Mercia vietējā grupa", + "description": "Mājas OpenStreetMap entuziastiem Midlendā" + }, "gb-irc": { + "name": "OpenStreetMap Apvienotās Karalistes IRC", "description": "Pievienojies #osm-gb kanālam irc.oftc.net serverī (6667 ports)", "extendedDescription": "Pievienojies #osm-gb kanālam irc.oftc.net serverī (6667 ports), Lūdzu esi pacietīgs un pagaidi pāris minūtes pirms uzdod jautājumu" }, @@ -3740,9 +4575,35 @@ "name": "OSM Kubas Telegram", "description": "OpenStreetMap Kubas Telegram čats" }, + "OSM-NI-telegram": { + "name": "OSM Nikaragva Telegrammā", + "description": "OpenStreetMap Nikaragvas Telegram čats" + }, + "Bay-Area-OpenStreetMappers": { + "name": "Līča rajona OpenStreetMappers", + "description": "Uzlabo OpenStreetMap Sanfrancisko līča rajonā." + }, "Central-Pennsylvania-OSM": { "name": "Centrālās Pensilvānijas OSM" }, + "Code-for-San-Jose-Slack": { + "name": "Kods priekš Sanhosē Slack", + "description": "Visi ir laipni aicināti! Piesakies {signupUrl}, tad pievienojies #osm kanālam." + }, + "GeoPhilly": { + "name": "GeoPhilly", + "description": "Saiets karšu entuziastiem Filadelfijas apkārtnē", + "extendedDescription": "GeoPhilly apvieno izstrādātājus, ģeogrāfus, datu nūģus, atvērtā pirmkoda entuziastus, civilos hakerus un karšu atkarīgos kopējā karšu mīlestībā un to izteiktajiem stāstiem. Ja tu izmanto kartes savā darbā, vai vienkārši gribi uzzināt vairāk, tad šis saiets ir priekš tevis! Mūsu pasākumu mērķis ir būt atvērtiem, draudzīgiem, izglītojošiem un sociāliem, un tie iet no laimīgām stundām līdz ātrām runām un pat darbnīcām. Nāc un izveido diversu, iedvesmojošu kopienu Filadelfijā kopā ar mums!" + }, + "MapMinnesota": { + "name": "MapMinesota", + "description": "Kartētāji un OpenStreetMap lietotāji Mineapolisas—Sentpolas apkārtnē", + "extendedDescription": "Savieno OpenStreetMap entuziastus Minesotā un Mineapolisā—Sentpolā." + }, + "Mapping-DC-meetup": { + "name": "Kartēšana DC", + "description": "Uzlabo OpenStreetMap Vašingtonas apkārtnē" + }, "Maptime-ME-meetup": { "name": "MaptimeME" }, diff --git a/dist/locales/mg.json b/dist/locales/mg.json index ffd1e454d..c023b3b8c 100644 --- a/dist/locales/mg.json +++ b/dist/locales/mg.json @@ -69,6 +69,9 @@ "cancel_draw": { "annotation": "Nanafoana ny fanoritana." }, + "change_tags": { + "annotation": "Nanova ny tags." + }, "circularize": { "title": "Hanaboribory.", "description": { @@ -437,6 +440,7 @@ "all_fields": "Ny saha rehetra", "all_tags": "Ny tags rehetra", "all_members": "Ny mpikambana rehetra", + "all_relations": "Ny relations rehetra", "role": "Anjara asa", "choose": "Safidio ny karazan'ny singa", "results": "Vokatra {n} hoan'ny {search}", @@ -469,15 +473,13 @@ }, "background": { "title": "Lafika", - "description": "Fikirana ny lafika", + "description": "Fikiràna ny lafika", "key": "B", "backgrounds": "Lafika", "none": "Tsy misy", "best_imagery": "Ny loharanon-tsary tsara indrindra fantatra hoan'ity toerana ity", "switch": "Hiverina amin'ity lafika ity", "custom": "Manokana", - "custom_button": "Hanova ny sosona manokana", - "custom_prompt": "Ampidiro ny modelin'ny URL. Ny famantarana azo ampiasaina dia:\n - {zoom} or {z}, {x}, {y} hoan'ny tetika Z/X/Y an'ny kapila\n - {-y} or {ty} hoan'ny coordonnées Y endrika TMS mivadika\n - {u} hoan'ny tetika quadtile\n - {switch:a,b,c} hoan'ny DNS server multiplexing\n\nOhatra:\n{example}", "overlays": "Rakotra", "imagery_source_faq": "Fanazavana Momba ny Sary / Hampita Olana", "reset": "Hamerina amin'ny voalohany", @@ -614,7 +616,7 @@ } }, "success": { - "just_edited": "Efa nanova an'i OpenStreetMap izay!", + "just_edited": "Efa nanova an'i OpenStreetMap ianao izay!", "thank_you": "Misaotra anao manatsara ny sarintany.", "thank_you_location": "Misaotra anao manatsara ny sarintany manodidina an'i {where}.", "help_html": "Tokony hiseho ao amin'ny OpenStreetMap ny fanovana nataonao ao anatin'ny minitra vitsivitsy. Mety ho elaela kosa ny sarintany any amin'ny toeran-kafa vao miova.", @@ -669,19 +671,18 @@ }, "cannot_zoom": "Tsy afaka manalavitra noho izao intsony amin'ity maody ity.", "full_screen": "Hameno ny Efijery", - "gpx": { - "local_layer": "Hanampy GPX", - "zoom": "Hanangeza araky ny sosona" - }, - "mvt": { - "zoom": "Hanangeza araky ny sosona" - }, "note": { "note": "Fanamarihana", "title": "Hanova ny fanamarihana", "anonymous": "olon-tsy fantatra", "closed": "(Mikatona)", "commentTitle": "Fanehoan-kevitra", + "status": { + "opened": "voasokatra {when}", + "reopened": "voasokatra indray {when}", + "commented": "voatsikera {when}", + "closed": "voakatona {when}" + }, "newComment": "Fanehoan-kevitra Vaovao", "inputPlaceholder": "Mampidira fanehoan-kevitra hozaraina amin'ny mpampiasa hafa.", "close": "Hanakatona ny fanamarihana", @@ -708,6 +709,7 @@ "before_start_h": "Alohan'ny hanombohanao", "before_start": "Tokony ho efa mifankazatra ny OpenStreetMap sy ity éditeur ity ianao mialohan'ny hanaovanao fanovana. Misy fanoroana atolotr'i iD hampianarana anao ny fototra amin'ny fanovana an'i OpenStreetMap. Tsindrio eo amin'ny \"Hanomboka ny Fanoroana\" eto amin'ity efijery ity raha hanomboka hianatra - 15 minitra eo ho eo fotsiny ny halavan'ilay izy.", "open_source_h": "Hanokatra Loharano", + "open_source": "Ny éditeur iD dia tetikasa ifarimbonana manana kaody misokatra, ary ny fivoahana faha-{version} ity ampiasainao ity. Ny loharanon'ny kaody dia azo alaina [ao amin'ny GitHub](https://github.com/openstreetmap/iD).", "open_source_help": "Afaka manampy ny iD ianao amin'ny alalan'ny [fandikàna](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) na [fitaterana tsy fetezana](https://github.com/openstreetmap/iD/issues)." }, "overview": { @@ -723,7 +725,25 @@ "title": "Manova & Mitahiry", "select_h": "Hisafidy", "select_left_click": "{leftclick} Tsindrio amin'ny alalan'ny bokotra havia amin'ny souris eo amin'ny singa iray raha hisafidy azy io. Hisongadina izy avy eo, ary hiseho eo amin'ny takelaka etsy amin'ny sisiny ny mombamomba ilay singa, toy ny anarany na ny adiresiny.", - "save_h": "Hitahiry" + "select_right_click": "{rightclick} Tsindrio amin'ny bokotra havanana amin'ny souris eo amin'ny singa iray mba hipoiran'ny menio fikiràna, izay hampiseho izay azo atao aminy, toy ny manodina, manova toerana, ary mamafa.", + "multiselect_h": "Hisafidy maromaro", + "multiselect_shift_click": "`{shift}`+{leftclick} Manindria ny bokotra havia an'ny souris raha hisafidy singa maromaro indray miaraka. Izany dia manamora ny fanovana toerana na famafàna zavatra maromaro.", + "undo_redo_h": "Hanafoana & Hamerina", + "undo_redo": "Ireo fanovana nataonao dia voatahiry an-toerana ao amin'ny navigateur ampiasainao mandra-pisafidinao handefa azy mankany amin'ny serveur OpenStreetMap. Raha hanafoana ny fanovana nataonao dia tsindrio ny bokotra {undo} **Hanafoana**, ary raha hamerina azy dia tsindrio ny bokotra {redo} **Hamerina**.", + "save_h": "Hitahiry", + "save": "Tsindrio ny {save} **Hitahiry** raha hamarana ny fanovana nataonao ary handefa azy any amin'ny OpenStreetMap. Tadidio fa tokony hotahirizinao matetitetika ny asa ataonao!", + "save_validation": "Azonao lazaina eo amin'ny efitry ny fitehirizana izay zavatra nataonao. Hanamarina amin'ny fomba tsotsotra izay rakitra banga ihany koa iD ary mety hanome soso-kevitra hilainao na fampitandremana raha misy zavatra toa tsy mety.", + "upload_h": "Handefa", + "upload": "Mialoha ny handefasanao ny fanovana nataonao dia mila mampiditra [fanehoan-kevitra momba ny fanovana] (https://wiki.openstreetmap.org/wiki/Good_changeset_comments) ianao. Avy eo dia tsindrio ny **Handefa** mba handefasana ny fanovana nataonao any amin'ny OpenStreetMap, mba hitambatra amin'izay efa ao amin'ny sarintany ka ho hitan'ny besinimaro." + }, + "feature_editor": { + "fields_h": "Saha" + }, + "points": { + "title": "Teboka", + "intro": "Azo ampiasaina ny *teboka* mba hanehoana zava-misy toy ny fivarotana, toeram-pisakafoana na toerana miavaka. Mampiseho toerana misy zavatra izy ary mamaritra izay misy eo.", + "add_point_h": "Manampy Teboka", + "add_point": "Raha hanampy teboka dia tsindrio ny bokotra {point} **Teboka** eo amin'ny barre d'outils eo ambonin'ny sarintany, na ampiasao ny tsindry maika `1`. Hiova ho sary lakroa ny curseur an'ny souris rehefa manao izany ianao." } }, "intro": { diff --git a/dist/locales/mk.json b/dist/locales/mk.json index 4a0d6e39d..d25423bc2 100644 --- a/dist/locales/mk.json +++ b/dist/locales/mk.json @@ -298,7 +298,6 @@ "best_imagery": "Најдобра позната заднина за ова место", "switch": "Префрли назад на заднинава", "custom": "Прилагодено", - "custom_button": "Измени прилагодена позадина", "reset": "одново", "minimap": { "tooltip": "Прикажи оддалечена карта за пронаоѓање на тековно прикажаното подрачје." @@ -533,31 +532,24 @@ "label": "Дозволен пристап", "options": { "designated": { - "description": "Пристапот е дозволен во склад со знаците или поедините месни закони", "title": "Укажано" }, "destination": { - "description": "Пристапот е дозволен само за стасување до одредиште", "title": "Одредиште" }, "dismount": { - "description": "Пристапот е дозволен, но јавачот мора да биде симнат", "title": "Со симнување" }, "no": { - "description": "Пристапот е забранет за јавноста", "title": "Забранет" }, "permissive": { - "description": "Пристапот е дозволен додека сопственикот не ја отповика дозволата.", "title": "Со дозвола" }, "private": { - "description": "Пристап само со дозвола од сопственикот на поединечна основа", "title": "Приватен" }, "yes": { - "description": "Пристапот е дозволен со закон; право на помин", "title": "Дозволен" } }, @@ -1572,9 +1564,6 @@ "amenity/bicycle_repair_station": { "name": "Држач за поправка на велосипеди" }, - "amenity/biergarten": { - "name": "Пивска градина" - }, "amenity/boat_rental": { "name": "Изнајмување чамци" }, diff --git a/dist/locales/ms.json b/dist/locales/ms.json index ef240854d..c9c3684f6 100644 --- a/dist/locales/ms.json +++ b/dist/locales/ms.json @@ -446,7 +446,6 @@ "best_imagery": "Sumber imejan terbaik yang diketahui bagi lokasi ini", "switch": "Tukar balik ke latar belakang ini", "custom": "Penyuai", - "custom_button": "Tukar latar belakang tersuai", "reset": "set semula", "minimap": { "tooltip": "Tunjukkan peta yang dizum keluar untuk membantu mencari kawasan yang dipaparkan saat ini.", @@ -623,11 +622,6 @@ }, "cannot_zoom": "Had zum jauh telah dicapai dalam mod yang sedang dipakai.", "full_screen": "Togol Skrin Penuh", - "gpx": { - "drag_drop": "Tarik dan lepaskan suatu fail .gpx, .geojson atau .kml masuk halaman ini, atau klik butang di sebelah kanan untuk mengimbas", - "zoom": "Zum ke lapisan", - "browse": "Semak imbas untuk fail" - }, "mapillary_images": { "tooltip": "Gambar jalan dari Mapillary", "title": "Tindihan Gambar (Mapillary)" @@ -914,19 +908,15 @@ "label": "Capaian Dibenarkan", "options": { "designated": { - "description": "Capaian yang dibenarkan menurut papan tanda atau undang-undang tempatan yang khusus", "title": "Bertanda" }, "destination": { - "description": "Capaian dibenarkan hanya untuk sampai ke destinasi sahaja", "title": "Destinasi" }, "dismount": { - "description": "Capaian dibenarkan tetapi pengayuh basikal diwajibkan turun dari basikal", "title": "Turun Dari Basikal" }, "no": { - "description": "Capaian tidak dibenarkan untuk orang awam", "title": "Dilarang" }, "private": { diff --git a/dist/locales/nl.json b/dist/locales/nl.json index c4823fd98..f67cea375 100644 --- a/dist/locales/nl.json +++ b/dist/locales/nl.json @@ -306,6 +306,7 @@ }, "detach_node": { "title": "Losmaken", + "key": "E", "description": "Maak dit punt los van deze lijnen/vlakken.", "annotation": "Punt losgemaakt van deze lijnen/vlakken.", "restriction": "Dit punt kan niet losgemaakt worden omdat het een \"{relation}\" relatie zou beschadigen.", @@ -522,8 +523,6 @@ "best_imagery": "Beste bekende afbeeldingsbron voor deze locatie", "switch": "Selecteer terug deze achtergrond", "custom": "Aangepast", - "custom_button": "Tegel-URL-sjabloon aanpassen", - "custom_prompt": "Geef een tegel-URL-sjabloon op. Geldige placeholders zijn:\n - {zoom}/{z}, {x}, {y} voor het Z/X/Y-schema\n - {-y} of {ty} voor omgekeerde Y-coördinaten in TMS-stijl\n - {u} voor het quadtile-schema\n - {switch:a,b,c} voor DNS-server-multiplexing\n\nVoorbeeld:\n{example}", "overlays": "Lagen", "imagery_source_faq": "Beeldopname-info / Meld een probleem", "reset": "Standaard herstellen", @@ -726,18 +725,6 @@ }, "cannot_zoom": "Kan niet verder uitzoomen in huidige modus", "full_screen": "Volledig scherm aan/uit", - "gpx": { - "local_layer": "GPX toevoegen", - "drag_drop": "Sleep een .gpx-, .geojson- of .kml-bestand naar deze pagina of klik op de knop rechts om te bladeren", - "zoom": "Laag in beeld brengen", - "browse": "Selecteer een bestand" - }, - "mvt": { - "local_layer": "MVT toevoegen", - "drag_drop": "Sleep een .mvt of .pbf bestand naar deze pagina, of klik op de knop rechts om te browsen.", - "zoom": "Laag in beeld brengen", - "browse": "Selecteer een bestand" - }, "streetside": { "tooltip": "Foto's op straatniveau van Mircrosoft", "title": "Fotolaag (Bing Streetside)", @@ -769,6 +756,11 @@ "anonymous": "anoniem", "closed": "(Gesloten)", "commentTitle": "Commentaren", + "status": { + "opened": "geopened {when}", + "reopened": "heropend {when}", + "closed": "gesloten {when}" + }, "newComment": "Nieuwe commentaar", "inputPlaceholder": "Voeg een commentaar toe om te delen met anderen.", "close": "Kaartopmerking afsluiten", @@ -1440,31 +1432,24 @@ "label": "Gebruik toegelaten voor", "options": { "designated": { - "description": "Toegang toegestaan volgens bebording of specifieke, plaatselijke verordeningen", "title": "Geadviseerd" }, "destination": { - "description": "Toegang uitsluitend voor bestemmingsverkeer", "title": "Bestemming" }, "dismount": { - "description": "Toegang toegestaan maar afstappen is verplicht", "title": "Afstappen" }, "no": { - "description": "Toegang niet toegestaan voor het algemeen publiek", "title": "Verboden" }, "permissive": { - "description": "Toegang toegestaan totdat de eigenaar de toestemming intrekt", "title": "Privéterrein maar gebruik toegelaten door eigenaar" }, "private": { - "description": "Toegang slechts toegestaan met toestemming van de eigenaar op individuele basis", "title": "Privé" }, "yes": { - "description": "Toegang bij wet toegestaan, recht van overpad", "title": "Toegestaan" } }, @@ -1630,6 +1615,9 @@ "board_type": { "label": "Type" }, + "booth": { + "label": "Balie" + }, "boules": { "label": "Type" }, @@ -2551,9 +2539,23 @@ "shop": { "label": "Type" }, + "siren/purpose": { + "label": "Doel" + }, + "siren/type": { + "label": "Type", + "options": { + "electronic": "Elektronisch", + "other": "Overig", + "pneumatic": "Pneumatisch" + } + }, "site": { "label": "Type" }, + "site_type": { + "label": "Site Type" + }, "smoking": { "label": "Roken", "options": { @@ -3027,10 +3029,6 @@ "name": "Openbaar fietsgereedschap", "terms": "fietsgereedschappen,fietsherstelplaats,fietspomp,pomp,kettinggereedschap,fietsbanden,onderhoud,doe-het-zelf-fietsenmaker" }, - "amenity/biergarten": { - "name": "Biergarten", - "terms": "bier,terras,café,cafe" - }, "amenity/boat_rental": { "name": "Bootverhuur", "terms": "boten,huren" @@ -4049,14 +4047,23 @@ "emergency/destination": { "name": "Toegang voor hulpdiensten: bestemmingsverkeer" }, + "emergency/fire_extinguisher": { + "name": "Brandblusser" + }, "emergency/fire_hydrant": { "name": "Brandkraan", "terms": "hydrant,straatpot,brandstraatpot" }, + "emergency/first_aid_kit": { + "name": "EHBO-kit" + }, "emergency/life_ring": { "name": "Reddingsboei", "terms": "reddingsvest,reddingsring,drijfring" }, + "emergency/lifeguard": { + "name": "Badmeester" + }, "emergency/no": { "name": "Toegang voor hulpdiensten: nee" }, @@ -4070,6 +4077,9 @@ "emergency/private": { "name": "Toegang voor hulpdiensten: privé" }, + "emergency/siren": { + "name": "Sirene" + }, "emergency/water_tank": { "name": "Noodwatertank", "terms": "watertank,wateropslag,noodwateropslag,reservoir,noodreservoir" @@ -4897,6 +4907,9 @@ "name": "Brug", "terms": "tunnel,overspanning,brugomtrek,brugoppervlak" }, + "man_made/bunker_silo": { + "name": "Bunkersilo" + }, "man_made/chimney": { "name": "Industriële schoorsteen", "terms": "schoorsteen,schouw" @@ -6514,6 +6527,24 @@ } }, "imagery": { + "AGIV": { + "attribution": { + "text": "Orthofoto Vlaanderen nieuwste © AGIV" + }, + "name": "AGIV nieuwste luchtfoto's" + }, + "AGIV10cm": { + "attribution": { + "text": "Orthofoto Vlaanderen © AGIV" + }, + "name": "AGIV 2013-2015 luchtfoto's 10cm" + }, + "AGIVFlandersGRB": { + "attribution": { + "text": "GRB Vlaanderen © AGIV" + }, + "name": "AGIV Vlaandere GRB" + }, "Bing": { "description": "Satelliet- en luchtfoto's.", "name": "Bing-luchtfotografie" @@ -6522,6 +6553,7 @@ "attribution": { "text": "Gebruiksvoorwaarden & feedback" }, + "description": "DigitalGlobe-Premium is een mosaik bestaand uit de DigitalGlobe basiskaart, waarbij bepaalde regio's gevuld zijn met +Vivid of eigen gemaakte beelden uit gebieden die van interesse zijn, met een 50cm resolutie of beter, en die vaker worden vernieuwd met recente updates", "name": "DigitalGlobe-premiumbeelden" }, "DigitalGlobe-Premium-vintage": { @@ -6535,6 +6567,7 @@ "attribution": { "text": "Gebruiksvoorwaarden & feedback" }, + "description": "DigitalGlobe-Standard is een uitgekozen set van foto's, die 86% van de landmassa van de aarde omvatten, met 30-60cm resolutie waar het mogelijk is, aangevuld door Landsat. De Doorsneeleeftijd is 2,31 jaar, sommige plaatsen worden 2x per jaar geüpdatet", "name": "DigitalGlobe-standaardbeelden" }, "DigitalGlobe-Standard-vintage": { @@ -6614,6 +6647,9 @@ }, "name": "OSM Inspecteur: Tagging" }, + "SPW_ORTHO_LAST": { + "name": "Nieuwste luchtfoto's van SPW(allonie)" + }, "US-TIGER-Roads-2012": { "name": "TIGER Roads 2012" }, @@ -6629,6 +6665,30 @@ "description": "Wegen: Groene omlijning = ongeclassificeerd. Bruine omlijning = veldweg. Oppervlak: grind = lichtbruin gevuld, asfalt = zwart, bestraat = grijs, grond = wit, beton = blauw, gras = groen. Seizoensgebonden = witte balken", "name": "U.S. Forest Roads-laag" }, + "UrbISOrtho2016": { + "attribution": { + "text": "Gerealiseerd met middelen van Brussels UrbIS®© - Distributie & Copyright CIRB" + }, + "name": "UrbIS-Ortho 2016" + }, + "UrbISOrtho2017": { + "attribution": { + "text": "Gerealiseerd met middelen van Brussels UrbIS®© - Distributie & Copyright CIRB" + }, + "name": "UrbIS-Ortho 2017" + }, + "UrbisAdmFR": { + "attribution": { + "text": "Gerealiseerd met middelen van Brussels UrbIS®© - Distribution & Copyright CIRB" + }, + "name": "UrbisAdm FR" + }, + "UrbisAdmNL": { + "attribution": { + "text": "Gerealiseerd met middelen van Brussels UrbIS®© - Distribution & Copyright CIRB" + }, + "name": "UrbisAdm NL" + }, "Waymarked_Trails-Cycling": { "attribution": { "text": "© waymarkedtrails.org, OpenStreetMap-bijdragers, CC BY-SA 3.0" @@ -6679,6 +6739,25 @@ }, "name": "Wandelen & Fietsen" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi sneeuwscooter routes van OSM (Nordic coverage)", + "name": "Nordic snowmobile overlay" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "name": "Lantmäteriet Historic Orthophoto 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "name": "Lantmäteriet Historic Orthophoto 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Gebruiksvoorwaarden & feedback" @@ -6711,6 +6790,11 @@ }, "name": "OpenStreetMap (Duitse stijl)" }, + "osmse-ekonomiska": { + "attribution": { + "text": "© Lantmäteriet" + } + }, "qa_no_address": { "attribution": { "text": "Simon Poole, Gegevens ©OpenStreetMap-bijdragers" @@ -6723,6 +6807,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Sneeuwscooter routes", + "name": "Sneeuwscooter kaart Zweden" + }, "stamen-terrain-background": { "attribution": { "text": "Kaarttegels van Stamen Design, onder CC BY 3.0. Gegevens van OpenStreetMap, onder ODbL" @@ -6740,9 +6831,58 @@ "text": "Kaarten © Thunderforest, gegevens © OpenStreetMap-bijdragers" }, "name": "Thunderforest Landschap" + }, + "trafikverket-baninfo": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "name": "Trafikverket Spoornetwerk" + }, + "trafikverket-baninfo-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Zweeds spoornetwerk met verschillende opties voor kaartlagen", + "name": "Trafikverket Spoornetwerk opties" + }, + "trafikverket-vagnat": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Zweeds NVDB wegennetwerk", + "name": "Trafikverket Wegennetwerk" + }, + "trafikverket-vagnat-extra": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Zweedse NVDB extra details: Snelweg referenties, autoluw, parkeerplaatsen, bushaltes, tunnels, flitspalen", + "name": "Trafikverket Wegennetwerk Extra" + }, + "trafikverket-vagnat-navn": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Zweedse NVDB straatnamen", + "name": "Trafikverket Straatnamen" + }, + "trafikverket-vagnat-option": { + "attribution": { + "text": "© Trafikverket, CC0" + }, + "description": "Zweeds NVDB wegennetwerk met verschillende opties voor kaartlagen", + "name": "Trafikverket Wegennetwerk opties" } }, "community": { + "bw-facebook": { + "name": "Mapping Botswana op Facebook", + "description": "Pagina van OpenStreetMap in Botswana" + }, + "bw-twitter": { + "name": "Mapping Botswana op Twitter", + "description": "Twitter van OpenStreetMap in Botswana" + }, "cape-coast-youthmappers": { "name": "University of Cape Coast YouthMappers", "description": "Volg ons op Twitter: {url}", @@ -6771,14 +6911,17 @@ }, "OSM-BGD-facebook": { "name": "OpenStreetMap Bangladesh", - "description": "Verbeter OpenStreetMap in Bangladesh" + "description": "Verbeter OpenStreetMap in Bangladesh", + "extendedDescription": "Map je in Bangladesh? Heb je vragen, wil je in contact treden met de community here? Kom erbij op {Url}. Iedereen is welkom!" }, "OSM-India-facebook": { "name": "OpenStreetMap India", "description": "Verbeter OpenStreetMap in India", + "extendedDescription": "Map je in India? Heb je vragen, wil je in contact treden met de community hier? Kom erbij op {Url}. Iedereen is welkom!", "events": { "sotmasia2018": { "name": "State of the Map Asia 2018", + "description": "Kom naar het 2018 OpenStreetMap regionale evenement State of the Map Asia in India", "where": "Indian Institute of Management, Bangalore, India" } } @@ -6793,17 +6936,20 @@ }, "OSM-India-Puducherry-Facebook": { "name": "Free Software Hardware Movement – Facebook", - "description": "FSHM Facebook-pagina om op de hoogte te blijven van community-evenementen, -activiteiten" + "description": "FSHM Facebook-pagina om op de hoogte te blijven van community-evenementen, -activiteiten", + "extendedDescription": "FSHM organiseert evenementen gerelateerd aan gratis software/hardware, technologie, activisme en OpenStreetmap. De FB pagina is de beste manier om op de hoogte te blijven van deze evenementen." }, "OSM-India-Puducherry-Matrix": { "name": "Free Software Hardware Movement – Matrix" }, "OSM-IDN-facebook": { "name": "OpenStreetMap Indonesië", - "description": "Verbeter OpenStreetMap in Indonesië" + "description": "Verbeter OpenStreetMap in Indonesië", + "extendedDescription": "Map je in Indonesië? Heb je vragen, wil je in contact treden met de community hier? Kom erbij op {Url}. Iedereen is welkom!" }, "OSM-japan-facebook": { - "name": "OpenStreetMap Japan" + "name": "OpenStreetMap Japan", + "description": "Mappers en OpenStreetMap gebruikers in Japan" }, "OSM-japan-mailinglist": { "name": "OpenStreetMap Japan Mailinglijst", @@ -6814,42 +6960,51 @@ "description": "Volg ons op Twitter: {url}" }, "OSM-japan-website": { - "name": "OpenStreetMap Japan" + "name": "OpenStreetMap Japan", + "description": "Mappers en OpenStreetMap gebruikers in Japan" }, "OSM-korea-telegram": { - "name": "OSM Korea Telegram-kanaal" + "name": "OSM Korea Telegram-kanaal", + "description": "Onofficiëel Kanaal voor OpenStreetMap bijdragers, gemeenschappen en gebruikers in Korea om te delen en discussiëren." }, "OSM-MY-facebook": { - "name": "OpenStreetMap Malaysia op Facebook" + "name": "OpenStreetMap Malaysia op Facebook", + "description": "Om te chatten over alles gerelateerd aan OpenStreetMap!" }, "OSM-MY-forum": { "name": "OpenStreetMap Maleisië Forum", "description": "Officiële OpenStreetMap Maleisië Forum" }, "OSM-MY-matrix": { - "name": "OpenStreetMap Maleisië Riot-kanaal" + "name": "OpenStreetMap Maleisië Riot-kanaal", + "description": "Alle mappers zijn welkom! Meld je aan via {signupUrl}" }, "OSM-MNG-facebook": { "name": "OpenStreetMap Mongolië", - "description": "Verbeter OpenStreetMap in Mongolia" + "description": "Verbeter OpenStreetMap in Mongolia", + "extendedDescription": "Map je in Mongolië? Heb je vragen, wil je in contact treden met de community hier? Kom erbij op {Url}. Iedereen is welkom!" }, "OSM-MMR-facebook": { "name": "OpenStreetMap Myanmar", - "description": "Verbeter OpenStreetMap in Myanmar" + "description": "Verbeter OpenStreetMap in Myanmar", + "extendedDescription": "Map je in Myanmar? Heb je vragen, wil je in contact treden met de community hier? Kom erbij op {Url}. Iedereen is welkom!" }, "OSM-Nepal-facebook": { "name": "OpenStreetMap Nepal", - "description": "Verbeter OpenStreetMap in Nepal" + "description": "Verbeter OpenStreetMap in Nepal", + "extendedDescription": "Map je in Nepal? Heb je vragen, wil je in contact treden met de community hier? Kom erbij op {Url}. Iedereen is welkom!" }, "OSM-PH-facebook": { - "name": "Facebook" + "name": "Facebook", + "description": "Welkom bij OpenStreetMap Filippijnen, waar we alle Filipijnen aanmoedigen om bij te dragen aan het OpenStreetMap project." }, "OSM-PH-mailinglist": { "name": "Talk-ph Mailinglijst", "description": "Talk-ph is de officiële Mailinglijst voor de Filipijnen" }, "OSM-PH-slack": { - "name": "Slack" + "name": "Slack", + "description": "Iedereen is welkom! Maak een account onder: {signupUrl}" }, "OSM-PH-telegram": { "name": "Telegram", @@ -6865,7 +7020,8 @@ }, "OSM-LKA-facebook": { "name": "OpenStreetMap Sri Lanka", - "description": "Verbeter OpenStreetMap in Sri Lanka" + "description": "Verbeter OpenStreetMap in Sri Lanka", + "extendedDescription": "Map je in Sri Lanka? Heb je vragen, wil je in contact treden met de community hier? Kom erbij op {Url}. Iedereen is welkom!" }, "OSM-TW-facebook": { "name": "OpenStreetMap Taiwan", @@ -6875,16 +7031,36 @@ "name": "OpenStreetMap Taiwan Mailinglijst", "description": "Talk-tw is de officiële Mailinglijst voor Taiwan" }, + "OSM-TH-CNX-meetup": { + "name": "OSM Meetup Chiang Mai", + "description": "Onregelmatige bijeenkoms van de OpenStreetMap gemeenschap in Chiang Mai", + "extendedDescription": "Leden van de OpenStreetMap gemeenschap komen elke paar maanden bij elkaar in Chiang Mai. Treed in contact en bekijk {url} om te zien wanneer de volgende bijeenkomst is." + }, + "OSM-TH-facebook": { + "name": "OpenStreetMap TH Facebook groep", + "description": "Facebook group voor OpenStreetMappers in Thailand" + }, "OSM-TH-forum": { - "name": "OpenStreetMap TH-forum" + "name": "OpenStreetMap TH-forum", + "description": "OpenStreetMap Thailand web forum" + }, + "al-forum": { + "name": "OSM Albanie Forum", + "description": "OpenStreetMap Albanie Forum" }, "al-maptime-tirana": { - "name": "Maptime Tirana" + "name": "Maptime Tirana", + "description": "Sociale evenementen georganiseerd rondom mappen - beginners zijn van harte welkom!", + "extendedDescription": "Maptime is een open leeromgeving voor alle niveaus. Het biedt interantionale educatieve ondersteuning voor beginners. Maptine is tegelijkertijk flexibel en gestructureerd, biedt ruimte voor mapping tutorials, workshops, projecten met een gezamenlijk doel en onafhankelijke/samenwerkende werktijd." }, "al-telegram": { "name": "OSM Albanië Telegram-kanaal", "description": "OpenStreetMap Albanië Telegram-kanaal" }, + "at-forum": { + "name": "OpenStreetMap Oostenrijk Forum", + "description": "Het officiële forum voor OpenStreetMap vragen in en rond Oostenrijk" + }, "at-mailinglist": { "name": "Talk-at Mailinglijst", "description": "Talk-at is de officiële Mailinglijst voor Oostenrijk" @@ -6893,8 +7069,17 @@ "name": "OpenStreetMap Oostenrijk Twitter", "description": "Volg ons op Twitter: {url}" }, + "osmgraz-meetup": { + "name": "OpenStreetMap gemeenschap Graz bijeenkomst", + "description": "Maandelijkse bijeenkomst van de OpenStreetMap gemeenschap in Graz" + }, + "osmgraz-twitter": { + "name": "OpenStreetMap gemeenschap Graz op Twitter", + "description": "OpenStreetMap gemeenschap in Graz op Twitter" + }, "osm-at": { - "name": "OpenStreetMap Oostenrijk" + "name": "OpenStreetMap Oostenrijk", + "description": "Het platform voor informatie over OpenStreetMap in Oostenrijk" }, "byosm": { "name": "OpenStreetMap Wit-Rusland", @@ -6917,6 +7102,11 @@ "name": "Talk-be-mailinglijst", "description": "Talk-be is de officiële mailinglijst voor de Belgische OpenStreetMapgemeenschap" }, + "be-maptime": { + "name": "Maptime Belgie", + "description": "Sociale evenementen georganiseerd rondom mappen - beginners zijn van harte welkom!", + "extendedDescription": "Maptime is een open leeromgeving voor alle niveaus. Het biedt interantionale educatieve ondersteuning voor beginners. Maptine is tegelijkertijk flexibel en gestructureerd, biedt ruimte voor mapping tutorials, workshops, projecten met een gezamenlijk doel en onafhankelijke/samenwerkende werktijd." + }, "be-matrix": { "name": "OpenStreetMap BE Matrix-kanaal", "description": "Alle mappers zijn welkom!" @@ -6927,38 +7117,164 @@ "extendedDescription": "Fysieke bijeenkomsten zijn fantastisch om andere mappers te leren kennen, hen vragen te stellen, en veel bij te leren. In het bijzonder zijn nieuwe bijdragers van harte welkom!" }, "be-twitter": { - "name": "OpenStreetMap België Twitter" + "name": "OpenStreetMap België Twitter", + "description": "OSM België op Twitter: @osm_be" + }, + "hr-facebook": { + "name": "OpenStreetMap Kroatie Facebook-groep", + "description": "OpenStreetMap Kroatie Facebook-groep" + }, + "hr-irc": { + "name": "OpenStreetMap Kroatië op IRC", + "description": "Kom erbij op #osm-hr op irc.freenode.org (poort 6667)" + }, + "hr-mailinglist": { + "name": "Talk-hr Mailing List", + "description": "Talk-hr mailing list" + }, + "czech-community": { + "name": "Tsjechische OSM community", + "description": "Kaartportaal, website en contactgegevens van OSM leden in Tsjechie" + }, + "osmcz-facebook": { + "name": "OpenStreetMap CZ op Facebook", + "description": "Volg de Tsjechische gemeenschap op Facebook - inclusief vertaalde WeeklyOSM!" + }, + "osmcz-twitter": { + "name": "Tsjechische twitter @osmcz", + "description": "Volg de Tsjechische gemeenschap op Twitter - inclusief vertaalde WeeklyOSM!" }, "talk-cz-mailinglist": { + "name": "Tsjechische mailing list (talk-cz)", "description": "Talk-cz is de officiële Mailinglijst voor Tsjechië" }, + "dk-forum": { + "name": "OpenStreetMap Denemarken Web Forum", + "description": "OpenStreetMap Denemarken Web Forum" + }, + "dk-irc": { + "name": "OpenStreetMap Denemarken IRC", + "description": "Kom erbij op #odm-dk op irc.oftc.net (poort 6667)" + }, + "dk-mailinglist": { + "name": "Talk-dk Mailing List", + "description": "Een mailing list om OpenStreetMap in Denemarken te bespreken" + }, + "fi-forum": { + "name": "OpenStreetMap FI forum", + "description": "OpenStreetMap Finland web forum" + }, + "fi-irc": { + "name": "OpenStreetMap Finland IRC", + "description": "Kom erbij op #osm-fi op irc.oftc.net (port 6667)" + }, + "fi-mailinglist": { + "name": "Talk-fi Mailing List", + "description": "Talk-fi is de officiële mailing list voor de Finse OSM community" + }, "fr-facebook": { "name": "OpenStreetMap Frankrijk Facebook-pagina", "description": "OpenStreetMap Frankrijk Facebook-pagina" }, + "fr-forum": { + "name": "OpenStreetMap Frankrijk web forum", + "description": "OpenStreetMap Frankrijk web forum" + }, + "fr-irc": { + "name": "OpenStreetMap Frankrijk op IRC", + "description": "Kom erbij op #osm-fr op irc.oftc.net (port 6667)" + }, + "fr-mailinglist": { + "name": "Talk-fr Mailing List", + "description": "Talk-fr mailing list" + }, "fr-twitter": { "name": "OpenStreetMap Frankrijk op Twitter", "description": "OpenStreetMap Frankrijk op Twitter: {url}" }, + "de-berlin-mailinglist": { + "name": "Berlijn Mailing List", + "description": "Dit is de mailing list voor de Berlijnse OSM gemeenschap" + }, + "de-berlin-meetup": { + "name": "OpenStreetMap Berlijn-Brandenburg Meetup", + "description": "Mappers en OpenStreetMap gebruikers in de omgeving van Berlijn" + }, "de-berlin-telegram": { - "name": "@osmberlin op Telegram" + "name": "@osmberlin op Telegram", + "description": "OpenStreetMap Berlijn Telegram chat" + }, + "de-berlin-twitter": { + "name": "OpenStreetMap Berlijn Twitter", + "description": "Volg ons op Twitter: {url}" + }, + "de-forum": { + "name": "OpenStreetMap DE forum", + "description": "OpenStreetMap Duitsland web forum" }, "de-irc": { - "name": "OpenStreetMap Duitsland IRC" + "name": "OpenStreetMap Duitsland IRC", + "description": "Kom erbij op #odm-de op irc.oftc.net (poort 6667)" }, "de-mailinglist": { "name": "Talk-de Mailinglijst", "description": "Talk-de is de officiële Mailinglijst voor Duitsland" }, + "de-ostwestfalen-lippe-mailinglist": { + "name": "OWL Mailing List", + "description": "Dit is de mailing list voor de Ostwestfalen-Lippe OSM gemeenschap" + }, "de-telegram": { - "name": "OpenStreetMap Duitsland Telegram" + "name": "OpenStreetMap Duitsland Telegram", + "description": "Kom bij de OpenStreetMap Duitsland Telegram supergroup via {url}" }, "osm-de": { "name": "OpenStreetMap Duitsland", "description": "Het platform voor informatie over OpenStreetMap in Duitsland" }, + "hu-facebook": { + "name": "OpenStreetMap HU op Facebook", + "description": "Mappers en OpenStreetMap op Facebook in Hongarije" + }, + "hu-forum": { + "name": "OpenStreetMap HU forum", + "description": "OpenStreetMap Hongarije web forum" + }, + "hu-meetup": { + "name": "OpenStreetMap Hongarije Meetup", + "description": "Het platform om meetups te organiseren in Hongarije" + }, + "is-facebook": { + "name": "OSM IJsland on Facebook", + "description": "Pagina van OpenStreetMap in IJsland" + }, + "is-mailinglist": { + "name": "Talk-is Mailing List", + "description": "Talk-is is de officiële mailinglijst voor de IJslandse OpenStreetMap gemeenschap" + }, + "is-twitter": { + "name": "OSM IJsland op Twittter", + "description": "Twitter van OpenStreetMap in IJsland" + }, + "it-facebook": { + "name": "OpenStreetMap Italië Facebook", + "description": "Neem deel aan de OpenStreetMap Italië community op Facebook" + }, + "it-irc": { + "name": "OpenStreetMap Italië IRC", + "description": "Kom erbij op #osm-it op irc.oftc.net (port 6667)" + }, + "it-mailinglist": { + "name": "Talk-it Mailing List", + "description": "Talk-it is de officiële Mailinglijst voor de Italiaanse OSM gemeenschap" + }, "it-telegram": { - "name": "@OpenStreetMapItalia op Telegram" + "name": "@OpenStreetMapItalia op Telegram", + "description": "OpenStreetMap Italië op Telegram" + }, + "it-twitter": { + "name": "OpenStreetMap Italië Twitter", + "description": "Volg ons op Twitter via {url}" }, "OSM-Rome-meetup": { "name": "Incontro Mappatori Romani", diff --git a/dist/locales/nn.json b/dist/locales/nn.json index 24dd515db..a6e0d0ba7 100644 --- a/dist/locales/nn.json +++ b/dist/locales/nn.json @@ -126,7 +126,6 @@ "backgrounds": "Bakgrunnar", "none": "Ingen", "custom": "Tilpassa", - "custom_button": "Rediger tilpassa bakgrunn", "contrast": "Kontrast" }, "intro": { diff --git a/dist/locales/no.json b/dist/locales/no.json index 97dcd8c48..d9be37ee1 100644 --- a/dist/locales/no.json +++ b/dist/locales/no.json @@ -472,7 +472,6 @@ "best_imagery": "Den beste ortofotokilden til denne plasseringen", "switch": "Bytt tilbake til denne bakgrunnen", "custom": "Egendefinert", - "custom_button": "Endre egendefinert bakgrunn", "overlays": "Overlegg", "reset": "tilbakestill", "brightness": "Lysstyrke", @@ -640,11 +639,6 @@ }, "cannot_zoom": "Kan ikke zoome ut lenger i gjeldende modus.", "full_screen": "Skru av/på fullskjerm.", - "gpx": { - "drag_drop": "Dra og slipp en .gpx, .geojson eller .kml-fil på siden, eller trykk knappen til høyre for å bla etter fil", - "zoom": "Zoom til lag", - "browse": "Bla etter en fil" - }, "mapillary_images": { "tooltip": "Bilder på gate-nivå fra Mapillary", "title": "Bilde-overlegg (Mapillary)" @@ -1019,27 +1013,21 @@ "label": "Tillatt for", "options": { "designated": { - "description": "Tilgang tillatt i henhold til skilt eller spesifike lokale lover", "title": "Utpekt" }, "destination": { - "description": "Tilgang kun tillatt for å nå et mål", "title": "Mål" }, "no": { - "description": "Tilgang ikke tillatt for allmennheten", "title": "Forbudt" }, "permissive": { - "description": "Tilgang tillatt frem til eieren trekker tillatelsen tilbake", "title": "Begrenset" }, "private": { - "description": "Tilgang tillatt kun ved tillatelse fra eieren på individuell basis", "title": "Privat" }, "yes": { - "description": "Tilgang gitt av lov; fri tilgang", "title": "Tillatt" } }, diff --git a/dist/locales/pl.json b/dist/locales/pl.json index 7029afefc..713dada5c 100644 --- a/dist/locales/pl.json +++ b/dist/locales/pl.json @@ -300,12 +300,13 @@ }, "restriction": { "annotation": { - "create": "Dodano zakaz/nakaz skrętu", - "delete": "Usunięto zakaz/nakaz skrętu" + "create": "Dodano ograniczenie skrętu", + "delete": "Usunięto ograniczenie skrętu" } }, "detach_node": { "title": "Odłącz węzeł.", + "key": "E", "description": "Odłącza ten węzeł od tych linii/obszarów.", "annotation": "Odłącza węzeł od linii/obszarów.", "restriction": "Ten węzeł nie może być odłączony, gdyż spowodowałoby to uszkodzenie relacji \"{relation}\".", @@ -429,7 +430,12 @@ "edited_by": "Edytowane przez", "changeset": "Zestaw zmian", "unknown": "brak", - "link_text": "Historia na openstreetmap.org" + "link_text": "Historia na openstreetmap.org", + "note_no_history": "Brak historii (nowa uwaga)", + "note_comments": "Komentarze", + "note_created_date": "Data utworzenia", + "note_created_user": "Utworzone przez", + "note_link_text": "Uwaga na openstreetmap.org" }, "location": { "key": "L", @@ -459,7 +465,8 @@ "vertex": "wierzchołek", "line": "linia", "area": "obszar", - "relation": "relacja" + "relation": "relacja", + "note": "uwaga" }, "geocoder": { "search": "Szukaj na całym świecie...", @@ -522,8 +529,6 @@ "best_imagery": "Najlepsza znana warstwa podkładu dla tego obszaru", "switch": "Wróć do tego podkładu", "custom": "Własne", - "custom_button": "Edycja własnego podkładu", - "custom_prompt": "Wprowadź szablon dla URL kafelka mapy. Obsługiwane symbole:\n - {zoom}/{z}, {x}, {y} dla schematu adresowania kafelkówZ/X/Y\n - {-y} lub {ty} dla odwróconej współrzędnej Y w adresowaniu TMS\n - {u} dla QuadTiles\n - {switch:a,b,c} dla multipleksacji serwerów na poziomie DNS\n\nPrzykład:\n{example}", "overlays": "Nakładki", "imagery_source_faq": "Informacje o obrazie / Zgłoś problem", "reset": "Przywraca ustawienia", @@ -537,7 +542,7 @@ "tooltip": "Pokaż oddaloną mapę, aby pomóc zlokalizować wyświetlany obszar.", "key": "/" }, - "fix_misalignment": "Przesunięcie warstwy tła", + "fix_misalignment": "Dopasuj przesunięcie warstwy tła", "offset": "Przeciągnij na szare pole poniżej, aby dostosować obrazek, lub wprowadź wartości przesunięcia w metrach." }, "map_data": { @@ -625,6 +630,16 @@ "tooltip": "Obszary są rysowane z pełnym wypełnieniem." } }, + "settings": { + "custom_background": { + "tooltip": "Edycja własnego podkładu", + "header": "Ustawienia własnego tła", + "instructions": "Wprowadź szablon dla URL kafelka mapy. Obsługiwane symbole:\n {zoom}/{z}, {x}, {y} dla schematu adresowania kafelkówZ/X/Y\n {-y} lub {ty} dla odwróconej współrzędnej Y w adresowaniu TMS\n {u} dla QuadTiles\n {switch:a,b,c} dla multipleksacji serwerów na poziomie DNS\n\nPrzykład:\n{example}", + "template": { + "placeholder": "Wprowadź szablon url" + } + } + }, "restore": { "heading": "Masz niezapisane zmiany", "description": "Przywrócić niezapisane zmiany z poprzedniej sesji?", @@ -726,18 +741,6 @@ }, "cannot_zoom": "Nie można bardziej oddalić widoku w obecnym trybie.", "full_screen": "Tryb pełnoekranowy", - "gpx": { - "local_layer": "Dodaj plik GPX", - "drag_drop": "Przeciągnij i upuść plik .gpx, .geojson lub .kml na stronę lub kliknij przycisk po prawej, by go wybrać", - "zoom": "Przybliż do warstwy", - "browse": "Wczytaj plik" - }, - "mvt": { - "local_layer": "Dodaj plik MVT", - "drag_drop": "Przeciągnij i upuść plik .mvt lub .pbf na stronę, lub wybierz plik klikając na przycisk po prawej stronie", - "zoom": "Przybliż do tej warstwy", - "browse": "Wybierz plik" - }, "streetside": { "tooltip": "Zdjęcia ulic od Microsoftu", "title": "Nakładka zdjęciowa (ulice z Bing)", @@ -767,15 +770,22 @@ "note": "Uwaga", "title": "Edycja uwagi", "anonymous": "anonimowo", - "closed": "(Zamknięta)", + "closed": "(zamknięta)", "commentTitle": "Komentarze", + "status": { + "opened": "utworzona {when}", + "reopened": "ponownie otworzona {when}", + "commented": "skomentowana {when}", + "closed": "zamknięta {when}" + }, "newComment": "Nowy komentarz", + "inputPlaceholder": "Wpisz komentarz dla innych mapujących.", "close": "Rozwiąż uwagę", "open": "Ponownie otwórz uwagę", - "comment": "Komentarz", + "comment": "Skomentuj", "close_comment": "Rozwiąż i skomentuj", "open_comment": "Ponownie otwórz i skomentuj", - "report": "Zgłoś", + "report": "Zgłoś uwagę", "new": "Nowa uwaga", "newDescription": "Opisz problem.", "save": "Zapisz uwagę", @@ -815,59 +825,139 @@ "multiselect_shift_click": "`{shift}`+{leftclick} trzymając shift i klikając lewym przyciskiem myszy wybiera wiele obiektów jednocześnie. Pomaga to w przesuwaniu lub usuwaniu wielu elementów na raz.", "multiselect_lasso": "Innym sposobem na zaznaczenie wielu obiektów jest przytrzymanie klawisza `{shift}`, następnie naciśnięcie i trzymanie {leftclick} lewego przycisku myszy, i rysowanie tak myszą lasso wokół obiektów, które mają być wybrane. Wszystkie punkty wewnątrz lasso zostaną wybrane.", "undo_redo_h": "Cofnij & Wykonaj ponowniep", + "undo_redo": "Twoje zmiany są zachowywane lokalnie w przeglądarce, dopóki nie zdecydujesz się zapisać ich na serwerze OpenStreetMap. Możesz cofnąć zmiany klikając przycisk {undo} **Cofnij** i przywrócić je klikając przycisk {redo} **Przywróć**.", "save_h": "Zapisz", "save": "Naciśnij {save} **Zapisz** by zakończyć edytowanie i wysłać zmiany do OpenStreetMap. Pamiętaj, by regularnie zapisywać swoją pracę!", + "save_validation": "Na ekranie zapisywania masz szansę przejrzeć, co zrobiłeś. iD również wykonuje podstawowe sprawdzanie pod kątem brakujących danych, więc może przedstawić pomocne sugestie i ostrzeżenia, jeżeli coś wygląda błędnie.", "upload_h": "Wyślij", + "upload": "Przed wysłaniem swoich zmian musisz dodać do nich [komentarz] (https://wiki.openstreetmap.org/wiki/Pl:Good_changeset_comments). Następnie kliknij **Wyślij**, aby przesłać swoje zmiany do OpenStreetMap, gdzie będą dołączone do mapy i publicznie widoczne dla wszystkich.", "backups_h": "Automatyczne kopie zapasowe", + "backups": "Jeżeli nie ukończyłeś pracy za jednym podejściem, np. wyłączył ci się komputer lub zamknąłeś przeglądarkę, to twoje zmiany nadal są zapisane w lokalnej pamięci przeglądarki. Możesz wrócić do nich później (w tej samej przeglądarce, na tym samym komputerze), a iD zaproponuje ci przywrócenie twojej pracy", "keyboard_h": "Skróty klawiszowe", "keyboard": "Możesz zobaczyć listę skrótów klawiaturowych po naciśnięciu klawisza `?`." }, "feature_editor": { "title": "Edytor Obiektu", + "intro": "*Edytor obiektów* pojawia się obok mapy i pozwala Ci przeglądać i edytować wszystkie informacje o wybranych obiektach.", + "definitions": "Górna część pokazuje typ obiektu. Środkowa sekcja zawiera *pola* reprezentujące właściwości obiektu, takie jak jego nazwa lub adres.", "type_h": "Rodzaje obiektów", + "type": "Możesz kliknąć na rodzaju obiektu, aby go zmienić na inny. Wszystko, co istnieje w rzeczywistym świecie, może być dodane do OpenStreetMap, dlatego też są tysiące rodzajów obiektów do wyboru.", + "type_picker": "Lista wyboru rodzaju wyświetla najpopularniejsze obiekty, takie jak parki, szpitale, restauracje, drogi, czy budynki. Możesz wyszukać cokolwiek wpisując to w polu wyszukiwania. Możesz również kliknąć ikonę {inspect} **Info** obok rodzaju obiektu, aby dowiedzieć się więcej o nim.", "fields_h": "Pola", - "tags_h": "Znaczniki" + "fields_all_fields": "Sekcja \"Wszystkie pola\" zawiera wszystkie szczegóły obiektu, które możesz edytować. W OpenStreetMap żadne pole nie jest obowiązkowe, więc możesz je zostawić puste, jeśli nie wiesz co tam wpisać.", + "fields_example": "Każdy rodzaj obiektu może pokazywać inny zestaw pól. Na przykład droga może pokazywać pola dla nawierzchni i ograniczenia prędkości, a restauracja może mieć pola dla typu serwowanego jedzenia i godzin otwarcia.", + "fields_add_field": "Możesz również kliknąć \"Dodaj pole\", aby dodać więcej pól, takich jak opis, link do Wikipedii, dostępność dla wózków inwalidzkich i inne.", + "tags_h": "Znaczniki", + "tags_all_tags": "Poniżej sekcji z polami, możesz rozwinąć sekcję \"Wszystkie znaczniki\", aby edytować dowolny ze *znaczników* OpenStreetMap dla wybranego obiektu. Każdy znacznik składa się z *klucza* i *wartości*, danych opisujących wszystkie obiekty umieszczone na OpenStreetMap.", + "tags_resources": "Edytowanie znaczników obiektów wymaga trochę wiedzy o OpenStreetMap. Sprawdź źródła takie, jak [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Pl:Main_Page) lub [Taginfo](https://taginfo.openstreetmap.org/), aby uzyskać więcej informacji o akceptowanych przez OpenStreetMap zasadach oznaczania obiektów." }, "points": { "title": "Punkty", + "intro": "*Punkty* mogą być używane, aby przedstawić miejsca takie, jak sklepy, restauracje i pomniki. Oznaczają one konkretne miejsce i opisują, co tam jest.", "add_point_h": "Dodawanie punktów", + "add_point": "Aby dodać punkt, kliknij przycisk {point} **Punkt** na pasku powyżej mapy lub użyj skrótu klawiszowego '1'. Kursor zmieni swój kształt na krzyżyk.", + "add_point_finish": "Aby umieścić nowy punkt na mapie, ustaw kursor tam, gdzie powinien on się znaleźć i kliknij {leftclick} lewy przycisk myszy lub naciśnij `spację`.", "move_point_h": "Przesuwanie punktów", - "delete_point_h": "Usuwanie punktów" + "move_point": "Aby przenieść punkt, umieść kursor nad nad nim, naciśnij i przytrzymaj {leftclick} lewy przycisk myszy jednocześnie przesuwając punkt do nowej lokalizacji.", + "delete_point_h": "Usuwanie punktów", + "delete_point": "Możesz usuwać z mapy obiekty, które nie istnieją w rzeczywistości. Usunięcie obiektu z OpenStreetMap usuwa go wszystkim użytkownikom mapy, dlatego przed jego skasowaniem należy mieć całkowitą pewność, że obiektu naprawdę nie ma.", + "delete_point_command": "Aby usunąć punkt, kliknij {rightclick} prawym przyciskiem myszy na nim, żeby go zaznaczyć i wyświetlić menu edycji. Następnie wybierz polecenie {delete} **Usuń**." }, "lines": { "title": "Linie", + "intro": "*Linie* są używane do przedstawiania takich obiektów jak drogi, linie kolejowe i rzeki. Linie powinny być rysowane w osi obiektu, który przedstawiają.", "add_line_h": "Dodawanie linii", + "add_line": "Aby dodać linię, kliknij przycisk {line} **Linia** na pasku powyżej mapy lub użyj skrótu klawiszowego '2'. Kursor myszy zmieni swój kształt na krzyżyk.", + "add_line_draw": "Następnie umieść kursor myszy tam, gdzie powinna zaczynać się linia i naciśnij {leftclick} lewy przycik myszy lub 'spację', aby zacząć rozmieszczanie węzłów. Dodawaj kolejne węzły klikając myszą lub naciskając 'spację'. Podczas rysowania możesz powiększać i przesuwać mapę, aby robić to dokładniej.", + "add_line_finish": "Aby zakończyć linię, naciśnij '{return}' lub kliknij ponownie na ostatnim węźle.", "modify_line_h": "Modyfikowanie linii", + "modify_line_dragnode": "Często zobaczysz linie, które mają niepoprawny kształt, np. drogi, które nie pasują do obrazów warstwy tła. Aby poprawić kształt linii najpierw kliknij {leftclick} lewym przyciskiem myszy, aby ją zaznaczyć. Wszystkie jej węzły zostaną oznaczone kółeczkami, które możesz przesunąć do poprawnej lokalizacji.", + "modify_line_addnode": "Możesz także utworzyć nowe węzły wzdłuż linii zarówno poprzez {leftclick}**x2** dwukrotne kliknięcie na niej, jak i przez przesuwanie trójkącików pomiędzy węzłami.", "connect_line_h": "Łączenie linii", + "connect_line": "Utrzymywanie prawidłowo połączonych dróg jest ważne dla mapy i niezbędne dla zapewnienia wskazówek dojazdu.", + "connect_line_display": "Połączenia dróg są oznaczane szarymi kółkami. Końce linii są oznaczane większymi, białymi kółkami, jeżeli nie łączą się z niczym.", + "connect_line_drag": "Aby połączyć linię z innym obiektem, przesuń jeden z jej węzłów na ten obiekt, aż się połączą. Wskazówka: Możesz przytrzymać klawisz '{alt}', aby zapobiegać łączeniu się węzłów z innymi obiektami.", + "connect_line_tag": "Jeżeli wiesz, że w tym miejscu jest sygnalizacja świetlna lub przejście dla pieszych, możesz je dodać poprzez zaznaczenie węzła i wybranie w edytorze obiektów odpowiednich rodzajów cech.", "disconnect_line_h": "Odłączanie linii", + "disconnect_line_command": "Aby odłączyć drogę od innego obiektu, kliknij {rightclick} prawym klawiszem myszy węzeł i wybierz polecenie {disconnect} **Odłącz** z menu edycji.", "move_line_h": "Przesuwanie linii", - "delete_line_h": "Usuwanie linii" + "move_line_command": "Aby przesunąć całą linię, kliknij {rightclick} prawym klawiszem myszy na niej i wybierz polecenie {move} **Przesuń** z menu edycji. Następnie przesuń mysz i kliknij {leftclick} lewym klawiszem myszy, żeby umieścić linię w nowej lokalizacji.", + "move_line_connected": "Linie, które są połączone z innymi obiektami pozostają w takim stanie podczas przesuwania ich do nowej lokalizacji. iD może uniemożliwić ci przesunięcie linii poza inną linię.", + "delete_line_h": "Usuwanie linii", + "delete_line": "Jeżeli linia jest w całości nieprawidłowa, na przykład droga, która nie istnieje w rzeczywistości, możesz ją usunąć. Uważaj przy usuwaniu obiektów: warstwa zdjęciowa, której używasz, może być nieaktualna i droga, która wygląda na nieistniejącą, może być dopiero co wybudowana.", + "delete_line_command": "Aby usunąć linię, kliknij {rightclick} prawym przyciskiem myszy na niej, żeby ją zaznaczyć i pokazać menu edycji. Następnie wybierz polecenie {delete} **Usuń**." }, "areas": { "title": "Obszary", + "intro": "*Obszary* służą do wyznaczania granic dla takich obiektów jak jeziora, budynki czy osiedla mieszkaniowe. Obszary powinny być wytyczone wokół krawędzi obiektu, który reprezentują, np. dookoła podstawy budynku.", "point_or_area_h": "Punkty czy obszary?", + "point_or_area": "Wiele miejsc może być reprezentowanych jako punkty lub obszary. Mapuj obrysy budynków i posesji jako obszary, kiedy tylko jest to możliwe. Umieszczaj punkty wewnątrz obszaru budynku, żeby pokazać firmy, udogodnienia i inne obiekty znajdujące się w budynku.", "add_area_h": "Dodawanie obszarów", + "add_area_command": "Aby dodać obszar, kliknij przycisk {area} **Obszar** na pasku powyżej mapy lub użyj skrótu klawiszowego '3'. Kursor myszy zmieni swój kształt na krzyżyk.", + "add_area_draw": "Następnie umieść kursor myszy w jednym z narożników obiektu i naciśnij {leftclick} lewy przycisk myszy lub 'spację', aby zacząć rozmieszczanie węzłów po zewnętrznej krawędzi tego obszaru. Dodawaj kolejne węzły klikając myszą lub naciskając spację. Podczas rysowania możesz powiększać i przesuwać mapę, aby robić to dokładniej.", + "add_area_finish": "Aby zakończyć linię, naciśnij '{return}' lub kliknij ponownie na pierwszym lub ostatnim węźle.", "square_area_h": "Kąty proste", + "square_area_command": "Wiele obiektów takich, jak budynki, ma kąty proste w narożnikach. Aby obszar miał kąty proste kliknij {rightclick} prawym klawiszem myszy na jego krawędzi i wybierz polecenie {orthogonalize} **Popraw prostopadłość** z menu edycji.", "modify_area_h": "Modyfikowanie obszarów", - "delete_area_h": "Usuwanie obszarów" + "modify_area_dragnode": "Często zobaczysz obszary, które mają niepoprawny kształt, np. budynki, które nie pasują do zdjeć warstwy tła. Aby poprawić kształt obszaru najpierw kliknij {leftclick} lewym przyciskiem myszy, aby go zaznaczyć. Wszystkie jego węzły zostaną oznaczone kółeczkami, które możesz przesunąć do poprawnej lokalizacji.", + "modify_area_addnode": "Możesz także utworzyć nowe węzły dookoła obszaru zarówno poprzez {leftclick}**x2** dwukrotne kliknięcie na jego krawędzi, jak i przez przesuwanie trójkącików znajdujących się pomiędzy węzłami.", + "delete_area_h": "Usuwanie obszarów", + "delete_area": "Jeżeli obszar jest w całości nieprawidłowy, na przykład jest to budynek, który nie istnieje w rzeczywistości, możesz go usunąć. Uważaj podczas usuwania obiektów: zdjęcia warstwy tła, których używasz, mogą być nieaktualne i budynek, który wygląda na nieistniejący, może po prostu być nowo wybudowanym.", + "delete_area_command": "Aby usunąć obszar, kliknij {rightclick} prawym klawiszem myszy na nim w celu jego zaznaczenia i wyświetlenie menu edycji. Następnie wybierz polecenie {delete} **Usuń**." }, "relations": { "title": "Relacje", + "intro": "*Relacja* jest specjalnym rodzajem obiektu w OpenStreetMap, który grupuje inne obiekty razem. Obiekty, które należą do relacji, są nazywane *członkami*, a każdy z członków może mieć w tej relacji *rolę*.", "edit_relation_h": "Edytowanie relacji", + "edit_relation": "U dołu edytora obiektów, możesz rozwinąć sekcję \"Wszystkie relacje\", aby zobaczyć, czy wybrany obiekt jest członkiem jakichś relacji. Możesz też kliknąć na relacji, aby ją wybrać i edytować.", + "edit_relation_add": "Aby dodać obiekt do relacji, zaznacz go, a następnie kliknij przycisk {plus} dodaj w sekcji \"Wszystkie relacje\" w Edytorze obiektów. Możesz wybrać z listy jedną z pobliskich relacji lub opcję \"Nowa relacja...\".", + "edit_relation_delete": "Możesz także kliknąć przycisk {delete} **Usuń**, aby usunąć wybrany obiekt z relacji. Jeżeli usuniesz wszystkich członków danej relacji, zostanie ona automatycznie usunięta.", + "maintain_relation_h": "Utrzymywanie relacji", + "maintain_relation": "Na ogół iD automatycznie zachowuje przy edycjach. Zachowaj ostrożność ,kiedy zamieniasz elementy mogące być członkami relacji. Na przykład, jeśli usuniesz fragment drogi i narysujesz nowy, by go zastąpić, musisz dodać ten nowy odcinek do tych samych relacji (trasy, ograniczenia skrętów, itp.), do których należał stary.", "relation_types_h": "Rodzaje relacji", "multipolygon_h": "Wielokąty", - "turn_restriction_h": "Zakazy/nakazy skrętu", + "multipolygon": "Relacja *wielokąta złożonego* jest grupą składającą się z jednego lub więcej *zewnętrznych* obiektów i jednego lub więcej wewnętrznych. Zewnętrzne obiekty definiują zewnętrzne krawędzie wielokąta, a wewnętrzne obiekty opisują podobszary lub wycięcia wewnątrz niego.", + "multipolygon_create": "Aby utworzyć wielokąt złożony, np. budynek z wycięciem w środku, narysuj obszar wokół jego zewnętrznej krawędzi oraz linię lub obszar innego typu wzdłuż krawędzi wycięcia. Następnie kliknij {shift}+{leftclick} lewy przycisk myszy, aby zaznaczyć oba obiekty, {rightclick} prawy przycisk myszy, żeby wyświetlić menu edycji i wybierz polecenie {merge} **Połącz**.", + "multipolygon_merge": "Łączenie kilku linii lub obszarów utworzy relację nowego wielokąta z wybranymi obszarami jako członkami. iD ustali ich wewnętrzną i zewnętrzną rolę automatycznie, bazując na tym, które obiekty zawierają się wewnątrz innych.", + "turn_restriction_h": "Ograniczenia skrętu", + "turn_restriction": "Relacja *ograniczenie skrętu* jest grupą kilku elementów odcinków drogi łączących się na skrzyżowaniu. Ograniczenia skrętów składają się z drogi *od*, węzła lub drogi *przez* i drogi *do*.", + "turn_restriction_field": "Aby edytować ograniczenia skrętów, wybierz węzeł reprezentujący skrzyżowanie, gdzie spotykają się dwie lub więcej dróg. Edytor obiektów wyświetli wtedy specjalne pole \"Ograniczenia skrętu\", zawierające model skrzyżowania.", + "turn_restriction_editing": "W polu \"Ograniczenia skrętu\" kliknij, aby wybrać drogę \"od\" i zobacz, czy skręcanie jest dozwolone lub zabronione w każdą z dróg \"do\". Możesz klikać na ikonach skrętów, żeby przełączać ich stan pomiędzy dozwolonym i zabronionym. iD utworzy relacje automatycznie i ustawi role od, przez i do bazując na twoich wyborach.", "route_h": "Trasy", - "boundary_h": "Granice" + "route": "Relacja *trasy* jest grupą jednej lub więcej linii, które razem tworzą trasę taką, jak linia autobusowa, linia kolejowa lub szlak.", + "route_add": "Aby dodać obiekt do relacji trasy, wybierz go i przewiń do sekcji \"Wszystkie relacje\" w Edytorze obiektów, następnie kliknij przycisk {plus} dodaj, żeby dodać ten obiekt do pobliskiej już istniejącej relacji lub do nowej.", + "boundary_h": "Granice", + "boundary": "Relacja *granicy* jest grupą jednej lub więcej linii, które razem tworzą granicę administracyjną.", + "boundary_add": "Aby dodać obiekt do relacji granicy, wybierz go i przewiń w Edytorze obiektów do sekcji \"Wszystkie relacje\", następnie kliknij przycisk {plus} dodaj, żeby dodać ten obiekt do pobliskiej, już istniejącej relacji, lub do nowej." + }, + "notes": { + "title": "Uwagi", + "intro": "*Uwagi* są używane, aby ostrzegać innych użytkowników, że obiekt wymaga naprawy lub sprawdzenia. Uwagi wskazują na konkretną lokalizację na mapie. Aby zobaczyć istniejące uwagi lub dodać nowe, kliknij panel {data} **Dane mapy** i aktywuj warstwę uwag OpenStreetMap.", + "add_note_h": "Dodawanie uwag", + "add_note": "Aby dodać nową uwagę, kliknij przycisk {note} **Uwaga** na pasku powyżej mapy lub użyj skrótu klawiszowego '4'. Kursor myszy zmieni swój kształt na krzyżyk. Aby umieścić nową uwagę na mapie, ustaw kursor myszy w miejscu, w którym powinna się znaleźć i naciśnij {leftclick} lewy przycisk myszy lub `spację`.", + "move_note": "Tylko nowe uwagi mogą być przeniesione. Aby przenieść uwagę, umieść kursor myszy nad nią, naciśnij i przytrzymaj {leftclick} lewy przycisk myszy i przesuń ją do nowej lokalizacji.", + "update_note_h": "Zamykanie, ponowne otwieranie, komentowanie", + "update_note": "Istniejąca uwaga może być uaktualniona prze jej zamknięcie, ponowne otwarcie lub dodanie komentarza. Zamknięcie uwagi oznacza, że problem został rozwiązany. Ponowne otwarcie notatki wskazuje na to, że oryginalny problem jest wciąż nierozwiązany.", + "save_note_h": "Zapisywanie uwag", + "save_note": "Musisz zapisać każdą uwagę osobno poprzez kliknięcie przycisku poniżej jej treści. Uwagi **nie** są zawarte w zestawie zmian, który wysyłasz do OpenStreetMap." }, "imagery": { "title": "Zdjęcia podkładów tła", + "intro": "Warstwa tła, która pojawia się pod danymi mapy, jest ważnym źródłem podczas mapowania. Warstwą tła mogą być zdjęcia zrobione z satelitów, samolotów i dronów, a także zeskanowane historyczne mapy lub inne otwarte źródła danych.", "sources_h": "Żródła zdjęć", - "offsets_h": "Dopasowywanie przesunięcia obrazu podkładu" + "choosing": "Aby zobaczyć, jakie warstwy tła są dostępne do użycia, kliknij przycisk {layers} **Ustawienia tła** z boku mapy.", + "sources": "Domyślnie, jako tło wybrana jest warstwa satelitarna [Map Bing](https://www.bing.com/maps/). W zależności od miejsca, które edytujesz, mogą być dostępne inne warstawy tła. Niektóre mogą być nowsze lub o wyższej rozdzielczości, więc warto zawsze sprawdzić, która warstwa najlepiej nadaje się do mapowania.", + "offsets_h": "Dopasowywanie przesunięcia warstwy tła", + "offset": "Warstwa tła może być czasami delikatnie przesunięta względem mapy. Jeżeli zobaczysz, że wiele dróg lub budynków jest przesuniętych w stosunku do zdjęcia, problemem może być samo zdjęcie, więc nie dopasowuj do niego wszystkich danych. Zamiast tego możesz wyregulować położenie tła, aby pasowało do istniejących danych mapy. Aby to zrobić, rozwiń sekcję \"Dopasuj przesunięcie warstwy tła\" u dołu panelu ustawień tła.", + "offset_change": "Klikaj na trójkącikach, aby wyrównać przesunięcie podkładu w małych krokach lub przytrzymaj lewy przycisk myszy i przesuwaj tło w obrębie szarego kwadratu aż do jego dopasowania." }, "streetlevel": { "title": "Zdjęcia uliczne", - "using_h": "Korzystanie ze zdjęć ulic" + "intro": "Zdjęcia z poziomu ulicy są użyteczne przy mapowaniu znaków drogowych, firm i innych detali, których nie możesz zobaczyć na zdjęciach satelitarnych i lotniczych. Edytor iD obsługuje zdjęcia z poziomu ulicy z [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com) i [OpenStreetCam](https://www.openstreetcam.org).", + "using_h": "Korzystanie ze zdjęć ulic", + "using": "Aby użyć zdjęć z poziomu ulicy do mapowania, kliknij panel {data} **Dane mapy** obok mapy, żeby włączyć lub wyłączyć dostępne warstwy zdjęć.", + "photos": "Kiedy jest aktywna warstwa zdjęć, wyświetlana jest linia wzdłuż sekwencji zdjęć. Przy większych powiększeniach okrąg pokazuje miejsce zrobienia zdjęcia, a przy jeszcze większych zbliżeniach, pojawia się stożek wskazujący kierunek patrzenia aparatu.", + "viewer": "Kiedy klikniesz na jednej z lokalizacji zdjęć, w dolnym rogu mapy pokaże się przeglądarka zdjęć. Przeglądarka ma kontrolki do przechodzenia w przód i w tył sekwencji zdjęć. Dodatkowo pokazuje nazwę użytkownika, który wykonał dane zdjęcie, datę wykonania i link do obejrzenia zdjęcia na oryginalnej stronie." }, "gps": { "title": "Ślady GPS", @@ -890,18 +980,29 @@ }, "inspecting": { "title": "Sprawdzanie", - "from_shadow": "{fromShadow} **część OD**", - "allow_shadow": "{allowShadow} **TO Allowed**", - "only_shadow": "{onlyShadow} **tylko DO**" + "about": "Zatrzymaj kursor nad którymkolwiek segmentem **OD**, aby zobaczyć, czy ma on jakieś ograniczenia skrętów. Każdy możliwy kierunek **DO** będzie narysowany kolorowym cieniem pokazującym, czy istnieje jakieś ograniczenie.", + "from_shadow": "{fromShadow} **OD segment**", + "allow_shadow": "{allowShadow} **DO Dozwolone**", + "restrict_shadow": "{restrictShadow} **DO Ograniczone**", + "only_shadow": "{onlyShadow} **DO Tylko**", + "restricted": "\"Ograniczone\" oznacza, że w tym miejscu jest ograniczenie skrętu, np. \"zakaz skrętu w lewo\".", + "only": "\"Tylko\" oznacza, że pojazdy wybierające tą drogę mogą dokonać tylko takiego wyboru, np. \"tylko na wprost\"." }, "modifying": { "title": "Edytowanie", - "only_turn": "{onlyTurn} **tylko DO**" + "about": "Aby edytować ograniczenia skrętów, najpierw kliknij segment początkowy **OD**, żeby go wybrać. Zaznaczony odcinek będzie pulsował i wszystkie możliwe kierunki **DO** pojawią się jako znaki skrętu.", + "indicators": "Teraz kliknij na znak skrętu, aby przełączać się pomiędzy \"Dozwolony, \"Ograniczony\" i \"Tylko\".", + "allow_turn": "{allowTurn} **DO Dozwolonego**", + "restrict_turn": "{restrictTurn} **DO Ograniczonego**", + "only_turn": "{onlyTurn} **DO Tylko**" }, "tips": { "title": "Wskazówki", - "simple": "**Staraj się stosować proste, a nie rozbudowane zakazy/nakazy skrętu.**", - "simple_example": "Na przykład zamiast używać odcinka drogi w roli PRZEZ, użyj węzła, o ile jest to na danym skrzyżowaniu możliwe." + "simple": "**Staraj się stosować proste, a nie rozbudowane ograniczenia skrętu.**", + "simple_example": "Na przykład zamiast używać odcinka drogi w roli PRZEZ, użyj węzła, o ile jest to na danym skrzyżowaniu możliwe.", + "indirect": "**Niektóre ograniczenia mają dopisek \"(pośredni)\" i są słabiej widoczne.**", + "indirect_example": "Te ograniczenia istnieją, ponieważ wynikają z innych sąsiednich ograniczeń. Na przykład samo ograniczenie \"nakaz jazdy prosto\" pośrednio stworzy ograniczenia \"zakaz skrętu\" dla wszystkich pozostałych ścieżek przebiegających przez to skrzyżowanie.", + "indirect_noedit": "Nie możesz edytować ograniczeń pośrednich. Zamiast tego zmień najbliższe ograniczenie bezpośrednie." } } } @@ -1053,7 +1154,7 @@ "nodes_ways": "W OpenStreetMap punkty (ang. points) czasem nazywane są *węzłami* (ang. nodes), zaś linie oraz obszary są czasami nazywane *drogami* (ang. ways).", "click_townhall": "Wszystkie obiekty mogą zostać wybrane poprzez kliknięcie na nich. **Kliknij na punkt, aby go wybrać.**", "selected_townhall": "Świetnie! Wybrałeś punkt. Wybrane obiekty odznaczają się pulsującą poświatą.", - "editor_townhall": "Gdy dowolny obiekt jest wybrany *Edytor obiektu* staje się aktywny.", + "editor_townhall": "Gdy dowolny obiekt jest wybrany, *Edytor obiektu* staje się aktywny.", "preset_townhall": "Na samej górze Edytora obiektu pokazany jest rodzaj obiektu. Punkt, który wybrałeś, posiada rodzaj \"{preset}\".", "fields_townhall": "Środkowa część Edytora obiektu zawiera \"pola\" pokazujące atrybuty obiektu, takie jak jego nazwa i adres.", "close_townhall": "**Zamknij Edytor obiektu poprzez naciśnięcie klawisza Esc lub kliknięcie na {button} w górnym rogu.**", @@ -1082,6 +1183,7 @@ }, "areas": { "title": "Obszary", + "add_playground": "*Obszary* służą do wyznaczania granic dla takich obiektów jak jeziora, budynki czy osiedla mieszkaniowe.{br}Mogą również zostać użyte do mapowania wielu obiektów, które zwykle przedstawiane są za pomocą punktów. **Kliknij na {button} Obszar, by dodać nowy obszar.**", "start_playground": "Umieść plac zabaw na mapie poprzez narysowanie go jako obszaru. Obszary są rysowane poprzez umieszczanie \"węzłów\" wzdłuż zewnętrznego brzegu obiektu. **Kliknij lub naciśnij Spację i umieść punkt początkowy w jednym z rogów placu zabaw..**", "continue_playground": "Dalej rysuj obszar, umieszczając więcej punktów wzdłuż brzegu placu zabaw. Możesz przy tym łączyć obszar z już istniejącymi ścieżkami. {br}Podpowiedź: jeśli będziesz trzymać wciśnięty klawisz 'Alt', tworzone węzły nie zostaną połączone do już istniejących obiektów. **Narysuj cały obszar placu zabaw.**", "finish_playground": "Zakończ rysowanie obszaru poprzez naciśnięcie Enter lub poprzez ponowne kliknięcie na pierwszym lub ostatnim punkcie. **Zakończ rysowanie obszaru placu zabaw.**", @@ -1233,6 +1335,8 @@ "add_point": "Tryb 'Dodawanie punktu'", "add_line": "Tryb 'Dodawanie linii'", "add_area": "Tryb 'Dodawanie obszaru'", + "add_note": "tryb 'Dodaj uwagę'", + "place_point": "Umieść punkt lub uwagę", "disable_snap": "Przytrzymaj, by wyłączyć przyciąganie do punktu", "stop_line": "Zakończ rysowanie linii lub obszaru" }, @@ -1241,6 +1345,7 @@ "continue_line": "Kontynuuj linię w wybranym węźle", "merge": "Złącz (połącz) wybrane obiekty", "disconnect": "Rozłącz obiekty w wybranym węźle", + "detach_node": "Odłącz wybrany węzeł od linii/obszaru", "split": "Rozdziel linię na dwie części w wybranym węźle", "reverse": "Odwróć linię", "move": "Przenieś wybrane obiekty", @@ -1344,15 +1449,15 @@ "label": "Prawo wstępu/wjazdu mają", "options": { "designated": { - "description": "Dostęp jest dozwolony na podstawie znaków lub określonych przepisów lokalnych", + "description": "Dostęp dozwolony na podstawie znaków lub określonych przepisów lokalnych", "title": "Wyznaczony" }, "destination": { - "description": "Dostęp dozwolony tylko by dotrzeć do celu", + "description": "Dostęp dozwolony tylko, by dotrzeć do celu", "title": "Docelowy" }, "dismount": { - "description": "Dostęp dozwolony tylko, gdy kierujący/jeździec zsiądzie z pojazdu/zwierzęcia", + "description": "Dostęp dozwolony tylko, gdy jeździec zsiądzie z pojazdu/zwierzęcia", "title": "Zejdź z roweru i go poprowadź" }, "no": { @@ -1363,12 +1468,16 @@ "description": "Dostęp jest możliwy, ale właściciel może w każdej chwili wycofać zgodę", "title": "Dopuszczalny" }, + "permit": { + "description": "Dostęp dozwolony tylko z ważną zgodą lub zezwoleniem", + "title": "Za zezwoleniem" + }, "private": { - "description": "Dostęp jest dozwolony tylko za zgodą właściciela na zasadzie indywidualnej", + "description": "Dostęp dozwolony tylko za zgodą właściciela na indywidualnych zasadach", "title": "Prywatny" }, "yes": { - "description": "Dostęp przyznany przez prawo", + "description": "Dostęp zagwarantowany prawnie", "title": "Dozwolony" } }, @@ -1534,6 +1643,9 @@ "board_type": { "label": "Typ" }, + "booth": { + "label": "Budka" + }, "boules": { "label": "Rodzaj" }, @@ -1582,6 +1694,9 @@ "label": "Pojemność", "placeholder": "50, 100, 200..." }, + "cash_in": { + "label": "Wpłatomat" + }, "castle_type": { "label": "Rodzaj" }, @@ -1928,11 +2043,19 @@ } }, "horse_scale": { + "label": "Stopień trudności jazdy konnej", "options": { - "common": "Łatwe: Brak przeszkód, problemów. (domyślnie)" - } + "common": "Łatwe: Brak przeszkód, problemów. (domyślnie)", + "critical": "Na granicy: Tylko dla doświadczonych jeźdźców i koni. Znaczne utrudnienia. Należy dokładnie sprawdzić mosty.", + "dangerous": "Niebezpieczny: Tylko dla bardzo doświadczonych jeźdźców i koni i tylko przy dobrej pogodzie. Trzeba zsiadać z konia.", + "demanding": "Używać z ostrożnością: Nietypowa droga, możliwe trudne fragmenty.", + "difficult": "Trudny: Wąska i odsłonięta droga. Może zawierać przeszkody do przejścia i wąskie przesmyki.", + "impossible": "Nieprzejezdny: Droga lub most jest nieprzejezdny dla koni. Zbyt wąski, niewystarczająco mocny, przeszkody, np. drabiny. Niebezpieczne dla życia." + }, + "placeholder": "Trudne, Niebezpieczne..." }, "horse_stables": { + "label": "Stajnia", "options": { "stables": "Tak", "undefined": "Nie" @@ -2081,6 +2204,7 @@ "placeholder": "40, 50, 60..." }, "maxspeed/advisory": { + "label": "Zalecane ograniczenie prędkości", "placeholder": "40, 50, 60..." }, "maxstay": { @@ -2228,6 +2352,9 @@ "underground": "Podziemny" } }, + "passenger_information_display": { + "label": "System informacji pasażerskiej" + }, "payment_multi": { "label": "Rodzaje płatności" }, @@ -2452,12 +2579,17 @@ "siren/type": { "label": "Rodzaj", "options": { - "other": "Inny" + "electronic": "Elektroniczny", + "other": "Inny", + "pneumatic": "Pneumatyczny" } }, "site": { "label": "Typ" }, + "site_type": { + "label": "Rodzaj stanowiska" + }, "smoking": { "label": "Dla palących", "options": { @@ -2518,7 +2650,7 @@ "label": "Znak stop dotyczy", "options": { "all": "Wszystkie drogi", - "minor": "Drogi podporządkowane" + "minor": "Droga podporządkowana" } }, "structure": { @@ -2683,11 +2815,17 @@ "usage_rail": { "label": "Sposób użytkowania", "options": { + "branch": "Boczny", "industrial": "Przemysłowe", + "main": "Główny", "military": "Wojskowe", + "test": "Testowy", "tourism": "Turystyka" } }, + "vending": { + "label": "Rodzaje produktów" + }, "visibility": { "label": "Widoczność", "options": { @@ -2817,7 +2955,7 @@ "terms": "wyciąg hybrydowy, wyciąg mieszany" }, "aerialway/platter": { - "name": "Wyciag talerzykowy", + "name": "Wyciąg talerzykowy", "terms": "Wyciąg talerzykowy," }, "aerialway/pylon": { @@ -2825,14 +2963,14 @@ "terms": "Podpora, słup" }, "aerialway/rope_tow": { - "name": "Wyrwirączka", - "terms": "Wyrwirączka" + "name": "Wyciąg linowy", + "terms": "wyciąg linowy,wyrwirączka" }, "aerialway/station": { - "name": "Stacja wyciagu narciarskiego" + "name": "Stacja wyciągu" }, "aerialway/t-bar": { - "name": "Wyciag orczykowy podwójny", + "name": "Wyciąg orczykowy podwójny", "terms": "orczyk podwójny" }, "aeroway": { @@ -2927,7 +3065,7 @@ }, "amenity/biergarten": { "name": "Ogródek piwny", - "terms": "ogródek piwny" + "terms": "piwo,gorzałka,biergarten" }, "amenity/boat_rental": { "name": "Wypożyczalnia łodzi", @@ -3343,7 +3481,8 @@ "terms": "automat do sprzedaży jedzenia,jedzenie,pożywienie" }, "amenity/vending_machine/fuel": { - "name": "Pompa gazowa" + "name": "Pompa gazowa", + "terms": "dystrybutor,paliwo,gaz,benzyna,diesel,lng,cng,biodiesel" }, "amenity/vending_machine/ice_cream": { "name": "Automat do sprzedaży lodów", @@ -3413,8 +3552,8 @@ "terms": "nawierzchnia,gruntowa,polna" }, "attraction/amusement_ride": { - "name": "przejażdżka-atrakcja (ogólna)", - "terms": "przejażdżka-atrakcja (ogólna)" + "name": "Przejażdżka rozrywkowa", + "terms": "przejażdżka rozrywkowa" }, "attraction/animal": { "name": "Zwierzę", @@ -3958,24 +4097,28 @@ "name": "Docelowy dojazd dla służb ratowniczych" }, "emergency/fire_alarm": { - "name": "Skrzynka z alarmem przeciwpożarowym" + "name": "Skrzynka z alarmem przeciwpożarowym", + "terms": "skrzynka z alarmem przeciwpożarowym" }, "emergency/fire_extinguisher": { - "name": "Gaśnica" + "name": "Gaśnica", + "terms": "gaśnica" }, "emergency/fire_hydrant": { "name": "Hydrant przeciwpożarowy", "terms": "hydrant" }, "emergency/first_aid_kit": { - "name": "Apteczka" + "name": "Apteczka", + "terms": "apteczka,bandaż,pierwsza pomoc,zestaw medyczny" }, "emergency/life_ring": { "name": "Koło ratunkowe", "terms": "koło ratunkowe" }, "emergency/lifeguard": { - "name": "Ratownik" + "name": "Ratownik", + "terms": "ratownik,RKO,CPR,pomoc" }, "emergency/no": { "name": "Brak dojazdu dla służb ratowniczych" @@ -3991,7 +4134,8 @@ "name": "Prywatny dojazd dla służb ratowniczych" }, "emergency/siren": { - "name": "Syrena alarmowa" + "name": "Syrena alarmowa", + "terms": "syrena,alarm,nalot,głośno,hałas,sztorm,tornado,ostrzeżenie" }, "emergency/water_tank": { "name": "Zbiornik Wody", @@ -4097,7 +4241,8 @@ "terms": "hospicjum" }, "healthcare/laboratory": { - "name": "Laboratorium medyczne" + "name": "Laboratorium medyczne", + "terms": "laboratorium medyczne,badania krwi" }, "healthcare/midwife": { "name": "Położna", @@ -4326,7 +4471,7 @@ "terms": "miejsce,zawracania,zawracanie" }, "highway/turning_loop": { - "name": "Węzeł do zawracania (z wyspą)", + "name": "Pętla do zawracania (z wyspą)", "terms": "zawracanie" }, "highway/unclassified": { @@ -4453,7 +4598,8 @@ "terms": "Obszar przemysłowy" }, "landuse/industrial/scrap_yard": { - "name": "Stacja demontażu pojazdów" + "name": "Stacja demontażu pojazdów", + "terms": "złomowisko,złom,samochód,metal,szrot,odzysk,śmieci,pojazd,wrak" }, "landuse/industrial/slaughterhouse": { "name": "Rzeźnia", @@ -4559,6 +4705,14 @@ "name": "Salon gier hazardowych", "terms": "automat do gier" }, + "leisure/amusement_arcade": { + "name": "Salon gier", + "terms": "salon gier,automaty wrzutowe,gry wideo,symulatory jazdy,pinball" + }, + "leisure/beach_resort": { + "name": "Resort nadmorski", + "terms": "nadmorski ośrodek" + }, "leisure/bird_hide": { "name": "Czatownia ornitologiczna", "terms": "ornitologia, ptaki" @@ -4643,6 +4797,10 @@ "name": "Stanowisko do brzuszków", "terms": "stanowisko do brzuszków" }, + "leisure/fitness_station/stairs": { + "name": "Schody", + "terms": "schody,ćwiczenia,fitness,siłownia,gimnastyka,stopnie,ścieżka zdrowia" + }, "leisure/garden": { "name": "Ogród", "terms": "ogród" @@ -4675,6 +4833,10 @@ "name": "Rezerwat przyrody", "terms": "rezerwat" }, + "leisure/outdoor_seating": { + "name": "Ogródek", + "terms": "ogródek,al fresco,ogródek piwny,posiłki,kawa,kawiarnia,restauracja,pub,bar,patio,ogród" + }, "leisure/park": { "name": "Park rekreacyjno-wypoczynkowy", "terms": "park,wypoczynek,rekreacja,teren rekreacyjny" @@ -4691,6 +4853,10 @@ "name": "Boisko do futbolu amerykańskiego", "terms": "futbol amerykański" }, + "leisure/pitch/badminton": { + "name": "Kort do badmintona", + "terms": "badminton,kort,boisko" + }, "leisure/pitch/baseball": { "name": "Boisko do baseballu", "terms": "baseball" @@ -4803,6 +4969,10 @@ "name": "Sztolnia", "terms": "Tunel kopalniany" }, + "man_made/antenna": { + "name": "Antena", + "terms": "antena,nadawanie,telefon komórkowy,komórka,komunikacja,radio,telewizja,transmisja,tv" + }, "man_made/breakwater": { "name": "Falochron", "terms": "bodiony" @@ -4811,10 +4981,18 @@ "name": "Most/wiadukt", "terms": "most, wiadukt" }, + "man_made/bunker_silo": { + "name": "Silos", + "terms": "silos,zbiornik,magazyn" + }, "man_made/chimney": { "name": "Komin", "terms": "kominek" }, + "man_made/clearcut": { + "name": "Poręba", + "terms": "wyręba,poręba,wycinka,las,drewno,drzewo" + }, "man_made/crane": { "name": "Żuraw stacjonarny", "terms": "żuraw, dźwig" @@ -4871,7 +5049,7 @@ "terms": "rurociąg, gazociąg" }, "man_made/pumping_station": { - "name": "Przepompownia-ścieków,wody itp.", + "name": "Przepompownia", "terms": "przepompownia, pompy, pompa" }, "man_made/silo": { @@ -4991,7 +5169,8 @@ "terms": "szczyt,wierzchołek" }, "natural/reef": { - "name": "Rafa" + "name": "Rafa", + "terms": "rafa,rafa koralowa,bariera,koral,koralowiec,ocean,piasek,płycizna,mielizna" }, "natural/ridge": { "name": "Grzbiet Górski", @@ -5081,13 +5260,16 @@ "terms": "studio architektoniczne, biuro architektoniczne, pracownia architektoniczna" }, "office/association": { - "name": "Biuro Organizacji non-profit" + "name": "Biuro Organizacji non-profit", + "terms": "biuro organizacji non-profit,stowarzyszenie,non-profit,nonprofit,organizacja,społeczeństwo,społeczność" }, "office/charity": { - "name": "Organizacja Charytatywna" + "name": "Organizacja Charytatywna", + "terms": "biuro organizacji charytatywnej,organizacja charytatywna" }, "office/company": { - "name": "Biuro firmy" + "name": "Biuro firmy", + "terms": "biuro firmy" }, "office/coworking": { "name": "Centrum coworkingowe", @@ -5102,7 +5284,8 @@ "terms": "Agencja pracy, pośredniak, pośredniak, biuro pośrednictwa pracy, praca tymczasowa, pośrednictwo pracy" }, "office/energy_supplier": { - "name": "Biuro dostawcy energii." + "name": "Biuro dostawcy energii.", + "terms": "biuro dostawcy prądu,elektryczność,prąd,energia,firma energetyczna,zużycie energii,zużycie gazu" }, "office/estate_agent": { "name": "Biuro nieruchomości", @@ -5113,10 +5296,12 @@ "terms": "agent finansowy" }, "office/forestry": { - "name": "Leśnictwo" + "name": "Leśnictwo", + "terms": "biuro leśniczego,las,leśniczy" }, "office/foundation": { - "name": "Biuro fundacji" + "name": "Biuro fundacji", + "terms": "biuro fundacji,fundacja" }, "office/government": { "name": "Biuro rządowe lub samorządowe", @@ -5177,12 +5362,17 @@ "terms": "prywatny detektyw" }, "office/quango": { - "name": "Biuro organizacji prawie pozarządowej" + "name": "Biuro organizacji prawie pozarządowej", + "terms": "biuro organizacji quasi-ngo,ngo,organizacja pozarządowa,pozarządowa,organizacja,prawie niezależna" }, "office/research": { "name": "Biuro badawcze", "terms": "instytut badawczy" }, + "office/surveyor": { + "name": "Biuro geodety", + "terms": "biuro geodety,geodeta" + }, "office/tax_advisor": { "name": "Biuro rachunkowe", "terms": "biuro rachunkowe, podatki" @@ -5198,6 +5388,10 @@ "office/travel_agent": { "name": "Biuro podróży" }, + "office/water_utility": { + "name": "Biuro wodociągowe", + "terms": "biuro dostawcy wody,licznik wody,woda,media" + }, "piste": { "name": "Trasa narciarska", "terms": "Trasa narciarska" @@ -5260,6 +5454,10 @@ "name": "Wieś", "terms": "wieś, wioska" }, + "playground/balance_beam": { + "name": "Równoważnia", + "terms": "równoważnia" + }, "playground/basket_spinner": { "name": "Kosz obrotowy", "terms": "kosz obrotowy" @@ -5276,6 +5474,10 @@ "name": "Dmuchana trampolina", "terms": "trampolina, dmuchaniec" }, + "playground/horizontal_bar": { + "name": "Drążek", + "terms": "drążek,podciąganie" + }, "playground/rocker": { "name": "Bujak sprężynowy", "terms": "bujak sprężynowy, sprężynowiec" @@ -5351,7 +5553,8 @@ "terms": "podstacja energetyczna" }, "power/switch": { - "name": "Przełącznik wysokiego napięcia" + "name": "Przełącznik wysokiego napięcia", + "terms": "wyłącznik zasilania" }, "power/tower": { "name": "Słup wysokiego napięcia", @@ -5361,33 +5564,113 @@ "name": "Transformator", "terms": "transformator" }, + "public_transport/linear_platform": { + "name": "Przystanek / Peron", + "terms": "peron,przystanek,transport publiczny,transport,przewozy" + }, + "public_transport/linear_platform_aerialway": { + "name": "Przystanek / Peron wyciągu", + "terms": "przystanek wyciągu,peron,przystanek,wyciąg,kolejka linowa,transport publiczny,transport,przewozy" + }, "public_transport/linear_platform_bus": { - "name": "Przystanek autobusowy / platforma" + "name": "Przystanek autobusowy / platforma", + "terms": "przystanek autobusowy,peron,przystanek,autobus,transport publiczny,transport,przewozy" + }, + "public_transport/linear_platform_ferry": { + "name": "Przystanek / Peron promu", + "terms": "przystanek promu,peron,przystanek,prom,łódź,łódka,dok,port,nabrzeże,pomost,transport publiczny,transport,przewozy" + }, + "public_transport/linear_platform_light_rail": { + "name": "Przystanek / Peron kolei miejskiej", + "terms": "peron kolei miejskiej,peron,przystanek,kolej miejska,kolej elektryczna,tory,szyny,tramwaj,wagon,transport publiczny,transport,przewozy" + }, + "public_transport/linear_platform_monorail": { + "name": "Przystanek / Peron kolei jednoszynowej", + "terms": "peron kolei jednoszynowej,peron,przystanek,kolej jednoszynowa,tory,szyny,transport publiczny,transport,przewozy" + }, + "public_transport/linear_platform_subway": { + "name": "Przystanek / Peron metra", + "terms": "peron metra,peron,przystanek,metro,tor,szyna,transport publiczny,transport,przewozy" + }, + "public_transport/linear_platform_train": { + "name": "Przystanek / Peron kolejowy", + "terms": "peron kolejowy,peron,przystanek,kolej,tory,szyny,pociąg,transport publiczny,transport,przewozy" }, "public_transport/linear_platform_tram": { "name": "Przystanek tramwajowy", "terms": "przystanek tramwajowy" }, + "public_transport/linear_platform_trolleybus": { + "name": "Przystanek / Peron trolejbusowy", + "terms": "przystanek trolejbusowy,peron,przystanek,trolejbus,autobus,tramwaj,elektryczny,transport publiczny,transport,przewozy" + }, + "public_transport/platform": { + "name": "Przystanek / Peron", + "terms": "przystanek,peron,transport publiczny,transport,przewozy" + }, + "public_transport/platform_aerialway": { + "name": "Przystanek / Peron wyciągu", + "terms": "przystanek wyciągu,peron,przystanek,wyciąg,kolejka linowa,transport publiczny,transport,przewozy" + }, "public_transport/platform_bus": { "name": "Przystanek autobusowy", "terms": "przystanek autobusowy" }, + "public_transport/platform_ferry": { + "name": "Przystanek / Peron promu", + "terms": "przystanek promu,peron,przystanek,prom,łódź,łódka,dok,port,nabrzeże,pomost,transport publiczny,transport,przewozy" + }, + "public_transport/platform_light_rail": { + "name": "Przystanek / Peron kolei miejskiej", + "terms": "peron kolei miejskiej,peron,przystanek,kolej miejska,kolej elektryczna,tory,szyny,tramwaj,wagon,transport publiczny,transport,przewozy" + }, + "public_transport/platform_monorail": { + "name": "Przystanek / Peron kolei jednoszynowej", + "terms": "peron kolei jednoszynowej,peron,przystanek,kolej jednoszynowa,tory,szyny,transport publiczny,transport,przewozy" + }, + "public_transport/platform_subway": { + "name": "Przystanek / Peron metra", + "terms": "peron metra,peron,przystanek,metro,tory,szyny,transport publiczny,transport,przewozy" + }, "public_transport/platform_train": { "name": "Peron kolejowy", "terms": "peron kolejowy" }, "public_transport/platform_tram": { - "name": "Przystanek tramwajowy / peron" + "name": "Przystanek tramwajowy / peron", + "terms": "przystanek tramwajowy,peron,przystanek,kolej miejska,tramwaj,elektryczny,wagon,tory,szyny,transport publiczny,transport,przewozy" + }, + "public_transport/platform_trolleybus": { + "name": "Przystanek / Peron trolejbusowy", + "terms": "przystanek trolejbusowy,peron,przystanek,trolejbus,autobus,tramwaj,elektryczny,transport publiczny,transport,przewozy" + }, + "public_transport/station": { + "name": "Stacja", + "terms": "stacja,transport publiczny,terminal,dworzec,transport,przewozy" }, "public_transport/station_aerialway": { - "name": "Stacja publicznej kolejki linowej" + "name": "Stacja publicznej kolejki linowej", + "terms": "stacja wyciągu,wyciąg,kolejka linowa,transport publiczny,stacja,terminal,dworzec,transport,przewozy" }, "public_transport/station_bus": { "name": "Dworzec autobusowy", "terms": "dworzec autobusowy, pks" }, + "public_transport/station_ferry": { + "name": "Terminal promowy", + "terms": "terminal promowy,prom,łódź,łódka,dok,port,nabrzeże,pomost,terminal,stacja,transport publiczny,transport,przewozy" + }, + "public_transport/station_light_rail": { + "name": "Stacja kolei miejskiej", + "terms": "stacja kolei miejskiej,kolej miejska,kolej elektryczna,tory,szyny,tramwaj,wagon,terminal,stacja,dworzec,transport publiczny,transport,przewozy" + }, + "public_transport/station_monorail": { + "name": "Stacja kolei jednoszynowej", + "terms": "stacja kolei jednoszynowej,kolej jednoszynowa,kolej elektryczna,tory,szyny,terminal,stacja,dworzec,transport publiczny,transport,przewozy" + }, "public_transport/station_subway": { - "name": "Stacja metra" + "name": "Stacja metra", + "terms": "stacja metra,metro,tory,szyny,terminal,stacja,dworzec,transport publiczny,transport,przewozy" }, "public_transport/station_train": { "name": "Stacja kolejowa pasażerska", @@ -5401,6 +5684,38 @@ "name": "Stacja tramowajowa", "terms": "stacja tramwajowa, dworzec tramwajowy" }, + "public_transport/station_trolleybus": { + "name": "Stacja / Dworzec trolejbusowy", + "terms": "dworzec trolejbusowy,autobus,trolejbus,tramwaj,wagon,terminal,stacja,dworzec,transport publiczny,transport,przewozy" + }, + "public_transport/stop_area": { + "name": "Obszar zatrzymania", + "terms": "obszar zatrzymania,transport publiczny,transport,przewozy" + }, + "public_transport/stop_position": { + "name": "Miejsce zatrzymania", + "terms": "miejsce zatrzymania,transport publiczny,transport,przewozy" + }, + "public_transport/stop_position_aerialway": { + "name": "Miejsce zatrzymania się wyciągu", + "terms": "miejsce zatrzymania wyciągu,wyciąg,kolejka linowa,transport publiczny,transport,przewozy" + }, + "public_transport/stop_position_bus": { + "name": "Miejsce zatrzymania się autobusu", + "terms": "miejsce zatrzymania autobusu,autobus,transport publiczny,transport,przewozy" + }, + "public_transport/stop_position_ferry": { + "name": "Miejsce zatrzymania się promu", + "terms": "miejsce zatrzymania promu,prom,łódź,łódka,dok,port,nabrzeże,pomost,transport publiczny,transport,przewozy" + }, + "public_transport/stop_position_light_rail": { + "name": "Miejsce zatrzymania się kolei miejskiej", + "terms": "miejsce zatrzymania kolei miejskiej,kolej miejska,kolej elektryczna,tory,szyny,tramwaj,wagon,terminal,stacja,dworzec,transport publiczny,transport,przewozy" + }, + "public_transport/stop_position_monorail": { + "name": "Miejsce zatrzymania się kolei jednoszynowej", + "terms": "miejsce zatrzymania kolei jednoszynowej,kolej jednoszynowa,transport publiczny,transport,przewozy" + }, "public_transport/stop_position_subway": { "name": "Miejsce zatrzymania się metra", "terms": "miejsce zatrzymania się metra" @@ -5451,6 +5766,10 @@ "name": "przejazd kolejowy (jezdnia)", "terms": "przejazd kolejowy" }, + "railway/light_rail": { + "name": "Kolej miejska", + "terms": "kolej miejska,wagon,tramwaj" + }, "railway/milestone": { "name": "Słupek kilometrowy", "terms": "słupek kilometrowy, pikietaż" @@ -5837,6 +6156,10 @@ "name": "Dealer motocykli", "terms": "Dealer motocyklowy" }, + "shop/motorcycle_repair": { + "name": "Warsztat motocyklowy", + "terms": "warsztat motocyklowy,samochód,auto,rower,garaż,motor,motocykl,naprawa,serwis" + }, "shop/music": { "name": "Sklep muzyczny", "terms": "sklep muzyczny" @@ -5885,6 +6208,10 @@ "name": "Sklep zoologiczny", "terms": "Sklep zoologiczny" }, + "shop/pet_grooming": { + "name": "Salon fryzjerski dla zwierząt", + "terms": "psi fryzjer" + }, "shop/photo": { "name": "Sklep fotograficzny", "terms": "fotografia" @@ -5926,8 +6253,8 @@ "terms": "papierniczy" }, "shop/storage_rental": { - "name": "Przechowalnia rzeczy/pojazdów (długoterminowa)", - "terms": "przechowalnia rzeczy, przechowalnia pojazdów" + "name": "Przechowalnia rzeczy (długoterminowa)", + "terms": "przechowalnia rzeczy, przechowalnia pojazdów,magazyn" }, "shop/supermarket": { "name": "Supermarket", @@ -6104,10 +6431,18 @@ "name": "Park rozrywki", "terms": "park tematyczny" }, + "tourism/trail_riding_station": { + "name": "Konny ośrodek wypoczynkowy", + "terms": "konny ośrodek wypoczynkowy" + }, "tourism/viewpoint": { "name": "Punkt widokowy", "terms": "punkt obserwacyjny" }, + "tourism/wilderness_hut": { + "name": "Odosobniona chata-schronienie dla turystów", + "terms": "chata na odludziu,szałas,chata,chatka,wiejska chata,budka" + }, "tourism/zoo": { "name": "Zoo", "terms": "Zoo, ogród zoologiczny" @@ -6184,15 +6519,15 @@ "terms": "zakaz,zawracanie" }, "type/restriction/only_left_turn": { - "name": "Tylko skręt w lewo", + "name": "Nakaz skrętu w lewo", "terms": "tylko w lewo,nakaz skrętu w lewo" }, "type/restriction/only_right_turn": { - "name": "Tylko skręt w prawo", + "name": "Nakaz skrętu w prawo", "terms": "tylko w prawo, nakaz skrętu w prawo" }, "type/restriction/only_straight_on": { - "name": "Tylko jazda prosto", + "name": "Nakaz jazdy prosto", "terms": "tylko prosto, nakaz jazdy na wprost" }, "type/restriction/only_u_turn": { @@ -6231,10 +6566,18 @@ "name": "Szlak konny", "terms": "szlak konny" }, + "type/route/light_rail": { + "name": "Linia kolei miejskiej", + "terms": "trasa kolei miejskiej" + }, "type/route/pipeline": { "name": "Trasa rurociągu", "terms": "przebieg rurociągu" }, + "type/route/piste": { + "name": "Trasa narciarska", + "terms": "trasa narciarska" + }, "type/route/power": { "name": "Trasa linii elektrycznej", "terms": "przebieg linii elektrycznej" @@ -6328,7 +6671,7 @@ }, "waterway/waterfall": { "name": "Wodospad", - "terms": "siklawa" + "terms": "wodospad,siklawa" }, "waterway/weir": { "name": "Jaz", @@ -6363,6 +6706,7 @@ "attribution": { "text": "Warunki użytkowania i opinia" }, + "description": "DigitalGlobe-Premium to mozaika stworzona z podstawowych map DigitalGlobe z wybranymi obszarami uzupełnionymi o +Vivid lub innymi obrazami innych obszarów, rozdzielczość 50cm lub wyższa, odświeżana częściej wraz z bieżącymi aktualizacjami.", "name": "DigitalGlobe Premium (satelitarne)" }, "DigitalGlobe-Premium-vintage": { @@ -6456,6 +6800,12 @@ }, "name": "Inspektor OSM: Tagowanie" }, + "SPW_ORTHO_LAST": { + "name": "Najświeższe zdjęcia lotnicze SPW(allonie)" + }, + "SPW_PICC": { + "name": "Obrazowanie numeryczne SPW(allonie) PICC" + }, "US-TIGER-Roads-2012": { "name": "TIGER Roads 2012" }, @@ -6472,15 +6822,27 @@ "name": "Nakładka z drogami z U.S. Forest" }, "UrbISOrtho2016": { + "attribution": { + "text": "Zrealizowano za pomocą Brussels UrbIS®© - Dystrybucja i prawa autorskie CIRB" + }, "name": "UrbIS-Ortho 2016" }, "UrbISOrtho2017": { + "attribution": { + "text": "Zrealizowano za pomocą Brussels UrbIS®© - Dystrybucja i prawa autorskie CIRB" + }, "name": "UrbIS-Ortho 2017" }, "UrbisAdmFR": { + "attribution": { + "text": "Zrealizowano za pomocą Brussels UrbIS®© - Dystrybucja i prawa autorskie CIRB" + }, "name": "UrbisAdm Francja" }, "UrbisAdmNL": { + "attribution": { + "text": "Zrealizowano za pomocą Brussels UrbIS®© - Dystrybucja i prawa autorskie CIRB" + }, "name": "UrbisAdm Holandia" }, "Waymarked_Trails-Cycling": { @@ -6533,6 +6895,27 @@ }, "name": "Hike & Bike" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Szlaki skuterów śnieżnych Kelkkareitit.fi z OSM (kraje nordyckie)", + "name": "Nakładka nordycka dla skuterów śnieżnych" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mozaika szwedzkich ortofotomap z okresu 1955-1965. Mogą pojawiać się starsze i nowsze zdjęcia.", + "name": "Historyczne ortofotomapy Lantmäteriet 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mozaika szwedzkich ortofotomap z okresu 1970-1980. W budowie.", + "name": "Historyczne ortofotomapy Lantmäteriet 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Warunki użytkowania i opinia" @@ -6569,8 +6952,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Skan \"Map ekonomicznych\" ok. 1950-1980", - "name": "Mapa ekonomiczna Lantmäteriet (historyczna)" + "description": "Skany \"Economic maps\" ok. 1950-1980", + "name": "Mapa ekonomiczna Lantmäteriet 1950-1980" }, "qa_no_address": { "attribution": { @@ -6584,6 +6967,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Szlaki skuterów śnieżnych", + "name": "Mapa Szwecji dla skuterów śnieżnych" + }, "stamen-terrain-background": { "attribution": { "text": "Kafle mapy od Stamen Design, licencja CC BY 3.0. Dane z OpenStreetMap, licencja ODbL" @@ -6612,189 +7002,469 @@ "trafikverket-baninfo-option": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "description": "Szwedzka sieć kolejowa z kilkoma wariantami warstw mapy", + "name": "Opcje sieci kolejowej Trafikverket" }, "trafikverket-vagnat": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "description": "Szwedzka sieć drogowa NVDB", + "name": "Sieć drogowa Trafikverket" }, "trafikverket-vagnat-extra": { "attribution": { "text": "© Trafikverket, CC0" - } + }, + "description": "Dodatkowe szczegóły szwedzkiej NVDB: numery dróg, uspokojenia ruchu, miejsca odpoczynku, przystanki autobusowe, mosty, tunele, fotoradary", + "name": "Dodatki sieci drogowej Trafikverket" }, "trafikverket-vagnat-navn": { "attribution": { "text": "© Trafikverket, CC0" }, - "description": "Szwedzkie nazwy ulic NVDB" + "description": "Szwedzkie nazwy ulic NVDB", + "name": "Nazwy ulic Trafikverket" }, "trafikverket-vagnat-option": { "attribution": { "text": "© Trafikverket, CC0" }, - "description": "Szwedzka sieć drogoa NVDV z wieloma warstwami mapowymi" + "description": "Szwedzka sieć drogowa NVDV z kilkoma wariantami warstw mapy", + "name": "Opcje sieci drogowej Trafikverket" } }, "community": { + "bw-facebook": { + "name": "Mapowanie Botswany na Facebooku", + "description": "Strona OpenStreetMap w Botswanie" + }, + "bw-twitter": { + "name": "Mapowanie Botswany na Twitterze", + "description": "OpenStreetMap Botswana na Twitterze" + }, "cape-coast-youthmappers": { - "description": "Obserwuj nas na Twitterze: {url}" + "name": "YouthMappers z Uniwersytetu w Cape Coast", + "description": "Obserwuj nas na Twitterze: {url}", + "extendedDescription": "To jest oficjalne odniesienie do sekcji Youth Mappers z Uniwersytetu Cape Coast w Ghanie. Kochamy mapy, otwarte dane i pomoc bezbronnym." }, "osm-gh-facebook": { - "name": "OpenStreetMap Ghana na Facebook'u", - "description": "Grupa w serwisie Facebook dla osób zainteresowanych OpenStreetMap." + "name": "OpenStreetMap Ghana na Facebooku", + "description": "Grupa na Facebooku dla osób zainteresowanych OpenStreetMap.", + "extendedDescription": "Maperzy z ghańskiej społczności promujący projekty OpenStreetMap i Humanitarian OpenStreetMap Team (HOT) w Ghanie. Dołącz do nas." }, "osm-gh-twitter": { - "name": "OpenStreetMap Ghana na Twitter'rze", + "name": "OpenStreetMap Ghana na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, "talk-gh": { "name": "Lista dyskusyjna Talk-gh", - "description": "Talk-gh to oficjalna mailingowa lista dyskusyjna społeczności OSM w Ghanie" + "description": "Talk-gh to oficjalna lista dyskusyjna ghańskiej społeczności OSM" }, "osm-mg-facebook": { - "name": "Grupa facebookowa OpenStreetMap Madagaskar" + "name": "OpenStreetMap Madagaskar na Facebooku", + "description": "Grupa na Facebooku dla osób z Madagaskaru zainteresowanych OpenStreetMap." }, "talk-mg": { - "name": "Lista dyskusyjna Talk-mg" + "name": "Lista dyskusyjna Talk-mg", + "description": "Miejsce rozmów twórców, społeczności i użytkowników OpenStreetMap na Madagaskarze." }, "OSM-BGD-facebook": { "name": "OpenStreetMap Bangladesz", - "description": "Ulepsz OpenStreetMap w Bangladeszu" + "description": "Ulepsz OpenStreetMap w Bangladeszu", + "extendedDescription": "Mapujesz w Bangladeszu? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!" }, "OSM-India-facebook": { + "name": "OpenStreetMap Indie - Uczestniczący w mapowaniu sąsiedztwa", "description": "Ulepsz OpenStreetMap w Indiach", + "extendedDescription": "Mapujesz w Indiach? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!", "events": { "sotmasia2018": { - "name": "State of the Map Azja 2018" + "name": "State of the Map Azja 2018", + "description": "Dołącz do regionalnego wydarzenia OpenStreetMap, State of the Map Azja 2018 w Indiach", + "where": "Indian Institute of Management, Bangalore, India" } } }, "OSM-india-mailinglist": { "name": "Lista dyskusyjna OpenStreetMap Indie", - "description": "Talk-in to oficjalna mailingowa lista dyskusyjna społeczności OSM w Indiach" + "description": "Talk-in to oficjalna lista dyskusyjna hinduskiej społeczności OSM" }, "OSM-india-twitter": { - "name": "OpenStreetMap India Twitter" + "name": "OpenStreetMap Indie na Twitterze", + "description": "Jesteśmy na Twitterze: {url}" + }, + "OSM-India-Puducherry-Facebook": { + "name": "Free Software Hardware Movement - Facebook", + "description": "Strona FSHM na Facebooku, aby być na bieżąco z wydarzeniami społeczności", + "extendedDescription": "FSHM organizuje wydarzenia związane z wolnym oprogramowaniem/sprzętem, technologią, aktywizmem i OpenStreetMap. Aby być z nimi na bieżąco obserwuj ich stronę na FB." + }, + "OSM-India-Puducherry-Matrix": { + "name": "Free Software Hardware Movement - Matrix", + "description": "Grupa FSHM na Riot do dyskusji, dzielenia się i aktualizacji działań maperów, oraz wydarzeń w okolicach Puducherry", + "extendedDescription": "Członkowie społeczności FSHM dzielą się swoimi aktualizacjami/doświadczeniami z OSM poprzez grupę Riot.im. Grupa ta jest również używana do dyskusji o rzeczach związanych z wolnym oprogramowaniem/sprzętem, technologią i aktywizmem." }, "OSM-IDN-facebook": { "name": "OpenStreetMap Indonezja", - "description": "Ulepsz OpenStreetMap w Indonezji" + "description": "Ulepsz OpenStreetMap w Indonezji", + "extendedDescription": "Mapujesz w Indonezji? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!" + }, + "OSM-japan-facebook": { + "name": "OpenStreetMap japońska społeczność", + "description": "Maperzy i użytkownicy OpenStreetMap w Japonii" }, "OSM-japan-mailinglist": { - "name": "Lista dyskusyjna OpenStreetMap Japonia" + "name": "Lista dyskusyjna OpenStreetMap Japonia", + "description": "Talk-ja to oficjalna lista dyskusyjna japońskiej społeczności" }, "OSM-japan-twitter": { + "name": "OpenStreetMap Japonia na Twitterze", "description": "Hashtag na Twitterze: {url}" }, "OSM-japan-website": { - "name": "OpenStreetMap Japonia" + "name": "OpenStreetMap Japonia", + "description": "Maperzy i użytkownicy OpenStreetMap w Japonii" + }, + "OSM-korea-telegram": { + "name": "Kanał OSM Korea na Telegramie", + "description": "Nieoficjalny kanał twórców, społeczności i użytkowników OpenStreetMap w Korei." + }, + "OSM-MY-facebook": { + "name": "OpenStreetMap Malezja na Facebooku", + "description": "Do rozmów o wszystkim powiązanym z OpenStreetMap!" + }, + "OSM-MY-forum": { + "name": "Forum OpenStreetMap Malezja", + "description": "Oficjalne forum OpenStreetMap Malezja" + }, + "OSM-MY-matrix": { + "name": "Kanał OpenStreetMap zamieszki w Malezji", + "description": "Zapraszamy wszystkich maperów! Zarejestruj się tutaj {signupUrl}" }, "OSM-MNG-facebook": { - "name": "OpenStreetMap Mongolia" + "name": "OpenStreetMap Mongolia", + "description": "Ulepsz OpenStreetMap w Mongolii", + "extendedDescription": "Mapujesz w Mongolii? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!" }, "OSM-MMR-facebook": { - "name": "OpenStreetMap Mjanma" + "name": "OpenStreetMap Mjanma", + "description": "Ulepsz OpenStreetMap w Myanmarze", + "extendedDescription": "Mapujesz w Myanmarze? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!" }, "OSM-Nepal-facebook": { "name": "OpenStreetMap Nepal", - "description": "Ulepsz OpenStreetMap w Nepalu" + "description": "Ulepsz OpenStreetMap w Nepalu", + "extendedDescription": "Mapujesz w Nepalu? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!" + }, + "OSM-PH-facebook": { + "name": "OpenStreetMap PH na Facebooku", + "description": "Witamy w OpenStreetMap Filipiny, gdzie zachęcamy wszystkich Filipińczyków do uczestnictwa w projekcie OpenStreetMap." }, "OSM-PH-mailinglist": { "name": "Lista dyskusyjna Talk-ph", - "description": "Mailingowa lista dyskusyjna OpenStreetMap na Filipinach" + "description": "Lista dyskusyjna OpenStreetMap na Filipinach" + }, + "OSM-PH-slack": { + "name": "OpenStreetMap PH na Slack", + "description": "Zapraszamy wszystkich! Zarejestruj się tutaj {signupUrl}" + }, + "OSM-PH-telegram": { + "name": "OpenStreetMap PH na Telegramie", + "description": "Nieoficjalna społeczność twórców i przyjaciół OpenStreetMap w Filipinach na Telegramie" }, "OSM-RU-forum": { - "name": "OpenStreetMap RU forum", - "description": "OpenStreetMap Rosja forum www" + "name": "Forum OpenStreetMap RU", + "description": "Forum www OpenStreetMap Rosja" }, "OSM-RU-telegram": { - "name": "OpenStreetMap RU telegram" + "name": "OpenStreetMap RU na Telegramie", + "description": "Kanał OpenStreetMap Rosja na Telegramie" }, "OSM-LKA-facebook": { - "name": "OpenStreetMap Sri Lanka" + "name": "OpenStreetMap Sri Lanka", + "description": "Ulepsz OpenStreetMap na Sri Lance", + "extendedDescription": "Mapujesz na Sri Lance? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!" + }, + "OSM-TW-facebook": { + "name": "OpenStreetMap tajwańska społeczność", + "description": "Grupa na Facebooku dla maperów i użytkowników OpenStreetMap w kwestii Tajwanu." }, "OSM-TW-mailinglist": { "name": "Lista dyskusyjna OpenStreetMap Tajwan", - "description": "Talk-tw to oficjalna mailingowa lista dyskusyjna społeczności w kwestii Tajwanu" + "description": "Talk-tw to oficjalna lista dyskusyjna społeczności w kwestii Tajwanu" + }, + "OSM-TH-CNX-meetup": { + "name": "Spotkania OSM Chiang Mai", + "description": "Nieregularne spotkania społeczności OpenStreetMap w Chiang Mai", + "extendedDescription": "Członkowie społeczności OpenStreetMap spotykają się co kilka miesięcy w Chiang Mai. Bądź na bieżąco i sprawdzaj {url}, żeby zobaczyć, na kiedy planujemy następne spotkanie" + }, + "OSM-TH-facebook": { + "name": "OpenStreetMap TH na Facebooku", + "description": "Grupa na Facebooku dla maperów OpenStreetMap z Tajlandii." + }, + "OSM-TH-forum": { + "name": "Forum OpenStreetMap TH", + "description": "Forum www OpenStreetMap Tajlandia" + }, + "al-forum": { + "name": "Forum OSM Albania", + "description": "Forum OpenStreetMap Albania" + }, + "al-maptime-tirana": { + "name": "Maptime Tirana", + "description": "Imprezy towarzyszące mapowaniu - początkujący bardzo mile widziani!", + "extendedDescription": "Maptime jest otwartym środowiskiem nauki dla wszystkich stopni i poziomów wiedzy, oferującym celowe wsparcie edukacyjne dla początkujących. Maptime jest jednocześnie elastyczne i usystematyzowane, tworząc miejsce dla podręczników i warsztatów mapowania, bieżących projektów z określonym wspólnym celem, jak i niezależnej lub wspólnej pracy." + }, + "al-telegram": { + "name": "Kanał OSM Albania na Telegramie", + "description": "Kanał OpenStreetMap Albania na Telegramie" + }, + "at-forum": { + "name": "Forum OpenStreetMap Austria", + "description": "Oficjalne forum dotyczące OpenStreetMap w Austrii i okolicach" }, "at-mailinglist": { "name": "Lista dyskusyjna Talk-at", - "description": "Talk-at to oficjalna mailingowa lista dyskusyjna austriackiej społeczności OSM" + "description": "Talk-at to oficjalna lista dyskusyjna austriackiej społeczności OSM" + }, + "at-twitter": { + "name": "OpenStreetMap Austria na Twitterze", + "description": "OpenStreetMap Austria na Twitterze: {url}" + }, + "osmgraz-meetup": { + "name": "Spotkania społeczności OSM Graz", + "description": "Comiesięczne spotkania społeczności OpenStreetMap Graz" + }, + "osmgraz-twitter": { + "name": "Społeczność OSM Graz na Twitterze", + "description": "Społeczność OpenStreetMap Graz na Twitterze" }, "osm-at": { - "name": "OpenStreetMap Austria" + "name": "OpenStreetMap Austria", + "description": "Platforma z informacjami o OpenStreetMap w Austrii" }, "byosm": { "name": "OpenStreetMap Białoruś", - "description": "OpenStreetMap Białoruś - czat na Telegramie" + "description": "Kanał OpenStreetMap Białoruś na Telegramie" + }, + "be-facebook": { + "name": "Społeczność OpenStreetMap BE", + "description": "Maperzy i OpenStreetMap Belgia na Facebooku" }, "be-forum": { - "description": "Forum OpenStreetMap Belgium " + "name": "Forum OpenStreetMap BE", + "description": "Forum www OpenStreetMap Belgia" + }, + "be-irc": { + "name": "OpenStreetMap Belgia na IRC", + "description": "Dołącz do #osmbe na irc.oftc.net (port 6667)", + "extendedDescription": "Dołącz do #osmbe na irc.oftc.net (port 6667), który jest połączony z kanałem Matrixa" }, "be-mailinglist": { "name": "Lista dyskusyjna Talk-be", - "description": "Talk-be to oficjalna mailingowa lista dyskusyjna belgijskiej społeczności OSM " + "description": "Talk-be to oficjalna lista dyskusyjna belgijskiej społeczności OSM" }, "be-maptime": { - "name": "Maptime Belgia" + "name": "Maptime Belgia", + "description": "Imprezy towarzyszące mapowaniu - początkujący bardzo mile widziani!", + "extendedDescription": "Maptime jest otwartym środowiskiem nauki dla wszystkich stopni i poziomów wiedzy, oferującym celowe wsparcie edukacyjne dla początkujących. Maptime jest jednocześnie elastyczne i usystematyzowane, tworząc miejsce dla podręczników i warsztatów mapowania, bieżących projektów z określonym wspólnym celem, jak i niezależnej lub wspólnej pracy." }, "be-matrix": { - "description": "Wszyscy mapujący są mile widziani!" + "name": "Kanał OpenStreetMap BE na Matrixie", + "description": "Wszyscy mapujący są mile widziani!", + "extendedDescription": "Większość rozmów ma miejsce na kanale \"OpenStreetMap Belgia\". Możesz tam zapytać o wszystko! Inne pokoje są używane dla specyficznych tematów." + }, + "be-meetup": { + "name": "Spotkania OpenStreetMap Belgia", + "description": "Spotkania dla wszystkich zainteresowanych OpenStreetMap", + "extendedDescription": "Spotkania są świetną okazją, żeby poznawać innych maperów, zadawać im pytania i nauczyć się czegoś nowego. Zwłaszcza nowi twórcy są bardzo mile widziani!" + }, + "be-twitter": { + "name": "OpenStreetMap Belgia na Twitterze", + "description": "OSM Belgia na Twitterze: @osm_be" }, "hr-facebook": { - "description": "OpenStreetMap Chorwacja - grupa Facebookowa" + "name": "OpenStreetMap Chorwacja na Facebooku", + "description": "OpenStreetMap Chorwacja na Facebooku" + }, + "hr-irc": { + "name": "OpenStreetMap Chorwacja na IRC", + "description": "Dołącz do #osm-hr na irc.freenode.org (port 6667)" + }, + "hr-mailinglist": { + "name": "Lista dyskusyjna Talk-hr", + "description": "Lista dyskusyjna Talk-hr" }, "czech-community": { - "name": "Czeska społeczność OSM" + "name": "Czeska społeczność OSM", + "description": "Portal, strona i kontakty do członków OSM w Czechach." + }, + "osmcz-facebook": { + "name": "OpenStreetMap CZ na Facebooku", + "description": "Obserwuj czeską społeczność na Facebooku - zawiera tłumacznie WeeklyOSM!" + }, + "osmcz-twitter": { + "name": "Czeski Twitter @osmcz", + "description": "Obserwuj czeską społeczność na Twitterze - zawiera tłumacznie WeeklyOSM!" }, "talk-cz-mailinglist": { - "description": "Talk-cz to oficjalna mailingowa lista dyskusyjna czeskiej społeczności OSM" + "name": "Czeska lista dyskusyjna (talk-cz)", + "description": "Talk-cz to oficjalna lista dyskusyjna czeskiej społeczności" + }, + "dk-forum": { + "name": "Forum www OpenStreetMap Dania", + "description": "Forum www OpenStreetMap Dania" + }, + "dk-irc": { + "name": "OpenStreetMap Dania na IRC", + "description": "Dołącz do #osm-dk na irc.oftc.net (port 6667)" }, "dk-mailinglist": { - "name": "Lista dyskusyjna Talk-dk" + "name": "Lista dyskusyjna Talk-dk", + "description": "Lista dyskusyjna OpenStreetMap w Danii" + }, + "fi-forum": { + "name": "Forum OpenStreetMap FI", + "description": "Forum www OpenStreetMap Finlandia" + }, + "fi-irc": { + "name": "OpenStreetMap Finlandia na IRC", + "description": "Dołącz do #osm-fi na irc.oftc.net (port 6667)" + }, + "fi-mailinglist": { + "name": "Lista dyskusyjna Talk-fi", + "description": "Talk-fi to oficjalna lista dyskusyjna fińskiej społeczności OSM" + }, + "fr-facebook": { + "name": "OpenStreetMap Francja na Facebooku", + "description": "OpenStreetMap Francja na Facebooku" + }, + "fr-forum": { + "name": "Forum www OpenStreetMap Francja", + "description": "Forum www OpenStreetMap Francja" + }, + "fr-irc": { + "name": "OpenStreetMap Francja na IRC", + "description": "Dołącz do #osm-fr na irc.oftc.net (port 6667)" }, "fr-mailinglist": { "name": "Lista dyskusyjna Talk-fr", "description": "Lista dyskusyjna Talk-fr" }, + "fr-twitter": { + "name": "OpenStreetMap Francja na Twitterze", + "description": "OpenStreetMap Francja na Twitterze: {url}" + }, "de-berlin-mailinglist": { - "name": "Lista dyskusyjna dla Berlina" + "name": "Lista dyskusyjna dla Berlina", + "description": "To oficjalna lista dyskusyjna berlińskiej społeczności OSM" + }, + "de-berlin-meetup": { + "name": "Spotkania OpenStreetMap Berlin-Brandenburgia", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Berlina" + }, + "de-berlin-telegram": { + "name": "@osmberlin na Telegramie", + "description": "Kanał OpenStreetMap Berlin na Telegramie" }, "de-berlin-twitter": { + "name": "OpenStreetMap Berlin na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, "de-forum": { - "name": "OpenStreetMap DE forum", - "description": "OpenStreetMap Niemcy - forum www" + "name": "Forum OpenStreetMap DE", + "description": "Forum www OpenStreetMap Niemcy" }, "de-irc": { - "name": "OpenStreetMap Niemcy - IRC", + "name": "OpenStreetMap Niemcy na IRC", "description": "Dołącza do #osm-de na irc.oftc.net (port 6667)" }, "de-mailinglist": { - "name": "Talk-de mailingowa lista dyskusyjna", - "description": "Talk-de to oficjalna lista dyskusyjna dla społeczności OSM w Niemczech" + "name": "Lista dyskusyjna Talk-de", + "description": "Talk-de to oficjalna lista dyskusyjna niemieckiej społeczności OSM" }, "de-ostwestfalen-lippe-mailinglist": { - "name": "Lista dyskusyjna OWL" + "name": "Lista dyskusyjna OWL", + "description": "To oficjalna lista dyskusyjna społeczności OSM Ostwestfalen-Lippe" + }, + "de-telegram": { + "name": "OpenStreetMap Niemcy na Telegramie", + "description": "Dołącz do grupy OpenStreetMap Niemcy na Telegramie: {url}" }, "osm-de": { "name": "OpenStreetMap Niemcy", - "description": "Miejsce z informacjami o OpenStreetMap w Niemczech" + "description": "Platofrma z informacjami o OpenStreetMap w Niemczech" }, "hu-facebook": { - "name": "OpenStreetMap Węgry na Facebook'u" + "name": "OpenStreetMap HU na Facebooku", + "description": "Maperzy i OpenStreetMap Węgry na Facebooku" + }, + "hu-forum": { + "name": "Forum OpenStreetMap HU", + "description": "Forum www OpenStreetMap Węgry" + }, + "hu-meetup": { + "name": "Spotkania OpenStreetMap Węgry", + "description": "Platforma do organizowania spotkań na Węgrzech" + }, + "is-facebook": { + "name": "OSM Islandia na Facebooku", + "description": "Strona OpenStreetMap na Islandii" + }, + "is-mailinglist": { + "name": "Lista dyskusyjna Talk-is", + "description": "Talk-be to oficjalna lista dyskusyjna islandzkiej społeczności OSM" + }, + "is-twitter": { + "name": "OSM Islandia na Twitterze", + "description": "OpenStreetMap Islandia na Twitterze" + }, + "it-facebook": { + "name": "OpenStreetMap Włochy na Facebooku", + "description": "Dołącz do społeczności OpenStreetMap Włochy na Facebooku" + }, + "it-irc": { + "name": "OpenStreetMap Włochy na IRC", + "description": "Dołącz do #osm-it na irc.oftc.net (port 6667)" }, "it-mailinglist": { - "name": "Lista dyskusyjna Talk-it" + "name": "Lista dyskusyjna Talk-it", + "description": "Talk-at to oficjalna lista dyskusyjna włoskiej społeczności OSM" + }, + "it-telegram": { + "name": "@OpenStreetMapItalia na Telegramie", + "description": "Kanał OpenStreetMap Włochy na Telegramie" }, "it-twitter": { + "name": "OpenStreetMap Włochy na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, + "OSM-Rome-meetup": { + "name": "Incontro Mappatori Romani", + "description": "Ulepsz OpenStreetMap w okolicach Rzymu", + "extendedDescription": "Mamy na celu być źródłem dla ludzi w dyskusji i dzieleniu się wiedzą o używaniu darmowych zestawów danych, zwłaszcza OpenStreetMap, i otwartego oprogramowania do zarządzania, edytowania i wyświetlania danych geograficznych; a także zachęcać do używania ich w Lacjum." + }, "South-Tyrol-Mailing-List": { - "name": "Lista dyskusyjna OpenStreetMap dla Południowego Tyrolu" + "name": "Lista dyskusyjna OpenStreetMap dla Południowego Tyrolu", + "description": "Regionalna lista dyskusyjna OpenStreetMap Włochy dla Południowego Tyrolu" + }, + "talk-it-lazio": { + "name": "OpenStreetMap IT Lacjum", + "description": "Zapraszamy wszystkich! Zarejestruj się tutaj {signupUrl}", + "extendedDescription": "Lista dyskusyjna dla obszarów Rzymu i Lacjum." + }, + "Trentino-Mailing-List": { + "name": "Lista dyskusyjna OpenStreetMap dla Trydentu", + "description": "Regionalna lista dyskusyjna OpenStreetMap Włochy dla Trydentu" + }, + "no-forum": { + "name": "Forum www OpenStreetMap Norwegia", + "description": "Forum www OpenStreetMap Norwegia" + }, + "no-irc": { + "name": "OpenStreetMap Norwegia na IRC", + "description": "Kanał dla mapujących, użytkownków, deweloperów i fanów OpenStreetMap w Norwegii" }, "no-mailinglist": { "name": "Lista dyskusyjna OpenStreetMap Norwegia", @@ -6813,156 +7483,396 @@ "description": "Forum społeczności OpenStreetMap w Słowenii" }, "si-mailinglist": { - "name": "Mailingowa lista dyskusyjna OpenStreetMap Słowenia", - "description": "Mejlowa lista dyskusyjna społeczności OpenStreetMap w Słowenii" + "name": "Lista dyskusyjna OpenStreetMap Słowenia", + "description": "Lista dyskusyjna społeczności OpenStreetMap w Słowenii" }, "OSM-ES-mailinglist": { - "name": "Lista dyskusyjna Talk-es" + "name": "Lista dyskusyjna Talk-es", + "description": "Lista dyskusyjna OpenStreetMap w Hiszpanii" + }, + "OSM-ES-telegram": { + "name": "@OSMes na Telegramie", + "description": "Kanał OpenStreetMap Hiszpania na Telegramie" }, "osm-se": { - "name": "OpenStreetMap.se" + "name": "OpenStreetMap.se", + "description": "Zapewniaj usługi OSM i informacje dla lokalnej społeczności w Szwecji" + }, + "se-facebook": { + "name": "OpenStreetMap Szwecja na Facebooku", + "description": "OpenStreetMap Szwecja na Facebooku" + }, + "se-forum": { + "name": "Forum www OpenStreetMap Szwecja", + "description": "Forum www OpenStreetMap Szwecja" + }, + "se-irc": { + "name": "OpenStreetMap Szwecja na IRC", + "description": "Dołącz do #osm.se na irc.oftc.net (port 6667)" }, "se-mailinglist": { - "name": "Lista dyskusyjna Talk-se" + "name": "Lista dyskusyjna Talk-se", + "description": "Lista dyskusyjna OpenStreetMap w Szwecji" }, "se-twitter": { + "name": "OpenStreetMap Szwecja na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, + "Nottingham-OSM-pub-meetup": { + "name": "Comiesięczne spotkania w pubie w East Midlands (Nottingham)", + "description": "Spotkania towarzyskie dla maperów i użytkowników z East Midlands", + "extendedDescription": "Grupa spotyka się od marca 2011, najpierw w Nottingham, a ostatnio w Derby. Czasami jesteśmy również gdzieś indziej w East Midlands. Są to spotkania towarzyskie, ale jest to też świetna okazja, aby przyjść i zapytać o różne tematy związane z OSM. W miesiącach letnich zazwyczaj mapujemy trochę w okolicy naszego miejsca spotkania. Grupa, jako całość, jest zwłaszcza zainteresowana mapowaniem publicznych praw do dróg, więc od czasu do czasu spotyka się w tym celu." + }, "gb-mailinglist": { - "name": "Lista dyskusyjna Talk-gb" + "name": "Lista dyskusyjna Talk-gb", + "description": "Talk-gb to główna lista dyskusyjna brytyjskiej (łącznie z Irlandią Północną) społeczności OSM" + }, + "mappa-mercia-group": { + "name": "Lokalna grupa Mappa Mercia", + "description": "Baza dla fanów OpenStreetMap i Midlands", + "extendedDescription": "Mappa Mercia jest projektem rozwoju OpenStreetMap w West Midlands w UK. Organizujemy różne wydarzenia, uczymy i wspieramy lokalne organizacje, które chcą się podzielić z nami swoimi danymi." + }, + "gb-irc": { + "name": "OpenStreetMap Zjednoczone Królestwo na IRC", + "description": "Dołącz do #osm-gb na irc.oftc.net (port 6667)", + "extendedDescription": "Dołącz do #osm-gb na irc.oftc.net (port 6667), prosimy o cierpliwość i chwilę oczekiwania po zadaniu pytania" + }, + "OSM-CA-Slack": { + "name": "OSM-CA na Slacku", + "description": "Zapraszamy wszystkich! Zarejestruj się tutaj {signupUrl}" }, "OSM-Vancouver-meetup": { - "name": "OpenStreetMap Vancouver" + "name": "OpenStreetMap Vancouver", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Vancouver" + }, + "OSM-CU-telegram": { + "name": "OSM Kuba na Telegramie", + "description": "Kanał OpenStreetMap Kuba na Telegramie" + }, + "OSM-NI-telegram": { + "name": "OSM Nikaragua na Telegramie", + "description": "Kanał OpenStreetMap Nikaragua na Telegramie" + }, + "Bay-Area-OpenStreetMappers": { + "name": "Maperzy OpenStreetMap z Bay Area", + "description": "Ulepsz OpenStreetMap w Bay Area", + "extendedDescription": "Ta grupa poświęcona jest rozwijaniu społeczności OpenStreetMap w Bay Area. Nasze wydarzenia są otwarte dla wszystkich - entuzjastów otwartych źródeł, kolarzy, specjalistów GIS, gocacherów i innych. Każdego kto jest zainteresowany mapami, ich tworzeniem oraz wolnymi danymi map serdecznie zapraszamy do dołączenia do naszej grupy, jak również udziału w naszych wydarzeniach." }, "Central-Pennsylvania-OSM": { - "name": "OSM Centralna Pensylwania" + "name": "OSM Centralna Pensylwania", + "description": "Internetowa społeczność mapująca ze State College" + }, + "Code-for-San-Jose-Slack": { + "name": "Code for San Jose na Slacku", + "description": "Zapraszamy wszystkich! Zarejestruj się tutaj {signupUrl}, a następnie dołącz do kanału #osm." }, "Dallas-Fort-Worth-OSM": { - "name": "Dallas-Fort Worth OSM" + "name": "Dallas-Fort Worth OSM", + "description": "Grupa użytkowników OpenStreetMap z Dallas-Fort Worth", + "extendedDescription": "Dallas, Fort Worth i wszystkie miast pomiędzy nimi są pełne ludzi kreatywnych i obeznanych z technologią. Wizją dla tej grupy jest znalezienie nowych dróg użycia niesamowitych zasobów OSM." }, "GeoPhilly": { - "name": "GeoPhilly" + "name": "GeoPhilly", + "description": "Spotkania dla entuzjastów map z okolic Filadelfii", + "extendedDescription": "GeoPhilly łączy deweloperów, geografów, geeków danych, entuzjastów otwartych źródeł, hakerów obywatelskich i uzależnionych od map w naszej wspólnej miłości do map i historii, które się za nią kryją. Jeżeli używasz map w swojej pracy lub po prostu chcesz się czegoś nauczyć, to jest spotkanie dla Ciebie! Nasze wydarzenia mają być otwarte, przyjacielskie, edukacyjne i towarzyskie, więc obejmują zarówno luźne spotkania, jak i burzliwe dyskusje, a nawet warsztaty. Przyjdź, aby stworzyć razem z nami zróżnicowaną i inspirującą społeczność geoprzestrzenną w Filadelfii!" }, "MapMinnesota": { - "name": "MapMinnesota" + "name": "MapMinnesota", + "description": "Maperzy i fani OpenStreetMap z okolic Twin Cities", + "extendedDescription": "Łączy fanów OpenStreetMap z Minnesoty i Twin Cities!" + }, + "Mapping-DC-meetup": { + "name": "Mapowanie DC", + "description": "Ulepsz OpenStreetMap w okolicach DC", + "extendedDescription": "Jesteśmy grupą maperów-wolontariuszy, którzy chcą ulepszyć OpenStreetMap w okolicach DC. Mamy również na celu uczyć innych ekosystemu OSM, analizowania danych, kartografii oraz GIS. Zbieramy się na comiesięcznych spotkaniach, aby skupić się na wybranych obszarach naszego miasta." }, "Maptime-ME-meetup": { - "name": "MaptimeME" + "name": "MaptimeME", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Portland", + "extendedDescription": "Maptime, to dosłownie czas na tworzenie mapy. Naszą misją jest otworzyć drzwi do kartografii każdemu zainteresowanemu stworzeniem czasu i miejsca dla wspólnej nauki, odkrywania i tworzenia map przy użyciu odpowiednich narzędzi i technologii." + }, + "us-ma-mailinglist": { + "name": "Lista dyskusyjna Talk-us-massachusetts", + "description": "Lista dyskusyjna społeczności OSM Massachusetts" }, "OpenCleveland-meetup": { - "name": "Open Cleveland" + "name": "Open Cleveland", + "description": "Ulepsz OpenStreetMap w okolicach Cleveland", + "extendedDescription": "Open Geo Cleveland chce być źródłem dla ludzi w dyskusji i dzieleniu się wiedzą o używaniu darmowych zestawów danych, zwłaszcza OpenStreetMap, i otwartego oprogramowania do zarządzania, edytowania i wyświetlania danych geograficznych; a także zachęcać do używania ich w Północno-wschodnim Ohio. Jesteśmy również sekcją maptime =)" }, "OSM-Boston": { - "name": "OpenStreetMap Boston" + "name": "OpenStreetMap Boston", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Bostonu", + "extendedDescription": "OpenStreetMap jest wolną i otwartą mapą świata w stylu wiki, z setkami tysięcy edycji każdego dnia, robionych przez ludzi takich, jak Ty. Edytowanie mapy jest proste i przyjemne! Dołącz do nas zarówno w domu, jak i na zewnątrz i pomóż w naszych staraniach stworzenia najlepszej mapy okolic Bostonu i reszty świata!" + }, + "OSM-Central-Salish-Sea": { + "name": "OpenStreetMap Central Salish Sea", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Mount Vernon", + "extendedDescription": "OpenStreetMap, to mapa świata zrobiona przez ludzi takich, jak Ty. To mapa, którą Ty tworzysz, która jest rozdawana za darmo, jak wikipedia. Wejdź na osm.org, aby dowiedzieć się więcej. Spotykamy się ciągle, żeby porozmawiać o mapach, tworzyć je i dobrze się bawić!" }, "OSM-Chattanooga": { - "name": "OSM Chattanooga" + "name": "OSM Chattanooga", + "description": "Grupa użytkowników OpenStreetMap z Chattanooga" }, "OSM-Colorado": { - "name": "OpenStreetMap Colorado" + "name": "OpenStreetMap Colorado", + "description": "Maperzy i użytkownicy OpenStreetMap ze stanu Kolorado, USA", + "extendedDescription": "OpenStreetMap (OSM) Kolorado, to lokalna wspólnota ludzi chcących wspierać się nawzajem w tworzeniu wolnych map. Zachęcamy wszystkich maperów do organizowania lub proponowania wydarzeń w całym stanie. Mogą to być zwykłe spotkania, podstawowe lub zaawansowane ćwiczenia z OSM albo imprezy mapowania." }, "OSM-NYC": { - "name": "OpenStreetMap NYC" + "name": "OpenStreetMap NYC", + "description": "Maperzy, użytkownicy, deweloperzy i fani OpenStreetMap z okolic obszaru metropolitalnego Nowego Jorku" + }, + "OSM-Portland-forum": { + "name": "Grupa OpenStreetMap PDX Google", + "description": "Forum i lista dyskusyjna dla użytkowników OpenStreetMap z okolic Portland", + "extendedDescription": "Ta grupa ma ułatwiać ulepszanie OpenStreetMap w okolicach Portland, aby wesprzeć aplikacje takie jak Open Trip Planner." }, "OSM-Portland": { - "name": "OpenStreetMap Portland" + "name": "OpenStreetMap Portland", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Portland", + "extendedDescription": "OpenStreetMap (OSM), to mapa świata zrobiona przez ludzi takich, jak Ty. To mapa, którą Ty tworzysz, która jest rozdawana za darmo, jak wikipedia. Wejdź na osm.org, aby dowiedzieć się więcej i przyjdź na nasze spotkanie, żeby porozmawiać o mapach, wesprzeć OSM i dobrze się bawić!" }, "OSM-Seattle": { - "name": "OpenStreetMap Seattle" + "name": "OpenStreetMap Seattle", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Seattle" }, "OSM-SoCal": { - "name": "OpenStreetMap Southern California" + "name": "OpenStreetMap Southern California", + "description": "Zabaw się, wnieś coś do Los Angeles i naucz się mapować!", + "extendedDescription": "OpenStreetMap (OSM) Południowa Kalifornia jest dla wszystkich zainteresowanych wspólnym mapowaniem dla OpenStreetMap. OpenStreetMap, Wikipedia map, jest otwarto-źródłową mapą świata tworzoną przez ponad 1.000.000 ochotników na całej Ziemi. Zapraszamy każdego. Jeśli nie znasz OpenStreetMap, nauczymy Cię. Jeżeli masz jakiś pomysł na projekt mapowania lub wspólne wyjście grupy w teren, to wspaniale!" }, "OSM-South-Bay": { - "name": "OSM South Bay" + "name": "OSM South Bay", + "description": "Noce Map obsługiwane przez Code for San Jose", + "extendedDescription": "Code for San Jose, lokalna komórka Code for America, organizuje comiesięczne Noce Map w czwartkowe wieczory w centrum San José. Poznaj innych maperów z South Bay, pomóż w lokalnych przedsięwzięciach i dowiedz się o innych projektach obywatelskich. Nie musisz znać się na programowaniu ani GIS." }, "OSM-Tampa-Bay": { - "name": "OpenStreetMap Tampa Bay" + "name": "OpenStreetMap Tampa Bay", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Tampa Bay", + "extendedDescription": "Grupa OSM Tampa Bay dla okolicznych mieszkańców, chcących zebrać się razem i zbudować kompletną mapę Tampa Bay na OpenStreetMap, wolnej i edytowalnej mapie świata. Jeśli interesują Cię mapy, dane, otwarte źródła, GPS, wspinanie, kolarstwo, itd., to pokochasz pracę z OpenStreetMap -- więc dołącz do nas! Spotykamy się razem i mapujemy oraz omawiamy nowe tematy mniej więcej raz na miesiąc." }, "OSM-US-Slack": { - "name": "OpenStreetMap US Slack" + "name": "OpenStreetMap US na Slacku", + "description": "Zapraszamy wszystkich! Zarejestruj się tutaj {signupUrl}" }, "OSM-US": { "name": "OpenStreetMap US", + "description": "Pomagamy rozwijać i ulepszać OpenStreetMap w Stanach Zjednoczonych", + "extendedDescription": "Wspieramy OpenStreetMap poprzez organizowanie corocznych konferencji, dostarczanie zasobów społeczności, budowanie partnerstwa i szerzenie wieści. Dołącz do OpenStreetMap US tutaj: {signupUrl}", "events": { "sotmus2018": { "name": "State of the Map US 2018", + "description": "Dołącz do społeczności OpenStreetMap na State of the Map US w Detroit. Nawiąż kontakty z innymi maperami, firmami, agencjami rządowymi i non-profit; wszystkimi współpracującymi nad wolną i edytowalną mapą świata.", "where": "Detroit, Michigan" } } }, "OSM-Utah": { - "name": "OpenStreetMap Utah" + "name": "OpenStreetMap Utah", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Salt Lake City", + "extendedDescription": "Na działalność mogą składać się takie rzeczy, jak warsztaty Naucz Się Mapować, imprezy mapowania i zbieranie danych w terenie. Wydarzenia, przynajmniej na razie, będą miały miejsce w okolicach SLC. Szukamy wprawionych maperów, jak również nowych ludzi. Dołącz do nas i zacznij mapować!" }, "OSM-Wyoming": { - "name": "OpenStreetMap Wyoming" + "name": "OpenStreetMap Wyoming", + "description": "Maperzy i użytkownicy OpenStreetMap ze stanu Wyoming", + "extendedDescription": "OpenStreetMap (OSM) Wyoming, to lokalna wspólnota ludzi chcących wspierać się nawzajem w tworzeniu wolnych map. Zachęcamy wszystkich maperów do organizowania lub proponowania wydarzeń w całym stanie. Mogą to być zwykłe spotkania, podstawowe lub zaawansowane ćwiczenia z OSM albo imprezy mapowania." }, "PHXGeo-meetup": { - "name": "PHXGeo Meetup" + "name": "Spotkania PHXGeo", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Phoenix", + "extendedDescription": "To jest grupa spotkań dla lubiących mapy, GIS, OpenStreetMap, kartografię i wszystko, co z tym związane z okolic Phoenix." }, "PHXGeo-twitter": { - "name": "PHXGeo Twitter", + "name": "PHXGeo na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, + "Western-Slope-facebook": { + "name": "OSM Western Slope na Facebooku", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Grand Junction" + }, + "Western-Slope-meetup": { + "name": "Spotkania OSM Western Slope", + "description": "Maperzy i użytkownicy OpenStreetMap z okolic Grand Junction", + "extendedDescription": "Celem tej grupy jest przedstawienie OpenStreetMap społeczności, utworzenie wspólnoty maperów, stworzenie najbardziej niesamowitych danych geograficznych używając wszystkich dostępnych metod, które znamy i ostatecznie zintegrowanie tego wszystkiego, aby przedstawić nasze osiągnięcia. Wyobraź sobie dokładne oznakowania szlaków! Wyobraź sobie dalszy rozwój ścieżek rowerowych! Wyobraź sobie cokolwiek chcesz! To jest właśnie radość z OpenStreetMap!" + }, + "Maptime-Australia-Slack": { + "name": "Maptime Australia na Slacku", + "description": "Zarejestruj się tutaj {signupUrl}" + }, "talk-au": { - "name": "Lista dyskusyjna Talk-au" + "name": "Lista dyskusyjna Talk-au", + "description": "Miejsce rozmów maperów z Aussie" + }, + "OSM-AR-facebook": { + "name": "OpenStreetMap Argentyna na Facebooku", + "description": "Dołącz do społeczności OpenStreetMap Argentyna na Facebooku", + "extendedDescription": "Wiadomości z lokalnej społeczności" + }, + "OSM-AR-forum": { + "name": "Forum www OpenStreetMap Argentyna", + "description": "Dołącz do forum www OpenStreetMap Argentyna", + "extendedDescription": "Idealne dla długich i ważnych dyskusji. Długi czas odpowiedzi." + }, + "OSM-AR-irc": { + "name": "OpenStreetMap Argentyna na IRC", + "description": "Dołącz do #osm-ar na irc.oftc.net (port 6667)", + "extendedDescription": "Możesz znaleźć największego geeka w społeczności." }, "OSM-AR-mailinglist": { - "name": "Lista dyskusyjna Talk-ar" + "name": "Lista dyskusyjna Talk-ar", + "description": "Historyczna lista dyskusyjna. Praktycznie już nie używana." + }, + "OSM-AR-telegram": { + "name": "OpenStreetMap Argentyna na Telegramie", + "description": "Dołącz do społeczności OpenStreetMap Argentyna na Telegramie", + "extendedDescription": "Najbardziej aktywny kanał społeczności, idealny do rozmów i uzyskiwania szybkich odpowiedzi na pytania. Zapraszamy wszystkich!" }, "OSM-AR-twitter": { - "description": "Obserwuj nas na Twitterze: {url}" + "name": "OpenStreetMap Argentyna na Twitterze", + "description": "Obserwuj nas na Twitterze: {url}", + "extendedDescription": "Wiadomości z lokalnej społeczności i ogólnie OpenStreetMap." }, "OSM-BO-mailinglist": { - "name": "Lista dyskusyjna Talk-bo" + "name": "Lista dyskusyjna Talk-bo", + "description": "Talk-bo to oficjalna lista dyskusyjna boliwijskiej społeczności OSM", + "extendedDescription": "Mapujesz w Boliwii? Masz pytania lub chcesz dołączyć do naszej społeczności? Wejdź na {url}. Zapraszamy wszystkich!" + }, + "Bahia-telegram": { + "name": "Grupa OpenStreetMap Bahia na Telegramie", + "description": "Dołącz do społeczności OpenStreetMap Bahia na Telegramie", + "extendedDescription": "Dołącz do społeczności, aby dowiedzieć się więcej o OpenStreetMap, zadawać pytania i brać udział w naszych spotkaniach. Zapraszamy wszystkich!" + }, + "DF-telegram": { + "name": "Grupa OpenStreetMap Brazylia na Telegramie", + "description": "Dołącz do społeczności OpenStreetMap Brazylia na Telegramie", + "extendedDescription": "Dołącz do społeczności, aby dowiedzieć się więcej o OpenStreetMap, zadawać pytania i brać udział w naszych spotkaniach. Zapraszamy wszystkich!" }, "OSM-br-mailinglist": { - "name": "Lista dyskusyjna Talk-br" + "name": "Lista dyskusyjna Talk-br", + "description": "Lista dyskusyjna OpenStreetMap w Brazylii" + }, + "OSM-br-telegram": { + "name": "OpenStreetMap Brazylia na Telegramie", + "description": "Dołącz do społeczności OpenStreetMap Brazylia na Telegramie", + "extendedDescription": "Dołącz do społeczności, aby dowiedzieć się więcej o OpenStreetMap, zadawać pytania i brać udział w naszych spotkaniach. Zapraszamy wszystkich!" }, "OSM-br-twitter": { + "name": "OpenStreetMap Brazylia na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, + "RS-telegram": { + "name": "Grupa OpenStreetMap Rio Grande do Sul na Telegramie", + "description": "Dołącz do społeczności OpenStreetMap Rio Grande do Sul na Telegramie", + "extendedDescription": "Dołącz do społeczności, aby dowiedzieć się więcej o OpenStreetMap, zadawać pytania i brać udział w naszych spotkaniach. Zapraszamy wszystkich!" + }, + "OSM-CL-facebook": { + "name": "OpenStreetMap Chile na Facebooku", + "description": "Dołącz do społeczności OpenStreetMap Chile na Facebooku", + "extendedDescription": "Dołącz do społeczności, aby dowiedzieć się więcej o OpenStreetMap, zadawać pytania i brać udział w naszych spotkaniach. Zapraszamy wszystkich!" + }, "OSM-CL-mailinglist": { - "name": "Lista dyskusyjna Talk-cl" + "name": "Lista dyskusyjna Talk-cl", + "description": "Lista dyskusyjna OpenStreetMap w Chile" + }, + "OSM-CL-telegram": { + "name": "OpenStreetMap Chile na Telegramie", + "description": "Dołącz do społeczności OpenStreetMap Chile na Telegramie", + "extendedDescription": "Dołącz do społeczności, aby dowiedzieć się więcej o OpenStreetMap, zadawać pytania i brać udział w naszych spotkaniach. Zapraszamy wszystkich!" }, "OSM-CL-twitter": { + "name": "OpenStreetMap Chile na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, "Maptime-Bogota": { - "name": "Maptime Bogotá" + "name": "Maptime Bogotá", + "description": "Jesteśmy grupą maperów zainteresowanych mapowaniem w OpenStreetMap okolic Bogoty.", + "extendedDescription": "Naucz się zbierać dane w terenie i przenosić je do OpenStreetMap. Nie jest wymagana żadna wcześniejsza wiedza! Musisz tylko chcieć wziąć udział, uczyć się i dobrze się bawić." + }, + "OSM-CO-facebook": { + "name": "OpenStreetMap Kolumbia na Facebooku", + "description": "Dołącz do społeczności OpenStreetMap Kolumbia na Facebooku", + "extendedDescription": "Dołącz do społeczności, aby dowiedzieć się więcej o OpenStreetMap. Zapraszamy wszystkich!" }, "OSM-CO-mailinglist": { - "name": "Lista dyskusyjna Talk-co" + "name": "Lista dyskusyjna Talk-co", + "description": "Lista dyskusyjna OpenStreetMap w Kolumbii" + }, + "OSM-CO-telegram": { + "name": "OSM Kolumbia na Telegramie", + "description": "Kanał OpenStreetMap Kolumbia na Telegramie" }, "OSM-CO-twitter": { - "name": "OpenStreetMap Kolumbia Twitter", + "name": "OpenStreetMap Kolumbia na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, "OSM-CO": { - "name": "OpenStreetMap Kolumbia" + "name": "OpenStreetMap Kolumbia", + "description": "Wiadomości z kolumbijskiej społeczności OpenStreetMap i fundacji OSMCo" + }, + "OSM-EC-telegram": { + "name": "OSM Ekwador na Telegramie", + "description": "Kanał OpenStreetMap Ekwador na Telegramie" + }, + "OSM-PY-telegram": { + "name": "OSM Paragwaj na Telegramie", + "description": "Kanał OpenStreetMap Paragwaj na Telegramie" }, "OSM-PE-facebook": { - "name": "OpenStreetMap Peru Facebook" + "name": "OpenStreetMap Peru na Facebooku", + "description": "Dołącz do społeczności OpenStreetMap Peru na Facebooku" }, "OSM-PE-mailinglist": { - "name": "Lista dyskusyjna Talk-pe" + "name": "Lista dyskusyjna Talk-pe", + "description": "Talk-bo to oficjalna lista dyskusyjna peruwiańskiej społeczności OSM" + }, + "OSM-PE-matrix": { + "name": "Kanał OpenStreetMap Peru na Matrixie", + "description": "Rozmawiaj z innymi członkami peruwiańskiej społeczności OpenStreetMap na Matrixie." }, "OSM-PE-telegram": { - "name": "OpenStreetMap Peru Telegram", + "name": "OpenStreetMap Peru na Telegramie", "description": "Dołącz do społeczności OpenStreetMap Peru na Telegramie" }, "OSM-PE-twitter": { - "name": "OpenStreetMap Peru Twitter", + "name": "OpenStreetMap Peru na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, "OSM-PE": { - "name": "OpenStreetMap Peru" + "name": "OpenStreetMap Peru", + "description": "Wiadomości i zasoby z peruwiańskiej społeczności OpenStreetMap" + }, + "LATAM-Facebook": { + "name": "OpenStreetMap Latam na Facebooku", + "description": "OpenStreetMap Latam na Facebooku" + }, + "LATAM-Telegram": { + "name": "OpenStreetMap Latam na Telegramie", + "description": "Kanał OpenStreetMap Ameryka Łacińska na Telegramie" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Latam na Twitterze", + "description": "Obserwuj nas na Twitterze: {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "Wspieranie OpenStreetMap w Ameryce Łacińskiej", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam jest coroczną konferencją dla wszystkich maperów i użytkowników OpenStreetMap w Ameryce Łacińskiej. Program zawiera prelekcje, panele, warsztaty i mapathony powiązane z OpenStreetMap.", + "where": "Buenos Aires, Argentyna" + } + } }, "OSM-Facebook": { - "name": "OpenStreetMap na Facebook'u" + "name": "OpenStreetMap na Facebooku", + "description": "Polub nas na Facebooku, aby być na bieżąco z OpenStreetMap." }, "OSM-help": { - "name": "Pomoc OpenStreetMap" + "name": "Pomoc OpenStreetMap", + "description": "Uzyskaj odpowiedzi na najczęściej zadawane pytania na dedykowanej stronie prowadzonej przez społeczność OSM.", + "extendedDescription": "{url} jest dla wszystkich, którzy potrzebują pomocy z OpenStreetMap. Nieważne, czy dopiero zaczynasz, czy masz tylko pytanie techniczne, jesteśmy tutaj, by Ci pomóc!" }, "OSM-Reddit": { "name": "OpenStreetMap na Reddit", @@ -6973,11 +7883,13 @@ "description": "Dołącz od globalnej grupy OpenStreetMap na Telegramie na {url}" }, "OSM-Twitter": { - "name": "OpenStreetMap Twitter", + "name": "OpenStreetMap na Twitterze", "description": "Obserwuj nas na Twitterze: {url}" }, "OSMF": { "name": "Fundacja OpenStreetMap ", + "description": "OSMF to działająca w UK fundacja non-profit, która wspiera projekt OpenStreetMap", + "extendedDescription": "OSMF wspiera OpenStreetMap poprzez zbieranie funduszy, utrzymywanie serwerów, na których działa OSM, organizowanie corocznej konferencji State of the Map i koordynowanie wolontariuszy zapewniających działanie OSM. Możesz pokazać swoje wsparcie i mieć wpływ na kierunek rozwoju OpenStreetMap, poprzez dołączenie jako członek OSMF tutaj: {signupUrl}", "events": { "sotm2018": { "name": "State of the Map 2018", diff --git a/dist/locales/pt-BR.json b/dist/locales/pt-BR.json index b132e97c3..7fad78e36 100644 --- a/dist/locales/pt-BR.json +++ b/dist/locales/pt-BR.json @@ -430,7 +430,12 @@ "edited_by": "Editado por", "changeset": "Conjunto de alterações", "unknown": "Desconhecido", - "link_text": "Histórico no openstreetmap.org" + "link_text": "Histórico no openstreetmap.org", + "note_no_history": "Sem Histórico (Nova Nota)", + "note_comments": "Comentários", + "note_created_date": "Data criada", + "note_created_user": "Criado por", + "note_link_text": "Nota no openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "vértice", "line": "linha", "area": "área", - "relation": "relação" + "relation": "relação", + "note": "nota" }, "geocoder": { "search": "Buscar no mundo todo...", @@ -523,8 +529,6 @@ "best_imagery": "Melhor imagem de satélite conhecida para esta localização", "switch": "Voltar para este fundo de tela", "custom": "Customizado", - "custom_button": "Editar fundo de tela personalizado", - "custom_prompt": "Insira um modelo de URL de quadros. Tokens válidos são:\n - {zoom} ou {z}, {x}, {y} para o esquema Z/X/Y dos quadros\n - {-y} ou {ty} para coordenadas invertidas, estilo TMS\n - {u} para esquema quadtile\n - {switch:a,b,c} para multiplexação de servidor DNS\n\nExemplo:\n{example}", "overlays": "Sobreposições", "imagery_source_faq": "Informações sobre imagens / Relatar um problema", "reset": "redefinir", @@ -626,6 +630,16 @@ "tooltip": "Área são desenhadas completamente preenchidas." } }, + "settings": { + "custom_background": { + "tooltip": "Editar fundo de tela personalizado", + "header": "Configurações de fundo personalizadas", + "instructions": "Insira um modelo de URL de quadros. Tokens válidos são:\n {zoom} ou {z}, {x}, {y} para o esquema Z/X/Y dos quadros\n {-y} ou {ty} para coordenadas invertidas, estilo TMS\n {u} para esquema quadtile\n {switch:a,b,c} para multiplexação de servidor DNS\n\nExemplo:\n{example}", + "template": { + "placeholder": "Insira um modelo de URL" + } + } + }, "restore": { "heading": "Você tem alterações não salvas", "description": "Deseja restaurar as alterações não salvas da sessão anterior?", @@ -727,18 +741,6 @@ }, "cannot_zoom": "Não é possível afastar mais no modo atual.", "full_screen": "Alterar para Tela Cheia", - "gpx": { - "local_layer": "Adicionar um GPX", - "drag_drop": "Arraste e solte um arquivo .gpx, .geojson ou .kml na página, ou clique o botão à direita para procurar", - "zoom": "Aproximar a camada", - "browse": "Procurar um arquivo" - }, - "mvt": { - "local_layer": "Adicionar um MVT", - "drag_drop": "Arraste e solte um arquivo .mvt ou .pbf na página ou clique no botão à direita para navegar", - "zoom": "Zoom para camada", - "browse": "Procure um arquivo" - }, "streetside": { "tooltip": "Fotos da Streetside da Microsoft", "title": "Sobreposição de fotos (Bing Streetside)", @@ -770,6 +772,12 @@ "anonymous": "anônimo", "closed": "(Fechado)", "commentTitle": "Comentários", + "status": { + "opened": "aberto {when}", + "reopened": "reaberto {when}", + "commented": "comentou {when}", + "closed": "fechado {when}" + }, "newComment": "Novo comentário", "inputPlaceholder": "Digite um comentário para compartilhar com outros usuários.", "close": "Fechar nota", @@ -1441,15 +1449,15 @@ "label": "Acesso permitido", "options": { "designated": { - "description": "Acesso designado por placas (ou leis locais) para uso preferencial por veículos específicos", + "description": "Acesso permitido de acordo com placas ou legislação local específica", "title": "Designado" }, "destination": { - "description": "Acesso permitido apenas na saída ou na chegada a um destino", + "description": "Acesso permitido apenas para chegar ao destino", "title": "Destino" }, "dismount": { - "description": "Acesso permitido, mas deve-se descer da bicicleta/motocicleta/animal", + "description": "Acesso permitido desde que desmontado", "title": "Desmontar" }, "no": { @@ -1457,15 +1465,19 @@ "title": "Proibido" }, "permissive": { - "description": "Acesso permitido pelo dono, mas revogável a qualquer momento", + "description": "Acesso permitido até que o proprietário revogue a permissão", "title": "Autorizado" }, + "permit": { + "description": "Acesso permitido apenas com permissão ou licença válidos", + "title": "Permissão" + }, "private": { - "description": "Acesso requer permissão prévia do dono, dada individualmente", + "description": "Acesso permitido apenas com a permissão do proprietário em caráter individual", "title": "Privado" }, "yes": { - "description": "Acesso permitido por lei; via pública com direito de passagem", + "description": "Acesso permitido pela lei; direito de passagem", "title": "Público" } }, @@ -3050,8 +3062,7 @@ "terms": "Bicicleta, Ciclismo, Reparo, Oficina de Bicicletas" }, "amenity/biergarten": { - "name": "Biergarten", - "terms": "Biergarten, Cervejaria ao Ar Livre" + "name": "Biergarten" }, "amenity/boat_rental": { "name": "Aluguel de Barcos", @@ -3444,10 +3455,12 @@ "terms": "Máquina de Venda de Bebidas, máquina de refrigerante, refrigerante, lata, latinha" }, "amenity/vending_machine/electronics": { - "name": "Máquina de Venda de Eletrônicos" + "name": "Máquina de Venda de Eletrônicos", + "terms": "Máquina de venda automática de eletrônicos" }, "amenity/vending_machine/elongated_coin": { - "name": "Máquina de Venda de Moedas Achatadas" + "name": "Máquina de Venda de Moedas Achatadas", + "terms": "Máquina de venda automática de moedas" }, "amenity/vending_machine/excrement_bags": { "name": "Máquina de Vendas de Sacola de Excrementos", @@ -3458,14 +3471,16 @@ "terms": "produtos de higiene feminina, camisinha, preservativo, absorvente, tampão, cuidados pessoais, higiene, mulher" }, "amenity/vending_machine/food": { - "name": "Máquina de Venda de Comida" + "name": "Máquina de Venda de Comida", + "terms": "Máquina de venda automática de alimentos" }, "amenity/vending_machine/fuel": { "name": "Bomba de Gasolina", "terms": "bomba de gasolina,bomba de combustível,bomba de diesel,gasolina,combustível,propano,diesel,biodiesel" }, "amenity/vending_machine/ice_cream": { - "name": "Máquina de Venda de Sorvete" + "name": "Máquina de Venda de Sorvete", + "terms": "Máquina de venda automática de sorvetes" }, "amenity/vending_machine/news_papers": { "name": "Máquina de Venda de Jornais" @@ -3487,7 +3502,8 @@ "terms": "Transporte público, ônibus, Trem, Metrô, Ticket, Bilhete" }, "amenity/vending_machine/stamps": { - "name": "Máquina de Venda de Selos" + "name": "Máquina de Venda de Selos", + "terms": "Máquina de venda automática de postagem" }, "amenity/vending_machine/sweets": { "name": "Máquina de Venda de Lanches", @@ -3562,7 +3578,8 @@ "terms": "big tower" }, "attraction/maze": { - "name": "Labirinto" + "name": "Labirinto", + "terms": "Labirinto" }, "attraction/pirate_ship": { "name": "Navio Pirata", @@ -3632,7 +3649,8 @@ "terms": "Cerca viva" }, "barrier/kerb": { - "name": "Meio-fio" + "name": "Meio-fio", + "terms": "Freio" }, "barrier/kissing_gate": { "name": "Quebra Corpo", @@ -3675,7 +3693,8 @@ "terms": "Celeiro" }, "building/boathouse": { - "name": "Garagem de barcos" + "name": "Garagem de barcos", + "terms": "Casa barco , Casa flutuante" }, "building/bungalow": { "name": "Bangalô", @@ -3728,10 +3747,12 @@ "name": "Entrada/Saída" }, "building/farm": { - "name": "Casa de fazenda" + "name": "Casa de fazenda", + "terms": "Casa de fazenda" }, "building/farm_auxiliary": { - "name": "Edifício da Fazenda" + "name": "Edifício da Fazenda", + "terms": "Edifício da Fazenda" }, "building/garage": { "name": "Garagem", @@ -3742,7 +3763,8 @@ "terms": "Garagens" }, "building/grandstand": { - "name": "Arquibancada" + "name": "Arquibancada", + "terms": "Arquibancada" }, "building/greenhouse": { "name": "Estufa", @@ -3836,7 +3858,8 @@ "name": "Estação Ferroviária" }, "building/transportation": { - "name": "Edifício de transporte" + "name": "Edifício de transporte", + "terms": "Edifício de transporte" }, "building/university": { "name": "Edifício Universitário", @@ -4066,17 +4089,20 @@ "name": "Acesso de Emergência como Destino" }, "emergency/fire_alarm": { - "name": "Caixa de chamada de alarme de incêndio" + "name": "Caixa de chamada de alarme de incêndio", + "terms": "Caixa de chamada de alarme de incêndio" }, "emergency/fire_extinguisher": { - "name": "Extintor de incêndio" + "name": "Extintor de incêndio", + "terms": "Extintor de incêndio" }, "emergency/fire_hydrant": { "name": "Hidrante", "terms": "Hidrante, extintor, incêndio, mangueira" }, "emergency/first_aid_kit": { - "name": "Kit de primeiros socorros" + "name": "Kit de primeiros socorros", + "terms": "Kit de primeiros socorros" }, "emergency/life_ring": { "name": "Bóia salva-vidas", @@ -4100,10 +4126,12 @@ "name": "Acesso de Emergência Privado" }, "emergency/siren": { - "name": "Sirene" + "name": "Sirene", + "terms": "Sirene" }, "emergency/water_tank": { - "name": "Tanque de água de emergência" + "name": "Tanque de água de emergência", + "terms": "Tanque de água de emergência" }, "emergency/yes": { "name": "Acesso de Emergência" @@ -4205,7 +4233,8 @@ "terms": "doença, terminal, tratamento" }, "healthcare/laboratory": { - "name": "Laboratório médico" + "name": "Laboratório médico", + "terms": "Laboratório médico" }, "healthcare/midwife": { "name": "Parteira", @@ -4247,7 +4276,8 @@ "terms": "Hipovia, Picadeiro, Caminho para Cavalgada, calvagada, Trilha de Equitação, cavalo, hipismo" }, "highway/bus_guideway": { - "name": "Guideway de ônibus" + "name": "Guideway de ônibus", + "terms": "Guiamento de ônibus" }, "highway/bus_stop": { "name": "Parada de ônibus / Plataforma" @@ -4309,7 +4339,8 @@ "terms": "acesso a autoestrada, acesso a via expressa, ligação de via expressa" }, "highway/passing_place": { - "name": "Lugar de passagem" + "name": "Lugar de passagem", + "terms": "Lugar de passagem" }, "highway/path": { "name": "Caminho Informal", @@ -4535,7 +4566,8 @@ "terms": "Floresta plantada, Silvicultura, Reflorestamento, Área reflorestada" }, "landuse/garages": { - "name": "Uso da terra da garagem" + "name": "Uso da terra da garagem", + "terms": "Uso da terra de garagem" }, "landuse/grass": { "name": "Gramado", @@ -4558,7 +4590,8 @@ "terms": "Indústria, Parque industrial, Fábrica, Fábricas" }, "landuse/industrial/scrap_yard": { - "name": "Ferro-Velho" + "name": "Ferro-Velho", + "terms": "Pátio de sucata" }, "landuse/industrial/slaughterhouse": { "name": "Matadouro", @@ -4641,7 +4674,8 @@ "terms": "Recreação, Diversão, área verde, pátio" }, "landuse/religious": { - "name": "Área Religiosa" + "name": "Área Religiosa", + "terms": "Área Religiosa" }, "landuse/residential": { "name": "Área residencial", @@ -4668,14 +4702,16 @@ "terms": "Fliperama, parque de diversões, vídeo game, jogos, jogos eletrônicos, console" }, "leisure/beach_resort": { - "name": "Resort em Praia" + "name": "Resort em Praia", + "terms": "Resort na praia" }, "leisure/bird_hide": { "name": "Local de observação de pássaros", "terms": "torre de observação, pássaros, aves, animais" }, "leisure/bleachers": { - "name": "Arquibancada simples" + "name": "Arquibancada simples", + "terms": "Arquibancadas" }, "leisure/bowling_alley": { "name": "Pista de Boliche", @@ -4690,7 +4726,8 @@ "terms": "salão de dança, balada, boate, clube de dança, salsa, tango" }, "leisure/dancing_school": { - "name": "Escola de Dança" + "name": "Escola de Dança", + "terms": "Escola de dança" }, "leisure/dog_park": { "name": "Cachorródromo", @@ -4713,10 +4750,12 @@ "terms": "academia aberta, academia ao ar livre, máquina de execício, equipamento de exercício, equipamento de ginástica" }, "leisure/fitness_station/balance_beam": { - "name": "Trave de Equilíbrio" + "name": "Trave de Equilíbrio", + "terms": "Feixe de Equilíbrio de Exercício" }, "leisure/fitness_station/box": { - "name": "Caixa de exercício" + "name": "Caixa de exercício", + "terms": "Caixa de exercício" }, "leisure/fitness_station/horizontal_bar": { "name": "Barra Fixa Horizontal" @@ -4797,6 +4836,9 @@ "name": "Campo de Futebol Americano", "terms": "Futebol Americano, football" }, + "leisure/pitch/badminton": { + "name": "Quadra de badminton" + }, "leisure/pitch/baseball": { "name": "Campo de Beisebol", "terms": "campo de beisebol, campo de baseball" @@ -4920,6 +4962,9 @@ "name": "Ponte", "terms": "ponte, viaduto, rio, rodovia, estrada, rua," }, + "man_made/bunker_silo": { + "name": "Silo Bunker" + }, "man_made/chimney": { "name": "Chaminé", "terms": "Lareira, Forno, Fábrica, Indústria, Gás" @@ -6785,6 +6830,27 @@ }, "name": "Caminhada e Ciclismo" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "trilhas de moto de neve por Kelkkareitit.fi para OSM (Cobertura nórdica)", + "name": "Sobreposição de moto de neve nórdica" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaico de ortofotografias suecas do período 1955-1965. Fotos mais antigas e mais jovens podem ocorrer.", + "name": "Lantmäteriet Historic Orthophoto 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaico de ortofotografias suecas do período 1970-1980. Em construção.", + "name": "Lantmäteriet Historic Orthophoto 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Termos e Comentários" @@ -6821,8 +6887,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Scan de 'Mapas Econômicos' de cerca de 1950-1980", - "name": "Mapa Econômico Lantmäteriet (histórico)" + "description": "Scan de \"Mapas Econômicos\" de cerca de 1950-1980", + "name": "Mapa Econômico da Lantmäteriet 1950-1980" }, "qa_no_address": { "attribution": { @@ -6836,6 +6902,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Trilhas de moto de neve", + "name": "Mapa de moto de neve da Suécia" + }, "stamen-terrain-background": { "attribution": { "text": "Quadros do mapa de Stamen Design, sob CC BY 3.0. Dados por OpenStreetMap, sob ODbL" @@ -6898,6 +6971,14 @@ } }, "community": { + "bw-facebook": { + "name": "Mapeando Botsuana no Facebook", + "description": "Página do OpenStreetMap no Botsuana" + }, + "bw-twitter": { + "name": "Mapeando Botsuana no Twitter", + "description": "Twitter do OpenStreetMap no Botsuana" + }, "cape-coast-youthmappers": { "name": "Universidade de Cape Coast YouthMappers", "description": "Siga-nos no Twitter: {url}" @@ -6913,69 +6994,128 @@ "talk-gh": { "name": "Lista de Discussão Talk-gh" }, + "osm-mg-facebook": { + "name": "Grupo OpenStreetMap Madagascar no Facebook" + }, "talk-mg": { "name": "Lista de Discussão Talk-mg" }, "OSM-BGD-facebook": { "name": "OpenStreetMap Bangladesh", + "description": "Melhore o OpenStreetMap em Bangladesh", "extendedDescription": "Mapeando em Bangladesh? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {url}. Todos são bem-vindos!" }, "OSM-India-facebook": { "name": "OpenStreetMap Índia - Mapeamento de vizinhança participativa", - "description": "Melhorar o OpenStreetMap na Índia", - "extendedDescription": "Mapeando na Índia? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {url}. Todos são bem-vindos!" + "description": "Melhore o OpenStreetMap na Índia", + "extendedDescription": "Mapeando na Índia? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {url}. Todos são bem-vindos!", + "events": { + "sotmasia2018": { + "name": "State of the Map Asia 2018" + } + } }, "OSM-india-mailinglist": { "name": "Lista de Discussão do OpenStreetMap na Índia", "description": "Talk-in é a lista de discussão oficial para a comunidade indiana" }, "OSM-india-twitter": { + "name": "OpenStreetMap India Twitter", "description": "Estamos a um tweet de distância: {url}" }, "OSM-IDN-facebook": { - "name": "OpenStreetMap Indonésia" + "name": "OpenStreetMap Indonésia", + "description": "Melhore o OpenStreetMap na Indonésia", + "extendedDescription": "Mapeando na Indonésia? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {url}. Todos são bem-vindos!" + }, + "OSM-japan-facebook": { + "name": "Comunidade OpenStreetMap Japão", + "description": "Mapeadores e usuários do OpenStreetMap no Japão" }, "OSM-japan-mailinglist": { "name": "Lista de Discussão do OpenStreetMap Japão", "description": "Talk-ja é a lista de discussão oficial para a Comunidade Japonesa" }, "OSM-japan-twitter": { + "name": "Twitter do OpenStreetMap Japão", "description": "Hashtag no Twitter: {url}" }, "OSM-japan-website": { - "name": "OpenStreetMap Japão" + "name": "OpenStreetMap Japão", + "description": "Mapeadores e usuários do OpenStreetMap no Japão" + }, + "OSM-MY-facebook": { + "name": "OpenStreetMap Malásia no Facebook" + }, + "OSM-MY-matrix": { + "description": "Todos os mapeadores são bem-vindos! Inscreva-se em {signupUrl}" }, "OSM-MNG-facebook": { "name": "OpenStreetMap Mongólia", + "description": "Melhore o OpenStreetMap na Mongólia", "extendedDescription": "Mapeando na Mongólia? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {Url}. Todos são bem-vindos!" }, "OSM-MMR-facebook": { "name": "OpenStreetMap Myanmar", + "description": "Melhore o OpenStreetMap no Mianmar", "extendedDescription": "Mapeando em Myanmar? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {Url}. Todos são bem-vindos!" }, "OSM-Nepal-facebook": { "name": "OpenStreetMap Nepal", + "description": "Melhore o OpenStreetMap no Nepal", "extendedDescription": "Mapeando no Nepal? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {Url}. Todos são bem-vindos!" }, "OSM-PH-mailinglist": { "name": "Lista de Discussão Talk-ph", "description": "Uma lista de discussão para falar sobre o OpenStreetMap nas Filipinas" }, + "OSM-PH-slack": { + "description": "Todos são bem-vindos! Inscreva-se em {signupUrl}" + }, + "OSM-RU-forum": { + "description": "Web forum do OpenStreetMap Rússia" + }, + "OSM-RU-telegram": { + "description": "Bate-papo do OpenStreetMap Rússia no Telegram" + }, "OSM-LKA-facebook": { "name": "OpenStreetMap Sri Lanka", + "description": "Melhore o OpenStreetMap no Sri Lanka", "extendedDescription": "Mapeando no Sri Lanka? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {Url}. Todos são bem-vindos!" }, "OSM-TW-mailinglist": { "name": "Lista de Discussão Taiwan" }, + "OSM-TH-facebook": { + "description": "Grupo no Facebook para mapeadores OpenStreetMap na Tailândia" + }, + "OSM-TH-forum": { + "description": "Web forum do OpenStreetMap Tailândia" + }, "at-mailinglist": { "name": "Lista de Discussão Talk-at" }, + "at-twitter": { + "name": "Twitter do OpenStreetMap Áustria", + "description": "OpenStreetMap Áustria no Twitter: {url}" + }, "osm-at": { "name": "OpenStreetMap Áustria" }, "byosm": { - "name": "OpenStreetMap Bielorrússia" + "name": "OpenStreetMap Bielorrússia", + "description": "Bate-papo do OpenStreetMap Bielorrússia no Telegram" + }, + "be-facebook": { + "description": "Mapeadores e OpenStreetMap no Facebook da Bélgica" + }, + "be-forum": { + "description": "Web forum do OpenStreetMap Bélgica" + }, + "be-irc": { + "name": "IRC OpenStreetMap Bélgica", + "description": "Junte-se à #osmbe no irc.oftc.net (porta 6667)", + "extendedDescription": "Junte-se à #osmbe no irc.oftc.net (porta 6667), ele é vinculado ao canal de bate-papo Matrix" }, "be-mailinglist": { "name": "Lista de Discussão Talk-be" @@ -6983,53 +7123,192 @@ "be-matrix": { "description": "Todos os mapeadores são bem-vindos!" }, + "be-twitter": { + "name": "Twitter do OpenStreetMap Bélgica", + "description": "OSM Bélgica no Twitter: @osm_be" + }, + "hr-facebook": { + "name": "Grupo OpenStreetMap Croácia no Facebook", + "description": "Grupo OpenStreetMap Croácia no Facebook" + }, + "hr-irc": { + "name": "OpenStreetMap Croácia no IRC", + "description": "Junte-se à #osm-hr no irc.freenode.org (porta 6667)" + }, "hr-mailinglist": { "name": "Lista de Discussão Talk-hr", "description": "Lista de discussão Talk-hr" }, + "osmcz-facebook": { + "name": "OpenStreetMap CZ no Facebook" + }, "talk-cz-mailinglist": { "name": "Lista de Discussão Tcheca (talk-cz)" }, + "dk-forum": { + "name": "Web Forum do OpenStreetMap Dinamarca", + "description": "Web forum do OpenStreetMap Dinamarca" + }, + "dk-irc": { + "name": "IRC OpenStreetMap Dinamarca", + "description": "Junte-se à #osm-dk no irc.oftc.net (porta 6667)" + }, "dk-mailinglist": { - "name": "Lista de Discussão Talk-dk" + "name": "Lista de Discussão Talk-dk", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap na Dinamarca" + }, + "fi-forum": { + "description": "Web forum do OpenStreetMap Finlândia" + }, + "fi-irc": { + "name": "IRC OpenStreetMap Finlândia", + "description": "Junte-se à #osm-fi no irc.oftc.net (porta 6667)" }, "fi-mailinglist": { "name": "Lista de Discussão Talk-fi" }, + "fr-forum": { + "name": "Web forum do OpenStreetMap França", + "description": "Web forum do OpenStreetMap França" + }, + "fr-irc": { + "name": "OpenStreetMap França no IRC", + "description": "Junte-se à #osm-fr no irc.oftc.net (porta 6667)" + }, "fr-mailinglist": { "name": "Lista de Discussão Talk-fr", "description": "Lista de Discussão Talk-fr" }, + "fr-twitter": { + "name": "OpenStreetMap França no Twitter", + "description": "OpenStreetMap França no Twitter: {url}" + }, "de-berlin-mailinglist": { "name": "Lista de Discussão Berlim" }, + "de-berlin-telegram": { + "name": "@osmberlin no Telegram", + "description": "Bate-papo do OpenStreetMap Berlin no Telegram" + }, "de-berlin-twitter": { + "name": "Twitter do OpenStreetMap Berlin", "description": "Siga-nos no Twitter: {url}" }, + "de-forum": { + "description": "Web forum do OpenStreetMap Alemanha" + }, + "de-irc": { + "name": "IRC OpenStreetMap Alemanha", + "description": "Junte-se à #osm-de no irc.oftc.net (porta 6667)" + }, "de-mailinglist": { "name": "Lista de Discussão Talk-de" }, "de-ostwestfalen-lippe-mailinglist": { "name": "Lista de Discussão OWL" }, + "de-telegram": { + "name": "Telegram do OpenStreetMap Alemanha", + "description": "Junte-se ao supergrupo OpenStreetMap Alemanha no Telegram em {url}" + }, + "osm-de": { + "name": "OpenStreetMap Alemanha" + }, + "hu-facebook": { + "name": "OpenStreetMap HU no Facebook" + }, + "hu-forum": { + "description": "Web forum do OpenStreetMap Hungria" + }, + "is-facebook": { + "name": "OSM Islândia no Facebook" + }, + "is-twitter": { + "description": "Twitter do OpenStreetMap na Islândia" + }, + "it-facebook": { + "description": "Junte-se à comunidade OpenStreetMap Itália no Facebook" + }, + "it-irc": { + "name": "IRC OpenStreetMap Itália", + "description": "Junte-se à #osm-it no irc.oftc.net (porta 6667)" + }, "it-mailinglist": { "name": "Lista de Discussão Talk-it" }, + "it-telegram": { + "name": "@OpenStreetMapItalia no Telegram", + "description": "Bate-papo do OpenStreetMap Itália no Telegram" + }, + "it-twitter": { + "name": "Twitter do OpenStreetMap Itália", + "description": "Siga-nos no Twitter em {url}" + }, + "OSM-Rome-meetup": { + "description": "Melhore o OpenStreetMap na área de Roma" + }, + "talk-it-lazio": { + "description": "Todos são bem-vindos! Inscreva-se em {signupUrl}" + }, + "no-forum": { + "name": "Web Forum do OpenStreetMap Noruega", + "description": "Web forum do OpenStreetMap Noruega" + }, + "no-irc": { + "name": "OpenStreetMap Noruega no IRC" + }, + "OSM-PL-facebook-group": { + "name": "Grupo OpenStreetMap Polônia no Facebook" + }, "OSM-ES-mailinglist": { - "name": "Lista de Discussão Talk-es" + "name": "Lista de Discussão Talk-es", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap na Espanha" + }, + "OSM-ES-telegram": { + "name": "@OSMes no Telegram", + "description": "Bate-papo do OpenStreetMap Espanha no Telegram" + }, + "se-facebook": { + "description": "OpenStreetMap Suécia no Facebook" + }, + "se-forum": { + "name": "Web Forum do OpenStreetMap Suécia", + "description": "Web forum do OpenStreetMap Suécia" + }, + "se-irc": { + "name": "IRC OpenStreetMap Suécia", + "description": "Junte-se à #osm.se no irc.oftc.net (porta 6667)" }, "se-mailinglist": { - "name": "Lista de Discussão Talk-se" + "name": "Lista de Discussão Talk-se", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap na Suécia" }, "se-twitter": { + "name": "OpenStreetMap Suécia no Twitter", "description": "Siga-nos no Twitter: {url}" }, "gb-mailinglist": { "name": "Lista de Discussão Talk-gb" }, + "gb-irc": { + "name": "IRC OpenStreetMap Reino Unido", + "description": "Junte-se à #osm-gb no irc.oftc.net (porta 6667)", + "extendedDescription": "Junte-se à #osm-gb no irc.oftc.net (porta 6667), por favor seja paciente e aguarde alguns minutos se fizer uma pergunta" + }, + "OSM-CA-Slack": { + "description": "Todos são bem-vindos! Inscreva-se em {signupUrl}" + }, + "OSM-CU-telegram": { + "name": "OSM Cuba no Telegram", + "description": "Bate-papo do OpenStreetMap Cuba no Telegram" + }, + "OSM-NI-telegram": { + "name": "OSM Nicarágua no Telegram", + "description": "Bate-papo do OpenStreetMap Nicarágua no Telegram" + }, "Bay-Area-OpenStreetMappers": { "name": "OpenStreetMappers da Bay Area", - "description": "Melhorar o OpenStreetMap na área da baía", + "description": "Melhorar o OpenStreetMap na Área da Baía", "extendedDescription": "Este grupo é sobre crescer a comunidade do OpenStreetMap aqui na Área da Baía de São Francisco. Nossos eventos são abertos para todos, desde entusiastas open-source, ciclistas, profissionais GIS, geocachers, e além. Todos e quaisquer pessoas interessadas em mapas, cartografia e dados de mapa livres são bem-vindas a se juntar ao nosso grupo e participar dos nossos eventos." }, "Central-Pennsylvania-OSM": { @@ -7047,14 +7326,17 @@ }, "GeoPhilly": { "name": "GeoPhilly", - "description": "Meetup para entusiastas do mapa na área de Filadélfia", + "description": "Encontro para entusiastas do mapa na área de Filadélfia", "extendedDescription": "A GeoPhilly une desenvolvedores, geógrafos, geeks de dados, entusiastas do código aberto, hackers cívicos e viciados em mapas em nosso amor compartilhado pelos mapas e pelas histórias que contam. Se você usa mapas como parte do seu trabalho ou apenas quer aprender mais, este é o encontro para você! Nossos eventos visam ser abertos, amigáveis, educacionais e sociais e vão desde happy hours até palestras relâmpago ou até workshops. Venha criar uma comunidade geoespacial diversificada e inspiradora na Filadélfia conosco!" }, "Mapping-DC-meetup": { "name": "Mapeamneto de DC", - "description": "Melhore o OpenStreetMap na área de DC", + "description": "Melhore o OpenStreetMap na área do DC", "extendedDescription": "Somos um grupo de mapeadores voluntários que visam melhorar o OpenStreetMap na área de DC. Também pretendemos ensinar aos outros sobre o ecossistema OSM, análise de dados, cartografia e GIS. Nós nos reunimos a cada dois meses nos encontros para nos concentrar em uma área da nossa cidade." }, + "OpenCleveland-meetup": { + "description": "Melhore o OpenStreetMap na área de Cleveland" + }, "OSM-Boston": { "name": "OpenStreetMap Boston", "description": "Mapeadores e usuários do OpenStreetMap na área de Boston", @@ -7089,12 +7371,15 @@ "description": "Noites do Mapa hospedado por Code for San Jose" }, "OSM-US-Slack": { - "description": "Todos são bem-vindos! Se inscreva em {signupUrl}" + "description": "Todos são bem-vindos! Inscreva-se em {signupUrl}" }, "OSM-US": { "name": "OpenStreetMap EUA", + "description": "Nós ajudamos o OpenStreetMap a crescer e melhorar nos Estados Unidos.", "events": { "sotmus2018": { + "name": "State of the Map US 2018", + "description": "Junte-se à comunidade OpenStreetMap no State of the Map US em Detroit, Michigan. Conecte-se a outros mapeadores, negócios, agências do governo, e entidades sem fins lucrativos, todos colaborando com o mapa mundial livre e editável.", "where": "Detroit, Michigan" } } @@ -7115,13 +7400,28 @@ "name": "Lista de Discussão Talk-au" }, "OSM-AR-facebook": { - "name": "Facebook OpenStreetMap Argentina" + "name": "Facebook OpenStreetMap Argentina", + "description": "Junte-se à comunidade OpenStreetMap Argentina no Facebook", + "extendedDescription": "Notícias da comunidade local" + }, + "OSM-AR-forum": { + "name": "Web forum do OpenStreetMap Argentina", + "description": "Junte-se ao web forum OpenStreetMap Argentina" + }, + "OSM-AR-irc": { + "name": "IRC OpenStreetMap Argentina", + "description": "Junte-se à #osm-ar no irc.oftc.net (porta 6667)" }, "OSM-AR-mailinglist": { "name": "Lista de Discussão Talk-ar", - "description": "Lista histórica. Em desuso hoje." + "description": "Lista histórica. Em desuso atualmente." + }, + "OSM-AR-telegram": { + "name": "Telegram OpenStreetMap Argentina", + "description": "Junte-se à comunidade OpenStreetMap Argentina no Telegram" }, "OSM-AR-twitter": { + "name": "Twitter OpenStreetMap", "description": "Siga-nos no Twitter em {url}" }, "OSM-BO-mailinglist": { @@ -7131,66 +7431,150 @@ }, "Bahia-telegram": { "name": "Grupo Telegram OpenStreetMap Bahia", - "description": "Participe da comunidade OpenStreetMap Bahia no Telegram", + "description": "Junte-se à comunidade OpenStreetMap Bahia no Telegram", "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" }, "DF-telegram": { "name": "Grupo de Telegram do OpenStreetMap Brasília", - "description": "Participe do grupo de Telegram do OpenStreetMap Brasília", + "description": "Junte-se à comunidade OpenStreetMap Brasília no Telegram", "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" }, "OSM-br-mailinglist": { - "name": "Talk-br Mailing List", - "description": "Uma lista de e-mail de discussão sobre o OpenStreetMap no Brasil" + "name": "Lista de Discussão Talk-br", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap no Brasil" }, "OSM-br-telegram": { "name": "Telegram OpenStreetMap Brasil", - "description": "Participe da comunidade OpenStreetMap Brasil no Telegram", + "description": "Junte-se à comunidade OpenStreetMap Brasil no Telegram", "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar das nossas reuniões. Todos são bem-vindos!" }, "OSM-br-twitter": { "name": "Twitter OpenStreetMap Brasil", - "description": "Nos siga no Twitter em {url}" + "description": "Siga-nos no Twitter em {url}" + }, + "RS-telegram": { + "name": "Grupo Telegram OpenStreetMap Rio Grande do Sul", + "description": "Junte-se à comunidade OpenStreetMap Rio Grande do Sul no Telegram", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" + }, + "OSM-CL-facebook": { + "name": "Facebook OpenStreetMap Chile ", + "description": "Junte-se à comunidade OpenStreetMap Chile no Facebook" }, "OSM-CL-mailinglist": { - "name": "Lista de Discussão Talk-cl" + "name": "Lista de Discussão Talk-cl", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap no Chile" + }, + "OSM-CL-telegram": { + "name": "Telegram OpenStreetMap Chile ", + "description": "Junte-se à comunidade OpenStreetMap Chile no Telegram" }, "OSM-CL-twitter": { - "description": "Siga-nos no Twitter: {url}" + "name": "Twitter OpenStreetMap Chile", + "description": "Siga-nos no Twitter em {url}" }, "OSM-CO-facebook": { + "description": "Junte-se à comunidade OpenStreetMap Colômbia no Facebook", "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap. Todos são bem-vindos!" }, "OSM-CO-mailinglist": { - "name": "Lista de Discussão Talk-co" + "name": "Lista de Discussão Talk-co", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap na Colômbia" + }, + "OSM-CO-telegram": { + "name": "OSM Colômbia no Telegram", + "description": "Bate-papo do OpenStreetMap Colômbia no Telegram" }, "OSM-CO-twitter": { - "description": "Siga-nos no Twitter: {url}" + "name": "Twitter OpenStreetMap Colômbia ", + "description": "Siga-nos no Twitter em {url}" }, "OSM-CO": { "name": "OpenStreetMap Colômbia" }, + "OSM-EC-telegram": { + "name": "OSM Equador no Telegram", + "description": "Bate-papo do OpenStreetMap Equador no Telegram" + }, + "OSM-PY-telegram": { + "name": "OSM Paraguay no Telegram", + "description": "Bate-papo do OpenStreetMap Paraguai no Telegram" + }, + "OSM-PE-facebook": { + "name": "OpenStreetMap Peru no Facebook", + "description": "Junte-se à comunidade OpenStreetMap Peru no Facebook" + }, "OSM-PE-mailinglist": { - "name": "Lista de Discussão Talk-pe" + "name": "Lista de Discussão Talk-pe", + "description": "A lista de discussão oficial da comunidade OpenStreetMap do Peru" + }, + "OSM-PE-matrix": { + "name": "OpenStreetMap Peru Matrix Chat", + "description": "Converse com outros membros da comunidade OpenStreetMap Peru no Matrix." + }, + "OSM-PE-telegram": { + "name": "OpenStreetMap Peru no Telegram", + "description": "Junte-se à comunidade OpenStreetMap Peru no Telegram" }, "OSM-PE-twitter": { - "description": "Siga-nos no Twitter: {url}" + "name": "OpenStreetMap Peru no Twitter", + "description": "Siga-nos no Twitter em {url}" }, "OSM-PE": { - "name": "OpenStreetMap Peru" + "name": "OpenStreetMap Peru", + "description": "Notícias e recursos para a comunidade OpenStreetMap do Peru" + }, + "LATAM-Facebook": { + "name": "OpenStreetMap Latam no Facebook", + "description": "OpenStreetMap Latam no Facebook" + }, + "LATAM-Telegram": { + "name": "OpenStreetMap Latam no Telegram", + "description": "OpenStreetMap no Telegram para a América Latina" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Latam no Twitter", + "description": "Siga-nos no Twitter em {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "Suportando o OpenStreetMap na América Latina", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam é a conferência anual para todos os mapeadores e usuários do OpenStreetMap na América Latina. O programa inclui palestras, painéis, oficinas e mapatonas relacionadas ao OpenStreetMap.", + "where": "Buenos Aires, Argentina" + } + } + }, + "OSM-Facebook": { + "name": "OpenStreetMap no Facebook", + "description": "Curta-nos no Facebook para novidades e atualizações sobre o OpenStreetMap." + }, + "OSM-help": { + "name": "Ajuda OpenStreetMap", + "description": "Faça uma pergunta e obtenha respostas no site de respostas OSM mantido pela comunidade.", + "extendedDescription": "{url} é para todos que precisem de ajuda com o OpenStreetMap. Se você for iniciante ou tem uma questão técnica, estamos aqui para ajudar!" }, "OSM-Reddit": { "name": "OpenStreetMap no Reddit", "description": "/r/openstreetmap/ é um ótimo lugar para aprender mais sobre o OpenStreetMap. Pergunte-nos qualquer coisa!" }, + "OSM-Telegram": { + "name": "OpenStreetMap no Telegram", + "description": "Junte-se ao supergrupo global do OpenStreetMap no Telegram em {url}" + }, "OSM-Twitter": { "name": "Twitter OpenStreetMap", - "description": "Siga-nos no Twitter: {url}" + "description": "Siga-nos no Twitter em {url}" }, "OSMF": { "name": "Fundação OpenStreetMap", + "description": "OSMF é uma fundação sem fins lucrativos baseada no Reino Unido que suporta o projeto OpenStreetMap", + "extendedDescription": "OSMF suporta o OpenStreetMap levantando fundos, mantendo os servidores onde reside o OSM, organizando a conferência anual State of the Map, e coordenando os voluntários que mantém o OSM no ar. Você pode mostrar seu suporte e ter uma voz na direção do OpenStreetMap associando-se como um membro aqui: {signupUrl}", "events": { "sotm2018": { + "name": "State of the Map 2018", "description": "Participe da conferência global do OpenStreetMap em Milão (Itália), evento que irá reunir por três dias toda a comunidade OSM para socializar, compartilhar e aprender juntos.", "where": "Milão, Itália" } diff --git a/dist/locales/pt.json b/dist/locales/pt.json index f93d9f43f..84a7b8337 100644 --- a/dist/locales/pt.json +++ b/dist/locales/pt.json @@ -21,6 +21,11 @@ "description": "Adicionar lojas, restaurantes, escolas, números de porta, passadeiras, locais, etc.", "tail": "Clique no mapa para adicionar um ponto." }, + "add_note": { + "title": "Nota", + "description": "Detetou um erro? Transmita aos outros mapeadores", + "tail": "Clique no mapa para adicionar uma nota" + }, "browse": { "title": "Navegar", "description": "Aproximar e mover o mapa." @@ -40,7 +45,8 @@ "annotation": { "point": "Ponto adicionado.", "vertex": "Nó adicionado a uma linha.", - "relation": "Relação adicionada." + "relation": "Relação adicionada.", + "note": "Adicionou uma nota" } }, "start": { @@ -297,6 +303,14 @@ "create": "Restrição de viragem adicionada.", "delete": "Restrição de viragem eliminada." } + }, + "detach_node": { + "title": "Destacar", + "key": "E", + "description": "Destacar este nó destas linhas/áreas", + "annotation": "Destacar este nó das linhas/áreas principais", + "restriction": "Este nó não pode ser destacado, isso iria danificar a relação \"{relation}\"", + "connected_to_hidden": "Este nó não pode ser destacado, já que está interligado a um elemento oculto" } }, "restriction": { @@ -352,6 +366,8 @@ "localized_translation_name": "Nome" }, "zoom_in_edit": "Aproxime para editar", + "login": "Autenticar", + "logout": "Sair", "loading_auth": "A fazer a ligação ao OpenStreetMap...", "report_a_bug": "Reportar um bug.", "help_translate": "Ajudar a traduzir.", @@ -414,7 +430,12 @@ "edited_by": "Editado por", "changeset": "Conjunto de alterações", "unknown": "Desconhecido", - "link_text": "Histórico em openstreetmap.org" + "link_text": "Histórico em openstreetmap.org", + "note_no_history": "Sem histórico (Nova Nota)", + "note_comments": "Comentários", + "note_created_date": "Data de criação", + "note_created_user": "Criada por", + "note_link_text": "Nota em openstreetmap.org" }, "location": { "key": "L", @@ -444,7 +465,8 @@ "vertex": "vértice", "line": "linha", "area": "área", - "relation": "relação" + "relation": "relação", + "note": "nota" }, "geocoder": { "search": "Pesquisar no mundo inteiro...", @@ -507,8 +529,6 @@ "best_imagery": "Melhor fonte de imagem para esse lugar", "switch": "Mudar para este fundo", "custom": "Personalizado", - "custom_button": "Editar fundo personalizando", - "custom_prompt": "Indique um URL para modelo de mosaicos. Os tokens válidos são:\n - {zoom} ou {z}, {x}, {y} para Z/X/Y esquema de mosaico\n - {-y} ou {ty} para estilo TMS invertido, coordenadas Y\n - {u} para esquemas de mosaicos divididos em quatro\n - {switch:a,b,c} para servidores DNS\n\nExamplo:\n{example}", "overlays": "Camadas superiores", "imagery_source_faq": "Informação da imagem / Reportar um problema", "reset": "reiniciar", @@ -534,6 +554,10 @@ "osm": { "tooltip": "Dados do mapa de OpenStreetMap", "title": "Dados OpenStreetMap" + }, + "notes": { + "tooltip": "Dados da nota do OpenStreetMap", + "title": "Notas OpenstreetMap" } }, "fill_area": "Preenchimento de Áreas", @@ -606,6 +630,16 @@ "tooltip": "As áreas são mostradas totalmente preenchidas." } }, + "settings": { + "custom_background": { + "tooltip": "Editar fundo customizado", + "header": "Definições do fundo customizado", + "instructions": "Introduza o endereço URL do mosaico. Os tokens válidos são:\n {zoom} or {z}, {x}, {y} para esquemas com mosaico Z/X/Y \n{-y} ou {ty} para estilos TMS invertidos com coordenadas Y\n{u} para esquemas de mosaicos quadriculares\n{switch:a,b,c} para servidores DNS\n\nExamplo:\n{example}", + "template": { + "placeholder": "Indicar o endereço url do modelo" + } + } + }, "restore": { "heading": "Tem alterações por gravar", "description": "Tem alterações feitas numa sessão anterior por gravar. Quer recuperar essas alterações?", @@ -707,15 +741,11 @@ }, "cannot_zoom": "Não é possível afastar mais no modo atual.", "full_screen": "Edição em ecrã inteiro.", - "gpx": { - "drag_drop": "Arraste e largue um ficheiro .gpx, .geojson ou .kml na página ou clique no botão da direita para selecionar um", - "zoom": "Aproximar para a camada", - "browse": "Encontrar ficheiro" - }, "streetside": { "tooltip": "Fotos ao nível da rua da Microsoft", "title": "Camada superior com imagens de rua Bing", "report": "Reporte uma preocupação com a privacidade nesta imagem", + "view_on_bing": "Ver no Bing Maps", "hires": "Alta resolução" }, "mapillary_images": { @@ -736,6 +766,33 @@ "openstreetcam": { "view_on_openstreetcam": "Ver esta imagem no OpenStreetCam" }, + "note": { + "note": "Nota", + "title": "Editar nota", + "anonymous": "Anónimo", + "closed": "(concluído)", + "commentTitle": "Comentários", + "status": { + "opened": "Aberto {when}", + "reopened": "Reaberto {when}", + "commented": "comentado {when}", + "closed": "Encerrado {when}" + }, + "newComment": "Novo comentário", + "inputPlaceholder": "Deixe um comentário para partilhar com outros utilizadores", + "close": "Encerrar Nota", + "open": "Reabrir Nota", + "comment": "Comentário", + "close_comment": "Encerrar e comentar", + "open_comment": "Reabrir e comentar", + "report": "Reportar", + "new": "Nova Nota", + "newDescription": "Descreva a situação", + "save": "Guardar Nota", + "login": "Deve autenticar-se para alterar ou comentar esta nota.", + "upload_explanation": "Os seus comentários serão visíveis publicamente a todos os utilizadores do OpenStreetMap.", + "upload_explanation_with_user": "Os seus comentários como {user} serão visivéis publicamente a todos os utilizadores do OpenStreetMap." + }, "help": { "title": "Ajuda", "key": "H", @@ -873,6 +930,12 @@ "boundary": "Uma relação de *fronteira* consiste num grupo de um ou mais elementos de linha que juntos formam um limite administrativo.", "boundary_add": "Para adicionar um elemento a uma relação de fronteira, selecione o elemento e desça até à secção \"Todas as relações\" do editor de elementos e clique no botão adicionar {plus} para adicionar os elementos próximos que existam na relação ou numa nova relação." }, + "notes": { + "title": "Notas", + "add_note_h": "Adicionando Notas", + "update_note_h": "Concluir, Reabrir e Comentar", + "save_note_h": "Guardar Notas" + }, "imagery": { "title": "Imagem de fundo", "intro": "A imagem de fundo que aparece no fundo dos dados do mapa é uma importante fonte para mapear. Esta imagem pode ser fotografias aéreas recolhidas em satélite, em aviões, de drones ou podem ser mapas históricos que foram digitalizados ou outras fontes de informação que estão disponíveis gratuitamente. ", @@ -1258,6 +1321,8 @@ "add_point": "Modo 'adicionar ponto'", "add_line": "Modo 'adicionar linha'", "add_area": "Modo 'adicionar área'", + "add_note": "Modo 'Adicionar nota'", + "place_point": "Coloque um ponto ou nota", "disable_snap": "Manter para desativar atração a pontos", "stop_line": "Terminar de desenhar uma linha ou área" }, @@ -1266,6 +1331,7 @@ "continue_line": "Continuar uma linha no nó selecionado", "merge": "Combinar (fundir) elementos selecionados", "disconnect": "Desligar elementos no nó selecionado", + "detach_node": "Destacar o nó seleccionado das linhas/áreas principais", "split": "Separar uma linha em duas no nó selecionado", "reverse": "Inverter uma linha", "move": "Mover elementos selecionados", @@ -1369,31 +1435,24 @@ "label": "Acesso autorizado", "options": { "designated": { - "description": "Acesso permitido de acordo com a sinalética e/ou legislação local específica; como p. ex. o Código da Estrada", "title": "Indicado" }, "destination": { - "description": "Acesso permitido apenas para chegar a determinado destino; como p. ex. parques de estacionamento ou centros comerciais", "title": "Destino" }, "dismount": { - "description": "Acesso permitido mas o cavaleiro deve desmontar", "title": "Desmontar" }, "no": { - "description": "Acesso não permitido ao público em geral", "title": "Proibido" }, "permissive": { - "description": "Acesso permitido até o proprietário revogar a permissão", "title": "Permissivo" }, "private": { - "description": "Acesso permitido apenas com permissão do proprietário de forma individual", "title": "Privado" }, "yes": { - "description": "Acesso permitido por lei", "title": "Permitido" } }, @@ -1822,7 +1881,7 @@ "label": "Exceções" }, "faces": { - "label": "Caras" + "label": "Faces" }, "fax": { "label": "Fax", @@ -2938,10 +2997,6 @@ "name": "Ponto de reparação de bicicletas self-service", "terms": "Bicycle Repair Tool Station" }, - "amenity/biergarten": { - "name": "Jardim da cerveja", - "terms": "Beer Garden, Biergarten" - }, "amenity/boat_rental": { "name": "Aluguer de barcos", "terms": "Boat Rental" @@ -6454,8 +6509,16 @@ } }, "community": { + "bw-facebook": { + "name": "Mapeando Botsuana no Facebook", + "description": "Página do OpenStreetMap no Botsuana" + }, + "bw-twitter": { + "name": "Mapeando Botsuana no Twitter", + "description": "Twitter do OpenStreetMap no Botsuana" + }, "cape-coast-youthmappers": { - "description": "Segue-nos no Twitter: {url}" + "description": "Siga-nos no Twitter: {url}" }, "osm-gh-facebook": { "name": "OpenStreetMap Gana no Facebook", @@ -6536,20 +6599,81 @@ "name": "Lista de Discussão Talk-au" }, "OSM-AR-mailinglist": { - "name": "Lista de Discussão Talk-ar" + "name": "Lista de Discussão Talk-ar", + "description": "Lista histórica. Em desuso atualmente." + }, + "OSM-AR-telegram": { + "name": "Telegram OpenStreetMap Argentina", + "description": "Junte-se à comunidade OpenStreetMap Argentina no Telegram" + }, + "OSM-AR-twitter": { + "description": "Siga-nos no Twitter em {url}" }, "OSM-BO-mailinglist": { - "name": "Lista de Discussão Talk-bo" + "name": "Lista de Discussão Talk-bo", + "description": "Lista de discussão oficial da comunidade OpenStreetMap Boliviana", + "extendedDescription": "Mapeando na Bolívia? Tem dúvidas, quer conectar-se com a comunidade aqui? Junte-se a nós em {url}. Todos são bem-vindos!" + }, + "Bahia-telegram": { + "name": "Grupo Telegram OpenStreetMap Bahia", + "description": "Junte-se à comunidade OpenStreetMap Bahia no Telegram", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" + }, + "DF-telegram": { + "name": "Grupo de Telegram do OpenStreetMap Brasília", + "description": "Junte-se à comunidade OpenStreetMap Brasília no Telegram", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" }, "OSM-br-mailinglist": { "name": "Lista de Discussão Talk-br", "description": "Uma lista de discussão para falar sobre o OpenStreetMap no Brasil" }, + "OSM-br-telegram": { + "name": "Telegram OpenStreetMap Brasil", + "description": "Junte-se à comunidade OpenStreetMap Brasil no Telegram", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar das nossas reuniões. Todos são bem-vindos!" + }, + "OSM-br-twitter": { + "name": "Twitter OpenStreetMap Brasil", + "description": "Siga-nos no Twitter em {url}" + }, + "RS-telegram": { + "name": "Grupo Telegram OpenStreetMap Rio Grande do Sul", + "description": "Junte-se à comunidade OpenStreetMap Rio Grande do Sul no Telegram", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" + }, + "OSM-CL-facebook": { + "name": "Facebook OpenStreetMap Chile ", + "description": "Junte-se à comunidade OpenStreetMap Chile no Facebook", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" + }, "OSM-CL-mailinglist": { - "name": "Lista de Discussão Talk-cl" + "name": "Lista de Discussão Talk-cl", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap no Chile" + }, + "OSM-CL-telegram": { + "name": "Telegram OpenStreetMap Chile ", + "description": "Junte-se à comunidade OpenStreetMap Chile no Telegram", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap, fazer perguntas ou participar dos nossos encontros. Todos são bem-vindos!" + }, + "OSM-CL-twitter": { + "name": "Twitter OpenStreetMap Chile", + "description": "Siga-nos no Twitter em {url}" + }, + "OSM-CO-facebook": { + "description": "Junte-se à comunidade OpenStreetMap Colômbia no Facebook", + "extendedDescription": "Entre na comunidade para aprender mais sobre o OpenStreetMap. Todos são bem-vindos!" }, "OSM-CO-mailinglist": { - "name": "Lista de Discussão Talk-co" + "name": "Lista de Discussão Talk-co", + "description": "Uma lista de discussão para falar sobre o OpenStreetMap na Colômbia" + }, + "OSM-CO-telegram": { + "name": "OSM Colômbia no Telegram" + }, + "OSM-CO-twitter": { + "name": "Twitter OpenStreetMap Colômbia ", + "description": "Siga-nos no Twitter em {url}" }, "OSM-PE-mailinglist": { "name": "Lista de Discussão Talk-pe" diff --git a/dist/locales/ro.json b/dist/locales/ro.json index 50109b663..b136f8a75 100644 --- a/dist/locales/ro.json +++ b/dist/locales/ro.json @@ -356,7 +356,6 @@ "best_imagery": "Cea mai cunoscută sursă de imagine pentru această locație", "switch": "Schimbă înapoi la acest fundal", "custom": "Personalizat", - "custom_button": "Editează fundalul customizat", "reset": "resetează", "minimap": { "key": "/" @@ -489,10 +488,6 @@ "tag_suggests_area": "Tag-ul {tag} sugerează că linia trebuie sa fie o suprafață, dar nu e.", "deprecated_tags": "Tag-uri învechite: {tags}" }, - "gpx": { - "zoom": "Mărește la strat", - "browse": "Caută fișier" - }, "mapillary": { "view_on_mapillary": "Vezi această imagine pe Mapillary" }, @@ -768,18 +763,15 @@ "label": "Acces Permis", "options": { "designated": { - "description": "Acces permis potrivit semnalizării sau legilor locale", "title": "Desemnat" }, "destination": { - "description": "Acces permis doar pentru a ajunge la o destinație", "title": "Destinație" }, "dismount": { "title": "Demonta" }, "no": { - "description": "Acces interzis publicului larg", "title": "Interzis" }, "permissive": { @@ -1041,12 +1033,49 @@ "description": { "label": "Descripție" }, + "direction_cardinal": { + "options": { + "E": "Est", + "ENE": "Est-Nord-Est", + "ESE": "Est-Sud-Est", + "N": "Nord", + "NE": "Nord-Est", + "NNE": "Nord-Nord-Est", + "NNW": "Nord-Nord-Vest", + "NW": "Nord-Vest", + "S": "Sud", + "SE": "Sud-Est", + "SSE": "Sud-Sud-Est", + "SSW": "Sud-Sud-Vest", + "SW": "Sud-Vest", + "W": "Vest", + "WNW": "Vest-Nord-Vest", + "WSW": "Vest-Sud-Vest" + } + }, + "direction_clock": { + "options": { + "anticlockwise": "Sens antiorar", + "clockwise": "Sens orar" + } + }, + "direction_vertex": { + "options": { + "forward": "Înainte" + } + }, "display": { "label": "Afișare" }, + "distance": { + "label": "Distanţă totală" + }, "dock": { "label": "Tip" }, + "duration": { + "label": "Durată" + }, "electrified": { "options": { "no": "Nu", @@ -1060,6 +1089,10 @@ "label": "Email", "placeholder": "example@example.com" }, + "embankment": { + "label": "Tip", + "placeholder": "Implicit" + }, "emergency": { "label": "Urgență" }, @@ -1098,6 +1131,10 @@ "fixme": { "label": "Repară-mă" }, + "ford": { + "label": "Tip", + "placeholder": "Implicit" + }, "fuel": { "label": "Benzină" }, @@ -1125,10 +1162,16 @@ "generator/type": { "label": "Tip" }, + "government": { + "label": "Tip" + }, "handicap": { "label": "Handicap", "placeholder": "1-18" }, + "healthcare": { + "label": "Tip" + }, "height": { "label": "Înălțime (Metri)" }, @@ -1144,6 +1187,12 @@ "hoops": { "placeholder": "1, 2, 4..." }, + "horse_dressage": { + "options": { + "equestrian": "Da", + "undefined": "Nu" + } + }, "iata": { "label": "IATA" }, @@ -1325,9 +1374,13 @@ "placeholder": "3, 4, 5..." }, "parking": { - "label": "Tip" + "label": "Tip", + "options": { + "surface": "Suprafaţă" + } }, "phone": { + "label": "Telefon", "placeholder": "+31 42 123 4567" }, "piste/difficulty": { @@ -1344,7 +1397,9 @@ "options": { "hike": "Drumeție", "nordic": "Nordic", - "playground": "Loc de Joacă" + "playground": "Loc de Joacă", + "sled": "Sanie", + "sleigh": "Sanie" } }, "place": { @@ -1623,9 +1678,6 @@ "amenity/bicycle_rental": { "name": "Închiriere biciclete" }, - "amenity/biergarten": { - "name": "Biergarten" - }, "amenity/boat_rental": { "name": "Închiriere Barcă" }, @@ -3306,6 +3358,9 @@ } }, "community": { + "cape-coast-youthmappers": { + "description": "Urmăriţi-ne pe Twitter : {url}" + }, "Bay-Area-OpenStreetMappers": { "description": "Îmbunătățește OpenStreetMap în Bay Area" } diff --git a/dist/locales/ru.json b/dist/locales/ru.json index e728bada3..8e162bb4a 100644 --- a/dist/locales/ru.json +++ b/dist/locales/ru.json @@ -429,7 +429,12 @@ "edited_by": "Отредактировано", "changeset": "Пакет правок", "unknown": "Неизвестно", - "link_text": "История на openstreetmap.org" + "link_text": "История на openstreetmap.org", + "note_no_history": "История отсутствует (новая заметка)", + "note_comments": "Комментарии", + "note_created_date": "Дата создания", + "note_created_user": "Создана", + "note_link_text": "Заметка на openstreetmap.org" }, "location": { "key": "L", @@ -459,7 +464,8 @@ "vertex": "точка в составе линии", "line": "линия", "area": "полигон", - "relation": "отношение" + "relation": "отношение", + "note": "заметка" }, "geocoder": { "search": "Глобальный поиск…", @@ -521,9 +527,7 @@ "none": "Отключить", "best_imagery": "Наилучший источник космоснимков из известных для этой территории", "switch": "Переключить обратно на это фоновое изображение", - "custom": "Настраиваемый", - "custom_button": "Указать собственное фоновое изображение", - "custom_prompt": "Введите URL шаблона тайлов. Корректные токены:\n - {zoom} или {z}, {x}, {y} для Z/X/Y тайловой схемы\n - {-y} или {ty} для перевернутого TMS-стиля Y координат\n - {u} для quadtile схемы\n - {switch:a,b,c} для мультиплексирования DNS-сервера\n\nПример:\n{example}", + "custom": "Пользовательское", "overlays": "Накладываемые изображения", "imagery_source_faq": "Сведения о подложке / Сообщить о проблеме", "reset": "сброс", @@ -553,6 +557,11 @@ "notes": { "tooltip": "Данные с заметками OpenStreetMap", "title": "Заметки OpenStreetMap" + }, + "custom": { + "tooltip": "Перетащите файл с данными на страницу или нажмитке кнопку для настройки", + "title": "Пользовательские данные карты", + "zoom": "Приблизиться к данным" } }, "fill_area": "Заливать полигоны", @@ -625,6 +634,29 @@ "tooltip": "Отображение полигонов полностью залитыми." } }, + "settings": { + "custom_background": { + "tooltip": "Отредактировать пользовательское фоновое изображение", + "header": "Настройки пользовательского фонового изображения", + "instructions": "Введите шаблон URL с тайлами. Корректные токены:\n {zoom} или {z}, {x}, {y} для схемы тайлов вида Z/X/Y\n {-y} или {ty} для перевёрнутых Y координат в TMS стиле\n {u} для quadtile схемы\n {switch:a,b,c} для мультиплексирования DNS-сервера\n\nПример:\n{example}", + "template": { + "placeholder": "Введите URL шаблона" + } + }, + "custom_data": { + "tooltip": "Отредактировать пользовательские данные карты", + "header": "Настройки пользовательских данных карты", + "file": { + "instructions": "Выберете с диска файл с данными. Поддерживаемые типы:\n .gpx, .kml, .geojson, .json", + "label": "Выбрать файлы" + }, + "or": "Или", + "url": { + "instructions": "Введите URL файла с данными или шаблон URL для векторных тайлов. Допустимы переменные:\n {zoom} или {z}, {x}, {y} для схемы тайлов Z/X/Y", + "placeholder": "Введите URL" + } + } + }, "restore": { "heading": "У вас есть несохранённые изменения", "description": "Вы хотите восстановить несохранённые изменения с прошлого сеанса?", @@ -726,18 +758,6 @@ }, "cannot_zoom": "В текущем режиме дальнейшее отдаление невозможно.", "full_screen": "Во весь экран", - "gpx": { - "local_layer": "Добавить GPX", - "drag_drop": "Перетащите .gpx, .geojson или .kml файл на страницу или нажмите кнопку справа для его выбора", - "zoom": "Приблизиться к слою", - "browse": "Выбрать файл" - }, - "mvt": { - "local_layer": "Добавить MVT", - "drag_drop": "Перетащите .mvt либо .pbf файл на страницу, или нажмите кнопку справа для просмотра", - "zoom": "Приблизиться к слою", - "browse": "Выбрать файл" - }, "streetside": { "tooltip": "Уличные фото от Microsoft", "title": "Слой с фото (Bing Streetside)", @@ -769,6 +789,12 @@ "anonymous": "анонимно", "closed": "(Закрыта)", "commentTitle": "Комментарии", + "status": { + "opened": "открыта {when}", + "reopened": "переоткрыта {when}", + "commented": "прокомментирована {when}", + "closed": "закрыта {when}" + }, "newComment": "Новый комментарий", "inputPlaceholder": "Введите комментарий и поделитесь им с другими пользователями.", "close": "Закрыть заметку", @@ -1326,7 +1352,7 @@ "add_point": "Режим “Нанести точку”", "add_line": "Режим “Нанести линию”", "add_area": "Режим “Добавить полигон”", - "add_note": "Режим 'Добавить заметку'", + "add_note": "Режим “Добавить заметку”", "place_point": "Разместите точку или заметку", "disable_snap": "При удержании отключает режим прилипания точек", "stop_line": "Завершить линию или полигон" @@ -1440,11 +1466,11 @@ "label": "Общий доступ", "options": { "designated": { - "description": "Доступ разрешен в соответствии со знаками или специфичными местными законами", + "description": "Доступ разрешён в соответствии со знаками или специфичными местными законами", "title": "Предназначенный" }, "destination": { - "description": "Доступ разрешён только до места назначения", + "description": "Доступ разрешён только для достижения места назначения", "title": "До места назначения" }, "dismount": { @@ -1452,19 +1478,23 @@ "title": "Спешиваться обязательно" }, "no": { - "description": "Посторонним доступ запрещён", + "description": "Доступ не разрешён для широкой публики", "title": "Запрещено" }, "permissive": { - "description": "Доступ возможен до тех пор, пока владелец не отменит разрешение в любой момент", + "description": "Доступ разрешён до тех пор, пока владелец не отзовёт разрешение", "title": "Допускается" }, + "permit": { + "description": "Доступ разрешён только при наличии действующего разрешения или лицензии", + "title": "Наличие разрешения/лицензии" + }, "private": { - "description": "Доступ разрешён только с разрешения владельца в индивидуальном порядке", + "description": "Доступ разрешён только с позволения владельца на индивидуальной основе", "title": "С разрешения владельца" }, "yes": { - "description": "Доступ разрешён законом; право пройти", + "description": "Доступ разрешён законом; доступная (общая) для передвижения земля", "title": "Разрешено" } }, @@ -1730,7 +1760,7 @@ } }, "crop": { - "label": "Выращивается" + "label": "Cельхоз культура" }, "crossing": { "label": "Тип пешеходного перехода" @@ -3047,7 +3077,7 @@ "terms": "велосипед, ремонт, цепи, подкачка" }, "amenity/biergarten": { - "name": "Пивной сад (Бавария)", + "name": "Пивной сад", "terms": "ресторан-пивоварня, пивной сад,биргарден,биргартен" }, "amenity/boat_rental": { @@ -4748,6 +4778,10 @@ "name": "Регбийное поле", "terms": "поле для американского футбола" }, + "leisure/pitch/badminton": { + "name": "Площадка для бадминтона", + "terms": "бадминтон, волан, ракетка, сетка" + }, "leisure/pitch/baseball": { "name": "Бейсбольная площадка", "terms": "Бейсбол" @@ -4868,6 +4902,10 @@ "name": "Контур моста", "terms": "мост" }, + "man_made/bunker_silo": { + "name": "Силосная яма", + "terms": "бункер, хранилище, силос" + }, "man_made/chimney": { "name": "Дымовая труба", "terms": "дымовая труба, труба, заводская труба" @@ -4934,8 +4972,8 @@ "name": "Насосная станция" }, "man_made/silo": { - "name": "Силос (склад сыпучего)", - "terms": "зерно, пшеница, мука" + "name": "Силос (хранилище сыпучего)", + "terms": "зерно, пшеница, мука, хранилище" }, "man_made/storage_tank": { "name": "Cооружение для хранения жидкостей или газов", diff --git a/dist/locales/si.json b/dist/locales/si.json index ce9a91ac8..0b510bdb8 100644 --- a/dist/locales/si.json +++ b/dist/locales/si.json @@ -265,7 +265,6 @@ "description": "පසුබිම් සැකසුම්", "none": "කිසිවක් නැත", "custom": "රිසි පරදී සැකසු", - "custom_button": "පසුතලය රිසි පරිදි සැකසීම සදහා", "reset": "යළි පිහිටුවනවා" }, "map_data": { diff --git a/dist/locales/sk.json b/dist/locales/sk.json index 0a0a14ac4..37475484f 100644 --- a/dist/locales/sk.json +++ b/dist/locales/sk.json @@ -450,7 +450,6 @@ "best_imagery": "Najviac známy zdroj obrázkov pre túto polohu", "switch": "Prepnúť späť na toto pozadie", "custom": "Voliteľné", - "custom_button": "Upraviť volitelné pozadie", "reset": "vynulovať", "minimap": { "tooltip": "Zobraziť oddialenú mapu pre ľahšie lokalizovanie práve zobrazenej oblasti.", @@ -623,11 +622,6 @@ }, "cannot_zoom": "V tomto móde nemožno viac oddialiť.", "full_screen": "Prepni na plnú obrazovku", - "gpx": { - "drag_drop": "Pretiahnite a pustite .gpx, .geojson or .kml súbor na stránku, alebo kliknite na tlačítko napravo pre výber", - "zoom": "Priblížiť na vrstvu", - "browse": "Vybrať súbor" - }, "mapillary_images": { "tooltip": "Fotografie ulíc z Mapillary", "title": "Vrstva fotografií (Mapillary)" @@ -1058,31 +1052,24 @@ "label": "Povolený vstup", "options": { "designated": { - "description": "Povolenie vstupu je riadené dopravnými značkami alebo miestnymi zákonmi", "title": "Vyznačené" }, "destination": { - "description": "Vstup povolený iba dosiahnutie cieľa", "title": "Prejazd zakázaný" }, "dismount": { - "description": "Vstup povolený, ale jazdci musia zosadnúť", "title": "Zosadnutie z vozidla" }, "no": { - "description": "Verejnosti vstup zakázaný", "title": "Zakázané" }, "permissive": { - "description": "Vstup povolený pokiaľ majiteľ povolenie neodvolá", "title": "Povolený" }, "private": { - "description": "Vstup možný iba s povolením vlastníka na individuálnom základe", "title": "Súkromné" }, "yes": { - "description": "Vstup povolený zo zákona", "title": "Povolené" } }, @@ -2510,10 +2497,6 @@ "name": "Stojan s náradím na opravu bicyklov", "terms": "stojan s naradim na opravu bicyklov,bicykel,oprava,naradie,náradie" }, - "amenity/biergarten": { - "name": "Záhradná piváreň", - "terms": "zahradna pivaren,pivnica,hostinec,krčma,krcma,vonkajšie posedenie,vonkajsie posedenie" - }, "amenity/boat_rental": { "name": "Prenájom lodí", "terms": "prenajom lodi,požičovňa lodí,pozicovna lodi,prenájom člnov,prenajom clnov,pozivocna clnov,požičovňa člnov, čln,cln,člny,clny,lode,skútre,skutre,vodné skútre,vodne skutre" diff --git a/dist/locales/sl.json b/dist/locales/sl.json index 31b13a217..1736509c1 100644 --- a/dist/locales/sl.json +++ b/dist/locales/sl.json @@ -21,6 +21,11 @@ "description": "Dodajanje restavracij, spomenikov, poštnih nabiralnikov ali drugih točk na zemljevid.", "tail": "Za dodajanje točke kliknite na zemljevid." }, + "add_note": { + "title": "Opomba", + "description": "Ali ste opazili problem? Obvestite urejevalce zemljevida.", + "tail": "S klikom na zemljevid lahko dodate opombo." + }, "browse": { "title": "Prebrskaj", "description": "Premikanje po zemljevidu in približanje pogleda." @@ -30,6 +35,9 @@ }, "draw_line": { "tail": "Kliknite za dodajanje vozlišč na črto. S klikom na drugo črto se črti povežeta, z dvoklikom pa se risanje konča." + }, + "drag_node": { + "connected_to_hidden": "Predmeta ni mogoče urejati, ker je povezan s skritim predmetom." } }, "operations": { @@ -37,7 +45,8 @@ "annotation": { "point": "dodajanje točke ×", "vertex": "dodano vozlišče ×", - "relation": "dodajanje zveze ×" + "relation": "dodajanje zveze ×", + "note": "Opomba je dodana." } }, "start": { @@ -290,6 +299,9 @@ "create": "dodajanje omejitve zavijanja ×", "delete": "odstranjevanje omejitev zavijanja ×" } + }, + "detach_node": { + "title": "Odpni" } }, "restriction": { @@ -314,6 +326,8 @@ "localized_translation_name": "Naziv" }, "zoom_in_edit": "Približaj za urejanje", + "login": "Prijava", + "logout": "Odjava", "loading_auth": "Vzpostavljanje povezave z OpenStreetMap ...", "report_a_bug": "Pošlji sporočilo napaki", "help_translate": "Sodelujte pri prevodu", @@ -385,6 +399,8 @@ "title": "Merilo", "selected": "{n} izbranih", "geometry": "Geometrija", + "closed_line": "zaprta črta", + "closed_area": "zaprt mnogokotnik", "center": "Središče", "perimeter": "Obseg", "length": "Dolžina", @@ -464,7 +480,6 @@ "best_imagery": "Najbolj znan slikovni vir ozadja za to območje", "switch": "Preklopi nazaj na to ozadje.", "custom": "Po meri", - "custom_button": "Uredi ozadje po meri", "reset": "ponastavi", "display_options": "Možnosti prikaza", "brightness": "Svetlost", @@ -616,7 +631,7 @@ "welcome": "Dobrodošli v iD, urejevalniku podatkov OpenStreetMap", "text": "Urejevalnik iD je zmogljivo, uporabniku prijazno orodje za vnašanje podatkov na najboljši brezplačni svetovni zemljevid. Uporabljena je zadnja različica {version}. Več podrobnosti o urejevalniku je na voljo na {website}, poročila o hroščih pa se zbirajo na spletišču {github}.", "walkthrough": "Predstavitev orodja", - "start": "Uredi takoj" + "start": "Začni z urejanjem" }, "source_switch": { "live": "objavljeno", @@ -653,10 +668,10 @@ }, "cannot_zoom": "V trenutnem načinu nadaljnje oddaljevanje pogleda ni mogoče.", "full_screen": "Preklopi celozaslonski način", - "gpx": { - "drag_drop": "Povlecite datoteko .gpx, .geojson ali .khm na stran, ali pa kliknite gumb na desni za brskanje med datotekami.", - "zoom": "Približaj plasti", - "browse": "Prebrskaj za datoteko" + "streetside": { + "tooltip": "Ulične fotografije z Microsofta", + "view_on_bing": "Ogled na zemljevidih Bing", + "hires": "Visoka ločljivost" }, "mapillary_images": { "tooltip": "Fotografije ulic prek storitve Mapillary", @@ -676,6 +691,11 @@ "openstreetcam": { "view_on_openstreetcam": "Pokaži sliko na spletišču OpenStreetCam" }, + "note": { + "note": "Opomba", + "title": "Uredi opombo", + "closed": "(zaprto)" + }, "help": { "title": "Pomoč", "key": "H", @@ -684,8 +704,18 @@ "welcome": "Dobrodošli v urejevalniku iD za [OpenStreetMap](https://www.openstreetmap.org/). S tem urejevalnikom lahko OpenStreetMap posodobite neposredno iz brskalnika." }, "overview": { + "title": "Pregled", + "navigation_h": "Usmerjanje", "features_h": "Značilnosti zemljevida" }, + "editing": { + "title": "Urejanje in shranjevanje", + "select_h": "Izbor", + "undo_redo_h": "Razveljavi in Ponovno uveljavi", + "save_h": "Shrani", + "upload_h": "Pošlji", + "backups_h": "Samodejne varnostne kopije" + }, "field": { "restrictions": { "about": { @@ -1023,6 +1053,7 @@ "add_point": "Način dodajanja »Točk« ", "add_line": "Način dodajanja »Črt« ", "add_area": "Način dodajanja »Mnogokotnikov« ", + "add_note": "Način dodajanja »Opomb« ", "disable_snap": "Zadržite tipko za onemogočanje lepljenja točk", "stop_line": "Končaj risanje črte ali površine" }, @@ -1129,31 +1160,24 @@ "label": "Dovoljen dostop", "options": { "designated": { - "description": "Dostop je dovoljen v skladu z znaki ali posebnimi krajevnimi zakoni", "title": "Namembno" }, "destination": { - "description": "Dostop je dovoljen samo za dostavo", "title": "Za dostavo" }, "dismount": { - "description": "Dovoljen dostop, toda jezdec razjaha", "title": "Razjahati" }, "no": { - "description": "Dostop za splošno javnost ni dovoljen", "title": "Prepovedano" }, "permissive": { - "description": "Dostop je dovoljen začasno, dokler lastnik dovoljenja ne prekliče", "title": "Začasno dovoljen" }, "private": { - "description": "Dostop je dovoljen samo z osebnim dovoljenjem lastnika", "title": "Zasebno" }, "yes": { - "description": "Dostopno po zakonu; služnostna pravica", "title": "Dovoljeno" } }, @@ -1597,6 +1621,10 @@ "fixme": { "label": "Popravi me" }, + "ford": { + "label": "Vrsta", + "placeholder": "Default" + }, "fuel": { "label": "Bencinska črpalka" }, @@ -1782,6 +1810,9 @@ "label": "Omejitev hitrosti", "placeholder": "40, 50, 60 ..." }, + "maxspeed/advisory": { + "placeholder": "40, 50, 60 ..." + }, "maxstay": { "label": "Najdaljši postanek" }, @@ -1920,6 +1951,9 @@ "payment_multi": { "label": "Vrste plačila" }, + "phases": { + "placeholder": "1, 2, 3 ..." + }, "phone": { "placeholder": "+386 1 234 5678" }, @@ -1970,6 +2004,9 @@ "plant/output/electricity": { "placeholder": "500 MW, 1000 MW, 2000 MW ..." }, + "playground/baby": { + "label": "Otroški sedež" + }, "population": { "label": "Število prebivalcev" }, @@ -2428,10 +2465,6 @@ "name": "Stojalo za popravilo koles", "terms": "popravljalnica,kolesarnica" }, - "amenity/biergarten": { - "name": "Vrt pivnica", - "terms": "pivnica, pivski vrt" - }, "amenity/boat_rental": { "name": "Izposoja plovil", "terms": "najem čolnov,rent-a-boat,izposoja čolnov" @@ -4901,6 +4934,12 @@ } }, "imagery": { + "AGIVFlandersGRB": { + "attribution": { + "text": "GRB Flanders © AGIV" + }, + "name": "AGIV Flanders GRB" + }, "Bing": { "description": "Satelitski posnetki in posnetki iz zraka", "name": "Satelitski posnetki Bing" @@ -4995,6 +5034,27 @@ }, "name": "OSM Inspector: oznake" }, + "US-TIGER-Roads-2012": { + "name": "TIGER Roads 2012" + }, + "US-TIGER-Roads-2014": { + "name": "TIGER Roads 2014" + }, + "US-TIGER-Roads-2017": { + "name": "TIGER Roads 2017" + }, + "UrbISOrtho2016": { + "name": "UrbIS-Ortho 2016" + }, + "UrbISOrtho2017": { + "name": "UrbIS-Ortho 2017" + }, + "UrbisAdmFR": { + "name": "UrbisAdm FR" + }, + "UrbisAdmNL": { + "name": "UrbisAdm NL" + }, "Waymarked_Trails-Cycling": { "name": "Waymarked Trails: kolesarjenje" }, @@ -5027,6 +5087,21 @@ }, "name": "Pohodništvo in kolesarstvo" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + } + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + } + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + } + }, "mapbox_locator_overlay": { "attribution": { "text": "Pogoji uporabe in odziv" @@ -5058,13 +5133,56 @@ }, "name": "OpenStreetMap (nemški slog)" }, + "osmse-ekonomiska": { + "attribution": { + "text": "© Lantmäteriet" + } + }, "qa_no_address": { "attribution": { "text": "Simon Pole, podatki skupnost © OpenStreetMap" } }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + } + }, + "tf-cycle": { + "name": "Thunderforest OpenCycleMap" + }, "tf-landscape": { "name": "Thunderforest Landscape" + }, + "trafikverket-baninfo": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-baninfo-option": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat-extra": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat-navn": { + "attribution": { + "text": "© Trafikverket, CC0" + } + }, + "trafikverket-vagnat-option": { + "attribution": { + "text": "© Trafikverket, CC0" + } } }, "community": { @@ -5077,18 +5195,24 @@ }, "osm-gh-twitter": { "name": "OpenStreetMap Ghana na Twitterju", - "description": "Sledi nam na Twitterju: {url}" + "description": "Sledite nam na Twitterju: {url}" }, "osm-mg-facebook": { "name": "Facebook skupina OpenStreetMap Madagaskar" }, + "OSM-MY-facebook": { + "description": "Za klepet o čemerkoli v zvezi z OpenStreetMap!" + }, + "be-irc": { + "description": "Pridružite se #osmbe na irc.oftc.net (vrata 6667)" + }, "si-forum": { - "name": "Slovenski OpenStreetMap forum", + "name": "Slovenski forum OpenStreetMap", "description": "Forum skupnosti OpenStreetMap v Sloveniji" }, "si-mailinglist": { - "name": "Slovenski OpenStreetMap dopisni seznam", - "description": "Dopisni seznam slovenske OpenStreetMap skupnosti" + "name": "Slovenski dopisni seznam OpenStreetMap", + "description": "Dopisni seznam slovenske skupnosti OpenStreetMap" }, "OSM-help": { "name": "Pomoč OpenStreetMap" diff --git a/dist/locales/sq.json b/dist/locales/sq.json index d485962a4..6a28f7929 100644 --- a/dist/locales/sq.json +++ b/dist/locales/sq.json @@ -1,5 +1,10 @@ { "sq": { + "icons": { + "information": "info", + "remove": "hiq", + "undo": "zhbëj" + }, "modes": { "add_area": { "title": "Sipërfaqe", @@ -16,6 +21,10 @@ "description": "Shtoni restorante, monumente, kuti postare, ose pika të tjera në hartë.", "tail": "Klikoni në hartë për të shtuar një pikë." }, + "add_note": { + "title": "Shënim", + "tail": "Klikoni në hartë për të shtuar shënim." + }, "browse": { "title": "Shfleto", "description": "Sposto dhe zmadho hartën." @@ -32,7 +41,8 @@ "annotation": { "point": "U shtua një pikë.", "vertex": "U shtua një nyjë në një linjë.", - "relation": "U shtua një lidhje." + "relation": "U shtua një lidhje.", + "note": "U shtua një shënim." } }, "start": { @@ -100,12 +110,20 @@ }, "delete": { "title": "Fshij", + "description": { + "single": "Fshijeni këtë karakteristik përkohësisht", + "multiple": "Fshijini këto karakteristika përkohësisht." + }, "annotation": { "point": "U fshi një pik.", "vertex": "U fshi një nyjë nga një linjë.", "line": "U fshi një vijë.", "area": "U fshi një sipërfaqe.", - "relation": "U fshi një lidhje." + "relation": "U fshi një lidhje.", + "multiple": "U fshin {n} karakteristika." + }, + "too_large": { + "single": "Kjo karakteristik s'mund fshihet se pse s'është e mjaftueshme të dukshme." } }, "connect": { @@ -266,7 +284,6 @@ "description": "Parametrat e sfondit", "none": "Asnjë", "custom": "E personalizuar", - "custom_button": "Redakto sfondin të personalizuar", "reset": "Rikthe vlerat", "minimap": { "tooltip": "Shfaq një hartë të zvogluar për të treguar vendosjen e zonës të dukshme." diff --git a/dist/locales/sr.json b/dist/locales/sr.json index 62a24de0e..dfe5f768a 100644 --- a/dist/locales/sr.json +++ b/dist/locales/sr.json @@ -449,7 +449,6 @@ "best_imagery": "Најбољи познати извор слика за овај положај", "switch": "Пребаци се на ову позадину", "custom": "Прилагођена", - "custom_button": "Измени прилагођену позадину", "reset": "ресет", "minimap": { "tooltip": "Покажи умањену мапу како би вам помогло да пронађете тренутно приказано подручје.", @@ -618,11 +617,6 @@ }, "cannot_zoom": "Не можете даље умањивати у тренутном режиму.", "full_screen": "Укључи / искључи приказ на целом екрану", - "gpx": { - "drag_drop": "Превуците и отпустите .gpx, .geojson или .kml датотеку на страницу или кликните на дугме здесна за претраживање", - "zoom": "Приближи до слоја", - "browse": "Претражите за датотеком" - }, "mapillary_images": { "tooltip": "Фотографије на нивоу улица из Мапиларија", "title": "Фотографски слој (Мапилари)" @@ -879,31 +873,24 @@ "label": "Дозвољен приступ", "options": { "designated": { - "description": "Приступ дозвољен само према знацима или одређеним локалним законима", "title": "Наменски" }, "destination": { - "description": "Приступ дозвољен само за пролазак до одредишта", "title": "Одредиште" }, "dismount": { - "description": "Приступ дозвољен, али коњаник мора да сјаше", "title": "Сјахан" }, "no": { - "description": "Приступ није дозвољен за ширу јавност", "title": "Забрањен" }, "permissive": { - "description": "Приступе дозвољен све док власник опозове дозволу", "title": "Пропустљив" }, "private": { - "description": "Приступ дозвољен само уз одобрење власника на индивидуалној основи", "title": "Приватан" }, "yes": { - "description": "Приступе дозвољен законом, правом проласка", "title": "Дозвољен" } }, diff --git a/dist/locales/sv.json b/dist/locales/sv.json index 47f16e597..56c379cac 100644 --- a/dist/locales/sv.json +++ b/dist/locales/sv.json @@ -22,9 +22,9 @@ "tail": "Klicka på kartan för att lägga till en punkt." }, "add_note": { - "title": "Notering", + "title": "Anteckning", "description": "Hittat ett problem? Låt andra kartläggare få veta det. ", - "tail": "Klicka på kartan för att lägga till en notering. " + "tail": "Klicka på kartan för att lägga till en anteckning. " }, "browse": { "title": "Navigera", @@ -46,7 +46,7 @@ "point": "Lade till en punkt.", "vertex": "Lade till en nod till en linje.", "relation": "Lade till en relation.", - "note": "Lägg till en notering. " + "note": "Lagt till en anteckning." } }, "start": { @@ -430,7 +430,12 @@ "edited_by": "Redigerad av", "changeset": "Ändringsset", "unknown": "Okänd", - "link_text": "Historik på openstreetmap.org" + "link_text": "Historik på openstreetmap.org", + "note_no_history": "Ingen historik (ny anteckning)", + "note_comments": "Kommentarer", + "note_created_date": "Skapad den", + "note_created_user": "Skapad av", + "note_link_text": "Anteckning på openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "hörn", "line": "linje", "area": "område", - "relation": "relation" + "relation": "relation", + "note": "anteckning" }, "geocoder": { "search": "Sök hela världen...", @@ -523,8 +529,6 @@ "best_imagery": "Populäraste källan till flygfoton för den här platsen", "switch": "Växla tillbaka till denna bakgrund", "custom": "Anpassa", - "custom_button": "Ändra anpassad bakgrund", - "custom_prompt": "Ange en URL-mall för plattor. Giltiga nycklar är:\n  - {zoom} eller {z}, {x}, {y} enligt Z/X/Y-schema\n  - {-y} eller {ty} för Y-koordinat enligt omvänd TMS-stil\n  - {u} för QuadTile-scheman\n  - {switch:a,b,c} för multiplex mot DNS-server\n\nExempel:\n{example}", "overlays": "Bildlager", "imagery_source_faq": "Info om flygfotot / Rapportera ett problem", "reset": "ta bort", @@ -552,8 +556,8 @@ "title": "OpenStreetMap-data" }, "notes": { - "tooltip": "Noteringar från OpenStreetMap", - "title": "OpenStreetMap-noteringar" + "tooltip": "Anteckning från OpenStreetMap", + "title": "OpenStreetMap-anteckningar" } }, "fill_area": "Fyllda områden", @@ -626,6 +630,16 @@ "tooltip": "Områden är ritade fullt ifyllda." } }, + "settings": { + "custom_background": { + "tooltip": "Ändra anpassad bakgrund", + "header": "Inställningar för anpassad bakgrund", + "instructions": "Ange en URL-mall för plattor. Giltiga nycklar är:\n {zoom} eller {z}, {x}, {y} enligt Z/X/Y-schema\n {-y} eller {ty} för Y-koordinat enligt omvänd TMS-stil\n {u} för QuadTile-scheman\n {switch:a,b,c} för multiplex mot DNS-server\n\nExempel:\n{example}", + "template": { + "placeholder": "Ange en url-mall" + } + } + }, "restore": { "heading": "Du har osparade ändringar.", "description": "Du har ändringar från förra sessionen som inte har sparats. Vill du hämta dessa ändringar?", @@ -727,18 +741,6 @@ }, "cannot_zoom": "Går ej att zooma ut ytterligare i nuvarande läge. ", "full_screen": "Växla fullskärm", - "gpx": { - "local_layer": "Lägg till en GPX", - "drag_drop": "Dra och släpp en .gpx-, .geojson- eller .kml-fil på sidan, eller klicka på knappen till höger för att bläddra", - "zoom": "Zooma till lager", - "browse": "Bläddra efter en fil" - }, - "mvt": { - "local_layer": "Lägg till en MVT", - "drag_drop": "Drag och släpp en .mvt- eller .pbf-fil på sidan, eller klicka på knappen till höger för att bläddra.", - "zoom": "Zooma till lager", - "browse": "Bläddra efter en fil" - }, "streetside": { "tooltip": "Gatubilder från Microsoft", "title": "Bildlager (Bing Streetside)", @@ -765,23 +767,29 @@ "view_on_openstreetcam": "Visa denna bild på OpenStreetCam" }, "note": { - "note": "Notering", - "title": "Ändra notering", + "note": "Anteckning", + "title": "Ändra anteckning", "anonymous": "anonym", "closed": "(Stängd)", "commentTitle": "Kommentarer", + "status": { + "opened": "öppnad {when}", + "reopened": "återöppnad {when}", + "commented": "kommenterad {when}", + "closed": "stängd {when}" + }, "newComment": "Ny kommentar", "inputPlaceholder": "Skriv en kommentar att dela med andra användare.", - "close": "Stäng notering", - "open": "Öppna notering igen", + "close": "Stäng anteckning", + "open": "Öppna anteckning igen", "comment": "Kommentera", "close_comment": "Stäng och kommentera", "open_comment": "Öppna igen och kommentera", "report": "Anmäl", - "new": "Ny notering", + "new": "Ny anteckning", "newDescription": "Beskriv problemet. ", - "save": "Spara notering", - "login": "Du måste logga in för att ändra eller kommentera den här noteringen.", + "save": "Spara anteckning", + "login": "Du måste logga in för att ändra eller kommentera den här anteckningen.", "upload_explanation": "Dina kommentarer kommer att vara synliga för alla OpenStreetMap-användare.", "upload_explanation_with_user": "Dina kommentarer som {user} kommer att vara synliga för alla OpenStreetMap-användare." }, @@ -794,7 +802,7 @@ "open_data_h": "Öppen data", "open_data": "Ändringar du gör på kartan kommer att vara synliga för alla som använder OpenStreetMap. Dina ändringar kan vara baserade på egen kunskap, undersökningar på plats eller bilder som samlats in från flyg eller på gatunivå. Kopiering från kommersiella källor, till exempel Google Maps, är [strängt förbjudet](https://www.openstreetmap.org/copyright).", "before_start_h": "Innan du börjar", - "before_start": "Du bör vara bekant med OpenStreetMap och denna redigerare innan du börja redigera. iD har en genomgång för att lära dig grunderna i att redigera på OpenStreetMap. Klicka på \"Starta genomgången\" på skärmen för att komma till genomgången - det tat bara omkring 15 minuter. ", + "before_start": "Du bör vara bekant med OpenStreetMap och denna redigerare innan du börja redigera. iD har en genomgång för att lära dig grunderna i att redigera på OpenStreetMap. Klicka på \"Starta genomgången\" på skärmen för att komma till genomgången – det tat bara omkring 15 minuter. ", "open_source_h": "Öppen källkod", "open_source": "iD-redigeraren är ett open source-projekt gemensamt framtaget av dess användare, och du använder nu version {version}. Källkoden finns tillgänglig [på GitHub](https://github.com/openstreetmap/iD).", "open_source_help": "Du kan hjälpa iD genom att [översätta text](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) och [rapportera buggar](https://github.com/openstreetmap/iD/issues)." @@ -894,7 +902,7 @@ "modify_area_dragnode": "Ofta ser du områden som inte har korrekt form, t.ex. en byggnad som inte helt matchar med bakgrundsbilden. För att justera formen på ett område, {leftclick} vänsterklicka först på den för att markera den. Alla noder längst området kommer att visas som små cirklar. Du kan dra och flytta noderna till bättre platser.", "modify_area_addnode": "Du kan även skapa nya noder längst ett område genom att {leftclick}**x2** dubbelklicka på kanten till området eller genom att dra i den lilla triangeln mellan noder.", "delete_area_h": "Radera områden", - "delete_area": "Om ett område är helt fel, t.ex. om en byggnad inte existerar i verkligheten, är det ok att radera den. Var försiktig när du radera objekt - bakgrundsbilden du använder kan vara föråldrad, och en byggnad som ser fel ut kan helt enkelt vara nybyggd.", + "delete_area": "Om ett område är helt fel, t.ex. om en byggnad inte existerar i verkligheten, är det ok att radera den. Var försiktig när du radera objekt – bakgrundsbilden du använder kan vara föråldrad, och en byggnad som ser fel ut kan helt enkelt vara nybyggd.", "delete_area_command": "För att radera ett område, {rightclick} högerklicka på området för att markera det och visa redigeramenyn. Använd sedan kommandot {delete} **Radera**." }, "relations": { @@ -923,15 +931,15 @@ "boundary_add": "För att lägga till ett objekt till en gräns-relation, välj objektet och bläddra ned till sektionen \"Alla relationer\" i objektredigeraren. Klicka sedan på knappen {plus} **Lägg till** för att lägga till detta objekt till en närliggande existerande relation eller en ny relation." }, "notes": { - "title": "Noteringar", - "intro": "*Noteringar* används för att uppmärksamma andra användare att ett objekt behöver fixas eller bearbetas. Noteringar markerar en specifik plats på kartan. För att se existerande noteringar eller lägga till nya, klicka på panelen {data} **Kartdata** för att aktivera lagret OpenStreetMap-noteringar. ", - "add_note_h": "Lägga till noteringar", - "add_note": "För att lägga till en ny notering, klicka på knappen {note} **Notering** i verktygsraden ovanför kartan, eller trycka kortkommandot `4`. Detta kommer att ändra muspekaren till ett kryss. För att placera den nya noteringen på kartan, placera muspekaren där noteringen ska vara och vänsterklicka {leftclick} eller tryck `Mellanslag`. ", - "move_note": "Bara nya noteringar kan flyttas. För att flytta en notering, placera muspekaren över den nya noteringen och tryck sedan och håll ned {leftclick} vänster musknapp medan du dra noteringen till dess nya placering. ", + "title": "Anteckningar", + "intro": "*Anteckningar* används för att uppmärksamma andra användare att ett objekt behöver fixas eller bearbetas. Anteckningar markerar en specifik plats på kartan. För att se existerande anteckningar eller lägga till nya, klicka på panelen {data} **Kartdata** för att aktivera lagret OpenStreetMap-anteckningar. ", + "add_note_h": "Lägga till anteckningar", + "add_note": "För att lägga till en ny anteckning, klicka på knappen {note} **Anteckning** i verktygsraden ovanför kartan, eller trycka kortkommandot `4`. Detta kommer att ändra muspekaren till ett kryss. För att placera den nya anteckningen på kartan, placera muspekaren där anteckningen ska vara och vänsterklicka {leftclick} eller tryck `Mellanslag`. ", + "move_note": "Bara nya anteckningar kan flyttas. För att flytta en anteckning, placera muspekaren över den nya anteckningen och tryck sedan och håll ned {leftclick} vänster musknapp medan du dra anteckningen till dess nya placering. ", "update_note_h": "Stänga, återöppna och kommentera", - "update_note": "En existerande notering kan uppdateras genom att stänga den, återöppna den, eller genom att lägga till en kommentar till den. Genom att stänga en notering indikerar du att problemet har lösts. Genom att återöppna en notering indikerar du att det ursprungliga problemet inte är löst. ", - "save_note_h": "Spara noteringar", - "save_note": "Du måste spara alla ändringar du gör på noteringar individuellt genom att klicka på knapparna under noteringens kommentarer. Ändringar på noteringar inkluderas **inte** i ändringset du laddar upp till OpenStreetMap." + "update_note": "En existerande anteckning kan uppdateras genom att stänga den, återöppna den, eller genom att lägga till en kommentar till den. Genom att stänga en anteckning indikerar du att problemet har lösts. Genom att återöppna en anteckning indikerar du att det ursprungliga problemet inte är löst. ", + "save_note_h": "Spara anteckningar", + "save_note": "Du måste spara alla ändringar du gör på anteckningar individuellt genom att klicka på knapparna under anteckningens kommentarer. Ändringar på anteckningar inkluderas **inte** i ändringsset du laddar upp till OpenStreetMap." }, "imagery": { "title": "Bakgrundsbilder", @@ -957,7 +965,7 @@ "survey": "För information om hur du utför en GPS-uppmätning, läs [Kartlägg med en smartmobil, GPS eller papper](http://learnosm.org/en/mobile-mapping/).", "using_h": "Använda GPS-spår", "using": "För att använda ett GPS-spår vid kartläggning, dra och släpp datafilen på kartredigeraren. Om den har ett känt format kommer den att ritas på kartan med en ljus lila linje. Klicka på panelen {data} **Kartdata** vid sidan av kartan för att aktivera, avaktivera eller zooma din GPS-data.", - "tracing": "GPS-spåret skickas inte till OpenStreetMap - bästa sättet att använda den är att rita på kartan användandes den som guide för nya objekt du lägger till.", + "tracing": "GPS-spåret skickas inte till OpenStreetMap – bästa sättet att använda den är att rita på kartan användandes den som guide för nya objekt du lägger till.", "upload": "Du kan även [ladda upp dina GPS-data till OpenStreetMap](https://www.openstreetmap.org/trace/create) så att andra kan använda det." }, "field": { @@ -1327,8 +1335,8 @@ "add_point": "'Lägg till punkt'-läge", "add_line": "'Lägg till linje'-läge", "add_area": "'Lägg till område'-läge", - "add_note": "'Lägg till notering'-läge", - "place_point": "Placera en punkt eller notering", + "add_note": "'Lägg till anteckning'-läge", + "place_point": "Placera en punkt eller anteckning", "disable_snap": "Hindra att punkter kopplas samman", "stop_line": "Slutför linje eller område" }, @@ -1454,19 +1462,23 @@ }, "no": { "description": "Tillträde ej tillåten för allmänheten", - "title": "Förbjudet" + "title": "Förbjuden" }, "permissive": { "description": "Tillträde tillåten fram till dess ägare återkallar tillståndet", "title": "Påbjuden" }, + "permit": { + "description": "Tillträde tillåten enbart med giltigt tillstånd eller licens", + "title": "Tillstånd" + }, "private": { "description": "Tillträde tillåten endast med tillstånd av ägaren på individuell basis", "title": "Privat" }, "yes": { "description": "Tillträde är tillåtet enligt lag", - "title": "Tillåtna" + "title": "Tillåten" } }, "placeholder": "Ej specificerat", @@ -2031,7 +2043,7 @@ } }, "horse_scale": { - "label": "Svårighetsgrad - Ridning", + "label": "Svårighetsgrad – Ridning", "options": { "common": "Lätt: Inga problem eller svårigheter (standard).", "critical": "Gränsfall: Passar endast för erfarna ryttare och hästar. Större hinder. Broar bör undersökas noggrant.", @@ -2208,7 +2220,7 @@ "label": "Mäter" }, "mtb/scale": { - "label": "Svårighetsgrad - Mountainbike", + "label": "Svårighetsgrad – Mountainbike", "options": { "0": "0: Fast grus/packad jord, inga hinder, breda kurvor", "1": "1: Delvis löst underlag, små hinder, breda kurvor", @@ -2232,7 +2244,7 @@ "placeholder": "Enkel, medel, svår..." }, "mtb/scale/uphill": { - "label": "Svårighetsgrad - Mountainbike uppför", + "label": "Svårighetsgrad – Mountainbike uppför", "options": { "0": "0: Genomsnittlig lutning <10%, grus/packad jord, inga hinder", "1": "1: Genomsnittlig lutning <15%, grus/packad jord, få små hinder", @@ -3053,7 +3065,7 @@ }, "amenity/biergarten": { "name": "Ölträdgård", - "terms": "ölträdgård, Biergarten, uteservering,ölcafé, utecafé, trädgårdspub, öl, sprit" + "terms": "ölträdgård, Biergarten, uteservering, servering, ölcafé, utecafé, trädgårdspub, utepub, pub, öl, sprit, utebar, trädgårdsbar, bar, krog" }, "amenity/boat_rental": { "name": "Båtuthyrning", @@ -4079,10 +4091,10 @@ "terms": "Defibrillator, hjärtstartare, hjärthjälp" }, "emergency/designated": { - "name": "Åtkomst för utryckningsfordon - Avsedd för" + "name": "Åtkomst för utryckningsfordon – Avsedd för" }, "emergency/destination": { - "name": "Åtkomst för utryckningsfordon - Destination" + "name": "Åtkomst för utryckningsfordon – Destination" }, "emergency/fire_alarm": { "name": "Nödtelefon", @@ -4109,17 +4121,17 @@ "terms": "badvakt, livräddare, CPR, räddning, strandvakt, Lifeguard" }, "emergency/no": { - "name": "Åtkomst för utryckningsfordon - Nej" + "name": "Åtkomst för utryckningsfordon – Nej" }, "emergency/official": { - "name": "Åtkomst för utryckningsfordon - Officiellt" + "name": "Åtkomst för utryckningsfordon – Officiellt" }, "emergency/phone": { "name": "Nödtelefon", "terms": "Nödtelefon, alarmeringscentral, nödnummer, larmtelefon, alarmtelefon" }, "emergency/private": { - "name": "Åtkomst för utryckningsfordon - Ja" + "name": "Åtkomst för utryckningsfordon – Privat" }, "emergency/siren": { "name": "Siren", @@ -4130,7 +4142,7 @@ "terms": "Vattentank för brandsläckning, vattentank, nödtank, brandsläckningstank, brand, brandsläckning, nöd, vatten, tank, kris, reservoar, räddning, vattensamling, lagringstank, tank, cistern, vattentorn" }, "emergency/yes": { - "name": "Åtkomst för utryckningsfordon - Ja" + "name": "Åtkomst för utryckningsfordon – Ja" }, "entrance": { "name": "In-/Utgång", @@ -4841,6 +4853,10 @@ "name": "Plan för amerikansk fotboll", "terms": "Amerikansk fotboll, Amerikansk fotbollsplan, football" }, + "leisure/pitch/badminton": { + "name": "Badmintonplan", + "terms": "Badmintonplan, badminton, Badmintonbana, fjäderboll" + }, "leisure/pitch/baseball": { "name": "Baseballplan", "terms": "Baseball, baseballplan, baseball-plan" @@ -4965,6 +4981,10 @@ "name": "Bro", "terms": "bro, viadukt, akvedukt, vägport, överfart, spång, övergång, förbindelse, fällbro, vridbro" }, + "man_made/bunker_silo": { + "name": "Plansilo", + "terms": "Plansilo, Ensilage, pressfoder, silo, lager, foder, djurfoder, spannmålslagring, spannmål, spannmålssilo,fodersilo" + }, "man_made/chimney": { "name": "Skorsten", "terms": "skorsten, rökgång" @@ -5034,7 +5054,7 @@ }, "man_made/silo": { "name": "Silo", - "terms": "Silo, spannmålslagring, spannmål, spannmålssilo, fodersilo" + "terms": "Ensilage, pressfoder, silo, lager, foder, djurfoder, spannmålslagring, spannmål, spannmålssilo,fodersilo" }, "man_made/storage_tank": { "name": "Lagringstank", @@ -6670,7 +6690,7 @@ "attribution": { "text": "Ortofoto Flandern © AGIV" }, - "name": "AGIV Flandern 2013-2015 flygfoton 10cm" + "name": "AGIV Flandern 2013–2015 flygfoton 10 cm" }, "AGIVFlandersGRB": { "attribution": { @@ -6700,7 +6720,7 @@ "attribution": { "text": "Villkor & återkoppling" }, - "description": "DigitalGlobe-Standard är en kuraterad bildserie som täcker 86% av jordens landmassa, med 30-60 cm upplösning där den är tillgänglig och Landsat för övrig yta. Medelåldern är 2,31 år och vissa områden uppdaterade 2 gånger per år.", + "description": "DigitalGlobe-Standard är en kuraterad bildserie som täcker 86% av jordens landmassa, med 30–60 cm upplösning där den är tillgänglig och Landsat för övrig yta. Medelåldern är 2,31 år och vissa områden uppdaterade 2 gånger per år.", "name": "DigitalGlobe Standard-bilder" }, "DigitalGlobe-Standard-vintage": { @@ -6803,25 +6823,25 @@ }, "UrbISOrtho2016": { "attribution": { - "text": "Realiserad med hjälp från Bryssel UrbIS®© - Distribution & Copyright CIRB" + "text": "Realiserad med hjälp från Bryssel UrbIS®© – Distribution & Copyright CIRB" }, "name": "UrbIS-Ortho 2016" }, "UrbISOrtho2017": { "attribution": { - "text": "Realiserad med hjälp från Bryssel UrbIS®© - Distribution & Copyright CIRB" + "text": "Realiserad med hjälp från Bryssel UrbIS®© – Distribution & Copyright CIRB" }, "name": "UrbIS-Ortho 2017" }, "UrbisAdmFR": { "attribution": { - "text": "Realiserad med hjälp från Bryssel UrbIS®© - Distribution & Copyright CIRB" + "text": "Realiserad med hjälp från Bryssel UrbIS®© – Distribution & Copyright CIRB" }, "name": "UrbisAdm FR" }, "UrbisAdmNL": { "attribution": { - "text": "Realiserad med hjälp från Bryssel UrbIS®© - Distribution & Copyright CIRB" + "text": "Realiserad med hjälp från Bryssel UrbIS®© – Distribution & Copyright CIRB" }, "name": "UrbisAdm NL" }, @@ -6875,6 +6895,27 @@ }, "name": "Vandring & cykel" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi snöskoterleder från OSM (Nordisk täckning)", + "name": "Bildlager med nordiska skoterleder" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaik av svenska ortofoton från perioden 1955–1965. Äldre och yngre bilder kan förekomma.", + "name": "Lantmäteriets historiska ortofoton 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Mosaik av svenska ortofoton från perioden 1970–1980. Är under uppbyggnad.", + "name": "Lantmäteriets historiska ortofoton 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Villkor & återkoppling" @@ -6911,8 +6952,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Inskanning av den Ekonomiska kartan från ca 1950–1980", - "name": "Lantmäteriets Ekonomiska karta (historisk)" + "description": "Inskanning av \"Ekonomisk karta\" från ungefär 1950–1980", + "name": "Lantmäteriets Ekonomiska karta 1950–1980" }, "qa_no_address": { "attribution": { @@ -6926,6 +6967,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Snöskoterleder", + "name": "Snöskoterkarta, Sverige" + }, "stamen-terrain-background": { "attribution": { "text": "Kartplattor av Stamen Design, under CC BY 3.0. Data från OpenStreetMap, under ODbL " @@ -6976,7 +7024,7 @@ "attribution": { "text": "© Trafikverket, CC0" }, - "description": "Svenska nationella vägdatabasen, NVDB - Gatunamn", + "description": "Svenska nationella vägdatabasen, NVDB – Gatunamn", "name": "Trafikverkets gaturnamn" }, "trafikverket-vagnat-option": { @@ -6988,6 +7036,14 @@ } }, "community": { + "bw-facebook": { + "name": "Kartlägg Botswana på Facebook", + "description": "Sida om OpenStreetMap i Botswana" + }, + "bw-twitter": { + "name": "Kartlägg Botswana på Twitter", + "description": "Twitter om OpenStreetMap i Botswana" + }, "cape-coast-youthmappers": { "name": "University of Cape Coast YouthMappers", "description": "Följ oss på Twitter: {url}", @@ -7020,7 +7076,7 @@ "extendedDescription": "Kartlägger i Bangladesh? Har du frågor, vill du ansluta till gemenskapen här? Anslut dig på {url}. Alla är välkomna!" }, "OSM-India-facebook": { - "name": "OpenStreetMap Indien - Användarstödd kartläggning av grannskapet", + "name": "OpenStreetMap Indien – Användarstödd kartläggning av grannskapet", "description": "Förbättra OpenStreetMap i Indien", "extendedDescription": "Kartlägger i Indien? Har du frågor, vill komma i kontakt med gemenskapen här? Gå med på {url}. Alla är välkomna!", "events": { @@ -7040,12 +7096,12 @@ "description": "Vi är bara ett tweet iväg: {url}" }, "OSM-India-Puducherry-Facebook": { - "name": "Rörelsen för fri mjukvara och hårdvara - Facebook", + "name": "Rörelsen för fri mjukvara och hårdvara – Facebook", "description": "Facebook-sidan FSHM för att få veta om evenemang och aktiviteter", "extendedDescription": "FSHM organiserar evenemang relaterade till gratis mjukvara/hårdvara, teknologi, aktivism och OpenStreetMap. Dess Facebook-sida är det bästa vägen att hålla kontakten med dess evenemang." }, "OSM-India-Puducherry-Matrix": { - "name": "Rörelsen för fri mjukvara och hårdvara - Matrix", + "name": "Rörelsen för fri mjukvara och hårdvara – Matrix", "description": "FSHM:s Riot-grupp för att diskutera, dela och uppdatera om kartläggningsaktiviteter och evenemang i och omkring Puducherry", "extendedDescription": "FSHM:s medlemmar delar sina kartläggningsuppdateringar / -erfarenheter i OSM genom Riot.im-gruppen, denna grupp används även för att diskutera saker relaterade till fri mjukvara / hårdvara, teknologi och aktivism." }, @@ -7157,7 +7213,7 @@ }, "al-maptime-tirana": { "name": "Maptime Tirana", - "description": "Sociala evenemang organiserade runt kartläggning - nybörjare är varmt välkomna!", + "description": "Sociala evenemang organiserade runt kartläggning – nybörjare är varmt välkomna!", "extendedDescription": "Maptime är en öppen inlärningsmiljö för alla kunskapsnivåer, och erbjuder riktat pedagogiskt stöd till nybörjaren. Maptime är både flexibel och strukturerad, vilket skapar möjlighet för kartläggningsguider, workshops, pågående projekt med gemensamt mål samt arbetstid för oberoende projekt eller samarbetande." }, "al-telegram": { @@ -7211,7 +7267,7 @@ }, "be-maptime": { "name": "Maptime Belgien", - "description": "Sociala evenemang organiserade runt kartläggning - nybörjare är varmt välkomna!", + "description": "Sociala evenemang organiserade runt kartläggning – nybörjare är varmt välkomna!", "extendedDescription": "Maptime är en öppen inlärningsmiljö för alla kunskapsnivåer, och erbjuder riktat pedagogiskt stöd till nybörjaren. Maptime är både flexibel och strukturerad, vilket skapar möjlighet för kartläggningsguider, workshops, pågående projekt med gemensamt mål samt arbetstid för oberoende projekt eller samarbetande." }, "be-matrix": { @@ -7246,11 +7302,11 @@ }, "osmcz-facebook": { "name": "OpenStreetMap CZ på Facebook", - "description": "Följ tjeckiska gemenskapen på Facebook - inklusive översatt WeeklyOSM!" + "description": "Följ tjeckiska gemenskapen på Facebook – inklusive översatt WeeklyOSM!" }, "osmcz-twitter": { "name": "Tjeckiska twitter @osmcz", - "description": "Följ tjeckiska gemenskapen på Twitter - inklusive översatt WeeklyOSM!" + "description": "Följ tjeckiska gemenskapen på Twitter – inklusive översatt WeeklyOSM!" }, "talk-cz-mailinglist": { "name": "Tjeckisk e-postlista (talk-cz)", @@ -7352,6 +7408,18 @@ "name": "OpenStreetMap Ungern på Meetup", "description": "Plattformen för att organisera träffar i Ungen" }, + "is-facebook": { + "name": "OSM Island på Facebook", + "description": "Sida om OpenStreetMap på Island" + }, + "is-mailinglist": { + "name": "E-postlistan Talk-is", + "description": "Talk-is är den officiella e-postlistan för den isländska OSM-gemenskapen" + }, + "is-twitter": { + "name": "OSM Island på Twitter", + "description": "Twitter om OpenStreetMap på Island" + }, "it-facebook": { "name": "OpenStreetMap Italien på Facebook", "description": "Anslut till gemenskapen i OpenStreetMap Italien via Facebook" @@ -7582,7 +7650,7 @@ "OSM-Tampa-Bay": { "name": "OpenStreetMap Tampa Bay", "description": "Kartläggare och OpenStreetMap-användare runt Tampa Bay", - "extendedDescription": "Gruppen OSM Tampa Bay är till för att lokalinvånare ska förenas och bygga upp den optimala kartan över Tampa Bay med OpenStreetMap, den fria och redigerbara kartan över världen. Om du gillar kartor, data, open source, GPS, vandring, cykling, etc., kommer du att älska att arbeta med OpenStreetMap\n-- så gå med! Vi kommer samman, kartlägger och pratar om nya ämnen ungefär en gång i månaden." + "extendedDescription": "Gruppen OSM Tampa Bay är till för att lokalinvånare ska förenas och bygga upp den optimala kartan över Tampa Bay med OpenStreetMap, den fria och redigerbara kartan över världen. Om du gillar kartor, data, open source, GPS, vandring, cykling, etc., kommer du att älska att arbeta med OpenStreetMap\n– så gå med! Vi kommer samman, kartlägger och pratar om nya ämnen ungefär en gång i månaden." }, "OSM-US-Slack": { "name": "OpenStreetMap US på Slack", @@ -7686,13 +7754,18 @@ }, "OSM-br-telegram": { "name": "Telegram för OpenStreetMap Brasilien", - "description": "Anslut till gemenskapen på OpenStreetMap Brasilien via Telegram", + "description": "Anslut till gemenskapen i OpenStreetMap Brasilien via Telegram", "extendedDescription": "Anslut till gemenskapen för att lära dig mer om OpenStreetMap, ställa frågor eller delta på våra möten. Alla är välkomna!" }, "OSM-br-twitter": { "name": "OpenStreetMap Brasilien på Twitter", "description": "Följ oss på Twitter på {url}" }, + "RS-telegram": { + "name": "Telegram-grupp för OpenStreetMap Rio Grande do Sul", + "description": "Anslut till gemenskapen i OpenStreetMap Rio Grande do Sul via Telegram", + "extendedDescription": "Anslut till gemenskapen för att lära dig mer om OpenStreetMap, ställa frågor eller delta på våra möten. Alla är välkomna!" + }, "OSM-CL-facebook": { "name": "OpenStreetMap Chile på Facebook", "description": "Anslut till gemenskapen i OpenStreetMap Child via Facebook", @@ -7769,6 +7842,29 @@ "name": "OpenStreetMap Peru", "description": "Nyheter och resurser för OpenStreetMap Peru-gemenskapen" }, + "LATAM-Facebook": { + "name": "OpenStreetMap Latam på Facebook", + "description": "OpenStreetMap Latam på Facebook" + }, + "LATAM-Telegram": { + "name": "Telegram för OpenStreetMap Latam", + "description": "OpenStreetMap-Telegram för Latinamerika" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Latam på Twitter", + "description": "Följ oss på Twitter på {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "Stöder OpenStreetMap i Latinamerika", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam är en årlig konferens för alla kartläggare och användare av OpenStreetMap i Latinamerika. Programmet innehåller föreläsningar, paneldebatter, workshops och mapathons relaterade till OpenStreetMap.", + "where": "Buenos Aires, Argentina" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap på Facebook", "description": "Gilla oss på Facebook för nyheter och uppdateringar om OpenStreetMap" diff --git a/dist/locales/ta.json b/dist/locales/ta.json index 2eae144ba..15de38d52 100644 --- a/dist/locales/ta.json +++ b/dist/locales/ta.json @@ -300,7 +300,6 @@ "title": "இறங்கு" }, "no": { - "description": "பொதுமக்களுக்கு அணுகல் அனுமதி இல்லை", "title": "தடை செய்யப்பட்ட" }, "permissive": { diff --git a/dist/locales/th.json b/dist/locales/th.json index 48d63c733..875f92c7c 100644 --- a/dist/locales/th.json +++ b/dist/locales/th.json @@ -201,31 +201,24 @@ "label": "อนุญาตการเข้าถึง", "options": { "designated": { - "description": "การเข้าถึงที่ได้รับอนุญาตตามป้ายหรือกฎหมายของท้องถิ่น", "title": "กำหนดแล้ว" }, "destination": { - "description": "การเข้าถึงที่ได้รับอนุญาตเฉพาะปลายทางที่จะเข้าถึง", "title": "ปลายทาง" }, "dismount": { - "description": "อนุญาตการเข้าถึง แต่ผู้ขับขี่จะต้องลงจากยานพาหนะ", "title": "ต้องลงจากยานพาหนะ" }, "no": { - "description": "การเข้าถึงที่ไม่ได้รับอนุญาตให้กับบุคคลทั่วไป", "title": "หวงห้าม" }, "permissive": { - "description": "เข้าถึงที่ได้รับอนุญาตจนกว่าจะถึงเวลาเช่นเจ้าของสั่งเพิกถอนสิทธิ์", "title": "ต้องได้รับอนุญาต" }, "private": { - "description": "การเข้าถึงที่ได้รับอนุญาตเฉพาะการอนุญาตจากเจ้าของเป็นรายบุคคล", "title": "ส่วนบุคคล" }, "yes": { - "description": "การเข้าถึงได้รับอนุญาตตามกฎหมาย เป็นทางที่ชอบด้วยกฎหมาย", "title": "ได้รับอนุญาต" } }, diff --git a/dist/locales/tl.json b/dist/locales/tl.json index abd006350..191f1be22 100644 --- a/dist/locales/tl.json +++ b/dist/locales/tl.json @@ -393,7 +393,6 @@ "none": "Wala", "best_imagery": "Pinakakilalang pinagmulan ng imaheng ito para sa lokasyon na ito", "custom": "Custom", - "custom_button": "I-edit ang custom na background", "reset": "I-reset", "minimap": { "tooltip": "Ipakita ang naka-zoom out na mapa upang makatulong na mahanap ang mga lugar na kasalukuyang ipinapakita." @@ -598,31 +597,24 @@ "label": "Pinapayagan ng access", "options": { "designated": { - "description": "Access na pinahihintulutan alinsunod sa mga palatandaan o mga tiyak na lokal na batas", "title": "Itinalagang" }, "destination": { - "description": "Access na pinahihintulutan para maabot ang destinasyon lamang", "title": "Destinasyon" }, "dismount": { - "description": "Access na pinahihintulutan pero ang sumakay ay kailangan bumaba", "title": "Bumaba" }, "no": { - "description": "Access na hindi pinahihintulutan sa publiko.", "title": "Bawal" }, "permissive": { - "description": "Access na pinahihintulutan hanggang sa panahon na bawiin ng may-ari ang permiso.", "title": "mapagpahintulot" }, "private": { - "description": "Access na pinahihintulutan kapag may pahintulot ng may-ari o ang isang indibidwal na batayan lamang.", "title": "Pribado" }, "yes": { - "description": "Access na pinahihintulutan sa pamamagitan ng batas; isang karapatan ng paraan", "title": "Pinapayagan" } }, diff --git a/dist/locales/tr.json b/dist/locales/tr.json index 574c00957..c2ff20e1d 100644 --- a/dist/locales/tr.json +++ b/dist/locales/tr.json @@ -486,7 +486,6 @@ "best_imagery": "Bu yer için bilinen en iyi uydu görüntüsü", "switch": "Bu arka plana geçiş yap", "custom": "Özel", - "custom_button": "Özel arka planı düzenle", "overlays": "Katmanlar", "imagery_source_faq": "İmge Bilgisi / Problem Bildir", "reset": "sıfırla", @@ -687,15 +686,6 @@ }, "cannot_zoom": "Bu modda daha fazla uzaklaşılamaz.", "full_screen": "Tam Ekran", - "gpx": { - "local_layer": "GPX rotası ekle", - "drag_drop": ".gpx, .geojson or .kml formatında bir dosya sürükle ve bırak ya da sağdaki tuşa basarak bir dosya seç", - "zoom": "Yakınlaş", - "browse": "Dosya seç" - }, - "mvt": { - "local_layer": "MVT dosyası ekle" - }, "mapillary_images": { "tooltip": "Mapilary'den sokak fotoğrafları", "title": "Fotoğraf Katmanı (Mapilary)" @@ -1209,31 +1199,24 @@ "label": "Giriş İzni", "options": { "designated": { - "description": "Giriş, imlere ya da yerel yasalara göre olurlanmış", "title": "Ayrılmış" }, "destination": { - "description": "Giriş, yalnız varılacak yere ulaşmak için izin verilmiş", "title": "Varış Yeri" }, "dismount": { - "description": "Girişe izin verilmiş, ancak sürücü araçtan inmek zorunda", "title": "Araçtan inmek" }, "no": { - "description": "Giriş kamuya açık değildir", "title": "Yasak" }, "permissive": { - "description": "Sahibi geri çekene kadar giriş açık", "title": "İzin verilmiş" }, "private": { - "description": "Giriş, sahibinin oluruna bağlı", "title": "Özel" }, "yes": { - "description": "Yasaca girişe izin verilmiş; geçme önceliği", "title": "Serbest" } }, @@ -2685,10 +2668,6 @@ "name": "Bisiklet Tamircisi", "terms": "Bisiklet Tamircisi" }, - "amenity/biergarten": { - "name": "Bira İçilen Bahçe", - "terms": "Bira İçilen Bahçe, Bira Bahçesi" - }, "amenity/boat_rental": { "name": "Bot Kiralama", "terms": "Bot Kiralama" diff --git a/dist/locales/uk.json b/dist/locales/uk.json index 3b675ee9b..5ab7b7356 100644 --- a/dist/locales/uk.json +++ b/dist/locales/uk.json @@ -430,7 +430,12 @@ "edited_by": "Змінено: ", "changeset": "Набір змін", "unknown": "Невідомо", - "link_text": "Історія на openstreetmap.org" + "link_text": "Історія на openstreetmap.org", + "note_no_history": "Без історії (нова нотатка)", + "note_comments": "Коментарі", + "note_created_date": "Дата створення", + "note_created_user": "Створена", + "note_link_text": "Нотатка з openstreetmap.org" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "вершина", "line": "лінія", "area": "полігон", - "relation": "зв’язок" + "relation": "зв’язок", + "note": "нотатка" }, "geocoder": { "search": "Шукати по всьому світу…", @@ -523,8 +529,6 @@ "best_imagery": "Найкращі супутникові знімки для цього місця", "switch": "Ввімкнути цей шар", "custom": "Власний фон", - "custom_button": "Параметри власного фону", - "custom_prompt": "Введіть шаблон URL для квадратів мапи. Використовуйте:\n - {zoom} обо {z}, {x}, {y} для Z/X/Y схеми\n - {-y} або {ty} для оберненної Y-координати в TMS-стилі\n - {u} для схеми QuadTiles\n - {switch:a,b,c} у разі використання DNS мультиплексування на сервері\n\nПриклад:\n{example}", "overlays": "Шари", "imagery_source_faq": "Про фонове зображення/Повідомити про проблему", "reset": "скинути", @@ -626,6 +630,16 @@ "tooltip": "Полігони будуть показуватись повністю зафарбованими." } }, + "settings": { + "custom_background": { + "tooltip": "Параметри власного фону", + "header": "Налаштування власного фону", + "instructions": "Введіть шаблон URL для тайлів мапи. Використовуйте:\n - {zoom} обо {z}, {x}, {y} для Z/X/Y схеми\n - {-y} або {ty} для оберненної Y-координати в TMS-стилі\n - {u} для схеми QuadTiles\n - {switch:a,b,c} у разі використання DNS мультиплексування на сервері\n\nПриклад:\n{example}", + "template": { + "placeholder": "Введіть шаблон Url" + } + } + }, "restore": { "heading": "Ви маєте незбережені правки", "description": "У вас виявилися незбережені правки з минулого разу. Відновити їх?", @@ -727,18 +741,6 @@ }, "cannot_zoom": "Не можливо зменшити масштаб в поточному режимі.", "full_screen": "Розвернути на весь екран", - "gpx": { - "local_layer": "Додати GPX", - "drag_drop": "Перетягніть файл .gpx, .geojson або .kml на сторінку чи клацніть кнопку праворуч для вибору файлу", - "zoom": "Масштабувати до шару", - "browse": "Вибрати файл" - }, - "mvt": { - "local_layer": "Додати MVT", - "drag_drop": "Перетягніть файл .mvt або .pbf на сторінку чи натисніть кнопку праворуч для вибору файлу", - "zoom": "Наблизити до шару", - "browse": "Виберіть файл" - }, "streetside": { "tooltip": "Streetside фото від Microsoft", "title": "Фото шар (Bing Streetside)", @@ -770,6 +772,12 @@ "anonymous": "анонімно", "closed": "(Закриті)", "commentTitle": "Коментарі", + "status": { + "opened": "відкрито {when}", + "reopened": "перевідкрито {when}", + "commented": "прокоментовано {when}", + "closed": "закрито {when}" + }, "newComment": "Новий коментар", "inputPlaceholder": "Додайте коментар для поширення інформації для інших учасників.", "close": "Закрити нотатку", @@ -1441,7 +1449,7 @@ "label": " Пересування дозволено", "options": { "designated": { - "description": "Доступ дозволений відповідними знаками чи на законодавчому рівні", + "description": "Доступ дозволений відповідно до знаків або відповідних місцевих законів", "title": "Зазначений" }, "destination": { @@ -1460,6 +1468,10 @@ "description": "Доступ дозволений, доки власник не вирішить інакше", "title": "З дозволу" }, + "permit": { + "description": "Доступ дозволений тільки за наявності дійсної перепустки", + "title": "Перепустка" + }, "private": { "description": "Доступ дозволений лише за персональним дозволом власника", "title": "Приватний" @@ -4965,6 +4977,10 @@ "name": "Контур мосту", "terms": "міст,контур,споруда,перехід,проїзд" }, + "man_made/bunker_silo": { + "name": "Силосна яма", + "terms": "силос,яма,бункер,корм,сховище" + }, "man_made/chimney": { "name": "Димохід", "terms": "труба,дим,димохід,викиди" @@ -6875,6 +6891,27 @@ }, "name": "Туристині та велоспедні" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi – траси для снігоходів з даних OSM (Скандинавія)", + "name": "Скандинавія, траси для снігоходів" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Мозаїка Шведських ортофото за період 1955-1965 рр. Можуть траплятись як старі так і нові зображення.", + "name": "Lantmäteriet Історичні ортофото 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "Мозаїка Шведських ортофото за період 1970-1980 рр. Можуть траплятись як старі так і нові зображення.", + "name": "Lantmäteriet Історичні ортофото 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Умови використання та Відгуки" @@ -6911,8 +6948,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "Скан ´Economic maps´ ca 1950-1980", - "name": "Lantmäteriet Economic Map (історична)" + "description": "Скан \"Economic maps\" прибл. 1950-1980", + "name": "Lantmäteriet Economic Map 1950–1980" }, "qa_no_address": { "attribution": { @@ -6926,6 +6963,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Маршрути для снігоходів", + "name": "Маршрути для снігоходів Швеція" + }, "stamen-terrain-background": { "attribution": { "text": "Тайли мапи від Stamen Design, CC BY 3.0. Дані OpenStreetMap, ODbL." @@ -7202,36 +7246,84 @@ }, "be-irc": { "name": "OpenStreetMap Бельгія IRC", - "description": "Приєднуйтесь до #osmbe на irc.oftc.net (port 6667)" + "description": "Приєднуйтесь до #osmbe на irc.oftc.net (port 6667)", + "extendedDescription": "Приєднуйтесь до #osmbe на irc.oftc.net (порт 6667), він з'єднаний з чатом на Matrix" }, "be-mailinglist": { "name": "Talk-be Список розсилки", "description": "Talk-be є офіційним списком розсилки для бельгійської спільноти OSM" }, "be-maptime": { - "name": "Maptime Бельгія" + "name": "Maptime Бельгія", + "description": "Соціальні заходи, пов'язані з мапінгом - в першу чергу запрошуємо початківців!", + "extendedDescription": "Maptime - це відкрите навчальне середовище для всіх, з різним ступенем знань, пропонуе особисту ​​освітню підтримку для початківців. Maptime одночасно є гнучким та структурованим, створюючи простір для посібників з мапінгу, семінарів, поточних проектів із спільною метою та незалежним / спільним робочим часом." }, "be-matrix": { - "description": "Ласкаво просимо усіх картографів!" + "name": "OpenStreetMap Бельгія Matrix чат", + "description": "Ласкаво просимо всіх маперів!", + "extendedDescription": "Більшість обговорень виідбувається на каналі OpenStreetMap Belgium. Ви можете запитувати там будь-що! Інші розділи для обговорення конкретних предметів." }, "be-meetup": { - "extendedDescription": "Фізичні зустрічі з іншими дуже корисні, картографи задають питання і багато чого навчаються. Особливо приємно бачити нових авторів!" + "name": "Зустрічі OpenStreetMap Бельгія", + "description": "Реальні зустрічі всіх, хто цікавиться OpenStreetMap", + "extendedDescription": "Реальні зустрічі з іншими дуже корисні, мапери обговорюють питання і багато чого навчаються. Особливо приємно бачити нових учасників!" }, "be-twitter": { "name": "OpenStreetMap Бельгія Twitter", "description": "OSM Бельгія у Twitter: @osm_be" }, + "hr-facebook": { + "name": "OpenStreetMap Хорватія група в Facebook", + "description": "OpenStreetMap Хорватія група у Facebook" + }, + "hr-irc": { + "name": "OpenStreetMap Хорватія IRC", + "description": "Приєднуйтесь до #osm-hr на irc.freenode.org (port 6667)" + }, + "hr-mailinglist": { + "name": "Talk-hr Список розсилки", + "description": "Talk-hr Список розсилки" + }, + "czech-community": { + "name": "OSM спільнота Чехії", + "description": "Портал з мапою, вебсайт та контакти з іншими учасниками OSM в Чехії" + }, + "osmcz-facebook": { + "name": "OpenStreetMap Чехія у Facebook", + "description": "Стежте за подіями чеської спільноти у Facebook - включаючи переклади WeeklyOSM!" + }, + "osmcz-twitter": { + "name": "Twitter Чехія OSM @osmcz", + "description": "Стежте за подіями чеської спільноти у Twitter - включаючи переклади WeeklyOSM!" + }, "talk-cz-mailinglist": { + "name": "Список розсилки (talk-cz)", "description": "Talk-cz – офіційний список розсилки OSM спільноти Чехії." }, "dk-forum": { "name": "Форум OpenStreetMap Данія", "description": "Форум OpenStreetMap Данія" }, + "dk-irc": { + "name": "OpenStreetMap Данія IRC", + "description": "Приєднуйтесь до #osm-dk на irc.oftc.net (port 6667)" + }, + "dk-mailinglist": { + "name": "Talk-dk Список розсилки", + "description": "Список розсилки для обговорення OpenStreetMap в Данії" + }, "fi-forum": { "name": "Форум OpenStreetMap FI", "description": "Форум OpenStreetMap Фінляндія" }, + "fi-irc": { + "name": "OpenStreetMap Фінляндія IRC", + "description": "Приєднуйтесь до #osm-fi на irc.oftc.net (port 6667)" + }, + "fi-mailinglist": { + "name": "Talk-fi Список розсилки", + "description": "Talk-fi є офіційним списком розсилки для фінської спільноти OSM" + }, "fr-facebook": { "name": "Сторінка OpenStreetMap Франція у Facebook", "description": "Сторінка OpenStreetMap Франція у Facebook" @@ -7240,6 +7332,10 @@ "name": "Форум OpenStreetMap Франція", "description": "Форум OpenStreetMap Франція" }, + "fr-irc": { + "name": "OpenStreetMap Франція IRC", + "description": "Приєднуйтесь до #osm-fr на irc.oftc.net (port 6667)" + }, "fr-mailinglist": { "name": "Talk-fr Список розсилки", "description": "Talk-fr Список розсилки" @@ -7248,9 +7344,18 @@ "name": "OpenStreetMap Франція у Twitter", "description": "OpenStreetMap Франція у Twitter: {url}" }, + "de-berlin-mailinglist": { + "name": "Берлін - Список розсилки", + "description": "Список розсилки берлінської спільноти OSM" + }, "de-berlin-meetup": { + "name": "OpenStreetMap Берлін - Зустріч в Бранденбурзі ", "description": "Учасники та користувачі OpenStreetMap з Берліна" }, + "de-berlin-telegram": { + "name": "@osmberlin в Telegram", + "description": "OpenStreetMap Берлін чат в Telegram" + }, "de-berlin-twitter": { "name": "OpenStreetMap Берлін Twitter", "description": "Приєднуйтесь до нас у Twitter: {url}" @@ -7259,10 +7364,26 @@ "name": "Форум OpenStreetMap DE", "description": "Форум OpenStreetMap Німеччина" }, + "de-irc": { + "name": "OpenStreetMap Німеччина IRC", + "description": "Приєднуйтесь до #osm-de на irc.oftc.net (port 6667)" + }, "de-mailinglist": { "name": "Talk-de Список розсилки", "description": "Talk-de – офіційний список розсилки OSM спільноти Німеччини." }, + "de-ostwestfalen-lippe-mailinglist": { + "name": "OWL Список розсилки", + "description": "Спсок розсилки OSM спілноти з регіону Східна Вестфалія-Ліппе" + }, + "de-telegram": { + "name": "OpenStreetMap Німеччина Telegram", + "description": "Приєднуйтесь до об'єднаної групи спільноти OpenStreetMap Німеччина у Telegram - {url}" + }, + "osm-de": { + "name": "OpenStreetMap Німеччина", + "description": "Інформація про OpenStreetMap в Німеччині" + }, "hu-facebook": { "name": "OpenStreetMap Угорщина у Facebook", "description": "Мапери та OpenStreetMap Угорщина у Facebook" @@ -7271,33 +7392,87 @@ "name": "Форум OpenStreetMap HU", "description": "Форум OpenStreetMap Угорщина" }, + "hu-meetup": { + "name": "OpenStreetMap Угорщина - Зустрічі", + "description": "Платформа для організації зустрічей маперів в Угорщині" + }, "it-facebook": { "name": "OpenStreetMap Італія у Facebook", "description": "Приєднуйтесь до спільноти OpenStreetMap Італія у Facebook" }, + "it-irc": { + "name": "OpenStreetMap Італія IRC", + "description": "Приєднуйтесь до #osm-it на irc.oftc.net (port 6667)" + }, + "it-mailinglist": { + "name": "Talk-it Список розсилки", + "description": "Talk-it – офіційний список розсилки OSM спільноти Італії." + }, + "it-telegram": { + "name": "@OpenStreetMapItalia в Telegram", + "description": "OpenStreetMap Італія чат Telegram" + }, "it-twitter": { "name": "OpenStreetMap Італія Twitter", "description": "Приєднуйтесь до нас у Twitter: {url}" }, "OSM-Rome-meetup": { - "description": "Покращити OpenStreetMap навкруги Риму" + "name": "Зустріч маперів Риму", + "description": "Покращити OpenStreetMap навкруги Риму", + "extendedDescription": "Ми прагнемо бути джерелом інформації для обговорення та обміну знаннями щодо використання вільних географічних наборів даних, зокрема OpenStreetMap та іншого відкритого програмного забезпечення для роботи з геопросторовими даними, яке дозволяє керувати, змінювати та поширювати географічні дані та виступаємо за його використання в Лаціо." + }, + "South-Tyrol-Mailing-List": { + "name": "Список розсилки OpenStreetMap Південного Тіролю", + "description": "Регіональний список розсилки OpenStreetMap Італія Південного Тіролю" }, "talk-it-lazio": { + "name": "OpenStreetMap Італія, Лаціо", + "description": "Запрошуємо всіх! Зареєструйтеся на {signupUrl}", "extendedDescription": "Список розсилки спільноти Риму та Лаціо" }, + "Trentino-Mailing-List": { + "name": "Список розсилки OpenStreetMap Трентіно", + "description": "Регіональний список розсилки OpenStreetMap Італія Трентіно" + }, "no-forum": { "name": "Форум OpenStreetMap Норвегія", "description": "Форум OpenStreetMap Норвегія" }, + "no-irc": { + "name": "OpenStreetMap Норвегія IRC", + "description": "Місце для обговорення для маперів та користувачів OpenStreetMap, розробників та ентузіастів з Норвегії" + }, + "no-mailinglist": { + "name": "Список розсилки OpenStreetMap Норвегія", + "description": "Список розсилки для маперів та користувачів OpenStreetMap, розробників та ентузіастів з Норвегії" + }, "OSM-PL-facebook-group": { - "name": "Група Facebook OpenStreetMap в Польщі" + "name": "Група Facebook OpenStreetMap в Польщі", + "description": "Група для маперів та користувачів OpenStreetMap в Польщі" }, "OSM-PL-forum": { "name": "Форум OpenStreetMap Польща", "description": "Форум польської спільноти OpenStreetMap" }, + "si-forum": { + "name": "Форум OpenStreetMap Словенія", + "description": "Форум словенської спільноти OpenStreetMap" + }, + "si-mailinglist": { + "name": "Список розсилки OpenStreetMap Словенія", + "description": "Список розсилки словенської спільноти OpenStreetMap" + }, "OSM-ES-mailinglist": { - "name": "Talk-es Список розсилки" + "name": "Talk-es Список розсилки", + "description": "Список розсилки для обговорення OpenStreetMap в Іспанії" + }, + "OSM-ES-telegram": { + "name": "@OSMes в Telegram", + "description": "OpenStreetMap Іспанія чат Telegram" + }, + "osm-se": { + "name": "OpenStreetMap.se", + "description": "Надає послуги та інформацію на основі OSM для місцевої спільноти в Швеції" }, "se-facebook": { "name": "OpenStreetMap Швеція у Facebook", @@ -7307,18 +7482,78 @@ "name": "Форум OpenStreetMap Швеція", "description": "Форум OpenStreetMap Швеція" }, + "se-irc": { + "name": "OpenStreetMap Швеція IRC", + "description": "Приєднуйтесь до #osm.se на irc.oftc.net (port 6667)" + }, "se-mailinglist": { - "name": "Talk-se Список розсилки" + "name": "Talk-se Список розсилки", + "description": "Список розсилки для обговорення OpenStreetMap в Швеції" }, "se-twitter": { "name": "OpenStreetMap Швеція у Twitter", "description": "Приєднуйтесь до нас у Twitter: {url}" }, + "Nottingham-OSM-pub-meetup": { + "name": "Іст-Мідлендс (Ноттінгем) Щомісячні зустрічі в пабі", + "description": "Збори для мапперів та користувачів Східного Мідлендса", + "extendedDescription": "Група організовує зустрічі з березня 2011 року, спочатку в Ноттінгемі, і нещодавно в Дербі, і час від часу в інших місцях Східного Мідлендса. Це збори для приємного спільного проведення часу та обговорення питань пов'язаних з OSM. В літні місяці ми зазвичай проводимо невеличкий огляд території та мапінг, впродовж години, досліджуючи місцевість навколо місця зустрічі. Група в цілому особливо зацікавлена ​​в тому, щоб позначати дорожню інфраструктуру для всіх учасників руху, і час від часу проводить збори з цією метою." + }, "gb-mailinglist": { + "name": "Talk-gb Список розсилки", "description": "Talk-gb - це основне місце спілкування для британської (включаючи Північну Ірландію) спільноти OSM" }, + "mappa-mercia-group": { + "name": "Місцева група Mappa Mercia", + "description": "Місце для ентузіастів OpenStreetMap у Мідлендс", + "extendedDescription": "Mappa Mercia - це проект з розвитку OpenStreetMap у Вест-Мідлендс, Великобританія. Ми проводимо спільні заходи, проводимо навчання та підтримуємо місцеві організації, які бажають зробити свої дані відкритими." + }, + "gb-irc": { + "name": "OpenStreetMap United Kingdom IRC", + "description": "Приєднуйтесь до #osm-gb на irc.oftc.net (port 6667)", + "extendedDescription": "Приєднуйтесь до #osm-gb на irc.oftc.net (порт 6667), будь ласка, будьте терплячі та зачекайте кілька хвилин, після того як ви поставите питання" + }, + "OSM-CA-Slack": { + "name": "OSM-CA Slack", + "description": "Запрошуємо всіх! Зареєструйтеся на {signupUrl}" + }, + "OSM-Vancouver-meetup": { + "name": "OpenStreetMap Ванкувер", + "description": "Мапери та користувачі OpenStreetMap у Ванкувері, Британська Колумбія" + }, + "OSM-CU-telegram": { + "name": "OSM Куба в Telegram", + "description": "OpenStreetMap Куба чат в Telegram" + }, + "OSM-NI-telegram": { + "name": "OSM Нікарагуа в Telegram", + "description": "OpenStreetMap Нікарагуа чат в Telegram" + }, "Bay-Area-OpenStreetMappers": { - "description": "Покращити OpenStreetMap в районі Затоки Сан-Франциско" + "name": "Bay Area OpenStreetMappers", + "description": "Покращити OpenStreetMap в районі Затоки Сан-Франциско", + "extendedDescription": "Ця група має на меті це розбудову спільноти OpenStreetMap в районі затоки Сан-Франціско. Наші заходи відкриті для всіх, від ентузіастів відкритого коду до велосипедистів, спеціалістів з ГІС, геокористувачів та інших." + }, + "Central-Pennsylvania-OSM": { + "name": "Central Pennsylvania OSM", + "description": "Онлайн-мапінг товариство, розташоване в State College, PA" + }, + "Code-for-San-Jose-Slack": { + "name": "Code for San Jose Slack", + "description": "Запрошуємо всіх! Зареєструйтеся на {signupUrl}, потім приєднуйтесь до каналу #osm." + }, + "Dallas-Fort-Worth-OSM": { + "name": "Даллас - Форт Уорт OSM", + "description": "Група учасників OSM з Далласа - Форт Уорта", + "extendedDescription": "Даллас, Форт Уорт та всі міста, між ними, об'єдані творчими і технічно підкованими людьми. Мета цієї групи - знайти нові способи використання дивовижного ресурсу OSM." + }, + "GeoPhilly": { + "name": "GeoPhilly", + "description": "Зустріч маперів-ентузіастів в Філадельфії", + "extendedDescription": "GeoPhilly об'єднує розробників, географів, користувачів даних, ентузіастів відкритого коду, хактивістів та всіх хто любить мапи у нашій загальній любові до мап та історії, які вони розповідають. Якщо ви використовуєте мапи у вашій роботі або просто хочете дізнатись більше, ці зустрічі для вас! Наші заходи спрямовані на те, щоб бути відкритими, доброзичливими, освітніми та соціальними, від простого спілкування до коротких виступів чи навіть семінарів. Приходьте, ми створюємо різноманітну, геопросторову спільноту в Філадельфії разом з вами!" + }, + "MapMinnesota": { + "name": "MapMinnesota" }, "Mapping-DC-meetup": { "description": "Покращити OpenStreetMap навколо Вашингтона, округ Колумбія", diff --git a/dist/locales/vi.json b/dist/locales/vi.json index 3ffb17117..0945d328a 100644 --- a/dist/locales/vi.json +++ b/dist/locales/vi.json @@ -523,8 +523,6 @@ "best_imagery": "Nguồn hình ảnh hữu ích nhất đối với nơi này", "switch": "Quay về hình nền này", "custom": "Tùy biến", - "custom_button": "Sửa hình nền tùy biến", - "custom_prompt": "Nhập định dạng URL của các mảnh bản đồ. Bạn có thể sử dụng các dấu hiệu:\n - {zoom} hoặc {z}, {x}, {y} cho định dạng mảnh Z/X/Y\n - {-y} hoặc {ty} cho tọa độ Y kiểu TMS phản chiếu\n - {u} cho định dạng quadtile\n - {switch:a,b,c} để luân phiên các máy chủ DNS\n\nVí dụ:\n{example}", "overlays": "Lớp phủ", "imagery_source_faq": "Chi tiết Hình ảnh / Báo cáo Vấn đề", "reset": "đặt lại", @@ -727,18 +725,6 @@ }, "cannot_zoom": "Không thể thu nhỏ hơn trong chế độ hiện tại.", "full_screen": "Bật/tắt Chế độ Toàn màn hình", - "gpx": { - "local_layer": "Thêm GPX", - "drag_drop": "Kéo thả một tập tin .gpx, .geojson, hoặc .kml vào trang hoặc bấm nút bên phải để duyệt", - "zoom": "Phóng vừa lớp", - "browse": "Duyệt tập tin" - }, - "mvt": { - "local_layer": "Thêm MVT", - "drag_drop": "Kéo thả tập tin .mvt hoặc .pbf vào trang, hoặc bấm nút bên phải để duyệt tập tin", - "zoom": "Phong vừa lớp", - "browse": "Duyệt tập tin" - }, "streetside": { "tooltip": "Hình ảnh Streetside của Microsoft", "title": "Lớp phủ Hình ảnh (Bing Streetside)", @@ -770,6 +756,12 @@ "anonymous": "vô danh", "closed": "(Giải quyết)", "commentTitle": "Bình luận", + "status": { + "opened": "tạo {when}", + "reopened": "mở lại {when}", + "commented": "bình luận {when}", + "closed": "giải quyết {when}" + }, "newComment": "Bình luận Mới", "inputPlaceholder": "Nhập lời bình luận để người dùng khác xem.", "close": "Giải quyết Ghi chú", @@ -1441,31 +1433,24 @@ "label": "Quyền Truy cập", "options": { "designated": { - "description": "Được xây với mục đích cho phép vận chuyển bằng phương thức này, theo bảng hay luật pháp địa phương", "title": "Theo mục đích" }, "destination": { - "description": "Chỉ cho phép truy cập để tới nơi", "title": "Nơi đến" }, "dismount": { - "description": "Chỉ cho phép nếu xuống đi bộ", "title": "Bắt xuống đi bộ" }, "no": { - "description": "Công chúng không được phép truy cập", "title": "Cấm" }, "permissive": { - "description": "Chủ cho phép rộng rãi nhưng có thể cấm sau", "title": "Chủ cho phép" }, "private": { - "description": "Chỉ có những người được chủ cho phép truy cập", "title": "Tư nhân" }, "yes": { - "description": "Mọi người được phép truy cập theo luật pháp", "title": "Cho phép" } }, @@ -3051,10 +3036,6 @@ "name": "Quầy Sửa Xe đạp", "terms": "quầy sửa xe đạp, xích, bơm, quay sua xe dap, xich, bom" }, - "amenity/biergarten": { - "name": "Vườn Bia", - "terms": "vườn bia, vườn uống bia, vườn nhậu, vuon bia, vuon uong bia, vuon nhau" - }, "amenity/boat_rental": { "name": "Cho thuê Tàu", "terms": "dịch vụ cho thuê tàu, chỗ thuê tàu, tiệm thuê tàu, thuê tàu, dịch vụ cho mướn tàu, chỗ mướn tàu, tiệm mướn tàu, mướn tàu, dịch vụ cho thuê thuyền, chỗ thuê thuyền, tiệm thuê thuyền, thuê thuyền, dịch vụ cho mướn thuyền, chỗ mướn thuyền, tiệm mướn thuyền, mướn thuyền, dich vu cho thue tau, cho thue tau, tiem thue tau, thue tau, dich vu cho muon tau, cho muon tau, tiem muon tau, muon tau, dich vu cho thue thuyen, cho thue thuyen, tiem thue thuyen, thue thuyen, dich vu cho muon thuyen, cho muon thuyen, tiem muon thuyen, muon thuyen" @@ -4965,6 +4946,10 @@ "name": "Cầu", "terms": "cầu, cau" }, + "man_made/bunker_silo": { + "name": "Xilô Boong ke", + "terms": "xilô boong ke, xi-lô boong ke, xi lô boong ke, xilô boongke, xi-lô boong-ke, xi lô boong ke, xilo boong ke, xi-lo boong ke, xi lo boong ke, xilo boonke, xi-lo boong-ke, xi lo boong ke" + }, "man_made/chimney": { "name": "Ống khói", "terms": "ống khói, lò sưởi, ong khoi, lo suoi" @@ -6875,6 +6860,25 @@ }, "name": "Đi bộ & Đạp xe" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "Đường xe máy trượt tuyết Kelkkareitit.fi từ OSM (Bắc Âu)", + "name": "Lớp phủ xe máy trượt tuyết Bắc Âu" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "name": "Hình ảnh trực giao lịch sử Lantmäteriet 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "name": "Hình ảnh trực giao lịch sử Lantmäteriet 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "Điều khoản & Phản hồi" @@ -6910,9 +6914,7 @@ "osmse-ekonomiska": { "attribution": { "text": "© Lantmäteriet" - }, - "description": "Hình quét các “bản đồ kinh tế” những năm 1950–1980", - "name": "Bản đồ Kinh tế Lantmäteriet (lịch sử)" + } }, "qa_no_address": { "attribution": { @@ -6926,6 +6928,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Đường xe máy trượt tuyết", + "name": "Bản đồ xe máy trượt tuyết Thụy Điển" + }, "stamen-terrain-background": { "attribution": { "text": "Hình bản đồ do Stamen Design cung cấp dưới CC BY 3.0. Dữ liệu do OpenStreetMap cung cấp dưới ODbL." @@ -6988,6 +6997,14 @@ } }, "community": { + "bw-facebook": { + "name": "Mapping Botswana tại Facebook", + "description": "Trang OpenStreetMap tại Botswana" + }, + "bw-twitter": { + "name": "Mapping Botswana tại Twitter", + "description": "Twitter OpenStreetMap tại Botswana" + }, "cape-coast-youthmappers": { "name": "YouthMappers Đại học Cape Coast", "description": "Theo dõi chúng tôi trên Twitter: {url}" @@ -7339,6 +7356,18 @@ "name": "Họp mặt OpenStreetMap Hungary", "description": "Trang tổ chức cuộc họp mặt tại Hungary" }, + "is-facebook": { + "name": "OSM Iceland tại Facebook", + "description": "Trang OpenStreetMap tại Iceland" + }, + "is-mailinglist": { + "name": "Danh sách thư talk-is", + "description": "talk-is là danh sách thư chính thức của cộng đồng OSM Iceland" + }, + "is-twitter": { + "name": "OSM Iceland tại Twittter", + "description": "Twitter OpenStreetMap tại Iceland" + }, "it-facebook": { "name": "Facebook OpenStreetMap Ý", "description": "Hãy tham gia cộng đồng OpenStreetMap Ý tại Facebook" @@ -7744,6 +7773,29 @@ "name": "OpenStreetMap Peru", "description": "Tin tức về và tài nguyên cho cộng đồng OpenStreetMap Peru" }, + "LATAM-Facebook": { + "name": "Facebook OpenStreetMap Mỹ Latinh", + "description": "OpenStreetMap Mỹ Latinh tại Facebook" + }, + "LATAM-Telegram": { + "name": "Telegram OpenStreetMap Mỹ Latinh", + "description": "Telegram OpenStreetMap dành cho Mỹ Latinh" + }, + "LATAM-Twitter": { + "name": "Twitter OpenStreetMap Mỹ Latinh", + "description": "Theo dõi chúng tôi trên Twitter: {url}" + }, + "osm-latam": { + "name": "OpenStreetMap Mỹ Latinh", + "description": "Hỗ trợ OpenStreetMap tại Mỹ Latinh", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Mỹ Latinh 2018", + "description": "State of the Map Mỹ Latinh là hội nghị hàng năng dành cho tất cả mọi người xây dựng và sử dụng OpenStreetMap tại Mỹ Latinh. Chương trình bao gồm các bài thuyêt trình, phiên thảo luận, hội thảo, và phiên vẽ bản đồ đều có liên quan đến OpenStreetMap.", + "where": "Buenos Aires, Argentina" + } + } + }, "OSM-Facebook": { "name": "OpenStreetMap tại Facebook", "description": "Thích chúng tôi tại Facebook để nhận tin tức và cập nhật về OpenStreetMap." diff --git a/dist/locales/yue.json b/dist/locales/yue.json index e28faf229..ecbe25766 100644 --- a/dist/locales/yue.json +++ b/dist/locales/yue.json @@ -335,7 +335,6 @@ "best_imagery": "此地至出名相源", "switch": "轉返去爾個背景", "custom": "自訂", - "custom_button": "改自訂背景", "reset": "重設", "minimap": { "tooltip": "開個縮圖,幫手搵返家下睇到嘅範圍。" @@ -617,31 +616,24 @@ "label": "准過", "options": { "designated": { - "description": "通行與否,按法例或路牌指定", "title": "指名" }, "destination": { - "description": "限往目的地", "title": "目的地" }, "dismount": { - "description": "過得,要落車推。", "title": "落車推" }, "no": { - "description": "公眾不通", "title": "禁入" }, "permissive": { - "description": "可通,直至地主唔畀。", "title": "任過" }, "private": { - "description": "要地主批准", "title": "私家" }, "yes": { - "description": "按法例可通,有權過路。", "title": "准許" } }, diff --git a/dist/locales/zh-CN.json b/dist/locales/zh-CN.json index 90f09a64b..68d6faaca 100644 --- a/dist/locales/zh-CN.json +++ b/dist/locales/zh-CN.json @@ -430,7 +430,12 @@ "edited_by": "编辑者", "changeset": "变更集合", "unknown": "未知", - "link_text": "在 openstreetmap.org 上的历史记录" + "link_text": "在 openstreetmap.org 上的历史记录", + "note_no_history": "无历史记录(新笔记)", + "note_comments": "评论数", + "note_created_date": "创建时间", + "note_created_user": "创建者", + "note_link_text": "在 openstreetmap.org 上的笔记" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "顶点", "line": "线", "area": "区域", - "relation": "关系" + "relation": "关系", + "note": "笔记" }, "geocoder": { "search": "在全球搜索...", @@ -523,8 +529,6 @@ "best_imagery": "此地最知名的影像数据源", "switch": "切换回该底图", "custom": "自定义", - "custom_button": "编辑自定义背景", - "custom_prompt": "输入地图瓦片URL地址。有效的参数有:\n - {zoom} 或 {z}, {x}, {y} 作为 Z/X/Y 坐标系\n - {-y} 或 {ty} 作为翻转的 TMS 算法 Y 坐标\n - {u} 作为四叉树坐标编码\n - {switch:a,b,c} 作为 DNS 服务器解析的并行连接子域\n\n示例:\n{example}", "overlays": "叠加图层", "imagery_source_faq": "影像信息 / 报告问题", "reset": "重置", @@ -626,6 +630,16 @@ "tooltip": "在区域内全部填充。" } }, + "settings": { + "custom_background": { + "tooltip": "编辑自定义背景", + "header": "自定义背景设置", + "instructions": "输入地图瓦片URL地址。有效的参数有:\n {zoom} 或 {z}, {x}, {y} 作为 Z/X/Y 坐标系\n {-y} 或 {ty} 作为翻转的 TMS 算法 Y 坐标\n {u} 作为四叉树坐标编码\n {switch:a,b,c} 作为 DNS 服务器解析的并行连接子域\n\n示例:\n{example}", + "template": { + "placeholder": "输入URL地址" + } + } + }, "restore": { "heading": "您有未保存的更改", "description": "您在上一次编辑时有未保存的修改,您想恢复这些修改吗?", @@ -727,18 +741,6 @@ }, "cannot_zoom": "在此模式下不能再缩小", "full_screen": "切换全屏", - "gpx": { - "local_layer": "上传 GPX 文件", - "drag_drop": "将.gpx、.geojson或.kml文件拖放到页面上,或单击右侧的按钮浏览", - "zoom": "缩放到图层", - "browse": "浏览文件" - }, - "mvt": { - "local_layer": "上传 MVT 文件", - "drag_drop": "将 .mvt 或 .pbf 文件拖放到页面上,或单击右侧的按钮浏览", - "zoom": "缩放到图层", - "browse": "浏览文件" - }, "streetside": { "tooltip": "来自微软公司的街景照片", "title": "照片叠加层 (必应 Streetside)", @@ -770,6 +772,12 @@ "anonymous": "匿名用户", "closed": "(已关闭)", "commentTitle": "评论", + "status": { + "opened": "创建于 {when}", + "reopened": "重启于 {when}", + "commented": "评论于 {when}", + "closed": "关闭于 {when}" + }, "newComment": "发表新评论", "inputPlaceholder": "输入评论并分享给其他用户。", "close": "解决笔记", @@ -1316,31 +1324,24 @@ "label": "允许通行", "options": { "designated": { - "description": "只限标志指定或特定本地法律容许的人士、车辆进入", "title": "指定" }, "destination": { - "description": "只限前往目的地人士进入", "title": "目的地" }, "dismount": { - "description": "允许通行但必须下车", "title": "下车" }, "no": { - "description": "禁止一般公众进入", "title": "禁止" }, "permissive": { - "description": "容许进入,直至拥有者撤回许可", "title": "默许" }, "private": { - "description": "须拥有者个别批准,方可进入", "title": "私人" }, "yes": { - "description": "按法律及路权,有权使用", "title": "允许" } }, @@ -1361,14 +1362,14 @@ "placeholders": { "block_number": "街区编号", "block_number!jp": "街区号", - "city": "地级市/自治州", + "city": "地级市/地区/自治州/盟", "city!jp": "市/镇/村/东京都特别区", "city!vn": "市/镇", "conscriptionnumber": "123号", "country": "国家", "county": "郡", "county!jp": "郡 (日本)", - "district": "市辖区/县/县级市", + "district": "市辖区/县级市/县/自治县/旗/旗/特区/林区", "district!vn": "郡/镇/区", "floor": "楼层", "hamlet": "村庄", @@ -1379,7 +1380,7 @@ "neighbourhood!jp": "丁目/字/小字", "place": "地方", "postcode": "邮政编码", - "province": "省/自治区/特别行政区", + "province": "省/自治区/特别行政区/直辖市", "province!jp": "日本县", "quarter": "地方", "quarter!jp": "大字/町", @@ -2768,7 +2769,7 @@ "terms": "物资缆车" }, "aerialway/magic_carpet": { - "name": "魔毯电梯", + "name": "滑雪场魔毯传送带", "terms": "魔毯,传送带式电梯" }, "aerialway/mixed_lift": { @@ -2880,10 +2881,6 @@ "name": "自行车维修工具站", "terms": "自行车维修工具站" }, - "amenity/biergarten": { - "name": "啤酒花园", - "terms": "啤酒花园" - }, "amenity/boat_rental": { "name": "船舶租赁处", "terms": "船舶租赁处" @@ -2899,6 +2896,10 @@ "name": "咖啡馆", "terms": "咖啡,茶,咖啡厅,咖啡馆,茶座,摩卡,拿铁,馥芮白,玛奇朵,卡布奇诺,红茶,黄茶,清茶,青茶,绿茶,花茶,黑茶,白茶,乌龙,咖啡豆,餐馆,餐厅" }, + "amenity/car_pooling": { + "name": "拼车", + "terms": "拼车" + }, "amenity/car_rental": { "name": "汽车租赁", "terms": "汽车租赁处,租车店,汽车租赁,租赁,出租,租" @@ -3222,8 +3223,8 @@ "name": "游泳池" }, "amenity/taxi": { - "name": "出租车站", - "terms": "出租车站,的士站,计程车站" + "name": "出租车停车处", + "terms": "出租车停车处,的士停车处,计程车停车处" }, "amenity/telephone": { "name": "电话", @@ -3259,11 +3260,11 @@ }, "amenity/vending_machine/condoms": { "name": "避孕套售货机", - "terms": "避孕套,安全套,避孕,售货,售卖,自助,自动,付货,零售,贩卖,售货机,贩卖机" + "terms": "计生用品,避孕套,安全套,避孕,售货,售卖,自助,自动,付货,零售,贩卖,售货机,贩卖机" }, "amenity/vending_machine/drinks": { "name": "饮料售货机", - "terms": "饮料,饮品,售货,售卖,自助,自动,付货,零售,贩卖,售货机,贩卖机,水,果汁,汽水,咖啡,奶茶,茶" + "terms": "饮料,饮品,售货,售卖,自助,自动,付货,零售,贩卖,售货机,贩卖机,水,矿泉水,果汁,汽水,咖啡,奶茶,茶" }, "amenity/vending_machine/electronics": { "name": "电器售货机", @@ -3713,7 +3714,7 @@ }, "craft/electronics_repair": { "name": "电子用品修理商店", - "terms": "电子修理商店,电子用品修理点" + "terms": "电子修理商店,电子用品修理点,家电维修" }, "craft/gardener": { "name": "园艺工", @@ -3861,6 +3862,9 @@ "name": "消防栓", "terms": "消防栓" }, + "emergency/first_aid_kit": { + "name": "急救包" + }, "emergency/life_ring": { "name": "救生圈", "terms": "救生圈,橡皮圈,应急,救生,游泳" @@ -4132,7 +4136,7 @@ "terms": "辅助道路" }, "highway/service/alley": { - "name": "窄路 (机动车通行)", + "name": "窄路/巷", "terms": "胡同,巷,弄堂,里弄,小巷,巷,弄,巷弄(可通行机动车)" }, "highway/service/drive-through": { @@ -5781,6 +5785,10 @@ "name": "摩托车店", "terms": "摩托车行,摩托车" }, + "shop/motorcycle_repair": { + "name": "摩托车修理店", + "terms": "摩托车修理店" + }, "shop/music": { "name": "音乐店", "terms": "音乐店" @@ -6601,6 +6609,10 @@ "name": "OpenStreetMap 日本", "description": "位于日本的绘图者和 OpenStreetMap 用户" }, + "OSM-korea-telegram": { + "name": "OSM 韩国电报频道", + "description": "非官方的频道,用于韩国的 OpenStreetMap 贡献者、社区和用户的分享与讨论。" + }, "OSM-MY-forum": { "name": "OpenStreetMap 马来西亚论坛", "description": "官方 OpenStreetMap 马来西亚论坛" diff --git a/dist/locales/zh-HK.json b/dist/locales/zh-HK.json index 39fd3c932..50b0c6a4f 100644 --- a/dist/locales/zh-HK.json +++ b/dist/locales/zh-HK.json @@ -470,7 +470,6 @@ "best_imagery": "這地點最為人所知的背景影像", "switch": "切換回這個背景", "custom": "自訂", - "custom_button": "編輯自訂背景", "overlays": "覆蓋層", "reset": "重設", "display_options": "顯示選項", @@ -653,11 +652,6 @@ }, "cannot_zoom": "在這個模式下不能再縮小。", "full_screen": "切換全螢幕", - "gpx": { - "drag_drop": "拖移一個 .gpx, .geojson 或者 .kml 檔案到頁面或者按右側按鈕瀏覽。", - "zoom": "放大至圖層", - "browse": "瀏覽檔案" - }, "mapillary_images": { "tooltip": "來自Mapillary的街道圖層相片", "title": "相片重疊 (Mapillary)" @@ -1129,31 +1123,24 @@ "label": "允許通過", "options": { "designated": { - "description": "通行與否,按法例或路牌指定", "title": "指定" }, "destination": { - "description": "限往目的地", "title": "目的地" }, "dismount": { - "description": "允許通過但騎單車者需要下車", "title": "下車" }, "no": { - "description": "禁止一般公眾進入", "title": "禁入" }, "permissive": { - "description": "容許進入,直至擁有者撇回許可", "title": "自由通過" }, "private": { - "description": "須擁有者個別批准,方可進入", "title": "私人" }, "yes": { - "description": "按法例可通;通行權", "title": "准許" } }, @@ -2557,10 +2544,6 @@ "name": "單車維修站", "terms": "單車維修站,維修單車,自行車維修站,維修自行車" }, - "amenity/biergarten": { - "name": "露天啤酒店", - "terms": "啤酒店,戶外啤酒店,啤酒花園" - }, "amenity/boat_rental": { "name": "租艇", "terms": "Boat Rental,租艇,船舶租賃處" diff --git a/dist/locales/zh-TW.json b/dist/locales/zh-TW.json index 1f6ee55a6..01daf4d4e 100644 --- a/dist/locales/zh-TW.json +++ b/dist/locales/zh-TW.json @@ -430,7 +430,12 @@ "edited_by": "編輯由", "changeset": "變更組合", "unknown": "未知", - "link_text": "在 openstreetmap.org 上的歷史" + "link_text": "在 openstreetmap.org 上的歷史", + "note_no_history": "無歷史 (新節點) ", + "note_comments": " 評論", + "note_created_date": "創建日期", + "note_created_user": "創建者", + "note_link_text": "openstreetmap.org 註記" }, "location": { "key": "L", @@ -460,7 +465,8 @@ "vertex": "頂點", "line": "線", "area": "區域", - "relation": "關係" + "relation": "關係", + "note": "註記" }, "geocoder": { "search": "搜尋全世界...", @@ -523,8 +529,6 @@ "best_imagery": "這個地點已知最佳的影像來源", "switch": "切換回此背景", "custom": "客製化", - "custom_button": "編輯自訂的背景", - "custom_prompt": "輸入標題網址模版。有效的代碼是: \n- {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n- {-y} or {ty} for flipped TMS-style Y coordinates\n- {u} for quadtile scheme\n- {switch:a,b,c} for DNS server multiplexing\n\n範例:\n{example}", "overlays": "覆疊", "imagery_source_faq": "影像資訊 / 問題回報", "reset": "重設", @@ -554,6 +558,11 @@ "notes": { "tooltip": "從開放街圖而來的註記資料", "title": "開放街圖註記" + }, + "custom": { + "tooltip": "拖曳資料檔案到頁面上,或點選按鈕以設定", + "title": "自訂地圖資料", + "zoom": "縮放到資料" } }, "fill_area": "填充選項", @@ -626,6 +635,29 @@ "tooltip": "區域全部用顏色填充" } }, + "settings": { + "custom_background": { + "tooltip": "編輯自訂的背景", + "header": "自訂背景圖片設定", + "instructions": "輸入標題網址模版。有效的代碼是: \n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n {-y} or {ty} for flipped TMS-style Y coordinates\n {u} for quadtile scheme\n {switch:a,b,c} for DNS server multiplexing\n\n範例:\n{example}", + "template": { + "placeholder": "編輯網址模版" + } + }, + "custom_data": { + "tooltip": "編輯自訂資料圖層", + "header": "自訂地圖資料設定", + "file": { + "instructions": "選擇本機資料檔案。支援的檔案類型:\n .gpx, .kml, .geojson, .json", + "label": "瀏覽檔案" + }, + "or": "或", + "url": { + "instructions": "輸入資料檔案 URL 或向量圖磚 URL 模板。有效的代號是:\n {zoom} 或 {z}, {x}, {y} 為 Z/X/Y 圖磚結構", + "placeholder": "輸入 URL" + } + } + }, "restore": { "heading": "您有未儲存的編輯", "description": "您在上一次編輯時仍有未儲存的修改,你想恢復這些修改嗎﹖", @@ -727,18 +759,6 @@ }, "cannot_zoom": "在此模式下不能再縮小。", "full_screen": "啟動全螢幕", - "gpx": { - "local_layer": "新增 GPX", - "drag_drop": "拖放一個 .gpx, .geojson 或是 .kml 檔案到此頁面上,或是點選按鈕以瀏覽", - "zoom": "縮放到圖層", - "browse": "瀏覽檔案" - }, - "mvt": { - "local_layer": "新增 MVT", - "drag_drop": "將 .mvt 或 .pbf 拖曳到此頁面,或是點選右邊的按鈕以瀏覽", - "zoom": "縮放至圖層", - "browse": "瀏覽檔案" - }, "streetside": { "tooltip": "微軟的街景照片", "title": "照片覆蓋層 (Bing Streetside)", @@ -770,6 +790,12 @@ "anonymous": "匿名", "closed": "(已關閉)", "commentTitle": "評論", + "status": { + "opened": "已開啟 {when}", + "reopened": "再次開啟 {when}", + "commented": "評論 {when}", + "closed": "關閉 {when}" + }, "newComment": "新評論", "inputPlaceholder": "輸入評論以與其他使用者分享。", "close": "關閉註記", @@ -1441,31 +1467,35 @@ "label": "允許通行限制", "options": { "designated": { - "description": "只限標誌指定或特定本地法律容許人士進入", + "description": "根據標誌或當地法律可以通過", "title": "指定" }, "destination": { - "description": "只限前往目的地人士進入", + "description": "僅供前往目的地時通過", "title": "目的地" }, "dismount": { - "description": "允許進入但駕駛需下車", + "description": "可以通過,但騎士必須下車", "title": "下車" }, "no": { - "description": "禁止一般公眾進入", + "description": "不供一般大眾使用", "title": "禁止進入" }, "permissive": { - "description": "容許進入,直至擁有者撇回許可", + "description": "直到擁有者撤銷許可前都可以通過", "title": "獲許可進入" }, + "permit": { + "description": "僅持有有效許可證時方可通過", + "title": "許可證" + }, "private": { - "description": "須擁有者個別批准,方可進入", + "description": "僅在擁有者允許的情況下才能通行", "title": "私人" }, "yes": { - "description": "按法律及路權; 有權使用", + "description": "法律允許通行;一種方式", "title": "可使用" } }, @@ -3052,7 +3082,7 @@ "terms": "單車維修工具站,自行車自助維修站,單車自助維修站" }, "amenity/biergarten": { - "name": "啤酒花園", + "name": "啤酒花園 ", "terms": "啤酒花園,屋外花園酒店" }, "amenity/boat_rental": { @@ -4840,6 +4870,10 @@ "name": "美式足球場", "terms": "美式足球場" }, + "leisure/pitch/badminton": { + "name": "羽毛球場", + "terms": "羽毛球場" + }, "leisure/pitch/baseball": { "name": "棒球場", "terms": "棒球場" @@ -4964,6 +4998,10 @@ "name": "橋樑", "terms": "橋樑,橋,陸橋,天橋" }, + "man_made/bunker_silo": { + "name": "地面筒倉", + "terms": "地面筒倉;筒倉" + }, "man_made/chimney": { "name": "煙囪", "terms": "煙筒" @@ -6874,6 +6912,27 @@ }, "name": "健行與自行車" }, + "kelkkareitit": { + "attribution": { + "text": "© Kelkkareitit.fi" + }, + "description": "來自 OSM 的 Kelkkareitit.fi 雪車賽道(包含北歐)", + "name": "北歐雪車覆蓋層" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "瑞典自1955-1965的正射影像馬賽克。可能會同時出現較舊與較新的照片。", + "name": "Lantmäteriet 歷史正射影像 1960" + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "© Lantmäteriet, CC0" + }, + "description": "瑞典自1970-1980的正射影像馬賽克。正在建構中。", + "name": "Lantmäteriet 歷史正射影像 1975" + }, "mapbox_locator_overlay": { "attribution": { "text": "使用條款與意見回饋" @@ -6910,8 +6969,8 @@ "attribution": { "text": "© Lantmäteriet" }, - "description": "掃描 1950-1980 的「經濟地圖」", - "name": "Lantmäteriet 經濟地圖(歷史地圖)" + "description": "掃描「經濟地圖」1950-1980", + "name": "Lantmäteriet 經濟地圖 1950-1980" }, "qa_no_address": { "attribution": { @@ -6925,6 +6984,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "© Skoterleder.org" + }, + "description": "Snowmobile 路徑", + "name": "Snowmobile 地圖瑞典" + }, "stamen-terrain-background": { "attribution": { "text": "Stamen Design 的圖磚,以 CC BY 3.0 授權。資料自 OpenStreetMap 處取得,以 ODbL 授權" @@ -6987,6 +7053,14 @@ } }, "community": { + "bw-facebook": { + "name": "在 Facebook 上的 Mapping Botswana", + "description": "OpenStreetMap in Botswana 專頁" + }, + "bw-twitter": { + "name": "在 Twitter 上的 Mapping Botswana", + "description": "OpenStreetMap in Botswana 的 Twitter" + }, "cape-coast-youthmappers": { "name": "University of Cape Coast YouthMappers", "description": "追隨我們的 Twitter: {url} ", @@ -7351,6 +7425,18 @@ "name": "開放街圖匈牙利 Meetup", "description": "匈牙利舉行聚會的平台" }, + "is-facebook": { + "name": "在 Facebook 上的 OSM Iceland", + "description": "OpenStreetMap in Iceland 專頁" + }, + "is-mailinglist": { + "name": "Talk-is 郵件清單", + "description": "Talk-is 是冰島 OSM 社群的官方郵件清單" + }, + "is-twitter": { + "name": "在 Twittter 上的 OSM Iceland", + "description": "OpenStreetMap in Iceland 的 Twitter" + }, "it-facebook": { "name": "開放街圖義大利 Facebook", "description": "加入開放街圖義大利社群 Facebook" @@ -7454,9 +7540,28 @@ "description": "East Midlands 圖客和使用者的社交聚會", "extendedDescription": "一開始 2011 年 3 月時有一群人在諾丁罕開始聚會,後來則大多在德比,以及不時在東密德蘭的其他地方。大多是社交性質的聚會,但也是相當好詢問有關地方 OSM 或是一般性質問題。在夏季時我們通常會趁有日光時在聚會場地附近出外畫地圖,這群人有個特別興趣,就是繪製公共空間,不時會為了畫地圖而聚會。" }, + "gb-mailinglist": { + "name": "Talk-gb 郵件論壇", + "description": "Talk-gb 是大英國協 (包括北愛爾蘭) 社群的官方郵件論壇 " + }, + "mappa-mercia-group": { + "name": "Mappa Mercia 地方社群", + "description": "英格蘭中部區一帶開放街圖熱情參與者的園地", + "extendedDescription": "Mappa Mercia 計畫宗旨是幫忙英國英格蘭中部區開放街圖的成長,我們運行社群活動,提供訓練和支援當地組織,最終希望能夠開放他們的資料。" + }, "gb-irc": { + "name": "開放街圖聯合王國 IRC", + "description": "在 irc.oftc.net (port 6667) 上面加入 #osm-gb", "extendedDescription": "在 irc.oftc.net (port 6667) 加入 #osm-gb,如果你問了問題,請耐心等候數分鐘等待回應" }, + "OSM-CA-Slack": { + "name": "OSM-CA Slack", + "description": "歡迎所有人加入!在 {signupUrl} 註冊。" + }, + "OSM-Vancouver-meetup": { + "name": "開放街圖溫哥華", + "description": "英屬哥倫比亞溫哥華一帶的圖客與開放街圖使用者" + }, "OSM-CU-telegram": { "name": "OSM 古巴在 Telegram", "description": "開放街圖古巴 Telegram 聊天室" @@ -7498,11 +7603,30 @@ "description": "改善華府區域的 OpenStreetMap", "extendedDescription": "我們是一群致力於改善華府區域的 OpenStreetMap 的群組。我們也努力教導其他人關於 OSM 的生態系、資料分析、製圖與 GIS。我們每隔一個月聚會一次,每次僅聚焦在我們的城市中的一個地區。" }, + "Maptime-ME-meetup": { + "name": "MaptimeME", + "description": "緬因州波特蘭區域的圖客與 OpenStreetMap 使用者", + "extendedDescription": "以字面來說,Maptime 是畫地圖的時間,我們的宗旨是開創一扇讓任何能製作地圖的時間和空問,大家共同學習,探索和運用製作地圖工具和技術製作地圖。" + }, + "us-ma-mailinglist": { + "name": "Talk-us 麻塞諸塞州郵件論壇", + "description": "麻塞諸塞州 OSM 社群 email 郵件論壇" + }, + "OpenCleveland-meetup": { + "name": "Open Cleveland", + "description": "改善克里夫蘭區域的 OpenStreetMap", + "extendedDescription": "Open Geo Cleveland 宗旨是成為人們熱情討論和分享自由地理資料集知識的資源,特別是開放街圖的資料,以及管理、編輯和顯示地理資料的開放地理空間軟體,以及在東北伊犁洛州推廣的團體。我們同時也是 maptime 的在地社群 =)" + }, "OSM-Boston": { "name": "開放街圖波士頓", "description": "波士頓的圖客與開放街圖使用者", "extendedDescription": "開放街圖是一份自由開放的維基風格世界地圖,每天都有數十萬像您這樣的人們做出貢獻。編輯地圖很簡單,而且很有趣!不管是在戶內或是戶外都可以加入我們,來建立波士頓地區與世界其他地方最好的地圖吧!" }, + "OSM-Central-Salish-Sea": { + "name": "開放街圖中薩利希海", + "description": "華盛頓州弗農山區域的圖客與 OpenStreetMap 使用者", + "extendedDescription": "OpenStreetMap 是一幅由像你這樣的人所製作的世界地圖。它是由你所建構,並如同維基百科那樣自由提供給所有人的地圖。看看 osm.org 以取得更多資訊,然後在聚會上加入我們來說說地圖的故事、對 OSM 貢獻然後玩得開心!" + }, "OSM-Chattanooga": { "name": "OSM 查塔努加", "description": "查塔努加的 OpenStreetMap 使用者群組" @@ -7516,6 +7640,11 @@ "name": "OpenStreetMap NYC", "description": "在紐約都會區的圖客與 OpenStreetMap 使用者、開發者與愛好者" }, + "OSM-Portland-forum": { + "name": "開放街圖 PDX Google 群組", + "description": "波特蘭一帶開放街圖使用者活動的論壇和郵件論壇", + "extendedDescription": "團隊宗旨是增進奧勒岡波蘭一帶開放街圖的發展,像是應用如 Open Trip Planner。" + }, "OSM-Portland": { "name": "OpenStreetMap 波特蘭", "description": "波特蘭區域的圖客與 OpenStreetMap 使用者", @@ -7527,7 +7656,8 @@ }, "OSM-SoCal": { "name": "開放街圖南加州", - "description": "讓我們玩樂吧,並且貢獻畫洛杉磯一帶,以及學習有關畫地圖的一切!" + "description": "讓我們玩樂吧,並且貢獻畫洛杉磯一帶,以及學習有關畫地圖的一切!", + "extendedDescription": "開放街圖南加州擁抱任何對共同畫開放街圖有興趣的人。開放街圖是維基百科式運作的地圖,是全世界尺度自由開源的地圖,由全球超過 1,000,000 人的志工製作。我們歡迎所有人,如果你不大知道開放街圖,我們會教你,如果你有關於畫地圖計畫,甚至野外實察,也是很棒的事情!" }, "OSM-South-Bay": { "name": "OSM South Bay", @@ -7587,6 +7717,44 @@ "name": "Maptime Australia Slack", "description": "在 {signupUrl} 註冊" }, + "talk-au": { + "name": "Talk-au 郵件論壇", + "description": "讓澳洲圖客聊天的園地" + }, + "OSM-AR-facebook": { + "name": "開放街圖阿根廷 Facebook", + "description": "加入開放街圖阿根廷社群 Facebook", + "extendedDescription": "在地社群消息" + }, + "OSM-AR-forum": { + "name": "開放街圖阿根廷的網頁論壇", + "description": "加入開放街圖阿根廷的網頁論壇", + "extendedDescription": "適合長篇或重要討論,回應時間慢。" + }, + "OSM-AR-irc": { + "name": "開放街圖阿根廷 IRC", + "description": "在 irc.oftc.net (port 6667) 上面加入 #osm-ar", + "extendedDescription": "你會發現社群中最 geeky 的使用者。" + }, + "OSM-AR-mailinglist": { + "name": "Talk-ar 郵件論壇", + "description": "從前用過的郵件論壇,如今已經不再使用。" + }, + "OSM-AR-telegram": { + "name": "開放街圖阿根廷 Telegram", + "description": "加入開放街圖阿根廷 Telegram 聊天室", + "extendedDescription": "社群最活躍的頻道,適合聊天和馬上解答你的問題,歡迎所有人!" + }, + "OSM-AR-twitter": { + "name": "開放街圖阿根廷 Twitter", + "description": "在 {url} 上追隨我們的 Twitter ", + "extendedDescription": "一般在地社群和開放街圖消息。" + }, + "OSM-BO-mailinglist": { + "name": "Talk-bo 郵件論壇", + "description": "Talk-bo 是玻利維亞社群的官方郵件論壇 ", + "extendedDescription": "在玻利維亞畫地圖嗎?想要問問題,想要與社群連結?請加入 {Url},所有人都歡迎噢!" + }, "Bahia-telegram": { "name": "開放街圖巴伊亞 Telegram", "description": "加入開放街圖巴伊亞 Telegram 聊天室", @@ -7610,6 +7778,11 @@ "name": "開放街圖巴西 Twitter", "description": "在 {url} 上追隨我們的 Twitter" }, + "RS-telegram": { + "name": "開放街圖南里奧格蘭德州 Telegram 群組", + "description": "加入在 Telegram 上的開放街圖南里奧格蘭德州社群", + "extendedDescription": "加入社群以得知更多關於開放街圖的資訊,也可以問問題或是參與我們的會面。每個人都很歡迎加入!" + }, "OSM-CL-facebook": { "name": "開放街圖智利 Facebook", "description": "加入開放街圖智利社群 Facebook", @@ -7686,6 +7859,29 @@ "name": "開放街圖祕魯", "description": "開放街圖社群的新聞和資源頁面" }, + "LATAM-Facebook": { + "name": "OpenStreetMap Latam Facebook", + "description": "在 Facebook 上的 OpenStreetMap Latam" + }, + "LATAM-Telegram": { + "name": "OpenStreetMap Latam Telegram", + "description": "拉丁美洲的 OpenStreetMap Telegram" + }, + "LATAM-Twitter": { + "name": "OpenStreetMap Latam Twitter", + "description": "在 {url} 上追蹤我們的 Twitter" + }, + "osm-latam": { + "name": "OpenStreetMap Latam", + "description": "支援在拉丁美洲的開放街圖", + "events": { + "sotm-latam-2018": { + "name": "State of the Map Latam 2018", + "description": "State of the Map Latam 是拉丁美洲開放街圖圖客和使用者的年度大會,大會有包括演講、論壇、工作坊和圖客趴等開放街圖有關的活動。", + "where": "阿根庭布宜諾艾利斯" + } + } + }, "OSM-Facebook": { "name": "開放街圖 Facebook", "description": "在 Facebook 為我們按讚,追蹤開放街圖相關的新聞和動態。" diff --git a/dist/locales/zh.json b/dist/locales/zh.json index 01f2ac14c..13f1e35fc 100644 --- a/dist/locales/zh.json +++ b/dist/locales/zh.json @@ -285,27 +285,21 @@ "access": { "options": { "designated": { - "description": "只限标志指定或特定本地法律容许人士进入", "title": "特定的" }, "destination": { - "description": "只限前往目的地人士进入", "title": "目的地" }, "no": { - "description": "禁止一般公众进入", "title": "禁止的" }, "permissive": { - "description": "容许进入,直至拥有者撇回许可", "title": "获许可进入" }, "private": { - "description": "须拥有者个别批准,方可进入", "title": "私人" }, "yes": { - "description": "按法律及路权,有权使用", "title": "允许的" } }, From 2cee31d611ec40ca73876fc5a9990b6dd4c8f433 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 26 Aug 2018 02:18:05 -0400 Subject: [PATCH 169/217] v2.11.0 --- modules/core/context.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/context.js b/modules/core/context.js index bb127b6d9..4303983ed 100644 --- a/modules/core/context.js +++ b/modules/core/context.js @@ -53,7 +53,7 @@ export function setAreaKeys(value) { export function coreContext() { var context = {}; - context.version = '2.10.0'; + context.version = '2.11.0'; // create a special translation that contains the keys in place of the strings var tkeys = _cloneDeep(dataEn); diff --git a/package.json b/package.json index f0794001d..e3e1ce3d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iD", - "version": "2.10.0", + "version": "2.11.0", "description": "A friendly editor for OpenStreetMap", "main": "iD.js", "repository": "openstreetmap/iD", From c92cf982bb9133901edd3236c8f93c4df42ae785 Mon Sep 17 00:00:00 2001 From: Manfred Brandl Date: Mon, 27 Aug 2018 18:22:26 +0200 Subject: [PATCH 170/217] Fix typo in URL (CONTRIBUTING.md) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d86178082..11c033760 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -395,7 +395,7 @@ Additionally here is a step-by-step workflow example for beginners: 3. Set up [Git](https://help.github.com/articles/set-up-git/) and prepare for Authenticating with GitHub from Git. -4. Clone or download your local copy of iD from your GitHub account using https `git clone https://github.com:/iD.git` or using ssh `git clone git@github.com:{{yourgithubaccount}}/iD.git`. In your local copy you'll have a "remote" called origin. +4. Clone or download your local copy of iD from your GitHub account using https `git clone https://github.com//iD.git` or using ssh `git clone git@github.com:{{yourgithubaccount}}/iD.git`. In your local copy you'll have a "remote" called origin. 5. Switch to the iD directory, create a working branch (choose a descriptive name) and switch to it : `cd iD ; git checkout -b `. Never do anything in master branch. From 3011333ae92fbee09419e31e862a925492373dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20H=C3=A4ssler?= Date: Mon, 27 Aug 2018 23:34:19 +0200 Subject: [PATCH 171/217] Add preset for amenity=language_school --- .../presets/amenity/language_school.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 data/presets/presets/amenity/language_school.json diff --git a/data/presets/presets/amenity/language_school.json b/data/presets/presets/amenity/language_school.json new file mode 100644 index 000000000..cbdb27e26 --- /dev/null +++ b/data/presets/presets/amenity/language_school.json @@ -0,0 +1,19 @@ +{ + "icon": "maki-school", + "fields": [ + "name", + "operator", + "address", + "phone", + "website", + "wheelchair" + ], + "geometry": [ + "point", + "area" + ], + "tags": { + "amenity": "school" + }, + "name": "Language school" +} From bb4ee2bf4b77774e14275f3d6d2e76f96d2c4dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20H=C3=A4ssler?= Date: Mon, 27 Aug 2018 23:34:19 +0200 Subject: [PATCH 172/217] Add preset for leisure=bandstand --- data/presets/presets/leisure/bandstand.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 data/presets/presets/leisure/bandstand.json diff --git a/data/presets/presets/leisure/bandstand.json b/data/presets/presets/leisure/bandstand.json new file mode 100644 index 000000000..5db341650 --- /dev/null +++ b/data/presets/presets/leisure/bandstand.json @@ -0,0 +1,16 @@ +{ + "icon": "maki-music", + "fields": [ + "name", + "operator" + ], + "geometry": [ + "point", + "area" + ], + "tags": { + "leisure": "bandstand", + "building": "roof" + }, + "name": "Bandstand" +} From 8c8054b785ab354dadf03a6dd385fde954201142 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 29 Aug 2018 00:43:42 -0400 Subject: [PATCH 173/217] Better check for file extension, default to .gpx if `gpx=` in url (closes #5253) --- modules/renderer/background.js | 2 +- modules/svg/data.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/renderer/background.js b/modules/renderer/background.js index 4b71ddfe1..b52db0415 100644 --- a/modules/renderer/background.js +++ b/modules/renderer/background.js @@ -452,7 +452,7 @@ export function rendererBackground(context) { if (q.gpx) { var gpx = context.layers().layer('data'); if (gpx) { - gpx.url(q.gpx); + gpx.url(q.gpx, '.gpx'); } } diff --git a/modules/svg/data.js b/modules/svg/data.js index b4ee1a7ac..a391c8f1f 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -316,10 +316,9 @@ export function svgData(projection, context, dispatch) { function getExtension(fileName) { if (!fileName) return; - var lastDotIndex = fileName.lastIndexOf('.'); - if (lastDotIndex < 0) return; - - return fileName.substr(lastDotIndex); + var re = /\.(gpx|kml|(geo)?json)$/i; + var match = fileName.match(re); + return match && match.length && match[0]; } @@ -471,15 +470,16 @@ export function svgData(projection, context, dispatch) { }; - drawData.url = function(url) { + drawData.url = function(url, defaultExtension) { _template = null; _fileList = null; _geojson = null; _src = null; - var extension = getExtension(url); - var re = /\.(gpx|kml|(geo)?json)$/i; - if (re.test(extension)) { + // strip off any querystring/hash from the url before checking extension + var testUrl = url.split(/[?#]/)[0]; + var extension = getExtension(testUrl) || defaultExtension; + if (extension) { _template = null; d3_text(url, function(err, data) { if (err) return; From 8c728d727e39114c062c4f9025ae8ba68e7e25e3 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 29 Aug 2018 00:50:20 -0400 Subject: [PATCH 174/217] npm run imagery --- data/imagery.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/imagery.json b/data/imagery.json index 7da6bb315..ef8b57357 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -22666,7 +22666,7 @@ "id": "lu.geoportail.opendata.ortho_10cm_proto_lidar", "name": "geoportail.lu LIDAR prototype Nordstad 2017", "type": "tms", - "template": "http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", + "template": "https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2017-04-09T00:00:00.000Z", "startDate": "2017-04-09T00:00:00.000Z", "zoomExtent": [0, 21], @@ -38124,7 +38124,7 @@ "id": "lu.geoportail.opendata.ortholatest", "name": "Latest available ortho geoportail.lu", "type": "tms", - "template": "http://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", + "template": "https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg", "endDate": "2017-06-22T00:00:00.000Z", "startDate": "2017-06-14T00:00:00.000Z", "zoomExtent": [0, 20], @@ -41920,8 +41920,8 @@ [6.51691, 51.81714] ] ], - "terms_url": "http://www.rvr-online.de/", - "terms_text": "Datengrundlage: Regionalverband Ruhr, www.rvr-online.de" + "terms_url": "https://www.metropoleruhr.de/regionalverband-ruhr.html", + "terms_text": "Datengrundlage: Regionalverband Ruhr" }, { "id": "miljodirektoratet-vern", From 74e94b0717cbeb47237a72d6f2850196a59714a8 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 29 Aug 2018 00:51:32 -0400 Subject: [PATCH 175/217] npm run translations --- dist/locales/ar.json | 5 +- dist/locales/ast.json | 243 ++++++++++++++++++++ dist/locales/de.json | 4 +- dist/locales/en-GB.json | 121 +++++----- dist/locales/eo.json | 327 +++++++++++++++++++++++++- dist/locales/fi.json | 23 +- dist/locales/he.json | 51 +++++ dist/locales/ja.json | 76 +++--- dist/locales/nl.json | 26 ++- dist/locales/pl.json | 20 +- dist/locales/pt-BR.json | 57 +++-- dist/locales/pt.json | 10 +- dist/locales/ru.json | 2 +- dist/locales/sq.json | 497 +++++++++++++++++++++++++++++++++++++++- dist/locales/sv.json | 18 ++ dist/locales/vi.json | 83 ++++++- 16 files changed, 1408 insertions(+), 155 deletions(-) diff --git a/dist/locales/ar.json b/dist/locales/ar.json index 07aaa21f3..eebf91a8d 100644 --- a/dist/locales/ar.json +++ b/dist/locales/ar.json @@ -771,9 +771,12 @@ "connect_line": "وجود طُرق متصلة بشكل سليم مُهم للخريطة وأساسي لتوفير اتجاهات القيادة.", "connect_line_display": "الروابط بين الطرق تكون مرسومة كدوائر رمادية. ونقاط النهاية للخطوط تكون مرسومة كدوائر بيضاء أكبر قليلا إذا كانت غير متصلة بأي شيء.", "connect_line_drag": "لربط خط بعنصر آخر، اسحب أحد العُقد المكونة للخط إلى العنصر الآخر حتى يندمج كلا العنصرين معًا.\nتلميح: يمكنك الضغط مع الاستمرار على مفتاح `{alt}` لمنع العُقد من الاندماج بالعناصر الأخرى.", - "connect_line_tag": "إذا كنت تعرف أن رابط طريق ما عبارة عن إشارة مرورية أو مكان عبور مشاة، يمكنك إضافة ذلك إلى الرابط عن طريق الضغط على عُقدة الربط واستخدام محرر العناصر لاختيار نوع العنصر الصحيح.", + "connect_line_tag": "إذا كنت تعرف أن عُقدة ارتباط طريق ما عبارة عن إشارة مرورية أو مكان عبور مشاة، يمكنك إضافة ذلك إلى الارتباط عن طريق الضغط على عُقدة الربط واستخدام محرر العناصر لاختيار نوع العنصر الصحيح.", "disconnect_line_h": "فصل الخطوط", + "disconnect_line_command": "لقطع اتصال خط عن خط أو عنصر آخر، انقر بالزر الأيمن {rightclick} على عُقدة الارتباط واختر أمر **قطع الاتصال** {disconnect} من قائمة التحرير.", "move_line_h": "تحريك ونقل الخطوط", + "move_line_command": "لتحريك ونقل خط بالكامل، انقر بالزر الأيمن {rightclick} على الخط المراد نقله واختر أمر **تحريك** {move} من قائمة التحرير. ثم حرّك الفأرة إلى المكان المراد، وانقر بالزر الأيسر {leftclick} لوضع الخط في المكان الجديد.", + "move_line_connected": "الخطوط المتصلة بعناصر أخرى ستبقى متصلة بالعناصر أثناء تحريك الخط إلى المكان الجديد، وقد يمنعك مُحرر iD من تحريك الخط خلال خط آخر متصل.", "delete_line_h": "حذف وإزالة الخطوط" }, "areas": { diff --git a/dist/locales/ast.json b/dist/locales/ast.json index a5b9dd38a..06450dfa4 100644 --- a/dist/locales/ast.json +++ b/dist/locales/ast.json @@ -4752,6 +4752,249 @@ }, "name": "Paisaxe de Thunderforest" } + }, + "community": { + "osm-gh-twitter": { + "name": "OpenStreetMap Ghana en Twitter", + "description": "Síguenos en Twitter en {url}" + }, + "talk-gh": { + "name": "Llista de corréu Talk-gh" + }, + "OSM-India-facebook": { + "events": { + "sotmasia2018": { + "name": "State of the Map Asia 2018", + "description": "Xúnite al aconceyamientu rexonal d'OpenStreetMap de 2018 nel State of the Map Asia na India" + } + } + }, + "OSM-india-mailinglist": { + "name": "Llista de corréu d'OpenStreetMap India" + }, + "OSM-india-twitter": { + "name": "Twitter d'OpenStreetMap India", + "description": "Tamos a solo un tweet: {url}" + }, + "OSM-India-Puducherry-Facebook": { + "name": "Free Software Hardware Movement - Facebook" + }, + "OSM-India-Puducherry-Matrix": { + "name": "Free Software Hardware Movement - Matrix" + }, + "OSM-IDN-facebook": { + "name": "OpenStreetMap Indonesia" + }, + "OSM-japan-mailinglist": { + "name": "Llista de corréu d'OpenStreetMap Xapón" + }, + "OSM-japan-twitter": { + "name": "Twitter d'OpenStreetMap Xapón", + "description": "Hashtag en Twitter: {url}" + }, + "OSM-japan-website": { + "name": "OpenStreetMap Xapón" + }, + "OSM-MNG-facebook": { + "name": "OpenStreetMap Mongolia" + }, + "OSM-MMR-facebook": { + "name": "OpenStreetMap Myanmar" + }, + "OSM-Nepal-facebook": { + "name": "OpenStreetMap Nepal" + }, + "OSM-PH-mailinglist": { + "name": "Llista de corréu Talk-ph" + }, + "OSM-PH-slack": { + "name": "Slack d'OpenStreetMap PH" + }, + "OSM-PH-telegram": { + "name": "Telegram d'OpenStreetMap PH" + }, + "OSM-RU-forum": { + "name": "Foru OpenStreetMap RU", + "description": "Foru web d'OpenStreetMap Rusia" + }, + "OSM-RU-telegram": { + "name": "Telegram d'OpenStreetMap RU" + }, + "OSM-LKA-facebook": { + "name": "OpenStreetMap Sri Lanka" + }, + "OSM-TW-facebook": { + "name": "Comunidá d'OpenStreetMap Taiwan" + }, + "OSM-TW-mailinglist": { + "name": "Llista de corréu d'OpenStreetMap Taiwán" + }, + "OSM-TH-facebook": { + "name": "Grupu de Facebook d'OpenStreetMap TH" + }, + "OSM-TH-forum": { + "name": "Foru OpenStreetMap TH", + "description": "Foru web d'OpenStreetMap Tailandia" + }, + "al-forum": { + "name": "Foru OSM d'Albania", + "description": "Foru d'OpenStreetMap d'Albania" + }, + "al-maptime-tirana": { + "name": "Maptime Tirana" + }, + "al-telegram": { + "name": "Canal de Telegram OSM d'Albania", + "description": "Canal de Telegram d'OpenStreetMap d'Albania" + }, + "at-forum": { + "name": "Foru d'OpenStreetMap Austria" + }, + "at-mailinglist": { + "name": "Llista de corréu Talk-at" + }, + "at-twitter": { + "name": "Twitter OpenStreetMap Austria", + "description": "OpenStreetMap Austria en Twitter: {url}" + }, + "osm-at": { + "name": "OpenStreetMap Austria" + }, + "byosm": { + "name": "OpenStreetMap Bielorrusia", + "description": "Grupu de telegram d'OpenStreetMap Bielorrusia" + }, + "be-facebook": { + "name": "Comunidá OpenStreetMap BE" + }, + "be-forum": { + "name": "Foru d'OpenStreetMap BE", + "description": "Foru web d'OpenStreetMap Bélxica" + }, + "be-irc": { + "name": "IRC d'OpenStreetMap Bélxica" + }, + "be-mailinglist": { + "name": "Llista de corréu Talk-be" + }, + "be-maptime": { + "name": "Maptime Bélxica" + }, + "be-matrix": { + "name": "Canal Matrix d'OpenStreetMap BE" + }, + "be-meetup": { + "name": "Meetup d'OpenStreetMap Bélgica" + }, + "be-twitter": { + "name": "Twitter OpenStreetMap Bélxica", + "description": "OSM Bélxica en Twitter: @osm_be" + }, + "hr-mailinglist": { + "name": "Llista de corréu Talk-hr", + "description": "Llista de corréu Talk-hr" + }, + "czech-community": { + "name": "Comunidá OSM de Chequia" + }, + "osmcz-facebook": { + "name": "OpenStreetMap CZ en Facebook" + }, + "osmcz-twitter": { + "name": "Twitter checu @osmcz" + }, + "talk-cz-mailinglist": { + "name": "Llista de corréu checa (talk-cz)" + }, + "dk-forum": { + "name": "Foru web d'OpenStreetMap Dinamarca", + "description": "Foru web d'OpenStreetMap Dinamarca" + }, + "dk-irc": { + "name": "IRC d'OpenStreetMap Dinamarca" + }, + "dk-mailinglist": { + "name": "Llista de corréu Talk-dk" + }, + "fi-forum": { + "name": "Foru d'OpenStreetMap FI", + "description": "Foru web d'OpenStreetMap Finlandia" + }, + "fi-irc": { + "name": "IRC d'OpenStreetMap Finlandia" + }, + "fi-mailinglist": { + "name": "Llista de corréu Talk-fi" + }, + "fr-facebook": { + "name": "Páxina de Facebook d'OpenStreetMap Francia", + "description": "Páxina de Facebook d'OpenStreetMap Francia" + }, + "fr-forum": { + "name": "Foru web d'OpenStreetMap Francia", + "description": "Foru web d'OpenStreetMap Francia" + }, + "fr-irc": { + "name": "OpenStreetMap Francia en IRC" + }, + "fr-mailinglist": { + "name": "Llista de corréu Talk-fr", + "description": "Llista de corréu Talk-fr" + }, + "fr-twitter": { + "name": "OpenStreetMap Francia en Twitter", + "description": "OpenStreetMap Francia en Twitter: {url}" + }, + "de-berlin-mailinglist": { + "name": "Llista de corréu de Berlín" + }, + "de-berlin-meetup": { + "name": "Meetup d'OpenStreetMap Berlín-Brandenburgu" + }, + "de-berlin-telegram": { + "name": "@osmberlin en Telegram", + "description": "Charra de Telegram d'OpenStreetMap Berlín" + }, + "de-berlin-twitter": { + "name": "Twitter d'OpenStreetMap Berlín", + "description": "Síguenos en Twitter: {url}" + }, + "de-forum": { + "name": "Foru d'OpenStreetMap DE", + "description": "Foru web d'OpenStreetMap Alemaña" + }, + "de-irc": { + "name": "IRC d'OpenStreetMap Alemaña" + }, + "de-mailinglist": { + "name": "Llista de corréu Talk-de" + }, + "de-ostwestfalen-lippe-mailinglist": { + "name": "Llista de corréu OWL" + }, + "de-telegram": { + "name": "Telegram d'OpenStreetMap Alemaña" + }, + "osm-de": { + "name": "OpenStreetMap Alemaña" + }, + "hu-facebook": { + "name": "Facebook d'OpenStreetMap HU" + }, + "OSM-ES-mailinglist": { + "name": "Llista de corréu Talk-es", + "description": "Llista de corréu p'alderiques sobro OpenStreetMap n'España" + }, + "OSM-ES-telegram": { + "name": "@OSMes en Telegram", + "description": "Grupu de Telegram d'OpenStreetMap España" + }, + "osm-se": { + "name": "OpenStreetMap.se" + }, + "se-facebook": { + "name": "Facebook d'OpenStreetMap Suecia" + } } } } \ No newline at end of file diff --git a/dist/locales/de.json b/dist/locales/de.json index d5f381845..f34512896 100644 --- a/dist/locales/de.json +++ b/dist/locales/de.json @@ -638,7 +638,7 @@ "settings": { "custom_background": { "tooltip": "Bearbeite benutzerdefinierten Hintergrund", - "header": "Einstellungen des benutzerdefinierten Hintergrunds", + "header": "Benutzerdefinierten Hintergrund einstellen", "instructions": "Gib eine Kachel-URL-Vorlage ein. Gültige Variablen sind:\n- {zoom} oder {z}, {x}, {y} für das Z/X/Y Kachel-Schema\n- {-y} oder {ty} für umgedrehte TMS-Stil Y-Koordinaten\n- {u} für das Quadtile Schema\n- {switch:a,b,c} für DNS-Server Multiplexing\n\nBeispiel:\n{example}", "template": { "placeholder": "Gib eine URL-Vorlage ein" @@ -646,7 +646,7 @@ }, "custom_data": { "tooltip": "Bearbeite benutzerdefinierte Kartendaten", - "header": "Einstellungen für benutzerdefinierte Kartendaten", + "header": "Benutzerdefinierte Kartendaten einstellen", "file": { "instructions": "Wähle ein lokales Datenfile. Unterstützte Typen sind:\n .gpx, .kml, .geojson und .json", "label": "Durchsuche Files" diff --git a/dist/locales/en-GB.json b/dist/locales/en-GB.json index 3c714a8c7..b0107b5da 100644 --- a/dist/locales/en-GB.json +++ b/dist/locales/en-GB.json @@ -5005,22 +5005,22 @@ "name": "Antiques Shop" }, "shop/appliance": { - "name": "Appliance Store" + "name": "Appliance Shop" }, "shop/art": { - "name": "Art Store" + "name": "Art Shop" }, "shop/baby_goods": { - "name": "Baby Goods Store" + "name": "Baby Goods Shop" }, "shop/bag": { - "name": "Bag/Luggage Store" + "name": "Bag/Luggage Shop" }, "shop/bakery": { "name": "Bakery" }, "shop/bathroom_furnishing": { - "name": "Bathroom Furnishing Store" + "name": "Bathroom Furnishing Shop" }, "shop/beauty": { "name": "Beauty Shop" @@ -5032,10 +5032,10 @@ "name": "Tanning Salon" }, "shop/bed": { - "name": "Bedding/Mattress Store" + "name": "Bed Shop" }, "shop/beverages": { - "name": "Beverage Store" + "name": "Beverages Shop" }, "shop/bicycle": { "name": "Bicycle Shop" @@ -5044,7 +5044,7 @@ "name": "Bookmaker" }, "shop/books": { - "name": "Book Store" + "name": "Book Shop" }, "shop/boutique": { "name": "Boutique" @@ -5059,55 +5059,55 @@ "name": "Car Dealership" }, "shop/car_parts": { - "name": "Car Parts Store" + "name": "Car Parts Shop" }, "shop/car_repair": { "name": "Car Repair Shop" }, "shop/carpet": { - "name": "Carpet Store" + "name": "Carpet Shop" }, "shop/charity": { "name": "Charity Shop" }, "shop/cheese": { - "name": "Cheese Store" + "name": "Cheese Shop" }, "shop/chemist": { "name": "Chemist" }, "shop/chocolate": { - "name": "Chocolate Store" + "name": "Chocolate Shop" }, "shop/clothes": { - "name": "Clothing Store" + "name": "Clothing Shop" }, "shop/coffee": { - "name": "Coffee Store" + "name": "Coffee Shop (Retail)" }, "shop/computer": { - "name": "Computer Store" + "name": "Computer Shop" }, "shop/confectionery": { - "name": "Candy Store" + "name": "Sweet Shop" }, "shop/convenience": { "name": "Convenience Store" }, "shop/copyshop": { - "name": "Copy Store" + "name": "Copyshop" }, "shop/cosmetics": { - "name": "Cosmetics Store" + "name": "Cosmetics Shop" }, "shop/craft": { - "name": "Arts and Crafts Store" + "name": "Art and Craft Supplies Shop" }, "shop/curtain": { - "name": "Curtain Store" + "name": "Curtain Shop" }, "shop/dairy": { - "name": "Dairy Store" + "name": "Dairy Shop" }, "shop/deli": { "name": "Deli" @@ -5116,7 +5116,7 @@ "name": "Department Store" }, "shop/doityourself": { - "name": "DIY Store" + "name": "DIY Shop" }, "shop/dry_cleaning": { "name": "Dry Cleaner" @@ -5125,19 +5125,19 @@ "name": "E-Cigarette Shop" }, "shop/electronics": { - "name": "Electronics Store" + "name": "Electronics Shop" }, "shop/erotic": { - "name": "Erotic Store" + "name": "Erotic Shop" }, "shop/fabric": { - "name": "Fabric Store" + "name": "Fabric Shop" }, "shop/farm": { "name": "Farm Shop" }, "shop/fashion": { - "name": "Fashion Store" + "name": "Fashion Shop" }, "shop/fishmonger": { "name": "Fishmonger" @@ -5152,10 +5152,10 @@ "name": "Funeral Home" }, "shop/furnace": { - "name": "Furnace Store" + "name": "Furnace Shop" }, "shop/furniture": { - "name": "Furniture Store" + "name": "Furniture Shop" }, "shop/garden_centre": { "name": "Garden Centre" @@ -5173,37 +5173,38 @@ "name": "Hairdresser" }, "shop/hardware": { - "name": "Hardware Store" + "name": "Hardware Shop" }, "shop/health_food": { "name": "Health Food Shop" }, "shop/hearing_aids": { - "name": "Hearing Aids Store" + "name": "Hearing Aids Shop" }, "shop/herbalist": { "name": "Herbalist" }, "shop/hifi": { - "name": "Hifi Store" + "name": "Hifi Shop" }, "shop/houseware": { - "name": "Houseware Store" + "name": "Houseware Store", + "terms": "homeware, kitchenware, linen, crockery" }, "shop/interior_decoration": { - "name": "Interior Decoration Store" + "name": "Interior Decoration Shop" }, "shop/jewelry": { "name": "Jeweller" }, "shop/kitchen": { - "name": "Kitchen Design Store" + "name": "Kitchen Design Shop" }, "shop/laundry": { "name": "Laundry" }, "shop/leather": { - "name": "Leather Store" + "name": "Leather Shop" }, "shop/locksmith": { "name": "Locksmith" @@ -5218,10 +5219,10 @@ "name": "Massage Shop" }, "shop/medical_supply": { - "name": "Medical Supply Store" + "name": "Medical Supply Shop" }, "shop/mobile_phone": { - "name": "Mobile Phone Store" + "name": "Mobile Phone Shop" }, "shop/money_lender": { "name": "Money Lender" @@ -5233,16 +5234,16 @@ "name": "Motorcycle Repair Shop" }, "shop/music": { - "name": "Music Store" + "name": "Music Shop" }, "shop/musical_instrument": { - "name": "Musical Instrument Store" + "name": "Musical Instrument Shop" }, "shop/newsagent": { "name": "Newspaper/Magazine Shop" }, "shop/nutrition_supplements": { - "name": "Nutrition Supplements Store" + "name": "Nutrition Supplements Shop" }, "shop/optician": { "name": "Optician" @@ -5251,10 +5252,10 @@ "name": "Organic Goods Store" }, "shop/outdoor": { - "name": "Outdoors Store" + "name": "Outdoors Shop" }, "shop/paint": { - "name": "Paint Store" + "name": "Paint Shop" }, "shop/pastry": { "name": "Pastry Shop" @@ -5263,25 +5264,25 @@ "name": "Pawn Shop" }, "shop/perfumery": { - "name": "Perfume Store" + "name": "Perfume Shop" }, "shop/pet": { - "name": "Pet Store" + "name": "Pet Shop" }, "shop/pet_grooming": { - "name": "Pet Grooming Store" + "name": "Pet Grooming Shop" }, "shop/photo": { - "name": "Photography Store" + "name": "Photography Shop" }, "shop/pyrotechnics": { - "name": "Fireworks Store" + "name": "Fireworks Shop" }, "shop/radiotechnics": { - "name": "Radio/Electronic Component Store" + "name": "Radio/Electronic Component Shop" }, "shop/religion": { - "name": "Religious Store" + "name": "Religious Shop" }, "shop/scuba_diving": { "name": "Scuba Diving Shop" @@ -5290,16 +5291,16 @@ "name": "Seafood Shop" }, "shop/second_hand": { - "name": "Consignment/Thrift Store" + "name": "Second Hand Shop" }, "shop/shoes": { "name": "Shoe Shop" }, "shop/sports": { - "name": "Sporting Goods Store" + "name": "Sporting Goods Shop" }, "shop/stationery": { - "name": "Stationery Store" + "name": "Stationery Shop" }, "shop/storage_rental": { "name": "Storage Rental" @@ -5314,7 +5315,7 @@ "name": "Tattoo Parlor" }, "shop/tea": { - "name": "Tea Store" + "name": "Tea Shop (Retail)" }, "shop/ticket": { "name": "Ticket Seller" @@ -5326,7 +5327,7 @@ "name": "Tobacco Shop" }, "shop/toys": { - "name": "Toy Store" + "name": "Toy Shop" }, "shop/trade": { "name": "Trade Shop" @@ -5335,22 +5336,22 @@ "name": "Travel Agency" }, "shop/tyres": { - "name": "Tire Store" + "name": "Tyre Shop" }, "shop/vacant": { "name": "Vacant Shop" }, "shop/vacuum_cleaner": { - "name": "Vacuum Cleaner Store" + "name": "Vacuum Cleaner Shop" }, "shop/variety_store": { "name": "Variety Store" }, "shop/video": { - "name": "Video Store" + "name": "Video/DVD Shop" }, "shop/video_games": { - "name": "Video Game Store" + "name": "Video Games Shop" }, "shop/watches": { "name": "Watches Shop" @@ -5362,10 +5363,10 @@ "name": "Weapon Shop" }, "shop/wholesale": { - "name": "Wholesale Store" + "name": "Wholesale Shop / Cash & Carry " }, "shop/window_blind": { - "name": "Window Blind Store" + "name": "Window Blind Shop" }, "shop/wine": { "name": "Wine Shop" diff --git a/dist/locales/eo.json b/dist/locales/eo.json index 6be670f75..cadc09de5 100644 --- a/dist/locales/eo.json +++ b/dist/locales/eo.json @@ -557,6 +557,11 @@ "notes": { "tooltip": "Rimarkoj el OpenStreetMap", "title": "OpenStreetMap-rimarkoj" + }, + "custom": { + "tooltip": "Ŝovu kaj demetu datum-dosieron sur la paĝon, aŭ klaku la butonon por agordi", + "title": "Propraj map-datumoj", + "zoom": "Pligrandigu al datumoj" } }, "fill_area": "Plenigi areojn", @@ -633,10 +638,23 @@ "custom_background": { "tooltip": "Redakti propran fonon", "header": "Agordoj de propra fono", - "instructions": "Entajpu URL-skemon de kaheloj. Ĝustaj ĵetonoj estas:\n {zoom}/{z}, {x}, {y} por Z/X/Y kahela skemo\n {-y} aŭ {ty} por renversaj TMS-stilaj Y-koordinatoj\n {u} por kvarkahela (quadtile) skemo\n {switch:a,b,c} por DNS-servila kunigado (multiplexing)\n\nEkzemplo:\n{example}", + "instructions": "Entajpu ligilon de kaheloj. Ĝustaj ĵetonoj estas:\n {zoom}/{z}, {x}, {y} por Z/X/Y kahela skemo\n {-y} aŭ {ty} por renversaj TMS-stilaj Y-koordinatoj\n {u} por kvarkahela (quadtile) skemo\n {switch:a,b,c} por DNS-servila kunigado (multiplexing)\n\nEkzemplo:\n{example}", "template": { "placeholder": "Redakti ligilon de ŝablono" } + }, + "custom_data": { + "tooltip": "Redakti propran datum-tavolon", + "header": "Agordoj de propraj map-datumoj", + "file": { + "instructions": "Elektu lokan dosieron kun datumoj. Subtenataj tipoj estas:\n .gpx, .kml, .geojson, .json", + "label": "Foliumi por dosiero" + }, + "or": "aŭ", + "url": { + "instructions": "Entajpu ligilon de datumoj ŝablonon de vektoraj kaheloj. Ĝustaj ĵetonoj estas:\n {zoom} aŭ {z}, {x}, {y} por Z/X/Y kahela skemo", + "placeholder": "Entajpu ligilon" + } } }, "restore": { @@ -7058,7 +7076,7 @@ }, "talk-gh": { "name": "Dissendolisto talk-gh", - "description": "Talk-gh estas oficiala dissendolisto por OSM-komunumo en Ganao." + "description": "Talk-gh estas oficiala dissendolisto por la OSM-komunumo en Ganao." }, "osm-mg-facebook": { "name": "Facebook-grupo OpenStreetMap Madagascar", @@ -7087,7 +7105,7 @@ }, "OSM-india-mailinglist": { "name": "Dissendolisto OpenStreetMap India", - "description": "Talk-in estas oficiala dissendolisto por OSM-komunumo en Barato" + "description": "Talk-in estas oficiala dissendolisto por la OSM-komunumo en Barato" }, "OSM-india-twitter": { "name": "OpenStreetMap India ĉe Twitter", @@ -7114,7 +7132,7 @@ }, "OSM-japan-mailinglist": { "name": "Dissendolisto OpenStreetMap Japanujo", - "description": "Talk-ja estas oficiala dissendolisto por OSM-komunumo en Japanujo" + "description": "Talk-ja estas oficiala dissendolisto por la OSM-komunumo en Japanujo" }, "OSM-japan-twitter": { "name": "OpenStreetMap Japanujo ĉe Twitter", @@ -7165,7 +7183,7 @@ }, "OSM-PH-slack": { "name": "OpenStreetMap PH ĉe Slack", - "description": "Bonvenon al ĉiuj! Aliĝu al ni ĉe {signupUrl}" + "description": "Bonvenon ĉiuj! Aliĝu al ni ĉe {signupUrl}" }, "OSM-PH-telegram": { "name": "OpenStreetMap PH ĉe Telegram", @@ -7212,7 +7230,7 @@ "al-maptime-tirana": { "name": "Maptime Tirana", "description": "Sociaj okazaĵoj organizitaj por mapigi – komencantoj estas akceptindaj!", - "extendedDescription": "Maptime estas malferma lernada medio por ĉiuj niveloj de scio, kiu precipe preparita por komencantoj. Maptime estas kaj fleksebla kaj strukturebla, liverante lokon por mapigaj gvidiloj, instruadoj, nunaj projektoj kun difinita komuna celo, per aŭ individua aŭ kolektiva laboro." + "extendedDescription": "Maptime estas malferma lernada medio por ĉiuj niveloj de scio, kiu estas precipe preparita por komencantoj. Maptime estas kaj fleksebla kaj strukturebla, liverante lokon por mapigaj gvidiloj, instruadoj, nunaj projektoj kun difinita komuna celo, per aŭ individua aŭ kolektiva laboro." }, "al-telegram": { "name": "Telegram-kanalo OSM Albanujo", @@ -7224,7 +7242,7 @@ }, "at-mailinglist": { "name": "Dissendolisto talk-at", - "description": "Talk-at estas oficiala dissendolisto por OSM-komunumo en Aŭstrujo" + "description": "Talk-at estas oficiala dissendolisto por la OSM-komunumo en Aŭstrujo" }, "at-twitter": { "name": "OpenStreetMap AT ĉe Twitter", @@ -7234,13 +7252,306 @@ "name": "Kunveno en Graz", "description": "Ĉiumonata renkonto de OpenStreetMap-komunumo en Graz" }, + "osmgraz-twitter": { + "name": "Kunveno en Graz ĉe Twitter", + "description": "Renkonto de OpenStreetMap-komunumo en Graz ĉe Twitter" + }, + "osm-at": { + "name": "OpenStreetMap Österreich", + "description": "Platformo de informoj pri OpenStreetMap en Aŭstrujo" + }, + "byosm": { + "name": "OpenStreetMap Беларусь", + "description": "Talegram-grupo OpenStreetMap Belorusujo" + }, + "be-facebook": { + "name": "Facebook-grupo OpenStreetMap Belgujo", + "description": "OpenStreetMap Belgujo ĉe Facebook" + }, + "be-forum": { + "name": "Forumo OpenStreetMap BE", + "description": "Forum-sekcio OpenStreetMap Belgujo" + }, + "be-irc": { + "name": "OpenStreetMap Belgujo ĉe IRC", + "description": "Aliĝu al #osmbe ĉe irc.oftc.net (pordo 6667)", + "extendedDescription": "Aliĝu al #osmbe ĉe irc.oftc.net (pordo 6667), ĝi estas kunigita kun la diskuta Matrix-kanalo" + }, + "be-mailinglist": { + "name": "Dissendolisto talk-be", + "description": "Talk-be estas oficiala dissendolisto por la OSM-komunumo en Belgujo" + }, + "be-maptime": { + "name": "Maptime Belgium", + "description": "Sociaj okazaĵoj organizitaj por mapigi – komencantoj estas akceptindaj!", + "extendedDescription": "Maptime estas malferma lernada medio por ĉiuj niveloj de scio, kiu estas precipe preparita por komencantoj. Maptime estas kaj fleksebla kaj strukturebla, liverante lokon por mapigaj gvidiloj, instruadoj, nunaj projektoj kun difinita komuna celo, per aŭ individua aŭ kolektiva laboro." + }, + "be-matrix": { + "name": "Matrix-kanalo OpenStreetMap BE", + "description": "Ĉiuj mapigistoj estas akceptindaj!", + "extendedDescription": "Plejparto da diskutoj estas en la kanalo “OpenStreetMap Belgium”. Demandu pri io ajn! En aliaj kanaloj oni diskutas pri specifaj temoj." + }, + "be-meetup": { + "name": "OpenStreetMap BE ĉe Meetup", + "description": "Renkontiĝoj en la reala mondo por ĉiu, kiu interesiĝas pri OpenStreetMap", + "extendedDescription": "Renkontiĝoj en la reala mondo estas bonaj ŝancoj por renkonti aliajn mapigistojn, demandi ilin kaj multe lerni. Precipe bonvenon novaj kontribuantoj!" + }, + "be-twitter": { + "name": "OpenStreetMap BE ĉe Twitter", + "description": "OSM Belgujo ĉe Twitter: @osm_be" + }, + "hr-facebook": { + "name": "OpenStreetMap Kroatujo ĉe Facebook", + "description": "Facebook-grupo OpenStreetMap Kroatujo" + }, + "hr-irc": { + "name": "OpenStreetMap Kroatujo ĉe IRC", + "description": "Aliĝu al #osm-hr ĉe irc.freenode.org (pordo 6667)" + }, + "hr-mailinglist": { + "name": "Dissendolisto talk-hr", + "description": "Dissendolisto talk-hr" + }, + "czech-community": { + "name": "Česká komunita OpenStreetMap", + "description": "Mapo, retejo kaj kontakto al OSM-mapigistoj en Ĉeĥujo" + }, + "osmcz-facebook": { + "name": "OpenStreetMap CZ ĉe Facebook", + "description": "Sekvu la Ĉeĥan komunumon ĉe Facebook – inkluzivante tradukitan WeeklyOSM!" + }, + "osmcz-twitter": { + "name": "Ĉeĥa Twitter-kanalo @osmcz", + "description": "Sekvu la Ĉeĥan komunumon ĉe Facebook – inkluzivante tradukitan WeeklyOSM!" + }, + "talk-cz-mailinglist": { + "name": "Ĉeĥa dissendolisto talk-cz", + "description": "Talk-cz estas oficiala dissendolisto por la OSM-komunumo en Ĉeĥujo" + }, + "dk-forum": { + "name": "Forumo OpenStreetMap Danmark", + "description": "Forum-sekcio OpenStreetMap Danujo" + }, + "dk-irc": { + "name": "OpenStreetMap Danujo ĉe IRC", + "description": "Aliĝu al #osm-dk ĉe irc.oftc.net (pordo 6667)" + }, + "dk-mailinglist": { + "name": "Dissendolisto talk-dk", + "description": "Dissendolisto por diskuti pri OpenStreetMap en Danujo" + }, + "fi-forum": { + "name": "Forumo OpenStreetMap FI", + "description": "Forum-sekcio OpenStreetMap Suomujo" + }, + "fi-irc": { + "name": "OpenStreetMap Suomujo ĉe IRC", + "description": "Aliĝu al #osm-fi ĉe irc.oftc.net (pordo 6667)" + }, + "fi-mailinglist": { + "name": "Dissendolisto talk-fi", + "description": "Talk-fi estas oficiala dissendolisto por la OSM-komunumo en Suomujo" + }, + "fr-facebook": { + "name": "OpenStreetMap France ĉe Facebook", + "description": "Facebook-grupo OpenStreetMap Francujo" + }, + "fr-forum": { + "name": "Forumo OpenStreetMap France", + "description": "Forum-sekcio OpenStreetMap Francujo" + }, + "fr-irc": { + "name": "OpenStreetMap Francujo ĉe IRC", + "description": "Aliĝu al #osm-fr ĉe irc.oftc.net (pordo 6667)" + }, + "fr-mailinglist": { + "name": "Dissendolisto talk-fr", + "description": "Dissendolisto talk-fr" + }, + "fr-twitter": { + "name": "OpenStreetMap France ĉe Twitter", + "description": "OpenStreetMap Francujo ĉe Twitter: {url}" + }, + "de-berlin-mailinglist": { + "name": "Dissendolisto Berlin", + "description": "Dissendolisto por la OSM-komunumo en Berlino" + }, + "de-berlin-meetup": { + "name": "OpenStreetMap Berlin-Brandenburg ĉe Meetup", + "description": "Mapigistoj de uzantoj de OpenStreetMap proksime de Berlino" + }, + "de-berlin-telegram": { + "name": "@osmberlin ĉe Telegram", + "description": "Telegram-kanalo OpenStreetMap Berlino" + }, + "de-berlin-twitter": { + "name": "OpenStreetMap Berlin ĉe Twitter", + "description": "Sekvu nin ĉe Twitter: {url}" + }, + "de-forum": { + "name": "Forumo OpenStreetMap DE", + "description": "Forum-sekcio OpenStreetMap Germanujo" + }, + "de-irc": { + "name": "OpenStreetMap Germanujo ĉe IRC", + "description": "Aliĝu al #osm-de ĉe irc.oftc.net (pordo 6667)" + }, + "de-mailinglist": { + "name": "Dissendolisto talk-de", + "description": "Talk-de estas oficiala dissendolisto por OSM-komunumo en Germanujo" + }, + "de-ostwestfalen-lippe-mailinglist": { + "name": "Dissendolisto OWL", + "description": "Dissendolisto por la OSM-komunumo Ostwestfalen-Lippe" + }, + "de-telegram": { + "name": "OpenStreetMap Germanujo ĉe Telegram", + "description": "Aliĝu al la Telegram-supergrupo pri OpenStreetMap en Germanujo ĉe {url}" + }, + "osm-de": { + "name": "OpenStreetMap Deutschland", + "description": "Platformo de informoj pri OpenStreetMap en Germanujo" + }, + "hu-facebook": { + "name": "OpenStreetMap HU ĉe Facebook", + "description": "OpenStreetMap Hungarujo ĉe Facebook" + }, + "hu-forum": { + "name": "Forumo OpenStreetMap HU", + "description": "Forum-sekcio OpenStreetMap Hungarujo" + }, + "hu-meetup": { + "name": "OpenStreetMap HU ĉe Meetup", + "description": "Platformo por organizi kunvenojn en Hungarujo" + }, + "is-facebook": { + "name": "OpenStreetMap Íslandi ĉe Facebook", + "description": "Facebook-paĝo pri OpenStreetMap en Islando" + }, + "is-mailinglist": { + "name": "Dissendolisto talk-is", + "description": "Talk-is estas oficiala dissendolisto por la OSM-komunumo en Islando" + }, + "is-twitter": { + "name": "OpenStreetMap Íslandi ĉe Twitter", + "description": "Twitter-paĝo pri OpenStreetMap en Islando" + }, + "it-facebook": { + "name": "OpenStreetMap Italia ĉe Facebook", + "description": "Facebook-paĝo de OpenStreetMap-komunumo en Italujo" + }, + "it-irc": { + "name": "OpenStreetMap Italia ĉe IRC", + "description": "Aliĝu al #osm-it ĉe irc.oftc.net (pordo 6667)" + }, + "it-mailinglist": { + "name": "Dissendolisto talk-it", + "description": "Talk-at estas oficiala dissendolisto por la OSM-komunumo en Italujo" + }, + "it-telegram": { + "name": "@OpenStreetMapItalia ĉe Telegram", + "description": "Telegram-kanalo OpenStreetMap Italujo" + }, + "it-twitter": { + "name": "OpenStreetMap Italia ĉe Twitter", + "description": "Sekvu nin ĉe Twitter ĉe {url}" + }, + "OSM-Rome-meetup": { + "name": "Incontro Mappatori Romani", + "description": "Plibonigi OpenStreetMap proksime de Romo", + "extendedDescription": "Ni celas esti rimedon por homoj por diskuti kaj kunhavigi scion pri uzi liberajn geografiajn datumojn (precipe OpenStreetMap) kaj liberan programaron por administri, redakti kaj vidigi geografiajn datumojn, kaj promoti ĝian uzon en Latio." + }, + "South-Tyrol-Mailing-List": { + "name": "Dissendolisto talk-it-southtyrol", + "description": "Regiona dissendolisto pri OpenStreetMap en Sud-Tirolo" + }, + "talk-it-lazio": { + "name": "Dissendolisto talk-it-lazio", + "description": "Bonvenon ĉiuj! Aliĝu al ni ĉe {signupUrl}", + "extendedDescription": "Dissendolisto por mapigistoj proksime de Romo kaj Latio." + }, + "Trentino-Mailing-List": { + "name": "Dissendolisto talk-it-trentino", + "description": "Regiona dissendolisto pri OpenStreetMap en Trento" + }, + "no-forum": { + "name": "Forumo OpenStreetMap Norge", + "description": "Forum-sekcio OpenStreetMap Norvegujo" + }, + "no-irc": { + "name": "OpenStreetMap Norge ĉe IRC", + "description": "Babila kanalo por uzantoj, mapigistoj, programistoj kaj ŝatantoj de OpenStreetMap en Norvegujo" + }, + "no-mailinglist": { + "name": "Dissendolisto OpensStreetMap Norge", + "description": "Dissendolisto por uzantoj, mapigistoj, programistoj kaj ŝatantoj de OpenStreetMap en Norvegujo" + }, "OSM-PL-facebook-group": { "name": "Facebook-grupo OpenStreetMap Polska", "description": "Grupo por mapigistoj kaj uzantoj de OpenStreetMap en Polujo." }, "OSM-PL-forum": { "name": "Forum-sekcio OpenStreetMap Polska", - "description": "Diskutejo por pola komunumo de OpenStreetMap" + "description": "Diskutejo por OpenStreetMap-komunumo en Polujo" + }, + "si-forum": { + "name": "Forumo OpenStreetMap Slovenija", + "description": "Diskutejo por OpenStreetMap-komunumo en Slovenujo" + }, + "si-mailinglist": { + "name": "Dissendolisto talk-si", + "description": "Dissendolisto por OpenStreetMap-komunumo en Slovenujo" + }, + "OSM-ES-mailinglist": { + "name": "Dissendolisto talk-es", + "description": "Dissendolisto por diskuti pri OpenStreetMap en Hispanujo" + }, + "OSM-ES-telegram": { + "name": "@OSMes ĉe Telegram", + "description": "Telegram-kanalo OpenStreetMap Hispanujo" + }, + "osm-se": { + "name": "OpenStreetMap.se", + "description": "Liveras OSM-servojn kaj informojn por la loka komunumo en Svedujo" + }, + "se-facebook": { + "name": "OpenStreetMap Sverige ĉe Facebook", + "description": "Facebook-grupo OpenStreetMap Svedujo" + }, + "se-forum": { + "name": "Forumo OpenStreetMap Sverige", + "description": "Forum-sekcio OpenStreetMap Svedujo" + }, + "se-irc": { + "name": "OpenStreetMap Sverige ĉe IRC", + "description": "Aliĝu al #osm.se ĉe irc.oftc.net (pordo 6667)" + }, + "se-mailinglist": { + "name": "Dissendolisto talk-se", + "description": "Dissendolisto por diskuti pri OpenStreetMap en Svedujo" + }, + "se-twitter": { + "name": "OpenStreetMap SE ĉe Twitter", + "description": "Sekvu nin ĉe Twitter: {url}" + }, + "Nottingham-OSM-pub-meetup": { + "name": "Ĉiumonata taverna renkontiĝo en East Midlands (Nottingham)", + "description": "Sociaj renkontiĝoj por uzantoj kaj mapigistoj en East Midlands", + "extendedDescription": "La grupo renkontiĝas de post marto 2011, komence en Nottingham kaj lastatempe en Derby kaj iam ie en East Midlands. Tiuj ĉi renkontiĝoj estas sociaj, sed ili estas bonegaj okazoj por demandi pri OpenStreetMap aŭ loke aŭ ĝenerale. Somere ni kutime iomete mapigas proksime de renkontejo. La grupo specife interesiĝas pri mapigi publikajn alirajn vojojn kaj renkontiĝoj de tempo al tempo temas pri tio." + }, + "gb-mailinglist": { + "name": "Dissendolisto talk-gb", + "description": "Talk-gb estas ĉefa komunika dissendolisto por OSM-komunumo en Britujo (inkluzive Nord-Irlandon)" + }, + "mappa-mercia-group": { + "name": "Loka grupo Mappa Mercia", + "description": "Hejmo de OpenStreetMap-ŝatantoj en Midlands", + "extendedDescription": "Mappa Mercia estas projekto por disvastigi OpenStreetMap en West Midlands, Britujo. Ni organizas komunumajn eventojn, instruas kaj subtenas lokajn organizaĵojn, kiuj volas malfermi siajn datumojn." + }, + "gb-irc": { + "name": "OpenStreetMap United Kingdom IRC", + "description": "Aliĝu al #osm-gb ĉe irc.oftc.net (pordo 6667)", + "extendedDescription": "Aliĝu al #osm-gb ĉe irc.oftc.net (pordo 6667), bonvolu esti pacienca kaj atendi kelkajn minutojn post demandi" }, "OSM-US": { "events": { diff --git a/dist/locales/fi.json b/dist/locales/fi.json index daff1961f..bc46ac1af 100644 --- a/dist/locales/fi.json +++ b/dist/locales/fi.json @@ -624,6 +624,12 @@ "template": { "placeholder": "Syötä taustakartan osoite" } + }, + "custom_data": { + "file": { + "label": "Selaa tiedostoja" + }, + "or": "Tai" } }, "restore": { @@ -1115,10 +1121,17 @@ "add_tank": "Piirretäänpä seuraavaksi tämä ympyränmuotoinen varastosäiliö. **Aloita alueen piirtäminen valitsemalla {button} Alue.**", "start_tank": "Älä suotta piirrä liian täydellistä ympyrää: riittää, että piirrät karkean ympyrän, joka on oikeankokoinen eli säiliön reunat koskettavat ympyrän kehää. **Sijoita ensimmäinen piste viemällä osoitin säiliön reunalle ja sitten napsauttamalla hiiren vasemmalla painikkeella tai painamalla välilyöntiä.**", "continue_tank": "Lisää vielä muutama viivapiste säiliön reunaa pitkin. Seuraavassa vaiheessa luomme ympyrän piirtämäsi viivan perusteella.{br}Viimeistele alue painamalla Enteriä tai napsauttamalla ensimmäistä tai viimeistä viivapistettä uudelleen. **Lopeta säiliön piirtäminen.**", - "choose_tank": "**Valitse {preset} listalta.**" + "search_tank": "**Etsi hakusanalla \"{preset}\".**", + "choose_tank": "**Valitse {preset} listalta.**", + "rightclick_tank": "**Avaa nyt toimintovalikko napsauttamalla varastosäiliötä hiiren oikealla painikkeella.**", + "circle_tank": "**Tee varastosäiliöstä ympyrän muotoinen napsauttamalla {button}-painiketta.**", + "retry_circle": "Napsautit väärää painiketta, yritä uudelleen.", + "play": "Mahtavaa! Harjoittele vielä lisää piirtämällä muutama muukin rakennus ja kokeilemalla toimintovalikon kaikkia toimintoja. **Kun olet valmis, napsauta {next}.**" }, "startediting": { "title": "Aloita kartanmuokkaus!", + "help": "Olet nyt valmis OpenStreetMapiin!{br}Voit käyfdä tämän aloitusoppaan läpi uudelleen tai tutustua käyttöohjeeseen milloin tahansa napsauttamalla {button} Ohje tai painamalla {key}-näppäintä.", + "shortcuts": "Tutustu käytettävissä oleviin pikanäppäimiin painamalla {key}-näppäintä.", "save": "Muista tallentaa muutokset säännöllisesti!", "start": "Aloita kartanmuokkaus!" } @@ -1243,10 +1256,18 @@ } }, "units": { + "feet": "{quantity} jalkaa", + "miles": "{quantity} mailia", + "square_feet": "{quantity} neliöjalkaa", + "square_miles": "{quantity} neliömailia", + "acres": "{quantity} eekkeriä", "meters": "{quantity} m", "kilometers": "{quantity} km", "square_meters": "{quantity} m²", "square_kilometers": "{quantity} km²", + "hectares": "{quantity} ha", + "area_pair": "{area1} ({area2})", + "arcdegrees": "{quantity}°", "north": "P", "south": "E", "east": "I", diff --git a/dist/locales/he.json b/dist/locales/he.json index 573e53146..5c74e4817 100644 --- a/dist/locales/he.json +++ b/dist/locales/he.json @@ -558,6 +558,11 @@ "notes": { "tooltip": "נתוני הערה מ־OpenStreetMap", "title": "הערות OpenStreetMap" + }, + "custom": { + "tooltip": "ניתן לגרור ולהשליך קובץ נתונים לעמוד או ללחוץ על הכפתור כדי להגדיר", + "title": "נתוני מפה בהתאמה אישית", + "zoom": "התקרבות לנתונים" } }, "fill_area": "אזורי מילוי", @@ -638,6 +643,19 @@ "template": { "placeholder": "נא להקליד תבנית כתובת" } + }, + "custom_data": { + "tooltip": "עריכת שכבת נתונים בהתאמה אישית", + "header": "הגדרות נתוני מפה בהתאמה אישית", + "file": { + "instructions": "נא לבחור בקובץ נתונים מקומי. הסוגים הנתמכים הם:\n ‎.gpx, .kml, .geojson, .json", + "label": "עיון בקבצים" + }, + "or": "או", + "url": { + "instructions": "נא להקליד כתובת קובץ נתונים או תבנית כתובת אריחים וקטוריים. ממלאי המקום הזמינים הם:\n{zoom} או {z}, {x}, {y} עבור סכמת אריחים Z/X/Y", + "placeholder": "נא להקליד כתובת" + } } }, "restore": { @@ -4980,6 +4998,10 @@ "name": "גשר", "terms": "גשר" }, + "man_made/bunker_silo": { + "name": "בור תחמיץ", + "terms": "מבנה תחמיץ מבטון, ממגורה, סילו, מתבן, אסם" + }, "man_made/chimney": { "name": "ארובה", "terms": "ארובה" @@ -6876,6 +6898,23 @@ }, "name": "טיולים ואופניים" }, + "kelkkareitit": { + "attribution": { + "text": "‎© Kelkkareitit.fi" + }, + "description": "Kelkkareitit.fi מסלולי תחבורה בשלג מ־OSM (כיסוי נורדי)", + "name": "שכבת מסלולי שלג נורדיים" + }, + "lantmateriet-orto1960": { + "attribution": { + "text": "‎© Lantmäteriet, CC0" + } + }, + "lantmateriet-orto1975": { + "attribution": { + "text": "‎© Lantmäteriet, CC0" + } + }, "mapbox_locator_overlay": { "attribution": { "text": "תנאים ומשוב" @@ -6925,6 +6964,13 @@ }, "name": "skobbler" }, + "skoterleder": { + "attribution": { + "text": "‎© Skoterleder.org" + }, + "description": "מסלולי תחבורת שלג", + "name": "מפת תחבורת שלג בשוודיה" + }, "stamen-terrain-background": { "attribution": { "text": "אריחי מפה מאת Stamen Design, ברישיון CC BY 3.0. הנתונים מאת OpenStreetMap, תחת ODbL" @@ -7712,6 +7758,11 @@ "name": "הטוויטר של OpenStreetMap ברזיל", "description": "ניתן לעקוב אחרינו בטוויטר בכתובת {url}" }, + "RS-telegram": { + "name": "קבוצת הטלגרם של OpenStreetMap ריו גראנדה דו סול", + "description": "ניתן להצטרף לקהילת OpenStreetMap ריו גראנדה דו סול בטלגרם", + "extendedDescription": "ניתן להצטרף לקהילה וללמוד עוד על OpenStreetMap, לשאול שאלות או להשתתף במפגשים שלנו. כולם מוזמנים!" + }, "OSM-CL-facebook": { "name": "הפייסבוק של OpenStreetMap צ׳ילה", "description": "ניתן להצטרף לקהילה של OpenStreetMap צ׳ילה בפייסבוק", diff --git a/dist/locales/ja.json b/dist/locales/ja.json index 39cca50f9..f2cd882f4 100644 --- a/dist/locales/ja.json +++ b/dist/locales/ja.json @@ -3126,7 +3126,7 @@ }, "amenity/childcare": { "name": "保育所", - "terms": "保育園, 幼稚園, チャイルドケア, ナーセリー, 育児" + "terms": "保育園, 幼稚園, チャイルドケア, ナーセリー, 育児, 学童保育" }, "amenity/cinema": { "name": "映画館", @@ -3264,11 +3264,11 @@ }, "amenity/motorcycle_parking": { "name": "オートバイの駐車場", - "terms": "バイクの駐車場, 二輪駐車場, 二輪駐輪場, 駐車場, 駐輪場" + "terms": "バイクの駐車場, 二輪駐車場, 二輪駐輪場, 駐車場, 駐輪場, オートバイ, モーターサイクル" }, "amenity/music_school": { "name": "音楽学校", - "terms": "音楽学校, ミュージック・スクール, 教習所, カラオケ教室, 音楽教室, 学校, 教育, 教室, 訓練, 練習, 稽古, 習い事, トレーニング" + "terms": "音楽学校, ミュージック・スクール, 教習所, カラオケ教室, 音楽教室, 学校, 教育, 教室, 訓練, 練習, 稽古, 習い事, トレーニング, ギター教室, ピアノ教室" }, "amenity/nightclub": { "name": "ナイトクラブ", @@ -3283,7 +3283,7 @@ }, "amenity/parking_entrance": { "name": "出入口(駐車場)", - "terms": "駐車場の出入口, 自動車, 出入り口, 出入口" + "terms": "駐車場の出入口, 自動車, 出入り口, 出入口, 駐車場" }, "amenity/parking_space": { "name": "駐車区画(1台ごとの)", @@ -3370,12 +3370,12 @@ "terms": "レンジャーの詰所, レンジャーステーション, 救命" }, "amenity/recycling": { - "name": "リサイクル容器", - "terms": "リサイクル容器" + "name": "リサイクルボックス", + "terms": "リサイクル容器, リサイクルボックス, 廃棄物, 再生利用, 資源ごみ, 資源ゴミ, ゴミ, ごみ, リサイクル箱, 公園" }, "amenity/recycling_centre": { "name": "リサイクルセンター", - "terms": "リサイクルセンター" + "terms": "リサイクルセンター, 廃棄物, 再生利用, 資源ごみ, 資源ゴミ, ゴミ, ごみ, 廃棄物処理施設, 廃棄物保管施設" }, "amenity/register_office": { "name": "登記所" @@ -3401,7 +3401,7 @@ }, "amenity/shower": { "name": "シャワー室", - "terms": "シャワールーム" + "terms": "シャワールーム, シャワー, 海水浴, プール" }, "amenity/smoking_area": { "name": "喫煙所", @@ -3432,7 +3432,7 @@ "terms": "スタジオ, 番組製作, 音楽" }, "amenity/swimming_pool": { - "name": "遊泳プール" + "name": "遊泳プール(旧)" }, "amenity/taxi": { "name": "タクシー乗り場", @@ -3519,7 +3519,7 @@ }, "amenity/vending_machine/parking_tickets": { "name": "パーキングチケット発給機", - "terms": "パーキングチケット, パーキングメーター, 駐車券, 券売機, 自動券売機, 自動販売機, 自販機, 自動発券機, 発券機, 駐車場" + "terms": "パーキングチケット, パーキングメーター, 駐車券, 券売機, 自動券売機, 自動販売機, 自販機, 自動発券機, 発券機, 駐車場, 自動車" }, "amenity/vending_machine/public_transport_tickets": { "name": "切符販売機", @@ -3543,15 +3543,15 @@ }, "amenity/waste_basket": { "name": "ゴミ箱", - "terms": "ゴミ箱, ごみ箱, 公園" + "terms": "ゴミ箱, ごみ箱, 公園, 廃棄物" }, "amenity/waste_disposal": { "name": "ゴミ収集ボックス", - "terms": "ゴミステーション, ゴミ集積所, ゴミ捨て場, ゴミ置き場, ゴミ, ゴミ箱, ゴミコンテナ, ゴミ回収, ダストボックス, ごみ, 公園" + "terms": "ゴミステーション, ゴミ集積所, ゴミ捨て場, ゴミ置き場, ゴミ, ゴミ箱, ゴミコンテナ, ゴミ回収, ダストボックス, ごみ, 公園, 廃棄物, ごみ置き場, ごみ箱, ごみ集積所" }, "amenity/waste_transfer_station": { "name": "ゴミ集積場", - "terms": "ゴミ集積場,ゴミ積替所" + "terms": "ゴミ集積場, ゴミ積替所, 廃棄物, ごみ, 廃棄物処理施設, 廃棄物保管施設" }, "amenity/water_point": { "name": "キャンピングカー用の給水施設", @@ -4434,7 +4434,7 @@ }, "highway/service/parking_aisle": { "name": "駐車場内通路", - "terms": "駐車場内通路, 駐車場通路, 通路, 車道" + "terms": "駐車場内通路, 駐車場通路, 通路, 車道, 駐車場" }, "highway/services": { "name": "サービスエリア", @@ -4721,7 +4721,7 @@ }, "leisure/adult_gaming_centre": { "name": "遊技場(成人向け)", - "terms": "遊技場, パチンコ, パチスロ, スロット, 娯楽, アダルト, レジャー, パチンコ店, パチンコ屋, スロットマシン, ギャンブル" + "terms": "遊技場, パチンコ, パチスロ, スロット, 娯楽, アダルト, レジャー, パチンコ店, パチンコ屋, スロットマシン, ギャンブル, ゲーム, 遊戯場" }, "leisure/amusement_arcade": { "name": "ゲームセンター", @@ -4760,8 +4760,8 @@ "terms": "ドッグパーク, ドッグラン, 犬, 動物, ペット" }, "leisure/firepit": { - "name": "焚火", - "terms": "焚火,キャンプファイヤー, アウトドア" + "name": "焚火場", + "terms": "焚火,キャンプファイヤー, アウトドア, 焚火場, 焚き火, キャンプ" }, "leisure/fitness_centre": { "name": "ジム/フィットネスセンター", @@ -4945,7 +4945,7 @@ }, "leisure/sauna": { "name": "サウナ", - "terms": "サウナ, 娯楽, 風呂, お風呂" + "terms": "サウナ, 娯楽, 風呂, お風呂, サウナ風呂" }, "leisure/slipway": { "name": "進水路", @@ -4956,16 +4956,16 @@ "terms": "スポーツセンター, 複合施設, 運動, 競技, トレーニング, 練習, 訓練, 体操" }, "leisure/sports_centre/swimming": { - "name": "スイミングプール施設", - "terms": "遊泳プール, プール, 水泳場, スポーツ, 運動, 競技" + "name": "遊泳プール(屋内)", + "terms": "遊泳プール, プール, 水泳場, スポーツ, 運動, 競技, スポーツセンター, 屋内プール, 娯楽, 水浴び, 水遊び, 競泳" }, "leisure/stadium": { "name": "スタジアム", "terms": "スタジアム, 競技場, 娯楽" }, "leisure/swimming_pool": { - "name": "遊泳プール", - "terms": "遊泳プール, プール, 水泳場, 娯楽" + "name": "遊泳プール(屋外)", + "terms": "遊泳プール, プール, 水泳場, 娯楽, 屋外プール, 競技, スポーツ, 運動, 水浴び, 水遊び, 競泳" }, "leisure/track": { "name": "競技トラック(モータースポーツ以外)", @@ -5283,7 +5283,7 @@ }, "office/charity": { "name": "慈善団体", - "terms": "慈善団体" + "terms": "慈善団体, 寄贈, 寄付" }, "office/company": { "name": "会社", @@ -5458,7 +5458,7 @@ }, "place/square": { "name": "広場(都心部)", - "terms": "広場, スクエア" + "terms": "広場, スクエア, ひろば" }, "place/suburb": { "name": "区", @@ -5910,7 +5910,7 @@ }, "shop/bed": { "name": "寝具店", - "terms": "ベッド店, マットレス店, 寝具店, 家具, 枕, ふとん, 布団, ふとん店" + "terms": "ベッド店, マットレス店, 寝具店, 家具, 枕, ふとん, 布団, ふとん店, ベッド" }, "shop/beverages": { "name": "飲料店", @@ -5958,7 +5958,7 @@ }, "shop/charity": { "name": "チャリティーショップ", - "terms": "スリフトショップ" + "terms": "スリフトショップ, チャリティ店, チャリティ販売店, 慈善販売店, 慈善活動, 寄贈, 寄付" }, "shop/cheese": { "name": "チーズ店", @@ -6010,7 +6010,7 @@ }, "shop/dairy": { "name": "乳製品店", - "terms": "日配品店, 食品, 食べ物" + "terms": "乳製品店, 食品, 食べ物, 牛乳, チーズ, バター" }, "shop/deli": { "name": "惣菜屋", @@ -6115,12 +6115,12 @@ "terms": "音響機器店, オーディオ店, 音楽" }, "shop/houseware": { - "name": "生活雑貨店", - "terms": "雑貨屋, 家庭用品, 日用雑貨, バス用品, 寝具, ベッド, お風呂用品" + "name": "家庭用品店", + "terms": "雑貨屋, 家庭用品, 日用雑貨, バス用品, お風呂用品, 台所用品, キッチン用品, 生活雑貨, 料理道具, 調理器具, 食器, クッション, 茶碗, 皿, 包丁, ナイフ, フォーク, 箸" }, "shop/interior_decoration": { - "name": "室内装飾店", - "terms": "インテリアショップ, 家具" + "name": "インテリアショップ", + "terms": "インテリアショップ, 家具, 室内装飾用品店, 内装用品店, インテリア店, 住宅, インテリア, 内装" }, "shop/jewelry": { "name": "宝石店", @@ -6159,8 +6159,8 @@ "terms": "マッサージ店, マッサージ, あんま, 指圧, 健康" }, "shop/medical_supply": { - "name": "医療器具店", - "terms": "医療器具店" + "name": "健康・医療器具店", + "terms": "医療器具店, 医療用品店, 健康器具店, ヘルスケア, 健康, 医療" }, "shop/mobile_phone": { "name": "携帯電話店", @@ -6180,7 +6180,7 @@ }, "shop/music": { "name": "CD/レコード店", - "terms": "CD店, レコード店, 音楽" + "terms": "CD店, レコード店, 音楽, 音楽店" }, "shop/musical_instrument": { "name": "楽器店", @@ -6224,7 +6224,7 @@ }, "shop/pet": { "name": "ペットショップ", - "terms": "ペット売り場, ペット, 家禽, ペットショップ, 動物, 愛玩動物" + "terms": "ペット売り場, ペット, 家禽, ペットショップ, 動物, 愛玩動物, ペット用品店" }, "shop/pet_grooming": { "name": "ペット美容室", @@ -6256,7 +6256,7 @@ }, "shop/second_hand": { "name": "リサイクルショップ", - "terms": "古物商, リユースショップ, 中古" + "terms": "古物商, リユースショップ, 中古, リサイクルショップ, 中古屋, リサイクル, リユース" }, "shop/shoes": { "name": "靴店", @@ -6334,8 +6334,8 @@ "terms": "ビデオソフト店, DVD店, 娯楽" }, "shop/video_games": { - "name": "テレビゲーム店", - "terms": "テレビゲーム店, ビデオゲーム, 娯楽" + "name": "テレビゲーム販売店", + "terms": "テレビゲーム店, ビデオゲーム, 娯楽, ゲーム, テレビゲーム販売店, ゲームソフト, テレビゲーム" }, "shop/watches": { "name": "腕時計店", diff --git a/dist/locales/nl.json b/dist/locales/nl.json index f67cea375..a36c61a58 100644 --- a/dist/locales/nl.json +++ b/dist/locales/nl.json @@ -430,7 +430,10 @@ "edited_by": "Aangepast door", "changeset": "Wijzigingenset", "unknown": "Onbekend", - "link_text": "Geschiedenis op openstreetmap.org" + "link_text": "Geschiedenis op openstreetmap.org", + "note_comments": "Commentaar", + "note_created_date": "Aanmaakdatum", + "note_created_user": "Aangemaakt door" }, "location": { "key": "L", @@ -1446,6 +1449,9 @@ "permissive": { "title": "Privéterrein maar gebruik toegelaten door eigenaar" }, + "permit": { + "title": "Toestaan" + }, "private": { "title": "Privé" }, @@ -6876,7 +6882,7 @@ }, "community": { "bw-facebook": { - "name": "Mapping Botswana op Facebook", + "name": "Botswana mappen op Facebook", "description": "Pagina van OpenStreetMap in Botswana" }, "bw-twitter": { @@ -7432,7 +7438,8 @@ }, "OSM-CL-facebook": { "name": "Facebook", - "description": "Neem deel aan de OpenStreetMap Chili community op Facebook" + "description": "Neem deel aan de OpenStreetMap Chili community op Facebook", + "extendedDescription": "Sluit je aan bij onze gemeenschap om meer te leren over OpenStreetMap, om vragen te stellen of om deel te nemen aan onze besprekingen. Iedereen is welkom!" }, "OSM-CL-mailinglist": { "name": "Talk-cl Mailinglijst", @@ -7440,7 +7447,8 @@ }, "OSM-CL-telegram": { "name": "OpenStreetMap Chili Telegram", - "description": "OpenStreetMap Chili op Telegram" + "description": "OpenStreetMap Chili op Telegram", + "extendedDescription": "Sluit je aan bij onze gemeenschap om meer te leren over OpenStreetMap, om vragen te stellen of om deel te nemen aan onze besprekingen. Iedereen is welkom!" }, "OSM-CL-twitter": { "name": "OpenStreetMap Chili Twitter", @@ -7472,12 +7480,22 @@ "OSM-PE-telegram": { "name": "OpenStreetMap Peru Telegram" }, + "OSM-Facebook": { + "name": "OpenStreetMap op Facebook" + }, "OSM-Reddit": { "name": "OpenStreetMap op Reddit", "description": "Op /r/openstreetmap/ vind een levendige dialoog plaats over OpenStreetMap. Hier kun je alles vragen!" }, "OSM-Telegram": { "name": "OpenStreetMap Telegram" + }, + "OSMF": { + "events": { + "sotm2018": { + "where": "Milaan, Italië" + } + } } } } diff --git a/dist/locales/pl.json b/dist/locales/pl.json index 713dada5c..2b20a6c07 100644 --- a/dist/locales/pl.json +++ b/dist/locales/pl.json @@ -558,6 +558,11 @@ "notes": { "tooltip": "Uwagi z OpenStreetMap", "title": "Uwagi OpenStreetMap" + }, + "custom": { + "tooltip": "Przeciągnij i upuść plik danych na stronę lub kliknij przycisk, aby ustawić", + "title": "Własne dane mapy", + "zoom": "Powiększ do danych" } }, "fill_area": "Wypełnianie obszarów", @@ -638,6 +643,19 @@ "template": { "placeholder": "Wprowadź szablon url" } + }, + "custom_data": { + "tooltip": "Edytuj własną warstwę danych", + "header": "Ustawienia własnych danych mapy", + "file": { + "instructions": "Wybierz lokalny plik danych. Wspierane typy, to:\n .gpx, .kml, .geojson, .json", + "label": "Przeglądaj pliki" + }, + "or": "Lub", + "url": { + "instructions": "Wprowadź URL do pliku danych lub szablonu wektorowych kafelków. Poprawne adresy to:\n {zoom} lub {z}, {x}, {y} lub Z/X/Y dla kafelków.", + "placeholder": "Wprowadź adres URL" + } } }, "restore": { @@ -2256,7 +2274,7 @@ "placeholder": "0, 1, 2, 3..." }, "name": { - "label": "Nazwa", + "label": "Nazwa [~s dla litery ś]", "placeholder": "Powszechna nazwa własna (tylko jeśli istnieje)" }, "natural": { diff --git a/dist/locales/pt-BR.json b/dist/locales/pt-BR.json index 7fad78e36..877948580 100644 --- a/dist/locales/pt-BR.json +++ b/dist/locales/pt-BR.json @@ -558,6 +558,11 @@ "notes": { "tooltip": "Observe as notas no OpenStreetMap", "title": "Notas do OpenStreetMap" + }, + "custom": { + "tooltip": "Arraste e solte um arquivo de dados na página ou clique no botão para configurar", + "title": "Dados de mapa personalizados", + "zoom": "Zoom para dados" } }, "fill_area": "Areas de Preenchimento", @@ -638,6 +643,19 @@ "template": { "placeholder": "Insira um modelo de URL" } + }, + "custom_data": { + "tooltip": "Editar camada de dados personalizada", + "header": "Configurações de dados do mapa personalizado", + "file": { + "instructions": "Escolha um arquivo de dados local. Tipos suportados são:\n .gpx, .kml, .geojson, .json", + "label": "Procurar arquivos" + }, + "or": "Ou", + "url": { + "instructions": "Insira um URL de arquivo de dados ou um modelo de URL de tile de vetor. Tokens válidos são:\n {zoom} ou {z}, {x}, {y} para esquema de telha de Z/X/Y ", + "placeholder": "Insira um URL" + } } }, "restore": { @@ -1695,7 +1713,7 @@ "placeholder": "50, 100, 200..." }, "cash_in": { - "label": "Dinheiro em" + "label": "Depósito" }, "castle_type": { "label": "Tipo" @@ -2204,7 +2222,7 @@ "placeholder": "40, 50, 60..." }, "maxspeed/advisory": { - "label": "Limite de Velocidade Consultivo", + "label": "Limite de Velocidade Recomendado", "placeholder": "40, 50, 60..." }, "maxstay": { @@ -2353,7 +2371,7 @@ } }, "passenger_information_display": { - "label": "Exposição de informação do passageiro" + "label": "Painel de informações" }, "payment_multi": { "label": "Tipos de Pagamento" @@ -2588,7 +2606,7 @@ "label": "Tipo" }, "site_type": { - "label": "Tipo de site" + "label": "Tipo de local" }, "smoking": { "label": "Fumantes", @@ -3062,7 +3080,8 @@ "terms": "Bicicleta, Ciclismo, Reparo, Oficina de Bicicletas" }, "amenity/biergarten": { - "name": "Biergarten" + "name": "Biergarten", + "terms": "cerveja, cerva, birra, cervejaria," }, "amenity/boat_rental": { "name": "Aluguel de Barcos", @@ -3650,7 +3669,7 @@ }, "barrier/kerb": { "name": "Meio-fio", - "terms": "Freio" + "terms": "meio fio, guia, calçada" }, "barrier/kissing_gate": { "name": "Quebra Corpo", @@ -4276,8 +4295,8 @@ "terms": "Hipovia, Picadeiro, Caminho para Cavalgada, calvagada, Trilha de Equitação, cavalo, hipismo" }, "highway/bus_guideway": { - "name": "Guideway de ônibus", - "terms": "Guiamento de ônibus" + "name": "Ônibus Guiado", + "terms": "Ônibus guiado, trilho de ônibus, via exclusiva de ônibus,tróleibus guiado, carril de ônibus" }, "highway/bus_stop": { "name": "Parada de ônibus / Plataforma" @@ -4340,7 +4359,7 @@ }, "highway/passing_place": { "name": "Lugar de passagem", - "terms": "Lugar de passagem" + "terms": "Lugar de ultrapassagem" }, "highway/path": { "name": "Caminho Informal", @@ -4567,7 +4586,7 @@ }, "landuse/garages": { "name": "Uso da terra da garagem", - "terms": "Uso da terra de garagem" + "terms": "garagem, estacionamento," }, "landuse/grass": { "name": "Gramado", @@ -4591,7 +4610,7 @@ }, "landuse/industrial/scrap_yard": { "name": "Ferro-Velho", - "terms": "Pátio de sucata" + "terms": "Pátio de sucata, sucata, metal, ferro velho" }, "landuse/industrial/slaughterhouse": { "name": "Matadouro", @@ -4675,7 +4694,7 @@ }, "landuse/religious": { "name": "Área Religiosa", - "terms": "Área Religiosa" + "terms": "Área Religiosa, igreja, religião, culto, terreiro, mesquita, sinagoga," }, "landuse/residential": { "name": "Área residencial", @@ -4703,7 +4722,7 @@ }, "leisure/beach_resort": { "name": "Resort em Praia", - "terms": "Resort na praia" + "terms": "Resort na praia, praia, mar, hotel, hospedagem" }, "leisure/bird_hide": { "name": "Local de observação de pássaros", @@ -4711,7 +4730,7 @@ }, "leisure/bleachers": { "name": "Arquibancada simples", - "terms": "Arquibancadas" + "terms": "Arquibancadas, esporte, estádio, ginásio, platéia" }, "leisure/bowling_alley": { "name": "Pista de Boliche", @@ -4727,7 +4746,7 @@ }, "leisure/dancing_school": { "name": "Escola de Dança", - "terms": "Escola de dança" + "terms": "Escola de dança, swing, tango, jazz, dança, baile, forró, samba" }, "leisure/dog_park": { "name": "Cachorródromo", @@ -4751,11 +4770,11 @@ }, "leisure/fitness_station/balance_beam": { "name": "Trave de Equilíbrio", - "terms": "Feixe de Equilíbrio de Exercício" + "terms": "Equilíbrio, atividade física, academia, ginástica" }, "leisure/fitness_station/box": { "name": "Caixa de exercício", - "terms": "Caixa de exercício" + "terms": "Caixa de exercício, ginástica, academia, pular," }, "leisure/fitness_station/horizontal_bar": { "name": "Barra Fixa Horizontal" @@ -5428,7 +5447,7 @@ "terms": "vila, povoado, distrito, aldeia" }, "playground/balance_beam": { - "name": "Jogar saldo de feixe" + "name": "Tronco de equilíbrio" }, "playground/basket_spinner": { "name": "Girador de cesta" @@ -5655,7 +5674,7 @@ "name": "Local de parada de ônibus" }, "public_transport/stop_position_ferry": { - "name": "Localização de parada de balsa " + "name": "Ponto de parada de balsa " }, "public_transport/stop_position_light_rail": { "name": "Local de parada do VLT" diff --git a/dist/locales/pt.json b/dist/locales/pt.json index 84a7b8337..51ca5b503 100644 --- a/dist/locales/pt.json +++ b/dist/locales/pt.json @@ -4409,8 +4409,8 @@ "terms": "Relva, Grama" }, "landuse/greenfield": { - "name": "Terreno com loteamento planeado", - "terms": "loteamento" + "name": "Terreno com loteamento planeado ", + "terms": "loteamento, terreno para obras, terreno para construção" }, "landuse/greenhouse_horticulture": { "name": "Estufa Horticultura" @@ -4539,8 +4539,8 @@ "terms": "Bowling Alley, Bowling, Boulingue, Bólingue, boliche" }, "leisure/common": { - "name": "Terreno Baldio", - "terms": "Common, Baldio, Baldios" + "name": "baldio (terrenos de propriedade colectiva utilizados pela comunidade)", + "terms": "baldio, propriedade colectiva, terreno sem dono, terreno sem proprietário, terreno sem titular" }, "leisure/dance": { "name": "Salão de dança", @@ -4974,7 +4974,7 @@ }, "natural/scrub": { "name": "Matagal", - "terms": "Scrub" + "terms": "matagal, terreno sem uso, terreno com matagal, terreno com mato, matos, terreno abandonado" }, "natural/spring": { "name": "Nascente de água", diff --git a/dist/locales/ru.json b/dist/locales/ru.json index 8e162bb4a..b414e3575 100644 --- a/dist/locales/ru.json +++ b/dist/locales/ru.json @@ -652,7 +652,7 @@ }, "or": "Или", "url": { - "instructions": "Введите URL файла с данными или шаблон URL для векторных тайлов. Допустимы переменные:\n {zoom} или {z}, {x}, {y} для схемы тайлов Z/X/Y", + "instructions": "Введите URL файла с данными или шаблон URL для векторных тайлов. Корректные токены:\n {zoom} или {z}, {x}, {y} для схемы тайлов Z/X/Y", "placeholder": "Введите URL" } } diff --git a/dist/locales/sq.json b/dist/locales/sq.json index 6a28f7929..2b3f12fcb 100644 --- a/dist/locales/sq.json +++ b/dist/locales/sq.json @@ -123,7 +123,20 @@ "multiple": "U fshin {n} karakteristika." }, "too_large": { - "single": "Kjo karakteristik s'mund fshihet se pse s'është e mjaftueshme të dukshme." + "single": "Kjo karakteristikë s'mund fshihet se pse s'është e mjaftueshme të dukshme.", + "multiple": "Këto karakteristika nuk mund të fshihen sepse nuk janë mjatueshëm të dukshme." + }, + "incomplete_relation": { + "single": "Kjo karakteristikë nuk mund të fshihet sepse nuk është shkarkuar plotësisht.", + "multiple": "Këto karakteristika nuk mund të fshihen sepse nuk janë shkarkuar plotësisht." + }, + "part_of_relation": { + "single": "Kjo karakteristikë nuk mund të fshihet sepse është pjesë e një relacioni më të madh. Duhet ta hiqni nga relacioni ku bën pjesë fillimisht.", + "multiple": "Këto karakteristika nuk mund të fshihen sepse ato janë pjesë të një relacioni më të madh. Ju duhet ti fshini ato nga relacioni fillimisht." + }, + "connected_to_hidden": { + "single": "Kjo karakteristikë nuk mund të fshihet pasi është e lidhur me një karakteristikë të fshehur.", + "multiple": "Këto karakteristika nuk mund të fshihen pasi janë të lidhura me karakteristika të fshehura." } }, "connect": { @@ -144,7 +157,9 @@ }, "merge": { "title": "Bashko", + "description": "Bashkojini këto karakteristika.", "key": "C", + "annotation": "U bashkuan {n} karakteristika.", "not_eligible": "Këto tipare nuk mund të bashkohen.", "incomplete_relation": "Këto tipare nuk mund të bashkohen sepse të paktën një nuk është shkarkuar plotësisht." }, @@ -158,6 +173,12 @@ "area": "U lëviz një sipërfaqe." } }, + "reflect": { + "key": { + "long": "T", + "short": "Y" + } + }, "rotate": { "title": "Rotullo", "key": "R", @@ -194,6 +215,23 @@ "create": "U shtu një kufizim kthesësh.", "delete": "U fshi një kufizim kthesësh." } + }, + "detach_node": { + "key": "E" + } + }, + "restriction": { + "controls": { + "distance": "Distancë", + "via_node_only": "Vetëm pika" + }, + "help": { + "from": "NGA", + "from_name": "{from} {fromName}", + "from_name_to_name": "{from} {fromName} {to} {toName}", + "via_names": "{via} {viaNames}", + "select_from_name": "Klikoni të përzgjidhni {from} {fromName}", + "toggle": "Klikoni për \"{turn}\"" } }, "undo": { @@ -210,7 +248,12 @@ "localized_translation_language": "Zgjidhni gdjuhën", "localized_translation_name": "Emër" }, - "loading_auth": "Lidh me OpenStreetMap...", + "zoom_in_edit": "Zmadhoni për të edituar", + "login": "Kyçuni", + "logout": "Dilni", + "loading_auth": "Duke u lidhur me OpenStreetMap...", + "report_a_bug": "Raportoni një problematikë", + "help_translate": "Ndihmoni në përkthim", "feature_info": { "hidden_warning": "{count} tipare të fshehura", "hidden_details": "Këto tipare janë aktualisht të fshehura: {details}" @@ -218,28 +261,85 @@ "status": { "error": "Pa mundësi të lidhet me API-n.", "offline": "API-ja është jashtë linje. Ju lutemi provoni të redaktoni më von.", - "readonly": "API-ja është vetëm për lexim. Duhet prisni për të kryer ndryshimet." + "readonly": "API-ja është vetëm për lexim. Duhet prisni për të kryer ndryshimet.", + "rateLimit": "API-ja po limiton lidhjet anonime. Ju mund ta rregulloni këtë duke u kyçur." }, "commit": { + "title": "Ngarkoni në OpenStreetMap", "upload_explanation": "Redaktimet qe ju ngarkoni do jen të dukshëm në të gjithë hartat që përdorin të dhëna OpenStreetMap.", "upload_explanation_with_user": "Redaktimet qe ju ngarkoni si {user} do jen të dukshëm në të gjithë hartat që përdorin të dhëna OpenStreetMap.", + "request_review": "Unë do doja që dikush ti rishikonte editimet e mia", + "save": "Ngarkoni", "cancel": "Anullo", "changes": "{count} Ndryshime", "warnings": "Paralajmërime", "modified": "Modifikuar", "deleted": "Fshirë", - "created": "Krijuar" + "created": "Krijuar", + "about_changeset_comments": "Rreth komenteve për ndryshimet", + "about_changeset_comments_link": "//wiki.openstreetmap.org/wiki/Good_changeset_comments", + "google_warning": "Ju përmendët Google në këtë koment: mos harroni se të kopjuarit nga Google Maps është rreptësisht e ndaluar.", + "google_warning_link": "https://www.openstreetmap.org/copyright" }, "contributors": { "list": "Redaktime nga {users}", "truncated_list": "Redaktime nga {users} dhe {count} të tjerë" }, + "info_panels": { + "key": "I", + "background": { + "key": "B", + "zoom": "Zmadhoni", + "source": "Burim", + "description": "Përshkrim", + "resolution": "Rezolucion", + "accuracy": "Saktësi", + "unknown": "E panjohur" + }, + "history": { + "key": "H", + "title": "Historia", + "selected": "{n} të përzgjedhur", + "no_history": "Ska historik (Karakteristikë e re)", + "version": "Version", + "last_edit": "Editimi i fundit", + "edited_by": "Edituar nga", + "unknown": "I panjohur", + "link_text": "Historia në openstreetmap.org", + "note_no_history": "Ska historik (Shënim i ri)", + "note_comments": "Komentet", + "note_created_date": "Data e krijimit", + "note_created_user": "Krijuar nga", + "note_link_text": "Shënim në openstreetmap.org" + }, + "location": { + "key": "L", + "title": "Vendndodhje", + "unknown_location": "Vendndodhje e panjohur" + }, + "measurement": { + "key": "M", + "title": "Matje", + "selected": "{n} të përzgjedhur", + "geometry": "Gjeometri", + "closed_line": "vijë e mbyllur", + "closed_area": "sipërfaqe e mbyllur", + "center": "Qendër", + "perimeter": "Perimetër", + "length": "Gjatësi", + "area": "Sipërfaqe", + "location": "Vendndodhje", + "metric": "Metrik", + "node_count": "Numri i nyjeve" + } + }, "geometry": { "point": "pik", "vertex": "tepe", "line": "vijë", "area": "sipërfaqe", - "relation": "lidhje" + "relation": "lidhje", + "note": "shënim" }, "geocoder": { "search": "Kërkoni të gjithë botën...", @@ -254,6 +354,7 @@ "no_documentation_key": "Nuk ka dokumentim disponueshëm për këte çelës", "show_more": "Paraqit më tepër", "view_on_osm": "Shiko në openstreetmap.org", + "all_fields": "Të gjithë fushat", "all_tags": "Të gjithë etiketat", "all_members": "Të gjithë anëtarët", "all_relations": "Të gjithë lidhjet", @@ -265,13 +366,23 @@ "back_tooltip": "Ndrysho tiparin", "remove": "Hiq", "search": "Kërko", + "multiselect": "Karakteristikat e përzgjedhura", "unknown": "I panjohur", + "incomplete": "", "feature_list": "Kërko tiparet", "edit": "Redakto tiparin", "check": { "yes": "Po", - "no": "Jo" + "no": "Jo", + "reverser": "Ndryshoni Drejtimin" }, + "radio": { + "structure": { + "type": "Tipi", + "layer": "Shtresë" + } + }, + "add": "Shto", "none": "Asnjë", "node": "Nyjë", "way": "Linjë", @@ -282,11 +393,224 @@ "background": { "title": "Sfond", "description": "Parametrat e sfondit", + "key": "B", + "backgrounds": "Sfondet", "none": "Asnjë", + "switch": "Rikthehuni tek ky sfond", "custom": "E personalizuar", "reset": "Rikthe vlerat", + "brightness": "Ndriçimi", + "contrast": "Kontrast", + "sharpness": "Mprehtësia", "minimap": { - "tooltip": "Shfaq një hartë të zvogluar për të treguar vendosjen e zonës të dukshme." + "description": "Shfaq një hartë të zvogëluar", + "tooltip": "Shfaq një hartë të zvogluar për të treguar vendosjen e zonës të dukshme.", + "key": "/" + } + }, + "map_data": { + "title": "Të dhënat e hartës", + "description": "Të dhënat e hartës", + "key": "F", + "layers": { + "osm": { + "tooltip": "Të dhënat e hartës nga OpenStreetMap" + }, + "notes": { + "title": "shënimet e OpenStreetMap" + } + } + }, + "feature": { + "points": { + "description": "Pikat", + "tooltip": "Pikat e interesit" + }, + "traffic_roads": { + "tooltip": "Hekurudha, Rrugë, etj." + }, + "paths": { + "description": "Shtigje", + "tooltip": "Trotuare, Rrugë këmbësorësh, Rrugë biçikletash, etj." + }, + "buildings": { + "description": "Ndërtesat", + "tooltip": "Ndërtesat, Strehat, Garazhdet, etj." + }, + "boundaries": { + "description": "Kufijtë", + "tooltip": "Kufijtë Administrativë" + }, + "water": { + "tooltip": "Lumenj, Liqene, Pellgje, Basenet, etj." + }, + "rail": { + "tooltip": "Hekurudhat" + }, + "others": { + "description": "Të tjera", + "tooltip": "Çdo gjë tjetër" + } + }, + "area_fill": { + "wireframe": { + "key": "W" + } + }, + "settings": { + "custom_data": { + "file": { + "label": "Shfletoni skedarët" + }, + "or": "Ose", + "url": { + "placeholder": "Vendosni një url" + } + } + }, + "restore": { + "heading": "Ju keni ndryshime të paruajtura" + }, + "save": { + "title": "Ruaj", + "help": "Rishikoni ndryshimet tuaja dhe ngarkojini ato në OpenStreetMap, duke i bërë ato të dukshme tek përdoruesit e tjerë.", + "no_changes": "Ska ndryshime për t'u ruajtur.", + "unknown_error_details": "Ju lutem sigurohuni që jeni të lidhur me internetin.", + "uploading": "Duke ngarkuar ndryshimet në OpenStreetMap...", + "conflict_progress": "Duke kontrolluar për konflikte: {num} nga {total}", + "unsaved_changes": "Ju keni ndryshime të paruajtura", + "conflict": { + "count": "Konflikt {num} nga {total}", + "previous": "< I mëparshëm", + "next": "I ardhshëm >", + "keep_local": "Ruaj timen", + "keep_remote": "Përdor të tyren", + "done": "Të gjitha konfliktet u zgjidhën!", + "help": "Një përdorues tjetër ka ndryshuar disa karkteristika të hartës që ju ndryshuat.\nKlikoni në çdo karakteristikë më poshtë për të parë më shumë detaje rreth konfliktit, dhe përzgjidhni të mbani\nndryshimet tuaja ose ndryshimet e përdoruesit tjetër.\n" + } + }, + "merge_remote_changes": { + "conflict": { + "deleted": "Kjo karakteristikë u fshi nga {user}." + } + }, + "success": { + "just_edited": "Ju sapo edituat në OpenStreetMap!", + "thank_you": "Faleminderit për përmirësimin e hartës.", + "thank_you_location": "Faleminderit për përmirësimin e hartës përreth {where}", + "help_link_text": "Detajet", + "help_link_url": "https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F", + "view_on_osm": "Shikoni Ndryshimet në OSM", + "changeset_id": "Ndryshimi juaj #:{changeset_id}", + "more": "Më shumë", + "events": "Eventet", + "languages": "Gjuhët: {languages}", + "missing": "Mungon diçka nga kjo listë?", + "tell_us": "Na thuaj!" + }, + "confirm": { + "okay": "OK" + }, + "splash": { + "welcome": "Mirësevini në iD OpenStreetMap editor", + "text": "iD është një mjet familar por i fuqishëm për të kontribuar në hartën e hapur më të mirë në botë. Ky është vesioni {version}. Për më shumë informacion shihni {website} dhe raportoni problematikat në {github}.", + "start": "Editoni tani" + }, + "tag_reference": { + "description": "Përshkrim", + "on_wiki": "{tag} në wiki.osm.org", + "used_with": "përdorur me {type}" + }, + "validations": { + "disconnected_highway_tooltip": "Rrugët duhet të lidhen me rrugë të tjera ose me hyrjet e ndërtesave.", + "untagged_point": "Pikë e paetiketuar", + "untagged_point_tooltip": "Përgjidhni një karakteristikë që përshkruan çfarë është kjo pikë.", + "untagged_line": "Vijë e paetiketuar", + "untagged_line_tooltip": "Përgjidhni një karakteristikë që përshkruan çfarë është kjo vijë.", + "untagged_area": "Sipërfaqe e paetiketuar", + "untagged_area_tooltip": "Përgjidhni një karakteristikë që përshkruan çfarë është kjo sipërfaqe." + }, + "zoom": { + "in": "Zmadhoni", + "out": "Zvogëloni" + }, + "streetside": { + "hires": "Rezolucion i lartë" + }, + "mapillary": { + "view_on_mapillary": "Shikoje këtë imazh në Mapilary" + }, + "note": { + "note": "Shënim", + "title": "Editoni shënimin", + "anonymous": "anonim", + "closed": "(Mbyllur)", + "commentTitle": "Komentet", + "status": { + "opened": "hapur {when}", + "reopened": "rihapur {when}", + "commented": "komentuar {when}", + "closed": "mbyllur {when}" + }, + "newComment": "Koment i Ri", + "inputPlaceholder": "Vendosni një koment për ta ndarë me përdoruesit e tjerë.", + "close": "Mbyllni shënimin", + "open": "Rihapni shënimin", + "comment": "Koment", + "close_comment": "Mbyllni dhe Komentoni", + "open_comment": "Rihapni dhe Komentoni", + "report": "Raportoni", + "new": "Shënim i Ri", + "save": "Ruani shënimin", + "login": "Ju duhet të kyçeni për të ndryshuar apo komentuar në këtë shënim.", + "upload_explanation": "Komentet tuaja do të jenë të dukshme publikisht për të gjithë përdoruesit e OpenStreetMap.", + "upload_explanation_with_user": "Komentet tuaja si {user} do të jenë të dukshme publikisht tek të jithë përdoruesit e OpenStreetMap." + }, + "help": { + "title": "Ndihmë", + "key": "H", + "help": { + "title": "Ndihmë", + "welcome": "Mirësevini në editorin iD për [OpenStreetMap](https://www.openstreetmap.org/). Me këtë editor ju mund të përditësoni OpenStreetMap direkt nga webfaqja juaj.", + "open_data_h": "Të dhëna të hapura", + "open_data": "Editimet që do bëni në këtë hartë do të jenë të dukshme tek çdokush që përdor OpenStreetMap. Editimet tuaja mund të bazohen në dijet vetjake, vëzhgimet tokësore apo imazheritë e mbledhura nga fotot aeriale apo tokësore. Të kopjuarit nga burime komerciale si Google Maps, [është rreptësisht e ndaluar](https://www.openstreetmap.org/copyright).", + "before_start_h": "Përpara se të filloni", + "open_source": "Editori iD është një projekt bashkëpunues me kodburim të hapur dhe ju po përdorni versionin {version} tani. Kodburimi është i disponueshëm [në Github](https://github.com/openstreetmap/iD)." + }, + "overview": { + "navigation_h": "Navigim", + "features_h": "Karakteristikat e Hartës", + "nodes_ways": "Në OpenStreetMap, pikat ndonjëherë quhen \"nyje\", dhe vijat quhen \"rrugë'." + }, + "editing": { + "select_h": "Përzgjidhni", + "multiselect_h": "Përzgjedhje e shumëfishtë", + "multiselect_shift_click": "`{shift}`+{leftclick} klikim me të majtën për të përzgjedhur disa karakteristika së bashku. Kjo e bën më të lehtë për të lëvizur apo fshirë objekte të shumëfishtë." + }, + "feature_editor": { + "fields_h": "Fushat", + "tags_h": "Etiketat" + }, + "points": { + "title": "Pikat", + "intro": "*Pikat* mund të përdoren për të paraqitur karakteristika si dyqanet, restorantet dhe monumentet. Ato shënjojnë një vendndodhje specifike dhe përshkruajnë çfarë është atje.", + "add_point_h": "Shtim Pikash", + "add_point": "Për të shtuar një pikë, klikoni butonin {point} **Pikë** në shiritin e menusë mbi hartë, ose shkurtimi nga tastiera tastën `1`. Kjo do ndryshojë kursorin e mausit në simbolin e kryqit.", + "move_point_h": "Zhvendosje e Pikave", + "delete_point_h": "Fshirja e Pikave" + }, + "lines": { + "title": "Vijat" + }, + "areas": { + "title": "Sipërfaqet", + "point_or_area_h": "Pikat apo Sipërfaqet?", + "modify_area_h": "Modifikim i Sipërfaqeve", + "delete_area_h": "Fshirje e Sipërfaqeve" + }, + "notes": { + "title": "Shënimet", + "intro": "*Shënimet* përdoren për të bërë me dije përdoruesit e tjerë që një karakteristikëka nevojë për përmirësime apo ndërhyrje. Shënimet shënjojnë një vendndodhje specifike në hartë. Për të parë shënimet ekzistuese apo për të shtuar një të ri, klikoni {data} panelin e **Të dhënat e hartës** për të aktivizuar shtresën e shënimeve në OpenStreetMap." } }, "intro": { @@ -302,8 +626,108 @@ "subdistrict": "", "suburb": "", "countrycode": "al" + }, + "startediting": { + "title": "Filloni të Editoni", + "shortcuts": "Ju mund të shikoni një listë komandash së bashku me shkurtimet e tyre nga tastiera duke shtypur '{key}' tastën.", + "save": "Mos harroni t'i ruani rregullisht ndryshimet tuaja!" } }, + "shortcuts": { + "title": "Shkurtimet e tastierës", + "tooltip": "Shfaq në ekran shkurtimet e tastierës", + "toggle": { + "key": "?" + }, + "key": { + "alt": "Alt", + "backspace": "Backspace", + "cmd": "Cmd", + "ctrl": "Ctrl", + "delete": "Delete", + "del": "Del", + "end": "End", + "enter": "Enter", + "esc": "Esc", + "home": "Home", + "option": "Option", + "pause": "Pause", + "pgdn": "PgDn", + "pgup": "PgUp", + "shift": "Shift", + "space": "Space" + }, + "browsing": { + "navigation": { + "title": "Navigimi", + "zoom": "Zmadhoni/Zvogëloni" + }, + "help": { + "title": "Ndihmë", + "help": "Shfaqni ndihmë/dokumentacionin", + "keyboard": "Shfaq shkurtimet e tastierës" + }, + "display_options": { + "background": "Shfaq opsionet e sfondit", + "background_switch": "Rikthehuni tek sfondi i fundit", + "map_data": "Shfaqe opsionet për të dhënat e hartës" + }, + "selecting": { + "title": "Duke përzgjedhur karakteristikat", + "select_one": "Përzgjidhni një karakterstikë të vetme", + "select_multi": "Përzgjidhni disa karakterstika" + }, + "with_selected": { + "title": "Me karakteristikën e përzgjedhur" + }, + "vertex_selected": { + "title": "Me nyjen e përzgjedhur", + "previous": "Kaloni tek nyja paraardhëse", + "next": "Kaloni tek nyja e radhës", + "first": "Kaloni tek nyja e parë", + "last": "Kaloni tek nyja e fundit" + } + }, + "editing": { + "title": "Duke edituar", + "drawing": { + "title": "Duke vizatuar" + }, + "operations": { + "move": "Lëvizni karakteristikat e përzgjedhura", + "rotate": "Rrotulloni karakteristikat e përzgjedhura" + }, + "commands": { + "title": "Komandat", + "copy": "Kopjoni karakteristikat e përzgjedhura", + "undo": "Zhbëj veprimin e fundit", + "redo": "Ribëj veprimin e fundit", + "save": "Ruaj ndryshimet" + } + }, + "tools": { + "title": "Mjetet" + } + }, + "units": { + "feet": "{quantity} ft", + "miles": "{quantity} mi", + "square_feet": "{quantity} sq ft", + "square_miles": "{quantity} sq mi", + "acres": "{quantity} ac", + "meters": "{quantity} m", + "kilometers": "{quantity} km", + "square_meters": "{quantity} m²", + "square_kilometers": "{quantity} km²", + "hectares": "{quantity} ha", + "area_pair": "{area1} ({area2})", + "arcdegrees": "{quantity}°", + "arcminutes": "{quantity}′", + "arcseconds": "{quantity}″", + "north": "N", + "coordinate": "{coordinate}{direction}", + "coordinate_pair": "{latitude}, {longitude}" + }, "presets": { "fields": { "access": { @@ -427,6 +851,65 @@ "name": "Argjendar" } } + }, + "community": { + "bw-facebook": { + "description": "Faqja e OpenStreetMap në Botswana" + }, + "cape-coast-youthmappers": { + "description": "Na ndiqni në Twitter: {url}" + }, + "osm-gh-facebook": { + "name": "OpenStreetMap Gana në Facebook", + "description": "Grupi në facebook për njerzit e interesuar në OpenStreetMap" + }, + "osm-gh-twitter": { + "name": "OpenStreetMap Gana në Twitter", + "description": "Na ndiqni në Twitter: {url}" + }, + "OSM-BGD-facebook": { + "name": "OpenStreetMap Bangladesh", + "description": "Përmirësoni OpenStreetMap në Bangladesh" + }, + "OSM-India-facebook": { + "description": "Përmirësoni OpenStreetMap në Indi", + "events": { + "sotmasia2018": { + "name": "State of the Map Asia 2018", + "where": "Indian Institute of Management, Bangalore, India" + } + } + }, + "OSM-india-twitter": { + "name": "OpenStreetMap India Twitter" + }, + "OSM-MNG-facebook": { + "name": "OpenStreetMap Mongolia" + }, + "OSM-MMR-facebook": { + "name": "OpenStreetMap Myanmar" + }, + "OSM-Nepal-facebook": { + "name": "OpenStreetMap Nepal", + "description": "Përmirësoni OpenStreetMap në Nepal" + }, + "OSM-LKA-facebook": { + "name": "OpenStreetMap Sri Lanka", + "description": "Përmirësoni OpenStreetMap në Sri Lanka" + }, + "al-forum": { + "description": "OpenStreetMap Albania Forum" + }, + "al-maptime-tirana": { + "name": "Maptime Tirana" + }, + "al-telegram": { + "name": "OSM Albania kanali në Telegram ", + "description": "OpenStreetMap Albania kanali në Telegram " + }, + "osm-at": { + "name": "OpenStreetMap Austria" + } } } } \ No newline at end of file diff --git a/dist/locales/sv.json b/dist/locales/sv.json index 56c379cac..856e3f3e3 100644 --- a/dist/locales/sv.json +++ b/dist/locales/sv.json @@ -558,6 +558,11 @@ "notes": { "tooltip": "Anteckning från OpenStreetMap", "title": "OpenStreetMap-anteckningar" + }, + "custom": { + "tooltip": "Drag och släpp en datafil på sidan, eller klicka på knappen för att ställa in", + "title": "Anpassad kartdata", + "zoom": "Zooma till data" } }, "fill_area": "Fyllda områden", @@ -638,6 +643,19 @@ "template": { "placeholder": "Ange en url-mall" } + }, + "custom_data": { + "tooltip": "Redigera anpassat kartlager", + "header": "Inställningar för anpassad kartdata", + "file": { + "instructions": "Välj en lokal datafil. Filtyper som stöds är:\n .gpx, .kml, .geojson, .json", + "label": "Bläddra efter fil" + }, + "or": "Eller", + "url": { + "instructions": "Ange en datafil-URL eller en URL-mall för vektorplattor. Giltiga symboler är:\n {zoom} eller {z}, {x}, {y} för Z/X/Y-plattscheme", + "placeholder": "Ange en url" + } } }, "restore": { diff --git a/dist/locales/vi.json b/dist/locales/vi.json index 0945d328a..8d919c437 100644 --- a/dist/locales/vi.json +++ b/dist/locales/vi.json @@ -365,7 +365,7 @@ "localized_translation_language": "Chọn ngôn ngữ", "localized_translation_name": "Tên" }, - "zoom_in_edit": "Phong to để sửa đổi", + "zoom_in_edit": "Phóng to để sửa đổi", "login": "Đăng nhập", "logout": "Đăng xuất", "loading_auth": "Đang kết nối với OpenStreetMap…", @@ -430,7 +430,12 @@ "edited_by": "Người Sửa đổi", "changeset": "Bộ thay đổi", "unknown": "Không rõ", - "link_text": "Lịch sử tại openstreetmap.org" + "link_text": "Lịch sử tại openstreetmap.org", + "note_no_history": "Không có Lịch sử (Ghi chú Mới Tạo)", + "note_comments": "Bình luận", + "note_created_date": "Ngày Tạo", + "note_created_user": "Người Tạo", + "note_link_text": "Ghi chú tại openstreetmap.org" }, "location": { "key": "V", @@ -460,7 +465,8 @@ "vertex": "đỉnh", "line": "đường kẻ", "area": "vùng", - "relation": "quan hệ" + "relation": "quan hệ", + "note": "ghi chú" }, "geocoder": { "search": "Tìm kiếm trên toàn thế giới…", @@ -552,6 +558,11 @@ "notes": { "tooltip": "Dữ liệu ghi chú từ OpenStreetMap", "title": "Ghi chú OpenStreetMap" + }, + "custom": { + "tooltip": "Kéo thả một tập tin dữ liệu vào trang hoặc bấm nút để thiết lập", + "title": "Dữ liệu Bản đồ Tùy biến", + "zoom": "Phóng vừa dữ liệu" } }, "fill_area": "Cách Tô màu các Vùng", @@ -624,6 +635,29 @@ "tooltip": "Các vùng được tô màu hoàn toàn." } }, + "settings": { + "custom_background": { + "tooltip": "Sửa hình nền tùy biến", + "header": "Tùy chọn Hình nền Tùy biến", + "instructions": "Nhập định dạng URL của các mảnh bản đồ. Bạn có thể sử dụng các dấu hiệu:\n {zoom} hoặc {z}, {x}, {y} cho định dạng mảnh Z/X/Y\n {-y} hoặc {ty} cho tọa độ Y kiểu TMS phản chiếu\n {u} cho định dạng quadtile\n {switch:a,b,c} để luân phiên các máy chủ DNS\n\nVí dụ:\n{example}", + "template": { + "placeholder": "Nhập định dạng URL" + } + }, + "custom_data": { + "tooltip": "Sửa lớp dữ liệu tùy biến", + "header": "Thiết lập Dữ liệu Bản đồ Tùy biến", + "file": { + "instructions": "Chọn tập tin dữ liệu trên máy. Các kiểu tập tin sau được hỗ trợ:\n .gpx, .kml, .geojson, .json", + "label": "Duyệt tập tin" + }, + "or": "Hoặc", + "url": { + "instructions": "Nhập URL của tập tin dữ liệu hoặc định dạng URL của các mảnh bản đồ vectơ. Bạn có thể sử dụng các dấu hiệu:\n {zoom} hoặc {z}, {x}, và {y} cho định dạng Z/X/Y", + "placeholder": "Nhập URL" + } + } + }, "restore": { "heading": "Bạn có thay đổi chưa lưu", "description": "Bạn có thay đổi chưa lưu từ một phiên làm việc trước đây. Bạn có muốn khôi phục các thay đổi này không?", @@ -1433,24 +1467,35 @@ "label": "Quyền Truy cập", "options": { "designated": { + "description": "Được xây với mục đích cho phép vận chuyển bằng phương thức này, theo bảng hay luật pháp địa phương", "title": "Theo mục đích" }, "destination": { + "description": "Chỉ cho phép truy cập để tới nơi", "title": "Nơi đến" }, "dismount": { + "description": "Chỉ cho phép nếu xuống đi bộ", "title": "Bắt xuống đi bộ" }, "no": { + "description": "Công chúng không được phép truy cập", "title": "Cấm" }, "permissive": { + "description": "Chủ cho phép rộng rãi nhưng có thể cấm sau", "title": "Chủ cho phép" }, + "permit": { + "description": "Chỉ cho phép nếu có giấy phép hợp lệ", + "title": "Giấy phép" + }, "private": { + "description": "Chỉ có những người được chủ cho phép truy cập", "title": "Tư nhân" }, "yes": { + "description": "Mọi người được phép truy cập theo luật pháp", "title": "Cho phép" } }, @@ -3036,6 +3081,10 @@ "name": "Quầy Sửa Xe đạp", "terms": "quầy sửa xe đạp, xích, bơm, quay sua xe dap, xich, bom" }, + "amenity/biergarten": { + "name": "Vườn Bia", + "terms": "vườn bia, vườn uống bia, vườn nhậu, vuon bia, vuon uong bia, vuon nhau" + }, "amenity/boat_rental": { "name": "Cho thuê Tàu", "terms": "dịch vụ cho thuê tàu, chỗ thuê tàu, tiệm thuê tàu, thuê tàu, dịch vụ cho mướn tàu, chỗ mướn tàu, tiệm mướn tàu, mướn tàu, dịch vụ cho thuê thuyền, chỗ thuê thuyền, tiệm thuê thuyền, thuê thuyền, dịch vụ cho mướn thuyền, chỗ mướn thuyền, tiệm mướn thuyền, mướn thuyền, dich vu cho thue tau, cho thue tau, tiem thue tau, thue tau, dich vu cho muon tau, cho muon tau, tiem muon tau, muon tau, dich vu cho thue thuyen, cho thue thuyen, tiem thue thuyen, thue thuyen, dich vu cho muon thuyen, cho muon thuyen, tiem muon thuyen, muon thuyen" @@ -4822,6 +4871,10 @@ "name": "Sân cỏ Bóng bầu dục Mỹ", "terms": "sân cỏ bóng bầu dục mỹ, sân bóng bầu dục mỹ, san co bong bau duc my, san bong bau duc my" }, + "leisure/pitch/badminton": { + "name": "Sân Cầu lông", + "terms": "sân cầu lông, sân đánh cầu, sân cầu, san cau long, san danh cau, san cau" + }, "leisure/pitch/baseball": { "name": "Sân cỏ Bóng chày", "terms": "sân cỏ bóng chày, san co bong chay" @@ -6871,12 +6924,14 @@ "attribution": { "text": "© Lantmäteriet, CC0" }, + "description": "Hỗn hợp các hình ảnh trực giao Thụy Điển vào thời kỳ 1955–1965, có thể bao gồm các hình ảnh cũ hơn hoặc mới hơn.", "name": "Hình ảnh trực giao lịch sử Lantmäteriet 1960" }, "lantmateriet-orto1975": { "attribution": { "text": "© Lantmäteriet, CC0" }, + "description": "Hỗn hợp các hình ảnh trực giao Thụy Điển vào thời kỳ 1970–1980, sẽ được mở rộng.", "name": "Hình ảnh trực giao lịch sử Lantmäteriet 1975" }, "mapbox_locator_overlay": { @@ -6914,7 +6969,9 @@ "osmse-ekonomiska": { "attribution": { "text": "© Lantmäteriet" - } + }, + "description": "Hình quét các “bản đồ kinh tế” những năm 1950–1980", + "name": "Bản đồ kinh tế Lantmäteriet 1950–1980" }, "qa_no_address": { "attribution": { @@ -7151,7 +7208,9 @@ "description": "talk-tw là danh sách thư chính thức của cộng đồng Đài Loan" }, "OSM-TH-CNX-meetup": { - "name": "Họp mặt OSM Chiềng Mai" + "name": "Họp mặt OSM Chiềng Mai", + "description": "Họp mặt không thường xuyên của cộng đồng OpenStreetMap tại Chiềng Mai", + "extendedDescription": "Các thành viên cộng đồng OpenStreetMap gặp nhau vài tháng một lần tại Chiềng Mai. Hãy liên lạc với chúng tôi và truy cập {url} để biết khi nào có cuộc họp mặt sau." }, "OSM-TH-facebook": { "name": "Nhóm Facebook OpenStreetMap Thái Lan", @@ -7467,14 +7526,16 @@ "description": "Theo dõi chúng tôi trên Twitter: {url}" }, "Nottingham-OSM-pub-meetup": { - "name": "Họp mặt Đông Midlands (Nottingham) hàng tháng tại quán rượu" + "name": "Họp mặt Đông Midlands (Nottingham) hàng tháng tại quán rượu", + "description": "Tụ tập xã hội dành cho những người lập bản đồ và người sử dụng tại Đông Midlands" }, "gb-mailinglist": { "name": "Danh sách thư talk-gb", "description": "talk-gb là danh sách thư chính thức của cộng đồng OSM tại Anh (bao gồm Bắc Ireland)" }, "mappa-mercia-group": { - "name": "Nhóm địa phương Mappa Mercia" + "name": "Nhóm địa phương Mappa Mercia", + "description": "Nơi tụ tập những người hâm mộ OpenStreetMap tại Midlands" }, "gb-irc": { "name": "IRC OpenStreetMap Vương quốc Anh", @@ -7569,7 +7630,8 @@ }, "OSM-Portland-forum": { "name": "Nhóm Google OpenStreetMap PDX", - "description": "Diễn đàn và danh sách thư của những người OpenStreetMap ở vùng Portland" + "description": "Diễn đàn và danh sách thư của những người OpenStreetMap ở vùng Portland", + "extendedDescription": "Nhóm này cộng tác cải thiện OpenStreetMap tại khu vực Portland, Oregon, để hỗ trợ các ứng dụng như OpenTripPlanner." }, "OSM-Portland": { "name": "OpenStreetMap Portland", @@ -7698,6 +7760,11 @@ "name": "Twitter OpenStreetMap Brasil", "description": "Theo dõi chúng tôi trên Twitter: {url}" }, + "RS-telegram": { + "name": "Nhóm Telegram OpenStreetMap Rio Grande do Sul", + "description": "Hãy tham gia cộng đồng OpenStreetMap Rio Grande do Sul tại Telegram", + "extendedDescription": "Mời mọi người tham gia cộng đồng để tìm hiểu thêm về OpenStreetMap, hỏi đáp, và tham dự các cuộc họp mặt của chúng ta." + }, "OSM-CL-facebook": { "name": "Facebook OpenStreetMap Chile", "description": "Hãy tham gia cộng đồng OpenStreetMap Chile tại Facebook", From ad289e05656ae442523c90557732267470d6b398 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 29 Aug 2018 00:55:36 -0400 Subject: [PATCH 176/217] v2.11.1 --- CHANGELOG.md | 9 +++++++++ modules/core/context.js | 2 +- package.json | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 537ec831c..ad6c2d608 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,15 @@ _Breaking changes, which may affect downstream projects or sites that embed iD, [@xxxx]: https://github.com/xxxx --> +# 2.11.1 +##### Aug 29, 2018 + +#### :bug: Bugfixes +* Fix handling of `.gpx` files passed in via url ([#5253]) + +[#5253]: https://github.com/openstreetmap/iD/issues/5253 + + # 2.11.0 ##### Aug 26, 2018 diff --git a/modules/core/context.js b/modules/core/context.js index 4303983ed..7efd9e7b2 100644 --- a/modules/core/context.js +++ b/modules/core/context.js @@ -53,7 +53,7 @@ export function setAreaKeys(value) { export function coreContext() { var context = {}; - context.version = '2.11.0'; + context.version = '2.11.1'; // create a special translation that contains the keys in place of the strings var tkeys = _cloneDeep(dataEn); diff --git a/package.json b/package.json index e3e1ce3d0..a262d6a9f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iD", - "version": "2.11.0", + "version": "2.11.1", "description": "A friendly editor for OpenStreetMap", "main": "iD.js", "repository": "openstreetmap/iD", From fe6e088582ee4629ef6e4cb6655747b3bf0df09a Mon Sep 17 00:00:00 2001 From: LaszloEr Date: Fri, 31 Aug 2018 02:19:42 +0200 Subject: [PATCH 177/217] Fields and default layer for man_made:bridge - Added name, bridge type, layer and maxweight fields - default layer should be set to 1 (like it is for highway=bridge) --- data/presets/presets/man_made/bridge.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/data/presets/presets/man_made/bridge.json b/data/presets/presets/man_made/bridge.json index 0981af3d5..8cdd84493 100644 --- a/data/presets/presets/man_made/bridge.json +++ b/data/presets/presets/man_made/bridge.json @@ -1,9 +1,16 @@ { + "fields": [ + "name" + "bridge" + "layer" + "maxweight" + ], "geometry": [ "area" ], "tags": { "man_made": "bridge" + "layer": "1" }, "name": "Bridge" } From 3af31e8e52384c3d701a700a1292f7e2c63c58ca Mon Sep 17 00:00:00 2001 From: Tobias Date: Fri, 31 Aug 2018 07:28:59 +0200 Subject: [PATCH 178/217] Update column.json An ad-column is a round thing the way I know it and the way it is shown in the wiki (https://wiki.openstreetmap.org/wiki/Tag:advertising%3Dcolumn). So the direction key as preset does not make sense. There seems to be no relevant usage of this combination as well (https://taginfo.openstreetmap.org/tags/advertising=column#combinations). --- data/presets/presets/advertising/column.json | 1 - 1 file changed, 1 deletion(-) diff --git a/data/presets/presets/advertising/column.json b/data/presets/presets/advertising/column.json index b17ebe1fc..6aa439931 100644 --- a/data/presets/presets/advertising/column.json +++ b/data/presets/presets/advertising/column.json @@ -1,6 +1,5 @@ { "fields": [ - "direction", "lit" ], "geometry": [ From 67a014091b85f57df14f712eaa50c21137382309 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Thu, 30 Aug 2018 14:49:28 +0100 Subject: [PATCH 179/217] Add preset for shop=sewing --- data/presets.yaml | 5 +++++ data/presets/presets.json | 1 + data/presets/presets/shop/sewing.json | 22 ++++++++++++++++++++++ data/taginfo.json | 7 +++++++ dist/locales/en.json | 4 ++++ 5 files changed, 39 insertions(+) create mode 100644 data/presets/presets/shop/sewing.json diff --git a/data/presets.yaml b/data/presets.yaml index 60c5b5d0a..a5ef066e4 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -5564,6 +5564,11 @@ en: name: Consignment/Thrift Store # 'terms: secondhand,second hand,resale,thrift,used' terms: '' + shop/sewing: + # shop=sewing + name: Sewing Supply Shop + # 'terms: haberdashery' + terms: '' shop/shoes: # shop=shoes name: Shoe Store diff --git a/data/presets/presets.json b/data/presets/presets.json index 453609b97..5be1fe475 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -846,6 +846,7 @@ "shop/scuba_diving": {"icon": "maki-swimming", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "scuba_diving"}, "name": "Scuba Diving Shop"}, "shop/seafood": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["fishmonger"], "tags": {"shop": "seafood"}, "name": "Seafood Shop"}, "shop/second_hand": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "second_hand", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["secondhand", "second hand", "resale", "thrift", "used"], "tags": {"shop": "second_hand"}, "name": "Consignment/Thrift Store"}, + "shop/sewing": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["haberdashery"], "tags": {"shop": "sewing"}, "name": "Sewing Supply Shop"}, "shop/shoes": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "shoes"}, "name": "Shoe Store"}, "shop/sports": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "sports"}, "name": "Sporting Goods Store"}, "shop/stationery": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["card", "paper"], "tags": {"shop": "stationery"}, "name": "Stationery Store"}, diff --git a/data/presets/presets/shop/sewing.json b/data/presets/presets/shop/sewing.json new file mode 100644 index 000000000..c85e2e760 --- /dev/null +++ b/data/presets/presets/shop/sewing.json @@ -0,0 +1,22 @@ +{ + "icon": "maki-shop", + "fields": [ + "name", + "operator", + "address", + "building_area", + "opening_hours", + "payment_multi" + ], + "geometry": [ + "point", + "area" + ], + "terms": [ + "haberdashery" + ], + "tags": { + "shop": "sewing" + }, + "name": "Sewing Supply Shop" +} diff --git a/data/taginfo.json b/data/taginfo.json index c9f9ec2a8..faed237e9 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -5525,6 +5525,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shop-15.svg?sanitize=true" }, + { + "key": "shop", + "value": "sewing", + "description": "Sewing Supply Shop", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shop-15.svg?sanitize=true" + }, { "key": "shop", "value": "shoes", diff --git a/dist/locales/en.json b/dist/locales/en.json index 4b8c46cb2..2b2a7a5bf 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -6313,6 +6313,10 @@ "name": "Consignment/Thrift Store", "terms": "secondhand,second hand,resale,thrift,used" }, + "shop/sewing": { + "name": "Sewing Supply Shop", + "terms": "haberdashery" + }, "shop/shoes": { "name": "Shoe Store", "terms": "" From 31d165332b02abb914ba7d2b281167f65485092e Mon Sep 17 00:00:00 2001 From: Simon Bilsky-Rollins Date: Sun, 26 Aug 2018 11:22:23 -0400 Subject: [PATCH 180/217] add preset for wi-fi hotspots --- data/presets.yaml | 5 +++++ data/presets/presets.json | 1 + .../presets/presets/internet_access/wlan.json | 20 +++++++++++++++++++ data/taginfo.json | 12 ++++++----- dist/locales/en.json | 4 ++++ svg/fontawesome/fas-wifi.svg | 1 + 6 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 data/presets/presets/internet_access/wlan.json create mode 100644 svg/fontawesome/fas-wifi.svg diff --git a/data/presets.yaml b/data/presets.yaml index 60c5b5d0a..3d207fa6e 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -3585,6 +3585,11 @@ en: # historic=wayside_shrine name: Wayside Shrine terms: '' + internet_access/wlan: + # internet_access=wlan + name: Wi-Fi Hotspot + # 'terms: wi-fi,wifi,hotspot' + terms: '' junction: # junction=yes name: Junction diff --git a/data/presets/presets.json b/data/presets/presets.json index 453609b97..afdc567ea 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -414,6 +414,7 @@ "historic/tomb": {"icon": "maki-cemetery", "fields": ["name", "tomb", "building_area", "inscription"], "geometry": ["point", "area"], "tags": {"historic": "tomb"}, "name": "Tomb"}, "historic/wayside_cross": {"icon": "maki-religious-christian", "fields": ["name", "inscription"], "geometry": ["point", "vertex", "area"], "tags": {"historic": "wayside_cross"}, "name": "Wayside Cross"}, "historic/wayside_shrine": {"icon": "maki-landmark", "fields": ["name", "religion", "denomination", "inscription"], "geometry": ["point", "vertex", "area"], "tags": {"historic": "wayside_shrine"}, "name": "Wayside Shrine"}, + "internet_access/wlan": {"icon": "fas-wifi", "geometry": ["point", "area"], "fields": ["internet_access/fee", "internet_access/ssid"], "terms": ["wi-fi", "wifi", "hotspot"], "tags": {"internet_access": "wlan"}, "name": "Wi-Fi Hotspot"}, "junction": {"icon": "temaki-junction", "fields": ["name"], "geometry": ["vertex", "area"], "tags": {"junction": "yes"}, "name": "Junction"}, "landuse": {"fields": ["name", "landuse"], "geometry": ["area"], "tags": {"landuse": "*"}, "matchScore": 0.9, "name": "Land Use"}, "landuse/farm": {"icon": "maki-farm", "fields": ["name", "operator", "crop"], "geometry": ["point", "area"], "tags": {"landuse": "farm"}, "terms": [], "name": "Farmland", "searchable": false}, diff --git a/data/presets/presets/internet_access/wlan.json b/data/presets/presets/internet_access/wlan.json new file mode 100644 index 000000000..317e50596 --- /dev/null +++ b/data/presets/presets/internet_access/wlan.json @@ -0,0 +1,20 @@ +{ + "icon": "fas-wifi", + "geometry": [ + "point", + "area" + ], + "fields": [ + "internet_access/fee", + "internet_access/ssid" + ], + "terms": [ + "wi-fi", + "wifi", + "hotspot" + ], + "tags": { + "internet_access": "wlan" + }, + "name": "Wi-Fi Hotspot" +} diff --git a/data/taginfo.json b/data/taginfo.json index c9f9ec2a8..e128a08a5 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -2779,6 +2779,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/landmark-15.svg?sanitize=true" }, + { + "key": "internet_access", + "value": "wlan", + "description": "Wi-Fi Hotspot, Internet Access", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-wifi.svg?sanitize=true" + }, { "key": "junction", "value": "yes", @@ -6611,11 +6618,6 @@ "description": "Internet Access" }, {"key": "internet_access", "value": "no", "description": "Internet Access"}, - { - "key": "internet_access", - "value": "wlan", - "description": "Internet Access" - }, { "key": "internet_access", "value": "wired", diff --git a/dist/locales/en.json b/dist/locales/en.json index 4b8c46cb2..5398ff08e 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -4585,6 +4585,10 @@ "name": "Wayside Shrine", "terms": "" }, + "internet_access/wlan": { + "name": "Wi-Fi Hotspot", + "terms": "wi-fi,wifi,hotspot" + }, "junction": { "name": "Junction", "terms": "" diff --git a/svg/fontawesome/fas-wifi.svg b/svg/fontawesome/fas-wifi.svg new file mode 100644 index 000000000..364b5060a --- /dev/null +++ b/svg/fontawesome/fas-wifi.svg @@ -0,0 +1 @@ + \ No newline at end of file From 40d54f02fc7a5f8d9a5679b6a54202f1dc368f17 Mon Sep 17 00:00:00 2001 From: James Kingdom Date: Fri, 31 Aug 2018 11:33:05 -0400 Subject: [PATCH 181/217] Change the filename to lowercase before matching it (closes #5266) --- modules/svg/data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/svg/data.js b/modules/svg/data.js index a391c8f1f..57330d993 100644 --- a/modules/svg/data.js +++ b/modules/svg/data.js @@ -317,7 +317,7 @@ export function svgData(projection, context, dispatch) { if (!fileName) return; var re = /\.(gpx|kml|(geo)?json)$/i; - var match = fileName.match(re); + var match = fileName.toLowerCase().match(re); return match && match.length && match[0]; } From b8959a7e824d8a71eb0357d42fb405ed356ddd13 Mon Sep 17 00:00:00 2001 From: LaszloEr Date: Fri, 31 Aug 2018 19:43:26 +0200 Subject: [PATCH 182/217] Update bridge.json --- data/presets/presets/man_made/bridge.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/presets/presets/man_made/bridge.json b/data/presets/presets/man_made/bridge.json index 8cdd84493..21b6de4b7 100644 --- a/data/presets/presets/man_made/bridge.json +++ b/data/presets/presets/man_made/bridge.json @@ -1,15 +1,15 @@ { "fields": [ - "name" - "bridge" - "layer" + "name", + "bridge", + "layer", "maxweight" ], "geometry": [ "area" ], "tags": { - "man_made": "bridge" + "man_made": "bridge", "layer": "1" }, "name": "Bridge" From 5c029f958e58e19d13b487dd29fff33e9d786667 Mon Sep 17 00:00:00 2001 From: LaszloEr Date: Sat, 1 Sep 2018 07:16:44 +0200 Subject: [PATCH 183/217] Layer selection fixed --- data/presets/presets/man_made/bridge.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/presets/presets/man_made/bridge.json b/data/presets/presets/man_made/bridge.json index 21b6de4b7..58431a5e2 100644 --- a/data/presets/presets/man_made/bridge.json +++ b/data/presets/presets/man_made/bridge.json @@ -9,6 +9,9 @@ "area" ], "tags": { + "man_made": "bridge" + }, + "addTags": { "man_made": "bridge", "layer": "1" }, From c73b8081e3c5ddcc12506819de35da0341bbdefd Mon Sep 17 00:00:00 2001 From: Tobias Jordans Date: Sat, 1 Sep 2018 07:42:59 +0200 Subject: [PATCH 184/217] Run npm for column-preset-update See 3af31e8 --- data/presets/presets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index 453609b97..a08a7be28 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -12,7 +12,7 @@ "waterway": {"fields": ["name", "waterway"], "geometry": ["point", "vertex", "line", "area"], "tags": {"waterway": "*"}, "searchable": false, "name": "Waterway"}, "address": {"fields": ["address"], "geometry": ["point", "vertex", "area"], "tags": {"addr:*": "*"}, "addTags": {}, "removeTags": {}, "reference": {"key": "addr"}, "name": "Address", "matchScore": 0.15}, "advertising/billboard": {"fields": ["direction", "lit"], "geometry": ["point", "vertex", "line"], "tags": {"advertising": "billboard"}, "name": "Billboard"}, - "advertising/column": {"fields": ["direction", "lit"], "geometry": ["point", "area"], "tags": {"advertising": "column"}, "name": "Advertising Column"}, + "advertising/column": {"fields": ["lit"], "geometry": ["point", "area"], "tags": {"advertising": "column"}, "name": "Advertising Column"}, "aerialway/station": {"icon": "maki-aerialway", "geometry": ["point", "vertex", "area"], "fields": ["aerialway/access", "aerialway/summer/access", "elevation", "building_area"], "tags": {"aerialway": "station"}, "name": "Aerialway Station", "searchable": false}, "aerialway/cable_car": {"geometry": ["line"], "terms": ["tramway", "ropeway"], "fields": ["name", "aerialway/occupancy", "aerialway/capacity", "aerialway/duration", "aerialway/heating"], "tags": {"aerialway": "cable_car"}, "name": "Cable Car"}, "aerialway/chair_lift": {"geometry": ["line"], "fields": ["name", "aerialway/occupancy", "aerialway/capacity", "aerialway/duration", "aerialway/bubble", "aerialway/heating"], "tags": {"aerialway": "chair_lift"}, "name": "Chair Lift"}, From a992d016adf78f8a92bffa2eaaad90ba39843df7 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 2 Sep 2018 13:54:14 -0400 Subject: [PATCH 185/217] Show OpenTopoMap (closes #5277) --- data/imagery.json | 10 ++++++++++ data/update_imagery.js | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/data/imagery.json b/data/imagery.json index ef8b57357..36113102a 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -44954,6 +44954,16 @@ ], "terms_text": "openstreetmap.hu" }, + { + "id": "OpenTopoMap", + "name": "OpenTopoMap", + "type": "tms", + "template": "https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png", + "zoomExtent": [3, 17], + "terms_url": "https://tile.opentopomap.org/about#verwendung", + "terms_text": "Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)", + "icon": "https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png" + }, { "id": "lu.geoportail.opendata.ortho2010", "name": "Ortho 2010 geoportail.lu", diff --git a/data/update_imagery.js b/data/update_imagery.js index 86818c8c8..fa4b13751 100644 --- a/data/update_imagery.js +++ b/data/update_imagery.js @@ -15,7 +15,6 @@ const blacklist = { 'osm-mapnik-black_and_white': true, // 'OpenStreetMap (Standard Black & White)' 'osm-mapnik-no_labels': true, // 'OpenStreetMap (Mapnik, no labels)' 'OpenStreetMap-turistautak': true, // 'OpenStreetMap (turistautak)' - 'OpenTopoMap': true, // 'OpenTopoMap' 'hike_n_bike': true, // 'Hike & Bike' 'landsat': true, // 'Landsat' From b9725794ad7ef04e66ee160703821bbe76257598 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Mon, 3 Sep 2018 18:51:06 -0700 Subject: [PATCH 186/217] Shows the Lit field by default for the Swimming Pool preset Adds "aquatics" as a search term for the Swimming Pool preset --- data/presets.yaml | 2 +- data/presets/presets.json | 10 +++++----- data/presets/presets/leisure/swimming_pool.json | 6 ++++-- dist/locales/en.json | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index 3d207fa6e..c0ddc84a2 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -4089,7 +4089,7 @@ en: leisure/swimming_pool: # leisure=swimming_pool name: Swimming Pool - # 'terms: dive,water' + # 'terms: dive,water,aquatics' terms: '' leisure/track: # leisure=track diff --git a/data/presets/presets.json b/data/presets/presets.json index afdc567ea..61c27e8f2 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -522,7 +522,7 @@ "leisure/sports_centre": {"icon": "maki-pitch", "fields": ["name", "sport", "building", "address", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "sports_centre"}, "terms": [], "name": "Sports Center / Complex"}, "leisure/sports_centre/swimming": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "building"], "geometry": ["point", "area"], "terms": ["dive", "water"], "tags": {"leisure": "sports_centre", "sport": "swimming"}, "reference": {"key": "sport", "value": "swimming"}, "name": "Swimming Pool Facility"}, "leisure/stadium": {"icon": "maki-pitch", "fields": ["name", "sport", "address"], "geometry": ["point", "area"], "tags": {"leisure": "stadium"}, "name": "Stadium"}, - "leisure/swimming_pool": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address"], "geometry": ["point", "area"], "terms": ["dive", "water"], "tags": {"leisure": "swimming_pool"}, "name": "Swimming Pool"}, + "leisure/swimming_pool": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "lit"], "geometry": ["point", "area"], "terms": ["dive", "water", "aquatics"], "tags": {"leisure": "swimming_pool"}, "name": "Swimming Pool"}, "leisure/track": {"icon": "iD-highway-road", "fields": ["surface", "sport_racing_nonmotor", "lit", "width", "lanes"], "geometry": ["point", "line", "area"], "tags": {"leisure": "track"}, "terms": ["cycle", "dog", "greyhound", "horse", "race*", "track"], "name": "Racetrack (Non-Motorsport)"}, "leisure/water_park": {"icon": "maki-swimming", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["swim", "pool", "dive"], "tags": {"leisure": "water_park"}, "name": "Water Park"}, "line": {"fields": ["name"], "geometry": ["line"], "tags": {}, "name": "Line", "matchScore": 0.1}, @@ -2786,10 +2786,10 @@ "leisure/sports_centre/ДЮСШ": {"tags": {"name": "ДЮСШ", "leisure": "sports_centre"}, "name": "ДЮСШ", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, "leisure/sports_centre/Ледовый дворец": {"tags": {"name": "Ледовый дворец", "leisure": "sports_centre"}, "name": "Ледовый дворец", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, "leisure/sports_centre/体育館": {"tags": {"name": "体育館", "leisure": "sports_centre"}, "name": "体育館", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, - "leisure/swimming_pool/Schwimmerbecken": {"tags": {"name": "Schwimmerbecken", "leisure": "swimming_pool"}, "name": "Schwimmerbecken", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address"], "suggestion": true}, - "leisure/swimming_pool/Yüzme Havuzu": {"tags": {"name": "Yüzme Havuzu", "leisure": "swimming_pool"}, "name": "Yüzme Havuzu", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address"], "suggestion": true}, - "leisure/swimming_pool/プール": {"tags": {"name": "プール", "leisure": "swimming_pool"}, "name": "プール", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address"], "suggestion": true}, - "leisure/swimming_pool/游泳池": {"tags": {"name": "游泳池", "leisure": "swimming_pool"}, "name": "游泳池", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address"], "suggestion": true}, + "leisure/swimming_pool/Schwimmerbecken": {"tags": {"name": "Schwimmerbecken", "leisure": "swimming_pool"}, "name": "Schwimmerbecken", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, + "leisure/swimming_pool/Yüzme Havuzu": {"tags": {"name": "Yüzme Havuzu", "leisure": "swimming_pool"}, "name": "Yüzme Havuzu", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, + "leisure/swimming_pool/プール": {"tags": {"name": "プール", "leisure": "swimming_pool"}, "name": "プール", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, + "leisure/swimming_pool/游泳池": {"tags": {"name": "游泳池", "leisure": "swimming_pool"}, "name": "游泳池", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, "man_made/windmill/De Hoop": {"tags": {"name": "De Hoop", "man_made": "windmill"}, "name": "De Hoop", "icon": "temaki-windmill", "geometry": ["point", "area"], "fields": ["building_area"], "suggestion": true}, "shop/alcohol/Alko": {"tags": {"name": "Alko", "shop": "alcohol"}, "name": "Alko", "icon": "maki-alcohol-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "drive_through"], "suggestion": true}, "shop/alcohol/BC Liquor Store": {"tags": {"name": "BC Liquor Store", "shop": "alcohol"}, "name": "BC Liquor Store", "icon": "maki-alcohol-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "drive_through"], "suggestion": true}, diff --git a/data/presets/presets/leisure/swimming_pool.json b/data/presets/presets/leisure/swimming_pool.json index 4c64b8278..0d868e43d 100644 --- a/data/presets/presets/leisure/swimming_pool.json +++ b/data/presets/presets/leisure/swimming_pool.json @@ -4,7 +4,8 @@ "name", "access_simple", "operator", - "address" + "address", + "lit" ], "geometry": [ "point", @@ -12,7 +13,8 @@ ], "terms": [ "dive", - "water" + "water", + "aquatics" ], "tags": { "leisure": "swimming_pool" diff --git a/dist/locales/en.json b/dist/locales/en.json index 5398ff08e..67c18e69e 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -5019,7 +5019,7 @@ }, "leisure/swimming_pool": { "name": "Swimming Pool", - "terms": "dive,water" + "terms": "dive,water,aquatics" }, "leisure/track": { "name": "Racetrack (Non-Motorsport)", From 46fc0174f4e8ea683dfdcde78d819db0744b3dbc Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 12:08:45 -0400 Subject: [PATCH 187/217] Add presets for `highway=milestone` and `waterway=milestone` (closes #5284) --- data/presets.yaml | 12 +++++++++++- data/presets/fields.json | 2 +- data/presets/fields/distance.json | 2 +- data/presets/presets.json | 4 +++- data/presets/presets/highway/milestone.json | 19 +++++++++++++++++++ data/presets/presets/railway/milestone.json | 3 ++- data/presets/presets/waterway/milestone.json | 19 +++++++++++++++++++ data/taginfo.json | 16 +++++++++++++++- dist/locales/en.json | 10 +++++++++- 9 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 data/presets/presets/highway/milestone.json create mode 100644 data/presets/presets/waterway/milestone.json diff --git a/data/presets.yaml b/data/presets.yaml index c0ddc84a2..16965e039 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -506,7 +506,7 @@ en: label: Display distance: # distance=* - label: Total Distance + label: Distance dock: # dock=* label: Type @@ -3366,6 +3366,11 @@ en: # highway=living_street name: Living Street terms: '' + highway/milestone: + # highway=milestone + name: Highway Milestone + # 'terms: milestone,marker' + terms: '' highway/mini_roundabout: # highway=mini_roundabout name: Mini-Roundabout @@ -6004,6 +6009,11 @@ en: name: Marine Fuel Station # 'terms: petrol,gas,diesel,boat' terms: '' + waterway/milestone: + # waterway=milestone + name: Waterway Milestone + # 'terms: milestone,marker' + terms: '' waterway/river: # waterway=river name: River diff --git a/data/presets/fields.json b/data/presets/fields.json index 8698d74ff..f82ff44b8 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -82,7 +82,7 @@ "direction": {"key": "direction", "type": "number", "label": "Direction (Degrees Clockwise)", "placeholder": "45, 90, 180, 270"}, "dispensing": {"key": "dispensing", "type": "check", "label": "Dispenses Prescriptions", "default": "yes"}, "display": {"key": "display", "type": "combo", "label": "Display", "options": ["analog", "digital", "sundial", "unorthodox"]}, - "distance": {"key": "distance", "type": "text", "label": "Total Distance"}, + "distance": {"key": "distance", "type": "text", "label": "Distance"}, "dock": {"key": "dock", "type": "combo", "label": "Type"}, "drive_through": {"key": "drive_through", "type": "check", "label": "Drive-Through"}, "duration": {"key": "duration", "type": "text", "label": "Duration", "placeholder": "00:00"}, diff --git a/data/presets/fields/distance.json b/data/presets/fields/distance.json index 4619784a6..40ffbcf87 100644 --- a/data/presets/fields/distance.json +++ b/data/presets/fields/distance.json @@ -1,5 +1,5 @@ { "key": "distance", "type": "text", - "label": "Total Distance" + "label": "Distance" } diff --git a/data/presets/presets.json b/data/presets/presets.json index 7eee32062..f8917c739 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -367,6 +367,7 @@ "highway/footway": {"icon": "iD-highway-footway", "fields": ["name", "surface", "lit", "width", "structure", "access"], "geometry": ["line"], "terms": ["hike", "hiking", "trackway", "trail", "walk"], "tags": {"highway": "footway"}, "name": "Foot Path"}, "highway/give_way": {"icon": "temaki-yield", "fields": ["direction_vertex"], "geometry": ["vertex"], "tags": {"highway": "give_way"}, "terms": ["give way", "yield", "sign"], "name": "Yield Sign"}, "highway/living_street": {"icon": "iD-highway-living-street", "fields": ["name", "oneway", "maxspeed", "lanes", "surface", "structure", "maxheight", "access", "cycleway"], "geometry": ["line"], "tags": {"highway": "living_street"}, "name": "Living Street"}, + "highway/milestone": {"icon": "temaki-milestone", "geometry": ["point", "vertex"], "fields": ["distance", "direction_vertex"], "tags": {"highway": "milestone"}, "terms": ["milestone", "marker"], "name": "Highway Milestone"}, "highway/mini_roundabout": {"icon": "maki-circle-stroked", "geometry": ["vertex"], "tags": {"highway": "mini_roundabout"}, "fields": ["direction_clock"], "name": "Mini-Roundabout"}, "highway/motorway_junction": {"icon": "temaki-junction", "fields": ["ref_highway_junction", "name"], "geometry": ["vertex"], "tags": {"highway": "motorway_junction"}, "terms": ["exit"], "name": "Motorway Junction / Exit"}, "highway/motorway_link": {"icon": "iD-highway-motorway-link", "fields": ["name", "ref_road_number", "oneway", "maxspeed", "maxspeed/advisory", "lanes", "surface", "structure", "maxheight", "access"], "geometry": ["line"], "tags": {"highway": "motorway_link"}, "addTags": {"highway": "motorway_link", "oneway": "yes"}, "removeTags": {"highway": "motorway_link", "oneway": "yes"}, "terms": ["exit", "ramp", "road", "street", "on ramp", "off ramp"], "name": "Motorway Link"}, @@ -731,7 +732,7 @@ "railway/funicular": {"icon": "iD-railway-rail", "geometry": ["line"], "terms": ["venicular", "cliff railway", "cable car", "cable railway", "funicular railway"], "fields": ["structure", "gauge", "service_rail"], "tags": {"railway": "funicular"}, "name": "Funicular"}, "railway/level_crossing": {"icon": "maki-cross", "geometry": ["vertex"], "tags": {"railway": "level_crossing"}, "terms": ["crossing", "railroad crossing", "level crossing", "grade crossing", "road through railroad", "train crossing"], "name": "Railway Crossing (Road)"}, "railway/light_rail": {"icon": "iD-railway-light-rail", "fields": ["name", "structure", "gauge", "electrified", "service_rail", "usage_rail", "voltage", "frequency"], "geometry": ["line"], "tags": {"railway": "light_rail"}, "terms": ["light rail", "streetcar", "trolley"], "name": "Light Rail"}, - "railway/milestone": {"icon": "temaki-milestone", "geometry": ["point", "vertex"], "fields": ["railway/position"], "tags": {"railway": "milestone"}, "terms": ["milestone", "marker"], "name": "Railway Milestone"}, + "railway/milestone": {"icon": "temaki-milestone", "geometry": ["point", "vertex"], "fields": ["railway/position", "direction_vertex"], "tags": {"railway": "milestone"}, "terms": ["milestone", "marker"], "name": "Railway Milestone"}, "railway/miniature": {"icon": "iD-railway-rail", "geometry": ["line"], "tags": {"railway": "miniature"}, "fields": ["name", "structure", "gauge", "electrified", "service_rail"], "terms": ["rideable miniature railway", "narrow gauge railway", "minimum gauge railway"], "name": "Miniature Railway"}, "railway/monorail": {"icon": "iD-railway-monorail", "fields": ["name", "structure", "electrified", "service_rail", "usage_rail", "voltage", "frequency"], "geometry": ["line"], "tags": {"railway": "monorail"}, "terms": [], "name": "Monorail"}, "railway/narrow_gauge": {"icon": "iD-railway-rail", "fields": ["name", "structure", "gauge", "electrified", "service_rail", "usage_rail", "voltage", "frequency"], "geometry": ["line"], "tags": {"railway": "narrow_gauge"}, "terms": ["narrow gauge railway", "narrow gauge railroad"], "name": "Narrow Gauge Rail"}, @@ -947,6 +948,7 @@ "waterway/dock": {"icon": "maki-harbor", "fields": ["name", "dock", "operator"], "geometry": ["area", "vertex", "point"], "terms": ["boat", "ship", "vessel", "marine"], "tags": {"waterway": "dock"}, "name": "Wet Dock / Dry Dock"}, "waterway/drain": {"icon": "iD-waterway-ditch", "fields": ["structure_waterway", "intermittent"], "geometry": ["line"], "tags": {"waterway": "drain"}, "name": "Drain"}, "waterway/fuel": {"icon": "maki-fuel", "fields": ["name", "operator", "address", "opening_hours", "fuel_multi"], "geometry": ["point", "area"], "terms": ["petrol", "gas", "diesel", "boat"], "tags": {"waterway": "fuel"}, "name": "Marine Fuel Station"}, + "waterway/milestone": {"icon": "temaki-milestone", "geometry": ["point", "vertex"], "fields": ["distance", "direction_vertex"], "tags": {"waterway": "milestone"}, "terms": ["milestone", "marker"], "name": "Waterway Milestone"}, "waterway/river": {"icon": "iD-waterway-river", "fields": ["name", "structure_waterway", "width", "intermittent"], "geometry": ["line"], "terms": ["beck", "branch", "brook", "course", "creek", "estuary", "rill", "rivulet", "run", "runnel", "stream", "tributary", "watercourse"], "tags": {"waterway": "river"}, "name": "River"}, "waterway/riverbank": {"icon": "maki-water", "geometry": ["area"], "tags": {"waterway": "riverbank"}, "name": "Riverbank"}, "waterway/sanitary_dump_station": {"icon": "temaki-storage_tank", "fields": ["name", "operator", "access_simple", "fee", "water_point"], "geometry": ["point", "vertex", "area"], "terms": ["Boat", "Watercraft", "Sanitary", "Dump Station", "Pumpout", "Pump out", "Elsan", "CDP", "CTDP", "Chemical Toilet"], "tags": {"waterway": "sanitary_dump_station"}, "name": "Marine Toilet Disposal"}, diff --git a/data/presets/presets/highway/milestone.json b/data/presets/presets/highway/milestone.json new file mode 100644 index 000000000..543071790 --- /dev/null +++ b/data/presets/presets/highway/milestone.json @@ -0,0 +1,19 @@ +{ + "icon": "temaki-milestone", + "geometry": [ + "point", + "vertex" + ], + "fields": [ + "distance", + "direction_vertex" + ], + "tags": { + "highway": "milestone" + }, + "terms": [ + "milestone", + "marker" + ], + "name": "Highway Milestone" +} diff --git a/data/presets/presets/railway/milestone.json b/data/presets/presets/railway/milestone.json index 50b846d24..17b64377a 100644 --- a/data/presets/presets/railway/milestone.json +++ b/data/presets/presets/railway/milestone.json @@ -5,7 +5,8 @@ "vertex" ], "fields": [ - "railway/position" + "railway/position", + "direction_vertex" ], "tags": { "railway": "milestone" diff --git a/data/presets/presets/waterway/milestone.json b/data/presets/presets/waterway/milestone.json new file mode 100644 index 000000000..1988511ee --- /dev/null +++ b/data/presets/presets/waterway/milestone.json @@ -0,0 +1,19 @@ +{ + "icon": "temaki-milestone", + "geometry": [ + "point", + "vertex" + ], + "fields": [ + "distance", + "direction_vertex" + ], + "tags": { + "waterway": "milestone" + }, + "terms": [ + "milestone", + "marker" + ], + "name": "Waterway Milestone" +} diff --git a/data/taginfo.json b/data/taginfo.json index e128a08a5..0e5e37b10 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -2459,6 +2459,13 @@ "object_types": ["way"], "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/iD-sprite/presets/highway-living-street.svg?sanitize=true" }, + { + "key": "highway", + "value": "milestone", + "description": "Highway Milestone", + "object_types": ["node"], + "icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/milestone.svg?sanitize=true" + }, { "key": "highway", "value": "mini_roundabout", @@ -6202,6 +6209,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/fuel-15.svg?sanitize=true" }, + { + "key": "waterway", + "value": "milestone", + "description": "Waterway Milestone", + "object_types": ["node"], + "icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/milestone.svg?sanitize=true" + }, { "key": "waterway", "value": "river", @@ -6497,7 +6511,7 @@ {"key": "direction", "description": "Direction (Degrees Clockwise)"}, {"key": "dispensing", "description": "Dispenses Prescriptions"}, {"key": "display", "description": "Display"}, - {"key": "distance", "description": "Total Distance"}, + {"key": "distance", "description": "Distance"}, {"key": "dock", "description": "Type"}, {"key": "drive_through", "description": "Drive-Through"}, {"key": "duration", "description": "Duration"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 67c18e69e..3a3474937 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1890,7 +1890,7 @@ "label": "Display" }, "distance": { - "label": "Total Distance" + "label": "Distance" }, "dock": { "label": "Type" @@ -4397,6 +4397,10 @@ "name": "Living Street", "terms": "" }, + "highway/milestone": { + "name": "Highway Milestone", + "terms": "milestone,marker" + }, "highway/mini_roundabout": { "name": "Mini-Roundabout", "terms": "" @@ -6717,6 +6721,10 @@ "name": "Marine Fuel Station", "terms": "petrol,gas,diesel,boat" }, + "waterway/milestone": { + "name": "Waterway Milestone", + "terms": "milestone,marker" + }, "waterway/river": { "name": "River", "terms": "beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse" From 85d5c6798012b2c605108b6e6e8ab6dae42096d4 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 14:17:31 -0400 Subject: [PATCH 188/217] Add building_area field to bandstand preset (re: https://github.com/openstreetmap/iD/pull/5262#issuecomment-418441439) --- data/presets.yaml | 4 ++++ data/presets/presets.json | 1 + data/presets/presets/leisure/bandstand.json | 4 ++-- data/taginfo.json | 7 +++++++ dist/locales/en.json | 4 ++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index f733fa5c8..8b26f7d48 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -3814,6 +3814,10 @@ en: name: Amusement Arcade # 'terms: pay-to-play games,video games,driving simulators,pinball machines' terms: '' + leisure/bandstand: + # leisure=bandstand + name: Bandstand + terms: '' leisure/beach_resort: # leisure=beach_resort name: Beach Resort diff --git a/data/presets/presets.json b/data/presets/presets.json index 3d677ec38..40518e4c6 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -464,6 +464,7 @@ "leisure": {"icon": "maki-pitch", "fields": ["name", "leisure"], "geometry": ["point", "vertex", "area"], "tags": {"leisure": "*"}, "name": "Leisure"}, "leisure/adult_gaming_centre": {"icon": "temaki-dice", "fields": ["name", "operator", "address", "building_area", "opening_hours", "smoking"], "geometry": ["point", "area"], "terms": ["gambling", "slot machine"], "tags": {"leisure": "adult_gaming_centre"}, "name": "Adult Gaming Center"}, "leisure/amusement_arcade": {"icon": "maki-gaming", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["pay-to-play games", "video games", "driving simulators", "pinball machines"], "tags": {"leisure": "amusement_arcade"}, "name": "Amusement Arcade"}, + "leisure/bandstand": {"icon": "maki-music", "fields": ["name", "building_area", "operator"], "geometry": ["point", "area"], "tags": {"leisure": "bandstand"}, "name": "Bandstand"}, "leisure/beach_resort": {"icon": "temaki-beach", "fields": ["name", "address", "fee"], "geometry": ["point", "area"], "tags": {"leisure": "beach_resort"}, "name": "Beach Resort"}, "leisure/bird_hide": {"icon": "temaki-binoculars", "fields": ["building_area"], "geometry": ["point", "area"], "tags": {"leisure": "bird_hide"}, "terms": ["machan", "ornithology"], "name": "Bird Hide"}, "leisure/bleachers": {"geometry": ["point", "area"], "tags": {"leisure": "bleachers"}, "terms": ["crowd", "bench", "sports", "stand", "stands", "seat", "seating"], "name": "Bleachers"}, diff --git a/data/presets/presets/leisure/bandstand.json b/data/presets/presets/leisure/bandstand.json index 5db341650..1621440b2 100644 --- a/data/presets/presets/leisure/bandstand.json +++ b/data/presets/presets/leisure/bandstand.json @@ -2,6 +2,7 @@ "icon": "maki-music", "fields": [ "name", + "building_area", "operator" ], "geometry": [ @@ -9,8 +10,7 @@ "area" ], "tags": { - "leisure": "bandstand", - "building": "roof" + "leisure": "bandstand" }, "name": "Bandstand" } diff --git a/data/taginfo.json b/data/taginfo.json index 54c677b0b..730f680ca 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -3114,6 +3114,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/gaming-15.svg?sanitize=true" }, + { + "key": "leisure", + "value": "bandstand", + "description": "Bandstand", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/music-15.svg?sanitize=true" + }, { "key": "leisure", "value": "beach_resort", diff --git a/dist/locales/en.json b/dist/locales/en.json index 02ee00cde..551ed630a 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -4785,6 +4785,10 @@ "name": "Amusement Arcade", "terms": "pay-to-play games,video games,driving simulators,pinball machines" }, + "leisure/bandstand": { + "name": "Bandstand", + "terms": "" + }, "leisure/beach_resort": { "name": "Beach Resort", "terms": "" From 8e6ae18c261412a28294af0b193910f03f0fc038 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 15:47:25 -0400 Subject: [PATCH 189/217] Add `languages:` multiselect combo to Language School preset --- data/presets.yaml | 8 ++++++++ data/presets/fields.json | 1 + data/presets/fields/language_multi.json | 5 +++++ data/presets/presets.json | 1 + data/presets/presets/amenity/language_school.json | 13 +++++++------ data/taginfo.json | 8 ++++++++ dist/locales/en.json | 7 +++++++ 7 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 data/presets/fields/language_multi.json diff --git a/data/presets.yaml b/data/presets.yaml index 8b26f7d48..489013b2b 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -794,6 +794,9 @@ en: label: Lanes # lanes field placeholder placeholder: '1, 2, 3...' + language_multi: + # 'language:=*' + label: Languages layer: # layer=* label: Layer @@ -2120,6 +2123,11 @@ en: name: Preschool/Kindergarten Grounds # 'terms: kindergarden,pre-school' terms: '' + amenity/language_school: + # amenity=language_school + name: Language School + # 'terms: esl' + terms: '' amenity/library: # amenity=library name: Library diff --git a/data/presets/fields.json b/data/presets/fields.json index f82ff44b8..d0ccb21db 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -144,6 +144,7 @@ "lamp_type": {"key": "lamp_type", "type": "combo", "label": "Type"}, "landuse": {"key": "landuse", "type": "typeCombo", "label": "Type"}, "lanes": {"key": "lanes", "type": "number", "minValue": 0, "label": "Lanes", "placeholder": "1, 2, 3..."}, + "language_multi": {"key": "language:", "type": "multiCombo", "label": "Languages"}, "layer": {"key": "layer", "type": "number", "label": "Layer", "placeholder": "0"}, "leaf_cycle_singular": {"key": "leaf_cycle", "type": "combo", "label": "Leaf Cycle", "strings": {"options": {"evergreen": "Evergreen", "deciduous": "Deciduous", "semi_evergreen": "Semi-Evergreen", "semi_deciduous": "Semi-Deciduous"}}}, "leaf_cycle": {"key": "leaf_cycle", "type": "combo", "label": "Leaf Cycle", "strings": {"options": {"evergreen": "Evergreen", "deciduous": "Deciduous", "semi_evergreen": "Semi-Evergreen", "semi_deciduous": "Semi-Deciduous", "mixed": "Mixed"}}}, diff --git a/data/presets/fields/language_multi.json b/data/presets/fields/language_multi.json new file mode 100644 index 000000000..29c1df6fb --- /dev/null +++ b/data/presets/fields/language_multi.json @@ -0,0 +1,5 @@ +{ + "key": "language:", + "type": "multiCombo", + "label": "Languages" +} diff --git a/data/presets/presets.json b/data/presets/presets.json index 40518e4c6..6c2e262cc 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -92,6 +92,7 @@ "amenity/ice_cream": {"icon": "maki-ice-cream", "fields": ["name", "address", "building_area", "opening_hours", "takeaway", "delivery", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["gelato", "sorbet", "sherbet", "frozen", "yogurt"], "tags": {"amenity": "ice_cream"}, "name": "Ice Cream Shop"}, "amenity/internet_cafe": {"icon": "temaki-antenna", "fields": ["name", "operator", "address", "building_area", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["cybercafe", "taxiphone", "teleboutique", "coffee", "cafe", "net", "lanhouse"], "tags": {"amenity": "internet_cafe"}, "name": "Internet Cafe"}, "amenity/kindergarten": {"icon": "maki-school", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["kindergarden", "pre-school"], "tags": {"amenity": "kindergarten"}, "name": "Preschool/Kindergarten Grounds"}, + "amenity/language_school": {"icon": "maki-school", "fields": ["name", "language_multi", "operator", "address"], "geometry": ["point", "area"], "terms": ["esl"], "tags": {"amenity": "language_school"}, "name": "Language School"}, "amenity/library": {"icon": "maki-library", "fields": ["name", "operator", "building_area", "address", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "ref/isil"], "geometry": ["point", "area"], "terms": ["book"], "tags": {"amenity": "library"}, "name": "Library"}, "amenity/love_hotel": {"icon": "maki-heart", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"amenity": "love_hotel"}, "name": "Love Hotel"}, "amenity/marketplace": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building", "opening_hours"], "geometry": ["point", "area"], "tags": {"amenity": "marketplace"}, "name": "Marketplace"}, diff --git a/data/presets/presets/amenity/language_school.json b/data/presets/presets/amenity/language_school.json index cbdb27e26..4adc86f98 100644 --- a/data/presets/presets/amenity/language_school.json +++ b/data/presets/presets/amenity/language_school.json @@ -2,18 +2,19 @@ "icon": "maki-school", "fields": [ "name", + "language_multi", "operator", - "address", - "phone", - "website", - "wheelchair" + "address" ], "geometry": [ "point", "area" ], + "terms": [ + "esl" + ], "tags": { - "amenity": "school" + "amenity": "language_school" }, - "name": "Language school" + "name": "Language School" } diff --git a/data/taginfo.json b/data/taginfo.json index 730f680ca..8cfea579e 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -616,6 +616,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/school-15.svg?sanitize=true" }, + { + "key": "amenity", + "value": "language_school", + "description": "Language School", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/school-15.svg?sanitize=true" + }, { "key": "amenity", "value": "library", @@ -6662,6 +6669,7 @@ {"key": "label", "description": "Label"}, {"key": "lamp_type", "description": "Type"}, {"key": "lanes", "description": "Lanes"}, + {"key": "language:", "description": "Languages"}, {"key": "layer", "description": "Layer"}, {"key": "leaf_cycle", "value": "evergreen", "description": "Leaf Cycle"}, {"key": "leaf_cycle", "value": "deciduous", "description": "Leaf Cycle"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 551ed630a..a01c2cac6 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2142,6 +2142,9 @@ "label": "Lanes", "placeholder": "1, 2, 3..." }, + "language_multi": { + "label": "Languages" + }, "layer": { "label": "Layer", "placeholder": "0" @@ -3297,6 +3300,10 @@ "name": "Preschool/Kindergarten Grounds", "terms": "kindergarden,pre-school" }, + "amenity/language_school": { + "name": "Language School", + "terms": "esl" + }, "amenity/library": { "name": "Library", "terms": "book" From 91872d72f8e0568e275f94b244d08f23208c9fc4 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 16:16:34 -0400 Subject: [PATCH 190/217] Code formatting, replace regex `match` with `test` (minor point, but `test` is much faster when you just want a boolean result) --- modules/ui/fields/combo.js | 124 +++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 59 deletions(-) diff --git a/modules/ui/fields/combo.js b/modules/ui/fields/combo.js index 3da0e37ad..f98f8149f 100644 --- a/modules/ui/fields/combo.js +++ b/modules/ui/fields/combo.js @@ -8,11 +8,17 @@ import _some from 'lodash-es/some'; import _uniq from 'lodash-es/uniq'; import { dispatch as d3_dispatch } from 'd3-dispatch'; -import { event as d3_event } from 'd3-selection'; + +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + import { d3combobox as d3_combobox } from '../../lib/d3.combobox.js'; import { t } from '../../util/locale'; import { services } from '../../services'; + import { utilGetSetValue, utilNoAuto, @@ -28,29 +34,29 @@ export { export function uiFieldCombo(field, context) { - var dispatch = d3_dispatch('change'), - nominatim = services.geocoder, - taginfo = services.taginfo, - isMulti = (field.type === 'multiCombo'), - isNetwork = (field.type === 'networkCombo'), - isSemi = (field.type === 'semiCombo'), - optstrings = field.strings && field.strings.options, - optarray = field.options, - snake_case = (field.snake_case || (field.snake_case === undefined)), - caseSensitive = field.caseSensitive, - combobox = d3_combobox() - .container(context.container()) - .caseSensitive(caseSensitive) - .minItems(isMulti || isSemi ? 1 : 2), - comboData = [], - multiData = [], - container, - input, - entity, - country; + var dispatch = d3_dispatch('change'); + var nominatim = services.geocoder; + var taginfo = services.taginfo; + var isMulti = (field.type === 'multiCombo'); + var isNetwork = (field.type === 'networkCombo'); + var isSemi = (field.type === 'semiCombo'); + var optstrings = field.strings && field.strings.options; + var optarray = field.options; + var snake_case = (field.snake_case || (field.snake_case === undefined)); + var caseSensitive = field.caseSensitive; + var combobox = d3_combobox() + .container(context.container()) + .caseSensitive(caseSensitive) + .minItems(isMulti || isSemi ? 1 : 2); + var container = d3_select(null); + var input = d3_select(null); + var _comboData = []; + var _multiData = []; + var _entity; + var _country; // ensure multiCombo field.key ends with a ':' - if (isMulti && field.key.match(/:$/) === null) { + if (isMulti && /[^:]$/.test(field.key)) { field.key += ':'; } @@ -76,11 +82,11 @@ export function uiFieldCombo(field, context) { dval = clean(dval || ''); if (optstrings) { - var match = _find(comboData, function(o) { + var found = _find(_comboData, function(o) { return o.key && clean(o.value) === dval; }); - if (match) { - return match.key; + if (found) { + return found.key; } } @@ -98,9 +104,9 @@ export function uiFieldCombo(field, context) { tval = tval || ''; if (optstrings) { - var match = _find(comboData, function(o) { return o.key === tval && o.value; }); - if (match) { - return match.value; + var found = _find(_comboData, function(o) { return o.key === tval && o.value; }); + if (found) { + return found.value; } } @@ -140,7 +146,7 @@ export function uiFieldCombo(field, context) { if (!(optstrings || optarray)) return; if (optstrings) { - comboData = Object.keys(optstrings).map(function(k) { + _comboData = Object.keys(optstrings).map(function(k) { var v = field.t('options.' + k, { 'default': optstrings[k] }); return { key: k, @@ -150,7 +156,7 @@ export function uiFieldCombo(field, context) { }); } else if (optarray) { - comboData = optarray.map(function(k) { + _comboData = optarray.map(function(k) { var v = snake_case ? unsnake(k) : k; return { key: k, @@ -160,17 +166,17 @@ export function uiFieldCombo(field, context) { }); } - combobox.data(objectDifference(comboData, multiData)); - if (callback) callback(comboData); + combobox.data(objectDifference(_comboData, _multiData)); + if (callback) callback(_comboData); } function setTaginfoValues(q, callback) { var fn = isMulti ? 'multikeys' : 'values'; var query = (isMulti ? field.key : '') + q; - var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0; + var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0; if (hasCountryPrefix) { - query = country + ':'; + query = _country + ':'; } var params = { @@ -179,19 +185,19 @@ export function uiFieldCombo(field, context) { query: query }; - if (entity) { - params.geometry = context.geometry(entity.id); + if (_entity) { + params.geometry = context.geometry(_entity.id); } taginfo[fn](params, function(err, data) { if (err) return; if (hasCountryPrefix) { data = _filter(data, function(d) { - return d.value.toLowerCase().indexOf(country + ':') === 0; + return d.value.toLowerCase().indexOf(_country + ':') === 0; }); } - comboData = _map(data, function(d) { + _comboData = _map(data, function(d) { var k = d.value; if (isMulti) k = k.replace(field.key, ''); var v = snake_case ? unsnake(k) : k; @@ -202,8 +208,8 @@ export function uiFieldCombo(field, context) { }; }); - comboData = objectDifference(comboData, multiData); - if (callback) callback(comboData); + _comboData = objectDifference(_comboData, _multiData); + if (callback) callback(_comboData); }); } @@ -219,7 +225,7 @@ export function uiFieldCombo(field, context) { ph = field.placeholder() || placeholders.slice(0, 3).join(', '); } - if (ph.match(/(…|\.\.\.)$/) === null) { + if (!/(…|\.\.\.)$/.test(ph)) { ph += '…'; } @@ -229,8 +235,8 @@ export function uiFieldCombo(field, context) { function change() { - var val = tagValue(utilGetSetValue(input)), - t = {}; + var val = tagValue(utilGetSetValue(input)); + var t = {}; if (isMulti || isSemi) { if (!val) return; @@ -240,7 +246,7 @@ export function uiFieldCombo(field, context) { field.keys.push(field.key + val); t[field.key + val] = 'yes'; } else if (isSemi) { - var arr = multiData.map(function(d) { return d.key; }); + var arr = _multiData.map(function(d) { return d.key; }); arr.push(val); t[field.key] = _compact(_uniq(arr)).join(';'); } @@ -260,8 +266,8 @@ export function uiFieldCombo(field, context) { if (isMulti) { t[d.key] = undefined; } else if (isSemi) { - _remove(multiData, function(md) { return md.key === d.key; }); - var arr = multiData.map(function(md) { return md.key; }); + _remove(_multiData, function(md) { return md.key === d.key; }); + var arr = _multiData.map(function(md) { return md.key; }); arr = _compact(_uniq(arr)); t[field.key] = arr.length ? arr.join(';') : undefined; } @@ -296,10 +302,10 @@ export function uiFieldCombo(field, context) { .call(initCombo, selection) .merge(input); - if (isNetwork && nominatim && entity) { - var center = entity.extent(context.graph()).center(); + if (isNetwork && nominatim && _entity) { + var center = _entity.extent(context.graph()).center(); nominatim.countryCode(center, function (err, code) { - country = code; + _country = code; }); } @@ -322,26 +328,26 @@ export function uiFieldCombo(field, context) { combo.tags = function(tags) { if (isMulti || isSemi) { - multiData = []; + _multiData = []; if (isMulti) { - // Build multiData array containing keys already set.. + // Build _multiData array containing keys already set.. Object.keys(tags).forEach(function(key) { if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return; var suffix = key.substring(field.key.length); - multiData.push({ + _multiData.push({ key: key, value: displayValue(suffix) }); }); // Set keys for form-field modified (needed for undo and reset buttons).. - field.keys = _map(multiData, 'key'); + field.keys = _map(_multiData, 'key'); } else if (isSemi) { var arr = _compact(_uniq((tags[field.key] || '').split(';'))); - multiData = arr.map(function(key) { + _multiData = arr.map(function(key) { return { key: key, value: displayValue(key) @@ -350,7 +356,7 @@ export function uiFieldCombo(field, context) { } // Exclude existing multikeys from combo options.. - var available = objectDifference(comboData, multiData); + var available = objectDifference(_comboData, _multiData); combobox.data(available); // Hide 'Add' button if this field uses fixed set of @@ -361,7 +367,7 @@ export function uiFieldCombo(field, context) { // Render chips var chips = container.selectAll('.chips') - .data(multiData); + .data(_multiData); chips.exit() .remove(); @@ -394,9 +400,9 @@ export function uiFieldCombo(field, context) { }; - combo.entity = function(_) { - if (!arguments.length) return entity; - entity = _; + combo.entity = function(val) { + if (!arguments.length) return _entity; + _entity = val; return combo; }; From 71592f3c727494e2b0123bb4a19a02b637c43047 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 17:31:46 -0400 Subject: [PATCH 191/217] Treat multicombo values other than 'no' and '' as if they are set And don't set a multicombo value to 'yes' if it already has a non-'no' value (closes #5291) --- modules/ui/fields/combo.js | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/modules/ui/fields/combo.js b/modules/ui/fields/combo.js index f98f8149f..1df90468b 100644 --- a/modules/ui/fields/combo.js +++ b/modules/ui/fields/combo.js @@ -242,14 +242,24 @@ export function uiFieldCombo(field, context) { if (!val) return; container.classed('active', false); utilGetSetValue(input, ''); + if (isMulti) { - field.keys.push(field.key + val); - t[field.key + val] = 'yes'; + var key = field.key + val; + if (_entity) { + // don't set a multicombo value to 'yes' if it already has a non-'no' value + // e.g. `language:de=main` + var old = _entity.tags[key] || ''; + if (old && old.toLowerCase() !== 'no') return; + } + field.keys.push(key); + t[key] = 'yes'; + } else if (isSemi) { var arr = _multiData.map(function(d) { return d.key; }); arr.push(val); t[field.key] = _compact(_uniq(arr)).join(';'); } + window.setTimeout(function() { input.node().focus(); }, 10); } else { @@ -332,25 +342,27 @@ export function uiFieldCombo(field, context) { if (isMulti) { // Build _multiData array containing keys already set.. - Object.keys(tags).forEach(function(key) { - if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return; + for (var k in tags) { + if (k.indexOf(field.key) !== 0) continue; + var v = (tags[k] || '').toLowerCase(); + if (v === '' || v === 'no') continue; - var suffix = key.substring(field.key.length); + var suffix = k.substring(field.key.length); _multiData.push({ - key: key, + key: k, value: displayValue(suffix) }); - }); + } // Set keys for form-field modified (needed for undo and reset buttons).. field.keys = _map(_multiData, 'key'); } else if (isSemi) { var arr = _compact(_uniq((tags[field.key] || '').split(';'))); - _multiData = arr.map(function(key) { + _multiData = arr.map(function(k) { return { - key: key, - value: displayValue(key) + key: k, + value: displayValue(k) }; }); } From 3569b5af13fd5c065320268b97e9f9d2966fd1ee Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 17:43:30 -0400 Subject: [PATCH 192/217] More consistency between dance, music, driving, dance school presets --- data/presets/presets.json | 6 +++--- data/presets/presets/amenity/language_school.json | 6 ++++-- data/presets/presets/amenity/music_school.json | 4 +++- data/presets/presets/leisure/dancing_school.json | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index 6c2e262cc..427b79ef6 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -92,13 +92,13 @@ "amenity/ice_cream": {"icon": "maki-ice-cream", "fields": ["name", "address", "building_area", "opening_hours", "takeaway", "delivery", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["gelato", "sorbet", "sherbet", "frozen", "yogurt"], "tags": {"amenity": "ice_cream"}, "name": "Ice Cream Shop"}, "amenity/internet_cafe": {"icon": "temaki-antenna", "fields": ["name", "operator", "address", "building_area", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["cybercafe", "taxiphone", "teleboutique", "coffee", "cafe", "net", "lanhouse"], "tags": {"amenity": "internet_cafe"}, "name": "Internet Cafe"}, "amenity/kindergarten": {"icon": "maki-school", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["kindergarden", "pre-school"], "tags": {"amenity": "kindergarten"}, "name": "Preschool/Kindergarten Grounds"}, - "amenity/language_school": {"icon": "maki-school", "fields": ["name", "language_multi", "operator", "address"], "geometry": ["point", "area"], "terms": ["esl"], "tags": {"amenity": "language_school"}, "name": "Language School"}, + "amenity/language_school": {"icon": "maki-school", "fields": ["name", "operator", "address", "building_area", "opening_hours", "language_multi"], "geometry": ["point", "area"], "terms": ["esl"], "tags": {"amenity": "language_school"}, "name": "Language School"}, "amenity/library": {"icon": "maki-library", "fields": ["name", "operator", "building_area", "address", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "ref/isil"], "geometry": ["point", "area"], "terms": ["book"], "tags": {"amenity": "library"}, "name": "Library"}, "amenity/love_hotel": {"icon": "maki-heart", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"amenity": "love_hotel"}, "name": "Love Hotel"}, "amenity/marketplace": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building", "opening_hours"], "geometry": ["point", "area"], "tags": {"amenity": "marketplace"}, "name": "Marketplace"}, "amenity/monastery": {"icon": "maki-place-of-worship", "fields": ["name", "religion", "denomination", "address", "building_area"], "geometry": ["point", "area"], "terms": ["abbey", "basilica", "bethel", "cathedral", "chancel", "chantry", "chapel", "church", "fold", "house of God", "house of prayer", "house of worship", "minster", "mission", "monastery", "mosque", "oratory", "parish", "sacellum", "sanctuary", "shrine", "synagogue", "tabernacle", "temple"], "tags": {"amenity": "monastery"}, "name": "Monastery Grounds"}, "amenity/motorcycle_parking": {"icon": "fas-motorcycle", "fields": ["capacity", "operator", "covered", "access_simple"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "motorcycle_parking"}, "name": "Motorcycle Parking"}, - "amenity/music_school": {"icon": "maki-school", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["school of music"], "tags": {"amenity": "music_school"}, "name": "Music School"}, + "amenity/music_school": {"icon": "maki-school", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["school of music"], "tags": {"amenity": "music_school"}, "name": "Music School"}, "amenity/nightclub": {"icon": "maki-bar", "fields": ["name", "operator", "address", "building_area", "opening_hours", "smoking"], "geometry": ["point", "area"], "tags": {"amenity": "nightclub"}, "terms": ["disco*", "night club", "dancing", "dance club"], "name": "Nightclub"}, "amenity/parking_entrance": {"icon": "maki-entrance-alt1", "fields": ["access_simple", "ref"], "geometry": ["vertex"], "tags": {"amenity": "parking_entrance"}, "name": "Parking Garage Entrance/Exit"}, "amenity/parking_space": {"fields": ["capacity"], "geometry": ["point", "vertex", "area"], "terms": [], "tags": {"amenity": "parking_space"}, "matchScore": 0.95, "name": "Parking Space"}, @@ -472,7 +472,7 @@ "leisure/bowling_alley": {"icon": "temaki-bowling", "fields": ["name", "operator", "address", "building_area", "opening_hours", "smoking"], "geometry": ["point", "area"], "terms": ["bowling center"], "tags": {"leisure": "bowling_alley"}, "name": "Bowling Alley"}, "leisure/common": {"icon": "temaki-pedestrian", "geometry": ["point", "area"], "fields": ["name"], "terms": ["open space"], "tags": {"leisure": "common"}, "name": "Common"}, "leisure/dance": {"icon": "maki-music", "fields": ["name", "operator", "address", "building_area", "dance/style", "opening_hours"], "geometry": ["point", "area"], "terms": ["ballroom", "jive", "swing", "tango", "waltz"], "tags": {"leisure": "dance"}, "name": "Dance Hall"}, - "leisure/dancing_school": {"icon": "maki-music", "fields": ["name", "operator", "address", "opening_hours", "dance/style"], "geometry": ["point", "area"], "terms": ["jive", "swing", "tango", "waltz", "dance teaching"], "tags": {"leisure": "dance", "dance:teaching": "yes"}, "reference": {"key": "leisure", "value": "dance"}, "name": "Dance School"}, + "leisure/dancing_school": {"icon": "maki-music", "fields": ["name", "operator", "address", "building_area", "opening_hours", "dance/style"], "geometry": ["point", "area"], "terms": ["jive", "swing", "tango", "waltz", "dance teaching"], "tags": {"leisure": "dance", "dance:teaching": "yes"}, "reference": {"key": "leisure", "value": "dance"}, "name": "Dance School"}, "leisure/dog_park": {"icon": "maki-dog-park", "geometry": ["point", "area"], "fields": ["name"], "terms": [], "tags": {"leisure": "dog_park"}, "name": "Dog Park"}, "leisure/firepit": {"icon": "maki-fire-station", "fields": ["access_simple"], "geometry": ["point", "area"], "tags": {"leisure": "firepit"}, "terms": ["fireplace", "campfire"], "name": "Firepit"}, "leisure/fitness_centre": {"icon": "maki-pitch", "fields": ["name", "sport", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "fitness_centre"}, "terms": ["health", "gym", "leisure", "studio"], "name": "Gym / Fitness Center"}, diff --git a/data/presets/presets/amenity/language_school.json b/data/presets/presets/amenity/language_school.json index 4adc86f98..f5c98dda4 100644 --- a/data/presets/presets/amenity/language_school.json +++ b/data/presets/presets/amenity/language_school.json @@ -2,9 +2,11 @@ "icon": "maki-school", "fields": [ "name", - "language_multi", "operator", - "address" + "address", + "building_area", + "opening_hours", + "language_multi" ], "geometry": [ "point", diff --git a/data/presets/presets/amenity/music_school.json b/data/presets/presets/amenity/music_school.json index a453147f8..f65082e26 100644 --- a/data/presets/presets/amenity/music_school.json +++ b/data/presets/presets/amenity/music_school.json @@ -3,7 +3,9 @@ "fields": [ "name", "operator", - "address" + "address", + "building_area", + "opening_hours" ], "geometry": [ "point", diff --git a/data/presets/presets/leisure/dancing_school.json b/data/presets/presets/leisure/dancing_school.json index 366077a63..80a8ace69 100644 --- a/data/presets/presets/leisure/dancing_school.json +++ b/data/presets/presets/leisure/dancing_school.json @@ -4,6 +4,7 @@ "name", "operator", "address", + "building_area", "opening_hours", "dance/style" ], From a50ab3a22f6189ff5e6985193fd3c5d0a7e81d4d Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 18:23:52 -0400 Subject: [PATCH 193/217] Also remove the `layer` tag when un-setting the bridge preset --- data/presets/presets.json | 2 +- data/presets/presets/man_made/bridge.json | 42 ++++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index 427b79ef6..6b34e9e71 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -534,7 +534,7 @@ "man_made/adit": {"icon": "maki-triangle", "geometry": ["point", "area"], "fields": ["operator", "direction"], "terms": ["entrance", "underground", "mine", "cave"], "tags": {"man_made": "adit"}, "name": "Adit"}, "man_made/antenna": {"icon": "temaki-antenna", "fields": ["height", "communication_multi"], "geometry": ["point"], "terms": ["broadcast", "cell phone", "cell", "communication", "mobile phone", "radio", "television", "transmission", "tv"], "tags": {"man_made": "antenna"}, "name": "Antenna"}, "man_made/breakwater": {"geometry": ["line", "area"], "tags": {"man_made": "breakwater"}, "name": "Breakwater"}, - "man_made/bridge": {"geometry": ["area"], "tags": {"man_made": "bridge"}, "name": "Bridge"}, + "man_made/bridge": {"fields": ["name", "bridge", "layer", "maxweight"], "geometry": ["area"], "tags": {"man_made": "bridge"}, "addTags": {"man_made": "bridge", "layer": "1"}, "removeTags": {"man_made": "bridge", "layer": "*"}, "reference": {"key": "man_made", "value": "bridge"}, "name": "Bridge"}, "man_made/bunker_silo": {"icon": "temaki-silo", "fields": ["content"], "geometry": ["point", "area"], "terms": ["Silage", "Storage"], "tags": {"man_made": "bunker_silo"}, "name": "Bunker Silo"}, "man_made/chimney": {"icon": "temaki-chimney", "geometry": ["point", "area"], "tags": {"man_made": "chimney"}, "name": "Chimney"}, "man_made/clearcut": {"icon": "maki-logging", "geometry": ["area"], "tags": {"man_made": "clearcut"}, "terms": ["cut", "forest", "lumber", "tree", "wood"], "name": "Clearcut Forest"}, diff --git a/data/presets/presets/man_made/bridge.json b/data/presets/presets/man_made/bridge.json index 58431a5e2..2a988e711 100644 --- a/data/presets/presets/man_made/bridge.json +++ b/data/presets/presets/man_made/bridge.json @@ -1,19 +1,27 @@ { - "fields": [ - "name", - "bridge", - "layer", - "maxweight" - ], - "geometry": [ - "area" - ], - "tags": { - "man_made": "bridge" - }, - "addTags": { - "man_made": "bridge", - "layer": "1" - }, - "name": "Bridge" + "fields": [ + "name", + "bridge", + "layer", + "maxweight" + ], + "geometry": [ + "area" + ], + "tags": { + "man_made": "bridge" + }, + "addTags": { + "man_made": "bridge", + "layer": "1" + }, + "removeTags": { + "man_made": "bridge", + "layer": "*" + }, + "reference": { + "key": "man_made", + "value": "bridge" + }, + "name": "Bridge" } From 4c2ad801fcb77b9d4ba707ef7d7f39367c4a23fa Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Sep 2018 18:27:08 -0400 Subject: [PATCH 194/217] Add "connection" to `piste:type=*` option list (closes #5268) --- data/presets.yaml | 2 ++ data/presets/fields.json | 2 +- data/presets/fields/piste/type.json | 3 ++- data/taginfo.json | 1 + dist/locales/en.json | 3 ++- 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index 489013b2b..7b483b096 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -1144,6 +1144,8 @@ en: # 'piste:type=*' label: Type options: + # 'piste:type=connection' + connection: Connection # 'piste:type=downhill' downhill: Downhill # 'piste:type=hike' diff --git a/data/presets/fields.json b/data/presets/fields.json index d0ccb21db..c7a35225f 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -193,7 +193,7 @@ "phone": {"key": "phone", "type": "tel", "icon": "maki-telephone", "universal": true, "label": "Telephone", "placeholder": "+31 42 123 4567"}, "piste/difficulty": {"key": "piste:difficulty", "type": "combo", "label": "Difficulty", "placeholder": "Easy, Intermediate, Advanced...", "strings": {"options": {"novice": "Novice (instructional)", "easy": "Easy (green circle)", "intermediate": "Intermediate (blue square)", "advanced": "Advanced (black diamond)", "expert": "Expert (double black diamond)", "freeride": "Freeride (off-piste)", "extreme": "Extreme (climbing equipment required)"}}}, "piste/grooming": {"key": "piste:grooming", "type": "combo", "label": "Grooming", "strings": {"options": {"classic": "Classic", "mogul": "Mogul", "backcountry": "Backcountry", "classic+skating": "Classic and Skating", "scooter": "Scooter/Snowmobile", "skating": "Skating"}}}, - "piste/type": {"key": "piste:type", "type": "typeCombo", "label": "Type", "strings": {"options": {"downhill": "Downhill", "nordic": "Nordic", "skitour": "Skitour", "sled": "Sled", "hike": "Hike", "sleigh": "Sleigh", "ice_skate": "Ice Skate", "snow_park": "Snow Park", "playground": "Playground"}}}, + "piste/type": {"key": "piste:type", "type": "typeCombo", "label": "Type", "strings": {"options": {"downhill": "Downhill", "nordic": "Nordic", "skitour": "Skitour", "sled": "Sled", "hike": "Hike", "sleigh": "Sleigh", "ice_skate": "Ice Skate", "snow_park": "Snow Park", "playground": "Playground", "connection": "Connection"}}}, "place": {"key": "place", "type": "typeCombo", "label": "Type"}, "plant": {"key": "plant", "type": "combo", "label": "Plant"}, "plant/output/electricity": {"key": "plant:output:electricity", "type": "text", "label": "Power Output", "placeholder": "500 MW, 1000 MW, 2000 MW..."}, diff --git a/data/presets/fields/piste/type.json b/data/presets/fields/piste/type.json index e9494d9e8..ac3bee99a 100644 --- a/data/presets/fields/piste/type.json +++ b/data/presets/fields/piste/type.json @@ -12,7 +12,8 @@ "sleigh": "Sleigh", "ice_skate": "Ice Skate", "snow_park": "Snow Park", - "playground": "Playground" + "playground": "Playground", + "connection": "Connection" } } } diff --git a/data/taginfo.json b/data/taginfo.json index 8cfea579e..a850ee93a 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -6876,6 +6876,7 @@ {"key": "piste:type", "value": "ice_skate", "description": "Type"}, {"key": "piste:type", "value": "snow_park", "description": "Type"}, {"key": "piste:type", "value": "playground", "description": "Type"}, + {"key": "piste:type", "value": "connection", "description": "Type"}, {"key": "plant", "description": "Plant"}, {"key": "plant:output:electricity", "description": "Power Output"}, {"key": "baby", "description": "Baby Seat"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index a01c2cac6..94c6f0d97 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2422,7 +2422,8 @@ "sleigh": "Sleigh", "ice_skate": "Ice Skate", "snow_park": "Snow Park", - "playground": "Playground" + "playground": "Playground", + "connection": "Connection" } }, "place": { From ed22cb404a7a99d043473c057262c27423ccac70 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Tue, 4 Sep 2018 22:25:50 -0700 Subject: [PATCH 195/217] Creates Lean-To and Gazebo presets for the shelter_type tag Creates a Fireplace checkmark field and adds it to the Lean-To and Wilderness Hut presets --- data/presets.yaml | 11 +++++++++++ data/presets/fields.json | 1 + data/presets/fields/fireplace.json | 5 +++++ data/presets/presets.json | 4 +++- data/presets/presets/amenity/gazebo.json | 18 ++++++++++++++++++ data/presets/presets/amenity/lean_to.json | 18 ++++++++++++++++++ .../presets/tourism/wilderness_hut.json | 3 ++- data/taginfo.json | 15 +++++++++++++++ dist/locales/en.json | 11 +++++++++++ 9 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 data/presets/fields/fireplace.json create mode 100644 data/presets/presets/amenity/gazebo.json create mode 100644 data/presets/presets/amenity/lean_to.json diff --git a/data/presets.yaml b/data/presets.yaml index 7b483b096..b18f77a8d 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -592,6 +592,9 @@ en: underground: Underground # 'fire_hydrant:type=wall' wall: Wall + fireplace: + # fireplace=* + label: Fireplace fitness_station: # fitness_station=* label: Equipment Type @@ -2091,6 +2094,10 @@ en: name: Gas Station # 'terms: petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel' terms: '' + amenity/gazebo: + # 'amenity=shelter, shelter_type=gazebo' + name: Gazebo + terms: '' amenity/grave_yard: # amenity=grave_yard name: Graveyard @@ -2130,6 +2137,10 @@ en: name: Language School # 'terms: esl' terms: '' + amenity/lean_to: + # 'amenity=shelter, shelter_type=lean_to' + name: Lean-To + terms: '' amenity/library: # amenity=library name: Library diff --git a/data/presets/fields.json b/data/presets/fields.json index c7a35225f..b92a073f6 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -99,6 +99,7 @@ "fence_type": {"key": "fence_type", "type": "combo", "label": "Type"}, "fire_hydrant/position": {"key": "fire_hydrant:position", "type": "combo", "label": "Position", "strings": {"options": {"lane": "Lane", "parking_lot": "Parking Lot", "sidewalk": "Sidewalk", "green": "Green"}}}, "fire_hydrant/type": {"key": "fire_hydrant:type", "type": "combo", "label": "Type", "strings": {"options": {"pillar": "Pillar/Aboveground", "underground": "Underground", "wall": "Wall", "pond": "Pond"}}}, + "fireplace": {"key": "fireplace", "type": "check", "label": "Fireplace"}, "fitness_station": {"key": "fitness_station", "type": "typeCombo", "label": "Equipment Type"}, "fixme": {"key": "fixme", "type": "textarea", "label": "Fix Me", "universal": true}, "ford": {"key": "ford", "type": "typeCombo", "label": "Type", "placeholder": "Default"}, diff --git a/data/presets/fields/fireplace.json b/data/presets/fields/fireplace.json new file mode 100644 index 000000000..70254ec55 --- /dev/null +++ b/data/presets/fields/fireplace.json @@ -0,0 +1,5 @@ +{ + "key": "fireplace", + "type": "check", + "label": "Fireplace" +} diff --git a/data/presets/presets.json b/data/presets/presets.json index 6b34e9e71..5dc8bd601 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -85,6 +85,7 @@ "amenity/food_court": {"icon": "maki-restaurant", "fields": ["name", "operator", "address", "building_area", "opening_hours", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["fast food", "restaurant", "food"], "tags": {"amenity": "food_court"}, "name": "Food Court"}, "amenity/fountain": {"icon": "temaki-fountain", "fields": ["name"], "geometry": ["point", "area"], "tags": {"amenity": "fountain"}, "name": "Fountain"}, "amenity/fuel": {"icon": "maki-fuel", "fields": ["name", "brand", "operator", "address", "fuel_multi", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["petrol", "fuel", "gasoline", "propane", "diesel", "lng", "cng", "biodiesel"], "tags": {"amenity": "fuel"}, "name": "Gas Station"}, + "amenity/gazebo": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "lit"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "gazebo"}, "name": "Gazebo"}, "amenity/grave_yard": {"icon": "maki-cemetery", "fields": ["religion", "denomination"], "geometry": ["point", "area"], "tags": {"amenity": "grave_yard"}, "name": "Graveyard"}, "amenity/grit_bin": {"fields": ["access_simple"], "geometry": ["point", "vertex"], "tags": {"amenity": "grit_bin"}, "terms": ["salt", "sand"], "name": "Grit Bin"}, "amenity/hospital": {"icon": "maki-hospital", "fields": ["name", "operator", "healthcare/speciality", "address", "emergency"], "geometry": ["point", "area"], "terms": ["clinic", "doctor", "emergency room", "health", "infirmary", "institution", "sanatorium", "sanitarium", "sick", "surgery", "ward"], "tags": {"amenity": "hospital"}, "addTags": {"amenity": "hospital", "healthcare": "hospital"}, "removeTags": {"amenity": "hospital", "healthcare": "hospital"}, "reference": {"key": "amenity", "value": "hospital"}, "name": "Hospital Grounds"}, @@ -93,6 +94,7 @@ "amenity/internet_cafe": {"icon": "temaki-antenna", "fields": ["name", "operator", "address", "building_area", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["cybercafe", "taxiphone", "teleboutique", "coffee", "cafe", "net", "lanhouse"], "tags": {"amenity": "internet_cafe"}, "name": "Internet Cafe"}, "amenity/kindergarten": {"icon": "maki-school", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["kindergarden", "pre-school"], "tags": {"amenity": "kindergarten"}, "name": "Preschool/Kindergarten Grounds"}, "amenity/language_school": {"icon": "maki-school", "fields": ["name", "operator", "address", "building_area", "opening_hours", "language_multi"], "geometry": ["point", "area"], "terms": ["esl"], "tags": {"amenity": "language_school"}, "name": "Language School"}, + "amenity/lean_to": {"icon": "maki-shelter", "fields": ["name", "operator", "building_area", "fireplace"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "lean_to"}, "name": "Lean-To"}, "amenity/library": {"icon": "maki-library", "fields": ["name", "operator", "building_area", "address", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "ref/isil"], "geometry": ["point", "area"], "terms": ["book"], "tags": {"amenity": "library"}, "name": "Library"}, "amenity/love_hotel": {"icon": "maki-heart", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"amenity": "love_hotel"}, "name": "Love Hotel"}, "amenity/marketplace": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building", "opening_hours"], "geometry": ["point", "area"], "tags": {"amenity": "marketplace"}, "name": "Marketplace"}, @@ -900,7 +902,7 @@ "tourism/theme_park": {"icon": "maki-amusement-park", "fields": ["name", "operator", "address", "opening_hours"], "geometry": ["point", "area"], "tags": {"tourism": "theme_park"}, "name": "Theme Park"}, "tourism/trail_riding_station": {"icon": "maki-horse-riding", "fields": ["name", "horse_stables", "horse_riding", "horse_dressage", "address", "phone", "website", "description"], "geometry": ["point", "area"], "tags": {"tourism": "trail_riding_station"}, "name": "Trail Riding Station", "matchScore": 2}, "tourism/viewpoint": {"icon": "temaki-binoculars", "geometry": ["point", "vertex"], "fields": ["direction"], "tags": {"tourism": "viewpoint"}, "name": "Viewpoint"}, - "tourism/wilderness_hut": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area"], "geometry": ["point", "area"], "terms": ["wilderness hut", "backcountry hut", "bothy"], "tags": {"tourism": "wilderness_hut"}, "name": "Wilderness Hut"}, + "tourism/wilderness_hut": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area", "fireplace"], "geometry": ["point", "area"], "terms": ["wilderness hut", "backcountry hut", "bothy"], "tags": {"tourism": "wilderness_hut"}, "name": "Wilderness Hut"}, "tourism/zoo": {"icon": "maki-zoo", "fields": ["name", "operator", "address", "opening_hours"], "geometry": ["point", "area"], "terms": ["animal"], "tags": {"tourism": "zoo"}, "name": "Zoo"}, "traffic_calming": {"icon": "temaki-diamond", "fields": ["traffic_calming", "direction_vertex"], "geometry": ["vertex", "line"], "tags": {"traffic_calming": "*"}, "terms": ["bump", "hump", "slow", "speed"], "name": "Traffic Calming"}, "traffic_calming/bump": {"icon": "temaki-diamond", "fields": ["surface", "direction_vertex"], "geometry": ["vertex", "line"], "terms": ["hump", "speed", "slow"], "tags": {"traffic_calming": "bump"}, "name": "Speed Bump"}, diff --git a/data/presets/presets/amenity/gazebo.json b/data/presets/presets/amenity/gazebo.json new file mode 100644 index 000000000..72a57ff9d --- /dev/null +++ b/data/presets/presets/amenity/gazebo.json @@ -0,0 +1,18 @@ +{ + "icon": "maki-shelter", + "fields": [ + "name", + "building_area", + "bench", + "lit" + ], + "geometry": [ + "point", + "area" + ], + "tags": { + "amenity": "shelter", + "shelter_type": "gazebo" + }, + "name": "Gazebo" +} diff --git a/data/presets/presets/amenity/lean_to.json b/data/presets/presets/amenity/lean_to.json new file mode 100644 index 000000000..067f53437 --- /dev/null +++ b/data/presets/presets/amenity/lean_to.json @@ -0,0 +1,18 @@ +{ + "icon": "maki-shelter", + "fields": [ + "name", + "operator", + "building_area", + "fireplace" + ], + "geometry": [ + "point", + "area" + ], + "tags": { + "amenity": "shelter", + "shelter_type": "lean_to" + }, + "name": "Lean-To" +} diff --git a/data/presets/presets/tourism/wilderness_hut.json b/data/presets/presets/tourism/wilderness_hut.json index 5a3836143..3b4b6bf82 100644 --- a/data/presets/presets/tourism/wilderness_hut.json +++ b/data/presets/presets/tourism/wilderness_hut.json @@ -4,7 +4,8 @@ "name", "operator", "address", - "building_area" + "building_area", + "fireplace" ], "geometry": [ "point", diff --git a/data/taginfo.json b/data/taginfo.json index a850ee93a..e74c82dec 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -568,6 +568,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/fuel-15.svg?sanitize=true" }, + { + "key": "shelter_type", + "value": "gazebo", + "description": "Gazebo", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" + }, { "key": "amenity", "value": "grave_yard", @@ -623,6 +630,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/school-15.svg?sanitize=true" }, + { + "key": "shelter_type", + "value": "lean_to", + "description": "Lean-To", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" + }, { "key": "amenity", "value": "library", @@ -6577,6 +6591,7 @@ {"key": "fire_hydrant:type", "value": "underground", "description": "Type"}, {"key": "fire_hydrant:type", "value": "wall", "description": "Type"}, {"key": "fire_hydrant:type", "value": "pond", "description": "Type"}, + {"key": "fireplace", "description": "Fireplace"}, {"key": "fitness_station", "description": "Equipment Type"}, {"key": "fixme", "description": "Fix Me"}, {"key": "ford", "description": "Type"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 94c6f0d97..5e22ded82 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1963,6 +1963,9 @@ "pond": "Pond" } }, + "fireplace": { + "label": "Fireplace" + }, "fitness_station": { "label": "Equipment Type" }, @@ -3273,6 +3276,10 @@ "name": "Gas Station", "terms": "petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel" }, + "amenity/gazebo": { + "name": "Gazebo", + "terms": "" + }, "amenity/grave_yard": { "name": "Graveyard", "terms": "" @@ -3305,6 +3312,10 @@ "name": "Language School", "terms": "esl" }, + "amenity/lean_to": { + "name": "Lean-To", + "terms": "" + }, "amenity/library": { "name": "Library", "terms": "book" From 5601dcf9cebe072d8ea84af6811706803cdbcac8 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Wed, 5 Sep 2018 16:00:32 -0700 Subject: [PATCH 196/217] Nests Pavilion, Gazebo, and Lean-To presets under amenity/shelter/ Removes the Fireplace field from the Lean-To preset --- data/presets.yaml | 24 +++++------ data/presets/presets.json | 6 +-- .../presets/amenity/{ => shelter}/gazebo.json | 0 .../amenity/{ => shelter}/lean_to.json | 3 +- .../amenity/{ => shelter}/pavilion.json | 0 data/taginfo.json | 42 +++++++++---------- dist/locales/en.json | 24 +++++------ 7 files changed, 49 insertions(+), 50 deletions(-) rename data/presets/presets/amenity/{ => shelter}/gazebo.json (100%) rename data/presets/presets/amenity/{ => shelter}/lean_to.json (85%) rename data/presets/presets/amenity/{ => shelter}/pavilion.json (100%) diff --git a/data/presets.yaml b/data/presets.yaml index b18f77a8d..84fa7b34a 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -2094,10 +2094,6 @@ en: name: Gas Station # 'terms: petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel' terms: '' - amenity/gazebo: - # 'amenity=shelter, shelter_type=gazebo' - name: Gazebo - terms: '' amenity/grave_yard: # amenity=grave_yard name: Graveyard @@ -2137,10 +2133,6 @@ en: name: Language School # 'terms: esl' terms: '' - amenity/lean_to: - # 'amenity=shelter, shelter_type=lean_to' - name: Lean-To - terms: '' amenity/library: # amenity=library name: Library @@ -2188,10 +2180,6 @@ en: # amenity=parking_space name: Parking Space terms: '' - amenity/pavilion: - # 'amenity=shelter, shelter_type=pavilion' - name: Pavilion - terms: '' amenity/pharmacy: # amenity=pharmacy name: Pharmacy @@ -2323,6 +2311,18 @@ en: name: Shelter # 'terms: lean-to,gazebo,picnic' terms: '' + amenity/shelter/gazebo: + # 'amenity=shelter, shelter_type=gazebo' + name: Gazebo + terms: '' + amenity/shelter/lean_to: + # 'amenity=shelter, shelter_type=lean_to' + name: Lean-To + terms: '' + amenity/shelter/pavilion: + # 'amenity=shelter, shelter_type=pavilion' + name: Pavilion + terms: '' amenity/shower: # amenity=shower name: Shower diff --git a/data/presets/presets.json b/data/presets/presets.json index 5dc8bd601..1ba89797c 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -85,7 +85,6 @@ "amenity/food_court": {"icon": "maki-restaurant", "fields": ["name", "operator", "address", "building_area", "opening_hours", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["fast food", "restaurant", "food"], "tags": {"amenity": "food_court"}, "name": "Food Court"}, "amenity/fountain": {"icon": "temaki-fountain", "fields": ["name"], "geometry": ["point", "area"], "tags": {"amenity": "fountain"}, "name": "Fountain"}, "amenity/fuel": {"icon": "maki-fuel", "fields": ["name", "brand", "operator", "address", "fuel_multi", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["petrol", "fuel", "gasoline", "propane", "diesel", "lng", "cng", "biodiesel"], "tags": {"amenity": "fuel"}, "name": "Gas Station"}, - "amenity/gazebo": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "lit"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "gazebo"}, "name": "Gazebo"}, "amenity/grave_yard": {"icon": "maki-cemetery", "fields": ["religion", "denomination"], "geometry": ["point", "area"], "tags": {"amenity": "grave_yard"}, "name": "Graveyard"}, "amenity/grit_bin": {"fields": ["access_simple"], "geometry": ["point", "vertex"], "tags": {"amenity": "grit_bin"}, "terms": ["salt", "sand"], "name": "Grit Bin"}, "amenity/hospital": {"icon": "maki-hospital", "fields": ["name", "operator", "healthcare/speciality", "address", "emergency"], "geometry": ["point", "area"], "terms": ["clinic", "doctor", "emergency room", "health", "infirmary", "institution", "sanatorium", "sanitarium", "sick", "surgery", "ward"], "tags": {"amenity": "hospital"}, "addTags": {"amenity": "hospital", "healthcare": "hospital"}, "removeTags": {"amenity": "hospital", "healthcare": "hospital"}, "reference": {"key": "amenity", "value": "hospital"}, "name": "Hospital Grounds"}, @@ -94,7 +93,6 @@ "amenity/internet_cafe": {"icon": "temaki-antenna", "fields": ["name", "operator", "address", "building_area", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "smoking", "outdoor_seating"], "geometry": ["point", "area"], "terms": ["cybercafe", "taxiphone", "teleboutique", "coffee", "cafe", "net", "lanhouse"], "tags": {"amenity": "internet_cafe"}, "name": "Internet Cafe"}, "amenity/kindergarten": {"icon": "maki-school", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["kindergarden", "pre-school"], "tags": {"amenity": "kindergarten"}, "name": "Preschool/Kindergarten Grounds"}, "amenity/language_school": {"icon": "maki-school", "fields": ["name", "operator", "address", "building_area", "opening_hours", "language_multi"], "geometry": ["point", "area"], "terms": ["esl"], "tags": {"amenity": "language_school"}, "name": "Language School"}, - "amenity/lean_to": {"icon": "maki-shelter", "fields": ["name", "operator", "building_area", "fireplace"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "lean_to"}, "name": "Lean-To"}, "amenity/library": {"icon": "maki-library", "fields": ["name", "operator", "building_area", "address", "opening_hours", "internet_access", "internet_access/fee", "internet_access/ssid", "ref/isil"], "geometry": ["point", "area"], "terms": ["book"], "tags": {"amenity": "library"}, "name": "Library"}, "amenity/love_hotel": {"icon": "maki-heart", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"amenity": "love_hotel"}, "name": "Love Hotel"}, "amenity/marketplace": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building", "opening_hours"], "geometry": ["point", "area"], "tags": {"amenity": "marketplace"}, "name": "Marketplace"}, @@ -105,7 +103,6 @@ "amenity/parking_entrance": {"icon": "maki-entrance-alt1", "fields": ["access_simple", "ref"], "geometry": ["vertex"], "tags": {"amenity": "parking_entrance"}, "name": "Parking Garage Entrance/Exit"}, "amenity/parking_space": {"fields": ["capacity"], "geometry": ["point", "vertex", "area"], "terms": [], "tags": {"amenity": "parking_space"}, "matchScore": 0.95, "name": "Parking Space"}, "amenity/parking": {"icon": "maki-parking", "fields": ["name", "operator", "parking", "capacity", "fee", "access_simple", "supervised", "park_ride", "surface", "maxstay"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "parking"}, "terms": [], "name": "Car Parking"}, - "amenity/pavilion": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "shelter", "shelter_type": "pavilion"}, "name": "Pavilion"}, "amenity/pharmacy": {"icon": "maki-pharmacy", "fields": ["name", "operator", "address", "building_area", "drive_through", "opening_hours", "payment_multi", "dispensing"], "geometry": ["point", "area"], "tags": {"amenity": "pharmacy"}, "addTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "removeTags": {"amenity": "pharmacy", "healthcare": "pharmacy"}, "reference": {"key": "amenity", "value": "pharmacy"}, "terms": ["apothecary", "drug*", "med*", "prescription"], "name": "Pharmacy"}, "amenity/place_of_worship": {"icon": "maki-place-of-worship", "fields": ["name", "religion", "denomination", "address", "building_area", "service_times"], "geometry": ["point", "area"], "terms": ["abbey", "basilica", "bethel", "cathedral", "chancel", "chantry", "chapel", "church", "fold", "house of God", "house of prayer", "house of worship", "minster", "mission", "mosque", "oratory", "parish", "sacellum", "sanctuary", "shrine", "synagogue", "tabernacle", "temple"], "tags": {"amenity": "place_of_worship"}, "name": "Place of Worship"}, "amenity/place_of_worship/buddhist": {"icon": "maki-buddhism", "fields": ["name", "denomination", "building_area", "address", "service_times"], "geometry": ["point", "area"], "terms": ["stupa", "vihara", "monastery", "temple", "pagoda", "zendo", "dojo"], "tags": {"amenity": "place_of_worship", "religion": "buddhist"}, "reference": {"key": "amenity", "value": "place_of_worship"}, "name": "Buddhist Temple"}, @@ -131,6 +128,9 @@ "amenity/sanitary_dump_station": {"icon": "temaki-storage_tank", "fields": ["operator", "access_simple", "fee", "water_point"], "geometry": ["point", "vertex", "area"], "terms": ["Motor Home", "Camper", "Sanitary", "Dump Station", "Elsan", "CDP", "CTDP", "Chemical Toilet"], "tags": {"amenity": "sanitary_dump_station"}, "name": "RV Toilet Disposal"}, "amenity/school": {"icon": "maki-school", "fields": ["name", "operator", "address", "religion", "denomination"], "geometry": ["point", "area"], "terms": ["academy", "elementary school", "middle school", "high school"], "tags": {"amenity": "school"}, "name": "School Grounds"}, "amenity/shelter": {"icon": "maki-shelter", "fields": ["name", "shelter_type", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "terms": ["lean-to", "gazebo", "picnic"], "tags": {"amenity": "shelter"}, "name": "Shelter"}, + "amenity/shelter/gazebo": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "lit"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "gazebo"}, "name": "Gazebo"}, + "amenity/shelter/lean_to": {"icon": "maki-shelter", "fields": ["name", "operator", "building_area"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "lean_to"}, "name": "Lean-To"}, + "amenity/shelter/pavilion": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "shelter", "shelter_type": "pavilion"}, "name": "Pavilion"}, "amenity/shower": {"icon": "temaki-shower", "fields": ["operator", "opening_hours", "fee", "supervised", "building_area", "access_simple"], "geometry": ["point", "vertex", "area"], "terms": ["rain closet"], "tags": {"amenity": "shower"}, "name": "Shower"}, "amenity/smoking_area": {"icon": "fas-smoking", "fields": ["name", "shelter", "bin", "bench", "opening_hours"], "geometry": ["point", "vertex", "area"], "terms": [], "tags": {"amenity": "smoking_area"}, "name": "Smoking Area"}, "amenity/social_facility": {"icon": "temaki-social_facility", "fields": ["name", "operator", "address", "building_area", "social_facility", "social_facility_for", "opening_hours", "wheelchair"], "geometry": ["point", "area"], "terms": [], "tags": {"amenity": "social_facility"}, "name": "Social Facility"}, diff --git a/data/presets/presets/amenity/gazebo.json b/data/presets/presets/amenity/shelter/gazebo.json similarity index 100% rename from data/presets/presets/amenity/gazebo.json rename to data/presets/presets/amenity/shelter/gazebo.json diff --git a/data/presets/presets/amenity/lean_to.json b/data/presets/presets/amenity/shelter/lean_to.json similarity index 85% rename from data/presets/presets/amenity/lean_to.json rename to data/presets/presets/amenity/shelter/lean_to.json index 067f53437..db6e3e75a 100644 --- a/data/presets/presets/amenity/lean_to.json +++ b/data/presets/presets/amenity/shelter/lean_to.json @@ -3,8 +3,7 @@ "fields": [ "name", "operator", - "building_area", - "fireplace" + "building_area" ], "geometry": [ "point", diff --git a/data/presets/presets/amenity/pavilion.json b/data/presets/presets/amenity/shelter/pavilion.json similarity index 100% rename from data/presets/presets/amenity/pavilion.json rename to data/presets/presets/amenity/shelter/pavilion.json diff --git a/data/taginfo.json b/data/taginfo.json index e74c82dec..91f07864c 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -568,13 +568,6 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/fuel-15.svg?sanitize=true" }, - { - "key": "shelter_type", - "value": "gazebo", - "description": "Gazebo", - "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" - }, { "key": "amenity", "value": "grave_yard", @@ -630,13 +623,6 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/school-15.svg?sanitize=true" }, - { - "key": "shelter_type", - "value": "lean_to", - "description": "Lean-To", - "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" - }, { "key": "amenity", "value": "library", @@ -706,13 +692,6 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/parking-15.svg?sanitize=true" }, - { - "key": "shelter_type", - "value": "pavilion", - "description": "Pavilion", - "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" - }, { "key": "amenity", "value": "pharmacy", @@ -888,6 +867,27 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" }, + { + "key": "shelter_type", + "value": "gazebo", + "description": "Gazebo", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" + }, + { + "key": "shelter_type", + "value": "lean_to", + "description": "Lean-To", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" + }, + { + "key": "shelter_type", + "value": "pavilion", + "description": "Pavilion", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" + }, { "key": "amenity", "value": "shower", diff --git a/dist/locales/en.json b/dist/locales/en.json index 5e22ded82..95cef1ff9 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -3276,10 +3276,6 @@ "name": "Gas Station", "terms": "petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel" }, - "amenity/gazebo": { - "name": "Gazebo", - "terms": "" - }, "amenity/grave_yard": { "name": "Graveyard", "terms": "" @@ -3312,10 +3308,6 @@ "name": "Language School", "terms": "esl" }, - "amenity/lean_to": { - "name": "Lean-To", - "terms": "" - }, "amenity/library": { "name": "Library", "terms": "book" @@ -3356,10 +3348,6 @@ "name": "Car Parking", "terms": "" }, - "amenity/pavilion": { - "name": "Pavilion", - "terms": "" - }, "amenity/pharmacy": { "name": "Pharmacy", "terms": "apothecary,drug*,med*,prescription" @@ -3460,6 +3448,18 @@ "name": "Shelter", "terms": "lean-to,gazebo,picnic" }, + "amenity/shelter/gazebo": { + "name": "Gazebo", + "terms": "" + }, + "amenity/shelter/lean_to": { + "name": "Lean-To", + "terms": "" + }, + "amenity/shelter/pavilion": { + "name": "Pavilion", + "terms": "" + }, "amenity/shower": { "name": "Shower", "terms": "rain closet" From 80ea090397916d485b654213dc475bf8d79d8841 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Wed, 5 Sep 2018 19:07:41 -0700 Subject: [PATCH 197/217] Adds presets: Seamark (unsearchable generic), Channel Buoy, Green Buoy, Red Buoy, Channel Beacon, Danger Beacon, Mooring Adds universal Seamark type field to Seamark preset Adds Category, Colour, Shape, and System fields to buoy and Channel Beacon presets Adds Shape field to Danger Beacon preset Adds Category field to Mooring preset --- data/presets.yaml | 142 ++++++++++++ data/presets/fields.json | 11 + .../seamark/beacon_isolated_danger/shape.json | 5 + .../seamark/beacon_lateral/category.json | 15 ++ .../fields/seamark/beacon_lateral/colour.json | 12 + .../fields/seamark/beacon_lateral/shape.json | 5 + .../fields/seamark/beacon_lateral/system.json | 13 ++ .../fields/seamark/buoy_lateral/category.json | 19 ++ .../fields/seamark/buoy_lateral/colour.json | 17 ++ .../fields/seamark/buoy_lateral/shape.json | 5 + .../fields/seamark/buoy_lateral/system.json | 13 ++ .../fields/seamark/mooring/category.json | 5 + data/presets/fields/seamark/type.json | 6 + data/presets/presets.json | 7 + data/presets/presets/_seamark.json | 17 ++ .../seamark/beacon_isolated_danger.json | 20 ++ .../presets/seamark/beacon_lateral.json | 26 +++ .../presets/presets/seamark/buoy_lateral.json | 26 +++ .../presets/seamark/buoy_lateral/green.json | 27 +++ .../presets/seamark/buoy_lateral/red.json | 27 +++ data/presets/presets/seamark/mooring.json | 21 ++ data/taginfo.json | 211 ++++++++++++++++++ dist/locales/en.json | 108 +++++++++ 23 files changed, 758 insertions(+) create mode 100644 data/presets/fields/seamark/beacon_isolated_danger/shape.json create mode 100644 data/presets/fields/seamark/beacon_lateral/category.json create mode 100644 data/presets/fields/seamark/beacon_lateral/colour.json create mode 100644 data/presets/fields/seamark/beacon_lateral/shape.json create mode 100644 data/presets/fields/seamark/beacon_lateral/system.json create mode 100644 data/presets/fields/seamark/buoy_lateral/category.json create mode 100644 data/presets/fields/seamark/buoy_lateral/colour.json create mode 100644 data/presets/fields/seamark/buoy_lateral/shape.json create mode 100644 data/presets/fields/seamark/buoy_lateral/system.json create mode 100644 data/presets/fields/seamark/mooring/category.json create mode 100644 data/presets/fields/seamark/type.json create mode 100644 data/presets/presets/_seamark.json create mode 100644 data/presets/presets/seamark/beacon_isolated_danger.json create mode 100644 data/presets/presets/seamark/beacon_lateral.json create mode 100644 data/presets/presets/seamark/buoy_lateral.json create mode 100644 data/presets/presets/seamark/buoy_lateral/green.json create mode 100644 data/presets/presets/seamark/buoy_lateral/red.json create mode 100644 data/presets/presets/seamark/mooring.json diff --git a/data/presets.yaml b/data/presets.yaml index 7b483b096..22fe82b83 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -1303,6 +1303,115 @@ en: sanitary_dump_station: # sanitary_dump_station=* label: Toilet Disposal + seamark/beacon_isolated_danger/shape: + # 'seamark:beacon_isolated_danger:shape=*' + label: Shape + seamark/beacon_lateral/category: + # 'seamark:beacon_lateral:category=*' + label: Category + options: + # 'seamark:beacon_lateral:category=danger_left' + danger_left: Danger Left + # 'seamark:beacon_lateral:category=danger_right' + danger_right: Danger Right + # 'seamark:beacon_lateral:category=port' + port: Port + # 'seamark:beacon_lateral:category=starboard' + starboard: Starboard + # 'seamark:beacon_lateral:category=waterway_left' + waterway_left: Waterway Left + # 'seamark:beacon_lateral:category=waterway_right' + waterway_right: Waterway Right + seamark/beacon_lateral/colour: + # 'seamark:beacon_lateral:colour=*' + label: Colour + options: + # 'seamark:beacon_lateral:colour=green' + green: Green + # 'seamark:beacon_lateral:colour=grey' + grey: Grey + # 'seamark:beacon_lateral:colour=red' + red: Red + seamark/beacon_lateral/shape: + # 'seamark:beacon_lateral:shape=*' + label: Shape + seamark/beacon_lateral/system: + # 'seamark:beacon_lateral:system=*' + label: System + options: + # 'seamark:beacon_lateral:system=cevni' + cevni: CEVNI + # 'seamark:beacon_lateral:system=iala-a' + iala-a: IALA A + # 'seamark:beacon_lateral:system=iala-b' + iala-b: IALA B + # 'seamark:beacon_lateral:system=other' + other: Other + seamark/buoy_lateral/category: + # 'seamark:buoy_lateral:category=*' + label: Category + options: + # 'seamark:buoy_lateral:category=channel_left' + channel_left: Channel Left + # 'seamark:buoy_lateral:category=channel_right' + channel_right: Channel Right + # 'seamark:buoy_lateral:category=danger_left' + danger_left: Danger Left + # 'seamark:buoy_lateral:category=danger_right' + danger_right: Danger Right + # 'seamark:buoy_lateral:category=port' + port: Port + # 'seamark:buoy_lateral:category=preferred_channel_port' + preferred_channel_port: Preferred Channel Port + # 'seamark:buoy_lateral:category=preferred_channel_starboard' + preferred_channel_starboard: Preferred Channel Starboard + # 'seamark:buoy_lateral:category=starboard' + starboard: Starboard + # 'seamark:buoy_lateral:category=waterway_left' + waterway_left: Waterway Left + # 'seamark:buoy_lateral:category=waterway_right' + waterway_right: Waterway Right + seamark/buoy_lateral/colour: + # 'seamark:buoy_lateral:colour=*' + label: Colour + options: + # 'seamark:buoy_lateral:colour=green' + green: Green + # 'seamark:buoy_lateral:colour=green;red;green' + green;red;green: Green-Red-Green + # 'seamark:buoy_lateral:colour=green;white;green;white' + green;white;green;white: Green-White-Green-White + # 'seamark:buoy_lateral:colour=red' + red: Red + # 'seamark:buoy_lateral:colour=red;green;red' + red;green;red: Red-Green-Red + # 'seamark:buoy_lateral:colour=red;white;red;white' + red;white;red;white: Red-White-Red-White + # 'seamark:buoy_lateral:colour=white' + white: White + # 'seamark:buoy_lateral:colour=yellow' + yellow: Yellow + seamark/buoy_lateral/shape: + # 'seamark:buoy_lateral:shape=*' + label: Shape + seamark/buoy_lateral/system: + # 'seamark:buoy_lateral:system=*' + label: System + options: + # 'seamark:buoy_lateral:system=cevni' + cevni: CEVNI + # 'seamark:buoy_lateral:system=iala-a' + iala-a: IALA A + # 'seamark:buoy_lateral:system=iala-b' + iala-b: IALA B + # 'seamark:buoy_lateral:system=other' + other: Other + seamark/mooring/category: + # 'seamark:mooring:category=*' + label: Category + seamark/type: + # 'seamark:type=*' + label: Seamark seasonal: # seasonal=* label: Seasonal @@ -5128,6 +5237,39 @@ en: # route=ferry name: Ferry Route terms: '' + seamark: + # 'seamark:type=*' + name: Seamark + seamark/beacon_isolated_danger: + # 'seamark:type=beacon_isolated_danger' + name: Danger Beacon + # 'terms: beacon isolated danger,isolated danger beacon,iala' + terms: '' + seamark/beacon_lateral: + # 'seamark:type=beacon_lateral' + name: Channel Beacon + # 'terms: lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark' + terms: '' + seamark/buoy_lateral: + # 'seamark:type=buoy_lateral' + name: Channel Buoy + # 'terms: lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark' + terms: '' + seamark/buoy_lateral/green: + # 'seamark:type=buoy_lateral, seamark:buoy_lateral:colour=green' + name: Green Buoy + # 'terms: lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark' + terms: '' + seamark/buoy_lateral/red: + # 'seamark:type=buoy_lateral, seamark:buoy_lateral:colour=red' + name: Red Buoy + # 'terms: lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark' + terms: '' + seamark/mooring: + # 'seamark:type=mooring' + name: Mooring + # 'terms: dolphin,pile,bollard,buoy,post' + terms: '' shop: # shop=* name: Shop diff --git a/data/presets/fields.json b/data/presets/fields.json index c7a35225f..93a53d864 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -230,6 +230,17 @@ "route": {"key": "route", "type": "combo", "label": "Type"}, "sac_scale": {"key": "sac_scale", "type": "combo", "label": "Hiking Difficulty", "placeholder": "Mountain Hiking, Alpine Hiking...", "strings": {"options": {"hiking": "T1: Hiking", "mountain_hiking": "T2: Mountain Hiking", "demanding_mountain_hiking": "T3: Demanding Mountain Hiking", "alpine_hiking": "T4: Alpine Hiking", "demanding_alpine_hiking": "T5: Demanding Alpine Hiking", "difficult_alpine_hiking": "T6: Difficult Alpine Hiking"}}}, "sanitary_dump_station": {"key": "sanitary_dump_station", "type": "check", "label": "Toilet Disposal"}, + "seamark/beacon_isolated_danger/shape": {"key": "seamark:beacon_isolated_danger:shape", "type": "combo", "label": "Shape"}, + "seamark/beacon_lateral/category": {"key": "seamark:beacon_lateral:category", "type": "combo", "label": "Category", "strings": {"options": {"port": "Port", "starboard": "Starboard", "waterway_left": "Waterway Left", "waterway_right": "Waterway Right", "danger_left": "Danger Left", "danger_right": "Danger Right"}}}, + "seamark/beacon_lateral/colour": {"key": "seamark:beacon_lateral:colour", "type": "combo", "label": "Colour", "strings": {"options": {"red": "Red", "green": "Green", "grey": "Grey"}}}, + "seamark/beacon_lateral/shape": {"key": "seamark:beacon_lateral:shape", "type": "combo", "label": "Shape"}, + "seamark/beacon_lateral/system": {"key": "seamark:beacon_lateral:system", "type": "combo", "label": "System", "strings": {"options": {"iala-a": "IALA A", "iala-b": "IALA B", "cevni": "CEVNI", "other": "Other"}}}, + "seamark/buoy_lateral/category": {"key": "seamark:buoy_lateral:category", "type": "combo", "label": "Category", "strings": {"options": {"port": "Port", "starboard": "Starboard", "channel_left": "Channel Left", "channel_right": "Channel Right", "waterway_left": "Waterway Left", "waterway_right": "Waterway Right", "danger_left": "Danger Left", "danger_right": "Danger Right", "preferred_channel_port": "Preferred Channel Port", "preferred_channel_starboard": "Preferred Channel Starboard"}}}, + "seamark/buoy_lateral/colour": {"key": "seamark:buoy_lateral:colour", "type": "combo", "label": "Colour", "strings": {"options": {"red": "Red", "green": "Green", "red;white;red;white": "Red-White-Red-White", "green;white;green;white": "Green-White-Green-White", "red;green;red": "Red-Green-Red", "green;red;green": "Green-Red-Green", "white": "White", "yellow": "Yellow"}}}, + "seamark/buoy_lateral/shape": {"key": "seamark:buoy_lateral:shape", "type": "combo", "label": "Shape"}, + "seamark/buoy_lateral/system": {"key": "seamark:buoy_lateral:system", "type": "combo", "label": "System", "strings": {"options": {"iala-a": "IALA A", "iala-b": "IALA B", "cevni": "CEVNI", "other": "Other"}}}, + "seamark/mooring/category": {"key": "seamark:mooring:category", "type": "combo", "label": "Category"}, + "seamark/type": {"key": "seamark:type", "type": "combo", "universal": true, "label": "Seamark"}, "seasonal": {"key": "seasonal", "type": "check", "label": "Seasonal"}, "second_hand": {"key": "second_hand", "type": "combo", "label": "Sells Used", "placeholder": "Yes, No, Only", "strings": {"options": {"yes": "Yes", "no": "No", "only": "Only"}}}, "service_rail": {"key": "service", "type": "combo", "label": "Service Type", "strings": {"options": {"spur": "Spur", "yard": "Yard", "siding": "Siding", "crossover": "Crossover"}}}, diff --git a/data/presets/fields/seamark/beacon_isolated_danger/shape.json b/data/presets/fields/seamark/beacon_isolated_danger/shape.json new file mode 100644 index 000000000..b62f65467 --- /dev/null +++ b/data/presets/fields/seamark/beacon_isolated_danger/shape.json @@ -0,0 +1,5 @@ +{ + "key": "seamark:beacon_isolated_danger:shape", + "type": "combo", + "label": "Shape" +} diff --git a/data/presets/fields/seamark/beacon_lateral/category.json b/data/presets/fields/seamark/beacon_lateral/category.json new file mode 100644 index 000000000..9974827dc --- /dev/null +++ b/data/presets/fields/seamark/beacon_lateral/category.json @@ -0,0 +1,15 @@ +{ + "key": "seamark:beacon_lateral:category", + "type": "combo", + "label": "Category", + "strings": { + "options": { + "port": "Port", + "starboard": "Starboard", + "waterway_left":"Waterway Left", + "waterway_right":"Waterway Right", + "danger_left":"Danger Left", + "danger_right":"Danger Right" + } + } +} diff --git a/data/presets/fields/seamark/beacon_lateral/colour.json b/data/presets/fields/seamark/beacon_lateral/colour.json new file mode 100644 index 000000000..2af53b30e --- /dev/null +++ b/data/presets/fields/seamark/beacon_lateral/colour.json @@ -0,0 +1,12 @@ +{ + "key": "seamark:beacon_lateral:colour", + "type": "combo", + "label": "Colour", + "strings": { + "options": { + "red": "Red", + "green": "Green", + "grey": "Grey" + } + } +} diff --git a/data/presets/fields/seamark/beacon_lateral/shape.json b/data/presets/fields/seamark/beacon_lateral/shape.json new file mode 100644 index 000000000..1ee070cbc --- /dev/null +++ b/data/presets/fields/seamark/beacon_lateral/shape.json @@ -0,0 +1,5 @@ +{ + "key": "seamark:beacon_lateral:shape", + "type": "combo", + "label": "Shape" +} diff --git a/data/presets/fields/seamark/beacon_lateral/system.json b/data/presets/fields/seamark/beacon_lateral/system.json new file mode 100644 index 000000000..3b0046ac0 --- /dev/null +++ b/data/presets/fields/seamark/beacon_lateral/system.json @@ -0,0 +1,13 @@ +{ + "key": "seamark:beacon_lateral:system", + "type": "combo", + "label": "System", + "strings": { + "options": { + "iala-a": "IALA A", + "iala-b": "IALA B", + "cevni": "CEVNI", + "other": "Other" + } + } +} diff --git a/data/presets/fields/seamark/buoy_lateral/category.json b/data/presets/fields/seamark/buoy_lateral/category.json new file mode 100644 index 000000000..f13a12cbe --- /dev/null +++ b/data/presets/fields/seamark/buoy_lateral/category.json @@ -0,0 +1,19 @@ +{ + "key": "seamark:buoy_lateral:category", + "type": "combo", + "label": "Category", + "strings": { + "options": { + "port": "Port", + "starboard": "Starboard", + "channel_left":"Channel Left", + "channel_right":"Channel Right", + "waterway_left":"Waterway Left", + "waterway_right":"Waterway Right", + "danger_left":"Danger Left", + "danger_right":"Danger Right", + "preferred_channel_port":"Preferred Channel Port", + "preferred_channel_starboard":"Preferred Channel Starboard" + } + } +} diff --git a/data/presets/fields/seamark/buoy_lateral/colour.json b/data/presets/fields/seamark/buoy_lateral/colour.json new file mode 100644 index 000000000..abe96b049 --- /dev/null +++ b/data/presets/fields/seamark/buoy_lateral/colour.json @@ -0,0 +1,17 @@ +{ + "key": "seamark:buoy_lateral:colour", + "type": "combo", + "label": "Colour", + "strings": { + "options": { + "red": "Red", + "green": "Green", + "red;white;red;white": "Red-White-Red-White", + "green;white;green;white":"Green-White-Green-White", + "red;green;red":"Red-Green-Red", + "green;red;green":"Green-Red-Green", + "white":"White", + "yellow":"Yellow" + } + } +} diff --git a/data/presets/fields/seamark/buoy_lateral/shape.json b/data/presets/fields/seamark/buoy_lateral/shape.json new file mode 100644 index 000000000..c33ff9260 --- /dev/null +++ b/data/presets/fields/seamark/buoy_lateral/shape.json @@ -0,0 +1,5 @@ +{ + "key": "seamark:buoy_lateral:shape", + "type": "combo", + "label": "Shape" +} diff --git a/data/presets/fields/seamark/buoy_lateral/system.json b/data/presets/fields/seamark/buoy_lateral/system.json new file mode 100644 index 000000000..c99107c52 --- /dev/null +++ b/data/presets/fields/seamark/buoy_lateral/system.json @@ -0,0 +1,13 @@ +{ + "key": "seamark:buoy_lateral:system", + "type": "combo", + "label": "System", + "strings": { + "options": { + "iala-a": "IALA A", + "iala-b": "IALA B", + "cevni": "CEVNI", + "other": "Other" + } + } +} diff --git a/data/presets/fields/seamark/mooring/category.json b/data/presets/fields/seamark/mooring/category.json new file mode 100644 index 000000000..b5ed22017 --- /dev/null +++ b/data/presets/fields/seamark/mooring/category.json @@ -0,0 +1,5 @@ +{ + "key": "seamark:mooring:category", + "type": "combo", + "label": "Category" +} diff --git a/data/presets/fields/seamark/type.json b/data/presets/fields/seamark/type.json new file mode 100644 index 000000000..1ee2a64bd --- /dev/null +++ b/data/presets/fields/seamark/type.json @@ -0,0 +1,6 @@ +{ + "key": "seamark:type", + "type": "combo", + "universal": true, + "label": "Seamark" +} diff --git a/data/presets/presets.json b/data/presets/presets.json index 6b34e9e71..b6f43cc05 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -9,6 +9,7 @@ "power": {"geometry": ["point", "vertex", "line", "area"], "tags": {"power": "*"}, "fields": ["power"], "searchable": false, "name": "Power"}, "railway": {"fields": ["railway"], "geometry": ["point", "vertex", "line", "area"], "tags": {"railway": "*"}, "searchable": false, "name": "Railway"}, "roundabout": {"geometry": ["vertex", "line"], "fields": ["name"], "tags": {"junction": "roundabout"}, "name": "Roundabout", "searchable": false}, + "seamark": {"icon": "maki-harbor", "fields": ["seamark/type"], "geometry": ["point", "vertex", "line", "area"], "tags": {"seamark:type": "*"}, "searchable": false, "name": "Seamark"}, "waterway": {"fields": ["name", "waterway"], "geometry": ["point", "vertex", "line", "area"], "tags": {"waterway": "*"}, "searchable": false, "name": "Waterway"}, "address": {"fields": ["address"], "geometry": ["point", "vertex", "area"], "tags": {"addr:*": "*"}, "addTags": {}, "removeTags": {}, "reference": {"key": "addr"}, "name": "Address", "matchScore": 0.15}, "advertising/billboard": {"fields": ["direction", "lit"], "geometry": ["point", "vertex", "line"], "tags": {"advertising": "billboard"}, "name": "Billboard"}, @@ -747,6 +748,12 @@ "railway/tram": {"icon": "iD-railway-light-rail", "fields": ["name", "structure", "gauge", "electrified", "service_rail", "usage_rail", "voltage", "frequency"], "geometry": ["line"], "tags": {"railway": "tram"}, "terms": ["light rail", "streetcar", "tram", "trolley"], "name": "Tram"}, "relation": {"icon": "iD-relation", "fields": ["name", "relation"], "geometry": ["relation"], "tags": {}, "name": "Relation"}, "route/ferry": {"icon": "iD-ferry-line", "geometry": ["line"], "fields": ["name", "operator", "duration", "access"], "tags": {"route": "ferry"}, "name": "Ferry Route"}, + "seamark/beacon_isolated_danger": {"fields": ["ref", "operator", "seamark/beacon_isolated_danger/shape"], "geometry": ["point", "vertex"], "terms": ["beacon isolated danger", "isolated danger beacon", "iala"], "tags": {"seamark:type": "beacon_isolated_danger"}, "name": "Danger Beacon"}, + "seamark/beacon_lateral": {"fields": ["ref", "operator", "seamark/beacon_lateral/colour", "seamark/beacon_lateral/category", "seamark/beacon_lateral/shape", "seamark/beacon_lateral/system"], "geometry": ["point", "vertex"], "terms": ["lateral beacon", "beacon lateral", "cevni", "channel marker", "iala", "lateral mark"], "tags": {"seamark:type": "beacon_lateral"}, "name": "Channel Beacon"}, + "seamark/buoy_lateral": {"fields": ["ref", "operator", "seamark/buoy_lateral/colour", "seamark/buoy_lateral/category", "seamark/buoy_lateral/shape", "seamark/buoy_lateral/system"], "geometry": ["point", "vertex"], "terms": ["lateral buoy", "buoy lateral", "cevni", "channel marker", "iala", "lateral mark"], "tags": {"seamark:type": "buoy_lateral"}, "name": "Channel Buoy"}, + "seamark/buoy_lateral/green": {"fields": ["ref", "operator", "seamark/buoy_lateral/colour", "seamark/buoy_lateral/category", "seamark/buoy_lateral/shape", "seamark/buoy_lateral/system"], "geometry": ["point", "vertex"], "terms": ["lateral buoy", "buoy lateral", "cevni", "channel marker", "iala", "lateral mark"], "tags": {"seamark:type": "buoy_lateral", "seamark:buoy_lateral:colour": "green"}, "name": "Green Buoy"}, + "seamark/buoy_lateral/red": {"fields": ["ref", "operator", "seamark/buoy_lateral/colour", "seamark/buoy_lateral/category", "seamark/buoy_lateral/shape", "seamark/buoy_lateral/system"], "geometry": ["point", "vertex"], "terms": ["lateral buoy", "buoy lateral", "cevni", "channel marker", "iala", "lateral mark"], "tags": {"seamark:type": "buoy_lateral", "seamark:buoy_lateral:colour": "red"}, "name": "Red Buoy"}, + "seamark/mooring": {"fields": ["ref", "operator", "seamark/mooring/category"], "geometry": ["point"], "terms": ["dolphin", "pile", "bollard", "buoy", "post"], "tags": {"seamark:type": "mooring"}, "name": "Mooring"}, "shop": {"icon": "maki-shop", "fields": ["name", "shop", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "*"}, "terms": [], "name": "Shop"}, "shop/fishmonger": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "fishmonger"}, "reference": {"key": "shop", "value": "seafood"}, "name": "Fishmonger", "searchable": false}, "shop/furnace": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["oven", "stove"], "tags": {"shop": "furnace"}, "name": "Furnace Store", "searchable": false}, diff --git a/data/presets/presets/_seamark.json b/data/presets/presets/_seamark.json new file mode 100644 index 000000000..0648bc8b9 --- /dev/null +++ b/data/presets/presets/_seamark.json @@ -0,0 +1,17 @@ +{ + "icon": "maki-harbor", + "fields": [ + "seamark/type" + ], + "geometry": [ + "point", + "vertex", + "line", + "area" + ], + "tags": { + "seamark:type": "*" + }, + "searchable": false, + "name": "Seamark" +} diff --git a/data/presets/presets/seamark/beacon_isolated_danger.json b/data/presets/presets/seamark/beacon_isolated_danger.json new file mode 100644 index 000000000..6647a61f3 --- /dev/null +++ b/data/presets/presets/seamark/beacon_isolated_danger.json @@ -0,0 +1,20 @@ +{ + "fields": [ + "ref", + "operator", + "seamark/beacon_isolated_danger/shape" + ], + "geometry": [ + "point", + "vertex" + ], + "terms": [ + "beacon isolated danger", + "isolated danger beacon", + "iala" + ], + "tags": { + "seamark:type": "beacon_isolated_danger" + }, + "name": "Danger Beacon" +} diff --git a/data/presets/presets/seamark/beacon_lateral.json b/data/presets/presets/seamark/beacon_lateral.json new file mode 100644 index 000000000..7a35e89ff --- /dev/null +++ b/data/presets/presets/seamark/beacon_lateral.json @@ -0,0 +1,26 @@ +{ + "fields": [ + "ref", + "operator", + "seamark/beacon_lateral/colour", + "seamark/beacon_lateral/category", + "seamark/beacon_lateral/shape", + "seamark/beacon_lateral/system" + ], + "geometry": [ + "point", + "vertex" + ], + "terms": [ + "lateral beacon", + "beacon lateral", + "cevni", + "channel marker", + "iala", + "lateral mark" + ], + "tags": { + "seamark:type": "beacon_lateral" + }, + "name": "Channel Beacon" +} diff --git a/data/presets/presets/seamark/buoy_lateral.json b/data/presets/presets/seamark/buoy_lateral.json new file mode 100644 index 000000000..5121d4a72 --- /dev/null +++ b/data/presets/presets/seamark/buoy_lateral.json @@ -0,0 +1,26 @@ +{ + "fields": [ + "ref", + "operator", + "seamark/buoy_lateral/colour", + "seamark/buoy_lateral/category", + "seamark/buoy_lateral/shape", + "seamark/buoy_lateral/system" + ], + "geometry": [ + "point", + "vertex" + ], + "terms": [ + "lateral buoy", + "buoy lateral", + "cevni", + "channel marker", + "iala", + "lateral mark" + ], + "tags": { + "seamark:type": "buoy_lateral" + }, + "name": "Channel Buoy" +} diff --git a/data/presets/presets/seamark/buoy_lateral/green.json b/data/presets/presets/seamark/buoy_lateral/green.json new file mode 100644 index 000000000..11670c94d --- /dev/null +++ b/data/presets/presets/seamark/buoy_lateral/green.json @@ -0,0 +1,27 @@ +{ + "fields": [ + "ref", + "operator", + "seamark/buoy_lateral/colour", + "seamark/buoy_lateral/category", + "seamark/buoy_lateral/shape", + "seamark/buoy_lateral/system" + ], + "geometry": [ + "point", + "vertex" + ], + "terms": [ + "lateral buoy", + "buoy lateral", + "cevni", + "channel marker", + "iala", + "lateral mark" + ], + "tags": { + "seamark:type": "buoy_lateral", + "seamark:buoy_lateral:colour": "green" + }, + "name": "Green Buoy" +} diff --git a/data/presets/presets/seamark/buoy_lateral/red.json b/data/presets/presets/seamark/buoy_lateral/red.json new file mode 100644 index 000000000..73facf15e --- /dev/null +++ b/data/presets/presets/seamark/buoy_lateral/red.json @@ -0,0 +1,27 @@ +{ + "fields": [ + "ref", + "operator", + "seamark/buoy_lateral/colour", + "seamark/buoy_lateral/category", + "seamark/buoy_lateral/shape", + "seamark/buoy_lateral/system" + ], + "geometry": [ + "point", + "vertex" + ], + "terms": [ + "lateral buoy", + "buoy lateral", + "cevni", + "channel marker", + "iala", + "lateral mark" + ], + "tags": { + "seamark:type": "buoy_lateral", + "seamark:buoy_lateral:colour": "red" + }, + "name": "Red Buoy" +} diff --git a/data/presets/presets/seamark/mooring.json b/data/presets/presets/seamark/mooring.json new file mode 100644 index 000000000..c5d831f2c --- /dev/null +++ b/data/presets/presets/seamark/mooring.json @@ -0,0 +1,21 @@ +{ + "fields": [ + "ref", + "operator", + "seamark/mooring/category" + ], + "geometry": [ + "point" + ], + "terms": [ + "dolphin", + "pile", + "bollard", + "buoy", + "post" + ], + "tags": { + "seamark:type": "mooring" + }, + "name": "Mooring" +} diff --git a/data/taginfo.json b/data/taginfo.json index a850ee93a..2a2af6988 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -58,6 +58,12 @@ "description": "Roundabout", "object_types": ["node", "way"] }, + { + "key": "seamark:type", + "description": "Seamark", + "object_types": ["node", "way", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/harbor-15.svg?sanitize=true" + }, { "key": "waterway", "description": "Waterway, Type", @@ -4833,6 +4839,42 @@ "object_types": ["way"], "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/iD-sprite/presets/ferry-line.svg?sanitize=true" }, + { + "key": "seamark:type", + "value": "beacon_isolated_danger", + "description": "Danger Beacon", + "object_types": ["node"] + }, + { + "key": "seamark:type", + "value": "beacon_lateral", + "description": "Channel Beacon", + "object_types": ["node"] + }, + { + "key": "seamark:type", + "value": "buoy_lateral", + "description": "Channel Buoy", + "object_types": ["node"] + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "green", + "description": "Green Buoy, Colour", + "object_types": ["node"] + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "red", + "description": "Red Buoy, Colour", + "object_types": ["node"] + }, + { + "key": "seamark:type", + "value": "mooring", + "description": "Mooring", + "object_types": ["node"] + }, { "key": "shop", "description": "Shop, Type", @@ -6942,6 +6984,175 @@ "description": "Hiking Difficulty" }, {"key": "sanitary_dump_station", "description": "Toilet Disposal"}, + {"key": "seamark:beacon_isolated_danger:shape", "description": "Shape"}, + { + "key": "seamark:beacon_lateral:category", + "value": "port", + "description": "Category" + }, + { + "key": "seamark:beacon_lateral:category", + "value": "starboard", + "description": "Category" + }, + { + "key": "seamark:beacon_lateral:category", + "value": "waterway_left", + "description": "Category" + }, + { + "key": "seamark:beacon_lateral:category", + "value": "waterway_right", + "description": "Category" + }, + { + "key": "seamark:beacon_lateral:category", + "value": "danger_left", + "description": "Category" + }, + { + "key": "seamark:beacon_lateral:category", + "value": "danger_right", + "description": "Category" + }, + { + "key": "seamark:beacon_lateral:colour", + "value": "red", + "description": "Colour" + }, + { + "key": "seamark:beacon_lateral:colour", + "value": "green", + "description": "Colour" + }, + { + "key": "seamark:beacon_lateral:colour", + "value": "grey", + "description": "Colour" + }, + {"key": "seamark:beacon_lateral:shape", "description": "Shape"}, + { + "key": "seamark:beacon_lateral:system", + "value": "iala-a", + "description": "System" + }, + { + "key": "seamark:beacon_lateral:system", + "value": "iala-b", + "description": "System" + }, + { + "key": "seamark:beacon_lateral:system", + "value": "cevni", + "description": "System" + }, + { + "key": "seamark:beacon_lateral:system", + "value": "other", + "description": "System" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "port", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "starboard", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "channel_left", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "channel_right", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "waterway_left", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "waterway_right", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "danger_left", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "danger_right", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "preferred_channel_port", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:category", + "value": "preferred_channel_starboard", + "description": "Category" + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "red;white;red;white", + "description": "Colour" + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "green;white;green;white", + "description": "Colour" + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "red;green;red", + "description": "Colour" + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "green;red;green", + "description": "Colour" + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "white", + "description": "Colour" + }, + { + "key": "seamark:buoy_lateral:colour", + "value": "yellow", + "description": "Colour" + }, + {"key": "seamark:buoy_lateral:shape", "description": "Shape"}, + { + "key": "seamark:buoy_lateral:system", + "value": "iala-a", + "description": "System" + }, + { + "key": "seamark:buoy_lateral:system", + "value": "iala-b", + "description": "System" + }, + { + "key": "seamark:buoy_lateral:system", + "value": "cevni", + "description": "System" + }, + { + "key": "seamark:buoy_lateral:system", + "value": "other", + "description": "System" + }, + {"key": "seamark:mooring:category", "description": "Category"}, {"key": "seasonal", "description": "Seasonal"}, {"key": "second_hand", "value": "yes", "description": "Sells Used"}, {"key": "second_hand", "value": "no", "description": "Sells Used"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 94c6f0d97..91155c2b7 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2553,6 +2553,86 @@ "sanitary_dump_station": { "label": "Toilet Disposal" }, + "seamark/beacon_isolated_danger/shape": { + "label": "Shape" + }, + "seamark/beacon_lateral/category": { + "label": "Category", + "options": { + "port": "Port", + "starboard": "Starboard", + "waterway_left": "Waterway Left", + "waterway_right": "Waterway Right", + "danger_left": "Danger Left", + "danger_right": "Danger Right" + } + }, + "seamark/beacon_lateral/colour": { + "label": "Colour", + "options": { + "red": "Red", + "green": "Green", + "grey": "Grey" + } + }, + "seamark/beacon_lateral/shape": { + "label": "Shape" + }, + "seamark/beacon_lateral/system": { + "label": "System", + "options": { + "iala-a": "IALA A", + "iala-b": "IALA B", + "cevni": "CEVNI", + "other": "Other" + } + }, + "seamark/buoy_lateral/category": { + "label": "Category", + "options": { + "port": "Port", + "starboard": "Starboard", + "channel_left": "Channel Left", + "channel_right": "Channel Right", + "waterway_left": "Waterway Left", + "waterway_right": "Waterway Right", + "danger_left": "Danger Left", + "danger_right": "Danger Right", + "preferred_channel_port": "Preferred Channel Port", + "preferred_channel_starboard": "Preferred Channel Starboard" + } + }, + "seamark/buoy_lateral/colour": { + "label": "Colour", + "options": { + "red": "Red", + "green": "Green", + "red;white;red;white": "Red-White-Red-White", + "green;white;green;white": "Green-White-Green-White", + "red;green;red": "Red-Green-Red", + "green;red;green": "Green-Red-Green", + "white": "White", + "yellow": "Yellow" + } + }, + "seamark/buoy_lateral/shape": { + "label": "Shape" + }, + "seamark/buoy_lateral/system": { + "label": "System", + "options": { + "iala-a": "IALA A", + "iala-b": "IALA B", + "cevni": "CEVNI", + "other": "Other" + } + }, + "seamark/mooring/category": { + "label": "Category" + }, + "seamark/type": { + "label": "Seamark" + }, "seasonal": { "label": "Seasonal" }, @@ -2969,6 +3049,10 @@ "name": "Roundabout", "terms": "" }, + "seamark": { + "name": "Seamark", + "terms": "" + }, "waterway": { "name": "Waterway", "terms": "" @@ -5921,6 +6005,30 @@ "name": "Ferry Route", "terms": "" }, + "seamark/beacon_isolated_danger": { + "name": "Danger Beacon", + "terms": "beacon isolated danger,isolated danger beacon,iala" + }, + "seamark/beacon_lateral": { + "name": "Channel Beacon", + "terms": "lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark" + }, + "seamark/buoy_lateral": { + "name": "Channel Buoy", + "terms": "lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark" + }, + "seamark/buoy_lateral/green": { + "name": "Green Buoy", + "terms": "lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark" + }, + "seamark/buoy_lateral/red": { + "name": "Red Buoy", + "terms": "lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark" + }, + "seamark/mooring": { + "name": "Mooring", + "terms": "dolphin,pile,bollard,buoy,post" + }, "shop": { "name": "Shop", "terms": "" From 629ee53db2976ee74719edd1c53b8fda78db73b5 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 5 Sep 2018 23:03:24 -0400 Subject: [PATCH 198/217] Upgrade fontawesome libraries --- build_data.js | 8 ++++---- package.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build_data.js b/build_data.js index 98278e527..f7059dba7 100644 --- a/build_data.js +++ b/build_data.js @@ -21,10 +21,10 @@ const presetSchema = require('./data/presets/schema/preset.json'); const suggestions = require('name-suggestion-index/name-suggestions.json'); // fontawesome icons -const fontawesome = require('@fortawesome/fontawesome'); -const fas = require('@fortawesome/fontawesome-free-solid').default; -const far = require('@fortawesome/fontawesome-free-regular').default; -const fab = require('@fortawesome/fontawesome-free-brands').default; +const fontawesome = require('@fortawesome/fontawesome-svg-core'); +const fas = require('@fortawesome/free-solid-svg-icons').fas; +const far = require('@fortawesome/free-regular-svg-icons').far; +const fab = require('@fortawesome/free-brands-svg-icons').fab; fontawesome.library.add(fas, far, fab); diff --git a/package.json b/package.json index a262d6a9f..4ff210e6b 100644 --- a/package.json +++ b/package.json @@ -49,10 +49,10 @@ "wmf-sitematrix": "0.1.4" }, "devDependencies": { - "@fortawesome/fontawesome": "^1.1.5", - "@fortawesome/fontawesome-free-brands": "^5.0.13", - "@fortawesome/fontawesome-free-regular": "^5.0.13", - "@fortawesome/fontawesome-free-solid": "^5.0.13", + "@fortawesome/fontawesome-svg-core": "~1.2.4", + "@fortawesome/free-brands-svg-icons": "~5.3.1", + "@fortawesome/free-regular-svg-icons": "~5.3.1", + "@fortawesome/free-solid-svg-icons": "~5.3.1", "@mapbox/maki": "^4.0.0", "chai": "^4.1.0", "colors": "^1.1.2", From 10c995552a89ce2e0002f45837f47ceb2b50c3e7 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 6 Sep 2018 00:18:27 -0400 Subject: [PATCH 199/217] Add more icons to presets that did not have a suitable one --- data/presets/presets.json | 136 +++++++++--------- data/presets/presets/advertising/column.json | 1 + data/presets/presets/aeroway/runway.json | 1 + .../presets/amenity/charging_station.json | 2 +- data/presets/presets/building/hut.json | 2 +- data/presets/presets/craft/painter.json | 2 +- .../presets/leisure/fitness_centre.json | 2 +- data/presets/presets/man_made/bridge.json | 1 + data/presets/presets/office/lawyer.json | 2 +- .../presets/office/moving_company.json | 2 +- data/presets/presets/shop/furniture.json | 2 +- data/presets/presets/shop/houseware.json | 2 +- data/presets/presets/shop/locksmith.json | 2 +- data/presets/presets/shop/optician.json | 2 +- data/presets/presets/shop/paint.json | 2 +- data/presets/presets/shop/storage_rental.json | 2 +- data/taginfo.json | 34 +++-- svg/fontawesome/fas-archway.svg | 1 + svg/fontawesome/fas-balance-scale.svg | 1 + svg/fontawesome/fas-bell.svg | 2 +- svg/fontawesome/fas-blender.svg | 1 + svg/fontawesome/fas-charging-station.svg | 1 + svg/fontawesome/fas-couch.svg | 1 + svg/fontawesome/fas-dumbbell.svg | 1 + svg/fontawesome/fas-glasses.svg | 1 + svg/fontawesome/fas-paint-roller.svg | 1 + svg/fontawesome/fas-people-carry.svg | 1 + svg/fontawesome/fas-plane-departure.svg | 1 + svg/fontawesome/fas-taxi.svg | 2 +- svg/fontawesome/fas-volume-up.svg | 2 +- svg/fontawesome/fas-wifi.svg | 2 +- 31 files changed, 116 insertions(+), 99 deletions(-) create mode 100644 svg/fontawesome/fas-archway.svg create mode 100644 svg/fontawesome/fas-balance-scale.svg create mode 100644 svg/fontawesome/fas-blender.svg create mode 100644 svg/fontawesome/fas-charging-station.svg create mode 100644 svg/fontawesome/fas-couch.svg create mode 100644 svg/fontawesome/fas-dumbbell.svg create mode 100644 svg/fontawesome/fas-glasses.svg create mode 100644 svg/fontawesome/fas-paint-roller.svg create mode 100644 svg/fontawesome/fas-people-carry.svg create mode 100644 svg/fontawesome/fas-plane-departure.svg diff --git a/data/presets/presets.json b/data/presets/presets.json index 1ba89797c..7bba04dec 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -12,7 +12,7 @@ "waterway": {"fields": ["name", "waterway"], "geometry": ["point", "vertex", "line", "area"], "tags": {"waterway": "*"}, "searchable": false, "name": "Waterway"}, "address": {"fields": ["address"], "geometry": ["point", "vertex", "area"], "tags": {"addr:*": "*"}, "addTags": {}, "removeTags": {}, "reference": {"key": "addr"}, "name": "Address", "matchScore": 0.15}, "advertising/billboard": {"fields": ["direction", "lit"], "geometry": ["point", "vertex", "line"], "tags": {"advertising": "billboard"}, "name": "Billboard"}, - "advertising/column": {"fields": ["lit"], "geometry": ["point", "area"], "tags": {"advertising": "column"}, "name": "Advertising Column"}, + "advertising/column": {"icon": "temaki-storage_tank", "fields": ["lit"], "geometry": ["point", "area"], "tags": {"advertising": "column"}, "name": "Advertising Column"}, "aerialway/station": {"icon": "maki-aerialway", "geometry": ["point", "vertex", "area"], "fields": ["aerialway/access", "aerialway/summer/access", "elevation", "building_area"], "tags": {"aerialway": "station"}, "name": "Aerialway Station", "searchable": false}, "aerialway/cable_car": {"geometry": ["line"], "terms": ["tramway", "ropeway"], "fields": ["name", "aerialway/occupancy", "aerialway/capacity", "aerialway/duration", "aerialway/heating"], "tags": {"aerialway": "cable_car"}, "name": "Cable Car"}, "aerialway/chair_lift": {"geometry": ["line"], "fields": ["name", "aerialway/occupancy", "aerialway/capacity", "aerialway/duration", "aerialway/bubble", "aerialway/heating"], "tags": {"aerialway": "chair_lift"}, "name": "Chair Lift"}, @@ -30,7 +30,7 @@ "aeroway/gate": {"icon": "maki-airport", "geometry": ["point"], "fields": ["ref_aeroway_gate"], "tags": {"aeroway": "gate"}, "name": "Airport Gate"}, "aeroway/hangar": {"geometry": ["area"], "fields": ["name", "building_area"], "tags": {"aeroway": "hangar"}, "name": "Hangar"}, "aeroway/helipad": {"icon": "maki-heliport", "geometry": ["point", "area"], "fields": ["ref"], "terms": ["helicopter", "helipad", "heliport"], "tags": {"aeroway": "helipad"}, "name": "Helipad"}, - "aeroway/runway": {"geometry": ["line", "area"], "terms": ["landing strip"], "fields": ["ref_runway", "surface", "length", "width"], "tags": {"aeroway": "runway"}, "name": "Runway"}, + "aeroway/runway": {"icon": "fas-plane-departure", "geometry": ["line", "area"], "terms": ["landing strip"], "fields": ["ref_runway", "surface", "length", "width"], "tags": {"aeroway": "runway"}, "name": "Runway"}, "aeroway/taxiway": {"geometry": ["line"], "fields": ["ref_taxiway", "surface"], "tags": {"aeroway": "taxiway"}, "name": "Taxiway"}, "aeroway/terminal": {"icon": "maki-airport", "geometry": ["point", "area"], "terms": ["airport", "aerodrome"], "fields": ["name", "operator", "building_area"], "tags": {"aeroway": "terminal"}, "name": "Airport Terminal"}, "allotments/plot": {"geometry": ["area"], "fields": ["name", "ref"], "tags": {"allotments": "plot"}, "reference": {"key": "allotments", "value": "plot"}, "name": "Community Garden Plot"}, @@ -62,7 +62,7 @@ "amenity/car_sharing": {"icon": "maki-car", "fields": ["name", "operator", "capacity", "payment_multi"], "geometry": ["point", "area"], "tags": {"amenity": "car_sharing"}, "name": "Car Sharing"}, "amenity/car_wash": {"icon": "maki-car", "fields": ["address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"amenity": "car_wash"}, "name": "Car Wash"}, "amenity/casino": {"icon": "temaki-dice", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "smoking"], "geometry": ["point", "area"], "terms": ["gambling", "roulette", "craps", "poker", "blackjack"], "tags": {"amenity": "casino"}, "name": "Casino"}, - "amenity/charging_station": {"icon": "maki-car", "fields": ["operator", "capacity"], "geometry": ["point"], "tags": {"amenity": "charging_station"}, "terms": ["EV", "Electric Vehicle", "Supercharger"], "name": "Charging Station"}, + "amenity/charging_station": {"icon": "fas-charging-station", "fields": ["operator", "capacity"], "geometry": ["point"], "tags": {"amenity": "charging_station"}, "terms": ["EV", "Electric Vehicle", "Supercharger"], "name": "Charging Station"}, "amenity/childcare": {"icon": "maki-school", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["daycare", "orphanage", "playgroup"], "tags": {"amenity": "childcare"}, "name": "Nursery/Childcare"}, "amenity/cinema": {"icon": "maki-cinema", "fields": ["name", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["drive-in", "film", "flick", "movie", "theater", "picture", "show", "screen"], "tags": {"amenity": "cinema"}, "name": "Cinema"}, "amenity/clinic": {"icon": "maki-doctor", "fields": ["name", "operator", "healthcare/speciality", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["medical", "urgentcare"], "tags": {"amenity": "clinic"}, "addTags": {"amenity": "clinic", "healthcare": "clinic"}, "removeTags": {"amenity": "clinic", "healthcare": "clinic"}, "reference": {"key": "amenity", "value": "clinic"}, "name": "Clinic"}, @@ -234,7 +234,7 @@ "building/hospital": {"icon": "maki-building", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "hospital"}, "matchScore": 0.5, "name": "Hospital Building"}, "building/hotel": {"icon": "maki-building", "fields": ["name", "address", "levels", "height", "smoking"], "geometry": ["area"], "tags": {"building": "hotel"}, "matchScore": 0.5, "name": "Hotel Building"}, "building/house": {"icon": "maki-home", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "house"}, "terms": ["home", "family", "residence", "dwelling"], "matchScore": 0.5, "name": "House"}, - "building/hut": {"geometry": ["area"], "fields": ["name"], "tags": {"building": "hut"}, "matchScore": 0.5, "name": "Hut"}, + "building/hut": {"icon": "maki-home", "geometry": ["area"], "fields": ["name"], "tags": {"building": "hut"}, "matchScore": 0.5, "name": "Hut"}, "building/industrial": {"icon": "maki-industry", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "industrial"}, "matchScore": 0.5, "name": "Industrial Building"}, "building/kindergarten": {"icon": "maki-building", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "terms": ["kindergarden", "pre-school"], "tags": {"building": "kindergarten"}, "matchScore": 0.5, "name": "Preschool/Kindergarten Building"}, "building/mosque": {"icon": "maki-place-of-worship", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "mosque"}, "matchScore": 0.5, "name": "Mosque Building"}, @@ -285,7 +285,7 @@ "craft/insulator": {"icon": "temaki-tools", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"craft": "insulation"}, "name": "Insulator"}, "craft/key_cutter": {"icon": "fas-key", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"craft": "key_cutter"}, "name": "Key Cutter"}, "craft/metal_construction": {"icon": "temaki-tools", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"craft": "metal_construction"}, "name": "Metal Construction"}, - "craft/painter": {"icon": "maki-art-gallery", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"craft": "painter"}, "name": "Painter"}, + "craft/painter": {"icon": "fas-paint-roller", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"craft": "painter"}, "name": "Painter"}, "craft/photographer": {"icon": "maki-attraction", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"craft": "photographer"}, "name": "Photographer"}, "craft/photographic_laboratory": {"icon": "maki-attraction", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["film"], "tags": {"craft": "photographic_laboratory"}, "name": "Photographic Laboratory"}, "craft/plasterer": {"icon": "temaki-tools", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"craft": "plasterer"}, "name": "Plasterer"}, @@ -477,7 +477,7 @@ "leisure/dancing_school": {"icon": "maki-music", "fields": ["name", "operator", "address", "building_area", "opening_hours", "dance/style"], "geometry": ["point", "area"], "terms": ["jive", "swing", "tango", "waltz", "dance teaching"], "tags": {"leisure": "dance", "dance:teaching": "yes"}, "reference": {"key": "leisure", "value": "dance"}, "name": "Dance School"}, "leisure/dog_park": {"icon": "maki-dog-park", "geometry": ["point", "area"], "fields": ["name"], "terms": [], "tags": {"leisure": "dog_park"}, "name": "Dog Park"}, "leisure/firepit": {"icon": "maki-fire-station", "fields": ["access_simple"], "geometry": ["point", "area"], "tags": {"leisure": "firepit"}, "terms": ["fireplace", "campfire"], "name": "Firepit"}, - "leisure/fitness_centre": {"icon": "maki-pitch", "fields": ["name", "sport", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "fitness_centre"}, "terms": ["health", "gym", "leisure", "studio"], "name": "Gym / Fitness Center"}, + "leisure/fitness_centre": {"icon": "fas-dumbbell", "fields": ["name", "sport", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "fitness_centre"}, "terms": ["health", "gym", "leisure", "studio"], "name": "Gym / Fitness Center"}, "leisure/fitness_centre/yoga": {"icon": "maki-pitch", "fields": ["name", "sport", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["studio"], "tags": {"leisure": "fitness_centre", "sport": "yoga"}, "reference": {"key": "sport", "value": "yoga"}, "name": "Yoga Studio"}, "leisure/fitness_station": {"icon": "maki-pitch", "fields": ["fitness_station", "ref", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "fitness_station"}, "addTags": {"leisure": "fitness_station", "sport": "fitness"}, "removeTags": {"leisure": "fitness_station", "sport": "fitness"}, "reference": {"key": "leisure", "value": "fitness_station"}, "terms": ["exercise", "fitness", "gym", "trim trail"], "name": "Outdoor Fitness Station"}, "leisure/fitness_station/balance_beam": {"icon": "maki-pitch", "fields": ["ref", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "fitness_station", "fitness_station": "balance_beam"}, "addTags": {"leisure": "fitness_station", "fitness_station": "balance_beam", "sport": "fitness"}, "removeTags": {"leisure": "fitness_station", "fitness_station": "balance_beam", "sport": "fitness"}, "reference": {"key": "leisure", "value": "fitness_station"}, "terms": ["balance", "exercise", "fitness", "gym", "trim trail"], "name": "Exercise Balance Beam"}, @@ -536,7 +536,7 @@ "man_made/adit": {"icon": "maki-triangle", "geometry": ["point", "area"], "fields": ["operator", "direction"], "terms": ["entrance", "underground", "mine", "cave"], "tags": {"man_made": "adit"}, "name": "Adit"}, "man_made/antenna": {"icon": "temaki-antenna", "fields": ["height", "communication_multi"], "geometry": ["point"], "terms": ["broadcast", "cell phone", "cell", "communication", "mobile phone", "radio", "television", "transmission", "tv"], "tags": {"man_made": "antenna"}, "name": "Antenna"}, "man_made/breakwater": {"geometry": ["line", "area"], "tags": {"man_made": "breakwater"}, "name": "Breakwater"}, - "man_made/bridge": {"fields": ["name", "bridge", "layer", "maxweight"], "geometry": ["area"], "tags": {"man_made": "bridge"}, "addTags": {"man_made": "bridge", "layer": "1"}, "removeTags": {"man_made": "bridge", "layer": "*"}, "reference": {"key": "man_made", "value": "bridge"}, "name": "Bridge"}, + "man_made/bridge": {"icon": "fas-archway", "fields": ["name", "bridge", "layer", "maxweight"], "geometry": ["area"], "tags": {"man_made": "bridge"}, "addTags": {"man_made": "bridge", "layer": "1"}, "removeTags": {"man_made": "bridge", "layer": "*"}, "reference": {"key": "man_made", "value": "bridge"}, "name": "Bridge"}, "man_made/bunker_silo": {"icon": "temaki-silo", "fields": ["content"], "geometry": ["point", "area"], "terms": ["Silage", "Storage"], "tags": {"man_made": "bunker_silo"}, "name": "Bunker Silo"}, "man_made/chimney": {"icon": "temaki-chimney", "geometry": ["point", "area"], "tags": {"man_made": "chimney"}, "name": "Chimney"}, "man_made/clearcut": {"icon": "maki-logging", "geometry": ["area"], "tags": {"man_made": "clearcut"}, "terms": ["cut", "forest", "lumber", "tree", "wood"], "name": "Clearcut Forest"}, @@ -625,9 +625,9 @@ "office/guide": {"icon": "maki-suitcase", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "guide"}, "terms": ["dive guide", "mountain guide", "tour guide"], "name": "Tour Guide Office"}, "office/insurance": {"icon": "maki-suitcase", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "insurance"}, "terms": [], "name": "Insurance Office"}, "office/it": {"icon": "maki-suitcase", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "it"}, "terms": ["computer", "information", "software", "technology"], "name": "Information Technology Office"}, - "office/lawyer": {"icon": "maki-suitcase", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "lawyer"}, "terms": [], "name": "Law Office"}, + "office/lawyer": {"icon": "fas-balance-scale", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "lawyer"}, "terms": [], "name": "Law Office"}, "office/lawyer/notary": {"icon": "maki-suitcase", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "lawyer", "lawyer": "notary"}, "reference": {"key": "office", "value": "notary"}, "searchable": false, "name": "Notary Office"}, - "office/moving_company": {"icon": "maki-warehouse", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "moving_company"}, "terms": ["relocation"], "name": "Moving Company Office"}, + "office/moving_company": {"icon": "fas-people-carry", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "moving_company"}, "terms": ["relocation"], "name": "Moving Company Office"}, "office/newspaper": {"icon": "maki-library", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "newspaper"}, "terms": [], "name": "Newspaper Office"}, "office/ngo": {"icon": "maki-suitcase", "fields": ["name", "address", "building_area", "opening_hours", "smoking"], "geometry": ["point", "area"], "tags": {"office": "ngo"}, "terms": ["ngo", "non government", "non-government", "organization", "organisation"], "name": "NGO Office"}, "office/notary": {"icon": "maki-suitcase", "fields": ["name", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "tags": {"office": "notary"}, "terms": ["clerk", "deeds", "estate", "signature", "wills"], "name": "Notary Office"}, @@ -805,7 +805,7 @@ "shop/florist": {"icon": "maki-florist", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["flower"], "tags": {"shop": "florist"}, "name": "Florist"}, "shop/frame": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "frame"}, "terms": ["art*", "paint*", "photo*", "frame"], "name": "Framing Shop"}, "shop/funeral_directors": {"icon": "maki-cemetery", "fields": ["name", "operator", "address", "building_area", "religion", "denomination"], "geometry": ["point", "area"], "terms": ["undertaker", "memorial home"], "tags": {"shop": "funeral_directors"}, "name": "Funeral Home"}, - "shop/furniture": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["chair", "sofa", "table"], "tags": {"shop": "furniture"}, "name": "Furniture Store"}, + "shop/furniture": {"icon": "fas-couch", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["chair", "sofa", "table"], "tags": {"shop": "furniture"}, "name": "Furniture Store"}, "shop/garden_centre": {"icon": "maki-garden-center", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["landscape", "mulch", "shrub", "tree"], "tags": {"shop": "garden_centre"}, "name": "Garden Center"}, "shop/gas": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["cng", "lpg", "natural gas", "propane", "refill", "tank"], "tags": {"shop": "gas"}, "name": "Bottled Gas Shop"}, "shop/gift": {"icon": "maki-gift", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["souvenir"], "tags": {"shop": "gift"}, "name": "Gift Shop"}, @@ -816,14 +816,14 @@ "shop/hearing_aids": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "hearing_aids"}, "name": "Hearing Aids Store"}, "shop/herbalist": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "herbalist"}, "name": "Herbalist"}, "shop/hifi": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["stereo", "video"], "tags": {"shop": "hifi"}, "name": "Hifi Store"}, - "shop/houseware": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["home", "household"], "tags": {"shop": "houseware"}, "name": "Houseware Store"}, + "shop/houseware": {"icon": "fas-blender", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["home", "household"], "tags": {"shop": "houseware"}, "name": "Houseware Store"}, "shop/interior_decoration": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "interior_decoration"}, "name": "Interior Decoration Store"}, "shop/jewelry": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["diamond", "gem", "ring"], "tags": {"shop": "jewelry"}, "name": "Jeweler"}, "shop/kiosk": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "levels"], "geometry": ["point", "area"], "tags": {"shop": "kiosk"}, "name": "Kiosk"}, "shop/kitchen": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "kitchen"}, "name": "Kitchen Design Store"}, "shop/laundry": {"icon": "maki-laundry", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "laundry"}, "name": "Laundry"}, "shop/leather": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "leather"}, "name": "Leather Store"}, - "shop/locksmith": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["key", "lockpick"], "tags": {"shop": "locksmith"}, "name": "Locksmith"}, + "shop/locksmith": {"icon": "fas-key", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["key", "lockpick"], "tags": {"shop": "locksmith"}, "name": "Locksmith"}, "shop/lottery": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "lottery"}, "name": "Lottery Shop"}, "shop/mall": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["shopping"], "tags": {"shop": "mall"}, "name": "Mall"}, "shop/massage": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "massage"}, "name": "Massage Shop"}, @@ -836,10 +836,10 @@ "shop/musical_instrument": {"icon": "maki-music", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["guitar"], "tags": {"shop": "musical_instrument"}, "name": "Musical Instrument Store"}, "shop/newsagent": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "newsagent"}, "name": "Newspaper/Magazine Shop"}, "shop/nutrition_supplements": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "nutrition_supplements"}, "name": "Nutrition Supplements Store"}, - "shop/optician": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["eye", "glasses"], "tags": {"shop": "optician"}, "name": "Optician"}, + "shop/optician": {"icon": "fas-glasses", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["eye", "glasses"], "tags": {"shop": "optician"}, "name": "Optician"}, "shop/organic": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "supermarket", "organic": "only"}, "name": "Organic Goods Store"}, "shop/outdoor": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["camping", "climbing", "hiking"], "tags": {"shop": "outdoor"}, "name": "Outdoors Store"}, - "shop/paint": {"icon": "maki-water", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "paint"}, "name": "Paint Store"}, + "shop/paint": {"icon": "fas-paint-roller", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "paint"}, "name": "Paint Store"}, "shop/pastry": {"icon": "maki-bakery", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "pastry"}, "terms": ["patisserie", "cake shop", "cakery"], "name": "Pastry Shop"}, "shop/pawnbroker": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "pawnbroker"}, "name": "Pawn Shop"}, "shop/perfumery": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "perfumery"}, "name": "Perfume Store"}, @@ -856,7 +856,7 @@ "shop/shoes": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "shoes"}, "name": "Shoe Store"}, "shop/sports": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "sports"}, "name": "Sporting Goods Store"}, "shop/stationery": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["card", "paper"], "tags": {"shop": "stationery"}, "name": "Stationery Store"}, - "shop/storage_rental": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "storage_rental"}, "name": "Storage Rental"}, + "shop/storage_rental": {"icon": "fas-warehouse", "fields": ["name", "operator", "address", "building", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "storage_rental"}, "name": "Storage Rental"}, "shop/supermarket": {"icon": "maki-grocery", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["grocery", "store", "shop"], "tags": {"shop": "supermarket"}, "name": "Supermarket"}, "shop/tailor": {"icon": "maki-clothing-store", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "terms": ["clothes", "suit"], "tags": {"shop": "tailor"}, "name": "Tailor"}, "shop/tattoo": {"icon": "maki-shop", "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "geometry": ["point", "area"], "tags": {"shop": "tattoo"}, "name": "Tattoo Parlor"}, @@ -2769,9 +2769,9 @@ "amenity/theatre/Amphitheatre": {"tags": {"name": "Amphitheatre", "amenity": "theatre"}, "name": "Amphitheatre", "icon": "maki-theatre", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area"], "suggestion": true}, "amenity/theatre/Freilichtbühne": {"tags": {"name": "Freilichtbühne", "amenity": "theatre"}, "name": "Freilichtbühne", "icon": "maki-theatre", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area"], "suggestion": true}, "amenity/theatre/Teatro Comunale": {"tags": {"name": "Teatro Comunale", "amenity": "theatre"}, "name": "Teatro Comunale", "icon": "maki-theatre", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area"], "suggestion": true}, - "leisure/fitness_centre/LA Fitness": {"tags": {"name": "LA Fitness", "leisure": "fitness_centre"}, "name": "LA Fitness", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "address", "building_area", "opening_hours"], "suggestion": true}, - "leisure/fitness_centre/Planet Fitness": {"tags": {"name": "Planet Fitness", "leisure": "fitness_centre"}, "name": "Planet Fitness", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "address", "building_area", "opening_hours"], "suggestion": true}, - "leisure/fitness_centre/Snap Fitness": {"tags": {"name": "Snap Fitness", "leisure": "fitness_centre"}, "name": "Snap Fitness", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "address", "building_area", "opening_hours"], "suggestion": true}, + "leisure/fitness_centre/LA Fitness": {"tags": {"name": "LA Fitness", "leisure": "fitness_centre"}, "name": "LA Fitness", "icon": "fas-dumbbell", "geometry": ["point", "area"], "fields": ["name", "sport", "address", "building_area", "opening_hours"], "suggestion": true}, + "leisure/fitness_centre/Planet Fitness": {"tags": {"name": "Planet Fitness", "leisure": "fitness_centre"}, "name": "Planet Fitness", "icon": "fas-dumbbell", "geometry": ["point", "area"], "fields": ["name", "sport", "address", "building_area", "opening_hours"], "suggestion": true}, + "leisure/fitness_centre/Snap Fitness": {"tags": {"name": "Snap Fitness", "leisure": "fitness_centre"}, "name": "Snap Fitness", "icon": "fas-dumbbell", "geometry": ["point", "area"], "fields": ["name", "sport", "address", "building_area", "opening_hours"], "suggestion": true}, "leisure/playground/Çocuk Parkı": {"tags": {"name": "Çocuk Parkı", "leisure": "playground"}, "name": "Çocuk Parkı", "icon": "maki-playground", "geometry": ["point", "area"], "fields": ["name", "operator", "surface", "playground/max_age", "playground/min_age", "access_simple"], "suggestion": true}, "leisure/playground/놀이터": {"tags": {"name": "놀이터", "leisure": "playground"}, "name": "놀이터", "icon": "maki-playground", "geometry": ["point", "area"], "fields": ["name", "operator", "surface", "playground/max_age", "playground/min_age", "access_simple"], "suggestion": true}, "leisure/sports_centre/Anytime Fitness": {"tags": {"name": "Anytime Fitness", "leisure": "sports_centre"}, "name": "Anytime Fitness", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, @@ -3599,24 +3599,24 @@ "shop/frame/rumah penduduk": {"tags": {"name": "rumah penduduk", "shop": "frame"}, "name": "rumah penduduk", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/funeral_directors/The Co-operative Funeralcare": {"tags": {"name": "The Co-operative Funeralcare", "shop": "funeral_directors"}, "name": "The Co-operative Funeralcare", "icon": "maki-cemetery", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "religion", "denomination"], "suggestion": true}, "shop/funeral_directors/Ритуальные услуги": {"tags": {"name": "Ритуальные услуги", "shop": "funeral_directors"}, "name": "Ритуальные услуги", "icon": "maki-cemetery", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "religion", "denomination"], "suggestion": true}, - "shop/furniture/Aaron's": {"tags": {"name": "Aaron's", "shop": "furniture"}, "name": "Aaron's", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Black Red White": {"tags": {"name": "Black Red White", "shop": "furniture"}, "name": "Black Red White", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Bodzio": {"tags": {"name": "Bodzio", "shop": "furniture"}, "name": "Bodzio", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/But": {"tags": {"name": "But", "shop": "furniture"}, "name": "But", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Conforama": {"tags": {"name": "Conforama", "shop": "furniture"}, "name": "Conforama", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/DFS": {"tags": {"name": "DFS", "shop": "furniture"}, "name": "DFS", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Dänisches Bettenlager": {"tags": {"name": "Dänisches Bettenlager", "shop": "furniture"}, "name": "Dänisches Bettenlager", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Fly": {"tags": {"name": "Fly", "shop": "furniture"}, "name": "Fly", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Harveys": {"tags": {"name": "Harveys", "shop": "furniture"}, "name": "Harveys", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/IKEA": {"tags": {"name": "IKEA", "shop": "furniture"}, "name": "IKEA", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/JYSK": {"tags": {"name": "JYSK", "shop": "furniture"}, "name": "JYSK", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Kwantum": {"tags": {"name": "Kwantum", "shop": "furniture"}, "name": "Kwantum", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Leen Bakker": {"tags": {"name": "Leen Bakker", "shop": "furniture"}, "name": "Leen Bakker", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Pier 1 Imports": {"tags": {"name": "Pier 1 Imports", "shop": "furniture"}, "name": "Pier 1 Imports", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Roller": {"tags": {"name": "Roller", "shop": "furniture"}, "name": "Roller", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/The Brick": {"tags": {"name": "The Brick", "shop": "furniture"}, "name": "The Brick", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/Меблі": {"tags": {"name": "Меблі", "shop": "furniture"}, "name": "Меблі", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/furniture/ニトリ": {"tags": {"name": "ニトリ", "shop": "furniture"}, "name": "ニトリ", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Aaron's": {"tags": {"name": "Aaron's", "shop": "furniture"}, "name": "Aaron's", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Black Red White": {"tags": {"name": "Black Red White", "shop": "furniture"}, "name": "Black Red White", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Bodzio": {"tags": {"name": "Bodzio", "shop": "furniture"}, "name": "Bodzio", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/But": {"tags": {"name": "But", "shop": "furniture"}, "name": "But", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Conforama": {"tags": {"name": "Conforama", "shop": "furniture"}, "name": "Conforama", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/DFS": {"tags": {"name": "DFS", "shop": "furniture"}, "name": "DFS", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Dänisches Bettenlager": {"tags": {"name": "Dänisches Bettenlager", "shop": "furniture"}, "name": "Dänisches Bettenlager", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Fly": {"tags": {"name": "Fly", "shop": "furniture"}, "name": "Fly", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Harveys": {"tags": {"name": "Harveys", "shop": "furniture"}, "name": "Harveys", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/IKEA": {"tags": {"name": "IKEA", "shop": "furniture"}, "name": "IKEA", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/JYSK": {"tags": {"name": "JYSK", "shop": "furniture"}, "name": "JYSK", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Kwantum": {"tags": {"name": "Kwantum", "shop": "furniture"}, "name": "Kwantum", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Leen Bakker": {"tags": {"name": "Leen Bakker", "shop": "furniture"}, "name": "Leen Bakker", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Pier 1 Imports": {"tags": {"name": "Pier 1 Imports", "shop": "furniture"}, "name": "Pier 1 Imports", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Roller": {"tags": {"name": "Roller", "shop": "furniture"}, "name": "Roller", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/The Brick": {"tags": {"name": "The Brick", "shop": "furniture"}, "name": "The Brick", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/Меблі": {"tags": {"name": "Меблі", "shop": "furniture"}, "name": "Меблі", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/furniture/ニトリ": {"tags": {"name": "ニトリ", "shop": "furniture"}, "name": "ニトリ", "icon": "fas-couch", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/garden_centre/Dehner": {"tags": {"name": "Dehner", "shop": "garden_centre"}, "name": "Dehner", "icon": "maki-garden-center", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/garden_centre/Gamm Vert": {"tags": {"name": "Gamm Vert", "shop": "garden_centre"}, "name": "Gamm Vert", "icon": "maki-garden-center", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/garden_centre/Jardiland": {"tags": {"name": "Jardiland", "shop": "garden_centre"}, "name": "Jardiland", "icon": "maki-garden-center", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, @@ -3677,9 +3677,9 @@ "shop/hearing_aids/Kind Hörgeräte": {"tags": {"name": "Kind Hörgeräte", "shop": "hearing_aids"}, "name": "Kind Hörgeräte", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/hearing_aids/amplifon": {"tags": {"name": "amplifon", "shop": "hearing_aids"}, "name": "amplifon", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/hifi/Bang & Olufsen": {"tags": {"name": "Bang & Olufsen", "shop": "hifi"}, "name": "Bang & Olufsen", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/houseware/Blokker": {"tags": {"name": "Blokker", "shop": "houseware"}, "name": "Blokker", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/houseware/Marskramer": {"tags": {"name": "Marskramer", "shop": "houseware"}, "name": "Marskramer", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/houseware/Xenos": {"tags": {"name": "Xenos", "shop": "houseware"}, "name": "Xenos", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/houseware/Blokker": {"tags": {"name": "Blokker", "shop": "houseware"}, "name": "Blokker", "icon": "fas-blender", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/houseware/Marskramer": {"tags": {"name": "Marskramer", "shop": "houseware"}, "name": "Marskramer", "icon": "fas-blender", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/houseware/Xenos": {"tags": {"name": "Xenos", "shop": "houseware"}, "name": "Xenos", "icon": "fas-blender", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/interior_decoration/Casa": {"tags": {"name": "Casa", "shop": "interior_decoration"}, "name": "Casa", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/interior_decoration/Depot": {"tags": {"name": "Depot", "shop": "interior_decoration"}, "name": "Depot", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/jewelry/585": {"tags": {"name": "585", "shop": "jewelry"}, "name": "585", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, @@ -3793,38 +3793,38 @@ "shop/newsagent/Печать": {"tags": {"name": "Печать", "shop": "newsagent"}, "name": "Печать", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/newsagent/Роспечать": {"tags": {"name": "Роспечать", "shop": "newsagent"}, "name": "Роспечать", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/newsagent/Союзпечать": {"tags": {"name": "Союзпечать", "shop": "newsagent"}, "name": "Союзпечать", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Alain Afflelou": {"tags": {"name": "Alain Afflelou", "shop": "optician"}, "name": "Alain Afflelou", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Apollo": {"tags": {"name": "Apollo", "shop": "optician"}, "name": "Apollo", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Atol": {"tags": {"name": "Atol", "shop": "optician"}, "name": "Atol", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Boots Opticians": {"tags": {"name": "Boots Opticians", "shop": "optician"}, "name": "Boots Opticians", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Fielmann": {"tags": {"name": "Fielmann", "shop": "optician"}, "name": "Fielmann", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/General Óptica": {"tags": {"name": "General Óptica", "shop": "optician"}, "name": "General Óptica", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Grand Optical": {"tags": {"name": "Grand Optical", "shop": "optician"}, "name": "Grand Optical", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Générale d'Optique": {"tags": {"name": "Générale d'Optique", "shop": "optician"}, "name": "Générale d'Optique", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Hakim Optical": {"tags": {"name": "Hakim Optical", "shop": "optician"}, "name": "Hakim Optical", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Hans Anders": {"tags": {"name": "Hans Anders", "shop": "optician"}, "name": "Hans Anders", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Krys": {"tags": {"name": "Krys", "shop": "optician"}, "name": "Krys", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Les Opticiens Mutualistes": {"tags": {"name": "Les Opticiens Mutualistes", "shop": "optician"}, "name": "Les Opticiens Mutualistes", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Optic 2000": {"tags": {"name": "Optic 2000", "shop": "optician"}, "name": "Optic 2000", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Optical Center": {"tags": {"name": "Optical Center", "shop": "optician"}, "name": "Optical Center", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Pearle": {"tags": {"name": "Pearle", "shop": "optician"}, "name": "Pearle", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Pearle Vision": {"tags": {"name": "Pearle Vision", "shop": "optician"}, "name": "Pearle Vision", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Specsavers": {"tags": {"name": "Specsavers", "shop": "optician"}, "name": "Specsavers", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Sunglass Hut": {"tags": {"name": "Sunglass Hut", "shop": "optician"}, "name": "Sunglass Hut", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Synoptik": {"tags": {"name": "Synoptik", "shop": "optician"}, "name": "Synoptik", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/Vision Express": {"tags": {"name": "Vision Express", "shop": "optician"}, "name": "Vision Express", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/แว่นท็อปเจริญ": {"tags": {"name": "แว่นท็อปเจริญ", "shop": "optician"}, "name": "แว่นท็อปเจริญ", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/メガネスーパー": {"tags": {"name": "メガネスーパー", "shop": "optician"}, "name": "メガネスーパー", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/optician/眼鏡市場": {"tags": {"name": "眼鏡市場", "shop": "optician"}, "name": "眼鏡市場", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Alain Afflelou": {"tags": {"name": "Alain Afflelou", "shop": "optician"}, "name": "Alain Afflelou", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Apollo": {"tags": {"name": "Apollo", "shop": "optician"}, "name": "Apollo", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Atol": {"tags": {"name": "Atol", "shop": "optician"}, "name": "Atol", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Boots Opticians": {"tags": {"name": "Boots Opticians", "shop": "optician"}, "name": "Boots Opticians", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Fielmann": {"tags": {"name": "Fielmann", "shop": "optician"}, "name": "Fielmann", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/General Óptica": {"tags": {"name": "General Óptica", "shop": "optician"}, "name": "General Óptica", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Grand Optical": {"tags": {"name": "Grand Optical", "shop": "optician"}, "name": "Grand Optical", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Générale d'Optique": {"tags": {"name": "Générale d'Optique", "shop": "optician"}, "name": "Générale d'Optique", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Hakim Optical": {"tags": {"name": "Hakim Optical", "shop": "optician"}, "name": "Hakim Optical", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Hans Anders": {"tags": {"name": "Hans Anders", "shop": "optician"}, "name": "Hans Anders", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Krys": {"tags": {"name": "Krys", "shop": "optician"}, "name": "Krys", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Les Opticiens Mutualistes": {"tags": {"name": "Les Opticiens Mutualistes", "shop": "optician"}, "name": "Les Opticiens Mutualistes", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Optic 2000": {"tags": {"name": "Optic 2000", "shop": "optician"}, "name": "Optic 2000", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Optical Center": {"tags": {"name": "Optical Center", "shop": "optician"}, "name": "Optical Center", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Pearle": {"tags": {"name": "Pearle", "shop": "optician"}, "name": "Pearle", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Pearle Vision": {"tags": {"name": "Pearle Vision", "shop": "optician"}, "name": "Pearle Vision", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Specsavers": {"tags": {"name": "Specsavers", "shop": "optician"}, "name": "Specsavers", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Sunglass Hut": {"tags": {"name": "Sunglass Hut", "shop": "optician"}, "name": "Sunglass Hut", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Synoptik": {"tags": {"name": "Synoptik", "shop": "optician"}, "name": "Synoptik", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/Vision Express": {"tags": {"name": "Vision Express", "shop": "optician"}, "name": "Vision Express", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/แว่นท็อปเจริญ": {"tags": {"name": "แว่นท็อปเจริญ", "shop": "optician"}, "name": "แว่นท็อปเจริญ", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/メガネスーパー": {"tags": {"name": "メガネスーパー", "shop": "optician"}, "name": "メガネスーパー", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/optician/眼鏡市場": {"tags": {"name": "眼鏡市場", "shop": "optician"}, "name": "眼鏡市場", "icon": "fas-glasses", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/outdoor/Mountain Warehouse": {"tags": {"name": "Mountain Warehouse", "shop": "outdoor"}, "name": "Mountain Warehouse", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/outdoor/REI": {"tags": {"name": "REI", "shop": "outdoor"}, "name": "REI", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/outdoor/Рыболов": {"tags": {"name": "Рыболов", "shop": "outdoor"}, "name": "Рыболов", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/paint/Benjamin Moore": {"tags": {"name": "Benjamin Moore", "shop": "paint"}, "name": "Benjamin Moore", "icon": "maki-water", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/paint/Comex": {"tags": {"name": "Comex", "shop": "paint"}, "name": "Comex", "icon": "maki-water", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/paint/Jotun": {"tags": {"name": "Jotun", "shop": "paint"}, "name": "Jotun", "icon": "maki-water", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/paint/National Paints": {"tags": {"name": "National Paints", "shop": "paint"}, "name": "National Paints", "icon": "maki-water", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/paint/Sherwin Williams": {"tags": {"name": "Sherwin Williams", "shop": "paint"}, "name": "Sherwin Williams", "icon": "maki-water", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, - "shop/paint/Sherwin-Williams Paints": {"tags": {"name": "Sherwin-Williams Paints", "shop": "paint"}, "name": "Sherwin-Williams Paints", "icon": "maki-water", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/paint/Benjamin Moore": {"tags": {"name": "Benjamin Moore", "shop": "paint"}, "name": "Benjamin Moore", "icon": "fas-paint-roller", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/paint/Comex": {"tags": {"name": "Comex", "shop": "paint"}, "name": "Comex", "icon": "fas-paint-roller", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/paint/Jotun": {"tags": {"name": "Jotun", "shop": "paint"}, "name": "Jotun", "icon": "fas-paint-roller", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/paint/National Paints": {"tags": {"name": "National Paints", "shop": "paint"}, "name": "National Paints", "icon": "fas-paint-roller", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/paint/Sherwin Williams": {"tags": {"name": "Sherwin Williams", "shop": "paint"}, "name": "Sherwin Williams", "icon": "fas-paint-roller", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, + "shop/paint/Sherwin-Williams Paints": {"tags": {"name": "Sherwin-Williams Paints", "shop": "paint"}, "name": "Sherwin-Williams Paints", "icon": "fas-paint-roller", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/pawnbroker/Cash Converters": {"tags": {"name": "Cash Converters", "shop": "pawnbroker"}, "name": "Cash Converters", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/pawnbroker/Lombard": {"tags": {"name": "Lombard", "shop": "pawnbroker"}, "name": "Lombard", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, "shop/pawnbroker/Palawan Pawnshop": {"tags": {"name": "Palawan Pawnshop", "shop": "pawnbroker"}, "name": "Palawan Pawnshop", "icon": "maki-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi"], "suggestion": true}, diff --git a/data/presets/presets/advertising/column.json b/data/presets/presets/advertising/column.json index 6aa439931..8be158ff1 100644 --- a/data/presets/presets/advertising/column.json +++ b/data/presets/presets/advertising/column.json @@ -1,4 +1,5 @@ { + "icon": "temaki-storage_tank", "fields": [ "lit" ], diff --git a/data/presets/presets/aeroway/runway.json b/data/presets/presets/aeroway/runway.json index 34885e219..80c6cc066 100644 --- a/data/presets/presets/aeroway/runway.json +++ b/data/presets/presets/aeroway/runway.json @@ -1,4 +1,5 @@ { + "icon": "fas-plane-departure", "geometry": [ "line", "area" diff --git a/data/presets/presets/amenity/charging_station.json b/data/presets/presets/amenity/charging_station.json index 96a5ee995..f30ac809e 100644 --- a/data/presets/presets/amenity/charging_station.json +++ b/data/presets/presets/amenity/charging_station.json @@ -1,5 +1,5 @@ { - "icon": "maki-car", + "icon": "fas-charging-station", "fields": [ "operator", "capacity" diff --git a/data/presets/presets/building/hut.json b/data/presets/presets/building/hut.json index a3c5d82a8..33f347cc3 100644 --- a/data/presets/presets/building/hut.json +++ b/data/presets/presets/building/hut.json @@ -1,11 +1,11 @@ { + "icon": "maki-home", "geometry": [ "area" ], "fields": [ "name" ], - "tags": { "building": "hut" }, diff --git a/data/presets/presets/craft/painter.json b/data/presets/presets/craft/painter.json index 3128bf70a..18ed5387e 100644 --- a/data/presets/presets/craft/painter.json +++ b/data/presets/presets/craft/painter.json @@ -1,5 +1,5 @@ { - "icon": "maki-art-gallery", + "icon": "fas-paint-roller", "fields": [ "name", "operator", diff --git a/data/presets/presets/leisure/fitness_centre.json b/data/presets/presets/leisure/fitness_centre.json index c80bc8e28..46c0c16ba 100644 --- a/data/presets/presets/leisure/fitness_centre.json +++ b/data/presets/presets/leisure/fitness_centre.json @@ -1,5 +1,5 @@ { - "icon": "maki-pitch", + "icon": "fas-dumbbell", "fields": [ "name", "sport", diff --git a/data/presets/presets/man_made/bridge.json b/data/presets/presets/man_made/bridge.json index 2a988e711..bef856f7e 100644 --- a/data/presets/presets/man_made/bridge.json +++ b/data/presets/presets/man_made/bridge.json @@ -1,4 +1,5 @@ { + "icon": "fas-archway", "fields": [ "name", "bridge", diff --git a/data/presets/presets/office/lawyer.json b/data/presets/presets/office/lawyer.json index 1f36dab5f..2716345c7 100644 --- a/data/presets/presets/office/lawyer.json +++ b/data/presets/presets/office/lawyer.json @@ -1,5 +1,5 @@ { - "icon": "maki-suitcase", + "icon": "fas-balance-scale", "fields": [ "name", "address", diff --git a/data/presets/presets/office/moving_company.json b/data/presets/presets/office/moving_company.json index 181a9d339..5c8afcf98 100644 --- a/data/presets/presets/office/moving_company.json +++ b/data/presets/presets/office/moving_company.json @@ -1,5 +1,5 @@ { - "icon": "maki-warehouse", + "icon": "fas-people-carry", "fields": [ "name", "address", diff --git a/data/presets/presets/shop/furniture.json b/data/presets/presets/shop/furniture.json index 45905228e..c5cc9665f 100644 --- a/data/presets/presets/shop/furniture.json +++ b/data/presets/presets/shop/furniture.json @@ -1,5 +1,5 @@ { - "icon": "maki-shop", + "icon": "fas-couch", "fields": [ "name", "operator", diff --git a/data/presets/presets/shop/houseware.json b/data/presets/presets/shop/houseware.json index ad91b1742..cccb1a994 100644 --- a/data/presets/presets/shop/houseware.json +++ b/data/presets/presets/shop/houseware.json @@ -1,5 +1,5 @@ { - "icon": "maki-shop", + "icon": "fas-blender", "fields": [ "name", "operator", diff --git a/data/presets/presets/shop/locksmith.json b/data/presets/presets/shop/locksmith.json index e4ebf11d8..bf69724d7 100644 --- a/data/presets/presets/shop/locksmith.json +++ b/data/presets/presets/shop/locksmith.json @@ -1,5 +1,5 @@ { - "icon": "maki-shop", + "icon": "fas-key", "fields": [ "name", "operator", diff --git a/data/presets/presets/shop/optician.json b/data/presets/presets/shop/optician.json index afb37322d..814e36fc5 100644 --- a/data/presets/presets/shop/optician.json +++ b/data/presets/presets/shop/optician.json @@ -1,5 +1,5 @@ { - "icon": "maki-shop", + "icon": "fas-glasses", "fields": [ "name", "operator", diff --git a/data/presets/presets/shop/paint.json b/data/presets/presets/shop/paint.json index 47672b77d..89f7b3ccf 100644 --- a/data/presets/presets/shop/paint.json +++ b/data/presets/presets/shop/paint.json @@ -1,5 +1,5 @@ { - "icon": "maki-water", + "icon": "fas-paint-roller", "fields": [ "name", "operator", diff --git a/data/presets/presets/shop/storage_rental.json b/data/presets/presets/shop/storage_rental.json index 8a7ce30a7..710f0c581 100644 --- a/data/presets/presets/shop/storage_rental.json +++ b/data/presets/presets/shop/storage_rental.json @@ -1,5 +1,5 @@ { - "icon": "maki-shop", + "icon": "fas-warehouse", "fields": [ "name", "operator", diff --git a/data/taginfo.json b/data/taginfo.json index 91f07864c..2d3c6a84e 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -78,7 +78,8 @@ "key": "advertising", "value": "column", "description": "Advertising Column", - "object_types": ["node", "area"] + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/storage_tank.svg?sanitize=true" }, { "key": "aerialway", @@ -191,7 +192,8 @@ "key": "aeroway", "value": "runway", "description": "Runway", - "object_types": ["way", "area"] + "object_types": ["way", "area"], + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-plane-departure.svg?sanitize=true" }, { "key": "aeroway", @@ -412,7 +414,7 @@ "value": "charging_station", "description": "Charging Station", "object_types": ["node"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/car-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-charging-station.svg?sanitize=true" }, { "key": "amenity", @@ -1597,7 +1599,8 @@ "key": "building", "value": "hut", "description": "Hut", - "object_types": ["area"] + "object_types": ["area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/home-15.svg?sanitize=true" }, { "key": "building", @@ -1952,7 +1955,7 @@ "value": "painter", "description": "Painter", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/art-gallery-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-paint-roller.svg?sanitize=true" }, { "key": "craft", @@ -3209,7 +3212,7 @@ "value": "fitness_centre", "description": "Gym / Fitness Center", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/pitch-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-dumbbell.svg?sanitize=true" }, { "key": "sport", @@ -3611,7 +3614,8 @@ "key": "man_made", "value": "bridge", "description": "Bridge", - "object_types": ["area"] + "object_types": ["area"], + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-archway.svg?sanitize=true" }, { "key": "man_made", @@ -4205,7 +4209,7 @@ "value": "lawyer", "description": "Law Office", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/suitcase-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-balance-scale.svg?sanitize=true" }, { "key": "lawyer", @@ -4219,7 +4223,7 @@ "value": "moving_company", "description": "Moving Company Office", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/warehouse-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-people-carry.svg?sanitize=true" }, { "key": "office", @@ -5243,7 +5247,7 @@ "value": "furniture", "description": "Furniture Store", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shop-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-couch.svg?sanitize=true" }, { "key": "shop", @@ -5320,7 +5324,7 @@ "value": "houseware", "description": "Houseware Store", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shop-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-blender.svg?sanitize=true" }, { "key": "shop", @@ -5369,7 +5373,7 @@ "value": "locksmith", "description": "Locksmith", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shop-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-key.svg?sanitize=true" }, { "key": "shop", @@ -5460,7 +5464,7 @@ "value": "optician", "description": "Optician", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shop-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-glasses.svg?sanitize=true" }, { "key": "organic", @@ -5481,7 +5485,7 @@ "value": "paint", "description": "Paint Store", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/water-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-paint-roller.svg?sanitize=true" }, { "key": "shop", @@ -5600,7 +5604,7 @@ "value": "storage_rental", "description": "Storage Rental", "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shop-15.svg?sanitize=true" + "icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-warehouse.svg?sanitize=true" }, { "key": "shop", diff --git a/svg/fontawesome/fas-archway.svg b/svg/fontawesome/fas-archway.svg new file mode 100644 index 000000000..167181b7c --- /dev/null +++ b/svg/fontawesome/fas-archway.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-balance-scale.svg b/svg/fontawesome/fas-balance-scale.svg new file mode 100644 index 000000000..70e5cd4e2 --- /dev/null +++ b/svg/fontawesome/fas-balance-scale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-bell.svg b/svg/fontawesome/fas-bell.svg index 13cf68468..8b6ff39d6 100644 --- a/svg/fontawesome/fas-bell.svg +++ b/svg/fontawesome/fas-bell.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/svg/fontawesome/fas-blender.svg b/svg/fontawesome/fas-blender.svg new file mode 100644 index 000000000..0e15eb5c4 --- /dev/null +++ b/svg/fontawesome/fas-blender.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-charging-station.svg b/svg/fontawesome/fas-charging-station.svg new file mode 100644 index 000000000..10aae5d96 --- /dev/null +++ b/svg/fontawesome/fas-charging-station.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-couch.svg b/svg/fontawesome/fas-couch.svg new file mode 100644 index 000000000..2f2f86549 --- /dev/null +++ b/svg/fontawesome/fas-couch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-dumbbell.svg b/svg/fontawesome/fas-dumbbell.svg new file mode 100644 index 000000000..e7bacfd38 --- /dev/null +++ b/svg/fontawesome/fas-dumbbell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-glasses.svg b/svg/fontawesome/fas-glasses.svg new file mode 100644 index 000000000..76100a994 --- /dev/null +++ b/svg/fontawesome/fas-glasses.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-paint-roller.svg b/svg/fontawesome/fas-paint-roller.svg new file mode 100644 index 000000000..0696b018b --- /dev/null +++ b/svg/fontawesome/fas-paint-roller.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-people-carry.svg b/svg/fontawesome/fas-people-carry.svg new file mode 100644 index 000000000..935d1fb50 --- /dev/null +++ b/svg/fontawesome/fas-people-carry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-plane-departure.svg b/svg/fontawesome/fas-plane-departure.svg new file mode 100644 index 000000000..5fed596d4 --- /dev/null +++ b/svg/fontawesome/fas-plane-departure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-taxi.svg b/svg/fontawesome/fas-taxi.svg index 012729fec..d81bc1f28 100644 --- a/svg/fontawesome/fas-taxi.svg +++ b/svg/fontawesome/fas-taxi.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/svg/fontawesome/fas-volume-up.svg b/svg/fontawesome/fas-volume-up.svg index 1b79fd302..7588f42d3 100644 --- a/svg/fontawesome/fas-volume-up.svg +++ b/svg/fontawesome/fas-volume-up.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/svg/fontawesome/fas-wifi.svg b/svg/fontawesome/fas-wifi.svg index 364b5060a..bbe6efbbb 100644 --- a/svg/fontawesome/fas-wifi.svg +++ b/svg/fontawesome/fas-wifi.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From eba115803a996b7c4a1b2ece351af220be6eecb1 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 6 Sep 2018 09:50:26 -0400 Subject: [PATCH 200/217] Variable cleanups in behavior and modes --- modules/behavior/add_way.js | 4 +- modules/behavior/breathe.js | 77 ++++++++++++++++++----------------- modules/behavior/copy.js | 17 ++++---- modules/behavior/draw_way.js | 2 +- modules/behavior/lasso.js | 6 +-- modules/behavior/operation.js | 3 +- modules/behavior/paste.js | 33 +++++++-------- modules/behavior/tail.js | 22 +++++----- modules/modes/add_area.js | 27 ++++++------ modules/modes/add_line.js | 16 ++++---- modules/modes/add_note.js | 1 - 11 files changed, 106 insertions(+), 102 deletions(-) diff --git a/modules/behavior/add_way.js b/modules/behavior/add_way.js index 41a36e35c..8fb6b3ca1 100644 --- a/modules/behavior/add_way.js +++ b/modules/behavior/add_way.js @@ -6,8 +6,8 @@ import { utilRebind } from '../util/rebind'; export function behaviorAddWay(context) { - var dispatch = d3_dispatch('start', 'startFromWay', 'startFromNode'), - draw = behaviorDraw(context); + var dispatch = d3_dispatch('start', 'startFromWay', 'startFromNode'); + var draw = behaviorDraw(context); var addWay = function(surface) { draw.on('click', function() { dispatch.apply('start', this, arguments); }) diff --git a/modules/behavior/breathe.js b/modules/behavior/breathe.js index f90a89f30..6b09fe476 100644 --- a/modules/behavior/breathe.js +++ b/modules/behavior/breathe.js @@ -11,14 +11,14 @@ import { timer as d3_timer } from 'd3-timer'; export function behaviorBreathe() { - var duration = 800, - steps = 4, - selector = '.selected.shadow, .selected .shadow', - selected = d3_select(null), - classed = '', - params = {}, - done = false, - timer; + var duration = 800; + var steps = 4; + var selector = '.selected.shadow, .selected .shadow'; + var _selected = d3_select(null); + var _classed = ''; + var _params = {}; + var _done = false; + var _timer; function ratchetyInterpolator(a, b, steps, units) { @@ -49,30 +49,30 @@ export function behaviorBreathe() { transition .styleTween('stroke-opacity', function(d) { return ratchetyInterpolator( - params[d.id][toFrom].opacity, - params[d.id][fromTo].opacity, + _params[d.id][toFrom].opacity, + _params[d.id][fromTo].opacity, steps ); }) .styleTween('stroke-width', function(d) { return ratchetyInterpolator( - params[d.id][toFrom].width, - params[d.id][fromTo].width, + _params[d.id][toFrom].width, + _params[d.id][fromTo].width, steps, 'px' ); }) .styleTween('fill-opacity', function(d) { return ratchetyInterpolator( - params[d.id][toFrom].opacity, - params[d.id][fromTo].opacity, + _params[d.id][toFrom].opacity, + _params[d.id][fromTo].opacity, steps ); }) .styleTween('r', function(d) { return ratchetyInterpolator( - params[d.id][toFrom].width, - params[d.id][fromTo].width, + _params[d.id][toFrom].width, + _params[d.id][fromTo].width, steps, 'px' ); @@ -84,10 +84,11 @@ export function behaviorBreathe() { selection .call(reset) .each(function(d) { - var s = d3_select(this), - tag = s.node().tagName, - p = {'from': {}, 'to': {}}, - opacity, width; + var s = d3_select(this); + var tag = s.node().tagName; + var p = {'from': {}, 'to': {}}; + var opacity; + var width; // determine base opacity and width if (tag === 'circle') { @@ -104,28 +105,28 @@ export function behaviorBreathe() { p.to.opacity = opacity * 1.25; p.from.width = width * 0.7; p.to.width = width * (tag === 'circle' ? 1.5 : 1); - params[d.id] = p; + _params[d.id] = p; }); } function run(surface, fromTo) { - var toFrom = (fromTo === 'from' ? 'to' : 'from'), - currSelected = surface.selectAll(selector), - currClassed = surface.attr('class'); + var toFrom = (fromTo === 'from' ? 'to' : 'from'); + var currSelected = surface.selectAll(selector); + var currClassed = surface.attr('class'); - if (done || currSelected.empty()) { - selected.call(reset); + if (_done || currSelected.empty()) { + _selected.call(reset); return; } - if (!_isEqual(currSelected.data(), selected.data()) || currClassed !== classed) { - selected.call(reset); - classed = currClassed; - selected = currSelected.call(calcAnimationParams); + if (!_isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) { + _selected.call(reset); + _classed = currClassed; + _selected = currSelected.call(calcAnimationParams); } - selected + _selected .transition() .duration(duration) .call(setAnimationParams, fromTo) @@ -136,26 +137,26 @@ export function behaviorBreathe() { var breathe = function(surface) { - done = false; - timer = d3_timer(function() { + _done = false; + _timer = d3_timer(function() { // wait for elements to actually become selected if (surface.selectAll(selector).empty()) { return false; } surface.call(run, 'from'); - timer.stop(); + _timer.stop(); return true; }, 20); }; breathe.off = function() { - done = true; - if (timer) { - timer.stop(); + _done = true; + if (_timer) { + _timer.stop(); } - selected + _selected .interrupt() .call(reset); }; diff --git a/modules/behavior/copy.js b/modules/behavior/copy.js index 73fe16b5e..4aaca957f 100644 --- a/modules/behavior/copy.js +++ b/modules/behavior/copy.js @@ -23,8 +23,8 @@ export function behaviorCopy(context) { function getDescendants(id, graph, descendants) { - var entity = graph.entity(id), - i, children; + var entity = graph.entity(id); + var children; descendants = descendants || {}; @@ -36,7 +36,7 @@ export function behaviorCopy(context) { children = []; } - for (i = 0; i < children.length; i++) { + for (var i = 0; i < children.length; i++) { if (!descendants[children[i]]) { descendants[children[i]] = true; descendants = getDescendants(children[i], graph, descendants); @@ -50,11 +50,12 @@ export function behaviorCopy(context) { function doCopy() { if (!getSelectionText()) d3_event.preventDefault(); - var graph = context.graph(), - selected = groupEntities(context.selectedIDs(), graph), - canCopy = [], - skip = {}, - i, entity; + var graph = context.graph(); + var selected = groupEntities(context.selectedIDs(), graph); + var canCopy = []; + var skip = {}; + var entity; + var i; for (i = 0; i < selected.relation.length; i++) { entity = selected.relation[i]; diff --git a/modules/behavior/draw_way.js b/modules/behavior/draw_way.js index e5ffa4b83..148a6fd89 100644 --- a/modules/behavior/draw_way.js +++ b/modules/behavior/draw_way.js @@ -120,7 +120,7 @@ export function behaviorDrawWay(context, wayId, index, mode, startGraph) { for (var i = 0; i < parents.length; i++) { var parent = parents[i]; var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); }); - + if (origWay.isClosed()) { // Check if Area if (finishDraw) { nodes.splice(-2, 1); diff --git a/modules/behavior/lasso.js b/modules/behavior/lasso.js index 9fe82bcd2..bc4a808b1 100644 --- a/modules/behavior/lasso.js +++ b/modules/behavior/lasso.js @@ -54,9 +54,9 @@ export function behaviorLasso(context) { function lassoed() { if (!lasso) return []; - var graph = context.graph(), - bounds = lasso.extent().map(context.projection.invert), - extent = geoExtent(normalize(bounds[0], bounds[1])); + var graph = context.graph(); + var bounds = lasso.extent().map(context.projection.invert); + var extent = geoExtent(normalize(bounds[0], bounds[1])); return _map(context.intersects(extent).filter(function(entity) { return entity.type === 'node' && diff --git a/modules/behavior/operation.js b/modules/behavior/operation.js index 61a62eb78..0fc96e1f0 100644 --- a/modules/behavior/operation.js +++ b/modules/behavior/operation.js @@ -9,7 +9,8 @@ import { uiFlash } from '../ui'; /* Creates a keybinding behavior for an operation */ export function behaviorOperation() { - var _operation, keybinding; + var keybinding; + var _operation; var behavior = function () { if (_operation && _operation.available()) { diff --git a/modules/behavior/paste.js b/modules/behavior/paste.js index f29c5fe72..6a2f44326 100644 --- a/modules/behavior/paste.js +++ b/modules/behavior/paste.js @@ -15,8 +15,9 @@ import { import { geoExtent, - geoPointInPolygon -} from '../geo/'; + geoPointInPolygon, + geoVecSubtract +} from '../geo'; import { modeMove } from '../modes'; import { uiCmd } from '../ui'; @@ -29,17 +30,17 @@ export function behaviorPaste(context) { function doPaste() { d3_event.preventDefault(); - var baseGraph = context.graph(), - mouse = context.mouse(), - projection = context.projection, - viewport = geoExtent(projection.clipExtent()).polygon(); + var baseGraph = context.graph(); + var mouse = context.mouse(); + var projection = context.projection; + var viewport = geoExtent(projection.clipExtent()).polygon(); if (!geoPointInPolygon(mouse, viewport)) return; - var extent = geoExtent(), - oldIDs = context.copyIDs(), - oldGraph = context.copyGraph(), - newIDs = []; + var extent = geoExtent(); + var oldIDs = context.copyIDs(); + var oldGraph = context.copyGraph(); + var newIDs = []; if (!oldIDs.length) return; @@ -49,14 +50,14 @@ export function behaviorPaste(context) { var copies = action.copies(); var originals = _invert(_mapValues(copies, 'id')); for (var id in copies) { - var oldEntity = oldGraph.entity(id), - newEntity = copies[id]; + var oldEntity = oldGraph.entity(id); + var newEntity = copies[id]; extent._extend(oldEntity.extent(oldGraph)); // Exclude child nodes from newIDs if their parent way was also copied. - var parents = context.graph().parentWays(newEntity), - parentCopied = false; + var parents = context.graph().parentWays(newEntity); + var parentCopied = false; for (var i = 0; i < parents.length; i++) { if (originals[parents[i].id]) { parentCopied = true; @@ -70,8 +71,8 @@ export function behaviorPaste(context) { } // Put pasted objects where mouse pointer is.. - var center = projection(extent.center()), - delta = [ mouse[0] - center[0], mouse[1] - center[1] ]; + var center = projection(extent.center()); + var delta = geoVecSubtract(mouse, center); context.perform(actionMove(newIDs, delta, projection)); context.enter(modeMove(context, newIDs, baseGraph)); diff --git a/modules/behavior/tail.js b/modules/behavior/tail.js index 7aff12cad..3b4919516 100644 --- a/modules/behavior/tail.js +++ b/modules/behavior/tail.js @@ -8,15 +8,15 @@ import { utilGetDimensions } from '../util/dimensions'; export function behaviorTail() { - var text, - container, - xmargin = 25, - tooltipSize = [0, 0], - selectionSize = [0, 0]; + var container; + var xmargin = 25; + var tooltipSize = [0, 0]; + var selectionSize = [0, 0]; + var _text; function tail(selection) { - if (!text) return; + if (!_text) return; d3_select(window) .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); }); @@ -27,7 +27,7 @@ export function behaviorTail() { .attr('class', 'tail tooltip-inner'); container.append('div') - .text(text); + .text(_text); selection .on('mousemove.tail', mousemove) @@ -72,7 +72,7 @@ export function behaviorTail() { tail.off = function(selection) { - if (!text) return; + if (!_text) return; container .on('mousemove.tail', null) @@ -88,9 +88,9 @@ export function behaviorTail() { }; - tail.text = function(_) { - if (!arguments.length) return text; - text = _; + tail.text = function(val) { + if (!arguments.length) return _text; + _text = val; return tail; }; diff --git a/modules/modes/add_area.js b/modules/modes/add_area.js index 4e0af4318..7b4d6f5d9 100644 --- a/modules/modes/add_area.js +++ b/modules/modes/add_area.js @@ -20,11 +20,12 @@ export function modeAddArea(context) { }; var behavior = behaviorAddWay(context) - .tail(t('modes.add_area.tail')) - .on('start', start) - .on('startFromWay', startFromWay) - .on('startFromNode', startFromNode), - defaultTags = { area: 'yes' }; + .tail(t('modes.add_area.tail')) + .on('start', start) + .on('startFromWay', startFromWay) + .on('startFromNode', startFromNode); + + var defaultTags = { area: 'yes' }; function actionClose(wayId) { @@ -35,9 +36,9 @@ export function modeAddArea(context) { function start(loc) { - var startGraph = context.graph(), - node = osmNode({ loc: loc }), - way = osmWay({ tags: defaultTags }); + var startGraph = context.graph(); + var node = osmNode({ loc: loc }); + var way = osmWay({ tags: defaultTags }); context.perform( actionAddEntity(node), @@ -51,9 +52,9 @@ export function modeAddArea(context) { function startFromWay(loc, edge) { - var startGraph = context.graph(), - node = osmNode({ loc: loc }), - way = osmWay({ tags: defaultTags }); + var startGraph = context.graph(); + var node = osmNode({ loc: loc }); + var way = osmWay({ tags: defaultTags }); context.perform( actionAddEntity(node), @@ -68,8 +69,8 @@ export function modeAddArea(context) { function startFromNode(node) { - var startGraph = context.graph(), - way = osmWay({ tags: defaultTags }); + var startGraph = context.graph(); + var way = osmWay({ tags: defaultTags }); context.perform( actionAddEntity(way), diff --git a/modules/modes/add_line.js b/modules/modes/add_line.js index d18deff14..bd4e6c482 100644 --- a/modules/modes/add_line.js +++ b/modules/modes/add_line.js @@ -27,9 +27,9 @@ export function modeAddLine(context) { function start(loc) { - var startGraph = context.graph(), - node = osmNode({ loc: loc }), - way = osmWay(); + var startGraph = context.graph(); + var node = osmNode({ loc: loc }); + var way = osmWay(); context.perform( actionAddEntity(node), @@ -42,9 +42,9 @@ export function modeAddLine(context) { function startFromWay(loc, edge) { - var startGraph = context.graph(), - node = osmNode({ loc: loc }), - way = osmWay(); + var startGraph = context.graph(); + var node = osmNode({ loc: loc }); + var way = osmWay(); context.perform( actionAddEntity(node), @@ -58,8 +58,8 @@ export function modeAddLine(context) { function startFromNode(node) { - var startGraph = context.graph(), - way = osmWay(); + var startGraph = context.graph(); + var way = osmWay(); context.perform( actionAddEntity(way), diff --git a/modules/modes/add_note.js b/modules/modes/add_note.js index 4d63b8ee0..8f7f065a0 100644 --- a/modules/modes/add_note.js +++ b/modules/modes/add_note.js @@ -6,7 +6,6 @@ import { services } from '../services'; export function modeAddNote(context) { - var mode = { id: 'add-note', button: 'note', From f347346e70ac9810d568897b383d783ab8a1328c Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 6 Sep 2018 10:46:48 -0400 Subject: [PATCH 201/217] Variable cleanups in intro --- modules/modes/draw_line.js | 12 +- modules/ui/intro/area.js | 54 ++++---- modules/ui/intro/building.js | 103 ++++++++------- modules/ui/intro/helper.js | 26 ++-- modules/ui/intro/line.js | 228 ++++++++++++++++----------------- modules/ui/intro/navigation.js | 24 ++-- modules/ui/intro/point.js | 58 ++++----- modules/ui/intro/welcome.js | 34 ++--- 8 files changed, 265 insertions(+), 274 deletions(-) diff --git a/modules/modes/draw_line.js b/modules/modes/draw_line.js index 83c2a9ae0..a9f5b0e49 100644 --- a/modules/modes/draw_line.js +++ b/modules/modes/draw_line.js @@ -2,7 +2,7 @@ import { t } from '../util/locale'; import { behaviorDrawWay } from '../behavior'; -export function modeDrawLine(context, wayId, startGraph, affix) { +export function modeDrawLine(context, wayID, startGraph, affix) { var mode = { button: 'line', id: 'draw-line' @@ -12,16 +12,16 @@ export function modeDrawLine(context, wayId, startGraph, affix) { mode.enter = function() { - var way = context.entity(wayId); + var way = context.entity(wayID); var index = (affix === 'prefix') ? 0 : undefined; - var headId = (affix === 'prefix') ? way.first() : way.last(); + var headID = (affix === 'prefix') ? way.first() : way.last(); - behavior = behaviorDrawWay(context, wayId, index, mode, startGraph) + behavior = behaviorDrawWay(context, wayID, index, mode, startGraph) .tail(t('modes.draw_line.tail')); var addNode = behavior.addNode; behavior.addNode = function(node, d) { - if (node.id === headId) { + if (node.id === headID) { behavior.finish(); } else { addNode(node, d); @@ -38,7 +38,7 @@ export function modeDrawLine(context, wayId, startGraph, affix) { mode.selectedIDs = function() { - return [wayId]; + return [wayID]; }; diff --git a/modules/ui/intro/area.js b/modules/ui/intro/area.js index 70ff8e95f..528bdaae4 100644 --- a/modules/ui/intro/area.js +++ b/modules/ui/intro/area.js @@ -17,12 +17,12 @@ import { icon, pad, transitionTime } from './helper'; export function uiIntroArea(context, reveal) { - var dispatch = d3_dispatch('done'), - playground = [-85.63552, 41.94159], - playgroundPreset = context.presets().item('leisure/playground'), - descriptionField = context.presets().field('description'), - timeouts = [], - areaId; + var dispatch = d3_dispatch('done'); + var playground = [-85.63552, 41.94159]; + var playgroundPreset = context.presets().item('leisure/playground'); + var descriptionField = context.presets().field('description'); + var timeouts = []; + var _areaID; var chapter = { @@ -51,7 +51,7 @@ export function uiIntroArea(context, reveal) { function addArea() { context.enter(modeBrowse(context)); context.history().reset('initial'); - areaId = null; + _areaID = null; var msec = transitionTime(playground, context.map().center()); if (msec) { reveal(null, null, { duration: 0 }); } @@ -85,7 +85,7 @@ export function uiIntroArea(context, reveal) { return chapter.restart(); } - areaId = null; + _areaID = null; context.map().zoomEase(19.5, 500); timeout(function() { @@ -120,7 +120,7 @@ export function uiIntroArea(context, reveal) { return chapter.restart(); } - areaId = null; + _areaID = null; revealPlayground(playground, t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }), { duration: 250 } @@ -144,7 +144,7 @@ export function uiIntroArea(context, reveal) { return; } } else if (mode.id === 'select') { - areaId = context.selectedIDs()[0]; + _areaID = context.selectedIDs()[0]; return continueTo(searchPresets); } else { return chapter.restart(); @@ -164,7 +164,7 @@ export function uiIntroArea(context, reveal) { return chapter.restart(); } - areaId = null; + _areaID = null; revealPlayground(playground, t('intro.areas.finish_playground'), { duration: 250 } ); @@ -181,7 +181,7 @@ export function uiIntroArea(context, reveal) { if (mode.id === 'draw-area') { return; } else if (mode.id === 'select') { - areaId = context.selectedIDs()[0]; + _areaID = context.selectedIDs()[0]; return continueTo(searchPresets); } else { return chapter.restart(); @@ -197,12 +197,12 @@ export function uiIntroArea(context, reveal) { function searchPresets() { - if (!areaId || !context.hasEntity(areaId)) { + if (!_areaID || !context.hasEntity(_areaID)) { return addArea(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) { - context.enter(modeSelect(context, [areaId])); + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) { + context.enter(modeSelect(context, [_areaID])); } // disallow scrolling @@ -222,14 +222,14 @@ export function uiIntroArea(context, reveal) { }, 400); // after preset list pane visible.. context.on('enter.intro', function(mode) { - if (!areaId || !context.hasEntity(areaId)) { + if (!_areaID || !context.hasEntity(_areaID)) { return continueTo(addArea); } var ids = context.selectedIDs(); - if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) { + if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) { // keep the user's area selected.. - context.enter(modeSelect(context, [areaId])); + context.enter(modeSelect(context, [_areaID])); // reset pane, in case user somehow happened to change it.. d3_select('.inspector-wrap .panewrap').style('right', '-100%'); @@ -278,11 +278,11 @@ export function uiIntroArea(context, reveal) { function clickAddField() { - if (!areaId || !context.hasEntity(areaId)) { + if (!_areaID || !context.hasEntity(_areaID)) { return addArea(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) { + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) { return searchPresets(); } @@ -299,7 +299,7 @@ export function uiIntroArea(context, reveal) { // It's possible for the user to add a description in a previous step.. // If they did this already, just continue to next step. - var entity = context.entity(areaId); + var entity = context.entity(_areaID); if (entity.tags.description) { return continueTo(play); } @@ -351,11 +351,11 @@ export function uiIntroArea(context, reveal) { function chooseDescriptionField() { - if (!areaId || !context.hasEntity(areaId)) { + if (!_areaID || !context.hasEntity(_areaID)) { return addArea(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) { + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) { return searchPresets(); } @@ -400,11 +400,11 @@ export function uiIntroArea(context, reveal) { function describePlayground() { - if (!areaId || !context.hasEntity(areaId)) { + if (!_areaID || !context.hasEntity(_areaID)) { return addArea(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) { + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) { return searchPresets(); } @@ -432,11 +432,11 @@ export function uiIntroArea(context, reveal) { function retryChooseDescription() { - if (!areaId || !context.hasEntity(areaId)) { + if (!_areaID || !context.hasEntity(_areaID)) { return addArea(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) { + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) { return searchPresets(); } diff --git a/modules/ui/intro/building.js b/modules/ui/intro/building.js index c0fea7e75..67e3c5d0f 100644 --- a/modules/ui/intro/building.js +++ b/modules/ui/intro/building.js @@ -14,15 +14,15 @@ import { icon, pad, isMostlySquare, selectMenuItem, transitionTime } from './hel export function uiIntroBuilding(context, reveal) { - var dispatch = d3_dispatch('done'), - house = [-85.62815, 41.95638], - tank = [-85.62732, 41.95347], - buildingCatetory = context.presets().item('category-building'), - housePreset = context.presets().item('building/house'), - tankPreset = context.presets().item('man_made/storage_tank'), - timeouts = [], - houseId = null, - tankId = null; + var dispatch = d3_dispatch('done'); + var house = [-85.62815, 41.95638]; + var tank = [-85.62732, 41.95347]; + var buildingCatetory = context.presets().item('category-building'); + var housePreset = context.presets().item('building/house'); + var tankPreset = context.presets().item('man_made/storage_tank'); + var timeouts = []; + var _houseID = null; + var _tankID = null; var chapter = { @@ -76,7 +76,7 @@ export function uiIntroBuilding(context, reveal) { function addHouse() { context.enter(modeBrowse(context)); context.history().reset('initial'); - houseId = null; + _houseID = null; var msec = transitionTime(house, context.map().center()); if (msec) { reveal(null, null, { duration: 0 }); } @@ -110,7 +110,7 @@ export function uiIntroBuilding(context, reveal) { return continueTo(addHouse); } - houseId = null; + _houseID = null; context.map().zoomEase(20, 500); timeout(function() { @@ -140,7 +140,7 @@ export function uiIntroBuilding(context, reveal) { return continueTo(addHouse); } - houseId = null; + _houseID = null; revealHouse(house, t('intro.buildings.continue_building')); @@ -152,13 +152,13 @@ export function uiIntroBuilding(context, reveal) { if (mode.id === 'draw-area') { return; } else if (mode.id === 'select') { - var graph = context.graph(), - way = context.entity(context.selectedIDs()[0]), - nodes = graph.childNodes(way), - points = _uniq(nodes).map(function(n) { return context.projection(n.loc); }); + var graph = context.graph(); + var way = context.entity(context.selectedIDs()[0]); + var nodes = graph.childNodes(way); + var points = _uniq(nodes).map(function(n) { return context.projection(n.loc); }); if (isMostlySquare(points)) { - houseId = way.id; + _houseID = way.id; return continueTo(chooseCategoryBuilding); } else { return continueTo(retryHouse); @@ -198,12 +198,12 @@ export function uiIntroBuilding(context, reveal) { function chooseCategoryBuilding() { - if (!houseId || !context.hasEntity(houseId)) { + if (!_houseID || !context.hasEntity(_houseID)) { return addHouse(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) { - context.enter(modeSelect(context, [houseId])); + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) { + context.enter(modeSelect(context, [_houseID])); } // disallow scrolling @@ -228,11 +228,11 @@ export function uiIntroBuilding(context, reveal) { context.on('enter.intro', function(mode) { - if (!houseId || !context.hasEntity(houseId)) { + if (!_houseID || !context.hasEntity(_houseID)) { return continueTo(addHouse); } var ids = context.selectedIDs(); - if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) { + if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) { return continueTo(chooseCategoryBuilding); } }); @@ -247,12 +247,12 @@ export function uiIntroBuilding(context, reveal) { function choosePresetHouse() { - if (!houseId || !context.hasEntity(houseId)) { + if (!_houseID || !context.hasEntity(_houseID)) { return addHouse(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) { - context.enter(modeSelect(context, [houseId])); + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) { + context.enter(modeSelect(context, [_houseID])); } // disallow scrolling @@ -274,15 +274,14 @@ export function uiIntroBuilding(context, reveal) { continueTo(closeEditorHouse); }); - }, 400); // after preset list pane visible.. context.on('enter.intro', function(mode) { - if (!houseId || !context.hasEntity(houseId)) { + if (!_houseID || !context.hasEntity(_houseID)) { return continueTo(addHouse); } var ids = context.selectedIDs(); - if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) { + if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) { return continueTo(chooseCategoryBuilding); } }); @@ -297,12 +296,12 @@ export function uiIntroBuilding(context, reveal) { function closeEditorHouse() { - if (!houseId || !context.hasEntity(houseId)) { + if (!_houseID || !context.hasEntity(_houseID)) { return addHouse(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) { - context.enter(modeSelect(context, [houseId])); + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) { + context.enter(modeSelect(context, [_houseID])); } context.history().checkpoint('hasHouse'); @@ -325,7 +324,7 @@ export function uiIntroBuilding(context, reveal) { function rightClickHouse() { - if (!houseId) return chapter.restart(); + if (!_houseID) return chapter.restart(); context.enter(modeBrowse(context)); context.history().reset('hasHouse'); @@ -340,7 +339,7 @@ export function uiIntroBuilding(context, reveal) { context.on('enter.intro', function(mode) { if (mode.id !== 'select') return; var ids = context.selectedIDs(); - if (ids.length !== 1 || ids[0] !== houseId) return; + if (ids.length !== 1 || ids[0] !== _houseID) return; timeout(function() { var node = selectMenuItem('orthogonalize').node(); @@ -367,8 +366,8 @@ export function uiIntroBuilding(context, reveal) { function clickSquare() { - if (!houseId) return chapter.restart(); - var entity = context.hasEntity(houseId); + if (!_houseID) return chapter.restart(); + var entity = context.hasEntity(_houseID); if (!entity) return continueTo(rightClickHouse); var node = selectMenuItem('orthogonalize').node(); @@ -453,7 +452,7 @@ export function uiIntroBuilding(context, reveal) { function addTank() { context.enter(modeBrowse(context)); context.history().reset('doneSquare'); - tankId = null; + _tankID = null; var msec = transitionTime(tank, context.map().center()); if (msec) { reveal(null, null, { duration: 0 }); } @@ -482,7 +481,7 @@ export function uiIntroBuilding(context, reveal) { return continueTo(addTank); } - tankId = null; + _tankID = null; timeout(function() { revealTank(tank, t('intro.buildings.start_tank')); @@ -511,7 +510,7 @@ export function uiIntroBuilding(context, reveal) { return continueTo(addTank); } - tankId = null; + _tankID = null; revealTank(tank, t('intro.buildings.continue_tank')); @@ -523,7 +522,7 @@ export function uiIntroBuilding(context, reveal) { if (mode.id === 'draw-area') { return; } else if (mode.id === 'select') { - tankId = context.selectedIDs()[0]; + _tankID = context.selectedIDs()[0]; return continueTo(searchPresetTank); } else { return continueTo(addTank); @@ -539,12 +538,12 @@ export function uiIntroBuilding(context, reveal) { function searchPresetTank() { - if (!tankId || !context.hasEntity(tankId)) { + if (!_tankID || !context.hasEntity(_tankID)) { return addTank(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) { - context.enter(modeSelect(context, [tankId])); + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) { + context.enter(modeSelect(context, [_tankID])); } // disallow scrolling @@ -564,14 +563,14 @@ export function uiIntroBuilding(context, reveal) { }, 400); // after preset list pane visible.. context.on('enter.intro', function(mode) { - if (!tankId || !context.hasEntity(tankId)) { + if (!_tankID || !context.hasEntity(_tankID)) { return continueTo(addTank); } var ids = context.selectedIDs(); - if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) { + if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) { // keep the user's area selected.. - context.enter(modeSelect(context, [tankId])); + context.enter(modeSelect(context, [_tankID])); // reset pane, in case user somehow happened to change it.. d3_select('.inspector-wrap .panewrap').style('right', '-100%'); @@ -620,12 +619,12 @@ export function uiIntroBuilding(context, reveal) { function closeEditorTank() { - if (!tankId || !context.hasEntity(tankId)) { + if (!_tankID || !context.hasEntity(_tankID)) { return addTank(); } var ids = context.selectedIDs(); - if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) { - context.enter(modeSelect(context, [tankId])); + if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) { + context.enter(modeSelect(context, [_tankID])); } context.history().checkpoint('hasTank'); @@ -648,7 +647,7 @@ export function uiIntroBuilding(context, reveal) { function rightClickTank() { - if (!tankId) return continueTo(addTank); + if (!_tankID) return continueTo(addTank); context.enter(modeBrowse(context)); context.history().reset('hasTank'); @@ -658,7 +657,7 @@ export function uiIntroBuilding(context, reveal) { context.on('enter.intro', function(mode) { if (mode.id !== 'select') return; var ids = context.selectedIDs(); - if (ids.length !== 1 || ids[0] !== tankId) return; + if (ids.length !== 1 || ids[0] !== _tankID) return; timeout(function() { var node = selectMenuItem('circularize').node(); @@ -689,8 +688,8 @@ export function uiIntroBuilding(context, reveal) { function clickCircle() { - if (!tankId) return chapter.restart(); - var entity = context.hasEntity(tankId); + if (!_tankID) return chapter.restart(); + var entity = context.hasEntity(_tankID); if (!entity) return continueTo(rightClickTank); var node = selectMenuItem('circularize').node(); diff --git a/modules/ui/intro/helper.js b/modules/ui/intro/helper.js index 4c8cdb361..de261ea1a 100644 --- a/modules/ui/intro/helper.js +++ b/modules/ui/intro/helper.js @@ -91,10 +91,10 @@ export function localize(obj) { 'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb' ]; addrTags.forEach(function(k) { - var key = 'intro.graph.' + k, - tag = 'addr:' + k, - val = obj.tags && obj.tags[tag], - str = t(key, { default: val }); + var key = 'intro.graph.' + k; + var tag = 'addr:' + k; + var val = obj.tags && obj.tags[tag]; + var str = t(key, { default: val }); if (str) { if (str.match(/^<.*>$/) !== null) { @@ -114,10 +114,10 @@ export function localize(obj) { export function isMostlySquare(points) { // note: uses 15 here instead of the 12 from actionOrthogonalize because // actionOrthogonalize can actually straighten some larger angles as it iterates - var threshold = 15, // degrees within right or straight - lowerBound = Math.cos((90 - threshold) * Math.PI / 180), // near right - upperBound = Math.cos(threshold * Math.PI / 180), // near straight - mag; + var threshold = 15; // degrees within right or straight + var lowerBound = Math.cos((90 - threshold) * Math.PI / 180); // near right + var upperBound = Math.cos(threshold * Math.PI / 180); // near straight + var mag; for (var i = 0; i < points.length; i++) { mag = Math.abs(normalizedDotProduct(i, points)); @@ -130,11 +130,11 @@ export function isMostlySquare(points) { function normalizedDotProduct(i, points) { - var a = points[(i - 1 + points.length) % points.length], - b = points[i], - c = points[(i + 1) % points.length], - p = subtractPoints(a, b), - q = subtractPoints(c, b); + var a = points[(i - 1 + points.length) % points.length]; + var b = points[i]; + var c = points[(i + 1) % points.length]; + var p = subtractPoints(a, b); + var q = subtractPoints(c, b); p = normalizePoint(p); q = normalizePoint(q); diff --git a/modules/ui/intro/line.js b/modules/ui/intro/line.js index 986f21351..4a156ae27 100644 --- a/modules/ui/intro/line.js +++ b/modules/ui/intro/line.js @@ -15,29 +15,29 @@ import { icon, pad, selectMenuItem, transitionTime } from './helper'; export function uiIntroLine(context, reveal) { - var dispatch = d3_dispatch('done'), - timeouts = [], - tulipRoadId = null, - flowerRoadId = 'w646', - tulipRoadStart = [-85.6297754121684, 41.95805253325314], - tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204], - tulipRoadIntersection = [-85.62974496187628, 41.95742515554585], - roadCategory = context.presets().item('category-road'), - residentialPreset = context.presets().item('highway/residential'), - woodRoadId = 'w525', - woodRoadEndId = 'n2862', - woodRoadAddNode = [-85.62390110349587, 41.95397111462291], - woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487], - woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872], - washingtonStreetId = 'w522', - twelfthAvenueId = 'w1', - eleventhAvenueEndId = 'n3550', - twelfthAvenueEndId = 'n5', - washingtonSegmentId = null, - eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc, - twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc, - deleteLinesLoc = [-85.6219395542764, 41.95228033922477], - twelfthAvenue = [-85.62219310052491, 41.952505413152956]; + var dispatch = d3_dispatch('done'); + var timeouts = []; + var _tulipRoadID = null; + var flowerRoadID = 'w646'; + var tulipRoadStart = [-85.6297754121684, 41.95805253325314]; + var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204]; + var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585]; + var roadCategory = context.presets().item('category-road'); + var residentialPreset = context.presets().item('highway/residential'); + var woodRoadID = 'w525'; + var woodRoadEndID = 'n2862'; + var woodRoadAddNode = [-85.62390110349587, 41.95397111462291]; + var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487]; + var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872]; + var washingtonStreetID = 'w522'; + var twelfthAvenueID = 'w1'; + var eleventhAvenueEndID = 'n3550'; + var twelfthAvenueEndID = 'n5'; + var _washingtonSegmentID = null; + var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc; + var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc; + var deleteLinesLoc = [-85.6219395542764, 41.95228033922477]; + var twelfthAvenue = [-85.62219310052491, 41.952505413152956]; var chapter = { @@ -106,11 +106,9 @@ export function uiIntroLine(context, reveal) { function startLine() { - if (context.mode().id !== 'add-line') { - return chapter.restart(); - } + if (context.mode().id !== 'add-line') return chapter.restart(); - tulipRoadId = null; + _tulipRoadID = null; var padding = 70 * Math.pow(2, context.map().zoom() - 18); var box = pad(tulipRoadStart, padding, context); @@ -138,11 +136,9 @@ export function uiIntroLine(context, reveal) { function drawLine() { - if (context.mode().id !== 'draw-line') { - return chapter.restart(); - } + if (context.mode().id !== 'draw-line') return chapter.restart(); - tulipRoadId = context.mode().selectedIDs()[0]; + _tulipRoadID = context.mode().selectedIDs()[0]; context.map().centerEase(tulipRoadMidpoint, 500); timeout(function() { @@ -165,8 +161,10 @@ export function uiIntroLine(context, reveal) { }, 550); // after easing.. context.history().on('change.intro', function() { - var entity = tulipRoadId && context.hasEntity(tulipRoadId); - if (!entity) return chapter.restart(); + var entity = _tulipRoadID && context.hasEntity(_tulipRoadID); + if (!entity) { + return chapter.restart(); + } if (isLineConnected()) { continueTo(continueLine); @@ -174,14 +172,14 @@ export function uiIntroLine(context, reveal) { }); context.on('enter.intro', function(mode) { - if (mode.id === 'draw-line') + if (mode.id === 'draw-line') { return; - else if (mode.id === 'select') { + } else if (mode.id === 'select') { continueTo(retryIntersect); return; - } - else + } else { return chapter.restart(); + } }); function continueTo(nextStep) { @@ -194,13 +192,13 @@ export function uiIntroLine(context, reveal) { function isLineConnected() { - var entity = tulipRoadId && context.hasEntity(tulipRoadId); + var entity = _tulipRoadID && context.hasEntity(_tulipRoadID); if (!entity) return false; var drawNodes = context.graph().childNodes(entity); return _some(drawNodes, function(node) { return _some(context.graph().parentWays(node), function(parent) { - return parent.id === flowerRoadId; + return parent.id === flowerRoadID; }); }); } @@ -220,7 +218,7 @@ export function uiIntroLine(context, reveal) { function continueLine() { if (context.mode().id !== 'draw-line') return chapter.restart(); - var entity = tulipRoadId && context.hasEntity(tulipRoadId); + var entity = _tulipRoadID && context.hasEntity(_tulipRoadID); if (!entity) return chapter.restart(); context.map().centerEase(tulipRoadIntersection, 500); @@ -244,9 +242,7 @@ export function uiIntroLine(context, reveal) { function chooseCategoryRoad() { - if (context.mode().id !== 'select') { - return chapter.restart(); - } + if (context.mode().id !== 'select') return chapter.restart(); context.on('exit.intro', function() { return chapter.restart(); @@ -282,9 +278,7 @@ export function uiIntroLine(context, reveal) { function choosePresetResidential() { - if (context.mode().id !== 'select') { - return chapter.restart(); - } + if (context.mode().id !== 'select') return chapter.restart(); context.on('exit.intro', function() { return chapter.restart(); @@ -320,9 +314,7 @@ export function uiIntroLine(context, reveal) { // selected wrong road type function retryPresetResidential() { - if (context.mode().id !== 'select') { - return chapter.restart(); - } + if (context.mode().id !== 'select') return chapter.restart(); context.on('exit.intro', function() { return chapter.restart(); @@ -390,7 +382,7 @@ export function uiIntroLine(context, reveal) { function updateLine() { context.history().reset('doneAddLine'); - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return chapter.restart(); } @@ -425,7 +417,7 @@ export function uiIntroLine(context, reveal) { function addNode() { context.history().reset('doneAddLine'); - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return chapter.restart(); } @@ -440,7 +432,7 @@ export function uiIntroLine(context, reveal) { }); context.history().on('change.intro', function(changed) { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } if (changed.created().length === 1) { @@ -464,7 +456,7 @@ export function uiIntroLine(context, reveal) { function startDragEndpoint() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } var padding = 100 * Math.pow(2, context.map().zoom() - 19); @@ -472,14 +464,14 @@ export function uiIntroLine(context, reveal) { reveal(box, t('intro.lines.start_drag_endpoint')); context.map().on('move.intro drawn.intro', function() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } var padding = 100 * Math.pow(2, context.map().zoom() - 19); var box = pad(woodRoadDragEndpoint, padding, context); reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 }); - var entity = context.entity(woodRoadEndId); + var entity = context.entity(woodRoadEndID); if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) { continueTo(finishDragEndpoint); } @@ -493,7 +485,7 @@ export function uiIntroLine(context, reveal) { function finishDragEndpoint() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } @@ -502,14 +494,14 @@ export function uiIntroLine(context, reveal) { reveal(box, t('intro.lines.finish_drag_endpoint')); context.map().on('move.intro drawn.intro', function() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } var padding = 100 * Math.pow(2, context.map().zoom() - 19); var box = pad(woodRoadDragEndpoint, padding, context); reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 }); - var entity = context.entity(woodRoadEndId); + var entity = context.entity(woodRoadEndID); if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) { continueTo(startDragEndpoint); } @@ -528,11 +520,11 @@ export function uiIntroLine(context, reveal) { function startDragMidpoint() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } - if (context.selectedIDs().indexOf(woodRoadId) === -1) { - context.enter(modeSelect(context, [woodRoadId])); + if (context.selectedIDs().indexOf(woodRoadID) === -1) { + context.enter(modeSelect(context, [woodRoadID])); } var padding = 80 * Math.pow(2, context.map().zoom() - 19); @@ -540,7 +532,7 @@ export function uiIntroLine(context, reveal) { reveal(box, t('intro.lines.start_drag_midpoint')); context.map().on('move.intro drawn.intro', function() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } var padding = 80 * Math.pow(2, context.map().zoom() - 19); @@ -557,7 +549,7 @@ export function uiIntroLine(context, reveal) { context.on('enter.intro', function(mode) { if (mode.id !== 'select') { // keep Wood Road selected so midpoint triangles are drawn.. - context.enter(modeSelect(context, [woodRoadId])); + context.enter(modeSelect(context, [woodRoadID])); } }); @@ -571,7 +563,7 @@ export function uiIntroLine(context, reveal) { function continueDragMidpoint() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } @@ -589,7 +581,7 @@ export function uiIntroLine(context, reveal) { ); context.map().on('move.intro drawn.intro', function() { - if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) { + if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) { return continueTo(updateLine); } var padding = 100 * Math.pow(2, context.map().zoom() - 19); @@ -611,9 +603,9 @@ export function uiIntroLine(context, reveal) { context.history().reset('doneUpdateLine'); context.enter(modeBrowse(context)); - if (!context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return chapter.restart(); } @@ -683,7 +675,7 @@ export function uiIntroLine(context, reveal) { context.on('enter.intro', function(mode) { if (mode.id !== 'select') return; var ids = context.selectedIDs(); - if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return; + if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return; timeout(function() { var node = selectMenuItem('split').node(); @@ -710,9 +702,9 @@ export function uiIntroLine(context, reveal) { function splitIntersection() { - if (!context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(deleteLines); } @@ -721,7 +713,7 @@ export function uiIntroLine(context, reveal) { var wasChanged = false; var menuCoords = context.map().mouseCoordinates(); - washingtonSegmentId = null; + _washingtonSegmentID = null; revealEditMenu(menuCoords, t('intro.lines.split_intersection', { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }) @@ -741,10 +733,10 @@ export function uiIntroLine(context, reveal) { wasChanged = true; timeout(function() { if (context.history().undoAnnotation() === t('operations.split.annotation.line')) { - washingtonSegmentId = changed.created()[0].id; + _washingtonSegmentID = changed.created()[0].id; continueTo(didSplit); } else { - washingtonSegmentId = null; + _washingtonSegmentID = null; continueTo(retrySplit); } }, 300); // after any transition (e.g. if user deleted intersection) @@ -785,11 +777,11 @@ export function uiIntroLine(context, reveal) { function didSplit() { - if (!washingtonSegmentId || - !context.hasEntity(washingtonSegmentId) || - !context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!_washingtonSegmentID || + !context.hasEntity(_washingtonSegmentID) || + !context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(rightClickIntersection); } @@ -819,17 +811,17 @@ export function uiIntroLine(context, reveal) { context.on('enter.intro', function() { var ids = context.selectedIDs(); - if (ids.length === 1 && ids[0] === washingtonSegmentId) { + if (ids.length === 1 && ids[0] === _washingtonSegmentID) { continueTo(multiSelect); } }); context.history().on('change.intro', function() { - if (!washingtonSegmentId || - !context.hasEntity(washingtonSegmentId) || - !context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!_washingtonSegmentID || + !context.hasEntity(_washingtonSegmentID) || + !context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(rightClickIntersection); } }); @@ -844,17 +836,17 @@ export function uiIntroLine(context, reveal) { function multiSelect() { - if (!washingtonSegmentId || - !context.hasEntity(washingtonSegmentId) || - !context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!_washingtonSegmentID || + !context.hasEntity(_washingtonSegmentID) || + !context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(rightClickIntersection); } var ids = context.selectedIDs(); - var hasWashington = ids.indexOf(washingtonSegmentId) !== -1; - var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1; + var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1; + var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1; if (hasWashington && hasTwelfth) { return continueTo(multiRightClick); @@ -910,11 +902,11 @@ export function uiIntroLine(context, reveal) { }); context.history().on('change.intro', function() { - if (!washingtonSegmentId || - !context.hasEntity(washingtonSegmentId) || - !context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!_washingtonSegmentID || + !context.hasEntity(_washingtonSegmentID) || + !context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(rightClickIntersection); } }); @@ -930,11 +922,11 @@ export function uiIntroLine(context, reveal) { function multiRightClick() { - if (!washingtonSegmentId || - !context.hasEntity(washingtonSegmentId) || - !context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!_washingtonSegmentID || + !context.hasEntity(_washingtonSegmentID) || + !context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(rightClickIntersection); } @@ -952,13 +944,13 @@ export function uiIntroLine(context, reveal) { timeout(function() { var ids = context.selectedIDs(); if (ids.length === 2 && - ids.indexOf(twelfthAvenueId) !== -1 && - ids.indexOf(washingtonSegmentId) !== -1) { + ids.indexOf(twelfthAvenueID) !== -1 && + ids.indexOf(_washingtonSegmentID) !== -1) { var node = selectMenuItem('delete').node(); if (!node) return; continueTo(multiDelete); } else if (ids.length === 1 && - ids.indexOf(washingtonSegmentId) !== -1) { + ids.indexOf(_washingtonSegmentID) !== -1) { return continueTo(multiSelect); } else { return continueTo(didSplit); @@ -967,11 +959,11 @@ export function uiIntroLine(context, reveal) { }, true); context.history().on('change.intro', function() { - if (!washingtonSegmentId || - !context.hasEntity(washingtonSegmentId) || - !context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!_washingtonSegmentID || + !context.hasEntity(_washingtonSegmentID) || + !context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(rightClickIntersection); } }); @@ -986,11 +978,11 @@ export function uiIntroLine(context, reveal) { function multiDelete() { - if (!washingtonSegmentId || - !context.hasEntity(washingtonSegmentId) || - !context.hasEntity(washingtonStreetId) || - !context.hasEntity(twelfthAvenueId) || - !context.hasEntity(eleventhAvenueEndId)) { + if (!_washingtonSegmentID || + !context.hasEntity(_washingtonSegmentID) || + !context.hasEntity(washingtonStreetID) || + !context.hasEntity(twelfthAvenueID) || + !context.hasEntity(eleventhAvenueEndID)) { return continueTo(rightClickIntersection); } @@ -1010,13 +1002,13 @@ export function uiIntroLine(context, reveal) { }); context.on('exit.intro', function() { - if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) { + if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) { return continueTo(multiSelect); // left select mode but roads still exist } }); context.history().on('change.intro', function() { - if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) { + if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) { continueTo(retryDelete); // changed something but roads still exist } else { continueTo(play); diff --git a/modules/ui/intro/navigation.js b/modules/ui/intro/navigation.js index 0b93bbe73..b8f298ee1 100644 --- a/modules/ui/intro/navigation.js +++ b/modules/ui/intro/navigation.js @@ -12,15 +12,15 @@ import { icon, pointBox, transitionTime } from './helper'; export function uiIntroNavigation(context, reveal) { - var dispatch = d3_dispatch('done'), - timeouts = [], - hallId = 'n2061', - townHall = [-85.63591, 41.94285], - springStreetId = 'w397', - springStreetEndId = 'n1834', - springStreet = [-85.63582, 41.94255], - onewayField = context.presets().field('oneway'), - maxspeedField = context.presets().field('maxspeed'); + var dispatch = d3_dispatch('done'); + var timeouts = []; + var hallId = 'n2061'; + var townHall = [-85.63591, 41.94285]; + var springStreetId = 'w397'; + var springStreetEndId = 'n1834'; + var springStreet = [-85.63582, 41.94255]; + var onewayField = context.presets().field('oneway'); + var maxspeedField = context.presets().field('maxspeed'); var chapter = { @@ -409,9 +409,9 @@ export function uiIntroNavigation(context, reveal) { function checkSearchResult() { - var first = d3_select('.feature-list-item:nth-child(0n+2)'), // skip "No Results" item - firstName = first.select('.entity-name'), - name = t('intro.graph.name.spring-street'); + var first = d3_select('.feature-list-item:nth-child(0n+2)'); // skip "No Results" item + var firstName = first.select('.entity-name'); + var name = t('intro.graph.name.spring-street'); if (!firstName.empty() && firstName.text() === name) { reveal(first.node(), diff --git a/modules/ui/intro/point.js b/modules/ui/intro/point.js index 8f6ce0af6..5c58b7188 100644 --- a/modules/ui/intro/point.js +++ b/modules/ui/intro/point.js @@ -12,12 +12,12 @@ import { icon, pointBox, pad, selectMenuItem, transitionTime } from './helper'; export function uiIntroPoint(context, reveal) { - var dispatch = d3_dispatch('done'), - timeouts = [], - intersection = [-85.63279, 41.94394], - building = [-85.632422, 41.944045], - cafePreset = context.presets().item('amenity/cafe'), - pointId = null; + var dispatch = d3_dispatch('done'); + var timeouts = []; + var intersection = [-85.63279, 41.94394]; + var building = [-85.632422, 41.944045]; + var cafePreset = context.presets().item('amenity/cafe'); + var _pointID = null; var chapter = { @@ -66,7 +66,7 @@ export function uiIntroPoint(context, reveal) { var tooltip = reveal('button.add-point', t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') })); - pointId = null; + _pointID = null; tooltip.selectAll('.tooltip-inner') .insert('svg', 'span') @@ -102,7 +102,7 @@ export function uiIntroPoint(context, reveal) { context.on('enter.intro', function(mode) { if (mode.id !== 'select') return chapter.restart(); - pointId = context.mode().selectedIDs()[0]; + _pointID = context.mode().selectedIDs()[0]; continueTo(searchPreset); }); @@ -115,7 +115,7 @@ export function uiIntroPoint(context, reveal) { function searchPreset() { - if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) { + if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) { return addPoint(); } @@ -131,14 +131,14 @@ export function uiIntroPoint(context, reveal) { ); context.on('enter.intro', function(mode) { - if (!pointId || !context.hasEntity(pointId)) { + if (!_pointID || !context.hasEntity(_pointID)) { return continueTo(addPoint); } var ids = context.selectedIDs(); - if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) { + if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) { // keep the user's point selected.. - context.enter(modeSelect(context, [pointId])); + context.enter(modeSelect(context, [_pointID])); // disallow scrolling d3_select('.inspector-wrap').on('wheel.intro', eventCancel); @@ -186,7 +186,7 @@ export function uiIntroPoint(context, reveal) { function aboutFeatureEditor() { - if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) { + if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) { return addPoint(); } @@ -211,7 +211,7 @@ export function uiIntroPoint(context, reveal) { function addName() { - if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) { + if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) { return addPoint(); } @@ -222,7 +222,7 @@ export function uiIntroPoint(context, reveal) { // It's possible for the user to add a name in a previous step.. // If so, don't tell them to add the name in this step. // Give them an OK button instead. - var entity = context.entity(pointId); + var entity = context.entity(_pointID); if (entity.tags.name) { var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), { tooltipClass: 'intro-points-describe', @@ -278,13 +278,13 @@ export function uiIntroPoint(context, reveal) { function reselectPoint() { - if (!pointId) return chapter.restart(); - var entity = context.hasEntity(pointId); + if (!_pointID) return chapter.restart(); + var entity = context.hasEntity(_pointID); if (!entity) return chapter.restart(); // make sure it's still a cafe, in case user somehow changed it.. var oldPreset = context.presets().match(entity, context.graph()); - context.replace(actionChangePreset(pointId, oldPreset, cafePreset)); + context.replace(actionChangePreset(_pointID, oldPreset, cafePreset)); context.enter(modeBrowse(context)); @@ -298,7 +298,7 @@ export function uiIntroPoint(context, reveal) { timeout(function() { context.map().on('move.intro drawn.intro', function() { - var entity = context.hasEntity(pointId); + var entity = context.hasEntity(_pointID); if (!entity) return chapter.restart(); var box = pointBox(entity.loc, context); reveal(box, t('intro.points.reselect'), { duration: 0 }); @@ -321,7 +321,7 @@ export function uiIntroPoint(context, reveal) { function updatePoint() { - if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) { + if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) { return continueTo(reselectPoint); } @@ -351,7 +351,7 @@ export function uiIntroPoint(context, reveal) { function updateCloseEditor() { - if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) { + if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) { return continueTo(reselectPoint); } @@ -376,8 +376,8 @@ export function uiIntroPoint(context, reveal) { function rightClickPoint() { - if (!pointId) return chapter.restart(); - var entity = context.hasEntity(pointId); + if (!_pointID) return chapter.restart(); + var entity = context.hasEntity(_pointID); if (!entity) return chapter.restart(); context.enter(modeBrowse(context)); @@ -387,7 +387,7 @@ export function uiIntroPoint(context, reveal) { timeout(function() { context.map().on('move.intro drawn.intro', function() { - var entity = context.hasEntity(pointId); + var entity = context.hasEntity(_pointID); if (!entity) return chapter.restart(); var box = pointBox(entity.loc, context); reveal(box, t('intro.points.rightclick'), { duration: 0 }); @@ -397,7 +397,7 @@ export function uiIntroPoint(context, reveal) { context.on('enter.intro', function(mode) { if (mode.id !== 'select') return; var ids = context.selectedIDs(); - if (ids.length !== 1 || ids[0] !== pointId) return; + if (ids.length !== 1 || ids[0] !== _pointID) return; timeout(function() { var node = selectMenuItem('delete').node(); @@ -415,8 +415,8 @@ export function uiIntroPoint(context, reveal) { function enterDelete() { - if (!pointId) return chapter.restart(); - var entity = context.hasEntity(pointId); + if (!_pointID) return chapter.restart(); + var entity = context.hasEntity(_pointID); if (!entity) return chapter.restart(); var node = selectMenuItem('delete').node(); @@ -436,8 +436,8 @@ export function uiIntroPoint(context, reveal) { }, 300); // after menu visible context.on('exit.intro', function() { - if (!pointId) return chapter.restart(); - var entity = context.hasEntity(pointId); + if (!_pointID) return chapter.restart(); + var entity = context.hasEntity(_pointID); if (entity) return continueTo(rightClickPoint); // point still exists }); diff --git a/modules/ui/intro/welcome.js b/modules/ui/intro/welcome.js index a33de0e25..ec657d6e2 100644 --- a/modules/ui/intro/welcome.js +++ b/modules/ui/intro/welcome.js @@ -9,8 +9,8 @@ import { utilRebind } from '../../util/rebind'; export function uiIntroWelcome(context, reveal) { - var dispatch = d3_dispatch('done'), - listener = clickListener(); + var dispatch = d3_dispatch('done'); + var listener = clickListener(); var chapter = { title: 'intro.welcome.title' @@ -49,8 +49,8 @@ export function uiIntroWelcome(context, reveal) { function leftClick() { - var counter = 0, - times = 5; + var counter = 0; + var times = 5; var tooltip = reveal('.intro-nav-wrap .chapter-welcome', t('intro.welcome.leftclick', { num: times }), @@ -90,8 +90,8 @@ export function uiIntroWelcome(context, reveal) { function rightClick() { - var counter = 0, - times = 5; + var counter = 0; + var times = 5; var tooltip = reveal('.intro-nav-wrap .chapter-welcome', t('intro.welcome.rightclick', { num: times }), @@ -163,10 +163,10 @@ export function uiIntroWelcome(context, reveal) { function clickListener() { - var dispatch = d3_dispatch('click'), - minTime = 120, - tooltip = d3_select(null), - down = {}; + var dispatch = d3_dispatch('click'); + var minTime = 120; + var tooltip = d3_select(null); + var down = {}; // `down` keeps track of which buttons/keys are down. // Setting a property in `down` happens immediately. @@ -187,9 +187,9 @@ function clickListener() { if (d3_event.keyCode === 93) { // context menu d3_event.preventDefault(); d3_event.stopPropagation(); - var endTime = d3_event.timeStamp, - startTime = down.menu || endTime, - delay = (endTime - startTime < minTime) ? minTime : 0; + var endTime = d3_event.timeStamp; + var startTime = down.menu || endTime; + var delay = (endTime - startTime < minTime) ? minTime : 0; window.setTimeout(function() { tooltip.classed('rightclick', false); @@ -213,10 +213,10 @@ function clickListener() { function mouseup() { - var button = d3_event.button, - endTime = d3_event.timeStamp, - startTime = down[button] || endTime, - delay = (endTime - startTime < minTime) ? minTime : 0; + var button = d3_event.button; + var endTime = d3_event.timeStamp; + var startTime = down[button] || endTime; + var delay = (endTime - startTime < minTime) ? minTime : 0; if (button === 0 && !d3_event.ctrlKey) { window.setTimeout(function() { From a6b32651899b2a7bd2c0a3e7a1d55ae5f2f67da4 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 6 Sep 2018 14:32:26 -0400 Subject: [PATCH 202/217] Don't chapter.reset() on change while drawing (closes #5295) The cause of this crash was: - when cancelling a line, `drawWay.cancel()` needs to clean up old edits. - it does this by looping `context.pop()` them off history until they are gone - each `context.pop()` dispatches a 'change' event - if we reset the chapter on one of these change events, it throws away the graph, and `drawWay.cancel()` can't finish what it's doing --- modules/ui/intro/line.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/ui/intro/line.js b/modules/ui/intro/line.js index 4a156ae27..be40f73cf 100644 --- a/modules/ui/intro/line.js +++ b/modules/ui/intro/line.js @@ -161,11 +161,6 @@ export function uiIntroLine(context, reveal) { }, 550); // after easing.. context.history().on('change.intro', function() { - var entity = _tulipRoadID && context.hasEntity(_tulipRoadID); - if (!entity) { - return chapter.restart(); - } - if (isLineConnected()) { continueTo(continueLine); } From b75e32bb1b4c9bca69d802123ad398c754f94d76 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Thu, 6 Sep 2018 15:28:37 -0400 Subject: [PATCH 203/217] Add preset for Parcel Pickup Locker (closes #5260) --- data/presets.yaml | 11 +++++--- data/presets/presets.json | 3 ++- .../vending_machine/parcel_pickup.json | 26 +++++++++++++++++++ .../parcel_pickup_dropoff.json | 4 +-- data/taginfo.json | 9 ++++++- dist/locales/en.json | 8 ++++-- 6 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 data/presets/presets/amenity/vending_machine/parcel_pickup.json diff --git a/data/presets.yaml b/data/presets.yaml index 84fa7b34a..4efecdb3d 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -2460,11 +2460,16 @@ en: name: Newspaper Vending Machine # 'terms: newspaper' terms: '' + amenity/vending_machine/parcel_pickup: + # 'amenity=vending_machine, vending=parcel_pickup' + name: Parcel Pickup Locker + # 'terms: amazon,locker,mail,parcel,pickup' + terms: '' amenity/vending_machine/parcel_pickup_dropoff: # 'amenity=vending_machine, vending=parcel_pickup;parcel_mail_in' - name: Parcel Pickup/Dropoff Vending Machine - # 'terms: parcel,mail,pickup' - terms: '' + name: Parcel Pickup/Dropoff Locker + # 'terms: mail,parcel,pickup' + terms: '' amenity/vending_machine/parking_tickets: # 'amenity=vending_machine, vending=parking_tickets' name: Parking Ticket Vending Machine diff --git a/data/presets/presets.json b/data/presets/presets.json index 7bba04dec..62e77cb19 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -159,7 +159,8 @@ "amenity/vending_machine/fuel": {"icon": "maki-fuel", "fields": ["vending", "operator", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["petrol", "fuel", "gasoline", "propane", "diesel", "lng", "cng", "biodiesel"], "tags": {"amenity": "vending_machine", "vending": "fuel"}, "reference": {"key": "vending", "value": "fuel"}, "name": "Gas Pump"}, "amenity/vending_machine/ice_cream": {"icon": "temaki-vending_machine", "fields": ["vending", "operator", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["chocolate", "ice cream", "frozen", "popsicle", "vanilla"], "tags": {"amenity": "vending_machine", "vending": "ice_cream"}, "reference": {"key": "vending", "value": "ice_cream"}, "name": "Ice Cream Vending Machine"}, "amenity/vending_machine/newspapers": {"icon": "temaki-vending_machine", "fields": ["vending", "operator", "fee", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["newspaper"], "tags": {"amenity": "vending_machine", "vending": "newspapers"}, "reference": {"key": "vending", "value": "newspapers"}, "name": "Newspaper Vending Machine"}, - "amenity/vending_machine/parcel_pickup_dropoff": {"icon": "temaki-vending_machine", "fields": ["vending", "operator", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["parcel", "mail", "pickup"], "tags": {"amenity": "vending_machine", "vending": "parcel_pickup;parcel_mail_in"}, "reference": {"key": "vending", "value": "parcel_pickup;parcel_mail_in"}, "name": "Parcel Pickup/Dropoff Vending Machine"}, + "amenity/vending_machine/parcel_pickup_dropoff": {"icon": "temaki-vending_machine", "fields": ["vending", "operator", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["mail", "parcel", "pickup"], "tags": {"amenity": "vending_machine", "vending": "parcel_pickup;parcel_mail_in"}, "reference": {"key": "vending", "value": "parcel_pickup;parcel_mail_in"}, "name": "Parcel Pickup/Dropoff Locker"}, + "amenity/vending_machine/parcel_pickup": {"icon": "temaki-vending_machine", "fields": ["vending", "operator"], "geometry": ["point"], "terms": ["amazon", "locker", "mail", "parcel", "pickup"], "tags": {"amenity": "vending_machine", "vending": "parcel_pickup"}, "reference": {"key": "vending", "value": "parcel_pickup"}, "name": "Parcel Pickup Locker"}, "amenity/vending_machine/parking_tickets": {"icon": "temaki-vending_machine", "fields": ["vending", "operator", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["parking", "ticket"], "tags": {"amenity": "vending_machine", "vending": "parking_tickets"}, "reference": {"key": "vending", "value": "parking_tickets"}, "matchScore": 0.94, "name": "Parking Ticket Vending Machine"}, "amenity/vending_machine/public_transport_tickets": {"icon": "temaki-vending_machine", "fields": ["vending", "operator", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["bus", "train", "ferry", "rail", "ticket", "transportation"], "tags": {"amenity": "vending_machine", "vending": "public_transport_tickets"}, "reference": {"key": "vending", "value": "public_transport_tickets"}, "name": "Transit Ticket Vending Machine"}, "amenity/vending_machine/stamps": {"icon": "temaki-vending_machine", "fields": ["vending", "operator", "payment_multi", "currency_multi"], "geometry": ["point"], "terms": ["mail", "postage", "stamp"], "tags": {"amenity": "vending_machine", "vending": "stamps"}, "reference": {"key": "vending", "value": "stamps"}, "name": "Postage Vending Machine"}, diff --git a/data/presets/presets/amenity/vending_machine/parcel_pickup.json b/data/presets/presets/amenity/vending_machine/parcel_pickup.json new file mode 100644 index 000000000..01765c072 --- /dev/null +++ b/data/presets/presets/amenity/vending_machine/parcel_pickup.json @@ -0,0 +1,26 @@ +{ + "icon": "temaki-vending_machine", + "fields": [ + "vending", + "operator" + ], + "geometry": [ + "point" + ], + "terms": [ + "amazon", + "locker", + "mail", + "parcel", + "pickup" + ], + "tags": { + "amenity": "vending_machine", + "vending": "parcel_pickup" + }, + "reference": { + "key": "vending", + "value": "parcel_pickup" + }, + "name": "Parcel Pickup Locker" +} diff --git a/data/presets/presets/amenity/vending_machine/parcel_pickup_dropoff.json b/data/presets/presets/amenity/vending_machine/parcel_pickup_dropoff.json index a500ef405..7c20ccf84 100644 --- a/data/presets/presets/amenity/vending_machine/parcel_pickup_dropoff.json +++ b/data/presets/presets/amenity/vending_machine/parcel_pickup_dropoff.json @@ -10,8 +10,8 @@ "point" ], "terms": [ - "parcel", "mail", + "parcel", "pickup" ], "tags": { @@ -22,5 +22,5 @@ "key": "vending", "value": "parcel_pickup;parcel_mail_in" }, - "name": "Parcel Pickup/Dropoff Vending Machine" + "name": "Parcel Pickup/Dropoff Locker" } diff --git a/data/taginfo.json b/data/taginfo.json index 2d3c6a84e..f5797f12f 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -1082,7 +1082,14 @@ { "key": "vending", "value": "parcel_pickup;parcel_mail_in", - "description": "Parcel Pickup/Dropoff Vending Machine", + "description": "Parcel Pickup/Dropoff Locker", + "object_types": ["node"], + "icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/vending_machine.svg?sanitize=true" + }, + { + "key": "vending", + "value": "parcel_pickup", + "description": "Parcel Pickup Locker", "object_types": ["node"], "icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/vending_machine.svg?sanitize=true" }, diff --git a/dist/locales/en.json b/dist/locales/en.json index 95cef1ff9..5ae64843e 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -3573,8 +3573,12 @@ "terms": "newspaper" }, "amenity/vending_machine/parcel_pickup_dropoff": { - "name": "Parcel Pickup/Dropoff Vending Machine", - "terms": "parcel,mail,pickup" + "name": "Parcel Pickup/Dropoff Locker", + "terms": "mail,parcel,pickup" + }, + "amenity/vending_machine/parcel_pickup": { + "name": "Parcel Pickup Locker", + "terms": "amazon,locker,mail,parcel,pickup" }, "amenity/vending_machine/parking_tickets": { "name": "Parking Ticket Vending Machine", From 0737499b7bf504cd30a5b0bd3ba12f970aa652e9 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Fri, 7 Sep 2018 09:35:16 -0400 Subject: [PATCH 204/217] Show bottom border for tablists for improved accessibility --- css/80_app.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/css/80_app.css b/css/80_app.css index 8fb0f17b0..6b3047bcd 100644 --- a/css/80_app.css +++ b/css/80_app.css @@ -2082,6 +2082,7 @@ div.combobox { } .field-help-nav-item.active { color: #7092ff; + border-bottom: 2px solid; } .field-help-nav-item:hover { color: #597be7; @@ -3964,6 +3965,7 @@ img.tile-debug { } .modal-shortcuts .tab.active { color: #7092ff; + border-bottom: 2px solid; } .modal-shortcuts .tab:hover { color: #597be7; From 03fc4580f2f3d1f20c902f211145484a92cac2c5 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Fri, 7 Sep 2018 17:09:38 -0700 Subject: [PATCH 205/217] Adds Location and Length fields to the Swimming Pool preset --- data/presets.yaml | 10 ++++++++++ data/presets/fields.json | 1 + data/presets/fields/location_pool.json | 12 ++++++++++++ data/presets/presets.json | 10 +++++----- data/presets/presets/leisure/swimming_pool.json | 4 +++- data/taginfo.json | 3 +++ dist/locales/en.json | 8 ++++++++ 7 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 data/presets/fields/location_pool.json diff --git a/data/presets.yaml b/data/presets.yaml index 4efecdb3d..eb6e4b6ea 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -873,6 +873,16 @@ en: location: # location=* label: Location + location_pool: + # location=* + label: Location + options: + # location=indoor + indoor: Indoor + # location=outdoor + outdoor: Outdoor + # location=roof + roof: Rooftop man_made: # man_made=* label: Type diff --git a/data/presets/fields.json b/data/presets/fields.json index b92a073f6..1647aaf85 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -156,6 +156,7 @@ "level": {"key": "level", "type": "combo", "label": "Level", "universal": true}, "levels": {"key": "building:levels", "type": "number", "minValue": 0, "label": "Levels", "placeholder": "2, 4, 6..."}, "lit": {"key": "lit", "type": "check", "label": "Lit"}, + "location_pool": {"key": "location", "type": "typeCombo", "label": "Location", "strings": {"options": {"outdoor": "Outdoor", "indoor": "Indoor", "roof": "Rooftop"}}}, "location": {"key": "location", "type": "combo", "label": "Location"}, "man_made": {"key": "man_made", "type": "typeCombo", "label": "Type"}, "manhole": {"key": "manhole", "type": "typeCombo", "label": "Type"}, diff --git a/data/presets/fields/location_pool.json b/data/presets/fields/location_pool.json new file mode 100644 index 000000000..be692c419 --- /dev/null +++ b/data/presets/fields/location_pool.json @@ -0,0 +1,12 @@ +{ + "key": "location", + "type": "typeCombo", + "label": "Location", + "strings": { + "options": { + "outdoor": "Outdoor", + "indoor": "Indoor", + "roof": "Rooftop" + } + } +} diff --git a/data/presets/presets.json b/data/presets/presets.json index 62e77cb19..784806f20 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -528,7 +528,7 @@ "leisure/sports_centre": {"icon": "maki-pitch", "fields": ["name", "sport", "building", "address", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "sports_centre"}, "terms": [], "name": "Sports Center / Complex"}, "leisure/sports_centre/swimming": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "building"], "geometry": ["point", "area"], "terms": ["dive", "water"], "tags": {"leisure": "sports_centre", "sport": "swimming"}, "reference": {"key": "sport", "value": "swimming"}, "name": "Swimming Pool Facility"}, "leisure/stadium": {"icon": "maki-pitch", "fields": ["name", "sport", "address"], "geometry": ["point", "area"], "tags": {"leisure": "stadium"}, "name": "Stadium"}, - "leisure/swimming_pool": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "lit"], "geometry": ["point", "area"], "terms": ["dive", "water", "aquatics"], "tags": {"leisure": "swimming_pool"}, "name": "Swimming Pool"}, + "leisure/swimming_pool": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "geometry": ["point", "area"], "terms": ["dive", "water", "aquatics"], "tags": {"leisure": "swimming_pool"}, "name": "Swimming Pool"}, "leisure/track": {"icon": "iD-highway-road", "fields": ["surface", "sport_racing_nonmotor", "lit", "width", "lanes"], "geometry": ["point", "line", "area"], "tags": {"leisure": "track"}, "terms": ["cycle", "dog", "greyhound", "horse", "race*", "track"], "name": "Racetrack (Non-Motorsport)"}, "leisure/water_park": {"icon": "maki-swimming", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["swim", "pool", "dive"], "tags": {"leisure": "water_park"}, "name": "Water Park"}, "line": {"fields": ["name"], "geometry": ["line"], "tags": {}, "name": "Line", "matchScore": 0.1}, @@ -2794,10 +2794,10 @@ "leisure/sports_centre/ДЮСШ": {"tags": {"name": "ДЮСШ", "leisure": "sports_centre"}, "name": "ДЮСШ", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, "leisure/sports_centre/Ледовый дворец": {"tags": {"name": "Ледовый дворец", "leisure": "sports_centre"}, "name": "Ледовый дворец", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, "leisure/sports_centre/体育館": {"tags": {"name": "体育館", "leisure": "sports_centre"}, "name": "体育館", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, - "leisure/swimming_pool/Schwimmerbecken": {"tags": {"name": "Schwimmerbecken", "leisure": "swimming_pool"}, "name": "Schwimmerbecken", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, - "leisure/swimming_pool/Yüzme Havuzu": {"tags": {"name": "Yüzme Havuzu", "leisure": "swimming_pool"}, "name": "Yüzme Havuzu", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, - "leisure/swimming_pool/プール": {"tags": {"name": "プール", "leisure": "swimming_pool"}, "name": "プール", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, - "leisure/swimming_pool/游泳池": {"tags": {"name": "游泳池", "leisure": "swimming_pool"}, "name": "游泳池", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit"], "suggestion": true}, + "leisure/swimming_pool/Schwimmerbecken": {"tags": {"name": "Schwimmerbecken", "leisure": "swimming_pool"}, "name": "Schwimmerbecken", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, + "leisure/swimming_pool/Yüzme Havuzu": {"tags": {"name": "Yüzme Havuzu", "leisure": "swimming_pool"}, "name": "Yüzme Havuzu", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, + "leisure/swimming_pool/プール": {"tags": {"name": "プール", "leisure": "swimming_pool"}, "name": "プール", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, + "leisure/swimming_pool/游泳池": {"tags": {"name": "游泳池", "leisure": "swimming_pool"}, "name": "游泳池", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, "man_made/windmill/De Hoop": {"tags": {"name": "De Hoop", "man_made": "windmill"}, "name": "De Hoop", "icon": "temaki-windmill", "geometry": ["point", "area"], "fields": ["building_area"], "suggestion": true}, "shop/alcohol/Alko": {"tags": {"name": "Alko", "shop": "alcohol"}, "name": "Alko", "icon": "maki-alcohol-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "drive_through"], "suggestion": true}, "shop/alcohol/BC Liquor Store": {"tags": {"name": "BC Liquor Store", "shop": "alcohol"}, "name": "BC Liquor Store", "icon": "maki-alcohol-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "drive_through"], "suggestion": true}, diff --git a/data/presets/presets/leisure/swimming_pool.json b/data/presets/presets/leisure/swimming_pool.json index 0d868e43d..055b3c45d 100644 --- a/data/presets/presets/leisure/swimming_pool.json +++ b/data/presets/presets/leisure/swimming_pool.json @@ -5,7 +5,9 @@ "access_simple", "operator", "address", - "lit" + "lit", + "location_pool", + "length" ], "geometry": [ "point", diff --git a/data/taginfo.json b/data/taginfo.json index f5797f12f..70df05757 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -6718,6 +6718,9 @@ {"key": "level", "description": "Level"}, {"key": "building:levels", "description": "Levels"}, {"key": "lit", "description": "Lit"}, + {"key": "location", "value": "outdoor", "description": "Location"}, + {"key": "location", "value": "indoor", "description": "Location"}, + {"key": "location", "value": "roof", "description": "Location"}, {"key": "location", "description": "Location"}, {"key": "map_size", "description": "Coverage"}, {"key": "map_type", "description": "Type"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 5ae64843e..f9d2657cc 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2204,6 +2204,14 @@ "lit": { "label": "Lit" }, + "location_pool": { + "label": "Location", + "options": { + "outdoor": "Outdoor", + "indoor": "Indoor", + "roof": "Rooftop" + } + }, "location": { "label": "Location" }, From 5a6744b2dce0692705be8e7626892a71575dd5b1 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Fri, 7 Sep 2018 18:42:21 -0700 Subject: [PATCH 206/217] Adds a Type combo field to the Swimming Pool preset for the swimming_pool key --- data/presets.yaml | 3 +++ data/presets/fields.json | 1 + data/presets/fields/swimming_pool.json | 5 +++++ data/presets/presets.json | 10 +++++----- data/presets/presets/leisure/swimming_pool.json | 3 ++- data/taginfo.json | 1 + dist/locales/en.json | 3 +++ 7 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 data/presets/fields/swimming_pool.json diff --git a/data/presets.yaml b/data/presets.yaml index eb6e4b6ea..942c40117 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -1519,6 +1519,9 @@ en: surveillance/zone: # 'surveillance:zone=*' label: Surveillance Zone + swimming_pool: + # swimming_pool=* + label: Type switch: # switch=* label: Type diff --git a/data/presets/fields.json b/data/presets/fields.json index 1647aaf85..3c2b44d03 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -270,6 +270,7 @@ "surveillance": {"key": "surveillance", "type": "combo", "label": "Surveillance Kind"}, "surveillance/type": {"key": "surveillance:type", "type": "combo", "label": "Surveillance Type", "strings": {"options": {"camera": "Camera", "guard": "Guard", "ALPR": "Automatic License Plate Reader"}}}, "surveillance/zone": {"key": "surveillance:zone", "type": "combo", "label": "Surveillance Zone"}, + "swimming_pool": {"key": "swimming_pool", "type": "combo", "label": "Type"}, "switch": {"key": "switch", "type": "combo", "label": "Type", "strings": {"options": {"mechanical": "Mechanical", "circuit_breaker": "Circuit Breaker", "disconnector": "Disconnector", "earthing": "Earthing"}}}, "tactile_paving": {"key": "tactile_paving", "type": "check", "label": "Tactile Paving"}, "takeaway": {"key": "takeaway", "type": "combo", "label": "Takeaway", "placeholder": "Yes, No, Takeaway Only...", "strings": {"options": {"yes": "Yes", "no": "No", "only": "Takeaway Only"}}}, diff --git a/data/presets/fields/swimming_pool.json b/data/presets/fields/swimming_pool.json new file mode 100644 index 000000000..6e4d07bd0 --- /dev/null +++ b/data/presets/fields/swimming_pool.json @@ -0,0 +1,5 @@ +{ + "key": "swimming_pool", + "type": "combo", + "label": "Type" +} \ No newline at end of file diff --git a/data/presets/presets.json b/data/presets/presets.json index 784806f20..d4aa19eed 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -528,7 +528,7 @@ "leisure/sports_centre": {"icon": "maki-pitch", "fields": ["name", "sport", "building", "address", "opening_hours"], "geometry": ["point", "area"], "tags": {"leisure": "sports_centre"}, "terms": [], "name": "Sports Center / Complex"}, "leisure/sports_centre/swimming": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "building"], "geometry": ["point", "area"], "terms": ["dive", "water"], "tags": {"leisure": "sports_centre", "sport": "swimming"}, "reference": {"key": "sport", "value": "swimming"}, "name": "Swimming Pool Facility"}, "leisure/stadium": {"icon": "maki-pitch", "fields": ["name", "sport", "address"], "geometry": ["point", "area"], "tags": {"leisure": "stadium"}, "name": "Stadium"}, - "leisure/swimming_pool": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "geometry": ["point", "area"], "terms": ["dive", "water", "aquatics"], "tags": {"leisure": "swimming_pool"}, "name": "Swimming Pool"}, + "leisure/swimming_pool": {"icon": "maki-swimming", "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length", "swimming_pool"], "geometry": ["point", "area"], "terms": ["dive", "water", "aquatics"], "tags": {"leisure": "swimming_pool"}, "name": "Swimming Pool"}, "leisure/track": {"icon": "iD-highway-road", "fields": ["surface", "sport_racing_nonmotor", "lit", "width", "lanes"], "geometry": ["point", "line", "area"], "tags": {"leisure": "track"}, "terms": ["cycle", "dog", "greyhound", "horse", "race*", "track"], "name": "Racetrack (Non-Motorsport)"}, "leisure/water_park": {"icon": "maki-swimming", "fields": ["name", "operator", "address"], "geometry": ["point", "area"], "terms": ["swim", "pool", "dive"], "tags": {"leisure": "water_park"}, "name": "Water Park"}, "line": {"fields": ["name"], "geometry": ["line"], "tags": {}, "name": "Line", "matchScore": 0.1}, @@ -2794,10 +2794,10 @@ "leisure/sports_centre/ДЮСШ": {"tags": {"name": "ДЮСШ", "leisure": "sports_centre"}, "name": "ДЮСШ", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, "leisure/sports_centre/Ледовый дворец": {"tags": {"name": "Ледовый дворец", "leisure": "sports_centre"}, "name": "Ледовый дворец", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, "leisure/sports_centre/体育館": {"tags": {"name": "体育館", "leisure": "sports_centre"}, "name": "体育館", "icon": "maki-pitch", "geometry": ["point", "area"], "fields": ["name", "sport", "building", "address", "opening_hours"], "suggestion": true}, - "leisure/swimming_pool/Schwimmerbecken": {"tags": {"name": "Schwimmerbecken", "leisure": "swimming_pool"}, "name": "Schwimmerbecken", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, - "leisure/swimming_pool/Yüzme Havuzu": {"tags": {"name": "Yüzme Havuzu", "leisure": "swimming_pool"}, "name": "Yüzme Havuzu", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, - "leisure/swimming_pool/プール": {"tags": {"name": "プール", "leisure": "swimming_pool"}, "name": "プール", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, - "leisure/swimming_pool/游泳池": {"tags": {"name": "游泳池", "leisure": "swimming_pool"}, "name": "游泳池", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length"], "suggestion": true}, + "leisure/swimming_pool/Schwimmerbecken": {"tags": {"name": "Schwimmerbecken", "leisure": "swimming_pool"}, "name": "Schwimmerbecken", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length", "swimming_pool"], "suggestion": true}, + "leisure/swimming_pool/Yüzme Havuzu": {"tags": {"name": "Yüzme Havuzu", "leisure": "swimming_pool"}, "name": "Yüzme Havuzu", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length", "swimming_pool"], "suggestion": true}, + "leisure/swimming_pool/プール": {"tags": {"name": "プール", "leisure": "swimming_pool"}, "name": "プール", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length", "swimming_pool"], "suggestion": true}, + "leisure/swimming_pool/游泳池": {"tags": {"name": "游泳池", "leisure": "swimming_pool"}, "name": "游泳池", "icon": "maki-swimming", "geometry": ["point", "area"], "fields": ["name", "access_simple", "operator", "address", "lit", "location_pool", "length", "swimming_pool"], "suggestion": true}, "man_made/windmill/De Hoop": {"tags": {"name": "De Hoop", "man_made": "windmill"}, "name": "De Hoop", "icon": "temaki-windmill", "geometry": ["point", "area"], "fields": ["building_area"], "suggestion": true}, "shop/alcohol/Alko": {"tags": {"name": "Alko", "shop": "alcohol"}, "name": "Alko", "icon": "maki-alcohol-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "drive_through"], "suggestion": true}, "shop/alcohol/BC Liquor Store": {"tags": {"name": "BC Liquor Store", "shop": "alcohol"}, "name": "BC Liquor Store", "icon": "maki-alcohol-shop", "geometry": ["point", "area"], "fields": ["name", "operator", "address", "building_area", "opening_hours", "payment_multi", "drive_through"], "suggestion": true}, diff --git a/data/presets/presets/leisure/swimming_pool.json b/data/presets/presets/leisure/swimming_pool.json index 055b3c45d..776cbb5b5 100644 --- a/data/presets/presets/leisure/swimming_pool.json +++ b/data/presets/presets/leisure/swimming_pool.json @@ -7,7 +7,8 @@ "address", "lit", "location_pool", - "length" + "length", + "swimming_pool" ], "geometry": [ "point", diff --git a/data/taginfo.json b/data/taginfo.json index 70df05757..2ee7a7cd1 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -7061,6 +7061,7 @@ "description": "Surveillance Type" }, {"key": "surveillance:zone", "description": "Surveillance Zone"}, + {"key": "swimming_pool", "description": "Type"}, {"key": "switch", "value": "mechanical", "description": "Type"}, {"key": "switch", "value": "circuit_breaker", "description": "Type"}, {"key": "switch", "value": "disconnector", "description": "Type"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index f9d2657cc..16821c0bc 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2736,6 +2736,9 @@ "surveillance/zone": { "label": "Surveillance Zone" }, + "swimming_pool": { + "label": "Type" + }, "switch": { "label": "Type", "options": { From e7c57f9e6f69c0d55e5f9fd4ac5c4bea00170906 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Sat, 8 Sep 2018 10:38:09 -0700 Subject: [PATCH 207/217] Adds a Shipwreck preset for the historic=wreck tag Adds wreck Category, Date Sunk, and Visible at High/Low Tide fields --- data/presets.yaml | 17 +++++++++ data/presets/fields.json | 4 +++ .../fields/historic/wreck/date_sunk.json | 5 +++ .../historic/wreck/visible_at_high_tide.json | 5 +++ .../historic/wreck/visible_at_low_tide.json | 5 +++ .../fields/seamark/wreck/category.json | 5 +++ data/presets/presets.json | 1 + data/presets/presets/historic/wreck.json | 35 +++++++++++++++++++ data/taginfo.json | 14 ++++++++ dist/locales/en.json | 16 +++++++++ 10 files changed, 107 insertions(+) create mode 100644 data/presets/fields/historic/wreck/date_sunk.json create mode 100644 data/presets/fields/historic/wreck/visible_at_high_tide.json create mode 100644 data/presets/fields/historic/wreck/visible_at_low_tide.json create mode 100644 data/presets/fields/seamark/wreck/category.json create mode 100644 data/presets/presets/historic/wreck.json diff --git a/data/presets.yaml b/data/presets.yaml index e26d7c53f..20a74d3cd 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -681,6 +681,15 @@ en: historic/civilization: # 'historic:civilization=*' label: Historic Civilization + historic/wreck/date_sunk: + # 'wreck:date_sunk=*' + label: Date Sunk + historic/wreck/visible_at_high_tide: + # 'wreck:visible_at_high_tide=*' + label: Visible At High Tide + historic/wreck/visible_at_low_tide: + # 'wreck:visible_at_low_tide=*' + label: Visible At Low Tide hoops: # hoops=* label: Hoops @@ -1425,6 +1434,9 @@ en: seamark/type: # 'seamark:type=*' label: Seamark + seamark/wreck/category: + # 'seamark:wreck:category=*' + label: Category seasonal: # seasonal=* label: Seasonal @@ -3738,6 +3750,11 @@ en: # historic=wayside_shrine name: Wayside Shrine terms: '' + historic/wreck: + # historic=wreck + name: Shipwreck + # 'terms: hull,mast,maritime,remains,ship,boat' + terms: '' internet_access/wlan: # internet_access=wlan name: Wi-Fi Hotspot diff --git a/data/presets/fields.json b/data/presets/fields.json index dbba6487e..4935a015a 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -123,6 +123,9 @@ "highway": {"key": "highway", "type": "typeCombo", "label": "Type"}, "historic": {"key": "historic", "type": "typeCombo", "label": "Type"}, "historic/civilization": {"key": "historic:civilization", "type": "combo", "label": "Historic Civilization"}, + "historic/wreck/date_sunk": {"key": "wreck:date_sunk", "type": "text", "label": "Date Sunk"}, + "historic/wreck/visible_at_high_tide": {"key": "wreck:visible_at_high_tide", "type": "check", "label": "Visible At High Tide"}, + "historic/wreck/visible_at_low_tide": {"key": "wreck:visible_at_low_tide", "type": "check", "label": "Visible At Low Tide"}, "hoops": {"key": "hoops", "type": "number", "minValue": 0, "label": "Hoops", "placeholder": "1, 2, 4..."}, "horse_dressage": {"key": "sport", "type": "check", "label": "Dressage Riding", "strings": {"options": {"undefined": "No", "equestrian": "Yes"}}, "reference": {"key": "sport", "value": "equestrian"}}, "horse_riding": {"key": "leisure", "type": "check", "label": "Horseback Riding", "strings": {"options": {"undefined": "No", "horse_riding": "Yes"}}, "reference": {"key": "leisure", "value": "horse_riding"}}, @@ -243,6 +246,7 @@ "seamark/buoy_lateral/system": {"key": "seamark:buoy_lateral:system", "type": "combo", "label": "System", "strings": {"options": {"iala-a": "IALA A", "iala-b": "IALA B", "cevni": "CEVNI", "other": "Other"}}}, "seamark/mooring/category": {"key": "seamark:mooring:category", "type": "combo", "label": "Category"}, "seamark/type": {"key": "seamark:type", "type": "combo", "universal": true, "label": "Seamark"}, + "seamark/wreck/category": {"key": "seamark:wreck:category", "type": "combo", "label": "Category"}, "seasonal": {"key": "seasonal", "type": "check", "label": "Seasonal"}, "second_hand": {"key": "second_hand", "type": "combo", "label": "Sells Used", "placeholder": "Yes, No, Only", "strings": {"options": {"yes": "Yes", "no": "No", "only": "Only"}}}, "service_rail": {"key": "service", "type": "combo", "label": "Service Type", "strings": {"options": {"spur": "Spur", "yard": "Yard", "siding": "Siding", "crossover": "Crossover"}}}, diff --git a/data/presets/fields/historic/wreck/date_sunk.json b/data/presets/fields/historic/wreck/date_sunk.json new file mode 100644 index 000000000..6c923c9b0 --- /dev/null +++ b/data/presets/fields/historic/wreck/date_sunk.json @@ -0,0 +1,5 @@ +{ + "key": "wreck:date_sunk", + "type": "text", + "label": "Date Sunk" +} diff --git a/data/presets/fields/historic/wreck/visible_at_high_tide.json b/data/presets/fields/historic/wreck/visible_at_high_tide.json new file mode 100644 index 000000000..c08287fef --- /dev/null +++ b/data/presets/fields/historic/wreck/visible_at_high_tide.json @@ -0,0 +1,5 @@ +{ + "key": "wreck:visible_at_high_tide", + "type": "check", + "label": "Visible At High Tide" +} diff --git a/data/presets/fields/historic/wreck/visible_at_low_tide.json b/data/presets/fields/historic/wreck/visible_at_low_tide.json new file mode 100644 index 000000000..2013fe6e3 --- /dev/null +++ b/data/presets/fields/historic/wreck/visible_at_low_tide.json @@ -0,0 +1,5 @@ +{ + "key": "wreck:visible_at_low_tide", + "type": "check", + "label": "Visible At Low Tide" +} diff --git a/data/presets/fields/seamark/wreck/category.json b/data/presets/fields/seamark/wreck/category.json new file mode 100644 index 000000000..6977bfa4d --- /dev/null +++ b/data/presets/fields/seamark/wreck/category.json @@ -0,0 +1,5 @@ +{ + "key": "seamark:wreck:category", + "type": "combo", + "label": "Category" +} diff --git a/data/presets/presets.json b/data/presets/presets.json index 303469479..4d8497406 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -420,6 +420,7 @@ "historic/tomb": {"icon": "maki-cemetery", "fields": ["name", "tomb", "building_area", "inscription"], "geometry": ["point", "area"], "tags": {"historic": "tomb"}, "name": "Tomb"}, "historic/wayside_cross": {"icon": "maki-religious-christian", "fields": ["name", "inscription"], "geometry": ["point", "vertex", "area"], "tags": {"historic": "wayside_cross"}, "name": "Wayside Cross"}, "historic/wayside_shrine": {"icon": "maki-landmark", "fields": ["name", "religion", "denomination", "inscription"], "geometry": ["point", "vertex", "area"], "tags": {"historic": "wayside_shrine"}, "name": "Wayside Shrine"}, + "historic/wreck": {"icon": "temaki-ruins", "fields": ["name", "access_simple", "seamark/wreck/category", "historic/wreck/date_sunk", "historic/wreck/visible_at_low_tide", "historic/wreck/visible_at_high_tide"], "geometry": ["point", "area"], "tags": {"historic": "wreck"}, "addTags": {"historic": "wreck", "seamark:type": "wreck"}, "removeTags": {"historic": "wreck", "seamark:type": "wreck"}, "terms": ["hull", "mast", "maritime", "remains", "ship", "boat"], "name": "Shipwreck"}, "internet_access/wlan": {"icon": "fas-wifi", "geometry": ["point", "area"], "fields": ["internet_access/fee", "internet_access/ssid"], "terms": ["wi-fi", "wifi", "hotspot"], "tags": {"internet_access": "wlan"}, "name": "Wi-Fi Hotspot"}, "junction": {"icon": "temaki-junction", "fields": ["name"], "geometry": ["vertex", "area"], "tags": {"junction": "yes"}, "name": "Junction"}, "landuse": {"fields": ["name", "landuse"], "geometry": ["area"], "tags": {"landuse": "*"}, "matchScore": 0.9, "name": "Land Use"}, diff --git a/data/presets/presets/historic/wreck.json b/data/presets/presets/historic/wreck.json new file mode 100644 index 000000000..3038b2a94 --- /dev/null +++ b/data/presets/presets/historic/wreck.json @@ -0,0 +1,35 @@ +{ + "icon": "temaki-ruins", + "fields": [ + "name", + "access_simple", + "seamark/wreck/category", + "historic/wreck/date_sunk", + "historic/wreck/visible_at_low_tide", + "historic/wreck/visible_at_high_tide" + ], + "geometry": [ + "point", + "area" + ], + "tags": { + "historic": "wreck" + }, + "addTags": { + "historic": "wreck", + "seamark:type": "wreck" + }, + "removeTags": { + "historic": "wreck", + "seamark:type": "wreck" + }, + "terms": [ + "hull", + "mast", + "maritime", + "remains", + "ship", + "boat" + ], + "name": "Shipwreck" +} diff --git a/data/taginfo.json b/data/taginfo.json index 166e9e314..8bb8e44c2 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -2823,6 +2823,13 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/landmark-15.svg?sanitize=true" }, + { + "key": "historic", + "value": "wreck", + "description": "Shipwreck", + "object_types": ["node", "area"], + "icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/ruins.svg?sanitize=true" + }, { "key": "internet_access", "value": "wlan", @@ -6673,6 +6680,12 @@ {"key": "healthcare:speciality", "description": "Specialties"}, {"key": "height", "description": "Height (Meters)"}, {"key": "historic:civilization", "description": "Historic Civilization"}, + {"key": "wreck:date_sunk", "description": "Date Sunk"}, + { + "key": "wreck:visible_at_high_tide", + "description": "Visible At High Tide" + }, + {"key": "wreck:visible_at_low_tide", "description": "Visible At Low Tide"}, {"key": "hoops", "description": "Hoops"}, { "key": "horse_scale", @@ -7182,6 +7195,7 @@ "description": "System" }, {"key": "seamark:mooring:category", "description": "Category"}, + {"key": "seamark:wreck:category", "description": "Category"}, {"key": "seasonal", "description": "Seasonal"}, {"key": "second_hand", "value": "yes", "description": "Sells Used"}, {"key": "second_hand", "value": "no", "description": "Sells Used"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 61a0c74ed..e88194a78 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2045,6 +2045,15 @@ "historic/civilization": { "label": "Historic Civilization" }, + "historic/wreck/date_sunk": { + "label": "Date Sunk" + }, + "historic/wreck/visible_at_high_tide": { + "label": "Visible At High Tide" + }, + "historic/wreck/visible_at_low_tide": { + "label": "Visible At Low Tide" + }, "hoops": { "label": "Hoops", "placeholder": "1, 2, 4..." @@ -2644,6 +2653,9 @@ "seamark/type": { "label": "Seamark" }, + "seamark/wreck/category": { + "label": "Category" + }, "seasonal": { "label": "Seasonal" }, @@ -4707,6 +4719,10 @@ "name": "Wayside Shrine", "terms": "" }, + "historic/wreck": { + "name": "Shipwreck", + "terms": "hull,mast,maritime,remains,ship,boat" + }, "internet_access/wlan": { "name": "Wi-Fi Hotspot", "terms": "wi-fi,wifi,hotspot" From 2ddb011d099e87359fe20bf782bd139af30fae45 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Sat, 15 Sep 2018 16:34:36 -0700 Subject: [PATCH 208/217] Adds Sculpture, Statue, and Mural presets Adds a universal Material field --- data/presets.yaml | 18 ++++++++++++++ data/presets/fields.json | 1 + data/presets/fields/material.json | 6 +++++ data/presets/presets.json | 3 +++ .../presets/tourism/artwork/mural.json | 22 +++++++++++++++++ .../presets/tourism/artwork/sculpture.json | 24 +++++++++++++++++++ .../presets/tourism/artwork/statue.json | 24 +++++++++++++++++++ data/taginfo.json | 22 +++++++++++++++++ dist/locales/en.json | 15 ++++++++++++ 9 files changed, 135 insertions(+) create mode 100644 data/presets/fields/material.json create mode 100644 data/presets/presets/tourism/artwork/mural.json create mode 100644 data/presets/presets/tourism/artwork/sculpture.json create mode 100644 data/presets/presets/tourism/artwork/statue.json diff --git a/data/presets.yaml b/data/presets.yaml index e26d7c53f..fecb332d4 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -895,6 +895,9 @@ en: map_type: # map_type=* label: Type + material: + # material=* + label: Material maxheight: # maxheight=* label: Max Height @@ -5896,6 +5899,21 @@ en: name: Artwork # 'terms: mural,sculpture,statue' terms: '' + tourism/artwork/mural: + # 'tourism=artwork, artwork_type=mural' + name: Mural + # 'terms: fresco,wall painting' + terms: '' + tourism/artwork/sculpture: + # 'tourism=artwork, artwork_type=sculpture' + name: Sculpture + # 'terms: statue,figure,carving' + terms: '' + tourism/artwork/statue: + # 'tourism=artwork, artwork_type=statue' + name: Statue + # 'terms: sculpture,figure,carving' + terms: '' tourism/attraction: # tourism=attraction name: Tourist Attraction diff --git a/data/presets/fields.json b/data/presets/fields.json index dbba6487e..f5adb4fa5 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -162,6 +162,7 @@ "manhole": {"key": "manhole", "type": "typeCombo", "label": "Type"}, "map_size": {"key": "map_size", "type": "typeCombo", "label": "Coverage"}, "map_type": {"key": "map_type", "type": "typeCombo", "label": "Type"}, + "material": {"key": "material", "type": "combo", "universal": true, "label": "Material"}, "maxheight": {"key": "maxheight", "type": "combo", "label": "Max Height", "placeholder": "4, 4.5, 5, 14'0\", 14'6\", 15'0\"", "snake_case": false}, "maxspeed": {"key": "maxspeed", "type": "maxspeed", "label": "Speed Limit", "placeholder": "40, 50, 60..."}, "maxspeed/advisory": {"key": "maxspeed:advisory", "type": "maxspeed", "label": "Advisory Speed Limit", "placeholder": "40, 50, 60..."}, diff --git a/data/presets/fields/material.json b/data/presets/fields/material.json new file mode 100644 index 000000000..d51fa1aac --- /dev/null +++ b/data/presets/fields/material.json @@ -0,0 +1,6 @@ +{ + "key": "material", + "type": "combo", + "universal": true, + "label": "Material" +} diff --git a/data/presets/presets.json b/data/presets/presets.json index 303469479..75e11c328 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -891,6 +891,9 @@ "tourism/apartment": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"tourism": "apartment"}, "name": "Guest Apartment / Condo"}, "tourism/aquarium": {"icon": "maki-aquarium", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["fish", "sea", "water"], "tags": {"tourism": "aquarium"}, "name": "Aquarium"}, "tourism/artwork": {"icon": "maki-art-gallery", "fields": ["name", "artwork_type", "artist"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork"}, "terms": ["mural", "sculpture", "statue"], "name": "Artwork"}, + "tourism/artwork/mural": {"icon": "maki-art-gallery", "fields": ["name", "artist"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "mural"}, "terms": ["fresco", "wall painting"], "name": "Mural"}, + "tourism/artwork/sculpture": {"icon": "maki-art-gallery", "fields": ["name", "artist", "material"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "sculpture"}, "terms": ["statue", "figure", "carving"], "name": "Sculpture"}, + "tourism/artwork/statue": {"icon": "maki-art-gallery", "fields": ["name", "artist", "material"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "statue"}, "terms": ["sculpture", "figure", "carving"], "name": "Statue"}, "tourism/attraction": {"icon": "maki-star", "fields": ["name", "operator", "address"], "geometry": ["point", "vertex", "area"], "tags": {"tourism": "attraction"}, "name": "Tourist Attraction"}, "tourism/camp_site": {"icon": "maki-campsite", "fields": ["name", "operator", "address", "access_simple", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["tent", "rv"], "tags": {"tourism": "camp_site"}, "name": "Campground"}, "tourism/caravan_site": {"icon": "maki-bus", "fields": ["name", "operator", "address", "capacity", "fee", "sanitary_dump_station", "power_supply", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["Motor Home", "Camper"], "tags": {"tourism": "caravan_site"}, "name": "RV Park"}, diff --git a/data/presets/presets/tourism/artwork/mural.json b/data/presets/presets/tourism/artwork/mural.json new file mode 100644 index 000000000..c22482776 --- /dev/null +++ b/data/presets/presets/tourism/artwork/mural.json @@ -0,0 +1,22 @@ +{ + "icon": "maki-art-gallery", + "fields": [ + "name", + "artist" + ], + "geometry": [ + "point", + "vertex", + "line", + "area" + ], + "tags": { + "tourism": "artwork", + "artwork_type": "mural" + }, + "terms": [ + "fresco", + "wall painting" + ], + "name": "Mural" +} diff --git a/data/presets/presets/tourism/artwork/sculpture.json b/data/presets/presets/tourism/artwork/sculpture.json new file mode 100644 index 000000000..fbad11c4a --- /dev/null +++ b/data/presets/presets/tourism/artwork/sculpture.json @@ -0,0 +1,24 @@ +{ + "icon": "maki-art-gallery", + "fields": [ + "name", + "artist", + "material" + ], + "geometry": [ + "point", + "vertex", + "line", + "area" + ], + "tags": { + "tourism": "artwork", + "artwork_type": "sculpture" + }, + "terms": [ + "statue", + "figure", + "carving" + ], + "name": "Sculpture" +} diff --git a/data/presets/presets/tourism/artwork/statue.json b/data/presets/presets/tourism/artwork/statue.json new file mode 100644 index 000000000..9ae8f2d97 --- /dev/null +++ b/data/presets/presets/tourism/artwork/statue.json @@ -0,0 +1,24 @@ +{ + "icon": "maki-art-gallery", + "fields": [ + "name", + "artist", + "material" + ], + "geometry": [ + "point", + "vertex", + "line", + "area" + ], + "tags": { + "tourism": "artwork", + "artwork_type": "statue" + }, + "terms": [ + "sculpture", + "figure", + "carving" + ], + "name": "Statue" +} diff --git a/data/taginfo.json b/data/taginfo.json index 166e9e314..13fbcd418 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -5836,6 +5836,27 @@ "object_types": ["node", "way", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/art-gallery-15.svg?sanitize=true" }, + { + "key": "artwork_type", + "value": "mural", + "description": "Mural", + "object_types": ["node", "way", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/art-gallery-15.svg?sanitize=true" + }, + { + "key": "artwork_type", + "value": "sculpture", + "description": "Sculpture", + "object_types": ["node", "way", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/art-gallery-15.svg?sanitize=true" + }, + { + "key": "artwork_type", + "value": "statue", + "description": "Statue", + "object_types": ["node", "way", "area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/art-gallery-15.svg?sanitize=true" + }, { "key": "tourism", "value": "attraction", @@ -6766,6 +6787,7 @@ {"key": "location", "description": "Location"}, {"key": "map_size", "description": "Coverage"}, {"key": "map_type", "description": "Type"}, + {"key": "material", "description": "Material"}, {"key": "maxheight", "description": "Max Height"}, {"key": "maxspeed", "description": "Speed Limit"}, {"key": "maxspeed:advisory", "description": "Advisory Speed Limit"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 61a0c74ed..e20f6e26a 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -2227,6 +2227,9 @@ "map_type": { "label": "Type" }, + "material": { + "label": "Material" + }, "maxheight": { "label": "Max Height", "placeholder": "4, 4.5, 5, 14'0\", 14'6\", 15'0\"" @@ -6591,6 +6594,18 @@ "name": "Artwork", "terms": "mural,sculpture,statue" }, + "tourism/artwork/mural": { + "name": "Mural", + "terms": "fresco,wall painting" + }, + "tourism/artwork/sculpture": { + "name": "Sculpture", + "terms": "statue,figure,carving" + }, + "tourism/artwork/statue": { + "name": "Statue", + "terms": "sculpture,figure,carving" + }, "tourism/attraction": { "name": "Tourist Attraction", "terms": "" From 6e7b34d39ab594c13bd4cddbf878c462ff9ef538 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Sun, 16 Sep 2018 20:26:41 -0700 Subject: [PATCH 209/217] Adds the Operator, Country, Lit, Height, and new Flag Type fields to the Flagpole preset --- data/presets.yaml | 3 +++ data/presets/fields.json | 1 + data/presets/fields/flag_type.json | 5 +++++ data/presets/presets.json | 2 +- data/presets/presets/man_made/flagpole.json | 7 +++++++ data/taginfo.json | 1 + dist/locales/en.json | 3 +++ 7 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 data/presets/fields/flag_type.json diff --git a/data/presets.yaml b/data/presets.yaml index e26d7c53f..59be78908 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -601,6 +601,9 @@ en: fixme: # fixme=* label: Fix Me + flag_type: + # 'flag:type=*' + label: Flag Type ford: # ford=* label: Type diff --git a/data/presets/fields.json b/data/presets/fields.json index dbba6487e..2295f12f5 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -102,6 +102,7 @@ "fireplace": {"key": "fireplace", "type": "check", "label": "Fireplace"}, "fitness_station": {"key": "fitness_station", "type": "typeCombo", "label": "Equipment Type"}, "fixme": {"key": "fixme", "type": "textarea", "label": "Fix Me", "universal": true}, + "flag_type": {"key": "flag:type", "type": "combo", "label": "Flag Type"}, "ford": {"key": "ford", "type": "typeCombo", "label": "Type", "placeholder": "Default"}, "frequency": {"key": "frequency", "type": "combo", "label": "Operating Frequency"}, "fuel_multi": {"key": "fuel:", "type": "multiCombo", "label": "Fuel Types"}, diff --git a/data/presets/fields/flag_type.json b/data/presets/fields/flag_type.json new file mode 100644 index 000000000..9f9978a49 --- /dev/null +++ b/data/presets/fields/flag_type.json @@ -0,0 +1,5 @@ +{ + "key": "flag:type", + "type": "combo", + "label": "Flag Type" +} diff --git a/data/presets/presets.json b/data/presets/presets.json index 303469479..ad053bc94 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -544,7 +544,7 @@ "man_made/clearcut": {"icon": "maki-logging", "geometry": ["area"], "tags": {"man_made": "clearcut"}, "terms": ["cut", "forest", "lumber", "tree", "wood"], "name": "Clearcut Forest"}, "man_made/crane": {"icon": "temaki-crane", "fields": ["operator", "height", "crane/type"], "geometry": ["point", "line", "vertex", "area"], "tags": {"man_made": "crane"}, "name": "Crane"}, "man_made/cutline": {"icon": "maki-logging", "geometry": ["line"], "tags": {"man_made": "cutline"}, "name": "Cut line"}, - "man_made/flagpole": {"icon": "maki-embassy", "geometry": ["point"], "tags": {"man_made": "flagpole"}, "name": "Flagpole"}, + "man_made/flagpole": {"icon": "maki-embassy", "fields": ["operator", "flag_type", "country", "lit", "height"], "geometry": ["point"], "tags": {"man_made": "flagpole"}, "name": "Flagpole"}, "man_made/gasometer": {"icon": "temaki-storage_tank", "fields": ["content", "building_area"], "geometry": ["point", "area"], "terms": ["gas holder"], "tags": {"man_made": "gasometer"}, "name": "Gasometer"}, "man_made/groyne": {"geometry": ["line", "area"], "tags": {"man_made": "groyne"}, "name": "Groyne"}, "man_made/lighthouse": {"icon": "maki-lighthouse", "fields": ["building_area"], "geometry": ["point", "area"], "tags": {"man_made": "lighthouse"}, "name": "Lighthouse"}, diff --git a/data/presets/presets/man_made/flagpole.json b/data/presets/presets/man_made/flagpole.json index 19472e84d..f625581df 100644 --- a/data/presets/presets/man_made/flagpole.json +++ b/data/presets/presets/man_made/flagpole.json @@ -1,5 +1,12 @@ { "icon": "maki-embassy", + "fields": [ + "operator", + "flag_type", + "country", + "lit", + "height" + ], "geometry": [ "point" ], diff --git a/data/taginfo.json b/data/taginfo.json index 166e9e314..0aa2a0afb 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -6647,6 +6647,7 @@ {"key": "fireplace", "description": "Fireplace"}, {"key": "fitness_station", "description": "Equipment Type"}, {"key": "fixme", "description": "Fix Me"}, + {"key": "flag:type", "description": "Flag Type"}, {"key": "ford", "description": "Type"}, {"key": "frequency", "description": "Operating Frequency"}, {"key": "fuel:", "description": "Fuel Types"}, diff --git a/dist/locales/en.json b/dist/locales/en.json index 61a0c74ed..aaebd403d 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1972,6 +1972,9 @@ "fixme": { "label": "Fix Me" }, + "flag_type": { + "label": "Flag Type" + }, "ford": { "label": "Type", "placeholder": "Default" From abdcf19773c7dbdcd24abd36e5b12e4da9b79a97 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Sun, 16 Sep 2018 20:32:43 -0700 Subject: [PATCH 210/217] Adds the vertex geometry type to the Flagpole preset --- data/presets/presets.json | 2 +- data/presets/presets/man_made/flagpole.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index ad053bc94..16da6a61d 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -544,7 +544,7 @@ "man_made/clearcut": {"icon": "maki-logging", "geometry": ["area"], "tags": {"man_made": "clearcut"}, "terms": ["cut", "forest", "lumber", "tree", "wood"], "name": "Clearcut Forest"}, "man_made/crane": {"icon": "temaki-crane", "fields": ["operator", "height", "crane/type"], "geometry": ["point", "line", "vertex", "area"], "tags": {"man_made": "crane"}, "name": "Crane"}, "man_made/cutline": {"icon": "maki-logging", "geometry": ["line"], "tags": {"man_made": "cutline"}, "name": "Cut line"}, - "man_made/flagpole": {"icon": "maki-embassy", "fields": ["operator", "flag_type", "country", "lit", "height"], "geometry": ["point"], "tags": {"man_made": "flagpole"}, "name": "Flagpole"}, + "man_made/flagpole": {"icon": "maki-embassy", "fields": ["operator", "flag_type", "country", "lit", "height"], "geometry": ["point", "vertex"], "tags": {"man_made": "flagpole"}, "name": "Flagpole"}, "man_made/gasometer": {"icon": "temaki-storage_tank", "fields": ["content", "building_area"], "geometry": ["point", "area"], "terms": ["gas holder"], "tags": {"man_made": "gasometer"}, "name": "Gasometer"}, "man_made/groyne": {"geometry": ["line", "area"], "tags": {"man_made": "groyne"}, "name": "Groyne"}, "man_made/lighthouse": {"icon": "maki-lighthouse", "fields": ["building_area"], "geometry": ["point", "area"], "tags": {"man_made": "lighthouse"}, "name": "Lighthouse"}, diff --git a/data/presets/presets/man_made/flagpole.json b/data/presets/presets/man_made/flagpole.json index f625581df..06aaac079 100644 --- a/data/presets/presets/man_made/flagpole.json +++ b/data/presets/presets/man_made/flagpole.json @@ -8,7 +8,8 @@ "height" ], "geometry": [ - "point" + "point", + "vertex" ], "tags": { "man_made": "flagpole" From f8d6a302602f1730fbad5b94db3c02bf8ec6d19c Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sun, 16 Sep 2018 08:06:51 +0000 Subject: [PATCH 211/217] chore(package): update rollup to version 0.66.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4ff210e6b..72409cb2c 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "osm-community-index": "0.4.7", "phantomjs-prebuilt": "~2.1.11", "request": "^2.85.0", - "rollup": "~0.65.0", + "rollup": "~0.66.0", "rollup-plugin-commonjs": "^9.0.0", "rollup-plugin-includepaths": "~0.2.3", "rollup-plugin-json": "^3.0.0", From 73e70ef6f4877601ed2b6e7d45728d1520769625 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 12 Sep 2018 20:48:40 +0000 Subject: [PATCH 212/217] fix(package): update lodash-es to version 4.17.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 72409cb2c..3f900b44d 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@turf/bbox-clip": "^6.0.0", "diacritics": "1.3.0", "fast-json-stable-stringify": "2.0.0", - "lodash-es": "4.17.10", + "lodash-es": "4.17.11", "marked": "0.5.0", "martinez-polygon-clipping": "0.5.0", "node-diff3": "1.0.0", From 5b482d1ad45f9bcd0e796c3cefd4b5d0030af0fe Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Mon, 17 Sep 2018 16:44:21 -0700 Subject: [PATCH 213/217] Renames and moves flag_type.json preset field file to flag/type.json --- data/presets.yaml | 2 +- data/presets/fields.json | 2 +- data/presets/fields/{flag_type.json => flag/type.json} | 0 data/presets/presets.json | 2 +- data/presets/presets/man_made/flagpole.json | 2 +- dist/locales/en.json | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) rename data/presets/fields/{flag_type.json => flag/type.json} (100%) diff --git a/data/presets.yaml b/data/presets.yaml index ab91773a9..b53699769 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -601,7 +601,7 @@ en: fixme: # fixme=* label: Fix Me - flag_type: + flag/type: # 'flag:type=*' label: Flag Type ford: diff --git a/data/presets/fields.json b/data/presets/fields.json index db79b5b4d..4abeb8afc 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -102,7 +102,7 @@ "fireplace": {"key": "fireplace", "type": "check", "label": "Fireplace"}, "fitness_station": {"key": "fitness_station", "type": "typeCombo", "label": "Equipment Type"}, "fixme": {"key": "fixme", "type": "textarea", "label": "Fix Me", "universal": true}, - "flag_type": {"key": "flag:type", "type": "combo", "label": "Flag Type"}, + "flag/type": {"key": "flag:type", "type": "combo", "label": "Flag Type"}, "ford": {"key": "ford", "type": "typeCombo", "label": "Type", "placeholder": "Default"}, "frequency": {"key": "frequency", "type": "combo", "label": "Operating Frequency"}, "fuel_multi": {"key": "fuel:", "type": "multiCombo", "label": "Fuel Types"}, diff --git a/data/presets/fields/flag_type.json b/data/presets/fields/flag/type.json similarity index 100% rename from data/presets/fields/flag_type.json rename to data/presets/fields/flag/type.json diff --git a/data/presets/presets.json b/data/presets/presets.json index 4365dd31e..9e2d1cb92 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -545,7 +545,7 @@ "man_made/clearcut": {"icon": "maki-logging", "geometry": ["area"], "tags": {"man_made": "clearcut"}, "terms": ["cut", "forest", "lumber", "tree", "wood"], "name": "Clearcut Forest"}, "man_made/crane": {"icon": "temaki-crane", "fields": ["operator", "height", "crane/type"], "geometry": ["point", "line", "vertex", "area"], "tags": {"man_made": "crane"}, "name": "Crane"}, "man_made/cutline": {"icon": "maki-logging", "geometry": ["line"], "tags": {"man_made": "cutline"}, "name": "Cut line"}, - "man_made/flagpole": {"icon": "maki-embassy", "fields": ["operator", "flag_type", "country", "lit", "height"], "geometry": ["point", "vertex"], "tags": {"man_made": "flagpole"}, "name": "Flagpole"}, + "man_made/flagpole": {"icon": "maki-embassy", "fields": ["operator", "flag/type", "country", "lit", "height"], "geometry": ["point", "vertex"], "tags": {"man_made": "flagpole"}, "name": "Flagpole"}, "man_made/gasometer": {"icon": "temaki-storage_tank", "fields": ["content", "building_area"], "geometry": ["point", "area"], "terms": ["gas holder"], "tags": {"man_made": "gasometer"}, "name": "Gasometer"}, "man_made/groyne": {"geometry": ["line", "area"], "tags": {"man_made": "groyne"}, "name": "Groyne"}, "man_made/lighthouse": {"icon": "maki-lighthouse", "fields": ["building_area"], "geometry": ["point", "area"], "tags": {"man_made": "lighthouse"}, "name": "Lighthouse"}, diff --git a/data/presets/presets/man_made/flagpole.json b/data/presets/presets/man_made/flagpole.json index 06aaac079..8cac99475 100644 --- a/data/presets/presets/man_made/flagpole.json +++ b/data/presets/presets/man_made/flagpole.json @@ -2,7 +2,7 @@ "icon": "maki-embassy", "fields": [ "operator", - "flag_type", + "flag/type", "country", "lit", "height" diff --git a/dist/locales/en.json b/dist/locales/en.json index 31c5467b1..9583a6727 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -1972,7 +1972,7 @@ "fixme": { "label": "Fix Me" }, - "flag_type": { + "flag/type": { "label": "Flag Type" }, "ford": { From 053c24eca7c9fd18c69171fe644df85252c8eff7 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Mon, 17 Sep 2018 16:53:30 -0700 Subject: [PATCH 214/217] Adds the reference property to the Sculpture, Statue, and Mural presets --- data/presets/presets.json | 6 +++--- data/presets/presets/tourism/artwork/mural.json | 4 ++++ data/presets/presets/tourism/artwork/sculpture.json | 4 ++++ data/presets/presets/tourism/artwork/statue.json | 4 ++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/data/presets/presets.json b/data/presets/presets.json index 75e11c328..c28ca3880 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -891,9 +891,9 @@ "tourism/apartment": {"icon": "maki-lodging", "fields": ["name", "operator", "address", "building_area", "smoking", "rooms", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "area"], "tags": {"tourism": "apartment"}, "name": "Guest Apartment / Condo"}, "tourism/aquarium": {"icon": "maki-aquarium", "fields": ["name", "operator", "address", "building_area", "opening_hours"], "geometry": ["point", "area"], "terms": ["fish", "sea", "water"], "tags": {"tourism": "aquarium"}, "name": "Aquarium"}, "tourism/artwork": {"icon": "maki-art-gallery", "fields": ["name", "artwork_type", "artist"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork"}, "terms": ["mural", "sculpture", "statue"], "name": "Artwork"}, - "tourism/artwork/mural": {"icon": "maki-art-gallery", "fields": ["name", "artist"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "mural"}, "terms": ["fresco", "wall painting"], "name": "Mural"}, - "tourism/artwork/sculpture": {"icon": "maki-art-gallery", "fields": ["name", "artist", "material"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "sculpture"}, "terms": ["statue", "figure", "carving"], "name": "Sculpture"}, - "tourism/artwork/statue": {"icon": "maki-art-gallery", "fields": ["name", "artist", "material"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "statue"}, "terms": ["sculpture", "figure", "carving"], "name": "Statue"}, + "tourism/artwork/mural": {"icon": "maki-art-gallery", "fields": ["name", "artist"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "mural"}, "reference": {"key": "artwork_type", "value": "mural"}, "terms": ["fresco", "wall painting"], "name": "Mural"}, + "tourism/artwork/sculpture": {"icon": "maki-art-gallery", "fields": ["name", "artist", "material"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "sculpture"}, "reference": {"key": "artwork_type", "value": "sculpture"}, "terms": ["statue", "figure", "carving"], "name": "Sculpture"}, + "tourism/artwork/statue": {"icon": "maki-art-gallery", "fields": ["name", "artist", "material"], "geometry": ["point", "vertex", "line", "area"], "tags": {"tourism": "artwork", "artwork_type": "statue"}, "reference": {"key": "artwork_type", "value": "statue"}, "terms": ["sculpture", "figure", "carving"], "name": "Statue"}, "tourism/attraction": {"icon": "maki-star", "fields": ["name", "operator", "address"], "geometry": ["point", "vertex", "area"], "tags": {"tourism": "attraction"}, "name": "Tourist Attraction"}, "tourism/camp_site": {"icon": "maki-campsite", "fields": ["name", "operator", "address", "access_simple", "capacity", "fee", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["tent", "rv"], "tags": {"tourism": "camp_site"}, "name": "Campground"}, "tourism/caravan_site": {"icon": "maki-bus", "fields": ["name", "operator", "address", "capacity", "fee", "sanitary_dump_station", "power_supply", "internet_access", "internet_access/fee", "internet_access/ssid"], "geometry": ["point", "vertex", "area"], "terms": ["Motor Home", "Camper"], "tags": {"tourism": "caravan_site"}, "name": "RV Park"}, diff --git a/data/presets/presets/tourism/artwork/mural.json b/data/presets/presets/tourism/artwork/mural.json index c22482776..311f84674 100644 --- a/data/presets/presets/tourism/artwork/mural.json +++ b/data/presets/presets/tourism/artwork/mural.json @@ -14,6 +14,10 @@ "tourism": "artwork", "artwork_type": "mural" }, + "reference": { + "key": "artwork_type", + "value": "mural" + }, "terms": [ "fresco", "wall painting" diff --git a/data/presets/presets/tourism/artwork/sculpture.json b/data/presets/presets/tourism/artwork/sculpture.json index fbad11c4a..7bb073958 100644 --- a/data/presets/presets/tourism/artwork/sculpture.json +++ b/data/presets/presets/tourism/artwork/sculpture.json @@ -15,6 +15,10 @@ "tourism": "artwork", "artwork_type": "sculpture" }, + "reference": { + "key": "artwork_type", + "value": "sculpture" + }, "terms": [ "statue", "figure", diff --git a/data/presets/presets/tourism/artwork/statue.json b/data/presets/presets/tourism/artwork/statue.json index 9ae8f2d97..ed875c493 100644 --- a/data/presets/presets/tourism/artwork/statue.json +++ b/data/presets/presets/tourism/artwork/statue.json @@ -15,6 +15,10 @@ "tourism": "artwork", "artwork_type": "statue" }, + "reference": { + "key": "artwork_type", + "value": "statue" + }, "terms": [ "sculpture", "figure", From 6dde807c5c730846924da4d92ac1723ab43b3b7a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Wed, 19 Sep 2018 01:39:37 -0400 Subject: [PATCH 215/217] Update to svg-sprite v1.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f900b44d..2771e9fcd 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "sinon": "^6.0.0", "sinon-chai": "^3.1.0", "smash": "0.0", - "svg-sprite": "1.4.0", + "svg-sprite": "1.5.0", "temaki": "1.0.0", "uglify-js": "~3.4.0", "xml2js": "^0.4.17", From c39876208f842b4d25f99364ae14a26e4b0226af Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 20 Sep 2018 13:35:59 +0000 Subject: [PATCH 216/217] chore(package): update mapillary-js to version 2.13.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2771e9fcd..97fe96919 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "js-yaml": "^3.9.0", "json-stringify-pretty-compact": "^1.1.0", "jsonschema": "^1.1.0", - "mapillary-js": "2.12.1", + "mapillary-js": "2.13.0", "mapillary_sprite_source": "^1.5.0", "minimist": "^1.2.0", "mocha": "^5.0.0", From 85383c314d1c500268851d6de8da9b93e556edcd Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 23 Sep 2018 11:13:41 -0400 Subject: [PATCH 217/217] Change "Pavilion" from an `amenity=shelter` to a `building=pavilion` (closes #5325) https://wiki.openstreetmap.org/wiki/Tag:building%3Dpavilion --- data/presets.yaml | 9 ++++---- data/presets/presets.json | 2 +- .../presets/amenity/shelter/pavilion.json | 19 ----------------- data/presets/presets/building/pavilion.json | 21 +++++++++++++++++++ data/taginfo.json | 14 ++++++------- dist/locales/en.json | 8 +++---- 6 files changed, 38 insertions(+), 35 deletions(-) delete mode 100644 data/presets/presets/amenity/shelter/pavilion.json create mode 100644 data/presets/presets/building/pavilion.json diff --git a/data/presets.yaml b/data/presets.yaml index de51982fd..f9649c76e 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -2459,10 +2459,6 @@ en: # 'amenity=shelter, shelter_type=lean_to' name: Lean-To terms: '' - amenity/shelter/pavilion: - # 'amenity=shelter, shelter_type=pavilion' - name: Pavilion - terms: '' amenity/shower: # amenity=shower name: Shower @@ -2944,6 +2940,11 @@ en: # building=mosque name: Mosque Building terms: '' + building/pavilion: + # building=pavilion + name: Pavilion Building + # 'terms: sports' + terms: '' building/public: # building=public name: Public Building diff --git a/data/presets/presets.json b/data/presets/presets.json index 0abf2e2f7..1279817ff 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -131,7 +131,6 @@ "amenity/shelter": {"icon": "maki-shelter", "fields": ["name", "shelter_type", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "terms": ["lean-to", "gazebo", "picnic"], "tags": {"amenity": "shelter"}, "name": "Shelter"}, "amenity/shelter/gazebo": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "lit"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "gazebo"}, "name": "Gazebo"}, "amenity/shelter/lean_to": {"icon": "maki-shelter", "fields": ["name", "operator", "building_area"], "geometry": ["point", "area"], "tags": {"amenity": "shelter", "shelter_type": "lean_to"}, "name": "Lean-To"}, - "amenity/shelter/pavilion": {"icon": "maki-shelter", "fields": ["name", "building_area", "bench", "bin"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "shelter", "shelter_type": "pavilion"}, "name": "Pavilion"}, "amenity/shower": {"icon": "temaki-shower", "fields": ["operator", "opening_hours", "fee", "supervised", "building_area", "access_simple"], "geometry": ["point", "vertex", "area"], "terms": ["rain closet"], "tags": {"amenity": "shower"}, "name": "Shower"}, "amenity/smoking_area": {"icon": "fas-smoking", "fields": ["name", "shelter", "bin", "bench", "opening_hours"], "geometry": ["point", "vertex", "area"], "terms": [], "tags": {"amenity": "smoking_area"}, "name": "Smoking Area"}, "amenity/social_facility": {"icon": "temaki-social_facility", "fields": ["name", "operator", "address", "building_area", "social_facility", "social_facility_for", "opening_hours", "wheelchair"], "geometry": ["point", "area"], "terms": [], "tags": {"amenity": "social_facility"}, "name": "Social Facility"}, @@ -240,6 +239,7 @@ "building/industrial": {"icon": "maki-industry", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "industrial"}, "matchScore": 0.5, "name": "Industrial Building"}, "building/kindergarten": {"icon": "maki-building", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "terms": ["kindergarden", "pre-school"], "tags": {"building": "kindergarten"}, "matchScore": 0.5, "name": "Preschool/Kindergarten Building"}, "building/mosque": {"icon": "maki-place-of-worship", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "mosque"}, "matchScore": 0.5, "name": "Mosque Building"}, + "building/pavilion": {"icon": "maki-building", "fields": ["name", "address", "levels", "height", "smoking"], "geometry": ["area"], "terms": ["sports"], "tags": {"building": "pavilion"}, "matchScore": 0.5, "name": "Pavilion Building"}, "building/public": {"icon": "maki-building", "fields": ["name", "address", "levels", "height", "smoking"], "geometry": ["area"], "tags": {"building": "public"}, "matchScore": 0.5, "name": "Public Building"}, "building/residential": {"icon": "maki-residential-community", "fields": ["name", "address", "levels", "height"], "geometry": ["area"], "tags": {"building": "residential"}, "matchScore": 0.5, "name": "Residential Building"}, "building/retail": {"icon": "maki-commercial", "fields": ["name", "address", "levels", "height", "smoking"], "geometry": ["area"], "tags": {"building": "retail"}, "matchScore": 0.5, "name": "Retail Building"}, diff --git a/data/presets/presets/amenity/shelter/pavilion.json b/data/presets/presets/amenity/shelter/pavilion.json deleted file mode 100644 index ad8474d34..000000000 --- a/data/presets/presets/amenity/shelter/pavilion.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "icon": "maki-shelter", - "fields": [ - "name", - "building_area", - "bench", - "bin" - ], - "geometry": [ - "point", - "vertex", - "area" - ], - "tags": { - "amenity": "shelter", - "shelter_type": "pavilion" - }, - "name": "Pavilion" -} diff --git a/data/presets/presets/building/pavilion.json b/data/presets/presets/building/pavilion.json new file mode 100644 index 000000000..b2fcf810d --- /dev/null +++ b/data/presets/presets/building/pavilion.json @@ -0,0 +1,21 @@ +{ + "icon": "maki-building", + "fields": [ + "name", + "address", + "levels", + "height", + "smoking" + ], + "geometry": [ + "area" + ], + "terms": [ + "sports" + ], + "tags": { + "building": "pavilion" + }, + "matchScore": 0.5, + "name": "Pavilion Building" +} diff --git a/data/taginfo.json b/data/taginfo.json index 431b11e5d..82ac1505c 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -889,13 +889,6 @@ "object_types": ["node", "area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" }, - { - "key": "shelter_type", - "value": "pavilion", - "description": "Pavilion", - "object_types": ["node", "area"], - "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/shelter-15.svg?sanitize=true" - }, { "key": "amenity", "value": "shower", @@ -1636,6 +1629,13 @@ "object_types": ["area"], "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/place-of-worship-15.svg?sanitize=true" }, + { + "key": "building", + "value": "pavilion", + "description": "Pavilion Building", + "object_types": ["area"], + "icon_url": "https://raw.githubusercontent.com/mapbox/maki/master/icons/building-15.svg?sanitize=true" + }, { "key": "building", "value": "public", diff --git a/dist/locales/en.json b/dist/locales/en.json index 1dab04fda..568d3977e 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -3569,10 +3569,6 @@ "name": "Lean-To", "terms": "" }, - "amenity/shelter/pavilion": { - "name": "Pavilion", - "terms": "" - }, "amenity/shower": { "name": "Shower", "terms": "rain closet" @@ -4005,6 +4001,10 @@ "name": "Mosque Building", "terms": "" }, + "building/pavilion": { + "name": "Pavilion Building", + "terms": "sports" + }, "building/public": { "name": "Public Building", "terms": ""