Merge master

This commit is contained in:
Pieter Vander Vennet 2024-01-13 01:52:13 +01:00
commit e7cecc26d9
72 changed files with 12282 additions and 720 deletions

View file

@ -121,6 +121,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -117,6 +117,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -2,7 +2,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -174,6 +174,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -2,7 +2,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -170,6 +170,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -85,7 +85,7 @@
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"type": "array",
"items": {
"type": "string"
@ -136,14 +136,26 @@
"type": "boolean"
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox",
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nUse `auto:<tagrenderingId>` to automatically create an icon based on a tagRendering which has icons\n\nType: icon[]\ngroup: infobox",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
"allOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
}
]
},
{
"type": "string"
@ -253,7 +265,7 @@
}
},
"tagRenderings": {
"description": "question: Edit this attribute showing piece/question\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"description": "question: Edit this way this attributed is displayed or queried\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"type": "array",
"items": {
"anyOf": [
@ -370,7 +382,14 @@
"units": {
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
"anyOf": [
{
"$ref": "#/definitions/default_2"
},
{
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>"
}
]
}
},
"syncSelection": {
@ -518,6 +537,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -561,7 +584,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -850,6 +873,20 @@
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [
@ -1242,6 +1279,17 @@
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1457,6 +1505,17 @@
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1597,33 +1656,71 @@
"sourceString"
]
},
"subexpand": {
"$ref": "#/definitions/Record<string,string[]>"
},
"renderings": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
},
{
"type": "array",
"items": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
}
}
]
}
},
"required": [
@ -1784,6 +1881,10 @@
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "object",
"properties": {
"quantity": {
"description": "What is quantified? E.g. 'speed', 'length' (including width, diameter, ...), 'electric tension', 'electric current', 'duration'",
"type": "string"
},
"appliesToKey": {
"description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical(<key>)}`",
"type": "array",
@ -1808,10 +1909,13 @@
}
},
"required": [
"applicableUnits",
"appliesToKey"
"applicableUnits"
],
"additionalProperties": false
},
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": {
"type": "object",
"additionalProperties": false
}
},
"$schema": "http://json-schema.org/draft-07/schema#",

View file

@ -85,7 +85,7 @@ export default {
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"type": "array",
"items": {
"type": "string"
@ -136,14 +136,26 @@ export default {
"type": "boolean"
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox",
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nUse `auto:<tagrenderingId>` to automatically create an icon based on a tagRendering which has icons\n\nType: icon[]\ngroup: infobox",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
"allOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
}
]
},
{
"type": "string"
@ -253,7 +265,7 @@ export default {
}
},
"tagRenderings": {
"description": "question: Edit this attribute showing piece/question\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"description": "question: Edit this way this attributed is displayed or queried\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"type": "array",
"items": {
"anyOf": [
@ -370,7 +382,14 @@ export default {
"units": {
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
"anyOf": [
{
"$ref": "#/definitions/default_2"
},
{
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>"
}
]
}
},
"syncSelection": {
@ -514,6 +533,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -555,7 +578,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -841,6 +864,20 @@ export default {
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [
@ -1229,6 +1266,17 @@ export default {
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1443,6 +1491,17 @@ export default {
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1582,33 +1641,71 @@ export default {
"sourceString"
]
},
"subexpand": {
"$ref": "#/definitions/Record<string,string[]>"
},
"renderings": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
},
{
"type": "array",
"items": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
}
}
]
}
},
"required": [
@ -1765,6 +1862,10 @@ export default {
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "object",
"properties": {
"quantity": {
"description": "What is quantified? E.g. 'speed', 'length' (including width, diameter, ...), 'electric tension', 'electric current', 'duration'",
"type": "string"
},
"appliesToKey": {
"description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical(<key>)}`",
"type": "array",
@ -1789,9 +1890,11 @@ export default {
}
},
"required": [
"applicableUnits",
"appliesToKey"
"applicableUnits"
]
},
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": {
"type": "object"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"

View file

@ -427,6 +427,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -470,7 +474,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -759,6 +763,20 @@
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [
@ -1151,6 +1169,17 @@
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1366,6 +1395,17 @@
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1506,33 +1546,71 @@
"sourceString"
]
},
"subexpand": {
"$ref": "#/definitions/Record<string,string[]>"
},
"renderings": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
},
{
"type": "array",
"items": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
}
}
]
}
},
"required": [
@ -1693,6 +1771,10 @@
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "object",
"properties": {
"quantity": {
"description": "What is quantified? E.g. 'speed', 'length' (including width, diameter, ...), 'electric tension', 'electric current', 'duration'",
"type": "string"
},
"appliesToKey": {
"description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical(<key>)}`",
"type": "array",
@ -1717,11 +1799,14 @@
}
},
"required": [
"applicableUnits",
"appliesToKey"
"applicableUnits"
],
"additionalProperties": false
},
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": {
"type": "object",
"additionalProperties": false
},
"default": {
"type": "object",
"properties": {
@ -1854,7 +1939,7 @@
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"type": "array",
"items": {
"type": "string"
@ -1905,14 +1990,26 @@
"type": "boolean"
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox",
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nUse `auto:<tagrenderingId>` to automatically create an icon based on a tagRendering which has icons\n\nType: icon[]\ngroup: infobox",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
"allOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
}
]
},
{
"type": "string"
@ -2022,7 +2119,7 @@
}
},
"tagRenderings": {
"description": "question: Edit this attribute showing piece/question\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"description": "question: Edit this way this attributed is displayed or queried\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"type": "array",
"items": {
"anyOf": [
@ -2139,7 +2236,14 @@
"units": {
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
"anyOf": [
{
"$ref": "#/definitions/default_2"
},
{
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>"
}
]
}
},
"syncSelection": {
@ -2254,7 +2358,7 @@
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"type": "array",
"items": {
"type": "string"
@ -2305,14 +2409,26 @@
"type": "boolean"
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox",
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nUse `auto:<tagrenderingId>` to automatically create an icon based on a tagRendering which has icons\n\nType: icon[]\ngroup: infobox",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
"allOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
}
]
},
{
"type": "string"
@ -2422,7 +2538,7 @@
}
},
"tagRenderings": {
"description": "question: Edit this attribute showing piece/question\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"description": "question: Edit this way this attributed is displayed or queried\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"type": "array",
"items": {
"anyOf": [
@ -2539,7 +2655,14 @@
"units": {
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
"anyOf": [
{
"$ref": "#/definitions/default_2"
},
{
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>"
}
]
}
},
"syncSelection": {

View file

@ -423,6 +423,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -464,7 +468,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -750,6 +754,20 @@ export default {
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [
@ -1138,6 +1156,17 @@ export default {
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1352,6 +1381,17 @@ export default {
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -1491,33 +1531,71 @@ export default {
"sourceString"
]
},
"subexpand": {
"$ref": "#/definitions/Record<string,string[]>"
},
"renderings": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
},
{
"type": "array",
"items": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/QuestionableTagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"builtin": {
"type": "string"
},
"override": {
"$ref": "#/definitions/Partial<QuestionableTagRenderingConfigJson>"
}
},
"required": [
"builtin",
"override"
]
},
{
"type": "string"
}
]
}
}
}
]
}
},
"required": [
@ -1674,6 +1752,10 @@ export default {
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "object",
"properties": {
"quantity": {
"description": "What is quantified? E.g. 'speed', 'length' (including width, diameter, ...), 'electric tension', 'electric current', 'duration'",
"type": "string"
},
"appliesToKey": {
"description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical(<key>)}`",
"type": "array",
@ -1698,10 +1780,12 @@ export default {
}
},
"required": [
"applicableUnits",
"appliesToKey"
"applicableUnits"
]
},
"Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>": {
"type": "object"
},
"default": {
"type": "object",
"properties": {
@ -1833,7 +1917,7 @@ export default {
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"type": "array",
"items": {
"type": "string"
@ -1884,14 +1968,26 @@ export default {
"type": "boolean"
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox",
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nUse `auto:<tagrenderingId>` to automatically create an icon based on a tagRendering which has icons\n\nType: icon[]\ngroup: infobox",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
"allOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
}
]
},
{
"type": "string"
@ -2001,7 +2097,7 @@ export default {
}
},
"tagRenderings": {
"description": "question: Edit this attribute showing piece/question\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"description": "question: Edit this way this attributed is displayed or queried\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"type": "array",
"items": {
"anyOf": [
@ -2118,7 +2214,14 @@ export default {
"units": {
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
"anyOf": [
{
"$ref": "#/definitions/default_2"
},
{
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>"
}
]
}
},
"syncSelection": {
@ -2232,7 +2335,7 @@ export default {
]
},
"calculatedTags": {
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to <a>Docs/CalculatedTags.md</a> for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"type": "array",
"items": {
"type": "string"
@ -2283,14 +2386,26 @@ export default {
"type": "boolean"
},
"titleIcons": {
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nType: icon[]\ngroup: infobox",
"description": "Small icons shown next to the title.\nIf not specified, the OsmLink and wikipedia links will be used by default.\nUse an empty array to hide them.\nNote that \"defaults\" will insert all the default titleIcons (which are added automatically)\n\nUse `auto:<tagrenderingId>` to automatically create an icon based on a tagRendering which has icons\n\nType: icon[]\ngroup: infobox",
"anyOf": [
{
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
"allOf": [
{
"$ref": "#/definitions/TagRenderingConfigJson"
},
{
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
}
]
},
{
"type": "string"
@ -2400,7 +2515,7 @@ export default {
}
},
"tagRenderings": {
"description": "question: Edit this attribute showing piece/question\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"description": "question: Edit this way this attributed is displayed or queried\n\nA tag rendering is a block that either shows the known value or asks a question.\n\nRefer to the class `TagRenderingConfigJson` to see the possibilities.\n\nNote that we can also use a string here - where the string refers to a tag rendering defined in `assets/questions/questions.json`,\nwhere a few very general questions are defined e.g. website, phone number, ...\nFurthermore, _all_ the questions of another layer can be reused with `otherlayer.*`\nIf you need only a single of the tagRenderings, use `otherlayer.tagrenderingId`\nIf one or more questions have a 'group' or 'label' set, select all the entries with the corresponding group or label with `otherlayer.*group`\nRemark: if a tagRendering is 'lent' from another layer, the 'source'-tags are copied and added as condition.\nIf they are not wanted, remove them with an override\n\nA special value is 'questions', which indicates the location of the questions box. If not specified, it'll be appended to the bottom of the featureInfobox.\n\nAt last, one can define a group of renderings where parts of all strings will be replaced by multiple other strings.\nThis is mainly create questions for a 'left' and a 'right' side of the road.\nThese will be grouped and questions will be asked together\n\ntype: tagrendering[]\ngroup: tagrenderings",
"type": "array",
"items": {
"anyOf": [
@ -2517,7 +2632,14 @@ export default {
"units": {
"type": "array",
"items": {
"$ref": "#/definitions/default_2"
"anyOf": [
{
"$ref": "#/definitions/default_2"
},
{
"$ref": "#/definitions/Record<string,string|{quantity:string;denominations:string[];canonical?:string|undefined;}>"
}
]
}
},
"syncSelection": {

View file

@ -186,6 +186,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -229,7 +233,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"

View file

@ -182,6 +182,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -223,7 +227,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"

View file

@ -57,6 +57,20 @@
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [
@ -226,6 +240,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -269,7 +287,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"

View file

@ -57,6 +57,20 @@ export default {
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [
@ -222,6 +236,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -263,7 +281,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"

View file

@ -131,6 +131,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -127,6 +127,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -287,6 +287,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -330,7 +334,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"

View file

@ -283,6 +283,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -324,7 +328,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"

View file

@ -97,6 +97,17 @@
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -333,6 +344,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -376,7 +391,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -665,6 +680,20 @@
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [

View file

@ -97,6 +97,17 @@ export default {
}
]
},
"editButtonAriaLabel": {
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
"anyOf": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
]
},
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@ -329,6 +340,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -370,7 +385,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -656,6 +671,20 @@ export default {
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [

View file

@ -24,8 +24,21 @@
"sourceString"
]
},
"subexpand": {
"$ref": "#/definitions/Record<string,string[]>"
},
"renderings": {
"$ref": "#/definitions/T"
"anyOf": [
{
"$ref": "#/definitions/T"
},
{
"type": "array",
"items": {
"$ref": "#/definitions/T"
}
}
]
}
},
"required": [
@ -153,6 +166,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -196,7 +213,7 @@
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -485,6 +502,20 @@
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [

View file

@ -24,8 +24,21 @@ export default {
"sourceString"
]
},
"subexpand": {
"$ref": "#/definitions/Record<string,string[]>"
},
"renderings": {
"$ref": "#/definitions/T"
"anyOf": [
{
"$ref": "#/definitions/T"
},
{
"type": "array",
"items": {
"$ref": "#/definitions/T"
}
}
]
}
},
"required": [
@ -149,6 +162,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [
@ -190,7 +207,7 @@ export default {
"type": "object",
"properties": {
"icon": {
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return [\"pin\",\"square\",\"circle\",\"checkmark\",\"clock\",\"close\",\"crosshair\",\"help\",\"home\",\"invalid\",\"location\",\"location_empty\",\"location_locked\",\"note\",\"resolved\",\"ring\",\"scissors\",\"teardrop\",\"teardrop_with_hole_green\",\"triangle\"].map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"description": "question: What icon should be used?\ntype: icon\nsuggestions: return Constants.defaultPinIcons.map(i => ({if: \"value=\"+i, then: i, icon: i}))",
"anyOf": [
{
"$ref": "#/definitions/MinimalTagRenderingConfigJson"
@ -476,6 +493,20 @@ export default {
}
]
},
"alsoShowIf": {
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags.",
"anyOf": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
]
},
"ifnot": {
"description": "question: What tags should be applied if this mapping is _not_ chosen?\n\nOnly applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`\n\nifunset: Do not apply a tag if a different mapping is chosen.",
"anyOf": [

View file

@ -2,6 +2,10 @@
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "object",
"properties": {
"quantity": {
"description": "What is quantified? E.g. 'speed', 'length' (including width, diameter, ...), 'electric tension', 'electric current', 'duration'",
"type": "string"
},
"appliesToKey": {
"description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical(<key>)}`",
"type": "array",
@ -26,8 +30,7 @@
}
},
"required": [
"applicableUnits",
"appliesToKey"
"applicableUnits"
],
"definitions": {
"TagConfigJson": {
@ -150,6 +153,10 @@
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -2,6 +2,10 @@ export default {
"description": "In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...)\n\nSometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...)\n\nThis brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...)\n\nNot only do we want to write consistent data to OSM, we also want to present this consistently to the user.\nThis is handled by defining units.\n\n# Rendering\n\nTo render a value with long (human) denomination, use {canonical(key)}\n\n# Usage\n\nFirst of all, you define which keys have units applied, for example:\n\n```\nunits: [\n appliesTo: [\"maxspeed\", \"maxspeed:hgv\", \"maxspeed:bus\"]\n applicableUnits: [\n ...\n ]\n]\n```\n\nApplicableUnits defines which is the canonical extension, how it is presented to the user, ...:\n\n```\napplicableUnits: [\n{\n canonicalDenomination: \"km/h\",\n alternativeDenomination: [\"km/u\", \"kmh\", \"kph\"]\n default: true,\n human: {\n en: \"kilometer/hour\",\n nl: \"kilometer/uur\"\n },\n humanShort: {\n en: \"km/h\",\n nl: \"km/u\"\n }\n},\n{\n canoncialDenomination: \"mph\",\n ... similar for miles an hour ...\n}\n]\n```\n\n\nIf this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage:\nevery value will be parsed and the canonical extension will be added add presented to the other parts of the code.\n\nAlso, if a freeform text field is used, an extra dropdown with applicable denominations will be given",
"type": "object",
"properties": {
"quantity": {
"description": "What is quantified? E.g. 'speed', 'length' (including width, diameter, ...), 'electric tension', 'electric current', 'duration'",
"type": "string"
},
"appliesToKey": {
"description": "Every key from this list will be normalized.\n\nTo render the value properly (with a human readable denomination), use `{canonical(<key>)}`",
"type": "array",
@ -26,8 +30,7 @@ export default {
}
},
"required": [
"applicableUnits",
"appliesToKey"
"applicableUnits"
],
"definitions": {
"TagConfigJson": {
@ -146,6 +149,10 @@ export default {
"prefix": {
"description": "If set, then the canonical value will be prefixed instead, e.g. for '€'\nNote that if all values use 'prefix', the dropdown might move to before the text field",
"type": "boolean"
},
"addSpace": {
"description": "If set, add a space between the quantity and the denomination.\n\nE.g.: `50 mph` instad of `50mph`",
"type": "boolean"
}
},
"required": [

View file

@ -5,7 +5,8 @@
"de": "Tierheime",
"es": "Centros de acogida de animales",
"zh_Hans": "动物收容所",
"pt": "Abrigo para animais"
"pt": "Abrigo para animais",
"ca": "Refugis d'animals"
},
"description": {
"en": "An animal shelter is a facility where animals in trouble are brought and facility's staff (volunteers or not) feeds them and cares of them, rehabilitating and healing them if necessary. This definition includes kennels for abandoned dogs, catteries for abandoned cats, shelters for other abandoned pets and wildlife recovery centres. ",
@ -22,7 +23,8 @@
"de": "Tierheim",
"es": "Centro de acogida de animales",
"zh_Hans": "动物收容所",
"pt": "Abrigo para animais"
"pt": "Abrigo para animais",
"ca": "Refugi d'animals"
},
"mappings": [
{
@ -31,7 +33,8 @@
"en": "{name}",
"de": "{name}",
"es": "{name}",
"zh_Hans": "{name}"
"zh_Hans": "{name}",
"ca": "{name}"
}
}
]
@ -67,7 +70,8 @@
"de": "ein Tierheim",
"es": "una protectora de animales",
"zh_Hans": "动物收容所",
"pt": "um abrigo para animais"
"pt": "um abrigo para animais",
"ca": "un refugi d'animals"
},
"tags": [
"amenity=animal_shelter"
@ -86,7 +90,8 @@
"en": "What is the name of this animal shelter?",
"de": "Wie lautet der Name des Tierheims?",
"es": "¿Cómo se llama este refugio de animales?",
"zh_Hans": "这个动物收容所叫什么名字?"
"zh_Hans": "这个动物收容所叫什么名字?",
"ca": "Quin nom té aquest refugi d'animals?"
},
"render": {
"en": "This animal shelter is named <b>{name}</b>",
@ -104,7 +109,8 @@
"en": "What is the purpose of the animal shelter?",
"de": "Was ist der Zweck des Tierheims?",
"es": "¿Cuál es la finalidad del refugio de animales?",
"zh_Hans": "动物收容所的目的是什么?"
"zh_Hans": "动物收容所的目的是什么?",
"ca": "Quina és la finalitat del refugi d'animals?"
},
"mappings": [
{
@ -112,7 +118,8 @@
"en": "Animals are kept here until adopted by a new owner",
"de": "Tiere werden hier bis zur Abgabe an einen neuen Besitzer untergebracht",
"es": "Los animales permanecen aquí hasta que son adoptados por un nuevo propietario",
"zh_Hans": "动物被饲养在这里直到被新主人收养"
"zh_Hans": "动物被饲养在这里直到被新主人收养",
"ca": "Els animals romanen ací fins que son adoptats per un nou propietari"
},
"if": "purpose=adoption"
},
@ -121,7 +128,8 @@
"en": "Animals are taken care of for the rest of their lives",
"de": "Tiere werden hier bis zum Ende Ihres Lebens untergebracht",
"es": "Los animales reciben cuidados para el resto de su vida",
"zh_Hans": "动物的余生都得到照顾"
"zh_Hans": "动物的余生都得到照顾",
"ca": "Els animals reben cures per a la resta de la seva vida"
},
"if": "purpose=sanctuary"
},
@ -130,7 +138,8 @@
"en": "Injured animals are rehabilitated here until they can be released in nature again ",
"de": "Tiere werden hier untergebracht und gepflegt bis sie wieder in freier Natur ausgesetzt werden können ",
"es": "Los animales heridos se rehabilitan aquí hasta que pueden ser liberados de nuevo en la naturaleza ",
"zh_Hans": "受伤的动物在这里康复,直到它们可以再次被释放到大自然中 "
"zh_Hans": "受伤的动物在这里康复,直到它们可以再次被释放到大自然中 ",
"ca": "Els animals ferits es rehabiliten aquí fins que puguen ser alliberats de nou a la natura "
},
"if": "purpose=release"
}
@ -142,14 +151,16 @@
"en": "When is this animal shelter opened?",
"de": "Wann ist das Tierheim geöffnet?",
"es": "¿Cuándo se abre este refugio de animales?",
"zh_Hans": "这个动物收容所什么时候开放?"
"zh_Hans": "这个动物收容所什么时候开放?",
"ca": "Quan està obert aquest refugi d'animals?"
},
"id": "7",
"render": {
"en": "{opening_hours_table()}",
"de": "{opening_hours_table()}",
"es": "{opening_hours_table()}",
"zh_Hans": "{opening_hours_table()}"
"zh_Hans": "{opening_hours_table()}",
"ca": "{opening_hours_table()}"
},
"freeform": {
"key": "opening_hours",

View file

@ -166,7 +166,7 @@
"hu": "Korlát",
"it": "Archetti",
"zh_Hant": "單車架",
"ca": "Bastidors de grapes",
"ca": "Bastidors",
"da": "Hæftestativer",
"cs": "Stojany",
"pt_BR": "Racks para prender a bicicleta"

View file

@ -175,7 +175,8 @@
"question": {
"en": "Which vehicles are allowed to charge here?",
"nl": "Welke voertuigen kunnen hier opgeladen worden?",
"de": "Welche Fahrzeuge können hier laden?"
"de": "Welche Fahrzeuge können hier laden?",
"ca": "Quins vehicles tenen permesa la càrrega aquí?"
},
"multiAnswer": true,
"mappings": [
@ -185,7 +186,8 @@
"then": {
"en": "<b>Bicycles</b> can be charged here",
"nl": "<b>Elektrische fietsen</b> kunnen hier opgeladen worden",
"de": "Hier können <b>Fahrräder</b> laden"
"de": "Hier können <b>Fahrräder</b> laden",
"ca": "Aquí es poden carregar <b>bicicletes</b>"
}
},
{
@ -194,7 +196,8 @@
"then": {
"en": "<b>Cars</b> can be charged here",
"nl": "<b>Elektrische auto's</b> kunnen hier opgeladen worden",
"de": "Hier können <b>Autos</b> laden"
"de": "Hier können <b>Autos</b> laden",
"ca": "Aquí es poden carregar <b>cotxes</b>"
}
},
{
@ -203,7 +206,8 @@
"then": {
"en": "<b>Scooters</b> can be charged here",
"nl": "<b>Elektrische scooters</b> (snorfiets of bromfiets) kunnen hier opgeladen worden",
"de": "Hier können <b>Roller</b> laden"
"de": "Hier können <b>Roller</b> laden",
"ca": "Aquí es poden carregar <b>Scooters</b>"
}
},
{
@ -212,7 +216,8 @@
"then": {
"en": "<b>Heavy good vehicles</b> (such as trucks) can be charged here",
"nl": "<b>Vrachtwagens</b> kunnen hier opgeladen worden",
"de": "Hier können <b>LKW</b> laden"
"de": "Hier können <b>LKW</b> laden",
"ca": "Aquí es poden carregar <b>camions o trailers</b>"
}
},
{
@ -221,7 +226,8 @@
"then": {
"en": "<b>Buses</b> can be charged here",
"nl": "<b>Bussen</b> kunnen hier opgeladen worden",
"de": "Hier können <b>Busse</b> laden"
"de": "Hier können <b>Busse</b> laden",
"ca": "Aquí es poden carregar <b>autobusos</b>"
}
}
]
@ -231,12 +237,14 @@
"question": {
"en": "Who is allowed to use this charging station?",
"nl": "Wie mag er dit oplaadpunt gebruiken?",
"de": "Wer darf diese Ladestation benutzen?"
"de": "Wer darf diese Ladestation benutzen?",
"ca": "Qui pot utilitzar aquesta estació de càrrega?"
},
"render": {
"en": "Access is {access}",
"nl": "Toegang voor {access}",
"de": "Zugang ist {access}"
"de": "Zugang ist {access}",
"ca": "L'accés està {access}"
},
"freeform": {
"key": "access",
@ -250,7 +258,8 @@
"then": {
"en": "Anyone can use this charging station (payment might be needed)",
"nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)",
"de": "Jeder kann die Station nutzen (eventuell gegen Bezahlung)"
"de": "Jeder kann die Station nutzen (eventuell gegen Bezahlung)",
"ca": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
}
},
{
@ -258,7 +267,8 @@
"then": {
"en": "Anyone can use this charging station (payment might be needed)",
"nl": "Toegankelijk voor iedereen (mogelijks met aanmelden en/of te betalen)",
"de": "Jeder kann diese Ladestation nutzen (eventuell gegen Bezahlung)"
"de": "Jeder kann diese Ladestation nutzen (eventuell gegen Bezahlung)",
"ca": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
},
"hideInAnswer": true
},
@ -267,7 +277,8 @@
"then": {
"en": "Only customers of the place this station belongs to can use this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests</span>",
"nl": "Enkel <b>klanten van de bijhorende plaats</b> mogen dit oplaadpunt gebruiken<br/><span class='subtle'>Bv. op de parking van een hotel en enkel toegankelijk voor klanten van dit hotel</span>",
"de": "Nur Kunden des Ortes, zu dem diese Station gehört, können diese Ladestation nutzen<br/><span class='subtle'>Z.B. eine von einem Hotel betriebene Ladestation, die nur von dessen Gästen genutzt werden kann</span>"
"de": "Nur Kunden des Ortes, zu dem diese Station gehört, können diese Ladestation nutzen<br/><span class='subtle'>Z.B. eine von einem Hotel betriebene Ladestation, die nur von dessen Gästen genutzt werden kann</span>",
"ca": "Sols clientes del lloc al que pertany aquest punt de càrrega poden utilitzar-lo <br/><span class='subtle'>p.e. un punt de càrrega d'un hotel que sols poden utilizar-los els hostes</span>"
}
},
{
@ -275,7 +286,8 @@
"then": {
"en": "A <b>key</b> must be requested to access this charging station<br/><span class='subtle'>E.g. a charging station operated by hotel which is only usable by their guests, which receive a key from the reception to unlock the charging station</span>",
"nl": "Een <b>sleutel</b> is nodig om dit oplaadpunt te gebruiken<br/><span class='subtle'>Bv. voor klanten van een hotel of een bar, die de sleutel aan de receptie kunnen krijgen</span>",
"de": "Für den Zugang zur Station muss ein <b>Schlüssel</b> angefordert werden<br/><span class='subtle'>z.B. eine von einem Hotel betriebene Ladestation, die nur von dessen Gästen genutzt werden kann, die an der Rezeption einen Schlüssel erhalten, um die Ladestation aufzuschließen</span>"
"de": "Für den Zugang zur Station muss ein <b>Schlüssel</b> angefordert werden<br/><span class='subtle'>z.B. eine von einem Hotel betriebene Ladestation, die nur von dessen Gästen genutzt werden kann, die an der Rezeption einen Schlüssel erhalten, um die Ladestation aufzuschließen</span>",
"ca": "S'ha de sol·licitar una <b>clau</b> per a utilitzar aquest punt de càrrega<br/><span class='subtle'>p.e un punt de càrrega operat per un hotel nomes utilitzable pel seus hostes, els quals reben una clau des de recepció per a desbloquejar el punt de càrrega</span>"
}
},
{
@ -283,7 +295,8 @@
"then": {
"en": "Not accessible to the general public (e.g. only accessible to the owners, employees, ...)",
"nl": "Niet toegankelijk voor het publiek <br/><span class='subtle'>Bv. enkel toegankelijk voor de eigenaar, medewerkers ,...</span> ",
"de": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, …)"
"de": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, …)",
"ca": "No accessible per al públic general (p.e. només accessible pels propietaris, empleats, ...)"
}
},
{
@ -291,7 +304,8 @@
"then": {
"en": "This charging station is accessible to the public during certain hours or conditions. Restrictions might apply, but general use is allowed.",
"nl": "Dit oplaadstation is publiek toegankelijk onder voorwaarden (bv. enkel tijdens bepaalde uren). ",
"de": "Diese Ladestation ist zu gewissen Öffnungszeiten oder Bedingungen öffentlich zugänglich. Einschränkungen sind möglich, aber generelle Nutzung ist erlaubt."
"de": "Diese Ladestation ist zu gewissen Öffnungszeiten oder Bedingungen öffentlich zugänglich. Einschränkungen sind möglich, aber generelle Nutzung ist erlaubt.",
"ca": "Aquesta estació de càrrega és accessible al públic durant certes hores o condicions. Es poden aplicar restriccions, però es permet l'ús general."
}
}
]
@ -301,12 +315,14 @@
"render": {
"en": "{capacity} vehicles can be charged here at the same time",
"nl": "{capacity} voertuigen kunnen hier op hetzelfde moment opgeladen worden",
"de": "Hier können {capacity} Fahrzeuge gleichzeitig laden"
"de": "Hier können {capacity} Fahrzeuge gleichzeitig laden",
"ca": "Aquí poden carregar {capacity} vehicles a l'hora"
},
"question": {
"en": "How much vehicles can be charged here at the same time?",
"nl": "Hoeveel voertuigen kunnen hier opgeladen worden?",
"de": "Wie viele Fahrzeuge können hier gleichzeitig laden?"
"de": "Wie viele Fahrzeuge können hier gleichzeitig laden?",
"ca": "Quants vehicles poden carregar a la vegada?"
},
"freeform": {
"key": "capacity",
@ -328,7 +344,8 @@
"then": {
"en": "<b>Schuko wall plug</b> without ground pin (CEE7/4 type F)",
"nl": "<b>Schuko stekker</b> zonder aardingspin (CEE7/4 type F)",
"de": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)"
"de": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)",
"ca": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)"
},
"icon": {
"path": "./assets/layers/charging_station/CEE7_4F.svg",
@ -422,7 +439,8 @@
"then": {
"en": "<b>Schuko wall plug</b> without ground pin (CEE7/4 type F)",
"nl": "<b>Schuko stekker</b> zonder aardingspin (CEE7/4 type F)",
"de": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)"
"de": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)",
"ca": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)"
},
"hideInAnswer": true,
"icon": {
@ -436,7 +454,8 @@
"then": {
"en": "<b>European wall plug</b> with ground pin (CEE7/4 type E)",
"nl": "<b>Europese stekker</b> met aardingspin (CEE7/4 type E)",
"de": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
"de": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)",
"ca": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"icon": {
"path": "./assets/layers/charging_station/TypeE.svg",
@ -499,7 +518,8 @@
"then": {
"en": "<b>European wall plug</b> with ground pin (CEE7/4 type E)",
"nl": "<b>Europese stekker</b> met aardingspin (CEE7/4 type E)",
"de": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
"de": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)",
"ca": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"hideInAnswer": true,
"icon": {
@ -513,7 +533,8 @@
"then": {
"en": "<b>Chademo</b>",
"nl": "<b>Chademo</b>",
"de": "<b>Chademo-Anschluss</b>"
"de": "<b>Chademo-Anschluss</b>",
"ca": "<b>CHAdeMo</b>"
},
"icon": {
"path": "./assets/layers/charging_station/Chademo_type4.svg",
@ -556,7 +577,8 @@
"then": {
"en": "<b>Chademo</b>",
"nl": "<b>Chademo</b>",
"de": "<b>Chademo-Anschluss</b>"
"de": "<b>Chademo-Anschluss</b>",
"ca": "<b>CHAdeMo</b>"
},
"hideInAnswer": true,
"icon": {
@ -570,7 +592,8 @@
"then": {
"en": "<b>Type 1 with cable</b> (J1772)",
"nl": "<b>Type 1 met kabel</b> (J1772)",
"de": "<b>Typ 1 mit Kabel</b> (J1772)"
"de": "<b>Typ 1 mit Kabel</b> (J1772)",
"ca": "<b>Tipus 1 amb cable</b>"
},
"icon": {
"path": "./assets/layers/charging_station/Type1_J1772.svg",
@ -613,7 +636,8 @@
"then": {
"en": "<b>Type 1 with cable</b> (J1772)",
"nl": "<b>Type 1 met kabel</b> (J1772)",
"de": "<b>Typ 1 mit Kabel</b> (J1772)"
"de": "<b>Typ 1 mit Kabel</b> (J1772)",
"ca": "<b>Tipus 1 amb cable</b>"
},
"hideInAnswer": true,
"icon": {
@ -627,7 +651,8 @@
"then": {
"en": "<b>Type 1 <i>without</i> cable</b> (J1772)",
"nl": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)",
"de": "<b>Typ 1 <i>ohne</i> Kabel</b> (J1772)"
"de": "<b>Typ 1 <i>ohne</i> Kabel</b> (J1772)",
"ca": "<b>Tipus 1 <i>sense</i> cable</b>"
},
"icon": {
"path": "./assets/layers/charging_station/Type1_J1772.svg",
@ -670,7 +695,8 @@
"then": {
"en": "<b>Type 1 <i>without</i> cable</b> (J1772)",
"nl": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)",
"de": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)"
"de": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)",
"ca": "<b>Tipus 1 <i>sense</i> cable</b>(J1772)"
},
"hideInAnswer": true,
"icon": {
@ -684,7 +710,8 @@
"then": {
"en": "<b>Type 1 CCS</b> (aka Type 1 Combo)",
"nl": "<b>Type 1 CCS</b> (ook gekend als Type 1 Combo)",
"de": "<b>Typ 1 CCS</b> (Typ 1 Combo)"
"de": "<b>Typ 1 CCS</b> (Typ 1 Combo)",
"ca": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)"
},
"icon": {
"path": "./assets/layers/charging_station/Type1-ccs.svg",
@ -727,7 +754,8 @@
"then": {
"en": "<b>Type 1 CCS</b> (aka Type 1 Combo)",
"nl": "<b>Type 1 CCS</b> (ook gekend als Type 1 Combo)",
"de": "<b> Typ 1 CCS </b> (auch bekannt als Typ 1 Combo)"
"de": "<b> Typ 1 CCS </b> (auch bekannt als Typ 1 Combo)",
"ca": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)"
},
"hideInAnswer": true,
"icon": {
@ -741,7 +769,8 @@
"then": {
"en": "<b>Tesla Supercharger</b>",
"nl": "<b>Tesla Supercharger</b>",
"de": "<b>Tesla Supercharger</b>"
"de": "<b>Tesla Supercharger</b>",
"ca": "<b>Supercarregador de Tesla"
},
"icon": {
"path": "./assets/layers/charging_station/Tesla-hpwc-model-s.svg",
@ -784,7 +813,8 @@
"then": {
"en": "<b>Tesla Supercharger</b>",
"nl": "<b>Tesla Supercharger</b>",
"de": "<b>Tesla Supercharger</b>"
"de": "<b>Tesla Supercharger</b>",
"ca": "<b>Supercarregador de Tesla</b>"
},
"hideInAnswer": true,
"icon": {
@ -798,7 +828,8 @@
"then": {
"en": "<b>Type 2</b> (mennekes)",
"nl": "<b>Type 2</b> (mennekes)",
"de": "<b>Typ 2</b> (Mennekes)"
"de": "<b>Typ 2</b> (Mennekes)",
"ca": "<b>Tipus 2</b> (mennekes)"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_socket.svg",
@ -841,7 +872,8 @@
"then": {
"en": "<b>Type 2</b> (mennekes)",
"nl": "<b>Type 2</b> (mennekes)",
"de": "<b>Typ 2</b> (Mennekes)"
"de": "<b>Typ 2</b> (Mennekes)",
"ca": "<b>Tipus 2</b> (mennekes)"
},
"hideInAnswer": true,
"icon": {
@ -855,7 +887,8 @@
"then": {
"en": "<b>Type 2 CCS</b> (mennekes)",
"nl": "<b>Type 2 CCS</b> (mennekes)",
"de": "<b>Typ 2 CCS</b> (Mennekes)"
"de": "<b>Typ 2 CCS</b> (Mennekes)",
"ca": "<b>CSS Tipus 2</b> (mennekes)"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_CCS.svg",
@ -898,7 +931,8 @@
"then": {
"en": "<b>Type 2 CCS</b> (mennekes)",
"nl": "<b>Type 2 CCS</b> (mennekes)",
"de": "<b>Typ 2 CCS</b> (mennekes)"
"de": "<b>Typ 2 CCS</b> (mennekes)",
"ca": "<b>CSS Tipus 2</b> (mennekes)"
},
"hideInAnswer": true,
"icon": {
@ -1752,7 +1786,8 @@
"question": {
"en": "When is this charging station opened?",
"nl": "Wanneer is dit oplaadpunt beschikbaar??",
"de": "Wann ist die Ladestation geöffnet?"
"de": "Wann ist die Ladestation geöffnet?",
"ca": "Quan està oberta aquesta estació de càrrega?"
}
},
"id": "OH"
@ -1762,7 +1797,8 @@
"question": {
"en": "Does one have to pay to use this charging station?",
"nl": "Moet men betalen om dit oplaadpunt te gebruiken?",
"de": "Muss man für die Nutzung dieser Ladestation bezahlen?"
"de": "Muss man für die Nutzung dieser Ladestation bezahlen?",
"ca": "Hi ha que pagar per utilitzar aquest punt de càrrega?"
},
"mappings": [
{
@ -1777,7 +1813,8 @@
"then": {
"nl": "Gratis te gebruiken (zonder aan te melden)",
"en": "Free to use (without authenticating)",
"de": "Die Nutzung ist kostenlos, keine Authentifizierung erforderlich"
"de": "Die Nutzung ist kostenlos, keine Authentifizierung erforderlich",
"ca": "Ús gratuït (sense autentificació)"
}
},
{
@ -1792,7 +1829,8 @@
"then": {
"nl": "Gratis te gebruiken, maar aanmelden met een applicatie is verplicht",
"en": "Free to use, but one has to authenticate",
"de": "Die Nutzung ist kostenlos, Authentifizierung erforderlich"
"de": "Die Nutzung ist kostenlos, Authentifizierung erforderlich",
"ca": "Ús gratuït, però un s'ha d'autentificar"
}
},
{
@ -1804,7 +1842,8 @@
"then": {
"nl": "Gratis te gebruiken",
"en": "Free to use",
"de": "Kostenlose Nutzung"
"de": "Kostenlose Nutzung",
"ca": "Ús gratuït"
},
"hideInAnswer": true
},
@ -1818,7 +1857,8 @@
"then": {
"nl": "Betalend te gebruiken, maar gratis voor klanten van het bijhorende hotel/café/ziekenhuis/...",
"en": "Paid use, but free for customers of the hotel/pub/hospital/... who operates the charging station",
"de": "Die Nutzung ist kostenpflichtig, aber für Kunden des Betreibers der Einrichtung, wie Hotel, Krankenhaus, … kostenlos"
"de": "Die Nutzung ist kostenpflichtig, aber für Kunden des Betreibers der Einrichtung, wie Hotel, Krankenhaus, … kostenlos",
"ca": "De pagament, però gratuït per als clients de l'hotel/bar/hospital/... que gestiona l'estació de càrrega"
}
},
{
@ -1831,7 +1871,8 @@
"then": {
"nl": "Betalend",
"en": "Paid use",
"de": "Die Nutzung ist kostenpflichtig"
"de": "Die Nutzung ist kostenpflichtig",
"ca": "Ús de pagament"
}
}
]
@ -1841,12 +1882,14 @@
"question": {
"en": "How much does one have to pay to use this charging station?",
"nl": "Hoeveel moet men betalen om dit oplaadpunt te gebruiken?",
"de": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
"de": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?",
"ca": "Quant cal pagar per utilitzar aquesta estació de càrrega?"
},
"render": {
"en": "Using this charging station costs <b>{charge}</b>",
"nl": "Dit oplaadpunt gebruiken kost <b>{charge}</b>",
"de": "Die Nutzung dieser Ladestation kostet <b>{charge}</b>"
"de": "Die Nutzung dieser Ladestation kostet <b>{charge}</b>",
"ca": "Utilitzar aquesta estació de càrrega costa <b>{charge}</b>"
},
"freeform": {
"key": "charge"
@ -1871,7 +1914,8 @@
"question": {
"en": "What kind of authentication is available at the charging station?",
"nl": "Hoe kan men zich aanmelden aan dit oplaadstation?",
"de": "Welche Art der Authentifizierung ist an der Ladestation möglich?"
"de": "Welche Art der Authentifizierung ist an der Ladestation möglich?",
"ca": "Quin tipus d'autenticació hi ha disponible a l'estació de càrrega?"
},
"multiAnswer": true,
"mappings": [
@ -1917,7 +1961,8 @@
"then": {
"en": "Authentication via NFC is available",
"nl": "Aanmelden via NFC is mogelijk",
"de": "Authentifizierung per NFC ist möglich"
"de": "Authentifizierung per NFC ist möglich",
"ca": "L'autenticació mitjançant NFC està disponible"
}
},
{
@ -1926,7 +1971,8 @@
"then": {
"en": "Authentication via Money Card is available",
"nl": "Aanmelden met Money Card is mogelijk",
"de": "Authentifizierung per Geldkarte ist möglich"
"de": "Authentifizierung per Geldkarte ist möglich",
"ca": "L'autenticació mitjançant targeta de pagament està disponible"
}
},
{
@ -1935,7 +1981,8 @@
"then": {
"en": "Authentication via debit card is available",
"nl": "Aanmelden met een betaalkaart is mogelijk",
"de": "Authentifizierung per Kreditkarte ist möglich"
"de": "Authentifizierung per Kreditkarte ist möglich",
"ca": "L'autenticació mitjançant targeta de debit està disponible"
}
},
{
@ -1944,7 +1991,8 @@
"then": {
"en": "Charging here is (also) possible without authentication",
"nl": "Hier opladen is (ook) mogelijk zonder aan te melden",
"de": "Das Laden ist hier (auch) ohne Authentifizierung möglich"
"de": "Das Laden ist hier (auch) ohne Authentifizierung möglich",
"ca": "Carregar aquí (també) és possible sense autenticació"
}
}
],
@ -1983,7 +2031,8 @@
"question": {
"en": "What is the maximum amount of time one is allowed to stay here?",
"nl": "Hoelang mag een voertuig hier blijven staan?",
"de": "Wie lange darf man hier maximal parken?"
"de": "Wie lange darf man hier maximal parken?",
"ca": "Quina és la quantitat màxima de temps que es permet permaneixer aquí?"
},
"freeform": {
"key": "maxstay"
@ -1991,7 +2040,8 @@
"render": {
"en": "One can stay at most <b>{canonical(maxstay)}</b>",
"nl": "De maximale parkeertijd hier is <b>{canonical(maxstay)}</b>",
"de": "Die maximale Parkdauer beträgt <b>{canonical(maxstay)}</b>"
"de": "Die maximale Parkdauer beträgt <b>{canonical(maxstay)}</b>",
"ca": "Un pot quedar-se com a màxim <b>{canonical(maxstay)}</b>"
},
"mappings": [
{
@ -1999,7 +2049,8 @@
"then": {
"en": "No timelimit on leaving your vehicle here",
"nl": "Geen maximum parkeertijd",
"de": "Keine Höchstparkdauer"
"de": "Keine Höchstparkdauer",
"ca": "No hi ha límit de temps per a deixar el teu vehicle aquí"
}
}
],
@ -2017,12 +2068,14 @@
"render": {
"en": "Part of the network <b>{network}</b>",
"nl": "Maakt deel uit van het <b>{network}</b>-netwerk",
"de": "Teil des Netzwerks <b>{network}</b>"
"de": "Teil des Netzwerks <b>{network}</b>",
"ca": "Part de la xarxa <b>{network}</b>"
},
"question": {
"en": "Is this charging station part of a network?",
"nl": "Is dit oplaadpunt deel van een groter netwerk?",
"de": "Ist diese Ladestation Teil eines Netzwerks?"
"de": "Ist diese Ladestation Teil eines Netzwerks?",
"ca": "Aquesta estació de càrrega forma part d'una xarxa?"
},
"freeform": {
"key": "network"
@ -2088,12 +2141,14 @@
"question": {
"en": "Who is the operator of this charging station?",
"nl": "Wie beheert dit oplaadpunt?",
"de": "Wer ist der Betreiber dieser Ladestation?"
"de": "Wer ist der Betreiber dieser Ladestation?",
"ca": "Qui és l'operadora d'aquesta estació de càrrega?"
},
"render": {
"en": "This charging station is operated by {operator}",
"nl": "Wordt beheerd door {operator}",
"de": "Die Station wird betrieben von {operator}"
"de": "Die Station wird betrieben von {operator}",
"ca": "Aquesta estació de càrrega l'opera {operator}"
},
"freeform": {
"key": "operator"
@ -2108,7 +2163,8 @@
"then": {
"en": "Actually, {operator} is the network",
"nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt",
"de": "Eigentlich ist {operator} das Netzwerk"
"de": "Eigentlich ist {operator} das Netzwerk",
"ca": "De fet, {operator} és la xarxa"
},
"addExtraTags": [
"operator="
@ -2123,12 +2179,14 @@
"question": {
"en": "What number can one call if there is a problem with this charging station?",
"nl": "Wat is het telefoonnummer van de beheerder van dit oplaadpunt?",
"de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
"de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?",
"ca": "A quin número es pot cridar si hi ha algun problema amb aquest punt de càrrega?"
},
"render": {
"en": "In case of problems, call <a href='tel:{phone}'>{phone}</a>",
"nl": "Bij problemen, bel naar <a href='tel:{phone}'>{phone}</a>",
"de": "Bei Problemen, anrufen unter <a href='tel:{phone}'>{phone}</a>"
"de": "Bei Problemen, anrufen unter <a href='tel:{phone}'>{phone}</a>",
"ca": "En cas de problemes, truqueu a <a href='tel:{phone}'>{phone}</a>"
},
"freeform": {
"key": "phone",
@ -2140,12 +2198,14 @@
"question": {
"en": "What is the email address of the operator?",
"nl": "Wat is het email-adres van de operator?",
"de": "Wie lautet die E-Mail-Adresse des Betreibers?"
"de": "Wie lautet die E-Mail-Adresse des Betreibers?",
"ca": "Quin és el correu electrònic de l'operadora?"
},
"render": {
"en": "In case of problems, send an email to <a href='mailto:{email}'>{email}</a>",
"nl": "Bij problemen, email naar <a href='mailto:{email}'>{email}</a>",
"de": "Bei Problemen senden Sie bitte eine E-Mail an <a href='mailto:{email}'>{email}</a>"
"de": "Bei Problemen senden Sie bitte eine E-Mail an <a href='mailto:{email}'>{email}</a>",
"ca": "En cas de problemes, envia un email a <a href='mailto:{email}'>{email}</a>"
},
"freeform": {
"key": "email",
@ -2193,7 +2253,8 @@
"question": {
"en": "Is this charging point in use?",
"nl": "Is dit oplaadpunt operationeel?",
"de": "Ist die Station in Betrieb?"
"de": "Ist die Station in Betrieb?",
"ca": "Està en ús aquest punt de càrrega?"
},
"mappings": [
{
@ -2209,7 +2270,8 @@
"then": {
"en": "This charging station works",
"nl": "Dit oplaadpunt werkt",
"de": "Die Station ist in Betrieb"
"de": "Die Station ist in Betrieb",
"ca": "Aquesta estació de càrrega funciona"
}
},
{
@ -2225,7 +2287,8 @@
"then": {
"en": "This charging station is broken",
"nl": "Dit oplaadpunt is kapot",
"de": "Die Station ist defekt"
"de": "Die Station ist defekt",
"ca": "Aquesta estació de carrega està trencada"
}
},
{
@ -2241,7 +2304,8 @@
"then": {
"en": "A charging station is planned here",
"nl": "Hier zal binnenkort een oplaadpunt gebouwd worden",
"de": "Die Station ist erst in Planung"
"de": "Die Station ist erst in Planung",
"ca": "Aquí està prevista una estació de recàrrega"
}
},
{
@ -2273,7 +2337,8 @@
"then": {
"en": "This charging station has beed permanently disabled and is not in use anymore but is still visible",
"nl": "Dit oplaadpunt is niet meer in gebruik maar is wel nog aanwezig",
"de": "Die Station ist dauerhaft geschlossen und nicht mehr in Nutzung, aber noch sichtbar"
"de": "Die Station ist dauerhaft geschlossen und nicht mehr in Nutzung, aber noch sichtbar",
"ca": "Aquesta estació de recàrrega s'ha desactivat permanentment i ja no s'utilitza, però encara és visible"
}
}
]
@ -2283,7 +2348,8 @@
"question": {
"en": "Does one have to pay a parking fee while charging?",
"nl": "Moet men parkeergeld betalen tijdens het opladen?",
"de": "Muss man während des Ladens eine Parkgebühr bezahlen?"
"de": "Muss man während des Ladens eine Parkgebühr bezahlen?",
"ca": "Cal pagar una taxa d'aparcament mentre es carrega?"
},
"mappings": [
{
@ -2291,7 +2357,8 @@
"then": {
"en": "No additional parking cost while charging",
"nl": "Geen extra parkeerkost tijdens het opladen",
"de": "Keine zusätzlichen Parkkosten während des Ladens"
"de": "Keine zusätzlichen Parkkosten während des Ladens",
"ca": "No cal pagar una taxa addicional mentres carrega"
}
},
{
@ -2299,7 +2366,8 @@
"then": {
"en": "An additional parking fee should be paid while charging",
"nl": "Tijdens het opladen moet er parkeergeld betaald worden",
"de": "Während des Ladens ist eine zusätzliche Parkgebühr zu entrichten"
"de": "Während des Ladens ist eine zusätzliche Parkgebühr zu entrichten",
"ca": "Cal pagar una taxa addicional d'aparcament mentres carrega"
}
}
],

View file

@ -286,7 +286,7 @@
"es": "Se trata de un negocio de comida rápida, centrado en el servicio rápido. Si hay asientos disponibles, son más bien limitados y funcionales.",
"fr": "C'est un fast-food, centrée sur le service rapide. Si des places sont disponibles, elles sont plutôt limitées et fonctionnelles.",
"hu": "Ez egy gyorsétterem (büfé), amely a gyors kiszolgálásra összpontosít. Ha vannak is ülőhelyek, ezek meglehetősen korlátozottak és funkcionálisak.",
"ca": "Aquest és un negoci de menjar ràpid, centrat en el servei ràpid. Si hi han seients disponibles, aquests seràn limitats i funcionals.",
"ca": "Aquest és un negoci de menjar ràpid, centrat en el servei ràpid. Si hi han seients disponibles, aquests seran limitats i funcionals.",
"cs": "Jedná se o podnik s rychlým občerstvením, zaměřený na rychlou obsluhu. Pokud je k dispozici místo k sezení, je spíše omezené a funkční."
}
},
@ -319,7 +319,7 @@
"de": "Was für Essen gibt es hier?",
"es": "¿Qué tipo de comida sirven aquí?",
"fr": "Quelle type de nourriture est servie ici ?",
"ca": "Quin menjar es serveix aquí?",
"ca": "Quin tipus de menjar es serveix aquí?",
"cs": "Jaké jídlo se zde podává?"
},
"render": {
@ -395,7 +395,7 @@
"nl": "Dit is een broodjeszaak",
"de": "Dies ist ein Sandwichladen",
"fr": "C'est une sandwicherie",
"ca": "Això és un sandvitxeria",
"ca": "Això és una botiga d'entrepans",
"cs": "Toto je obchod se sendviči"
}
},

View file

@ -355,7 +355,7 @@
"en": "a metal workshop"
},
{
"en": "meta workshop"
"en": "metal workshop"
},
"./assets/layers/hackerspace/metal.svg",
false

View file

@ -556,5 +556,9 @@
]
}
}
]
],
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
}
}

View file

@ -130,7 +130,12 @@
},
"mappings": [
{
"if": "highway=living_street",
"if": {
"and": [
"highway=living_street",
"_country=be"
]
},
"then": {
"en": "This is a living street, which has a maxspeed of 20km/h",
"nl": "Dit is een woonerf en heeft dus een maximale snelheid van 20km/h",

View file

@ -204,7 +204,7 @@
},
"description": {
"en": "You can specify later on what this shop sells.",
"ca": "Afegir una botiga nova",
"ca": "Podeu especificar més endavant el que ven aquesta botiga.",
"cs": "Přidat nový obchod",
"de": "Ein neues Geschäft hinzufügen",
"eo": "Enmeti novan butikon",

View file

@ -298,7 +298,8 @@
"ru": "Здесь можно играть в баскетбол",
"de": "Hier wird Basketball gespielt",
"es": "Aquí se juega al baloncesto",
"cs": "Zde se hraje basketbal"
"cs": "Zde se hraje basketbal",
"ca": "Aquí es juga bàsquet"
},
"hideInAnswer": true
},
@ -320,7 +321,8 @@
"question": {
"en": "How much basketball hoops does this pitch have?",
"de": "Wie viele Basketballkörbe hat das Spielfeld?",
"cs": "Kolik má toto hřiště basketbalových košů?"
"cs": "Kolik má toto hřiště basketbalových košů?",
"ca": "Quants cèrcols té aquesta pista?"
},
"mappings": [
{
@ -336,7 +338,8 @@
"then": {
"en": "This basketball pitch has two hoops",
"de": "Dieses Basketballfeld hat zwei Körbe",
"cs": "Toto basketbalové hřiště má dva koše"
"cs": "Toto basketbalové hřiště má dva koše",
"ca": "Aquest camp de bàsquet té dos cèrcols"
}
},
{
@ -344,7 +347,8 @@
"then": {
"en": "This basketball pitch has four hoops",
"de": "Dieses Basketballfeld hat vier Körbe",
"cs": "Toto basketbalové hřiště má čtyři koše"
"cs": "Toto basketbalové hřiště má čtyři koše",
"ca": "Aquest camp de bàsquet té quatre cèrcols"
}
},
{
@ -352,7 +356,8 @@
"then": {
"en": "This basketball pitch has {hoops} hoops",
"de": "Dieses Basketballfeld hat {hoops} Körbe",
"cs": "Toto basketbalové hřiště má {hoops} koše"
"cs": "Toto basketbalové hřiště má {hoops} koše",
"ca": "Aquest camp de bàsquet té {hoops} cèrcols"
},
"hideInAnswer": true
}
@ -461,14 +466,16 @@
"then": {
"en": "The surface is <b>fine gravel</b>",
"nl": "De ondergrond bestaat uit <b>grind</b>",
"de": "Die Oberfläche ist <b>feiner Kies</b>"
"de": "Die Oberfläche ist <b>feiner Kies</b>",
"ca": "La superfície és <b> grava fina</b>"
}
},
{
"if": "surface=tartan",
"then": {
"en": "The surface of this track is Tartan, a synthetic, slightly springy, porous surface",
"nl": "De ondergrond is Tartan, een synthetisch, licht verende en poreuze ondergrond"
"nl": "De ondergrond is Tartan, een synthetisch, licht verende en poreuze ondergrond",
"ca": "La superfície d'aquesta pista és Tartan, una superfície sintètica, lleugerament molla i porosa"
}
}
],
@ -553,7 +560,8 @@
"ru": "Свободный доступ",
"de": "Der Sportplatz ist öffentlich zugänglich",
"es": "Acceso público",
"cs": "Veřejný přístup"
"cs": "Veřejný přístup",
"ca": "Accés públic"
},
"hideInAnswer": true
}
@ -711,7 +719,8 @@
"it": "Sempre aperto",
"de": "Immer zugänglich",
"es": "Siempre accesible",
"cs": "Vždy přístupné"
"cs": "Vždy přístupné",
"ca": "Sempre accesible"
}
}
],

View file

@ -293,27 +293,31 @@
{
"id": "incline",
"render": {
"en": "These stairs have an incline of {incline}"
"en": "These stairs have an incline of {incline}",
"ca": "Aquestes escales tenen una inclinació de {incline}"
},
"freeform": {
"key": "incline",
"type": "slope"
},
"question": {
"en": "What is the incline of these stairs?"
"en": "What is the incline of these stairs?",
"ca": "Quina és la inclinació d'aquestes escales?"
},
"mappings": [
{
"if": "incline=up",
"then": {
"en": "The upward direction is {direction_absolute()}"
"en": "The upward direction is {direction_absolute()}",
"ca": "La direcció ascendent és {direction_absolute()}"
},
"hideInAnswer": true
},
{
"if": "incline=down",
"then": {
"en": "The downward direction is {direction_absolute()}"
"en": "The downward direction is {direction_absolute()}",
"ca": "La direcció descendent és {direction_absolute()}"
},
"hideInAnswer": true
}

View file

@ -13,7 +13,8 @@
"description": {
"en": "Waymarked trails",
"nl": "Aangeduide wandeltochten",
"de": "Markierte Wanderwege"
"de": "Markierte Wanderwege",
"ca": "Rutes marcades"
},
"source": {
"osmTags": {
@ -107,12 +108,14 @@
"question": {
"en": "What is the name of this trail?",
"nl": "Wat is de naam van deze wandeling?",
"de": "Wie heißt dieser Weg?"
"de": "Wie heißt dieser Weg?",
"ca": "Quin és el nom d'aquest sender?"
},
"render": {
"en": "This trail is called <b>{name}</b>",
"nl": "Deze wandeling heet <b>{name}</b>",
"de": "Dieser Weg heißt <b>{name}</b>"
"de": "Dieser Weg heißt <b>{name}</b>",
"ca": "Aquest sender s'anomena <b>{name}</b>"
},
"freeform": {
"key": "name"
@ -143,7 +146,8 @@
"then": {
"en": "This trail is maintained by Natuurpunt",
"nl": "Dit gebied wordt beheerd door Natuurpunt",
"de": "Dieser Weg wird von Natuurpunt gepflegt"
"de": "Dieser Weg wird von Natuurpunt gepflegt",
"ca": "Aquest sender és mantingut per Natuurpunt"
},
"icon": {
"path": "./assets/themes/buurtnatuur/Natuurpunt.jpg",
@ -174,12 +178,14 @@
"question": {
"en": "What is the reference colour of this trail?",
"nl": "Welke kleur heeft deze wandeling?",
"de": "Was ist die Referenzfarbe dieses Weges?"
"de": "Was ist die Referenzfarbe dieses Weges?",
"ca": "Quin és el color de referència d'aquest sender?"
},
"render": {
"en": "The reference colour is {colour}",
"nl": "Deze wandeling heeft kleur {colour}",
"de": "Die Referenzfarbe ist {colour}"
"de": "Die Referenzfarbe ist {colour}",
"ca": "El color de referència és {colour}"
},
"freeform": {
"key": "colour",

View file

@ -134,7 +134,8 @@
],
"human": {
"en": "{quantity} A",
"nl": "{quantity} A"
"nl": "{quantity} A",
"ca": "{quantity} A"
}
}
],
@ -175,7 +176,8 @@
"en": "one meter",
"fr": "un mètre",
"nl": "één meter",
"de": "ein Meter"
"de": "ein Meter",
"ca": "un metre"
}
},
{
@ -199,7 +201,8 @@
},
"humanSingular": {
"en": "one centimeter",
"nl": "één centimeter"
"nl": "één centimeter",
"ca": "un centímetre"
}
},
{
@ -220,7 +223,8 @@
"humanSingular": {
"en": "one millimeter",
"nl": "één millimeter",
"de": "ein Millimeter"
"de": "ein Millimeter",
"ca": "un mil·límetre"
}
},
{
@ -332,11 +336,13 @@
],
"human": {
"en": "{quantity} minutes",
"nl": "{quantity} minuten"
"nl": "{quantity} minuten",
"ca": "{quantity} minuts"
},
"humanSingular": {
"en": "one minute",
"nl": "één minuut"
"nl": "één minuut",
"ca": "un minut"
}
},
{
@ -353,11 +359,13 @@
],
"human": {
"en": "{quantity} hours",
"nl": "{quantity} uren"
"nl": "{quantity} uren",
"ca": "{quantity} hores"
},
"humanSingular": {
"en": "one hour",
"nl": "één uur"
"nl": "één uur",
"ca": "una hora"
}
},
{
@ -371,7 +379,8 @@
],
"human": {
"en": "{quantity} days",
"nl": "{quantity} day"
"nl": "{quantity} day",
"ca": "{quantity} dies"
},
"humanSingular": {
"en": "one day",

View file

@ -50,7 +50,7 @@
"then": {
"en": "The language was set via an URL-parameter and cannot be set by the user.",
"de": "Die Sprache wurde über einen URL-Parameter gesetzt und kann nicht vom Benutzer eingestellt werden.²",
"ca": "L'idioma es va establir mitjançant un paràmetre d'URL i l'usuari no pot definir-lo.²",
"ca": "L'idioma es va establir mitjançant un paràmetre d'URL i l'usuari no pot definir-lo.",
"cs": "Jazyk byl nastaven pomocí parametru URL a uživatel jej nemůže nastavit.²"
}
}
@ -83,7 +83,7 @@
"text": {
"en": "<b class='alert'>You have {_unreadMessages} messages</b><br/>Open your inbox",
"de": "<b class='alert'>Du hast {_unreadMessages}</b><br/>Öffne Deinen Posteingang",
"ca": "<b class='alert'>Tens {_unreadMessages}</b><br/>Open your inbox",
"ca": "<b class='alert'>Tens {_unreadMessages} missatges </b><br/>Obri la safata d'entrada",
"cs": "<b class='alert'>Máte {_unreadMessages}</b><br/>Otevřít schránku"
},
"href": "{_backend}/messages/inbox"
@ -123,13 +123,15 @@
"if": "mapcomplete-a11y=default",
"alsoShowIf": "mapcomplete-a11y=",
"then": {
"en": "Enable accessibility features when arrow keys are used to navigate the map"
"en": "Enable accessibility features when arrow keys are used to navigate the map",
"ca": "Activar les funcions d'accessibilitat quan s'utilitzen les tecles de fletxa per navegar pel mapa"
}
},
{
"if": "mapcomplete-a11y=always",
"then": {
"en": "Always enable accessibility features"
"en": "Always enable accessibility features",
"ca": "Sempre habilita les característiques d'accessibilitat"
}
},
{
@ -411,7 +413,8 @@
"en": "This can help to accurately position a new element",
"cs": "To může pomoci přesněji umístit nový prvek",
"de": "Dies kann dazu beitragen, ein neues Element genau zu positionieren",
"nl": "Dit kan helpen om nieuwe elementen accuraat te plaatsen"
"nl": "Dit kan helpen om nieuwe elementen accuraat te plaatsen",
"ca": "Això pot ajudar a posicionar amb precisió un nou element"
},
"mappings": [
{

View file

@ -579,7 +579,8 @@
"en": "Fruit is sold",
"nl": "Fruit wordt verkocht",
"de": "Obst wird verkauft",
"cs": "Prodává ovoce"
"cs": "Prodává ovoce",
"ca": "Es ven fruita"
},
"icon": "./assets/layers/vending_machine/fruits.svg"
},
@ -589,7 +590,8 @@
"en": "Strawberries are sold",
"nl": "Aardbeien worden verkocht",
"de": "Erdbeeren werden verkauft",
"cs": "Prodává jahody"
"cs": "Prodává jahody",
"ca": "Es venen maduixes"
},
"icon": "./assets/layers/vending_machine/strawberry.svg"
},
@ -643,7 +645,8 @@
"en": "Bicycle lights are sold",
"nl": "Fietslampjes worden verkocht",
"de": "Fahrradlampen werden verkauft",
"cs": "Prodává světla na kolo"
"cs": "Prodává světla na kolo",
"ca": "Es venen llums per a bicicletes"
}
},
{
@ -652,7 +655,8 @@
"en": "Gloves are sold",
"nl": "Handschoenen worden verkocht",
"de": "Fahrradhandschuhe werden verkauft",
"cs": "Prodává rukavice"
"cs": "Prodává rukavice",
"ca": "Es venen guants"
}
},
{
@ -661,7 +665,8 @@
"en": "Bicycle repair kits are sold",
"nl": "Fietsreparatiesets worden verkocht",
"de": "Fahrrad-Reparaturset werden verkauft",
"cs": "Prodává sady na opravu jízdních kol"
"cs": "Prodává sady na opravu jízdních kol",
"ca": "Es venen kits de reparació de bicicletes"
}
},
{
@ -670,7 +675,8 @@
"en": "Bicycle pumps are sold",
"nl": "Fietspompen worden verkocht",
"de": "Fahrradpumpen werden verkauft",
"cs": "Prodává pumpy na kolo"
"cs": "Prodává pumpy na kolo",
"ca": "Es venen bombes de bicicletes"
}
},
{
@ -679,7 +685,8 @@
"en": "Bicycle locks are sold",
"nl": "Fietssloten worden verkocht",
"de": "Fahrradschlösser werden verkauft",
"cs": "Prodává zámky na kolo"
"cs": "Prodává zámky na kolo",
"ca": "Es venen cadenats per a bicicletes"
}
}
],
@ -980,7 +987,7 @@
"question": {
"en": "Sale of fruit",
"nl": "Verkoop van fruit",
"ca": "Venda de flors",
"ca": "Venda de fruites",
"de": "Verkauf von Obst",
"cs": "Prodej ovoce"
},
@ -990,7 +997,7 @@
"question": {
"en": "Sale of strawberries",
"nl": "Verkoop van aardbeien",
"ca": "Venda de tiquets d'aparcament",
"ca": "Venda de maduixes",
"de": "Verkauf von Erdbeeren",
"cs": "Prodej jahod"
},
@ -1011,7 +1018,7 @@
"osmTags": "vending~i~.*parking_tickets.*",
"question": {
"en": "Sale of parking tickets",
"ca": "Venda de bitllets de transport públic",
"ca": "Venda de tiquets d'aparcament",
"de": "Verkauf von Parkscheinen",
"cs": "Prodej parkovacích lístků"
}
@ -1040,7 +1047,8 @@
"en": "Sale of bicycle lights",
"nl": "Verkoop van fietslampjes",
"de": "Verkauf von Fahrradlampen",
"cs": "Prodej světel na kolo"
"cs": "Prodej světel na kolo",
"ca": "Venda de llums de bicicletes"
}
},
{
@ -1049,7 +1057,8 @@
"en": "Sale of gloves",
"nl": "Verkoop van handschoenen",
"de": "Verkauf von Fahrradhandschuhen",
"cs": "Prodej rukavic"
"cs": "Prodej rukavic",
"ca": "Venda de guants"
}
},
{
@ -1058,7 +1067,8 @@
"en": "Sale of bicycle repair kits",
"nl": "Verkoop van fietsreparatiesets",
"de": "Verkauf von Fahrrad-Reparatursets",
"cs": "Prodej sad na opravu jízdních kol"
"cs": "Prodej sad na opravu jízdních kol",
"ca": "Venda de kits de reparació de bicicletes"
}
},
{
@ -1067,7 +1077,8 @@
"en": "Sale of bicycle pumps",
"nl": "Verkoop van fietspompen",
"de": "Verkauf von Fahrradpumpen",
"cs": "Prodej pump na kolo"
"cs": "Prodej pump na kolo",
"ca": "Venda de bombes de bicicletes"
}
},
{
@ -1076,7 +1087,8 @@
"en": "Sale of bicycle locks",
"nl": "Verkoop van fietssloten",
"de": "Verkauf von Fahrradschlössern",
"cs": "Prodej zámků na kola"
"cs": "Prodej zámků na kola",
"ca": "Venda de cadenat per a bicicletes"
}
}
]

View file

@ -39,7 +39,7 @@
"es": "enlaces nodo a nodo",
"nl": "Verbindingen van node naar node",
"fr": "liens noeud à noeud",
"ca": "enllaços node a node",
"ca": "Enllaços node a node",
"cs": "propojení mezi uzly",
"pl": "łącza węzeł do węzła"
},
@ -130,7 +130,7 @@
"name": {
"en": "Nodes",
"de": "Knotenpunkte",
"ca": "nodes",
"ca": "Nodes",
"es": "nodos",
"nb_NO": "noder",
"nl": "Knooppunten",
@ -214,7 +214,8 @@
"en": "What is the reference number of this cycling node?",
"nl": "Wat is het referentienummer van dit fietsknooppunt?",
"de": "Wie lautet die Nummer des Knotenpunkts im Fahrradknotenpunktnetzwerk?",
"cs": "Jaké je referenční číslo tohoto cyklistického uzlu?"
"cs": "Jaké je referenční číslo tohoto cyklistického uzlu?",
"ca": "Quin és el número de referència d'aquest node ciclista?"
},
"freeform": {
"key": "rcn_ref",
@ -230,7 +231,8 @@
"en": "This cycling node has reference number {rcn_ref}",
"nl": "Dit fietsknooppunt heeft referentienummer {rcn_ref}",
"de": "Knotenpunktnummer {rcn_ref} des Fahrradknotenpunktnetzwerks",
"cs": "Tento cyklistický uzel má referenční číslo {rcn_ref}"
"cs": "Tento cyklistický uzel má referenční číslo {rcn_ref}",
"ca": "Aquest node ciclista té la referència número {rcn_ref}"
},
"condition": "rcn_ref~*"
},
@ -304,7 +306,8 @@
"title": {
"en": "a cycling node",
"nl": "een fietsknooppunt",
"de": "ein Knoten eines Fahrradknotenpunktnetzwerks"
"de": "ein Knoten eines Fahrradknotenpunktnetzwerks",
"ca": "un node ciclista"
},
"snapToLayer": [
"cycleways_and_roads"

View file

@ -70,14 +70,16 @@
{
"question": {
"en": "Only show fritures using vegetable oil",
"de": "Nur Friteusen mit Pflanzenöl anzeigen"
"de": "Nur Friteusen mit Pflanzenöl anzeigen",
"ca": "Només mostra freiduries que utilitzen oli vegetal"
},
"osmTags": "friture:oil=vegetable"
},
{
"question": {
"en": "Only show fritures using animal oil",
"de": "Nur Friteusen mit tierischem Öl anzeigen"
"de": "Nur Friteusen mit tierischem Öl anzeigen",
"ca": "Només mostra freiduries que utilitzen oli animal"
},
"osmTags": "friture:oil=animal"
}

View file

@ -5,7 +5,8 @@
"cs": "Rozcestníky",
"de": "Wegweiser",
"es": "Poste guía",
"pl": "Drogowskazy"
"pl": "Drogowskazy",
"ca": "Pal guia"
},
"description": {
"en": "Guideposts (also known as fingerposts or finger posts) are often found along official hiking, cycling, skiing or horseback riding routes to indicate the directions to different destinations. Additionally, they are often named after a region or place and show the altitude.\n\nThe position of a signpost can be used by a hiker/biker/rider/skier as a confirmation of the current position, especially if they use a printed map without a GPS receiver. ",

View file

@ -3,12 +3,14 @@
"title": {
"en": "Icecream",
"de": "Eiscreme",
"cs": "Zmrzlina"
"cs": "Zmrzlina",
"ca": "Gelat"
},
"description": {
"en": "A map showing ice cream parlors and ice cream vending machines",
"de": "Eine Karte, die Eisdielen und Eisautomaten zeigt",
"cs": "Mapa zobrazující prodej zmrzliny a automaty na zmrzlinu"
"cs": "Mapa zobrazující prodej zmrzliny a automaty na zmrzlinu",
"ca": "Un mapa que mostra les gelateries i les màquines expenedores de gelats"
},
"icon": "./assets/layers/ice_cream/ice_cream.svg",
"layers": [

View file

@ -50,6 +50,13 @@
"panelIntro": "<h3>La teva interfície personal</h3>Activa les teves capes favorites de totes les interfícies oficials",
"reload": "Recarregar dades"
},
"favouritePoi": {
"button": {
"isMarkedShort": "Marcat com a ubicació favorita",
"isNotMarkedShort": "No marcat com a favorit",
"markAsFavouriteTitle": "Marca aquesta ubicació com a preferida"
}
},
"flyer": {
"aerial": "Aquest mapa utilitza un fons diferent, és a dir, imatges aèries de Agentschap Informatie Vlaanderen",
"callToAction": "Prova'l a mapcomplete.org",
@ -124,7 +131,7 @@
"pleaseLogin": "Entra per afegir un nou element",
"presetInfo": "El nou PDI tindrà les etiquetes {tags}",
"stillLoading": "Les dades es segueixen carregant. Espera una mica abans d'afegir cap element.",
"title": "Vols afegir un element?",
"title": "Afegeix un element nou",
"warnVisibleForEveryone": "La teva contribució serà vista per tothom",
"wrongType": "Aquest element no és un punt o una via i no pot ser importat",
"zoomInFurther": "Apropa per afegir un element.",
@ -166,7 +173,7 @@
"backgroundSwitch": "Canvia el fons",
"cancel": "Cancel·lar",
"confirm": "Confirmar",
"customThemeIntro": "<h3>Peticions personalitzades</h3>Aquestes són les peticions generades pels usuaris que has visitat abans.",
"customThemeIntro": "Aquestes són les peticions generades pels usuaris que has visitat abans.",
"download": {
"downloadAsPdf": "Baixar un PDF del mapa actual",
"downloadAsPdfHelper": "Ideal per imprimir el mapa actual",
@ -186,7 +193,6 @@
"includeMetaData": "Incloure metadades (darrer editor, valors calculats, ...)",
"licenseInfo": "<h3>Avís de drets de còpia</h3>Les dades proveïdes estan sota ODbL. Es poden reutilitzar de forma gratuïta, però <ul><li>l'atribució a <b>© Contribuïdors d'OpenStreetMap</b> s'ha de mostrar</li><li> Qualsevol canvi s'ha de publicar sota la mateixa llicència</li></ul> Llegeix sencer <ahref=\"https://www.openstreetmap.org/copyright\" target=\"_blank\">l'avís de drets de còpia</a> per més detalls.",
"noDataLoaded": "No s'han carregat dades. La baixada estarà disponible aviat",
"pdf": {},
"title": "Descarrega",
"uploadGpx": "Pujar la teva traça a OpenStreetMap"
},
@ -342,6 +348,13 @@
},
"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…",
"visualFeedback": {
"directionsRelative": {
"left": "esquerra",
"right": "dreta"
},
"fromGps": "{distance} {direction} de la seva ubicació"
},
"waitingForGeopermission": "Esperant al vostre permís per a utilitzar la geolocalització…",
"waitingForLocation": "Buscant la vostra ubicació actual…",
"weekdays": {
@ -620,6 +633,11 @@
"description": "un número",
"feedback": "No és un nombre"
},
"id": {
"description": "un identificador",
"invalidCharacter": "Un identificador només pot contenir lletres, dígits i guions baixos",
"shouldBeLonger": "Un identificador ha de tenir almenys 3 caràcters"
},
"int": {
"description": "un número sencer"
},
@ -644,6 +662,10 @@
"description": "un número sencer, positiu",
"noZero": "No es permet el zero"
},
"slope": {
"inputExplanation": "Poseu el telèfon a terra amb la part superior del telèfon apuntant cap a la part superior del pendent.",
"inputIncorrect": "Per a les mesures correctes, assegureu-vos que la fletxa està dins de la zona verda."
},
"string": {
"description": "un tros de text"
},

View file

@ -22,13 +22,18 @@
"delete": "Poista",
"explanations": {
"hardDelete": "Tämä kohde poistetaan OpenStreetMapistä. Kokenut kartoittaja voi palauttaa sen.",
"retagNoOtherThemes": "Tämä kohde luokitellaan uudelleen ja piilotetaan tältä sovellukselta",
"retagOtherThemes": "Tämän kohteen ominaisuustietoja muutetaan, ja se ilmestyy näkyviin teemoissa {otherThemes}",
"selectReason": "Valitse, miksi tämä kohde pitäisi poistaa",
"softDelete": "Tämä kohde päivitetään ja piilotetaan tässä sovelluksessa. <span class='subtle'>{reason}</span>"
},
"isDeleted": "Tämä kohde on poistettu",
"isntAPoint": "Vain pisteitä voi poistaa. Valittu kohde on viiva, alue tai relaatio.",
"loading": "Tutkitaan ominaisuuksista, voiko tämän kohteen poistaa.",
"loginToDelete": "Kohteen poistamiseksi täytyy kirjautua",
"notEnoughExperience": "Tämän kohteen loi joku muu.",
"onlyEditedByLoggedInUser": "Tätä kohdetta ei ole muokannut kukaan muu kuin sinä, joten sen voi huoletta poistaa.",
"partOfOthers": "Tämä piste on osa viivaa tai relaatiota eikä sitä voi poistaa suoraan.",
"readMessages": "Sinulle on lukemattomia viestejä. Lue ne ennen kuin poistat kohteen joku on saattanut lähettää palautetta",
"reasons": {
"disused": "Tämä kohde on poistettu käytöstä tai poistettu",
@ -37,18 +42,23 @@
"test": "Tämä oli testikohde kohdetta ei ollut ikinä olemassa"
},
"safeDelete": "Tämä kohde voidaan turvallisesti poistaa.",
"useSomethingElse": "Poista se toisella OpenStreetMap-editorilla",
"whyDelete": "Miksi tämä kohde pitäisi poistaa?"
},
"favourite": {
"loginNeeded": "<h3>Kirjaudu sisään</h3>Oma asettelu on saatavilla vain OpenStreetMap-käyttäjille",
"panelIntro": "<h3>Oma teema</h3>Käytä suosikkitasojasi kaikista virallisista teemoista",
"reload": "Lataa data uudelleen"
},
"favouritePoi": {
"button": {
"isFavourite": "Tämä paikka on merkitty suosikiksi ja näkyy kaikilla MapCompleten teemakartoilla, joita katselet.",
"isMarkedShort": "Merkitty suosikkisijainniksi",
"isNotMarkedShort": "Ei merkitty suosikiksi",
"markAsFavouriteTitle": "Merkitse tämä paikka suosikkisijainniksi",
"markDescription": "Lisää tämä paikka henkilökohtaiselle suosikkilistalle",
"unmark": "Poista henkilökohtaiselta suosikkilistalta"
"markDescription": "Lisää tämä paikka omalle suosikkilistalle",
"unmark": "Poista omalta suosikkilistalta",
"unmarkNotDeleted": "Tätä pistettä ei poisteta ja se pysyy näkyvissä kartoilla sinulle ja muille"
},
"downloadGeojson": "Lataa suosikkisi geojson-muodossa",
"downloadGpx": "Lataa suosikkisi GPX-muodossa",
@ -59,39 +69,109 @@
"title": "Suosikkisijaintisi"
},
"flyer": {
"aerial": "Tämä kartta käyttää eri taustaa, joka on ilmakuva taholta Agentschap Informatie Vlaanderen",
"callToAction": "Kokeile sitä osoitteessa mapcomplete.org",
"cyclofix": "Pyöränpumput, korjausasemat, juomavesi ja pyöräkaupat ovat CycloFixissä",
"description": "Vaakasuuntainen A4-lentolehtinen MapCompleten mainostamiseen",
"editing": {
"ex": "Alla on yksinkertainen esimerkki siitä, miltä tämä näyttää luonnonsuojelualueella.",
"intro": "Käyttäjää tervehtii kartta, jolla on kohteita. Kun kohde valitaan, sen tiedot näytetään.",
"title": "Miltä käyttöliittymä näyttää?"
},
"examples": "MapCompletessa on paljon teemakarttoja. Muutamia niistä näkyy tässä.\n\nVerkossa on vielä lisää teemakarttoja aiheista: terveydenhuolto, sisänavigointi, esteettömyydes pyörätuolilla, jätteenkäsittelylaitokset, julkiset kirjahyllyt, sateenkaaren väreissä olevat suojatiet, … Löydä ne kaikki mapcomplete.org-sivustolta",
"fakeui": {
"add_images": "Lisää kuvia muutamalla napsautuksella"
"add_images": "Lisää kuvia muutamalla napsautuksella",
"attributes": "Näyttää ominaisuudet ystävällisellä tavalla",
"edit": "Väärää tai vanhentunutta tietoa? Muokkauspainike on käden ulottuvilla.",
"question": "Jos ominaisuus ei ole vielä tiedossa, MapComplete esittää kysymyksen",
"see_images": "Näyttää kuvia aiemmilta tekijöiltä, Wikipediasta, Mapillarystä, …",
"wikipedia": "Linkitetyt Wikipedia-artikkelit näytetään"
},
"frontParagraph": "MapComplete on helppokäyttöinen verkkosovellus, jolla voi kerätä paikkatietoa OpenStreetMapiin. Sen avulla voi kerätä ja hallita olennaista tietoa avoimella, joukkoistetulla ja uudelleenkäytettävällä tavalla.\n\nUusia luokkia ja ominaisuuksia voi lisätä pyydettäessä.",
"lines_too": "Viivat ja monikulmiot näytetään myös. Lisäksi niiden ominaisuuksia ja kuvia voi muokata ja päivittää.",
"mapcomplete": {
"customize": "MapCompleten voi räätälöidä tarpeisiisi. Siihen voi lisätä uusia karttatasoja, uutta toiminnallisuutta tai sen voi tyylitellä käyttämään organisaatiosi väerjä ja fontteja.\nMeillä on myös kokemusta paikkatiedon joukkoistamiskampanjoiden aloittamisesta.\nPyydä tarjous ottamalla yhteyttä osoitteeseen pietervdvn@posteo.net.",
"intro": "MapComplete on sivusto, jolla on {mapCount} vuorovaikutteista karttaa. Jokaiselle kartalle voi lisätä ja päivittää tietoja. Siinä on paljon ominaisuuksia:",
"li0": "Näytä, missä on kiinnostavia paikkoja",
"li1": "Lisää uusia pisteitä ja päivitä nykyisten tietoja",
"li2": "Lisää yhteystietoja ja aukioloaikoja helposti",
"li3": "Voidaan lisätä muille verkkosivuille iFramen muodossa",
"li4": "Osa OpenStreetMap-ekosysteemiä, johon kuuluu paljon työkaluja",
"li5": "Mahdollisuus tuota olemassa olevia aineistoja",
"li6": "Paljon kehittyneitä ominaisuuksia, kuten puiden tunnistus ja kehittyneet syöttömenetelmät",
"li7": "Avoimen lähdekoodin ohjelmisto (GPL-lisenssillä) ja ilmainen käyttää",
"title": "Mikä MapComplete on?"
},
"onwheels": "Myös sisätilakartat pyörätuolillä liikkuville on käytettävissä.",
"osm": "OpenStreetMap on verkkokartta, jota voi muokata ja uudelleenkäyttää kuka tahansa mihin tahansa tarkoitukseen, kunhan lähde nimetään asianmukaisesti sekä data pidetään avoimena.\n\nSe on maailman suurin paikkatietokanta, ja sitä käytetään tuhansissa sovelluksissa ja verkkosivustoissa.",
"tagline": "Kerää paikkatietoa OpenStreetMapillä",
"title": "mapcomplete.org",
"toerisme_vlaanderen": "”Pin your point” -hanke tehtiin yhteistyössä Visit Flandersin kanssa. Yli 160 kartoittajaa lisäsi muutama tuhat penkkiä ja piknikpöytää sekä löysi 100 latausasemaa polkupyörille.",
"whatIsOsm": "Mikä OpenStreetMap on?"
},
"general": {
"404": "Tätä sivua ei ole olemassa",
"about": "Muokkaa ja lisää tiettyyn teemaan liittyviä tietoja OpenStreetMapiin helposti",
"aboutMapComplete": {
"intro": "MapCompletea voi käyttää lisäämään tietoja OpenStreetMapiin <b>yhdestä teemasta.</b> Vastaa kysymyksiin, niin muutoksesi ovat käytettävissä kaikkialla minuuttien kuluessa. Useimmissa teemoissa voi lisätä kuvia tai jopa jättää arvostelun. <b>Teeman ylläpitäjä</b> määrittelee teeman kohteet, kysymykset ja kielet."
},
"add": {
"addNew": "Lisää {category}",
"backToSelect": "Valitse toinen luokka",
"confirmButton": "Lisää {category}<br/><div class='alert'>Lisäyksesi näkyy kaikille</div>",
"confirmLocation": "Vahvista tämä sijainti",
"confirmTitle": "Lisätäänkö {title}?",
"title": "Lisää uusi kohde"
"confirmWarning": "Täällä luomasi kohde <b>näkyy kaikille</b>. Ole hyvä ja lisää kartalle vain kohteita, jotka ovat oikeasti olemassa. Monet sovellukset käyttävät tätä tietoa.",
"disableFilters": "Poista käytöstä kaikki suodattimet",
"disableFiltersExplanation": "Jotkin kohteet saattavat olla piilossa suodattimen takia",
"enableLayer": "Ota käyttöön taso {name}",
"hasBeenImported": "Tämä kohde on jo tuotu",
"import": {
"hasBeenImported": "Tämä kohde on tuotu",
"howToTest": "Testaa lisäämällä <b>test=true</b> tai <b>backend=osm-test</b> URL-osoitteeseen. Muutoskokoelma tulostetaan konsoliin. Ole hyvä ja avaa pull request, jotta tämä teema voidaan virallistaa ja tuontipainike ottaa käyttöön.",
"importTags": "Kohteelle kirjataan {tags}",
"officialThemesOnly": "Tuontipainike ei ole käytössä epävirallisille teemoille vahinkojen välttämiseksi",
"wrongType": "Tämä kohde ei ole piste eikä viiva eikä sitä voida tuoda",
"wrongTypeToConflate": "Tämä kohde ei ole piste eikä viiva eikä sitä voida yhdistää",
"zoomInMore": "Lähennä karttaa lisää, jotta tämän kohteen voi tuoda"
},
"importTags": "Kohteelle kirjataan {tags}",
"intro": "Painoit kohtaa, jolle ei ole vielä tietoa.<br/>",
"layerNotEnabled": "Taso {layer} ei ole käytössä. Ota taso käyttöön, jotta voit lisätä kohteen",
"openLayerControl": "Avaa tason hallintaikkuna",
"pleaseLogin": "Kirjaudu sisään, jotta voit lisätä uuden kohteen",
"presetInfo": "Uudelle pisteelle kirjataan {tags}",
"stillLoading": "Data latautuu vielä. Odota hetki ennen kuin lisäät uuden kohteen.",
"title": "Lisää uusi kohde",
"warnVisibleForEveryone": "Lisäyksesi näkyy kaikille",
"wrongType": "Tämä kohde ei ole piste eikä viiva eikä sitä voida tuoda",
"zoomInFurther": "Lähennä karttaa lisää, jotta kohteen voi lisätä.",
"zoomInMore": "Lähennä karttaa lisää, jotta voit tuoda tämän kohteen"
},
"apply_button": {
"appliedOnAnotherObject": "Kohteelle {id} kirjataan {tags}",
"isApplied": "Muutokset otetaan käyttöön"
},
"attribution": {
"attributionBackgroundLayer": "Nykyinen taustataso on {name}",
"attributionBackgroundLayerWithCopyright": "Nykyinen taustataso on {name}: {copyright}",
"attributionContent": "<p>Kaiken datan tarjoaa <a href='https://osm.org' target='_blank'>OpenStreetMap</a>, vapaasti uudelleenkäytettävissä <a href='https://osm.org/copyright' target='_blank'>Open Database Licensen</a> mukaisesti.</p>",
"attributionTitle": "Kiitokset",
"donate": "Tue MapCompletea rahallisesti",
"editId": "Avaa OpenStreetMap-verkkoeditori tänne",
"editJosm": "Muokkaa täällä JOSM:illa",
"followOnMastodon": "Seuraa MapCompletea Mastodonissa",
"iconAttribution": {
"title": "Käytetyt kuvakkeet"
},
"josmOpened": "JOSM on avattu",
"openIssueTracker": "Ilmoita ohjelmavirheestä",
"openMapillary": "Avaa Mapillary tänne"
"openMapillary": "Avaa Mapillary tänne",
"title": "Tekijänoikeudet ja alkuperä"
},
"backToIndex": "Palaa kaikkien teemakarttojen yleiskuvaan",
"backgroundMap": "Taustakartta",
"backgroundMap": "Valitse taustataso",
"backgroundSwitch": "Vaihda taustaa",
"cancel": "Peruuta",
"download": {
"title": "Lataa"
@ -112,12 +192,14 @@
"loginWithOpenStreetMap": "Kirjaudu sisään OpenStreetMapilla",
"logout": "Kirjaudu ulos",
"menu": {
"aboutMapComplete": "Tietoa MapCompletesta"
"aboutMapComplete": "Tietoa MapCompletesta",
"filter": "Suodata dataa"
},
"morescreen": {
"createYourOwnTheme": "Luo oma MapComplete-teema alusta asti",
"noSearch": "Näytä kaikki teemat",
"searchForATheme": "Etsi teemaa",
"streetcomplete": "Toinen, samanlainen sovellus on <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>."
"streetcomplete": "Toinen, samankaltainen sovellus on <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' class='underline hover:text-blue-800' class='underline hover:text-blue-800' target='_blank'>StreetComplete</a>."
},
"number": "numero",
"openTheMap": "Avaa kartta",
@ -126,9 +208,12 @@
"loadingCountry": "Määritetään maata…",
"ph_closed": "suljettu",
"ph_not_known": " ",
"ph_open": "avattu"
"ph_open": "auki"
},
"pickLanguage": "Valitse kieli: ",
"pdf": {
"attrBackground": "Taustataso: {background}"
},
"pickLanguage": "Valitse kieli",
"questionBox": {
"answeredMultiple": "Vastasit {answered} kysymykseen",
"answeredOne": "Vastasit yhteen kysymykseen",
@ -143,6 +228,7 @@
"search": {
"nothing": "Mitään ei löytynyt…",
"search": "Etsi paikkaa",
"searchShort": "Etsi…",
"searching": "Etsitään…"
},
"sharescreen": {
@ -180,13 +266,24 @@
},
"hotkeyDocumentation": {
"action": "Toiminto",
"key": "Näppäinyhdistelmä"
"key": "Näppäinyhdistelmä",
"openLayersPanel": "Avaa taustatasojen paneelin",
"selectAerial": "Asettaa taustaksi joko ilma- tai satelliittikuvan. Vaihtaa kahden parhaimman, saatavilla olevan tason välillä",
"selectMap": "Asettaa taustaksi kartan ulkoisesta lähteestä. Vaihtaa kahden parhaimman, saatavilla olevan tason välillä",
"selectMapnik": "Aseta taustatasoksi OpenStreetMap-carto",
"selectOsmbasedmap": "Aseta taustatasoksi OpenStreetMap-pohjainen kartta (tai poista käytöstä rasterimuotoinen taustataso)"
},
"image": {
"addPicture": "Lisää kuva",
"currentLicense": "Kuvasi julkaistaan lisenssillä {license}",
"doDelete": "Poista kuva",
"dontDelete": "Peruuta",
"isDeleted": "Poistettu",
"nearby": {
"link": "Tämä kuva näyttää kohteen",
"seeNearby": "Selaa ja linkitä läheisiä kuvia",
"title": "Läheiset katukuvat"
},
"pleaseLogin": "Kirjaudu sisään, jotta voit lisätä kuvan",
"respectPrivacy": "Älä valokuvaa ihmisiä tai rekisterikilpiä. Älä lähetä kuvia Google Mapsistä, Google Streetviewstä tai muista tekijänoikeuden alaisista lähteistä.",
"uploadDone": "Kuvasi on lisätty. Kiitoksia avusta!",
@ -198,6 +295,15 @@
"pickTheme": "Aloita valitsemalla teema alta.",
"title": "Tervetuloa MapCompleteen"
},
"move": {
"inviteToMove": {
"generic": "Siirrä tätä pistettä"
},
"whyMove": "Miksi haluat siirtää tätä pistettä?"
},
"multi_apply": {
"autoApply": "Kun ominaisuuksia {attr_names} muutetaan, nämä ominaisuudet muuttuvat automaattisesti myös {count} muussa kohteessa"
},
"plantDetection": {
"tryAgain": "Valitse eri laji"
},

View file

@ -284,6 +284,45 @@
"render": "Estació d'Ambulàncies"
}
},
"animal_shelter": {
"name": "Refugis d'animals",
"presets": {
"0": {
"title": "un refugi d'animals"
}
},
"tagRenderings": {
"2": {
"question": "Quin nom té aquest refugi d'animals?"
},
"6": {
"mappings": {
"0": {
"then": "Els animals romanen ací fins que son adoptats per un nou propietari"
},
"1": {
"then": "Els animals reben cures per a la resta de la seva vida"
},
"2": {
"then": "Els animals ferits es rehabiliten aquí fins que puguen ser alliberats de nou a la natura "
}
},
"question": "Quina és la finalitat del refugi d'animals?"
},
"7": {
"question": "Quan està obert aquest refugi d'animals?",
"render": "{opening_hours_table()}"
}
},
"title": {
"mappings": {
"0": {
"then": "{name}"
}
},
"render": "Refugi d'animals"
}
},
"artwork": {
"description": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món",
"name": "Obres d'art",
@ -1226,7 +1265,7 @@
"Bicycle parking type": {
"mappings": {
"0": {
"then": "Bastidors de grapes"
"then": "Bastidors"
},
"1": {
"then": "Portarodes/bucles"
@ -1856,6 +1895,216 @@
},
"charging_station": {
"tagRenderings": {
"Authentication": {
"mappings": {
"4": {
"then": "L'autenticació mitjançant NFC està disponible"
},
"5": {
"then": "L'autenticació mitjançant targeta de pagament està disponible"
},
"6": {
"then": "L'autenticació mitjançant targeta de debit està disponible"
},
"7": {
"then": "Carregar aquí (també) és possible sense autenticació"
}
},
"question": "Quin tipus d'autenticació hi ha disponible a l'estació de càrrega?"
},
"Available_charging_stations (generated)": {
"mappings": {
"0": {
"then": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)"
},
"1": {
"then": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)"
},
"2": {
"then": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"3": {
"then": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
},
"4": {
"then": "<b>CHAdeMo</b>"
},
"5": {
"then": "<b>CHAdeMo</b>"
},
"6": {
"then": "<b>Tipus 1 amb cable</b>"
},
"7": {
"then": "<b>Tipus 1 amb cable</b>"
},
"8": {
"then": "<b>Tipus 1 <i>sense</i> cable</b>"
},
"9": {
"then": "<b>Tipus 1 <i>sense</i> cable</b>(J1772)"
},
"10": {
"then": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)"
},
"11": {
"then": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)"
},
"12": {
"then": "<b>Supercarregador de Tesla"
},
"13": {
"then": "<b>Supercarregador de Tesla</b>"
},
"14": {
"then": "<b>Tipus 2</b> (mennekes)"
},
"15": {
"then": "<b>Tipus 2</b> (mennekes)"
},
"16": {
"then": "<b>CSS Tipus 2</b> (mennekes)"
},
"17": {
"then": "<b>CSS Tipus 2</b> (mennekes)"
}
}
},
"Network": {
"question": "Aquesta estació de càrrega forma part d'una xarxa?",
"render": "Part de la xarxa <b>{network}</b>"
},
"OH": {
"override": {
"question": "Quan està oberta aquesta estació de càrrega?"
}
},
"Operational status": {
"mappings": {
"0": {
"then": "Aquesta estació de càrrega funciona"
},
"1": {
"then": "Aquesta estació de carrega està trencada"
},
"2": {
"then": "Aquí està prevista una estació de recàrrega"
},
"4": {
"then": "Aquesta estació de recàrrega s'ha desactivat permanentment i ja no s'utilitza, però encara és visible"
}
},
"question": "Està en ús aquest punt de càrrega?"
},
"Operator": {
"mappings": {
"0": {
"then": "De fet, {operator} és la xarxa"
}
},
"question": "Qui és l'operadora d'aquesta estació de càrrega?",
"render": "Aquesta estació de càrrega l'opera {operator}"
},
"Parking:fee": {
"mappings": {
"0": {
"then": "No cal pagar una taxa addicional mentres carrega"
},
"1": {
"then": "Cal pagar una taxa addicional d'aparcament mentres carrega"
}
},
"question": "Cal pagar una taxa d'aparcament mentre es carrega?"
},
"Type": {
"mappings": {
"0": {
"then": "Aquí es poden carregar <b>bicicletes</b>"
},
"1": {
"then": "Aquí es poden carregar <b>cotxes</b>"
},
"2": {
"then": "Aquí es poden carregar <b>Scooters</b>"
},
"3": {
"then": "Aquí es poden carregar <b>camions o trailers</b>"
},
"4": {
"then": "Aquí es poden carregar <b>autobusos</b>"
}
},
"question": "Quins vehicles tenen permesa la càrrega aquí?"
},
"access": {
"mappings": {
"0": {
"then": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
},
"1": {
"then": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
},
"2": {
"then": "Sols clientes del lloc al que pertany aquest punt de càrrega poden utilitzar-lo <br/><span class='subtle'>p.e. un punt de càrrega d'un hotel que sols poden utilizar-los els hostes</span>"
},
"3": {
"then": "S'ha de sol·licitar una <b>clau</b> per a utilitzar aquest punt de càrrega<br/><span class='subtle'>p.e un punt de càrrega operat per un hotel nomes utilitzable pel seus hostes, els quals reben una clau des de recepció per a desbloquejar el punt de càrrega</span>"
},
"4": {
"then": "No accessible per al públic general (p.e. només accessible pels propietaris, empleats, ...)"
},
"5": {
"then": "Aquesta estació de càrrega és accessible al públic durant certes hores o condicions. Es poden aplicar restriccions, però es permet l'ús general."
}
},
"question": "Qui pot utilitzar aquesta estació de càrrega?",
"render": "L'accés està {access}"
},
"capacity": {
"question": "Quants vehicles poden carregar a la vegada?",
"render": "Aquí poden carregar {capacity} vehicles a l'hora"
},
"charge": {
"question": "Quant cal pagar per utilitzar aquesta estació de càrrega?",
"render": "Utilitzar aquesta estació de càrrega costa <b>{charge}</b>"
},
"email": {
"question": "Quin és el correu electrònic de l'operadora?",
"render": "En cas de problemes, envia un email a <a href='mailto:{email}'>{email}</a>"
},
"fee": {
"mappings": {
"0": {
"then": "Ús gratuït (sense autentificació)"
},
"1": {
"then": "Ús gratuït, però un s'ha d'autentificar"
},
"2": {
"then": "Ús gratuït"
},
"3": {
"then": "De pagament, però gratuït per als clients de l'hotel/bar/hospital/... que gestiona l'estació de càrrega"
},
"4": {
"then": "Ús de pagament"
}
},
"question": "Hi ha que pagar per utilitzar aquest punt de càrrega?"
},
"maxstay": {
"mappings": {
"0": {
"then": "No hi ha límit de temps per a deixar el teu vehicle aquí"
}
},
"question": "Quina és la quantitat màxima de temps que es permet permaneixer aquí?",
"render": "Un pot quedar-se com a màxim <b>{canonical(maxstay)}</b>"
},
"phone": {
"question": "A quin número es pot cridar si hi ha algun problema amb aquest punt de càrrega?",
"render": "En cas de problemes, truqueu a <a href='tel:{phone}'>{phone}</a>"
},
"rewritten-questions": {
"renderings": {
"0": {
@ -3653,7 +3902,7 @@
"then": "Aquesta és una botiga de kebabs"
},
"4": {
"then": "Això és un sandvitxeria"
"then": "Això és una botiga d'entrepans"
},
"5": {
"then": "Aquí es serveixen hamburgueses"
@ -3686,13 +3935,13 @@
"then": "Aquí es serveixen plats tailandesos"
}
},
"question": "Quin menjar es serveix aquí?",
"question": "Quin tipus de menjar es serveix aquí?",
"render": "Aquest lloc serveix principalment {cuisine}"
},
"Fastfood vs restaurant": {
"mappings": {
"0": {
"then": "Aquest és un negoci de menjar ràpid, centrat en el servei ràpid. Si hi han seients disponibles, aquests seràn limitats i funcionals."
"then": "Aquest és un negoci de menjar ràpid, centrat en el servei ràpid. Si hi han seients disponibles, aquests seran limitats i funcionals."
},
"1": {
"then": "Un <b>restaurant</b>, centrat en crear una bona experiència on es serveix a taula"
@ -6665,7 +6914,7 @@
"name": "Botiga",
"presets": {
"0": {
"description": "Afegir una botiga nova",
"description": "Podeu especificar més endavant el que ven aquesta botiga.",
"title": "una botiga"
}
},
@ -6906,6 +7155,20 @@
}
},
"tagRenderings": {
"basketball-hoops": {
"mappings": {
"1": {
"then": "Aquest camp de bàsquet té dos cèrcols"
},
"2": {
"then": "Aquest camp de bàsquet té quatre cèrcols"
},
"3": {
"then": "Aquest camp de bàsquet té {hoops} cèrcols"
}
},
"question": "Quants cèrcols té aquesta pista?"
},
"sport-pitch-access": {
"mappings": {
"0": {
@ -6919,6 +7182,9 @@
},
"3": {
"then": "Privat - no accessible al públic"
},
"4": {
"then": "Accés públic"
}
},
"question": "Aquesta pista d'esports és accessible públicament?"
@ -6947,6 +7213,9 @@
"mappings": {
"0": {
"then": "Sempre accesible"
},
"1": {
"then": "Sempre accesible"
}
}
},
@ -6970,6 +7239,9 @@
"4": {
"then": "Aquí es juga al corfbol"
},
"5": {
"then": "Aquí es juga bàsquet"
},
"6": {
"then": "Açò és un skatepark"
}
@ -6993,6 +7265,12 @@
},
"4": {
"then": "La superfície és <b>formigó</b>"
},
"5": {
"then": "La superfície és <b> grava fina</b>"
},
"6": {
"then": "La superfície d'aquesta pista és Tartan, una superfície sintètica, lleugerament molla i porosa"
}
},
"question": "Quina és la superfície d'aquest camp esportiu?",
@ -7043,6 +7321,18 @@
},
"question": "Aquestes escales tenen un passamà?"
},
"incline": {
"mappings": {
"0": {
"then": "La direcció ascendent és {direction_absolute()}"
},
"1": {
"then": "La direcció descendent és {direction_absolute()}"
}
},
"question": "Quina és la inclinació d'aquestes escales?",
"render": "Aquestes escales tenen una inclinació de {incline}"
},
"multilevels": {
"override": {
"question": "Entre quines plantes estan aquestes escales?",
@ -7765,6 +8055,7 @@
}
},
"trail": {
"description": "Rutes marcades",
"name": "Camins",
"tagRenderings": {
"Color": {
@ -7781,6 +8072,19 @@
"3": {
"then": "Ruta groga"
}
},
"question": "Quin és el color de referència d'aquest sender?",
"render": "El color de referència és {colour}"
},
"Name": {
"question": "Quin és el nom d'aquest sender?",
"render": "Aquest sender s'anomena <b>{name}</b>"
},
"Operator tag": {
"mappings": {
"0": {
"then": "Aquest sender és mantingut per Natuurpunt"
}
}
},
"trail-length": {
@ -8110,16 +8414,26 @@
}
}
},
"2": {
"applicableUnits": {
"0": {
"human": "{quantity} A"
}
}
},
"3": {
"applicableUnits": {
"0": {
"human": "{quantity} metre"
"human": "{quantity} metre",
"humanSingular": "un metre"
},
"1": {
"human": "{quantity} centimetre"
"human": "{quantity} centimetre",
"humanSingular": "un centímetre"
},
"2": {
"human": "{quantity} mil·límetres"
"human": "{quantity} mil·límetres",
"humanSingular": "un mil·límetre"
},
"3": {
"human": "{quantity} peus"
@ -8137,12 +8451,37 @@
"humanShort": "{quantity} mph"
}
}
},
"5": {
"applicableUnits": {
"0": {
"human": "{quantity} minuts",
"humanSingular": "un minut"
},
"1": {
"human": "{quantity} hores",
"humanSingular": "una hora"
},
"2": {
"human": "{quantity} dies"
}
}
}
}
},
"usersettings": {
"description": "Una capa especial que no està pensada per mostrar-se en un mapa, però que s'utilitza per configurar la configuració de l'usuari",
"tagRenderings": {
"a11y-features": {
"mappings": {
"0": {
"then": "Activar les funcions d'accessibilitat quan s'utilitzen les tecles de fletxa per navegar pel mapa"
},
"1": {
"then": "Sempre habilita les característiques d'accessibilitat"
}
}
},
"all-questions-at-once": {
"mappings": {
"0": {
@ -8217,7 +8556,7 @@
"1": {
"then": {
"special": {
"text": "<b class='alert'>Tens {_unreadMessages}</b><br/>Open your inbox"
"text": "<b class='alert'>Tens {_unreadMessages} missatges </b><br/>Obri la safata d'entrada"
}
}
}
@ -8226,7 +8565,7 @@
"language_picker": {
"mappings": {
"0": {
"then": "L'idioma es va establir mitjançant un paràmetre d'URL i l'usuari no pot definir-lo.²"
"then": "L'idioma es va establir mitjançant un paràmetre d'URL i l'usuari no pot definir-lo."
}
}
},
@ -8262,6 +8601,9 @@
}
}
},
"show_crosshair": {
"questionHint": "Això pot ajudar a posicionar amb precisió un nou element"
},
"show_debug": {
"mappings": {
"0": {
@ -8402,22 +8744,37 @@
"question": "Venda de productes carnis"
},
"17": {
"question": "Venda de flors"
"question": "Venda de fruites"
},
"18": {
"question": "Venda de tiquets d'aparcament"
"question": "Venda de maduixes"
},
"19": {
"question": "Venda de flors"
},
"20": {
"question": "Venda de bitllets de transport públic"
"question": "Venda de tiquets d'aparcament"
},
"21": {
"question": "Venda de monedes premsades"
},
"22": {
"question": "Venda de bitllets de transport públic"
},
"23": {
"question": "Venda de llums de bicicletes"
},
"24": {
"question": "Venda de guants"
},
"25": {
"question": "Venda de kits de reparació de bicicletes"
},
"26": {
"question": "Venda de bombes de bicicletes"
},
"27": {
"question": "Venda de cadenat per a bicicletes"
}
}
}
@ -8506,6 +8863,12 @@
"15": {
"then": "Es venen productes carnis"
},
"16": {
"then": "Es ven fruita"
},
"17": {
"then": "Es venen maduixes"
},
"18": {
"then": "Es venen flors"
},
@ -8517,6 +8880,21 @@
},
"21": {
"then": "Es venen bitllets de transport públic"
},
"22": {
"then": "Es venen llums per a bicicletes"
},
"23": {
"then": "Es venen guants"
},
"24": {
"then": "Es venen kits de reparació de bicicletes"
},
"25": {
"then": "Es venen bombes de bicicletes"
},
"26": {
"then": "Es venen cadenats per a bicicletes"
}
},
"question": "Que ven aquesta màquina expenedora?",

View file

@ -5042,6 +5042,30 @@
"2": {
"1": "a CNC drill",
"2": "CNC drill"
},
"3": {
"1": "a multimedia studio",
"2": "multimedia studio"
},
"4": {
"1": "a sewing machine",
"2": "sewing machine"
},
"5": {
"1": "a woodworking workshop",
"2": "woodworking workshop"
},
"6": {
"1": "a ceramics workshop",
"2": "ceramics workshop"
},
"7": {
"1": "a metal workshop",
"2": "metal workshop"
},
"8": {
"1": "a bicycle repair workshop",
"2": "bicycle repair workshop"
}
}
}

View file

@ -27,6 +27,9 @@
"advertising": {
"name": "Reclame",
"presets": {
"12": {
"title": "een muurschildering"
},
"3": {
"description": "Een klein uithangbord voor buurtadvertenties, meestal gericht op voetgangers",
"title": "een uithangbord"
@ -47,9 +50,6 @@
"8": {
"description": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt",
"title": "een spandoek"
},
"12": {
"title": "een muurschildering"
}
},
"tagRenderings": {
@ -107,6 +107,9 @@
},
"title": {
"mappings": {
"10": {
"then": "Muurschildering"
},
"3": {
"then": "Aanplakzuil"
},
@ -124,9 +127,6 @@
},
"9": {
"then": "Aanplakzuil"
},
"10": {
"then": "Muurschildering"
}
}
}
@ -208,6 +208,15 @@
"1": {
"then": "Muurschildering"
},
"10": {
"then": "Azulejo (Spaanse siertegels)"
},
"11": {
"then": "Tegelwerk"
},
"12": {
"then": "Houtsculptuur"
},
"2": {
"then": "Schilderij"
},
@ -231,15 +240,6 @@
},
"9": {
"then": "Reliëf"
},
"10": {
"then": "Azulejo (Spaanse siertegels)"
},
"11": {
"then": "Tegelwerk"
},
"12": {
"then": "Houtsculptuur"
}
},
"question": "Wat voor soort kunstwerk is dit?",
@ -1791,6 +1791,27 @@
"1": {
"question": "Heeft een <div style='display: inline-block'><b><b>Schuko stekker</b> zonder aardingspin (CEE7/4 type F)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/CEE7_4F.svg'/></div>"
},
"10": {
"question": "Heeft een <div style='display: inline-block'><b><b>Type 2 met kabel</b> (J1772)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>"
},
"11": {
"question": "Heeft een <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
},
"12": {
"question": "Heeft een <div style='display: inline-block'><b><b>Tesla Supercharger (destination)</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div>"
},
"13": {
"question": "Heeft een <div style='display: inline-block'><b><b>Tesla supercharger (destination</b> (Een Type 2 met kabel en Tesla-logo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>"
},
"14": {
"question": "Heeft een <div style='display: inline-block'><b><b>USB</b> om GSMs en kleine electronica op te laden</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/usb_port.svg'/></div>"
},
"15": {
"question": "Heeft een <div style='display: inline-block'><b><b>Bosch Active Connect met 3 pinnen</b> aan een kabel</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-3pin.svg'/></div>"
},
"16": {
"question": "Heeft een <div style='display: inline-block'><b><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div>"
},
"2": {
"question": "Heeft een <div style='display: inline-block'><b><b>Europese stekker</b> met aardingspin (CEE7/4 type E)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/TypeE.svg'/></div>"
},
@ -1814,27 +1835,6 @@
},
"9": {
"question": "Heeft een <div style='display: inline-block'><b><b>Type 2 CCS</b> (mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
},
"10": {
"question": "Heeft een <div style='display: inline-block'><b><b>Type 2 met kabel</b> (J1772)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>"
},
"11": {
"question": "Heeft een <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div>"
},
"12": {
"question": "Heeft een <div style='display: inline-block'><b><b>Tesla Supercharger (destination)</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div>"
},
"13": {
"question": "Heeft een <div style='display: inline-block'><b><b>Tesla supercharger (destination</b> (Een Type 2 met kabel en Tesla-logo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div>"
},
"14": {
"question": "Heeft een <div style='display: inline-block'><b><b>USB</b> om GSMs en kleine electronica op te laden</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/usb_port.svg'/></div>"
},
"15": {
"question": "Heeft een <div style='display: inline-block'><b><b>Bosch Active Connect met 3 pinnen</b> aan een kabel</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-3pin.svg'/></div>"
},
"16": {
"question": "Heeft een <div style='display: inline-block'><b><b>Bosch Active Connect met 5 pinnen</b> aan een kabel</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div>"
}
}
}
@ -1890,30 +1890,6 @@
"1": {
"then": "<b>Schuko stekker</b> zonder aardingspin (CEE7/4 type F)"
},
"2": {
"then": "<b>Europese stekker</b> met aardingspin (CEE7/4 type E)"
},
"3": {
"then": "<b>Europese stekker</b> met aardingspin (CEE7/4 type E)"
},
"4": {
"then": "<b>Chademo</b>"
},
"5": {
"then": "<b>Chademo</b>"
},
"6": {
"then": "<b>Type 1 met kabel</b> (J1772)"
},
"7": {
"then": "<b>Type 1 met kabel</b> (J1772)"
},
"8": {
"then": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)"
},
"9": {
"then": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)"
},
"10": {
"then": "<b>Type 1 CCS</b> (ook gekend als Type 1 Combo)"
},
@ -1944,6 +1920,9 @@
"19": {
"then": "<b>Type 2 met kabel</b> (J1772)"
},
"2": {
"then": "<b>Europese stekker</b> met aardingspin (CEE7/4 type E)"
},
"20": {
"then": "<b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)"
},
@ -1974,11 +1953,32 @@
"29": {
"then": "<b>Bosch Active Connect met 3 pinnen</b> aan een kabel"
},
"3": {
"then": "<b>Europese stekker</b> met aardingspin (CEE7/4 type E)"
},
"30": {
"then": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel"
},
"31": {
"then": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel"
},
"4": {
"then": "<b>Chademo</b>"
},
"5": {
"then": "<b>Chademo</b>"
},
"6": {
"then": "<b>Type 1 met kabel</b> (J1772)"
},
"7": {
"then": "<b>Type 1 met kabel</b> (J1772)"
},
"8": {
"then": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)"
},
"9": {
"then": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)"
}
},
"question": "Welke aansluitingen zijn hier beschikbaar?"
@ -2172,6 +2172,24 @@
"1": {
"2": "<b>Europese stekker</b> met aardingspin (CEE7/4 type E)"
},
"10": {
"2": "<b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)"
},
"11": {
"2": "<b>Tesla Supercharger (destination)</b>"
},
"12": {
"2": "<b>Tesla supercharger (destination</b> (Een Type 2 met kabel en Tesla-logo)"
},
"13": {
"2": "<b>USB</b> om GSMs en kleine electronica op te laden"
},
"14": {
"2": "<b>Bosch Active Connect met 3 pinnen</b> aan een kabel"
},
"15": {
"2": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel"
},
"2": {
"2": "<b>Chademo</b>"
},
@ -2195,24 +2213,6 @@
},
"9": {
"2": "<b>Type 2 met kabel</b> (J1772)"
},
"10": {
"2": "<b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)"
},
"11": {
"2": "<b>Tesla Supercharger (destination)</b>"
},
"12": {
"2": "<b>Tesla supercharger (destination</b> (Een Type 2 met kabel en Tesla-logo)"
},
"13": {
"2": "<b>USB</b> om GSMs en kleine electronica op te laden"
},
"14": {
"2": "<b>Bosch Active Connect met 3 pinnen</b> aan een kabel"
},
"15": {
"2": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel"
}
}
}
@ -2978,6 +2978,15 @@
"1": {
"then": "Dit fietspad is geplaveid"
},
"10": {
"then": "Dit fietspad is gemaakt van fijn grind"
},
"11": {
"then": "Dit fietspad is gemaakt van kiezelsteentjes"
},
"12": {
"then": "Dit fietspad is gemaakt van aarde"
},
"2": {
"then": "Dit fietspad is gemaakt van asfalt"
},
@ -3001,15 +3010,6 @@
},
"9": {
"then": "Dit fietspad is gemaakt van grind"
},
"10": {
"then": "Dit fietspad is gemaakt van fijn grind"
},
"11": {
"then": "Dit fietspad is gemaakt van kiezelsteentjes"
},
"12": {
"then": "Dit fietspad is gemaakt van aarde"
}
},
"question": "Waaruit is het oppervlak van het fietspad van gemaakt?",
@ -3058,6 +3058,15 @@
"1": {
"then": "Dit fietspad is geplaveid"
},
"10": {
"then": "Dit fietspad is gemaakt van fijn grind"
},
"11": {
"then": "Dit fietspad is gemaakt van kiezelsteentjes"
},
"12": {
"then": "Dit fietspad is gemaakt van aarde"
},
"2": {
"then": "Dit fietspad is gemaakt van asfalt"
},
@ -3081,15 +3090,6 @@
},
"9": {
"then": "Dit fietspad is gemaakt van grind"
},
"10": {
"then": "Dit fietspad is gemaakt van fijn grind"
},
"11": {
"then": "Dit fietspad is gemaakt van kiezelsteentjes"
},
"12": {
"then": "Dit fietspad is gemaakt van aarde"
}
},
"question": "Waaruit is het oppervlak van de straat gemaakt?",
@ -4138,6 +4138,21 @@
"1": {
"then": "Dit is een frituur"
},
"10": {
"then": "Dit is een Chinees restaurant"
},
"11": {
"then": "Dit is een Grieks restaurant"
},
"12": {
"then": "Dit is een Indisch restaurant"
},
"13": {
"then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)"
},
"14": {
"then": "Dit is een Thaïs restaurant"
},
"2": {
"then": "Dit is een pastazaak"
},
@ -4161,21 +4176,6 @@
},
"9": {
"then": "Dit is een Frans restaurant"
},
"10": {
"then": "Dit is een Chinees restaurant"
},
"11": {
"then": "Dit is een Grieks restaurant"
},
"12": {
"then": "Dit is een Indisch restaurant"
},
"13": {
"then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)"
},
"14": {
"then": "Dit is een Thaïs restaurant"
}
},
"question": "Welk soort gerechten worden hier geserveerd?",
@ -4516,6 +4516,30 @@
"2": {
"1": "een CNC-boormachine",
"2": "CNC-boormachine"
},
"3": {
"1": "een multimedia-studio",
"2": "multimedia-studio"
},
"4": {
"1": "een naaimachine",
"2": "naaimachine"
},
"5": {
"1": "een houtbewerkingsatelier",
"2": "houtbewerkingsatelier"
},
"6": {
"1": "een keramiekatelier",
"2": "keramiekatelier"
},
"7": {
"1": "een metaalatelier",
"2": "metaalatelier"
},
"8": {
"1": "een fietsherstelplaats",
"2": "fietsherstelplaats"
}
}
}
@ -5322,6 +5346,19 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Alle Notes"
},
"1": {
"question": "Verberg import Notes"
},
"2": {
"question": "Toon enkel import Notes"
}
}
},
"2": {
"options": {
"0": {
@ -5377,19 +5414,6 @@
"question": "Toon enkel open Notes"
}
}
},
"10": {
"options": {
"0": {
"question": "Alle Notes"
},
"1": {
"question": "Verberg import Notes"
},
"2": {
"question": "Toon enkel import Notes"
}
}
}
},
"name": "OpenStreetMap Notes",
@ -5681,6 +5705,21 @@
"1": {
"then": "Dit is een normale parkeerplek."
},
"10": {
"then": "Deze parkeerplek is gereserveerd voor ouders met kinderen."
},
"11": {
"then": "Deze parkeerplek is gereserveerd voor personeel."
},
"12": {
"then": "Deze parkeerplek is gereserveerd voor taxis."
},
"13": {
"then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger."
},
"14": {
"then": "Deze parkeerplek is gereserveerd voor autodelen."
},
"2": {
"then": "Dit is een gehandicaptenparkeerplaats."
},
@ -5704,21 +5743,6 @@
},
"9": {
"then": "Deze parkeerplek is gereserveerd voor motoren."
},
"10": {
"then": "Deze parkeerplek is gereserveerd voor ouders met kinderen."
},
"11": {
"then": "Deze parkeerplek is gereserveerd voor personeel."
},
"12": {
"then": "Deze parkeerplek is gereserveerd voor taxis."
},
"13": {
"then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger."
},
"14": {
"then": "Deze parkeerplek is gereserveerd voor autodelen."
}
},
"question": "Wat voor parkeerplek is dit?"
@ -6285,6 +6309,21 @@
"1": {
"then": "Munten van 2 cent worden geaccepteerd"
},
"10": {
"then": "Munten van 20 rappen worden geaccepteerd"
},
"11": {
"then": "Munten van ½ frank worden geaccepteerd"
},
"12": {
"then": "Munten van 1 frank worden geaccepteerd"
},
"13": {
"then": "Munten van 2 frank worden geaccepteerd"
},
"14": {
"then": "Munten van 5 frank worden geaccepteerd"
},
"2": {
"then": "Munten van 5 cent worden geaccepteerd"
},
@ -6308,21 +6347,6 @@
},
"9": {
"then": "Munten van 10 rappen worden geaccepteerd"
},
"10": {
"then": "Munten van 20 rappen worden geaccepteerd"
},
"11": {
"then": "Munten van ½ frank worden geaccepteerd"
},
"12": {
"then": "Munten van 1 frank worden geaccepteerd"
},
"13": {
"then": "Munten van 2 frank worden geaccepteerd"
},
"14": {
"then": "Munten van 5 frank worden geaccepteerd"
}
},
"question": "Met welke munten kan je hier betalen?"
@ -6335,6 +6359,15 @@
"1": {
"then": "Biljetten van 10 euro worden geaccepteerd"
},
"10": {
"then": "Biljetten van 100 frank worden geaccepteerd"
},
"11": {
"then": "Biljetten van 200 frank worden geaccepteerd"
},
"12": {
"then": "Biljetten van 1000 frank worden geaccepteerd"
},
"2": {
"then": "Biljetten van 20 euro worden geaccepteerd"
},
@ -6358,15 +6391,6 @@
},
"9": {
"then": "Biljetten van 50 frank worden geaccepteerd"
},
"10": {
"then": "Biljetten van 100 frank worden geaccepteerd"
},
"11": {
"then": "Biljetten van 200 frank worden geaccepteerd"
},
"12": {
"then": "Biljetten van 1000 frank worden geaccepteerd"
}
},
"question": "Met welke bankbiljetten kan je hier betalen?"
@ -6685,30 +6709,6 @@
"1": {
"question": "Recycling van batterijen"
},
"2": {
"question": "Recycling van drankpakken"
},
"3": {
"question": "Recycling van blikken"
},
"4": {
"question": "Recycling van kleding"
},
"5": {
"question": "Recycling van frituurvet"
},
"6": {
"question": "Recycling van motorolie"
},
"7": {
"question": "Recycling van tl-buizen"
},
"8": {
"question": "Recycling van groen afval"
},
"9": {
"question": "Recycling van glazen flessen"
},
"10": {
"question": "Recycling van glas"
},
@ -6739,11 +6739,35 @@
"19": {
"question": "Recycling van restafval"
},
"2": {
"question": "Recycling van drankpakken"
},
"20": {
"question": "Recycling van inktpatronen"
},
"21": {
"question": "Recycling van fietsen"
},
"3": {
"question": "Recycling van blikken"
},
"4": {
"question": "Recycling van kleding"
},
"5": {
"question": "Recycling van frituurvet"
},
"6": {
"question": "Recycling van motorolie"
},
"7": {
"question": "Recycling van tl-buizen"
},
"8": {
"question": "Recycling van groen afval"
},
"9": {
"question": "Recycling van glazen flessen"
}
}
},
@ -6811,30 +6835,6 @@
"1": {
"then": "Drankpakken kunnen hier gerecycled worden"
},
"2": {
"then": "Blikken kunnen hier gerecycled worden"
},
"3": {
"then": "Kleren kunnen hier gerecycled worden"
},
"4": {
"then": "Frituurvet kan hier gerecycled worden"
},
"5": {
"then": "Motorolie kan hier gerecycled worden"
},
"6": {
"then": "TL-buizen kunnen hier gerecycled worden"
},
"7": {
"then": "Groen afval kan hier gerecycled worden"
},
"8": {
"then": "Organisch afval kan hier gerecycled worden"
},
"9": {
"then": "Glazen flessen kunnen hier gerecycled worden"
},
"10": {
"then": "Glas kan hier gerecycled worden"
},
@ -6865,6 +6865,9 @@
"19": {
"then": "Schoenen kunnen hier gerecycled worden"
},
"2": {
"then": "Blikken kunnen hier gerecycled worden"
},
"20": {
"then": "Kleine elektrische apparaten kunnen hier gerecycled worden"
},
@ -6879,6 +6882,27 @@
},
"24": {
"then": "Fietsen (en fietswrakken) kunnen hier gerecycled worden"
},
"3": {
"then": "Kleren kunnen hier gerecycled worden"
},
"4": {
"then": "Frituurvet kan hier gerecycled worden"
},
"5": {
"then": "Motorolie kan hier gerecycled worden"
},
"6": {
"then": "TL-buizen kunnen hier gerecycled worden"
},
"7": {
"then": "Groen afval kan hier gerecycled worden"
},
"8": {
"then": "Organisch afval kan hier gerecycled worden"
},
"9": {
"then": "Glazen flessen kunnen hier gerecycled worden"
}
},
"question": "Wat kan hier gerecycled worden?"
@ -7600,6 +7624,12 @@
"1": {
"then": "Deze lantaarn gebruikt LEDs"
},
"10": {
"then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)"
},
"11": {
"then": "Deze lantaarn wordt verlicht met gas"
},
"2": {
"then": "Deze lantaarn gebruikt gloeilampen"
},
@ -7623,12 +7653,6 @@
},
"9": {
"then": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)"
},
"10": {
"then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)"
},
"11": {
"then": "Deze lantaarn wordt verlicht met gas"
}
},
"question": "Wat voor verlichting gebruikt deze lantaarn?"
@ -8541,6 +8565,20 @@
"usersettings": {
"description": "Een speciale lag die niet getoond wordt op de kaart, maar die de instellingen van de gebruiker weergeeft",
"tagRenderings": {
"a11y-features": {
"mappings": {
"0": {
"then": "Schakel toegankelijkheidsmode aan wanneer op de pijltjestoetsen wordt geduwd om de kaart te bewegen"
},
"1": {
"then": "Schakel de toegankelijkheidsmode altijd aan"
},
"2": {
"then": "Gebruik geen toegankelijkheidsmode"
}
},
"question": "Wanneer moet de toegankelijkheidsmode ingeschakeld worden?"
},
"all-questions-at-once": {
"mappings": {
"0": {
@ -8596,8 +8634,12 @@
"mappings": {
"0": {
"then": "Sta kaartrotatie toe"
},
"1": {
"then": "Hou het noorden altijd naar boven"
}
}
},
"question": "Moet het noorden altijd naar boven getoond worden?"
},
"inbox": {
"mappings": {
@ -8607,12 +8649,29 @@
"text": "Ga naar je inbox"
}
}
},
"1": {
"then": {
"special": {
"text": "<b class='alert'>Je hebt {_unreadMessages} ongelezen berichten</b><br/>Ga naar je inbox"
}
}
}
}
},
"language_picker": {
"mappings": {
"0": {
"then": "De taal werd ingesteld via een URL-parameter en kan niet manueel ingesteld worden."
}
}
},
"mangrove-keys": {
"render": {
"after": "Iedereen die dit bestand bezit, kan met jouw identiteit wijzigingen maken"
"after": "Iedereen die dit bestand bezit, kan met jouw identiteit wijzigingen maken",
"special": {
"text": "Download de private sleutel van je Mangrove-account"
}
}
},
"picture-license": {
@ -8632,7 +8691,15 @@
},
"question": "Met welke licentie wil je je afbeeldingen toevoegen?"
},
"settings-link": {
"render": {
"special": {
"text": "Open je instellingen op OpenStreetMap.org"
}
}
},
"show_crosshair": {
"question": "Moet er een kruisje getoond worden in het centrum van je display?",
"questionHint": "Dit kan helpen om nieuwe elementen accuraat te plaatsen"
},
"show_debug": {
@ -8729,30 +8796,6 @@
"1": {
"question": "Verkoop van dranken"
},
"2": {
"question": "Verkoop van snoep"
},
"3": {
"question": "Verkoop van eten"
},
"4": {
"question": "Verkoop van sigaretten"
},
"5": {
"question": "Verkoop van condooms"
},
"6": {
"question": "Verkoop van koffie"
},
"7": {
"question": "Verkoop van water"
},
"8": {
"question": "Verkoop van kranten"
},
"9": {
"question": "Verkoop van fietsbinnenbanden"
},
"10": {
"question": "Verkoop van melk"
},
@ -8783,6 +8826,9 @@
"19": {
"question": "Verkoop van bloemen"
},
"2": {
"question": "Verkoop van snoep"
},
"23": {
"question": "Verkoop van fietslampjes"
},
@ -8797,6 +8843,27 @@
},
"27": {
"question": "Verkoop van fietssloten"
},
"3": {
"question": "Verkoop van eten"
},
"4": {
"question": "Verkoop van sigaretten"
},
"5": {
"question": "Verkoop van condooms"
},
"6": {
"question": "Verkoop van koffie"
},
"7": {
"question": "Verkoop van water"
},
"8": {
"question": "Verkoop van kranten"
},
"9": {
"question": "Verkoop van fietsbinnenbanden"
}
}
}
@ -8837,30 +8904,6 @@
"1": {
"then": "Snoep wordt verkocht"
},
"2": {
"then": "Eten wordt verkocht"
},
"3": {
"then": "Sigaretten worden verkocht"
},
"4": {
"then": "Condooms worden verkocht"
},
"5": {
"then": "Koffie wordt verkocht"
},
"6": {
"then": "Drinkwater wordt verkocht"
},
"7": {
"then": "Kranten worden verkocht"
},
"8": {
"then": "Binnenbanden voor fietsen worden verkocht"
},
"9": {
"then": "Melk wordt verkocht"
},
"10": {
"then": "Brood wordt verkocht"
},
@ -8891,6 +8934,9 @@
"19": {
"then": "Parkeerkaarten worden verkocht"
},
"2": {
"then": "Eten wordt verkocht"
},
"21": {
"then": "Openbaar vervoerkaartjes worden verkocht"
},
@ -8908,6 +8954,27 @@
},
"26": {
"then": "Fietssloten worden verkocht"
},
"3": {
"then": "Sigaretten worden verkocht"
},
"4": {
"then": "Condooms worden verkocht"
},
"5": {
"then": "Koffie wordt verkocht"
},
"6": {
"then": "Drinkwater wordt verkocht"
},
"7": {
"then": "Kranten worden verkocht"
},
"8": {
"then": "Binnenbanden voor fietsen worden verkocht"
},
"9": {
"then": "Melk wordt verkocht"
}
},
"question": "Wat verkoopt deze verkoopautomaat?",
@ -9200,4 +9267,4 @@
"render": "windturbine"
}
}
}
}

View file

@ -464,7 +464,7 @@
"description": "Aquest mapa mostra xarxes de nodes ciclistes i et permet afegir-ne de nous de manera senzilla",
"layers": {
"0": {
"name": "enllaços node a node",
"name": "Enllaços node a node",
"tagRenderings": {
"node2node-survey:date": {
"override": {
@ -483,12 +483,21 @@
}
},
"1": {
"name": "nodes",
"name": "Nodes",
"presets": {
"0": {
"title": "un node ciclista"
}
},
"tagRenderings": {
"node-expected_rcn_route_relations": {
"question": "A quants altes nodes ciclistes enllaça aquest node?",
"render": "Aquest node enllaça a {expected_rcn_route_relations} altres nodes ciclistes."
},
"node-rxn_ref": {
"question": "Quin és el número de referència d'aquest node ciclista?",
"render": "Aquest node ciclista té la referència número {rcn_ref}"
},
"node-survey:date": {
"override": {
"question": "Quan va ser sondejat aquest node ciclista per última vegada?",
@ -746,6 +755,18 @@
"layers": {
"0": {
"override": {
"filter+": {
"0": {
"options": {
"1": {
"question": "Només mostra freiduries que utilitzen oli vegetal"
},
"2": {
"question": "Només mostra freiduries que utilitzen oli animal"
}
}
}
},
"name": "Botigues de patates"
}
}
@ -785,6 +806,9 @@
}
}
},
"guideposts": {
"title": "Pal guia"
},
"hackerspaces": {
"description": "En aquest mapa podeu veure els hackerspaces, afegir un nou hackerspace o actualitzar les dades directament",
"shortDescription": "Un mapa dels hackerspaces",
@ -820,6 +844,10 @@
"description": "En aquest mapa trobareu hotels a la vostra zona",
"title": "Hotels"
},
"icecream": {
"description": "Un mapa que mostra les gelateries i les màquines expenedores de gelats",
"title": "Gelat"
},
"indoors": {
"description": "En aquest mapa es mostren els llocs interiors accessibles al públic",
"title": "Interiors"
@ -840,6 +868,111 @@
},
"title": "Vorals i encreuaments"
},
"mapcomplete-changes": {
"description": "Aquest mapa mostra tots els canvis fets amb MapComplete",
"layers": {
"0": {
"description": "Mostra tots els canvis de MapComplete",
"filter": {
"0": {
"options": {
"0": {
"question": "El nom del tema conté {search}"
}
}
},
"2": {
"options": {
"0": {
"question": "Fet pel col·laborador {search}"
}
}
},
"3": {
"options": {
"0": {
"question": "<b>No</b> fet pel col·laborador {search}"
}
}
},
"4": {
"options": {
"0": {
"question": "Fet abans de {search}"
}
}
},
"5": {
"options": {
"0": {
"question": "Fet després de {search}"
}
}
},
"6": {
"options": {
"0": {
"question": "Idioma de l'usuari (codi iso) {search}"
}
}
},
"7": {
"options": {
"0": {
"question": "Fet amb l'amfitrió {search}"
}
}
},
"8": {
"options": {
"0": {
"question": "El conjunt de canvis ha afegit almenys una imatge"
}
}
}
},
"tagRenderings": {
"contributor": {
"question": "Quin col·laborador va fer aquest canvi?",
"render": "Canvi fet per <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>"
},
"host": {
"question": "Amb quin amfitrió (lloc web) es va fer aquest canvi?",
"render": "Canviat amb <a href='{host}'>{host}</a>"
},
"locale": {
"question": "Amb quina configuració regional (idioma) s'ha fet aquest canvi?",
"render": "La configuració regional de l'usuari és {locale}"
},
"show_changeset_id": {
"render": "Conjunt de canvi <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
},
"theme-id": {
"question": "Quin tema es va utilitzar per fer aquest canvi?",
"render": "Canvi amb el tema <a href='https://mapcomplete.org/{theme}'>{theme}</a>"
},
"version": {
"question": "Quina versió de MapComplete es va utilitzar per fer aquest canvi?",
"render": "Fet amb {editor}"
}
},
"title": {
"render": "Conjunt de canvis per a {theme}"
}
},
"1": {
"override": {
"tagRenderings+": {
"0": {
"render": "Es pot trobar més estadística <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>aquí</a>"
}
}
}
}
},
"shortDescription": "Mostra els canvis fets amb MapComplete",
"title": "Canvis fets amb MapComplete"
},
"maproulette": {
"description": "Tema que mostra les tasques de MapRoulette, que us permet cercar-les, filtrar-les i solucionar-les.",
"title": "Tasques de MapRoulette"

View file

@ -777,6 +777,10 @@ video {
float: left;
}
.m-8 {
margin: 2rem;
}
.m-4 {
margin: 1rem;
}
@ -789,10 +793,6 @@ video {
margin: 0px;
}
.m-8 {
margin: 2rem;
}
.m-2 {
margin: 0.5rem;
}
@ -1111,6 +1111,10 @@ video {
height: fit-content;
}
.h-16 {
height: 4rem;
}
.h-0 {
height: 0px;
}
@ -1139,10 +1143,6 @@ video {
height: 1.25rem;
}
.h-16 {
height: 4rem;
}
.h-48 {
height: 12rem;
}
@ -1207,6 +1207,10 @@ video {
width: 1.5rem;
}
.w-16 {
width: 4rem;
}
.w-screen {
width: 100vw;
}
@ -1241,10 +1245,6 @@ video {
width: 2.75rem;
}
.w-16 {
width: 4rem;
}
.w-64 {
width: 16rem;
}
@ -2254,6 +2254,9 @@ video {
--catch-detail-foregroundcolor: white;
--catch-detail-color-contrast: #fb3afb;
--image-carousel-height: 350px;
/** Technical value, used by icon.svelte
*/
--svg-color: #000000;
}
/***********************************************************************\
@ -2799,6 +2802,10 @@ a.link-underline {
overflow: visible !important;
}
svg.apply-fill path {
fill: var(--svg-color)
}
.compass_arrow {
width: calc( 2.5rem - 1px ) ;
height: calc( 2.5rem - 1px )

View file

@ -6,6 +6,7 @@ import { Utils } from "../src/Utils"
import Validators from "../src/UI/InputElement/Validators"
import { AllKnownLayouts } from "../src/Customizations/AllKnownLayouts"
import { AllSharedLayers } from "../src/Customizations/AllSharedLayers"
import Constants from "../src/Models/Constants"
const metainfo = {
type: "One of the inputValidator types",
@ -199,11 +200,12 @@ function extractHintsFrom(
if (hints["suggestions"]) {
const suggestions = hints["suggestions"]
const f = new Function("{ layers, themes, validators }", suggestions)
const f = new Function("{ layers, themes, validators, Constants }", suggestions)
hints["suggestions"] = f({
layers: AllSharedLayers.sharedLayers,
themes: AllKnownLayouts.allKnownLayouts,
validators: Validators,
Constants: Constants
})
}
return hints

View file

@ -16,9 +16,9 @@ export NODE_OPTIONS="--max-old-space-size=16384"
npm run generate:editor-layer-index &&
npm run prep:layeroverview &&
npm run generate && # includes a single "refresh:layeroverview". Resetting the files is unnecessary as they are not in there in the first place
npm run generate:mapcomplete-changes-theme &&
npm run refresh:layeroverview && # run refresh:layeroverview a second time to propagate all calls
npm run refresh:layeroverview && # run refresh:layeroverview a third time to fix some issues with the favourite layer all calls
npm run generate:mapcomplete-changes-theme &&
npm run generate:layouts

View file

@ -114,27 +114,42 @@ export default class Constants {
* These are the values that are allowed to use as 'backdrop' icon for a map pin
*/
private static readonly _defaultPinIcons = [
"pin",
"square",
"circle",
"none",
"pin",
"person",
"plus",
"ring",
"star",
"teardrop",
"triangle",
"checkmark",
"clock",
"close",
"crosshair",
"help",
"home",
"invalid",
"location",
"location_empty",
"location_locked",
"note",
"resolved",
"ring",
"scissors",
"teardrop",
"teardrop_with_hole_green",
"triangle",
"brick_wall_square",
"brick_wall_round",
"gps_arrow",
"checkmark",
"help",
"clock",
"invalid",
"close",
"invalid",
"heart",
"heart_outline",
"confirm",
"direction",
"not_found",
"mastodon",
"party",
"addSmall",
] as const
public static readonly defaultPinIcons: string[] = <any>Constants._defaultPinIcons

View file

@ -24,6 +24,7 @@ import { ConversionContext } from "./ConversionContext"
import * as eli from "../../../assets/editor-layer-index.json"
import { AvailableRasterLayers } from "../../RasterLayers"
import Back from "../../../assets/svg/Back.svelte"
import PointRenderingConfigJson from "../Json/PointRenderingConfigJson"
class ValidateLanguageCompleteness extends DesugaringStep<LayoutConfig> {
private readonly _languages: string[]
@ -1016,6 +1017,7 @@ export class PrevalidateLayer extends DesugaringStep<LayerConfigJson> {
*/
private readonly _path: string
private readonly _studioValidations: boolean
private readonly _validatePointRendering = new ValidatePointRendering()
constructor(path: string, isBuiltin, doesImageExist, studioValidations) {
super("Runs various checks against common mistakes for a layer", [], "PrevalidateLayer")
@ -1105,6 +1107,8 @@ export class PrevalidateLayer extends DesugaringStep<LayerConfigJson> {
context.enter("pointRendering").err("There are no pointRenderings at all...")
}
json.pointRendering?.forEach((pr,i) => this._validatePointRendering.convert(pr, context.enters("pointeRendering", i)))
if (json["mapRendering"]) {
context.enter("mapRendering").err("This layer has a legacy 'mapRendering'")
}
@ -1409,13 +1413,40 @@ export class ValidateLayerConfig extends DesugaringStep<LayerConfigJson> {
}
}
class ValidatePointRendering extends DesugaringStep<PointRenderingConfigJson> {
constructor() {
super("Various checks for pointRenderings", [], "ValidatePOintRendering")
}
convert(json: PointRenderingConfigJson, context: ConversionContext): PointRenderingConfigJson {
if (json.marker === undefined && json.label === undefined) {
context.err(`A point rendering should define at least an marker or a label`)
}
if (json["markers"]) {
context.enter("markers").err(`Detected a field 'markerS' in pointRendering. It is written as a singular case`)
}
if (json.marker && !Array.isArray(json.marker)) {
context.enter("marker").err(
"The marker in a pointRendering should be an array"
)
}
if (json.location.length == 0) {
context.enter("location").err (
"A pointRendering should have at least one 'location' to defined where it should be rendered. "
)
}
return json
}
}
export class ValidateLayer extends Conversion<
LayerConfigJson,
{ parsed: LayerConfig; raw: LayerConfigJson }
> {
private readonly _skipDefaultLayers: boolean
private readonly _prevalidation: PrevalidateLayer
constructor(
path: string,
isBuiltin: boolean,

View file

@ -506,7 +506,7 @@ export interface LayerConfigJson {
* If the way is part of a relation, MapComplete will attempt to update this relation as well
* question: Should the contributor be able to split ways using this layer?
* iftrue: enable the 'split-roads'-component
* iffalse: don't enable the split-roads componenet
* iffalse: don't enable the split-roads component
* ifunset: don't enable the split-roads component
* group: editing
*/

View file

@ -5,7 +5,7 @@ export interface IconConfigJson {
/**
* question: What icon should be used?
* type: icon
* suggestions: return ["pin","square","circle","checkmark","clock","close","crosshair","help","home","invalid","location","location_empty","location_locked","note","resolved","ring","scissors","teardrop","teardrop_with_hole_green","triangle"].map(i => ({if: "value="+i, then: i, icon: i}))
* suggestions: return Constants.defaultPinIcons.map(i => ({if: "value="+i, then: i, icon: i}))
*/
icon: string | MinimalTagRenderingConfigJson | { builtin: string; override: any }
/**

View file

@ -79,23 +79,7 @@ export default class PointRenderingConfig extends WithContextLoader {
}
})
if (json.marker === undefined && json.label === undefined) {
throw `At ${context}: A point rendering should define at least an marker or a label`
}
if (json["markers"]) {
throw `At ${context}.markers: detected a field 'markerS' in pointRendering. It is written as a singular case`
}
if (json.marker && !Array.isArray(json.marker)) {
throw `At ${context}.marker: the marker in a pointRendering should be an array`
}
if (this.location.size == 0) {
throw (
"A pointRendering should have at least one 'location' to defined where it should be rendered. (At " +
context +
".location)"
)
}
this.marker = (json.marker ?? []).map((m) => new IconConfig(<any>m))
if (json.css !== undefined) {
this.cssDef = this.tr("css", undefined)

View file

@ -370,20 +370,9 @@ export default class TagRenderingConfig {
let iconClass = commonSize
if (!!mapping.icon) {
if (typeof mapping.icon === "string" && mapping.icon !== "") {
let stripped = mapping.icon
if (stripped.endsWith(".svg")) {
stripped = stripped.substring(0, stripped.length - 4)
}
if (Constants.defaultPinIcons.indexOf(stripped) >= 0) {
icon = "./assets/svg/" + mapping.icon
if (!icon.endsWith(".svg")) {
icon += ".svg"
}
} else {
icon = mapping.icon
}
icon = mapping.icon.trim()
} else if (mapping.icon["path"]) {
icon = mapping.icon["path"]
icon = mapping.icon["path"].trim()
iconClass = mapping.icon["class"] ?? iconClass
}
}

View file

@ -1,7 +1,7 @@
<script lang="ts">
/**
* A mapcontrol button which allows the user to select a different background.
* Even though the componenet is very small, it gets it's own class as it is often reused
* Even though the component is very small, it gets it's own class as it is often reused
*/
import { Square3Stack3dIcon } from "@babeard/svelte-heroicons/solid"
import type { SpecialVisualizationState } from "../SpecialVisualization"

View file

@ -51,6 +51,15 @@
}
}
function onKeyPress(e: KeyboardEvent){
if(e.key === "Enter"){
e.stopPropagation()
e.preventDefault()
dispatch("submit")
}
}
initValueAndDenom()
$: {
@ -126,7 +135,7 @@
let htmlElem: HTMLInputElement | HTMLTextAreaElement
let dispatch = createEventDispatcher<{ selected }>()
let dispatch = createEventDispatcher<{ selected, submit }>()
$: {
if (htmlElem !== undefined) {
htmlElem.onfocus = () => dispatch("selected")
@ -144,6 +153,7 @@
inputmode={validator?.inputmode ?? "text"}
placeholder={_placeholder}
bind:this={htmlElem}
on:keypress={onKeyPress}
/>
{:else}
<div class={twMerge("inline-flex", cls)}>
@ -153,6 +163,7 @@
class="w-full"
inputmode={validator?.inputmode ?? "text"}
placeholder={_placeholder}
on:keypress={onKeyPress}
/>
{#if !$isValid}
<ExclamationIcon class="-ml-6 h-6 w-6" />

View file

@ -13,7 +13,7 @@
let iconItem = icon.icon?.GetRenderValue($tags)?.Subs($tags)?.txt
$: iconItem = icon.icon?.GetRenderValue($tags)?.Subs($tags)?.txt
let color = icon.color?.GetRenderValue(tags)?.txt ?? "#000000"
let color = icon.color?.GetRenderValue($tags)?.txt ?? "#000000"
$: color = icon.color?.GetRenderValue($tags)?.txt ?? "#000000"
</script>

View file

@ -1,46 +1,47 @@
<script lang="ts">
import Pin from "../../assets/svg/Pin.svelte"
import Square from "../../assets/svg/Square.svelte"
import Circle from "../../assets/svg/Circle.svelte"
import Checkmark from "../../assets/svg/Checkmark.svelte"
import Clock from "../../assets/svg/Clock.svelte"
import Close from "../../assets/svg/Close.svelte"
import Crosshair from "../../assets/svg/Crosshair.svelte"
import Help from "../../assets/svg/Help.svelte"
import Home from "../../assets/svg/Home.svelte"
import Invalid from "../../assets/svg/Invalid.svelte"
import Location from "../../assets/svg/Location.svelte"
import Location_empty from "../../assets/svg/Location_empty.svelte"
import Location_locked from "../../assets/svg/Location_locked.svelte"
import Note from "../../assets/svg/Note.svelte"
import Resolved from "../../assets/svg/Resolved.svelte"
import Ring from "../../assets/svg/Ring.svelte"
import Scissors from "../../assets/svg/Scissors.svelte"
import Teardrop from "../../assets/svg/Teardrop.svelte"
import Teardrop_with_hole_green from "../../assets/svg/Teardrop_with_hole_green.svelte"
import Triangle from "../../assets/svg/Triangle.svelte"
import Brick_wall_square from "../../assets/svg/Brick_wall_square.svelte"
import Brick_wall_round from "../../assets/svg/Brick_wall_round.svelte"
import Gps_arrow from "../../assets/svg/Gps_arrow.svelte"
import { HeartIcon } from "@babeard/svelte-heroicons/solid"
import { HeartIcon as HeartOutlineIcon } from "@babeard/svelte-heroicons/outline"
import Confirm from "../../assets/svg/Confirm.svelte"
import Not_found from "../../assets/svg/Not_found.svelte"
import { twMerge } from "tailwind-merge"
import Direction_gradient from "../../assets/svg/Direction_gradient.svelte"
import Mastodon from "../../assets/svg/Mastodon.svelte"
import Party from "../../assets/svg/Party.svelte"
import AddSmall from "../../assets/svg/AddSmall.svelte"
import Pin from "../../assets/svg/Pin.svelte"
import Square from "../../assets/svg/Square.svelte"
import Circle from "../../assets/svg/Circle.svelte"
import Checkmark from "../../assets/svg/Checkmark.svelte"
import Clock from "../../assets/svg/Clock.svelte"
import Close from "../../assets/svg/Close.svelte"
import Crosshair from "../../assets/svg/Crosshair.svelte"
import Help from "../../assets/svg/Help.svelte"
import Home from "../../assets/svg/Home.svelte"
import Invalid from "../../assets/svg/Invalid.svelte"
import Location from "../../assets/svg/Location.svelte"
import Location_empty from "../../assets/svg/Location_empty.svelte"
import Location_locked from "../../assets/svg/Location_locked.svelte"
import Note from "../../assets/svg/Note.svelte"
import Resolved from "../../assets/svg/Resolved.svelte"
import Ring from "../../assets/svg/Ring.svelte"
import Scissors from "../../assets/svg/Scissors.svelte"
import Teardrop from "../../assets/svg/Teardrop.svelte"
import Teardrop_with_hole_green from "../../assets/svg/Teardrop_with_hole_green.svelte"
import Triangle from "../../assets/svg/Triangle.svelte"
import Brick_wall_square from "../../assets/svg/Brick_wall_square.svelte"
import Brick_wall_round from "../../assets/svg/Brick_wall_round.svelte"
import Gps_arrow from "../../assets/svg/Gps_arrow.svelte"
import { HeartIcon } from "@babeard/svelte-heroicons/solid"
import { HeartIcon as HeartOutlineIcon } from "@babeard/svelte-heroicons/outline"
import Confirm from "../../assets/svg/Confirm.svelte"
import Not_found from "../../assets/svg/Not_found.svelte"
import { twMerge } from "tailwind-merge"
import Direction_gradient from "../../assets/svg/Direction_gradient.svelte"
import Mastodon from "../../assets/svg/Mastodon.svelte"
import Party from "../../assets/svg/Party.svelte"
import AddSmall from "../../assets/svg/AddSmall.svelte"
/**
* Renders a single icon.
*
* Icons -placed on top of each other- form a 'Marker' together
*/
/**
* Renders a single icon.
*
* Icons -placed on top of each other- form a 'Marker' together
*/
export let icon: string | undefined
export let color: string | undefined = undefined
export let clss: string | undefined = undefined
export let icon: string | undefined
export let color: string | undefined = undefined
export let clss: string | undefined = undefined
</script>
{#if icon}
@ -99,9 +100,9 @@
{:else if icon === "invalid"}
<Invalid {color} class={clss} />
{:else if icon === "heart"}
<HeartIcon class={clss} />
<HeartIcon style="--svg-color: {color}" class={twMerge(clss,"apply-fill")} />
{:else if icon === "heart_outline"}
<HeartOutlineIcon class={clss} />
<HeartOutlineIcon style="--svg-color: {color}" class={twMerge(clss, "apply-fill")} />
{:else if icon === "confirm"}
<Confirm class={clss} {color} />
{:else if icon === "direction"}
@ -118,3 +119,4 @@
<img class={clss ?? "h-full w-full"} src={icon} aria-hidden="true" alt="" />
{/if}
{/if}

View file

@ -27,7 +27,7 @@
/**
* Indicates if this tagRendering currently shows the attribute or asks the question to _change_ the property
*/
export let editMode = !config.IsKnown(tags.data) // || showQuestionIfUnknown;
export let editMode = !config.IsKnown(tags.data)
if (tags) {
onDestroy(
tags.addCallbackD((tags) => {

View file

@ -159,7 +159,7 @@
}
}
function onSave() {
function onSave(e) {
if (selectedTags === undefined) {
return
}
@ -198,7 +198,9 @@
function onInputKeypress(e: KeyboardEvent) {
if (e.key === "Enter") {
onSave()
e.preventDefault()
e.stopPropagation()
onSave(e)
}
}

View file

@ -41,7 +41,6 @@
<TagRenderingEditable
{config}
selectedElement={undefined}
showQuestionIfUnknown={true}
{state}
{tags}
/>

View file

@ -117,7 +117,6 @@
selectedElement={state.exampleFeature}
{config}
editingEnabled={new ImmutableStore(true)}
showQuestionIfUnknown={true}
{state}
{tags}
/>

View file

@ -190,7 +190,6 @@
editMode={startInEditMode}
{config}
selectedElement={undefined}
showQuestionIfUnknown={true}
{state}
{tags}
/>

View file

@ -215,7 +215,6 @@
<TagRenderingEditable
{config}
selectedElement={undefined}
showQuestionIfUnknown={!schema.hints?.ifunset}
{state}
{tags}
/>

View file

@ -139,7 +139,6 @@
<TagRenderingEditable
config={configBuiltin}
selectedElement={undefined}
showQuestionIfUnknown={true}
{state}
{tags}
/>

View file

@ -1,16 +1,7 @@
<script lang="ts">
// Testing grounds
import Motion from "../Sensors/Motion"
import { Store, Stores } from "../Logic/UIEventSource"
let maxAcc = Motion.singleton.maxAcc
let shaken = Motion.singleton.lastShakeEvent
let recentlyShaken = Stores.Chronic(250).mapD(
(now) => now.getTime() - 3000 < shaken.data?.getTime()
)
import Icon from "./Map/Icon.svelte"
</script>
Acc: {$maxAcc}
{#if $recentlyShaken}
<div class="text-5xl text-red-500">SHAKEN</div>
{/if}
<Icon clss="h-16 w-16" icon="heart" color="#ff0000"/>

View file

@ -1450,7 +1450,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
public static scrollIntoView(element: HTMLBaseElement | HTMLDivElement) {
// Is the element completely in the view?
const parentRect = Utils.findParentWithScrolling(element).getBoundingClientRect()
const parentRect = Utils.findParentWithScrolling(element)?.getBoundingClientRect()
if(!parentRect){
return
}
const elementRect = element.getBoundingClientRect()
// Check if the element is within the vertical bounds of the parent element

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -225,6 +225,94 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
{
"path": [
"mappings",
"alsoShowIf"
],
"required": false,
"hints": {},
"type": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"$ref": "#/definitions/{or:TagConfigJson[];}"
},
{
"type": "string"
}
],
"description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
},
{
"path": [
"mappings",
"alsoShowIf",
"and"
],
"required": false,
"hints": {
"typehint": "tag"
},
"type": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"type": "object",
"properties": {
"or": {
"type": "array",
"items": {
"$ref": "#/definitions/TagConfigJson"
}
}
},
"required": [
"or"
]
},
{
"type": "string"
}
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
{
"path": [
"mappings",
"alsoShowIf",
"or"
],
"required": false,
"hints": {
"typehint": "tag"
},
"type": [
{
"$ref": "#/definitions/{and:TagConfigJson[];}"
},
{
"type": "object",
"properties": {
"or": {
"type": "array",
"items": {
"$ref": "#/definitions/TagConfigJson"
}
}
},
"required": [
"or"
]
},
{
"type": "string"
}
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
{
"path": [
"mappings",
@ -565,6 +653,10 @@
{
"if": "value=id",
"then": "<b>id</b> Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
},
{
"if": "value=slope",
"then": "<b>slope</b> Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@ -775,6 +867,22 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
{
"path": [
"editButtonAriaLabel"
],
"required": false,
"hints": {},
"type": [
{
"$ref": "#/definitions/Record<string,string>"
},
{
"type": "string"
}
],
"description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
},
{
"path": [
"labels"

View file

@ -53,6 +53,9 @@
--image-carousel-height: 350px;
/** Technical value, used by icon.svelte
*/
--svg-color: #000000;
}
/***********************************************************************\
@ -612,6 +615,10 @@ a.link-underline {
overflow: visible !important;
}
svg.apply-fill path {
fill: var(--svg-color)
}
.compass_arrow {
width: calc( 2.5rem - 1px ) ;
height: calc( 2.5rem - 1px )