diff --git a/Docs/BuiltinIndex.md b/Docs/BuiltinIndex.md index 5e7f0dd77..75a5ccafb 100644 --- a/Docs/BuiltinIndex.md +++ b/Docs/BuiltinIndex.md @@ -55,7 +55,9 @@ + [minimap](#minimap) + [mastodon](#mastodon) + [contact](#contact) + + [etymology.wikipedia-etymology](#etymologywikipedia-etymology) + [denominations-notes](#denominations-notes) + + [single_level](#single_level) + [survey_date](#survey_date) + [id_presets.shop_types](#id_presetsshop_types) + [school.capacity](#schoolcapacity) @@ -442,9 +444,9 @@ - fitness_centre - food - hackerspace + - indoors - parking - picnic_table - - questions - railway_platforms - reception_desk - shops @@ -858,6 +860,17 @@ +### etymology.wikipedia-etymology + + + + + + - indoors + + + + ### denominations-notes @@ -871,6 +884,17 @@ +### single_level + + + + + + - questions + + + + ### survey_date diff --git a/Docs/BuiltinLayers.md b/Docs/BuiltinLayers.md index 15c328651..17eb11d08 100644 --- a/Docs/BuiltinLayers.md +++ b/Docs/BuiltinLayers.md @@ -61,9 +61,6 @@ + [just_created](#just_created) + [leftover-questions](#leftover-questions) + [all-tags](#all-tags) -1. [matchpoint](#matchpoint) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) 1. [import_candidate](#import_candidate) - [Basic tags for this layer](#basic-tags-for-this-layer) - [Supported attributes](#supported-attributes) @@ -79,9 +76,13 @@ + [inbox](#inbox) + [settings-link](#settings-link) + [logout](#logout) + + [background-layer-readonly](#background-layer-readonly) + + [background-layer](#background-layer) + [picture-license](#picture-license) + [show_tags](#show_tags) + [all-questions-at-once](#all-questions-at-once) + + [fixate-north](#fixate-north) + + [mangrove-keys](#mangrove-keys) + [translations-title](#translations-title) + [translation-mode](#translation-mode) + [translation-help](#translation-help) @@ -120,7 +121,6 @@ MapComplete has a few data layers available in the theme which have special prop - [split_point](#split_point) - [split_road](#split_road) - [current_view](#current_view) - - [matchpoint](#matchpoint) - [import_candidate](#import_candidate) - [usersettings](#usersettings) @@ -476,7 +476,9 @@ Meta-layer, simply showing a bbox in red - This layer is shown at zoomlevel **0** and higher - **This layer is included automatically in every theme. This layer might contain no points** + - This layer is not visible by default and must be enabled in the filter by the user. - Elements don't have a title set and cannot be toggled nor will they show up in the dashboard. If you import this layer in your theme, override `title` to make this toggleable. + - This layer is not visible by default and the visibility cannot be toggled, effectively resulting in a fully hidden layer. This can be useful, e.g. to calculate some metatags. If you want to render this layer (e.g. for debugging), enable it by setting the URL-parameter layer-=true - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` @@ -863,47 +865,6 @@ This tagrendering has no question and is thus read-only - matchpoint -============ - - - - - -The default rendering for a locationInput which snaps onto another object - - - - - - - - This layer is shown at zoomlevel **0** and higher - - This layer can **not** be included in a theme. It is solely used by [special renderings](SpecialRenderings.md) showing a minimap with custom data. - - - - - Basic tags for this layer ---------------------------- - - - -Elements must have the all of following tags to be shown on this layer: - - - - - - - - - Supported attributes ----------------------- - - - - - import_candidate ================== @@ -1043,9 +1004,12 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/__url_parameter_initialized:language#values) [__url_parameter_initialized:language](https://wiki.openstreetmap.org/wiki/Key:__url_parameter_initialized:language) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:__url_parameter_initialized:language%3Dyes) +[](https://taginfo.openstreetmap.org/keys/mapcomplete-preferred-background-layer#values) [mapcomplete-preferred-background-layer](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-preferred-background-layer) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3D) [osm](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dosm) [photo](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dphoto) [map](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3Dmap) [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-preferred-background-layer%3D) [](https://taginfo.openstreetmap.org/keys/mapcomplete-pictures-license#values) [mapcomplete-pictures-license](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-pictures-license) | Multiple choice | [CC0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC0) [CC-BY 4.0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC-BY 4.0) [CC-BY-SA 4.0](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-pictures-license%3DCC-BY-SA 4.0) [](https://taginfo.openstreetmap.org/keys/mapcomplete-show_tags#values) [mapcomplete-show_tags](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-show_tags) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3Dno) [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3D) [yes](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3Dyes) [full](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show_tags%3Dfull) [](https://taginfo.openstreetmap.org/keys/mapcomplete-show-all-questions#values) [mapcomplete-show-all-questions](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-show-all-questions) | Multiple choice | [true](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show-all-questions%3Dtrue) [false](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-show-all-questions%3Dfalse) +[](https://taginfo.openstreetmap.org/keys/mapcomplete-fixate-north#values) [mapcomplete-fixate-north](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-fixate-north) | Multiple choice | [](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-fixate-north%3D) [yes](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-fixate-north%3Dyes) [](https://taginfo.openstreetmap.org/keys/mapcomplete-translation-mode#values) [mapcomplete-translation-mode](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-translation-mode) | Multiple choice | [false](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dfalse) [true](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dtrue) [mobile](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dmobile) [](https://taginfo.openstreetmap.org/keys/mapcomplete-translation-mode#values) [mapcomplete-translation-mode](https://wiki.openstreetmap.org/wiki/Key:mapcomplete-translation-mode) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:mapcomplete-translation-mode%3Dyes) [](https://taginfo.openstreetmap.org/keys/_translation_percentage#values) [_translation_percentage](https://wiki.openstreetmap.org/wiki/Key:_translation_percentage) | Multiple choice | [100](https://wiki.openstreetmap.org/wiki/Tag:_translation_percentage%3D100) @@ -1093,6 +1057,11 @@ This tagrendering has no question and is thus read-only + - *The language was set via an URL-parameter and cannot be set by the user.²* corresponds with `__url_parameter_initialized:language=yes` + + + + ### inbox @@ -1103,8 +1072,8 @@ This tagrendering has no question and is thus read-only - - *{link(Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,)}* corresponds with `_unreadMessages=0` - - *{link(You have &LBRACE_unreadMessages&RBRACE
Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,)}* corresponds with `_unreadMessages>0` + - *{link(Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,,)}* corresponds with `_unreadMessages=0` + - *{link(You have &LBRACE_unreadMessages&RBRACE
Open your inbox,&LBRACE_backend&RBRACE/messages/inbox,,)}* corresponds with `_unreadMessages>0` @@ -1129,6 +1098,39 @@ This tagrendering has no question and is thus read-only +### background-layer-readonly + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `_theme:backgroundLayer~.+&mapcomplete-preferred-background-layer~.+&_theme:backgroundLayer!=` + + + +### background-layer + + + +The question is *What background layer should be shown by default?* + + + + + + - *Use the default background layer* corresponds with `` + - *Use OpenStreetMap-carto as default layer* corresponds with `mapcomplete-preferred-background-layer=osm` + - *Use aerial imagery as default background* corresponds with `mapcomplete-preferred-background-layer=photo` + - *Use a non-openstreetmap based map as default background* corresponds with `mapcomplete-preferred-background-layer=map` + - *Use the current background layer ({__current_background}) as default background* corresponds with `mapcomplete-preferred-background-layer=` + - *Use background layer {mapcomplete-preferred-background-layer} as default background* corresponds with `mapcomplete-preferred-background-layer~.+` + - This option cannot be chosen as answer + + + + ### picture-license @@ -1184,6 +1186,32 @@ The question is *Should questions for unknown data fields appear one-by-one or +### fixate-north + + + +The question is *Should north always be up?* + + + + + + - *Allow to rotate the map* corresponds with `` + - *Always keep north pointing up* corresponds with `mapcomplete-fixate-north=yes` + + + + +### mangrove-keys + + + +This tagrendering has no question and is thus read-only + + + + + ### translations-title @@ -1265,8 +1293,8 @@ This tagrendering has no question and is thus read-only - - *A link to your Mastodon-profile has been been found: {_mastodon_link}* corresponds with `_mastodon_link~.+` - - *We found a link to what looks to be a mastodon account, but it is unverified. Edit your profile description and place the following there: <a href="{_mastodon_candidate}" rel="me">Mastodon</a>* corresponds with `_mastodon_candidate~.+` + - *A link to your Mastodon-profile has been been found: {_mastodon_link}* corresponds with `_mastodon_link~.+` + - *We found a link to what looks to be a mastodon account, but it is unverified. Edit your profile description and place the following there: <a href="{_mastodon_candidate}" rel="me">Mastodon</a>* corresponds with `_mastodon_candidate~.+` @@ -1408,6 +1436,7 @@ The following layers are included in MapComplete: - [dogpark](./Layers/dogpark.md) - [drinking_water](./Layers/drinking_water.md) - [elevator](./Layers/elevator.md) + - [elongated_coin](./Layers/elongated_coin.md) - [entrance](./Layers/entrance.md) - [etymology](./Layers/etymology.md) - [extinguisher](./Layers/extinguisher.md) @@ -1438,8 +1467,8 @@ The following layers are included in MapComplete: - [map](./Layers/map.md) - [maproulette](./Layers/maproulette.md) - [maproulette_challenge](./Layers/maproulette_challenge.md) - - [matchpoint](./Layers/matchpoint.md) - [maxspeed](./Layers/maxspeed.md) + - [memorial](./Layers/memorial.md) - [named_streets](./Layers/named_streets.md) - [nature_reserve](./Layers/nature_reserve.md) - [note](./Layers/note.md) @@ -1458,6 +1487,7 @@ The following layers are included in MapComplete: - [postboxes](./Layers/postboxes.md) - [postoffices](./Layers/postoffices.md) - [public_bookcase](./Layers/public_bookcase.md) + - [questions](./Layers/questions.md) - [railway_platforms](./Layers/railway_platforms.md) - [rainbow_crossings](./Layers/rainbow_crossings.md) - [range](./Layers/range.md) @@ -1467,6 +1497,7 @@ The following layers are included in MapComplete: - [selected_element](./Layers/selected_element.md) - [shelter](./Layers/shelter.md) - [shops](./Layers/shops.md) + - [shower](./Layers/shower.md) - [slow_roads](./Layers/slow_roads.md) - [speed_camera](./Layers/speed_camera.md) - [speed_display](./Layers/speed_display.md) @@ -1487,6 +1518,7 @@ The following layers are included in MapComplete: - [transit_stops](./Layers/transit_stops.md) - [tree_node](./Layers/tree_node.md) - [usersettings](./Layers/usersettings.md) + - [vending_machine](./Layers/vending_machine.md) - [veterinary](./Layers/veterinary.md) - [viewpoint](./Layers/viewpoint.md) - [village_green](./Layers/village_green.md) @@ -1497,4 +1529,4 @@ The following layers are included in MapComplete: - [windturbine](./Layers/windturbine.md) -This document is autogenerated from [Customizations/AllKnownLayouts.ts](https://github.com/pietervdvn/MapComplete/blob/develop/Customizations/AllKnownLayouts.ts) +This document is autogenerated from [src/Customizations/AllKnownLayouts.ts](https://github.com/pietervdvn/MapComplete/blob/develop/src/Customizations/AllKnownLayouts.ts) diff --git a/Docs/BuiltinQuestions.md b/Docs/BuiltinQuestions.md index 10b886651..7b0f907da 100644 --- a/Docs/BuiltinQuestions.md +++ b/Docs/BuiltinQuestions.md @@ -46,7 +46,8 @@ Special library layer which does not need a '.questions'-prefix before being imp + [all_tags](#all_tags) + [just_created](#just_created) + [multilevels](#multilevels) - + [level](#level) + + [repeated](#repeated) + + [single_level](#single_level) + [smoking](#smoking) + [induction-loop](#induction-loop) + [internet](#internet) @@ -655,7 +656,21 @@ This is rendered with `This elevator goes to floors {level}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -678,6 +693,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### smoking diff --git a/Docs/CalculatedTags.md b/Docs/CalculatedTags.md index 4617eca58..d23c29204 100644 --- a/Docs/CalculatedTags.md +++ b/Docs/CalculatedTags.md @@ -198,7 +198,7 @@ Adds the geometry type as property. This is identical to the GoeJson geometry ty -Extract the 'level'-tag into a normalized, ';'-separated value +Extract the 'level'-tag into a normalized, ';'-separated value called '_level' (which also includes 'repeat_on'). The `level` tag (without underscore) will be normalized with only the value of `level`. @@ -260,7 +260,9 @@ To enable this feature, add a field `calculatedTags` in the layer object, e.g.: "calculatedTags": [ - "_someKey=javascript-expression", + "_someKey=javascript-expression (lazy execution)", + + "_some_other_key:=javascript expression (strict execution) "name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator", @@ -272,6 +274,12 @@ To enable this feature, add a field `calculatedTags` in the layer object, e.g.: +By using `:=` as separator, the attribute will be calculated as soone as the data is loaded (strict evaluation) + +The default behaviour, using `=` as separator, is lazy loading + + + The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object: diff --git a/Docs/Layers/all_vending_machine.md b/Docs/Layers/all_vending_machine.md index 323ec9fc5..469cc7e90 100644 --- a/Docs/Layers/all_vending_machine.md +++ b/Docs/Layers/all_vending_machine.md @@ -269,7 +269,21 @@ The question is *Is this vending machine indoors?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -292,6 +306,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### phone diff --git a/Docs/Layers/bench.md b/Docs/Layers/bench.md index 5d588d8e8..e9869f60e 100644 --- a/Docs/Layers/bench.md +++ b/Docs/Layers/bench.md @@ -56,7 +56,6 @@ attribute | type | values which are supported by this layer [](https://taginfo.openstreetmap.org/keys/colour#values) [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) | [brown](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dbrown) [green](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgreen) [gray](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgray) [white](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dwhite) [red](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dred) [black](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblack) [blue](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblue) [yellow](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dyellow) [](https://taginfo.openstreetmap.org/keys/survey:date#values) [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) [](https://taginfo.openstreetmap.org/keys/inscription#values) [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [text](../SpecialInputElements.md#text) | -[](https://taginfo.openstreetmap.org/keys/tourism#values) [tourism](https://wiki.openstreetmap.org/wiki/Key:tourism) | Multiple choice | [artwork](https://wiki.openstreetmap.org/wiki/Tag:tourism%3Dartwork) [](https://wiki.openstreetmap.org/wiki/Tag:tourism%3D) [](https://taginfo.openstreetmap.org/keys/historic#values) [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [memorial](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dmemorial) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) [](https://taginfo.openstreetmap.org/keys/artwork_type#values) [artwork_type](https://wiki.openstreetmap.org/wiki/Key:artwork_type) | [string](../SpecialInputElements.md#string) | [architecture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Darchitecture) [mural](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dmural) [painting](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dpainting) [sculpture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dsculpture) [statue](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstatue) [bust](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dbust) [stone](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstone) [installation](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dinstallation) [graffiti](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dgraffiti) [relief](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Drelief) [azulejo](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dazulejo) [tilework](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dtilework) [woodcarving](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dwoodcarving) [](https://taginfo.openstreetmap.org/keys/artist:wikidata#values) [artist:wikidata](https://wiki.openstreetmap.org/wiki/Key:artist:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | @@ -263,7 +262,9 @@ The question is *Does this bench have an artistic element?* - *This bench has an integrated artwork* corresponds with `tourism=artwork` - - *This bench does not have an integrated artwork* corresponds with `` + - *This bench does not have an integrated artwork* corresponds with `not:tourism:artwork=yes` + - *This bench probably doesn't have an integrated artwork* corresponds with `` + - This option cannot be chosen as answer diff --git a/Docs/Layers/bike_cafe.md b/Docs/Layers/bike_cafe.md index 791caa5e3..70c265511 100644 --- a/Docs/Layers/bike_cafe.md +++ b/Docs/Layers/bike_cafe.md @@ -254,6 +254,16 @@ This tagrendering has no question and is thus read-only +### delete-button + + + +This tagrendering has no question and is thus read-only + + + + + ### last_edit diff --git a/Docs/Layers/bike_repair_station.md b/Docs/Layers/bike_repair_station.md index 04ffd306f..1c1c2713b 100644 --- a/Docs/Layers/bike_repair_station.md +++ b/Docs/Layers/bike_repair_station.md @@ -324,7 +324,21 @@ This tagrendering is only visible in the popup if the following condition is met -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -347,6 +361,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### leftover-questions diff --git a/Docs/Layers/cafe_pub.md b/Docs/Layers/cafe_pub.md index 3e2ed5f32..e2b400d5a 100644 --- a/Docs/Layers/cafe_pub.md +++ b/Docs/Layers/cafe_pub.md @@ -97,7 +97,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -120,6 +134,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### Name diff --git a/Docs/Layers/charging_station.md b/Docs/Layers/charging_station.md index 4bbc83000..100e02f9b 100644 --- a/Docs/Layers/charging_station.md +++ b/Docs/Layers/charging_station.md @@ -1933,7 +1933,21 @@ This is rendered with `More info on {website}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -1956,6 +1970,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### ref diff --git a/Docs/Layers/charging_station_ebikes.md b/Docs/Layers/charging_station_ebikes.md index 942a5ce08..98e83f35e 100644 --- a/Docs/Layers/charging_station_ebikes.md +++ b/Docs/Layers/charging_station_ebikes.md @@ -1931,7 +1931,21 @@ This is rendered with `More info on {website}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -1954,6 +1968,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### ref diff --git a/Docs/Layers/dogfoodb.md b/Docs/Layers/dogfoodb.md index 159eb7f82..1411d582e 100644 --- a/Docs/Layers/dogfoodb.md +++ b/Docs/Layers/dogfoodb.md @@ -46,13 +46,13 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | -[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | [](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/cuisine#values) [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [](https://taginfo.openstreetmap.org/keys/reservation#values) [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) @@ -107,31 +107,6 @@ This tagrendering has no question and is thus read-only -### level - - - -The question is *On what level is this feature located?* - -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) - -This is rendered with `Located on the {level}th floor` - - - - - - - *Located underground* corresponds with `location=underground` - - This option cannot be chosen as answer - - *Located on the ground floor* corresponds with `level=0` - - *Located on the ground floor* corresponds with `` - - This option cannot be chosen as answer - - *Located on the first floor* corresponds with `level=1` - - *Located on the first basement level* corresponds with `level=-1` - - - - ### Name @@ -262,6 +237,47 @@ The question is *Which methods of payment are accepted here?* +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### wheelchair-access @@ -727,7 +743,7 @@ reservation.0 | Reservation not required | reservation=no\|reservation=optional\ id | question | osmTags ---- | ---------- | --------- -food-category.0 | Has a vegetarian menu (default) | +food-category.0 | Restaurants and fast food businesses (default) | food-category.1 | Only fastfood businesses | amenity=fast_food food-category.2 | Only restaurants | amenity=restaurant @@ -736,14 +752,14 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegan menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a halal menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only @@ -772,6 +788,15 @@ accepts_cash.0 | Accepts cash | payment:cash=yes id | question | osmTags ---- | ---------- | --------- accepts_cards.0 | Accepts payment cards | payment:cards=yes + + + + +id | question | osmTags +---- | ---------- | --------- +dogs.0 | No preference towards dogs (default) | +dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.2 | No dogs allowed | dog=no This document is autogenerated from [assets/themes/pets/pets.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/pets/pets.json) diff --git a/Docs/Layers/dogshop.md b/Docs/Layers/dogshop.md index 4018d415b..8576e9557 100644 --- a/Docs/Layers/dogshop.md +++ b/Docs/Layers/dogshop.md @@ -384,7 +384,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -407,6 +421,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/elongated_coin.md b/Docs/Layers/elongated_coin.md index 8c0a80cbe..067b778d4 100644 --- a/Docs/Layers/elongated_coin.md +++ b/Docs/Layers/elongated_coin.md @@ -297,7 +297,21 @@ The question is *Is the penny press indoors?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -320,6 +334,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### check_date diff --git a/Docs/Layers/entrance.md b/Docs/Layers/entrance.md index b04e700bb..88c0bc060 100644 --- a/Docs/Layers/entrance.md +++ b/Docs/Layers/entrance.md @@ -93,7 +93,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -116,6 +130,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### Entrance type diff --git a/Docs/Layers/fitness_centre.md b/Docs/Layers/fitness_centre.md index be4b04f6a..9d6483660 100644 --- a/Docs/Layers/fitness_centre.md +++ b/Docs/Layers/fitness_centre.md @@ -206,7 +206,21 @@ The question is *Is this place accessible with a wheelchair?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -229,6 +243,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### reviews diff --git a/Docs/Layers/food.md b/Docs/Layers/food.md index 90c4b597d..9f36f751e 100644 --- a/Docs/Layers/food.md +++ b/Docs/Layers/food.md @@ -50,13 +50,13 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | -[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | [](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/cuisine#values) [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [](https://taginfo.openstreetmap.org/keys/reservation#values) [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) @@ -111,31 +111,6 @@ This tagrendering has no question and is thus read-only -### level - - - -The question is *On what level is this feature located?* - -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) - -This is rendered with `Located on the {level}th floor` - - - - - - - *Located underground* corresponds with `location=underground` - - This option cannot be chosen as answer - - *Located on the ground floor* corresponds with `level=0` - - *Located on the ground floor* corresponds with `` - - This option cannot be chosen as answer - - *Located on the first floor* corresponds with `level=1` - - *Located on the first basement level* corresponds with `level=-1` - - - - ### Name @@ -266,6 +241,47 @@ The question is *Which methods of payment are accepted here?* +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### wheelchair-access @@ -731,7 +747,7 @@ reservation.0 | Reservation not required | reservation=no\|reservation=optional\ id | question | osmTags ---- | ---------- | --------- -food-category.0 | Has a vegetarian menu (default) | +food-category.0 | Restaurants and fast food businesses (default) | food-category.1 | Only fastfood businesses | amenity=fast_food food-category.2 | Only restaurants | amenity=restaurant @@ -740,14 +756,14 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegan menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a halal menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only @@ -776,6 +792,15 @@ accepts_cash.0 | Accepts cash | payment:cash=yes id | question | osmTags ---- | ---------- | --------- accepts_cards.0 | Accepts payment cards | payment:cards=yes + + + + +id | question | osmTags +---- | ---------- | --------- +dogs.0 | No preference towards dogs (default) | +dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.2 | No dogs allowed | dog=no This document is autogenerated from [assets/layers/food/food.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/food/food.json) diff --git a/Docs/Layers/friture.md b/Docs/Layers/friture.md index 8d326c30f..7c61831c8 100644 --- a/Docs/Layers/friture.md +++ b/Docs/Layers/friture.md @@ -46,13 +46,13 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | -[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/amenity#values) [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) [](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://taginfo.openstreetmap.org/keys/website#values) [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | [](https://taginfo.openstreetmap.org/keys/email#values) [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | [](https://taginfo.openstreetmap.org/keys/phone#values) [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [](https://taginfo.openstreetmap.org/keys/cuisine#values) [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [](https://taginfo.openstreetmap.org/keys/reservation#values) [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) @@ -107,31 +107,6 @@ This tagrendering has no question and is thus read-only -### level - - - -The question is *On what level is this feature located?* - -This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) - -This is rendered with `Located on the {level}th floor` - - - - - - - *Located underground* corresponds with `location=underground` - - This option cannot be chosen as answer - - *Located on the ground floor* corresponds with `level=0` - - *Located on the ground floor* corresponds with `` - - This option cannot be chosen as answer - - *Located on the first floor* corresponds with `level=1` - - *Located on the first basement level* corresponds with `level=-1` - - - - ### Name @@ -262,6 +237,47 @@ The question is *Which methods of payment are accepted here?* +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### wheelchair-access @@ -727,7 +743,7 @@ reservation.0 | Reservation not required | reservation=no\|reservation=optional\ id | question | osmTags ---- | ---------- | --------- -food-category.0 | Has a vegetarian menu (default) | +food-category.0 | Restaurants and fast food businesses (default) | food-category.1 | Only fastfood businesses | amenity=fast_food food-category.2 | Only restaurants | amenity=restaurant @@ -736,14 +752,14 @@ food-category.2 | Only restaurants | amenity=restaurant id | question | osmTags ---- | ---------- | --------- -vegetarian.0 | Has a vegan menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only +vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes\|diet:vegetarian=only\|diet:vegan=yes\|diet:vegan=only id | question | osmTags ---- | ---------- | --------- -vegan.0 | Has a halal menu | diet:vegan=yes\|diet:vegan=only +vegan.0 | Has a vegan menu | diet:vegan=yes\|diet:vegan=only @@ -772,6 +788,15 @@ accepts_cash.0 | Accepts cash | payment:cash=yes id | question | osmTags ---- | ---------- | --------- accepts_cards.0 | Accepts payment cards | payment:cards=yes + + + + +id | question | osmTags +---- | ---------- | --------- +dogs.0 | No preference towards dogs (default) | +dogs.1 | Dogs allowed | dog=unleashed\|dog=yes +dogs.2 | No dogs allowed | dog=no This document is autogenerated from [assets/themes/fritures/fritures.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/fritures/fritures.json) diff --git a/Docs/Layers/hackerspace.md b/Docs/Layers/hackerspace.md index 3daf2b5ef..dcf2e7d37 100644 --- a/Docs/Layers/hackerspace.md +++ b/Docs/Layers/hackerspace.md @@ -126,7 +126,21 @@ This is rendered with `This hackerspace is named {name}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -149,6 +163,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### website diff --git a/Docs/Layers/indoors.md b/Docs/Layers/indoors.md index 13365ac85..25feafe57 100644 --- a/Docs/Layers/indoors.md +++ b/Docs/Layers/indoors.md @@ -49,8 +49,12 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/level#values) [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) [](https://taginfo.openstreetmap.org/keys/ref#values) [ref](https://wiki.openstreetmap.org/wiki/Key:ref) | [string](../SpecialInputElements.md#string) | [](https://taginfo.openstreetmap.org/keys/name#values) [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | +[](https://taginfo.openstreetmap.org/keys/room#values) [room](https://wiki.openstreetmap.org/wiki/Key:room) | Multiple choice | [administration](https://wiki.openstreetmap.org/wiki/Tag:room%3Dadministration) [auditorium](https://wiki.openstreetmap.org/wiki/Tag:room%3Dauditorium) [bedroom](https://wiki.openstreetmap.org/wiki/Tag:room%3Dbedroom) [chapel](https://wiki.openstreetmap.org/wiki/Tag:room%3Dchapel) [class](https://wiki.openstreetmap.org/wiki/Tag:room%3Dclass) [computer](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcomputer) [conference](https://wiki.openstreetmap.org/wiki/Tag:room%3Dconference) [crypt](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcrypt) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:room%3Dkitchen) [laboratory](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlaboratory) [library](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlibrary) [locker](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlocker) [nursery](https://wiki.openstreetmap.org/wiki/Tag:room%3Dnursery) [office](https://wiki.openstreetmap.org/wiki/Tag:room%3Doffice) [prison_cell](https://wiki.openstreetmap.org/wiki/Tag:room%3Dprison_cell) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:room%3Drestaurant) [security_check](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsecurity_check) [sport](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsport) [storage](https://wiki.openstreetmap.org/wiki/Tag:room%3Dstorage) [technical](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtechnical) [toilets](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtoilets) [waiting](https://wiki.openstreetmap.org/wiki/Tag:room%3Dwaiting) +[](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | +[](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | @@ -86,6 +90,47 @@ This tagrendering has no question and is thus read-only +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level + + + +The question is *On what level is this feature located?* + +This rendering asks information about the property [level](https://wiki.openstreetmap.org/wiki/Key:level) + +This is rendered with `Located on the {level}th floor` + + + + + + - *Located underground* corresponds with `location=underground` + - This option cannot be chosen as answer + - *Located on the ground floor* corresponds with `level=0` + - *Located on the ground floor* corresponds with `` + - This option cannot be chosen as answer + - *Located on the first floor* corresponds with `level=1` + - *Located on the first basement level* corresponds with `level=-1` + + +This tagrendering has labels `level` + + + ### ref @@ -118,6 +163,74 @@ This tagrendering is only visible in the popup if the following condition is met +### room-type + + + +The question is *What type of room is this?* + + + + + + - *This is a administrative room* corresponds with `room=administration` + - *This is a auditorium* corresponds with `room=auditorium` + - *This is a bedroom* corresponds with `room=bedroom` + - *This is a chapel* corresponds with `room=chapel` + - *This is a classroom* corresponds with `room=class` + - *This is a classroom* corresponds with `room=classroom` + - This option cannot be chosen as answer + - *This is a computer room* corresponds with `room=computer` + - *This is a conference room* corresponds with `room=conference` + - *This is a crypt* corresponds with `room=crypt` + - *This is a kitchen* corresponds with `room=kitchen` + - *This is a laboratory* corresponds with `room=laboratory` + - *This is a library* corresponds with `room=library` + - *This is a locker room* corresponds with `room=locker` + - *This is a nursery* corresponds with `room=nursery` + - *This is an office* corresponds with `room=office` + - *This is a prison_cell* corresponds with `room=prison_cell` + - *This is a restaurant* corresponds with `room=restaurant` + - *This is a room to perform security checks* corresponds with `room=security_check` + - *This is a sport room* corresponds with `room=sport` + - *This is a storage room* corresponds with `room=storage` + - *This is a technical room* corresponds with `room=technical` + - *These are toilets* corresponds with `room=toilets` + - *This is a waiting room* corresponds with `room=waiting` + + + + +### room-capacity + + + +The question is *How much people can at most fit in this room?* + +This rendering asks information about the property [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) + +This is rendered with `At most {capacity} people fit this room` + + + +This tagrendering is only visible in the popup if the following condition is met: `room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom` + + + +### wikipedia-etymology + + + +The question is *What is the Wikidata-item that this object is named after?* + +This rendering asks information about the property [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) + +This is rendered with `

Wikipedia article of the name giver

{wikipedia(name:etymology:wikidata):max-height:20rem}` + + + + + ### leftover-questions diff --git a/Docs/Layers/medical-shops.md b/Docs/Layers/medical-shops.md index 36e0bce0d..2464db22e 100644 --- a/Docs/Layers/medical-shops.md +++ b/Docs/Layers/medical-shops.md @@ -384,7 +384,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -407,6 +421,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/parking.md b/Docs/Layers/parking.md index 1fcc04a39..6856d586d 100644 --- a/Docs/Layers/parking.md +++ b/Docs/Layers/parking.md @@ -88,7 +88,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -111,6 +125,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### parking-type diff --git a/Docs/Layers/picnic_table.md b/Docs/Layers/picnic_table.md index 807abbcd1..089627951 100644 --- a/Docs/Layers/picnic_table.md +++ b/Docs/Layers/picnic_table.md @@ -86,7 +86,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -109,6 +123,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### picnic_table-material diff --git a/Docs/Layers/railway_platforms.md b/Docs/Layers/railway_platforms.md index 5dc7387d1..9e9a075d8 100644 --- a/Docs/Layers/railway_platforms.md +++ b/Docs/Layers/railway_platforms.md @@ -74,7 +74,21 @@ This is rendered with `Platform {ref}` -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -97,6 +111,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### leftover-questions diff --git a/Docs/Layers/reception_desk.md b/Docs/Layers/reception_desk.md index f78d8e3e0..be0164aa8 100644 --- a/Docs/Layers/reception_desk.md +++ b/Docs/Layers/reception_desk.md @@ -85,7 +85,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -108,6 +122,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### desk-height diff --git a/Docs/Layers/school.md b/Docs/Layers/school.md index 1841a44f6..69d9c4859 100644 --- a/Docs/Layers/school.md +++ b/Docs/Layers/school.md @@ -15,6 +15,8 @@ Schools giving primary and secondary education and post-secondary, non-tertiary - This layer is shown at zoomlevel **12** and higher + - This layer will automatically load [school](./school.md) into the layout as it depends on it: a calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _enclosing) + - This layer is needed as dependency for layer [school](#school) diff --git a/Docs/Layers/shops.md b/Docs/Layers/shops.md index 551096faf..557b58c58 100644 --- a/Docs/Layers/shops.md +++ b/Docs/Layers/shops.md @@ -389,7 +389,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -412,6 +426,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/shops_with_climbing_shoe_repair.md b/Docs/Layers/shops_with_climbing_shoe_repair.md index 879540277..0ee5662e7 100644 --- a/Docs/Layers/shops_with_climbing_shoe_repair.md +++ b/Docs/Layers/shops_with_climbing_shoe_repair.md @@ -401,7 +401,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -424,6 +438,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/shower.md b/Docs/Layers/shower.md index b5551bce7..28edf884c 100644 --- a/Docs/Layers/shower.md +++ b/Docs/Layers/shower.md @@ -88,7 +88,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -111,6 +125,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### access diff --git a/Docs/Layers/sport_shops.md b/Docs/Layers/sport_shops.md index 17c61c236..75cb17865 100644 --- a/Docs/Layers/sport_shops.md +++ b/Docs/Layers/sport_shops.md @@ -384,7 +384,21 @@ The question is *Which methods of payment are accepted here?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -407,6 +421,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### copyshop-print-sizes diff --git a/Docs/Layers/surveillance_camera.md b/Docs/Layers/surveillance_camera.md index a03451ad8..d28122081 100644 --- a/Docs/Layers/surveillance_camera.md +++ b/Docs/Layers/surveillance_camera.md @@ -16,6 +16,7 @@ This layer shows surveillance cameras and allows a contributor to update informa - This layer is shown at zoomlevel **12** and higher - This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[1]) + - This layer will automatically load [walls_and_buildings](./walls_and_buildings.md) into the layout as it depends on it: a preset snaps to this layer (presets[3]) @@ -48,6 +49,7 @@ this quick overview is incomplete attribute | type | values which are supported by this layer ----------- | ------ | ------------------------------------------ [](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice | +[](https://taginfo.openstreetmap.org/keys/surveillance:type#values) [surveillance:type](https://wiki.openstreetmap.org/wiki/Key:surveillance:type) | Multiple choice | [camera](https://wiki.openstreetmap.org/wiki/Tag:surveillance:type%3Dcamera) [ALPR](https://wiki.openstreetmap.org/wiki/Tag:surveillance:type%3DALPR) [](https://taginfo.openstreetmap.org/keys/camera:type#values) [camera:type](https://wiki.openstreetmap.org/wiki/Key:camera:type) | Multiple choice | [fixed](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Dfixed) [dome](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Ddome) [panning](https://wiki.openstreetmap.org/wiki/Tag:camera:type%3Dpanning) [](https://taginfo.openstreetmap.org/keys/camera:direction#values) [camera:direction](https://wiki.openstreetmap.org/wiki/Key:camera:direction) | [direction](../SpecialInputElements.md#direction) | [](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | @@ -91,6 +93,22 @@ This tagrendering has no question and is thus read-only +### has_alpr + + + +The question is *Can this camera automatically detect license plates?* + + + + + + - *This is a camera without number plate recognition.* corresponds with `surveillance:type=camera` + - *This is an ALPR (Automatic License Plate Reader)* corresponds with `surveillance:type=ALPR` + + + + ### Camera type: fixed; panning; dome diff --git a/Docs/Layers/ticket_machine.md b/Docs/Layers/ticket_machine.md index 50ab62d9b..6c7baebf6 100644 --- a/Docs/Layers/ticket_machine.md +++ b/Docs/Layers/ticket_machine.md @@ -86,7 +86,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -109,6 +123,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### operator diff --git a/Docs/Layers/ticket_validator.md b/Docs/Layers/ticket_validator.md index 1449ab289..6779a03f5 100644 --- a/Docs/Layers/ticket_validator.md +++ b/Docs/Layers/ticket_validator.md @@ -73,7 +73,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -96,6 +110,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### barrier diff --git a/Docs/Layers/toilet.md b/Docs/Layers/toilet.md index c18ea698c..19e914f89 100644 --- a/Docs/Layers/toilet.md +++ b/Docs/Layers/toilet.md @@ -98,7 +98,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -121,6 +135,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### toilet-access diff --git a/Docs/Layers/toilet_at_amenity.md b/Docs/Layers/toilet_at_amenity.md index 761d80e99..0644230f1 100644 --- a/Docs/Layers/toilet_at_amenity.md +++ b/Docs/Layers/toilet_at_amenity.md @@ -95,7 +95,21 @@ This tagrendering has no question and is thus read-only -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -118,6 +132,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### toilet-access diff --git a/Docs/Layers/vending_machine.md b/Docs/Layers/vending_machine.md index 6034c6854..5e5300866 100644 --- a/Docs/Layers/vending_machine.md +++ b/Docs/Layers/vending_machine.md @@ -269,7 +269,21 @@ The question is *Is this vending machine indoors?* -### level +### repeated + + + +This tagrendering has no question and is thus read-only + + + +This tagrendering is only visible in the popup if the following condition is met: `repeat_on~.+` + +This tagrendering has labels `level` + + + +### single_level @@ -292,6 +306,8 @@ This is rendered with `Located on the {level}th floor` - *Located on the first basement level* corresponds with `level=-1` +This tagrendering has labels `level` + ### phone diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 6743c425f..1faec577e 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -110,8 +110,12 @@ In other words: use `{ "before": ..., "after": ..., "special": {"type": ..., "ar * [Example usage of image_carousel](#example-usage-of-image_carousel) + [image_upload](#image_upload) * [Example usage of image_upload](#example-usage-of-image_upload) - + [reviews](#reviews) - * [Example usage of reviews](#example-usage-of-reviews) + + [rating](#rating) + * [Example usage of rating](#example-usage-of-rating) + + [create_review](#create_review) + * [Example usage of create_review](#example-usage-of-create_review) + + [list_reviews](#list_reviews) + * [Example usage of list_reviews](#example-usage-of-list_reviews) + [opening_hours_table](#opening_hours_table) * [Example usage of opening_hours_table](#example-usage-of-opening_hours_table) + [live](#live) @@ -744,17 +748,49 @@ image_key | image,mapillary,image,wikidata,wikimedia_commons,image,image | The k name | default | description ------ | --------- | ------------- -image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added) -label | Add image | The text to show on the button +image-key | _undefined_ | Image tag to add the URL to (or image-tag:0, image-tag:1 when multiple images are added) +label | _undefined_ | The text to show on the button #### Example usage of image_upload - `{image_upload(image,Add image)}` + `{image_upload(,)}` -### reviews +### rating + + Shows stars which represent the avarage rating on mangrove.reviews + +name | default | description +------ | --------- | ------------- +subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] +fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value + + +#### Example usage of rating + + `{rating(name,)}` + + + +### create_review + + Invites the contributor to leave a review. Somewhat small UI-element until interacted + +name | default | description +------ | --------- | ------------- +subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] +fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value + + +#### Example usage of create_review + + `{create_review(name,)}` + + + +### list_reviews Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten @@ -764,7 +800,7 @@ subjectKey | name | The key to use to determine the subject. If specified, the s fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value -#### Example usage of reviews +#### Example usage of list_reviews `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used diff --git a/Docs/TagInfo/mapcomplete_benches.json b/Docs/TagInfo/mapcomplete_benches.json index 30ad200de..338a97a45 100644 --- a/Docs/TagInfo/mapcomplete_benches.json +++ b/Docs/TagInfo/mapcomplete_benches.json @@ -247,9 +247,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Benches') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Benches') Picking this answer will delete the key tourism.", "value": "" }, { diff --git a/Docs/TagInfo/mapcomplete_food.json b/Docs/TagInfo/mapcomplete_food.json index 315523e95..16e351db3 100644 --- a/Docs/TagInfo/mapcomplete_food.json +++ b/Docs/TagInfo/mapcomplete_food.json @@ -40,35 +40,6 @@ "key": "wikipedia", "description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Restaurants and fast food')" - }, - { - "key": "location", - "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Restaurants and fast food') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Restaurants and fast food')" @@ -126,6 +97,35 @@ "description": "Layer 'Restaurants and fast food' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Restaurants and fast food')" + }, + { + "key": "location", + "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Restaurants and fast food') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Restaurants and fast food')", diff --git a/Docs/TagInfo/mapcomplete_fritures.json b/Docs/TagInfo/mapcomplete_fritures.json index d6e655e01..c3de637cd 100644 --- a/Docs/TagInfo/mapcomplete_fritures.json +++ b/Docs/TagInfo/mapcomplete_fritures.json @@ -44,35 +44,6 @@ "key": "wikipedia", "description": "The layer 'Fries shop allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Fries shop' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Fries shops')" - }, - { - "key": "location", - "description": "Layer 'Fries shop' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Fries shops')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Fries shops') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Fries shop' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Fries shop' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Fries shops')" @@ -130,6 +101,35 @@ "description": "Layer 'Fries shop' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Fries shop' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Fries shops')" + }, + { + "key": "location", + "description": "Layer 'Fries shop' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Fries shops')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Fries shops') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Fries shop' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Fries shop' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Fries shops')", diff --git a/Docs/TagInfo/mapcomplete_indoors.json b/Docs/TagInfo/mapcomplete_indoors.json index 594b6fb25..b28e95e76 100644 --- a/Docs/TagInfo/mapcomplete_indoors.json +++ b/Docs/TagInfo/mapcomplete_indoors.json @@ -55,6 +55,35 @@ "key": "wikipedia", "description": "The layer 'Indoors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "level", + "description": "Layer 'Indoors' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Indoors')" + }, + { + "key": "location", + "description": "Layer 'Indoors' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Indoors')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Indoors') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "-1" + }, { "key": "ref", "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room|indoor=area|indoor=corridor)" @@ -63,6 +92,129 @@ "key": "name", "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Indoors') (This is only shown if indoor=room|indoor=area|indoor=corridor)" }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=administration with a fixed text, namely 'This is a administrative room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "administration" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=auditorium with a fixed text, namely 'This is a auditorium' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "auditorium" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=bedroom with a fixed text, namely 'This is a bedroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "bedroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=chapel with a fixed text, namely 'This is a chapel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "chapel" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=class with a fixed text, namely 'This is a classroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "class" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=classroom with a fixed text, namely 'This is a classroom' (in the mapcomplete.org theme 'Indoors')", + "value": "classroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=computer with a fixed text, namely 'This is a computer room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "computer" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=conference with a fixed text, namely 'This is a conference room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "conference" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=crypt with a fixed text, namely 'This is a crypt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "crypt" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=kitchen with a fixed text, namely 'This is a kitchen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "kitchen" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=laboratory with a fixed text, namely 'This is a laboratory' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "laboratory" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=library with a fixed text, namely 'This is a library' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "library" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=locker with a fixed text, namely 'This is a locker room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "locker" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=nursery with a fixed text, namely 'This is a nursery' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "nursery" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=office with a fixed text, namely 'This is an office' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "office" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=prison_cell with a fixed text, namely 'This is a prison_cell' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "prison_cell" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=restaurant with a fixed text, namely 'This is a restaurant' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "restaurant" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=security_check with a fixed text, namely 'This is a room to perform security checks' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "security_check" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=sport with a fixed text, namely 'This is a sport room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "sport" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=storage with a fixed text, namely 'This is a storage room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "storage" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=technical with a fixed text, namely 'This is a technical room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "technical" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=toilets with a fixed text, namely 'These are toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "toilets" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=waiting with a fixed text, namely 'This is a waiting room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors')", + "value": "waiting" + }, + { + "key": "capacity", + "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Indoors') (This is only shown if room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom)" + }, + { + "key": "name:etymology:wikidata", + "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Indoors') (This is only shown if name:etymology!=unknown)" + }, { "key": "highway", "description": "The MapComplete theme Indoors has a layer Pedestrian paths showing features with this tag", diff --git a/Docs/TagInfo/mapcomplete_nature.json b/Docs/TagInfo/mapcomplete_nature.json index 4fd740c19..d6a050921 100644 --- a/Docs/TagInfo/mapcomplete_nature.json +++ b/Docs/TagInfo/mapcomplete_nature.json @@ -668,9 +668,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Into nature') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Into nature') Picking this answer will delete the key tourism.", "value": "" }, { diff --git a/Docs/TagInfo/mapcomplete_onwheels.json b/Docs/TagInfo/mapcomplete_onwheels.json index 97ce2f8c7..4b030a3fc 100644 --- a/Docs/TagInfo/mapcomplete_onwheels.json +++ b/Docs/TagInfo/mapcomplete_onwheels.json @@ -550,35 +550,6 @@ "key": "wikipedia", "description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'OnWheels')" - }, - { - "key": "location", - "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'OnWheels')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'OnWheels') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'OnWheels')" @@ -636,6 +607,35 @@ "description": "Layer 'Restaurants and fast food' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'OnWheels')" + }, + { + "key": "location", + "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'OnWheels')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'OnWheels') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", diff --git a/Docs/TagInfo/mapcomplete_personal.json b/Docs/TagInfo/mapcomplete_personal.json index 06ef64b47..09d70051e 100644 --- a/Docs/TagInfo/mapcomplete_personal.json +++ b/Docs/TagInfo/mapcomplete_personal.json @@ -979,9 +979,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key tourism.", "value": "" }, { @@ -7305,35 +7310,6 @@ "key": "wikipedia", "description": "The layer 'Restaurants and fast food allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "location", - "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Personal theme')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme')" @@ -7391,6 +7367,35 @@ "description": "Layer 'Restaurants and fast food' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "location", + "description": "Layer 'Restaurants and fast food' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Personal theme')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Restaurants and fast food' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Restaurants and fast food' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", @@ -8383,6 +8388,35 @@ "key": "wikipedia", "description": "The layer 'Indoors allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "level", + "description": "Layer 'Indoors' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "location", + "description": "Layer 'Indoors' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Personal theme')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Personal theme') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Indoors' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "-1" + }, { "key": "ref", "description": "Layer 'Indoors' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room|indoor=area|indoor=corridor)" @@ -8391,6 +8425,129 @@ "key": "name", "description": "Layer 'Indoors' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme') (This is only shown if indoor=room|indoor=area|indoor=corridor)" }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=administration with a fixed text, namely 'This is a administrative room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "administration" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=auditorium with a fixed text, namely 'This is a auditorium' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "auditorium" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=bedroom with a fixed text, namely 'This is a bedroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "bedroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=chapel with a fixed text, namely 'This is a chapel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "chapel" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=class with a fixed text, namely 'This is a classroom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "class" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=classroom with a fixed text, namely 'This is a classroom' (in the mapcomplete.org theme 'Personal theme')", + "value": "classroom" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=computer with a fixed text, namely 'This is a computer room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "computer" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=conference with a fixed text, namely 'This is a conference room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "conference" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=crypt with a fixed text, namely 'This is a crypt' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "crypt" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=kitchen with a fixed text, namely 'This is a kitchen' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "kitchen" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=laboratory with a fixed text, namely 'This is a laboratory' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "laboratory" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=library with a fixed text, namely 'This is a library' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "library" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=locker with a fixed text, namely 'This is a locker room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "locker" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=nursery with a fixed text, namely 'This is a nursery' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "nursery" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=office with a fixed text, namely 'This is an office' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "office" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=prison_cell with a fixed text, namely 'This is a prison_cell' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "prison_cell" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=restaurant with a fixed text, namely 'This is a restaurant' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "restaurant" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=security_check with a fixed text, namely 'This is a room to perform security checks' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "security_check" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=sport with a fixed text, namely 'This is a sport room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "sport" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=storage with a fixed text, namely 'This is a storage room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "storage" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=technical with a fixed text, namely 'This is a technical room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "technical" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=toilets with a fixed text, namely 'These are toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "toilets" + }, + { + "key": "room", + "description": "Layer 'Indoors' shows room=waiting with a fixed text, namely 'This is a waiting room' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "waiting" + }, + { + "key": "capacity", + "description": "Layer 'Indoors' shows and asks freeform values for key 'capacity' (in the mapcomplete.org theme 'Personal theme') (This is only shown if room=waiting|room=restaurant|room=office|room=nursery|room=conference|room=auditorium|room=chapel|room=bedroom|room=classroom)" + }, + { + "key": "name:etymology:wikidata", + "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology!=unknown)" + }, { "key": "information", "description": "The MapComplete theme Personal theme has a layer Information boards showing features with this tag", @@ -12686,6 +12843,16 @@ "key": "wikipedia", "description": "The layer 'Surveillance camera's allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=camera with a fixed text, namely 'This is a camera without number plate recognition.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "camera" + }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=ALPR with a fixed text, namely 'This is an ALPR (Automatic License Plate Reader)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "ALPR" + }, { "key": "camera:type", "description": "Layer 'Surveillance camera's' shows camera:type=fixed with a fixed text, namely 'A fixed (non-moving) camera' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", diff --git a/Docs/TagInfo/mapcomplete_pets.json b/Docs/TagInfo/mapcomplete_pets.json index 22b0186f7..16f805568 100644 --- a/Docs/TagInfo/mapcomplete_pets.json +++ b/Docs/TagInfo/mapcomplete_pets.json @@ -114,35 +114,6 @@ "key": "wikipedia", "description": "The layer 'Dog friendly eateries allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')" - }, - { - "key": "location", - "description": "Layer 'Dog friendly eateries' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "underground" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "0" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') Picking this answer will delete the key level.", - "value": "" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "1" - }, - { - "key": "level", - "description": "Layer 'Dog friendly eateries' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", - "value": "-1" - }, { "key": "name", "description": "Layer 'Dog friendly eateries' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')" @@ -200,6 +171,35 @@ "description": "Layer 'Dog friendly eateries' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", "value": "yes" }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows and asks freeform values for key 'level' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')" + }, + { + "key": "location", + "description": "Layer 'Dog friendly eateries' shows location=underground with a fixed text, namely 'Located underground' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "underground" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows level=0 with a fixed text, namely 'Located on the ground floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "0" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows with a fixed text, namely 'Located on the ground floor' (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities') Picking this answer will delete the key level.", + "value": "" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows level=1 with a fixed text, namely 'Located on the first floor' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "1" + }, + { + "key": "level", + "description": "Layer 'Dog friendly eateries' shows level=-1 with a fixed text, namely 'Located on the first basement level' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", + "value": "-1" + }, { "key": "wheelchair", "description": "Layer 'Dog friendly eateries' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Veterinarians, dog parks and other pet-amenities')", diff --git a/Docs/TagInfo/mapcomplete_playgrounds.json b/Docs/TagInfo/mapcomplete_playgrounds.json index 8f2e64beb..92903d04a 100644 --- a/Docs/TagInfo/mapcomplete_playgrounds.json +++ b/Docs/TagInfo/mapcomplete_playgrounds.json @@ -340,9 +340,14 @@ "description": "Layer 'Benches' shows tourism=artwork with a fixed text, namely 'This bench has an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", "value": "artwork" }, + { + "key": "not:tourism:artwork", + "description": "Layer 'Benches' shows not:tourism:artwork=yes with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds')", + "value": "yes" + }, { "key": "tourism", - "description": "Layer 'Benches' shows with a fixed text, namely 'This bench does not have an integrated artwork' and allows to pick this as a default answer (in the mapcomplete.org theme 'Playgrounds') Picking this answer will delete the key tourism.", + "description": "Layer 'Benches' shows with a fixed text, namely 'This bench probably doesn't have an integrated artwork' (in the mapcomplete.org theme 'Playgrounds') Picking this answer will delete the key tourism.", "value": "" }, { diff --git a/Docs/TagInfo/mapcomplete_surveillance.json b/Docs/TagInfo/mapcomplete_surveillance.json index 5648fa720..c81f266a6 100644 --- a/Docs/TagInfo/mapcomplete_surveillance.json +++ b/Docs/TagInfo/mapcomplete_surveillance.json @@ -50,6 +50,16 @@ "key": "wikipedia", "description": "The layer 'Surveillance camera's allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=camera with a fixed text, namely 'This is a camera without number plate recognition.' and allows to pick this as a default answer (in the mapcomplete.org theme 'Surveillance under Surveillance')", + "value": "camera" + }, + { + "key": "surveillance:type", + "description": "Layer 'Surveillance camera's' shows surveillance:type=ALPR with a fixed text, namely 'This is an ALPR (Automatic License Plate Reader)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Surveillance under Surveillance')", + "value": "ALPR" + }, { "key": "camera:type", "description": "Layer 'Surveillance camera's' shows camera:type=fixed with a fixed text, namely 'A fixed (non-moving) camera' and allows to pick this as a default answer (in the mapcomplete.org theme 'Surveillance under Surveillance')", diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index 7f88f3f50..a4e2da5bc 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -346,7 +346,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L199) - The default value is _osm_ + No default value set diff --git a/assets/layers/barrier/barrier.json b/assets/layers/barrier/barrier.json index f6c9cfab5..f3112f601 100644 --- a/assets/layers/barrier/barrier.json +++ b/assets/layers/barrier/barrier.json @@ -190,7 +190,7 @@ "da": "En cyklist kan ikke cykle forbi denne.", "es": "Un ciclista no puede pasar esto.", "cs": "Cyklista tudy nemůže projet.", - "ca": "Un ciclista pot passar-hi." + "ca": "Un ciclista no pot passar-hi." } } ], diff --git a/assets/layers/bench/bench.json b/assets/layers/bench/bench.json index 9bea58a07..7c69a231f 100644 --- a/assets/layers/bench/bench.json +++ b/assets/layers/bench/bench.json @@ -925,7 +925,9 @@ "if": "tourism=", "then": { "en": "This bench probably doesn't have an integrated artwork", - "nl": "Deze bank heeft waarschijnlijk geen geïntegreerd kunstwerk" + "nl": "Deze bank heeft waarschijnlijk geen geïntegreerd kunstwerk", + "ca": "Aquest banc probablement no té cap obra d'art integrada", + "de": "Die Bank hat vermutlich kein integriertes Kunstwerk" }, "hideInAnswer": true } diff --git a/assets/layers/birdhide/birdhide.json b/assets/layers/birdhide/birdhide.json index a1a1b9e77..897ba0d1b 100644 --- a/assets/layers/birdhide/birdhide.json +++ b/assets/layers/birdhide/birdhide.json @@ -71,7 +71,8 @@ "nl": "Vogelkijkwand {name}", "de": "Vogelversteck {name}", "fr": "Camouflage d’observation ornithologique {name}", - "da": "Fugletårn {name}" + "da": "Fugletårn {name}", + "ca": "Observatori d'ocells {name}" } } ] @@ -109,7 +110,8 @@ "nl": "Vogelkijkwand", "de": "Sichtschutz zur Vogelbeobachtung", "fr": "Camouflage d’observation ornithologique", - "da": "Fugletårn" + "da": "Fugletårn", + "ca": "Observatori d'ocells" } }, { @@ -171,7 +173,8 @@ "nl": "Is deze vogelkijkplaats rolstoeltoegankelijk?", "da": "Er dette fugleskjul tilgængeligt for kørestolsbrugere?", "de": "Ist der Ort rollstuhlgerecht gestaltet?", - "fr": "Cet observatoire ornithologique est-il accessible en chaise roulante ?" + "fr": "Cet observatoire ornithologique est-il accessible en chaise roulante ?", + "ca": "Aquest observatori d'ocells és accessible per als usuaris de cadira de rodes?" }, "mappings": [ { diff --git a/assets/layers/charging_station/charging_station.json b/assets/layers/charging_station/charging_station.json index 62361dea1..174b24c58 100644 --- a/assets/layers/charging_station/charging_station.json +++ b/assets/layers/charging_station/charging_station.json @@ -5294,4 +5294,4 @@ }, "neededChangesets": 10 } -} +} \ No newline at end of file diff --git a/assets/layers/climbing_route/climbing_route.json b/assets/layers/climbing_route/climbing_route.json index 2183d5370..770181dcf 100644 --- a/assets/layers/climbing_route/climbing_route.json +++ b/assets/layers/climbing_route/climbing_route.json @@ -7,7 +7,8 @@ "ja": "登坂ルート", "nb_NO": "Klatreruter", "fr": "Voies d’escalade", - "it": "Vie di arrampicata" + "it": "Vie di arrampicata", + "ca": "Rutes d'escalada" }, "description": { "en": "A single climbing route and its properties. Some properties are derived from the containing features", @@ -32,7 +33,8 @@ "nb_NO": "Klatrerute", "it": "Via di arrampicata", "fr": "Voie d’escalade", - "da": "Klatrerute" + "da": "Klatrerute", + "ca": "Ruta d'escalada" }, "mappings": [ { @@ -44,7 +46,8 @@ "ja": "登坂ルート{name}", "it": "Via di arrampicata {name}", "fr": "Voie d’escalade {name}", - "da": "Klatrerute {name}" + "da": "Klatrerute {name}", + "ca": "Ruta d'escalada {name}" } } ] @@ -73,7 +76,8 @@ "it": "Come si chiama questa via di arrampicata?", "fr": "Quel est le nom de cette voie d’escalade ?", "nb_NO": "Hva er navnet på denne klatreruten?", - "da": "Hvad hedder denne klatrerute?" + "da": "Hvad hedder denne klatrerute?", + "ca": "Quin és el nom d'aquesta ruta d'escalada?" }, "freeform": { "key": "name" @@ -108,7 +112,8 @@ "fr": "Quelle est la longueur de cette voie (en mètres) ?", "de": "Wie lang ist diese Kletterroute (in Metern)?", "nb_NO": "Hvor mange meter er klatreruten?", - "da": "Hvor lang er denne klatrerute (i meter)?" + "da": "Hvor lang er denne klatrerute (i meter)?", + "ca": "Quant dura aquesta via d'escalada (en metres)?" }, "render": { "de": "Diese Route ist {canonical(climbing:length)} lang", @@ -131,7 +136,8 @@ "nl": "Hoe moeilijk is deze klimroute volgens het Franse/Belgische systeem?", "it": "Qual è la difficoltà di questa via di arrampicata nel sistema francese/belga?", "fr": "Quelle est la difficulté de cette voie selon le système franco-belge ?", - "de": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?" + "de": "Wie hoch ist der Schwierigkeitsgrad dieser Kletterroute nach dem französisch/belgischen System?", + "ca": "Quin és el grau d'aquesta via d'escalada segons el sistema francès/belga?" }, "render": { "de": "Die Schwierigkeit ist {climbing:grade:french} entsprechend des französisch/belgischen Systems", @@ -208,7 +214,8 @@ "nl": "een klimroute", "fr": "une voie d’escalade", "de": "eine Kletterroute", - "it": "una via di arrampicata" + "it": "una via di arrampicata", + "ca": "una ruta d'escalada" }, "snapToLayer": [ "climbing_opportunity" diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json index 9cad9e3c4..84e500529 100644 --- a/assets/layers/crossings/crossings.json +++ b/assets/layers/crossings/crossings.json @@ -438,7 +438,8 @@ "en": "Does this traffic light have vibration signals to aid crossing? (usually located at the bottom of the crossing button)", "de": "Gibt die Ampel ein Vibrationssignal, um das Überqueren zu erleichtern? (in der Regel am unteren Ende der Ampeltaste)", "nl": "Heeft dit verkeerslicht een element dat trilt om te helpen bij het oversteken? (meestal onderaan de oversteekknop geplaatst)", - "fr": "Est-ce que ce feu a un signal vibrant pour aider à traverser ? (habituellement situé sous le bouton)" + "fr": "Est-ce que ce feu a un signal vibrant pour aider à traverser ? (habituellement situé sous le bouton)", + "ca": "Aquest semàfor té senyals de vibració per facilitar el pas? (normalment es troba a la part inferior del botó d'encreuament)" }, "condition": { "and": [ @@ -453,7 +454,8 @@ "en": "The button for this traffic light has a vibration signal to indicate that it is safe to cross.", "de": "Die Ampeltaste vibriert während der Grünphase.", "nl": "De knop bij dit verkeerslicht trilt om aan te geven dat men veilig kan oversteken.", - "fr": "Le bouton de ce feu vibre pour indiquer qu'on peut traverser en sécurité." + "fr": "Le bouton de ce feu vibre pour indiquer qu'on peut traverser en sécurité.", + "ca": "El botó d'aquest semàfor té un senyal de vibració per indicar que és segur creuar." }, "icon": { "path": "./assets/layers/crossings/Vibrating_button_illustration.jpg", @@ -466,7 +468,8 @@ "en": "The button for this traffic light does not have a vibration signal to indicate that it is safe to cross.", "de": "Die Ampeltaste vibriert nicht während der Grünphase.", "nl": "De knop bij dit verkeerslicht kan niet trillen om aan te geven dat men veilig kan oversteken.", - "fr": "Le bouton de ce feu ne vibre pas pour indiquer qu'on peut traverser en sécurité." + "fr": "Le bouton de ce feu ne vibre pas pour indiquer qu'on peut traverser en sécurité.", + "ca": "El botó d'aquest semàfor no té cap senyal de vibració que indiqui que és segur creuar." } } ] diff --git a/assets/layers/cycleways_and_roads/cycleways_and_roads.json b/assets/layers/cycleways_and_roads/cycleways_and_roads.json index 458573007..3dc0d7350 100644 --- a/assets/layers/cycleways_and_roads/cycleways_and_roads.json +++ b/assets/layers/cycleways_and_roads/cycleways_and_roads.json @@ -577,7 +577,8 @@ "nl": "Dit fietspad is gemaakt van straatstenen", "de": "Dieser Fahrradweg besteht aus ebenen Pflastersteinen", "es": "Este carril bici está hecho de piedras de pavimento suaves", - "fr": "Cette piste cyclable est faite de petits pavés" + "fr": "Cette piste cyclable est faite de petits pavés", + "ca": "Aquesta via ciclista està feta de pedres de paviment suaus" } }, { @@ -597,7 +598,8 @@ "en": "This cycleway is made of cobblestone (unhewn or sett)", "nl": "Dit fietspad is gemaakt van kasseien (natuurlijk of verwerkt)", "de": "Dieser Radweg besteht aus Kopfsteinpflaster", - "fr": "Cette piste cyclable est faite de pavés (taillé ou non)" + "fr": "Cette piste cyclable est faite de pavés (taillé ou non)", + "ca": "Aquesta via ciclista està feta de llambordes (sense tallar o muntar)" }, "hideInAnswer": true }, @@ -607,7 +609,8 @@ "en": "This cycleway is made of raw, natural cobblestone", "nl": "Dit fietspad is gemaakt van ruwe, natuurlijke kasseien", "de": "Dieser Fahrradweg besteht aus unregelmäßigem, unbehauenem Kopfsteinpflaster", - "fr": "Cette piste cyclable est en pavés bruts et naturels" + "fr": "Cette piste cyclable est en pavés bruts et naturels", + "ca": "Aquesta via ciclista està feta de llambordes naturals" } }, { @@ -616,7 +619,8 @@ "en": "This cycleway is made of flat, square cobblestone", "nl": "Dit fietspad is gemaakt van vlakke, rechthoekige kasseien", "de": "Dieser Fahrradweg besteht aus regelmäßigem, behauenem Kopfsteinpflaster", - "fr": "Cette piste cyclable est en pavés plats ou carrés" + "fr": "Cette piste cyclable est en pavés plats ou carrés", + "ca": "Aquesta via ciclista està feta de llamborda plana i quadrada" } }, { @@ -637,7 +641,8 @@ "nl": "Dit fietspad is gemaakt van grind", "de": "Der Radweg ist aus Schotter", "es": "Este carril bici está hecho de grava", - "fr": "Cette piste cyclable est faite en graviers" + "fr": "Cette piste cyclable est faite en graviers", + "ca": "Aquesta via ciclista està feta de grava" } }, { @@ -647,7 +652,8 @@ "nl": "Dit fietspad is gemaakt van fijn grind", "de": "Dieser Radweg besteht aus feinem Schotter", "es": "Este carril bici está hecho de gravilla", - "fr": "Cette piste cyclable est faite en graviers fins" + "fr": "Cette piste cyclable est faite en graviers fins", + "ca": "Aquesta via ciclista està feta de grava fina" } }, { @@ -686,7 +692,8 @@ "nl": "Wat is de kwaliteit van dit fietspad?", "de": "Wie eben ist dieser Radweg?", "es": "¿Cual es la suavidad de este carril bici?", - "fr": "Quel est l'état de la piste cyclable ?" + "fr": "Quel est l'état de la piste cyclable ?", + "ca": "Quina és la suavitat d'aquesta via ciclista?" }, "condition": { "or": [ diff --git a/assets/layers/elevator/elevator.json b/assets/layers/elevator/elevator.json index 4a00a45ce..af6b24e5f 100644 --- a/assets/layers/elevator/elevator.json +++ b/assets/layers/elevator/elevator.json @@ -165,19 +165,22 @@ { "id": "tactile_writing_available", "question": { - "en": "Has this elevator tactile writing?" + "en": "Has this elevator tactile writing?", + "ca": "Aquest ascensor té escriptura tàctil?" }, "mappings": [ { "if": "tactile_writing:braille=yes", "then": { - "en": "This elevator has tactile writing in Braille" + "en": "This elevator has tactile writing in Braille", + "ca": "L'ascensor té escriptura tàctil en Braille" } }, { "if": "tactile_writing:braille=no", "then": { - "en": "This elevator does not have tactile writing" + "en": "This elevator does not have tactile writing", + "ca": "Aquest ascensor no té escriptura tàctil" } } ] @@ -218,7 +221,8 @@ }, "questionHint": { "en": "E.g. it announces the current floor", - "de": "Z.B. werden Stockwerke angesagt" + "de": "Z.B. werden Stockwerke angesagt", + "ca": "P. e. anuncia la planta actual" }, "mappings": [ { diff --git a/assets/layers/elongated_coin/elongated_coin.json b/assets/layers/elongated_coin/elongated_coin.json index 872bb92a3..d7276f390 100644 --- a/assets/layers/elongated_coin/elongated_coin.json +++ b/assets/layers/elongated_coin/elongated_coin.json @@ -2,13 +2,13 @@ "id": "elongated_coin", "name": { "en": "Penny Presses", - "de": "Münzpressen", + "de": "Münzprägeautomaten", "es": "Prensas de centavo", "ca": "Premses de cèntims" }, "description": { "en": "Layer showing penny presses.", - "de": "Ebene mit Münzpressen.", + "de": "Ebene mit Münzprägeautomaten.", "es": "Capa que muestra prensas de centavos.", "ca": "Capa que mostra premses de cèntims." }, @@ -23,7 +23,7 @@ "title": { "render": { "en": "Penny Press", - "de": "Münzpresse", + "de": "Prägeautomat", "es": "Prensa de centavo", "ca": "Premsa de cèntims" } @@ -51,7 +51,7 @@ }, "render": { "en": "This penny press has {coin:design_count} designs available.", - "de": "Die Münzpresse hat {coin:design_count} Motive zur Auswahl.", + "de": "Der Prägeautomat hat {coin:design_count} Motive zur Auswahl.", "es": "Esta prensa tiene {coin:design_count} diseños disponibles.", "ca": "Esta premsa té {coin:design_count} dissenys disponibles." }, @@ -60,7 +60,7 @@ "if": "coin:design_count=1", "then": { "en": "This penny press has one design available.", - "de": "Die Münzpresse hat ein Motiv zur Auswahl.", + "de": "Der Prägeautomat hat ein Motiv zur Auswahl.", "es": "Esta prensa tiene un diseño disponible.", "ca": "Esta premsa té un disseny disponible." } @@ -69,7 +69,7 @@ "if": "coin:design_count=2", "then": { "en": "This penny press has two designs available.", - "de": "Die Münzpresse hat zwei Motive zur Auswahl.", + "de": "Der Prägeautomat hat zwei Motive zur Auswahl.", "es": "Esta prensa tiene dos diseños disponibles.", "ca": "Esta premsa té dos dissenys disponibles." } @@ -78,7 +78,7 @@ "if": "coin:design_count=3", "then": { "en": "This penny press has three designs available.", - "de": "Die Münzpresse hat drei Motive zur Auswahl.", + "de": "Der Prägeautomat hat drei Motive zur Auswahl.", "es": "Esta prensa tiene tres diseños disponibles.", "ca": "Esta premsa té tres dissenys disponibles." } @@ -87,7 +87,7 @@ "if": "coin:design_count=4", "then": { "en": "This penny press has four designs available.", - "de": "Die Münzpresse hat vier Motive zur Auswahl.", + "de": "Der Prägeautomat hat vier Motive zur Auswahl.", "es": "Esta prensa tiene cuatro diseños disponibles.", "ca": "Esta premsa té quatre dissenys disponibles." } @@ -97,25 +97,33 @@ { "id": "fee", "question": { - "en": "Does it cost money to press a penny?" + "en": "Does it cost money to press a penny?", + "ca": "Costa diners premsar una moneda?", + "de": "Ist das Prägen kostenpflichtig?" }, "mappings": [ { "if": "fee=", "then": { - "en": "It costs money to press a penny." + "en": "It costs money to press a penny.", + "ca": "Costa diners premsar una moneda.", + "de": "Das Prägen ist kostenpflichtig." } }, { "if": "fee=yes", "then": { - "en": "It costs money to press a penny." + "en": "It costs money to press a penny.", + "ca": "Costa diners premsar una moneda.", + "de": "Das Prägen ist kostenpflichtig." } }, { "if": "fee=no", "then": { - "en": "It is free to press a penny." + "en": "It is free to press a penny.", + "ca": "És gratuït premsar una moneda.", + "de": "Das Prägen ist kostenlos." }, "addExtraTags": [ "payment:qr_code=", @@ -142,7 +150,7 @@ "id": "coin", "question": { "en": "What coin is used for pressing?", - "de": "Welche Münze wird zum Pressen verwendet?", + "de": "Welche Münzen können geprägt werden?", "es": "Qué moneda se utiliza para prensar?", "ca": "Quina moneda s'utilitza per a premsar?" }, @@ -162,7 +170,7 @@ "if": "coin:type=2cent", "then": { "en": "This penny press uses a 2 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 2 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 2 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 2 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 2 cèntims per a premsar." }, @@ -177,7 +185,7 @@ "if": "coin:type=5cent", "then": { "en": "This penny press uses a 5 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 5 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 5 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 5 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 5 cèntims per a premsar." }, @@ -192,7 +200,7 @@ "if": "coin:type=10cent", "then": { "en": "This penny press uses a 10 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 10 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 10 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 10 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 10 cèntims per a premsar." }, @@ -207,7 +215,7 @@ "if": "coin:type=25cent", "then": { "en": "This penny press uses a 25 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 25 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 25 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 25 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 20 cèntims per a premsar." }, @@ -217,7 +225,7 @@ "if": "coin:type=50cent", "then": { "en": "This penny press uses a 50 cent coin for pressing.", - "de": "Die Münzpresse benötigt eine 50 Cent Münze um zu Pressen.", + "de": "Der Automat prägt 50 Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda de 50 centavos para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de 50 cèntims per a premsar." }, @@ -226,21 +234,25 @@ { "if": "coin:type=10centimes", "then": { - "en": "This penny press uses a 10 centimes coin for pressing." + "en": "This penny press uses a 10 centimes coin for pressing.", + "ca": "Esta premsa de cèntims utilitza una moneda de 10 cèntims per a premsar.", + "de": "Der Automat prägt 10 Centime Münzen." }, "hideInAnswer": "_currency!~.*CHF.*" }, { "if": "coin:type=20centimes", "then": { - "en": "This penny press uses a 20 centimes coin for pressing." + "en": "This penny press uses a 20 centimes coin for pressing.", + "ca": "Esta premsa de cèntims utilitza una moneda de 20 cèntims per a premsar.", + "de": "Der Automat prägt 5 Centime Münzen." }, "hideInAnswer": "_currency!~.*CHF.*" } ], "render": { "en": "This penny press uses a {coin:type} coin for pressing.", - "de": "Die Münzpresse benötigt eine {coin:type} Münze um zu Pressen.", + "de": "Der Automat prägt {coin:type} Cent Münzen.", "es": "Esta prensa de centavo utiliza una moneda {coin:type} para prensar.", "ca": "Esta premsa de cèntims utilitza una moneda de {coin:type} per a premsar." } @@ -256,7 +268,7 @@ }, "question": { "en": "How much does it cost to press a penny?", - "de": "Wieviel kostet es eine Münze zu Pressen?", + "de": "Wieviel kostet die Prägung einer Münze?", "es": "¿Cuánto cuesta prensar un centavo?", "ca": "Quant costa premsar un cèntim?" }, @@ -264,7 +276,7 @@ "key": "charge", "placeholder": { "en": "Cost (e.g. 0.50 EUR)", - "de": "Einwurf (z.B. 0,5€)", + "de": "Gebühr (z.B. 0,50 €)", "fr": "Coût (par ex. 0.50 EUR)", "es": "Costo (por ejemplo, 0.50 euros)", "ca": "Cost (p. e, 0.50 euros)" @@ -275,7 +287,7 @@ "if": "charge=1 EUR", "then": { "en": "It costs 1 euro to press a penny.", - "de": "Eine Münze zu Pressen kostet 1 Euro.", + "de": "Die Prägung einer Münze kostet 1,00 €.", "es": "Cuesta 1 euro prensar un centavo.", "ca": "Costa 1 euro premsar un cèntim." }, @@ -285,7 +297,7 @@ "if": "charge=2 EUR", "then": { "en": "It costs 2 euros to press a penny.", - "de": "Eine Münze zu Pressen kostet 2€.", + "de": "Die Prägung einer Münze kostet 2,00 €.", "es": "Cuesta 2 euros prensa un centavo.", "ca": "Costa 2 euros premsar un cèntim." }, @@ -294,21 +306,25 @@ { "if": "charge=2 CHF", "then": { - "en": "It costs 2 Swiss francs to press a penny." + "en": "It costs 2 Swiss francs to press a penny.", + "ca": "Costa 2 francs suïssos premsar un cèntim.", + "de": "Die Prägung einer Münze kostet 2 Schweizer Franken." }, "hideInAnswer": "_currency!~.*CHF.*" }, { "if": "charge=1 CHF", "then": { - "en": "It costs 1 Swiss franc to press a penny." + "en": "It costs 1 Swiss franc to press a penny.", + "ca": "Costa 1 franc suís premsar un cèntim.", + "de": "Die Prägung einer Münze kostet 1 Schweizer Franken." }, "hideInAnswer": "_currency!~.*CHF.*" } ], "render": { "en": "It costs {charge} to press a penny.", - "de": "Es kostet {charge}€ um eine Münze zu Pressen.", + "de": "Die Prägung einer Münze kostet {charge}.", "es": "Cuesta {charge} prensar un centavo.", "ca": "Costa {charge} premsar un cèntim." } @@ -318,7 +334,7 @@ "id": "indoor", "question": { "en": "Is the penny press indoors?", - "de": "Befindet sich die Münzpresse im Inneren?", + "de": "Befindet sich der Prägeautomat im Inneren?", "es": "La prensa de centavo esta al interior?", "ca": "La premsa de cèntims està a l'interior?" }, @@ -327,7 +343,7 @@ "if": "indoor=yes", "then": { "en": "This penny press is located indoors.", - "de": "Die Münzpresse befindet sich im Inneren.", + "de": "Der Prägeautomat befindet sich im Inneren.", "es": "Esta prensa está ubicada en interior.", "ca": "Esta premsa està ubicada en interior." } @@ -336,7 +352,7 @@ "if": "indoor=no", "then": { "en": "This penny press is located outdoors.", - "de": "Die Münzpresse befindet sich Draußen.", + "de": "Der Prägeautomat befindet sich im Freien.", "es": "Esta prensa está ubicada al aire libre.", "ca": "Esta premsa està ubicada a l'exterior." } @@ -365,7 +381,7 @@ { "title": { "en": "a penny press", - "de": "Eine Münzpresse", + "de": "Einen Münzprägeautomaten", "es": "una prensa de centavo", "ca": "una premsa de cèntim" }, diff --git a/assets/layers/etymology/etymology.json b/assets/layers/etymology/etymology.json index aee734eda..bb6dd7dc1 100644 --- a/assets/layers/etymology/etymology.json +++ b/assets/layers/etymology/etymology.json @@ -46,7 +46,7 @@ }, { "id": "wikipedia-etymology", - "condition": "name~*", + "condition": "name:etymology!=unknown", "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?", @@ -165,8 +165,7 @@ "de": "

Wikipedia Artikel zur Namensherkunft

{wikipedia(name:etymology:wikidata):max-height:20rem}", "fr": "

Article Wikipedia de la référence au nom

{wikipedia(name:etymology:wikidata):max-height:20rem}", "ca": "

Article de la Viquipèdia del nom donant

{wikipedia(name:etymology:wikidata):max-height:20rem}" - }, - "condition": "name:etymology!=unknown" + } }, { "id": "zoeken op inventaris onroerend erfgoed", diff --git a/assets/layers/filters/filters.json b/assets/layers/filters/filters.json index 551ef6897..8d7dc27d1 100644 --- a/assets/layers/filters/filters.json +++ b/assets/layers/filters/filters.json @@ -233,7 +233,8 @@ "nl": "Gratis toegankelijk", "de": "Nutzung kostenlos", "fr": "Utilisation gratuite", - "da": "Gratis at bruge" + "da": "Gratis at bruge", + "ca": "Ús gratuït" }, "osmTags": { "or": [ diff --git a/assets/layers/fitness_station/fitness_station.json b/assets/layers/fitness_station/fitness_station.json index 1166f1638..ed5668e8c 100644 --- a/assets/layers/fitness_station/fitness_station.json +++ b/assets/layers/fitness_station/fitness_station.json @@ -130,7 +130,8 @@ "if": "fitness_station=stretch_bars", "then": { "en": "This fitness station has bars for stretching.", - "de": "Die Fitness-Station hat Stangen zum Dehnen." + "de": "Die Fitness-Station hat Stangen zum Dehnen.", + "ca": "Aquesta estació de fitness disposa de barres per fer estiraments." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_stretch_bars.jpg", @@ -141,7 +142,8 @@ "if": "fitness_station=hyperextension", "then": { "en": "This fitness station has a station for making hyperextensions.", - "de": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." + "de": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions).", + "ca": "Aquesta estació de fitness disposa d'una estació per fer hiperextensions." }, "icon": { "path": "./assets/layers/fitness_station/Inclined_sit-up_and_hyperextension_bench.jpg", @@ -152,7 +154,8 @@ "if": "fitness_station=rings", "then": { "en": "This fitness station has rings for gymnastic exercises.", - "de": "Die Fitness-Station hat Ringe für Gymnastikübungen." + "de": "Die Fitness-Station hat Ringe für Gymnastikübungen.", + "ca": "Aquesta estació de fitness disposa d'anelles per fer exercicis de gimnàstica." }, "icon": { "path": "./assets/layers/fitness_station/Exercise9159.jpg", @@ -163,7 +166,8 @@ "if": "fitness_station=horizontal_ladder", "then": { "en": "This fitness station has a horizontal ladder, also known as monkey bars.", - "de": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." + "de": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars).", + "ca": "Aquest gimnàs té una escala horitzontal, també coneguda com a barres de mico." }, "icon": { "path": "./assets/layers/fitness_station/Horizontal_ladder.jpg", @@ -174,7 +178,8 @@ "if": "fitness_station=wall_bars", "then": { "en": "This fitness station has wall bars to climb on.", - "de": "Die Fitness-Station hat eine Sprossenwand zum Klettern." + "de": "Die Fitness-Station hat eine Sprossenwand zum Klettern.", + "ca": "Aquesta estació de fitness té barres per pujar-hi." }, "icon": { "path": "./assets/layers/fitness_station/RIAN_archive_493268_Sports_at_a_kindergarten.jpg", @@ -185,7 +190,8 @@ "if": "fitness_station=slalom", "then": { "en": "This fitness station has posts for performing slalom exercises.", - "de": "Die Fitness-Station hat Pfosten für Slalomübungen." + "de": "Die Fitness-Station hat Pfosten für Slalomübungen.", + "ca": "Aquesta estació de fitness té llocs per fer exercicis d'eslàlom." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_slalom.jpg", @@ -196,7 +202,8 @@ "if": "fitness_station=stepping_stones", "then": { "en": "This fitness station has stepping stones.", - "de": "Die Fitness-Station hat Trittsteine." + "de": "Die Fitness-Station hat Trittsteine.", + "ca": "Aquesta estació de gimnàs té esglaons." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_stepping_stone.jpg", @@ -207,7 +214,8 @@ "if": "fitness_station=leapfrog", "then": { "en": "This fitness station has cones for performing leapfrog jumps.", - "de": "Die Fitness-Station hat Hütchen für Bocksprünge." + "de": "Die Fitness-Station hat Hütchen für Bocksprünge.", + "ca": "Aquesta estació de fitness disposa de cons per fer salts de granota." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_leapfrog.jpg", @@ -218,7 +226,8 @@ "if": "fitness_station=beam_jump", "then": { "en": "This fitness station has beams to jump over.", - "de": "Die Fitness-Station hat Balken zum überspringen." + "de": "Die Fitness-Station hat Balken zum überspringen.", + "ca": "Aquesta estació de fitness té bigues per saltar." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_beam_jump.jpg", @@ -229,7 +238,8 @@ "if": "fitness_station=hurdling", "then": { "en": "This fitness station has hurdles to cross.", - "de": "Die Fitnessstation hat Hürden zum überspringen." + "de": "Die Fitnessstation hat Hürden zum überspringen.", + "ca": "Aquesta estació de fitness té obstacles per a travesar." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_hurdling.jpg", @@ -240,7 +250,8 @@ "if": "fitness_station=wall", "then": { "en": "This fitness station has a wall to climb on.", - "de": "Die Fitness-Station hat eine Kletterwand." + "de": "Die Fitness-Station hat eine Kletterwand.", + "ca": "Aquesta estació de fitness té una paret per enfilar-se." }, "icon": { "path": "./assets/layers/fitness_station/Fitness_station_wall.jpg", diff --git a/assets/layers/food/food.json b/assets/layers/food/food.json index bac347058..40806ade3 100644 --- a/assets/layers/food/food.json +++ b/assets/layers/food/food.json @@ -1012,7 +1012,8 @@ "options": [ { "question": { - "en": "Restaurants and fast food businesses" + "en": "Restaurants and fast food businesses", + "ca": "Restaurants i negocis de menjar ràpid" } }, { @@ -1043,7 +1044,8 @@ { "question": { "en": "Has a vegetarian menu", - "nl": "Heeft een vegetarisch menu" + "nl": "Heeft een vegetarisch menu", + "ca": "Té menú vegetarià" }, "osmTags": { "or": [ diff --git a/assets/layers/icons/icons.json b/assets/layers/icons/icons.json index dd1efb4e3..91b2da863 100644 --- a/assets/layers/icons/icons.json +++ b/assets/layers/icons/icons.json @@ -164,12 +164,12 @@ { "if": "dog=no", "#": "ignore-image-in-then", - "then": "no_dogs" + "then": "no_dogs" }, { "if": "dog=leashed", "#": "ignore-image-in-then", - "then": "dogs are allowed but leashed" + "then": "dogs are allowed but leashed" }, { "if": { @@ -179,7 +179,7 @@ ] }, "#": "ignore-image-in-then", - "then": "dogs are allowed" + "then": "dogs are allowed" } ] }, diff --git a/assets/layers/kindergarten_childcare/kindergarten_childcare.json b/assets/layers/kindergarten_childcare/kindergarten_childcare.json index 638d16f99..23a52be38 100644 --- a/assets/layers/kindergarten_childcare/kindergarten_childcare.json +++ b/assets/layers/kindergarten_childcare/kindergarten_childcare.json @@ -47,7 +47,8 @@ "en": "What type of facility is this?", "nl": "Wat voor faciliteit is dit?", "de": "Um welche Art von Einrichtung handelt es sich?", - "pl": "Jaki to rodzaj placówki?" + "pl": "Jaki to rodzaj placówki?", + "ca": "Quin tipus d'instal·lació és aquesta?" }, "mappings": [ { diff --git a/assets/layers/map/map.json b/assets/layers/map/map.json index 41177739e..babc2c896 100644 --- a/assets/layers/map/map.json +++ b/assets/layers/map/map.json @@ -52,7 +52,8 @@ "question": { "en": "What type of map is shown?", "de": "Was für eine Karte ist das?", - "pl": "Jaki rodzaj mapy jest pokazany?" + "pl": "Jaki rodzaj mapy jest pokazany?", + "ca": "Quin tipus de mapa es mostra?" }, "mappings": [ { @@ -68,7 +69,8 @@ "then": { "en": "A map with all streets or ways of an area.

The streets are mostly named; the angles, distances etc. are accurate

", "de": "Eine Karte mit allen Straßen und Wegen eines Gebietes.

Die Straßen sind meist benannt; die Winkel, die Entfernungen, etc. stimmen

", - "pl": "Mapa z wszystkimi ulicami i ścieżkami w danym obszarze.

Ulica w większości mają nazwy; kąty, odległości itp. są poprawne

" + "pl": "Mapa z wszystkimi ulicami i ścieżkami w danym obszarze.

Ulica w większości mają nazwy; kąty, odległości itp. są poprawne

", + "ca": "Un mapa amb tots els carrers o camins d'una àrea.

Els carrers estan majoritàriament nomenats; els angles, distàncies etc. són acurades

" } }, { @@ -84,7 +86,8 @@ "if": "map_type=toposcope", "then": { "en": "This is a toposcope.

A marker erected on high places which indicates the direction to notable landscape features which can be seen from that point

", - "de": "Dies ist ein Toposkop.

Eine Markierung, die an hohen Stellen angebracht ist und die Richtung zu wichtigen Landschaftsobjekten anzeigt, die von diesem Punkt aus gesehen werden können

" + "de": "Dies ist ein Toposkop.

Eine Markierung, die an hohen Stellen angebracht ist und die Richtung zu wichtigen Landschaftsobjekten anzeigt, die von diesem Punkt aus gesehen werden können

", + "ca": "Això és un toposcope.

Un marcador erigit en llocs alts que indica la direcció cap als elements paisatgístics notables que es poden veure des d'aquest punt

" } } ] @@ -190,7 +193,8 @@ "fr": "Cette carte est basée sur {map_source}", "de": "Diese Karte basiert auf {map_source}", "es": "Este mapa se basa en {map_source}", - "pl": "Ta mapa bazuje na {map_source}" + "pl": "Ta mapa bazuje na {map_source}", + "ca": "Aquest mapa està basat en {map_source}" }, "id": "map-map_source" }, @@ -205,7 +209,8 @@ "it": "L’attribuzione a OpenStreetMap è presente?", "de": "Ist die OpenStreetMap-Attribution vorhanden?", "fr": "L’attribution à OpenStreetMap est elle-présente ?", - "es": "¿Hay una atribución a OpenStreetMap?" + "es": "¿Hay una atribución a OpenStreetMap?", + "ca": "Hi ha atribució a OpenStreetMap?" }, "mappings": [ { @@ -221,7 +226,8 @@ "de": "OpenStreetMap ist eindeutig attributiert, einschließlich der ODBL-Lizenz", "fr": "L’attribution est clairement inscrite ainsi que la licence ODBL", "es": "Se atribuye claramente a OpenStreetMap, incluyendo la licencia ODBL", - "pl": "Źródło, czyli OpenStreetMap, jest w widoczny sposób podane, zawiera informację o licencji ODBL" + "pl": "Źródło, czyli OpenStreetMap, jest w widoczny sposób podane, zawiera informację o licencji ODBL", + "ca": "OpenStreetMap està clarament atribuït, incloent la llicència ODBL" } }, { @@ -236,7 +242,8 @@ "it": "L’attribuzione a OpenStreetMap è chiaramente specificata ma la licenza non compare", "de": "OpenStreetMap ist eindeutig attributiert, aber die Lizenz wird nicht erwähnt", "fr": "L’attribution est clairement inscrite mais la licence est absente", - "es": "Se atribuya claramente a OpenStreetMap, pero no se menciona la licencia" + "es": "Se atribuya claramente a OpenStreetMap, pero no se menciona la licencia", + "ca": "OpenStreetMap està clarament atribuït, però no es menciona la llicència" } }, { @@ -251,7 +258,8 @@ "it": "Non era presente alcun cenno a OpenStreetMap ma qualcuno vi ha attaccato un adesivo di OpenStreetMap", "de": "OpenStreetMap wurde nicht erwähnt, aber jemand hat einen OpenStreetMap-Aufkleber darauf geklebt", "fr": "OpenStreetMap n’est pas mentionné, un sticker OpenStreetMap a été collé", - "es": "No se mencionaba OpenStreetMap, pero alguien le pegó una pegatina de OpenStreetMap" + "es": "No se mencionaba OpenStreetMap, pero alguien le pegó una pegatina de OpenStreetMap", + "ca": "OpenStreetMap no es mencionava, però algú hi ha posat una enganxina d'OpenStreetMap" } }, { @@ -266,7 +274,8 @@ "it": "Non c’è alcuna attribuzione", "fr": "Il n'y a aucune attribution", "de": "Es gibt überhaupt keine Namensnennung", - "es": "No hay atribución" + "es": "No hay atribución", + "ca": "No hi ha atribució" } }, { @@ -281,7 +290,8 @@ "it": "Non c’è alcuna attribuzione", "fr": "Il n'y a aucune attribution", "de": "Es gibt überhaupt keine Namensnennung", - "es": "No hay atribución" + "es": "No hay atribución", + "ca": "No hi ha atribució" }, "hideInAnswer": true } diff --git a/assets/layers/maproulette/maproulette.json b/assets/layers/maproulette/maproulette.json index 81aff2b28..2e5e10776 100644 --- a/assets/layers/maproulette/maproulette.json +++ b/assets/layers/maproulette/maproulette.json @@ -89,7 +89,8 @@ "en": "Task is a false positive", "de": "Aufgabe ist ein falsches Positiv", "nl": "Taak was vals positief", - "pl": "Zadanie jest fałszywie pozytywne" + "pl": "Zadanie jest fałszywie pozytywne", + "ca": "La tasca és un fals positiu" } }, { diff --git a/assets/layers/maproulette_challenge/maproulette_challenge.json b/assets/layers/maproulette_challenge/maproulette_challenge.json index cdf9cad3f..2617f910d 100644 --- a/assets/layers/maproulette_challenge/maproulette_challenge.json +++ b/assets/layers/maproulette_challenge/maproulette_challenge.json @@ -94,7 +94,8 @@ "then": { "en": "Task is fixed", "de": "Aufgabe wurde erledigt", - "nl": "Taak is opgelost" + "nl": "Taak is opgelost", + "ca": "La tasca està arreglada" } }, { @@ -102,7 +103,8 @@ "then": { "en": "Task is a false positive", "de": "Aufgabe ist ein falsches Positiv", - "nl": "Taak is vals positief" + "nl": "Taak is vals positief", + "ca": "La tasca és un fals positiu" } }, { @@ -110,7 +112,8 @@ "then": { "en": "Task is skipped", "de": "Aufgabe wurde übersprungen", - "nl": "Taak is overgeslagen" + "nl": "Taak is overgeslagen", + "ca": "S'ha saltat la tasca" } }, { @@ -118,7 +121,8 @@ "then": { "en": "Task is deleted", "de": "Aufgabe wurde gelöscht", - "nl": "Taak is verwijderd" + "nl": "Taak is verwijderd", + "ca": "S'ha suprimit la tasca" } }, { @@ -126,7 +130,8 @@ "then": { "en": "Task is already fixed", "de": "Aufgabe wurde bereits erledigt", - "nl": "Taak is al opgelost" + "nl": "Taak is al opgelost", + "ca": "La tasca ja està arreglada" } }, { @@ -134,7 +139,8 @@ "then": { "en": "Task is marked as too hard", "de": "Aufgabe wurde als zu schwer markiert", - "nl": "Taak is gemarkeerd als te lastig" + "nl": "Taak is gemarkeerd als te lastig", + "ca": "La tasca està marcada com a massa difícil" } }, { @@ -142,7 +148,8 @@ "then": { "en": "Task is disabled", "de": "Aufgabe wurde deaktiviert", - "nl": "Taak is uitgeschakeld" + "nl": "Taak is uitgeschakeld", + "ca": "La tasca està desactivada" } } ] @@ -203,7 +210,8 @@ "question": { "en": "Show tasks that are deleted", "de": "Aufgaben anzeigen, die gelöscht wurden", - "nl": "Toon taken die zijn verwijderd" + "nl": "Toon taken die zijn verwijderd", + "ca": "Mostra tasques eliminades" }, "osmTags": "mr_taskStatus=Deleted" }, @@ -211,7 +219,8 @@ "question": { "en": "Show tasks that are already fixed", "de": "Aufgaben anzeigen, die bereits erledigt wurden", - "nl": "Toon taken die reeds opgelost waren" + "nl": "Toon taken die reeds opgelost waren", + "ca": "Mostra les tasques que ja estan arreglades" }, "osmTags": "mr_taskStatus=Already fixed" }, @@ -219,7 +228,8 @@ "question": { "en": "Show tasks that are marked as too hard", "de": "Aufgaben anzeigen, die als zu schwierig markiert wurden", - "nl": "Toon taken die als te moeilijk waren ervaren" + "nl": "Toon taken die als te moeilijk waren ervaren", + "ca": "Mostra les tasques marcades com a massa difícils" }, "osmTags": "mr_taskStatus=Too hard" }, @@ -227,7 +237,8 @@ "question": { "en": "Show tasks that are disabled", "de": "Aufgaben anzeigen, die deaktiviert wurden", - "nl": "Toon taken die zijn uitgeschakeld" + "nl": "Toon taken die zijn uitgeschakeld", + "ca": "Mostra tasques que s'han desactivat" }, "osmTags": "mr_taskStatus=Disabled" } diff --git a/assets/layers/nature_reserve/nature_reserve.json b/assets/layers/nature_reserve/nature_reserve.json index c6838d304..f17040421 100644 --- a/assets/layers/nature_reserve/nature_reserve.json +++ b/assets/layers/nature_reserve/nature_reserve.json @@ -29,7 +29,8 @@ "render": { "nl": "Natuurgebied", "en": "Nature reserve", - "de": "Naturschutzgebiet" + "de": "Naturschutzgebiet", + "ca": "Reserva Natural" }, "mappings": [ { @@ -167,7 +168,8 @@ "en": "Operated by {operator}", "nl": "Beheer door {operator}", "de": "Betrieben von {operator}", - "es": "Operado por {operator}" + "es": "Operado por {operator}", + "ca": "Gestionat per {operator}" }, "question": { "en": "Who operates this area?", @@ -205,7 +207,8 @@ "en": "Operated by {operator}", "nl": "Dit gebied wordt beheerd door {operator}", "de": "Betrieben von {operator}", - "es": "Operado por {operator}" + "es": "Operado por {operator}", + "ca": "Gestionat per {operator}" }, "icon": "./assets/layers/nature_reserve/Natuurpunt.jpg", "hideInAnswer": true @@ -239,7 +242,8 @@ "nl": "Wat is de naam van dit gebied?", "en": "What is the name of this area?", "de": "Wie heißt das Gebiet?", - "es": "¿Cual es el nombre de esta área?" + "es": "¿Cual es el nombre de esta área?", + "ca": "Quin és el nom d'aquesta àrea?" }, "freeform": { "key": "name", @@ -264,7 +268,8 @@ "en": "This area doesn't have a name", "nl": "Dit gebied heeft geen naam", "de": "Das Gebiet hat keinen Namen", - "es": "Esta área no tiene un nombre" + "es": "Esta área no tiene un nombre", + "ca": "Aquesta àrea no té un nom" } } ], @@ -276,7 +281,8 @@ "en": "Are dogs allowed in this nature reserve?", "it": "I cani sono ammessi in questa riserva naturale?", "fr": "Les chiens sont-ils autorisés dans cette réserve naturelle ?", - "de": "Sind Hunde in diesem Naturschutzgebiet erlaubt?" + "de": "Sind Hunde in diesem Naturschutzgebiet erlaubt?", + "ca": "Els gossos estan permesos en aquesta reserva natural?" }, "condition": { "or": [ @@ -318,7 +324,8 @@ "it": "I cani sono liberi di girare liberi", "fr": "Les chiens sont autorisés à se promener librement", "de": "Hunde dürfen frei herumlaufen", - "es": "Los perros pueden ir sueltos" + "es": "Los perros pueden ir sueltos", + "ca": "Els gossos poden anar solts" } } ], @@ -413,7 +420,8 @@ "en": "Extra information: {description}", "nl": "Extra info: {description}", "de": "Zusätzliche Informationen: {description}", - "es": "Información adicional: {description}" + "es": "Información adicional: {description}", + "ca": "Informació adicional: {description}" }, "freeform": { "key": "description" @@ -432,7 +440,8 @@ "en": "Extra info: {description:0}", "nl": "Extra info: {description:0}", "de": "Zusätzliche Informationen: {description:0}", - "es": "Información adicional: {description:0}" + "es": "Información adicional: {description:0}", + "ca": "Informació adicional: {description:0}" }, "freeform": { "key": "description:0" diff --git a/assets/layers/note/note.json b/assets/layers/note/note.json index eb71c8c5e..ea7b296fe 100644 --- a/assets/layers/note/note.json +++ b/assets/layers/note/note.json @@ -149,7 +149,8 @@ "en": "Should mention {search} in the first comment", "nl": "Moet in de eerste opmerking \"{search}\" bevatten", "de": "Sollte {search} im ersten Kommentar erwähnen", - "es": "Debe mencionar {search} en el primer comentario" + "es": "Debe mencionar {search} en el primer comentario", + "ca": "Has de mencionar {search} en el primer comentari" } } ] @@ -188,7 +189,8 @@ "nl": "Geopend door bijdrager {search}", "de": "Erstellt von {search}", "es": "Abierto por el contributor {search}", - "fr": "Ouverte par {search}" + "fr": "Ouverte par {search}", + "ca": "Obert pel contribuïdor {search}" } } ] @@ -207,7 +209,8 @@ "en": "Not opened by contributor {search}", "nl": "Niet geopend door bijdrager {search}", "de": "Nicht erstellt von {search}", - "es": "No abierto por el contributor {search}" + "es": "No abierto por el contributor {search}", + "ca": "No obert pel contribuïdor {search}" } } ] @@ -226,7 +229,8 @@ "en": "Last edited by contributor {search}", "nl": "Laatst bewerkt door bijdrager {search}", "de": "Zuletzt bearbeitet von {search}", - "es": "Editada por última vez por el contributor {search}" + "es": "Editada por última vez por el contributor {search}", + "ca": "Editat per última vega pel contribuïdor {search}" } } ] @@ -245,7 +249,8 @@ "en": "Opened after {search}", "nl": "Geopend na {search}", "de": "Zuletzt bearbeitet nach dem {search}", - "es": "Abierta después de {search}" + "es": "Abierta después de {search}", + "ca": "Oberta després de {search}" } } ] @@ -265,7 +270,8 @@ "en": "Created before {search}", "nl": "Aangemaakt voor {search}", "de": "Erstellt vor dem {search}", - "es": "Creada antes de {search}" + "es": "Creada antes de {search}", + "ca": "Creada abans de {search}" } } ] @@ -285,7 +291,8 @@ "en": "Created after {search}", "nl": "Aangemaakt na {search}", "de": "Erstellt nach dem {search}", - "es": "Creada después de {search}" + "es": "Creada después de {search}", + "ca": "Creada després de {search}" } } ] @@ -299,7 +306,8 @@ "en": "Only show notes opened by an anonymous contributor", "nl": "Toon enkel de Notes geopend door een anonieme bijdrager", "de": "Nur Notizen anzeigen, die anonym erstellt wurden", - "es": "Solo mostrar las notas abiertas por contributores anómimos" + "es": "Solo mostrar las notas abiertas por contributores anómimos", + "ca": "Sols mostrar les notes obertes per contribuïdors anònims" } } ] @@ -313,7 +321,8 @@ "en": "Only show open notes", "nl": "Toon enkel open Notes", "de": "Nur offene Notizen anzeigen", - "es": "Solo mostrar las notas abiertas" + "es": "Solo mostrar las notas abiertas", + "ca": "Sols mostra les notes obertes" } } ] @@ -326,7 +335,8 @@ "en": "All Notes", "nl": "Alle Notes", "de": "Alle Notizen", - "es": "Todas las notas" + "es": "Todas las notas", + "ca": "Totes les notes" } }, { diff --git a/assets/layers/observation_tower/observation_tower.json b/assets/layers/observation_tower/observation_tower.json index bb8c0c59e..8dcb8842e 100644 --- a/assets/layers/observation_tower/observation_tower.json +++ b/assets/layers/observation_tower/observation_tower.json @@ -282,7 +282,7 @@ "de": "Betrieben von {operator}", "es": "Mantenida por {operator}", "pl": "Obsługiwana przez {operator}", - "ca": "Mantés per {operator}" + "ca": "Mantés per {operator}" }, "freeform": { "key": "operator" diff --git a/assets/layers/parking_ticket_machine/parking_ticket_machine.json b/assets/layers/parking_ticket_machine/parking_ticket_machine.json index 854a25729..e723f9eb8 100644 --- a/assets/layers/parking_ticket_machine/parking_ticket_machine.json +++ b/assets/layers/parking_ticket_machine/parking_ticket_machine.json @@ -15,7 +15,8 @@ "render": { "en": "Parking Ticket Machine", "nl": "Parkeerkaartautomaat", - "de": "Parkscheinautomat" + "de": "Parkscheinautomat", + "ca": "Màquina de bitllets d'aparcament" } }, "source": { @@ -51,7 +52,8 @@ "question": { "en": "What is the reference number of this parking ticket machine?", "nl": "Wat is het referentienummer van deze parkeerkaartautomaat?", - "de": "Wie lautet die Referenznummer dieses Parkscheinautomaten?" + "de": "Wie lautet die Referenznummer dieses Parkscheinautomaten?", + "ca": "Quin és el número de referència d'aquesta màquina de bitllets d'aparcament?" }, "freeform": { "key": "ref", diff --git a/assets/layers/pharmacy/pharmacy.json b/assets/layers/pharmacy/pharmacy.json index 1fd320d76..95d8ffbb3 100644 --- a/assets/layers/pharmacy/pharmacy.json +++ b/assets/layers/pharmacy/pharmacy.json @@ -12,14 +12,16 @@ "en": "A layer showing pharmacies, which (probably) dispense prescription drugs", "de": "Eine Ebene mit Apotheken, die (wahrscheinlich) verschreibungspflichtige Medikamente ausgeben", "nl": "Deze laag toont apotheken, welke (waarschijnlijk) ook medicijnen onder voorschrift verkopen", - "fr": "Une couche affichant les pharmacie qui (probablement) délivrent des médicaments" + "fr": "Une couche affichant les pharmacie qui (probablement) délivrent des médicaments", + "ca": "Una capa que mostra les farmàcies, que (probablement) distribueixen medicaments amb recepta" }, "title": { "render": { "en": "{name}", "de": "{name}", "nl": "{name}", - "fr": "{name}" + "fr": "{name}", + "ca": "{name}" }, "mappings": [ { @@ -29,7 +31,8 @@ "de": "Apotheke", "nl": "Apotheek", "pa_PK": "فارمیسی", - "fr": "Pharmacie" + "fr": "Pharmacie", + "ca": "Farmàcia" } } ] @@ -53,14 +56,16 @@ "en": "Name of the pharmacy", "de": "Name der Apotheke", "nl": "Naam van de apotheek", - "fr": "Nom de la pharmacie" + "fr": "Nom de la pharmacie", + "ca": "Nom de la farmàcia" } }, "question": { "en": "What is the name of the pharmacy?", "de": "Wie lautet der Name der Apotheke?", "nl": "Wat is de naam van deze apotheek?", - "fr": "Quel est le nom de cette pharmacie ?" + "fr": "Quel est le nom de cette pharmacie ?", + "ca": "Quin és el nom de la farmàcia?" }, "render": { "en": "This pharmacy is called {name}", @@ -151,7 +156,8 @@ "en": "Has drive through", "de": "Bietet einen Durchfahr-Service an", "nl": "Heeft een drive-through", - "fr": "A une drive" + "fr": "A une drive", + "ca": "Té autoservei" }, "osmTags": "drive_through=yes" } @@ -165,7 +171,8 @@ "en": "Pharmacy able to provide prescription drugs", "de": "Apotheke, die verschreibungspflichtige Arzneimittel ausgibt", "nl": "Deze apotheek verdeelt medicijnen met voorschrift", - "fr": "Pharmacie pouvant délivrer des médicaments sous prescription" + "fr": "Pharmacie pouvant délivrer des médicaments sous prescription", + "ca": "Farmàcia que subministra medicaments amb recepta" }, "osmTags": "dispensing=yes" } @@ -182,7 +189,8 @@ "en": "a pharmacy", "nl": "een apotheek", "de": "eine Apotheke", - "fr": "une pharmacie" + "fr": "une pharmacie", + "ca": "una farmàcia" } } ], diff --git a/assets/layers/physiotherapist/physiotherapist.json b/assets/layers/physiotherapist/physiotherapist.json index b63b9372f..66fa38c25 100644 --- a/assets/layers/physiotherapist/physiotherapist.json +++ b/assets/layers/physiotherapist/physiotherapist.json @@ -3,12 +3,14 @@ "name": { "en": "Physiotherapist", "nl": "Kinesist", - "de": "Physiotherapeuten" + "de": "Physiotherapeuten", + "ca": "Fisioterapeuta" }, "description": { "en": "This layer shows physiotherapists", "nl": "Deze laag toont kinesisten", - "de": "Diese Ebene zeigt Physiotherapeuten" + "de": "Diese Ebene zeigt Physiotherapeuten", + "ca": "Aquesta capa mostra fisioterapeutes" }, "source": { "osmTags": "healthcare=physiotherapist" @@ -17,7 +19,8 @@ "render": { "en": "Physiotherapist {name}", "nl": "Kinesist {name}", - "de": "Physiotherapeut {name}" + "de": "Physiotherapeut {name}", + "ca": "Fisioterapeuta {name}" } }, "minzoom": 13, @@ -27,12 +30,14 @@ "question": { "en": "What is the name of this physiotherapists office?", "nl": "Wat is de naam van deze kinesistenpraktijk?", - "de": "Wie heißt die Praxis des Physiotherapeuten?" + "de": "Wie heißt die Praxis des Physiotherapeuten?", + "ca": "Quin és el nom d'aquesta consulta fisioterapèutica?" }, "render": { "en": "This physiotherapists office is called {name}", "nl": "Deze kinesistenpraktijk heet {name}", - "de": "Die Praxis des Physiotherapeuten heißt {name}" + "de": "Die Praxis des Physiotherapeuten heißt {name}", + "ca": "Aquesta consulta fisioterapèutica es diu {name}" }, "freeform": { "key": "name" @@ -50,7 +55,8 @@ "en": "a physiotherapists office", "de": "Praxis eines Physiotherapeuten", "nl": "een fysiotherapeutenpraktijk", - "fr": "un cabinet de kinésithérapeutes" + "fr": "un cabinet de kinésithérapeutes", + "ca": "una consulta fisioterapèutica" }, "tags": [ "healthcare=physiotherapist" diff --git a/assets/layers/picnic_table/picnic_table.json b/assets/layers/picnic_table/picnic_table.json index 3d2ba4cee..048280a43 100644 --- a/assets/layers/picnic_table/picnic_table.json +++ b/assets/layers/picnic_table/picnic_table.json @@ -33,7 +33,8 @@ "fr": "La couche montrant les tables de pique-nique", "ru": "Слой, отображающий столы для пикника", "de": "Die Ebene zeigt Picknicktische an", - "es": "Una capa que muestra mesas de pícnic" + "es": "Una capa que muestra mesas de pícnic", + "ca": "La capa mostra taules de pícnic" }, "tagRenderings": [ "images", @@ -46,7 +47,8 @@ "de": "Aus welchem Material besteht dieser Picknicktisch?", "ru": "Из чего изготовлен этот стол для пикника?", "fr": "En quel matériau est faite la table de pique-nique ?", - "es": "¿De qué material está hecha esta mesa de pícnic?" + "es": "¿De qué material está hecha esta mesa de pícnic?", + "ca": "De quin material està feta aquesta taula de pícnic?" }, "render": { "en": "This picnic table is made of {material}", @@ -55,7 +57,8 @@ "de": "Dieser Picknicktisch besteht aus {material}", "ru": "Этот стол для пикника сделан из {material}", "fr": "La table est faite en {material}", - "es": "Esta mesa de pícnic está hecha de {material}" + "es": "Esta mesa de pícnic está hecha de {material}", + "ca": "Aquesta taula de pícnic està feta de {material}" }, "freeform": { "key": "material" @@ -70,7 +73,8 @@ "ru": "Это деревянный стол для пикника", "de": "Dies ist ein Picknicktisch aus Holz", "fr": "C’est une table en bois", - "es": "Esta es una mesa de pícnic de madera" + "es": "Esta es una mesa de pícnic de madera", + "ca": "Aquesta és una taula de pícnic de fusta" } }, { @@ -82,7 +86,8 @@ "ru": "Это бетонный стол для пикника", "de": "Dies ist ein Picknicktisch aus Beton", "fr": "C’est une table en béton", - "es": "Esta es una mesa de pícnic de hormigón" + "es": "Esta es una mesa de pícnic de hormigón", + "ca": "Açò és una taula de pícnic de formigó" } }, { @@ -92,7 +97,8 @@ "nl": "Deze picknictafel is gemaakt uit (gerecycleerd) plastiek", "de": "Dieser Picknicktisch ist aus (recyceltem) Kunststoff hergestellt", "es": "Esta es una mesa de picnic hecha de plástico reciclado", - "fr": "Cette table de pique-nique est en plastique (recyclé)" + "fr": "Cette table de pique-nique est en plastique (recyclé)", + "ca": "Açò és una taula de pícnic feta de plàstic reciclat" } } ], diff --git a/assets/layers/playground/playground.json b/assets/layers/playground/playground.json index 577667d9f..3d957f6cd 100644 --- a/assets/layers/playground/playground.json +++ b/assets/layers/playground/playground.json @@ -76,7 +76,8 @@ "ru": "Поверхность - {surface}", "de": "Die Oberfläche ist {surface}", "fr": "La surface est en {surface}", - "es": "La superficie es {surface}" + "es": "La superficie es {surface}", + "ca": "La superfícies és {surface}" }, "freeform": { "key": "surface" @@ -167,7 +168,8 @@ "it": "La superficie è non pavimentato", "de": "Die Oberfläche ist unbefestigt", "fr": "La surface n’a pas de revêtement", - "es": "La superficie está sin pavimentar" + "es": "La superficie está sin pavimentar", + "ca": "La superfícies està sense pavimentar" }, "hideInAnswer": true }, @@ -179,7 +181,8 @@ "it": "La superficie è pavimentato", "de": "Die Oberfläche ist befestigt", "fr": "La surface a un revêtement", - "es": "La superficie está pavimentada" + "es": "La superficie está pavimentada", + "ca": "La superfície està pavimentada" }, "hideInAnswer": true } @@ -274,7 +277,8 @@ "fr": "Accessible aux enfants de {max_age} au maximum", "ru": "Доступно детям до {max_age}", "de": "Zugang nur für Kinder bis maximal {max_age}", - "es": "Accesible a niños de hasta {max_age}" + "es": "Accesible a niños de hasta {max_age}", + "ca": "Accessible per a nens de com a màxim {max_age}" }, "question": { "nl": "Wat is de maximaal toegestane leeftijd voor deze speeltuin?", @@ -374,7 +378,8 @@ "it": "Accessibile solamente agli studenti della scuola", "de": "Nur für Schüler der Schule zugänglich", "fr": "Réservée aux élèves de l’école", - "es": "Solo accesibles para estudiantes de la escuela" + "es": "Solo accesibles para estudiantes de la escuela", + "ca": "Només accessible per als alumnes de l'escola" }, "hideInAnswer": true }, diff --git a/assets/layers/postoffices/postoffices.json b/assets/layers/postoffices/postoffices.json index d463f9b4d..4412de12b 100644 --- a/assets/layers/postoffices/postoffices.json +++ b/assets/layers/postoffices/postoffices.json @@ -31,7 +31,7 @@ "id": "Kantor Pos", "hu": "Posta", "nl": "Postkantoor", - "ca": "Oficina de correus", + "ca": "Oficina postal", "es": "Oficina de Correo", "fr": "Bureau de poste", "nb_NO": "Postkontor" @@ -72,9 +72,10 @@ "id": "Layer yang menunjukkan kantor pos.", "hu": "Postákat megjelenítő réteg.", "nl": "Een laag die postkantoren toont.", - "es": "Una capa que muestra oficinas de correo.", + "es": "Una capa que muestra oficinas postales.", "fr": "Un claque montrant les bureaux de poste.", - "nb_NO": "Et lag som viser postkontor." + "nb_NO": "Et lag som viser postkontor.", + "ca": "Una capa que mostra oficines postals." }, "tagRenderings": [ "images", @@ -91,7 +92,7 @@ "id": "Jam berapa kantor pos ini buka?", "hu": "Mikor van nyitva ez a posta?", "de": "Wie sind die Öffnungszeiten dieser Poststelle?", - "es": "¿Cuáles son las horas de apertura para esta oficina de correos?", + "es": "¿Cuáles son las horas de apertura para esta oficina postal?", "nl": "Wat zijn de openingsuren voor dit postkantoor?", "fr": "Quelles sont les heures d’ouverture de ce bureau de poste ?" } @@ -231,7 +232,8 @@ "render": { "en": "You can post letters with these companies: {post_office:letter_from}", "de": "Mit diesen Unternehmen können Sie Briefe aufgeben: {post_office:letter_from}", - "nl": "Je kan brieven posten met de volgende bedrijven: {post_office:letter_from}" + "nl": "Je kan brieven posten met de volgende bedrijven: {post_office:letter_from}", + "ca": "Podeu enviar cartes amb aquestes empreses: {post_office:letter_from}" }, "question": { "en": "Can you post a letter here?", @@ -269,7 +271,8 @@ "render": { "en": "You can post parcels with these companies: {post_office:parcel_from}", "de": "Sie können Pakete mit diesen Unternehmen versenden: {post_office:parcel_from}", - "nl": "Je kan pakketten versturen met deze bedrijven: {post_office:parcel_from}" + "nl": "Je kan pakketten versturen met deze bedrijven: {post_office:parcel_from}", + "ca": "Podeu enviar paquets amb aquestes empreses: {post_office:parcel_from}" }, "question": { "en": "Can you send a parcel here?", @@ -309,7 +312,8 @@ "id": "parcel-pickup", "render": { "en": "You can pick up parcels from these companies: {post_office:parcel_pickup}", - "de": "Sie können Pakete von diesen Unternehmen abholen: {post_office:parcel_pickup}" + "de": "Sie können Pakete von diesen Unternehmen abholen: {post_office:parcel_pickup}", + "ca": "Podeu recollir paquets d'aquestes empreses: {post_office:parcel_pickup}" }, "question": { "en": "Can you pick up missed parcels here?", @@ -343,7 +347,8 @@ "id": "parcel-to", "render": { "en": "You can send parcels to here for pickup with these companies: {post_office:parcel_to}", - "de": "Mit diesen Unternehmen können Sie Pakete zur Abholung hierher senden: {post_office:parcel_to}" + "de": "Mit diesen Unternehmen können Sie Pakete zur Abholung hierher senden: {post_office:parcel_to}", + "ca": "Podeu enviar paquets aquí per recollir-los amb aquestes empreses: {post_office:parcel_to}" }, "question": { "en": "Can you send parcels to here for pickup?", diff --git a/assets/layers/questions/dogs_allowed.svg.license b/assets/layers/questions/dogs_allowed.svg.license index e14c126f7..cc80da1dd 100644 --- a/assets/layers/questions/dogs_allowed.svg.license +++ b/assets/layers/questions/dogs_allowed.svg.license @@ -1,2 +1,2 @@ SPDX-FileCopyrightText: OpenClipArt -SPDX-License-Identifier: PD \ No newline at end of file +SPDX-License-Identifier: PUBLIC-DOMAIN \ No newline at end of file diff --git a/assets/layers/questions/dogs_leashed.svg.license b/assets/layers/questions/dogs_leashed.svg.license index e32d67ee6..ae864e1e2 100644 --- a/assets/layers/questions/dogs_leashed.svg.license +++ b/assets/layers/questions/dogs_leashed.svg.license @@ -1,2 +1,2 @@ SPDX-FileCopyrightText: NPS Graphics, converted by User:ZyMOS -SPDX-License-Identifier: PD \ No newline at end of file +SPDX-License-Identifier: PUBLIC-DOMAIN \ No newline at end of file diff --git a/assets/layers/questions/questions.json b/assets/layers/questions/questions.json index af7f5742d..be115cedd 100644 --- a/assets/layers/questions/questions.json +++ b/assets/layers/questions/questions.json @@ -572,7 +572,6 @@ { "if": "dog=unleashed", "icon": "./assets/layers/questions/dogs_allowed.svg", - "then": { "en": "Dogs are allowed and can run around freely", "nl": "honden zijn welkom en mogen vrij rondlopen", @@ -1329,7 +1328,8 @@ "icon": "./assets/layers/questions/denominations/chf/1fr-2019-800px.png", "then": { "en": "1 franc coins are accepted", - "nl": "Munten van 1 frank worden geaccepteerd" + "nl": "Munten van 1 frank worden geaccepteerd", + "ca": "S'accepten monedes d'1 franc" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1338,7 +1338,8 @@ "icon": "./assets/layers/questions/denominations/chf/2fr-2019-800px.png", "then": { "en": "2 francs coins are accepted", - "nl": "Munten van 2 frank worden geaccepteerd" + "nl": "Munten van 2 frank worden geaccepteerd", + "ca": "S'accepten monedes de 2 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1347,7 +1348,8 @@ "icon": "./assets/layers/questions/denominations/chf/5fr-2019-800px.png", "then": { "en": "5 francs coins are accepted", - "nl": "Munten van 5 frank worden geaccepteerd" + "nl": "Munten van 5 frank worden geaccepteerd", + "ca": "S'accepten monedes de 5 francs" }, "hideInAnswer": "_currency!~.*CHF.*" } @@ -1493,7 +1495,8 @@ "icon": "./assets/layers/questions/denominations/chf/10chf.svg", "then": { "en": "10 francs notes are accepted", - "nl": "Biljetten van 10 frank worden geaccepteerd" + "nl": "Biljetten van 10 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 10 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1502,7 +1505,8 @@ "icon": "./assets/layers/questions/denominations/chf/20chf.svg", "then": { "en": "20 francs notes are accepted", - "nl": "Biljetten van 20 frank worden geaccepteerd" + "nl": "Biljetten van 20 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 20 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1511,7 +1515,8 @@ "icon": "./assets/layers/questions/denominations/chf/50chf.svg", "then": { "en": "50 francs notes are accepted", - "nl": "Biljetten van 50 frank worden geaccepteerd" + "nl": "Biljetten van 50 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 50 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1520,7 +1525,8 @@ "icon": "./assets/layers/questions/denominations/chf/100chf.svg", "then": { "en": "100 francs notes are accepted", - "nl": "Biljetten van 100 frank worden geaccepteerd" + "nl": "Biljetten van 100 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 100 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1529,7 +1535,8 @@ "icon": "./assets/layers/questions/denominations/chf/200chf.svg", "then": { "en": "200 francs notes are accepted", - "nl": "Biljetten van 200 frank worden geaccepteerd" + "nl": "Biljetten van 200 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 200 francs" }, "hideInAnswer": "_currency!~.*CHF.*" }, @@ -1538,7 +1545,8 @@ "icon": "./assets/layers/questions/denominations/chf/1000chf.svg", "then": { "en": "1000 francs notes are accepted", - "nl": "Biljetten van 1000 frank worden geaccepteerd" + "nl": "Biljetten van 1000 frank worden geaccepteerd", + "ca": "S'accepten bitllets de 1000 francs" }, "hideInAnswer": "_currency!~.*CHF.*" } @@ -1568,7 +1576,8 @@ "text": { "en": "Last edited on {_last_edit:timestamp} by {_last_edit:contributor}", "nl": "Laatst gewijzigd op {_last_edit:timestamp} door {_last_edit:contributor} ", - "de": "Zuletzt bearbeitet am {_last_edit:timestamp} von {_last_edit:contributor}" + "de": "Zuletzt bearbeitet am {_last_edit:timestamp} von {_last_edit:contributor}", + "ca": "Darrera edició el {_last_edit:timestamp} per {_last_edit:contributor}" }, "class": "subtle font-small" } diff --git a/assets/layers/shelter/shelter.json b/assets/layers/shelter/shelter.json index 9226cc44c..543aee864 100644 --- a/assets/layers/shelter/shelter.json +++ b/assets/layers/shelter/shelter.json @@ -73,7 +73,8 @@ "if": "shelter_type=lean_to", "then": { "en": "This is a shed with 3 walls, primarily intended for camping.", - "de": "Es handelt sich um einen an 3 Seiten geschlossenen Unterstand, der in erster Linie zum Campen gedacht ist." + "de": "Es handelt sich um einen an 3 Seiten geschlossenen Unterstand, der in erster Linie zum Campen gedacht ist.", + "ca": "Es tracta d'un cobert amb 3 parets, destinat principalment a l'acampada." } }, { diff --git a/assets/layers/stairs/stairs.json b/assets/layers/stairs/stairs.json index 9d416752a..e786b0610 100644 --- a/assets/layers/stairs/stairs.json +++ b/assets/layers/stairs/stairs.json @@ -15,7 +15,8 @@ "render": { "en": "Stairs", "nl": "Trap", - "de": "Treppe" + "de": "Treppe", + "ca": "Escales" }, "mappings": [ { @@ -23,7 +24,8 @@ "then": { "en": "Escalator", "nl": "Roltrap", - "de": "Rolltreppe" + "de": "Rolltreppe", + "ca": "Escala mecànica" } } ] @@ -40,12 +42,14 @@ "question": { "en": "Between which levels are these stairs?", "nl": "Tussen welke verdiepingen loopt deze trap?", - "de": "Zwischen welchen Stockwerken befindet sich diese Treppe?" + "de": "Zwischen welchen Stockwerken befindet sich diese Treppe?", + "ca": "Entre quines plantes estan aquestes escales?" }, "render": { "en": "These stairs are between the levels {level}", "nl": "Deze trap loopt tussen de verdiepingen {level}", - "de": "Diese Treppe ist zwischen den Stockwerken {level}" + "de": "Diese Treppe ist zwischen den Stockwerken {level}", + "ca": "Aquestes escales estan entre les plantes {level}" } } }, @@ -54,7 +58,8 @@ "question": { "en": "Does this stair have a handrail?", "nl": "Heeft deze trap een leuning?", - "de": "Hat die Treppe einen Handlauf?" + "de": "Hat die Treppe einen Handlauf?", + "ca": "Aquestes escales tenen un passamà?" }, "mappings": [ { @@ -71,7 +76,8 @@ "then": { "en": "These stairs do not have a handrail", "nl": "Deze trap heeft geen leuning", - "de": "Die Treppe hat keinen Handlauf" + "de": "Die Treppe hat keinen Handlauf", + "ca": "Aquestes escales no tenen un passamà" } } ] @@ -116,17 +122,20 @@ "question": { "en": "In which languages is there tactile writing (braille) for navigation? ", "de": "In welchen Sprachen gibt es taktile Schrift (Braille) für die Navigation? ", - "nl": "In welke talen is er voelbaar schrift (braille) voor navigatie? " + "nl": "In welke talen is er voelbaar schrift (braille) voor navigatie? ", + "ca": "En quins idiomes hi ha escriptura tàctil (braille) per a la navegació? " }, "render_list_item": { "en": "These stairs have tactile writing in {language():font-bold}", "de": "Die Treppe hat taktile Schrift in {language():font-bold}", - "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}" + "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}", + "ca": "Aquestes escales tenen escriptura tàctil en {language():font-bold}" }, "render_single_language": { "en": "These stairs have tactile writing in {language():font-bold}", "de": "Die Treppe hat taktile Schrift in {language():font-bold}", - "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}" + "nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}", + "ca": "Aquestes escales tenen escriptura tàctil en {language():font-bold}" } } } @@ -139,7 +148,8 @@ "then": { "en": "This is an escalator", "nl": "Dit is een roltrap", - "de": "Das ist eine Rolltreppe" + "de": "Das ist eine Rolltreppe", + "ca": "Açò és una escala mecànica" } }, { @@ -147,7 +157,8 @@ "then": { "en": "This is not an escalator", "nl": "Dit is geen roltrap", - "de": "Das ist keine Rolltreppe" + "de": "Das ist keine Rolltreppe", + "ca": "Açò no és una escala mecànica" } }, { @@ -197,7 +208,8 @@ "then": { "en": "There is ramp for wheelchairs here, but it is shown separately on the map", "de": "Hier gibt es eine Rampe für Rollstühle, die jedoch auf der Karte separat angezeigt wird", - "nl": "Er is hier een helling voor rolstoelen, maar deze is los aangegeven op de kaart" + "nl": "Er is hier een helling voor rolstoelen, maar deze is los aangegeven op de kaart", + "ca": "Aquí hi ha una rampa per a cadira de rodes, però es mostra separadament al mapa" }, "hideInAnswer": true }, diff --git a/assets/layers/street_lamps/street_lamps.json b/assets/layers/street_lamps/street_lamps.json index 9c9ddef2c..495dfae9d 100644 --- a/assets/layers/street_lamps/street_lamps.json +++ b/assets/layers/street_lamps/street_lamps.json @@ -16,7 +16,8 @@ "en": "Street Lamp", "nl": "Straatlantaarn", "de": "Straßenlaterne", - "es": "Lámpara Callejera" + "es": "Lámpara Callejera", + "ca": "Fanal" }, "mappings": [ { @@ -25,7 +26,8 @@ "en": "Street Lamp {ref}", "nl": "Straatlantaarn {ref}", "de": "Straßenlaterne {ref}", - "es": "Lámpara Callejera {ref}" + "es": "Lámpara Callejera {ref}", + "ca": "Fanal {ref}" } } ] @@ -69,7 +71,8 @@ "en": "This street lamp has the reference number {ref}", "nl": "Deze straatlantaarn heeft het nummer {ref}", "de": "Diese Straßenlaterne hat die Referenznummer {ref}", - "es": "Esta lámpara callejera tiene el número de referencia {ref}" + "es": "Esta lámpara callejera tiene el número de referencia {ref}", + "ca": "Aquest fanal té el número de referència {ref}" }, "question": { "en": "What is the reference number of this street lamp?", @@ -88,7 +91,8 @@ "en": "How is this street lamp mounted?", "nl": "Hoe is deze straatlantaarn gemonteerd?", "de": "Wie ist diese Straßenlaterne befestigt?", - "es": "¿Cómo está montada esta lámpara?" + "es": "¿Cómo está montada esta lámpara?", + "ca": "Com està muntada aquesta làmpada?" }, "mappings": [ { @@ -97,7 +101,8 @@ "en": "This lamp is suspended using cables", "nl": "Deze lantaarn hangt aan kabels", "de": "Die Straßenlaterne ist an einem Kabel befestigt", - "es": "Esta lámpara se suspende utilizando cables" + "es": "Esta lámpara se suspende utilizando cables", + "ca": "Aquesta làmpada està suspès mitjançant cables" } }, { @@ -106,7 +111,8 @@ "en": "This lamp is mounted on a ceiling", "nl": "Deze lantaarn hangt aan een plafond", "de": "Die Straßenlaterne ist an einer Decke befestigt", - "es": "Esta lámpara está montada en un techo" + "es": "Esta lámpara está montada en un techo", + "ca": "Aquesta làmpada està muntat al sostre" } }, { @@ -115,7 +121,8 @@ "en": "This lamp is mounted in the ground", "nl": "Deze lantaarn zit in de grond", "de": "Die Straßenlaterne ist am Boden befestigt", - "es": "Esta lámpara está montada en el suelo" + "es": "Esta lámpara está montada en el suelo", + "ca": "Aquesta làmpada està muntat a terra" } }, { @@ -124,7 +131,8 @@ "en": "This lamp is mounted on a short pole (mostly < 1.5m)", "nl": "Deze lantaarn zit op een korte paal (meestal < 1.5m)", "de": "Die Straßenlaterne ist an einem kurzen Mast (< 1,5m) befestigt", - "es": "Esta lámpara está montada en un poste corto (mayoritariamente < 1.5m)" + "es": "Esta lámpara está montada en un poste corto (mayoritariamente < 1.5m)", + "ca": "Aquesta làmpada està muntada en un pal curt (principalment <1,5 m)" } }, { @@ -134,7 +142,7 @@ "nl": "Deze lantaarn zit op een paal", "de": "Die Straßenlaterne ist an einem Mast befestigt", "es": "Esta lámpara está montada en un poste", - "ca": "Aquest fanal està muntat en un pal" + "ca": "Aquesta làmpada està muntada en un pal" } }, { @@ -143,7 +151,8 @@ "en": "This lamp is mounted directly to the wall", "nl": "Deze lantaarn hangt direct aan de muur", "de": "Die Straßenlaterne ist direkt an der Wand befestigt", - "es": "Esta lámpara está montada directamente en la pared" + "es": "Esta lámpara está montada directamente en la pared", + "ca": "Aquesta làmpada està muntada directament a la paret" } }, { @@ -153,7 +162,7 @@ "nl": "Deze lantaarn hangt aan de muur met een metalen balk", "de": "Die Straßenlaterne ist mit einer Metallstange an der Wand befestigt", "es": "Esta lámpara está montada en la pared utilizando una barra metálica", - "ca": "Aquest fanal està muntat a la paret utilitzat una barra metàl·lica" + "ca": "Aquesta làmpada està muntada a la paret utilitzat una barra metàl·lica" } } ] @@ -207,7 +216,8 @@ "en": "This lamp is lit electrically", "nl": "Deze lantaarn is elektrisch verlicht", "de": "Diese Straßenlaterne leuchtet elektrisch", - "es": "Esta lámpara se ilumina eléctricamente" + "es": "Esta lámpara se ilumina eléctricamente", + "ca": "Aquest fanal s'encén elèctricament" }, "hideInAnswer": true }, @@ -335,7 +345,8 @@ "en": "This lamp emits {light:colour} light", "nl": "Deze lantaarn geeft {light:colour} licht", "de": "Diese Lampe strahlt {light:colour} Licht aus", - "es": "Esta lámpara emite luz {light:colour}" + "es": "Esta lámpara emite luz {light:colour}", + "ca": "Aquesta làmpada emet llum {light:colour}" }, "freeform": { "key": "light:colour", @@ -379,7 +390,8 @@ "render": { "en": "This lamp has {light:count} fixtures", "nl": "Deze lantaarn heeft {light:count} lampen", - "de": "Diese Straßenlaterne hat {light:count} Leuchten" + "de": "Diese Straßenlaterne hat {light:count} Leuchten", + "ca": "Aquesta làmpada té {light:count} aparells" }, "question": { "en": "How many fixtures does this light have?", @@ -498,6 +510,7 @@ "en": "A layer showing street lights", "nl": "Een laag die alle straatlantaarns toont", "de": "Eine Ebene mit Straßenbeleuchtung", - "es": "Una capa que muestra luces callejeras" + "es": "Una capa que muestra luces callejeras", + "ca": "Una capa que mostra els llums del carrer" } } diff --git a/assets/layers/surveillance_camera/surveillance_camera.json b/assets/layers/surveillance_camera/surveillance_camera.json index 2e59fb397..fba0f4faf 100644 --- a/assets/layers/surveillance_camera/surveillance_camera.json +++ b/assets/layers/surveillance_camera/surveillance_camera.json @@ -43,22 +43,26 @@ { "id": "has_alpr", "question": { - "en": "Can this camera automatically detect license plates?" + "en": "Can this camera automatically detect license plates?", + "ca": "Aquesta càmera pot detectar matrícules automàticament?" }, "questionHint": { - "en": "An ALPR (Automatic License Plate Reader) typically has two lenses and an array of infrared LEDS in between." + "en": "An ALPR (Automatic License Plate Reader) typically has two lenses and an array of infrared LEDS in between.", + "ca": "Un ALPR (lector automàtic de matrícules, per les seves sigles en anglès) normalment té dues lents i una sèrie de LEDs infrarojos entremig." }, "mappings": [ { "if": "surveillance:type=camera", "then": { - "en": "This is a camera without number plate recognition." + "en": "This is a camera without number plate recognition.", + "ca": "Es tracta d'una càmera sense reconeixement de matrícules." } }, { "if": "surveillance:type=ALPR", "then": { - "en": "This is an ALPR (Automatic License Plate Reader)" + "en": "This is an ALPR (Automatic License Plate Reader)", + "ca": "Açò és un ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" }, "icon": { "path": "./assets/layers/surveillance_camera/ALPR.svg" @@ -178,7 +182,8 @@ "it": "Punta in direzione {direction}", "de": "filmt in Himmelsrichtung {direction}", "da": "Filmer til en kompasretning af {direction}", - "es": "Graba en dirección a {direction}" + "es": "Graba en dirección a {direction}", + "ca": "Grava en direcció {direction}" }, "hideInAnswer": true } @@ -283,7 +288,8 @@ "it": "Lo spazio pubblico sorvegliato da questa videocamera è all'aperto o al chiuso?", "de": "Handelt es sich bei dem von dieser Kamera überwachten öffentlichen Raum um einen Innen- oder Außenbereich?", "da": "Er det offentlige rum, der overvåges af dette kamera, et indendørs eller udendørs rum?", - "es": "¿El espacio público vigilado por esta cámara es un espacio interior o exterior?" + "es": "¿El espacio público vigilado por esta cámara es un espacio interior o exterior?", + "ca": "L'espai públic vigilat per aquesta càmera és un espai interior o exterior?" }, "condition": { "and": [ @@ -300,7 +306,8 @@ "it": "Questa videocamera si trova al chiuso", "de": "Diese Kamera befindet sich im Innenraum", "da": "Dette kamera er placeret indendørs", - "es": "Esta cámara está ubicada en un lugar interior" + "es": "Esta cámara está ubicada en un lugar interior", + "ca": "Aquesta càmera es troba a l'interior" } }, { @@ -313,7 +320,8 @@ "ru": "Эта камера расположена снаружи", "de": "Diese Kamera befindet sich im Freien", "da": "Dette kamera er placeret udendørs", - "es": "Esta cámara está ubicada en un lugar exterior" + "es": "Esta cámara está ubicada en un lugar exterior", + "ca": "Aquesta càmera es troba a l'exterior" } }, { @@ -326,7 +334,8 @@ "ru": "Возможно, эта камера расположена снаружи", "de": "Diese Kamera ist möglicherweise im Freien", "da": "Dette kamera er sandsynligvis placeret udendørs", - "es": "Esta cámara está probablemente colocada en el exterior" + "es": "Esta cámara está probablemente colocada en el exterior", + "ca": "Aquesta càmera probablement es troba a l'exterior" }, "hideInAnswer": true } @@ -348,7 +357,8 @@ "fr": "Situé au niveau {level}", "it": "Si trova al piano {level}", "de": "Befindet sich auf Ebene {level}", - "es": "Está colocada a nivel {level}" + "es": "Ubicado en la planta {level}", + "ca": "Ubicat a la planta {level}" }, "freeform": { "key": "level", @@ -598,7 +608,8 @@ "nl": "een bewakingscamera", "de": "eine Überwachungskamera", "es": "una cámara de vigilancia", - "fr": "une caméra de surveillance" + "fr": "une caméra de surveillance", + "ca": "una càmera de vigilància" } }, { @@ -612,7 +623,8 @@ "nl": "een bewakingscamera gemonteerd op een muur", "de": "eine an einer Wand montierte Überwachungskamera", "es": "una cámara de vigilancia montada en una pared", - "fr": "une caméra de surveillance fixée au mur" + "fr": "une caméra de surveillance fixée au mur", + "ca": "una càmera de vigilància muntada en una paret" }, "snapToLayer": "walls_and_buildings" }, @@ -622,10 +634,12 @@ "surveillance:type=ALPR" ], "title": { - "en": "an ALPR camera (Automatic Number Plate Reader)" + "en": "an ALPR camera (Automatic Number Plate Reader)", + "ca": "una càmera ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" }, "description": { - "en": "An ALPR typically has two lenses and an array of infrared lights." + "en": "An ALPR typically has two lenses and an array of infrared lights.", + "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes." }, "exampleImages": [ "./assets/layers/surveillance_camera/ALPR_Example.jpg", @@ -639,10 +653,12 @@ "camera:mount=wall" ], "title": { - "en": "an ALPR camera (Automatic Number Plate Reader) mounted on a wall" + "en": "an ALPR camera (Automatic Number Plate Reader) mounted on a wall", + "ca": "una càmera ALPR (lector automàtic de matrícules) muntada a la paret" }, "description": { - "en": "An ALPR typically has two lenses and an array of infrared lights." + "en": "An ALPR typically has two lenses and an array of infrared lights.", + "ca": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes." }, "exampleImages": [ "./assets/layers/surveillance_camera/ALPR_Example.jpg", @@ -724,6 +740,7 @@ "nl": "Deze laag toont bewakingscamera's en laat toe om de informatie te verrijken en om nieuwe camera\"s toe te voegen", "de": "Diese Ebene zeigt die Überwachungskameras an und ermöglicht es, Informationen zu aktualisieren und neue Kameras hinzuzufügen", "es": "Esta capa muestra las cámaras de vigilancia y permite a quien colabora, actualizar la información y agregar nuevas cámaras", - "fr": "Cette couche affiche les caméras de surveillance et permet au contributeur de mettre à jour les informations et ajouter de nouvelles caméras" + "fr": "Cette couche affiche les caméras de surveillance et permet au contributeur de mettre à jour les informations et ajouter de nouvelles caméras", + "ca": "Aquesta capa mostra les càmeres de vigilància i permet a qui col·labora, actualitzar la informació i afegir noves càmeres" } } diff --git a/assets/layers/tertiary_education/tertiary_education.json b/assets/layers/tertiary_education/tertiary_education.json index c200bee47..e9ddb41b0 100644 --- a/assets/layers/tertiary_education/tertiary_education.json +++ b/assets/layers/tertiary_education/tertiary_education.json @@ -53,7 +53,8 @@ "de": "Universität", "fr": "Universitée", "da": "Universitet", - "pa_PK": "یونیورسٹی" + "pa_PK": "یونیورسٹی", + "ca": "Universitat" } }, { @@ -76,7 +77,8 @@ "nl": "Wat voor onderwijsinstelling is dit?", "de": "Was für eine Art von Institution ist das?", "fr": "De quel type d'établissement s'agit-il ?", - "da": "Hvad er det for en institution?" + "da": "Hvad er det for en institution?", + "ca": "Quin tipus d'institució és aquesta?" }, "mappings": [ { @@ -193,7 +195,8 @@ "nl": "een universiteit", "de": "eine Universität", "fr": "une université", - "da": "et universitet" + "da": "et universitet", + "ca": "una universitat" }, "description": { "en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.", diff --git a/assets/layers/ticket_machine/ticket_machine.json b/assets/layers/ticket_machine/ticket_machine.json index de507975e..6292fc6f9 100644 --- a/assets/layers/ticket_machine/ticket_machine.json +++ b/assets/layers/ticket_machine/ticket_machine.json @@ -85,7 +85,8 @@ "title": { "en": "a ticket machine", "de": "einen Fahrkartenautomat", - "nl": "een kaartautomaat" + "nl": "een kaartautomaat", + "ca": "una màquina de bitllets" } } ], diff --git a/assets/layers/toilet_at_amenity/toilet_at_amenity.json b/assets/layers/toilet_at_amenity/toilet_at_amenity.json index ba1664fcd..9d4090935 100644 --- a/assets/layers/toilet_at_amenity/toilet_at_amenity.json +++ b/assets/layers/toilet_at_amenity/toilet_at_amenity.json @@ -3,7 +3,8 @@ "name": { "en": "Toilets at other amenities", "de": "Toiletten in anderen Einrichtungen", - "nl": "Toilet in een voorziening" + "nl": "Toilet in een voorziening", + "ca": "Lavabos a altres instal·lacions" }, "minzoom": 12, "source": { @@ -264,7 +265,8 @@ "nl": "Hoe breed is de deur van de rolstoeltoegankelijke toilet?", "fr": "Quelle est la largeur de la porte des toilettes accessibles aux fauteuils roulants ?", "de": "Wie breit ist die Tür zur rollstuhlgerechten Toilette?", - "da": "Hvad er bredden på døren til det kørestolsvenlige toilet?" + "da": "Hvad er bredden på døren til det kørestolsvenlige toilet?", + "ca": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?" }, "render": { "en": "The door to the wheelchair-accessible toilet is {canonical(toilets:door:width)} wide", @@ -435,7 +437,7 @@ "en": "A layer showing (public) toilets located at different places.", "de": "Eine Ebene mit (öffentlichen) Toiletten an verschiedenen Orten.", "nl": "Een laag die (publiek toegankelijke) toiletten toont in verschillende andere voorzieningen.", - "ca": "Una capa que mostra banys (públics) ubicats en diferents llocs" + "ca": "Una capa que mostra banys (públics) ubicats en diferents llocs." }, "units": [ { @@ -453,7 +455,8 @@ "nl": "meter", "fr": "mètre", "de": "Meter", - "da": "meter" + "da": "meter", + "ca": "metre" } }, { @@ -467,7 +470,8 @@ "nl": "centimeter", "fr": "centimètre", "de": "Zentimeter", - "da": "centimeter" + "da": "centimeter", + "ca": "centimetre" } } ] diff --git a/assets/layers/trail/trail.json b/assets/layers/trail/trail.json index 173f81d4c..7a9764003 100644 --- a/assets/layers/trail/trail.json +++ b/assets/layers/trail/trail.json @@ -50,7 +50,8 @@ "nl": "Deze wandeling is {_length:km} kilometer lang", "de": "Der Wanderweg ist {_length:km} Kilometer lang", "fr": "Le sentier fait {_length:km} kilomètres de long", - "da": "Stien er {_length:km} kilometer lang" + "da": "Stien er {_length:km} kilometer lang", + "ca": "El sender té {_length:km} quilòmetres" } }, { @@ -127,7 +128,8 @@ "en": "Blue trail", "de": "Blauer Weg", "fr": "Sentier bleu", - "da": "Blå sti" + "da": "Blå sti", + "ca": "Ruta blava" } }, { @@ -137,7 +139,8 @@ "en": "Red trail", "de": "Roter Weg", "fr": "Sentier rouge", - "da": "Rød sti" + "da": "Rød sti", + "ca": "Ruta vermella" } }, { @@ -147,7 +150,8 @@ "en": "Green trail", "de": "Grüner Weg", "fr": "Sentier vert", - "da": "Grøn sti" + "da": "Grøn sti", + "ca": "Ruta verda" } }, { @@ -157,7 +161,8 @@ "en": "Yellow trail", "de": "Gelber Weg", "fr": "Sentier jaune", - "da": "Gul sti" + "da": "Gul sti", + "ca": "Ruta groga" } } ], diff --git a/assets/layers/transit_routes/transit_routes.json b/assets/layers/transit_routes/transit_routes.json index c24b25497..c4c263df7 100644 --- a/assets/layers/transit_routes/transit_routes.json +++ b/assets/layers/transit_routes/transit_routes.json @@ -11,7 +11,8 @@ "en": "Layer showing bus lines", "de": "Ebene mit Buslinien", "nl": "Laag met buslijnen", - "da": "Lag, der viser buslinjer" + "da": "Lag, der viser buslinjer", + "ca": "Capa que mostra les línies d'autobús" }, "source": { "osmTags": { @@ -27,7 +28,8 @@ "en": "Bus line", "de": "Buslinie", "nl": "Buslijn", - "da": "Buslinje" + "da": "Buslinje", + "ca": "Línia de bus" }, "mappings": [ { @@ -36,7 +38,8 @@ "en": "{name}", "de": "{name}", "da": "{name}", - "nl": "{name}" + "nl": "{name}", + "ca": "{name}" } } ] @@ -48,7 +51,8 @@ "en": "#ff0000", "de": "#ff0000", "da": "#ff0000", - "nl": "#ff0000" + "nl": "#ff0000", + "ca": "#ff0000" }, "mappings": [ { @@ -109,7 +113,8 @@ "de": "Die Buslinie fährt über {via}", "nl": "Deze buslijn gaat via {via}", "da": "Denne buslinje går via {via}", - "fr": "Cette ligne de bus passe par {via}" + "fr": "Cette ligne de bus passe par {via}", + "ca": "Aquesta línia d'autobús passa per {via}" }, "question": { "en": "What is the via point for this bus line?", diff --git a/assets/layers/transit_stops/transit_stops.json b/assets/layers/transit_stops/transit_stops.json index e9a871a88..517d17609 100644 --- a/assets/layers/transit_stops/transit_stops.json +++ b/assets/layers/transit_stops/transit_stops.json @@ -34,7 +34,8 @@ "en": "Stop {name}", "de": "Haltestelle {name}", "da": "Stop {name}", - "nl": "Halte {name}" + "nl": "Halte {name}", + "ca": "Parada {name}" } } ] @@ -80,7 +81,8 @@ "en": "Name of the stop", "de": "Name der Haltestelle", "da": "Navn på stoppestedet", - "nl": "Naam van de halte" + "nl": "Naam van de halte", + "ca": "Nom de la parada" } }, "mappings": [ @@ -139,7 +141,8 @@ "then": { "en": "This stop has a shelter, that's separately mapped", "de": "Die Haltestelle hat einen Unterstand, der separat kariert ist", - "nl": "Deze halte heeft een schuilplaats, die apart op de kaart staat" + "nl": "Deze halte heeft een schuilplaats, die apart op de kaart staat", + "ca": "Aquesta parada té un refugi que està mapejat separadament" }, "hideInAnswer": true } @@ -184,7 +187,8 @@ "en": "This stop has a bench, that's separately mapped", "de": "Die Haltestelle hat eine Bank, die separat kartiert ist", "nl": "Deze halte heeft een zitbank, die los aangegeven is op de kaart", - "fr": "Cet arrêt a un banc, cartographié séparément" + "fr": "Cet arrêt a un banc, cartographié séparément", + "ca": "Aquesta parada té un banc que està mapejat separadament" }, "hideInAnswer": true } @@ -228,7 +232,8 @@ "then": { "en": "This stop has a bin, that's separately mapped", "de": "Die Haltestelle hat einen Mülleimer, der separat kartiert ist", - "nl": "Deze heeft een vuilnisbak, die los op de kaart staat" + "nl": "Deze heeft een vuilnisbak, die los op de kaart staat", + "ca": "Aquesta parada té una paperera que està mapejada separadament" }, "hideInAnswer": true } @@ -315,7 +320,8 @@ "then": { "en": "This stop has a departures board of unknown type", "de": "Die Haltestelle hat einen Fahrplan, der nicht näher definiert ist", - "da": "Dette stoppested har en afgangstavle af ukendt type" + "da": "Dette stoppested har en afgangstavle af ukendt type", + "ca": "Aquesta parada té un tauler de sortides de tipus desconegut" }, "hideInAnswer": true }, @@ -344,7 +350,8 @@ "then": { "en": "This stop has a timetable showing regular departures", "de": "Die Haltestelle hat einen Fahrplan, der die regulären Abfahrtszeiten anzeigt", - "da": "Dette stop har en køreplan, der viser regelmæssige afgange" + "da": "Dette stop har en køreplan, der viser regelmæssige afgange", + "ca": "Aquesta parada té un horari que mostra les sortides regulars" } }, { @@ -352,7 +359,8 @@ "then": { "en": "This stop has a timetable containing just the interval between departures", "de": "Die Haltestelle hat einen Fahrplan, der den Abstand zwischen Abfahrten anzeigt", - "da": "Dette stop har en køreplan, der kun indeholder intervallet mellem afgangene" + "da": "Dette stop har en køreplan, der kun indeholder intervallet mellem afgangene", + "ca": "Aquesta parada té un horari que conté només l'interval entre sortides" } }, { @@ -360,7 +368,8 @@ "then": { "en": "This stop does not have a departures board", "de": "Die Haltestelle hat keinen Fahrplan", - "da": "Dette stop har ikke en afgangstavle" + "da": "Dette stop har ikke en afgangstavle", + "ca": "Aquesta parada no té un tauler de sortides" } } ] @@ -410,7 +419,8 @@ "question": { "en": "With a bench", "de": "Mit Sitzbank", - "fr": "Avec un banc" + "fr": "Avec un banc", + "ca": "Amb un banc" } } ] diff --git a/assets/layers/tree_node/tree_node.json b/assets/layers/tree_node/tree_node.json index 722b26d01..f8edc9415 100644 --- a/assets/layers/tree_node/tree_node.json +++ b/assets/layers/tree_node/tree_node.json @@ -129,7 +129,8 @@ "nl": "Wat is de omtrek van de boomstam? ", "es": "¿Cuál es la circunferencia del tronco del árbol?", "pt": "Qual é a circunferência do tronco da árvore?", - "pt_BR": "Qual é a circunferência do tronco da árvore?" + "pt_BR": "Qual é a circunferência do tronco da árvore?", + "ca": "Quina és la circumferència del tronc de l'arbre?" }, "render": { "en": "The tree trunk has a circumference of {circumference} meter", @@ -138,7 +139,8 @@ "nl": "De boomstam heeft een omtrek van {circumference} meter", "es": "El tronco del árbol tiene una circunferencia de {circumference} metros", "pt": "O tronco da árvore tem uma circunferência de {circumference} metros", - "pt_BR": "O tronco da árvore tem uma circunferência de {circumference} metro" + "pt_BR": "O tronco da árvore tem uma circunferência de {circumference} metro", + "ca": "El tronc de l'arbre té una circumferència de {circumference} metre" }, "freeform": { "key": "circumference", @@ -163,7 +165,8 @@ "fr": "Quelle est la hauteur de cette arbre ?", "nl": "Wat is de hoogte van deze boom?", "pt": "Qual a altura dessa árvore?", - "pt_BR": "Qual a altura dessa árvore?" + "pt_BR": "Qual a altura dessa árvore?", + "ca": "Quina és l'alçada d'aquest arbre?" }, "freeform": { "key": "height", @@ -177,7 +180,8 @@ "nl": "Deze boom is {height} meter hoog", "es": "Este árbol tiene {height} metros de altura", "pt": "Esta árvore tem {height} metros de altura", - "pt_BR": "Esta árvore tem {height} metros de altura" + "pt_BR": "Esta árvore tem {height} metros de altura", + "ca": "Aquest arbre té {height} metres d'altura" } }, { @@ -190,7 +194,8 @@ "de": "Wie bedeutsam ist dieser Baum? Wählen Sie die erste Antwort, die zutrifft.", "es": "¿Qué importancia tiene este árbol? Elige la primera respuesta que corresponda.", "da": "Hvor vigtigt er dette træ? Vælg det første svar, der passer.", - "pt": "Quão significativa é esta árvore? Escolha a primeira resposta que se aplica." + "pt": "Quão significativa é esta árvore? Escolha a primeira resposta que se aplica.", + "ca": "Quina importància té aquest arbre? Trieu la primera resposta que correspongui." }, "mappings": [ { @@ -207,7 +212,8 @@ "de": "Der Baum ist aufgrund seiner Größe oder seiner markanten Lage bedeutsam. Er ist nützlich zur Orientierung.", "es": "El árbol es notable debido a su tamaño o ubicación prominente. Es útil para la navegación.", "da": "Træet er bemærkelsesværdigt på grund af sin størrelse eller sin fremtrædende placering. Det er nyttigt til navigation.", - "pt": "A árvore é notável devido ao seu tamanho ou localização proeminente. É útil para navegação." + "pt": "A árvore é notável devido ao seu tamanho ou localização proeminente. É útil para navegação.", + "ca": "L'arbre és notable per la seva mida o per la seva ubicació destacada. És útil per a la navegació." } }, { @@ -224,7 +230,8 @@ "de": "Der Baum ist ein Naturdenkmal, z. B. weil er besonders alt ist oder zu einer wertvollen Art gehört.", "es": "El árbol es un monumento natural, por ejemplo, porque es especialmente antiguo, o de una especie valiosa.", "da": "Træet er et naturmonument, f.eks. fordi den er særlig gammel eller af en værdifuld art.", - "pt": "A árvore é um monumento natural, por ex. porque é especialmente antigo ou de uma espécie valiosa." + "pt": "A árvore é um monumento natural, por ex. porque é especialmente antigo ou de uma espécie valiosa.", + "ca": "L'arbre és un monument natural, p. e. perquè és especialment antic o d'una espècie valuosa." } }, { @@ -241,7 +248,8 @@ "de": "Der Baum wird für landwirtschaftliche Zwecke genutzt, z. B. in einer Obstplantage.", "es": "El árbol se utiliza con fines agrícolas, por ejemplo, en un huerto.", "da": "Træet anvendes til landbrugsformål, f.eks. i en frugtplantage.", - "pt": "A árvore é utilizada para fins agrícolas, por ex. em um pomar." + "pt": "A árvore é utilizada para fins agrícolas, por ex. em um pomar.", + "ca": "L'arbre s'utilitza amb finalitats agrícoles, p. en un hort." } }, { @@ -258,7 +266,8 @@ "de": "Der Baum steht in einem Park oder ähnlichem (Friedhof, Schulgelände, ...).", "es": "El árbol está en un parque o similar (cementerio, recinto escolar, ...).", "da": "Træet står i en park eller lignende (kirkegård, skoleområde, ...).", - "pt": "A árvore está em um parque ou similar (cemitério, pátio da escola, …)." + "pt": "A árvore está em um parque ou similar (cemitério, pátio da escola, …).", + "ca": "L'arbre està en un parc o semblant (cementiri, recinte escolar, …)." } }, { @@ -291,9 +300,10 @@ "it": "Fa parte di un viale alberato.", "fr": "C'est un arbre le long d'une avenue.", "de": "Dieser Baum steht entlang einer Straße.", - "es": "El árbol está en bandejón de una avenida.", + "es": "Este es un árbol a lo largo de una avenida.", "da": "Dette er et træ langs en allé.", - "pt": "Esta é uma árvore ao longo de uma avenida." + "pt": "Esta é uma árvore ao longo de uma avenida.", + "ca": "Aquest és un arbre al llarg d'una avinguda." } }, { @@ -329,7 +339,8 @@ "de": "Dieser Baum steht außerhalb eines städtischen Gebiets.", "es": "El árbol está fuera de una zona urbana.", "da": "Træet står uden for et byområde.", - "pt": "A árvore está fora de uma área urbana." + "pt": "A árvore está fora de uma área urbana.", + "ca": "L'arbre es troba fora d'una zona urbana." } } ] @@ -432,10 +443,11 @@ "ru": "Это дерево вечнозелёное или листопадное?", "fr": "L’arbre est-il à feuillage persistant ou caduc ?", "de": "Ist dies ein Nadelbaum oder ein Laubbaum?", - "es": "¿El árbol es Siempreverde o Caduco?", + "es": "¿El árbol es perenne o caduco?", "da": "Er dette træ stedsegrønt eller løvfældende?", "pt": "Essa árvore é perene ou caducifólia?", - "pt_BR": "Essa árvore é perene ou caducifólia?" + "pt_BR": "Essa árvore é perene ou caducifólia?", + "ca": "Aquest arbre és perenne o caducifoli?" }, "mappings": [ { @@ -453,7 +465,8 @@ "de": "Laubabwerfend: Der Baum verliert für eine gewisse Zeit des Jahres seine Blätter.", "es": "Caduco o Deciduo: el árbol pierde las hojas en un período del año.", "da": "Løvfældende: træet mister bladene i en periode af året.", - "pt": "Caducifólia: a árvore perde as folhas em alguma época do ano." + "pt": "Caducifólia: a árvore perde as folhas em alguma época do ano.", + "ca": "Caducifoli: l'arbre perd les fulles durant alguna època de l'any." } }, { @@ -580,7 +593,8 @@ "de": "Als Denkmal registriert von der Onroerend Erfgoed Flandern", "es": "Registrado como patrimonio por Onroerend Erfgoed Flandes", "id": "Terdaftar sebagai warisan oleh Onroerend Erfgoed Flanders", - "pt": "Registrado como patrimônio por Onroerend Erfgoed Flanders" + "pt": "Registrado como patrimônio por Onroerend Erfgoed Flanders", + "ca": "Registrat com a patrimoni per Onroerend Erfgoed Flandes" }, "icon": { "path": "./assets/layers/tree_node/Onroerend_Erfgoed_logo_without_text.svg", @@ -761,7 +775,8 @@ "de": "ein Laubbaum", "es": "árbol de hoja ancha", "da": "et løvtræ", - "pt": "uma árvore de folhas largas" + "pt": "uma árvore de folhas largas", + "ca": "un arbre de fulla ampla" }, "description": { "nl": "Een boom van een soort die blaadjes heeft, bijvoorbeeld eik of populier.", @@ -770,7 +785,8 @@ "fr": "Un arbre d'une espèce avec de larges feuilles, comme le chêne ou le peuplier.", "de": "Ein Baum mit Blättern, z. B. Eiche oder Buche.", "es": "Un árbol de hojas como el Roble o el Álamo.", - "pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus." + "pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus.", + "ca": "Arbre d'una espècie amb fulles, com el roure o el pollancre." } }, { @@ -787,7 +803,8 @@ "de": "ein Nadelbaum", "es": "Árbol tipo Conífera", "da": "et nåletræ", - "pt": "uma árvore com folhas de agulha" + "pt": "uma árvore com folhas de agulha", + "ca": "un arbre amb fulles d'agulla" }, "description": { "nl": "Een boom van een soort met naalden, bijvoorbeeld den of spar.", @@ -797,7 +814,8 @@ "fr": "Une espèce d’arbre avec des épines comme le pin ou l’épicéa.", "de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.", "es": "Un árbol de hojas agujas, como el Pino o el Abeto.", - "da": "Et træ af en art med nåle, såsom fyr eller gran." + "da": "Et træ af en art med nåle, såsom fyr eller gran.", + "ca": "Arbre d'una espècie amb agulles, com el pi o l'avet." } }, { @@ -826,7 +844,8 @@ "ru": "Если вы не уверены в том, лиственное это дерево или хвойное.", "de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.", "es": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja.", - "da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ." + "da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ.", + "ca": "Si no esteu segur de si es tracta d'un arbre amb fulles amples o amb fulles d'agulles." } } ], @@ -874,6 +893,7 @@ "es": "Una capa que muestra árboles", "de": "Eine Ebene, die Bäume zeigt", "fr": "Une couche montrant les arbres", - "da": "Et lag, der viser træer" + "da": "Et lag, der viser træer", + "ca": "Una capa que mostra arbres" } } diff --git a/assets/layers/usersettings/usersettings.json b/assets/layers/usersettings/usersettings.json index 10d21c736..e4f8d8bcb 100644 --- a/assets/layers/usersettings/usersettings.json +++ b/assets/layers/usersettings/usersettings.json @@ -114,44 +114,51 @@ ] }, "render": { - "en": "This thematic map has a predefined background layer set. Your default theme setting does not apply" + "en": "This thematic map has a predefined background layer set. Your default theme setting does not apply", + "ca": "Aquest mapa temàtic té un conjunt de capes de fons predefinides. La configuració predeterminada del tema no s'aplica" } }, { "id": "background-layer", "question": { - "en": "What background layer should be shown by default?" + "en": "What background layer should be shown by default?", + "ca": "Quina capa de fons s'ha de mostrar per defecte?" }, "condition": "_theme:backgroundLayer=", "mappings": [ { "if": "mapcomplete-preferred-background-layer=", "then": { - "en": "Use the default background layer" + "en": "Use the default background layer", + "ca": "Utilitzeu la capa de fons predeterminada" } }, { "if": "mapcomplete-preferred-background-layer=osm", "then": { - "en": "Use OpenStreetMap-carto as default layer" + "en": "Use OpenStreetMap-carto as default layer", + "ca": "Utilitzeu OpenStreetMap-carto com a capa predeterminada" } }, { "if": "mapcomplete-preferred-background-layer=photo", "then": { - "en": "Use aerial imagery as default background" + "en": "Use aerial imagery as default background", + "ca": "Utilitzeu imatges aèries com a fons predeterminat" } }, { "if": "mapcomplete-preferred-background-layer=map", "then": { - "en": "Use a non-openstreetmap based map as default background" + "en": "Use a non-openstreetmap based map as default background", + "ca": "Utilitzeu un mapa que no sigui openstreetmap com a fons predeterminat" } }, { "if": "mapcomplete-preferred-background-layer:={__current_background}", "then": { - "en": "Use the current background layer ({__current_background}) as default background" + "en": "Use the current background layer ({__current_background}) as default background", + "ca": "Utilitzeu la capa de fons actual ({__current_background}) com a fons predeterminat" }, "hideInAnswer": { "or": [ @@ -164,7 +171,8 @@ { "if": "mapcomplete-preferred-background-layer~*", "then": { - "en": "Use background layer {mapcomplete-preferred-background-layer} as default background" + "en": "Use background layer {mapcomplete-preferred-background-layer} as default background", + "ca": "Utilitza la capa de fons {mapcomplete-preferred-background-layer} com a fons predeterminat" }, "hideInAnswer": true } @@ -287,7 +295,8 @@ "de": "Sollen Fragen für unbekannte Datenfelder einzeln oder zusammen angezeigt werden?", "fr": "Est-ce que les questions pour les champs sans donnée doivent apparaître une à une ou toutes ensembles ?", "pt": "As perguntas para campos de dados desconhecidos devem aparecer uma a uma ou juntas?", - "ca": "Les preguntes amb camps de dades desconeguts haurien d'aparèixer una per una o juntes?" + "ca": "Les preguntes amb camps de dades desconeguts haurien d'aparèixer una per una o juntes?", + "nl": "Moeten onbeantwoorde vragen om beurt of allemaal samen getoond worden?" }, "mappings": [ { @@ -297,7 +306,8 @@ "de": "Alle Fragen in der Infobox zusammen anzeigen", "ca": "Mostra totes les preguntes al quadre d'informació", "fr": "Afficher toutes les question en même temps dans l'infobox", - "pt": "Mostrar todas as perguntas na caixa de informações juntas" + "pt": "Mostrar todas as perguntas na caixa de informações juntas", + "nl": "Toon alle onbeantwoorde vragen" } }, { diff --git a/assets/layers/vending_machine/vending_machine.json b/assets/layers/vending_machine/vending_machine.json index 98ce6dbfd..abac1967f 100644 --- a/assets/layers/vending_machine/vending_machine.json +++ b/assets/layers/vending_machine/vending_machine.json @@ -246,7 +246,8 @@ "if": "vending=meat", "then": { "en": "Meat is sold", - "nl": "Vlees wordt verkocht" + "nl": "Vlees wordt verkocht", + "ca": "Es venen productes carnis" }, "icon": "./assets/layers/id_presets/temaki-meat.svg" }, @@ -406,10 +407,12 @@ "builtin": "phone", "override": { "question": { - "en": "What is the phone number of the operator of this vending machine?" + "en": "What is the phone number of the operator of this vending machine?", + "ca": "Quin és el número de telèfon de l'operador d'aquesta màquina expenedora?" }, "questionHint": { - "en": "This is the number you can call in case of problems with the vending machine" + "en": "This is the number you can call in case of problems with the vending machine", + "ca": "Aquest és el número al qual podeu trucar en cas de problemes amb la màquina expenedora" } } } @@ -835,7 +838,8 @@ "question": { "en": "Sale of meat", "nl": "Verkoop van vlees", - "de": "Verkauf von Fleisch" + "de": "Verkauf von Fleisch", + "ca": "Venda de productes carnis" }, "osmTags": "vending~i~.*meat.*" }, @@ -852,19 +856,22 @@ { "osmTags": "vending~i~.*parking_tickets.*", "question": { - "en": "Sale of parking tickets" + "en": "Sale of parking tickets", + "ca": "Venda d'aparcament" } }, { "osmTags": "vending=elongated_coin", "question": { - "en": "Sale of pressed pennies" + "en": "Sale of pressed pennies", + "ca": "Venda de monedes premsades" } }, { "osmTags": "vending~i~.*public_transport_tickets.*", "question": { - "en": "Sale of public transport tickets" + "en": "Sale of public transport tickets", + "ca": "Venda de bitllets de transport públic" } }, { @@ -910,4 +917,4 @@ "enableRelocation": true }, "deletion": true -} \ No newline at end of file +} diff --git a/assets/svg/mangrove_logo.svg.license b/assets/svg/mangrove_logo.svg.license new file mode 100644 index 000000000..0f5f50aa6 --- /dev/null +++ b/assets/svg/mangrove_logo.svg.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: Mangrove.reviews +SPDX-License-Identifier: LicenseRef-LOGO \ No newline at end of file diff --git a/assets/themes/clock/clock.json b/assets/themes/clock/clock.json index 95b4f4ebd..3e2c1a1ae 100644 --- a/assets/themes/clock/clock.json +++ b/assets/themes/clock/clock.json @@ -15,7 +15,7 @@ "en": "Map showing all public clocks", "nl": "Kaart met alle openbare klokken", "ca": "Mapa amb tots els rellotges públics", - "de": "Karte mit allen öffentlichen Uhren", + "de": "Eine Karte mit öffentlichen Uhren", "es": "Mapa con todos los relojes públicos", "cs": "Mapa zobrazující všechny veřejné hodiny", "fr": "Carte affichant toutes les horloges publiques" diff --git a/assets/themes/elongated_coin/elongated_coin.json b/assets/themes/elongated_coin/elongated_coin.json index 4ac8f93a1..c1e6b25b6 100644 --- a/assets/themes/elongated_coin/elongated_coin.json +++ b/assets/themes/elongated_coin/elongated_coin.json @@ -2,13 +2,13 @@ "id": "elongated_coin", "title": { "en": "Penny Presses", - "de": "Münzpressen", + "de": "Münzprägeautomaten", "es": "Prensa de céntimos", "ca": "Premsa de cèntims" }, "description": { "en": "Find penny presses to create your own elongated coins.", - "de": "Finde Münzpresse um deine eigenen Prägemünzen zu Pressen.", + "de": "Finde Automaten um Souvenirmünzen zu prägen.", "es": "Encuentra prensas de centimos para crear tus propias monedas alargadas.", "ca": "Trobeu premses de cèntims per crear les vostres pròpies monedes allargades." }, diff --git a/langs/ca.json b/langs/ca.json index 7e9cc090b..5ff6fcdd5 100644 --- a/langs/ca.json +++ b/langs/ca.json @@ -344,6 +344,8 @@ }, "useSearch": "Utilitzeu la cerca de dalt per veure els valors predefinits", "useSearchForMore": "Utilitzeu la funció de cerca per cercar dins de {total} valors més…", + "waitingForGeopermission": "Esperant al vostre permís per a utilitzar la geolocalització…", + "waitingForLocation": "Buscant la vostra ubicació actual…", "weekdays": { "abbreviations": { "friday": "Div", @@ -380,6 +382,7 @@ "born": "Nascut: {value}", "died": "Mort: {value}" }, + "readMore": "Llig la resta de l'article", "searchToShort": "La vostra consulta de cerca és massa curta, introduïu un text més llarg", "searchWikidata": "Cercar a Wikidata", "wikipediaboxTitle": "Viquipèdia" @@ -406,11 +409,29 @@ "dontDelete": "Cancel·lar", "isDeleted": "Esborrada", "nearby": { - "seeNearby": "Explora i vincula imatges properes" + "link": "Aquesta imatge mostra l'objecte", + "seeNearby": "Explora i vincula imatges properes", + "title": "Imatges a peu de carrer properes" }, "pleaseLogin": "Entrar per pujar una foto", "respectPrivacy": "Respecta la privacitat. No fotografiïs gent o matrícules. No facis servir imatges de Google Maps, Google Streetview o altres fonts amb copyright.", "toBig": "La teva imatge és massa gran ara que medeix {actual_size}. Usa imatges de com a molt {max_size}", + "upload": { + "failReasons": "És possible que hàgiu perdut la connexió a Internet", + "failReasonsAdvanced": "Com a alternativa, assegureu-vos que el vostre navegador i les extensions no bloquegen les API de tercers.", + "multiple": { + "done": "{count} imatges s'han penjat correctament. Gràcies!", + "partiallyDone": "S'estan penjant {count} imatges, {done} imatges s'hanpenjat…", + "someFailed": "Ho sentim, no hem pogut penjar {count} imatges", + "uploading": "S'estan penjant {count} imatges…" + }, + "one": { + "done": "La teva imatge s'ha penjat correctament. Gràcies!", + "failed": "Ho sentim, no hem pogut penjar la teva imatge", + "retrying": "La teva imatge està tornant a penjar-se…", + "uploading": "La teva imatge s'està penjant…" + } + }, "uploadDone": "La teva imatge ha estat afegida. Gràcies per ajudar!", "uploadFailed": "No s'ha pogut pujar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.", "uploadMultipleDone": "S'han afegit {count} imatges. Gràcies per ajudar!", @@ -496,7 +517,9 @@ }, "plantDetection": { "back": "Tornar a la visió general de les espècies", + "button": "Detecta automàticament les espècies vegetals mitjançant la IA de Plantnet.org", "confirm": "Seleccioneu espècies", + "done": "S'ha aplicat l'espècie", "error": "S'ha produït un error en detectar l'espècie d'arbre: {error}", "howTo": { "intro": "Per obtenir resultats òptims,", @@ -513,7 +536,8 @@ "poweredByPlantnet": "Desenvolupat per plantnet.org", "querying": "Consultant a plantnet.org amb {length} imatges", "seeInfo": "Veure més informació sobre l'espècie", - "takeImages": "Feu imatges de l'arbre per detectar automàticament el tipus d'arbre" + "takeImages": "Feu imatges de l'arbre per detectar automàticament el tipus d'arbre", + "tryAgain": "Seleccioneu una espècie diferent" }, "privacy": { "editing": "Quan facis un canvi al mapa, aquest canvi es registra a OpenStreetMap i està disponible públicament per a tothom. Un conjunt de canvis fet amb MapComplete inclou les dades següents:

  • Els canvis que has fet
  • El teu nom d'usuari
  • Quan es fa aquest canvi
  • La petició que vas utilitzar mentre feies el canvi
  • L'idioma de la interfície d'usuari
  • Una indicació de la proximitat a la que estaves dels objectes canviats. Altres mapejadors poden utilitzar aquesta informació per determinar si es va fer un canvi basant-se en una enquesta o en una investigació remota
Consulta la política de privadesa a OpenStreetMap.org per obtenir informació detallada. Ens agradaria recordar-te que pots utilitzar un nom de ficció quan et registris.", @@ -541,14 +565,14 @@ "title": "{count} revisions", "title_singular": "Una revisió", "tos": "Si crees una ressenya estàs d'acord amb els Termes de Servei i política de privacitat de Mangrove.reviews", - "write_a_comment": "Deixa una revisió…" + "write_a_comment": "Deixa una ressenya…" }, "split": { "cancel": "Cancel·lar", - "hasBeenSplit": "Has tallat aquesta via", + "hasBeenSplit": "Aquesta via s'ha dividit", "inviteToSplit": "Talla aquesta carretera en trossos més petits. Això et permetrà afegir informacions diferents a les parts.", - "loginToSplit": "Has d'entrar per poder tallar una carretera", - "split": "Tallar", + "loginToSplit": "Has d'entrar per poder dividir una carretera", + "split": "Dividir", "splitAgain": "Torneu a dividir aquesta carretera", "splitTitle": "Trieu al mapa on canvien les propietats d'aquesta carretera" }, @@ -568,7 +592,7 @@ }, "validation": { "color": { - "description": "Un color o codi hex" + "description": "Un color o codi hexadecimal" }, "date": { "description": "Una data, començant per l'any" diff --git a/langs/de.json b/langs/de.json index 2c18b8185..93c229561 100644 --- a/langs/de.json +++ b/langs/de.json @@ -155,13 +155,13 @@ "mapillaryHelp": "Mapillary ist ein Online-Dienst, der Straßenbilder sammelt und sie unter einer freien Lizenz anbietet. Mitwirkende dürfen diese Bilder verwenden, um OpenStreetMap zu verbessern", "openIssueTracker": "Fehler melden", "openMapillary": "Mapillary öffnen", - "openOsmcha": "Letzte Bearbeitungen zum Thema {theme} ansehen", + "openOsmcha": "Neueste Bearbeitungen mit {theme} ansehen", "themeBy": "Dieses Thema wurde erstellt von {author}", "title": "Copyright und Urheberrechtsangabe", "translatedBy": "MapComplete wurde übersetzt von {contributors} und {hiddenCount} weiteren Personen" }, "back": "Zurück", - "backToIndex": "Zurück zur Übersicht aller thematischen Karten", + "backToIndex": "Zur Übersicht aller Themenkarten", "backgroundMap": "Hintergrundkarte auswählen", "backgroundSwitch": "Hintergrund wechseln", "cancel": "Abbrechen", @@ -344,6 +344,8 @@ }, "useSearch": "Verwenden Sie die Suche oben, um Voreinstellungen anzuzeigen", "useSearchForMore": "Verwenden Sie die Suchfunktion, um innerhalb von {total} weitere Werte zu suchen…", + "waitingForGeopermission": "Warten auf Ihre Erlaubnis, Standortdaten zu verwenden…", + "waitingForLocation": "Ihr Standort wird gesucht…", "weekdays": { "abbreviations": { "friday": "Fr", @@ -380,6 +382,7 @@ "born": "Geboren am: {value}", "died": "Gestorben am: {value}" }, + "readMore": "Weiterlesen", "searchToShort": "Ihre Suchanfrage ist zu kurz, geben Sie einen längeren Text ein", "searchWikidata": "Wikidata durchsuchen", "wikipediaboxTitle": "Wikipedia" @@ -413,6 +416,9 @@ "pleaseLogin": "Bitte anmelden, um ein Bild hinzuzufügen", "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.", "toBig": "Ihr Bild ist mit {actual_size} zu groß. Die maximale Bildgröße ist {max_size}", + "upload": { + "failReasons": "Keine Internetverbindung" + }, "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", "uploadFailed": "Das Bild konnte nicht hochladen werden. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", "uploadMultipleDone": "{count} Bilder wurden hinzugefügt. Vielen Dank für die Hilfe!", @@ -533,7 +539,7 @@ }, "reviews": { "affiliated_reviewer_warning": "(Partner-Rezension)", - "attribution": "Rezensionen werden bereitgestellt von Mangrove Reviews und sind unter CC-BY 4.0 verfügbar.", + "attribution": "Rezensionen von Mangrove Reviews sind unter CC-BY 4.0 verfügbar.", "i_am_affiliated": "Ich bin an diesem Objekt beteiligt
Auswählen, wenn Sie Eigentümer, Ersteller, Angestellter … sind", "name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen", "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", diff --git a/langs/es.json b/langs/es.json index 9522e2660..7e30fd52c 100644 --- a/langs/es.json +++ b/langs/es.json @@ -424,7 +424,7 @@ }, "split": { "cancel": "Cancelar", - "hasBeenSplit": "Esta característica se ha separado", + "hasBeenSplit": "Esta vía se ha dividido", "inviteToSplit": "Dividir esta carretera en segmentos más pequeños. Esto te permite darle propiedades diferentes a partes diferentes de la carretera.", "loginToSplit": "Debes de haber iniciado sesión para dividir una carretera", "split": "Dividir", diff --git a/langs/layers/ca.json b/langs/layers/ca.json index c0a5bd65e..4f88a4d98 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -616,7 +616,7 @@ "then": "Un ciclista pot passar-hi." }, "1": { - "then": "Un ciclista pot passar-hi." + "then": "Un ciclista no pot passar-hi." } }, "question": "Una bicicleta pot passar aquesta barrera?" @@ -672,6 +672,9 @@ }, "1": { "then": "Aquest banc no té una obra d'art integrada" + }, + "2": { + "then": "Aquest banc probablement no té cap obra d'art integrada" } }, "question": "Aquest banc té algun element artístic?", @@ -1653,6 +1656,9 @@ "tagRenderings": { "bird-hide-shelter-or-wall": { "mappings": { + "0": { + "then": "Observatori d'ocells" + }, "1": { "then": "Observatori d'ocells" }, @@ -1675,7 +1681,8 @@ "3": { "then": "No accessible per a persones amb cadira de rodes" } - } + }, + "question": "Aquest observatori d'ocells és accessible per als usuaris de cadira de rodes?" }, "birdhide-operator": { "mappings": { @@ -1691,6 +1698,9 @@ "mappings": { "1": { "then": "Observatori d'Ocells {name}" + }, + "2": { + "then": "Observatori d'ocells {name}" } }, "render": "Lloc d'observació d'ocells" @@ -2436,10 +2446,31 @@ } }, "climbing_route": { + "name": "Rutes d'escalada", + "presets": { + "0": { + "title": "una ruta d'escalada" + } + }, "tagRenderings": { + "Difficulty": { + "question": "Quin és el grau d'aquesta via d'escalada segons el sistema francès/belga?" + }, + "Length": { + "question": "Quant dura aquesta via d'escalada (en metres)?" + }, "Name": { + "question": "Quin és el nom d'aquesta ruta d'escalada?", "render": "{name}" } + }, + "title": { + "mappings": { + "0": { + "then": "Ruta d'escalada {name}" + } + }, + "render": "Ruta d'escalada" } }, "clock": { @@ -2738,6 +2769,17 @@ } }, "question": "Quin tipus de creuament és aquest?" + }, + "crossing-vibration": { + "mappings": { + "0": { + "then": "El botó d'aquest semàfor té un senyal de vibració per indicar que és segur creuar." + }, + "1": { + "then": "El botó d'aquest semàfor no té cap senyal de vibració que indiqui que és segur creuar." + } + }, + "question": "Aquest semàfor té senyals de vibració per facilitar el pas? (normalment es troba a la part inferior del botó d'encreuament)" } }, "title": { @@ -2802,7 +2844,8 @@ "6": { "then": "Utilitzable per a vehicles tot terreny especialitzats: tractor, ATV" } - } + }, + "question": "Quina és la suavitat d'aquesta via ciclista?" }, "Cycleway:surface": { "mappings": { @@ -2815,11 +2858,29 @@ "2": { "then": "Aquesta via ciclista està feta d'asfalt" }, + "3": { + "then": "Aquesta via ciclista està feta de pedres de paviment suaus" + }, "4": { "then": "Aquesta via ciclista està feta de formigó" }, + "5": { + "then": "Aquesta via ciclista està feta de llambordes (sense tallar o muntar)" + }, + "6": { + "then": "Aquesta via ciclista està feta de llambordes naturals" + }, + "7": { + "then": "Aquesta via ciclista està feta de llamborda plana i quadrada" + }, "8": { "then": "Aquesta via ciclista està feta de fusta" + }, + "9": { + "then": "Aquesta via ciclista està feta de grava" + }, + "10": { + "then": "Aquesta via ciclista està feta de grava fina" } }, "question": "De quina superfície està fet aquesta via ciclista?", @@ -3383,6 +3444,20 @@ } } }, + "speech_output_available": { + "questionHint": "P. e. anuncia la planta actual" + }, + "tactile_writing_available": { + "mappings": { + "0": { + "then": "L'ascensor té escriptura tàctil en Braille" + }, + "1": { + "then": "Aquest ascensor no té escriptura tàctil" + } + }, + "question": "Aquest ascensor té escriptura tàctil?" + }, "tactile_writing_language": { "render": { "special": { @@ -3428,6 +3503,12 @@ }, "1": { "then": "Costa 2 euros premsar un cèntim." + }, + "2": { + "then": "Costa 2 francs suïssos premsar un cèntim." + }, + "3": { + "then": "Costa 1 franc suís premsar un cèntim." } }, "question": "Quant costa premsar un cèntim?", @@ -3452,6 +3533,12 @@ }, "4": { "then": "Esta premsa de cèntims utilitza una moneda de 50 cèntims per a premsar." + }, + "5": { + "then": "Esta premsa de cèntims utilitza una moneda de 10 cèntims per a premsar." + }, + "6": { + "then": "Esta premsa de cèntims utilitza una moneda de 20 cèntims per a premsar." } }, "question": "Quina moneda s'utilitza per a premsar?", @@ -3478,6 +3565,20 @@ "question": "Quants dissenys hi han disponibles?", "render": "Esta premsa té {coin:design_count} dissenys disponibles." }, + "fee": { + "mappings": { + "0": { + "then": "Costa diners premsar una moneda." + }, + "1": { + "then": "Costa diners premsar una moneda." + }, + "2": { + "then": "És gratuït premsar una moneda." + } + }, + "question": "Costa diners premsar una moneda?" + }, "indoor": { "mappings": { "0": { @@ -3758,6 +3859,13 @@ "question": "Té opcions orgàniques" } } + }, + "9": { + "options": { + "0": { + "question": "Ús gratuït" + } + } } } }, @@ -3879,6 +3987,39 @@ }, "3": { "then": "Aquest estació de fitness té una instal·lació per a flexions. Normalment consta d'una o més barres horitzontals baixes." + }, + "4": { + "then": "Aquesta estació de fitness disposa de barres per fer estiraments." + }, + "5": { + "then": "Aquesta estació de fitness disposa d'una estació per fer hiperextensions." + }, + "6": { + "then": "Aquesta estació de fitness disposa d'anelles per fer exercicis de gimnàstica." + }, + "7": { + "then": "Aquest gimnàs té una escala horitzontal, també coneguda com a barres de mico." + }, + "8": { + "then": "Aquesta estació de fitness té barres per pujar-hi." + }, + "9": { + "then": "Aquesta estació de fitness té llocs per fer exercicis d'eslàlom." + }, + "10": { + "then": "Aquesta estació de gimnàs té esglaons." + }, + "11": { + "then": "Aquesta estació de fitness disposa de cons per fer salts de granota." + }, + "12": { + "then": "Aquesta estació de fitness té bigues per saltar." + }, + "13": { + "then": "Aquesta estació de fitness té obstacles per a travesar." + }, + "14": { + "then": "Aquesta estació de fitness té una paret per enfilar-se." } } } @@ -3940,6 +4081,9 @@ }, "2": { "options": { + "0": { + "question": "Restaurants i negocis de menjar ràpid" + }, "1": { "question": "Només negocis de menjar ràpid" }, @@ -3948,6 +4092,13 @@ } } }, + "3": { + "options": { + "0": { + "question": "Té menú vegetarià" + } + } + }, "4": { "options": { "0": { @@ -4733,7 +4884,8 @@ "0": { "then": "Aquesta és una llar d'infants (també coneguda com a preescolar) on els nens petits reben educació primerenca." } - } + }, + "question": "Quin tipus d'instal·lació és aquesta?" }, "name": { "question": "Com s'anomena aquesta instal·lació?", @@ -4778,13 +4930,34 @@ } }, "tagRenderings": { + "map-attribution": { + "mappings": { + "0": { + "then": "OpenStreetMap està clarament atribuït, incloent la llicència ODBL" + }, + "1": { + "then": "OpenStreetMap està clarament atribuït, però no es menciona la llicència" + }, + "2": { + "then": "OpenStreetMap no es mencionava, però algú hi ha posat una enganxina d'OpenStreetMap" + }, + "3": { + "then": "No hi ha atribució" + }, + "4": { + "then": "No hi ha atribució" + } + }, + "question": "Hi ha atribució a OpenStreetMap?" + }, "map-map_source": { "mappings": { "0": { "then": "Aquest mapa està basat en OpenStreetMap" } }, - "question": "En quines dades es basa aquest mapa?" + "question": "En quines dades es basa aquest mapa?", + "render": "Aquest mapa està basat en {map_source}" }, "map_size": { "mappings": { @@ -4811,10 +4984,17 @@ "0": { "then": "Mapa topogràfic

El mapa conté línies de contorn.

" }, + "1": { + "then": "Un mapa amb tots els carrers o camins d'una àrea.

Els carrers estan majoritàriament nomenats; els angles, distàncies etc. són acurades

" + }, "2": { "then": "Això és un mapa esquemàtic.

Un mapa esbossat amb només camins importants i PDI. Els angles, els trajectes etc. són merament il·lustratius, no acurat.

" + }, + "3": { + "then": "Això és un toposcope.

Un marcador erigit en llocs alts que indica la direcció cap als elements paisatgístics notables que es poden veure des d'aquest punt

" } - } + }, + "question": "Quin tipus de mapa es mostra?" } }, "title": { @@ -4900,6 +5080,9 @@ }, "1": { "then": "La tasca està arreglada" + }, + "2": { + "then": "La tasca és un fals positiu" } } } @@ -4924,6 +5107,45 @@ }, "4": { "question": "Mostra les tasques que s'han omès" + }, + "5": { + "question": "Mostra tasques eliminades" + }, + "6": { + "question": "Mostra les tasques que ja estan arreglades" + }, + "7": { + "question": "Mostra les tasques marcades com a massa difícils" + }, + "8": { + "question": "Mostra tasques que s'han desactivat" + } + } + } + }, + "tagRenderings": { + "status": { + "mappings": { + "1": { + "then": "La tasca està arreglada" + }, + "2": { + "then": "La tasca és un fals positiu" + }, + "3": { + "then": "S'ha saltat la tasca" + }, + "4": { + "then": "S'ha suprimit la tasca" + }, + "5": { + "then": "La tasca ja està arreglada" + }, + "6": { + "then": "La tasca està marcada com a massa difícil" + }, + "7": { + "then": "La tasca està desactivada" } } } @@ -5047,29 +5269,47 @@ }, "1": { "then": "No s'admeten gossos" + }, + "2": { + "then": "Els gossos poden anar solts" } - } + }, + "question": "Els gossos estan permesos en aquesta reserva natural?" }, "Editable description": { - "question": "Hi ha alguna informació addicional?" + "question": "Hi ha alguna informació addicional?", + "render": "Informació adicional: {description:0}" }, "Email": { "question": "A quina adreça de correu electrònic es pot enviar amb preguntes i problemes amb aquest parc natural?", "questionHint": "Respecteu la privadesa: només ompliu una adreça de correu electrònic personal si es publica àmpliament" }, "Name tag": { + "mappings": { + "0": { + "then": "Aquesta àrea no té un nom" + } + }, + "question": "Quin és el nom d'aquesta àrea?", "render": "Aquesta àrea s'anomena {name}" }, + "Non-editable description": { + "render": "Informació adicional: {description}" + }, "Operator tag": { "mappings": { "0": { "then": "Gestionat per NatuurPunt" }, + "1": { + "then": "Gestionat per {operator}" + }, "2": { "then": "Gestionat per Agentschap Natuur en Bos" } }, - "question": "Qui gestiona aquesta àrea?" + "question": "Qui gestiona aquesta àrea?", + "render": "Gestionat per {operator}" }, "Surface area": { "render": "Superfície: {_surface:ha}Ha" @@ -5078,12 +5318,81 @@ "question": "A quin número de telèfon es pot trucar amb preguntes i problemes amb aquest parc natural?", "questionHint": "Respecteu la privadesa: només empleneu una adreça de número de telèfon personal si es publica àmpliament" } + }, + "title": { + "render": "Reserva Natural" } }, "note": { "filter": { + "0": { + "options": { + "0": { + "question": "Has de mencionar {search} en el primer comentari" + } + } + }, + "2": { + "options": { + "0": { + "question": "Obert pel contribuïdor {search}" + } + } + }, + "3": { + "options": { + "0": { + "question": "No obert pel contribuïdor {search}" + } + } + }, + "4": { + "options": { + "0": { + "question": "Editat per última vega pel contribuïdor {search}" + } + } + }, + "5": { + "options": { + "0": { + "question": "Oberta després de {search}" + } + } + }, + "6": { + "options": { + "0": { + "question": "Creada abans de {search}" + } + } + }, + "7": { + "options": { + "0": { + "question": "Creada després de {search}" + } + } + }, + "8": { + "options": { + "0": { + "question": "Sols mostrar les notes obertes per contribuïdors anònims" + } + } + }, + "9": { + "options": { + "0": { + "question": "Sols mostra les notes obertes" + } + } + }, "10": { "options": { + "0": { + "question": "Totes les notes" + }, "1": { "question": "Oculta les notes d'importació" }, @@ -5130,7 +5439,7 @@ }, "Operator": { "question": "Qui manté aquesta torre?", - "render": "Mantés per {operator}" + "render": "Mantés per {operator}" }, "access": { "mappings": { @@ -5443,8 +5752,12 @@ "then": "Aquesta màquina de tiquets d'aparcament no té número de referència" } }, + "question": "Quin és el número de referència d'aquesta màquina de bitllets d'aparcament?", "render": "Aquesta màquina de tiquets d'aparcament té el número de referència {ref}" } + }, + "title": { + "render": "Màquina de bitllets d'aparcament" } }, "pedestrian_path": { @@ -5452,9 +5765,35 @@ "name": "Camins per a vianants" }, "pharmacy": { + "description": "Una capa que mostra les farmàcies, que (probablement) distribueixen medicaments amb recepta", + "filter": { + "0": { + "options": { + "0": { + "question": "Té autoservei" + } + } + }, + "1": { + "options": { + "0": { + "question": "Farmàcia que subministra medicaments amb recepta" + } + } + } + }, "name": "Farmàcies", + "presets": { + "0": { + "title": "una farmàcia" + } + }, "tagRenderings": { "name": { + "freeform": { + "placeholder": "Nom de la farmàcia" + }, + "question": "Quin és el nom de la farmàcia?", "render": "Aquesta farmàcia es diu {name}" }, "wheelchair": { @@ -5471,15 +5810,59 @@ }, "question": "És fàcil accedir a aquesta farmàcia amb una cadira de rodes?" } + }, + "title": { + "mappings": { + "0": { + "then": "Farmàcia" + } + }, + "render": "{name}" + } + }, + "physiotherapist": { + "description": "Aquesta capa mostra fisioterapeutes", + "name": "Fisioterapeuta", + "presets": { + "0": { + "title": "una consulta fisioterapèutica" + } + }, + "tagRenderings": { + "name": { + "question": "Quin és el nom d'aquesta consulta fisioterapèutica?", + "render": "Aquesta consulta fisioterapèutica es diu {name}" + } + }, + "title": { + "render": "Fisioterapeuta {name}" } }, "picnic_table": { + "description": "La capa mostra taules de pícnic", "name": "Taules de pícnic", "presets": { "0": { "title": "una taula de pícnic" } }, + "tagRenderings": { + "picnic_table-material": { + "mappings": { + "0": { + "then": "Aquesta és una taula de pícnic de fusta" + }, + "1": { + "then": "Açò és una taula de pícnic de formigó" + }, + "2": { + "then": "Açò és una taula de pícnic feta de plàstic reciclat" + } + }, + "question": "De quin material està feta aquesta taula de pícnic?", + "render": "Aquesta taula de pícnic està feta de {material}" + } + }, "title": { "render": "Taula de pícnic" } @@ -5525,6 +5908,9 @@ "2": { "then": "Només accessible per als clients del negoci que l'opera" }, + "3": { + "then": "Només accessible per als alumnes de l'escola" + }, "4": { "then": "No accessible" }, @@ -5550,7 +5936,8 @@ "question": "Aquest parc infantil està il·luminat per la nit?" }, "playground-max_age": { - "question": "Quina és l'edat màxima permesa per accedir al parc infantil?" + "question": "Quina és l'edat màxima permesa per accedir al parc infantil?", + "render": "Accessible per a nens de com a màxim {max_age}" }, "playground-min_age": { "question": "Quina és l'edat mínima requerida per a accedir al parc infantil?" @@ -5593,10 +5980,17 @@ }, "5": { "then": "La superfície és formigó" + }, + "6": { + "then": "La superfícies està sense pavimentar" + }, + "7": { + "then": "La superfície està pavimentada" } }, "question": "Quina és la superfície d'aquest parc infantil?", - "questionHint": "Si n'hi ha múltiples, selecciona la més predominant" + "questionHint": "Si n'hi ha múltiples, selecciona la més predominant", + "render": "La superfícies és {surface}" } }, "title": { @@ -5621,6 +6015,7 @@ } }, "postoffices": { + "description": "Una capa que mostra oficines postals.", "name": "Oficines de correus", "presets": { "0": { @@ -5651,7 +6046,8 @@ "then": "No pots enviar cartes des d'aquí" } }, - "question": "Pots enviar cartes des d'aquí?" + "question": "Pots enviar cartes des d'aquí?", + "render": "Podeu enviar cartes amb aquestes empreses: {post_office:letter_from}" }, "parcel-from": { "mappings": { @@ -5662,7 +6058,8 @@ "then": "No pots enviar paquets des d'aquí" } }, - "question": "Pots enviar un paquet des d'aquí?" + "question": "Pots enviar un paquet des d'aquí?", + "render": "Podeu enviar paquets amb aquestes empreses: {post_office:parcel_from}" }, "parcel-pickup": { "mappings": { @@ -5673,7 +6070,8 @@ "then": "No podeu recollir paquets perduts aquí" } }, - "question": "Es poden recollir els paquets perduts aquí?" + "question": "Es poden recollir els paquets perduts aquí?", + "render": "Podeu recollir paquets d'aquestes empreses: {post_office:parcel_pickup}" }, "parcel-to": { "mappings": { @@ -5684,7 +6082,8 @@ "then": "No pots enviar paquets ací per a arreplegar-los" } }, - "question": "Pots enviar paquets aquí per a arreplegar-los?" + "question": "Pots enviar paquets aquí per a arreplegar-los?", + "render": "Podeu enviar paquets aquí per recollir-los amb aquestes empreses: {post_office:parcel_to}" }, "partner-brand": { "mappings": { @@ -5741,7 +6140,7 @@ "then": "Col·laborador postal a {name}" } }, - "render": "Oficina de correus" + "render": "Oficina postal" } }, "public_bookcase": { @@ -5921,6 +6320,15 @@ }, "10": { "then": "S'accepten monedes de 20 cèntims" + }, + "12": { + "then": "S'accepten monedes d'1 franc" + }, + "13": { + "then": "S'accepten monedes de 2 francs" + }, + "14": { + "then": "S'accepten monedes de 5 francs" } }, "question": "Quines monedes es poden utilitzar per a pagar aquí?" @@ -5947,6 +6355,24 @@ }, "6": { "then": "S'accepten bitllets de 500 euros" + }, + "7": { + "then": "S'accepten bitllets de 10 francs" + }, + "8": { + "then": "S'accepten bitllets de 20 francs" + }, + "9": { + "then": "S'accepten bitllets de 50 francs" + }, + "10": { + "then": "S'accepten bitllets de 100 francs" + }, + "11": { + "then": "S'accepten bitllets de 200 francs" + }, + "12": { + "then": "S'accepten bitllets de 1000 francs" } }, "question": "Amb quins bitllets pot pagar aquí?" @@ -6034,6 +6460,13 @@ } } }, + "last_edit": { + "render": { + "special": { + "text": "Darrera edició el {_last_edit:timestamp} per {_last_edit:contributor}" + } + } + }, "luminous_or_lit": { "mappings": { "0": { @@ -6663,6 +7096,11 @@ "name": "Refugi", "tagRenderings": { "shelter-type": { + "mappings": { + "4": { + "then": "Es tracta d'un cobert amb 3 parets, destinat principalment a l'acampada." + } + }, "question": "Quin tipus de refugi és aquest?" } }, @@ -7046,6 +7484,12 @@ "tagRenderings": { "conveying": { "mappings": { + "0": { + "then": "Açò és una escala mecànica" + }, + "1": { + "then": "Açò no és una escala mecànica" + }, "2": { "then": "Això no és una escala mecànica" } @@ -7055,7 +7499,17 @@ "mappings": { "0": { "then": "Aquestes escales tenen barana" + }, + "1": { + "then": "Aquestes escales no tenen un passamà" } + }, + "question": "Aquestes escales tenen un passamà?" + }, + "multilevels": { + "override": { + "question": "Entre quines plantes estan aquestes escales?", + "render": "Aquestes escales estan entre les plantes {level}" } }, "ramp": { @@ -7066,6 +7520,9 @@ "1": { "then": "Aquí hi ha una rampa per a cadires de rodes" }, + "2": { + "then": "Aquí hi ha una rampa per a cadira de rodes, però es mostra separadament al mapa" + }, "3": { "then": "Aquí hi ha una rampa per als cotxets" }, @@ -7085,10 +7542,28 @@ } }, "question": "Aquestes escales tenen escriptura braille a la barana?" + }, + "tactile_writing_language": { + "render": { + "special": { + "question": "En quins idiomes hi ha escriptura tàctil (braille) per a la navegació? ", + "render_list_item": "Aquestes escales tenen escriptura tàctil en {language():font-bold}", + "render_single_language": "Aquestes escales tenen escriptura tàctil en {language():font-bold}" + } + } } + }, + "title": { + "mappings": { + "0": { + "then": "Escala mecànica" + } + }, + "render": "Escales" } }, "street_lamps": { + "description": "Una capa que mostra els llums del carrer", "name": "Fanals", "presets": { "0": { @@ -7108,7 +7583,8 @@ "then": "Aquest fanal emet llum taronja" } }, - "question": "Quin color de llum emet aquest fanal?" + "question": "Quin color de llum emet aquest fanal?", + "render": "Aquesta làmpada emet llum {light:colour}" }, "count": { "mappings": { @@ -7119,7 +7595,8 @@ "then": "Aquest fanal té 2 aparells" } }, - "question": "Quants accessoris té aquest fanal?" + "question": "Quants accessoris té aquest fanal?", + "render": "Aquesta làmpada té {light:count} aparells" }, "direction": { "question": "Cap a on apunta aquest fanal?", @@ -7155,6 +7632,9 @@ }, "method": { "mappings": { + "0": { + "then": "Aquest fanal s'encén elèctricament" + }, "1": { "then": "Aquest fanal utilitza LED" }, @@ -7192,22 +7672,64 @@ "question": "Quin tipus d'il·luminació utilitza aquest fanal?" }, "ref": { - "question": "Quin és el número de referència d'aquest fanal?" + "question": "Quin és el número de referència d'aquest fanal?", + "render": "Aquest fanal té el número de referència {ref}" }, "support": { "mappings": { + "0": { + "then": "Aquesta làmpada està suspès mitjançant cables" + }, + "1": { + "then": "Aquesta làmpada està muntat al sostre" + }, + "2": { + "then": "Aquesta làmpada està muntat a terra" + }, + "3": { + "then": "Aquesta làmpada està muntada en un pal curt (principalment <1,5 m)" + }, "4": { - "then": "Aquest fanal està muntat en un pal" + "then": "Aquesta làmpada està muntada en un pal" + }, + "5": { + "then": "Aquesta làmpada està muntada directament a la paret" }, "6": { - "then": "Aquest fanal està muntat a la paret utilitzat una barra metàl·lica" + "then": "Aquesta làmpada està muntada a la paret utilitzat una barra metàl·lica" } - } + }, + "question": "Com està muntada aquesta làmpada?" } + }, + "title": { + "mappings": { + "0": { + "then": "Fanal {ref}" + } + }, + "render": "Fanal" } }, "surveillance_camera": { + "description": "Aquesta capa mostra les càmeres de vigilància i permet a qui col·labora, actualitzar la informació i afegir noves càmeres", "name": "Càmeres de videovigilància", + "presets": { + "0": { + "title": "una càmera de vigilància" + }, + "1": { + "title": "una càmera de vigilància muntada en una paret" + }, + "2": { + "description": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", + "title": "una càmera ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" + }, + "3": { + "description": "Un ALPR normalment té dues lents i una sèrie de llums infrarojes.", + "title": "una càmera ALPR (lector automàtic de matrícules) muntada a la paret" + } + }, "tagRenderings": { "Camera type: fixed; panning; dome": { "mappings": { @@ -7223,6 +7745,9 @@ }, "question": "Quin tipus de càmera és aquesta?" }, + "Level": { + "render": "Ubicat a la planta {level}" + }, "Operator": { "question": "Qui opera aquest circuit de televisió tancat?", "render": "Operat per {operator}" @@ -7287,8 +7812,39 @@ "render": "Mètode de muntatge: {camera:mount}" }, "camera_direction": { + "mappings": { + "0": { + "then": "Grava en direcció {direction}" + } + }, "question": "En quina direcció geogràfica apunta aquesta càmera?", "render": "Grava en direcció {camera:direction}" + }, + "has_alpr": { + "mappings": { + "0": { + "then": "Es tracta d'una càmera sense reconeixement de matrícules." + }, + "1": { + "then": "Açò és un ALPR (lector automàtic de matrícules, per les seves sigles en anglès)" + } + }, + "question": "Aquesta càmera pot detectar matrícules automàticament?", + "questionHint": "Un ALPR (lector automàtic de matrícules, per les seves sigles en anglès) normalment té dues lents i una sèrie de LEDs infrarojos entremig." + }, + "is_indoor": { + "mappings": { + "0": { + "then": "Aquesta càmera es troba a l'interior" + }, + "1": { + "then": "Aquesta càmera es troba a l'exterior" + }, + "2": { + "then": "Aquesta càmera probablement es troba a l'exterior" + } + }, + "question": "L'espai públic vigilat per aquesta càmera és un espai interior o exterior?" } }, "title": { @@ -7296,13 +7852,19 @@ } }, "tertiary_education": { + "presets": { + "0": { + "title": "una universitat" + } + }, "tagRenderings": { "institution-kind": { "mappings": { "1": { "then": "Açò és una universitat, una institució d'educació terciaria on s'imparteixen carreres universitàries o superior." } - } + }, + "question": "Quin tipus d'institució és aquesta?" }, "isced": { "mappings": { @@ -7318,11 +7880,23 @@ }, "question": "Quin nivell d'educació és dona aquí?" } + }, + "title": { + "mappings": { + "2": { + "then": "Universitat" + } + } } }, "ticket_machine": { "description": "Troba màquines de bitllets per a bitllets de transport públic", "name": "Màquines de bitllets", + "presets": { + "0": { + "title": "una màquina de bitllets" + } + }, "tagRenderings": { "operator": { "freeform": { @@ -7565,7 +8139,7 @@ } }, "toilet_at_amenity": { - "description": "Una capa que mostra banys (públics) ubicats en diferents llocs", + "description": "Una capa que mostra banys (públics) ubicats en diferents llocs.", "filter": { "0": { "options": { @@ -7575,6 +8149,7 @@ } } }, + "name": "Lavabos a altres instal·lacions", "tagRenderings": { "toilet-access": { "mappings": { @@ -7625,16 +8200,60 @@ } }, "question": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?" + }, + "wheelchair-door-width": { + "question": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?" + } + }, + "units": { + "0": { + "applicableUnits": { + "0": { + "human": "metre" + }, + "1": { + "human": "centimetre" + } + } } } }, "trail": { "name": "Camins", + "tagRenderings": { + "Color": { + "mappings": { + "0": { + "then": "Ruta blava" + }, + "1": { + "then": "Ruta vermella" + }, + "2": { + "then": "Ruta verda" + }, + "3": { + "then": "Ruta groga" + } + } + }, + "trail-length": { + "render": "El sender té {_length:km} quilòmetres" + } + }, "title": { "render": "Camí" } }, "transit_routes": { + "description": "Capa que mostra les línies d'autobús", + "mapRendering": { + "0": { + "color": { + "render": "#ff0000" + } + } + }, "name": "Línies de bus", "tagRenderings": { "colour": { @@ -7656,7 +8275,18 @@ "to": { "question": "Quin és el punt final d'aquesta línea d'autobús?", "render": "Aquesta línia d'autobús acaba a {to}" + }, + "via": { + "render": "Aquesta línia d'autobús passa per {via}" } + }, + "title": { + "mappings": { + "0": { + "then": "{name}" + } + }, + "render": "Línia de bus" } }, "transit_stops": { @@ -7668,6 +8298,13 @@ } } }, + "1": { + "options": { + "0": { + "question": "Amb un banc" + } + } + }, "2": { "options": { "0": { @@ -7685,6 +8322,9 @@ }, "1": { "then": "Aquesta parada no té un banc" + }, + "2": { + "then": "Aquesta parada té un banc que està mapejat separadament" } }, "question": "Aquesta parada té un banc?" @@ -7696,6 +8336,9 @@ }, "1": { "then": "Aquesta parada no té paperera" + }, + "2": { + "then": "Aquesta parada té una paperera que està mapejada separadament" } }, "question": "Aquesta parada té una paperera?" @@ -7705,11 +8348,23 @@ }, "departures_board": { "mappings": { + "0": { + "then": "Aquesta parada té un tauler de sortides de tipus desconegut" + }, "1": { "then": "Aquesta parada té un tauló amb els horaris en temps real" }, "2": { "then": "Aquesta parada té un tauló amb els horaris en temps real" + }, + "3": { + "then": "Aquesta parada té un horari que mostra les sortides regulars" + }, + "4": { + "then": "Aquesta parada té un horari que conté només l'interval entre sortides" + }, + "5": { + "then": "Aquesta parada no té un tauler de sortides" } } }, @@ -7731,11 +8386,17 @@ }, "1": { "then": "Aquesta parada no té una coberta" + }, + "2": { + "then": "Aquesta parada té un refugi que està mapejat separadament" } }, "question": "Aquesta parada té una coberta?" }, "stop_name": { + "freeform": { + "placeholder": "Nom de la parada" + }, "mappings": { "0": { "then": "Aquesta parada no té nom" @@ -7755,38 +8416,87 @@ }, "question": "Aquesta parada té una superfície podotàctil?" } + }, + "title": { + "mappings": { + "0": { + "then": "Parada {name}" + } + } } }, "tree_node": { + "description": "Una capa que mostra arbres", "name": "Arbre", "presets": { + "0": { + "description": "Arbre d'una espècie amb fulles, com el roure o el pollancre.", + "title": "un arbre de fulla ampla" + }, + "1": { + "description": "Arbre d'una espècie amb agulles, com el pi o l'avet.", + "title": "un arbre amb fulles d'agulla" + }, "2": { + "description": "Si no esteu segur de si es tracta d'un arbre amb fulles amples o amb fulles d'agulles.", "title": "un arbre" } }, "tagRenderings": { "circumference": { - "questionHint": "Es mesura a una alçada d'1,30 m" + "question": "Quina és la circumferència del tronc de l'arbre?", + "questionHint": "Es mesura a una alçada d'1,30 m", + "render": "El tronc de l'arbre té una circumferència de {circumference} metre" + }, + "height": { + "question": "Quina és l'alçada d'aquest arbre?", + "render": "Aquest arbre té {height} metres d'altura" }, "tree-decidouous": { "mappings": { + "0": { + "then": "Caducifoli: l'arbre perd les fulles durant alguna època de l'any." + }, "1": { "then": "Perenne." } - } + }, + "question": "Aquest arbre és perenne o caducifoli?" }, "tree-denotation": { "mappings": { + "0": { + "then": "L'arbre és notable per la seva mida o per la seva ubicació destacada. És útil per a la navegació." + }, + "1": { + "then": "L'arbre és un monument natural, p. e. perquè és especialment antic o d'una espècie valuosa." + }, + "2": { + "then": "L'arbre s'utilitza amb finalitats agrícoles, p. en un hort." + }, + "3": { + "then": "L'arbre està en un parc o semblant (cementiri, recinte escolar, …)." + }, "4": { "then": "L'arbre està en un jardí residencial." }, + "5": { + "then": "Aquest és un arbre al llarg d'una avinguda." + }, "6": { "then": "L'arbre està en una àrea urbana." + }, + "7": { + "then": "L'arbre es troba fora d'una zona urbana." } - } + }, + "question": "Quina importància té aquest arbre? Trieu la primera resposta que correspongui." }, "tree-heritage": { "mappings": { + "0": { + "then": "Registrat com a patrimoni per Onroerend Erfgoed Flandes" + }, "1": { "then": "Registrat com a patrimoni per la Direction du Patrimoine culturel Brussel·les" }, @@ -7855,6 +8565,32 @@ }, "question": "Les preguntes amb camps de dades desconeguts haurien d'aparèixer una per una o juntes?" }, + "background-layer": { + "mappings": { + "0": { + "then": "Utilitzeu la capa de fons predeterminada" + }, + "1": { + "then": "Utilitzeu OpenStreetMap-carto com a capa predeterminada" + }, + "2": { + "then": "Utilitzeu imatges aèries com a fons predeterminat" + }, + "3": { + "then": "Utilitzeu un mapa que no sigui openstreetmap com a fons predeterminat" + }, + "4": { + "then": "Utilitzeu la capa de fons actual ({__current_background}) com a fons predeterminat" + }, + "5": { + "then": "Utilitza la capa de fons {mapcomplete-preferred-background-layer} com a fons predeterminat" + } + }, + "question": "Quina capa de fons s'ha de mostrar per defecte?" + }, + "background-layer-readonly": { + "render": "Aquest mapa temàtic té un conjunt de capes de fons predefinides. La configuració predeterminada del tema no s'aplica" + }, "contributor-thanks": { "mappings": { "0": { @@ -8075,6 +8811,18 @@ }, "17": { "question": "Venda de flors" + }, + "17": { + "question": "Venda d'aparcament" + }, + "18": { + "question": "Venda de monedes premsades" + }, + "19": { + "question": "Venda de bitllets de transport públic" + }, + "20": { + "question": "Venda de productes carnis" } } } @@ -8107,6 +8855,12 @@ "question": "Qui opera aquesta màquina expenedora?", "render": "{operator} gestiona aquesta màquina expenedora" }, + "phone": { + "override": { + "question": "Quin és el número de telèfon de l'operador d'aquesta màquina expenedora?", + "questionHint": "Aquest és el número al qual podeu trucar en cas de problemes amb la màquina expenedora" + } + }, "vending": { "mappings": { "0": { @@ -8165,6 +8919,9 @@ }, "19": { "then": "Es venen bitllets de transport públic" + }, + "19": { + "then": "Es venen productes carnis" } }, "question": "Que ven aquesta màquina expenedora?", diff --git a/langs/layers/de.json b/langs/layers/de.json index 9a0b859e1..acd834ad0 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -672,6 +672,9 @@ }, "1": { "then": "Diese Bank hat kein integriertes Kunstwerk" + }, + "2": { + "then": "Die Bank hat vermutlich kein integriertes Kunstwerk" } }, "question": "Hat diese Bank ein künstlerisches Element?", @@ -4241,28 +4244,34 @@ } }, "elongated_coin": { - "description": "Ebene mit Münzpressen.", - "name": "Münzpressen", + "description": "Ebene mit Münzprägeautomaten.", + "name": "Münzprägeautomaten", "presets": { "0": { - "title": "Eine Münzpresse" + "title": "Einen Münzprägeautomaten" } }, "tagRenderings": { "charge": { "freeform": { - "placeholder": "Einwurf (z.B. 0,5€)" + "placeholder": "Gebühr (z.B. 0,50 €)" }, "mappings": { "0": { - "then": "Eine Münze zu Pressen kostet 1 Euro." + "then": "Die Prägung einer Münze kostet 1,00 €." }, "1": { - "then": "Eine Münze zu Pressen kostet 2€." + "then": "Die Prägung einer Münze kostet 2,00 €." + }, + "2": { + "then": "Die Prägung einer Münze kostet 2 Schweizer Franken." + }, + "3": { + "then": "Die Prägung einer Münze kostet 1 Schweizer Franken." } }, - "question": "Wieviel kostet es eine Münze zu Pressen?", - "render": "Es kostet {charge}€ um eine Münze zu Pressen." + "question": "Wieviel kostet die Prägung einer Münze?", + "render": "Die Prägung einer Münze kostet {charge}." }, "coin": { "freeform": { @@ -4270,23 +4279,29 @@ }, "mappings": { "0": { - "then": "Die Münzpresse benötigt eine 2 Cent Münze um zu Pressen." + "then": "Der Automat prägt 2 Cent Münzen." }, "1": { - "then": "Die Münzpresse benötigt eine 5 Cent Münze um zu Pressen." + "then": "Der Automat prägt 5 Cent Münzen." }, "2": { - "then": "Die Münzpresse benötigt eine 10 Cent Münze um zu Pressen." + "then": "Der Automat prägt 10 Cent Münzen." }, "3": { - "then": "Die Münzpresse benötigt eine 25 Cent Münze um zu Pressen." + "then": "Der Automat prägt 25 Cent Münzen." }, "4": { - "then": "Die Münzpresse benötigt eine 50 Cent Münze um zu Pressen." + "then": "Der Automat prägt 50 Cent Münzen." + }, + "5": { + "then": "Der Automat prägt 10 Centime Münzen." + }, + "6": { + "then": "Der Automat prägt 5 Centime Münzen." } }, - "question": "Welche Münze wird zum Pressen verwendet?", - "render": "Die Münzpresse benötigt eine {coin:type} Münze um zu Pressen." + "question": "Welche Münzen können geprägt werden?", + "render": "Der Automat prägt {coin:type} Cent Münzen." }, "designs": { "freeform": { @@ -4294,35 +4309,49 @@ }, "mappings": { "0": { - "then": "Die Münzpresse hat ein Motiv zur Auswahl." + "then": "Der Prägeautomat hat ein Motiv zur Auswahl." }, "1": { - "then": "Die Münzpresse hat zwei Motive zur Auswahl." + "then": "Der Prägeautomat hat zwei Motive zur Auswahl." }, "2": { - "then": "Die Münzpresse hat drei Motive zur Auswahl." + "then": "Der Prägeautomat hat drei Motive zur Auswahl." }, "3": { - "then": "Die Münzpresse hat vier Motive zur Auswahl." + "then": "Der Prägeautomat hat vier Motive zur Auswahl." } }, "question": "Wieviele Motive sind verfügbar?", - "render": "Die Münzpresse hat {coin:design_count} Motive zur Auswahl." + "render": "Der Prägeautomat hat {coin:design_count} Motive zur Auswahl." + }, + "fee": { + "mappings": { + "0": { + "then": "Das Prägen ist kostenpflichtig." + }, + "1": { + "then": "Das Prägen ist kostenpflichtig." + }, + "2": { + "then": "Das Prägen ist kostenlos." + } + }, + "question": "Ist das Prägen kostenpflichtig?" }, "indoor": { "mappings": { "0": { - "then": "Die Münzpresse befindet sich im Inneren." + "then": "Der Prägeautomat befindet sich im Inneren." }, "1": { - "then": "Die Münzpresse befindet sich Draußen." + "then": "Der Prägeautomat befindet sich im Freien." } }, - "question": "Befindet sich die Münzpresse im Inneren?" + "question": "Befindet sich der Prägeautomat im Inneren?" } }, "title": { - "render": "Münzpresse" + "render": "Prägeautomat" } }, "entrance": { diff --git a/langs/layers/en.json b/langs/layers/en.json index a29f1be33..de19f0bac 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -4697,6 +4697,19 @@ "question": "Free to use" } } + }, + "10": { + "options": { + "0": { + "question": "No preference towards dogs" + }, + "1": { + "question": "Dogs allowed" + }, + "2": { + "question": "No dogs allowed" + } + } } } }, @@ -5608,6 +5621,84 @@ }, "question": "What is the reference number of this room?", "render": "This room has the reference number {ref}" + }, + "room-capacity": { + "question": "How much people can at most fit in this room?", + "render": "At most {capacity} people fit this room" + }, + "room-type": { + "mappings": { + "0": { + "then": "This is a administrative room" + }, + "1": { + "then": "This is a auditorium" + }, + "2": { + "then": "This is a bedroom" + }, + "3": { + "then": "This is a chapel" + }, + "4": { + "then": "This is a classroom" + }, + "5": { + "then": "This is a classroom" + }, + "6": { + "then": "This is a computer room" + }, + "7": { + "then": "This is a conference room" + }, + "8": { + "then": "This is a crypt" + }, + "9": { + "then": "This is a kitchen" + }, + "10": { + "then": "This is a laboratory" + }, + "11": { + "then": "This is a library" + }, + "12": { + "then": "This is a locker room" + }, + "13": { + "then": "This is a nursery" + }, + "14": { + "then": "This is an office" + }, + "15": { + "then": "This is a prison_cell" + }, + "16": { + "then": "This is a restaurant" + }, + "17": { + "then": "This is a room to perform security checks" + }, + "18": { + "then": "This is a sport room" + }, + "19": { + "then": "This is a storage room" + }, + "20": { + "then": "This is a technical room" + }, + "21": { + "then": "These are toilets" + }, + "22": { + "then": "This is a waiting room" + } + }, + "question": "What type of room is this?" } }, "title": { diff --git a/langs/layers/es.json b/langs/layers/es.json index 7a6ee531c..d2c209405 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -3440,7 +3440,7 @@ } }, "postoffices": { - "description": "Una capa que muestra oficinas de correo.", + "description": "Una capa que muestra oficinas postales.", "name": "Oficinas de correo", "presets": { "0": { @@ -3450,7 +3450,7 @@ "tagRenderings": { "opening_hours": { "override": { - "question": "¿Cuáles son las horas de apertura para esta oficina de correos?" + "question": "¿Cuáles son las horas de apertura para esta oficina postal?" } } }, @@ -4389,7 +4389,7 @@ }, "Level": { "question": "¿A qué nivel está colocada esta cámara?", - "render": "Está colocada a nivel {level}" + "render": "Ubicado en la planta {level}" }, "Operator": { "question": "¿Quién opera el sistema de esta cámara?", @@ -4688,7 +4688,7 @@ "then": "Siempreverde." } }, - "question": "¿El árbol es Siempreverde o Caduco?" + "question": "¿El árbol es perenne o caduco?" }, "tree-denotation": { "mappings": { @@ -4708,7 +4708,7 @@ "then": "El árbol está en un jardín privado o residencial." }, "5": { - "then": "El árbol está en bandejón de una avenida." + "then": "Este es un árbol a lo largo de una avenida." }, "6": { "then": "El árbol está en un zona urbana." diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 39a19e3e8..aac081999 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -8939,10 +8939,14 @@ "tagRenderings": { "all-questions-at-once": { "mappings": { + "0": { + "then": "Toon alle onbeantwoorde vragen" + }, "1": { "then": "Toon de vragen één per één" } - } + }, + "question": "Moeten onbeantwoorde vragen om beurt of allemaal samen getoond worden?" }, "contributor-thanks": { "mappings": { diff --git a/langs/themes/de.json b/langs/themes/de.json index d528c5bb6..099e67d1e 100644 --- a/langs/themes/de.json +++ b/langs/themes/de.json @@ -452,7 +452,7 @@ "title": "Kletterhallen, Vereine und Kletterstellen" }, "clock": { - "description": "Karte mit allen öffentlichen Uhren", + "description": "Eine Karte mit öffentlichen Uhren", "title": "Uhren" }, "cycle_highways": { @@ -608,8 +608,8 @@ "title": "Bildungseinrichtungen" }, "elongated_coin": { - "description": "Finde Münzpresse um deine eigenen Prägemünzen zu Pressen.", - "title": "Münzpressen" + "description": "Finde Automaten um Souvenirmünzen zu prägen.", + "title": "Münzprägeautomaten" }, "etymology": { "description": "Auf dieser Karte können Sie sehen, wonach ein Objekt benannt ist. Die Straßen, Gebäude, ... stammen von OpenStreetMap, und wurden mit Wikidata verknüpft. Im 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! Wenn Sie weit genug hinein zoomen werden alle Straßen 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.", diff --git a/package-lock.json b/package-lock.json index 7422c4260..434775519 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapcomplete", - "version": "0.33.4", + "version": "0.33.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mapcomplete", - "version": "0.33.4", + "version": "0.33.5", "license": "GPL-3.0-or-later", "dependencies": { "@rgossiaux/svelte-headlessui": "^1.0.2", @@ -4970,9 +4970,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001541", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", + "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", "dev": true, "funding": [ { @@ -17021,9 +17021,9 @@ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001541", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", + "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", "dev": true }, "canvg": { diff --git a/package.json b/package.json index 66bf5bccb..a70b46f67 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mapcomplete", - "version": "0.33.4", + "version": "0.33.5", "repository": "https://github.com/pietervdvn/MapComplete", "description": "A small website to edit OSM easily", "bugs": "https://github.com/pietervdvn/MapComplete/issues", @@ -8,7 +8,6 @@ "main": "index.ts", "type": "module", "config": { - "#": "Various endpoints that are instance-specific. This is the default configuration, which is re-exported in 'Constants.ts'.", "#": "Use MAPCOMPLETE_CONFIGURATION to use an additional configuration, e.g. `MAPCOMPLETE_CONFIGURATION=config_hetzner`", "#oauth_credentials:comment": [ "`oauth_credentials` are the OAuth-2 credentials for the production-OSM server and the test-server.", diff --git a/src/Logic/Actors/PreferredRasterLayerSelector.ts b/src/Logic/Actors/PreferredRasterLayerSelector.ts index 7ed20aa95..a4c38512a 100644 --- a/src/Logic/Actors/PreferredRasterLayerSelector.ts +++ b/src/Logic/Actors/PreferredRasterLayerSelector.ts @@ -1,5 +1,5 @@ -import { Store, UIEventSource } from "../UIEventSource"; -import { RasterLayerPolygon } from "../../Models/RasterLayers"; +import { Store, UIEventSource } from "../UIEventSource" +import { RasterLayerPolygon } from "../../Models/RasterLayers" /** * Selects the appropriate raster layer as background for the given query parameter, theme setting, user preference or default value. @@ -7,40 +7,47 @@ import { RasterLayerPolygon } from "../../Models/RasterLayers"; * It the requested layer is not available, a layer of the same type will be selected. */ export class PreferredRasterLayerSelector { - private readonly _rasterLayerSetting: UIEventSource; - private readonly _availableLayers: Store; - private readonly _preferredBackgroundLayer: UIEventSource; - private readonly _queryParameter: UIEventSource; + private readonly _rasterLayerSetting: UIEventSource + private readonly _availableLayers: Store + private readonly _preferredBackgroundLayer: UIEventSource< + string | "photo" | "map" | "osmbasedmap" | undefined + > + private readonly _queryParameter: UIEventSource - constructor(rasterLayerSetting: UIEventSource, availableLayers: Store, queryParameter: UIEventSource, preferredBackgroundLayer: UIEventSource) { - this._rasterLayerSetting = rasterLayerSetting; - this._availableLayers = availableLayers; - this._queryParameter = queryParameter; - this._preferredBackgroundLayer = preferredBackgroundLayer; - const self = this; + constructor( + rasterLayerSetting: UIEventSource, + availableLayers: Store, + queryParameter: UIEventSource, + preferredBackgroundLayer: UIEventSource< + string | "photo" | "map" | "osmbasedmap" | undefined + > + ) { + this._rasterLayerSetting = rasterLayerSetting + this._availableLayers = availableLayers + this._queryParameter = queryParameter + this._preferredBackgroundLayer = preferredBackgroundLayer + const self = this - this._rasterLayerSetting.addCallbackD(layer => { + this._rasterLayerSetting.addCallbackD((layer) => { if (layer.properties.id !== this._queryParameter.data) { - this._queryParameter.setData(undefined); - return true; + this._queryParameter.setData(undefined) + return true } - }); + }) - - this._queryParameter.addCallbackAndRunD(_ => { - const isApplied = self.updateLayer(); + this._queryParameter.addCallbackAndRunD((_) => { + const isApplied = self.updateLayer() if (!isApplied) { // A different layer was set as background // We remove this queryParameter instead - self._queryParameter.setData(undefined); - return true; // Unregister + self._queryParameter.setData(undefined) + return true // Unregister } - }); + }) - this._preferredBackgroundLayer.addCallbackD(_ => self.updateLayer()); - - this._availableLayers.addCallbackD(_ => self.updateLayer()); + this._preferredBackgroundLayer.addCallbackD((_) => self.updateLayer()) + this._availableLayers.addCallbackD((_) => self.updateLayer()) } /** @@ -48,20 +55,19 @@ export class PreferredRasterLayerSelector { * @private */ private updateLayer() { - // What is the ID of the layer we have to (try to) load? - const targetLayerId = this._queryParameter.data ?? this._preferredBackgroundLayer.data; - const available = this._availableLayers.data; - const isCategory = targetLayerId === "photo" || targetLayerId === "osmbasedmap" || targetLayerId === "map" - const foundLayer = isCategory ? available.find(l => l.properties.category === targetLayerId) : available.find(l => l.properties.id === targetLayerId); + const targetLayerId = this._queryParameter.data ?? this._preferredBackgroundLayer.data + const available = this._availableLayers.data + const isCategory = + targetLayerId === "photo" || targetLayerId === "osmbasedmap" || targetLayerId === "map" + const foundLayer = isCategory + ? available.find((l) => l.properties.category === targetLayerId) + : available.find((l) => l.properties.id === targetLayerId) if (foundLayer) { - this._rasterLayerSetting.setData(foundLayer); - return true; + this._rasterLayerSetting.setData(foundLayer) + return true } // The current layer is not in view - - } - } diff --git a/src/Logic/ImageProviders/ImageUploadManager.ts b/src/Logic/ImageProviders/ImageUploadManager.ts index 85964a507..a187e82ef 100644 --- a/src/Logic/ImageProviders/ImageUploadManager.ts +++ b/src/Logic/ImageProviders/ImageUploadManager.ts @@ -1,159 +1,159 @@ -import { ImageUploader } from "./ImageUploader"; -import LinkImageAction from "../Osm/Actions/LinkImageAction"; -import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore"; -import { OsmId, OsmTags } from "../../Models/OsmFeature"; -import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; -import { Store, UIEventSource } from "../UIEventSource"; -import { OsmConnection } from "../Osm/OsmConnection"; -import { Changes } from "../Osm/Changes"; -import Translations from "../../UI/i18n/Translations"; -import NoteCommentElement from "../../UI/Popup/NoteCommentElement"; - +import { ImageUploader } from "./ImageUploader" +import LinkImageAction from "../Osm/Actions/LinkImageAction" +import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore" +import { OsmId, OsmTags } from "../../Models/OsmFeature" +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" +import { Store, UIEventSource } from "../UIEventSource" +import { OsmConnection } from "../Osm/OsmConnection" +import { Changes } from "../Osm/Changes" +import Translations from "../../UI/i18n/Translations" +import NoteCommentElement from "../../UI/Popup/NoteCommentElement" /** * The ImageUploadManager has a */ export class ImageUploadManager { + private readonly _uploader: ImageUploader + private readonly _featureProperties: FeaturePropertiesStore + private readonly _layout: LayoutConfig - private readonly _uploader: ImageUploader; - private readonly _featureProperties: FeaturePropertiesStore; - private readonly _layout: LayoutConfig; + private readonly _uploadStarted: Map> = new Map() + private readonly _uploadFinished: Map> = new Map() + private readonly _uploadFailed: Map> = new Map() + private readonly _uploadRetried: Map> = new Map() + private readonly _uploadRetriedSuccess: Map> = new Map() + private readonly _osmConnection: OsmConnection + private readonly _changes: Changes - private readonly _uploadStarted: Map> = new Map(); - private readonly _uploadFinished: Map> = new Map(); - private readonly _uploadFailed: Map> = new Map(); - private readonly _uploadRetried: Map> = new Map(); - private readonly _uploadRetriedSuccess: Map> = new Map(); - private readonly _osmConnection: OsmConnection; - private readonly _changes: Changes; - - constructor(layout: LayoutConfig, uploader: ImageUploader, featureProperties: FeaturePropertiesStore, osmConnection: OsmConnection, changes: Changes) { - this._uploader = uploader; - this._featureProperties = featureProperties; - this._layout = layout; - this._osmConnection = osmConnection; - this._changes = changes; - } - - /** - * Gets various counters. - * Note that counters can only increase - * If a retry was a success, both 'retrySuccess' _and_ 'uploadFinished' will be increased - * @param featureId: the id of the feature you want information for. '*' has a global counter - */ - public getCountsFor(featureId: string | "*"): { - retried: Store; - uploadStarted: Store; - retrySuccess: Store; - failed: Store; - uploadFinished: Store - } { - return { - uploadStarted: this.getCounterFor(this._uploadStarted, featureId), - uploadFinished: this.getCounterFor(this._uploadFinished, featureId), - retried: this.getCounterFor(this._uploadRetried, featureId), - failed: this.getCounterFor(this._uploadFailed, featureId), - retrySuccess: this.getCounterFor(this._uploadRetriedSuccess, featureId) - - }; - } - - /** - * Uploads the given image, applies the correct title and license for the known user. - * Will then add this image to the OSM-feature or the OSM-note - */ - public async uploadImageAndApply(file: File, tagsStore: UIEventSource) : Promise{ - - const sizeInBytes = file.size; - const tags= tagsStore.data - const featureId = tags.id; - const self = this; - if (sizeInBytes > this._uploader.maxFileSizeInMegabytes * 1000000) { - this.increaseCountFor(this._uploadStarted, featureId); - this.increaseCountFor(this._uploadFailed, featureId); - throw ( - Translations.t.image.toBig.Subs({ - actual_size: Math.floor(sizeInBytes / 1000000) + "MB", - max_size: self._uploader.maxFileSizeInMegabytes + "MB" - }).txt - ); + constructor( + layout: LayoutConfig, + uploader: ImageUploader, + featureProperties: FeaturePropertiesStore, + osmConnection: OsmConnection, + changes: Changes + ) { + this._uploader = uploader + this._featureProperties = featureProperties + this._layout = layout + this._osmConnection = osmConnection + this._changes = changes } - - const licenseStore = this._osmConnection?.GetPreference("pictures-license", "CC0"); - const license = licenseStore?.data ?? "CC0"; - - const matchingLayer = this._layout?.getMatchingLayer(tags); - - const title = - matchingLayer?.title?.GetRenderValue(tags)?.Subs(tags)?.textFor("en") ?? - tags.name ?? - "https//osm.org/" + tags.id; - const description = [ - "author:" + this._osmConnection.userDetails.data.name, - "license:" + license, - "osmid:" + tags.id - ].join("\n"); - - console.log("Upload done, creating "); - const action = await this.uploadImageWithLicense(featureId, title, description, file); - if(!isNaN(Number( featureId))){ - // THis is a map note - const url = action._url - await this._osmConnection.addCommentToNote(featureId, url) - NoteCommentElement.addCommentTo(url, > tagsStore, {osmConnection: this._osmConnection}) - return + /** + * Gets various counters. + * Note that counters can only increase + * If a retry was a success, both 'retrySuccess' _and_ 'uploadFinished' will be increased + * @param featureId: the id of the feature you want information for. '*' has a global counter + */ + public getCountsFor(featureId: string | "*"): { + retried: Store + uploadStarted: Store + retrySuccess: Store + failed: Store + uploadFinished: Store + } { + return { + uploadStarted: this.getCounterFor(this._uploadStarted, featureId), + uploadFinished: this.getCounterFor(this._uploadFinished, featureId), + retried: this.getCounterFor(this._uploadRetried, featureId), + failed: this.getCounterFor(this._uploadFailed, featureId), + retrySuccess: this.getCounterFor(this._uploadRetriedSuccess, featureId), + } } - await this._changes.applyAction(action); - } - private async uploadImageWithLicense( - featureId: OsmId, - title: string, description: string, blob: File - ): Promise { - this.increaseCountFor(this._uploadStarted, featureId); - const properties = this._featureProperties.getStore(featureId); - let key: string; - let value: string; - try { - ({ key, value } = await this._uploader.uploadImage(title, description, blob)); - } catch (e) { - this.increaseCountFor(this._uploadRetried, featureId); - console.error("Could not upload image, trying again:", e); - try { + /** + * Uploads the given image, applies the correct title and license for the known user. + * Will then add this image to the OSM-feature or the OSM-note + */ + public async uploadImageAndApply(file: File, tagsStore: UIEventSource): Promise { + const sizeInBytes = file.size + const tags = tagsStore.data + const featureId = tags.id + const self = this + if (sizeInBytes > this._uploader.maxFileSizeInMegabytes * 1000000) { + this.increaseCountFor(this._uploadStarted, featureId) + this.increaseCountFor(this._uploadFailed, featureId) + throw Translations.t.image.toBig.Subs({ + actual_size: Math.floor(sizeInBytes / 1000000) + "MB", + max_size: self._uploader.maxFileSizeInMegabytes + "MB", + }).txt + } - ({ key, value } = await this._uploader.uploadImage(title, description, blob)); - this.increaseCountFor(this._uploadRetriedSuccess, featureId); - } catch (e) { - console.error("Could again not upload image due to", e); - this.increaseCountFor(this._uploadFailed, featureId); - } + const licenseStore = this._osmConnection?.GetPreference("pictures-license", "CC0") + const license = licenseStore?.data ?? "CC0" + const matchingLayer = this._layout?.getMatchingLayer(tags) + + const title = + matchingLayer?.title?.GetRenderValue(tags)?.Subs(tags)?.textFor("en") ?? + tags.name ?? + "https//osm.org/" + tags.id + const description = [ + "author:" + this._osmConnection.userDetails.data.name, + "license:" + license, + "osmid:" + tags.id, + ].join("\n") + + console.log("Upload done, creating ") + const action = await this.uploadImageWithLicense(featureId, title, description, file) + if (!isNaN(Number(featureId))) { + // THis is a map note + const url = action._url + await this._osmConnection.addCommentToNote(featureId, url) + NoteCommentElement.addCommentTo(url, >tagsStore, { + osmConnection: this._osmConnection, + }) + return + } + await this._changes.applyAction(action) } - console.log("Uploading done, creating action for", featureId); - const action = new LinkImageAction(featureId, key, value, properties, { - theme: this._layout.id, - changeType: "add-image" - }); - this.increaseCountFor(this._uploadFinished, featureId); - return action; - } - private getCounterFor(collection: Map>, key: string | "*") { - if (this._featureProperties.aliases.has(key)) { - key = this._featureProperties.aliases.get(key); + private async uploadImageWithLicense( + featureId: OsmId, + title: string, + description: string, + blob: File + ): Promise { + this.increaseCountFor(this._uploadStarted, featureId) + const properties = this._featureProperties.getStore(featureId) + let key: string + let value: string + try { + ;({ key, value } = await this._uploader.uploadImage(title, description, blob)) + } catch (e) { + this.increaseCountFor(this._uploadRetried, featureId) + console.error("Could not upload image, trying again:", e) + try { + ;({ key, value } = await this._uploader.uploadImage(title, description, blob)) + this.increaseCountFor(this._uploadRetriedSuccess, featureId) + } catch (e) { + console.error("Could again not upload image due to", e) + this.increaseCountFor(this._uploadFailed, featureId) + } + } + console.log("Uploading done, creating action for", featureId) + const action = new LinkImageAction(featureId, key, value, properties, { + theme: this._layout.id, + changeType: "add-image", + }) + this.increaseCountFor(this._uploadFinished, featureId) + return action } - if (!collection.has(key)) { - collection.set(key, new UIEventSource(0)); + + private getCounterFor(collection: Map>, key: string | "*") { + if (this._featureProperties.aliases.has(key)) { + key = this._featureProperties.aliases.get(key) + } + if (!collection.has(key)) { + collection.set(key, new UIEventSource(0)) + } + return collection.get(key) } - return collection.get(key); - } - - private increaseCountFor(collection: Map>, key: string | "*") { - const counter = this.getCounterFor(collection, key); - counter.setData(counter.data + 1); - const global = this.getCounterFor(collection, "*"); - global.setData(counter.data + 1); - } + private increaseCountFor(collection: Map>, key: string | "*") { + const counter = this.getCounterFor(collection, key) + counter.setData(counter.data + 1) + const global = this.getCounterFor(collection, "*") + global.setData(counter.data + 1) + } } diff --git a/src/Logic/ImageProviders/ImageUploader.ts b/src/Logic/ImageProviders/ImageUploader.ts index 3efb8d279..40601892b 100644 --- a/src/Logic/ImageProviders/ImageUploader.ts +++ b/src/Logic/ImageProviders/ImageUploader.ts @@ -1,5 +1,5 @@ export interface ImageUploader { - maxFileSizeInMegabytes?: number; + maxFileSizeInMegabytes?: number /** * Uploads the 'blob' as image, with some metadata. * Returns the URL to be linked + the appropriate key to add this to OSM @@ -11,5 +11,5 @@ export interface ImageUploader { title: string, description: string, blob: File - ): Promise<{ key: string, value: string }>; + ): Promise<{ key: string; value: string }> } diff --git a/src/Logic/ImageProviders/Imgur.ts b/src/Logic/ImageProviders/Imgur.ts index 4e4a1c541..536616403 100644 --- a/src/Logic/ImageProviders/Imgur.ts +++ b/src/Logic/ImageProviders/Imgur.ts @@ -1,15 +1,15 @@ -import ImageProvider, { ProvidedImage } from "./ImageProvider"; -import BaseUIElement from "../../UI/BaseUIElement"; -import { Utils } from "../../Utils"; -import Constants from "../../Models/Constants"; -import { LicenseInfo } from "./LicenseInfo"; -import { ImageUploader } from "./ImageUploader"; +import ImageProvider, { ProvidedImage } from "./ImageProvider" +import BaseUIElement from "../../UI/BaseUIElement" +import { Utils } from "../../Utils" +import Constants from "../../Models/Constants" +import { LicenseInfo } from "./LicenseInfo" +import { ImageUploader } from "./ImageUploader" -export class Imgur extends ImageProvider implements ImageUploader{ +export class Imgur extends ImageProvider implements ImageUploader { public static readonly defaultValuePrefix = ["https://i.imgur.com"] public static readonly singleton = new Imgur() public readonly defaultKeyPrefixes: string[] = ["image"] - public readonly maxFileSizeInMegabytes = 10 + public readonly maxFileSizeInMegabytes = 10 private constructor() { super() } @@ -24,7 +24,7 @@ export class Imgur extends ImageProvider implements ImageUploader{ title: string, description: string, blob: File - ): Promise<{ key: string, value: string }> { + ): Promise<{ key: string; value: string }> { const apiUrl = "https://api.imgur.com/3/image" const apiKey = Constants.ImgurApiKey @@ -33,7 +33,6 @@ export class Imgur extends ImageProvider implements ImageUploader{ formData.append("title", title) formData.append("description", description) - const settings: RequestInit = { method: "POST", body: formData, diff --git a/src/Logic/Osm/Actions/LinkImageAction.ts b/src/Logic/Osm/Actions/LinkImageAction.ts index 7d4ec23c8..908ce1583 100644 --- a/src/Logic/Osm/Actions/LinkImageAction.ts +++ b/src/Logic/Osm/Actions/LinkImageAction.ts @@ -1,15 +1,15 @@ -import ChangeTagAction from "./ChangeTagAction"; -import { Tag } from "../../Tags/Tag"; -import OsmChangeAction from "./OsmChangeAction"; -import { Changes } from "../Changes"; -import { ChangeDescription } from "./ChangeDescription"; -import { Store } from "../../UIEventSource"; +import ChangeTagAction from "./ChangeTagAction" +import { Tag } from "../../Tags/Tag" +import OsmChangeAction from "./OsmChangeAction" +import { Changes } from "../Changes" +import { ChangeDescription } from "./ChangeDescription" +import { Store } from "../../UIEventSource" export default class LinkImageAction extends OsmChangeAction { - private readonly _proposedKey: "image" | "mapillary" | "wiki_commons" | string; - public readonly _url: string; - private readonly _currentTags: Store>; - private readonly _meta: { theme: string; changeType: "add-image" | "link-image" }; + private readonly _proposedKey: "image" | "mapillary" | "wiki_commons" | string + public readonly _url: string + private readonly _currentTags: Store> + private readonly _meta: { theme: string; changeType: "add-image" | "link-image" } /** * Adds an image-link to a feature @@ -31,10 +31,10 @@ export default class LinkImageAction extends OsmChangeAction { } ) { super(elementId, true) - this._proposedKey = proposedKey; - this._url = url; - this._currentTags = currentTags; - this._meta = meta; + this._proposedKey = proposedKey + this._url = url + this._currentTags = currentTags + this._meta = meta } protected CreateChangeDescriptions(): Promise { @@ -46,9 +46,12 @@ export default class LinkImageAction extends OsmChangeAction { key = this._proposedKey + ":" + i i++ } - const tagChangeAction = new ChangeTagAction ( this.mainObjectId, new Tag(key, url), currentTags, this._meta) + const tagChangeAction = new ChangeTagAction( + this.mainObjectId, + new Tag(key, url), + currentTags, + this._meta + ) return tagChangeAction.CreateChangeDescriptions() } - - } diff --git a/src/Logic/Osm/ChangesetHandler.ts b/src/Logic/Osm/ChangesetHandler.ts index 4b2a70b32..f3d78336d 100644 --- a/src/Logic/Osm/ChangesetHandler.ts +++ b/src/Logic/Osm/ChangesetHandler.ts @@ -5,7 +5,7 @@ import Locale from "../../UI/i18n/Locale" import Constants from "../../Models/Constants" import { Changes } from "./Changes" import { Utils } from "../../Utils" -import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore"; +import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore" export interface ChangesetTag { key: string @@ -30,11 +30,14 @@ export class ChangesetHandler { constructor( dryRun: Store, osmConnection: OsmConnection, - allElements: FeaturePropertiesStore | { addAlias: (id0: string, id1: string) => void } | undefined, + allElements: + | FeaturePropertiesStore + | { addAlias: (id0: string, id1: string) => void } + | undefined, changes: Changes ) { this.osmConnection = osmConnection - this.allElements = allElements + this.allElements = allElements this.changes = changes this._dryRun = dryRun this.userDetails = osmConnection.userDetails diff --git a/src/Logic/Osm/OsmConnection.ts b/src/Logic/Osm/OsmConnection.ts index 663dd15eb..6f4e3755b 100644 --- a/src/Logic/Osm/OsmConnection.ts +++ b/src/Logic/Osm/OsmConnection.ts @@ -83,8 +83,11 @@ export class OsmConnection { import.meta.env.VITE_OSM_OAUTH_SECRET !== undefined ) { console.debug("Using environment variables for oauth config") - this._oauth_config.oauth_client_id = import.meta.env.VITE_OSM_OAUTH_CLIENT_ID - this._oauth_config.oauth_secret = import.meta.env.VITE_OSM_OAUTH_SECRET + this._oauth_config = { + oauth_client_id: import.meta.env.VITE_OSM_OAUTH_CLIENT_ID, + oauth_secret: import.meta.env.VITE_OSM_OAUTH_SECRET, + url: "https://api.openstreetmap.org", + } } this.userDetails = new UIEventSource( diff --git a/src/Logic/State/GeoLocationState.ts b/src/Logic/State/GeoLocationState.ts index fe395fde0..7c6c7b1e7 100644 --- a/src/Logic/State/GeoLocationState.ts +++ b/src/Logic/State/GeoLocationState.ts @@ -1,13 +1,13 @@ -import { UIEventSource } from "../UIEventSource"; -import { LocalStorageSource } from "../Web/LocalStorageSource"; -import { QueryParameters } from "../Web/QueryParameters"; +import { UIEventSource } from "../UIEventSource" +import { LocalStorageSource } from "../Web/LocalStorageSource" +import { QueryParameters } from "../Web/QueryParameters" export type GeolocationPermissionState = "prompt" | "requested" | "granted" | "denied" export interface GeoLocationPointProperties extends GeolocationCoordinates { - id: "gps"; - "user:location": "yes"; - date: string; + id: "gps" + "user:location": "yes" + date: string } /** @@ -23,22 +23,22 @@ export class GeoLocationState { */ public readonly permission: UIEventSource = new UIEventSource( "prompt" - ); + ) /** * Important to determine e.g. if we move automatically on fix or not */ - public readonly requestMoment: UIEventSource = new UIEventSource(undefined); + public readonly requestMoment: UIEventSource = new UIEventSource(undefined) /** * If true: the map will center (and re-center) to this location */ - public readonly allowMoving: UIEventSource = new UIEventSource(true); + public readonly allowMoving: UIEventSource = new UIEventSource(true) /** * The latest GeoLocationCoordinates, as given by the WebAPI */ public readonly currentGPSLocation: UIEventSource = - new UIEventSource(undefined); + new UIEventSource(undefined) /** * A small flag on localstorage. If the user previously granted the geolocation, it will be set. @@ -50,46 +50,46 @@ export class GeoLocationState { */ private readonly _previousLocationGrant: UIEventSource<"true" | "false"> = ( LocalStorageSource.Get("geolocation-permissions") - ); + ) /** * Used to detect a permission retraction */ - private readonly _grantedThisSession: UIEventSource = new UIEventSource(false); + private readonly _grantedThisSession: UIEventSource = new UIEventSource(false) constructor() { - const self = this; + const self = this this.permission.addCallbackAndRunD(async (state) => { if (state === "granted") { - self._previousLocationGrant.setData("true"); - self._grantedThisSession.setData(true); + self._previousLocationGrant.setData("true") + self._grantedThisSession.setData(true) } if (state === "prompt" && self._grantedThisSession.data) { // This is _really_ weird: we had a grant earlier, but it's 'prompt' now? // This means that the rights have been revoked again! - self._previousLocationGrant.setData("false"); - self.permission.setData("denied"); - self.currentGPSLocation.setData(undefined); - console.warn("Detected a downgrade in permissions!"); + self._previousLocationGrant.setData("false") + self.permission.setData("denied") + self.currentGPSLocation.setData(undefined) + console.warn("Detected a downgrade in permissions!") } if (state === "denied") { - self._previousLocationGrant.setData("false"); + self._previousLocationGrant.setData("false") } - }); - console.log("Previous location grant:", this._previousLocationGrant.data); + }) + console.log("Previous location grant:", this._previousLocationGrant.data) if (this._previousLocationGrant.data === "true") { // A previous visit successfully granted permission. Chance is high that we are allowed to use it again! // We set the flag to false again. If the user only wanted to share their location once, we are not gonna keep bothering them - this._previousLocationGrant.setData("false"); - console.log("Requesting access to GPS as this was previously granted"); + this._previousLocationGrant.setData("false") + console.log("Requesting access to GPS as this was previously granted") const latLonGivenViaUrl = - QueryParameters.wasInitialized("lat") || QueryParameters.wasInitialized("lon"); + QueryParameters.wasInitialized("lat") || QueryParameters.wasInitialized("lon") if (!latLonGivenViaUrl) { - this.requestMoment.setData(new Date()); + this.requestMoment.setData(new Date()) } - this.requestPermission(); + this.requestPermission() } } @@ -101,37 +101,36 @@ export class GeoLocationState { public requestPermission() { if (typeof navigator === "undefined") { // Not compatible with this browser - this.permission.setData("denied"); - return; + this.permission.setData("denied") + return } if (this.permission.data !== "prompt" && this.permission.data !== "requested") { // If the user denies the first prompt, revokes the deny and then tries again, we have to run the flow as well // Hence that we continue the flow if it is "requested" - return; + return } - this.permission.setData("requested"); + this.permission.setData("requested") try { navigator?.permissions ?.query({ name: "geolocation" }) .then((status) => { - const self = this; - if(status.state === "granted" || status.state === "denied"){ + const self = this + if (status.state === "granted" || status.state === "denied") { self.permission.setData(status.state) return } status.addEventListener("change", (e) => { - self.permission.setData(status.state); - - }); + self.permission.setData(status.state) + }) // The code above might have reset it to 'prompt', but we _did_ request permission! this.permission.setData("requested") // We _must_ call 'startWatching', as that is the actual trigger for the popup... - self.startWatching(); + self.startWatching() }) - .catch((e) => console.error("Could not get geopermission", e)); + .catch((e) => console.error("Could not get geopermission", e)) } catch (e) { - console.error("Could not get permission:", e); + console.error("Could not get permission:", e) } } @@ -140,18 +139,18 @@ export class GeoLocationState { * @private */ private async startWatching() { - const self = this; + const self = this navigator.geolocation.watchPosition( - function(position) { - self.currentGPSLocation.setData(position.coords); - self._previousLocationGrant.setData("true"); + function (position) { + self.currentGPSLocation.setData(position.coords) + self._previousLocationGrant.setData("true") }, - function() { - console.warn("Could not get location with navigator.geolocation"); + function () { + console.warn("Could not get location with navigator.geolocation") }, { - enableHighAccuracy: true + enableHighAccuracy: true, } - ); + ) } } diff --git a/src/Logic/State/UserRelatedState.ts b/src/Logic/State/UserRelatedState.ts index 867ef45d5..21648e0b7 100644 --- a/src/Logic/State/UserRelatedState.ts +++ b/src/Logic/State/UserRelatedState.ts @@ -1,23 +1,23 @@ -import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"; -import { OsmConnection } from "../Osm/OsmConnection"; -import { MangroveIdentity } from "../Web/MangroveReviews"; -import { Store, Stores, UIEventSource } from "../UIEventSource"; -import StaticFeatureSource from "../FeatureSource/Sources/StaticFeatureSource"; -import { FeatureSource } from "../FeatureSource/FeatureSource"; -import { Feature } from "geojson"; -import { Utils } from "../../Utils"; -import translators from "../../assets/translators.json"; -import codeContributors from "../../assets/contributors.json"; -import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; -import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"; -import usersettings from "../../../src/assets/generated/layers/usersettings.json"; -import Locale from "../../UI/i18n/Locale"; -import LinkToWeblate from "../../UI/Base/LinkToWeblate"; -import FeatureSwitchState from "./FeatureSwitchState"; -import Constants from "../../Models/Constants"; -import { QueryParameters } from "../Web/QueryParameters"; -import { ThemeMetaTagging } from "./UserSettingsMetaTagging"; -import { MapProperties } from "../../Models/MapProperties"; +import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" +import { OsmConnection } from "../Osm/OsmConnection" +import { MangroveIdentity } from "../Web/MangroveReviews" +import { Store, Stores, UIEventSource } from "../UIEventSource" +import StaticFeatureSource from "../FeatureSource/Sources/StaticFeatureSource" +import { FeatureSource } from "../FeatureSource/FeatureSource" +import { Feature } from "geojson" +import { Utils } from "../../Utils" +import translators from "../../assets/translators.json" +import codeContributors from "../../assets/contributors.json" +import LayerConfig from "../../Models/ThemeConfig/LayerConfig" +import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" +import usersettings from "../../../src/assets/generated/layers/usersettings.json" +import Locale from "../../UI/i18n/Locale" +import LinkToWeblate from "../../UI/Base/LinkToWeblate" +import FeatureSwitchState from "./FeatureSwitchState" +import Constants from "../../Models/Constants" +import { QueryParameters } from "../Web/QueryParameters" +import { ThemeMetaTagging } from "./UserSettingsMetaTagging" +import { MapProperties } from "../../Models/MapProperties" /** * The part of the state which keeps track of user-related stuff, e.g. the OSM-connection, @@ -42,8 +42,10 @@ export default class UserRelatedState { public readonly fixateNorth: UIEventSource public readonly homeLocation: FeatureSource public readonly language: UIEventSource - public readonly preferredBackgroundLayer: UIEventSource - public readonly imageLicense : UIEventSource + public readonly preferredBackgroundLayer: UIEventSource< + string | "photo" | "map" | "osmbasedmap" | undefined + > + public readonly imageLicense: UIEventSource /** * The number of seconds that the GPS-locations are stored in memory. * Time in seconds @@ -61,7 +63,7 @@ export default class UserRelatedState { * Note: these are linked via OsmConnection.preferences which exports all preferences as UIEventSource */ public readonly preferencesAsTags: UIEventSource> - private readonly _mapProperties: MapProperties; + private readonly _mapProperties: MapProperties constructor( osmConnection: OsmConnection, @@ -71,7 +73,7 @@ export default class UserRelatedState { mapProperties?: MapProperties ) { this.osmConnection = osmConnection - this._mapProperties = mapProperties; + this._mapProperties = mapProperties { const translationMode: UIEventSource = this.osmConnection.GetPreference("translation-mode", "false") @@ -104,12 +106,17 @@ export default class UserRelatedState { this.mangroveIdentity = new MangroveIdentity( this.osmConnection.GetLongPreference("identity", "mangrove") ) - this.preferredBackgroundLayer= this.osmConnection.GetPreference("preferred-background-layer", undefined, { - documentation: "The ID of a layer or layer category that MapComplete uses by default" - }) + this.preferredBackgroundLayer = this.osmConnection.GetPreference( + "preferred-background-layer", + undefined, + { + documentation: + "The ID of a layer or layer category that MapComplete uses by default", + } + ) - this.imageLicense = this.osmConnection.GetPreference("pictures-license", "CC0", { - documentation: "The license under which new images are uploaded" + this.imageLicense = this.osmConnection.GetPreference("pictures-license", "CC0", { + documentation: "The license under which new images are uploaded", }) this.installedUserThemes = this.InitInstalledUserThemes() @@ -277,7 +284,6 @@ export default class UserRelatedState { amendedPrefs.data["__url_parameter_initialized:" + key] = "yes" } - const osmConnection = this.osmConnection osmConnection.preferencesHandler.preferences.addCallback((newPrefs) => { for (const k in newPrefs) { @@ -405,13 +411,11 @@ export default class UserRelatedState { } } - - this._mapProperties?.rasterLayer?.addCallbackAndRun(l => { + this._mapProperties?.rasterLayer?.addCallbackAndRun((l) => { amendedPrefs.data["__current_background"] = l?.properties?.id amendedPrefs.ping() }) - return amendedPrefs } } diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts index 33a5ae85b..6e568c5c3 100644 --- a/src/Logic/State/UserSettingsMetaTagging.ts +++ b/src/Logic/State/UserSettingsMetaTagging.ts @@ -1,14 +1,42 @@ import { Utils } from "../../Utils" /** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */ export class ThemeMetaTagging { - public static readonly themeName = "usersettings" + public static readonly themeName = "usersettings" - public metaTaggging_for_usersettings(feat: {properties: Record}) { - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) ) - Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) - feat.properties['__current_backgroun'] = 'initial_value' - } -} \ No newline at end of file + public metaTaggging_for_usersettings(feat: { properties: Record }) { + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () => + feat.properties._description + .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/) + ?.at(1) + ) + Utils.AddLazyProperty( + feat.properties, + "_d", + () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? "" + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.href.match(/mastodon|en.osm.town/) !== null + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_link", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.getAttribute("rel")?.indexOf("me") >= 0 + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty( + feat.properties, + "_mastodon_candidate", + () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a + ) + feat.properties["__current_backgroun"] = "initial_value" + } +} diff --git a/src/Logic/Web/MangroveReviews.ts b/src/Logic/Web/MangroveReviews.ts index 15819a735..19e2228d4 100644 --- a/src/Logic/Web/MangroveReviews.ts +++ b/src/Logic/Web/MangroveReviews.ts @@ -1,35 +1,34 @@ -import { ImmutableStore, Store, UIEventSource } from "../UIEventSource"; -import { MangroveReviews, Review } from "mangrove-reviews-typescript"; -import { Utils } from "../../Utils"; -import { Feature, Position } from "geojson"; -import { GeoOperations } from "../GeoOperations"; +import { ImmutableStore, Store, UIEventSource } from "../UIEventSource" +import { MangroveReviews, Review } from "mangrove-reviews-typescript" +import { Utils } from "../../Utils" +import { Feature, Position } from "geojson" +import { GeoOperations } from "../GeoOperations" export class MangroveIdentity { - public readonly keypair: Store; - public readonly key_id: Store; + public readonly keypair: Store + public readonly key_id: Store constructor(mangroveIdentity: UIEventSource) { - const key_id = new UIEventSource(undefined); - this.key_id = key_id; - const keypairEventSource = new UIEventSource(undefined); - this.keypair = keypairEventSource; + const key_id = new UIEventSource(undefined) + this.key_id = key_id + const keypairEventSource = new UIEventSource(undefined) + this.keypair = keypairEventSource mangroveIdentity.addCallbackAndRunD(async (data) => { if (data === "") { - return; + return } - const keypair = await MangroveReviews.jwkToKeypair(JSON.parse(data)); - keypairEventSource.setData(keypair); - const pem = await MangroveReviews.publicToPem(keypair.publicKey); - key_id.setData(pem); - }); + const keypair = await MangroveReviews.jwkToKeypair(JSON.parse(data)) + keypairEventSource.setData(keypair) + const pem = await MangroveReviews.publicToPem(keypair.publicKey) + key_id.setData(pem) + }) try { if (!Utils.runningFromConsole && (mangroveIdentity.data ?? "") === "") { - MangroveIdentity.CreateIdentity(mangroveIdentity).then((_) => { - }); + MangroveIdentity.CreateIdentity(mangroveIdentity).then((_) => {}) } } catch (e) { - console.error("Could not create identity: ", e); + console.error("Could not create identity: ", e) } } @@ -39,13 +38,13 @@ export class MangroveIdentity { * @constructor */ private static async CreateIdentity(identity: UIEventSource): Promise { - const keypair = await MangroveReviews.generateKeypair(); - const jwk = await MangroveReviews.keypairToJwk(keypair); + const keypair = await MangroveReviews.generateKeypair() + const jwk = await MangroveReviews.keypairToJwk(keypair) if ((identity.data ?? "") !== "") { // Identity has been loaded via osmPreferences by now - we don't overwrite - return; + return } - identity.setData(JSON.stringify(jwk)); + identity.setData(JSON.stringify(jwk)) } } @@ -53,18 +52,18 @@ export class MangroveIdentity { * Tracks all reviews of a given feature, allows to create a new review */ export default class FeatureReviews { - private static readonly _featureReviewsCache: Record = {}; - public readonly subjectUri: Store; - public readonly average: Store; + private static readonly _featureReviewsCache: Record = {} + public readonly subjectUri: Store + public readonly average: Store private readonly _reviews: UIEventSource<(Review & { madeByLoggedInUser: Store })[]> = - new UIEventSource([]); + new UIEventSource([]) public readonly reviews: Store<(Review & { madeByLoggedInUser: Store })[]> = - this._reviews; - private readonly _lat: number; - private readonly _lon: number; - private readonly _uncertainty: number; - private readonly _name: Store; - private readonly _identity: MangroveIdentity; + this._reviews + private readonly _lat: number + private readonly _lon: number + private readonly _uncertainty: number + private readonly _name: Store + private readonly _identity: MangroveIdentity private constructor( feature: Feature, @@ -77,72 +76,72 @@ export default class FeatureReviews { } ) { const centerLonLat = GeoOperations.centerpointCoordinates(feature) - ;[this._lon, this._lat] = centerLonLat; + ;[this._lon, this._lat] = centerLonLat this._identity = - mangroveIdentity ?? new MangroveIdentity(new UIEventSource(undefined)); - const nameKey = options?.nameKey ?? "name"; + mangroveIdentity ?? new MangroveIdentity(new UIEventSource(undefined)) + const nameKey = options?.nameKey ?? "name" if (feature.geometry.type === "Point") { - this._uncertainty = options?.uncertaintyRadius ?? 10; + this._uncertainty = options?.uncertaintyRadius ?? 10 } else { - let coordss: Position[][]; + let coordss: Position[][] if (feature.geometry.type === "LineString") { - coordss = [feature.geometry.coordinates]; + coordss = [feature.geometry.coordinates] } else if ( feature.geometry.type === "MultiLineString" || feature.geometry.type === "Polygon" ) { - coordss = feature.geometry.coordinates; + coordss = feature.geometry.coordinates } - let maxDistance = 0; + let maxDistance = 0 for (const coords of coordss) { for (const coord of coords) { maxDistance = Math.max( maxDistance, GeoOperations.distanceBetween(centerLonLat, coord) - ); + ) } } - this._uncertainty = options?.uncertaintyRadius ?? maxDistance; + this._uncertainty = options?.uncertaintyRadius ?? maxDistance } - this._name = tagsSource.map((tags) => tags[nameKey] ?? options?.fallbackName); + this._name = tagsSource.map((tags) => tags[nameKey] ?? options?.fallbackName) - this.subjectUri = this.ConstructSubjectUri(); + this.subjectUri = this.ConstructSubjectUri() - const self = this; + const self = this this.subjectUri.addCallbackAndRunD(async (sub) => { - const reviews = await MangroveReviews.getReviews({ sub }); - self.addReviews(reviews.reviews); - }); + const reviews = await MangroveReviews.getReviews({ sub }) + self.addReviews(reviews.reviews) + }) /* We also construct all subject queries _without_ encoding the name to work around a previous bug * See https://github.com/giggls/opencampsitemap/issues/30 */ this.ConstructSubjectUri(true).addCallbackAndRunD(async (sub) => { try { - const reviews = await MangroveReviews.getReviews({ sub }); - self.addReviews(reviews.reviews); + const reviews = await MangroveReviews.getReviews({ sub }) + self.addReviews(reviews.reviews) } catch (e) { - console.log("Could not fetch reviews for partially incorrect query ", sub); + console.log("Could not fetch reviews for partially incorrect query ", sub) } - }); - this.average = this._reviews.map(reviews => { + }) + this.average = this._reviews.map((reviews) => { if (!reviews) { - return null; - } - if(reviews.length === 0){ return null } - let sum = 0; - let count = 0; + if (reviews.length === 0) { + return null + } + let sum = 0 + let count = 0 for (const review of reviews) { if (review.rating !== undefined) { - count++; - sum += review.rating; + count++ + sum += review.rating } } return Math.round(sum / count) - }); + }) } /** @@ -158,14 +157,14 @@ export default class FeatureReviews { uncertaintyRadius?: number } ) { - const key = feature.properties.id; - const cached = FeatureReviews._featureReviewsCache[key]; + const key = feature.properties.id + const cached = FeatureReviews._featureReviewsCache[key] if (cached !== undefined) { - return cached; + return cached } - const featureReviews = new FeatureReviews(feature, tagsSource, mangroveIdentity, options); - FeatureReviews._featureReviewsCache[key] = featureReviews; - return featureReviews; + const featureReviews = new FeatureReviews(feature, tagsSource, mangroveIdentity, options) + FeatureReviews._featureReviewsCache[key] = featureReviews + return featureReviews } /** @@ -174,15 +173,15 @@ export default class FeatureReviews { public async createReview(review: Omit): Promise { const r: Review = { sub: this.subjectUri.data, - ...review - }; - const keypair: CryptoKeyPair = this._identity.keypair.data; - console.log(r); - const jwt = await MangroveReviews.signReview(keypair, r); - console.log("Signed:", jwt); - await MangroveReviews.submitReview(jwt); - this._reviews.data.push({ ...r, madeByLoggedInUser: new ImmutableStore(true) }); - this._reviews.ping(); + ...review, + } + const keypair: CryptoKeyPair = this._identity.keypair.data + console.log(r) + const jwt = await MangroveReviews.signReview(keypair, r) + console.log("Signed:", jwt) + await MangroveReviews.submitReview(jwt) + this._reviews.data.push({ ...r, madeByLoggedInUser: new ImmutableStore(true) }) + this._reviews.ping() } /** @@ -191,48 +190,48 @@ export default class FeatureReviews { * @private */ private addReviews(reviews: { payload: Review; kid: string }[]) { - const self = this; - const alreadyKnown = new Set(self._reviews.data.map((r) => r.rating + " " + r.opinion)); + const self = this + const alreadyKnown = new Set(self._reviews.data.map((r) => r.rating + " " + r.opinion)) - let hasNew = false; + let hasNew = false for (const reviewData of reviews) { - const review = reviewData.payload; + const review = reviewData.payload try { - const url = new URL(review.sub); - console.log("URL is", url); + const url = new URL(review.sub) + console.log("URL is", url) if (url.protocol === "geo:") { const coordinate = <[number, number]>( url.pathname.split(",").map((n) => Number(n)) - ); + ) const distance = GeoOperations.distanceBetween( [this._lat, this._lon], coordinate - ); + ) if (distance > this._uncertainty) { - continue; + continue } } } catch (e) { - console.warn(e); + console.warn(e) } - const key = review.rating + " " + review.opinion; + const key = review.rating + " " + review.opinion if (alreadyKnown.has(key)) { - continue; + continue } self._reviews.data.push({ ...review, madeByLoggedInUser: this._identity.key_id.map((user_key_id) => { - return reviewData.kid === user_key_id; - }) - }); - hasNew = true; + return reviewData.kid === user_key_id + }), + }) + hasNew = true } if (hasNew) { self._reviews.data.sort((a, b) => b.iat - a.iat) // Sort with most recent first - self._reviews.ping(); + self._reviews.ping() } } @@ -245,13 +244,13 @@ export default class FeatureReviews { private ConstructSubjectUri(dontEncodeName: boolean = false): Store { // https://www.rfc-editor.org/rfc/rfc5870#section-3.4.2 // `u` stands for `uncertainty`, https://www.rfc-editor.org/rfc/rfc5870#section-3.4.3 - const self = this; - return this._name.map(function(name) { - let uri = `geo:${self._lat},${self._lon}?u=${self._uncertainty}`; + const self = this + return this._name.map(function (name) { + let uri = `geo:${self._lat},${self._lon}?u=${self._uncertainty}` if (name) { - uri += "&q=" + (dontEncodeName ? name : encodeURIComponent(name)); + uri += "&q=" + (dontEncodeName ? name : encodeURIComponent(name)) } - return uri; - }); + return uri + }) } } diff --git a/src/Models/RasterLayers.ts b/src/Models/RasterLayers.ts index dbd34894b..700a0cb30 100644 --- a/src/Models/RasterLayers.ts +++ b/src/Models/RasterLayers.ts @@ -1,41 +1,41 @@ -import { Feature, Polygon } from "geojson"; -import * as editorlayerindex from "../assets/editor-layer-index.json"; -import * as globallayers from "../assets/global-raster-layers.json"; -import { BBox } from "../Logic/BBox"; -import { Store, Stores } from "../Logic/UIEventSource"; -import { GeoOperations } from "../Logic/GeoOperations"; -import { RasterLayerProperties } from "./RasterLayerProperties"; +import { Feature, Polygon } from "geojson" +import * as editorlayerindex from "../assets/editor-layer-index.json" +import * as globallayers from "../assets/global-raster-layers.json" +import { BBox } from "../Logic/BBox" +import { Store, Stores } from "../Logic/UIEventSource" +import { GeoOperations } from "../Logic/GeoOperations" +import { RasterLayerProperties } from "./RasterLayerProperties" export class AvailableRasterLayers { public static EditorLayerIndex: (Feature & - RasterLayerPolygon)[] = editorlayerindex.features; + RasterLayerPolygon)[] = editorlayerindex.features public static globalLayers: RasterLayerPolygon[] = globallayers.layers.map( (properties) => { type: "Feature", properties, - geometry: BBox.global.asGeometry() + geometry: BBox.global.asGeometry(), } - ); + ) public static readonly osmCartoProperties: RasterLayerProperties = { id: "osm", name: "OpenStreetMap", url: "https://tile.openstreetmap.org/{z}/{x}/{y}.png", attribution: { text: "OpenStreetMap", - url: "https://openStreetMap.org/copyright" + url: "https://openStreetMap.org/copyright", }, best: true, max_zoom: 19, min_zoom: 0, - category: "osmbasedmap" - }; + category: "osmbasedmap", + } public static readonly osmCarto: RasterLayerPolygon = { type: "Feature", properties: AvailableRasterLayers.osmCartoProperties, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly maptilerDefaultLayer: RasterLayerPolygon = { type: "Feature", @@ -47,11 +47,11 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Maptiler", - url: "https://www.maptiler.com/copyright/" - } + url: "https://www.maptiler.com/copyright/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly maptilerCarto: RasterLayerPolygon = { type: "Feature", @@ -63,11 +63,11 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Maptiler", - url: "https://www.maptiler.com/copyright/" - } + url: "https://www.maptiler.com/copyright/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly maptilerBackdrop: RasterLayerPolygon = { type: "Feature", @@ -79,11 +79,11 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Maptiler", - url: "https://www.maptiler.com/copyright/" - } + url: "https://www.maptiler.com/copyright/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static readonly americana: RasterLayerPolygon = { type: "Feature", properties: { @@ -94,43 +94,45 @@ export class AvailableRasterLayers { type: "vector", attribution: { text: "Americana", - url: "https://github.com/ZeLonewolf/openstreetmap-americana/" - } + url: "https://github.com/ZeLonewolf/openstreetmap-americana/", + }, }, - geometry: BBox.global.asGeometry() - }; + geometry: BBox.global.asGeometry(), + } public static layersAvailableAt( location: Store<{ lon: number; lat: number }> ): Store { const availableLayersBboxes = Stores.ListStabilized( location.mapD((loc) => { - const lonlat: [number, number] = [loc.lon, loc.lat]; + const lonlat: [number, number] = [loc.lon, loc.lat] return AvailableRasterLayers.EditorLayerIndex.filter((eliPolygon) => BBox.get(eliPolygon).contains(lonlat) - ); + ) }) - ); + ) const available = Stores.ListStabilized( availableLayersBboxes.map((eliPolygons) => { - const loc = location.data; - const lonlat: [number, number] = [loc.lon, loc.lat]; + const loc = location.data + const lonlat: [number, number] = [loc.lon, loc.lat] const matching: RasterLayerPolygon[] = eliPolygons.filter((eliPolygon) => { if (eliPolygon.geometry === null) { - return true; // global ELI-layer + return true // global ELI-layer } - return GeoOperations.inside(lonlat, eliPolygon); - }); - matching.push(...AvailableRasterLayers.globalLayers); - matching.unshift(AvailableRasterLayers.maptilerDefaultLayer, + return GeoOperations.inside(lonlat, eliPolygon) + }) + matching.push(...AvailableRasterLayers.globalLayers) + matching.unshift( + AvailableRasterLayers.maptilerDefaultLayer, AvailableRasterLayers.osmCarto, AvailableRasterLayers.maptilerCarto, AvailableRasterLayers.maptilerBackdrop, - AvailableRasterLayers.americana); - return matching; + AvailableRasterLayers.americana + ) + return matching }) - ); - return available; + ) + return available } } @@ -148,22 +150,22 @@ export class RasterLayerUtils { preferredCategory: string, ignoreLayer?: RasterLayerPolygon ): RasterLayerPolygon { - let secondBest: RasterLayerPolygon = undefined; + let secondBest: RasterLayerPolygon = undefined for (const rasterLayer of available) { if (rasterLayer === ignoreLayer) { - continue; + continue } - const p = rasterLayer.properties; + const p = rasterLayer.properties if (p.category === preferredCategory) { if (p.best) { - return rasterLayer; + return rasterLayer } if (!secondBest) { - secondBest = rasterLayer; + secondBest = rasterLayer } } } - return secondBest; + return secondBest } } @@ -179,11 +181,11 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { /** * The name of the imagery source */ - readonly name: string; + readonly name: string /** * Whether the imagery name should be translated */ - readonly i18n?: boolean; + readonly i18n?: boolean readonly type: | "tms" | "wms" @@ -191,7 +193,7 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { | "scanex" | "wms_endpoint" | "wmts" - | "vector"; /* Vector is not actually part of the ELI-spec, we add it for vector layers */ + | "vector" /* Vector is not actually part of the ELI-spec, we add it for vector layers */ /** * A rough categorisation of different types of layers. See https://github.com/osmlab/editor-layer-index/blob/gh-pages/CONTRIBUTING.md#categories for a description of the individual categories. */ @@ -203,53 +205,53 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { | "historicphoto" | "qa" | "elevation" - | "other"; + | "other" /** * A URL template for imagery tiles */ - readonly url: string; - readonly min_zoom?: number; - readonly max_zoom?: number; + readonly url: string + readonly min_zoom?: number + readonly max_zoom?: number /** * explicit/implicit permission by the owner for use in OSM */ - readonly permission_osm?: "explicit" | "implicit" | "no"; + readonly permission_osm?: "explicit" | "implicit" | "no" /** * A URL for the license or permissions for the imagery */ - readonly license_url?: string; + readonly license_url?: string /** * A URL for the privacy policy of the operator or false if there is no existing privacy policy for tis imagery. */ - readonly privacy_policy_url?: string | boolean; + readonly privacy_policy_url?: string | boolean /** * A unique identifier for the source; used in imagery_used changeset tag */ - readonly id: string; + readonly id: string /** * A short English-language description of the source */ - readonly description?: string; + readonly description?: string /** * The ISO 3166-1 alpha-2 two letter country code in upper case. Use ZZ for unknown or multiple. */ - readonly country_code?: string; + readonly country_code?: string /** * Whether this imagery should be shown in the default world-wide menu */ - readonly default?: boolean; + readonly default?: boolean /** * Whether this imagery is the best source for the region */ - readonly best?: boolean; + readonly best?: boolean /** * The age of the oldest imagery or data in the source, as an RFC3339 date or leading portion of one */ - readonly start_date?: string; + readonly start_date?: string /** * The age of the newest imagery or data in the source, as an RFC3339 date or leading portion of one */ - readonly end_date?: string; + readonly end_date?: string /** * HTTP header to check for information if the tile is invalid */ @@ -259,61 +261,61 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { * via the `patternProperty` "^.*$". */ [k: string]: string[] | null - }; + } /** * 'true' if tiles are transparent and can be overlaid on another source */ - readonly overlay?: boolean & string; - readonly available_projections?: string[]; + readonly overlay?: boolean & string + readonly available_projections?: string[] readonly attribution?: { readonly url?: string readonly text?: string readonly html?: string readonly required?: boolean - }; + } /** * A URL for an image, that can be displayed in the list of imagery layers next to the name */ - readonly icon?: string; + readonly icon?: string /** * A link to an EULA text that has to be accepted by the user, before the imagery source is added. Can contain {lang} to be replaced by a current user language wiki code (like FR:) or an empty string for the default English text. */ - readonly eula?: string; + readonly eula?: string /** * A URL for an image, that is displayed in the mapview for attribution */ - readonly "logo-image"?: string; + readonly "logo-image"?: string /** * Customized text for the terms of use link (default is "Background Terms of Use") */ - readonly "terms-of-use-text"?: string; + readonly "terms-of-use-text"?: string /** * Specify a checksum for tiles, which aren't real tiles. `type` is the digest type and can be MD5, SHA-1, SHA-256, SHA-384 and SHA-512, value is the hex encoded checksum in lower case. To create a checksum save the tile as file and upload it to e.g. https://defuse.ca/checksums.htm. */ - readonly "no-tile-checksum"?: string; + readonly "no-tile-checksum"?: string /** * header-name attribute specifies a header returned by tile server, that will be shown as `metadata-key` attribute in Show Tile Info dialog */ - readonly "metadata-header"?: string; + readonly "metadata-header"?: string /** * Set to `true` if imagery source is properly aligned and does not need imagery offset adjustments. This is used for OSM based sources too. */ - readonly "valid-georeference"?: boolean; + readonly "valid-georeference"?: boolean /** * Size of individual tiles delivered by a TMS service */ - readonly "tile-size"?: number; + readonly "tile-size"?: number /** * Whether tiles status can be accessed by appending /status to the tile URL and can be submitted for re-rendering by appending /dirty. */ - readonly "mod-tile-features"?: string; + readonly "mod-tile-features"?: string /** * HTTP headers to be sent to server. It has two attributes header-name and header-value. May be specified multiple times. */ readonly "custom-http-headers"?: { readonly "header-name"?: string readonly "header-value"?: string - }; + } /** * Default layer to open (when using WMS_ENDPOINT type). Contains list of layer tag with two attributes - name and style, e.g. `"default-layers": ["layer": { name="Basisdata_NP_Basiskart_JanMayen_WMTS_25829" "style":"default" } ]` (not allowed in `mirror` attribute) */ @@ -324,17 +326,17 @@ export interface EditorLayerIndexProperties extends RasterLayerProperties { [k: string]: unknown } [k: string]: unknown - }[]; + }[] /** * format to use when connecting tile server (when using WMS_ENDPOINT type) */ - readonly format?: string; + readonly format?: string /** * If `true` transparent tiles will be requested from WMS server */ - readonly transparent?: boolean & string; + readonly transparent?: boolean & string /** * minimum expiry time for tiles in seconds. The larger the value, the longer entry in cache will be considered valid */ - readonly "minimum-tile-expire"?: number; + readonly "minimum-tile-expire"?: number } diff --git a/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts b/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts index 7e33de4bb..50a90dc83 100644 --- a/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts +++ b/src/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts @@ -4,7 +4,7 @@ import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" import { LayerConfigJson } from "../Json/LayerConfigJson" import { DesugaringStep, Each, Fuse, On } from "./Conversion" import PointRenderingConfigJson from "../Json/PointRenderingConfigJson" -import { del } from "idb-keyval"; +import { del } from "idb-keyval" export class UpdateLegacyLayer extends DesugaringStep< LayerConfigJson | string | { builtin; override } @@ -197,7 +197,7 @@ class UpdateLegacyTheme extends DesugaringStep { delete oldThemeConfig.socialImage } - if(oldThemeConfig.defaultBackgroundId === "osm"){ + if (oldThemeConfig.defaultBackgroundId === "osm") { console.log("Removing old background in", json.id) } diff --git a/src/UI/Base/Checkbox.svelte b/src/UI/Base/Checkbox.svelte index 92de427ac..2ff713e2e 100644 --- a/src/UI/Base/Checkbox.svelte +++ b/src/UI/Base/Checkbox.svelte @@ -1,13 +1,14 @@ +

-