diff --git a/assets/themes/climbing/climbing.json b/assets/themes/climbing/climbing.json
index 04507d316..1cea94407 100644
--- a/assets/themes/climbing/climbing.json
+++ b/assets/themes/climbing/climbing.json
@@ -366,6 +366,10 @@
},
{
"#": "Length",
+ "question": {
+ "en": "How long is this climbing route (in meters)?",
+ "nl": "Hoe lang is deze klimroute (in meters)?"
+ },
"render": {
"de": "Diese Route ist {climbing:length} Meter lang",
"en": "This route is {climbing:length} meter long",
@@ -380,6 +384,10 @@
},
{
"#": "Difficulty",
+ "question": {
+ "en": "What is the difficulty of this climbing route according to the french/belgian system?",
+ "nl": "Hoe moeilijk is deze klimroute volgens het Franse/Belgische systeem?"
+ },
"render": {
"de": "Die Schwierigkeit ist {climbing:grade:french} entsprechend des französisch/belgischen Systems",
"en": "The difficulty is {climbing:grade:french} according to the french/belgian system",
@@ -394,17 +402,29 @@
],
"hideUnderlayingFeaturesMinPercentage": 0,
"icon": {
- "render": "./assets/themes/climbing/climbing_route.svg"
+ "render": "circle:white;./assets/themes/climbing/climbing_route.svg"
},
"width": {
"render": "4"
},
"iconSize": {
- "render": "20,20,center"
+ "render": "28,28,center"
},
"color": {
"render": "#0f0"
- }
+ },
+ "presets": [
+ {
+ "title": {
+ "en": "Climbing route"
+ },
+ "tags": [
+ "sport=climbing",
+ "climbing=route"
+ ]
+ }
+ ],
+ "wayHandling": 2
},
{
"id": "climbing",
@@ -433,7 +453,46 @@
"de": "Klettermöglichkeit",
"ja": "登坂教室",
"nb_NO": "Klatremulighet"
- }
+ },
+ "mappings": [
+ {
+ "if": "climbing=crag",
+ "then": {
+ "en": "Climbing crag"
+ }
+ },
+ {
+ "if": {
+ "and": [
+ {
+ "or": [
+ "climbing=area",
+ "climbing=site"
+ ]
+ },
+ "name~*"
+ ]
+ },
+ "then": {
+ "en": "Climbing area {name}",
+ "nl": "Klimsite {name}"
+ }
+ },
+ {
+ "if": "climbing=site",
+ "then": {
+ "en": "Climbing site",
+ "nl": "Klimsite"
+ }
+ },
+ {
+ "if": "name~*",
+ "then": {
+ "nl": "Klimgelegenheid {name}",
+ "en": "Climbing opportunity {name}"
+ }
+ }
+ ]
},
"description": {
"nl": "Een klimgelegenheid",
@@ -445,6 +504,23 @@
"tagRenderings": [
"images",
"questions",
+ {
+ "#": "Contained routes",
+ "render": "
Contains the following routes
{_contained_climbing_routes}
",
+ "condition": "_contained_climbing_routes~*"
+ }, {
+ "#": "Contained routes length hist",
+ "render": {
+ "en": "Length overview
{histogram(_length_hist)}"
+ }
+ },
+ {
+ "#": "Contained routes hist",
+ "render": {
+ "en": "Difficulties overview
{histogram(_difficulty_hist)}"
+ }
+ },
+
{
"#": "name",
"render": {
@@ -483,6 +559,28 @@
}
]
},
+ {
+ "#": "Type",
+ "question": "What kind of climbing opportunity is this?",
+ "mappings": [
+ {
+ "if": "climbing=boulder",
+ "then": {
+ "en": "A climbing boulder - a single rock or cliff with one or a few climbing routes which can be climbed safely without rope"
+ }
+ },
+ {
+ "if": "climbing=crag",
+ "then": {
+ "en": "A climbing crag - a single rock or cliff with at least a few climbing routes"
+ }
+ },
+ {
+ "if": "climbing=area",
+ "then": "A climbing area with one or more climbing crags and/or boulders"
+ }
+ ]
+ },
"reviews"
],
"hideUnderlayingFeaturesMinPercentage": 0,
@@ -519,7 +617,13 @@
}
}
],
- "wayHandling": 2
+ "wayHandling": 2,
+ "calculatedTags": [
+ "_contained_climbing_routes_properties=feat.overlapWith('climbing_route').map(f => f.feat.properties).map(p => {return {id: p.id, name: p.name, 'climbing:grade:french': p['climbing:grade:french'], 'climbing:length': p['climbing:length']} })",
+ "_contained_climbing_routes=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => `${p.name ?? 'climbing route'} (${p['climbing:grade:french'] ?? 'unknown difficulty'}, ${p['climbing:length'] ?? 'unkown length'} meter)`).join('')",
+ "_difficulty_hist=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => p['climbing:grade:french'])",
+ "_length_hist=JSON.parse(feat.properties._contained_climbing_routes_properties ?? '[]').map(p => p['climbing:length'])"
+ ]
},
{
"id": "maybe_climbing",
@@ -533,13 +637,18 @@
"minzoom": 19,
"source": {
"osmTags": {
- "or": [
- "leisure=sports_centre",
- "barrier=wall",
- "barrier=retaining_wall",
- "natural=cliff",
- "natural=rock",
- "natural=stone"
+ "and": [
+ {
+ "or": [
+ "leisure=sports_centre",
+ "barrier=wall",
+ "barrier=retaining_wall",
+ "natural=cliff",
+ "natural=rock",
+ "natural=stone"
+ ]
+ },
+ "climbing="
]
}
},
@@ -606,6 +715,15 @@
"ja": "ここでは登ることができる",
"nb_NO": "Klatring er mulig her"
}
+ },
+ {
+ "if": "climbing=no",
+ "then": {
+ "en": "Climbing is not possible here",
+ "de": "Hier kann nicht geklettert werden",
+ "ja": "ここでは登ることができない",
+ "nb_NO": "Klatring er ikke mulig her"
+ }
}
]
}
@@ -643,6 +761,102 @@
"type": "url"
}
},
+ {
+ "#": "Access from containing feature",
+ "mappings": [
+ {
+ "if": "_embedding_feature:access=yes",
+ "then": {
+ "en": "The containing feature states that this is publicly accessible
{_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=permit",
+ "then": {
+ "en": "The containing feature states that a permit is needed to access
{_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=customers",
+ "then": {
+ "en": "The containing feature states that this is only accessible to customers
{_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=members",
+ "then": {
+ "en": "The containing feature states that this is only accessible to club members
{_embedding_feature:access:description}"
+ }
+ },
+ {
+ "if": "_embedding_feature:access=no",
+ "then": "Not accessible as stated by the containing feature"
+ }
+ ],
+ "condition": "_embedding_feature:access~*"
+ },
+ {
+ "#": "Access",
+ "question": {
+ "en": "Who can access here?"
+ },
+ "mappings": [
+ {
+ "if": "access=yes",
+ "then": {
+ "en": "Publicly accessible to anyone"
+ }
+ },
+ {
+ "if": "access=permit",
+ "then": {
+ "en": "You need a permit to access here"
+ }
+ },
+ {
+ "if": "access=customers",
+ "then": {
+ "en": "Only custumers"
+ }
+ },
+ {
+ "if": "access=members",
+ "then": {
+ "en": "Only club members"
+ }
+ },
+ {
+ "if": "access=no",
+ "then": "Not accessible"
+ }
+ ],
+ "condition": {
+ "and": [
+ "climbing!=no",
+ "office=",
+ "club=",
+ {
+ "or": [
+ "sport=climbing",
+ "climbing:sport=yes"
+ ]
+ },
+ {
+ "or": [
+ "access~*",
+ "_embedding_feature:access="
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "#": "Access description (without _embedding_feature:access:description)",
+ "render": "{access:description}",
+ "freeform": {
+ "key": "access:description"
+ }
+ },
{
"#": "Avg length?",
"render": {
@@ -656,10 +870,13 @@
"climbing!~route",
"office=",
"club=",
+ "climbing:toprope!=no",
{
"or": [
- "climbing=sport",
- "climbing=traditional"
+ "sport=climbing",
+ "climbing:sport=yes",
+ "climbing=traditional",
+ "climbing=gym"
]
}
]
@@ -696,7 +913,13 @@
"and": [
"climbing!~route",
"office=",
- "club="
+ "club=",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ }
]
}
},
@@ -721,7 +944,13 @@
"and": [
"climbing!~route",
"office=",
- "club="
+ "club=",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ }
]
}
},
@@ -777,7 +1006,12 @@
],
"condition": {
"and": [
- "sport=climbing",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
"office=",
"club="
]
@@ -823,7 +1057,12 @@
],
"condition": {
"and": [
- "sport=climbing",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
"office=",
"club="
]
@@ -871,7 +1110,12 @@
],
"condition": {
"and": [
- "sport=climbing",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
"office=",
"club="
]
@@ -917,7 +1161,12 @@
],
"condition": {
"and": [
- "sport=climbing",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
"office=",
"club="
]
@@ -934,7 +1183,12 @@
"condition": {
"and": [
"leisure=sports_centre",
- "climbing:sport=yes",
+ {
+ "or": [
+ "climbing:sport=yes",
+ "sport=climbing"
+ ]
+ },
"office=",
"club="
]
@@ -970,5 +1224,15 @@
}
]
}
- ]
+ ],
+ "overrideAll": {
+ "calculatedTags+": [
+ "_embedding_feature_properties=feat.overlapWith('climbing').map(f => f.feat.properties).filter(p => p !== undefined).map(p => {return{access: p.access, id: p.id, name: p.name, climbing: p.climbing, 'access:description': p['access:description']}})",
+ "_embedding_features_with_access=JSON.parse(feat.properties._embedding_feature_properties ?? '[]').filter(p => p.access !== undefined)[0]",
+ "_embedding_feature:access=JSON.parse(feat.properties._embedding_features_with_access ?? '{}').access",
+ "_embedding_feature:access:description=JSON.parse(feat.properties._embedding_features_with_access ?? '{}')['access:description']",
+ "_embedding_feature:id=JSON.parse(feat.properties._embedding_features_with_access ?? '{}').id",
+ "_layer=feat._layer_id"
+ ]
+ }
}
\ No newline at end of file
diff --git a/langs/en.json b/langs/en.json
index 1c602017f..5ef511c8a 100644
--- a/langs/en.json
+++ b/langs/en.json
@@ -1,175 +1,176 @@
{
- "image": {
- "addPicture": "Add picture",
- "uploadingPicture": "Uploading your picture…",
- "uploadingMultiple": "Uploading {count} pictures…",
- "pleaseLogin": "Please log in to add a picture",
- "willBePublished": "Your picture will be published: ",
- "cco": "in the public domain",
- "ccbs": "under the CC-BY-SA-license",
- "ccb": "under the CC-BY-license",
- "uploadFailed": "Could not upload your picture. Are you connected to the Internet, and allow third party API's? The Brave browser or the uMatrix plugin might block them.",
- "respectPrivacy": "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.",
- "uploadDone": "Your picture has been added. Thanks for helping out!",
- "dontDelete": "Cancel",
- "doDelete": "Remove image",
- "isDeleted": "Deleted"
+ "image": {
+ "addPicture": "Add picture",
+ "uploadingPicture": "Uploading your picture…",
+ "uploadingMultiple": "Uploading {count} pictures…",
+ "pleaseLogin": "Please log in to add a picture",
+ "willBePublished": "Your picture will be published: ",
+ "cco": "in the public domain",
+ "ccbs": "under the CC-BY-SA-license",
+ "ccb": "under the CC-BY-license",
+ "uploadFailed": "Could not upload your picture. Are you connected to the Internet, and allow third party API's? The Brave browser or the uMatrix plugin might block them.",
+ "respectPrivacy": "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.",
+ "uploadDone": "Your picture has been added. Thanks for helping out!",
+ "dontDelete": "Cancel",
+ "doDelete": "Remove image",
+ "isDeleted": "Deleted"
+ },
+ "centerMessage": {
+ "loadingData": "Loading data…",
+ "zoomIn": "Zoom in to view or edit the data",
+ "ready": "Done!",
+ "retrying": "Loading data failed. Trying again in {count} seconds…"
+ },
+ "index": {
+ "#": "These texts are shown above the theme buttons when no theme is loaded",
+ "title": "Welcome to MapComplete",
+ "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about a specific theme.",
+ "pickTheme": "Pick a theme below to get started."
+ },
+ "general": {
+ "loginWithOpenStreetMap": "Login with OpenStreetMap",
+ "welcomeBack": "You are logged in, welcome back!",
+ "loginToStart": "Login to answer this question",
+ "search": {
+ "search": "Search a location",
+ "searching": "Searching…",
+ "nothing": "Nothing found…",
+ "error": "Something went wrong…"
},
- "centerMessage": {
- "loadingData": "Loading data…",
- "zoomIn": "Zoom in to view or edit the data",
- "ready": "Done!",
- "retrying": "Loading data failed. Trying again in {count} seconds…"
+ "returnToTheMap": "Return to the map",
+ "save": "Save",
+ "cancel": "Cancel",
+ "skip": "Skip this question",
+ "oneSkippedQuestion": "One question is skipped",
+ "skippedQuestions": "Some questions are skipped",
+ "number": "number",
+ "osmLinkTooltip": "See this object on OpenStreetMap for history and more editing options",
+ "add": {
+ "addNew": "Add a new {category} here",
+ "title": "Add a new point?",
+ "intro": "You clicked somewhere where no data is known yet.
",
+ "pleaseLogin": "Please log in to add a new point",
+ "zoomInFurther": "Zoom in further to add a point.",
+ "stillLoading": "The data is still loading. Please wait a bit before you add a new point.",
+ "confirmIntro": "Add a {title} here?
The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.",
+ "confirmButton": "Add a {category} here.
Your addition is visible for everyone
",
+ "openLayerControl": "Open the layer control box",
+ "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point"
},
- "index": {
- "#": "These texts are shown above the theme buttons when no theme is loaded",
- "title": "Welcome to MapComplete",
- "intro": "MapComplete is an OpenStreetMap-viewer and editor, which shows you information about a specific theme.",
- "pickTheme": "Pick a theme below to get started."
+ "pickLanguage": "Choose a language: ",
+ "about": "Easily edit and add OpenStreetMap for a certain theme",
+ "nameInlineQuestion": "The name of this {category} is $$$",
+ "noNameCategory": "{category} without a name",
+ "questions": {
+ "phoneNumberOf": "What is the phone number of {category}?",
+ "phoneNumberIs": "The phone number of this {category} is {phone}",
+ "websiteOf": "What is the website of {category}?",
+ "websiteIs": "Website: {website}",
+ "emailOf": "What is the email address of {category}?",
+ "emailIs": "The email address of this {category} is {email}"
},
- "general": {
- "loginWithOpenStreetMap": "Login with OpenStreetMap",
- "welcomeBack": "You are logged in, welcome back!",
- "loginToStart": "Login to answer this question",
- "search": {
- "search": "Search a location",
- "searching": "Searching…",
- "nothing": "Nothing found…",
- "error": "Something went wrong…"
- },
- "returnToTheMap": "Return to the map",
- "save": "Save",
- "cancel": "Cancel",
- "skip": "Skip this question",
- "oneSkippedQuestion": "One question is skipped",
- "skippedQuestions": "Some questions are skipped",
- "number": "number",
- "osmLinkTooltip": "See this object on OpenStreetMap for history and more editing options",
- "add": {
- "addNew": "Add a new {category} here",
- "title": "Add a new point?",
- "intro": "You clicked somewhere where no data is known yet.
",
- "pleaseLogin": "Please log in to add a new point",
- "zoomInFurther": "Zoom in further to add a point.",
- "stillLoading": "The data is still loading. Please wait a bit before you add a new point.",
- "confirmIntro": "Add a {title} here?
The point you create here will be visible for everyone. Please, only add things on to the map if they truly exist. A lot of applications use this data.",
- "confirmButton": "Add a {category} here.
Your addition is visible for everyone
",
- "openLayerControl": "Open the layer control box",
- "layerNotEnabled": "The layer {layer} is not enabled. Enable this layer to add a point"
- },
- "pickLanguage": "Choose a language: ",
- "about": "Easily edit and add OpenStreetMap for a certain theme",
- "nameInlineQuestion": "The name of this {category} is $$$",
- "noNameCategory": "{category} without a name",
- "questions": {
- "phoneNumberOf": "What is the phone number of {category}?",
- "phoneNumberIs": "The phone number of this {category} is {phone}",
- "websiteOf": "What is the website of {category}?",
- "websiteIs": "Website: {website}",
- "emailOf": "What is the email address of {category}?",
- "emailIs": "The email address of this {category} is {email}"
- },
- "openStreetMapIntro": "An Open Map
Wouldn't it be cool if there was a single map, which everyone could freely use and edit? A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore.
OpenStreetMap is this map. The map data can be used for free (with attribution and publication of changes to that data). On top of that, everyone can freely add new data and fix errors. This website uses OpenStreetMap as well. All the data is from there, and your answers and corrections are added there as well.
A ton of people and application already use OpenStreetMap: Maps.me, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap. If you change something here, it'll be reflected in those applications too - after their next update!
",
- "attribution": {
- "attributionTitle": "Attribution notice",
- "attributionContent": "All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
",
- "themeBy": "Theme maintained by {author}",
- "iconAttribution": {
- "title": "Used icons"
- },
- "mapContributionsBy": "The current visible data has edits made by {contributors}",
- "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors",
- "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors"
- },
- "sharescreen": {
- "intro": "Share this map
Share this map by copying the link below and sending it to friends and family:",
- "addToHomeScreen": "Add to your home screen
You can easily add this website to your smartphone home screen for a native feel. Click the 'add to home screen button' in the URL bar to do this.",
- "embedIntro": "Embed on your website
Please, embed this map into your website.
We encourage you to do it - you don't even have to ask permission.
It is free, and always will be. The more people using this, the more valuable it becomes.",
- "copiedToClipboard": "Link copied to clipboard",
- "thanksForSharing": "Thanks for sharing!",
- "editThisTheme": "Edit this theme",
- "editThemeDescription": "Add or change questions to this map theme",
- "fsUserbadge": "Enable the login button",
- "fsSearch": "Enable the search bar",
- "fsWelcomeMessage": "Show the welcome message popup and associated tabs",
- "fsLayers": "Enable the layer control",
- "fsLayerControlToggle": "Start with the layer control expanded",
- "fsAddNew": "Enable the 'add new POI' button",
- "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)",
- "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}",
- "fsIncludeCurrentLayers": "Include the current layer choices",
- "fsIncludeCurrentLocation": "Include current location"
- },
- "morescreen": {
- "intro": "More thematic maps?
Do you enjoy collecting geodata?
There are more themes available.",
- "requestATheme": "If you want a custom-built quest, request it in the issue tracker",
- "streetcomplete": "Another, similar application is StreetComplete.",
- "createYourOwnTheme": "Create your own MapComplete theme from scratch"
- },
- "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.",
- "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.",
- "goToInbox": "Open inbox",
- "getStartedLogin": "Login with OpenStreetMap to get started",
- "getStartedNewAccount": " or create a new account",
- "noTagsSelected": "No tags selected",
- "customThemeIntro": "Custom themes
These are previously visited user-generated themes.",
- "aboutMapcomplete": "About MapComplete
With MapComplete you can enrich OpenStreetMap with information on a single theme. Answer a few questions, and within minutes your contributions will be available around the globe! The theme maintainer defines elements, questions and languages for the theme.
Find out more
MapComplete always offers the next step to learn more about OpenStreetMap.
- When embedded in a website, the iframe links to a full-screen MapComplete
- The full-screen version offers information about OpenStreetMap
- Viewing works without login, but editing requires an OSM login.
- If you are not logged in, you are asked to log in
- Once you answered a single question, you can add new points to the map
- After a while, actual OSM-tags are shown, later linking to the wiki
Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.
Want to see your progress? Follow the edit count on OsmCha.
",
- "backgroundMap": "Background map",
- "layerSelection": {
- "zoomInToSeeThisLayer": "Zoom in to see this layer",
- "title": "Select layers"
- },
- "weekdays": {
- "abbreviations": {
- "monday": "Mon",
- "tuesday": "Tue",
- "wednesday": "Wed",
- "thursday": "Thu",
- "friday": "Fri",
- "saturday": "Sat",
- "sunday": "Sun"
- },
- "monday": "Monday",
- "tuesday": "Tuesday",
- "wednesday": "Wednesday",
- "thursday": "Thursday",
- "friday": "Friday",
- "saturday": "Saturday",
- "sunday": "Sunday"
- },
- "opening_hours": {
- "error_loading": "Error: could not visualize these opening hours.",
- "open_during_ph": "During a public holiday, this amenity is",
- "opensAt": "from",
- "openTill": "till",
- "not_all_rules_parsed": "The opening hours of this shop are complicated. The following rules are ignored in the input element:",
- "closed_until": "Closed until {date}",
- "closed_permanently": "Closed for an unkown duration",
- "open_24_7": "Opened around the clock",
- "ph_not_known": " ",
- "ph_closed": "closed",
- "ph_open": "opened"
- }
+ "openStreetMapIntro": "An Open Map
Wouldn't it be cool if there was a single map, which everyone could freely use and edit? A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore.
OpenStreetMap is this map. The map data can be used for free (with attribution and publication of changes to that data). On top of that, everyone can freely add new data and fix errors. This website uses OpenStreetMap as well. All the data is from there, and your answers and corrections are added there as well.
A ton of people and application already use OpenStreetMap: Maps.me, OsmAnd, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap. If you change something here, it'll be reflected in those applications too - after their next update!
",
+ "attribution": {
+ "attributionTitle": "Attribution notice",
+ "attributionContent": "All data is provided by OpenStreetMap, freely reusable under the Open DataBase License.
",
+ "themeBy": "Theme maintained by {author}",
+ "iconAttribution": {
+ "title": "Used icons"
+ },
+ "mapContributionsBy": "The current visible data has edits made by {contributors}",
+ "mapContributionsByAndHidden": "The current visible data has edits made by {contributors} and {hiddenCount} more contributors",
+ "codeContributionsBy": "MapComplete has been built by {contributors} and {hiddenCount} more contributors"
},
- "favourite": {
- "panelIntro": "Your personal theme
Activate your favourite layers from all the official themes",
- "loginNeeded": "Log in
A personal layout is only available for OpenStreetMap users",
- "reload": "Reload the data"
+ "sharescreen": {
+ "intro": "Share this map
Share this map by copying the link below and sending it to friends and family:",
+ "addToHomeScreen": "Add to your home screen
You can easily add this website to your smartphone home screen for a native feel. Click the 'add to home screen button' in the URL bar to do this.",
+ "embedIntro": "Embed on your website
Please, embed this map into your website.
We encourage you to do it - you don't even have to ask permission.
It is free, and always will be. The more people using this, the more valuable it becomes.",
+ "copiedToClipboard": "Link copied to clipboard",
+ "thanksForSharing": "Thanks for sharing!",
+ "editThisTheme": "Edit this theme",
+ "editThemeDescription": "Add or change questions to this map theme",
+ "fsUserbadge": "Enable the login button",
+ "fsSearch": "Enable the search bar",
+ "fsWelcomeMessage": "Show the welcome message popup and associated tabs",
+ "fsLayers": "Enable the layer control",
+ "fsLayerControlToggle": "Start with the layer control expanded",
+ "fsAddNew": "Enable the 'add new POI' button",
+ "fsGeolocation": "Enable the 'geolocate-me' button (mobile only)",
+ "fsIncludeCurrentBackgroundMap": "Include the current background choice {name}",
+ "fsIncludeCurrentLayers": "Include the current layer choices",
+ "fsIncludeCurrentLocation": "Include current location"
},
- "reviews": {
- "title": "{count} reviews",
- "title_singular": "One review",
- "name_required": "A name is required in order to display and create reviews",
- "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!",
- "write_a_comment": "Leave a review…",
- "no_rating": "No rating given",
- "posting_as": "Posting as",
- "i_am_affiliated": "I am affiliated with this object
Check if you are an owner, creator, employee, …",
- "affiliated_reviewer_warning": "(Affiliated review)",
- "saving_review": "Saving…",
- "saved": "Review saved. Thanks for sharing!",
- "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews",
- "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.",
- "plz_login": "Login to leave a review"
- }
+ "morescreen": {
+ "intro": "More thematic maps?
Do you enjoy collecting geodata?
There are more themes available.",
+ "requestATheme": "If you want a custom-built quest, request it in the issue tracker",
+ "streetcomplete": "Another, similar application is StreetComplete.",
+ "createYourOwnTheme": "Create your own MapComplete theme from scratch"
+ },
+ "readYourMessages": "Please, read all your OpenStreetMap-messages before adding a new point.",
+ "fewChangesBefore": "Please, answer a few questions of existing points before adding a new point.",
+ "goToInbox": "Open inbox",
+ "getStartedLogin": "Login with OpenStreetMap to get started",
+ "getStartedNewAccount": " or create a new account",
+ "noTagsSelected": "No tags selected",
+ "customThemeIntro": "Custom themes
These are previously visited user-generated themes.",
+ "aboutMapcomplete": "About MapComplete
With MapComplete you can enrich OpenStreetMap with information on a single theme. Answer a few questions, and within minutes your contributions will be available around the globe! The theme maintainer defines elements, questions and languages for the theme.
Find out more
MapComplete always offers the next step to learn more about OpenStreetMap.
- When embedded in a website, the iframe links to a full-screen MapComplete
- The full-screen version offers information about OpenStreetMap
- Viewing works without login, but editing requires an OSM login.
- If you are not logged in, you are asked to log in
- Once you answered a single question, you can add new points to the map
- After a while, actual OSM-tags are shown, later linking to the wiki
Did you notice an issue? Do you have a feature request? Want to help translate? Head over to the source code or issue tracker.
Want to see your progress? Follow the edit count on OsmCha.
",
+ "backgroundMap": "Background map",
+ "layerSelection": {
+ "zoomInToSeeThisLayer": "Zoom in to see this layer",
+ "title": "Select layers"
+ },
+ "weekdays": {
+ "abbreviations": {
+ "monday": "Mon",
+ "tuesday": "Tue",
+ "wednesday": "Wed",
+ "thursday": "Thu",
+ "friday": "Fri",
+ "saturday": "Sat",
+ "sunday": "Sun"
+ },
+ "monday": "Monday",
+ "tuesday": "Tuesday",
+ "wednesday": "Wednesday",
+ "thursday": "Thursday",
+ "friday": "Friday",
+ "saturday": "Saturday",
+ "sunday": "Sunday"
+ },
+ "opening_hours": {
+ "error_loading": "Error: could not visualize these opening hours.",
+ "open_during_ph": "During a public holiday, this amenity is",
+ "opensAt": "from",
+ "openTill": "till",
+ "not_all_rules_parsed": "The opening hours of this shop are complicated. The following rules are ignored in the input element:",
+ "closed_until": "Closed until {date}",
+ "closed_permanently": "Closed for an unkown duration",
+ "open_24_7": "Opened around the clock",
+ "ph_not_known": " ",
+ "ph_closed": "closed",
+ "ph_open": "opened"
+ },
+ "error_loading": "Error: could not load the histogram"
+ },
+ "favourite": {
+ "panelIntro": "Your personal theme
Activate your favourite layers from all the official themes",
+ "loginNeeded": "Log in
A personal layout is only available for OpenStreetMap users",
+ "reload": "Reload the data"
+ },
+ "reviews": {
+ "title": "{count} reviews",
+ "title_singular": "One review",
+ "name_required": "A name is required in order to display and create reviews",
+ "no_reviews_yet": "There are no reviews yet. Be the first to write one and help open data and the business!",
+ "write_a_comment": "Leave a review…",
+ "no_rating": "No rating given",
+ "posting_as": "Posting as",
+ "i_am_affiliated": "I am affiliated with this object
Check if you are an owner, creator, employee, …",
+ "affiliated_reviewer_warning": "(Affiliated review)",
+ "saving_review": "Saving…",
+ "saved": "Review saved. Thanks for sharing!",
+ "tos": "If you create a review, you agree to the TOS and privacy policy of Mangrove.reviews",
+ "attribution": "Reviews are powered by Mangrove Reviews and are available under CC-BY 4.0.",
+ "plz_login": "Login to leave a review"
+ }
}
diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts
index a490bff54..9dd9b0b72 100644
--- a/scripts/generateTranslations.ts
+++ b/scripts/generateTranslations.ts
@@ -220,6 +220,11 @@ function MergeTranslation(source: any, target: any, language: string, context: s
const sourceV = source[key];
const targetV = target[key]
if (typeof sourceV === "string") {
+ if(targetV === undefined){
+ target[key] = source[key];
+ continue;
+ }
+
if (targetV[language] === sourceV) {
// Already the same
continue;
@@ -240,7 +245,7 @@ function MergeTranslation(source: any, target: any, language: string, context: s
}
if (typeof sourceV === "object") {
if (targetV === undefined) {
- throw "MergingTranslations failed: source object has a path that does not exist anymore in the target: " + context
+ target[language] = sourceV;
} else {
MergeTranslation(sourceV, targetV, language, context + "." + key);
}