From 933c0f007365c21a14af692001d5e616e68da24b Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Sat, 23 Oct 2021 02:46:37 +0200
Subject: [PATCH 01/30] Fix opening of various views when set by
url-parameters, small styling tweaks in the popups
---
Logic/Actors/SelectedFeatureHandler.ts | 28 ++--
Logic/State/FeatureSwitchState.ts | 21 +--
Logic/State/MapState.ts | 11 +-
Logic/Web/QueryParameters.ts | 4 +
UI/Base/Ornament.ts | 11 --
UI/Base/ScrollableFullScreen.ts | 47 ++----
UI/BigComponents/AllDownloads.ts | 3 +-
UI/BigComponents/FullWelcomePaneWithTabs.ts | 2 +-
UI/BigComponents/LeftControls.ts | 26 +---
UI/DefaultGUI.ts | 98 +++++++++----
UI/Popup/FeatureInfoBox.ts | 3 +-
assets/svg/close.svg | 155 ++++++++++----------
css/index-tailwind-output.css | 75 +++++-----
index.css | 1 +
14 files changed, 237 insertions(+), 248 deletions(-)
delete mode 100644 UI/Base/Ornament.ts
diff --git a/Logic/Actors/SelectedFeatureHandler.ts b/Logic/Actors/SelectedFeatureHandler.ts
index b45e87b93..7d431c7af 100644
--- a/Logic/Actors/SelectedFeatureHandler.ts
+++ b/Logic/Actors/SelectedFeatureHandler.ts
@@ -10,7 +10,7 @@ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
* Makes sure the hash shows the selected element and vice-versa.
*/
export default class SelectedFeatureHandler {
- private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "", undefined])
+ private static readonly _no_trigger_on = new Set(["welcome", "copyright", "layers", "new", "filter","", undefined])
private readonly hash: UIEventSource;
private readonly state: {
selectedElement: UIEventSource,
@@ -70,7 +70,7 @@ export default class SelectedFeatureHandler {
this.initialLoad()
}
-
+
/**
* On startup: check if the hash is loaded and eventually zoom to it
@@ -85,6 +85,11 @@ export default class SelectedFeatureHandler {
return;
}
+ if (!(hash.startsWith("node") || hash.startsWith("way") || hash.startsWith("relation"))) {
+ return;
+ }
+
+
OsmObject.DownloadObjectAsync(hash).then(obj => {
try {
@@ -129,26 +134,25 @@ export default class SelectedFeatureHandler {
// If a feature is selected via the hash, zoom there
private zoomToSelectedFeature() {
-
+
const selected = this.state.selectedElement.data
- if(selected === undefined){
+ if (selected === undefined) {
return
}
-
- const centerpoint= GeoOperations.centerpointCoordinates(selected)
+
+ const centerpoint = GeoOperations.centerpointCoordinates(selected)
const location = this.state.locationControl;
location.data.lon = centerpoint[0]
location.data.lat = centerpoint[1]
-
+
const minZoom = Math.max(14, ...(this.state.layoutToUse?.layers?.map(l => l.minzoomVisible) ?? []))
- if(location.data.zoom < minZoom ){
+ if (location.data.zoom < minZoom) {
location.data.zoom = minZoom
}
-
+
location.ping();
-
-
-
+
+
}
}
\ No newline at end of file
diff --git a/Logic/State/FeatureSwitchState.ts b/Logic/State/FeatureSwitchState.ts
index 2315280ca..0f5df51f7 100644
--- a/Logic/State/FeatureSwitchState.ts
+++ b/Logic/State/FeatureSwitchState.ts
@@ -144,31 +144,20 @@ export default class FeatureSwitchState {
}
- this.featureSwitchIsTesting = QueryParameters.GetQueryParameter(
+ this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter(
"test",
""+testingDefaultValue,
"If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org"
- ).map(
- (str) => str === "true",
- [],
- (b) => "" + b
- );
+ )
- this.featureSwitchIsDebugging = QueryParameters.GetQueryParameter(
+ this.featureSwitchIsDebugging = QueryParameters.GetBooleanQueryParameter(
"debug",
"false",
"If true, shows some extra debugging help such as all the available tags on every object"
- ).map(
- (str) => str === "true",
- [],
- (b) => "" + b
- );
+ )
- this.featureSwitchFakeUser = QueryParameters.GetQueryParameter("fake-user", "false",
+ this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter("fake-user", "false",
"If true, 'dryrun' mode is activated and a fake user account is loaded")
- .map(str => str === "true", [], b => "" + b);
-
-
this.overpassUrl = QueryParameters.GetQueryParameter("overpassUrl",
diff --git a/Logic/State/MapState.ts b/Logic/State/MapState.ts
index afcbb1bf2..00a05dd61 100644
--- a/Logic/State/MapState.ts
+++ b/Logic/State/MapState.ts
@@ -119,7 +119,7 @@ export default class MapState extends UserRelatedState {
this.overlayToggles = this.layoutToUse.tileLayerSources.filter(c => c.name !== undefined).map(c => ({
config: c,
- isDisplayed: QueryParameters.GetQueryParameter("overlay-" + c.id, "" + c.defaultState, "Wether or not the overlay " + c.id + " is shown").map(str => str === "true", [], b => "" + b)
+ isDisplayed: QueryParameters.GetBooleanQueryParameter("overlay-" + c.id, "" + c.defaultState, "Wether or not the overlay " + c.id + " is shown")
}))
this.filteredLayers = this.InitializeFilteredLayers()
@@ -170,17 +170,12 @@ export default class MapState extends UserRelatedState {
.map(value => value === "yes", [], enabled => {
return enabled ? "yes" : "";
})
- isDisplayed.addCallbackAndRun(d => console.log("IsDisplayed for layer", layer.id, "is currently", d))
} else {
- isDisplayed = QueryParameters.GetQueryParameter(
+ isDisplayed = QueryParameters.GetBooleanQueryParameter(
"layer-" + layer.id,
"true",
"Wether or not layer " + layer.id + " is shown"
- ).map(
- (str) => str !== "false",
- [],
- (b) => b.toString()
- );
+ )
}
const flayer = {
isDisplayed: isDisplayed,
diff --git a/Logic/Web/QueryParameters.ts b/Logic/Web/QueryParameters.ts
index 36ecc7680..8af95a69b 100644
--- a/Logic/Web/QueryParameters.ts
+++ b/Logic/Web/QueryParameters.ts
@@ -55,6 +55,10 @@ export class QueryParameters {
return source;
}
+ public static GetBooleanQueryParameter(key: string, deflt: string, documentation?: string): UIEventSource{
+ return QueryParameters.GetQueryParameter(key, deflt, documentation).map(str => str === "true", [], b => ""+b)
+ }
+
public static GenerateQueryParameterDocs(): string {
const docs = [QueryParameters.QueryParamDocsIntro];
for (const key in QueryParameters.documentation) {
diff --git a/UI/Base/Ornament.ts b/UI/Base/Ornament.ts
deleted file mode 100644
index 7c2798892..000000000
--- a/UI/Base/Ornament.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import {FixedUiElement} from "./FixedUiElement";
-
-export default class Ornament extends FixedUiElement {
-
- constructor() {
- super("");
- this.SetClass("pt-3 pb-3 flex justify-center box-border")
- }
-
-
-}
\ No newline at end of file
diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts
index da8114f8c..07124f997 100644
--- a/UI/Base/ScrollableFullScreen.ts
+++ b/UI/Base/ScrollableFullScreen.ts
@@ -1,11 +1,11 @@
import {UIElement} from "../UIElement";
import Svg from "../../Svg";
import Combine from "./Combine";
-import Ornament from "./Ornament";
import {FixedUiElement} from "./FixedUiElement";
import {UIEventSource} from "../../Logic/UIEventSource";
import Hash from "../../Logic/Web/Hash";
import BaseUIElement from "../BaseUIElement";
+import Img from "./Img";
/**
*
@@ -18,26 +18,22 @@ import BaseUIElement from "../BaseUIElement";
*/
export default class ScrollableFullScreen extends UIElement {
private static readonly empty = new FixedUiElement("");
- private static readonly _actor = ScrollableFullScreen.InitActor();
private static _currentlyOpen: ScrollableFullScreen;
public isShown: UIEventSource;
private _component: BaseUIElement;
private _fullscreencomponent: BaseUIElement;
- private _hashToSet: string;
constructor(title: ((mode: string) => BaseUIElement), content: ((mode: string) => BaseUIElement),
- hashToSet: string,
isShown: UIEventSource = new UIEventSource(false)
) {
super();
this.isShown = isShown;
- this._hashToSet = hashToSet;
this._component = this.BuildComponent(title("desktop"), content("desktop"), isShown)
.SetClass("hidden md:block");
- this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile"), isShown);
+ this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile").SetClass("pb-20"), isShown);
+
-
const self = this;
isShown.addCallback(isShown => {
if (isShown) {
@@ -56,15 +52,6 @@ export default class ScrollableFullScreen extends UIElement {
Hash.hash.setData(undefined);
}
- private static InitActor() {
- Hash.hash.addCallback(hash => {
- if (hash === undefined || hash === "") {
- ScrollableFullScreen.clear()
- }
- });
- return true;
- }
-
InnerRender(): BaseUIElement {
return this._component;
}
@@ -72,9 +59,6 @@ export default class ScrollableFullScreen extends UIElement {
Activate(): void {
this.isShown.setData(true)
this._fullscreencomponent.AttachTo("fullscreen");
- if (this._hashToSet != undefined) {
- Hash.hash.setData(this._hashToSet)
- }
const fs = document.getElementById("fullscreen");
ScrollableFullScreen._currentlyOpen = this;
fs.classList.remove("hidden")
@@ -83,25 +67,26 @@ export default class ScrollableFullScreen extends UIElement {
private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource) {
const returnToTheMap =
new Combine([
- Svg.back_svg().SetClass("block md:hidden"),
- Svg.close_svg().SetClass("hidden md:block")
- ])
- .onClick(() => {
- isShown.setData(false)
- }).SetClass("mb-2 bg-blue-50 rounded-full w-12 h-12 p-1.5 flex-shrink-0")
+ new Img(Svg.back.replace(/#000000/g,"#cccccc"),true)
+ .SetClass("block md:hidden w-12 h-12 p-2"),
+ new Img(Svg.close.replace(/#000000/g,"#cccccc"),true)
+ .SetClass("hidden md:block w-12 h-12 p-3")
+ ]).SetClass("rounded-full p-0 flex-shrink-0 self-center")
- title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-2 pl-4 max-h-20vh overflow-y-auto")
- const ornament = new Combine([new Ornament().SetStyle("height:5em;")])
- .SetClass("md:hidden h-5")
+ returnToTheMap.onClick(() => {
+ isShown.setData(false)
+ })
+
+ title.SetClass("block text-l sm:text-xl md:text-2xl w-full font-bold p-0 max-h-20vh overflow-y-auto")
return new Combine([
new Combine([
new Combine([returnToTheMap, title])
- .SetClass("border-b-2 border-black shadow md:shadow-none bg-white p-2 pb-0 md:p-0 flex flex-shrink-0"),
- new Combine([content, ornament])
+ .SetClass("border-b-1 border-black shadow bg-white flex flex-shrink-0 pt-1 pb-1 md:pt-0 md:pb-0"),
+ new Combine([content])
.SetClass("block p-2 md:pt-4 w-full h-full overflow-y-auto md:max-h-65vh"),
// We add an ornament which takes around 5em. This is in order to make sure the Web UI doesn't hide
]).SetClass("flex flex-col h-full relative bg-white")
- ]).SetClass("fixed top-0 left-0 right-0 h-screen w-screen md:max-h-65vh md:w-auto md:relative z-above-controls");
+ ]).SetClass("fixed top-0 left-0 right-0 h-screen w-screen md:max-h-65vh md:w-auto md:relative z-above-controls md:rounded-xl overflow-hidden");
}
diff --git a/UI/BigComponents/AllDownloads.ts b/UI/BigComponents/AllDownloads.ts
index 3df26f53d..b49e77bcb 100644
--- a/UI/BigComponents/AllDownloads.ts
+++ b/UI/BigComponents/AllDownloads.ts
@@ -9,12 +9,11 @@ import {DownloadPanel} from "./DownloadPanel";
import {SubtleButton} from "../Base/SubtleButton";
import Svg from "../../Svg";
import ExportPDF from "../ExportPDF";
-import {FixedUiElement} from "../Base/FixedUiElement";
export default class AllDownloads extends ScrollableFullScreen {
constructor(isShown: UIEventSource) {
- super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, "layers", isShown);
+ super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, isShown);
}
private static GenTitle(): BaseUIElement {
diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts
index 8dc7cf668..1862110ce 100644
--- a/UI/BigComponents/FullWelcomePaneWithTabs.ts
+++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts
@@ -30,7 +30,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
super(
() => layoutToUse.title.Clone(),
() => FullWelcomePaneWithTabs.GenerateContents(state, currentTab, isShown),
- undefined, isShown
+ isShown
)
}
diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts
index b92adb54a..4b2328533 100644
--- a/UI/BigComponents/LeftControls.ts
+++ b/UI/BigComponents/LeftControls.ts
@@ -26,12 +26,12 @@ export default class LeftControls extends Combine {
featureSwitchEnableExport: UIEventSource,
featureSwitchExportAsPdf: UIEventSource,
filteredLayers: UIEventSource,
- featureSwitchFilter: UIEventSource,
- selectedElement: UIEventSource
+ featureSwitchFilter: UIEventSource
},
guiState: {
downloadControlIsOpened: UIEventSource,
filterViewIsOpened: UIEventSource,
+ copyrightViewIsOpened: UIEventSource
}) {
const toggledCopyright = new ScrollableFullScreen(
@@ -41,7 +41,7 @@ export default class LeftControls extends Combine {
state.layoutToUse,
new ContributorCount(state).Contributors
),
- undefined
+ guiState.copyrightViewIsOpened
);
const copyrightButton = new Toggle(
@@ -49,8 +49,7 @@ export default class LeftControls extends Combine {
new MapControlButton(Svg.copyright_svg())
.onClick(() => toggledCopyright.isShown.setData(true)),
toggledCopyright.isShown
- )
- .SetClass("p-0.5");
+ ).SetClass("p-0.5");
const toggledDownload = new Toggle(
new AllDownloads(
@@ -73,11 +72,10 @@ export default class LeftControls extends Combine {
() => Translations.t.general.layerSelection.title.Clone(),
() =>
new FilterView(state.filteredLayers, state.overlayToggles).SetClass(
- "block p-1 rounded-full"
+ "block p-1"
),
- undefined,
guiState.filterViewIsOpened
- ),
+ ).SetClass("rounded-lg"),
new MapControlButton(Svg.filter_svg())
.onClick(() => guiState.filterViewIsOpened.setData(true)),
guiState.filterViewIsOpened
@@ -90,18 +88,6 @@ export default class LeftControls extends Combine {
);
- state.locationControl.addCallback(() => {
- // Close the layer selection when the map is moved
- toggledDownload.isEnabled.setData(false);
- copyrightButton.isEnabled.setData(false);
- toggledFilter.isEnabled.setData(false);
- });
-
- state.selectedElement.addCallbackAndRunD((_) => {
- toggledDownload.isEnabled.setData(false);
- copyrightButton.isEnabled.setData(false);
- toggledFilter.isEnabled.setData(false);
- });
super([filterButton,
downloadButtonn,
copyrightButton])
diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts
index fc195f90d..9af616233 100644
--- a/UI/DefaultGUI.ts
+++ b/UI/DefaultGUI.ts
@@ -26,44 +26,71 @@ import StrayClickHandler from "../Logic/Actors/StrayClickHandler";
import Lazy from "./Base/Lazy";
export class DefaultGuiState {
- public readonly welcomeMessageIsOpened;
+ public readonly welcomeMessageIsOpened : UIEventSource;
public readonly downloadControlIsOpened: UIEventSource;
public readonly filterViewIsOpened: UIEventSource;
- public readonly welcomeMessageOpenedTab
+ public readonly copyrightViewIsOpened: UIEventSource;
+ public readonly welcomeMessageOpenedTab: UIEventSource
+ public readonly allFullScreenStates: UIEventSource[] = []
constructor() {
- this.filterViewIsOpened = QueryParameters.GetQueryParameter(
- "filter-toggle",
- "false",
- "Whether or not the filter view is shown"
- ).map(
- (str) => str !== "false",
- [],
- (b) => "" + b
- );
- this.welcomeMessageIsOpened = new UIEventSource(Hash.hash.data === undefined ||
- Hash.hash.data === "" ||
- Hash.hash.data == "welcome");
- this.welcomeMessageOpenedTab = QueryParameters.GetQueryParameter(
+
+
+ this.welcomeMessageOpenedTab = UIEventSource.asFloat(QueryParameters.GetQueryParameter(
"tab",
"0",
`The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >${Constants.userJourney.mapCompleteHelpUnlock} changesets)`
- ).map(
- (str) => (isNaN(Number(str)) ? 0 : Number(str)),
- [],
- (n) => "" + n
- );
- this.downloadControlIsOpened =
- QueryParameters.GetQueryParameter(
+ ));
+ this.welcomeMessageIsOpened = QueryParameters.GetBooleanQueryParameter(
+ "welcome-control-toggle",
+ "false",
+ "Whether or not the welcome panel is shown"
+ )
+ this.downloadControlIsOpened = QueryParameters.GetBooleanQueryParameter(
"download-control-toggle",
"false",
"Whether or not the download panel is shown"
- ).map(
- (str) => str !== "false",
- [],
- (b) => "" + b
- );
+ )
+ this.filterViewIsOpened = QueryParameters.GetBooleanQueryParameter(
+ "filter-toggle",
+ "false",
+ "Whether or not the filter view is shown"
+ )
+ this.copyrightViewIsOpened = QueryParameters.GetBooleanQueryParameter(
+ "copyright-toggle",
+ "false",
+ "Whether or not the copyright view is shown"
+ )
+ if(Hash.hash.data === "download"){
+ this.downloadControlIsOpened.setData(true)
+ }
+ if(Hash.hash.data === "filter"){
+ this.filterViewIsOpened.setData(true)
+ }
+ if(Hash.hash.data === "copyright"){
+ this.copyrightViewIsOpened.setData(true)
+ }
+ if(Hash.hash.data === "" || Hash.hash.data === undefined || Hash.hash.data === "welcome"){
+ this.welcomeMessageIsOpened.setData(true)
+ }
+
+ this.allFullScreenStates.push(this.downloadControlIsOpened, this.filterViewIsOpened, this.copyrightViewIsOpened, this.welcomeMessageIsOpened)
+
+ for (let i = 0; i < this.allFullScreenStates.length; i++){
+ const fullScreenState = this.allFullScreenStates[i];
+ for (let j = 0; j < this.allFullScreenStates.length; j++){
+ if(i == j){
+ continue
+ }
+ const otherState = this.allFullScreenStates[j];
+ fullScreenState.addCallbackAndRunD(isOpened => {
+ if(isOpened){
+ otherState.setData(false)
+ }
+ })
+ }
+ }
}
}
@@ -154,6 +181,7 @@ export default class DefaultGUI {
Toggle.If(state.featureSwitchIframePopoutEnabled, iframePopout),
state.featureSwitchWelcomeMessage
).AttachTo("messagesbox");
+
new LeftControls(state, guiState).AttachTo("bottom-left");
new RightControls(state).AttachTo("bottom-right");
@@ -162,6 +190,21 @@ export default class DefaultGUI {
document
.getElementById("centermessage")
.classList.add("pointer-events-none");
+
+ // We have to ping the welcomeMessageIsOpened and other isOpened-stuff to activate the FullScreenMessage if needed
+ for (const state of guiState.allFullScreenStates) {
+ if(state.data){
+ state.ping()
+ }
+ }
+
+ /**
+ * At last, if the map moves or an element is selected, we close all the panels just as well
+ */
+
+ state.selectedElement.addCallbackAndRunD((_) => {
+ guiState.allFullScreenStates.forEach(s => s.setData(false))
+ });
}
private InitWelcomeMessage() : BaseUIElement{
@@ -211,7 +254,6 @@ export default class DefaultGUI {
const addNewPoint = new ScrollableFullScreen(
() => Translations.t.general.add.title.Clone(),
() => new SimpleAddUI(newPointDialogIsShown, filterViewIsOpened, state),
- "new",
newPointDialogIsShown
);
addNewPoint.isShown.addCallback((isShown) => {
diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts
index 155df8bdc..86f3aa68f 100644
--- a/UI/Popup/FeatureInfoBox.ts
+++ b/UI/Popup/FeatureInfoBox.ts
@@ -26,8 +26,7 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
layerConfig: LayerConfig,
) {
super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig),
- () => FeatureInfoBox.GenerateContent(tags, layerConfig),
- undefined);
+ () => FeatureInfoBox.GenerateContent(tags, layerConfig));
if (layerConfig === undefined) {
throw "Undefined layerconfig";
diff --git a/assets/svg/close.svg b/assets/svg/close.svg
index 1d4344656..ded2ef0e4 100644
--- a/assets/svg/close.svg
+++ b/assets/svg/close.svg
@@ -2,83 +2,80 @@
diff --git a/css/index-tailwind-output.css b/css/index-tailwind-output.css
index 63c10a8d0..ee61e9cea 100644
--- a/css/index-tailwind-output.css
+++ b/css/index-tailwind-output.css
@@ -856,10 +856,6 @@ video {
margin-left: 0.75rem;
}
-.mb-2 {
- margin-bottom: 0.5rem;
-}
-
.mr-4 {
margin-right: 1rem;
}
@@ -924,6 +920,14 @@ video {
margin-right: 0.75rem;
}
+.mb-2 {
+ margin-bottom: 0.5rem;
+}
+
+.mb-0 {
+ margin-bottom: 0px;
+}
+
.box-border {
box-sizing: border-box;
}
@@ -988,10 +992,6 @@ video {
height: 3rem;
}
-.h-5 {
- height: 1.25rem;
-}
-
.h-screen {
height: 100vh;
}
@@ -1279,10 +1279,6 @@ video {
border-width: 2px;
}
-.border-b-2 {
- border-bottom-width: 2px;
-}
-
.border-b {
border-bottom-width: 1px;
}
@@ -1316,11 +1312,6 @@ video {
background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
}
-.bg-blue-50 {
- --tw-bg-opacity: 1;
- background-color: rgba(239, 246, 255, var(--tw-bg-opacity));
-}
-
.bg-blue-100 {
--tw-bg-opacity: 1;
background-color: rgba(219, 234, 254, var(--tw-bg-opacity));
@@ -1386,32 +1377,28 @@ video {
padding: 0.5rem;
}
-.p-0\.5 {
- padding: 0.125rem;
-}
-
.p-0 {
padding: 0px;
}
+.p-0\.5 {
+ padding: 0.125rem;
+}
+
.pl-2 {
padding-left: 0.5rem;
}
-.pt-3 {
- padding-top: 0.75rem;
+.pb-20 {
+ padding-bottom: 5rem;
}
-.pb-3 {
- padding-bottom: 0.75rem;
+.pt-1 {
+ padding-top: 0.25rem;
}
-.pl-4 {
- padding-left: 1rem;
-}
-
-.pb-0 {
- padding-bottom: 0px;
+.pb-1 {
+ padding-bottom: 0.25rem;
}
.pl-1 {
@@ -1426,6 +1413,10 @@ video {
padding-top: 1.5rem;
}
+.pb-3 {
+ padding-bottom: 0.75rem;
+}
+
.pl-5 {
padding-left: 1.25rem;
}
@@ -1434,6 +1425,10 @@ video {
padding-right: 0.75rem;
}
+.pl-4 {
+ padding-left: 1rem;
+}
+
.pr-4 {
padding-right: 1rem;
}
@@ -2187,6 +2182,7 @@ li::marker {
.leaflet-popup-content {
width: 45em !important;
+ margin: 0.25rem !important;
}
.leaflet-div-icon {
@@ -2422,8 +2418,8 @@ li::marker {
flex-direction: row;
}
- .md\:p-0 {
- padding: 0px;
+ .md\:rounded-xl {
+ border-radius: 0.75rem;
}
.md\:p-1 {
@@ -2442,6 +2438,14 @@ li::marker {
padding: 0.75rem;
}
+ .md\:pt-0 {
+ padding-top: 0px;
+ }
+
+ .md\:pb-0 {
+ padding-bottom: 0px;
+ }
+
.md\:pt-4 {
padding-top: 1rem;
}
@@ -2461,11 +2465,6 @@ li::marker {
line-height: 1.75rem;
}
- .md\:shadow-none {
- --tw-shadow: 0 0 #0000;
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- }
-
.md\:w-160 {
width: 40rem;
}
diff --git a/index.css b/index.css
index 6eb113abc..108f02fe2 100644
--- a/index.css
+++ b/index.css
@@ -424,6 +424,7 @@ li::marker {
.leaflet-popup-content {
width: 45em !important;
+ margin: 0.25rem !important;
}
.leaflet-div-icon {
From e0ad1fb4a00c73feefe658f6cb9a26624d69ec81 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:36:38 +0000
Subject: [PATCH 02/30] Translated using Weblate (German)
Currently translated at 67.0% (827 of 1233 strings)
Translation: MapComplete/Layer translations
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layer-translations/de/
---
langs/layers/de.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/langs/layers/de.json b/langs/layers/de.json
index b8866f759..1072f2c7a 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -986,7 +986,7 @@
"then": "Authentifizierung per Debitkarte ist möglich"
},
"7": {
- "then": "Keine Authentifizierung erforderlich"
+ "then": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich"
}
},
"question": "Welche Authentifizierung ist an der Ladestation möglich?"
@@ -2774,4 +2774,4 @@
"watermill": {
"name": "Wassermühle"
}
-}
\ No newline at end of file
+}
From 23ee93fe16da821f89a2cb27caaf8039ce74c145 Mon Sep 17 00:00:00 2001
From: SC
Date: Sat, 23 Oct 2021 13:39:06 +0000
Subject: [PATCH 03/30] Translated using Weblate (Portuguese)
Currently translated at 100.0% (29 of 29 strings)
Translation: MapComplete/shared-questions
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/pt/
---
langs/shared-questions/pt.json | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/langs/shared-questions/pt.json b/langs/shared-questions/pt.json
index fbd730986..2afb0b221 100644
--- a/langs/shared-questions/pt.json
+++ b/langs/shared-questions/pt.json
@@ -78,6 +78,22 @@
}
},
"question": "Este lugar é acessível a utilizadores de cadeiras de rodas?"
+ },
+ "wikipedialink": {
+ "question": "Qual é o item correspondente na Wikipédia?",
+ "mappings": {
+ "0": {
+ "then": "Não vinculado à Wikipédia"
+ }
+ }
+ },
+ "wikipedia": {
+ "question": "Qual é a entidade Wikidata correspondente?",
+ "mappings": {
+ "0": {
+ "then": "Ainda não foi vinculada nenhuma página da Wikipédia"
+ }
+ }
}
}
-}
\ No newline at end of file
+}
From 9d2527661bc6664d52694e14685d5c848a0d6325 Mon Sep 17 00:00:00 2001
From: SC
Date: Sat, 23 Oct 2021 13:39:30 +0000
Subject: [PATCH 04/30] Translated using Weblate (Portuguese)
Currently translated at 41.6% (95 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/pt/
---
langs/pt.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/langs/pt.json b/langs/pt.json
index 92db819cb..21667811d 100644
--- a/langs/pt.json
+++ b/langs/pt.json
@@ -9,7 +9,7 @@
"isDeleted": "Eliminada",
"doDelete": "Remover imagem",
"dontDelete": "Cancelar",
- "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!",
+ "uploadDone": "A sua imagem foi adicionada. Obrigado pela ajuda!",
"respectPrivacy": "Não fotografe pessoas nem placas de veículos. Não envie imagens do Google Maps, do Google Streetview ou outras fontes protegidas por direitos de autor.",
"uploadFailed": "Não foi possível enviar a sua imagem. Está conectado à Internet e permite APIs de terceiros? O navegador \"Brave\" ou o plugin \"uMatrix\" podem estar a bloqueá-los.",
"ccb": "sob a licença CC-BY",
From abebed35515653d96303d9a70355f38a1f982668 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:29:08 +0000
Subject: [PATCH 05/30] Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/
---
langs/de.json | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/langs/de.json b/langs/de.json
index 214ae80e9..bde085d10 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -10,7 +10,7 @@
"ccb": "unter der 'CC-BY-Lizenz'",
"uploadFailed": "Wir konnten Ihr Bild nicht hochladen. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.",
"respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.",
- "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!",
+ "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!",
"dontDelete": "Abbrechen",
"doDelete": "Bild entfernen",
"isDeleted": "Gelöscht"
@@ -24,7 +24,7 @@
"index": {
"#": "Dieser Text wird über die Thema-Auswahlschaltfläche gezeigt, wenn kein Thema geladen ist",
"title": "Willkommen bei MapComplete",
- "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu einem bestimmten Thema angezeigt und angepasst werden können.",
+ "intro": "MapComplete ist eine OpenStreetMap-Anwendung, mit der Informationen zu Objekten eines bestimmten Themas angezeigt und angepasst werden können.",
"pickTheme": "Wähle unten ein Thema, um zu starten."
},
"general": {
@@ -106,7 +106,7 @@
"getStartedNewAccount": " oder ein neues Konto anlegen",
"noTagsSelected": "Keine Tags ausgewählt",
"customThemeIntro": "
Benutzerdefinierte Themes
Dies sind zuvor besuchte benutzergenerierte Themen.",
- "aboutMapcomplete": "
Über MapComplete
MapComplete ist ein OpenStreetMap-Editor, der jedem helfen soll, auf einfache Weise Informationen zu einem Einzelthema hinzuzufügen.
Nur Merkmale, die für ein einzelnes Thema relevant sind, werden mit einigen vordefinierten Fragen gezeigt, um die Dinge einfach und extrem benutzerfreundlich zu halten. Der Themen-Betreuer kann auch eine Sprache für die Schnittstelle wählen, Elemente deaktivieren oder sogar in eine andere Website ohne jegliches UI-Element einbetten.
Ein weiterer wichtiger Teil von MapComplete ist jedoch, immer den nächsten Schritt anzubietenum mehr über OpenStreetMap zu erfahren:
Ein iframe ohne UI-Elemente verlinkt zu einer Vollbildversion
Die Vollbildversion bietet Informationen über OpenStreetMap
Wenn Sie nicht eingeloggt sind, werden Sie gebeten, sich einzuloggen
Wenn Sie eine einzige Frage beantwortet haben, dürfen Sie Punkte hinzufügen
An einem bestimmten Punkt erscheinen die tatsächlich hinzugefügten Tags, die später mit dem Wiki verlinkt werden...
Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? Gehen Sie zum Quellcode oder zur Problemverfolgung.
",
+ "aboutMapcomplete": "
Über MapComplete
Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem einzigen Thema anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der Themen-Maintainer definiert Elemente, Fragen und Sprachen für das Thema.
Mehr erfahren
MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.
Wenn es in eine Website eingebettet wird, verlinkt der Iframe zu einer Vollbildversion von MapComplete
Die Vollbildversion bietet Informationen über OpenStreetMap
Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.
Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden
Nach der Beantwortung einer einzelnen Frage können Sie der Karte neue Punkte hinzufügen
Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt sind
Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker
Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.
",
"backgroundMap": "Hintergrundkarte",
"layerSelection": {
"zoomInToSeeThisLayer": "Vergrößern, um diese Ebene zu sehen",
@@ -164,7 +164,8 @@
"downloadAsPdf": "PDF der aktuellen Karte herunterladen",
"downloadGeojson": "Sichtbare Daten als geojson herunterladen",
"includeMetaData": "Metadaten übernehmen (letzter Bearbeiter, berechnete Werte, ...)",
- "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar"
+ "noDataLoaded": "Noch keine Daten geladen. Download ist in Kürze verfügbar",
+ "licenseInfo": "
Copyright-Hinweis
Die bereitgestellten Daten sind unter ODbL verfügbar. Die Wiederverwendung dieser Daten ist für jeden Zweck frei, aber
Jede Änderung dieser Daten muss unter der gleichen Lizenz veröffentlicht werden
Bitte lesen Sie den vollständigen Copyright-Hinweis für weitere Details"
},
"pdf": {
"versionInfo": "v{version} - erstellt am {date}"
From 38e1918dfa3407f85f1c80042ece79bd27057798 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:34:39 +0000
Subject: [PATCH 06/30] Translated using Weblate (German)
Currently translated at 77.0% (339 of 440 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/
---
langs/themes/de.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index ed6ecf516..cfefb4350 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -633,7 +633,7 @@
"title": "Trinkwasser"
},
"etymology": {
- "description": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia.",
+ "description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
"shortDescription": "Was ist der Ursprung eines Ortsnamens?",
"title": "Open Etymology Map"
},
@@ -1019,4 +1019,4 @@
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
}
-}
\ No newline at end of file
+}
From efe497be09a33789c97911cd5a80a9b03f7cdec8 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:30:07 +0000
Subject: [PATCH 07/30] Translated using Weblate (German)
Currently translated at 100.0% (29 of 29 strings)
Translation: MapComplete/shared-questions
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/shared-questions/de/
---
langs/shared-questions/de.json | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json
index 2baaebe37..cc6df974b 100644
--- a/langs/shared-questions/de.json
+++ b/langs/shared-questions/de.json
@@ -78,6 +78,22 @@
}
},
"question": "Ist dieser Ort mit einem Rollstuhl zugänglich?"
+ },
+ "wikipedia": {
+ "mappings": {
+ "0": {
+ "then": "Es wurde noch keine Wikipedia-Seite verlinkt"
+ }
+ },
+ "question": "Was ist das entsprechende Wikidata Element?"
+ },
+ "wikipedialink": {
+ "mappings": {
+ "0": {
+ "then": "Nicht mit Wikipedia verknüpft"
+ }
+ },
+ "question": "Was ist der entsprechende Artikel auf Wikipedia?"
}
}
-}
\ No newline at end of file
+}
From 181ba5251435248f7f786cce48a80558634f5742 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 10:14:51 +0000
Subject: [PATCH 08/30] Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/
---
langs/de.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/langs/de.json b/langs/de.json
index bde085d10..a5d13b49c 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -73,7 +73,7 @@
"emailOf": "Wie lautet die E-Mail-Adresse der {category}?",
"emailIs": "Die E-Mail-Adresse dieser {category} lautet {email}"
},
- "openStreetMapIntro": "
Eine offene Karte
Wäre es nicht toll, wenn es eine offene Karte gäbe, die von jedem angepasst und benutzt werden könnte? Eine Karte, zu der jeder seine Interessen hinzufügen kann? Dann bräuchte man all diese Websites mit unterschiedlichen, kleinen und inkompatiblen Karten (die immer veraltet sind) nicht mehr.
OpenStreetMap ist diese offene Karte. Die Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Website basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram,... Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!
Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
",
+ "openStreetMapIntro": "
Eine freie Karte
Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.
OpenStreetMap ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!
Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
",
"sharescreen": {
"intro": "
Diese Karte teilen
Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:",
"addToHomeScreen": "
Zum Startbildschirm hinzufügen
Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
From bbcd1f5bee248fd5a74212719b1618901af30d56 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 08:28:51 +0000
Subject: [PATCH 09/30] Translated using Weblate (German)
Currently translated at 84.7% (373 of 440 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/
---
langs/themes/de.json | 122 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 117 insertions(+), 5 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index cfefb4350..d94a860c9 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -635,7 +635,19 @@
"etymology": {
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
"shortDescription": "Was ist der Ursprung eines Ortsnamens?",
- "title": "Open Etymology Map"
+ "title": "Open Etymology Map",
+ "layers": {
+ "1": {
+ "override": {
+ "name": "Straßen ohne Informationen zur Namensherkunft"
+ }
+ },
+ "2": {
+ "override": {
+ "name": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
+ }
+ }
+ }
},
"facadegardens": {
"layers": {
@@ -736,7 +748,7 @@
}
},
"ghostbikes": {
- "description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
+ "description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"title": "Geisterrad"
},
"hackerspaces": {
@@ -925,6 +937,9 @@
"station-name": {
"question": "Wie lautet der Name dieser Feuerwache?"
}
+ },
+ "title": {
+ "render": "Feuerwache"
}
},
"3": {
@@ -937,7 +952,46 @@
}
},
"openwindpowermap": {
- "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen."
+ "description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.",
+ "layers": {
+ "0": {
+ "units": {
+ "0": {
+ "applicableUnits": {
+ "0": {
+ "human": " Megawatt"
+ },
+ "1": {
+ "human": " Kilowatt"
+ },
+ "2": {
+ "human": " Watt"
+ },
+ "3": {
+ "human": " Gigawatt"
+ }
+ }
+ },
+ "1": {
+ "applicableUnits": {
+ "0": {
+ "human": " Meter"
+ }
+ }
+ }
+ },
+ "title": {
+ "render": "Windrad"
+ },
+ "name": "Windrad",
+ "presets": {
+ "0": {
+ "title": "Windrad"
+ }
+ }
+ }
+ },
+ "title": "OpenWindPowerMap"
},
"personal": {
"description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
@@ -955,9 +1009,41 @@
}
}
}
+ },
+ "title": {
+ "render": "Poststelle"
+ },
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "Aktuell geöffnet"
+ }
+ }
+ }
+ },
+ "name": "Poststellen",
+ "presets": {
+ "0": {
+ "title": "Poststelle"
+ }
}
+ },
+ "0": {
+ "name": "Brieflästen",
+ "presets": {
+ "0": {
+ "title": "Briefkasten"
+ }
+ },
+ "title": {
+ "render": "Briefkasten"
+ },
+ "description": "Die Ebene zeigt Briefkästen."
}
- }
+ },
+ "shortDescription": "Eine Karte die Briefkästen und Poststellen anzeigt",
+ "title": "Karte mit Briefkästen und Poststellen"
},
"shops": {
"shortDescription": "Eine bearbeitbare Karte mit grundlegenden Geschäftsinformationen",
@@ -1012,11 +1098,37 @@
}
},
"shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
- "title": "Adressen in Großbritannien"
+ "title": "Adressen in Großbritannien",
+ "tileLayerSources": {
+ "0": {
+ "name": "Grenzverläufe gemäß osmuk.org"
+ }
+ }
},
"waste_basket": {
"description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen",
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
+ },
+ "maps": {
+ "title": "Eine Karte der Karten"
+ },
+ "playgrounds": {
+ "title": "Spielpläzte",
+ "shortDescription": "Eine Karte mit Spielplätzen"
+ },
+ "parkings": {
+ "title": "Parken",
+ "shortDescription": "Diese Karte zeigt Parkplätze",
+ "description": "Diese Karte zeigt Parkplätze"
+ },
+ "natuurpunt": {
+ "title": "Naturschutzgebiete",
+ "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
+ },
+ "observation_towers": {
+ "title": "Beobachtungstürme",
+ "description": "Öffentlich zugänglicher Aussichtsturm",
+ "shortDescription": "Öffentlich zugänglicher Aussichtsturm"
}
}
From 51caa24a716b0ddcddf783a431837c72c8e44afe Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 10:18:02 +0000
Subject: [PATCH 10/30] Translated using Weblate (German)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/de/
---
langs/de.json | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/langs/de.json b/langs/de.json
index a5d13b49c..ae55b7bcc 100644
--- a/langs/de.json
+++ b/langs/de.json
@@ -17,7 +17,7 @@
},
"centerMessage": {
"loadingData": "Daten werden geladen…",
- "zoomIn": "Vergrößern, um die Daten anzuzeigen oder zu bearbeiten",
+ "zoomIn": "Ausschnitt vergrößern, um Daten anzuzeigen oder zu bearbeiten",
"ready": "Erledigt!",
"retrying": "Laden von Daten fehlgeschlagen. Erneuter Versuch in {count} Sekunden …"
},
@@ -28,7 +28,7 @@
"pickTheme": "Wähle unten ein Thema, um zu starten."
},
"general": {
- "loginWithOpenStreetMap": "Anmeldung mit OpenStreetMap",
+ "loginWithOpenStreetMap": "Bei OpenStreetMap anmelden",
"welcomeBack": "Sie sind eingeloggt, willkommen zurück!",
"loginToStart": "Anmelden, um diese Frage zu beantworten",
"search": {
@@ -61,7 +61,7 @@
"disableFiltersExplanation": "Einige Elemente können durch einen Filter ausgeblendet sein",
"disableFilters": "Alle Filter deaktivieren"
},
- "pickLanguage": "Wählen Sie eine Sprache: ",
+ "pickLanguage": "Sprache wählen: ",
"about": "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen",
"nameInlineQuestion": "Der Name dieser {category} ist $$$",
"noNameCategory": "{category} ohne Namen",
@@ -76,7 +76,7 @@
"openStreetMapIntro": "
Eine freie Karte
Wäre es nicht toll, wenn es eine freie Karte gäbe, die von jedem angepasst und genutzt werden könnte? Eine Karte, zu der jeder Informationen hinzufügen kann? Dann bräuchte man all diese Webseiten mit unterschiedlichen, eingeschränkten und veralteten Karten nicht mehr.
OpenStreetMap ist diese freie Karte. Alle Kartendaten können kostenlos verwendet werden (mit Attribution und Veröffentlichung von Änderungen an diesen Daten). Darüber hinaus können Sie die Karte kostenlos ändern und Fehler beheben, wenn Sie ein Konto erstellen. Diese Webseite basiert ebenfalls auf OpenStreetMap. Wenn Sie eine Frage hier beantworten, geht die Antwort auch dorthin.
Viele Menschen und Anwendungen nutzen OpenStreetMap bereits: Maps.me, OsmAnd, verschiedene spezialisierte Routenplaner, die Hintergrundkarten auf Facebook, Instagram, ...<br/>Sogar Apple Maps und Bing Maps verwenden OpenStreetMap in ihren Karten!
Wenn Sie hier einen Punkt hinzufügen oder eine Frage beantworten, wird er nach einer Weile in all diesen Anwendungen sichtbar sein.
",
"sharescreen": {
"intro": "
Diese Karte teilen
Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:",
- "addToHomeScreen": "
Zum Startbildschirm hinzufügen
Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
+ "addToHomeScreen": "
Zum Startbildschirm hinzufügen
Sie können diese Webseite zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der Adressleiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
"embedIntro": "
Auf Ihrer Website einbetten
Bitte betten Sie diese Karte in Ihre Webseite ein. Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen. Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie.",
"copiedToClipboard": "Link in die Zwischenablage kopiert",
"thanksForSharing": "Danke für das Teilen!",
@@ -109,7 +109,7 @@
"aboutMapcomplete": "
Über MapComplete
Mit MapComplete können Sie OpenStreetMap mit Informationen zu einem einzigen Thema anreichern. Beantworten Sie ein paar Fragen, und innerhalb von Minuten werden Ihre Beiträge rund um den Globus verfügbar sein! Der Themen-Maintainer definiert Elemente, Fragen und Sprachen für das Thema.
Mehr erfahren
MapComplete bietet immer den nächsten Schritt, um mehr über OpenStreetMap zu erfahren.
Wenn es in eine Website eingebettet wird, verlinkt der Iframe zu einer Vollbildversion von MapComplete
Die Vollbildversion bietet Informationen über OpenStreetMap
Das Betrachten funktioniert ohne Login, aber das Bearbeiten erfordert ein OSM-Login.
Wenn Sie nicht eingeloggt sind, werden Sie aufgefordert, sich anzumelden
Nach der Beantwortung einer einzelnen Frage können Sie der Karte neue Punkte hinzufügen
Nach einer Weile werden aktuelle OSM-Tags angezeigt, die später mit dem Wiki verlinkt sind
Haben Sie ein Problem bemerkt? Haben Sie einen Funktionswunsch? Möchten Sie bei der Übersetzung helfen? Besuchen Sie den Quellcode oder den Issue Tracker
Möchten Sie Ihren Fortschritt sehen? Verfolgen Sie die Anzahl der Änderungen auf OsmCha.
",
"backgroundMap": "Hintergrundkarte",
"layerSelection": {
- "zoomInToSeeThisLayer": "Vergrößern, um diese Ebene zu sehen",
+ "zoomInToSeeThisLayer": "Ausschnitt vergrößern, um diese Ebene anzuzeigen",
"title": "Ebenen auswählen"
},
"weekdays": {
@@ -170,7 +170,7 @@
"pdf": {
"versionInfo": "v{version} - erstellt am {date}"
},
- "loginOnlyNeededToEdit": "wenn du die Karte bearbeiten willst"
+ "loginOnlyNeededToEdit": "zum Bearbeiten der Karte"
},
"favourite": {
"panelIntro": "
Ihr persönliches Thema
Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen",
From 45c22ea8324c6ebb0e4f0ed9955463b3fe7d0f3e Mon Sep 17 00:00:00 2001
From: kjon
Date: Sun, 24 Oct 2021 12:19:04 +0000
Subject: [PATCH 11/30] Translated using Weblate (German)
Currently translated at 85.6% (377 of 440 strings)
Translation: MapComplete/themes
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/themes/de/
---
langs/themes/de.json | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/langs/themes/de.json b/langs/themes/de.json
index d94a860c9..105fdb9fc 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -334,6 +334,18 @@
},
"question": "Wie heißt diese Kletterroute?",
"render": "{name}"
+ },
+ "Bolts": {
+ "render": "Diese Kletterroute hat {climbing:bolts} Haken",
+ "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?",
+ "mappings": {
+ "1": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ },
+ "0": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ }
+ }
}
},
"title": {
@@ -625,12 +637,12 @@
"title": "Fahrradstraßen"
},
"cyclofix": {
- "description": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.
Weitere Informationen über das Projekt Cyclofix finden Sie unter cyclofix.osm.be.",
- "title": "Cyclofix - eine offene Karte für Radfahrer"
+ "description": "Mit dieser Karte soll Radfahrern eine einfache Lösung bereitgestellt werden, um die passende Farradinfrastruktur zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Ihre Änderungen, werden automatisch in der Datenbank von OpenStreetMap gespeichert und können von anderen frei verwendet werden.
Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.",
+ "title": "Cyclofix - eine freie Karte für Radfahrer"
},
"drinking_water": {
- "description": "Auf dieser Karte sind öffentlich zugängliche Trinkwasserstellen eingezeichnet und können leicht hinzugefügt werden",
- "title": "Trinkwasser"
+ "description": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen",
+ "title": "Trinkwasserstelle"
},
"etymology": {
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
@@ -749,7 +761,7 @@
},
"ghostbikes": {
"description": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
- "title": "Geisterrad"
+ "title": "Geisterräder"
},
"hackerspaces": {
"description": "Auf dieser Karte können Sie Hackerspaces sehen, einen neuen Hackerspace hinzufügen oder Daten direkt aktualisieren",
@@ -1060,8 +1072,8 @@
"title": "Überwachung unter Überwachung"
},
"toilets": {
- "description": "Eine Karte der öffentlichen Toiletten",
- "title": "Offene Toilette Karte"
+ "description": "Eine Karte mit öffentlich zugänglichen Toiletten",
+ "title": "Freie Toilettenkarte"
},
"trees": {
"description": "Kartieren Sie alle Bäume!",
@@ -1127,7 +1139,7 @@
"shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
},
"observation_towers": {
- "title": "Beobachtungstürme",
+ "title": "Aussichtstürme",
"description": "Öffentlich zugänglicher Aussichtsturm",
"shortDescription": "Öffentlich zugänglicher Aussichtsturm"
}
From e25b5e42f963271905bc1143a9a5616388f00d5f Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 13:53:46 +0200
Subject: [PATCH 12/30] Clustering tweak
---
Models/Constants.ts | 2 +-
assets/themes/etymology.json | 6 +++++-
assets/welcome_message.json | 8 ++++----
3 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/Models/Constants.ts b/Models/Constants.ts
index ec2b8dcb8..15f6e94f9 100644
--- a/Models/Constants.ts
+++ b/Models/Constants.ts
@@ -2,7 +2,7 @@ import {Utils} from "../Utils";
export default class Constants {
- public static vNumber = "0.11.0";
+ public static vNumber = "0.11.1";
public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
diff --git a/assets/themes/etymology.json b/assets/themes/etymology.json
index 375cf5bf5..f342e2e2b 100644
--- a/assets/themes/etymology.json
+++ b/assets/themes/etymology.json
@@ -28,6 +28,10 @@
"startZoom": 1,
"widenFactor": 2,
"socialImage": "",
+ "clustering": {
+ "maxZoom": 14,
+ "minNeededElements": 250
+ },
"layers": [
"etymology",
{
@@ -75,5 +79,5 @@
}
}
],
- "hideFromOverview": true
+ "hideFromOverview": false
}
\ No newline at end of file
diff --git a/assets/welcome_message.json b/assets/welcome_message.json
index db7807222..d2a3fc257 100644
--- a/assets/welcome_message.json
+++ b/assets/welcome_message.json
@@ -7,13 +7,13 @@
},
{
"start_date": "2022-04-11",
- "end_date": "2022-04-17",
+ "end_date": "2022-04-18",
"message": "The 15th of april is World Art Day - the ideal moment to go out, enjoy some artwork and add missing artwork to the map. And of course, you can snap some pictures",
"featured_theme": "artwork"
},
{
"start_date": "2022-03-24",
- "end_date": "2022-01-30",
+ "end_date": "2022-03-31",
"message": "The 22nd of March is World Water Day. Time to go out and find all the public drinking water spots!",
"featured_theme": "drinking_water"
},
@@ -40,13 +40,13 @@
},
{
"start_date": "2021-10-25",
- "end_date": "2021-10-31",
+ "end_date": "2021-11-01",
"message": "Did you know you could link OpenStreetMap with Wikidata? With name:etymology:wikidata, it is even possible to link to whom or what a feature is named after. Quite some volunteers have done this - because it is interesting or for the Equal Street Names-project. For this, a new theme has been created which shows the Wikipedia page and Wikimedia-images of this tag and which makes it easy to link them both with the search box. Give it a try!",
"featured_theme": "etymology"
},
{
"start_date": "2021-10-17",
- "end_date": "2021-10-24",
+ "end_date": "2021-10-25",
"message": "
Hi all!
Thanks for using MapComplete. It has been quite a ride since it's inception, a bit over a year ago. MapComplete has grown significantly recently, which you can read more about on in my diary entry.
Furthermore, NicoleLaine made a really cool new theme about postboxes, so make sure to check it out!
",
"featured_theme": "postboxes"
}
From 084d22928b8bd43facaf54436123bf581f79c98c Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 14:02:32 +0200
Subject: [PATCH 13/30] undefined robustness
---
UI/Wikipedia/WikidataPreviewBox.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/UI/Wikipedia/WikidataPreviewBox.ts b/UI/Wikipedia/WikidataPreviewBox.ts
index 9358f3a83..1d7595e6d 100644
--- a/UI/Wikipedia/WikidataPreviewBox.ts
+++ b/UI/Wikipedia/WikidataPreviewBox.ts
@@ -122,13 +122,13 @@ export default class WikidataPreviewBox extends VariableUiElement {
const els : BaseUIElement[] = []
for (const extraProperty of WikidataPreviewBox.extraProperties) {
- let hasAllRequirements =true
+ let hasAllRequirements = true
for (const requirement of extraProperty.requires) {
- if(!wikidata.claims.has("P"+requirement.p)){
+ if(!wikidata.claims?.has("P"+requirement.p)){
hasAllRequirements = false;
break
}
- if(!wikidata.claims.get("P"+requirement.p).has("Q"+requirement.q)){
+ if(!wikidata.claims?.get("P"+requirement.p).has("Q"+requirement.q)){
hasAllRequirements = false;
break
}
From 9a85df94069b2ef19f94bf2e21e8854a0fe4bca4 Mon Sep 17 00:00:00 2001
From: kjon
Date: Sat, 23 Oct 2021 18:39:41 +0000
Subject: [PATCH 14/30] Translated using Weblate (German)
Currently translated at 77.9% (961 of 1233 strings)
Translation: MapComplete/Layer translations
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/layer-translations/de/
---
langs/layers/de.json | 446 +++++++++++++++++++++++++++++++++++++++----
1 file changed, 410 insertions(+), 36 deletions(-)
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 1072f2c7a..8c995a73c 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -947,6 +947,12 @@
"options": {
"0": {
"question": "Alle Anschlüsse"
+ },
+ "7": {
+ "question": "Hat einen
Tesla Supercharger
Stecker"
+ },
+ "3": {
+ "question": "Hat einen
Chademo
Stecker"
}
}
}
@@ -1153,16 +1159,45 @@
"then": "Nutzung kostenlos"
}
},
- "render": "Die Nutzung dieser Ladestation kostet {charge}"
+ "render": "Die Nutzung dieser Ladestation kostet {charge}",
+ "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
},
"maxstay": {
- "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
+ "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}",
+ "question": "Was ist die Höchstdauer des Aufenthalts hier?",
+ "mappings": {
+ "0": {
+ "then": "Keine Höchstparkdauer"
+ }
+ }
},
"ref": {
- "render": "Die Kennziffer ist {ref}"
+ "render": "Die Kennziffer ist {ref}",
+ "question": "Wie lautet die Kennung dieser Ladestation?"
},
"website": {
- "render": "Weitere Informationen auf {website}"
+ "render": "Weitere Informationen auf {website}",
+ "question": "Wie ist die Webseite des Betreibers?"
+ },
+ "payment-options": {
+ "override": {
+ "mappings+": {
+ "0": {
+ "then": "Bezahlung mit einer speziellen App"
+ },
+ "1": {
+ "then": "Bezahlung mit einer Mitgliedskarte"
+ }
+ }
+ }
+ },
+ "email": {
+ "question": "Wie ist die Email-Adresse des Betreibers?",
+ "render": "Bei Problemen senden Sie eine E-Mail an {email}"
+ },
+ "phone": {
+ "render": "Bei Problemen, anrufen unter {phone}",
+ "question": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
}
},
"title": {
@@ -1264,6 +1299,53 @@
}
},
"question": "Was ist das für eine Kreuzung?"
+ },
+ "crossing-continue-through-red": {
+ "mappings": {
+ "0": {
+ "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren "
+ },
+ "1": {
+ "then": "Ein Radfahrer kann bei roter Ampel geradeaus fahren"
+ },
+ "2": {
+ "then": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren"
+ }
+ },
+ "question": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?"
+ },
+ "crossing-has-island": {
+ "mappings": {
+ "0": {
+ "then": "Der Übergang hat eine Verkehrsinsel"
+ },
+ "1": {
+ "then": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern"
+ }
+ },
+ "question": "Gibt es an diesem Übergang eine Verkehrsinsel?"
+ },
+ "crossing-right-turn-through-red": {
+ "mappings": {
+ "1": {
+ "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen"
+ },
+ "2": {
+ "then": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen"
+ },
+ "0": {
+ "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
+ }
+ },
+ "question": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?"
+ },
+ "crossing-button": {
+ "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?",
+ "mappings": {
+ "1": {
+ "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
+ }
+ }
}
},
"title": {
@@ -1291,6 +1373,15 @@
},
"5": {
"then": "Es gibt keinen Radweg"
+ },
+ "2": {
+ "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
+ },
+ "1": {
+ "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
+ },
+ "0": {
+ "then": "Es gibt eine geteilte Fahrspur"
}
},
"question": "Was für ein Radweg ist hier?"
@@ -1308,6 +1399,18 @@
},
"7": {
"then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ },
+ "2": {
+ "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
+ },
+ "3": {
+ "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
+ },
+ "5": {
+ "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
+ },
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
}
},
"question": "Wie eben ist dieser Radweg?"
@@ -1340,9 +1443,22 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
+ },
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
+ },
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {cycleway:surface}"
+ "render": "Der Radweg ist aus {cycleway:surface}",
+ "question": "Was ist der Belag dieses Radwegs?"
},
"Is this a cyclestreet? (For a road)": {
"mappings": {
@@ -1351,6 +1467,9 @@
},
"2": {
"then": "Dies ist keine Fahrradstraße."
+ },
+ "0": {
+ "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
}
},
"question": "Ist das eine Fahrradstraße"
@@ -1372,7 +1491,9 @@
"4": {
"then": "Die Höchstgeschwindigkeit ist 90 km/h"
}
- }
+ },
+ "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h",
+ "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?"
},
"Surface of the road": {
"mappings": {
@@ -1399,9 +1520,25 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
+ },
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
+ "0": {
+ "then": "Dieser Radweg ist nicht befestigt"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {surface}"
+ "render": "Der Radweg ist aus {surface}",
+ "question": "Was ist der Belag dieser Straße?"
},
"Surface of the street": {
"mappings": {
@@ -1416,6 +1553,18 @@
},
"7": {
"then": "Unpassierbar / Keine bereiften Fahrzeuge"
+ },
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ },
+ "2": {
+ "then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
+ },
+ "3": {
+ "then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
+ },
+ "5": {
+ "then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
}
},
"question": "Wie eben ist diese Straße?"
@@ -1424,8 +1573,18 @@
"mappings": {
"3": {
"then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ },
+ "0": {
+ "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
+ },
+ "1": {
+ "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
+ },
+ "2": {
+ "then": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
- }
+ },
+ "question": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"cycleway-lane-track-traffic-signs": {
"mappings": {
@@ -1440,6 +1599,9 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
+ },
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
@@ -1448,8 +1610,18 @@
"mappings": {
"3": {
"then": "Dieser Radweg ist getrennt durch einen Bordstein"
+ },
+ "0": {
+ "then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
+ },
+ "1": {
+ "then": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
+ },
+ "2": {
+ "then": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
- }
+ },
+ "question": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"cycleway-traffic-signs": {
"mappings": {
@@ -1464,6 +1636,9 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
+ },
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
@@ -1495,9 +1670,16 @@
},
"3": {
"then": "Diese Straße ist durchgehend beleuchtet"
+ },
+ "0": {
+ "then": "Diese Straße ist beleuchtet"
}
},
"question": "Ist diese Straße beleuchtet?"
+ },
+ "cycleways_and_roads-cycleway:buffer": {
+ "question": "Wie breit ist der Abstand zwischen Radweg und Straße?",
+ "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
}
},
"title": {
@@ -1563,7 +1745,8 @@
"then": "Dies ist ein normaler automatischer Defibrillator"
}
},
- "render": "Es gibt keine Informationen über den Gerätetyp"
+ "render": "Es gibt keine Informationen über den Gerätetyp",
+ "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?"
},
"defibrillator-defibrillator:location": {
"question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)",
@@ -1648,10 +1831,10 @@
"name": "Visualisierung der Richtung"
},
"drinking_water": {
- "name": "Trinkwasser",
+ "name": "Trinkwasserstelle",
"presets": {
"0": {
- "title": "trinkwasser"
+ "title": "Trinkwasserstelle"
}
},
"tagRenderings": {
@@ -1673,24 +1856,37 @@
},
"2": {
"then": "Diese Trinkwasserstelle wurde geschlossen"
+ },
+ "0": {
+ "then": "Diese Trinkwasserstelle funktioniert"
}
},
"question": "Ist diese Trinkwasserstelle noch in Betrieb?",
"render": "Der Betriebsstatus ist {operational_status"
},
"render-closest-drinking-water": {
- "render": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter"
+ "render": "Eine weitere Trinkwasserstelle liegt {_closest_other_drinking_water_distance} Meter entfernt"
}
},
"title": {
- "render": "Trinkwasser"
+ "render": "Trinkwasserstelle"
}
},
"etymology": {
"description": "Alle Objekte, die eine bekannte Namensherkunft haben",
"tagRenderings": {
"simple etymology": {
- "render": "Benannt nach {name:etymology}"
+ "render": "Benannt nach {name:etymology}",
+ "question": "Wonach ist dieses Objekt benannt? Das könnte auf einem Straßenschild stehen",
+ "mappings": {
+ "0": {
+ "then": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt"
+ }
+ }
+ },
+ "wikipedia-etymology": {
+ "question": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?",
+ "render": "
Wikipedia Artikel zur Namensherkunft
{wikipedia(name:etymology:wikidata):max-height:20rem}"
}
}
},
@@ -1709,11 +1905,26 @@
"question": "Bietet vegan Speisen an"
}
}
+ },
+ "3": {
+ "options": {
+ "0": {
+ "question": "Hat halal Speisen"
+ }
+ }
+ },
+ "1": {
+ "options": {
+ "0": {
+ "question": "Hat vegetarische Speisen"
+ }
+ }
}
},
"presets": {
"0": {
- "title": "Restaurant"
+ "title": "Restaurant",
+ "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden"
},
"1": {
"title": "Schnellimbiss"
@@ -1727,6 +1938,12 @@
"mappings": {
"2": {
"then": "Bietet vorwiegend Pastagerichte an"
+ },
+ "0": {
+ "then": "Dies ist eine Pizzeria"
+ },
+ "1": {
+ "then": "Dies ist eine Pommesbude"
}
},
"question": "Welches Essen gibt es hier?",
@@ -1767,7 +1984,19 @@
"3": {
"then": "Es gibt ausschließlich halal Speisen"
}
- }
+ },
+ "question": "Gibt es im das Restaurant halal Speisen?"
+ },
+ "Vegetarian (no friture)": {
+ "question": "Gibt es im das Restaurant vegetarische Speisen?"
+ },
+ "friture-take-your-container": {
+ "mappings": {
+ "0": {
+ "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart"
+ }
+ },
+ "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet? "
}
},
"title": {
@@ -1779,10 +2008,11 @@
"then": "Schnellrestaurant{name}"
}
}
- }
+ },
+ "name": "Restaurants und Fast Food"
},
"ghost_bike": {
- "name": "Geisterrad",
+ "name": "Geisterräder",
"presets": {
"0": {
"title": "Geisterrad"
@@ -1790,7 +2020,7 @@
},
"tagRenderings": {
"ghost-bike-explanation": {
- "render": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt wird."
+ "render": "Ein Geisterrad ist ein weißes Fahrrad, dass zum Gedenken eines tödlich verunglückten Radfahrers vor Ort aufgestellt wurde."
},
"ghost_bike-inscription": {
"question": "Wie lautet die Inschrift auf diesem Geisterrad?",
@@ -1810,7 +2040,8 @@
"render": "Mehr Informationen"
},
"ghost_bike-start_date": {
- "question": "Wann wurde dieses Geisterrad aufgestellt?"
+ "question": "Wann wurde dieses Geisterrad aufgestellt?",
+ "render": "Aufgestellt am {start_date}"
}
},
"title": {
@@ -1901,12 +2132,18 @@
},
"phone": {
"render": "{phone}"
+ },
+ "Curator": {
+ "question": "Wer ist der Verwalter dieses Naturschutzgebietes? Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist"
+ },
+ "Surface area": {
+ "render": "Grundfläche: {_surface:ha}ha"
}
}
},
"observation_tower": {
- "description": "Türme mit Panoramablick",
- "name": "Beobachtungstürme",
+ "description": "Türme zur Aussicht auf die umgebende Landschaft",
+ "name": "Aussichtstürme",
"presets": {
"0": {
"title": "Beobachtungsturm"
@@ -1919,7 +2156,8 @@
"then": "Eintritt kostenlos"
}
},
- "render": "Der Besuch des Turms kostet {charge}"
+ "render": "Der Besuch des Turms kostet {charge}",
+ "question": "Was kostet der Zugang zu diesem Turm?"
},
"Height": {
"question": "Wie hoch ist dieser Turm?",
@@ -2042,10 +2280,12 @@
"question": "Ist dieser Spielplatz nachts beleuchtet?"
},
"playground-max_age": {
- "render": "Zugang nur für Kinder bis maximal {max_age}"
+ "render": "Zugang nur für Kinder bis maximal {max_age}",
+ "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
},
"playground-min_age": {
- "render": "Zugang nur für Kinder ab {min_age} Jahren"
+ "render": "Zugang nur für Kinder ab {min_age} Jahren",
+ "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
},
"playground-opening_hours": {
"mappings": {
@@ -2066,7 +2306,8 @@
"render": "Betrieben von {operator}"
},
"playground-phone": {
- "render": "{phone}"
+ "render": "{phone}",
+ "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?"
},
"playground-surface": {
"mappings": {
@@ -2224,12 +2465,14 @@
"shops": {
"presets": {
"0": {
- "description": "Ein neues Geschäft hinzufügen"
+ "description": "Ein neues Geschäft hinzufügen",
+ "title": "Geschäft"
}
},
"tagRenderings": {
"shops-phone": {
- "render": "{phone}"
+ "render": "{phone}",
+ "question": "Wie ist die Telefonnummer?"
},
"shops-shop": {
"mappings": {
@@ -2261,6 +2504,15 @@
"shops-website": {
"question": "Wie lautet die Webseite dieses Geschäfts?",
"render": "{website}"
+ },
+ "shops-opening_hours": {
+ "question": "Wie sind die Öffnungszeiten dieses Geschäfts?"
+ },
+ "shops-email": {
+ "question": "Wie ist die Email-Adresse dieses Geschäfts?"
+ },
+ "shops-name": {
+ "question": "Wie ist der Name dieses Geschäfts?"
}
},
"title": {
@@ -2273,7 +2525,9 @@
}
},
"render": "Geschäft"
- }
+ },
+ "name": "Geschäft",
+ "description": "Ein Geschäft"
},
"slow_roads": {
"tagRenderings": {
@@ -2330,6 +2584,9 @@
},
"3": {
"then": "Privat - kein öffentlicher Zugang"
+ },
+ "1": {
+ "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)"
}
},
"question": "Ist dieser Sportplatz öffentlich zugänglich?"
@@ -2338,8 +2595,18 @@
"mappings": {
"3": {
"then": "Termine nach Vereinbarung nicht möglich"
+ },
+ "0": {
+ "then": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich"
+ },
+ "1": {
+ "then": "Für die Nutzung des Sportplatzes wird eine Voranmeldung empfohlen"
+ },
+ "2": {
+ "then": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen"
}
- }
+ },
+ "question": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?"
},
"sport_pitch-opening_hours": {
"mappings": {
@@ -2391,7 +2658,14 @@
"then": "Die Oberfläche ist Beton"
}
},
- "render": "Die Oberfläche ist {surface}"
+ "render": "Die Oberfläche ist {surface}",
+ "question": "Was ist die Oberfläche dieses Sportplatzes?"
+ },
+ "sport_pitch-email": {
+ "question": "Wie ist die Email-Adresse des Betreibers?"
+ },
+ "sport_pitch-phone": {
+ "question": "Wie ist die Telefonnummer des Betreibers?"
}
},
"title": {
@@ -2426,7 +2700,8 @@
"2": {
"then": "Diese Kamera ist möglicherweise im Freien"
}
- }
+ },
+ "question": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?"
},
"Level": {
"question": "Auf welcher Ebene befindet sich diese Kamera?",
@@ -2462,7 +2737,32 @@
},
"camera:mount": {
"question": "Wie ist diese Kamera montiert?",
- "render": "Montageart: {mount}"
+ "render": "Montageart: {mount}",
+ "mappings": {
+ "0": {
+ "then": "Diese Kamera ist an einer Wand montiert"
+ },
+ "1": {
+ "then": "Diese Kamera ist an einer Stange montiert"
+ },
+ "2": {
+ "then": "Diese Kamera ist an der Decke montiert"
+ }
+ }
+ },
+ "Surveillance type: public, outdoor, indoor": {
+ "question": "Um was für eine Überwachungskamera handelt es sich",
+ "mappings": {
+ "2": {
+ "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..."
+ },
+ "1": {
+ "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)"
+ }
+ }
+ },
+ "direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": {
+ "question": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?"
}
},
"title": {
@@ -2597,6 +2897,25 @@
}
},
"question": "Gibt es eine Toilette für Rollstuhlfahrer?"
+ },
+ "toilet-has-paper": {
+ "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?",
+ "mappings": {
+ "1": {
+ "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen"
+ }
+ }
+ },
+ "toilet-handwashing": {
+ "question": "Verfügt diese Toilette über ein Waschbecken?",
+ "mappings": {
+ "0": {
+ "then": "Diese Toilette verfügt über ein Waschbecken"
+ },
+ "1": {
+ "then": "Diese Toilette verfügt über kein Waschbecken"
+ }
+ }
}
},
"title": {
@@ -2651,6 +2970,9 @@
"mappings": {
"1": {
"then": "immergrüner Baum."
+ },
+ "0": {
+ "then": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter."
}
},
"question": "Ist dies ein Nadelbaum oder ein Laubbaum?"
@@ -2667,6 +2989,12 @@
"mappings": {
"3": {
"then": "Nicht als Denkmal registriert"
+ },
+ "0": {
+ "then": " Als Denkmal registriert von der Onroerend Erfgoed Flandern"
+ },
+ "1": {
+ "then": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel"
}
},
"question": "Ist dieser Baum ein Naturdenkmal?"
@@ -2682,7 +3010,8 @@
"2": {
"then": " Dauerhaft blattlos"
}
- }
+ },
+ "question": "Ist dies ein Laub- oder Nadelbaum?"
},
"tree_node-name": {
"mappings": {
@@ -2692,6 +3021,35 @@
},
"question": "Hat der Baum einen Namen?",
"render": "Name: {name}"
+ },
+ "tree_node-ref:OnroerendErfgoed": {
+ "question": "Wie lautet die Kennung der Onroerend Erfgoed Flanders?"
+ },
+ "tree_node-wikidata": {
+ "question": "Was ist das passende Wikidata Element zu diesem Baum?"
+ },
+ "tree-denotation": {
+ "mappings": {
+ "5": {
+ "then": "Dieser Baum steht entlang einer Straße."
+ },
+ "7": {
+ "then": "Dieser Baum steht außerhalb eines städtischen Gebiets."
+ },
+ "2": {
+ "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage."
+ },
+ "3": {
+ "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)."
+ },
+ "0": {
+ "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung."
+ },
+ "1": {
+ "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört."
+ }
+ },
+ "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft."
}
},
"title": {
@@ -2729,7 +3087,8 @@
}
},
"render": "{name}"
- }
+ },
+ "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet."
},
"waste_basket": {
"description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.",
@@ -2764,6 +3123,21 @@
"4": {
"then": "Mülleimer für Drogen"
}
+ },
+ "question": "Um was für einen Abfalleimer handelt es sich?"
+ },
+ "dispensing_dog_bags": {
+ "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?",
+ "mappings": {
+ "1": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ },
+ "2": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ },
+ "0": {
+ "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
+ }
}
}
},
From c99e15eed975a523eec46af1bf4cd0096f86b9a8 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 20:38:57 +0200
Subject: [PATCH 15/30] Add cache timeout option on layerSource
---
Logic/FeatureSource/FeaturePipeline.ts | 23 +++++----
.../TiledFromLocalStorageSource.ts | 50 ++++++++++++++-----
Models/ThemeConfig/Json/LayerConfigJson.ts | 9 +++-
Models/ThemeConfig/Json/LayoutConfigJson.ts | 20 --------
Models/ThemeConfig/LayerConfig.ts | 8 ++-
Models/ThemeConfig/LayoutConfig.ts | 6 +--
assets/themes/grb.json | 2 +-
7 files changed, 67 insertions(+), 51 deletions(-)
diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts
index e8b77bb77..a96f1e278 100644
--- a/Logic/FeatureSource/FeaturePipeline.ts
+++ b/Logic/FeatureSource/FeaturePipeline.ts
@@ -30,14 +30,14 @@ import TileFreshnessCalculator from "./TileFreshnessCalculator";
/**
* The features pipeline ties together a myriad of various datasources:
- *
+ *
* - The Overpass-API
* - The OSM-API
* - Third-party geojson files, either sliced or directly.
- *
+ *
* In order to truly understand this class, please have a look at the following diagram: https://cdn-images-1.medium.com/fit/c/800/618/1*qTK1iCtyJUr4zOyw4IFD7A.jpeg
- *
- *
+ *
+ *
*/
export default class FeaturePipeline {
@@ -68,7 +68,7 @@ export default class FeaturePipeline {
private readonly freshnesses = new Map();
- private readonly oldestAllowedDate: Date = new Date(new Date().getTime() - 60 * 60 * 24 * 30 * 1000);
+ private readonly oldestAllowedDate: Date;
private readonly osmSourceZoomLevel
constructor(
@@ -90,6 +90,11 @@ export default class FeaturePipeline {
this.state = state;
const self = this
+ const expiryInSeconds = Math.min(...state.layoutToUse.layers.map(l => l.maxAgeOfCache))
+ this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
+ for (const layer of state.layoutToUse.layers) {
+ TiledFromLocalStorageSource.cleanCacheForLayer(layer)
+ }
this.osmSourceZoomLevel = state.osmApiTileSize.data;
// milliseconds
const useOsmApi = state.locationControl.map(l => l.zoom > (state.overpassMaxZoom.data ?? 12))
@@ -220,7 +225,7 @@ export default class FeaturePipeline {
maxZoomLevel: state.layoutToUse.clustering.maxZoom,
registerTile: (tile) => {
// We save the tile data for the given layer to local storage
- if(source.layer.layerDef.source.geojsonSource === undefined || source.layer.layerDef.source.isOsmCacheLayer == true){
+ if (source.layer.layerDef.source.geojsonSource === undefined || source.layer.layerDef.source.isOsmCacheLayer == true) {
new SaveTileToLocalStorageActor(tile, tile.tileIndex)
}
perLayerHierarchy.get(source.layer.layerDef.id).registerTile(new RememberingSource(tile))
@@ -257,7 +262,7 @@ export default class FeaturePipeline {
this.runningQuery = updater.runningQuery.map(
overpass => {
console.log("FeaturePipeline: runningQuery state changed. Overpass", overpass ? "is querying," : "is idle,",
- "osmFeatureSource is", osmFeatureSource.isRunning ? "is running and needs "+neededTilesFromOsm.data?.length+" tiles (already got "+ osmFeatureSource.downloadedTiles.size +" tiles )" : "is idle")
+ "osmFeatureSource is", osmFeatureSource.isRunning ? "is running and needs " + neededTilesFromOsm.data?.length + " tiles (already got " + osmFeatureSource.downloadedTiles.size + " tiles )" : "is idle")
return overpass || osmFeatureSource.isRunning.data;
}, [osmFeatureSource.isRunning]
)
@@ -353,7 +358,7 @@ export default class FeaturePipeline {
isActive: useOsmApi.map(b => !b && overpassIsActive.data, [overpassIsActive]),
onBboxLoaded: (bbox, date, downloadedLayers, paddedToZoomLevel) => {
Tiles.MapRange(bbox.containingTileRange(paddedToZoomLevel), (x, y) => {
- const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
+ const tileIndex = Tiles.tile_index(paddedToZoomLevel, x, y)
downloadedLayers.forEach(layer => {
self.freshnesses.get(layer.id).addTileLoad(tileIndex, date)
SaveTileToLocalStorageActor.MarkVisited(layer.id, tileIndex, date)
@@ -412,7 +417,7 @@ export default class FeaturePipeline {
}
public GetFeaturesWithin(layerId: string, bbox: BBox): any[][] {
- if(layerId === "*"){
+ if (layerId === "*") {
return this.GetAllFeaturesWithin(bbox)
}
const requestedHierarchy = this.perLayerHierarchy.get(layerId)
diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
index a2cd50be0..7f69fedc4 100644
--- a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
+++ b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
@@ -5,6 +5,7 @@ import TileHierarchy from "./TileHierarchy";
import SaveTileToLocalStorageActor from "../Actors/SaveTileToLocalStorageActor";
import {Tiles} from "../../../Models/TileRange";
import {BBox} from "../../BBox";
+import LayerConfig from "../../../Models/ThemeConfig/LayerConfig";
export default class TiledFromLocalStorageSource implements TileHierarchy {
public readonly loadedTiles: Map = new Map();
@@ -16,7 +17,7 @@ export default class TiledFromLocalStorageSource implements TileHierarchy()
for (const key of Object.keys(localStorage)) {
- if(!(key.startsWith(prefix) && key.endsWith("-time"))){
+ if (!(key.startsWith(prefix) && key.endsWith("-time"))) {
continue
}
const index = Number(key.substring(prefix.length, key.length - "-time".length))
@@ -28,6 +29,29 @@ export default class TiledFromLocalStorageSource implements TileHierarchy= layer.maxAgeOfCache){
+ const k = prefix+index;
+ localStorage.removeItem(k)
+ localStorage.removeItem(k+"-format")
+ localStorage.removeItem(k+"-time")
+ console.debug("Removed "+k+" from local storage: too old")
+ }
+ }
+ }
+
constructor(layer: FilteredLayer,
handleFeatureSource: (src: FeatureSourceForLayer & Tiled, index: number) => void,
state: {
@@ -36,7 +60,7 @@ export default class TiledFromLocalStorageSource implements TileHierarchy()
const prefix = SaveTileToLocalStorageActor.storageKey + "-" + layer.layerDef.id + "-"
const knownTiles: number[] = Object.keys(localStorage)
@@ -56,9 +80,9 @@ export default class TiledFromLocalStorageSource implements TileHierarchy {
- if(bounds === undefined){
+ if (bounds === undefined) {
return;
}
for (const knownTile of knownTiles) {
-
- if(this.loadedTiles.has(knownTile)){
+
+ if (this.loadedTiles.has(knownTile)) {
continue;
}
- if(this.undefinedTiles.has(knownTile)){
+ if (this.undefinedTiles.has(knownTile)) {
continue;
}
-
- if(!bounds.overlapsWith(BBox.fromTileIndex(knownTile))){
+
+ if (!bounds.overlapsWith(BBox.fromTileIndex(knownTile))) {
continue;
}
self.loadTile(knownTile)
@@ -86,8 +110,8 @@ export default class TiledFromLocalStorageSource implements TileHierarchy
Date: Mon, 25 Oct 2021 20:48:06 +0200
Subject: [PATCH 16/30] Fix changeset comment for move reason
---
UI/Popup/MoveWizard.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/UI/Popup/MoveWizard.ts b/UI/Popup/MoveWizard.ts
index 3606581e2..152dfcaba 100644
--- a/UI/Popup/MoveWizard.ts
+++ b/UI/Popup/MoveWizard.ts
@@ -17,7 +17,6 @@ import ChangeLocationAction from "../../Logic/Osm/Actions/ChangeLocationAction";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import MoveConfig from "../../Models/ThemeConfig/MoveConfig";
import {ElementStorage} from "../../Logic/ElementStorage";
-import ValidatedTextField from "../Input/ValidatedTextField";
import AvailableBaseLayers from "../../Logic/Actors/AvailableBaseLayers";
interface MoveReason {
@@ -152,7 +151,7 @@ export default class MoveWizard extends Toggle {
confirmMove.onClick(() => {
const loc = locationInput.GetValue().data
state.changes.applyAction(new ChangeLocationAction(featureToMove.properties.id, [loc.lon, loc.lat], {
- reason: Translations.WT(reason.text).textFor("en"),
+ reason: reason.changesetCommentValue,
theme: state.layoutToUse.id
}))
featureToMove.properties._lat = loc.lat
From 936cf1bf9fb60a3f7ce78ab56f09387dabb373c7 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 20:50:59 +0200
Subject: [PATCH 17/30] Fix back button behaviour, fix #523
---
UI/Base/ScrollableFullScreen.ts | 19 ++++++++++++++++---
UI/BigComponents/AllDownloads.ts | 2 +-
UI/BigComponents/FullWelcomePaneWithTabs.ts | 1 +
UI/BigComponents/LeftControls.ts | 2 ++
UI/DefaultGUI.ts | 1 +
UI/Popup/FeatureInfoBox.ts | 3 ++-
6 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/UI/Base/ScrollableFullScreen.ts b/UI/Base/ScrollableFullScreen.ts
index 07124f997..b9f134565 100644
--- a/UI/Base/ScrollableFullScreen.ts
+++ b/UI/Base/ScrollableFullScreen.ts
@@ -24,11 +24,16 @@ export default class ScrollableFullScreen extends UIElement {
private _fullscreencomponent: BaseUIElement;
constructor(title: ((mode: string) => BaseUIElement), content: ((mode: string) => BaseUIElement),
+ hashToShow: string,
isShown: UIEventSource = new UIEventSource(false)
) {
super();
this.isShown = isShown;
+ if (hashToShow === undefined) {
+ throw "HashToShow should be defined as it is vital for the 'back' key functionality"
+ }
+
this._component = this.BuildComponent(title("desktop"), content("desktop"), isShown)
.SetClass("hidden md:block");
this._fullscreencomponent = this.BuildComponent(title("mobile"), content("mobile").SetClass("pb-20"), isShown);
@@ -38,10 +43,18 @@ export default class ScrollableFullScreen extends UIElement {
isShown.addCallback(isShown => {
if (isShown) {
self.Activate();
+ Hash.hash.setData(hashToShow)
} else {
ScrollableFullScreen.clear();
}
})
+
+ Hash.hash.addCallback(hash => {
+ if (hash === hashToShow) {
+ return
+ }
+ isShown.setData(false)
+ })
}
private static clear() {
@@ -67,10 +80,10 @@ export default class ScrollableFullScreen extends UIElement {
private BuildComponent(title: BaseUIElement, content: BaseUIElement, isShown: UIEventSource) {
const returnToTheMap =
new Combine([
- new Img(Svg.back.replace(/#000000/g,"#cccccc"),true)
+ new Img(Svg.back.replace(/#000000/g, "#cccccc"), true)
.SetClass("block md:hidden w-12 h-12 p-2"),
- new Img(Svg.close.replace(/#000000/g,"#cccccc"),true)
- .SetClass("hidden md:block w-12 h-12 p-3")
+ new Img(Svg.close.replace(/#000000/g, "#cccccc"), true)
+ .SetClass("hidden md:block w-12 h-12 p-3")
]).SetClass("rounded-full p-0 flex-shrink-0 self-center")
returnToTheMap.onClick(() => {
diff --git a/UI/BigComponents/AllDownloads.ts b/UI/BigComponents/AllDownloads.ts
index b49e77bcb..2586fef3f 100644
--- a/UI/BigComponents/AllDownloads.ts
+++ b/UI/BigComponents/AllDownloads.ts
@@ -13,7 +13,7 @@ import ExportPDF from "../ExportPDF";
export default class AllDownloads extends ScrollableFullScreen {
constructor(isShown: UIEventSource) {
- super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, isShown);
+ super(AllDownloads.GenTitle, AllDownloads.GeneratePanel, "downloads", isShown);
}
private static GenTitle(): BaseUIElement {
diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts
index 1862110ce..10ab25de5 100644
--- a/UI/BigComponents/FullWelcomePaneWithTabs.ts
+++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts
@@ -30,6 +30,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
super(
() => layoutToUse.title.Clone(),
() => FullWelcomePaneWithTabs.GenerateContents(state, currentTab, isShown),
+ "welcome",
isShown
)
}
diff --git a/UI/BigComponents/LeftControls.ts b/UI/BigComponents/LeftControls.ts
index 4b2328533..cc8b9e4c0 100644
--- a/UI/BigComponents/LeftControls.ts
+++ b/UI/BigComponents/LeftControls.ts
@@ -41,6 +41,7 @@ export default class LeftControls extends Combine {
state.layoutToUse,
new ContributorCount(state).Contributors
),
+ "copyright",
guiState.copyrightViewIsOpened
);
@@ -74,6 +75,7 @@ export default class LeftControls extends Combine {
new FilterView(state.filteredLayers, state.overlayToggles).SetClass(
"block p-1"
),
+ "filters",
guiState.filterViewIsOpened
).SetClass("rounded-lg"),
new MapControlButton(Svg.filter_svg())
diff --git a/UI/DefaultGUI.ts b/UI/DefaultGUI.ts
index 9af616233..e259b4f2e 100644
--- a/UI/DefaultGUI.ts
+++ b/UI/DefaultGUI.ts
@@ -254,6 +254,7 @@ export default class DefaultGUI {
const addNewPoint = new ScrollableFullScreen(
() => Translations.t.general.add.title.Clone(),
() => new SimpleAddUI(newPointDialogIsShown, filterViewIsOpened, state),
+ "new",
newPointDialogIsShown
);
addNewPoint.isShown.addCallback((isShown) => {
diff --git a/UI/Popup/FeatureInfoBox.ts b/UI/Popup/FeatureInfoBox.ts
index 86f3aa68f..d1ba0db37 100644
--- a/UI/Popup/FeatureInfoBox.ts
+++ b/UI/Popup/FeatureInfoBox.ts
@@ -26,7 +26,8 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
layerConfig: LayerConfig,
) {
super(() => FeatureInfoBox.GenerateTitleBar(tags, layerConfig),
- () => FeatureInfoBox.GenerateContent(tags, layerConfig));
+ () => FeatureInfoBox.GenerateContent(tags, layerConfig),
+ tags.data.id);
if (layerConfig === undefined) {
throw "Undefined layerconfig";
From d1ecaf75277be7bfdaa7e14f70539acb9e3367a6 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:08:44 +0200
Subject: [PATCH 18/30] Force cache clearing when a new point is added, fix
#522
---
.../Actors/SaveTileToLocalStorageActor.ts | 26 ++++++++++++++++---
Logic/FeatureSource/FeaturePipeline.ts | 12 +++++++--
.../TiledFromLocalStorageSource.ts | 1 -
3 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts
index 092c1a402..83a269b89 100644
--- a/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts
+++ b/Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts
@@ -4,13 +4,14 @@
* Technically, more an Actor then a featuresource, but it fits more neatly this ay
*/
import {FeatureSourceForLayer} from "../FeatureSource";
+import {Tiles} from "../../../Models/TileRange";
export default class SaveTileToLocalStorageActor {
public static readonly storageKey: string = "cached-features";
public static readonly formatVersion: string = "2"
constructor(source: FeatureSourceForLayer, tileIndex: number) {
-
+
source.features.addCallbackAndRunD(features => {
const key = `${SaveTileToLocalStorageActor.storageKey}-${source.layer.layerDef.id}-${tileIndex}`
const now = new Date()
@@ -28,13 +29,30 @@ export default class SaveTileToLocalStorageActor {
}
- public static MarkVisited(layerId: string, tileId: number, freshness: Date){
+ public static MarkVisited(layerId: string, tileId: number, freshness: Date) {
const key = `${SaveTileToLocalStorageActor.storageKey}-${layerId}-${tileId}`
- try{
+ try {
localStorage.setItem(key + "-time", JSON.stringify(freshness.getTime()))
localStorage.setItem(key + "-format", SaveTileToLocalStorageActor.formatVersion)
- }catch(e){
+ } catch (e) {
console.error("Could not mark tile ", key, "as visited")
}
}
+
+ public static poison(layers: string[], lon: number, lat: number) {
+ for (let z = 0; z < 25; z++) {
+
+ const {x, y} = Tiles.embedded_tile(lat, lon, z)
+ const tileId = Tiles.tile_index(z, x, y)
+
+ for (const layerId of layers) {
+
+ const key = `${SaveTileToLocalStorageActor.storageKey}-${layerId}-${tileId}`
+ localStorage.removeItem(key + "-time");
+ localStorage.removeItem(key + "-format")
+ localStorage.removeItem(key)
+ }
+ }
+
+ }
}
\ No newline at end of file
diff --git a/Logic/FeatureSource/FeaturePipeline.ts b/Logic/FeatureSource/FeaturePipeline.ts
index a96f1e278..bcda3f688 100644
--- a/Logic/FeatureSource/FeaturePipeline.ts
+++ b/Logic/FeatureSource/FeaturePipeline.ts
@@ -91,14 +91,22 @@ export default class FeaturePipeline {
const self = this
const expiryInSeconds = Math.min(...state.layoutToUse.layers.map(l => l.maxAgeOfCache))
- this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
for (const layer of state.layoutToUse.layers) {
TiledFromLocalStorageSource.cleanCacheForLayer(layer)
}
+ this.oldestAllowedDate = new Date(new Date().getTime() - expiryInSeconds);
this.osmSourceZoomLevel = state.osmApiTileSize.data;
- // milliseconds
const useOsmApi = state.locationControl.map(l => l.zoom > (state.overpassMaxZoom.data ?? 12))
this.relationTracker = new RelationsTracker()
+
+ state.changes.allChanges.addCallbackAndRun(allChanges => {
+ allChanges.filter(ch => ch.id < 0)
+ .map(ch => ch.changes)
+ .filter(coor => coor["lat"] !== undefined && coor["lon"] !== undefined)
+ .forEach(coor => {
+ SaveTileToLocalStorageActor.poison(state.layoutToUse.layers.map(l => l.id), coor["lon"], coor["lat"])
+ })
+ })
this.sufficientlyZoomed = state.locationControl.map(location => {
diff --git a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
index 7f69fedc4..900393c1e 100644
--- a/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
+++ b/Logic/FeatureSource/TiledFeatureSource/TiledFromLocalStorageSource.ts
@@ -47,7 +47,6 @@ export default class TiledFromLocalStorageSource implements TileHierarchy
Date: Mon, 25 Oct 2021 21:48:45 +0200
Subject: [PATCH 19/30] Regenerate translations
---
.../charging_station/charging_station.json | 41 ++++---
.../charging_station.protojson | 12 +-
assets/layers/crossings/crossings.json | 39 ++++--
.../cycleways_and_roads.json | 114 ++++++++++++------
.../layers/defibrillator/defibrillator.json | 3 +-
.../layers/drinking_water/drinking_water.json | 11 +-
assets/layers/etymology/etymology.json | 12 +-
assets/layers/food/food.json | 30 +++--
assets/layers/ghost_bike/ghost_bike.json | 7 +-
.../layers/nature_reserve/nature_reserve.json | 6 +-
.../observation_tower/observation_tower.json | 7 +-
assets/layers/playground/playground.json | 9 +-
assets/layers/shops/shops.json | 21 ++--
assets/layers/sport_pitch/sport_pitch.json | 24 ++--
.../surveillance_camera.json | 24 ++--
assets/layers/toilet/toilet.json | 15 ++-
assets/layers/tree_node/tree_node.json | 39 ++++--
.../visitor_information_centre.json | 3 +-
assets/layers/waste_basket/waste_basket.json | 15 ++-
assets/themes/climbing/climbing.json | 12 +-
assets/themes/cyclofix/cyclofix.json | 4 +-
.../themes/drinking_water/drinking_water.json | 4 +-
assets/themes/etymology.json | 8 +-
assets/themes/ghostbikes/ghostbikes.json | 4 +-
assets/themes/hailhydrant/hailhydrant.json | 3 +-
assets/themes/maps/maps.json | 6 +-
assets/themes/natuurpunt/natuurpunt.json | 9 +-
.../observation_towers.json | 12 +-
.../openwindpowermap/openwindpowermap.json | 27 +++--
assets/themes/parkings/parkings.json | 12 +-
assets/themes/playgrounds/playgrounds.json | 9 +-
assets/themes/postboxes/postboxes.json | 30 +++--
assets/themes/toilets/toilets.json | 4 +-
assets/themes/uk_addresses/uk_addresses.json | 3 +-
34 files changed, 383 insertions(+), 196 deletions(-)
diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json
index 52d4e30c3..efd8c1a24 100644
--- a/assets/layers/charging_station/charging_station.json
+++ b/assets/layers/charging_station/charging_station.json
@@ -2902,7 +2902,7 @@
"ifnot": "authentication:none=no",
"then": {
"en": "Charging here is (also) possible without authentication",
- "de": "Keine Authentifizierung erforderlich"
+ "de": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich"
}
}
]
@@ -2982,7 +2982,8 @@
"id": "fee/charge",
"question": {
"en": "How much does one have to pay to use this charging station?",
- "nl": "Hoeveel kost het gebruik van dit oplaadpunt?"
+ "nl": "Hoeveel kost het gebruik van dit oplaadpunt?",
+ "de": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
},
"freeform": {
"key": "charge",
@@ -3027,7 +3028,8 @@
"ifnot": "payment:app=no",
"then": {
"en": "Payment is done using a dedicated app",
- "nl": "Betalen via een app van het netwerk"
+ "nl": "Betalen via een app van het netwerk",
+ "de": "Bezahlung mit einer speziellen App"
}
},
{
@@ -3035,7 +3037,8 @@
"ifnot": "payment:membership_card=no",
"then": {
"en": "Payment is done using a membership card",
- "nl": "Betalen via een lidkaart van het netwerk"
+ "nl": "Betalen via een lidkaart van het netwerk",
+ "de": "Bezahlung mit einer Mitgliedskarte"
}
}
]
@@ -3045,7 +3048,8 @@
"id": "maxstay",
"question": {
"en": "What is the maximum amount of time one is allowed to stay here?",
- "nl": "Hoelang mag een voertuig hier blijven staan?"
+ "nl": "Hoelang mag een voertuig hier blijven staan?",
+ "de": "Was ist die Höchstdauer des Aufenthalts hier?"
},
"freeform": {
"key": "maxstay"
@@ -3060,7 +3064,8 @@
"if": "maxstay=unlimited",
"then": {
"en": "No timelimit on leaving your vehicle here",
- "nl": "Geen maximum parkeertijd"
+ "nl": "Geen maximum parkeertijd",
+ "de": "Keine Höchstparkdauer"
}
}
]
@@ -3142,10 +3147,12 @@
{
"id": "phone",
"question": {
- "en": "What number can one call if there is a problem with this charging station?"
+ "en": "What number can one call if there is a problem with this charging station?",
+ "de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
},
"render": {
- "en": "In case of problems, call {phone}"
+ "en": "In case of problems, call {phone}",
+ "de": "Bei Problemen, anrufen unter {phone}"
},
"freeform": {
"key": "phone",
@@ -3155,10 +3162,12 @@
{
"id": "email",
"question": {
- "en": "What is the email address of the operator?"
+ "en": "What is the email address of the operator?",
+ "de": "Wie ist die Email-Adresse des Betreibers?"
},
"render": {
- "en": "In case of problems, send an email to {email}"
+ "en": "In case of problems, send an email to {email}",
+ "de": "Bei Problemen senden Sie eine E-Mail an {email}"
},
"freeform": {
"key": "email",
@@ -3168,7 +3177,8 @@
{
"id": "website",
"question": {
- "en": "What is the website of the operator?"
+ "en": "What is the website of the operator?",
+ "de": "Wie ist die Webseite des Betreibers?"
},
"render": {
"en": "More info on {website}",
@@ -3183,7 +3193,8 @@
{
"id": "ref",
"question": {
- "en": "What is the reference number of this charging station?"
+ "en": "What is the reference number of this charging station?",
+ "de": "Wie lautet die Kennung dieser Ladestation?"
},
"render": {
"en": "Reference number is {ref}",
@@ -3444,7 +3455,8 @@
{
"question": {
"en": "Has a
Stecker"
},
"osmTags": "socket:tesla_supercharger~*"
},
diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson
index 410404d4e..955245640 100644
--- a/assets/layers/charging_station/charging_station.protojson
+++ b/assets/layers/charging_station/charging_station.protojson
@@ -749,5 +749,15 @@
}
]
}
- ]
+ ],
+ "allowMove": {
+ "enableRelocation": false,
+ "enableImproveAccuracy": true
+ },
+ "deletion": {
+ "softDeletionTags": {
+ "and": ["amenity=","disused:amenity=charging_station"]
+ },
+ "neededChangesets": 10
+ }
}
diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json
index 2681fd891..b257f101c 100644
--- a/assets/layers/crossings/crossings.json
+++ b/assets/layers/crossings/crossings.json
@@ -202,7 +202,8 @@
"id": "crossing-has-island",
"question": {
"en": "Does this crossing have an island in the middle?",
- "nl": "Heeft deze oversteekplaats een verkeerseiland in het midden?"
+ "nl": "Heeft deze oversteekplaats een verkeerseiland in het midden?",
+ "de": "Gibt es an diesem Übergang eine Verkehrsinsel?"
},
"condition": "highway=crossing",
"mappings": [
@@ -210,14 +211,16 @@
"if": "crossing:island=yes",
"then": {
"en": "This crossing has an island in the middle",
- "nl": "Deze oversteekplaats heeft een verkeerseiland in het midden"
+ "nl": "Deze oversteekplaats heeft een verkeerseiland in het midden",
+ "de": "Der Übergang hat eine Verkehrsinsel"
}
},
{
"if": "crossing:island=no",
"then": {
"en": "This crossing does not have an island in the middle",
- "nl": "Deze oversteekplaats heeft geen verkeerseiland in het midden"
+ "nl": "Deze oversteekplaats heeft geen verkeerseiland in het midden",
+ "de": "Diese Ampel hat eine Taste, um ein grünes Signal anzufordern"
}
}
]
@@ -261,7 +264,8 @@
"id": "crossing-button",
"question": {
"en": "Does this traffic light have a button to request green light?",
- "nl": "Heeft dit verkeerslicht een knop voor groen licht?"
+ "nl": "Heeft dit verkeerslicht een knop voor groen licht?",
+ "de": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?"
},
"condition": {
"or": [
@@ -281,7 +285,8 @@
"if": "button_operated=no",
"then": {
"en": "This traffic light does not have a button to request green light",
- "nl": "Dit verkeerlicht heeft geen knop voor groen licht"
+ "nl": "Dit verkeerlicht heeft geen knop voor groen licht",
+ "de": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
}
}
]
@@ -290,7 +295,8 @@
"id": "crossing-right-turn-through-red",
"question": {
"en": "Can a cyclist turn right when the light is red?",
- "nl": "Mag een fietser rechtsaf slaan als het licht rood is?"
+ "nl": "Mag een fietser rechtsaf slaan als het licht rood is?",
+ "de": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?"
},
"condition": "highway=traffic_signals",
"mappings": [
@@ -298,7 +304,8 @@
"if": "red_turn:right:bicycle=yes",
"then": {
"en": "A cyclist can turn right if the light is red ",
- "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is "
+ "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is ",
+ "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
},
"hideInAnswer": "_country!=be"
},
@@ -306,7 +313,8 @@
"if": "red_turn:right:bicycle=yes",
"then": {
"en": "A cyclist can turn right if the light is red",
- "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is"
+ "nl": "Een fietser mag wel rechtsaf slaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel rechts abbiegen"
},
"hideInAnswer": "_country=be"
},
@@ -314,7 +322,8 @@
"if": "red_turn:right:bicycle=no",
"then": {
"en": "A cyclist can not turn right if the light is red",
- "nl": "Een fietser mag niet rechtsaf slaan als het licht rood is"
+ "nl": "Een fietser mag niet rechtsaf slaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen"
}
}
]
@@ -323,7 +332,8 @@
"id": "crossing-continue-through-red",
"question": {
"en": "Can a cyclist go straight on when the light is red?",
- "nl": "Mag een fietser rechtdoor gaan als het licht rood is?"
+ "nl": "Mag een fietser rechtdoor gaan als het licht rood is?",
+ "de": "Kann ein Radfahrer bei roter Ampel geradeaus fahren?"
},
"condition": "highway=traffic_signals",
"mappings": [
@@ -331,7 +341,8 @@
"if": "red_turn:straight:bicycle=yes",
"then": {
"en": "A cyclist can go straight on if the light is red ",
- "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is "
+ "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is ",
+ "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren "
},
"hideInAnswer": "_country!=be"
},
@@ -339,7 +350,8 @@
"if": "red_turn:straight:bicycle=yes",
"then": {
"en": "A cyclist can go straight on if the light is red",
- "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is"
+ "nl": "Een fietser mag wel rechtdoor gaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel geradeaus fahren"
},
"hideInAnswer": "_country=be"
},
@@ -347,7 +359,8 @@
"if": "red_turn:straight:bicycle=no",
"then": {
"en": "A cyclist can not go straight on if the light is red",
- "nl": "Een fietser mag niet rechtdoor gaan als het licht rood is"
+ "nl": "Een fietser mag niet rechtdoor gaan als het licht rood is",
+ "de": "Ein Radfahrer kann bei roter Ampel nicht geradeaus fahren"
}
}
]
diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
index b8f476567..da3f5ba20 100644
--- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json
+++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json
@@ -102,21 +102,24 @@
"if": "cycleway=shared_lane",
"then": {
"en": "There is a shared lane",
- "nl": "Er is een fietssuggestiestrook"
+ "nl": "Er is een fietssuggestiestrook",
+ "de": "Es gibt eine geteilte Fahrspur"
}
},
{
"if": "cycleway=lane",
"then": {
"en": "There is a lane next to the road (separated with paint)",
- "nl": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)"
+ "nl": "Er is een fietspad aangrenzend aan de weg (gescheiden met verf)",
+ "de": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
}
},
{
"if": "cycleway=track",
"then": {
"en": "There is a track, but no cycleway drawn separately from this road on the map.",
- "nl": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg."
+ "nl": "Er is een fietspad (los van de weg), maar geen fietspad afzonderlijk getekend naast deze weg.",
+ "de": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
}
},
{
@@ -163,7 +166,8 @@
"if": "lit=yes",
"then": {
"en": "This street is lit",
- "nl": "Deze weg is verlicht"
+ "nl": "Deze weg is verlicht",
+ "de": "Diese Straße ist beleuchtet"
}
},
{
@@ -211,7 +215,8 @@
"if": "cyclestreet=yes",
"then": {
"en": "This is a cyclestreet, and a 30km/h zone.",
- "nl": "Dit is een fietsstraat, en dus een 30km/h zone"
+ "nl": "Dit is een fietsstraat, en dus een 30km/h zone",
+ "de": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
},
"addExtraTags": [
"overtaking:motor_vehicle=no",
@@ -245,7 +250,8 @@
{
"render": {
"en": "The maximum speed on this road is {maxspeed} km/h",
- "nl": "De maximumsnelheid op deze weg is {maxspeed} km/u"
+ "nl": "De maximumsnelheid op deze weg is {maxspeed} km/u",
+ "de": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h"
},
"freeform": {
"key": "maxspeed",
@@ -301,7 +307,8 @@
],
"question": {
"en": "What is the maximum speed in this street?",
- "nl": "Wat is de maximumsnelheid in deze straat?"
+ "nl": "Wat is de maximumsnelheid in deze straat?",
+ "de": "Was ist die Höchstgeschwindigkeit auf dieser Straße?"
},
"id": "Maxspeed (for road)"
},
@@ -352,7 +359,8 @@
"if": "cycleway:surface=paving_stones",
"then": {
"en": "This cycleway is made of smooth paving stones",
- "nl": "Dit fietspad is gemaakt van straatstenen"
+ "nl": "Dit fietspad is gemaakt van straatstenen",
+ "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
}
},
{
@@ -367,7 +375,8 @@
"if": "cycleway:surface=cobblestone",
"then": {
"en": "This cycleway is made of cobblestone (unhewn or sett)",
- "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)"
+ "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)",
+ "de": "Dieser Radweg besteht aus Kopfsteinpflaster"
},
"hideInAnswer": true
},
@@ -375,14 +384,16 @@
"if": "cycleway:surface=unhewn_cobblestone",
"then": {
"en": "This cycleway is made of raw, natural cobblestone",
- "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien"
+ "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien",
+ "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
{
"if": "cycleway:surface=sett",
"then": {
"en": "This cycleway is made of flat, square cobblestone",
- "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien"
+ "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien",
+ "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
}
},
{
@@ -428,7 +439,8 @@
],
"question": {
"en": "What is the surface of the cycleway made from?",
- "nl": "Waaruit is het oppervlak van het fietspad van gemaakt?"
+ "nl": "Waaruit is het oppervlak van het fietspad van gemaakt?",
+ "de": "Was ist der Belag dieses Radwegs?"
},
"id": "Cycleway:surface"
},
@@ -466,28 +478,32 @@
"if": "cycleway:smoothness=intermediate",
"then": {
"en": "Usable for normal wheels: city bike, wheelchair, scooter",
- "nl": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter"
+ "nl": "Geschikt voor normale wielen: stadsfiets, rolstoel, scooter",
+ "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
}
},
{
"if": "cycleway:smoothness=bad",
"then": {
"en": "Usable for robust wheels: trekking bike, car, rickshaw",
- "nl": "Geschikt voor brede wielen: trekfiets, auto, rickshaw"
+ "nl": "Geschikt voor brede wielen: trekfiets, auto, rickshaw",
+ "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
}
},
{
"if": "cycleway:smoothness=very_bad",
"then": {
"en": "Usable for vehicles with high clearance: light duty off-road vehicle",
- "nl": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen"
+ "nl": "Geschikt voor voertuigen met hoge banden: lichte terreinwagen",
+ "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
}
},
{
"if": "cycleway:smoothness=horrible",
"then": {
"en": "Usable for off-road vehicles: heavy duty off-road vehicle",
- "nl": "Geschikt voor terreinwagens: zware terreinwagen"
+ "nl": "Geschikt voor terreinwagens: zware terreinwagen",
+ "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
}
},
{
@@ -523,7 +539,8 @@
"if": "surface=unpaved",
"then": {
"en": "This cycleway is unhardened",
- "nl": "Dit fietspad is onverhard"
+ "nl": "Dit fietspad is onverhard",
+ "de": "Dieser Radweg ist nicht befestigt"
},
"hideInAnswer": true
},
@@ -548,7 +565,8 @@
"if": "surface=paving_stones",
"then": {
"en": "This cycleway is made of smooth paving stones",
- "nl": "Dit fietspad is gemaakt van straatstenen"
+ "nl": "Dit fietspad is gemaakt van straatstenen",
+ "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
}
},
{
@@ -563,7 +581,8 @@
"if": "surface=cobblestone",
"then": {
"en": "This cycleway is made of cobblestone (unhewn or sett)",
- "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)"
+ "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)",
+ "de": "Dieser Radweg besteht aus Kopfsteinpflaster"
},
"hideInAnswer": true
},
@@ -571,14 +590,16 @@
"if": "surface=unhewn_cobblestone",
"then": {
"en": "This cycleway is made of raw, natural cobblestone",
- "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien"
+ "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien",
+ "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
{
"if": "surface=sett",
"then": {
"en": "This cycleway is made of flat, square cobblestone",
- "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien"
+ "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien",
+ "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
}
},
{
@@ -624,7 +645,8 @@
],
"question": {
"en": "What is the surface of the street made from?",
- "nl": "Waaruit is het oppervlak van de straat gemaakt?"
+ "nl": "Waaruit is het oppervlak van de straat gemaakt?",
+ "de": "Was ist der Belag dieser Straße?"
},
"id": "Surface of the road"
},
@@ -658,25 +680,29 @@
{
"if": "smoothness=intermediate",
"then": {
- "en": "Usable for normal wheels: city bike, wheelchair, scooter"
+ "en": "Usable for normal wheels: city bike, wheelchair, scooter",
+ "de": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
}
},
{
"if": "smoothness=bad",
"then": {
- "en": "Usable for robust wheels: trekking bike, car, rickshaw"
+ "en": "Usable for robust wheels: trekking bike, car, rickshaw",
+ "de": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
}
},
{
"if": "smoothness=very_bad",
"then": {
- "en": "Usable for vehicles with high clearance: light duty off-road vehicle"
+ "en": "Usable for vehicles with high clearance: light duty off-road vehicle",
+ "de": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
}
},
{
"if": "smoothness=horrible",
"then": {
- "en": "Usable for off-road vehicles: heavy duty off-road vehicle"
+ "en": "Usable for off-road vehicles: heavy duty off-road vehicle",
+ "de": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
}
},
{
@@ -748,7 +774,8 @@
"if": "cycleway:traffic_sign~BE:D7;.*",
"then": {
"en": "Compulsory cycleway (with supplementary sign) ",
- "nl": "Verplicht fietspad (met onderbord) "
+ "nl": "Verplicht fietspad (met onderbord) ",
+ "de": "Vorgeschriebener Radweg (mit Zusatzschild) "
},
"hideInAnswer": true
},
@@ -821,7 +848,8 @@
"if": "traffic_sign~BE:D7;.*",
"then": {
"en": "Compulsory cycleway (with supplementary sign) ",
- "nl": "Verplicht fietspad (met onderbord) "
+ "nl": "Verplicht fietspad (met onderbord) ",
+ "de": "Vorgeschriebener Radweg (mit Zusatzschild) "
},
"hideInAnswer": true
},
@@ -1055,11 +1083,13 @@
{
"render": {
"en": "The buffer besides this cycleway is {cycleway:buffer} m",
- "nl": "De schrikafstand van dit fietspad is {cycleway:buffer} m"
+ "nl": "De schrikafstand van dit fietspad is {cycleway:buffer} m",
+ "de": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
},
"question": {
"en": "How wide is the gap between the cycleway and the road?",
- "nl": "Hoe breed is de ruimte tussen het fietspad en de weg?"
+ "nl": "Hoe breed is de ruimte tussen het fietspad en de weg?",
+ "de": "Wie breit ist der Abstand zwischen Radweg und Straße?"
},
"condition": {
"or": [
@@ -1081,7 +1111,8 @@
"id": "cyclelan-segregation",
"question": {
"en": "How is this cycleway separated from the road?",
- "nl": "Hoe is dit fietspad gescheiden van de weg?"
+ "nl": "Hoe is dit fietspad gescheiden van de weg?",
+ "de": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"condition": {
"or": [
@@ -1094,21 +1125,24 @@
"if": "cycleway:separation=dashed_line",
"then": {
"en": "This cycleway is separated by a dashed line",
- "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
}
},
{
"if": "cycleway:separation=solid_line",
"then": {
"en": "This cycleway is separated by a solid line",
- "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
}
},
{
"if": "cycleway:separation=parking_lane",
"then": {
"en": "This cycleway is separated by a parking lane",
- "nl": "Dit fietspad is gescheiden van de weg met parkeervakken"
+ "nl": "Dit fietspad is gescheiden van de weg met parkeervakken",
+ "de": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
},
{
@@ -1125,7 +1159,8 @@
"id": "cycleway-segregation",
"question": {
"en": "How is this cycleway separated from the road?",
- "nl": "Hoe is dit fietspad gescheiden van de weg?"
+ "nl": "Hoe is dit fietspad gescheiden van de weg?",
+ "de": "Wie ist der Radweg von der Straße abgegrenzt?"
},
"condition": {
"or": [
@@ -1138,21 +1173,24 @@
"if": "separation=dashed_line",
"then": {
"en": "This cycleway is separated by a dashed line",
- "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een onderbroken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
}
},
{
"if": "separation=solid_line",
"then": {
"en": "This cycleway is separated by a solid line",
- "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep"
+ "nl": "Dit fietspad is gescheiden van de weg met een doorgetrokken streep",
+ "de": "Der Radweg ist abgegrenzt durch eine durchgezogene Linie"
}
},
{
"if": "separation=parking_lane",
"then": {
"en": "This cycleway is separated by a parking lane",
- "nl": "Dit fietspad is gescheiden van de weg met parkeervakken"
+ "nl": "Dit fietspad is gescheiden van de weg met parkeervakken",
+ "de": "Der Radweg ist abgegrenzt durch eine Parkspur"
}
},
{
diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json
index 88b63ee64..f6b335358 100644
--- a/assets/layers/defibrillator/defibrillator.json
+++ b/assets/layers/defibrillator/defibrillator.json
@@ -209,7 +209,8 @@
"en": "Is this a a regular automatic defibrillator or a manual defibrillator for professionals only?",
"nl": "Is dit een gewone automatische defibrillator of een manueel toestel enkel voor professionals?",
"fr": "Est-ce un défibrillateur automatique normal ou un défibrillateur manuel à usage professionnel uniquement ?",
- "it": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?"
+ "it": "Si tratta di un normale defibrillatore automatico o un defibrillatore manuale riservato ai professionisti?",
+ "de": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?"
},
"freeform": {
"key": "defibrillator"
diff --git a/assets/layers/drinking_water/drinking_water.json b/assets/layers/drinking_water/drinking_water.json
index a8081734c..1170a823e 100644
--- a/assets/layers/drinking_water/drinking_water.json
+++ b/assets/layers/drinking_water/drinking_water.json
@@ -5,7 +5,7 @@
"nl": "Drinkbaar water",
"fr": "Eau potable",
"gl": "Auga potábel",
- "de": "Trinkwasser",
+ "de": "Trinkwasserstelle",
"it": "Acqua potabile",
"ru": "Питьевая вода",
"id": "Air minum"
@@ -16,7 +16,7 @@
"nl": "Drinkbaar water",
"fr": "Eau potable",
"gl": "Auga potábel",
- "de": "Trinkwasser",
+ "de": "Trinkwasserstelle",
"it": "Acqua potabile",
"ru": "Питьевая вода",
"id": "Air minum"
@@ -61,7 +61,7 @@
"nl": "drinkbaar water",
"fr": "eau potable",
"gl": "auga potábel",
- "de": "trinkwasser",
+ "de": "Trinkwasserstelle",
"it": "acqua potabile",
"ru": "питьевая вода",
"id": "air minum"
@@ -99,7 +99,8 @@
"en": "This drinking water works",
"nl": "Deze drinkwaterfontein werkt",
"it": "La fontanella funziona",
- "fr": "Cette fontaine fonctionne"
+ "fr": "Cette fontaine fonctionne",
+ "de": "Diese Trinkwasserstelle funktioniert"
}
},
{
@@ -163,7 +164,7 @@
"en": "There is another drinking water fountain at {_closest_other_drinking_water_distance} meter",
"nl": "Er bevindt zich een ander drinkwaterpunt op {_closest_other_drinking_water_distance} meter",
"it": "C’è un’altra fontanella a {_closest_other_drinking_water_distance} metri",
- "de": "Ein weiterer Trinkwasserbrunnen befindet sich in {_closest_other_drinking_water_distance} Meter",
+ "de": "Eine weitere Trinkwasserstelle liegt {_closest_other_drinking_water_distance} Meter entfernt",
"fr": "Une autre source d’eau potable est à {_closest_other_drinking_water_distance} mètres a>"
},
"condition": "_closest_other_drinking_water_id~*"
diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json
index 690612341..eaefef94b 100644
--- a/assets/layers/etymology/etymology.json
+++ b/assets/layers/etymology/etymology.json
@@ -38,7 +38,8 @@
"id": "wikipedia-etymology",
"question": {
"en": "What is the Wikidata-item that this object is named after?",
- "nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?"
+ "nl": "Wat is het Wikidata-item van hetgeen dit object is naar vernoemd?",
+ "de": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?"
},
"freeform": {
"key": "name:etymology:wikidata",
@@ -71,7 +72,8 @@
},
"render": {
"en": "
U kunt uw exacte locatie volgen (enkel mobiel) en in de linkerbenedenhoek categorieën selecteren die voor u relevant zijn. U kunt deze tool ook gebruiken om 'spelden' aan de kaart toe te voegen of te bewerken en meer gegevens te verstrekken door de vragen te beantwoorden.
Alle wijzigingen die u maakt worden automatisch opgeslagen in de wereldwijde database van OpenStreetMap en kunnen door anderen vrij worden hergebruikt.
Bekijk voor meer info over cyclofix ook cyclofix.osm.be.",
"fr": "Le but de cette carte est de présenter aux cyclistes une solution facile à utiliser pour trouver l'infrastructure appropriée à leurs besoins.
Vous pouvez suivre votre localisation précise (mobile uniquement) et sélectionner les couches qui vous concernent dans le coin inférieur gauche. Vous pouvez également utiliser cet outil pour ajouter ou modifier des épingles (points d'intérêt) sur la carte et fournir plus de données en répondant aux questions.
Toutes les modifications que vous apportez seront automatiquement enregistrées dans la base de données mondiale d'OpenStreetMap et peuvent être librement réutilisées par d'autres.
Pour plus d'informations sur le projet cyclofix, rendez-vous sur cyclofix.osm.be.",
"gl": "O obxectivo deste mapa é amosar ós ciclistas unha solución doada de empregar para atopar a infraestrutura axeitada para as súas necesidades.
Podes obter a túa localización precisa (só para dispositivos móbiles) e escoller as capas que sexan relevantes para ti na esquina inferior esquerda. Tamén podes empregar esta ferramenta para engadir ou editar puntos de interese ó mapa e fornecer máis datos respondendo as cuestións.
Todas as modificacións que fagas serán gardadas de xeito automático na base de datos global do OpenStreetMap e outros poderán reutilizalos libremente.
Para máis información sobre o proxecto cyclofix, vai a cyclofix.osm.be.",
- "de": "Das Ziel dieser Karte ist es, den Radfahrern eine einfach zu benutzende Lösung zu präsentieren, um die geeignete Infrastruktur für ihre Bedürfnisse zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Alle Änderungen, die Sie vornehmen, werden automatisch in der globalen Datenbank von OpenStreetMap gespeichert und können von anderen frei wiederverwendet werden.
Weitere Informationen über das Projekt Cyclofix finden Sie unter cyclofix.osm.be.",
+ "de": "Mit dieser Karte soll Radfahrern eine einfache Lösung bereitgestellt werden, um die passende Farradinfrastruktur zu finden.
Sie können Ihren genauen Standort verfolgen (nur mobil) und in der linken unteren Ecke die für Sie relevanten Ebenen auswählen. Sie können dieses Tool auch verwenden, um Pins (Points of Interest/Interessante Orte) zur Karte hinzuzufügen oder zu bearbeiten und mehr Daten durch Beantwortung der Fragen bereitstellen.
Ihre Änderungen, werden automatisch in der Datenbank von OpenStreetMap gespeichert und können von anderen frei verwendet werden.
Weitere Informationen über Cyclofix finden Sie unter cyclofix.osm.be.",
"ja": "このマップの目的は、サイクリストのニーズに適した施設を見つけるための使いやすいソリューションを提供することです。
你可以到 cyclofix.osm.be 閱讀更多資訊。",
"it": "Questa mappa offre a chi va in bici una soluzione semplice per trovare tutte le infrastrutture di cui ha bisogno.
Puoi tracciare la tua posizione esatta (solo su mobile) e selezionare i livelli che ti interessano nell'angolo in basso a sinistra. Puoi anche usare questo strumento per aggiungere o modificare punti di interesse alla mappa e aggiungere nuove informazioni rispendendo alle domande.
Tutte le modifiche che apporterai saranno automaticamente salvate nel database mondiale di OpenStreetMap e potranno essere liberamente riutilizzate da tutti e tutte.
Per maggiori informazioni sul progetto ciclofix, visita cyclofix.osm.be."
diff --git a/assets/themes/drinking_water/drinking_water.json b/assets/themes/drinking_water/drinking_water.json
index 5da9ee3c7..9eda4b7f7 100644
--- a/assets/themes/drinking_water/drinking_water.json
+++ b/assets/themes/drinking_water/drinking_water.json
@@ -8,7 +8,7 @@
"ja": "飲料水",
"zh_Hant": "飲用水",
"it": "Acqua potabile",
- "de": "Trinkwasser"
+ "de": "Trinkwasserstelle"
},
"description": {
"en": "On this map, publicly accessible drinking water spots are shown and can be easily added",
@@ -18,7 +18,7 @@
"zh_Hant": "在這份地圖上,公共可及的飲水點可以顯示出來,也能輕易的增加",
"it": "Questa mappa mostra tutti i luoghi in cui è disponibile acqua potabile ed è possibile aggiungerne di nuovi",
"ru": "На этой карте показываются и могут быть легко добавлены общедоступные точки питьевой воды",
- "de": "Auf dieser Karte sind öffentlich zugängliche Trinkwasserstellen eingezeichnet und können leicht hinzugefügt werden"
+ "de": "Eine Karte zum Anzeigen und Bearbeiten öffentlicher Trinkwasserstellen"
},
"language": [
"en",
diff --git a/assets/themes/etymology.json b/assets/themes/etymology.json
index f342e2e2b..735f119de 100644
--- a/assets/themes/etymology.json
+++ b/assets/themes/etymology.json
@@ -13,7 +13,7 @@
"description": {
"en": "On this map, you can see what an object is named after. The streets, buildings, ... come from OpenStreetMap which got linked with Wikidata. In the popup, you'll see the Wikipedia article (if it exists) or a wikidata box of what the object is named after. If the object itself has a wikipedia page, that'll be shown too.
You can help contribute too!Zoom in enough and all streets will show up. You can click one and a Wikidata-search box will popup. With a few clicks, you can add an etymology link. Note that you need a free OpenStreetMap account to do this.",
"nl": "Op deze kaart zie je waar een plaats naar is vernoemd. De straten, gebouwen, ... komen uit OpenStreetMap, waar een link naar Wikidata werd gelegd. In de popup zie je het Wikipedia-artikel van hetgeen naarwaar het vernoemd is of de Wikidata-box.
Je kan zelf ook meehelpen!Als je ver inzoomt, krijg je alle straten te zien. Klik je een straat aan, dan krijg je een zoekfunctie waarmee je snel een nieuwe link kan leggen. Je hebt hiervoor een gratis OpenStreetMap account nodig.",
- "de": "Auf dieser Karte können Sie sehen, nach was ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. Die Informationen stammen aus Wikipedia."
+ "de": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen."
},
"language": [
"en",
@@ -40,7 +40,8 @@
"id": "streets_without_etymology",
"name": {
"en": "Streets without etymology information",
- "nl": "Straten zonder etymologische informatie"
+ "nl": "Straten zonder etymologische informatie",
+ "de": "Straßen ohne Informationen zur Namensherkunft"
},
"minzoom": 18,
"source": {
@@ -60,7 +61,8 @@
"id": "parks_and_forests_without_etymology",
"name": {
"en": "Parks and forests without etymology information",
- "nl": "Parken en bossen zonder etymologische informatie"
+ "nl": "Parken en bossen zonder etymologische informatie",
+ "de": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
},
"minzoom": 18,
"source": {
diff --git a/assets/themes/ghostbikes/ghostbikes.json b/assets/themes/ghostbikes/ghostbikes.json
index 7c9aec38b..97c580617 100644
--- a/assets/themes/ghostbikes/ghostbikes.json
+++ b/assets/themes/ghostbikes/ghostbikes.json
@@ -24,7 +24,7 @@
"title": {
"en": "Ghost bikes",
"nl": "Witte Fietsen",
- "de": "Geisterrad",
+ "de": "Geisterräder",
"ja": "ゴーストバイク",
"nb_NO": "Spøkelsessykler",
"zh_Hant": "幽靈單車",
@@ -43,7 +43,7 @@
"description": {
"en": "A ghost bike is a memorial for a cyclist who died in a traffic accident, in the form of a white bicycle placed permanently near the accident location.
On this map, one can see all the ghost bikes which are known by OpenStreetMap. Is a ghost bike missing? Everyone can add or update information here - you only need to have a (free) OpenStreetMap account.",
"nl": "Een Witte Fiets of Spookfiets is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat om een fiets die volledig wit is geschilderd en in de buurt van het ongeval werd geinstalleerd.
Op deze kaart zie je alle witte fietsen die door OpenStreetMap gekend zijn. Ontbreekt er een Witte Fiets of wens je informatie aan te passen? Meld je dan aan met een (gratis) OpenStreetMap account.",
- "de": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die OpenStreetMap kennt. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
+ "de": "Ein Geisterrad ist ein Denkmal für einen Radfahrer, der bei einem Verkehrsunfall ums Leben kam, in Form eines weißen Fahrrades, das dauerhaft in der Nähe des Unfallortes aufgestellt ist.
Auf dieser Karte kann man alle Geisterräder sehen, die in OpenStreetMap eingetragen sind. Fehlt ein Geisterrad? Jeder kann hier Informationen hinzufügen oder aktualisieren - Sie benötigen lediglich einen (kostenlosen) OpenStreetMap-Account.",
"ja": "ゴーストバイクは、交通事故で死亡したサイクリストを記念するもので、事故現場の近くに恒久的に置かれた白い自転車の形をしています。
在這份地圖上面,你可以看到所有在開放街圖已知的幽靈單車。有缺漏的幽靈單車嗎?所有人都可以在這邊新增或是更新資訊-只有你有(免費)開放街圖帳號。",
"fr": "Les vélos fantômes sont des mémoriaux pour les cyclistes tuées sur la route, prenant la forme de vélos blancs placés à proximité des faits.
Cette carte indique leur emplacement à partir d’OpenStreetMap. Il est possible de contribuer aux informations ici, sous réserve d’avoir un compte OpenStreetMap (gratuit)."
diff --git a/assets/themes/hailhydrant/hailhydrant.json b/assets/themes/hailhydrant/hailhydrant.json
index 92f54e50f..a46b53d12 100644
--- a/assets/themes/hailhydrant/hailhydrant.json
+++ b/assets/themes/hailhydrant/hailhydrant.json
@@ -495,7 +495,8 @@
"ru": "Пожарная часть",
"nb_NO": "Brannstasjon",
"it": "Caserma dei vigili del fuoco",
- "fr": "Station de pompiers"
+ "fr": "Station de pompiers",
+ "de": "Feuerwache"
}
},
"description": {
diff --git a/assets/themes/maps/maps.json b/assets/themes/maps/maps.json
index 959494a06..b14817ee6 100644
--- a/assets/themes/maps/maps.json
+++ b/assets/themes/maps/maps.json
@@ -6,7 +6,8 @@
"fr": "Carte des cartes",
"ja": "マップのマップ",
"zh_Hant": "地圖的地圖",
- "ru": "Карта карт"
+ "ru": "Карта карт",
+ "de": "Eine Karte der Karten"
},
"shortDescription": {
"en": "This theme shows all (touristic) maps that OpenStreetMap knows of",
@@ -28,7 +29,8 @@
"fr",
"ja",
"zh_Hant",
- "ru"
+ "ru",
+ "de"
],
"maintainer": "MapComplete",
"icon": "./assets/themes/maps/logo.svg",
diff --git a/assets/themes/natuurpunt/natuurpunt.json b/assets/themes/natuurpunt/natuurpunt.json
index ecbe8afe9..78866a968 100644
--- a/assets/themes/natuurpunt/natuurpunt.json
+++ b/assets/themes/natuurpunt/natuurpunt.json
@@ -3,11 +3,13 @@
"customCss": "./assets/themes/natuurpunt/natuurpunt.css",
"title": {
"nl": "Natuurgebieden",
- "en": "Nature Reserves"
+ "en": "Nature Reserves",
+ "de": "Naturschutzgebiete"
},
"shortDescription": {
"nl": "Deze kaart toont de natuurgebieden van Natuurpunt",
- "en": "This map shows the nature reserves of Natuurpunt"
+ "en": "This map shows the nature reserves of Natuurpunt",
+ "de": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
},
"description": {
"nl": "Op deze kaart vind je alle natuurgebieden die Natuurpunt ter beschikking stelt",
@@ -15,7 +17,8 @@
},
"language": [
"nl",
- "en"
+ "en",
+ "de"
],
"mustHaveLanguage": [
"nl"
diff --git a/assets/themes/observation_towers/observation_towers.json b/assets/themes/observation_towers/observation_towers.json
index 3ab5a6b58..20406a939 100644
--- a/assets/themes/observation_towers/observation_towers.json
+++ b/assets/themes/observation_towers/observation_towers.json
@@ -2,19 +2,23 @@
"id": "observation_towers",
"title": {
"en": "Observation towers",
- "nl": "Uitkijktorens"
+ "nl": "Uitkijktorens",
+ "de": "Aussichtstürme"
},
"shortDescription": {
"en": "Publicly accessible towers to enjoy the view",
- "nl": "Publieke uitkijktorens om van het panorama te genieten"
+ "nl": "Publieke uitkijktorens om van het panorama te genieten",
+ "de": "Öffentlich zugänglicher Aussichtsturm"
},
"description": {
"nl": "Publieke uitkijktorens om van het panorama te genieten",
- "en": "Publicly accessible towers to enjoy the view"
+ "en": "Publicly accessible towers to enjoy the view",
+ "de": "Öffentlich zugänglicher Aussichtsturm"
},
"language": [
"en",
- "nl"
+ "nl",
+ "de"
],
"maintainer": "",
"icon": "./assets/layers/observation_tower/Tower_observation.svg",
diff --git a/assets/themes/openwindpowermap/openwindpowermap.json b/assets/themes/openwindpowermap/openwindpowermap.json
index c7e910d48..04282bcae 100644
--- a/assets/themes/openwindpowermap/openwindpowermap.json
+++ b/assets/themes/openwindpowermap/openwindpowermap.json
@@ -2,7 +2,8 @@
"id": "openwindpowermap",
"title": {
"en": "OpenWindPowerMap",
- "fr": "OpenWindPowerMap"
+ "fr": "OpenWindPowerMap",
+ "de": "OpenWindPowerMap"
},
"maintainer": "Seppe Santens",
"icon": "./assets/themes/openwindpowermap/wind_turbine.svg",
@@ -30,7 +31,8 @@
"name": {
"en": "wind turbine",
"nl": "windturbine",
- "fr": "Éolienne"
+ "fr": "Éolienne",
+ "de": "Windrad"
},
"source": {
"osmTags": "generator:source=wind"
@@ -41,7 +43,8 @@
"render": {
"en": "wind turbine",
"nl": "windturbine",
- "fr": "éolienne"
+ "fr": "éolienne",
+ "de": "Windrad"
},
"mappings": [
{
@@ -149,7 +152,8 @@
"title": {
"en": "wind turbine",
"nl": "windturbine",
- "fr": "Éolienne"
+ "fr": "Éolienne",
+ "de": "Windrad"
}
}
],
@@ -168,7 +172,8 @@
"human": {
"en": " megawatts",
"nl": " megawatt",
- "fr": " megawatts"
+ "fr": " megawatts",
+ "de": " Megawatt"
}
},
{
@@ -180,7 +185,8 @@
"human": {
"en": " kilowatts",
"nl": " kilowatt",
- "fr": " kilowatts"
+ "fr": " kilowatts",
+ "de": " Kilowatt"
}
},
{
@@ -192,7 +198,8 @@
"human": {
"en": " watts",
"nl": " watt",
- "fr": " watts"
+ "fr": " watts",
+ "de": " Watt"
}
},
{
@@ -204,7 +211,8 @@
"human": {
"en": " gigawatts",
"nl": " gigawatt",
- "fr": " gigawatts"
+ "fr": " gigawatts",
+ "de": " Gigawatt"
}
}
],
@@ -224,7 +232,8 @@
"human": {
"en": " meter",
"nl": " meter",
- "fr": " mètres"
+ "fr": " mètres",
+ "de": " Meter"
}
}
]
diff --git a/assets/themes/parkings/parkings.json b/assets/themes/parkings/parkings.json
index affbbfc21..ab6247517 100644
--- a/assets/themes/parkings/parkings.json
+++ b/assets/themes/parkings/parkings.json
@@ -2,19 +2,23 @@
"id": "parkings",
"title": {
"nl": "Parking",
- "en": "Parking"
+ "en": "Parking",
+ "de": "Parken"
},
"shortDescription": {
"nl": "Deze kaart toont verschillende parkeerplekken",
- "en": "This map shows different parking spots"
+ "en": "This map shows different parking spots",
+ "de": "Diese Karte zeigt Parkplätze"
},
"description": {
"nl": "Deze kaart toont verschillende parkeerplekken",
- "en": "This map shows different parking spots"
+ "en": "This map shows different parking spots",
+ "de": "Diese Karte zeigt Parkplätze"
},
"language": [
"nl",
- "en"
+ "en",
+ "de"
],
"maintainer": "",
"icon": "./assets/themes/parkings/parkings.svg",
diff --git a/assets/themes/playgrounds/playgrounds.json b/assets/themes/playgrounds/playgrounds.json
index 8c153a10a..b60c95575 100644
--- a/assets/themes/playgrounds/playgrounds.json
+++ b/assets/themes/playgrounds/playgrounds.json
@@ -6,7 +6,8 @@
"fr": "Aires de jeux",
"ja": "遊び場",
"zh_Hant": "遊樂場",
- "ru": "Игровые площадки"
+ "ru": "Игровые площадки",
+ "de": "Spielpläzte"
},
"shortDescription": {
"nl": "Een kaart met speeltuinen",
@@ -14,7 +15,8 @@
"fr": "Une carte des aires de jeux",
"ja": "遊び場のある地図",
"zh_Hant": "遊樂場的地圖",
- "ru": "Карта игровых площадок"
+ "ru": "Карта игровых площадок",
+ "de": "Eine Karte mit Spielplätzen"
},
"description": {
"nl": "Op deze kaart vind je speeltuinen en kan je zelf meer informatie en foto's toevoegen",
@@ -30,7 +32,8 @@
"fr",
"ja",
"zh_Hant",
- "ru"
+ "ru",
+ "de"
],
"maintainer": "",
"icon": "./assets/themes/playgrounds/playground.svg",
diff --git a/assets/themes/postboxes/postboxes.json b/assets/themes/postboxes/postboxes.json
index 96dce929b..a6a30a372 100644
--- a/assets/themes/postboxes/postboxes.json
+++ b/assets/themes/postboxes/postboxes.json
@@ -1,10 +1,12 @@
{
"id": "postboxes",
"title": {
- "en": "Postbox and Post Office Map"
+ "en": "Postbox and Post Office Map",
+ "de": "Karte mit Briefkästen und Poststellen"
},
"shortDescription": {
- "en": "A map showing postboxes and post offices"
+ "en": "A map showing postboxes and post offices",
+ "de": "Eine Karte die Briefkästen und Poststellen anzeigt"
},
"description": {
"en": "On this map you can find and add data of post offices and post boxes. You can use this map to find where you can mail your next postcard! :) Spotted an error or is a post box missing? You can edit this map with a free OpenStreetMap account. "
@@ -29,7 +31,8 @@
{
"id": "postboxes",
"name": {
- "en": "Postboxes"
+ "en": "Postboxes",
+ "de": "Brieflästen"
},
"minzoom": 12,
"source": {
@@ -37,11 +40,13 @@
},
"title": {
"render": {
- "en": "Postbox"
+ "en": "Postbox",
+ "de": "Briefkasten"
}
},
"description": {
- "en": "The layer showing postboxes."
+ "en": "The layer showing postboxes.",
+ "de": "Die Ebene zeigt Briefkästen."
},
"tagRenderings": [
"images",
@@ -68,7 +73,8 @@
"amenity=post_box"
],
"title": {
- "en": "postbox"
+ "en": "postbox",
+ "de": "Briefkasten"
}
}
],
@@ -85,7 +91,8 @@
{
"id": "postoffices",
"name": {
- "en": "Post offices"
+ "en": "Post offices",
+ "de": "Poststellen"
},
"minzoom": 12,
"source": {
@@ -93,7 +100,8 @@
},
"title": {
"render": {
- "en": "Post Office"
+ "en": "Post Office",
+ "de": "Poststelle"
}
},
"description": {
@@ -154,7 +162,8 @@
"amenity=post_office"
],
"title": {
- "en": "Post Office"
+ "en": "Post Office",
+ "de": "Poststelle"
}
}
],
@@ -165,7 +174,8 @@
"options": [
{
"question": {
- "en": "Currently open"
+ "en": "Currently open",
+ "de": "Aktuell geöffnet"
},
"osmTags": "_isOpen=yes"
}
diff --git a/assets/themes/toilets/toilets.json b/assets/themes/toilets/toilets.json
index 1d1567de4..de62c5c14 100644
--- a/assets/themes/toilets/toilets.json
+++ b/assets/themes/toilets/toilets.json
@@ -2,7 +2,7 @@
"id": "toilets",
"title": {
"en": "Open Toilet Map",
- "de": "Offene Toilette Karte",
+ "de": "Freie Toilettenkarte",
"fr": "Carte des WC et toilettes publiques",
"nl": "Open Toilettenkaart",
"ru": "Открытая карта туалетов",
@@ -12,7 +12,7 @@
},
"description": {
"en": "A map of public toilets",
- "de": "Eine Karte der öffentlichen Toiletten",
+ "de": "Eine Karte mit öffentlich zugänglichen Toiletten",
"fr": "Carte affichant les WC et toilettes publiques",
"nl": "Een kaart met openbare toiletten",
"ru": "Карта общественных туалетов",
diff --git a/assets/themes/uk_addresses/uk_addresses.json b/assets/themes/uk_addresses/uk_addresses.json
index ff865b914..aa0aeed0b 100644
--- a/assets/themes/uk_addresses/uk_addresses.json
+++ b/assets/themes/uk_addresses/uk_addresses.json
@@ -40,7 +40,8 @@
"maxZoom": 20,
"defaultState": false,
"name": {
- "en": "Property boundaries by osmuk.org"
+ "en": "Property boundaries by osmuk.org",
+ "de": "Grenzverläufe gemäß osmuk.org"
}
}
],
From 887318ee2b3d440a34c8b87332ff6f677b964ee4 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:48:59 +0200
Subject: [PATCH 20/30] Regenerate translatiosn
---
assets/tagRenderings/questions.json | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json
index cab25af7c..814e0058a 100644
--- a/assets/tagRenderings/questions.json
+++ b/assets/tagRenderings/questions.json
@@ -6,14 +6,18 @@
"render": "{wikipedia():max-height:25rem}",
"question": {
"en": "What is the corresponding Wikidata entity?",
- "nl": "Welk Wikidata-item komt overeen met dit object?"
+ "nl": "Welk Wikidata-item komt overeen met dit object?",
+ "de": "Was ist das entsprechende Wikidata Element?",
+ "pt": "Qual é a entidade Wikidata correspondente?"
},
"mappings": [
{
"if": "wikidata=",
"then": {
"en": "No Wikipedia page has been linked yet",
- "nl": "Er werd nog geen Wikipedia-pagina gekoppeld"
+ "nl": "Er werd nog geen Wikipedia-pagina gekoppeld",
+ "de": "Es wurde noch keine Wikipedia-Seite verlinkt",
+ "pt": "Ainda não foi vinculada nenhuma página da Wikipédia"
},
"hideInAnswer": true
}
@@ -64,14 +68,18 @@
"render": "",
"question": {
"en": "What is the corresponding item on Wikipedia?",
- "nl": "Welk Wikipedia-artikel beschrijft dit object?"
+ "nl": "Welk Wikipedia-artikel beschrijft dit object?",
+ "de": "Was ist der entsprechende Artikel auf Wikipedia?",
+ "pt": "Qual é o item correspondente na Wikipédia?"
},
"mappings": [
{
"if": "wikidata=",
"then": {
"en": "Not linked with Wikipedia",
- "nl": "Nog geen Wikipedia-artikel bekend"
+ "nl": "Nog geen Wikipedia-artikel bekend",
+ "de": "Nicht mit Wikipedia verknüpft",
+ "pt": "Não vinculado à Wikipédia"
}
}
],
From feb684d9e5c269f67ebc2aec55168bfaba69caac Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:49:25 +0200
Subject: [PATCH 21/30] Translation regeneration
---
langs/layers/de.json | 590 ++++++++++++++++-----------------
langs/shared-questions/de.json | 2 +-
langs/shared-questions/pt.json | 22 +-
langs/themes/de.json | 138 ++++----
4 files changed, 376 insertions(+), 376 deletions(-)
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 8c995a73c..73735975b 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -948,11 +948,11 @@
"0": {
"question": "Alle Anschlüsse"
},
- "7": {
- "question": "Hat einen
Tesla Supercharger
Stecker"
- },
"3": {
"question": "Hat einen
Chademo
Stecker"
+ },
+ "7": {
+ "question": "Hat einen
Tesla Supercharger
Stecker"
}
}
}
@@ -1153,31 +1153,27 @@
"question": "Wie viele Fahrzeuge können hier gleichzeitig geladen werden?",
"render": "{capacity} Fahrzeuge können hier gleichzeitig geladen werden"
},
+ "email": {
+ "question": "Wie ist die Email-Adresse des Betreibers?",
+ "render": "Bei Problemen senden Sie eine E-Mail an {email}"
+ },
"fee/charge": {
"mappings": {
"0": {
"then": "Nutzung kostenlos"
}
},
- "render": "Die Nutzung dieser Ladestation kostet {charge}",
- "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
+ "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?",
+ "render": "Die Nutzung dieser Ladestation kostet {charge}"
},
"maxstay": {
- "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}",
- "question": "Was ist die Höchstdauer des Aufenthalts hier?",
"mappings": {
"0": {
"then": "Keine Höchstparkdauer"
}
- }
- },
- "ref": {
- "render": "Die Kennziffer ist {ref}",
- "question": "Wie lautet die Kennung dieser Ladestation?"
- },
- "website": {
- "render": "Weitere Informationen auf {website}",
- "question": "Wie ist die Webseite des Betreibers?"
+ },
+ "question": "Was ist die Höchstdauer des Aufenthalts hier?",
+ "render": "Die maximale Parkzeit beträgt {canonical(maxstay)}"
},
"payment-options": {
"override": {
@@ -1191,13 +1187,17 @@
}
}
},
- "email": {
- "question": "Wie ist die Email-Adresse des Betreibers?",
- "render": "Bei Problemen senden Sie eine E-Mail an {email}"
- },
"phone": {
- "render": "Bei Problemen, anrufen unter {phone}",
- "question": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
+ "question": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?",
+ "render": "Bei Problemen, anrufen unter {phone}"
+ },
+ "ref": {
+ "question": "Wie lautet die Kennung dieser Ladestation?",
+ "render": "Die Kennziffer ist {ref}"
+ },
+ "website": {
+ "question": "Wie ist die Webseite des Betreibers?",
+ "render": "Weitere Informationen auf {website}"
}
},
"title": {
@@ -1264,41 +1264,13 @@
},
"question": "Können Radfahrer diese Kreuzung nutzen?"
},
- "crossing-is-zebra": {
+ "crossing-button": {
"mappings": {
- "0": {
- "then": "Dies ist ein Zebrastreifen"
- },
"1": {
- "then": "Dies ist kein Zebrastreifen"
+ "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
}
},
- "question": "Ist das ein Zebrastreifen?"
- },
- "crossing-tactile": {
- "mappings": {
- "0": {
- "then": "An dieser Kreuzung gibt es ein Blindenleitsystem"
- },
- "1": {
- "then": "Diese Kreuzung hat kein Blindenleitsystem"
- }
- },
- "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?"
- },
- "crossing-type": {
- "mappings": {
- "0": {
- "then": "Kreuzungen ohne Ampeln"
- },
- "1": {
- "then": "Kreuzungen mit Ampeln"
- },
- "2": {
- "then": "Zebrastreifen"
- }
- },
- "question": "Was ist das für eine Kreuzung?"
+ "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?"
},
"crossing-continue-through-red": {
"mappings": {
@@ -1325,27 +1297,55 @@
},
"question": "Gibt es an diesem Übergang eine Verkehrsinsel?"
},
+ "crossing-is-zebra": {
+ "mappings": {
+ "0": {
+ "then": "Dies ist ein Zebrastreifen"
+ },
+ "1": {
+ "then": "Dies ist kein Zebrastreifen"
+ }
+ },
+ "question": "Ist das ein Zebrastreifen?"
+ },
"crossing-right-turn-through-red": {
"mappings": {
+ "0": {
+ "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
+ },
"1": {
"then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen"
},
"2": {
"then": "Ein Radfahrer kann bei roter Ampel nicht rechts abbiegen"
- },
- "0": {
- "then": "Ein Radfahrer kann bei roter Ampel rechts abbiegen "
}
},
"question": "Kann ein Radfahrer bei roter Ampel rechts abbiegen?"
},
- "crossing-button": {
- "question": "Hat diese Ampel eine Taste, um ein grünes Signal anzufordern?",
+ "crossing-tactile": {
"mappings": {
+ "0": {
+ "then": "An dieser Kreuzung gibt es ein Blindenleitsystem"
+ },
"1": {
- "then": "Diese Ampel hat keine Taste, um ein grünes Signal anzufordern."
+ "then": "Diese Kreuzung hat kein Blindenleitsystem"
}
- }
+ },
+ "question": "Gibt es an dieser Kreuzung ein Blindenleitsystem?"
+ },
+ "crossing-type": {
+ "mappings": {
+ "0": {
+ "then": "Kreuzungen ohne Ampeln"
+ },
+ "1": {
+ "then": "Kreuzungen mit Ampeln"
+ },
+ "2": {
+ "then": "Zebrastreifen"
+ }
+ },
+ "question": "Was ist das für eine Kreuzung?"
}
},
"title": {
@@ -1365,6 +1365,15 @@
"tagRenderings": {
"Cycleway type for a road": {
"mappings": {
+ "0": {
+ "then": "Es gibt eine geteilte Fahrspur"
+ },
+ "1": {
+ "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
+ },
+ "2": {
+ "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
+ },
"3": {
"then": "Hier ist ein getrennter Radweg vorhanden"
},
@@ -1373,15 +1382,6 @@
},
"5": {
"then": "Es gibt keinen Radweg"
- },
- "2": {
- "then": "Es gibt einen Weg, aber keinen Radweg, der auf der Karte getrennt von dieser Straße eingezeichnet ist."
- },
- "1": {
- "then": "Es gibt eine Spur neben der Straße (getrennt durch eine Straßenmarkierung)"
- },
- "0": {
- "then": "Es gibt eine geteilte Fahrspur"
}
},
"question": "Was für ein Radweg ist hier?"
@@ -1394,23 +1394,23 @@
"1": {
"then": "Geeignet für dünne Reifen: Rennrad"
},
- "6": {
- "then": "Geeignet für Geländefahrzeuge: Traktor, ATV"
- },
- "7": {
- "then": "Unpassierbar / Keine bereiften Fahrzeuge"
- },
"2": {
"then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
},
"3": {
"then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
},
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ },
"5": {
"then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
},
- "4": {
- "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ "6": {
+ "then": "Geeignet für Geländefahrzeuge: Traktor, ATV"
+ },
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
}
},
"question": "Wie eben ist dieser Radweg?"
@@ -1426,9 +1426,21 @@
"2": {
"then": "Der Radweg ist aus Asphalt"
},
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
"4": {
"then": "Der Radweg ist aus Beton"
},
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
"8": {
"then": "Der Radweg ist aus Holz"
},
@@ -1443,33 +1455,21 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
- },
- "5": {
- "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
- },
- "3": {
- "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
- },
- "7": {
- "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
- },
- "6": {
- "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {cycleway:surface}",
- "question": "Was ist der Belag dieses Radwegs?"
+ "question": "Was ist der Belag dieses Radwegs?",
+ "render": "Der Radweg ist aus {cycleway:surface}"
},
"Is this a cyclestreet? (For a road)": {
"mappings": {
+ "0": {
+ "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
+ },
"1": {
"then": "Dies ist eine Fahrradstraße"
},
"2": {
"then": "Dies ist keine Fahrradstraße."
- },
- "0": {
- "then": "Dies ist eine Fahrradstraße in einer 30km/h Zone."
}
},
"question": "Ist das eine Fahrradstraße"
@@ -1492,20 +1492,35 @@
"then": "Die Höchstgeschwindigkeit ist 90 km/h"
}
},
- "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h",
- "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?"
+ "question": "Was ist die Höchstgeschwindigkeit auf dieser Straße?",
+ "render": "Die Höchstgeschwindigkeit auf dieser Straße beträgt {maxspeed} km/h"
},
"Surface of the road": {
"mappings": {
+ "0": {
+ "then": "Dieser Radweg ist nicht befestigt"
+ },
"1": {
"then": "Dieser Radweg hat einen festen Belag"
},
"2": {
"then": "Der Radweg ist aus Asphalt"
},
+ "3": {
+ "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
+ },
"4": {
"then": "Der Radweg ist aus Beton"
},
+ "5": {
+ "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
+ },
+ "6": {
+ "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
+ },
+ "7": {
+ "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
+ },
"8": {
"then": "Der Radweg ist aus Holz"
},
@@ -1520,25 +1535,10 @@
},
"12": {
"then": "Dieser Radweg besteht aus Rohboden"
- },
- "3": {
- "then": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen"
- },
- "0": {
- "then": "Dieser Radweg ist nicht befestigt"
- },
- "6": {
- "then": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster"
- },
- "7": {
- "then": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster"
- },
- "5": {
- "then": "Dieser Radweg besteht aus Kopfsteinpflaster"
}
},
- "render": "Der Radweg ist aus {surface}",
- "question": "Was ist der Belag dieser Straße?"
+ "question": "Was ist der Belag dieser Straße?",
+ "render": "Der Radweg ist aus {surface}"
},
"Surface of the street": {
"mappings": {
@@ -1548,32 +1548,29 @@
"1": {
"then": "Geeignet für dünne Reifen: Rennrad"
},
- "6": {
- "then": "Geeignet für spezielle Geländewagen: Traktor, ATV"
- },
- "7": {
- "then": "Unpassierbar / Keine bereiften Fahrzeuge"
- },
- "4": {
- "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
- },
"2": {
"then": "Geeignet für normale Reifen: Fahrrad, Rollstuhl, Scooter"
},
"3": {
"then": "Geeignet für breite Reifen: Trekkingfahrrad, Auto, Rikscha"
},
+ "4": {
+ "then": "Geeignet für Fahrzeuge mit großer Bodenfreiheit: leichte Geländewagen"
+ },
"5": {
"then": "Geeignet für Geländefahrzeuge: schwerer Geländewagen"
+ },
+ "6": {
+ "then": "Geeignet für spezielle Geländewagen: Traktor, ATV"
+ },
+ "7": {
+ "then": "Unpassierbar / Keine bereiften Fahrzeuge"
}
},
"question": "Wie eben ist diese Straße?"
},
"cyclelan-segregation": {
"mappings": {
- "3": {
- "then": "Dieser Radweg ist getrennt durch einen Bordstein"
- },
"0": {
"then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
},
@@ -1582,6 +1579,9 @@
},
"2": {
"then": "Der Radweg ist abgegrenzt durch eine Parkspur"
+ },
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
}
},
"question": "Wie ist der Radweg von der Straße abgegrenzt?"
@@ -1591,6 +1591,9 @@
"0": {
"then": "Vorgeschriebener Radweg "
},
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
+ },
"2": {
"then": "Getrennter Fuß-/Radweg "
},
@@ -1599,18 +1602,12 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
- },
- "1": {
- "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
},
"cycleway-segregation": {
"mappings": {
- "3": {
- "then": "Dieser Radweg ist getrennt durch einen Bordstein"
- },
"0": {
"then": "Der Radweg ist abgegrenzt durch eine gestrichelte Linie"
},
@@ -1619,6 +1616,9 @@
},
"2": {
"then": "Der Radweg ist abgegrenzt durch eine Parkspur"
+ },
+ "3": {
+ "then": "Dieser Radweg ist getrennt durch einen Bordstein"
}
},
"question": "Wie ist der Radweg von der Straße abgegrenzt?"
@@ -1628,6 +1628,9 @@
"0": {
"then": "Vorgeschriebener Radweg "
},
+ "1": {
+ "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
+ },
"2": {
"then": "Getrennter Fuß-/Radweg "
},
@@ -1636,9 +1639,6 @@
},
"4": {
"then": "Kein Verkehrsschild vorhanden"
- },
- "1": {
- "then": "Vorgeschriebener Radweg (mit Zusatzschild) "
}
},
"question": "Welches Verkehrszeichen hat dieser Radweg?"
@@ -1660,8 +1660,15 @@
}
}
},
+ "cycleways_and_roads-cycleway:buffer": {
+ "question": "Wie breit ist der Abstand zwischen Radweg und Straße?",
+ "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
+ },
"is lit?": {
"mappings": {
+ "0": {
+ "then": "Diese Straße ist beleuchtet"
+ },
"1": {
"then": "Diese Straße ist nicht beleuchtet"
},
@@ -1670,16 +1677,9 @@
},
"3": {
"then": "Diese Straße ist durchgehend beleuchtet"
- },
- "0": {
- "then": "Diese Straße ist beleuchtet"
}
},
"question": "Ist diese Straße beleuchtet?"
- },
- "cycleways_and_roads-cycleway:buffer": {
- "question": "Wie breit ist der Abstand zwischen Radweg und Straße?",
- "render": "Der Sicherheitsabstand zu diesem Radweg beträgt {cycleway:buffer} m"
}
},
"title": {
@@ -1745,8 +1745,8 @@
"then": "Dies ist ein normaler automatischer Defibrillator"
}
},
- "render": "Es gibt keine Informationen über den Gerätetyp",
- "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?"
+ "question": "Ist dies ein normaler automatischer Defibrillator oder ein manueller Defibrillator nur für Profis?",
+ "render": "Es gibt keine Informationen über den Gerätetyp"
},
"defibrillator-defibrillator:location": {
"question": "Bitte geben Sie einige Erläuterungen dazu, wo der Defibrillator zu finden ist (in der lokalen Sprache)",
@@ -1851,14 +1851,14 @@
},
"Still in use?": {
"mappings": {
+ "0": {
+ "then": "Diese Trinkwasserstelle funktioniert"
+ },
"1": {
"then": "Diese Trinkwasserstelle ist kaputt"
},
"2": {
"then": "Diese Trinkwasserstelle wurde geschlossen"
- },
- "0": {
- "then": "Diese Trinkwasserstelle funktioniert"
}
},
"question": "Ist diese Trinkwasserstelle noch in Betrieb?",
@@ -1876,13 +1876,13 @@
"description": "Alle Objekte, die eine bekannte Namensherkunft haben",
"tagRenderings": {
"simple etymology": {
- "render": "Benannt nach {name:etymology}",
- "question": "Wonach ist dieses Objekt benannt? Das könnte auf einem Straßenschild stehen",
"mappings": {
"0": {
"then": "Der Ursprung dieses Namens ist in der gesamten Literatur unbekannt"
}
- }
+ },
+ "question": "Wonach ist dieses Objekt benannt? Das könnte auf einem Straßenschild stehen",
+ "render": "Benannt nach {name:etymology}"
},
"wikipedia-etymology": {
"question": "Was ist das Wikidata-Element, nach dem dieses Objekt benannt ist?",
@@ -1899,6 +1899,13 @@
}
}
},
+ "1": {
+ "options": {
+ "0": {
+ "question": "Hat vegetarische Speisen"
+ }
+ }
+ },
"2": {
"options": {
"0": {
@@ -1912,19 +1919,13 @@
"question": "Hat halal Speisen"
}
}
- },
- "1": {
- "options": {
- "0": {
- "question": "Hat vegetarische Speisen"
- }
- }
}
},
+ "name": "Restaurants und Fast Food",
"presets": {
"0": {
- "title": "Restaurant",
- "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden"
+ "description": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden",
+ "title": "Restaurant"
},
"1": {
"title": "Schnellimbiss"
@@ -1936,14 +1937,14 @@
"tagRenderings": {
"Cuisine": {
"mappings": {
- "2": {
- "then": "Bietet vorwiegend Pastagerichte an"
- },
"0": {
"then": "Dies ist eine Pizzeria"
},
"1": {
"then": "Dies ist eine Pommesbude"
+ },
+ "2": {
+ "then": "Bietet vorwiegend Pastagerichte an"
}
},
"question": "Welches Essen gibt es hier?",
@@ -1970,6 +1971,17 @@
},
"question": "Ist an diesem Ort Mitnahme möglich?"
},
+ "Vegetarian (no friture)": {
+ "question": "Gibt es im das Restaurant vegetarische Speisen?"
+ },
+ "friture-take-your-container": {
+ "mappings": {
+ "0": {
+ "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart"
+ }
+ },
+ "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet? "
+ },
"halal (no friture)": {
"mappings": {
"0": {
@@ -1986,17 +1998,6 @@
}
},
"question": "Gibt es im das Restaurant halal Speisen?"
- },
- "Vegetarian (no friture)": {
- "question": "Gibt es im das Restaurant vegetarische Speisen?"
- },
- "friture-take-your-container": {
- "mappings": {
- "0": {
- "then": "Sie können ihre eigenen Behälter mitbringen, um Ihre Bestellung zu erhalten, was Einwegverpackungsmaterial und damit Abfall spart"
- }
- },
- "question": "Wenn Sie Ihr eigenes Behältnis mitbringen (z. B. einen Kochtopf und kleine Töpfe), wird es dann zum Verpacken Ihrer Bestellung verwendet? "
}
},
"title": {
@@ -2008,8 +2009,7 @@
"then": "Schnellrestaurant{name}"
}
}
- },
- "name": "Restaurants und Fast Food"
+ }
},
"ghost_bike": {
"name": "Geisterräder",
@@ -2110,6 +2110,9 @@
},
"nature_reserve": {
"tagRenderings": {
+ "Curator": {
+ "question": "Wer ist der Verwalter dieses Naturschutzgebietes? Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist"
+ },
"Dogs?": {
"mappings": {
"0": {
@@ -2127,17 +2130,14 @@
"Email": {
"render": "{email}"
},
+ "Surface area": {
+ "render": "Grundfläche: {_surface:ha}ha"
+ },
"Website": {
"question": "Auf welcher Webseite kann man mehr Informationen über dieses Naturschutzgebiet finden?"
},
"phone": {
"render": "{phone}"
- },
- "Curator": {
- "question": "Wer ist der Verwalter dieses Naturschutzgebietes? Respektieren Sie die Privatsphäre - geben Sie nur dann einen Namen an, wenn dieser allgemein bekannt ist"
- },
- "Surface area": {
- "render": "Grundfläche: {_surface:ha}ha"
}
}
},
@@ -2156,8 +2156,8 @@
"then": "Eintritt kostenlos"
}
},
- "render": "Der Besuch des Turms kostet {charge}",
- "question": "Was kostet der Zugang zu diesem Turm?"
+ "question": "Was kostet der Zugang zu diesem Turm?",
+ "render": "Der Besuch des Turms kostet {charge}"
},
"Height": {
"question": "Wie hoch ist dieser Turm?",
@@ -2280,12 +2280,12 @@
"question": "Ist dieser Spielplatz nachts beleuchtet?"
},
"playground-max_age": {
- "render": "Zugang nur für Kinder bis maximal {max_age}",
- "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
+ "question": "Bis zu welchem Alter dürfen Kinder auf diesem Spielplatz spielen?",
+ "render": "Zugang nur für Kinder bis maximal {max_age}"
},
"playground-min_age": {
- "render": "Zugang nur für Kinder ab {min_age} Jahren",
- "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?"
+ "question": "Ab welchem Alter dürfen Kinder auf diesem Spielplatz spielen?",
+ "render": "Zugang nur für Kinder ab {min_age} Jahren"
},
"playground-opening_hours": {
"mappings": {
@@ -2306,8 +2306,8 @@
"render": "Betrieben von {operator}"
},
"playground-phone": {
- "render": "{phone}",
- "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?"
+ "question": "Wie lautet die Telefonnummer vom Betreiber des Spielplatzes?",
+ "render": "{phone}"
},
"playground-surface": {
"mappings": {
@@ -2463,6 +2463,8 @@
}
},
"shops": {
+ "description": "Ein Geschäft",
+ "name": "Geschäft",
"presets": {
"0": {
"description": "Ein neues Geschäft hinzufügen",
@@ -2470,9 +2472,18 @@
}
},
"tagRenderings": {
+ "shops-email": {
+ "question": "Wie ist die Email-Adresse dieses Geschäfts?"
+ },
+ "shops-name": {
+ "question": "Wie ist der Name dieses Geschäfts?"
+ },
+ "shops-opening_hours": {
+ "question": "Wie sind die Öffnungszeiten dieses Geschäfts?"
+ },
"shops-phone": {
- "render": "{phone}",
- "question": "Wie ist die Telefonnummer?"
+ "question": "Wie ist die Telefonnummer?",
+ "render": "{phone}"
},
"shops-shop": {
"mappings": {
@@ -2504,15 +2515,6 @@
"shops-website": {
"question": "Wie lautet die Webseite dieses Geschäfts?",
"render": "{website}"
- },
- "shops-opening_hours": {
- "question": "Wie sind die Öffnungszeiten dieses Geschäfts?"
- },
- "shops-email": {
- "question": "Wie ist die Email-Adresse dieses Geschäfts?"
- },
- "shops-name": {
- "question": "Wie ist der Name dieses Geschäfts?"
}
},
"title": {
@@ -2525,9 +2527,7 @@
}
},
"render": "Geschäft"
- },
- "name": "Geschäft",
- "description": "Ein Geschäft"
+ }
},
"slow_roads": {
"tagRenderings": {
@@ -2579,23 +2579,20 @@
"0": {
"then": "Öffentlicher Zugang"
},
+ "1": {
+ "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)"
+ },
"2": {
"then": "Zugang nur für Vereinsmitglieder"
},
"3": {
"then": "Privat - kein öffentlicher Zugang"
- },
- "1": {
- "then": "Eingeschränkter Zugang (z. B. nur mit Termin, zu bestimmten Zeiten, ...)"
}
},
"question": "Ist dieser Sportplatz öffentlich zugänglich?"
},
"sport-pitch-reservation": {
"mappings": {
- "3": {
- "then": "Termine nach Vereinbarung nicht möglich"
- },
"0": {
"then": "Für die Nutzung des Sportplatzes ist eine Voranmeldung erforderlich"
},
@@ -2604,10 +2601,16 @@
},
"2": {
"then": "Eine Voranmeldung ist möglich, aber nicht notwendig, um diesen Sportplatz zu nutzen"
+ },
+ "3": {
+ "then": "Termine nach Vereinbarung nicht möglich"
}
},
"question": "Muss man einen Termin vereinbaren, um diesen Sportplatz zu benutzen?"
},
+ "sport_pitch-email": {
+ "question": "Wie ist die Email-Adresse des Betreibers?"
+ },
"sport_pitch-opening_hours": {
"mappings": {
"1": {
@@ -2616,6 +2619,9 @@
},
"question": "Wann ist dieser Sportplatz zugänglich?"
},
+ "sport_pitch-phone": {
+ "question": "Wie ist die Telefonnummer des Betreibers?"
+ },
"sport_pitch-sport": {
"mappings": {
"0": {
@@ -2658,14 +2664,8 @@
"then": "Die Oberfläche ist Beton"
}
},
- "render": "Die Oberfläche ist {surface}",
- "question": "Was ist die Oberfläche dieses Sportplatzes?"
- },
- "sport_pitch-email": {
- "question": "Wie ist die Email-Adresse des Betreibers?"
- },
- "sport_pitch-phone": {
- "question": "Wie ist die Telefonnummer des Betreibers?"
+ "question": "Was ist die Oberfläche dieses Sportplatzes?",
+ "render": "Die Oberfläche ist {surface}"
}
},
"title": {
@@ -2711,6 +2711,17 @@
"question": "Wer betreibt diese CCTV Kamera?",
"render": "Betrieben von {operator}"
},
+ "Surveillance type: public, outdoor, indoor": {
+ "mappings": {
+ "1": {
+ "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)"
+ },
+ "2": {
+ "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..."
+ }
+ },
+ "question": "Um was für eine Überwachungskamera handelt es sich"
+ },
"Surveillance:zone": {
"mappings": {
"0": {
@@ -2736,8 +2747,6 @@
"render": " Überwacht ein/e {surveillance:zone}"
},
"camera:mount": {
- "question": "Wie ist diese Kamera montiert?",
- "render": "Montageart: {mount}",
"mappings": {
"0": {
"then": "Diese Kamera ist an einer Wand montiert"
@@ -2748,18 +2757,9 @@
"2": {
"then": "Diese Kamera ist an der Decke montiert"
}
- }
- },
- "Surveillance type: public, outdoor, indoor": {
- "question": "Um was für eine Überwachungskamera handelt es sich",
- "mappings": {
- "2": {
- "then": "Ein privater Innenbereich wird überwacht, z. B. ein Geschäft, eine private Tiefgarage, ..."
- },
- "1": {
- "then": "Ein privater Außenbereich wird überwacht (z. B. ein Parkplatz, eine Tankstelle, ein Innenhof, ein Eingang, eine private Einfahrt, ...)"
- }
- }
+ },
+ "question": "Wie ist diese Kamera montiert?",
+ "render": "Montageart: {mount}"
},
"direction. We don't ask this for a dome on a pole or ceiling as it has a 360° view": {
"question": "In welche Himmelsrichtung ist diese Kamera ausgerichtet?"
@@ -2848,6 +2848,25 @@
"question": "Wie viel muss man für diese Toiletten bezahlen?",
"render": "Die Gebühr beträgt {charge}"
},
+ "toilet-handwashing": {
+ "mappings": {
+ "0": {
+ "then": "Diese Toilette verfügt über ein Waschbecken"
+ },
+ "1": {
+ "then": "Diese Toilette verfügt über kein Waschbecken"
+ }
+ },
+ "question": "Verfügt diese Toilette über ein Waschbecken?"
+ },
+ "toilet-has-paper": {
+ "mappings": {
+ "1": {
+ "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen"
+ }
+ },
+ "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?"
+ },
"toilets-changing-table": {
"mappings": {
"0": {
@@ -2897,25 +2916,6 @@
}
},
"question": "Gibt es eine Toilette für Rollstuhlfahrer?"
- },
- "toilet-has-paper": {
- "question": "Muss man für diese Toilette sein eigenes Toilettenpapier mitbringen?",
- "mappings": {
- "1": {
- "then": "Für diese Toilette müssen Sie Ihr eigenes Toilettenpapier mitbringen"
- }
- }
- },
- "toilet-handwashing": {
- "question": "Verfügt diese Toilette über ein Waschbecken?",
- "mappings": {
- "0": {
- "then": "Diese Toilette verfügt über ein Waschbecken"
- },
- "1": {
- "then": "Diese Toilette verfügt über kein Waschbecken"
- }
- }
}
},
"title": {
@@ -2968,15 +2968,38 @@
"tagRenderings": {
"tree-decidouous": {
"mappings": {
- "1": {
- "then": "immergrüner Baum."
- },
"0": {
"then": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter."
+ },
+ "1": {
+ "then": "immergrüner Baum."
}
},
"question": "Ist dies ein Nadelbaum oder ein Laubbaum?"
},
+ "tree-denotation": {
+ "mappings": {
+ "0": {
+ "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung."
+ },
+ "1": {
+ "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört."
+ },
+ "2": {
+ "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage."
+ },
+ "3": {
+ "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)."
+ },
+ "5": {
+ "then": "Dieser Baum steht entlang einer Straße."
+ },
+ "7": {
+ "then": "Dieser Baum steht außerhalb eines städtischen Gebiets."
+ }
+ },
+ "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft."
+ },
"tree-height": {
"mappings": {
"0": {
@@ -2987,14 +3010,14 @@
},
"tree-heritage": {
"mappings": {
- "3": {
- "then": "Nicht als Denkmal registriert"
- },
"0": {
"then": " Als Denkmal registriert von der Onroerend Erfgoed Flandern"
},
"1": {
"then": "Als Denkmal registriert von der Direction du Patrimoine culturel Brüssel"
+ },
+ "3": {
+ "then": "Nicht als Denkmal registriert"
}
},
"question": "Ist dieser Baum ein Naturdenkmal?"
@@ -3027,29 +3050,6 @@
},
"tree_node-wikidata": {
"question": "Was ist das passende Wikidata Element zu diesem Baum?"
- },
- "tree-denotation": {
- "mappings": {
- "5": {
- "then": "Dieser Baum steht entlang einer Straße."
- },
- "7": {
- "then": "Dieser Baum steht außerhalb eines städtischen Gebiets."
- },
- "2": {
- "then": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage."
- },
- "3": {
- "then": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...)."
- },
- "0": {
- "then": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung."
- },
- "1": {
- "then": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört."
- }
- },
- "question": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft."
}
},
"title": {
@@ -3079,6 +3079,7 @@
}
},
"visitor_information_centre": {
+ "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet.",
"name": "Besucherinformationszentrum",
"title": {
"mappings": {
@@ -3087,8 +3088,7 @@
}
},
"render": "{name}"
- },
- "description": "Ein Besucherzentrum bietet Informationen über eine bestimmte Attraktion oder Sehenswürdigkeit, an der es sich befindet."
+ }
},
"waste_basket": {
"description": "Dies ist ein öffentlicher Abfalleimer, in den Sie Ihren Müll entsorgen können.",
@@ -3106,6 +3106,20 @@
}
},
"tagRenderings": {
+ "dispensing_dog_bags": {
+ "mappings": {
+ "0": {
+ "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
+ },
+ "1": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ },
+ "2": {
+ "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
+ }
+ },
+ "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?"
+ },
"waste-basket-waste-types": {
"mappings": {
"0": {
@@ -3125,20 +3139,6 @@
}
},
"question": "Um was für einen Abfalleimer handelt es sich?"
- },
- "dispensing_dog_bags": {
- "question": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?",
- "mappings": {
- "1": {
- "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
- },
- "2": {
- "then": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
- },
- "0": {
- "then": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
- }
- }
}
},
"title": {
@@ -3148,4 +3148,4 @@
"watermill": {
"name": "Wassermühle"
}
-}
+}
\ No newline at end of file
diff --git a/langs/shared-questions/de.json b/langs/shared-questions/de.json
index cc6df974b..24b5582b6 100644
--- a/langs/shared-questions/de.json
+++ b/langs/shared-questions/de.json
@@ -96,4 +96,4 @@
"question": "Was ist der entsprechende Artikel auf Wikipedia?"
}
}
-}
+}
\ No newline at end of file
diff --git a/langs/shared-questions/pt.json b/langs/shared-questions/pt.json
index 2afb0b221..b1f25a435 100644
--- a/langs/shared-questions/pt.json
+++ b/langs/shared-questions/pt.json
@@ -79,21 +79,21 @@
},
"question": "Este lugar é acessível a utilizadores de cadeiras de rodas?"
},
- "wikipedialink": {
- "question": "Qual é o item correspondente na Wikipédia?",
- "mappings": {
- "0": {
- "then": "Não vinculado à Wikipédia"
- }
- }
- },
"wikipedia": {
- "question": "Qual é a entidade Wikidata correspondente?",
"mappings": {
"0": {
"then": "Ainda não foi vinculada nenhuma página da Wikipédia"
}
- }
+ },
+ "question": "Qual é a entidade Wikidata correspondente?"
+ },
+ "wikipedialink": {
+ "mappings": {
+ "0": {
+ "then": "Não vinculado à Wikipédia"
+ }
+ },
+ "question": "Qual é o item correspondente na Wikipédia?"
}
}
-}
+}
\ No newline at end of file
diff --git a/langs/themes/de.json b/langs/themes/de.json
index 105fdb9fc..e01564288 100644
--- a/langs/themes/de.json
+++ b/langs/themes/de.json
@@ -318,6 +318,18 @@
}
},
"tagRenderings": {
+ "Bolts": {
+ "mappings": {
+ "0": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ },
+ "1": {
+ "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
+ }
+ },
+ "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?",
+ "render": "Diese Kletterroute hat {climbing:bolts} Haken"
+ },
"Difficulty": {
"question": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?",
"render": "Die Schwierigkeit ist {climbing:grade:french} entsprechend des französisch/belgischen Systems"
@@ -334,18 +346,6 @@
},
"question": "Wie heißt diese Kletterroute?",
"render": "{name}"
- },
- "Bolts": {
- "render": "Diese Kletterroute hat {climbing:bolts} Haken",
- "question": "Wie viele Haken gibt es auf dieser Kletterroute bevor der Umlenker bzw. Standhaken erreicht ist?",
- "mappings": {
- "1": {
- "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
- },
- "0": {
- "then": "Auf dieser Kletterroute sind keine Haken vorhanden"
- }
- }
}
},
"title": {
@@ -646,8 +646,6 @@
},
"etymology": {
"description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, das mit Wikidata verknüpft wurde. In dem Popup sehen Sie den Wikipedia-Artikel (falls vorhanden) oder ein Wikidata-Feld, nach dem das Objekt benannt ist. Wenn das Objekt selbst eine Wikipedia-Seite hat, wird auch diese angezeigt.
Sie können auch einen Beitrag leisten!Zoomen Sie genug hinein und alle Straßen werden angezeigt. Wenn Sie auf eine Straße klicken, öffnet sich ein Wikidata-Suchfeld. Mit ein paar Klicks können Sie einen Etymologie-Link hinzufügen. Beachten Sie, dass Sie dazu ein kostenloses OpenStreetMap-Konto benötigen.",
- "shortDescription": "Was ist der Ursprung eines Ortsnamens?",
- "title": "Open Etymology Map",
"layers": {
"1": {
"override": {
@@ -659,7 +657,9 @@
"name": "Parks und Waldflächen ohne Informationen zur Namensherkunft"
}
}
- }
+ },
+ "shortDescription": "Was ist der Ursprung eines Ortsnamens?",
+ "title": "Open Etymology Map"
},
"facadegardens": {
"layers": {
@@ -963,10 +963,31 @@
}
}
},
+ "maps": {
+ "title": "Eine Karte der Karten"
+ },
+ "natuurpunt": {
+ "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt",
+ "title": "Naturschutzgebiete"
+ },
+ "observation_towers": {
+ "description": "Öffentlich zugänglicher Aussichtsturm",
+ "shortDescription": "Öffentlich zugänglicher Aussichtsturm",
+ "title": "Aussichtstürme"
+ },
"openwindpowermap": {
"description": "Eine Karte zum Anzeigen und Bearbeiten von Windkraftanlagen.",
"layers": {
"0": {
+ "name": "Windrad",
+ "presets": {
+ "0": {
+ "title": "Windrad"
+ }
+ },
+ "title": {
+ "render": "Windrad"
+ },
"units": {
"0": {
"applicableUnits": {
@@ -991,40 +1012,40 @@
}
}
}
- },
- "title": {
- "render": "Windrad"
- },
- "name": "Windrad",
- "presets": {
- "0": {
- "title": "Windrad"
- }
}
}
},
"title": "OpenWindPowerMap"
},
+ "parkings": {
+ "description": "Diese Karte zeigt Parkplätze",
+ "shortDescription": "Diese Karte zeigt Parkplätze",
+ "title": "Parken"
+ },
"personal": {
"description": "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen",
"title": "Persönliches Thema"
},
+ "playgrounds": {
+ "shortDescription": "Eine Karte mit Spielplätzen",
+ "title": "Spielpläzte"
+ },
"postboxes": {
"layers": {
- "1": {
- "description": "Eine Ebene mit Postämtern.",
- "tagRenderings": {
- "OH": {
- "mappings": {
- "0": {
- "then": "durchgehend geöffnet (auch an Feiertagen)"
- }
- }
+ "0": {
+ "description": "Die Ebene zeigt Briefkästen.",
+ "name": "Brieflästen",
+ "presets": {
+ "0": {
+ "title": "Briefkasten"
}
},
"title": {
- "render": "Poststelle"
- },
+ "render": "Briefkasten"
+ }
+ },
+ "1": {
+ "description": "Eine Ebene mit Postämtern.",
"filter": {
"0": {
"options": {
@@ -1039,19 +1060,19 @@
"0": {
"title": "Poststelle"
}
- }
- },
- "0": {
- "name": "Brieflästen",
- "presets": {
- "0": {
- "title": "Briefkasten"
+ },
+ "tagRenderings": {
+ "OH": {
+ "mappings": {
+ "0": {
+ "then": "durchgehend geöffnet (auch an Feiertagen)"
+ }
+ }
}
},
"title": {
- "render": "Briefkasten"
- },
- "description": "Die Ebene zeigt Briefkästen."
+ "render": "Poststelle"
+ }
}
},
"shortDescription": "Eine Karte die Briefkästen und Poststellen anzeigt",
@@ -1110,37 +1131,16 @@
}
},
"shortDescription": "Helfen Sie beim Aufbau eines offenen Datensatzes britischer Adressen",
- "title": "Adressen in Großbritannien",
"tileLayerSources": {
"0": {
"name": "Grenzverläufe gemäß osmuk.org"
}
- }
+ },
+ "title": "Adressen in Großbritannien"
},
"waste_basket": {
"description": "Auf dieser Karte finden Sie Abfalleimer in Ihrer Nähe. Wenn ein Abfalleimer auf dieser Karte fehlt, können Sie ihn selbst hinzufügen",
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
- },
- "maps": {
- "title": "Eine Karte der Karten"
- },
- "playgrounds": {
- "title": "Spielpläzte",
- "shortDescription": "Eine Karte mit Spielplätzen"
- },
- "parkings": {
- "title": "Parken",
- "shortDescription": "Diese Karte zeigt Parkplätze",
- "description": "Diese Karte zeigt Parkplätze"
- },
- "natuurpunt": {
- "title": "Naturschutzgebiete",
- "shortDescription": "Diese Karte zeigt Naturschutzgebiete des flämischen Naturverbands Natuurpunt"
- },
- "observation_towers": {
- "title": "Aussichtstürme",
- "description": "Öffentlich zugänglicher Aussichtsturm",
- "shortDescription": "Öffentlich zugänglicher Aussichtsturm"
}
-}
+}
\ No newline at end of file
From 9dc8404c438e0abdd0c2ebccf1e0a472115864b1 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 21:50:38 +0200
Subject: [PATCH 22/30] No more need to add '.clone()' for compiled
translations, removed a bunch of 'clones'
---
UI/BigComponents/FilterView.ts | 24 ++++++----------
UI/BigComponents/FullWelcomePaneWithTabs.ts | 6 ++--
UI/BigComponents/MoreScreen.ts | 7 ++---
UI/Popup/FeatureInfoBox.ts | 4 +--
UI/Popup/MoveWizard.ts | 32 ++++++++++-----------
UI/Popup/TagRenderingQuestion.ts | 18 ++++++++----
UI/i18n/Translations.ts | 10 ++-----
scripts/generateTranslations.ts | 16 +++++++----
8 files changed, 56 insertions(+), 61 deletions(-)
diff --git a/UI/BigComponents/FilterView.ts b/UI/BigComponents/FilterView.ts
index d8a46d517..71506c398 100644
--- a/UI/BigComponents/FilterView.ts
+++ b/UI/BigComponents/FilterView.ts
@@ -40,20 +40,16 @@ export default class FilterView extends VariableUiElement {
const iconUnselected = new Combine([Svg.checkbox_empty]).SetStyle(
iconStyle
);
- const name: Translation = config.config.name.Clone();
+ const name: Translation = config.config.name;
- const styledNameChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
- const styledNameUnChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const zoomStatus =
new Toggle(
undefined,
- Translations.t.general.layerSelection.zoomInToSeeThisLayer.Clone()
+ Translations.t.general.layerSelection.zoomInToSeeThisLayer
.SetClass("alert")
.SetStyle("display: block ruby;width:min-content;"),
State.state.locationControl.map(location => location.zoom >= config.config.minzoom)
@@ -97,20 +93,16 @@ export default class FilterView extends VariableUiElement {
const name: Translation = Translations.WT(
filteredLayer.layerDef.name
- )?.Clone();
+ );
- const styledNameChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
- const styledNameUnChecked = name
- .Clone()
- .SetStyle("font-size:large;padding-left:1.25rem");
+ const styledNameUnChecked = name.Clone().SetStyle("font-size:large;padding-left:1.25rem");
const zoomStatus =
new Toggle(
undefined,
- Translations.t.general.layerSelection.zoomInToSeeThisLayer.Clone()
+ Translations.t.general.layerSelection.zoomInToSeeThisLayer
.SetClass("alert")
.SetStyle("display: block ruby;width:min-content;"),
State.state.locationControl.map(location => location.zoom >= filteredLayer.layerDef.minzoom)
diff --git a/UI/BigComponents/FullWelcomePaneWithTabs.ts b/UI/BigComponents/FullWelcomePaneWithTabs.ts
index 10ab25de5..7e2b4d8fb 100644
--- a/UI/BigComponents/FullWelcomePaneWithTabs.ts
+++ b/UI/BigComponents/FullWelcomePaneWithTabs.ts
@@ -50,7 +50,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
{header: ``, content: welcome},
{
header: Svg.osm_logo_img,
- content: Translations.t.general.openStreetMapIntro.Clone().SetClass("link-underline")
+ content: Translations.t.general.openStreetMapIntro.SetClass("link-underline")
},
]
@@ -64,7 +64,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
header: Svg.add_img,
content:
new Combine([
- Translations.t.general.morescreen.intro.Clone(),
+ Translations.t.general.morescreen.intro,
new MoreScreen(state)
]).SetClass("flex flex-col")
});
@@ -86,7 +86,7 @@ export default class FullWelcomePaneWithTabs extends ScrollableFullScreen {
tabsWithAboutMc.push({
header: Svg.help,
- content: new Combine([Translations.t.general.aboutMapcomplete.Clone()
+ content: new Combine([Translations.t.general.aboutMapcomplete
.Subs({"osmcha_link": Utils.OsmChaLinkFor(7)}), " Version " + Constants.vNumber])
.SetClass("link-underline")
}
diff --git a/UI/BigComponents/MoreScreen.ts b/UI/BigComponents/MoreScreen.ts
index c59766f28..84475d3be 100644
--- a/UI/BigComponents/MoreScreen.ts
+++ b/UI/BigComponents/MoreScreen.ts
@@ -6,8 +6,6 @@ import {SubtleButton} from "../Base/SubtleButton";
import Translations from "../i18n/Translations";
import * as personal from "../../assets/themes/personal/personal.json"
import Constants from "../../Models/Constants";
-import LanguagePicker from "../LanguagePicker";
-import IndexText from "./IndexText";
import BaseUIElement from "../BaseUIElement";
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
import {UIEventSource} from "../../Logic/UIEventSource";
@@ -201,14 +199,13 @@ export default class MoreScreen extends Combine {
}) ?? new UIEventSource(`${linkPrefix}${linkSuffix}`)
- let description = Translations.WT(layout.shortDescription).Clone();
return new SubtleButton(layout.icon,
new Combine([
`
heeft een spanning van {socket:bosch_5pin:voltage} volt"
- },
- "freeform": {
- "key": "socket:bosch_5pin:voltage",
- "type": "pfloat"
- },
- "mappings": [],
- "condition": {
- "and": [
- "socket:bosch_5pin~*",
- "socket:bosch_5pin!=0"
- ]
- }
- },
- {
- "id": "current-15",
- "question": {
- "en": "What current do the plugs with
Bosch Active Connect with 5 pins and cable
offer?",
- "nl": "Welke stroom levert de stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?"
- },
- "render": {
- "en": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:current}A",
- "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een stroom van maximaal {socket:bosch_5pin:current}A"
- },
- "freeform": {
- "key": "socket:bosch_5pin:current",
- "type": "pfloat"
- },
- "mappings": [],
- "condition": {
- "and": [
- "socket:bosch_5pin~*",
- "socket:bosch_5pin!=0"
- ]
- }
- },
- {
- "id": "power-output-15",
- "question": {
- "en": "What power output does a single plug of type
Bosch Active Connect with 5 pins and cable
offer?",
- "nl": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?"
- },
- "render": {
- "en": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:output}",
- "nl": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_5pin:output}"
- },
- "freeform": {
- "key": "socket:bosch_5pin:output",
- "type": "pfloat"
- },
- "mappings": [],
- "condition": {
- "and": [
- "socket:bosch_5pin~*",
- "socket:bosch_5pin!=0"
- ]
- }
- },
{
"id": "Authentication",
"question": {
"en": "What kind of authentication is available at the charging station?",
- "it": "Quali sono gli orari di apertura di questa stazione di ricarica?",
- "ja": "この充電ステーションはいつオープンしますか?",
- "nb_NO": "Når åpnet denne ladestasjonen?",
- "ru": "В какое время работает эта зарядная станция?",
- "zh_Hant": "何時是充電站開放使用的時間?",
+ "nl": "Hoe kan men zich aanmelden aan dit oplaadstation?",
"de": "Welche Authentifizierung ist an der Ladestation möglich?"
},
"multiAnswer": true,
@@ -2846,6 +1244,7 @@
"ifnot": "authentication:membership_card=no",
"then": {
"en": "Authentication by a membership card",
+ "nl": "Aanmelden met een lidkaart is mogelijk",
"de": "Authentifizierung durch eine Mitgliedskarte"
}
},
@@ -2854,6 +1253,7 @@
"ifnot": "authentication:app=no",
"then": {
"en": "Authentication by an app",
+ "nl": "Aanmelden via een applicatie is mogelijk",
"de": "Authentifizierung durch eine App"
}
},
@@ -2862,6 +1262,7 @@
"ifnot": "authentication:phone_call=no",
"then": {
"en": "Authentication via phone call is available",
+ "nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk",
"de": "Authentifizierung per Anruf ist möglich"
}
},
@@ -2870,6 +1271,7 @@
"ifnot": "authentication:short_message=no",
"then": {
"en": "Authentication via phone call is available",
+ "nl": "Aanmelden via SMS is mogelijk",
"de": "Authentifizierung per Anruf ist möglich"
}
},
@@ -2878,6 +1280,7 @@
"ifnot": "authentication:nfc=no",
"then": {
"en": "Authentication via NFC is available",
+ "nl": "Aanmelden via NFC is mogelijk",
"de": "Authentifizierung über NFC ist möglich"
}
},
@@ -2886,6 +1289,7 @@
"ifnot": "authentication:money_card=no",
"then": {
"en": "Authentication via Money Card is available",
+ "nl": "Aanmelden met Money Card is mogelijk",
"de": "Authentifizierung über Geldkarte ist möglich"
}
},
@@ -2894,6 +1298,7 @@
"ifnot": "authentication:debit_card=no",
"then": {
"en": "Authentication via debit card is available",
+ "nl": "Aanmelden met een betaalkaart is mogelijk",
"de": "Authentifizierung per Debitkarte ist möglich"
}
},
@@ -2902,6 +1307,7 @@
"ifnot": "authentication:none=no",
"then": {
"en": "Charging here is (also) possible without authentication",
+ "nl": "Hier opladen is (ook) mogelijk zonder aan te melden",
"de": "Das Aufladen ist hier (auch) ohne Authentifizierung möglich"
}
}
@@ -2911,19 +1317,12 @@
"id": "Auth phone",
"render": {
"en": "Authenticate by calling or SMS'ing to {authentication:phone_call:number}",
- "it": "{network}",
- "ja": "{network}",
- "nb_NO": "{network}",
- "ru": "{network}",
- "zh_Hant": "{network}",
+ "nl": "Aanmelden door te bellen of te SMS'en naar {authentication:phone_call:number}",
"de": "Authentifizierung durch Anruf oder SMS an {authentication:phone_call:number}"
},
"question": {
"en": "What's the phone number for authentication call or SMS?",
- "it": "A quale rete appartiene questa stazione di ricarica?",
- "ja": "この充電ステーションの運営チェーンはどこですか?",
- "ru": "К какой сети относится эта станция?",
- "zh_Hant": "充電站所屬的網路是?",
+ "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?",
"de": "Wie lautet die Telefonnummer für den Authentifizierungsanruf oder die SMS?"
},
"freeform": {
@@ -2935,26 +1334,6 @@
"authentication:phone_call=yes",
"authentication:short_message=yes"
]
- },
- "it": {
- "0": {
- "then": "Non appartiene a una rete"
- }
- },
- "ja": {
- "0": {
- "then": "大規模な運営チェーンの一部ではない"
- }
- },
- "ru": {
- "0": {
- "then": "Не является частью более крупной сети"
- }
- },
- "zh_Hant": {
- "0": {
- "then": "不屬於大型網路"
- }
}
},
{
@@ -2966,13 +1345,20 @@
},
"question": {
"en": "When is this charging station opened?",
- "de": "Wann ist diese Ladestation geöffnet?"
+ "nl": "Wanneer is dit oplaadpunt beschikbaar??",
+ "de": "Wann ist diese Ladestation geöffnet?",
+ "it": "Quali sono gli orari di apertura di questa stazione di ricarica?",
+ "ja": "この充電ステーションはいつオープンしますか?",
+ "nb_NO": "Når åpnet denne ladestasjonen?",
+ "ru": "В какое время работает эта зарядная станция?",
+ "zh_Hant": "何時是充電站開放使用的時間?"
},
"mappings": [
{
"if": "opening_hours=24/7",
"then": {
"en": "24/7 opened (including holidays)",
+ "nl": "24/7 open - ook tijdens vakanties",
"de": "durchgehend geöffnet (auch an Feiertagen)"
}
}
@@ -3074,11 +1460,20 @@
"id": "Network",
"render": {
"en": "Part of the network {network}",
- "de": "Teil des Netzwerks {network}"
+ "de": "Teil des Netzwerks {network}",
+ "it": "{network}",
+ "ja": "{network}",
+ "nb_NO": "{network}",
+ "ru": "{network}",
+ "zh_Hant": "{network}"
},
"question": {
"en": "Is this charging station part of a network?",
- "de": "Ist diese Ladestation Teil eines Netzwerks?"
+ "de": "Ist diese Ladestation Teil eines Netzwerks?",
+ "it": "A quale rete appartiene questa stazione di ricarica?",
+ "ja": "この充電ステーションの運営チェーンはどこですか?",
+ "ru": "К какой сети относится эта станция?",
+ "zh_Hant": "充電站所屬的網路是?"
},
"freeform": {
"key": "network"
@@ -3198,6 +1593,7 @@
},
"render": {
"en": "Reference number is {ref}",
+ "nl": "Het referentienummer van dit oplaadpunt is {ref}",
"de": "Die Kennziffer ist {ref}"
},
"freeform": {
@@ -3295,7 +1691,16 @@
"de": "Beim Laden ist eine zusätzliche Parkgebühr zu entrichten"
}
}
- ]
+ ],
+ "condition": {
+ "or": [
+ "motor_vehicle=yes",
+ "hgv=yes",
+ "bus=yes",
+ "bicycle=no",
+ "bicycle="
+ ]
+ }
}
],
"icon": {
@@ -3604,8 +2009,8 @@
"humanSingular": {
"en": " hour",
"nl": " uur",
- "ru": " час",
- "de": " Stunde"
+ "de": " Stunde",
+ "ru": " час"
}
},
{
@@ -3625,8 +2030,8 @@
"humanSingular": {
"en": " day",
"nl": " dag",
- "ru": " день",
- "de": " Tag"
+ "de": " Tag",
+ "ru": " день"
}
}
]
@@ -3663,8 +2068,8 @@
"human": {
"en": "Volts",
"nl": "volt",
- "ru": "Вольт",
- "de": "Volt"
+ "de": "Volt",
+ "ru": "Вольт"
}
}
],
@@ -3734,8 +2139,8 @@
"human": {
"en": "kilowatt",
"nl": "kilowatt",
- "ru": "киловатт",
- "de": "Kilowatt"
+ "de": "Kilowatt",
+ "ru": "киловатт"
}
},
{
@@ -3746,12 +2151,25 @@
"human": {
"en": "megawatt",
"nl": "megawatt",
- "ru": "мегаватт",
- "de": "Megawatt"
+ "de": "Megawatt",
+ "ru": "мегаватт"
}
}
],
"eraseInvalidValues": true
}
- ]
+ ],
+ "allowMove": {
+ "enableRelocation": false,
+ "enableImproveAccuracy": true
+ },
+ "deletion": {
+ "softDeletionTags": {
+ "and": [
+ "amenity=",
+ "disused:amenity=charging_station"
+ ]
+ },
+ "neededChangesets": 10
+ }
}
\ No newline at end of file
diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson
index 955245640..84e54298f 100644
--- a/assets/layers/charging_station/charging_station.protojson
+++ b/assets/layers/charging_station/charging_station.protojson
@@ -2,11 +2,7 @@
"id": "charging_station",
"name": {
"en": "Charging stations",
- "it": "Stazioni di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjoner",
- "ru": "Зарядные станции",
- "zh_Hant": "充電站"
+ "nl": "Oplaadpunten"
},
"minzoom": 10,
"source": {
@@ -22,27 +18,21 @@
"title": {
"render": {
"en": "Charging station",
- "it": "Stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
+ "nl": "Oplaadpunten"
}
},
"description": {
"en": "A charging station",
- "it": "Una stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "En ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
+ "nl": "Oplaadpunten"
},
"tagRenderings": [
"images",
{
"id": "Type",
+ "#": "Allowed vehicle types",
"question": {
- "en": "Which vehicles are allowed to charge here?"
+ "en": "Which vehicles are allowed to charge here?",
+ "nl": "Welke voertuigen kunnen hier opgeladen worden?"
},
"multiAnswer": true,
"mappings": [
@@ -50,35 +40,40 @@
"if": "bicycle=yes",
"ifnot": "bicycle=no",
"then": {
- "en": "bicycles can be charged here"
+ "en": "Bcycles can be charged here",
+ "nl": "Fietsen kunnen hier opgeladen worden"
}
},
{
"if": "motorcar=yes",
"ifnot": "motorcar=no",
"then": {
- "en": "Cars can be charged here"
+ "en": "Cars can be charged here",
+ "nl": "Elektrische auto's kunnen hier opgeladen worden"
}
},
{
"if": "scooter=yes",
"ifnot": "scooter=no",
"then": {
- "en": "Scooters can be charged here"
+ "en": "Scooters can be charged here",
+ "nl": "Electrische scooters (snorfiets of bromfiets) kunnen hier opgeladen worden"
}
},
{
"if": "hgv=yes",
"ifnot": "hgv=no",
"then": {
- "en": "Heavy good vehicles (such as trucks) can be charged here"
+ "en": "Heavy good vehicles (such as trucks) can be charged here",
+ "nl": "Vrachtwagens kunnen hier opgeladen worden"
}
},
{
"if": "bus=yes",
"ifnot": "bus=no",
"then": {
- "en": "Buses can be charged here"
+ "en": "Buses can be charged here",
+ "nl": "Bussen kunnen hier opgeladen worden"
}
}
]
@@ -86,10 +81,12 @@
{
"id": "access",
"question": {
- "en": "Who is allowed to use this charging station?"
+ "en": "Who is allowed to use this charging station?",
+ "nl": "Wie mag er dit oplaadpunt gebruiken?"
},
"render": {
- "en": "Access is {access}"
+ "en": "Access is {access}",
+ "nl": "Toegang voor {access}"
},
"freeform": {
"key": "access",
@@ -100,7 +97,10 @@
"mappings": [
{
"if": "access=yes",
- "then": "Anyone can use this charging station (payment might be needed)"
+ "then": {
+ "en":"Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ }
},
{
"if": {
@@ -109,16 +109,25 @@
"access=public"
]
},
- "then": "Anyone can use this charging station (payment might be needed)",
+ "then": {
+ "en":"Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ },
"hideInAnswer": true
},
{
"if": "access=customers",
- "then": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests "
+ "then": {
+ "en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
+ "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
+ }
},
{
"if": "access=private",
- "then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)"
+ "then": {
+ "en":"Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
+ "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
+ }
}
]
},
@@ -142,11 +151,7 @@
"id": "Authentication",
"question": {
"en": "What kind of authentication is available at the charging station?",
- "it": "Quali sono gli orari di apertura di questa stazione di ricarica?",
- "ja": "この充電ステーションはいつオープンしますか?",
- "nb_NO": "Når åpnet denne ladestasjonen?",
- "ru": "В какое время работает эта зарядная станция?",
- "zh_Hant": "何時是充電站開放使用的時間?"
+ "nl": "Hoe kan men zich aanmelden aan dit oplaadstation?"
},
"multiAnswer": true,
"mappings": [
@@ -154,56 +159,64 @@
"if": "authentication:membership_card=yes",
"ifnot": "authentication:membership_card=no",
"then": {
- "en": "Authentication by a membership card"
+ "en": "Authentication by a membership card",
+ "nl": "Aanmelden met een lidkaart is mogelijk"
}
},
{
"if": "authentication:app=yes",
"ifnot": "authentication:app=no",
"then": {
- "en": "Authentication by an app"
+ "en": "Authentication by an app",
+ "nl": "Aanmelden via een applicatie is mogelijk"
}
},
{
"if": "authentication:phone_call=yes",
"ifnot": "authentication:phone_call=no",
"then": {
- "en": "Authentication via phone call is available"
+ "en": "Authentication via phone call is available",
+ "nl": "Aanmelden door te bellen naar een telefoonnummer is mogelijk"
}
},
{
"if": "authentication:short_message=yes",
"ifnot": "authentication:short_message=no",
"then": {
- "en": "Authentication via phone call is available"
+ "en": "Authentication via SMS is available",
+ "nl": "Aanmelden via SMS is mogelijk"
}
},
{
"if": "authentication:nfc=yes",
"ifnot": "authentication:nfc=no",
"then": {
- "en": "Authentication via NFC is available"
+ "en": "Authentication via NFC is available",
+ "nl": "Aanmelden via NFC is mogelijk"
}
},
{
"if": "authentication:money_card=yes",
"ifnot": "authentication:money_card=no",
"then": {
- "en": "Authentication via Money Card is available"
+ "en": "Authentication via Money Card is available",
+ "nl": "Aanmelden met Money Card is mogelijk"
}
},
{
"if": "authentication:debit_card=yes",
"ifnot": "authentication:debit_card=no",
"then": {
- "en": "Authentication via debit card is available"
+ "en": "Authentication via debit card is available",
+ "nl": "Aanmelden met een betaalkaart is mogelijk"
}
},
{
"if": "authentication:none=yes",
"ifnot": "authentication:none=no",
"then": {
- "en": "Charging here is (also) possible without authentication"
+ "en": "Charging here is (also) possible without authentication",
+ "nl": "Hier opladen is (ook) mogelijk zonder aan te melden"
}
}
]
@@ -212,18 +225,12 @@
"id": "Auth phone",
"render": {
"en": "Authenticate by calling or SMS'ing to {authentication:phone_call:number}",
- "it": "{network}",
- "ja": "{network}",
- "nb_NO": "{network}",
- "ru": "{network}",
- "zh_Hant": "{network}"
+ "nl": "Aanmelden door te bellen of te SMS'en naar {authentication:phone_call:number}"
+
},
"question": {
"en": "What's the phone number for authentication call or SMS?",
- "it": "A quale rete appartiene questa stazione di ricarica?",
- "ja": "この充電ステーションの運営チェーンはどこですか?",
- "ru": "К какой сети относится эта станция?",
- "zh_Hant": "充電站所屬的網路是?"
+ "nl": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?"
},
"freeform": {
"key": "authentication:phone_call:number",
@@ -234,26 +241,6 @@
"authentication:phone_call=yes",
"authentication:short_message=yes"
]
- },
- "it": {
- "0": {
- "then": "Non appartiene a una rete"
- }
- },
- "ja": {
- "0": {
- "then": "大規模な運営チェーンの一部ではない"
- }
- },
- "ru": {
- "0": {
- "then": "Не является частью более крупной сети"
- }
- },
- "zh_Hant": {
- "0": {
- "then": "不屬於大型網路"
- }
}
},
{
@@ -264,13 +251,15 @@
"type": "opening_hours"
},
"question": {
- "en": "When is this charging station opened?"
+ "en": "When is this charging station opened?",
+ "nl": "Wanneer is dit oplaadpunt beschikbaar??"
},
"mappings": [
{
"if": "opening_hours=24/7",
"then": {
- "en": "24/7 opened (including holidays)"
+ "en": "24/7 opened (including holidays)",
+ "nl": "24/7 open - ook tijdens vakanties"
}
}
]
@@ -472,7 +461,8 @@
"en": "What is the reference number of this charging station?"
},
"render": {
- "en": "Reference number is {ref}"
+ "en": "Reference number is {ref}",
+ "nl": "Het referentienummer van dit oplaadpunt is {ref}"
},
"freeform": {
"key": "ref"
@@ -557,7 +547,16 @@
"en": "An additional parking fee should be paid while charging"
}
}
- ]
+ ],
+ "condition": {
+ "or": [
+ "motor_vehicle=yes",
+ "hgv=yes",
+ "bus=yes",
+ "bicycle=no",
+ "bicycle="
+ ]
+ }
}
],
"icon": {
diff --git a/assets/layers/charging_station/csvToJson.ts b/assets/layers/charging_station/csvToJson.ts
index c630297c0..d781d33e7 100644
--- a/assets/layers/charging_station/csvToJson.ts
+++ b/assets/layers/charging_station/csvToJson.ts
@@ -56,6 +56,7 @@ function run(file, protojson) {
const overview_question_answers = []
const questions: (TagRenderingConfigJson & { "id": string })[] = []
+ const technicalQuestions: (TagRenderingConfigJson & { "id": string })[] = []
const filterOptions: { question: any, osmTags?: string } [] = [
{
question: {
@@ -149,7 +150,7 @@ function run(file, protojson) {
}
})
- questions.push({
+ technicalQuestions.push({
"id": "voltage-" + i,
question: {
en: `What voltage do the plugs with ${descrWithImage_en} offer?`,
@@ -178,7 +179,7 @@ function run(file, protojson) {
})
- questions.push({
+ technicalQuestions.push({
"id": "current-" + i,
question: {
en: `What current do the plugs with ${descrWithImage_en} offer?`,
@@ -207,7 +208,7 @@ function run(file, protojson) {
})
- questions.push({
+ technicalQuestions.push({
"id": "power-output-" + i,
question: {
en: `What power output does a single plug of type ${descrWithImage_en} offer?`,
@@ -247,7 +248,8 @@ function run(file, protojson) {
const toggles = {
"id": "Available_charging_stations (generated)",
"question": {
- "en": "Which charging stations are available here?"
+ "en": "Which charging connections are available here?",
+ "nl": "Welke aansluitingen zijn hier beschikbaar?"
},
"multiAnswer": true,
"mappings": overview_question_answers
diff --git a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json
index 733b94d9f..911cf7ac9 100644
--- a/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json
+++ b/assets/themes/toerisme_vlaanderen/toerisme_vlaanderen.json
@@ -7,6 +7,9 @@
"en",
"nl"
],
+ "mustHaveLanguage": [
+ "nl"
+ ],
"title": {
"nl": "Toeristisch relevante info"
},
diff --git a/langs/layers/en.json b/langs/layers/en.json
index f32bf146e..3c5dae71a 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -1227,6 +1227,20 @@
"question": "Which vehicles are allowed to charge here?"
},
"access": {
+ "mappings": {
+ "0": {
+ "then": "Anyone can use this charging station (payment might be needed)"
+ },
+ "1": {
+ "then": "Anyone can use this charging station (payment might be needed)"
+ },
+ "2": {
+ "then": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests"
+ },
+ "3": {
+ "then": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)"
+ }
+ },
"question": "Who is allowed to use this charging station?",
"render": "Access is {access}"
},
@@ -1234,167 +1248,6 @@
"question": "How much vehicles can be charged here at the same time?",
"render": "{capacity} vehicles can be charged here at the same time"
},
- "current-0": {
- "mappings": {
- "0": {
- "then": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 16 A"
- }
- },
- "question": "What current do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?",
- "render": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:current}A"
- },
- "current-1": {
- "mappings": {
- "0": {
- "then": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 16 A"
- }
- },
- "question": "What current do the plugs with
European wall plug with ground pin (CEE7/4 type E)
offer?",
- "render": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:current}A"
- },
- "current-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 125 A"
- },
- "1": {
- "then": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Tesla Supercharger CCS (a branded type2_css)
offer?",
- "render": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:current}A"
- },
- "current-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
outputs at most 125 A"
- },
- "1": {
- "then": "
Tesla Supercharger (destination)
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Tesla Supercharger (destination)
offer?",
- "render": "
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:current}A"
- },
- "current-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 16 A"
- },
- "1": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
offer?",
- "render": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:current}A"
- },
- "current-13": {
- "mappings": {
- "0": {
- "then": "
USB to charge phones and small electronics
outputs at most 1 A"
- },
- "1": {
- "then": "
USB to charge phones and small electronics
outputs at most 2 A"
- }
- },
- "question": "What current do the plugs with
USB to charge phones and small electronics
offer?",
- "render": "
USB to charge phones and small electronics
outputs at most {socket:USB-A:current}A"
- },
- "current-14": {
- "question": "What current do the plugs with
Bosch Active Connect with 3 pins and cable
offer?",
- "render": "
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:current}A"
- },
- "current-15": {
- "question": "What current do the plugs with
Bosch Active Connect with 5 pins and cable
offer?",
- "render": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:current}A"
- },
- "current-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
outputs at most 120 A"
- }
- },
- "question": "What current do the plugs with
Chademo
offer?",
- "render": "
Chademo
outputs at most {socket:chademo:current}A"
- },
- "current-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 with cable (J1772)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 1 with cable (J1772)
offer?",
- "render": "
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:current}A"
- },
- "current-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 without cable (J1772)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 1 without cable (J1772)
offer?",
- "render": "
Type 1 without cable (J1772)
outputs at most {socket:type1:current}A"
- },
- "current-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 A"
- },
- "1": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 125 A"
- }
- },
- "question": "What current do the plugs with
Type 1 CCS (aka Type 1 Combo)
offer?",
- "render": "
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:current}A"
- },
- "current-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
outputs at most 125 A"
- },
- "1": {
- "then": "
Tesla Supercharger
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Tesla Supercharger
offer?",
- "render": "
Tesla Supercharger
outputs at most {socket:tesla_supercharger:current}A"
- },
- "current-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
outputs at most 16 A"
- },
- "1": {
- "then": "
Type 2 (mennekes)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 2 (mennekes)
offer?",
- "render": "
Type 2 (mennekes)
outputs at most {socket:type2:current}A"
- },
- "current-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
outputs at most 125 A"
- },
- "1": {
- "then": "
Type 2 CCS (mennekes)
outputs at most 350 A"
- }
- },
- "question": "What current do the plugs with
Type 2 CCS (mennekes)
offer?",
- "render": "
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:current}A"
- },
- "current-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 16 A"
- },
- "1": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 32 A"
- }
- },
- "question": "What current do the plugs with
Type 2 with cable (mennekes)
offer?",
- "render": "
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:current}A"
- },
"email": {
"question": "What is the email address of the operator?",
"render": "In case of problems, send an email to {email}"
@@ -1497,350 +1350,10 @@
"question": "How much plugs of type
Type 2 with cable (mennekes)
are available here?",
"render": "There are {socket:type2_cable} plugs of type
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most 3.6 kw"
- }
- },
- "question": "What power output does a single plug of type
Schuko wall plug without ground pin (CEE7/4 type F)
offer?",
- "render": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs at most {socket:schuko:output}"
- },
- "power-output-1": {
- "mappings": {
- "0": {
- "then": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 3 kw"
- },
- "1": {
- "then": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most 22 kw"
- }
- },
- "question": "What power output does a single plug of type
European wall plug with ground pin (CEE7/4 type E)
offer?",
- "render": "
European wall plug with ground pin (CEE7/4 type E)
outputs at most {socket:typee:output}"
- },
- "power-output-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most 50 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla Supercharger CCS (a branded type2_css)
offer?",
- "render": "
Tesla Supercharger CCS (a branded type2_css)
outputs at most {socket:tesla_supercharger_ccs:output}"
- },
- "power-output-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
outputs at most 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger (destination)
outputs at most 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger (destination)
outputs at most 250 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla Supercharger (destination)
offer?",
- "render": "
Tesla Supercharger (destination)
outputs at most {socket:tesla_destination:output}"
- },
- "power-output-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 11 kw"
- },
- "1": {
- "then": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most 22 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
offer?",
- "render": "
Tesla supercharger (destination (A Type 2 with cable branded as tesla)
outputs at most {socket:tesla_destination:output}"
- },
- "power-output-13": {
- "mappings": {
- "0": {
- "then": "
USB to charge phones and small electronics
outputs at most 5w"
- },
- "1": {
- "then": "
USB to charge phones and small electronics
outputs at most 10w"
- }
- },
- "question": "What power output does a single plug of type
USB to charge phones and small electronics
offer?",
- "render": "
USB to charge phones and small electronics
outputs at most {socket:USB-A:output}"
- },
- "power-output-14": {
- "question": "What power output does a single plug of type
Bosch Active Connect with 3 pins and cable
offer?",
- "render": "
Bosch Active Connect with 3 pins and cable
outputs at most {socket:bosch_3pin:output}"
- },
- "power-output-15": {
- "question": "What power output does a single plug of type
Bosch Active Connect with 5 pins and cable
offer?",
- "render": "
Bosch Active Connect with 5 pins and cable
outputs at most {socket:bosch_5pin:output}"
- },
- "power-output-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
outputs at most 50 kw"
- }
- },
- "question": "What power output does a single plug of type
Chademo
offer?",
- "render": "
Chademo
outputs at most {socket:chademo:output}"
- },
- "power-output-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 with cable (J1772)
outputs at most 3.7 kw"
- },
- "1": {
- "then": "
Type 1 with cable (J1772)
outputs at most 7 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 1 with cable (J1772)
offer?",
- "render": "
Type 1 with cable (J1772)
outputs at most {socket:type1_cable:output}"
- },
- "power-output-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 without cable (J1772)
outputs at most 3.7 kw"
- },
- "1": {
- "then": "
Type 1 without cable (J1772)
outputs at most 6.6 kw"
- },
- "2": {
- "then": "
Type 1 without cable (J1772)
outputs at most 7 kw"
- },
- "3": {
- "then": "
Type 1 without cable (J1772)
outputs at most 7.2 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 1 without cable (J1772)
offer?",
- "render": "
Type 1 without cable (J1772)
outputs at most {socket:type1:output}"
- },
- "power-output-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 50 kw"
- },
- "1": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 62.5 kw"
- },
- "2": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 150 kw"
- },
- "3": {
- "then": "
Type 1 CCS (aka Type 1 Combo)
outputs at most 350 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 1 CCS (aka Type 1 Combo)
offer?",
- "render": "
Type 1 CCS (aka Type 1 Combo)
outputs at most {socket:type1_combo:output}"
- },
- "power-output-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
outputs at most 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger
outputs at most 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger
outputs at most 250 kw"
- }
- },
- "question": "What power output does a single plug of type
Tesla Supercharger
offer?",
- "render": "
Tesla Supercharger
outputs at most {socket:tesla_supercharger:output}"
- },
- "power-output-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
outputs at most 11 kw"
- },
- "1": {
- "then": "
Type 2 (mennekes)
outputs at most 22 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 2 (mennekes)
offer?",
- "render": "
Type 2 (mennekes)
outputs at most {socket:type2:output}"
- },
- "power-output-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
outputs at most 50 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 2 CCS (mennekes)
offer?",
- "render": "
Type 2 CCS (mennekes)
outputs at most {socket:type2_combo:output}"
- },
- "power-output-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 11 kw"
- },
- "1": {
- "then": "
Type 2 with cable (mennekes)
outputs at most 22 kw"
- }
- },
- "question": "What power output does a single plug of type
Type 2 with cable (mennekes)
offer?",
- "render": "
Type 2 with cable (mennekes)
outputs at most {socket:type2_cable:output}"
- },
"ref": {
"question": "What is the reference number of this charging station?",
"render": "Reference number is {ref}"
},
- "voltage-0": {
- "mappings": {
- "0": {
- "then": "
Schuko wall plug without ground pin (CEE7/4 type F)
outputs 230 volt"
- }
- },
- "question": "What voltage do the plugs with
Schuko wall plug without ground pin (CEE7/4 type F)
offer?",
- "render": "
Schuko wall plug without ground pin (CEE7/4 type F)
levert een vermogen van maximaal 3.6 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
?",
- "render": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
levert een vermogen van maximaal {socket:schuko:output}"
- },
- "power-output-1": {
- "mappings": {
- "0": {
- "then": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal 3 kw"
- },
- "1": {
- "then": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal 22 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Europese stekker met aardingspin (CEE7/4 type E)
?",
- "render": "
Europese stekker met aardingspin (CEE7/4 type E)
levert een vermogen van maximaal {socket:typee:output}"
- },
- "power-output-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een vermogen van maximaal 50 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
?",
- "render": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
levert een vermogen van maximaal {socket:tesla_supercharger_ccs:output}"
- },
- "power-output-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger (destination)
levert een vermogen van maximaal 250 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger (destination)
?",
- "render": "
Tesla Supercharger (destination)
levert een vermogen van maximaal {socket:tesla_destination:output}"
- },
- "power-output-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal 11 kw"
- },
- "1": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal 22 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
?",
- "render": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
levert een vermogen van maximaal {socket:tesla_destination:output}"
- },
- "power-output-13": {
- "mappings": {
- "0": {
- "then": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal 5w"
- },
- "1": {
- "then": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal 10w"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
USB om GSMs en kleine electronica op te laden
?",
- "render": "
USB om GSMs en kleine electronica op te laden
levert een vermogen van maximaal {socket:USB-A:output}"
- },
- "power-output-14": {
- "question": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
?",
- "render": "
Bosch Active Connect met 3 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_3pin:output}"
- },
- "power-output-15": {
- "question": "Welk vermogen levert een enkele stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
?",
- "render": "
Bosch Active Connect met 5 pinnen aan een kabel
levert een vermogen van maximaal {socket:bosch_5pin:output}"
- },
- "power-output-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
levert een vermogen van maximaal 50 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Chademo
?",
- "render": "
Chademo
levert een vermogen van maximaal {socket:chademo:output}"
- },
- "power-output-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal 3.7 kw"
- },
- "1": {
- "then": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal 7 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 1 met kabel (J1772)
?",
- "render": "
Type 1 met kabel (J1772)
levert een vermogen van maximaal {socket:type1_cable:output}"
- },
- "power-output-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 3.7 kw"
- },
- "1": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 6.6 kw"
- },
- "2": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 7 kw"
- },
- "3": {
- "then": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal 7.2 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 1 zonder kabel (J1772)
?",
- "render": "
Type 1 zonder kabel (J1772)
levert een vermogen van maximaal {socket:type1:output}"
- },
- "power-output-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 50 kw"
- },
- "1": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 62.5 kw"
- },
- "2": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 150 kw"
- },
- "3": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal 350 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 1 CCS (ook gekend als Type 1 Combo)
?",
- "render": "
Type 1 CCS (ook gekend als Type 1 Combo)
levert een vermogen van maximaal {socket:type1_combo:output}"
- },
- "power-output-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
levert een vermogen van maximaal 120 kw"
- },
- "1": {
- "then": "
Tesla Supercharger
levert een vermogen van maximaal 150 kw"
- },
- "2": {
- "then": "
Tesla Supercharger
levert een vermogen van maximaal 250 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Tesla Supercharger
?",
- "render": "
Tesla Supercharger
levert een vermogen van maximaal {socket:tesla_supercharger:output}"
- },
- "power-output-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
levert een vermogen van maximaal 11 kw"
- },
- "1": {
- "then": "
Type 2 (mennekes)
levert een vermogen van maximaal 22 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 2 (mennekes)
?",
- "render": "
Type 2 (mennekes)
levert een vermogen van maximaal {socket:type2:output}"
- },
- "power-output-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
levert een vermogen van maximaal 50 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 2 CCS (mennekes)
?",
- "render": "
Type 2 CCS (mennekes)
levert een vermogen van maximaal {socket:type2_combo:output}"
- },
- "power-output-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal 11 kw"
- },
- "1": {
- "then": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal 22 kw"
- }
- },
- "question": "Welk vermogen levert een enkele stekker van type
Type 2 met kabel (J1772)
?",
- "render": "
Type 2 met kabel (J1772)
levert een vermogen van maximaal {socket:type2_cable:output}"
- },
- "voltage-0": {
- "mappings": {
- "0": {
- "then": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft een spanning van 230 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
",
- "render": "
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft een spanning van {socket:schuko:voltage} volt"
- },
- "voltage-1": {
- "mappings": {
- "0": {
- "then": "
Europese stekker met aardingspin (CEE7/4 type E)
heeft een spanning van 230 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Europese stekker met aardingspin (CEE7/4 type E)
",
- "render": "
Europese stekker met aardingspin (CEE7/4 type E)
heeft een spanning van {socket:typee:voltage} volt"
- },
- "voltage-10": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van 500 volt"
- },
- "1": {
- "then": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van 920 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
",
- "render": "
Tesla Supercharger CCS (een type2 CCS met Tesla-logo)
heeft een spanning van {socket:tesla_supercharger_ccs:voltage} volt"
- },
- "voltage-11": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger (destination)
heeft een spanning van 480 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla Supercharger (destination)
",
- "render": "
Tesla Supercharger (destination)
heeft een spanning van {socket:tesla_destination:voltage} volt"
- },
- "voltage-12": {
- "mappings": {
- "0": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van 230 volt"
- },
- "1": {
- "then": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van 400 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
",
- "render": "
Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)
heeft een spanning van {socket:tesla_destination:voltage} volt"
- },
- "voltage-13": {
- "mappings": {
- "0": {
- "then": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van 5 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
USB om GSMs en kleine electronica op te laden
",
- "render": "
USB om GSMs en kleine electronica op te laden
heeft een spanning van {socket:USB-A:voltage} volt"
- },
- "voltage-14": {
- "question": "Welke spanning levert de stekker van type
Bosch Active Connect met 3 pinnen aan een kabel
",
- "render": "
Bosch Active Connect met 3 pinnen aan een kabel
heeft een spanning van {socket:bosch_3pin:voltage} volt"
- },
- "voltage-15": {
- "question": "Welke spanning levert de stekker van type
Bosch Active Connect met 5 pinnen aan een kabel
",
- "render": "
Bosch Active Connect met 5 pinnen aan een kabel
heeft een spanning van {socket:bosch_5pin:voltage} volt"
- },
- "voltage-2": {
- "mappings": {
- "0": {
- "then": "
Chademo
heeft een spanning van 500 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Chademo
",
- "render": "
Chademo
heeft een spanning van {socket:chademo:voltage} volt"
- },
- "voltage-3": {
- "mappings": {
- "0": {
- "then": "
Type 1 met kabel (J1772)
heeft een spanning van 200 volt"
- },
- "1": {
- "then": "
Type 1 met kabel (J1772)
heeft een spanning van 240 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 1 met kabel (J1772)
",
- "render": "
Type 1 met kabel (J1772)
heeft een spanning van {socket:type1_cable:voltage} volt"
- },
- "voltage-4": {
- "mappings": {
- "0": {
- "then": "
Type 1 zonder kabel (J1772)
heeft een spanning van 200 volt"
- },
- "1": {
- "then": "
Type 1 zonder kabel (J1772)
heeft een spanning van 240 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 1 zonder kabel (J1772)
",
- "render": "
Type 1 zonder kabel (J1772)
heeft een spanning van {socket:type1:voltage} volt"
- },
- "voltage-5": {
- "mappings": {
- "0": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van 400 volt"
- },
- "1": {
- "then": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van 1000 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 1 CCS (ook gekend als Type 1 Combo)
",
- "render": "
Type 1 CCS (ook gekend als Type 1 Combo)
heeft een spanning van {socket:type1_combo:voltage} volt"
- },
- "voltage-6": {
- "mappings": {
- "0": {
- "then": "
Tesla Supercharger
heeft een spanning van 480 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Tesla Supercharger
",
- "render": "
Tesla Supercharger
heeft een spanning van {socket:tesla_supercharger:voltage} volt"
- },
- "voltage-7": {
- "mappings": {
- "0": {
- "then": "
Type 2 (mennekes)
heeft een spanning van 230 volt"
- },
- "1": {
- "then": "
Type 2 (mennekes)
heeft een spanning van 400 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 2 (mennekes)
",
- "render": "
Type 2 (mennekes)
heeft een spanning van {socket:type2:voltage} volt"
- },
- "voltage-8": {
- "mappings": {
- "0": {
- "then": "
Type 2 CCS (mennekes)
heeft een spanning van 500 volt"
- },
- "1": {
- "then": "
Type 2 CCS (mennekes)
heeft een spanning van 920 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 2 CCS (mennekes)
",
- "render": "
Type 2 CCS (mennekes)
heeft een spanning van {socket:type2_combo:voltage} volt"
- },
- "voltage-9": {
- "mappings": {
- "0": {
- "then": "
Type 2 met kabel (J1772)
heeft een spanning van 230 volt"
- },
- "1": {
- "then": "
Type 2 met kabel (J1772)
heeft een spanning van 400 volt"
- }
- },
- "question": "Welke spanning levert de stekker van type
Type 2 met kabel (J1772)
",
- "render": "
Type 2 met kabel (J1772)
heeft een spanning van {socket:type2_cable:voltage} volt"
+ "ref": {
+ "render": "Het referentienummer van dit oplaadpunt is {ref}"
}
},
+ "title": {
+ "render": "Oplaadpunten"
+ },
"units": {
"0": {
"applicableUnits": {
diff --git a/langs/layers/ru.json b/langs/layers/ru.json
index 66f7d0cb0..11ae28440 100644
--- a/langs/layers/ru.json
+++ b/langs/layers/ru.json
@@ -643,11 +643,11 @@
}
},
"tagRenderings": {
- "Auth phone": {
+ "Network": {
"question": "К какой сети относится эта станция?",
"render": "{network}"
},
- "Authentication": {
+ "OH": {
"question": "В какое время работает эта зарядная станция?"
}
},
diff --git a/langs/layers/zh_Hant.json b/langs/layers/zh_Hant.json
index b0afffb78..e5e5f65bf 100644
--- a/langs/layers/zh_Hant.json
+++ b/langs/layers/zh_Hant.json
@@ -449,11 +449,11 @@
"description": "充電站",
"name": "充電站",
"tagRenderings": {
- "Auth phone": {
+ "Network": {
"question": "充電站所屬的網路是?",
"render": "{network}"
},
- "Authentication": {
+ "OH": {
"question": "何時是充電站開放使用的時間?"
}
},
diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts
index 4ee4d388c..e4c981dec 100644
--- a/scripts/generateLayerOverview.ts
+++ b/scripts/generateLayerOverview.ts
@@ -145,7 +145,7 @@ class LayerOverviewUtils {
}
}
- const referencedLayers = Utils.NoNull(themeFile.layers.map(layer => {
+ const referencedLayers = Utils.NoNull([].concat(...themeFile.layers.map(layer => {
if(typeof layer === "string"){
return layer
}
@@ -153,7 +153,12 @@ class LayerOverviewUtils {
return layer["builtin"]
}
return undefined
- }))
+ }).map(layerName => {
+ if(typeof layerName === "string"){
+ return [layerName]
+ }
+ return layerName
+ })))
themeFile.layers = themeFile.layers
.filter(l => typeof l != "string") // We remove all the builtin layer references as they don't work with ts-node for some weird reason
@@ -172,7 +177,8 @@ class LayerOverviewUtils {
const neededLanguages = themeFile["mustHaveLanguage"]
if (neededLanguages !== undefined) {
console.log("Checking language requerements for ", theme.id, "as it must have", neededLanguages.join(", "))
- const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id), ...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id+"->"+layerId)))
+ const allTranslations = [].concat(Translation.ExtractAllTranslationsFrom(theme, theme.id),
+ ...referencedLayers.map(layerId => Translation.ExtractAllTranslationsFrom(knownLayerIds.get(layerId), theme.id+"->"+layerId)))
for (const neededLanguage of neededLanguages) {
allTranslations
.filter(t => t.tr.translations[neededLanguage] === undefined && t.tr.translations["*"] === undefined)
From 0252fd43abad1352846a5a27eebb6063229c29f3 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Mon, 25 Oct 2021 23:58:42 +0200
Subject: [PATCH 24/30] Improvements to the charging station theme
---
.../charging_station/charging_station.json | 3271 ++++++-----------
.../charging_station.protojson | 306 +-
2 files changed, 1300 insertions(+), 2277 deletions(-)
diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json
index fb14977e2..d353a778e 100644
--- a/assets/layers/charging_station/charging_station.json
+++ b/assets/layers/charging_station/charging_station.json
@@ -1,2175 +1,1102 @@
{
- "id": "charging_station",
- "name": {
- "en": "Charging stations",
- "nl": "Oplaadpunten",
- "de": "Ladestationen",
- "it": "Stazioni di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjoner",
- "ru": "Зарядные станции",
- "zh_Hant": "充電站"
- },
- "minzoom": 10,
- "source": {
- "osmTags": {
- "or": [
- "amenity=charging_station",
- "disused:amenity=charging_station",
- "planned:amenity=charging_station",
- "construction:amenity=charging_station"
- ]
- }
- },
- "title": {
- "render": {
- "en": "Charging station",
- "nl": "Oplaadpunten",
- "de": "Ladestation",
- "it": "Stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "Ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
- }
- },
- "description": {
- "en": "A charging station",
- "nl": "Oplaadpunten",
- "de": "Eine Ladestation",
- "it": "Una stazione di ricarica",
- "ja": "充電ステーション",
- "nb_NO": "En ladestasjon",
- "ru": "Зарядная станция",
- "zh_Hant": "充電站"
- },
- "tagRenderings": [
- "images",
- {
- "id": "Type",
- "#": "Allowed vehicle types",
- "question": {
- "en": "Which vehicles are allowed to charge here?",
- "nl": "Welke voertuigen kunnen hier opgeladen worden?",
- "de": "Welche Fahrzeuge dürfen hier geladen werden?"
- },
- "multiAnswer": true,
- "mappings": [
- {
- "if": "bicycle=yes",
- "ifnot": "bicycle=no",
- "then": {
- "en": "bicycles can be charged here",
- "nl": "Fietsen kunnen hier opgeladen worden",
- "de": "Fahrräder können hier geladen werden"
- }
- },
- {
- "if": "motorcar=yes",
- "ifnot": "motorcar=no",
- "then": {
- "en": "Cars can be charged here",
- "nl": "Elektrische auto's kunnen hier opgeladen worden",
- "de": "Autos können hier geladen werden"
- }
- },
- {
- "if": "scooter=yes",
- "ifnot": "scooter=no",
- "then": {
- "en": "Scooters can be charged here",
- "nl": "Electrische scooters (snorfiets of bromfiets) kunnen hier opgeladen worden",
- "de": " Roller können hier geladen werden"
- }
- },
- {
- "if": "hgv=yes",
- "ifnot": "hgv=no",
- "then": {
- "en": "Heavy good vehicles (such as trucks) can be charged here",
- "nl": "Vrachtwagens kunnen hier opgeladen worden",
- "de": "Lastkraftwagen (LKW) können hier geladen werden"
- }
- },
- {
- "if": "bus=yes",
- "ifnot": "bus=no",
- "then": {
- "en": "Buses can be charged here",
- "nl": "Bussen kunnen hier opgeladen worden",
- "de": "Busse können hier geladen werden"
- }
- }
- ]
- },
- {
- "id": "access",
- "question": {
- "en": "Who is allowed to use this charging station?",
- "nl": "Wie mag er dit oplaadpunt gebruiken?",
- "de": "Wer darf diese Ladestation benutzen?"
- },
- "render": {
- "en": "Access is {access}",
- "nl": "Toegang voor {access}",
- "de": "Zugang ist {access}"
- },
- "freeform": {
- "key": "access",
- "addExtraTags": [
- "fixme=Freeform field used for access - doublecheck the value"
- ]
- },
- "mappings": [
- {
- "if": "access=yes",
- "then": {
- "en": "Anyone can use this charging station (payment might be needed)",
- "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
- }
- },
- {
- "if": {
- "or": [
- "access=permissive",
- "access=public"
- ]
- },
- "then": {
- "en": "Anyone can use this charging station (payment might be needed)",
- "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
- },
- "hideInAnswer": true
- },
- {
- "if": "access=customers",
- "then": {
- "en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
- "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
- }
- },
- {
- "if": "access=private",
- "then": {
- "en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
- "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
- }
- }
- ]
- },
- {
- "id": "capacity",
- "render": {
- "en": "{capacity} vehicles can be charged here at the same time",
- "nl": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden",
- "de": "{capacity} Fahrzeuge können hier gleichzeitig geladen werden"
- },
- "question": {
- "en": "How much vehicles can be charged here at the same time?",
- "nl": "Hoeveel voertuigen kunnen hier opgeladen worden?",
- "de": "Wie viele Fahrzeuge können hier gleichzeitig geladen werden?"
- },
- "freeform": {
- "key": "capacity",
- "type": "pnat"
- }
- },
- {
- "id": "Available_charging_stations (generated)",
- "question": {
- "en": "Which charging stations are available here?",
- "nl": "Welke aansluitingen zijn hier beschikbaar?",
- "de": "Welche Ladestationen gibt es hier?"
- },
- "multiAnswer": true,
- "mappings": [
- {
- "if": "socket:schuko=1",
- "ifnot": "socket:schuko=",
- "then": {
- "en": "
Schuko wall plug without ground pin (CEE7/4 type F)
are available here?",
+ "nl": "Hoeveel stekkers van type
Bosch Active Connect met 5 pinnen aan een kabel
heeft dit oplaadpunt?"
+ },
+ "render": {
+ "en": "There are {socket:bosch_5pin} plugs of type
Bosch Active Connect with 5 pins and cable
available here",
+ "nl": "Hier zijn {socket:bosch_5pin} stekkers van het type
Bosch Active Connect met 5 pinnen aan een kabel
"
+ },
+ "freeform": {
+ "key": "socket:bosch_5pin",
+ "type": "pnat"
+ },
+ "condition": {
+ "and": [
+ "socket:bosch_5pin~*",
+ "socket:bosch_5pin!=0"
+ ]
+ }
},
{
"id": "OH",
@@ -424,10 +1455,12 @@
{
"id": "Network",
"render": {
- "en": "Part of the network {network}"
+ "en": "Part of the network {network}",
+ "nl": "Maakt deel uit van het {network}-netwerk"
},
"question": {
- "en": "Is this charging station part of a network?"
+ "en": "Is this charging station part of a network?",
+ "nl": "Is dit oplaadpunt deel van een groter netwerk?"
},
"freeform": {
"key": "network"
@@ -436,13 +1469,15 @@
{
"if": "no:network=yes",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
}
},
{
"if": "network=none",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
},
"hideInAnswer": true
},
@@ -463,10 +1498,12 @@
{
"id": "Operator",
"question": {
- "en": "Who is the operator of this charging station?"
+ "en": "Who is the operator of this charging station?",
+ "nl": "Wie beheert dit oplaadpunt?"
},
"render": {
- "en": "This charging station is operated by {operator}"
+ "en": "This charging station is operated by {operator}",
+ "nl": "Wordt beheerd door {operator}"
},
"freeform": {
"key": "operator"
@@ -479,7 +1516,8 @@
]
},
"then": {
- "en": "Actually, {operator} is the network"
+ "en": "Actually, {operator} is the network",
+ "nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
},
"addExtraTags": [
"operator="
@@ -491,10 +1529,12 @@
{
"id": "phone",
"question": {
- "en": "What number can one call if there is a problem with this charging station?"
+ "en": "What number can one call if there is a problem with this charging station?",
+ "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?"
},
"render": {
- "en": "In case of problems, call {phone}"
+ "en": "In case of problems, call {phone}",
+ "nl": "Bij problemen, bel naar {phone}"
},
"freeform": {
"key": "phone",
@@ -504,10 +1544,12 @@
{
"id": "email",
"question": {
- "en": "What is the email address of the operator?"
+ "en": "What is the email address of the operator?",
+ "nl": "Wat is het email-adres van de operator?"
},
"render": {
- "en": "In case of problems, send an email to {email}"
+ "en": "In case of problems, send an email to {email}",
+ "nl": "Bij problemen, email naar {email}"
},
"freeform": {
"key": "email",
@@ -517,10 +1559,12 @@
{
"id": "website",
"question": {
- "en": "What is the website of the operator?"
+ "en": "What is the website where one can find more information about this charging station?",
+ "nl": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?"
},
"render": {
- "en": "More info on {website}"
+ "en": "More info on {website}",
+ "nl": "Meer informatie op {website}"
},
"freeform": {
"key": "website",
@@ -531,7 +1575,8 @@
{
"id": "ref",
"question": {
- "en": "What is the reference number of this charging station?"
+ "en": "What is the reference number of this charging station?",
+ "nl": "Wat is het referentienummer van dit oplaadstation?"
},
"render": {
"en": "Reference number is {ref}",
@@ -630,19 +1675,22 @@
{
"id": "Parking:fee",
"question": {
- "en": "Does one have to pay a parking fee while charging?"
+ "en": "Does one have to pay a parking fee while charging?",
+ "nl": "Moet men parkeergeld betalen tijdens het opladen?"
},
"mappings": [
{
"if": "parking:fee=no",
"then": {
- "en": "No additional parking cost while charging"
+ "en": "No additional parking cost while charging",
+ "nl": "Geen extra parkeerkost tijdens het opladen"
}
},
{
"if": "parking:fee=yes",
"then": {
- "en": "An additional parking fee should be paid while charging"
+ "en": "An additional parking fee should be paid while charging",
+ "nl": "Tijdens het opladen moet er parkeergeld betaald worden"
}
}
],
@@ -721,12 +1769,56 @@
"render": "#00f"
},
"presets": [
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes",
+ "socket:typee=1"
+ ],
+ "title": {
+ "en": "electrical outlet to charge e-bikes",
+ "nl": "gewone stekker (bedoeld om electrische fietsen op te laden)"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes"
+ ],
+ "title": {
+ "en": "charging station for e-bikes",
+ "nl": "oplaadpunt voor elektrische fietsen"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=yes",
+ "bicycle=no"
+ ],
+ "title": {
+ "en": "charging station for cars",
+ "nl": "oplaadstation voor elektrische auto's"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
{
"tags": [
"amenity=charging_station"
],
"title": {
- "en": "Charging station"
+ "en": "charging station",
+ "nl": "oplaadstation"
},
"preciseInput": {
"preferredBackground": "map"
@@ -770,7 +1862,8 @@
"options": [
{
"question": {
- "en": "Only working charging stations"
+ "en": "Only working charging stations",
+ "nl": "Enkel werkende oplaadpunten"
},
"osmTags": {
"and": [
diff --git a/assets/layers/charging_station/charging_station.protojson b/assets/layers/charging_station/charging_station.protojson
index 88ce35932..5a941d6b0 100644
--- a/assets/layers/charging_station/charging_station.protojson
+++ b/assets/layers/charging_station/charging_station.protojson
@@ -119,14 +119,14 @@
"if": "access=customers",
"then": {
"en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
- "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
+ "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bv. op de parking van een hotel en enkel toegankelijk voor klanten van dit hotel"
}
},
{
"if": "access=private",
"then": {
"en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
- "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
+ "nl": "Niet toegankelijk voor het publiek Bv. enkel toegankelijk voor de eigenaar, medewerkers ,... "
}
}
]
@@ -419,10 +419,12 @@
{
"id": "Network",
"render": {
- "en": "Part of the network {network}"
+ "en": "Part of the network {network}",
+ "nl": "Maakt deel uit van het {network}-netwerk"
},
"question": {
- "en": "Is this charging station part of a network?"
+ "en": "Is this charging station part of a network?",
+ "nl": "Is dit oplaadpunt deel van een groter netwerk?"
},
"freeform": {
"key": "network"
@@ -431,13 +433,15 @@
{
"if": "no:network=yes",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
}
},
{
"if": "network=none",
"then": {
- "en": "Not part of a bigger network"
+ "en": "Not part of a bigger network",
+ "nl": "Maakt geen deel uit van een groter netwerk"
},
"hideInAnswer": true
},
@@ -458,10 +462,12 @@
{
"id": "Operator",
"question": {
- "en": "Who is the operator of this charging station?"
+ "en": "Who is the operator of this charging station?",
+ "nl": "Wie beheert dit oplaadpunt?"
},
"render": {
- "en": "This charging station is operated by {operator}"
+ "en": "This charging station is operated by {operator}",
+ "nl": "Wordt beheerd door {operator}"
},
"freeform": {
"key": "operator"
@@ -474,7 +480,8 @@
]
},
"then": {
- "en": "Actually, {operator} is the network"
+ "en": "Actually, {operator} is the network",
+ "nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
},
"addExtraTags": [
"operator="
@@ -486,10 +493,11 @@
{
"id": "phone",
"question": {
- "en": "What number can one call if there is a problem with this charging station?"
+ "en": "What number can one call if there is a problem with this charging station?",
+ "nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?"
},
"render": {
- "en": "In case of problems, call {phone}"
+ "en": "In case of problems, call {phone}", "nl": "Bij problemen, bel naar {phone}"
},
"freeform": {
"key": "phone",
@@ -499,10 +507,12 @@
{
"id": "email",
"question": {
- "en": "What is the email address of the operator?"
+ "en": "What is the email address of the operator?",
+ "nl": "Wat is het email-adres van de operator?"
},
"render": {
- "en": "In case of problems, send an email to {email}"
+ "en": "In case of problems, send an email to {email}",
+ "nl": "Bij problemen, email naar {email}"
},
"freeform": {
"key": "email",
@@ -512,10 +522,12 @@
{
"id": "website",
"question": {
- "en": "What is the website of the operator?"
+ "en": "What is the website where one can find more information about this charging station?",
+ "nl": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?"
},
"render": {
- "en": "More info on {website}"
+ "en": "More info on {website}",
+ "nl": "Meer informatie op {website}"
},
"freeform": {
"key": "website",
@@ -526,7 +538,8 @@
{
"id": "ref",
"question": {
- "en": "What is the reference number of this charging station?"
+ "en": "What is the reference number of this charging station?",
+ "nl": "Wat is het referentienummer van dit oplaadstation?"
},
"render": {
"en": "Reference number is {ref}",
@@ -625,19 +638,22 @@
{
"id": "Parking:fee",
"question": {
- "en": "Does one have to pay a parking fee while charging?"
+ "en": "Does one have to pay a parking fee while charging?",
+ "nl": "Moet men parkeergeld betalen tijdens het opladen?"
},
"mappings": [
{
"if": "parking:fee=no",
"then": {
- "en": "No additional parking cost while charging"
+ "en": "No additional parking cost while charging",
+ "nl": "Geen extra parkeerkost tijdens het opladen"
}
},
{
"if": "parking:fee=yes",
"then": {
- "en": "An additional parking fee should be paid while charging"
+ "en": "An additional parking fee should be paid while charging",
+ "nl": "Tijdens het opladen moet er parkeergeld betaald worden"
}
}
],
@@ -716,12 +732,56 @@
"render": "#00f"
},
"presets": [
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes",
+ "socket:typee=1"
+ ],
+ "title": {
+ "en": "electrical outlet to charge e-bikes",
+ "nl": "laadpunt met gewone stekker(s) (bedoeld om electrische fietsen op te laden)"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=no",
+ "bicycle=yes"
+ ],
+ "title": {
+ "en": "charging station for e-bikes",
+ "nl": "oplaadpunt voor elektrische fietsen"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
+ {
+ "tags": [
+ "amenity=charging_station",
+ "motorcar=yes",
+ "bicycle=no"
+ ],
+ "title": {
+ "en": "charging station for cars",
+ "nl": "oplaadstation voor elektrische auto's"
+ },
+ "preciseInput": {
+ "preferredBackground": "map"
+ }
+ },
{
"tags": [
"amenity=charging_station"
],
"title": {
- "en": "Charging station"
+ "en": "charging station",
+ "nl": "oplaadstation"
},
"preciseInput": {
"preferredBackground": "map"
@@ -765,7 +825,8 @@
"options": [
{
"question": {
- "en": "Only working charging stations"
+ "en": "Only working charging stations",
+ "nl": "Enkel werkende oplaadpunten"
},
"osmTags": {
"and": [
diff --git a/assets/layers/charging_station/csvToJson.ts b/assets/layers/charging_station/csvToJson.ts
index d781d33e7..4b2490b90 100644
--- a/assets/layers/charging_station/csvToJson.ts
+++ b/assets/layers/charging_station/csvToJson.ts
@@ -259,7 +259,7 @@ function run(file, protojson) {
const stringified = questions.map(q => JSON.stringify(q, null, " "))
let protoString = readFileSync(protojson, "utf8")
- protoString = protoString.replace("{\"id\": \"$$$\"}", stringified.join(",\n"))
+ protoString = protoString.replace(/{[ \t\n]*"id"[ \t\n]*:[ \t\n]*"\$\$\$"[ \t\n]*}/, stringified.join(",\n"))
const proto = JSON.parse(protoString)
proto.tagRenderings.forEach(tr => {
if (typeof tr === "string") {
diff --git a/assets/layers/waste_basket/waste_basket.json b/assets/layers/waste_basket/waste_basket.json
index 612504a7b..7a3691a97 100644
--- a/assets/layers/waste_basket/waste_basket.json
+++ b/assets/layers/waste_basket/waste_basket.json
@@ -91,6 +91,7 @@
"id": "dispensing_dog_bags",
"question": {
"en": "Does this waste basket have a dispenser for dog excrement bags?",
+ "nl": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?",
"de": "Verfügt dieser Abfalleimer über einen Spender für (Hunde-)Kotbeutel?"
},
"condition": {
@@ -110,6 +111,7 @@
},
"then": {
"en": "This waste basket has a dispenser for (dog) excrement bags",
+ "nl": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes",
"de": "Dieser Abfalleimer verfügt über einen Spender für (Hunde-)Kotbeutel"
}
},
@@ -122,6 +124,7 @@
},
"then": {
"en": "This waste basket does not have a dispenser for (dog) excrement bags",
+ "nl": "Deze vuilbak heeft geen verdeler voor hondenpoepzakjes",
"de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
}
},
@@ -129,6 +132,7 @@
"if": "vending=",
"then": {
"en": "This waste basket does not have a dispenser for (dog) excrement bags",
+ "nl": "Deze vuilnisbak heeft geen verdeler voor hondenpoepzakjes",
"de": "Dieser Abfalleimer hat keinen Spender für (Hunde-)Kotbeutel"
},
"hideInAnwer": true
From 93c6778a9d5ac974b7cc9031e6db0691c7444b43 Mon Sep 17 00:00:00 2001
From: pietervdvn
Date: Tue, 26 Oct 2021 01:14:33 +0200
Subject: [PATCH 26/30] version bump
---
Models/Constants.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Models/Constants.ts b/Models/Constants.ts
index 15f6e94f9..6405a34b6 100644
--- a/Models/Constants.ts
+++ b/Models/Constants.ts
@@ -2,7 +2,7 @@ import {Utils} from "../Utils";
export default class Constants {
- public static vNumber = "0.11.1";
+ public static vNumber = "0.11.2";
public static ImgurApiKey = '7070e7167f0a25a'
public static readonly mapillary_client_token_v3 = 'TXhLaWthQ1d4RUg0czVxaTVoRjFJZzowNDczNjUzNmIyNTQyYzI2'
public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
From 289bf6f0dc43da6387da1d5582684432c7d52b21 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Mon, 25 Oct 2021 22:48:57 +0000
Subject: [PATCH 27/30] Translated using Weblate (English)
Currently translated at 100.0% (228 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/en/
---
langs/en.json | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/langs/en.json b/langs/en.json
index 6b7d7723a..cee2bae0c 100644
--- a/langs/en.json
+++ b/langs/en.json
@@ -33,7 +33,7 @@
"split": {
"split": "Split",
"cancel": "Cancel",
- "inviteToSplit": "Split this road",
+ "inviteToSplit": "Split this road in smaller segments. This allows to give different properties to parts of the road.",
"loginToSplit": "You must be logged in to split a road",
"splitTitle": "Choose on the map where to split this road",
"hasBeenSplit": "This way has been split"
@@ -229,11 +229,11 @@
"wikipediaboxTitle": "Wikipedia",
"failed": "Loading the wikipedia entry failed",
"loading": "Loading Wikipedia...",
- "noWikipediaPage": "This wikidata item has no corresponding wikipedia page yet.",
- "searchWikidata": "Search on wikidata",
+ "noWikipediaPage": "This Wikidata item has no corresponding Wikipedia page yet.",
+ "searchWikidata": "Search on Wikidata",
"noResults": "Nothing found for {search}",
"doSearch": "Search above to see results",
- "createNewWikidata": "Create a new wikidata item"
+ "createNewWikidata": "Create a new Wikidata item"
}
},
"favourite": {
@@ -285,4 +285,4 @@
"partOfRelation": "This feature is part of a relation. Use another editor to move it",
"cancel": "Cancel move"
}
-}
\ No newline at end of file
+}
From 7474ceb395eeddbc8f6fca845a179158f1c0942f Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Mon, 25 Oct 2021 22:58:52 +0000
Subject: [PATCH 28/30] Translated using Weblate (Dutch)
Currently translated at 98.6% (225 of 228 strings)
Translation: MapComplete/Core
Translate-URL: https://hosted.weblate.org/projects/mapcomplete/core/nl/
---
langs/nl.json | 101 ++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 90 insertions(+), 11 deletions(-)
diff --git a/langs/nl.json b/langs/nl.json
index 33a56e19a..33a2cf04e 100644
--- a/langs/nl.json
+++ b/langs/nl.json
@@ -10,10 +10,12 @@
"ccb": "onder de CC-BY-licentie",
"uploadFailed": "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.",
"respectPrivacy": "Fotografeer geen mensen of nummerplaten. Voeg geen Google Maps, Google Streetview of foto's met auteursrechten toe.",
- "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!",
+ "uploadDone": "Je afbeelding is toegevoegd. Bedankt om te helpen!",
"dontDelete": "Terug",
"doDelete": "Verwijder afbeelding",
- "isDeleted": "Verwijderd"
+ "isDeleted": "Verwijderd",
+ "uploadMultipleDone": "{count} afbeeldingen zijn toegevoegd. Bedankt voor je bijdrage!",
+ "toBig": "Je afbeelding is te groot, namelijk {actual_size}. Gelieve afbeeldingen van maximaal {max_size} te gebruiken"
},
"centerMessage": {
"loadingData": "Data wordt geladen...",
@@ -24,8 +26,9 @@
"index": {
"#": "These texts are shown above the theme buttons when no theme is loaded",
"title": "Welkom bij MapComplete",
- "intro": "MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.",
- "pickTheme": "Kies hieronder een thema om te beginnen."
+ "intro": "MapComplete is een OpenStreetMap-applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.",
+ "pickTheme": "Kies hieronder een thema om te beginnen.",
+ "featuredThemeTitle": "Thema van de week"
},
"general": {
"loginWithOpenStreetMap": "Aanmelden met OpenStreetMap",
@@ -51,7 +54,10 @@
"layerNotEnabled": "De laag {layer} is gedeactiveerd. Activeer deze om een punt toe te voegen",
"presetInfo": "Het nieuwe punt krijgt de attributen {tags}",
"disableFiltersExplanation": "Interessepunten kunnen verborgen zijn door een filter",
- "disableFilters": "Zet alle filters af"
+ "disableFilters": "Zet alle filters af",
+ "hasBeenImported": "Dit punt is reeds geimporteerd",
+ "warnVisibleForEveryone": "Je toevoeging is voor iedereen zichtbaar",
+ "zoomInMore": "Zoom meer in om dit punt te importeren"
},
"pickLanguage": "Kies je taal: ",
"about": "Bewerk en voeg data toe aan OpenStreetMap over een specifiek onderwerp op een gemakkelijke manier",
@@ -128,7 +134,9 @@
"intro": "
"
- },
- "hideInAnswer": {
- "or": [
- {
- "and": [
- "car=no",
- "motorcar=no",
- "hgv=no",
- "bus=no"
+ "id": "access",
+ "question": {
+ "en": "Who is allowed to use this charging station?",
+ "nl": "Wie mag er dit oplaadpunt gebruiken?",
+ "de": "Wer darf diese Ladestation benutzen?"
+ },
+ "render": {
+ "en": "Access is {access}",
+ "nl": "Toegang voor {access}",
+ "de": "Zugang ist {access}"
+ },
+ "freeform": {
+ "key": "access",
+ "addExtraTags": [
+ "fixme=Freeform field used for access - doublecheck the value"
]
- },
- {
- "and": [
- {
- "or": [
- "bicycle=yes",
- "scooter=yes"
- ]
- },
- "car!=yes",
- "motorcar!=yes",
- "hgv!=yes",
- "bus!=yes"
- ]
- }
+ },
+ "mappings": [
+ {
+ "if": "access=yes",
+ "then": {
+ "en": "Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ }
+ },
+ {
+ "if": {
+ "or": [
+ "access=permissive",
+ "access=public"
+ ]
+ },
+ "then": {
+ "en": "Anyone can use this charging station (payment might be needed)",
+ "nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)"
+ },
+ "hideInAnswer": true
+ },
+ {
+ "if": "access=customers",
+ "then": {
+ "en": "Only customers of the place this station belongs to can use this charging station E.g. a charging station operated by hotel which is only usable by their guests",
+ "nl": "Enkel klanten van de bijhorende plaats mogen dit oplaadpunt gebruiken Bijvoorbeeld een oplaadpunt op de parking van een restaurant dat enkel door klanten van het restaurant gebruikt mag worden"
+ }
+ },
+ {
+ "if": "access=private",
+ "then": {
+ "en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
+ "nl": "Niet toegankelijk voor het publiek Enkel toegankelijk voor de eigenaar, medewerkers ,... "
+ }
+ }
]
- }
},
{
- "if": {
- "and": [
- "socket:chademo~*",
- "socket:chademo!=1"
- ]
- },
- "then": {
- "en": "
"
- },
- "osmTags": "socket:bosch_5pin~*"
- }
- ]
- }
- ],
- "units": [
- {
- "appliesToKey": [
- "maxstay"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "minutes",
- "canonicalDenominationSingular": "minute",
- "alternativeDenomination": [
- "m",
- "min",
- "mins",
- "minuten",
- "mns"
- ],
- "human": {
- "en": " minutes",
- "nl": " minuten"
- },
- "humanSingular": {
- "en": " minute",
- "nl": " minuut"
- }
- },
- {
- "canonicalDenomination": "hours",
- "canonicalDenominationSingular": "hour",
- "alternativeDenomination": [
- "h",
- "hrs",
- "hours",
- "u",
- "uur",
- "uren"
- ],
- "human": {
- "en": " hours",
- "nl": " uren"
- },
- "humanSingular": {
- "en": " hour",
- "nl": " uur"
- }
- },
- {
- "canonicalDenomination": "days",
- "canonicalDenominationSingular": "day",
- "alternativeDenomination": [
- "dys",
- "dagen",
- "dag"
- ],
- "human": {
- "en": " days",
- "nl": " day"
- },
- "humanSingular": {
- "en": " day",
- "nl": " dag"
- }
- }
- ]
- },
- {
- "appliesToKey": [
- "socket:schuko:voltage",
- "socket:typee:voltage",
- "socket:chademo:voltage",
- "socket:type1_cable:voltage",
- "socket:type1:voltage",
- "socket:type1_combo:voltage",
- "socket:tesla_supercharger:voltage",
- "socket:type2:voltage",
- "socket:type2_combo:voltage",
- "socket:type2_cable:voltage",
- "socket:tesla_supercharger_ccs:voltage",
- "socket:tesla_destination:voltage",
- "socket:tesla_destination:voltage",
- "socket:USB-A:voltage",
- "socket:bosch_3pin:voltage",
- "socket:bosch_5pin:voltage"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "V",
- "alternativeDenomination": [
- "v",
- "volt",
- "voltage",
- "V",
- "Volt"
- ],
- "human": {
- "en": "Volts",
- "nl": "volt"
- }
- }
- ],
- "eraseInvalidValues": true
- },
- {
- "appliesToKey": [
- "socket:schuko:current",
- "socket:typee:current",
- "socket:chademo:current",
- "socket:type1_cable:current",
- "socket:type1:current",
- "socket:type1_combo:current",
- "socket:tesla_supercharger:current",
- "socket:type2:current",
- "socket:type2_combo:current",
- "socket:type2_cable:current",
- "socket:tesla_supercharger_ccs:current",
- "socket:tesla_destination:current",
- "socket:tesla_destination:current",
- "socket:USB-A:current",
- "socket:bosch_3pin:current",
- "socket:bosch_5pin:current"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "A",
- "alternativeDenomination": [
- "a",
- "amp",
- "amperage",
- "A"
- ],
- "human": {
- "en": "A",
- "nl": "A"
- }
- }
- ],
- "eraseInvalidValues": true
- },
- {
- "appliesToKey": [
- "socket:schuko:output",
- "socket:typee:output",
- "socket:chademo:output",
- "socket:type1_cable:output",
- "socket:type1:output",
- "socket:type1_combo:output",
- "socket:tesla_supercharger:output",
- "socket:type2:output",
- "socket:type2_combo:output",
- "socket:type2_cable:output",
- "socket:tesla_supercharger_ccs:output",
- "socket:tesla_destination:output",
- "socket:tesla_destination:output",
- "socket:USB-A:output",
- "socket:bosch_3pin:output",
- "socket:bosch_5pin:output"
- ],
- "applicableUnits": [
- {
- "canonicalDenomination": "kW",
- "alternativeDenomination": [
- "kilowatt"
- ],
- "human": {
- "en": "kilowatt",
- "nl": "kilowatt"
- }
- },
- {
- "canonicalDenomination": "mW",
- "alternativeDenomination": [
- "megawatt"
- ],
- "human": {
- "en": "megawatt",
- "nl": "megawatt"
- }
- }
- ],
- "eraseInvalidValues": true
- }
- ],
- "allowMove": {
- "enableRelocation": false,
- "enableImproveAccuracy": true
- },
- "deletion": {
- "softDeletionTags": {
- "and": [
- "amenity=",
- "disused:amenity=charging_station"
- ]
- },
- "neededChangesets": 10
- }
}
\ No newline at end of file
diff --git a/assets/layers/defibrillator/defibrillator.json b/assets/layers/defibrillator/defibrillator.json
index f6b335358..105536678 100644
--- a/assets/layers/defibrillator/defibrillator.json
+++ b/assets/layers/defibrillator/defibrillator.json
@@ -35,13 +35,7 @@
"mappings": [
{
"if": "_recently_surveyed=true",
- "then": {
- "en": "./assets/layers/defibrillator/aed_checked.svg",
- "ru": "./assets/layers/defibrillator/aed_checked.svg",
- "it": "./assets/layers/defibrillator/aed_checked.svg",
- "fr": "./assets/layers/defibrillator/aed_checked.svg",
- "de": "./assets/layers/defibrillator/aed_checked.svg"
- }
+ "then": "./assets/layers/defibrillator/aed_checked.svg"
}
]
},
diff --git a/langs/layers/de.json b/langs/layers/de.json
index 73735975b..664c8efa0 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -541,9 +541,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Fahrradstationen (Reparatur, Pumpe oder beides)",
"presets": {
"0": {
@@ -1157,15 +1154,6 @@
"question": "Wie ist die Email-Adresse des Betreibers?",
"render": "Bei Problemen senden Sie eine E-Mail an {email}"
},
- "fee/charge": {
- "mappings": {
- "0": {
- "then": "Nutzung kostenlos"
- }
- },
- "question": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?",
- "render": "Die Nutzung dieser Ladestation kostet {charge}"
- },
"maxstay": {
"mappings": {
"0": {
@@ -1701,13 +1689,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Defibrillatoren",
"presets": {
"0": {
diff --git a/langs/layers/en.json b/langs/layers/en.json
index 3c5dae71a..c5dbcbbc4 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -544,9 +544,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Bike stations (repair, pump or both)",
"presets": {
"0": {
@@ -1009,6 +1006,15 @@
"presets": {
"0": {
"title": "Charging station"
+ },
+ "1": {
+ "title": "charging station for e-bikes"
+ },
+ "2": {
+ "title": "charging station for cars"
+ },
+ "3": {
+ "title": "charging station"
}
},
"tagRenderings": {
@@ -1248,18 +1254,33 @@
"question": "How much vehicles can be charged here at the same time?",
"render": "{capacity} vehicles can be charged here at the same time"
},
+ "charge": {
+ "question": "How much does one have to pay to use this charging station?",
+ "render": "Using this charging station costs {charge}"
+ },
"email": {
"question": "What is the email address of the operator?",
"render": "In case of problems, send an email to {email}"
},
- "fee/charge": {
+ "fee": {
"mappings": {
"0": {
"then": "Free to use"
+ },
+ "1": {
+ "then": "Free to use (without authenticating)"
+ },
+ "2": {
+ "then": "Free to use, but one has to authenticate"
+ },
+ "3": {
+ "then": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station"
+ },
+ "4": {
+ "then": "Paid use"
}
},
- "question": "How much does one have to pay to use this charging station?",
- "render": "Using this charging station costs {charge}"
+ "question": "Does one have to pay to use this charging station?"
},
"maxstay": {
"mappings": {
@@ -1915,13 +1936,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Defibrillators",
"presets": {
"0": {
diff --git a/langs/layers/fi.json b/langs/layers/fi.json
index a13231cd6..91972fd66 100644
--- a/langs/layers/fi.json
+++ b/langs/layers/fi.json
@@ -90,9 +90,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"presets": {
"0": {
"title": "Pyöräpumppu"
diff --git a/langs/layers/fr.json b/langs/layers/fr.json
index 7892204ad..b4c06d558 100644
--- a/langs/layers/fr.json
+++ b/langs/layers/fr.json
@@ -453,9 +453,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Station velo (réparation, pompe à vélo)",
"presets": {
"0": {
@@ -749,13 +746,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Défibrillateurs",
"presets": {
"0": {
diff --git a/langs/layers/it.json b/langs/layers/it.json
index efca2e950..229bb82e0 100644
--- a/langs/layers/it.json
+++ b/langs/layers/it.json
@@ -453,9 +453,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"name": "Stazioni bici (riparazione, gonfiaggio o entrambi)",
"presets": {
"0": {
@@ -765,13 +762,6 @@
}
},
"defibrillator": {
- "icon": {
- "mappings": {
- "0": {
- "then": "./assets/layers/defibrillator/aed_checked.svg"
- }
- }
- },
"name": "Defibrillatori",
"presets": {
"0": {
diff --git a/langs/layers/nan.json b/langs/layers/nan.json
deleted file mode 100644
index 0967ef424..000000000
--- a/langs/layers/nan.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/langs/layers/nl.json b/langs/layers/nl.json
index fd947098d..317a63c55 100644
--- a/langs/layers/nl.json
+++ b/langs/layers/nl.json
@@ -1052,6 +1052,13 @@
}
}
},
+ "1": {
+ "options": {
+ "0": {
+ "question": "Enkel werkende oplaadpunten"
+ }
+ }
+ },
"2": {
"options": {
"0": {
@@ -1109,6 +1116,20 @@
}
},
"name": "Oplaadpunten",
+ "presets": {
+ "0": {
+ "title": "gewone stekker (bedoeld om electrische fietsen op te laden)"
+ },
+ "1": {
+ "title": "oplaadpunt voor elektrische fietsen"
+ },
+ "2": {
+ "title": "oplaadstation voor elektrische auto's"
+ },
+ "3": {
+ "title": "oplaadstation"
+ }
+ },
"tagRenderings": {
"Auth phone": {
"question": "Wat is het telefoonnummer dat men moet bellen of SMS'en om zich aan te melden?",
@@ -1244,6 +1265,18 @@
},
"question": "Welke aansluitingen zijn hier beschikbaar?"
},
+ "Network": {
+ "mappings": {
+ "0": {
+ "then": "Maakt geen deel uit van een groter netwerk"
+ },
+ "1": {
+ "then": "Maakt geen deel uit van een groter netwerk"
+ }
+ },
+ "question": "Is dit oplaadpunt deel van een groter netwerk?",
+ "render": "Maakt deel uit van het {network}-netwerk"
+ },
"OH": {
"mappings": {
"0": {
@@ -1272,6 +1305,26 @@
},
"question": "Is dit oplaadpunt operationeel?"
},
+ "Operator": {
+ "mappings": {
+ "0": {
+ "then": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt"
+ }
+ },
+ "question": "Wie beheert dit oplaadpunt?",
+ "render": "Wordt beheerd door {operator}"
+ },
+ "Parking:fee": {
+ "mappings": {
+ "0": {
+ "then": "Geen extra parkeerkost tijdens het opladen"
+ },
+ "1": {
+ "then": "Tijdens het opladen moet er parkeergeld betaald worden"
+ }
+ },
+ "question": "Moet men parkeergeld betalen tijdens het opladen?"
+ },
"Type": {
"mappings": {
"0": {
@@ -1314,14 +1367,33 @@
"question": "Hoeveel voertuigen kunnen hier opgeladen worden?",
"render": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden"
},
- "fee/charge": {
+ "charge": {
+ "question": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?",
+ "render": "Dit oplaadpunt gebruiken kost {charge}"
+ },
+ "email": {
+ "question": "Wat is het email-adres van de operator?",
+ "render": "Bij problemen, email naar {email}"
+ },
+ "fee": {
"mappings": {
"0": {
"then": "Gratis te gebruiken"
+ },
+ "1": {
+ "then": "Gratis te gebruiken (zonder aan te melden)"
+ },
+ "2": {
+ "then": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht"
+ },
+ "3": {
+ "then": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/..."
+ },
+ "4": {
+ "then": "Betalend"
}
},
- "question": "Hoeveel kost het gebruik van dit oplaadpunt?",
- "render": "Dit oplaadpunt gebruiken kost {charge}"
+ "question": "Moet men betalen om dit oplaadpunt te gebruiken?"
},
"maxstay": {
"mappings": {
@@ -1344,6 +1416,10 @@
}
}
},
+ "phone": {
+ "question": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?",
+ "render": "Bij problemen, bel naar {phone}"
+ },
"plugs-0": {
"question": "Hoeveel stekkers van type
Schuko stekker zonder aardingspin (CEE7/4 type F)
heeft dit oplaadpunt?",
"render": "Hier zijn {socket:schuko} stekkers van het type
Schuko stekker zonder aardingspin (CEE7/4 type F)
"
@@ -1409,7 +1485,12 @@
"render": "Hier zijn {socket:type2_cable} stekkers van het type
Type 2 met kabel (J1772)
"
},
"ref": {
+ "question": "Wat is het referentienummer van dit oplaadstation?",
"render": "Het referentienummer van dit oplaadpunt is {ref}"
+ },
+ "website": {
+ "question": "Wat is de website waar men meer info kan vinden over dit oplaadpunt?",
+ "render": "Meer informatie op {website}"
}
},
"title": {
@@ -3725,6 +3806,20 @@
}
},
"tagRenderings": {
+ "dispensing_dog_bags": {
+ "mappings": {
+ "0": {
+ "then": "Deze vuilnisbak heeft een verdeler voor hondenpoepzakjes"
+ },
+ "1": {
+ "then": "Deze vuilbak heeft geen verdeler voor hondenpoepzakjes"
+ },
+ "2": {
+ "then": "Deze vuilnisbak heeft geen verdeler voor hondenpoepzakjes"
+ }
+ },
+ "question": "Heeft deze vuilnisbak een verdeler voor hondenpoepzakjes?"
+ },
"waste-basket-waste-types": {
"mappings": {
"0": {
diff --git a/langs/layers/pt.json b/langs/layers/pt.json
index 5cdf2f56a..461c8c541 100644
--- a/langs/layers/pt.json
+++ b/langs/layers/pt.json
@@ -338,9 +338,6 @@
}
},
"bike_repair_station": {
- "icon": {
- "render": "./assets/layers/bike_repair_station/repair_station.svg"
- },
"presets": {
"0": {
"description": "Um aparelho para encher os seus pneus num local fixa no espaço público