Merge branch 'develop' into feature/professional

This commit is contained in:
Pieter Vander Vennet 2021-11-25 01:22:52 +01:00
commit b84b40a500
52 changed files with 33741 additions and 1118 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

View file

@ -39,6 +39,15 @@ def createBar(options):
pyplot.legend() pyplot.legend()
def createLine(options):
data = options["plot"]["count"]
keys = genKeys(data, options["interpetKeysAs"])
values = list(map(lambda kv: kv["value"], data))
pyplot.plot(keys, values, label=options["name"])
pyplot.legend()
pyplot_init() pyplot_init()
title = sys.argv[1] title = sys.argv[1]
pyplot.title = title pyplot.title = title
@ -59,5 +68,8 @@ while (True):
createPie(options) createPie(options)
elif (options["plot"]["type"] == "bar"): elif (options["plot"]["type"] == "bar"):
createBar(options) createBar(options)
elif (options["plot"]["type"] == "line"):
createLine(options)
else: else:
print("Unkown type: " + options.type) print("Unkown type: " + options.type)
print("Plot generated")

View file

@ -179,7 +179,7 @@ interface PlotSpec {
name: string, name: string,
interpetKeysAs: "date" | "number" | "string" | string interpetKeysAs: "date" | "number" | "string" | string
plot: { plot: {
type: "pie" | "bar" type: "pie" | "bar" | "line"
count: { key: string, value: number }[] count: { key: string, value: number }[]
} | { } | {
type: "stacked-bar" type: "stacked-bar"
@ -196,6 +196,7 @@ interface PlotSpec {
function createGraph( function createGraph(
title: string, title: string,
...options: PlotSpec[]) { ...options: PlotSpec[]) {
console.log("Creating graph",title,"...")
const process = exec("python3 GenPlot.py \"graphs/" + title + "\"", ((error, stdout, stderr) => { const process = exec("python3 GenPlot.py \"graphs/" + title + "\"", ((error, stdout, stderr) => {
console.log("Python: ", stdout) console.log("Python: ", stdout)
if (error !== null) { if (error !== null) {
@ -207,7 +208,8 @@ function createGraph(
})) }))
for (const option of options) { for (const option of options) {
process.stdin._write(JSON.stringify(option) + "\n", "utf-8", undefined) const d = JSON.stringify(option) + "\n"
process.stdin._write(d, "utf-8", undefined)
} }
process.stdin._write("\n", "utf-8", undefined) process.stdin._write("\n", "utf-8", undefined)
@ -229,6 +231,7 @@ class Histogram<K> {
} }
public bump(key: K, increase = 1) { public bump(key: K, increase = 1) {
if (this.counts.has(key)) { if (this.counts.has(key)) {
this.counts.set(key, increase + this.counts.get(key)) this.counts.set(key, increase + this.counts.get(key))
} else { } else {
@ -324,6 +327,20 @@ class Histogram<K> {
return hist return hist
} }
public asRunningAverages(convertToRange: ((key: K) => K[])) {
const newCount = new Histogram<K>()
const self = this
this.counts.forEach((_, key) => {
const keysToCheck = convertToRange(key)
let sum = 0
for (const k of keysToCheck) {
sum += self.counts.get(k) ?? 0
}
newCount.bump(key, sum / keysToCheck.length)
})
return newCount
}
/** /**
* Given a histogram: * Given a histogram:
* 'a': 3 * 'a': 3
@ -402,6 +419,15 @@ class Histogram<K> {
return spec; return spec;
} }
public asLine(options: {
name: string
compare?: (a: K, b: K) => number
}) {
const spec = this.asPie(options)
spec.plot.type = "line"
return spec
}
} }
class Group<K, V> { class Group<K, V> {
@ -506,7 +532,8 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
hist hist
.createOthersCategory("other", 20) .createOthersCategory("other", 20)
.addCountToName() .addCountToName()
.asBar({name: "Changesets per theme (bar)" + appliedFilterDescription}).render() .asBar({name: "Changesets per theme (bar)" + appliedFilterDescription})
.render()
new Histogram<string>(allFeatures.map(f => f.properties.user)) new Histogram<string>(allFeatures.map(f => f.properties.user))
@ -516,7 +543,33 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
{ {
compare: (a, b) => Number(a) - Number(b), compare: (a, b) => Number(a) - Number(b),
name: "Contributors per changeset count" + appliedFilterDescription name: "Contributors per changeset count" + appliedFilterDescription
}).render() })
.render()
const csPerDay = new Histogram<string>(allFeatures.map(f => f.properties.date.substr(0, 10)))
const perDayLine = csPerDay
.keyToDate()
.asLine({
compare: (a, b) => a.getTime() - b.getTime(),
name: "Changesets per day" + appliedFilterDescription
})
const perDayAvg = csPerDay.asRunningAverages(key => {
const keys = []
for (let i = 0; i < 7; i++) {
const otherDay = new Date(new Date(key).getTime() - i * 1000 * 60 * 60 * 24)
keys.push(otherDay.toISOString().substr(0, 10))
}
return keys
})
.keyToDate()
.asLine({
compare: (a, b) => a.getTime() - b.getTime(),
name: "Running weekly average" + appliedFilterDescription
})
createGraph("Changesets per day (line)" + appliedFilterDescription, perDayLine, perDayAvg)
new Histogram<string>(allFeatures.map(f => f.properties.metadata.host)) new Histogram<string>(allFeatures.map(f => f.properties.metadata.host))
.asPie({ .asPie({
@ -588,8 +641,25 @@ function createGraphs(allFeatures: ChangeSetData[], appliedFilterDescription: st
} }
function createMiscGraphs(allFeatures: ChangeSetData[], emptyCS: ChangeSetData[]) {
new Histogram(emptyCS.map(f => f.properties.date)).keyToDate().asBar({
name: "Empty changesets by date"
}).render()
const geojson = {
type: "FeatureCollection",
features: allFeatures.map(f => {
try {
return GeoOperations.centerpoint(f.geometry);
} catch (e) {
console.error("Could not create center point: ", e, f)
}
})
}
writeFileSync("centerpoints.geojson", JSON.stringify(geojson, undefined, 2))
}
new StatsDownloader("stats").DownloadStats()
// new StatsDownloader("stats").DownloadStats()
const allPaths = readdirSync("stats") const allPaths = readdirSync("stats")
.filter(p => p.startsWith("stats.") && p.endsWith(".json")); .filter(p => p.startsWith("stats.") && p.endsWith(".json"));
let allFeatures: ChangeSetData[] = [].concat(...allPaths let allFeatures: ChangeSetData[] = [].concat(...allPaths
@ -599,25 +669,7 @@ let allFeatures: ChangeSetData[] = [].concat(...allPaths
const emptyCS = allFeatures.filter(f => f.properties.metadata.theme === "EMPTY CS") const emptyCS = allFeatures.filter(f => f.properties.metadata.theme === "EMPTY CS")
allFeatures = allFeatures.filter(f => f.properties.metadata.theme !== "EMPTY CS") allFeatures = allFeatures.filter(f => f.properties.metadata.theme !== "EMPTY CS")
new Histogram(emptyCS.map(f => f.properties.date)).keyToDate().asBar({ createMiscGraphs(allFeatures, emptyCS)
name: "Empty changesets by date"
}).render()
const geojson = {
type: "FeatureCollection",
features: allFeatures.map(f => {
try {
return GeoOperations.centerpoint(f.geometry);
} catch (e) {
console.error("Could not create center point: ", e, f)
}
})
}
writeFileSync("centerpoints.geojson", JSON.stringify(geojson, undefined, 2))
createGraphs(allFeatures, "") createGraphs(allFeatures, "")
createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2020")), " in 2020") createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2020")), " in 2020")
createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2021")), " in 2021") createGraphs(allFeatures.filter(f => f.properties.date.startsWith("2021")), " in 2021")

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 KiB

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 518 KiB

After

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 546 KiB

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 707 KiB

After

Width:  |  Height:  |  Size: 769 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 731 KiB

After

Width:  |  Height:  |  Size: 787 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 445 KiB

After

Width:  |  Height:  |  Size: 485 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 468 KiB

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 KiB

After

Width:  |  Height:  |  Size: 525 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 KiB

After

Width:  |  Height:  |  Size: 571 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 100 KiB

File diff suppressed because it is too large Load diff

View file

@ -75,7 +75,7 @@ export default class FeaturePipeline {
.map(ch => ch.changes) .map(ch => ch.changes)
.filter(coor => coor["lat"] !== undefined && coor["lon"] !== undefined) .filter(coor => coor["lat"] !== undefined && coor["lon"] !== undefined)
.forEach(coor => { .forEach(coor => {
state.layoutToUse.layers.forEach(l => self.localStorageSavers.get(l.id).poison(coor["lon"], coor["lat"])) state.layoutToUse.layers.forEach(l => self.localStorageSavers.get(l.id)?.poison(coor["lon"], coor["lat"]))
}) })
}) })
@ -210,7 +210,11 @@ export default class FeaturePipeline {
handleTile: tile => { handleTile: tile => {
new RegisteringAllFromFeatureSourceActor(tile) new RegisteringAllFromFeatureSourceActor(tile)
if (tile.layer.layerDef.maxAgeOfCache > 0) { if (tile.layer.layerDef.maxAgeOfCache > 0) {
self.localStorageSavers.get(tile.layer.layerDef.id).addTile(tile) const saver = self.localStorageSavers.get(tile.layer.layerDef.id)
if(saver === undefined){
console.error("No localStorageSaver found for layer ",tile.layer.layerDef.id)
}
saver?.addTile(tile)
} }
perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile) perLayerHierarchy.get(tile.layer.layerDef.id).registerTile(tile)
tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
@ -223,9 +227,8 @@ export default class FeaturePipeline {
if (layer.maxAgeOfCache > 0) { if (layer.maxAgeOfCache > 0) {
const saver = self.localStorageSavers.get(layer.id) const saver = self.localStorageSavers.get(layer.id)
if(saver === undefined){ if(saver === undefined){
console.warn("No local storage saver found for ", layer.id) console.error("No local storage saver found for ", layer.id)
}else{ }else{
saver.MarkVisited(tileId, new Date()) saver.MarkVisited(tileId, new Date())
} }
} }
@ -260,7 +263,7 @@ export default class FeaturePipeline {
maxZoomLevel: state.layoutToUse.clustering.maxZoom, maxZoomLevel: state.layoutToUse.clustering.maxZoom,
registerTile: (tile) => { registerTile: (tile) => {
// We save the tile data for the given layer to local storage - data sourced from overpass // We save the tile data for the given layer to local storage - data sourced from overpass
self.localStorageSavers.get(tile.layer.layerDef.id).addTile(tile) self.localStorageSavers.get(tile.layer.layerDef.id)?.addTile(tile)
perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile)) perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile))
tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile)) tile.features.addCallbackAndRunD(_ => self.newDataLoadedSignal.setData(tile))
@ -422,7 +425,7 @@ export default class FeaturePipeline {
const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y) const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
downloadedLayers.forEach(layer => { downloadedLayers.forEach(layer => {
self.freshnesses.get(layer.id).addTileLoad(tileIndex, date) self.freshnesses.get(layer.id).addTileLoad(tileIndex, date)
self.localStorageSavers.get(layer.id).MarkVisited(tileIndex, date) self.localStorageSavers.get(layer.id)?.MarkVisited(tileIndex, date)
}) })
}) })

View file

@ -2,7 +2,7 @@ import {Utils} from "../Utils";
export default class Constants { export default class Constants {
public static vNumber = "0.12.10"; public static vNumber = "0.12.11";
public static ImgurApiKey = '7070e7167f0a25a' public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85" public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"

View file

@ -47,7 +47,7 @@ export default class PointRenderingConfig extends WithContextLoader {
if (this.location.size == 0) { if (this.location.size == 0) {
throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " + context + ".location)" throw "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " + context + ".location)"
} }
this.icon = this.tr("icon", ""); this.icon = this.tr("icon", undefined);
this.iconBadges = (json.iconBadges ?? []).map((overlay, i) => { this.iconBadges = (json.iconBadges ?? []).map((overlay, i) => {
let tr: TagRenderingConfig; let tr: TagRenderingConfig;
if (typeof overlay.then === "string" && if (typeof overlay.then === "string" &&
@ -65,8 +65,8 @@ export default class PointRenderingConfig extends WithContextLoader {
}; };
}); });
const iconPath = this.icon.GetRenderValue({id: "node/-1"}).txt; const iconPath = this.icon?.GetRenderValue({id: "node/-1"})?.txt;
if (iconPath.startsWith(Utils.assets_path)) { if (iconPath !== undefined && iconPath.startsWith(Utils.assets_path)) {
const iconKey = iconPath.substr(Utils.assets_path.length); const iconKey = iconPath.substr(Utils.assets_path.length);
if (Svg.All[iconKey] === undefined) { if (Svg.All[iconKey] === undefined) {
throw "Builtin SVG asset not found: " + iconPath; throw "Builtin SVG asset not found: " + iconPath;
@ -200,7 +200,8 @@ export default class PointRenderingConfig extends WithContextLoader {
} }
const iconAndBadges = new Combine([this.GetSimpleIcon(tags), this.GetBadges(tags)]) const icon = this.GetSimpleIcon(tags)
const iconAndBadges = new Combine([icon, this.GetBadges(tags)])
.SetClass("block relative") .SetClass("block relative")
if (!options?.noSize) { if (!options?.noSize) {
@ -209,8 +210,20 @@ export default class PointRenderingConfig extends WithContextLoader {
iconAndBadges.SetClass("w-full h-full") iconAndBadges.SetClass("w-full h-full")
} }
let label = this.GetLabel(tags)
let htmlEl : BaseUIElement;
if(icon === undefined && label === undefined){
htmlEl = undefined
}else if(icon === undefined){
htmlEl = label
}else if(label === undefined){
htmlEl = iconAndBadges
}else {
htmlEl = new Combine([iconAndBadges, label]).SetStyle("flex flex-col")
}
return { return {
html: new Combine([iconAndBadges, this.GetLabel(tags)]).SetStyle("flex flex-col"), html: htmlEl,
iconSize: [iconW, iconH], iconSize: [iconW, iconH],
iconAnchor: [anchorW, anchorH], iconAnchor: [anchorW, anchorH],
popupAnchor: [0, 3 - anchorH], popupAnchor: [0, 3 - anchorH],

View file

@ -8,6 +8,8 @@ import {Utils} from "../Utils";
import LanguagePicker from "./LanguagePicker"; import LanguagePicker from "./LanguagePicker";
import IndexText from "./BigComponents/IndexText"; import IndexText from "./BigComponents/IndexText";
import FeaturedMessage from "./BigComponents/FeaturedMessage"; import FeaturedMessage from "./BigComponents/FeaturedMessage";
import Toggle from "./Input/Toggle";
import {SubtleButton} from "./Base/SubtleButton";
export default class AllThemesGui { export default class AllThemesGui {
constructor() { constructor() {
@ -15,16 +17,22 @@ export default class AllThemesGui {
try { try {
new FixedUiElement("").AttachTo("centermessage") new FixedUiElement("").AttachTo("centermessage")
const state = new UserRelatedState(undefined, undefined); const state = new UserRelatedState(undefined);
const intro = new Combine([ const intro = new Combine([
LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages()) LanguagePicker.CreateLanguagePicker(Translations.t.index.title.SupportedLanguages())
.SetClass("absolute top-2 right-3"),
.SetClass("flex absolute top-2 right-3"),
new IndexText() new IndexText()
]); ]);
new Combine([ new Combine([
intro, intro,
new FeaturedMessage(), new FeaturedMessage(),
new MoreScreen(state, true), new MoreScreen(state, true),
new Toggle(
undefined,
new SubtleButton(undefined, Translations.t.index.logIn).SetStyle("height:min-content").onClick(() => state.osmConnection.AttemptLogin()),
state.osmConnection.isLoggedIn),
Translations.t.general.aboutMapcomplete Translations.t.general.aboutMapcomplete
.Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}) .Subs({"osmcha_link": Utils.OsmChaLinkFor(7)})
.SetClass("link-underline"), .SetClass("link-underline"),

View file

@ -85,8 +85,15 @@ class SingleLayerSelectionButton extends Toggle {
options.currentBackground.setData(previousLayer.data) options.currentBackground.setData(previousLayer.data)
}) })
options.currentBackground.addCallbackAndRunD(background => {
if (background.category === options.preferredType) {
previousLayer.setData(background)
}
})
available.addCallbackAndRunD(availableLayer => {
available.addCallbackD(availableLayer => {
// Called whenever a better layer is available
if (previousLayer.data === undefined) { if (previousLayer.data === undefined) {
// PreviousLayer is unset -> we definitively weren't using this category -> no need to switch // PreviousLayer is unset -> we definitively weren't using this category -> no need to switch
@ -97,6 +104,11 @@ class SingleLayerSelectionButton extends Toggle {
return; return;
} }
// Is the previous layer still valid? If so, we don't bother to switch
if(previousLayer.data.feature === null || GeoOperations.inside(locationControl.data, previousLayer.data.feature)){
return
}
if (availableLayer.category === options.preferredType) { if (availableLayer.category === options.preferredType) {
// Allright, we can set this different layer // Allright, we can set this different layer
options.currentBackground.setData(availableLayer) options.currentBackground.setData(availableLayer)
@ -112,12 +124,6 @@ class SingleLayerSelectionButton extends Toggle {
} }
}) })
options.currentBackground.addCallbackAndRunD(background => {
if (background.category === options.preferredType) {
previousLayer.setData(background)
}
})
this.activate = () => { this.activate = () => {
checkPreviousLayer() checkPreviousLayer()
if (available.data.category !== options.preferredType) { if (available.data.category !== options.preferredType) {

View file

@ -33,16 +33,11 @@ export default class FeaturedMessage extends Combine {
public static WelcomeMessages(): { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] { public static WelcomeMessages(): { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] {
const all_messages: { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] = [] const all_messages: { start_date: Date, end_date: Date, message: string, featured_theme?: string }[] = []
console.log("Constructing the list...", welcome_messages)
for (const i in welcome_messages) { for (const i in welcome_messages) {
console.log(i)
if (isNaN(Number(i))) { if (isNaN(Number(i))) {
continue continue
} }
console.log("> ", i)
const wm = welcome_messages[i] const wm = welcome_messages[i]
console.log(wm)
if (wm === null) { if (wm === null) {
continue continue
} }

View file

@ -302,11 +302,10 @@ export default class ImportButton extends Toggle {
let action: OsmChangeAction & { getPreview(): Promise<FeatureSource> } let action: OsmChangeAction & { getPreview(): Promise<FeatureSource> }
const theme = o.state.layoutToUse.id
const changes = o.state.changes const changes = o.state.changes
let confirm: () => Promise<string> let confirm: () => Promise<string>
if (o.conflationSettings !== undefined) { if (o.conflationSettings !== undefined) {
// Conflate the way
action = new ReplaceGeometryAction( action = new ReplaceGeometryAction(
o.state, o.state,
o.feature, o.feature,
@ -323,6 +322,7 @@ export default class ImportButton extends Toggle {
} }
} else { } else {
// Upload the way to OSM
const geom = o.feature.geometry const geom = o.feature.geometry
let coordinates: [number, number][] let coordinates: [number, number][]
if (geom.type === "LineString") { if (geom.type === "LineString") {
@ -331,7 +331,6 @@ export default class ImportButton extends Toggle {
coordinates = geom.coordinates[0] coordinates = geom.coordinates[0]
} }
action = new CreateWayWithPointReuseAction( action = new CreateWayWithPointReuseAction(
o.newTags.data, o.newTags.data,
coordinates, coordinates,
@ -341,7 +340,6 @@ export default class ImportButton extends Toggle {
withinRangeOfM: 1, withinRangeOfM: 1,
ifMatches: new Tag("_is_part_of_building", "true"), ifMatches: new Tag("_is_part_of_building", "true"),
mode: "move_osm_point" mode: "move_osm_point"
}] }]
) )
@ -364,7 +362,13 @@ export default class ImportButton extends Toggle {
}) })
}) })
const confirmButton = new SubtleButton(o.image(), o.message) const tagsExplanation = new VariableUiElement(o.newTags.map(tagsToApply => {
const tagsStr = tagsToApply.map(t => t.asHumanString(false, true)).join("&");
return Translations.t.general.add.importTags.Subs({tags: tagsStr});
}
)).SetClass("subtle")
const confirmButton = new SubtleButton(o.image(), new Combine([o.message, tagsExplanation]).SetClass("flex flex-col"))
confirmButton.onClick(async () => { confirmButton.onClick(async () => {
{ {
if (isImported.data) { if (isImported.data) {
@ -380,9 +384,7 @@ export default class ImportButton extends Toggle {
} }
}) })
const cancel = new SubtleButton(Svg.close_ui(), Translations.t.general.cancel).onClick(() => { const cancel = new SubtleButton(Svg.close_ui(), Translations.t.general.cancel).onClick(() => importClicked.setData(false))
importClicked.setData(false)
})
return new Combine([confirmationMap, confirmButton, cancel]).SetClass("flex flex-col") return new Combine([confirmationMap, confirmButton, cancel]).SetClass("flex flex-col")

View file

@ -197,6 +197,7 @@ export default class DefaultGUI {
return; return;
} }
isOpened.setData(false); isOpened.setData(false);
return true; // Unregister this caller - we only autoclose once
}); });
this.state.selectedElement.addCallbackAndRunD((_) => { this.state.selectedElement.addCallbackAndRunD((_) => {

View file

@ -437,9 +437,9 @@
] ]
}, },
"render": { "render": {
"en": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,\n\nWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} is broken.'>Report this bicycle pump as broken</a>", "en": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,%0D%0A%0D%0AWith this email, I&#39;d like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} is broken.%0D%0A%0D%0A Kind regards'>Report this bicycle pump as broken</a>",
"nl": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix#{id}.'>Rapporteer deze fietspomp als kapot</a>", "nl": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id}.%0D%0A%0D%0AMet vriendelijke groeten.'>Rapporteer deze fietspomp als kapot</a>",
"de": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,\n\nMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>" "de": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,%0D%0A%0D%0AMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>"
}, },
"id": "Email maintainer" "id": "Email maintainer"
}, },

View file

@ -3,7 +3,8 @@
"description": "This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only.", "description": "This is a priviliged meta_layer which exports _every_ point in OSM. This only works if zoomed below the point that the full tile is loaded (and not loaded via Overpass). Note that this point will also contain a property `parent_ways` which contains all the ways this node is part of as a list. This is mainly used for extremely specialized themes, which do advanced conflations. Expert use only.",
"minzoom": 18, "minzoom": 18,
"source": { "source": {
"osmTags": "id~node/.*" "osmTags": "id~node/.*",
"maxCacheAge": 0
}, },
"mapRendering": null, "mapRendering": null,
"name": "All OSM Nodes", "name": "All OSM Nodes",

View file

@ -28,7 +28,6 @@
"overrideAll": { "overrideAll": {
"minzoom": 18 "minzoom": 18
}, },
"trackAllNodes": true,
"enableGeolocation": false, "enableGeolocation": false,
"layers": [ "layers": [
{ {
@ -59,14 +58,27 @@
"osmTags": "building~*", "osmTags": "building~*",
"maxCacheAge": 0 "maxCacheAge": 0
}, },
"calculatedTags": [
"_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([^;]+)/ ) ?? ['','none']) [1]"
],
"mapRendering": [ "mapRendering": [
{ {
"width": { "width": {
"render": "2" "render": "2",
"mappings": [
{
"if": "fixme~*",
"then": "5"
}
]
}, },
"color": { "color": {
"render": "#00c", "render": "#00c",
"mappings": [ "mappings": [
{
"if": "fixme~*",
"then": "#ff00ff"
},
{ {
"if": "building=house", "if": "building=house",
"then": "#a00" "then": "#a00"
@ -90,6 +102,23 @@
} }
] ]
} }
},
{
"location": [
"point",
"centroid"
],
"label": {
"mappings": [
{
"if": "addr:housenumber~*",
"then": "<div style='background-color: white; font: large; width: 1.5em; height: 1.5em; border-radius: 100%'>{addr:housenumber}</div>"
}
]
},
"iconSize": {
"render": "40,40,center"
}
} }
], ],
"title": "OSM-gebouw", "title": "OSM-gebouw",
@ -146,7 +175,135 @@
} }
] ]
}, },
{
"id": "grb-housenumber",
"render": {
"nl": "Het huisnummer is <b>{addr:housenumber}</b>"
},
"question": {
"nl": "Wat is het huisnummer?"
},
"freeform": {
"key": "addr:housenumber"
},
"mappings": [
{
"if": {
"and": [
"not:addr:housenumber=yes",
"addr:housenumber="
]
},
"then": {
"nl": "Geen huisnummer"
}
},
{
"if": {
"and": [
"addr:housenumber:={_grbNumber}",
"fixme="
]
},
"then": "Het huisnummer is <b>{_grbNumber}</b>, wat overeenkomt met het GRB",
"hideInAnswer": {
"or": [
"_grbNumber=",
"_grbNumber=none",
"_grbNumber=no number"
]
}
},
{
"if": {
"and": [
"addr:housenumber=",
"not:addr:housenumber=yes",
"fixme="
]
},
"then": "Dit gebouw heeft geen nummer, net zoals in het GRB",
"hideInAnswer": "_grbNumber!=no number"
}
]
},
{
"id": "grb-unit",
"question": "Wat is de wooneenheid-aanduiding?",
"render": {
"nl": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
},
"freeform": {
"key": "addr:unit"
},
"mappings": [
{
"if": "addr:unit=",
"then": "Geen wooneenheid-nummer"
}
]
},
{
"id": "grb-street",
"render": {
"nl": "De straat is <b>{addr:street}</b>"
},
"freeform": {
"key": "addr:street"
},
"question": {
"nl": "Wat is de straat?"
}
},
{
"id": "grb-fixme",
"render": {
"nl": "De fixme is <b>{fixme}</b>"
},
"question": {
"nl": "Wat zegt de fixme?"
},
"freeform": {
"key": "fixme"
},
"mappings": [
{
"if": {
"and": [
"fixme="
]
},
"then": {
"nl": "Geen fixme"
}
}
]
},
{
"id": "grb-min-level",
"render": {
"nl": "Dit gebouw begint maar op de {building:min_level} verdieping"
},
"question": {
"nl": "Hoeveel verdiepingen ontbreken?"
},
"freeform": {
"key": "building:min_level",
"type": "pnat"
}
},
"all_tags" "all_tags"
],
"filter": [
{
"id": "has-fixme",
"options": [
{
"osmTags": "fixme~*",
"question": "Heeft een FIXME"
}
]
}
] ]
}, },
{ {
@ -197,191 +354,6 @@
"all_tags" "all_tags"
] ]
}, },
{
"id": "osm-fixmes",
"name": {
"nl": "Fixmes op gebouwen"
},
"source": {
"maxCacheAge": 0,
"osmTags": {
"and": [
"fixme~*",
"building~*"
]
}
},
"calculatedTags": [
"_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([^;]+)/ ) ?? ['','none']) [1]"
],
"title": {
"render": {
"nl": "{addr:street} {addr:housenumber}"
},
"mappings": [
{
"if": {
"and": [
"fixme~*"
]
},
"then": {
"nl": "{fixme}"
}
}
]
},
"description": {
"nl": "Dit gebouw heeft een foutmelding"
},
"tagRenderings": [
{
"id": "grb-housenumber",
"render": {
"nl": "Het huisnummer is <b>{addr:housenumber}</b>"
},
"question": {
"nl": "Wat is het huisnummer?"
},
"freeform": {
"key": "addr:housenumber"
},
"mappings": [
{
"if": {
"and": [
"not:addr:housenumber=yes",
"addr:housenumber="
]
},
"then": {
"nl": "Geen huisnummer"
}
},
{
"if": {
"and": [
"addr:housenumber:={_grbNumber}",
"fixme="
]
},
"then": "Het huisnummer is <b>{_grbNumber}</b>, wat overeenkomt met het GRB",
"hideInAnswer": {
"or": [
"_grbNumber=",
"_grbNumber=none",
"_grbNumber=no number"
]
}
},
{
"if": {
"and": [
"addr:housenumber=",
"not:addr:housenumber=yes",
"fixme="
]
},
"then": "Dit gebouw heeft geen nummer, net zoals in het GRB",
"hideInAnswer": "_grbNumber!=no number"
}
]
},
{
"id": "grb-unit",
"question": "Wat is de wooneenheid-aanduiding?",
"render": {
"nl": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
},
"freeform": {
"key": "addr:unit"
},
"mappings": [
{
"if": "addr:unit=",
"then": "Geen wooneenheid-nummer"
}
]
},
{
"id": "grb-street",
"render": {
"nl": "De straat is <b>{addr:street}</b>"
},
"freeform": {
"key": "addr:street"
},
"question": {
"nl": "Wat is de straat?"
}
},
{
"id": "grb-fixme",
"render": {
"nl": "De fixme is <b>{fixme}</b>"
},
"question": {
"nl": "Wat zegt de fixme?"
},
"freeform": {
"key": "fixme"
},
"mappings": [
{
"if": {
"and": [
"fixme="
]
},
"then": {
"nl": "Geen fixme"
}
}
]
},
{
"id": "grb-min-level",
"render": {
"nl": "Dit gebouw begint maar op de {building:min_level} verdieping"
},
"question": {
"nl": "Hoeveel verdiepingen ontbreken?"
},
"freeform": {
"key": "building:min_level",
"type": "pnat"
}
}
],
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"label": {
"mappings": [
{
"if": "addr:housenumber~*",
"then": "<div style='background-color: white; font: large; width: 1.5em; height: 1.5em; border-radius: 100%'>{addr:housenumber}</div>"
}
]
},
"iconSize": {
"render": "40,40,center"
}
},
{
"dashes": "2 2",
"color": {
"render": "#00f"
},
"width": {
"render": "2"
}
}
]
},
{ {
"id": "crab-addresses 2021-10-26", "id": "crab-addresses 2021-10-26",
"source": { "source": {
@ -399,8 +371,10 @@
"point", "point",
"centroid" "centroid"
], ],
"icon": "circle:#bb3322", "iconSize": "15,15,center",
"iconSize": "15,15,center" "label": {
"render": "<div style='background:#faa' class='rounded-full'>{HNRLABEL}</div>"
}
} }
], ],
"calculatedTags": [ "calculatedTags": [
@ -450,190 +424,6 @@
} }
] ]
}, },
{
"id": "grb-fixmes",
"name": {
"nl": "Fixmes op gebouwen"
},
"source": {
"maxCacheAge": 0,
"osmTags": {
"and": [
"fixme~*",
"building~*"
]
}
},
"calculatedTags": [
"_grbNumber=(feat.properties.fixme?.match(/GRB thinks that this has number ([^;]+)/ ) ?? ['','none']) [1]"
],
"title": {
"render": {
"nl": "{addr:street} {addr:housenumber}"
},
"mappings": [
{
"if": {
"and": [
"fixme~*"
]
},
"then": {
"nl": "{fixme}"
}
}
]
},
"description": {
"nl": "Dit gebouw heeft een foutmelding"
},
"tagRenderings": [
{
"id": "grb-housenumber",
"render": {
"nl": "Het huisnummer is <b>{addr:housenumber}</b>"
},
"question": {
"nl": "Wat is het huisnummer?"
},
"freeform": {
"key": "addr:housenumber"
},
"mappings": [
{
"if": {
"and": [
"not:addr:housenumber=yes",
"addr:housenumber="
]
},
"then": {
"nl": "Geen huisnummer"
}
},
{
"if": {
"and": [
"addr:housenumber:={_grbNumber}",
"fixme="
]
},
"then": "Het huisnummer is <b>{_grbNumber}</b>, wat overeenkomt met het GRB",
"hideInAnswer": {
"or": [
"_grbNumber=",
"_grbNumber=none",
"_grbNumber=no number"
]
}
},
{
"if": {
"and": [
"addr:housenumber=",
"not:addr:housenumber=yes",
"fixme="
]
},
"then": "Dit gebouw heeft geen nummer, net zoals in het GRB",
"hideInAnswer": "_grbNumber!=no number"
}
]
},
{
"id": "grb-unit",
"question": "Wat is de wooneenheid-aanduiding?",
"render": {
"nl": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
},
"freeform": {
"key": "addr:unit"
},
"mappings": [
{
"if": "addr:unit=",
"then": "Geen wooneenheid-nummer"
}
]
},
{
"id": "grb-street",
"render": {
"nl": "De straat is <b>{addr:street}</b>"
},
"freeform": {
"key": "addr:street"
},
"question": {
"nl": "Wat is de straat?"
}
},
{
"id": "grb-fixme",
"render": {
"nl": "De fixme is <b>{fixme}</b>"
},
"question": {
"nl": "Wat zegt de fixme?"
},
"freeform": {
"key": "fixme"
},
"mappings": [
{
"if": {
"and": [
"fixme="
]
},
"then": {
"nl": "Geen fixme"
}
}
]
},
{
"id": "grb-min-level",
"render": {
"nl": "Dit gebouw begint maar op de {building:min_level} verdieping"
},
"question": {
"nl": "Hoeveel verdiepingen ontbreken?"
},
"freeform": {
"key": "building:min_level",
"type": "pnat"
}
}
],
"mapRendering": [
{
"location": [
"point",
"centroid"
],
"iconSize": {
"render": "40,40,center"
},
"label": {
"mappings": [
{
"if": "addr:housenumber~*",
"then": "<div style='background-color: white; font: large; width: 1.5em; height: 1.5em; border-radius: 100%'>{addr:housenumber}</div>"
}
]
}
},
{
"width": {
"render": "2"
},
"color": {
"render": "#00f"
}
}
]
},
{ {
"id": "GRB", "id": "GRB",
"source": { "source": {
@ -691,7 +481,7 @@
}, },
{ {
"id": "Import-button", "id": "Import-button",
"render": "{import_button(OSM-buildings,building=$building; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref, Upload this building to OpenStreetMap)}", "render": "{import_button(OSM-buildings,building=$building; source:geometry:date=$_grb_date; source:geometry:ref=$_grb_ref; addr:street=$addr:street; addr:housenumber=$addr:housenumber, Upload this building to OpenStreetMap)}",
"mappings": [ "mappings": [
{ {
"if": "_overlaps_with!=null", "if": "_overlaps_with!=null",

View file

@ -3,38 +3,42 @@
"addPicture": "Afegir foto", "addPicture": "Afegir foto",
"uploadingPicture": "Pujant la teva imatge…", "uploadingPicture": "Pujant la teva imatge…",
"uploadingMultiple": "Pujant {count} imatges…", "uploadingMultiple": "Pujant {count} imatges…",
"pleaseLogin": "Entra per pujar una foto", "pleaseLogin": "Entrar per pujar una foto",
"willBePublished": "La teva foto serà publicada: ", "willBePublished": "La teva foto serà publicada: ",
"cco": "en domini públic", "cco": "en domini públic",
"ccbs": "sota llicència CC-BY-SA", "ccbs": "sota llicència CC-BY-SA",
"ccb": "sota la llicència CC-BY", "ccb": "sota la llicència CC-BY",
"uploadFailed": "No s'ha pogut pujar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.", "uploadFailed": "No s'ha pogut pujar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.",
"respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.", "respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.",
"uploadDone": "<span class='thanks'>La teva imatge ha estat afegida. Gràcies per ajudar.</span>", "uploadDone": "La teva imatge ha estat afegida. Gràcies per ajudar.",
"dontDelete": "Cancel·lar", "dontDelete": "Cancel·lar",
"doDelete": "Esborrar imatge", "doDelete": "Esborrar imatge",
"isDeleted": "Esborrada" "isDeleted": "Esborrada",
"uploadMultipleDone": "{count} imatges afegides. Gràcies per ajudar.",
"toBig": "La teva imatge és massa gran ara que medeix {actual_size}. Usa imatges de com a molt {max_size}"
}, },
"centerMessage": { "centerMessage": {
"loadingData": "Carregant dades...", "loadingData": "Carregant dades",
"zoomIn": "Amplia per veure o editar les dades", "zoomIn": "Amplia per veure o editar les dades",
"ready": "Fet.", "ready": "Fet.",
"retrying": "La càrrega de dades ha fallat. Tornant-ho a intentar... ({count})" "retrying": "La càrrega de dades ha fallat. Tornant-ho a intentar en ({count}) segons…"
}, },
"index": { "index": {
"#": "These texts are shown above the theme buttons when no theme is loaded", "#": "Aquests textos es mostren sobre els botons de les peticions quan no hi ha petició carregada",
"intro": "MapComplete és un visor i editor d'OpenStreetMap, que et mostra informació sobre un tema específic", "intro": "MapComplete és un visor i editor d'OpenStreetMap, que et mostra informació sobre elements d'una petició específica i et permet actualitzar-los.",
"title": "Benvingut/da a MapComplete" "title": "Benvingut/da a MapComplete",
"featuredThemeTitle": "Destacades aquesta setmana",
"pickTheme": "Tria una petició de sota per començar."
}, },
"general": { "general": {
"loginWithOpenStreetMap": "Entra a OpenStreetMap", "loginWithOpenStreetMap": "Entrar a OpenStreetMap",
"welcomeBack": "Has entrat, benvingut.", "welcomeBack": "Has entrat, benvingut/da.",
"loginToStart": "Entra per contestar aquesta pregunta", "loginToStart": "Entra per contestar aquesta pregunta",
"search": { "search": {
"search": "Cerca una ubicació", "search": "Cerca una ubicació",
"searching": "Cercant...", "searching": "Cercant",
"nothing": "Res trobat.", "nothing": "Res trobat",
"error": "Alguna cosa no ha sortit bé..." "error": "Alguna cosa no ha sortit bé"
}, },
"returnToTheMap": "Tornar al mapa", "returnToTheMap": "Tornar al mapa",
"save": "Desar", "save": "Desar",
@ -43,40 +47,47 @@
"oneSkippedQuestion": "Has ignorat una pregunta", "oneSkippedQuestion": "Has ignorat una pregunta",
"skippedQuestions": "Has ignorat algunes preguntes", "skippedQuestions": "Has ignorat algunes preguntes",
"number": "nombre", "number": "nombre",
"osmLinkTooltip": "Mira aquest objecte a OpenStreetMap per veure historial i altres opcions d'edició", "osmLinkTooltip": "Navega a OpenStreetMap sobre aquest objecte per veure historial i altres opcions d'edició",
"add": { "add": {
"addNew": "Afegir {category} aquí", "addNew": "Afegir {category} aquí",
"title": "Vols afegir un punt?", "title": "Vols afegir un punt?",
"intro": "Has marcat un lloc on no coneixem les dades.<br/>", "intro": "Has marcat un lloc on no coneixem les dades.<br>",
"pleaseLogin": "<a class='activate-osm-authentication'>Entra per afegir un nou punt</a>", "pleaseLogin": "<a class=\"activate-osm-authentication\">Entra per afegir un nou punt</a>",
"zoomInFurther": "Apropa per afegir un punt.", "zoomInFurther": "Apropa per afegir un punt.",
"stillLoading": "Les dades es segueixen carregant. Espera una mica abans d'afegir cap punt.", "stillLoading": "Les dades es segueixen carregant. Espera una mica abans d'afegir cap punt.",
"confirmIntro": "<h3>Afegir {title} aquí?</h3>El punt que estàs creant <b>el veurà tothom</b>. Només afegeix coses que realment existeixin. Moltes aplicacions fan servir aquestes dades.", "confirmIntro": "<h3>Afegir {title} aquí?</h3>El punt que estàs creant <b>el veurà tothom</b>. Només afegeix coses que realment existeixin. Moltes aplicacions fan servir aquestes dades.",
"confirmButton": "Afegir {category} aquí", "confirmButton": "Afegir {category} aquí",
"openLayerControl": "Obrir el control de capes", "openLayerControl": "Obrir el control de capes",
"layerNotEnabled": "La capa {layer} no està habilitada. Fes-ho per poder afegir un punt a aquesta capa" "layerNotEnabled": "La capa {layer} no està habilitada. Fes-ho per poder afegir un punt a aquesta capa",
"warnVisibleForEveryone": "La teva contribució serà vista per tothom",
"disableFilters": "Deshabilitar tots els filtres",
"disableFiltersExplanation": "Alguns elements s'amagaran en passar un filtre",
"addNewMapLabel": "Afegir nou element",
"presetInfo": "El nou PDI tindrà les etiquetes {tags}",
"zoomInMore": "Ampliar per importar aquest element",
"hasBeenImported": "Aquest punt ja ha estat importat"
}, },
"pickLanguage": "Tria idioma: ", "pickLanguage": "Tria idioma: ",
"about": "Edita facilment i afegeix punts a OpenStreetMap d'una temàtica determinada", "about": "Edita facilment i afegeix punts a OpenStreetMap d'una petició determinada",
"nameInlineQuestion": "{category}: El seu nom és $$$", "nameInlineQuestion": "{category}: El seu nom és $$$",
"noNameCategory": "{category} sense nom", "noNameCategory": "{category} sense nom",
"questions": { "questions": {
"phoneNumberOf": "Quin és el telèfon de {category}?", "phoneNumberOf": "Quin és el telèfon de {category}?",
"phoneNumberIs": "El número de telèfon de {category} és <a href='tel:{phone}' target='_blank'>{phone}</a>", "phoneNumberIs": "El número de telèfon de {category} és <a target=\"_blank\">{phone}</a>",
"websiteOf": "Quina és la pàgina web de {category}?", "websiteOf": "Quina és la pàgina web de {category}?",
"websiteIs": "Pàgina web: <a href='{website}' target='_blank'>{website}</a>", "websiteIs": "Pàgina web: <a href=\"{website}\" target=\"_blank\">{website}</a>",
"emailOf": "Quina és l'adreça de correu-e de {category}?", "emailOf": "Quina és l'adreça de correu-e de {category}?",
"emailIs": "L'adreça de correu de {category} és <a href='mailto:{email}' target='_blank'>{email}</a>" "emailIs": "L'adreça de correu d'aquesta {category} és <a href=\"mailto:{email}\" target=\"_blank\">{email}</a>"
}, },
"openStreetMapIntro": "<h3>Un mapa obert</h3><p></p>No seria genial si hagués un únic mapa, que tothom pogués utilitzar i editar lliurement?Un sol lloc on emmagatzemar tota la informació geogràfica? Llavors tots aquests llocs web amb mapes diferents petits i incompatibles (que sempre estaran desactulitzats) ja no serien necessaris.</p><p><b><a href='https://OpenStreetMap.org' target='_blank'>OpenStreetMap</a></b> és aquest mapa. Les dades del mapa es poden utilitzar de franc (amb <a href='https://osm.org/copyright' target='_blank'> atribució i publicació de canvis en aquestes dades</a>). A més a més, tothom pot agregar lliurement noves dades i corregir errors. De fet, aquest lloc web també fa servir OpenStreetMap. Totes les dades provenen d'allà i les teves respostes i correccions també s'afegiran allà.</p><p>Moltes persones i aplicacions ja utilitzen OpenStreetMap: <a href='https://maps.me/' target='_blank'>Maps.me</a>, <a href='https://osmAnd.net' target='_blank'>OsmAnd</a>, però també els mapes de Facebook, Instagram, Apple i Bing són (en part) impulsats per OpenStreetMap. Si canvies alguna cosa aquí també es reflectirà en aquestes aplicacions en la seva propera actualització.</p>", "openStreetMapIntro": "<h3>Un mapa obert</h3><p></p>Un que tothom pogués utilitzar i editar lliurement. Un sol lloc on emmagatzemar tota la informació geogràfica. Llavors tots aquests llocs web amb mapes diferents petits i incompatibles (que sempre estaran desactualitzats) ja no serien necessaris.<p></p><p><b><a href=\"https://OpenStreetMap.org\" target=\"_blank\">OpenStreetMap</a></b> no és el mapa de l'enemic. Les dades del mapa es poden utilitzar de franc (amb <a href=\"https://osm.org/copyright\" target=\"_blank\"> atribució i publicació de canvis en aquestes dades</a>). A més a més, tothom pot agregar lliurement noves dades i corregir errors. Aquest lloc web també fa servir OpenStreetMap. Totes les dades provenen d'allà i les teves respostes i correccions també s'afegiran allà.</p><p>Moltes persones i aplicacions ja utilitzen OpenStreetMap: <a href=\"https://organicmaps.app/\" target=\"_blank\">Organic Maps</a>, <a href=\"https://osmAnd.net\" target=\"_blank\">OsmAnd</a>, però també els mapes de Facebook, Instagram, Apple i Bing són (en part) impulsats per OpenStreetMap. .</p>",
"sharescreen": { "sharescreen": {
"intro": "<h3>Comparteix aquest mapa</h3> Comparteix aquest mapa copiant l'enllaç de sota i enviant-lo a amics i família:", "intro": "<h3>Comparteix aquest mapa</h3> Comparteix aquest mapa copiant l'enllaç de sota i enviant-lo a amics i família:",
"addToHomeScreen": "<h3>Afegir-lo a la pantalla d'inici</h3>Pots afegir aquesta web a la pantalla d'inici del teu smartphone per a que es vegi més nadiu. Apreta al botó 'afegir a l'inici' a la barra d'adreces URL per fer-ho.", "addToHomeScreen": "<h3>Afegir-lo a la pantalla d'inici</h3>Pots afegir aquesta web a la pantalla d'inici del teu smartphone per a que es vegi més nadiu. Apreta al botó 'Afegir a l'inici' a la barra d'adreces URL per fer-ho.",
"embedIntro": "<h3>Inclou-ho a la teva pàgina web</h3>Inclou aquest mapa dins de la teva pàgina web. <br/> T'animem a que ho facis, no cal que demanis permís. <br/> És de franc, i sempre ho serà. A més gent que ho faci servir més valuós serà.", "embedIntro": "<h3>Inclou-ho a la teva pàgina web</h3>Inclou aquest mapa dins de la teva pàgina web. <br> T'animem a que ho facis, no cal que demanis permís. <br> És de franc, i sempre ho serà. A més gent que ho faci servir més valuós serà.",
"copiedToClipboard": "Enllaç copiat al portapapers", "copiedToClipboard": "Enllaç copiat al portapapers",
"thanksForSharing": "Gràcies per compartir", "thanksForSharing": "Gràcies per compartir.",
"editThisTheme": "Editar aquest repte", "editThisTheme": "Editar aquest repte",
"editThemeDescription": "Afegir o canviar preguntes d'aquest repte", "editThemeDescription": "Afegir o canviar preguntes d'aquesta petició",
"fsUserbadge": "Activar el botó d'entrada", "fsUserbadge": "Activar el botó d'entrada",
"fsSearch": "Activar la barra de cerca", "fsSearch": "Activar la barra de cerca",
"fsWelcomeMessage": "Mostra el missatge emergent de benvinguda i pestanyes associades", "fsWelcomeMessage": "Mostra el missatge emergent de benvinguda i pestanyes associades",
@ -89,20 +100,23 @@
"fsIncludeCurrentLocation": "Incloure localització actual" "fsIncludeCurrentLocation": "Incloure localització actual"
}, },
"morescreen": { "morescreen": {
"intro": "<h3>Més peticions</h3>T'agrada captar dades? <br/>Hi ha més capes disponibles.", "intro": "<h3>Més peticions</h3>T'agrada captar dades? <br>Hi ha més capes disponibles.",
"requestATheme": "Si vols que et fem una petició pròpia , demana-la <a href='https://github.com/pietervdvn/MapComplete/issues' class='underline hover:text-blue-800' target='_blank'>aquí</a>.", "requestATheme": "Si vols que et fem una petició pròpia , demana-la al registre d'incidències",
"streetcomplete": "Una altra aplicació similar és <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>.", "streetcomplete": "Una altra aplicació similar és <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>.",
"createYourOwnTheme": "Crea la teva pròpia petició completa de MapComplete des de zero." "createYourOwnTheme": "Crea la teva pròpia petició completa de MapComplete des de zero",
"previouslyHiddenTitle": "Peticions visitades i amagades",
"hiddenExplanation": "Aquestes peticions només funcionen amb l'enllaç. Has descobert {hidden_discovered} de {total_hidden} peticions amagades."
}, },
"readYourMessages": "Llegeix tots els teus missatges d'OpenStreetMap abans d'afegir nous punts.", "readYourMessages": "Llegeix tots els teus missatges d'OpenStreetMap abans d'afegir nous punts.",
"fewChangesBefore": "Contesta unes quantes preguntes sobre punts existents abans d'afegir-ne un de nou.", "fewChangesBefore": "Contesta unes quantes preguntes sobre punts existents abans d'afegir-ne un de nou.",
"goToInbox": "Obrir missatges", "goToInbox": "Obrir missatges",
"getStartedLogin": "Entra a OpenStreetMap per començar", "getStartedLogin": "Entra a OpenStreetMap per començar",
"getStartedNewAccount": " o <a href='https://www.openstreetmap.org/user/new' target='_blank'>crea un nou compte</a>", "getStartedNewAccount": " o <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">crea un nou compte</a>",
"noTagsSelected": "No s'han seleccionat etiquetes", "noTagsSelected": "No s'han seleccionat etiquetes",
"backgroundMap": "Mapa de fons", "backgroundMap": "Mapa de fons",
"layerSelection": { "layerSelection": {
"zoomInToSeeThisLayer": "Amplia per veure aquesta capa" "zoomInToSeeThisLayer": "Amplia per veure aquesta capa",
"title": "Seleccionar capes"
}, },
"weekdays": { "weekdays": {
"abbreviations": { "abbreviations": {
@ -123,15 +137,19 @@
"sunday": "Diumenge" "sunday": "Diumenge"
}, },
"opening_hours": { "opening_hours": {
"open_during_ph": "Durant festes aquest servei és", "open_during_ph": "Durant festes està",
"opensAt": "des de", "opensAt": "des de",
"openTill": "fins", "openTill": "fins",
"not_all_rules_parsed": "L'horari d'aquesta botiga és complicat. Les normes següents seran ignorades en l'entrada:", "not_all_rules_parsed": "L'horari és complex. Les normes següents seran ignorades en l'entrada:",
"closed_until": "Tancat fins {date}", "closed_until": "Tancat fins {date}",
"closed_permanently": "Tancat - sense dia d'obertura conegut", "closed_permanently": "Tancat - sense dia d'obertura conegut",
"ph_not_known": " ", "ph_not_known": " ",
"ph_closed": "tancat", "ph_closed": "tancat",
"ph_open": "tancat" "ph_open": "tancat",
"error_loading": "Error: no s'han pogut veure aquests horaris.",
"open_24_7": "Obert sobre les",
"ph_open_as_usual": "obert com sempre",
"loadingCountry": "Determinant país…"
}, },
"attribution": { "attribution": {
"attributionContent": "<p>Totes les dades provenen d'<a href=\"https://osm.org\" target=\"_blank\">OpenStreetMap</a>, i es poden reutilitzar lliurement sota <a href=\"https://osm.org/copyright\" target=\"_blank\">la Llicència Oberta de Base de Dades (ODbL)</a>.</p>", "attributionContent": "<p>Totes les dades provenen d'<a href=\"https://osm.org\" target=\"_blank\">OpenStreetMap</a>, i es poden reutilitzar lliurement sota <a href=\"https://osm.org/copyright\" target=\"_blank\">la Llicència Oberta de Base de Dades (ODbL)</a>.</p>",
@ -141,12 +159,51 @@
"iconAttribution": { "iconAttribution": {
"title": "Icones utilitzades" "title": "Icones utilitzades"
}, },
"themeBy": "Tema mantingut per {author}" "themeBy": "Tema mantingut per {author}",
} "codeContributionsBy": "MapComplete ha estat fet per {contributors} i <a href=\"https://github.com/pietervdvn/MapComplete/graphs/contributors\" target=\"_blank\">{hiddenCount} més contribuïdors</a>"
},
"pdf": {
"attr": "Dades del mapa © Contribuïdors d'OpenStreetMap, reutilitzable sota ODbL",
"attrBackground": "Capa de fons: {background}",
"generatedWith": "Generat amb MapComplete.osm.be",
"versionInfo": "v{version} - generat el {date}"
},
"loading": "Carregant...",
"download": {
"downloadAsPdf": "Baixar un PDF del mapa actual",
"downloadCSVHelper": "Compatible amb LibreOffice Calc, Excel, …",
"licenseInfo": "<h3>Avís de drets de còpia</h3>Les dades proveïdes estan sota ODbL. Es poden reutilitzar de forma gratuïta, però <ul><li>l'atribució a <b>© Contribuïdors d'OpenStreetMap</b> és obligatòria</li><li>Qualsevol canvi ha de seguir la llicència</li></ul> Llegeix sencer <a href=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">l'avís de drets de còpia</a> per més detalls.",
"title": "Baixar dades visibles",
"downloadGeojson": "Baixar dades visibles com a GeoJSON",
"downloadGeoJsonHelper": "Compatible amb QGIS, ArcGIS, ESRI, …",
"downloadCSV": "Baixar dades visibles com a CSV",
"noDataLoaded": "No s'han carregat dades. La baixada estarà disponible aviat",
"includeMetaData": "Incloure metadades (darrer editor, valors calculats, ...)",
"downloadAsPdfHelper": "Ideal per imprimir el mapa actual",
"exporting": "Exportant…"
},
"loginOnlyNeededToEdit": "Si vols ajudar a editar el mapa",
"testing": "Proves - Els canvis no es desaran",
"customThemeIntro": "<h3>Peticions personalitzades</h3>Aquestes són les peticions generades pels usuaris que ens han visitat abans.",
"wikipedia": {
"createNewWikidata": "Crear un ítem de Wikidata",
"noWikipediaPage": "Aquest ítem de Wikidata no té cap pàgina de Viquipèdia corresponent.",
"wikipediaboxTitle": "Viquipèdia",
"loading": "Carregant Viquipèdia...",
"doSearch": "Cerca adalt per veure els resultats",
"noResults": "Res trobat per <i>{search}</i>",
"searchWikidata": "Cercar a Wikidata",
"failed": "Ha fallat la càrrega d'entrada de la Viquipèdia"
},
"histogram": {
"error_loading": "No s'ha pogut carregar l'histograma"
},
"openTheMap": "Obrir el mapa",
"aboutMapcomplete": "<h3>Sobre MapComplete</h3><p>Usa-ho per afegir informació a OpenStreetMap amb una <b>petició.</b> Respon preguntes i en minuts les teves contribucions estaran disponibles arreu. La persona <b>gestionadora</b> defineix elements, preguntes i idiomes per a fer-ho possible.</p><h3>Troba més info</h3><p>MapComplete sempre <b>ofereix el següent pas</b> per aprendre'n més sobre OpenStreetMap.</p><ul><li>Inclòs en una pàgina web et porta a MapComplete a pantalla completa</li><li>Aquesta versió ofereix informació sobre OpenStreetMap</li><li>Veure funciona sense entrar però editar o contribuir requereix un compte d'OSM.</li><li>Si no has entrat et demanarà que ho facis.</li><li>Responent una simple pregunta, pots afegir nous punts al mapa</li><li> Després d'una estona es mostraran les etiquetes actuals , i després els enllaços a la wiki.</li></ul><p></p><br><p>Has trobat alguna <b>incidència</b>? Tens alguna <b> petició </b>? Vols <b>ajudar a traduir</b>? Vés a <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\"> per accedir al codi font</a> o al <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">registre d'incidències.</a> </p><p> Vols veure <b>els teus progressos </b>? Segueix el recompte d'edicions a <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>"
}, },
"favourite": { "favourite": {
"panelIntro": "<h3>La teva interfície personal</h3>Activa les teves capes favorites de totes les interfícies oficials", "panelIntro": "<h3>La teva interfície personal</h3>Activa les teves capes favorites de totes les interfícies oficials",
"loginNeeded": "<h3>Entrar</h3>El disseny personalizat només està disponible pels usuaris d' OpenstreetMap", "loginNeeded": "<h3>Entrar</h3>El disseny personalitzat només està disponible pels usuaris d'OpenstreetMap",
"reload": "Recarregar dades" "reload": "Recarregar dades"
}, },
"reviews": { "reviews": {
@ -157,6 +214,75 @@
"title_singular": "Una revisió", "title_singular": "Una revisió",
"title": "{count} revisions", "title": "{count} revisions",
"saved": "<span class=\"thanks\">Revisió compartida. Gràcies per compartir!</span>", "saved": "<span class=\"thanks\">Revisió compartida. Gràcies per compartir!</span>",
"saving_review": "Desant…" "saving_review": "Desant…",
"no_rating": "Sense qualificació",
"tos": "Si crees una ressenya estàs d'acord amb <a href=\"https://mangrove.reviews/terms\" target=\"_blank\"> els Termes de Servei i política de privacitat de Mangrove.reviews</a>",
"posting_as": "Enviat com",
"attribution": "Les ressenyes funcionen gràcies a <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> i estan disponibles sota <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a>.",
"i_am_affiliated": "<span>Tinc alguna filiació amb aquest objecte</span><br><span class=\"subtle\">MArca-ho si n'ets cap, creador, treballador, …</span>",
"affiliated_reviewer_warning": "(Ressenya afiliada)"
},
"split": {
"split": "Tallar",
"loginToSplit": "Has d'entrar per poder tallar una carretera",
"splitTitle": "Tria al mapa on tallar aquesta carretera",
"hasBeenSplit": "Has tallat aquesta via",
"cancel": "Cancel·lar",
"inviteToSplit": "Talla aquesta carretera en trossos més petits. Això et permetrà afegir informacions diferents a les parts."
},
"delete": {
"isDeleted": "Aquest element s'esborrarà",
"explanations": {
"selectReason": "Selecciona per què s'hauria d'esborrar aquest element",
"hardDelete": "Aquest punt s'esborrarà a OpenStreetMap. Es podria recuperar per part d'un contribuïdor experimentat",
"softDelete": "Aquest element s'actualitzarà i s'amagarà d'aquesta aplicació. <span class=\"subtle\">{reason}</span>"
},
"reasons": {
"test": "És una prova - l'element realment no existeix.",
"duplicate": "Aquest punt és un element duplicat",
"disused": "Aquest element ja no funciona o s'ha eliminat",
"notFound": "No es pot trobar l'element"
},
"readMessages": "Tens missatges sense llegir. Llegeix això abans d'esborrar un punt - algú potser t'ha escrit",
"safeDelete": "Aquest punt es pot esborrar amb seguretat.",
"cancel": "Cancel·lar",
"delete": "Esborrar",
"partOfOthers": "Aquest punt és part d'una via o relació i no es pot esborrar directament.",
"isntAPoint": "Només es poden esborrar punts, l'element seleccionat és una via, àrea o relació.",
"onlyEditedByLoggedInUser": "Aquest punt només pot ser editat per tu, el pots esborrar amb seguretat.",
"whyDelete": "Per què s'hauria d'esborrar aquest punt?",
"cannotBeDeleted": "Aquest element no pot ser esborrat",
"loginToDelete": "Has d'entrar per esborrar un punt",
"notEnoughExperience": "Aquest punt l'ha fet una altra persona.",
"useSomethingElse": "Utilitza un altre editor d'OpenStreetMap per esborrar-lo",
"loading": "Inspeccionant propietats per si aquest element pot ser esborrat."
},
"move": {
"inviteToMoveAgain": "Moure aquest punt un altre cop",
"whyMove": "Per què vols moure aquest punt?",
"reasons": {
"reasonRelocation": "L'objecte ha estat recol·locat a una localització totalment diferent",
"reasonInaccurate": "La localització d'aquest objecte no és ajustada i s'hauria de moure uns metres"
},
"confirmMove": "Moure aquí",
"isRelation": "Aquest element és una relació i no es pot moure",
"inviteToMove": {
"reasonRelocation": "Mou aquest objecte a un altre lloc perquè l'han recolocat",
"generic": "Moure aquest punt",
"reasonInaccurate": "Ajusta la situació del punt"
},
"cancel": "Cancel·lar moviment",
"partOfAWay": "Aquest element és part d'una altra via. Fes servir un altre editor per moure'l.",
"pointIsMoved": "Has mogut el punt",
"loginToMove": "Has d'entrar per moure aquest punt",
"moveTitle": "Moure aquest punt",
"partOfRelation": "Aquest element és part d'una relació. Fes servir un altre editor per moure'l.",
"isWay": "Aquest element és una via. Fes servir un altre editor d'OpenStreetMap per moure'l.",
"zoomInFurther": "Amplia per confirmar aquest moviment",
"cannotBeMoved": "Aquest element no es pot moure.",
"selectReason": "Per què mous aquest objecte?"
},
"multi_apply": {
"autoApply": "Quan canvies els atributs {attr_names}, aquests també es canviaran a d'altres {count} objectes"
} }
} }

View file

@ -102,7 +102,7 @@
"morescreen": { "morescreen": {
"intro": "<h3>Mehr thematische Karten?</h3>Sammeln Sie gerne Geodaten? <br>Es sind weitere Themen verfügbar.", "intro": "<h3>Mehr thematische Karten?</h3>Sammeln Sie gerne Geodaten? <br>Es sind weitere Themen verfügbar.",
"requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an", "requestATheme": "Wenn Sie ein benutzerdefiniertes Thema wünschen, fordern Sie es im Issue Tracker an",
"streetcomplete": "Eine andere, ähnliche Anwendung ist <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>.", "streetcomplete": "Eine ähnliche App ist <a class=\"underline hover:text-blue-800\" href=\"https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete\" target=\"_blank\">StreetComplete</a>.",
"createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu", "createYourOwnTheme": "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu",
"previouslyHiddenTitle": "Zuvor besuchte versteckte Themen", "previouslyHiddenTitle": "Zuvor besuchte versteckte Themen",
"hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt." "hiddenExplanation": "Diese Themen sind nur für Personen zugänglich, die einen Link erhalten haben. Sie haben {hidden_discovered} von {total_hidden} versteckten Themen entdeckt."
@ -111,7 +111,7 @@
"fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.", "fewChangesBefore": "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen.",
"goToInbox": "Posteingang öffnen", "goToInbox": "Posteingang öffnen",
"getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen",
"getStartedNewAccount": " oder <a href='https://www.openstreetmap.org/user/new' target='_blank'>ein neues Konto anlegen</a>", "getStartedNewAccount": " oder <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">ein neues Konto anlegen</a>",
"noTagsSelected": "Keine Tags ausgewählt", "noTagsSelected": "Keine Tags ausgewählt",
"customThemeIntro": "<h3>Benutzerdefinierte Themes</h3>Dies sind zuvor besuchte benutzergenerierte Themen.", "customThemeIntro": "<h3>Benutzerdefinierte Themes</h3>Dies sind zuvor besuchte benutzergenerierte Themen.",
"aboutMapcomplete": "<h3>Über MapComplete</h3><p>Nutzen Sie es, um OpenStreetMap-Informationen zu einem <b>einzigen Thema</b> hinzuzufügen. Beantworten Sie Fragen, und innerhalb weniger Minuten sind Ihre Beiträge überall verfügbar. Der <b>Theme-Maintainer</b> definiert Elemente, Fragen und Sprachen dafür.</p><h3>Mehr erfahren</h3><p>MapComplete bietet immer <b>den nächsten Schritt</b>, um mehr über OpenStreetMap zu erfahren.</p><ul><li>Wenn es in eine Website eingebettet wird, verlinkt der iframe zu einer Vollbildversion von MapComplete</li><li>Die Vollbildversion bietet Infos über OpenStreetMap</li><li>Das Betrachten funktioniert ohne Anmeldung, aber das Bearbeiten erfordert ein OSM-Konto.</li><li>Wenn Sie nicht angemeldet sind, werden Sie dazu aufgefordert</li><li>Sobald Sie eine Frage beantwortet haben, können Sie der Karte neue Punkte hinzufügen</li><li>Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt werden</li></ul><p></p><br><p>Haben Sie <b>ein Problem</b> bemerkt? Haben Sie einen <b>Funktionswunsch</b>? Möchten Sie <b>bei der Übersetzung helfen</b>? Besuchen Sie den <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">Quellcode</a> oder den <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">Issue Tracker</a> </p><p>Möchten Sie <b>Ihren Fortschritt</b> sehen? Verfolgen Sie die Anzahl der Änderungen auf <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>", "aboutMapcomplete": "<h3>Über MapComplete</h3><p>Nutzen Sie es, um OpenStreetMap-Informationen zu einem <b>einzigen Thema</b> hinzuzufügen. Beantworten Sie Fragen, und innerhalb weniger Minuten sind Ihre Beiträge überall verfügbar. Der <b>Theme-Maintainer</b> definiert Elemente, Fragen und Sprachen dafür.</p><h3>Mehr erfahren</h3><p>MapComplete bietet immer <b>den nächsten Schritt</b>, um mehr über OpenStreetMap zu erfahren.</p><ul><li>Wenn es in eine Website eingebettet wird, verlinkt der iframe zu einer Vollbildversion von MapComplete</li><li>Die Vollbildversion bietet Infos über OpenStreetMap</li><li>Das Betrachten funktioniert ohne Anmeldung, aber das Bearbeiten erfordert ein OSM-Konto.</li><li>Wenn Sie nicht angemeldet sind, werden Sie dazu aufgefordert</li><li>Sobald Sie eine Frage beantwortet haben, können Sie der Karte neue Punkte hinzufügen</li><li>Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt werden</li></ul><p></p><br><p>Haben Sie <b>ein Problem</b> bemerkt? Haben Sie einen <b>Funktionswunsch</b>? Möchten Sie <b>bei der Übersetzung helfen</b>? Besuchen Sie den <a href=\"https://github.com/pietervdvn/MapComplete\" target=\"_blank\">Quellcode</a> oder den <a href=\"https://github.com/pietervdvn/MapComplete/issues\" target=\"_blank\">Issue Tracker</a> </p><p>Möchten Sie <b>Ihren Fortschritt</b> sehen? Verfolgen Sie die Anzahl der Änderungen auf <a href=\"{osmcha_link}\" target=\"_blank\">OsmCha</a>.</p>",
@ -140,10 +140,10 @@
}, },
"opening_hours": { "opening_hours": {
"error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.", "error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.",
"open_during_ph": "An Feiertagen ist diese Einrichtung", "open_during_ph": "An Feiertagen ist hier",
"opensAt": "von", "opensAt": "von",
"openTill": "bis", "openTill": "bis",
"not_all_rules_parsed": "Die Öffnungszeiten dieses Geschäfts sind abweichend. Die folgenden Regeln werden im Eingabeelement ignoriert:", "not_all_rules_parsed": "Die Öffnungszeiten sind kompliziert. Die folgenden Regeln werden im Eingabeelement ignoriert:",
"closed_until": "Geschlossen bis {date}", "closed_until": "Geschlossen bis {date}",
"closed_permanently": "Geschlossen auf unbestimmte Zeit", "closed_permanently": "Geschlossen auf unbestimmte Zeit",
"open_24_7": "Durchgehend geöffnet", "open_24_7": "Durchgehend geöffnet",
@ -217,7 +217,7 @@
"i_am_affiliated": "<span>Ich bin angehörig</span><br/><span class='subtle'>Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist</span>", "i_am_affiliated": "<span>Ich bin angehörig</span><br/><span class='subtle'>Überprüfe, ob du Eigentümer, Ersteller, Angestellter etc. bist</span>",
"saving_review": "Speichern…", "saving_review": "Speichern…",
"saved": "<span class=\"thanks\">Bewertung gespeichert. Danke fürs Teilen!</span>", "saved": "<span class=\"thanks\">Bewertung gespeichert. Danke fürs Teilen!</span>",
"tos": "Mit deiner Rezension stimmst du den <a href='https://mangrove.reviews/terms' target='_blank'>AGB und den Datenschutzrichtlinien von Mangrove.reviews zu</a>", "tos": "Mit deiner Bewertung stimmst du den <a href=\"https://mangrove.reviews/terms\" target=\"_blank\">AGB und den Datenschutzrichtlinien von Mangrove.reviews zu</a>",
"plz_login": "Anmelden, um eine Bewertung abzugeben", "plz_login": "Anmelden, um eine Bewertung abzugeben",
"affiliated_reviewer_warning": "(Partner-Rezension)", "affiliated_reviewer_warning": "(Partner-Rezension)",
"attribution": "Rezensionen werden bereitgestellt von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> und sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar." "attribution": "Rezensionen werden bereitgestellt von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> und sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar."

View file

@ -28,7 +28,8 @@
"title": "Welcome to MapComplete", "title": "Welcome to MapComplete",
"featuredThemeTitle": "Featured this week", "featuredThemeTitle": "Featured this week",
"intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.", "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about features of a specific theme and allows to update it.",
"pickTheme": "Pick a theme below to get started." "pickTheme": "Pick a theme below to get started.",
"logIn": "Log in to see other themes you previously visited"
}, },
"split": { "split": {
"split": "Split", "split": "Split",
@ -108,6 +109,7 @@
"openLayerControl": "Open the layer control box", "openLayerControl": "Open the layer control box",
"layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point", "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point",
"hasBeenImported": "This point has already been imported", "hasBeenImported": "This point has already been imported",
"importTags": "The element will receive {tags}",
"zoomInMore": "Zoom in more to import this feature", "zoomInMore": "Zoom in more to import this feature",
"wrongType": "This element is not a point or a way and can not be imported" "wrongType": "This element is not a point or a way and can not be imported"
}, },

View file

@ -260,8 +260,15 @@
"mappings": { "mappings": {
"1": { "1": {
"then": "Stehbank" "then": "Stehbank"
},
"0": {
"then": "Hier gibt es eine normale Sitzbank"
},
"2": {
"then": "Hier gibt es keine Bank"
} }
} },
"question": "Was ist das für eine Bank?"
}, },
"bench_at_pt-name": { "bench_at_pt-name": {
"render": "{name}" "render": "{name}"
@ -433,6 +440,38 @@
} }
}, },
"render": "Fahrrad-Reinigungsdienst" "render": "Fahrrad-Reinigungsdienst"
},
"tagRenderings": {
"bike_cleaning-charge": {
"mappings": {
"0": {
"then": "Kostenloser Reinigungsservice"
},
"2": {
"then": "Der Reinigungsservice ist kostenpflichtig"
},
"1": {
"then": "Kostenlose Nutzung"
}
},
"question": "Wie viel kostet die Nutzung des Reinigungsdienstes?",
"render": "Die Nutzung des Reinigungsdienstes kostet {charge}"
},
"bike_cleaning-service:bicycle:cleaning:charge": {
"mappings": {
"1": {
"then": "Kostenlose Nutzung"
},
"0": {
"then": "Der Reinigungsservice ist kostenlos"
},
"2": {
"then": "Der Reinigungsdienst ist kostenpflichtig, aber der Betrag ist nicht bekannt"
}
},
"question": "Wie viel kostet die Nutzung des Reinigungsdienstes?",
"render": "Nutzung des Reinigungsservice kostet {service:bicycle:cleaning:charge}"
}
} }
}, },
"bike_parking": { "bike_parking": {
@ -563,7 +602,7 @@
}, },
"tagRenderings": { "tagRenderings": {
"Email maintainer": { "Email maintainer": {
"render": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,\n\nMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>" "render": "<a href='mailto:{email}?subject=Fahrradpumpe kaputt&body=Hallo,%0D%0A%0D%0AMit dieser E-Mail möchte ich Ihnen mitteilen, dass die Fahrradpumpe, die sich unter https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} befindet, kaputt ist.'>Melde diese Fahrradpumpe als kaputt</a>"
}, },
"Operational status": { "Operational status": {
"mappings": { "mappings": {
@ -2872,5 +2911,37 @@
}, },
"watermill": { "watermill": {
"name": "Wassermühle" "name": "Wassermühle"
},
"charging_station": {
"filter": {
"0": {
"options": {
"2": {
"question": "Ladestation für Autos"
},
"0": {
"question": "Alle Fahrzeugtypen"
},
"1": {
"question": "Ladestation für Fahrräder"
}
}
},
"1": {
"options": {
"0": {
"question": "Nur funktionierende Ladestationen"
}
}
},
"2": {
"options": {
"0": {
"question": "Alle Anschlüsse"
}
}
}
},
"description": "Eine Ladestation"
} }
} }

View file

@ -602,7 +602,7 @@
}, },
"tagRenderings": { "tagRenderings": {
"Email maintainer": { "Email maintainer": {
"render": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,\n\nWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} is broken.'>Report this bicycle pump as broken</a>" "render": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,%0D%0A%0D%0AWith this email, I&#39;d like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id} is broken.%0D%0A%0D%0A Kind regards'>Report this bicycle pump as broken</a>"
}, },
"Operational status": { "Operational status": {
"mappings": { "mappings": {

View file

@ -563,7 +563,7 @@
}, },
"tagRenderings": { "tagRenderings": {
"Email maintainer": { "Email maintainer": {
"render": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix#{id}.'>Rapporteer deze fietspomp als kapot</a>" "render": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix?lat={_lat}%26lon={_lon}%26z=18%23{id}.%0D%0A%0D%0AMet vriendelijke groeten.'>Rapporteer deze fietspomp als kapot</a>"
}, },
"Operational status": { "Operational status": {
"mappings": { "mappings": {

View file

@ -12,6 +12,64 @@
} }
}, },
"render": "Obra de arte" "render": "Obra de arte"
},
"description": "Diversas obras de arte",
"name": "Obras de arte",
"tagRenderings": {
"artwork-artist_name": {
"question": "Que artista criou isto?",
"render": "Criado por {artist_name}"
},
"artwork-artwork_type": {
"mappings": {
"0": {
"then": "Arquitetura"
},
"1": {
"then": "Mural"
},
"2": {
"then": "Pintura"
},
"3": {
"then": "Escultura"
},
"4": {
"then": "Estátua"
},
"5": {
"then": "Busto"
},
"6": {
"then": "Pedra"
},
"7": {
"then": "Instalação"
},
"8": {
"then": "Graffiti"
},
"9": {
"then": "Relevo"
},
"10": {
"then": "Azulejo (azulejo decorativo espanhol e português)"
},
"11": {
"then": "Ladrilhos"
}
},
"question": "Qual é o tipo desta obra de arte?",
"render": "Isto é um(a) {artwork_type}"
},
"artwork-website": {
"question": "Existe um site com mais informações sobre esta obra de arte?",
"render": "Mais informações <a href='{website}' target='_blank'>neste site</a>"
},
"artwork-wikidata": {
"question": "Que entrada no Wikidata corresponde a <b>esta obra de arte</b>?",
"render": "Corresponde a <a href='https://www.wikidata.org/wiki/{wikidata}' target='_blank'>{wikidata}</a>"
}
} }
}, },
"bench": { "bench": {

View file

@ -1410,5 +1410,42 @@
}, },
"watermill": { "watermill": {
"name": "Водяная мельница" "name": "Водяная мельница"
},
"charging_station": {
"units": {
"0": {
"applicableUnits": {
"0": {
"humanSingular": " минута",
"human": " минут"
},
"1": {
"human": " часов",
"humanSingular": " час"
},
"2": {
"human": " дней",
"humanSingular": " день"
}
}
},
"1": {
"applicableUnits": {
"0": {
"human": "Вольт"
}
}
},
"3": {
"applicableUnits": {
"0": {
"human": "киловатт"
},
"1": {
"human": "мегаватт"
}
}
}
}
} }
} }

View file

@ -139,7 +139,7 @@
"isDeleted": "Удалено", "isDeleted": "Удалено",
"doDelete": "Удалить изображение", "doDelete": "Удалить изображение",
"dontDelete": "Отмена", "dontDelete": "Отмена",
"uploadDone": "<span class=\"thanks\">Ваше изображение добавлено. Спасибо за помощь!</span>", "uploadDone": "Ваше изображение добавлено. Спасибо за помощь!",
"respectPrivacy": "Не фотографируйте людей и номерные знаки. Не загружайте снимки Google Maps, Google Street View и иные источники с закрытой лицензией.", "respectPrivacy": "Не фотографируйте людей и номерные знаки. Не загружайте снимки Google Maps, Google Street View и иные источники с закрытой лицензией.",
"uploadFailed": "Не удалось загрузить изображение. Проверьте, есть ли у вас доступ в Интернет и разрешены ли сторонние API? Браузеры Brave и UMatrix могут блокировать их.", "uploadFailed": "Не удалось загрузить изображение. Проверьте, есть ли у вас доступ в Интернет и разрешены ли сторонние API? Браузеры Brave и UMatrix могут блокировать их.",
"ccb": "под лицензией CC-BY", "ccb": "под лицензией CC-BY",
@ -171,5 +171,12 @@
"reload": "Обновить данные", "reload": "Обновить данные",
"loginNeeded": "<h3>Вход</h3>Личная раскладка доступна только пользователям OpenStreetMap", "loginNeeded": "<h3>Вход</h3>Личная раскладка доступна только пользователям OpenStreetMap",
"panelIntro": "<h3>Ваша личная тема</h3>Активируйте свои любимые слои из официальных тем" "panelIntro": "<h3>Ваша личная тема</h3>Активируйте свои любимые слои из официальных тем"
},
"delete": {
"delete": "Удалить",
"cancel": "Отмена"
},
"split": {
"cancel": "Отмена"
} }
} }

View file

@ -1 +1,116 @@
{} {
"undefined": {
"level": {
"question": "A quina planta està situat aquest element?",
"mappings": {
"3": {
"then": "Situat a primera planta"
},
"2": {
"then": "Situat a planta zero"
},
"1": {
"then": "Situat a planta zero"
},
"0": {
"then": "Situat a planta subterrani"
}
},
"render": "Situat a la planta {level}"
},
"email": {
"question": "Quina és l'adreça de correu electrònic de {name}?"
},
"dog-access": {
"question": "S'accepten gossos en aquest negoci?",
"mappings": {
"3": {
"then": "S'accepten gossos lliures"
},
"2": {
"then": "S'accepten gossos però lligats"
},
"1": {
"then": "<b>No</b> s'accepten gossos"
},
"0": {
"then": "S'accepten gossos"
}
}
},
"description": {
"question": "Hi ha quelcom rellevant que no t'hem preguntat? Afegeix-ho aquí. <br/><span style='font-size: small'>No repeteixis informació que ja hi és</span>"
},
"phone": {
"question": "Quin és el telèfon de {name}?"
},
"payment-options": {
"question": "Quins mètodes de pagament s'accepten aquí?",
"mappings": {
"1": {
"then": "S'accepten targetes de crèdit"
},
"0": {
"then": "S'accepten diners"
}
}
},
"opening_hours": {
"render": "<h3>Horari d'obertura</h3>{opening_hours_table(opening_hours)}",
"question": "Quin és l'horari d'obertura de {name}?"
},
"service:electricity": {
"mappings": {
"2": {
"then": "No hi ha endolls disponibles per als clients però es pot carregar si es demana als responsables"
},
"1": {
"then": "Hi ha aslguns endolls disponibles per als clients de dins, on es poden carregar els aparells electrònics"
},
"0": {
"then": "Està ple d'endolls pels clients de dins, on es poden carregar els aparells electrònics"
},
"3": {
"then": "No hi ha endolls disponibles per als clients"
}
},
"question": "Aquest servei té endolls elèctrics, disponibles pels clients quan hi són dins?"
},
"wheelchair-access": {
"mappings": {
"1": {
"then": "És facilment arribable amb cadira de rodes"
},
"0": {
"then": "Aquest lloc està especialment adaptat per a les cadires de rodes"
},
"3": {
"then": "Aquest lloc no és accessible amb cadira de rodes"
},
"2": {
"then": "És possible fer servir cadira de rodes a aquest lloc però no és fàcil"
}
},
"question": "Aquest lloc és accessible amb cadira de rodes?"
},
"website": {
"question": "Quina és la web de {name}?"
},
"wikipedialink": {
"mappings": {
"0": {
"then": "No enllaçat amb Viquipèdia"
}
},
"question": "Quin és l'ítem a Viquipèdia?"
},
"wikipedia": {
"question": "Quina és la correspondent entitat a Wikidata?",
"mappings": {
"0": {
"then": "No hi ha cap enllaça a Viquipèdia encara"
}
}
}
}
}

View file

@ -94,6 +94,23 @@
} }
}, },
"question": "Was ist der entsprechende Artikel auf Wikipedia?" "question": "Was ist der entsprechende Artikel auf Wikipedia?"
},
"service:electricity": {
"mappings": {
"0": {
"then": "Für Kunden stehen im Innenraum viele Steckdosen zur Verfügung, an denen sie ihre Geräte laden können"
},
"1": {
"then": "Für Kunden stehen im Innenraum wenig Steckdosen zur Verfügung, an denen sie ihre Geräte laden können"
},
"2": {
"then": "Für Kunden stehen im Innenraum keine Steckdosen zur Verfügung, aber Laden von Geräte könnte möglich sein, wenn das Personal gefragt wird"
},
"3": {
"then": "Für Kunden stehen im Innenraum keine Steckdosen zur Verfügung"
}
},
"question": "Gibt es an dieser Einrichtung Steckdosen, an denen Kunden ihre Geräte laden können?"
} }
} }
} }

View file

@ -33,6 +33,13 @@
}, },
"website": { "website": {
"question": "Какой сайт у {name}?" "question": "Какой сайт у {name}?"
},
"dog-access": {
"mappings": {
"0": {
"then": "Собаки разрешены"
}
}
} }
} }
} }

View file

@ -581,6 +581,25 @@
"shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.", "shortDescription": "Eine Karte zum Ansehen und Bearbeiten verschiedener Elementen der Fahrradinfrastruktur.",
"title": "Fahrradinfrastruktur" "title": "Fahrradinfrastruktur"
}, },
"cyclenodes": {
"description": "Diese Karte zeigt Knotenpunktnetzwerke für Radfahrer und erlaubt auch neue Knoten zu mappen",
"layers": {
"1": {
"presets": {
"0": {
"title": "Knotenpunkt"
},
"1": {
"title": "Knotenpunkt im Netzwerk Spree-Neiße"
}
},
"title": {
"render": "Knotenpunkt"
}
}
},
"title": "Fahrrad-Knotenpunktnetzwerke"
},
"cyclestreets": { "cyclestreets": {
"description": "Eine Fahrradstraße ist eine Straße, auf der <b>motorisierter Verkehr Radfahrer nicht überholen darf</b>. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ", "description": "Eine Fahrradstraße ist eine Straße, auf der <b>motorisierter Verkehr Radfahrer nicht überholen darf</b>. Sie sind durch ein spezielles Verkehrsschild gekennzeichnet. Fahrradstraßen gibt es in den Niederlanden und Belgien, aber auch in Deutschland und Frankreich. ",
"layers": { "layers": {

View file

@ -609,6 +609,45 @@
"shortDescription": "A map where you can view and edit things related to the bicycle infrastructure.", "shortDescription": "A map where you can view and edit things related to the bicycle infrastructure.",
"title": "Bicycle infrastructure" "title": "Bicycle infrastructure"
}, },
"cyclenodes": {
"description": "This map shows cycle node networks and allows you to add new nodes easily",
"layers": {
"0": {
"name": "node to node links",
"tagRenderings": {
"node2node-survey:date": {
"question": "When was this node to node link last surveyed?",
"render": "This node to node link was last surveyed on {survey:date}"
}
},
"title": {
"mappings": {
"0": {
"then": "node to node link <strong>{ref}</strong>"
}
},
"render": "node to node link"
}
},
"1": {
"name": "nodes",
"tagRenderings": {
"node-expected_rcn_route_relations": {
"question": "How many other cycle nodes does this node link to?",
"render": "This node links to {expected_rcn_route_relations} other cycle nodes."
},
"node-survey:date": {
"question": "When was this cycle node last surveyed?",
"render": "This cycle node was last surveyed on {survey:date}"
}
},
"title": {
"render": "cycle node <strong>{rcn_ref}</strong>"
}
}
},
"title": "Cycle Node Networks"
},
"cyclestreets": { "cyclestreets": {
"description": "A cyclestreet is is a street where <b>motorized traffic is not allowed to overtake cyclists</b>. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ", "description": "A cyclestreet is is a street where <b>motorized traffic is not allowed to overtake cyclists</b>. They are signposted by a special traffic sign. Cyclestreets can be found in the Netherlands and Belgium, but also in Germany and France. ",
"layers": { "layers": {

View file

@ -753,9 +753,7 @@
"grb": { "grb": {
"description": "GRB Fixup", "description": "GRB Fixup",
"layers": { "layers": {
"3": { "1": {
"description": "Dit gebouw heeft een foutmelding",
"name": "Fixmes op gebouwen",
"tagRenderings": { "tagRenderings": {
"grb-fixme": { "grb-fixme": {
"mappings": { "mappings": {
@ -786,57 +784,6 @@
"grb-unit": { "grb-unit": {
"render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> " "render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
} }
},
"title": {
"mappings": {
"0": {
"then": "{fixme}"
}
},
"render": "{addr:street} {addr:housenumber}"
}
},
"5": {
"description": "Dit gebouw heeft een foutmelding",
"name": "Fixmes op gebouwen",
"tagRenderings": {
"grb-fixme": {
"mappings": {
"0": {
"then": "Geen fixme"
}
},
"question": "Wat zegt de fixme?",
"render": "De fixme is <b>{fixme}</b>"
},
"grb-housenumber": {
"mappings": {
"0": {
"then": "Geen huisnummer"
}
},
"question": "Wat is het huisnummer?",
"render": "Het huisnummer is <b>{addr:housenumber}</b>"
},
"grb-min-level": {
"question": "Hoeveel verdiepingen ontbreken?",
"render": "Dit gebouw begint maar op de {building:min_level} verdieping"
},
"grb-street": {
"question": "Wat is de straat?",
"render": "De straat is <b>{addr:street}</b>"
},
"grb-unit": {
"render": "De wooneenheid-aanduiding is <b>{addr:unit}</b> "
}
},
"title": {
"mappings": {
"0": {
"then": "{fixme}"
}
},
"render": "{addr:street} {addr:housenumber}"
} }
} }
}, },

View file

@ -4,7 +4,7 @@
"title": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)" "title": "Открытая карта АВД (Автоматизированных внешних дефибрилляторов)"
}, },
"artwork": { "artwork": {
"description": "Добро пожаловать на Open Artwork Map, карту статуй, бюстов, граффити и других произведений искусства по всему миру", "description": "Добро пожаловать на открытую карта произведений искусства - карту статуй, бюстов, граффити и других произведений искусства по всему миру",
"title": "Открытая карта произведений искусства" "title": "Открытая карта произведений искусства"
}, },
"benches": { "benches": {
@ -217,7 +217,9 @@
"title": "Кемпинги" "title": "Кемпинги"
}, },
"charging_stations": { "charging_stations": {
"description": "На этой карте вы можно найти и отметить информацию о зарядных станциях" "description": "На этой карте вы можно найти и отметить информацию о зарядных станциях",
"title": "Зарядные станции",
"shortDescription": "Карта зарядных станций по всему миру"
}, },
"climbing": { "climbing": {
"description": "На этой карте вы найдете различные возможности для скалолазания, такие как скалодромы, залы для боулдеринга и скалы на природе.", "description": "На этой карте вы найдете различные возможности для скалолазания, такие как скалодромы, залы для боулдеринга и скалы на природе.",
@ -291,6 +293,15 @@
} }
} }
} }
},
"units+": {
"0": {
"applicableUnits": {
"0": {
"human": " метр"
}
}
}
} }
}, },
"title": "Открытая карта скалолазания" "title": "Открытая карта скалолазания"
@ -302,6 +313,9 @@
"title": { "title": {
"render": "Улица" "render": "Улица"
} }
},
"0": {
"name": "Cyclestreets"
} }
} }
}, },
@ -375,10 +389,10 @@
"hydrant-state": { "hydrant-state": {
"mappings": { "mappings": {
"0": { "0": {
"then": "Гидрант (полностью или частично) в рабочем состоянии." "then": "Гидрант (полностью или частично) в рабочем состоянии"
}, },
"2": { "2": {
"then": "Гидрант демонтирован." "then": "Гидрант демонтирован"
} }
} }
}, },
@ -485,7 +499,7 @@
"title": "Карта карт" "title": "Карта карт"
}, },
"personal": { "personal": {
"description": "Создать персональную тему на основе доступных слоёв тем" "description": "Создать персональную тему на основе доступных слоёв тем. Чтобы отобразить некоторые данные, откройте <a href='#filter'>выбор слоя</a>"
}, },
"playgrounds": { "playgrounds": {
"description": "На этой карте можно найти игровые площадки и добавить дополнительную информацию", "description": "На этой карте можно найти игровые площадки и добавить дополнительную информацию",
@ -507,5 +521,152 @@
"description": "Нанесите все деревья на карту!", "description": "Нанесите все деревья на карту!",
"shortDescription": "Карта деревьев", "shortDescription": "Карта деревьев",
"title": "Деревья" "title": "Деревья"
},
"hackerspaces": {
"layers": {
"0": {
"name": "Хакерспейс",
"tagRenderings": {
"hackerspaces-opening_hours": {
"mappings": {
"0": {
"then": "Открыто 24/7"
}
},
"render": "{opening_hours_table()}"
}
},
"presets": {
"0": {
"title": "Хакерспейс"
}
},
"title": {
"mappings": {
"0": {
"then": " {name}"
}
},
"render": "Хакерспейс"
},
"description": "Хакерспейс"
}
},
"title": "Хакерспейсы"
},
"openwindpowermap": {
"layers": {
"0": {
"title": {
"mappings": {
"0": {
"then": "{name}"
}
}
},
"units": {
"0": {
"applicableUnits": {
"0": {
"human": " мегаватт"
},
"1": {
"human": " киловатт"
},
"2": {
"human": " ватт"
},
"3": {
"human": " гигаватт"
}
}
},
"1": {
"applicableUnits": {
"0": {
"human": " метр"
}
}
}
}
}
},
"title": "Открытая карта ветроэнергетики"
},
"postboxes": {
"layers": {
"1": {
"name": "Почтовые отделения",
"tagRenderings": {
"OH": {
"render": "Часы работы: {opening_hours_table()}"
}
},
"title": {
"render": "Почтовое отделение"
},
"presets": {
"0": {
"title": "Почтовое отделение"
}
}
},
"0": {
"presets": {
"0": {
"title": "почтовый ящик"
}
},
"name": "Почтовые ящики",
"title": {
"render": "Почтовый ящик"
}
}
}
},
"cafes_and_pubs": {
"title": "Кафе и пабы"
},
"cycle_infra": {
"title": "Велосипедная дорожка"
},
"parkings": {
"title": "Парковка"
},
"sidewalks": {
"layers": {
"0": {
"title": {
"render": "{name}"
},
"name": "Тротуары"
}
},
"title": "Тротуары",
"description": "Экспериментальная тема"
},
"street_lighting": {
"layers": {
"2": {
"name": "Все улицы",
"title": {
"render": "Улица"
}
}
},
"title": "Уличное освещение"
},
"uk_addresses": {
"layers": {
"2": {
"description": "Адреса"
}
}
},
"etymology": {
"title": "Открытая этимологическая карта"
},
"observation_towers": {
"title": "Смотровые башни"
} }
} }