Merge develop

This commit is contained in:
Pieter Vander Vennet 2024-01-28 03:27:17 +01:00
commit 94f39e89fe
174 changed files with 3695 additions and 3420 deletions

View file

@ -560,7 +560,8 @@
"he": "גילוף בעץ",
"eu": "Egur taila",
"pl": "Rzeźbienie w drewnie",
"pt_BR": "Entalhe"
"pt_BR": "Entalhe",
"it": "Scultura in legno"
}
}
],
@ -755,7 +756,8 @@
"ca": "Què representa aquesta obra d'art?",
"he": "מה מתארת היצירה הזו?",
"pl": "Co przedstawia to dzieło sztuki?",
"pt_BR": "O que esta obra de arte representa?"
"pt_BR": "O que esta obra de arte representa?",
"it": "Che cosa rappresenta quest'opera d'arte?"
},
"freeform": {
"key": "subject:wikidata",
@ -772,7 +774,8 @@
"ca": "Aquesta obra d'art representa {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}",
"fr": "Cette œuvre dépeint {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}",
"pl": "To dzieło sztuki przedstawia {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}",
"pt_BR": "Essa arte representa {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}"
"pt_BR": "Essa arte representa {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}",
"it": "Quest'opera d'arte rappresenta {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}"
},
"labels": [
"artwork-question"
@ -792,7 +795,8 @@
"pl": "Czy to dzieło sztuki pełni funkcję ławki?",
"pt_BR": "Essa obra de arte serve como banco?",
"es": "¿Sirve esta obra de arte como banco?",
"pt": "Esta obra de arte serve como banco?"
"pt": "Esta obra de arte serve como banco?",
"it": "Quest'opera d'arte funge da panchina?"
},
"mappings": [
{
@ -808,7 +812,8 @@
"pl": "To dzieło sztuki pełni również funkcję ławki",
"pt_BR": "Essa obra de arte também serve como banco",
"es": "Esta obra de arte también sirve de banco",
"pt": "Esta obra de arte também serve como banco"
"pt": "Esta obra de arte também serve como banco",
"it": "Quest'opera d'arte funge anche da panchina"
}
},
{
@ -825,7 +830,8 @@
"pl": "To dzieło sztuki nie pełni funkcji ławki",
"pt_BR": "Essa obra de arte não serve como banco",
"es": "Esta obra no sirve de banco",
"pt": "Esta obra de arte não serve como banco"
"pt": "Esta obra de arte não serve como banco",
"it": "Quest'opera d'arte non funge anche da panchina"
}
},
{
@ -842,7 +848,8 @@
"pl": "To dzieło sztuki nie pełni funkcji ławki",
"pt_BR": "Essa obra de arte não serve como banco",
"es": "Esta obra no sirve de banco",
"pt": "Esta obra de arte não serve como banco"
"pt": "Esta obra de arte não serve como banco",
"it": "Quest'opera d'arte non funge anche da panchina"
},
"hideInAnswer": true
}

View file

@ -13,7 +13,8 @@
"pl": "Bankomaty",
"pt_BR": "Caixas eletrônicos",
"es": "Cajeros automáticos",
"pt": "Multibancos"
"pt": "Multibancos",
"it": "Sportelli Bancomat"
},
"description": {
"en": "ATMs to withdraw money",
@ -27,7 +28,8 @@
"he": "כספומטים למשיכת כסף",
"pl": "Bankomaty do wypłacania pieniędzy",
"pt_BR": "Caixas eletrônicos para sacar dinheiro",
"pt": "Multibancos para levantar dinheiro"
"pt": "Multibancos para levantar dinheiro",
"it": "Sportello Bancomat per prelevare denaro"
},
"source": {
"osmTags": "amenity=atm"
@ -103,7 +105,8 @@
"pl": "bankomat",
"pt_BR": "um caixa eletrônico",
"es": "Un cajero automático",
"pt": "um multibanco"
"pt": "um multibanco",
"it": "Uno sportello bancomat"
}
}
],
@ -123,7 +126,8 @@
"pl": "Nazwa tego bankomatu to {name}",
"pt_BR": "O nome desse caixa eletrônico é {name}",
"es": "El nombre del banco de este cajero automático es {name}",
"pt": "O nome deste multibanco é {name}"
"pt": "O nome deste multibanco é {name}",
"it": "Il nome di questo sportello bancomat è {name}"
},
"condition": "name~*"
},
@ -206,7 +210,8 @@
"eu": "Operadorea",
"pt_BR": "Operador",
"es": "Operador",
"pt": "Operador"
"pt": "Operador",
"it": "Operatore"
}
},
"render": {
@ -237,7 +242,8 @@
"he": "האם אתה יכול למשוך מזומן מהכספומט הזה?",
"pt_BR": "Você pode sacar dinheiro nesse caixa eletrônico?",
"es": "¿Se puede sacar dinero de este cajero?",
"pt": "Pode levantar dinheiro neste multibanco?"
"pt": "Pode levantar dinheiro neste multibanco?",
"it": "Puoi prelevare dei contanti da questo sportello bancomat?"
},
"mappings": [
{
@ -253,7 +259,8 @@
"pl": "Z tego bankomatu można wypłacić pieniądze",
"pt_BR": "Você pode sacar dinheiro nesse caixa eletrônico",
"es": "Puede retirar dinero de este cajero automático",
"pt": "Pode levantar dinheiro neste multibanco"
"pt": "Pode levantar dinheiro neste multibanco",
"it": "Puoi prelevare dei contanti da questo sportello bancomat"
},
"hideInAnswer": true
},
@ -268,7 +275,8 @@
"he": "אתה יכול למשוך מזומן מהכספומט הזה",
"pt_BR": "Você pode sacar dinheiro nesse caixa eletrônico",
"es": "Puede retirar dinero de este cajero automático",
"pt": "Pode levantar dinheiro neste multibanco"
"pt": "Pode levantar dinheiro neste multibanco",
"it": "Puoi prelevare dei contanti da questo sportello bancomat"
}
},
{
@ -282,7 +290,8 @@
"he": "לא ניתן למשוך מזומן מכספומט זה",
"pt_BR": "Você não pode sacar dinheiro nesse caixa eletrônico",
"es": "No puede retirar dinero de este cajero automático",
"pt": "Não pode levantar dinheiro neste multibanco"
"pt": "Não pode levantar dinheiro neste multibanco",
"it": "Non puoi prelevare dei contanti da questo sportello bancomat"
}
}
]
@ -300,7 +309,8 @@
"pl": "Czy ten bankomat pozwala wpłacać pieniądze?",
"pt_BR": "Você pode depositar dinheiro nesse caixa eletrônico?",
"es": "¿Se puede ingresar dinero en efectivo en este cajero?",
"pt": "Pode depositar dinheiro neste multibanco?"
"pt": "Pode depositar dinheiro neste multibanco?",
"it": "Puoi depositare dei contanti in questo sportello bancomat?"
},
"mappings": [
{
@ -317,7 +327,8 @@
"pl": "Prawdopodobnie ten bankomat nie pozwala wpłacać pieniędzy",
"pt_BR": "Você provavelmente não pode depositar dinheiro nesse caixa eletrônico",
"es": "Es probable que no pueda ingresar dinero en efectivo en este cajero automático",
"pt": "Provavelmente não pode depositar dinheiro neste multibanco"
"pt": "Provavelmente não pode depositar dinheiro neste multibanco",
"it": "Probabilmente non puoi depositare dei contanti in questo sportello bancomat"
},
"hideInAnswer": true
},
@ -335,7 +346,8 @@
"pl": "Ten bankomat pozwala wpłacać pieniądze",
"pt_BR": "Você pode depositar dinheiro nesse caixa eletrônico",
"es": "Puede ingresar dinero en efectivo en este cajero automático",
"pt": "Pode depositar dinheiro neste mutibanco"
"pt": "Pode depositar dinheiro neste mutibanco",
"it": "Puoi depositare dei contanti in questo sportello bancomat"
}
},
{
@ -352,7 +364,8 @@
"pl": "Ten bankomat nie pozwala wpłacać pieniędzy",
"pt_BR": "Você não pode depositar dinheiro nesse caixa eletrônico",
"es": "No se puede ingresar dinero en efectivo en este cajero automático",
"pt": "Não pode depositar dinheiro neste multibanco"
"pt": "Não pode depositar dinheiro neste multibanco",
"it": "Non puoi depositare dei contanti in questo sportello bancomat"
}
}
]
@ -386,7 +399,8 @@
"pl": "Jakie banknoty można tutaj wypłacić?",
"pt_BR": "Quais notas você pode sacar aqui?",
"es": "¿Qué billetes puede retirar aquí?",
"pt": "Quais notas pode levantar aqui?"
"pt": "Quais notas pode levantar aqui?",
"it": "Quali banconote si possono ritirare qui?"
},
"multiAnswer": true,
"mappings": [
@ -402,7 +416,8 @@
"fr": "On peut retirer des billets de 5 euros",
"pt_BR": "Notas de 5 euros podem ser sacadas",
"es": "Se pueden retirar billetes de 5 euros",
"pt": "Notas de 5 euros podem ser levantadas"
"pt": "Notas de 5 euros podem ser levantadas",
"it": "Si possono prelevare banconote da 5 euro"
}
},
{
@ -417,7 +432,8 @@
"fr": "On peut retirer des billets de 10 euros",
"pt_BR": "Notas de 10 euros podem ser sacadas",
"es": "Se pueden retirar billetes de 10 euros",
"pt": "Notas de 10 euros podem ser levantadas"
"pt": "Notas de 10 euros podem ser levantadas",
"it": "Si possono prelevare banconote da 10 euro"
}
},
{
@ -432,7 +448,8 @@
"fr": "On peut retirer des billets de 20 euros",
"pt_BR": "Notas de 20 euros podem ser sacadas",
"es": "Se pueden retirar billetes de 20 euros",
"pt": "Notas de 20 euros podem ser levantadas"
"pt": "Notas de 20 euros podem ser levantadas",
"it": "Si possono prelevare banconote da 20 euro"
}
},
{
@ -447,7 +464,8 @@
"fr": "On peut retirer des billets de 50 euros",
"pt_BR": "Notas de 50 euros podem ser sacadas",
"es": "Se pueden retirar billetes de 50 euros",
"pt": "Notas de 50 euros podem ser levantadas"
"pt": "Notas de 50 euros podem ser levantadas",
"it": "Si possono prelevare banconote da 50 euro"
}
},
{
@ -462,7 +480,8 @@
"fr": "On peut retirer des billets de 100 euros",
"pt_BR": "Notas de 100 euros podem ser sacadas",
"es": "Se pueden retirar billetes de 100 euros",
"pt": "Notas de 100 euros podem ser levantadas"
"pt": "Notas de 100 euros podem ser levantadas",
"it": "Si possono prelevare banconote da 100 euro"
}
},
{
@ -477,7 +496,8 @@
"fr": "On peut retirer des billets de 200 euros",
"pt_BR": "Notas de 200 euros podem ser sacadas",
"es": "Se pueden retirar billetes de 200 euros",
"pt": "Notas de 200 euros podem ser levantadas"
"pt": "Notas de 200 euros podem ser levantadas",
"it": "Non si possono prelevare banconote da 200 euro"
}
},
{
@ -492,7 +512,8 @@
"fr": "On peut retirer des billets de 500 euros",
"pt_BR": "Notas de 500 euros podem ser sacadas",
"es": "Se pueden retirar billetes de 500 euros",
"pt": "Notas de 500 euros podem ser levantadas"
"pt": "Notas de 500 euros podem ser levantadas",
"it": "Non si possono prelevare banconote da 500 euro"
}
}
]
@ -560,25 +581,25 @@
"pt": "Em que línguas este multibanco tem saída de fala?"
},
"render_list_item": {
"en": "This ATM has speech output in {language():font-bold}",
"de": "Dieser Geldautomat hat eine Sprachausgabe in {language():font-bold}",
"nl": "Deze geldautomaat heeft spraak in {language():font-bold}",
"ca": "Aquest caixer té sortida de veu en {language():font-bold}",
"cs": "Tento bankomat má řečový výstup v {language():font-bold}",
"he": "לכספומט הזה יש פלט דיבור ב {language():font-bold}",
"pt_BR": "Este caixa eletrônico tem saída de fala em {language():font-bold}",
"es": "Este cajero automático tiene salida de voz en {language():font-bold}",
"pt": "Este multibanco tem saída de fala em {language():font-bold}"
"en": "This ATM has speech output in {language()}",
"de": "Dieser Geldautomat hat eine Sprachausgabe in {language()}",
"nl": "Deze geldautomaat heeft spraak in {language()}",
"ca": "Aquest caixer té sortida de veu en {language()}",
"cs": "Tento bankomat má řečový výstup v {language()}",
"he": "לכספומט הזה יש פלט דיבור ב {language()}",
"pt_BR": "Este caixa eletrônico tem saída de fala em {language()}",
"es": "Este cajero automático tiene salida de voz en {language()}",
"pt": "Este multibanco tem saída de fala em {language()}"
},
"render_single_language": {
"en": "This ATM has speech output in {language():font-bold}",
"de": "Dieser Geldautomat hat eine Sprachausgabe in {language():font-bold}",
"nl": "Deze automaat heeft spraak in {language():font-bold}",
"ca": "Aquest caixer té sortida de veu en {language():font-bold}",
"cs": "Tento bankomat má řečový výstup v {language():font-bold}",
"he": "לכספומט הזה יש פלט דיבור ב {language():font-bold}",
"pt_BR": "Este caixa eletrônico tem saída de fala em {language():font-bold}",
"es": "Este cajero automático tiene salida de voz en {language():font-bold}"
"en": "This ATM has speech output in {language()}",
"de": "Dieser Geldautomat hat eine Sprachausgabe in {language()}",
"nl": "Deze automaat heeft spraak in {language()}",
"ca": "Aquest caixer té sortida de veu en {language()}",
"cs": "Tento bankomat má řečový výstup v {language()}",
"he": "לכספומט הזה יש פלט דיבור ב {language()}",
"pt_BR": "Este caixa eletrônico tem saída de fala em {language()}",
"es": "Este cajero automático tiene salida de voz en {language()}"
}
}
}

View file

@ -175,8 +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?",
"ca": "Quins vehicles tenen permesa la càrrega aquí?"
"ca": "Quins vehicles tenen permesa la càrrega aquí?",
"de": "Welche Fahrzeuge können hier laden?"
},
"multiAnswer": true,
"mappings": [
@ -186,8 +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",
"ca": "Aquí es poden carregar <b>bicicletes</b>"
"ca": "Aquí es poden carregar <b>bicicletes</b>",
"de": "Hier können <b>Fahrräder</b> laden"
}
},
{
@ -196,8 +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",
"ca": "Aquí es poden carregar <b>cotxes</b>"
"ca": "Aquí es poden carregar <b>cotxes</b>",
"de": "Hier können <b>Autos</b> laden"
}
},
{
@ -206,8 +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",
"ca": "Aquí es poden carregar <b>Scooters</b>"
"ca": "Aquí es poden carregar <b>Scooters</b>",
"de": "Hier können <b>Roller</b> laden"
}
},
{
@ -216,8 +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",
"ca": "Aquí es poden carregar <b>camions o trailers</b>"
"ca": "Aquí es poden carregar <b>camions o trailers</b>",
"de": "Hier können <b>LKW</b> laden"
}
},
{
@ -226,8 +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",
"ca": "Aquí es poden carregar <b>autobusos</b>"
"ca": "Aquí es poden carregar <b>autobusos</b>",
"de": "Hier können <b>Busse</b> laden"
}
}
]
@ -237,14 +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?",
"ca": "Qui pot utilitzar aquesta estació de càrrega?"
"ca": "Qui pot utilitzar aquesta estació de càrrega?",
"de": "Wer darf diese Ladestation benutzen?"
},
"render": {
"en": "Access is {access}",
"nl": "Toegang voor {access}",
"de": "Zugang ist {access}",
"ca": "L'accés està {access}"
"ca": "L'accés està {access}",
"de": "Zugang ist {access}"
},
"freeform": {
"key": "access",
@ -258,8 +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)",
"ca": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
"ca": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)",
"de": "Jeder kann die Station nutzen (eventuell gegen Bezahlung)"
}
},
{
@ -267,8 +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)",
"ca": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
"ca": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)",
"de": "Jeder kann diese Ladestation nutzen (eventuell gegen Bezahlung)"
},
"hideInAnswer": true
},
@ -277,8 +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>",
"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>"
"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>",
"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>"
}
},
{
@ -286,8 +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>",
"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>"
"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>",
"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>"
}
},
{
@ -295,8 +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, …)",
"ca": "No accessible per al públic general (p.e. només accessible pels propietaris, empleats, ...)"
"ca": "No accessible per al públic general (p.e. només accessible pels propietaris, empleats, ...)",
"de": "Die Station ist nicht für die Allgemeinheit zugänglich (z. B. nur für die Eigentümer, Mitarbeiter, ...)"
}
},
{
@ -304,8 +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.",
"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."
"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.",
"de": "Diese Ladestation ist zu gewissen Öffnungszeiten oder Bedingungen öffentlich zugänglich. Einschränkungen sind möglich, aber generelle Nutzung ist erlaubt."
}
}
]
@ -315,14 +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",
"ca": "Aquí poden carregar {capacity} vehicles a l'hora"
"ca": "Aquí poden carregar {capacity} vehicles a l'hora",
"de": "Hier können {capacity} Fahrzeuge gleichzeitig laden"
},
"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?",
"ca": "Quants vehicles poden carregar a la vegada?"
"ca": "Quants vehicles poden carregar a la vegada?",
"de": "Wie viele Fahrzeuge können hier gleichzeitig laden?"
},
"freeform": {
"key": "capacity",
@ -344,8 +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)",
"ca": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)"
"ca": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)",
"de": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)"
},
"icon": {
"path": "./assets/layers/charging_station/CEE7_4F.svg",
@ -439,8 +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)",
"ca": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)"
"ca": "<b>Endoll de paret Schuko</b> sense pin a terra (CEE7/4 tipus F)",
"de": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)"
},
"hideInAnswer": true,
"icon": {
@ -454,8 +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)",
"ca": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
"ca": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)",
"de": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
},
"icon": {
"path": "./assets/layers/charging_station/TypeE.svg",
@ -518,8 +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)",
"ca": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)"
"ca": "<b>Endoll de paret Europeu</b> amb pin a terra (CEE7/4 tipus E)",
"de": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)"
},
"hideInAnswer": true,
"icon": {
@ -533,8 +533,8 @@
"then": {
"en": "<b>Chademo</b>",
"nl": "<b>Chademo</b>",
"de": "<b>Chademo-Anschluss</b>",
"ca": "<b>CHAdeMo</b>"
"ca": "<b>CHAdeMo</b>",
"de": "<b>Chademo-Anschluss</b>"
},
"icon": {
"path": "./assets/layers/charging_station/Chademo_type4.svg",
@ -577,8 +577,8 @@
"then": {
"en": "<b>Chademo</b>",
"nl": "<b>Chademo</b>",
"de": "<b>Chademo-Anschluss</b>",
"ca": "<b>CHAdeMo</b>"
"ca": "<b>CHAdeMo</b>",
"de": "<b>Chademo-Anschluss</b>"
},
"hideInAnswer": true,
"icon": {
@ -592,8 +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)",
"ca": "<b>Tipus 1 amb cable</b>"
"ca": "<b>Tipus 1 amb cable</b>",
"de": "<b>Typ 1 mit Kabel</b> (J1772)"
},
"icon": {
"path": "./assets/layers/charging_station/Type1_J1772.svg",
@ -636,8 +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)",
"ca": "<b>Tipus 1 amb cable</b>"
"ca": "<b>Tipus 1 amb cable</b>",
"de": "<b>Typ 1 mit Kabel</b> (J1772)"
},
"hideInAnswer": true,
"icon": {
@ -651,8 +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)",
"ca": "<b>Tipus 1 <i>sense</i> cable</b>"
"ca": "<b>Tipus 1 <i>sense</i> cable</b>",
"de": "<b>Typ 1 <i>ohne</i> Kabel</b> (J1772)"
},
"icon": {
"path": "./assets/layers/charging_station/Type1_J1772.svg",
@ -695,8 +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)",
"ca": "<b>Tipus 1 <i>sense</i> cable</b>(J1772)"
"ca": "<b>Tipus 1 <i>sense</i> cable</b>(J1772)",
"de": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)"
},
"hideInAnswer": true,
"icon": {
@ -710,8 +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)",
"ca": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)"
"ca": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)",
"de": "<b>Typ 1 CCS</b> (Typ 1 Combo)"
},
"icon": {
"path": "./assets/layers/charging_station/Type1-ccs.svg",
@ -754,8 +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)",
"ca": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)"
"ca": "<b>CSS Tipus 1</b> (també conegut com a Tipus 1 Combo)",
"de": "<b> Typ 1 CCS </b> (auch bekannt als Typ 1 Combo)"
},
"hideInAnswer": true,
"icon": {
@ -769,8 +769,8 @@
"then": {
"en": "<b>Tesla Supercharger</b>",
"nl": "<b>Tesla Supercharger</b>",
"de": "<b>Tesla Supercharger</b>",
"ca": "<b>Supercarregador de Tesla"
"ca": "<b>Supercarregador de Tesla",
"de": "<b>Tesla Supercharger</b>"
},
"icon": {
"path": "./assets/layers/charging_station/Tesla-hpwc-model-s.svg",
@ -813,8 +813,8 @@
"then": {
"en": "<b>Tesla Supercharger</b>",
"nl": "<b>Tesla Supercharger</b>",
"de": "<b>Tesla Supercharger</b>",
"ca": "<b>Supercarregador de Tesla</b>"
"ca": "<b>Supercarregador de Tesla</b>",
"de": "<b>Tesla Supercharger</b>"
},
"hideInAnswer": true,
"icon": {
@ -828,8 +828,8 @@
"then": {
"en": "<b>Type 2</b> (mennekes)",
"nl": "<b>Type 2</b> (mennekes)",
"de": "<b>Typ 2</b> (Mennekes)",
"ca": "<b>Tipus 2</b> (mennekes)"
"ca": "<b>Tipus 2</b> (mennekes)",
"de": "<b>Typ 2</b> (Mennekes)"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_socket.svg",
@ -872,8 +872,8 @@
"then": {
"en": "<b>Type 2</b> (mennekes)",
"nl": "<b>Type 2</b> (mennekes)",
"de": "<b>Typ 2</b> (Mennekes)",
"ca": "<b>Tipus 2</b> (mennekes)"
"ca": "<b>Tipus 2</b> (mennekes)",
"de": "<b>Typ 2</b> (Mennekes)"
},
"hideInAnswer": true,
"icon": {
@ -887,8 +887,8 @@
"then": {
"en": "<b>Type 2 CCS</b> (mennekes)",
"nl": "<b>Type 2 CCS</b> (mennekes)",
"de": "<b>Typ 2 CCS</b> (Mennekes)",
"ca": "<b>CSS Tipus 2</b> (mennekes)"
"ca": "<b>CSS Tipus 2</b> (mennekes)",
"de": "<b>Typ 2 CCS</b> (Mennekes)"
},
"icon": {
"path": "./assets/layers/charging_station/Type2_CCS.svg",
@ -931,8 +931,8 @@
"then": {
"en": "<b>Type 2 CCS</b> (mennekes)",
"nl": "<b>Type 2 CCS</b> (mennekes)",
"de": "<b>Typ 2 CCS</b> (mennekes)",
"ca": "<b>CSS Tipus 2</b> (mennekes)"
"ca": "<b>CSS Tipus 2</b> (mennekes)",
"de": "<b>Typ 2 CCS</b> (mennekes)"
},
"hideInAnswer": true,
"icon": {
@ -1337,7 +1337,8 @@
"socket:schuko",
{
"en": "<b>Schuko wall plug</b> without ground pin (CEE7/4 type F)",
"nl": "<b>Schuko stekker</b> zonder aardingspin (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)"
},
"CEE7_4F.svg",
[
@ -1355,7 +1356,8 @@
"socket:typee",
{
"en": "<b>European wall plug</b> with ground pin (CEE7/4 type E)",
"nl": "<b>Europese stekker</b> met aardingspin (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)"
},
"TypeE.svg",
[
@ -1374,7 +1376,8 @@
"socket:chademo",
{
"en": "<b>Chademo</b>",
"nl": "<b>Chademo</b>"
"nl": "<b>Chademo</b>",
"de": "<b>Chademo-Stecker</b>"
},
"Chademo_type4.svg",
[
@ -1392,7 +1395,8 @@
"socket:type1_cable",
{
"en": "<b>Type 1 with cable</b> (J1772)",
"nl": "<b>Type 1 met kabel</b> (J1772)"
"nl": "<b>Type 1 met kabel</b> (J1772)",
"de": "<b>Typ 1 mit Kabel</b> (J1772)"
},
"Type1_J1772.svg",
[
@ -1412,7 +1416,8 @@
"socket:type1",
{
"en": "<b>Type 1 <i>without</i> cable</b> (J1772)",
"nl": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)"
"nl": "<b>Type 1 <i>zonder</i> kabel</b> (J1772)",
"de": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)"
},
"Type1_J1772.svg",
[
@ -1434,7 +1439,8 @@
"socket:type1_combo",
{
"en": "<b>Type 1 CCS</b> (aka Type 1 Combo)",
"nl": "<b>Type 1 CCS</b> (ook gekend als Type 1 Combo)"
"nl": "<b>Type 1 CCS</b> (ook gekend als Type 1 Combo)",
"de": "<b>Typ 1 CCS</b> (Typ 1 Combo)"
},
"Type1-ccs.svg",
[
@ -1457,7 +1463,8 @@
"socket:tesla_supercharger",
{
"en": "<b>Tesla Supercharger</b>",
"nl": "<b>Tesla Supercharger</b>"
"nl": "<b>Tesla Supercharger</b>",
"de": "<b>Tesla Supercharger</b>"
},
"Tesla-hpwc-model-s.svg",
[
@ -1478,7 +1485,8 @@
"socket:type2",
{
"en": "<b>Type 2</b> (mennekes)",
"nl": "<b>Type 2</b> (mennekes)"
"nl": "<b>Type 2</b> (mennekes)",
"de": "<b>Typ 2</b> (Mennekes)"
},
"Type2_socket.svg",
[
@ -1499,7 +1507,8 @@
"socket:type2_combo",
{
"en": "<b>Type 2 CCS</b> (mennekes)",
"nl": "<b>Type 2 CCS</b> (mennekes)"
"nl": "<b>Type 2 CCS</b> (mennekes)",
"de": "<b>Typ 2 CCS</b> (Mennekes)"
},
"Type2_CCS.svg",
[
@ -1519,7 +1528,8 @@
"socket:type2_cable",
{
"en": "<b>Type 2 with cable</b> (mennekes)",
"nl": "<b>Type 2 met kabel</b> (J1772)"
"nl": "<b>Type 2 met kabel</b> (J1772)",
"de": "<b>Typ 2 mit Kabel</b> (Mennekes)"
},
"Type2_tethered.svg",
[
@ -1540,7 +1550,8 @@
"socket:tesla_supercharger_ccs",
{
"en": "<b>Tesla Supercharger CCS</b> (a branded type2_css)",
"nl": "<b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)"
"nl": "<b>Tesla Supercharger CCS</b> (een type2 CCS met Tesla-logo)",
"de": "<b>Tesla Supercharger CCS</b> (Typ 2 CSS von Tesla)"
},
"Type2_CCS.svg",
[
@ -1560,7 +1571,8 @@
"socket:tesla_destination",
{
"en": "<b>Tesla Supercharger (destination)</b>",
"nl": "<b>Tesla Supercharger (destination)</b>"
"nl": "<b>Tesla Supercharger (destination)</b>",
"de": "<b>Tesla Supercharger (Destination)</b>"
},
"Tesla-hpwc-model-s.svg",
[
@ -1581,7 +1593,8 @@
"socket:tesla_destination",
{
"en": "<b>Tesla supercharger (destination)</b> (A Type 2 with cable branded as tesla)",
"nl": "<b>Tesla supercharger (destination</b> (Een Type 2 met kabel en Tesla-logo)"
"nl": "<b>Tesla supercharger (destination</b> (Een Type 2 met kabel en Tesla-logo)",
"de": "<b>Tesla Supercharger (Destination)</b> (Typ 2 mit Kabel von Tesla)"
},
"Type2_tethered.svg",
[
@ -1602,7 +1615,8 @@
"socket:USB-A",
{
"en": "<b>USB</b> to charge phones and small electronics",
"nl": "<b>USB</b> om GSMs en kleine electronica op te laden"
"nl": "<b>USB</b> om GSMs en kleine electronica op te laden",
"de": "<b>USB</b> zum Aufladen von Handys und kleinen Elektrogeräten"
},
"usb_port.svg",
[
@ -1622,7 +1636,8 @@
"socket:bosch_3pin",
{
"en": "<b>Bosch Active Connect with 3 pins</b> and cable",
"nl": "<b>Bosch Active Connect met 3 pinnen</b> aan een kabel"
"nl": "<b>Bosch Active Connect met 3 pinnen</b> aan een kabel",
"de": "<b> Bosch Active Connect mit 3 Pins </b> und Kabel"
},
"bosch-3pin.svg",
[],
@ -1634,7 +1649,8 @@
"socket:bosch_5pin",
{
"en": "<b>Bosch Active Connect with 5 pins</b> and cable",
"nl": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel"
"nl": "<b>Bosch Active Connect met 5 pinnen</b> aan een kabel",
"de": "<b> Bosch Active Connect mit 5 Pins </b> und Kabel"
},
"bosch-5pin.svg",
[],
@ -1726,7 +1742,8 @@
},
"render": {
"en": "{{description}} outputs at most {canonical({{key}}:current)}",
"nl": "{{description}} levert een stroom van maximaal {canonical({{key}}:current)}"
"nl": "{{description}} levert een stroom van maximaal {canonical({{key}}:current)}",
"de": "{{description}} liefert maximal {canonical({{key}}:current)}"
},
"freeform": {
"key": "{{key}}:current",
@ -1754,11 +1771,13 @@
],
"question": {
"en": "What power output does a single plug of type {{description}} offer?",
"nl": "Welk vermogen levert een enkele stekker van type {{description}}?"
"nl": "Welk vermogen levert een enkele stekker van type {{description}}?",
"de": "Welche Leistung liefert ein einzelner Stecker des Typs {{description}}?"
},
"render": {
"en": "{{description}} outputs at most {canonical({{key}}:output)}",
"nl": "{{description}} levert een vermogen van maximaal {canonical({{key}}:output)}"
"nl": "{{description}} levert een vermogen van maximaal {canonical({{key}}:output)}",
"de": "{{description}} liefert maximal {canonical({{key}}:output)}"
},
"freeform": {
"key": "{{key}}:output",
@ -1768,7 +1787,8 @@
"if": "{{key}}:output={{commonOutput}}",
"then": {
"en": "{{description}} outputs at most {{commonOutput}} A",
"nl": "{{description}} levert een vermogen van maximaal {{commonOutput}} A"
"nl": "{{description}} levert een vermogen van maximaal {{commonOutput}} A",
"de": "{{description}} liefert maximal {{commonOutput}} A"
}
},
"condition": {
@ -1786,8 +1806,8 @@
"question": {
"en": "When is this charging station opened?",
"nl": "Wanneer is dit oplaadpunt beschikbaar??",
"de": "Wann ist die Ladestation geöffnet?",
"ca": "Quan està oberta aquesta estació de càrrega?"
"ca": "Quan està oberta aquesta estació de càrrega?",
"de": "Wann ist die Ladestation geöffnet?"
}
},
"id": "OH"
@ -1797,8 +1817,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?",
"ca": "Hi ha que pagar per utilitzar aquest punt de càrrega?"
"ca": "Hi ha que pagar per utilitzar aquest punt de càrrega?",
"de": "Muss man für die Nutzung dieser Ladestation bezahlen?"
},
"mappings": [
{
@ -1813,8 +1833,8 @@
"then": {
"nl": "Gratis te gebruiken (zonder aan te melden)",
"en": "Free to use (without authenticating)",
"de": "Die Nutzung ist kostenlos, keine Authentifizierung erforderlich",
"ca": "Ús gratuït (sense autentificació)"
"ca": "Ús gratuït (sense autentificació)",
"de": "Die Nutzung ist kostenlos, keine Authentifizierung erforderlich"
}
},
{
@ -1829,8 +1849,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",
"ca": "Ús gratuït, però un s'ha d'autentificar"
"ca": "Ús gratuït, però un s'ha d'autentificar",
"de": "Die Nutzung ist kostenlos, Authentifizierung erforderlich"
}
},
{
@ -1842,8 +1862,8 @@
"then": {
"nl": "Gratis te gebruiken",
"en": "Free to use",
"de": "Kostenlose Nutzung",
"ca": "Ús gratuït"
"ca": "Ús gratuït",
"de": "Kostenlose Nutzung"
},
"hideInAnswer": true
},
@ -1857,8 +1877,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",
"ca": "De pagament, però gratuït per als clients de l'hotel/bar/hospital/... que gestiona l'estació de càrrega"
"ca": "De pagament, però gratuït per als clients de l'hotel/bar/hospital/... que gestiona l'estació de càrrega",
"de": "Die Nutzung ist kostenpflichtig, aber für Kunden des Betreibers der Einrichtung, wie Hotel, Krankenhaus, ... kostenlos"
}
},
{
@ -1871,8 +1891,8 @@
"then": {
"nl": "Betalend",
"en": "Paid use",
"de": "Die Nutzung ist kostenpflichtig",
"ca": "Ús de pagament"
"ca": "Ús de pagament",
"de": "Die Nutzung ist kostenpflichtig"
}
}
]
@ -1882,14 +1902,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?",
"ca": "Quant cal pagar per utilitzar aquesta estació de càrrega?"
"ca": "Quant cal pagar per utilitzar aquesta estació de càrrega?",
"de": "Wie viel muss man für die Nutzung dieser Ladestation bezahlen?"
},
"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>",
"ca": "Utilitzar aquesta estació de càrrega costa <b>{charge}</b>"
"ca": "Utilitzar aquesta estació de càrrega costa <b>{charge}</b>",
"de": "Die Nutzung dieser Ladestation kostet <b>{charge}</b>"
},
"freeform": {
"key": "charge"
@ -1914,8 +1934,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?",
"ca": "Quin tipus d'autenticació hi ha disponible a l'estació de càrrega?"
"ca": "Quin tipus d'autenticació hi ha disponible a l'estació de càrrega?",
"de": "Welche Art der Authentifizierung ist an der Ladestation möglich?"
},
"multiAnswer": true,
"mappings": [
@ -1961,8 +1981,8 @@
"then": {
"en": "Authentication via NFC is available",
"nl": "Aanmelden via NFC is mogelijk",
"de": "Authentifizierung per NFC ist möglich",
"ca": "L'autenticació mitjançant NFC està disponible"
"ca": "L'autenticació mitjançant NFC està disponible",
"de": "Authentifizierung per NFC ist möglich"
}
},
{
@ -1971,8 +1991,8 @@
"then": {
"en": "Authentication via Money Card is available",
"nl": "Aanmelden met Money Card is mogelijk",
"de": "Authentifizierung per Geldkarte ist möglich",
"ca": "L'autenticació mitjançant targeta de pagament està disponible"
"ca": "L'autenticació mitjançant targeta de pagament està disponible",
"de": "Authentifizierung per Geldkarte ist möglich"
}
},
{
@ -1981,8 +2001,8 @@
"then": {
"en": "Authentication via debit card is available",
"nl": "Aanmelden met een betaalkaart is mogelijk",
"de": "Authentifizierung per Kreditkarte ist möglich",
"ca": "L'autenticació mitjançant targeta de debit està disponible"
"ca": "L'autenticació mitjançant targeta de debit està disponible",
"de": "Authentifizierung per Kreditkarte ist möglich"
}
},
{
@ -1991,8 +2011,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",
"ca": "Carregar aquí (també) és possible sense autenticació"
"ca": "Carregar aquí (també) és possible sense autenticació",
"de": "Das Laden ist hier (auch) ohne Authentifizierung möglich"
}
}
],
@ -2031,8 +2051,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?",
"ca": "Quina és la quantitat màxima de temps que es permet permaneixer aquí?"
"ca": "Quina és la quantitat màxima de temps que es permet permaneixer aquí?",
"de": "Wie lange darf man hier maximal parken?"
},
"freeform": {
"key": "maxstay"
@ -2040,8 +2060,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>",
"ca": "Un pot quedar-se com a màxim <b>{canonical(maxstay)}</b>"
"ca": "Un pot quedar-se com a màxim <b>{canonical(maxstay)}</b>",
"de": "Die maximale Parkdauer beträgt <b>{canonical(maxstay)}</b>"
},
"mappings": [
{
@ -2049,8 +2069,8 @@
"then": {
"en": "No timelimit on leaving your vehicle here",
"nl": "Geen maximum parkeertijd",
"de": "Keine Höchstparkdauer",
"ca": "No hi ha límit de temps per a deixar el teu vehicle aquí"
"ca": "No hi ha límit de temps per a deixar el teu vehicle aquí",
"de": "Keine Höchstparkdauer"
}
}
],
@ -2068,14 +2088,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>",
"ca": "Part de la xarxa <b>{network}</b>"
"ca": "Part de la xarxa <b>{network}</b>",
"de": "Teil des Netzwerks <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?",
"ca": "Aquesta estació de càrrega forma part d'una xarxa?"
"ca": "Aquesta estació de càrrega forma part d'una xarxa?",
"de": "Ist diese Ladestation Teil eines Netzwerks?"
},
"freeform": {
"key": "network"
@ -2141,14 +2161,14 @@
"question": {
"en": "Who is the operator of this charging station?",
"nl": "Wie beheert dit oplaadpunt?",
"de": "Wer ist der Betreiber dieser Ladestation?",
"ca": "Qui és l'operadora d'aquesta estació de càrrega?"
"ca": "Qui és l'operadora d'aquesta estació de càrrega?",
"de": "Wer ist der Betreiber dieser Ladestation?"
},
"render": {
"en": "This charging station is operated by {operator}",
"nl": "Wordt beheerd door {operator}",
"de": "Die Station wird betrieben von {operator}",
"ca": "Aquesta estació de càrrega l'opera {operator}"
"ca": "Aquesta estació de càrrega l'opera {operator}",
"de": "Die Station wird betrieben von {operator}"
},
"freeform": {
"key": "operator"
@ -2163,8 +2183,8 @@
"then": {
"en": "Actually, {operator} is the network",
"nl": "Eigenlijk is {operator} het netwerk waarvan het deel uitmaakt",
"de": "Eigentlich ist {operator} das Netzwerk",
"ca": "De fet, {operator} és la xarxa"
"ca": "De fet, {operator} és la xarxa",
"de": "Eigentlich ist {operator} das Netzwerk"
},
"addExtraTags": [
"operator="
@ -2179,14 +2199,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?",
"ca": "A quin número es pot cridar si hi ha algun problema amb aquest punt de càrrega?"
"ca": "A quin número es pot cridar si hi ha algun problema amb aquest punt de càrrega?",
"de": "Welche Nummer kann man anrufen, wenn es ein Problem mit dieser Ladestation gibt?"
},
"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>",
"ca": "En cas de problemes, truqueu a <a href='tel:{phone}'>{phone}</a>"
"ca": "En cas de problemes, truqueu a <a href='tel:{phone}'>{phone}</a>",
"de": "Bei Problemen, anrufen unter <a href='tel:{phone}'>{phone}</a>"
},
"freeform": {
"key": "phone",
@ -2198,14 +2218,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?",
"ca": "Quin és el correu electrònic de l'operadora?"
"ca": "Quin és el correu electrònic de l'operadora?",
"de": "Wie lautet die E-Mail-Adresse des Betreibers?"
},
"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>",
"ca": "En cas de problemes, envia un email a <a href='mailto:{email}'>{email}</a>"
"ca": "En cas de problemes, envia un email a <a href='mailto:{email}'>{email}</a>",
"de": "Bei Problemen senden Sie bitte eine E-Mail an <a href='mailto:{email}'>{email}</a>"
},
"freeform": {
"key": "email",
@ -2253,8 +2273,8 @@
"question": {
"en": "Is this charging point in use?",
"nl": "Is dit oplaadpunt operationeel?",
"de": "Ist die Station in Betrieb?",
"ca": "Està en ús aquest punt de càrrega?"
"ca": "Està en ús aquest punt de càrrega?",
"de": "Ist die Station in Betrieb?"
},
"mappings": [
{
@ -2270,8 +2290,8 @@
"then": {
"en": "This charging station works",
"nl": "Dit oplaadpunt werkt",
"de": "Die Station ist in Betrieb",
"ca": "Aquesta estació de càrrega funciona"
"ca": "Aquesta estació de càrrega funciona",
"de": "Die Station ist in Betrieb"
}
},
{
@ -2287,8 +2307,8 @@
"then": {
"en": "This charging station is broken",
"nl": "Dit oplaadpunt is kapot",
"de": "Die Station ist defekt",
"ca": "Aquesta estació de carrega està trencada"
"ca": "Aquesta estació de carrega està trencada",
"de": "Die Station ist defekt"
}
},
{
@ -2304,8 +2324,8 @@
"then": {
"en": "A charging station is planned here",
"nl": "Hier zal binnenkort een oplaadpunt gebouwd worden",
"de": "Die Station ist erst in Planung",
"ca": "Aquí està prevista una estació de recàrrega"
"ca": "Aquí està prevista una estació de recàrrega",
"de": "Die Station ist erst in Planung"
}
},
{
@ -2337,8 +2357,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",
"ca": "Aquesta estació de recàrrega s'ha desactivat permanentment i ja no s'utilitza, però encara és visible"
"ca": "Aquesta estació de recàrrega s'ha desactivat permanentment i ja no s'utilitza, però encara és visible",
"de": "Die Station ist dauerhaft geschlossen und nicht mehr in Nutzung, aber noch sichtbar"
}
}
]
@ -2348,8 +2368,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?",
"ca": "Cal pagar una taxa d'aparcament mentre es carrega?"
"ca": "Cal pagar una taxa d'aparcament mentre es carrega?",
"de": "Muss man während des Ladens eine Parkgebühr bezahlen?"
},
"mappings": [
{
@ -2357,8 +2377,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",
"ca": "No cal pagar una taxa addicional mentres carrega"
"ca": "No cal pagar una taxa addicional mentres carrega",
"de": "Keine zusätzlichen Parkkosten während des Ladens"
}
},
{
@ -2366,8 +2386,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",
"ca": "Cal pagar una taxa addicional d'aparcament mentres carrega"
"ca": "Cal pagar una taxa addicional d'aparcament mentres carrega",
"de": "Während des Ladens ist eine zusätzliche Parkgebühr zu entrichten"
}
}
],
@ -2497,7 +2517,7 @@
"question": {
"en": "Has a <div style='display: inline-block'><b><b>Type 1 CCS</b> (aka Type 1 Combo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type1-ccs.svg'/></div> connector",
"nl": "Heeft een <div style='display: inline-block'><b><b>Type 1 CCS</b> (ook gekend als Type 1 Combo)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type1-ccs.svg'/></div>",
"de": "Verfügt über einen <div style='display: inline-block'><b>Typ 1 CCS (Typ 1 Combo)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type1-ccs.svg'/></div> Stecker"
"de": "Verfügt über einen <div style='display: inline-block'><b><b>Typ 1 CCS</b> (Typ 1 Combo)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type1-ccs.svg'/></div> Stecker"
},
"osmTags": "socket:type1_combo~*"
},

View file

@ -1,17 +1,14 @@
import { readFileSync, writeFileSync } from "fs";
import { Utils } from "../../../src/Utils";
import ScriptUtils from "../../../scripts/ScriptUtils";
import { LayerConfigJson } from "../../../src/Models/ThemeConfig/Json/LayerConfigJson";
import FilterConfigJson from "../../../src/Models/ThemeConfig/Json/FilterConfigJson";
import {
QuestionableTagRenderingConfigJson
} from "../../../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson";
import RewritableConfigJson from "../../../src/Models/ThemeConfig/Json/RewritableConfigJson";
import { TagRenderingConfigJson } from "../../../src/Models/ThemeConfig/Json/TagRenderingConfigJson";
import { readFileSync, writeFileSync } from "fs"
import { Utils } from "../../../src/Utils"
import ScriptUtils from "../../../scripts/ScriptUtils"
import { LayerConfigJson } from "../../../src/Models/ThemeConfig/Json/LayerConfigJson"
import FilterConfigJson from "../../../src/Models/ThemeConfig/Json/FilterConfigJson"
import RewritableConfigJson from "../../../src/Models/ThemeConfig/Json/RewritableConfigJson"
import { TagRenderingConfigJson } from "../../../src/Models/ThemeConfig/Json/TagRenderingConfigJson"
function colonSplit(value: string): string[] {
return value.split(";").map(v => v.replace(/"/g, '').trim()).filter(s => s !== "");
return value.split(";").map(v => v.replace(/"/g, "").trim()).filter(s => s !== "")
}
function loadCsv(file): {
@ -34,14 +31,14 @@ function loadCsv(file): {
return Utils.NoNull(entries.map(entry => {
const values = entry.split(",").map(str => str.trim())
if (values[0] === undefined || values[0] === "") {
return undefined;
return undefined
}
const v = {}
const colonSeperated = ["commonVoltages", "commonOutputs", "commonCurrents", "countryWhiteList", "countryBlackList", "associatedVehicleTypes", "neverAssociatedWith"]
const descriptionTranslations = new Map<string, string>()
for (let j = 0; j < header.length; j++) {
const key = header[j];
const key = header[j]
if (key.startsWith("description")) {
const language = key.substring("description:".length)
descriptionTranslations.set(language, values[j])
@ -54,10 +51,10 @@ function loadCsv(file): {
}
}
v["description"] = descriptionTranslations
if(v["id"] === ""){
v["id"] = v["key"]
if (v["id"] === "") {
v["id"] = v["key"]
}
return <any>v;
return <any>v
}))
}
@ -70,9 +67,9 @@ function run(file, protojson) {
{
question: {
en: "All connectors",
nl: "Alle types"
}
}
nl: "Alle types",
},
},
]
const entries = loadCsv(file)
@ -82,7 +79,7 @@ function run(file, protojson) {
{
// Add the entities to the 'rewrite-able part'
let specificQuestions: RewritableConfigJson<TagRenderingConfigJson> = <any>proto.tagRenderings.find(tr => tr["rewrite"] !== undefined && !(tr["rewrite"]["into"]?.length > 0));
let specificQuestions: RewritableConfigJson<TagRenderingConfigJson> = <any>proto.tagRenderings.find(tr => tr["rewrite"] !== undefined && !(tr["rewrite"]["into"]?.length > 0))
specificQuestions.rewrite.into = entries.map(e => [
e.id,
e.key,
@ -90,24 +87,24 @@ function run(file, protojson) {
e.image,
e.commonVoltages,
e.commonCurrents,
e.commonOutputs
]);
e.commonOutputs,
])
}
for (let i = 0; i < entries.length; i++) {
const e = entries[i];
const e = entries[i]
const txt = {
en: e.description.get("en"),
nl: e.description.get("nl")
nl: e.description.get("nl"),
}
const json = {
if: `${e.key}=1`,
ifnot: `${e.key}=`,
then: txt,
icon:{
path:"./assets/layers/charging_station/" + e.image,
class:"medium"
}
icon: {
path: "./assets/layers/charging_station/" + e.image,
class: "medium",
},
}
if (e.countryWhiteList.length > 0 && e.countryBlackList.length > 0) {
@ -116,32 +113,32 @@ function run(file, protojson) {
if (e.countryWhiteList.length > 0) {
// This is a 'hideInAnswer', thus _reverse_ logic!
const countries = e.countryWhiteList.map(country => "_country!=" + country) //HideInAnswer if it is in the wrong country
json["hideInAnswer"] = {and: countries} // Should be and, as we want to hide if it does not match any of the countries
json["hideInAnswer"] = { and: countries } // Should be and, as we want to hide if it does not match any of the countries
} else if (e.countryBlackList.length > 0) {
const countries = e.countryBlackList.map(country => "_country=" + country) //HideInAnswer if it is in the wrong country
json["hideInAnswer"] = {or: countries}
json["hideInAnswer"] = { or: countries }
}
if (e.associatedVehicleTypes?.length > 0 && e.associatedVehicleTypes.indexOf("*") < 0 && e.neverAssociatedWith?.length > 0) {
// This plug only occurs if some vehicle specific vehicle type is present.
// IF all of the needed vehicle types are explicitly NO, then we hide this type as well
let associatedWith = {and: [].concat(...e.associatedVehicleTypes.map(neededVehicle => [neededVehicle + "=no"]))}
let associatedWith = { and: [].concat(...e.associatedVehicleTypes.map(neededVehicle => [neededVehicle + "=no"])) }
// We also hide if:
// - One of the neverAssociatedVehiclesTYpes is set to 'yes' AND none of the associated types are set/yes
let neverAssociatedIsSet = {
and: [{
or: e.neverAssociatedWith.map(vehicleType => vehicleType + "=yes")
or: e.neverAssociatedWith.map(vehicleType => vehicleType + "=yes"),
},
...e.associatedVehicleTypes.map(associated => associated + "!=yes")
]
...e.associatedVehicleTypes.map(associated => associated + "!=yes"),
],
}
let conditions = [associatedWith, neverAssociatedIsSet]
if (json["hideInAnswer"] !== undefined) {
conditions.push(json["hideInAnswer"])
}
json["hideInAnswer"] = {or: conditions}
json["hideInAnswer"] = { or: conditions }
}
@ -151,14 +148,14 @@ function run(file, protojson) {
// We add a second time for any amount to trigger a visualisation; but this is not an answer option
const no_ask_json = {
if: {
and:Utils.NoEmpty( [`${e.key}~*`, `${e.key}!=1`, ...e.extraVisualisationCondition.split(";")])
and: Utils.NoEmpty([`${e.key}~*`, `${e.key}!=1`, ...e.extraVisualisationCondition.split(";")]),
},
then: txt,
hideInAnswer: true,
icon:{
icon: {
path: `./assets/layers/charging_station/${e.image}`,
class:"medium"
}
class: "medium",
},
}
overview_question_answers.push(no_ask_json)
@ -168,9 +165,9 @@ function run(file, protojson) {
filterOptions.push({
question: {
en: `Has a ${descrWithImage_en} connector`,
nl: `Heeft een ${descrWithImage_nl}`
nl: `Heeft een ${descrWithImage_nl}`,
},
osmTags: `${e.key}~*`
osmTags: `${e.key}~*`,
})
}
@ -178,25 +175,25 @@ function run(file, protojson) {
"id": "Available_charging_stations (generated)",
"question": {
"en": "Which charging connections are available here?",
"nl": "Welke aansluitingen zijn hier beschikbaar?"
"nl": "Welke aansluitingen zijn hier beschikbaar?",
},
"multiAnswer": true,
"mappings": overview_question_answers
"mappings": overview_question_answers,
}
const insertQuestionsAt = proto.tagRenderings.findIndex(tr => tr["id"] === "$$$")
proto.tagRenderings.splice(insertQuestionsAt, 1, toggles)
if(typeof proto.filter === "string"){
if (typeof proto.filter === "string") {
throw "Filters of a the protojson should be a list of FilterConfigJsons"
}
proto.filter = <FilterConfigJson[]> proto.filter;
proto.filter = <FilterConfigJson[]>proto.filter
proto.tagRenderings.forEach(tr => {
if (typeof tr === "string") {
return;
return
}
if(tr["rewrite"]){
if (tr["rewrite"]) {
return
}
if (tr["id"] === undefined || typeof tr["id"] !== "string") {
@ -207,18 +204,18 @@ function run(file, protojson) {
proto.filter.push({
id: "connection_type",
options: filterOptions
options: filterOptions,
})
const importedUnits = {}
for (const entry of entries) {
importedUnits[entry.key+":voltage"] = "voltage"
importedUnits[entry.key+":current"] = "current"
importedUnits[entry.key+":output"] = { quantity: "power", "denominations":["mW","kW"] }
importedUnits[entry.key + ":voltage"] = "voltage"
importedUnits[entry.key + ":current"] = "current"
importedUnits[entry.key + ":output"] = { quantity: "power", "denominations": ["mW", "kW"] }
}
const extraUnits = [importedUnits
];
const extraUnits = [importedUnits,
]
if (proto["units"] == undefined) {
proto["units"] = []
@ -228,16 +225,17 @@ function run(file, protojson) {
}
// noinspection JSUnusedLocalSymbols
async function queryTagInfo(file, type, clean: ((s: string) => string)) {
for (const e of loadCsv(file)) {
const value = await ScriptUtils.TagInfoHistogram(e.key + ":" + type)
const result = value.data
const counts = new Map<string, number>()
for (const r of result) {
let key = r.value;
let key = r.value
key = clean(key)
key.trim();
if (key.indexOf('-') >= 0) {
key.trim()
if (key.indexOf("-") >= 0) {
continue
}
if (r.fraction < 0.05) {
@ -255,6 +253,7 @@ async function queryTagInfo(file, type, clean: ((s: string) => string)) {
}
}
// noinspection JSUnusedLocalSymbols
/**
* Adds the translations into the 'newConfig' object
* @param origPath
@ -276,7 +275,7 @@ function mergeTranslations(origPath, newConfig: LayerConfigJson) {
}
const applicable = newRenderings.filter(r => r["id"] === oldRenderingName)[0]
if (applicable === undefined) {
continue;
continue
}
// @ts-ignore
Utils.Merge(oldRendering, applicable)

View file

@ -840,10 +840,12 @@
{
"id": "incline",
"question": {
"en": "Does {title()} have an incline?"
"en": "Does {title()} have an incline?",
"de": "Hat {title()} eine Steigung?"
},
"render": {
"en": "This road has an slope of {incline}"
"en": "This road has an slope of {incline}",
"de": "Die Straße hat {incline} Steigung"
},
"freeform": {
"key": "incline",
@ -853,7 +855,8 @@
{
"if": "incline=",
"then": {
"en": "There is (probably) no incline here"
"en": "There is (probably) no incline here",
"de": "Hier gibt es (wahrscheinlich) keine Steigung"
},
"hideInAnswer": true
},
@ -866,7 +869,8 @@
]
},
"then": {
"en": "This road has a slope"
"en": "This road has a slope",
"de": "Die Straße hat eine Steigung"
},
"hideInAnswer": true
}

View file

@ -211,7 +211,8 @@
"id": "type",
"question": {
"en": "What type of drinking water point is this?",
"nl": "Wat voor soort drinkwaterpunt is dit?"
"nl": "Wat voor soort drinkwaterpunt is dit?",
"de": "Um welche Art von Trinkwasserentnahmestelle handelt es sich?"
},
"mappings": [
{
@ -219,7 +220,8 @@
"icon": "./assets/layers/drinking_water/bubbler.svg",
"then": {
"en": "This is a bubbler fountain. A water jet to drink from is sent upwards, typically controlled by a push button.",
"nl": "Dit is een waterhappertje - een drinkwaterfonteintje waarbij een waterstraaltje omhoog spuit. Dit kan permanent werken of door op een drukknop te duwen."
"nl": "Dit is een waterhappertje - een drinkwaterfonteintje waarbij een waterstraaltje omhoog spuit. Dit kan permanent werken of door op een drukknop te duwen.",
"de": "Dies ist ein Sprudelbrunnen. Ein Wasserstrahl zum Trinken wird nach oben gerichtet und in der Regel durch einen Druckknopf gesteuert."
},
"addExtraTags": [
"man_made="
@ -230,7 +232,8 @@
"icon": "./assets/layers/drinking_water/bottle.svg",
"then": {
"en": "This is a bottle refill point where the water is sent downwards, typically controlled by a push button or a motion sensor. Drinking directly from the stream might be very hard or impossible.",
"nl": "Dit is een hervulpunt voor drinkwaterflessen. De waterstraal wordt omlaag gestuurd wanneer op een drukknop geduwd wordt of wanneer er beweging gedetecteerd wordt. Rechtstreeks van de waterstraal drinking kan moeilijk of zelfs onmogelijk zijn."
"nl": "Dit is een hervulpunt voor drinkwaterflessen. De waterstraal wordt omlaag gestuurd wanneer op een drukknop geduwd wordt of wanneer er beweging gedetecteerd wordt. Rechtstreeks van de waterstraal drinking kan moeilijk of zelfs onmogelijk zijn.",
"de": "Dies ist eine Flaschenauffüllstation, an der das Wasser nach unten geleitet wird, in der Regel durch einen Druckknopf oder einen Bewegungssensor gesteuert. Direkt aus dem Wasserstrahl zu trinken, kann sehr schwierig oder unmöglich sein."
},
"addExtraTags": [
"man_made=",
@ -242,7 +245,8 @@
"icon": "./assets/layers/drinking_water/tap.svg",
"then": {
"en": "This is a water tap. The water flows downward and the stream is controlled by a valve or push-button.",
"nl": "Dit is een waterkraan. Het water strooomt naar beneden en het volume wordt door een knop of draaimechanisme geregeld."
"nl": "Dit is een waterkraan. Het water strooomt naar beneden en het volume wordt door een knop of draaimechanisme geregeld.",
"de": "Dies ist ein Wasserhahn. Das Wasser fließt nach unten und der Wasserstrahl wird durch ein Ventil oder einen Druckknopf gesteuert."
},
"addExtraTags": [
"fountain="
@ -302,21 +306,24 @@
"id": "fee",
"question": {
"en": "Is this drinking water point free to use?",
"nl": "Is dit drinkwaterpunt gratis te gebruiken?"
"nl": "Is dit drinkwaterpunt gratis te gebruiken?",
"de": "Kann diese Trinkwasserstelle kostenlos genutzt werden?"
},
"mappings": [
{
"if": "fee=no",
"then": {
"en": "Free to use",
"nl": "Gratis te gebruiken"
"nl": "Gratis te gebruiken",
"de": "Die Nutzung ist kostenlos"
}
},
{
"if": "fee=yes",
"then": {
"en": "One needs to pay to use this drinking water point",
"nl": "Men moet betalen om dit drinkwaterpunt te gebruiken"
"nl": "Men moet betalen om dit drinkwaterpunt te gebruiken",
"de": "Die Nutzung ist kostenpflichtig"
}
}
]
@ -325,21 +332,24 @@
"id": "seasonal",
"question": {
"en": "Is this drinking water point available all year round?",
"nl": "Is dit drinkwaterpunt heel het jaar door beschikbaar?"
"nl": "Is dit drinkwaterpunt heel het jaar door beschikbaar?",
"de": "Ist die Trinkwasserstelle ganzjährig in Betrieb?"
},
"mappings": [
{
"if": "seasonal=no",
"then": {
"en": "This drinking water point is available all around the year",
"nl": "Dit drinkwaterpunt is heel het jaar door beschikbaar"
"nl": "Dit drinkwaterpunt is heel het jaar door beschikbaar",
"de": "Die Trinkwasserstelle ist ganzjährig in Betrieb"
}
},
{
"if": "seasonal=summer",
"then": {
"en": "This drinking water point is only available in summer",
"nl": "Dit drinkwaterpunt is enkel in de zomer beschikbaar"
"nl": "Dit drinkwaterpunt is enkel in de zomer beschikbaar",
"de": "Die Trinkwasserstelle ist nur im Sommer in Betrieb"
}
},
{
@ -347,7 +357,8 @@
"icon": "./assets/layers/drinking_water/no_winter.svg",
"then": {
"en": "This drinking water point is closed during the winter",
"nl": "Dit drinkwaterpunt is gesloten in de winter"
"nl": "Dit drinkwaterpunt is gesloten in de winter",
"de": "Die Trinkwasserstelle ist im Winter nicht in Betrieb"
}
}
]
@ -357,7 +368,8 @@
"override": {
"questionHint": {
"en": "These are the opening hours if the drinking water fountain is operational.",
"nl": "Tijdens deze openingsuren is dit drinkwaterpunt bruikbaar."
"nl": "Tijdens deze openingsuren is dit drinkwaterpunt bruikbaar.",
"de": "Dies sind die Öffnungszeiten des Trinkwasserbrunnens, wenn dieser in Betrieb ist."
},
"+mappings": [
{
@ -397,7 +409,8 @@
},
"then": {
"en": "This drinking water fountain is closed this season. As such, the opening hours are not shown.",
"nl": "Dit drinkwaterpunt is dit seizoen gesloten. De openingsuren worden dus niet weergegeven."
"nl": "Dit drinkwaterpunt is dit seizoen gesloten. De openingsuren worden dus niet weergegeven.",
"de": "Der Trinkwasserbrunnen ist derzeit nicht in Betrieb. Deshalb werden keine Öffnungszeiten angezeigt."
},
"hideInAnswer": true
}
@ -408,7 +421,8 @@
"id": "bench-artwork",
"question": {
"en": "Does this drinking water fountain have an artistic element?",
"nl": "Heeft dit drinkwaterpunt een geintegreerd kunstwerk?"
"nl": "Heeft dit drinkwaterpunt een geintegreerd kunstwerk?",
"de": "Verfügt der Trinkwasserbrunnen über ein künstlerisches Element?"
},
"mappings": [
{
@ -418,14 +432,16 @@
],
"then": {
"en": "This drinking water point has an integrated artwork",
"nl": "Dit drinkwaterpunt heeft een geintegreerd kunstwerk"
"nl": "Dit drinkwaterpunt heeft een geintegreerd kunstwerk",
"de": "Die Trinkwasserstelle hat ein integriertes Kunstwerk"
}
},
{
"if": "not:tourism:artwork=yes",
"then": {
"en": "This drinking water point does not have an integrated artwork",
"nl": "Dit drinkwaterpunt heeft geen geïntegreerd kunstwerk"
"nl": "Dit drinkwaterpunt heeft geen geïntegreerd kunstwerk",
"de": "Die Trinkwasserstelle hat kein integriertes Kunstwerk"
},
"addExtraTags": [
"tourism="
@ -435,14 +451,16 @@
"if": "tourism=",
"then": {
"en": "This drinking water point <span class=\"subtle\">probably</span> doesn't have an integrated artwork",
"nl": "Dit drinkwaterpunt heeft <span class=\"subtle\">waarschijnlijk</span> geen geïntegreerd kunstwerk"
"nl": "Dit drinkwaterpunt heeft <span class=\"subtle\">waarschijnlijk</span> geen geïntegreerd kunstwerk",
"de": "Die Trinkwasserstelle hat <span class=\"subtle\">wahrscheinlich</span> kein integriertes Kunstwerk"
},
"hideInAnswer": true
}
],
"questionHint": {
"en": "E.g. it has an integrated statue or other non-trivial, creative work",
"nl": "Bijvoorbeeld een standbeeld of ander, niet-triviaal kunstwerk"
"nl": "Bijvoorbeeld een standbeeld of ander, niet-triviaal kunstwerk",
"de": "Z.B. eine integrierte Statue oder andere künstlerische Werke"
}
},
{
@ -519,7 +537,8 @@
},
"then": {
"en": "This is a historic, manual water pump where no drinking water can be found",
"nl": "Dit is een historische, manuele waterpomp waar geen drinkwater uitkomt"
"nl": "Dit is een historische, manuele waterpomp waar geen drinkwater uitkomt",
"de": "Dies ist eine historische, manuelle Wasserpumpe, an der kein Trinkwasser zu finden ist"
}
}
]

View file

@ -267,18 +267,18 @@
"cs": "Ve kterých jazycích má tento výtah hmatové písmo (braillovo písmo)?"
},
"render_list_item": {
"en": "This elevator has tactile writing in {language():font-bold}",
"de": "Der Aufzug hat taktile Schrift in {language():font-bold}",
"nl": "Deze lift heeft voelbaar schrift in het {language():font-bold}",
"ca": "Aquest ascensor té l'escriptura tàctil en {language():font-bold}",
"cs": "Tento výtah má hmatové písmo v {language():font-bold}"
"en": "This elevator has tactile writing in {language()}",
"de": "Der Aufzug hat taktile Schrift in {language()}",
"nl": "Deze lift heeft voelbaar schrift in het {language()}",
"ca": "Aquest ascensor té l'escriptura tàctil en {language()}",
"cs": "Tento výtah má hmatové písmo v {language()}"
},
"render_single_language": {
"en": "This elevator has tactile writing in {language():font-bold}",
"de": "Der Aufzug hat taktile Schrift in {language():font-bold}",
"nl": "Deze lift heeft voelbaar schrift in het {language():font-bold}",
"ca": "Aquest ascensor té l'escriptura tàctil en {language():font-bold}",
"cs": "Tento výtah má hmatové písmo v {language():font-bold}"
"en": "This elevator has tactile writing in {language()}",
"de": "Der Aufzug hat taktile Schrift in {language()}",
"nl": "Deze lift heeft voelbaar schrift in het {language()}",
"ca": "Aquest ascensor té l'escriptura tàctil en {language()}",
"cs": "Tento výtah má hmatové písmo v {language()}"
}
}
}
@ -330,18 +330,18 @@
"cs": "Ve kterých jazycích má tento výtah hlasový výstup?"
},
"render_list_item": {
"en": "This elevator has speech output in {language():font-bold}",
"nl": "Deze lift heeft gesproken tekst in het {language():font-bold}",
"de": "Der Aufzug hat eine Sprachausgabe in {language():font-bold}",
"ca": "Aquest ascensor té sortida de veu en {language():font-bold}",
"cs": "Tento výtah má hlasový výstup v {language():font-bold}"
"en": "This elevator has speech output in {language()}",
"nl": "Deze lift heeft gesproken tekst in het {language()}",
"de": "Der Aufzug hat eine Sprachausgabe in {language()}",
"ca": "Aquest ascensor té sortida de veu en {language()}",
"cs": "Tento výtah má hlasový výstup v {language()}"
},
"render_single_language": {
"en": "This elevator has speech output in {language():font-bold}",
"nl": "Deze lift heeft gesproken tekst in het {language():font-bold}",
"de": "Der Aufzug hat eine Sprachausgabe in {language():font-bold}",
"ca": "Aquest ascensor té sortida de veu en {language():font-bold}",
"cs": "Tento výtah má hlasový výstup v {language():font-bold}"
"en": "This elevator has speech output in {language()}",
"nl": "Deze lift heeft gesproken tekst in het {language()}",
"de": "Der Aufzug hat eine Sprachausgabe in {language()}",
"ca": "Aquest ascensor té sortida de veu en {language()}",
"cs": "Tento výtah má hlasový výstup v {language()}"
}
}
}

View file

@ -737,7 +737,8 @@
"if": "diet:vegetarian=on_demand",
"then": {
"en": "Some dishes might be adapted to a vegetarian version, but this should be demanded",
"nl": "Sommige gerechten kunnen op vraag vegetarisch gemaakt worden"
"nl": "Sommige gerechten kunnen op vraag vegetarisch gemaakt worden",
"de": "Einige Gerichte können auf Nachfrage in eine vegetarische Version umgewandelt werden"
}
}
],
@ -811,7 +812,8 @@
"if": "diet:vegan=on_demand",
"then": {
"en": "Some dishes might be adapted to a vegan version if asked for",
"nl": "Op vraag kan een veganistische variant van een gerecht gemaakt worden"
"nl": "Op vraag kan een veganistische variant van een gerecht gemaakt worden",
"de": "Einige Gerichte können auf Nachfrage in eine vegane Version umgewandelt werden"
}
}
],

View file

@ -308,10 +308,14 @@
[
"media_studio",
{
"en": "a multimedia studio"
"en": "a multimedia studio",
"nl": "een multimedia-studio",
"de": "ein Multimediastudio"
},
{
"en": "multimedia studio"
"en": "multimedia studio",
"nl": "multimedia-studio",
"de": "Multimediastudio"
},
"./assets/layers/hackerspace/media_studio.svg",
false
@ -319,10 +323,14 @@
[
"sewing_machine",
{
"en": "a sewing machine"
"en": "a sewing machine",
"de": "eine Nähmaschine",
"nl": "een naaimachine"
},
{
"en": "sewing machine"
"en": "sewing machine",
"de": "Nähmaschine",
"nl": "naaimachine"
},
"./assets/layers/hackerspace/sewing_machine.svg",
true
@ -330,10 +338,14 @@
[
"workshop:wood",
{
"en": "a woodworking workshop"
"en": "a woodworking workshop",
"nl": "een houtbewerkingsatelier",
"de": "eine Holzwerkstatt"
},
{
"en": "woodworking workshop"
"en": "woodworking workshop",
"nl": "houtbewerkingsatelier",
"de": "Holzwerkstatt"
},
"./assets/layers/hackerspace/woodworking.svg",
false
@ -341,10 +353,14 @@
[
"workshop:ceramics",
{
"en": "a ceramics workshop"
"en": "a ceramics workshop",
"nl": "een keramiekatelier",
"de": "eine Keramikwerkstatt"
},
{
"en": "ceramics workshop"
"en": "ceramics workshop",
"nl": "keramiekatelier",
"de": "Keramikwerkstatt"
},
"./assets/layers/hackerspace/ceramics.svg",
false
@ -352,10 +368,14 @@
[
"workshop:metal",
{
"en": "a metal workshop"
"en": "a metal workshop",
"nl": "een metaalatelier",
"de": "eine Metallwerkstatt"
},
{
"en": "metal workshop"
"en": "metal workshop",
"nl": "metaalatelier",
"de": "Metallwerkstatt"
},
"./assets/layers/hackerspace/metal.svg",
false
@ -363,10 +383,14 @@
[
"bicycle:diy",
{
"en": "a bicycle repair workshop"
"en": "a bicycle repair workshop",
"nl": "een fietsherstelplaats",
"de": "eine Fahrradwerkstatt"
},
{
"en": "bicycle repair workshop"
"en": "bicycle repair workshop",
"nl": "fietsherstelplaats",
"de": "Fahrradwerkstatt"
},
"./assets/layers/hackerspace/bicycle.svg",
false

View file

@ -547,6 +547,10 @@
},
"images"
],
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
},
"units": [
{
"fire_hydrant:diameter": {
@ -556,9 +560,5 @@
]
}
}
],
"allowMove": {
"enableRelocation": false,
"enableImproveAccuracy": true
}
]
}

View file

@ -81,8 +81,6 @@
"condition": {
"or": [
"opening_hours~*",
"seasonal=",
"seasonal=no",
{
"or": [
{
@ -127,7 +125,8 @@
"text": "<img textmode='📞' alt='phone' src='./assets/layers/questions/phone.svg'/>",
"arialabel": {
"en": "phone",
"nl": "Telefoneer"
"nl": "Telefoneer",
"de": "Telefon"
}
}
},
@ -142,7 +141,8 @@
"text": "<img textmode='📞' alt='phone' src='./assets/layers/questions/phone.svg'/>",
"arialabel": {
"en": "phone",
"nl": "Telefoneer"
"nl": "Telefoneer",
"de": "Telefon"
}
}
}
@ -234,7 +234,8 @@
"href": "https://openstreetmap.org/{id}",
"arialabel": {
"en": "Open on openstreetmap.org",
"nl": "Bekijk op openstreetmap.org"
"nl": "Bekijk op openstreetmap.org",
"de": "Auf openstreetmap.org öffnen"
}
}
},
@ -253,7 +254,8 @@
"href": "{_backend}/{id}",
"arialabel": {
"en": "Open on openstreetmap.org",
"nl": "Bekijk op openstreetmap.org"
"nl": "Bekijk op openstreetmap.org",
"de": "Auf openstreetmap.org öffnen"
}
}
}

View file

@ -0,0 +1,80 @@
{
"id": "love_hotel",
"name": {
"en": "Love hotels"
},
"description": {
"en": "A love hotel is a type of short-stay hotel found around the world operated primarily for the purpose of allowing guests privacy for sexual activities"
},
"source": {
"osmTags": "amenity=love_hotel"
},
"minzoom": 10,
"title": {
"render": {
"en": "Love Hotel <i>{name}</i>"
}
},
"pointRendering": [
{
"location": [
"point",
"centroid"
],
"marker": [
{
"icon": "circle",
"color": "white"
},
{
"icon": "ring",
"color": "blue"
}
]
},
{
"location": [
"point",
"centroid"
],
"marker": [
{
"icon": "./assets/layers/hotel/hotel.svg"
}
],
"iconSize": "27,27"
}
],
"lineRendering": [],
"presets": [
{
"title": {
"en": "a love hotel"
},
"description": {
"en": "A love hotel is a type of short-stay hotel found around the world operated primarily for the purpose of allowing guests privacy for sexual activities."
},
"tags": [
"amenity=love_hotel"
]
}
],
"tagRenderings": [
"images",
"reviews",
{
"id": "name",
"question": {
"en": "What is the name of this love hotel?"
},
"render": {
"en": "This love hotel is named <b>{name}</b>"
},
"freeform": {
"key": "name"
}
},
"contact"
],
"credits": "Asteliks"
}

View file

@ -56,7 +56,8 @@
{
"ariaLabel": {
"en": "See on OpenStreetMap.org",
"nl": "Bekijk op OpenStreetMap.org"
"nl": "Bekijk op OpenStreetMap.org",
"de": "Auf OpenStreetMap.org ansehen"
},
"render": "<a href='https://openstreetmap.org/note/{id}' target='_blank'><img src='./assets/svg/osm-logo-us.svg'></a>"
}

View file

@ -273,14 +273,16 @@
"if": "surface=tartan",
"then": {
"en": "The surface is tartan - a synthetic, springy surface typically seen on athletic pistes",
"nl": "De ondergrond bestaat uit Tartan - een synthetisch, elastisch en poreus materiaal dat je ook vindt op atletiekpistes"
"nl": "De ondergrond bestaat uit Tartan - een synthetisch, elastisch en poreus materiaal dat je ook vindt op atletiekpistes",
"de": "Der Belag ist aus Tartan - ein synthetischer, federnder Belag, der typischerweise auf Sportbahnen zu finden ist"
}
},
{
"if": "surface=rubber",
"then": {
"en": "The surface is made from rubber, such as rubber tiles, rubber mulch or a big rubber area",
"nl": "De ondergrond bestaat uit rubber, zoals rubberen tegels, rubber snippers of een groot rubberen oppervlak"
"nl": "De ondergrond bestaat uit rubber, zoals rubberen tegels, rubber snippers of een groot rubberen oppervlak",
"de": "Die Oberfläche besteht aus Gummi, z. B. aus Gummifliesen, Gummimulch oder einer großen Gummifläche"
}
}
],

View file

@ -193,7 +193,8 @@
},
"editButtonAriaLabel": {
"en": "Edit phone number",
"nl": "Pas telefoonnummer aan"
"nl": "Pas telefoonnummer aan",
"de": "Telefonnummer bearbeiten"
}
},
{
@ -276,7 +277,8 @@
},
"editButtonAriaLabel": {
"en": "Edit email address",
"nl": "Pas emailadres aan"
"nl": "Pas emailadres aan",
"de": "E-Mail Adresse bearbeiten"
}
},
{
@ -330,7 +332,8 @@
],
"editButtonAriaLabel": {
"en": "Edit website",
"nl": "Pas website aan"
"nl": "Pas website aan",
"de": "Webseite bearbeiten"
}
},
{
@ -2629,7 +2632,8 @@
},
"after": {
"en": "Scan this code to open this location on another device",
"nl": "Scan deze code om deze locatie op een ander apparaat te zien"
"nl": "Scan deze code om deze locatie op een ander apparaat te zien",
"de": "Scannen Sie den Code, um diesen Ort auf einem anderen Gerät zu öffnen"
}
}
},
@ -2644,7 +2648,8 @@
"type": "share_link",
"text": {
"en": "Share this location",
"nl": "Deel deze locatie"
"nl": "Deel deze locatie",
"de": "Standort teilen"
}
}
}

View file

@ -435,12 +435,12 @@
"cs": "V této škole se používají následující jazyky:{list()}"
},
"render_single_language": {
"en": "{language():font-bold} is the main language of this school",
"de": "{language():font-bold} ist die Hauptsprache der Schule",
"ca": "{language():font-bold} és la llengua principal d'aquesta escola",
"fr": "{language():font-bold} est la langue principale dans cette école",
"pl": "Język {language():font-bold} jest głównym językiem używanym w tej szkole",
"cs": "{language():font-bold} je hlavním jazykem této školy"
"en": "{language()} is the main language of this school",
"de": "{language()} ist die Hauptsprache der Schule",
"ca": "{language()} és la llengua principal d'aquesta escola",
"fr": "{language()} est la langue principale dans cette école",
"pl": "Język {language()} jest głównym językiem używanym w tej szkole",
"cs": "{language()} je hlavním jazykem této školy"
},
"question": {
"en": "What is the main language of this school?<div class='subtle'>What language is spoken with the students in non-language related courses and with the administration?</div>",

View file

@ -109,6 +109,21 @@
"override": {
"render": "./assets/layers/id_presets/maki-shop.svg",
"+mappings": [
{
"#": "Layer icon rendering",
"if": {
"or": [
"shop=yes",
{
"and": [
"shop!=yes",
"id="
]
}
]
},
"then": "./assets/layers/id_presets/maki-shop.svg"
},
{
"if": {
"or": [
@ -128,11 +143,6 @@
{
"if": "craft=key_cutter",
"then": "./assets/layers/id_presets/fas-key.svg"
},
{
"#": "Layer icon rendering",
"if": "id=",
"then": "./assets/layers/id_presets/maki-shop.svg"
}
]
}
@ -206,7 +216,7 @@
"en": "You can specify later on what this shop sells.",
"ca": "Podeu especificar més endavant el que ven aquesta botiga.",
"cs": "Přidat nový obchod",
"de": "Ein neues Geschäft hinzufügen",
"de": "Sie können später angeben, was das Geschäft verkauft.",
"eo": "Enmeti novan butikon",
"es": "Añadir una nueva tienda",
"fr": "Ajouter un nouveau magasin",

View file

@ -475,7 +475,8 @@
"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",
"ca": "La superfície d'aquesta pista és Tartan, una superfície sintètica, lleugerament molla i porosa"
"ca": "La superfície d'aquesta pista és Tartan, una superfície sintètica, lleugerament molla i porosa",
"de": "Der Belag dieser Laufbahn ist Tartan, ein synthetischer, leicht federnder, poröser Belag"
}
}
],

View file

@ -205,18 +205,18 @@
"cs": "Ve kterých jazycích existuje hmatové písmo (braillské písmo) pro navigaci? <img src='./assets/layers/stairs/Braille_stairs.jpg' style='height: 300px; width: auto; display: block;' />"
},
"render_list_item": {
"en": "These stairs have tactile writing in {language():font-bold}",
"de": "Die Treppe hat taktile Schrift in {language():font-bold}",
"nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}",
"ca": "Aquestes escales tenen escriptura tàctil en {language():font-bold}",
"cs": "Tyto schody mají hmatové písmo v {language():font-bold}"
"en": "These stairs have tactile writing in {language()}",
"de": "Die Treppe hat taktile Schrift in {language()}",
"nl": "Deze trap heeft voelbaar schrijft in {language()}",
"ca": "Aquestes escales tenen escriptura tàctil en {language()}",
"cs": "Tyto schody mají hmatové písmo v {language()}"
},
"render_single_language": {
"en": "These stairs have tactile writing in {language():font-bold}",
"de": "Die Treppe hat taktile Schrift in {language():font-bold}",
"nl": "Deze trap heeft voelbaar schrijft in {language():font-bold}",
"ca": "Aquestes escales tenen escriptura tàctil en {language():font-bold}",
"cs": "Tyto schody mají hmatové písmo v {language():font-bold}"
"en": "These stairs have tactile writing in {language()}",
"de": "Die Treppe hat taktile Schrift in {language()}",
"nl": "Deze trap heeft voelbaar schrijft in {language()}",
"ca": "Aquestes escales tenen escriptura tàctil en {language()}",
"cs": "Tyto schody mají hmatové písmo v {language()}"
}
}
}
@ -294,7 +294,8 @@
"id": "incline",
"render": {
"en": "These stairs have an incline of {incline}",
"ca": "Aquestes escales tenen una inclinació de {incline}"
"ca": "Aquestes escales tenen una inclinació de {incline}",
"de": "Die Treppe hat eine Steigung von {incline}"
},
"freeform": {
"key": "incline",
@ -302,14 +303,16 @@
},
"question": {
"en": "What is the incline of these stairs?",
"ca": "Quina és la inclinació d'aquestes escales?"
"ca": "Quina és la inclinació d'aquestes escales?",
"de": "Welche Steigung hat die Treppe?"
},
"mappings": [
{
"if": "incline=up",
"then": {
"en": "The upward direction is {direction_absolute()}",
"ca": "La direcció ascendent és {direction_absolute()}"
"ca": "La direcció ascendent és {direction_absolute()}",
"de": "Die Aufwärtsrichtung ist {direction_absolute()}"
},
"hideInAnswer": true
},
@ -317,7 +320,8 @@
"if": "incline=down",
"then": {
"en": "The downward direction is {direction_absolute()}",
"ca": "La direcció descendent és {direction_absolute()}"
"ca": "La direcció descendent és {direction_absolute()}",
"de": "Die Abwärtsrichtung ist {direction_absolute()}"
},
"hideInAnswer": true
}

View file

@ -0,0 +1 @@
<svg xmlns:x="http://ns.adobe.com/Extensibility/1.0/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:graph="http://ns.adobe.com/Graphs/1.0/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve"><switch><foreignObject requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/" x="0" y="0" width="1" height="1"></foreignObject><g i:extraneous="self"><path d="M64.5,19.8c0,7.8-6.3,14.1-14.1,14.1c-7.8,0-14.1-6.3-14.1-14.1c0-7.8,6.3-14.1,14.1-14.1C58.2,5.7,64.5,12,64.5,19.8"></path><rect x="36.5" y="35.5" width="27.8" height="25.8"></rect><rect x="51.3" y="35" transform="matrix(0.7233 -0.6905 0.6905 0.7233 -9.7256 56.2976)" width="28.2" height="10.6"></rect><path d="M80.8,30.6c0,2.9-2.4,5.3-5.3,5.3c-2.9,0-5.3-2.4-5.3-5.3c0-2.9,2.4-5.3,5.3-5.3C78.4,25.3,80.8,27.7,80.8,30.6"></path><rect x="20.5" y="35.2" transform="matrix(-0.7233 -0.6905 0.6905 -0.7233 31.7259 93.5842)" width="28.2" height="10.6"></rect><path d="M19.2,30.8c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3C21.6,25.5,19.2,27.8,19.2,30.8"></path><polygon points="37.5,84.2 27.5,75.5 36.5,65.2 46.6,73.8 "></polygon><path d="M39.4,79.5c0,3.7-3,6.7-6.7,6.7c-3.7,0-6.7-3-6.7-6.7c0-3.7,3-6.7,6.7-6.7C36.4,72.9,39.4,75.9,39.4,79.5"></path><rect x="30.7" y="78.8" transform="matrix(0.7722 0.6354 -0.6354 0.7722 62.1317 -4.37)" width="12.9" height="11.4"></rect><path d="M47.8,88.6c0,3.2-2.6,5.7-5.7,5.7c-3.2,0-5.7-2.6-5.7-5.7c0-3.2,2.6-5.7,5.7-5.7C45.3,82.8,47.8,85.4,47.8,88.6"></path><polygon points="63.4,84.2 73.4,75.5 64.2,65.2 54.4,73.8 "></polygon><path d="M61.5,79.5c0,3.7,3,6.7,6.7,6.7c3.7,0,6.7-3,6.7-6.7c0-3.7-3-6.7-6.7-6.7C64.4,72.9,61.5,75.9,61.5,79.5"></path><rect x="57.3" y="78.8" transform="matrix(-0.7722 0.6354 -0.6354 -0.7722 166.6073 109.205)" width="12.9" height="11.4"></rect><path d="M53,88.6c0,3.2,2.6,5.7,5.7,5.7c3.2,0,5.7-2.6,5.7-5.7c0-3.2-2.6-5.7-5.7-5.7C55.6,82.8,53,85.4,53,88.6"></path><rect x="36.5" y="61.1" width="1.2" height="5.4"></rect><rect x="42.1" y="72.7" width="14.6" height="1.2"></rect><rect x="63.1" y="61.1" width="1.2" height="5.4"></rect></g></switch></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Bianca Teixeira
SPDX-License-Identifier: CC0-1.0

View file

@ -1,4 +1,14 @@
[
{
"path": "baby.svg",
"license": "CC0-1.0",
"authors": [
"Bianca Teixeira"
],
"sources": [
"https://commons.wikimedia.org/wiki/File:Baby_(75158)_-_The_Noun_Project.svg"
]
},
{
"path": "toilets.svg",
"license": "CC0-1.0",

View file

@ -576,7 +576,8 @@
"ca": "Hi ha un canviador per a nadons",
"cs": "Přebalovací pult je k dispozici"
},
"if": "changing_table=yes"
"if": "changing_table=yes",
"icon": "./assets/layers/toilet/baby.svg"
},
{
"if": "changing_table=no",
@ -610,10 +611,10 @@
"cs": "Kde je umístěn přebalovací pult?"
},
"render": {
"en": "The changing table is located at {changing_table:location}",
"de": "Die Wickeltabelle befindet sich in {changing_table:location}",
"en": "A changing table is located at {changing_table:location}",
"de": "Ein Wickeltisch befindet sich in {changing_table:location}",
"fr": "Emplacement de la table à langer : {changing_table:location}",
"nl": "De luiertafel bevindt zich in {changing_table:location}",
"nl": "Er bevindt zich een luiertafel in {changing_table:location}",
"it": "Il fasciatoio si trova presso {changing_table:location}",
"es": "El cambiador está en {changing_table:location}",
"da": "Puslebordet er placeret på {changing_table:location}",
@ -632,10 +633,10 @@
"mappings": [
{
"then": {
"en": "The changing table is in the toilet for women. ",
"de": "Der Wickeltisch befindet sich in der Damentoilette. ",
"en": "A changing table is in the toilet for women",
"de": "Ein Wickeltisch ist in der Damentoilette vorhanden",
"fr": "La table à langer est dans les toilettes pour femmes. ",
"nl": "De luiertafel bevindt zich in de vrouwentoiletten ",
"nl": "Er bevindt zich een luiertafel in de vrouwentoiletten ",
"it": "Il fasciatoio è nei servizi igienici femminili. ",
"da": "Puslebordet er på toilettet til kvinder. ",
"ca": "El canviador està al lavabo per a dones. ",
@ -645,10 +646,10 @@
},
{
"then": {
"en": "The changing table is in the toilet for men. ",
"de": "Der Wickeltisch befindet sich in der Herrentoilette. ",
"en": "A changing table is in the toilet for men",
"de": "Ein Wickeltisch ist in der Herrentoilette vorhanden",
"fr": "La table à langer est dans les toilettes pour hommes. ",
"nl": "De luiertafel bevindt zich in de herentoiletten ",
"nl": "Er bevindt zich een luiertafel in de herentoiletten ",
"it": "Il fasciatoio è nei servizi igienici maschili. ",
"ca": "El canviador està al lavabo per a homes. ",
"cs": "Přebalovací pult je na pánské toaletě. "
@ -658,10 +659,10 @@
{
"if": "changing_table:location=wheelchair_toilet",
"then": {
"en": "The changing table is in the toilet for wheelchair users. ",
"de": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. ",
"en": "A changing table is in the toilet for wheelchair users",
"de": "Ein Wickeltisch ist in der barrierefreien Toilette vorhanden",
"fr": "La table à langer est dans les toilettes pour personnes à mobilité réduite. ",
"nl": "De luiertafel bevindt zich in de rolstoeltoegankelijke toilet ",
"nl": "Er bevindt zich een luiertafel in de rolstoeltoegankelijke toilet ",
"it": "Il fasciatoio è nei servizi igienici per persone in sedia a rotelle. ",
"da": "Puslebordet er på toilettet for kørestolsbrugere. ",
"ca": "El canviador està al lavabo per a usuaris de cadira de rodes. ",
@ -671,10 +672,10 @@
{
"if": "changing_table:location=dedicated_room",
"then": {
"en": "The changing table is in a dedicated room. ",
"de": "Der Wickeltisch befindet sich in einem eigenen Raum. ",
"en": "A changing table is in a dedicated room",
"de": "Ein Wickeltisch befindet sich in einem eigenen Raum",
"fr": "La table à langer est dans un espace dédié. ",
"nl": "De luiertafel bevindt zich in een daartoe voorziene kamer ",
"nl": "Er bevindt zich een luiertafel in een daartoe voorziene kamer ",
"it": "Il fasciatoio è in una stanza dedicata. ",
"es": "El cambiador está en una habitación dedicada ",
"da": "Vuggestuen står i et særligt rum. ",

View file

@ -1,7 +1,8 @@
{
"id": "unit",
"description": {
"en": "Library layer with all common units. Units can _only_ be imported from this file."
"en": "Library layer with all common units. Units can _only_ be imported from this file.",
"de": "Bibliotheksebene mit allen gängigen Einrichtungen. Einrichtungen können _nur_ aus dieser Datei importiert werden."
},
"source": "special:library",
"pointRendering": null,
@ -115,7 +116,8 @@
],
"human": {
"en": "{quantity} Volt",
"nl": "{quantity} volt"
"nl": "{quantity} volt",
"de": "{quantity} Volt"
}
}
],
@ -135,7 +137,8 @@
"human": {
"en": "{quantity} A",
"nl": "{quantity} A",
"ca": "{quantity} A"
"ca": "{quantity} A",
"de": "{quantity} A"
}
}
],
@ -202,7 +205,8 @@
"humanSingular": {
"en": "one centimeter",
"nl": "één centimeter",
"ca": "un centímetre"
"ca": "un centímetre",
"de": "ein Zentimeter"
}
},
{
@ -337,12 +341,14 @@
"human": {
"en": "{quantity} minutes",
"nl": "{quantity} minuten",
"ca": "{quantity} minuts"
"ca": "{quantity} minuts",
"de": "{quantity} Minuten"
},
"humanSingular": {
"en": "one minute",
"nl": "één minuut",
"ca": "un minut"
"ca": "un minut",
"de": "eine Minute"
}
},
{
@ -360,12 +366,14 @@
"human": {
"en": "{quantity} hours",
"nl": "{quantity} uren",
"ca": "{quantity} hores"
"ca": "{quantity} hores",
"de": "{quantity} Stunden"
},
"humanSingular": {
"en": "one hour",
"nl": "één uur",
"ca": "una hora"
"ca": "una hora",
"de": "eine Stunde"
}
},
{
@ -380,11 +388,13 @@
"human": {
"en": "{quantity} days",
"nl": "{quantity} day",
"ca": "{quantity} dies"
"ca": "{quantity} dies",
"de": "{quantity} Tage"
},
"humanSingular": {
"en": "one day",
"nl": "één dag"
"nl": "één dag",
"de": "ein Tag"
}
}
]

View file

@ -49,9 +49,10 @@
"icon": "./assets/layers/usersettings/translate_disabled.svg",
"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.²",
"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.",
"cs": "Jazyk byl nastaven pomocí parametru URL a uživatel jej nemůže nastavit.²"
"cs": "Jazyk byl nastaven pomocí parametru URL a uživatel jej nemůže nastavit.²",
"nl": "De taal werd ingesteld via een URL-parameter en kan niet manueel ingesteld worden."
}
}
]
@ -82,9 +83,10 @@
"type": "link",
"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",
"de": "<b class='alert'>Sie haben {_unreadMessages} Nachrichten</b><br/>Posteingang öffnen",
"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"
"cs": "<b class='alert'>Máte {_unreadMessages}</b><br/>Otevřít schránku",
"nl": "<b class='alert'>Je hebt {_unreadMessages} ongelezen berichten</b><br/>Ga naar je inbox"
},
"href": "{_backend}/messages/inbox"
}
@ -101,7 +103,8 @@
"en": "Open your settings on OpenStreetMap.org",
"de": "Öffne Deine Einstellungen auf OpenStreetMap.org",
"ca": "Obriu la vostra configuració a OpenStreetMap.org",
"cs": "Otevřít vaše nastavení na OpenStreetMap.org"
"cs": "Otevřít vaše nastavení na OpenStreetMap.org",
"nl": "Open je instellingen op OpenStreetMap.org"
},
"href": "{_backend}/account/edit"
}
@ -116,7 +119,9 @@
{
"id": "a11y-features",
"question": {
"en": "What accessibility features should be applied?"
"en": "What accessibility features should be applied?",
"nl": "Wanneer moet de toegankelijkheidsmode ingeschakeld worden?",
"de": "Welche Barrierefrei-Funktionen sollen angewendet werden?"
},
"mappings": [
{
@ -124,20 +129,26 @@
"alsoShowIf": "mapcomplete-a11y=",
"then": {
"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"
"ca": "Activar les funcions d'accessibilitat quan s'utilitzen les tecles de fletxa per navegar pel mapa",
"nl": "Schakel toegankelijkheidsmode aan wanneer op de pijltjestoetsen wordt geduwd om de kaart te bewegen",
"de": "Barrierefrei-Modus aktivieren, wenn Pfeiltasten zum Navigieren in der Karte verwendet werden"
}
},
{
"if": "mapcomplete-a11y=always",
"then": {
"en": "Always enable accessibility features",
"ca": "Sempre habilita les característiques d'accessibilitat"
"ca": "Sempre habilita les característiques d'accessibilitat",
"nl": "Schakel de toegankelijkheidsmode altijd aan",
"de": "Barrierefrei-Modus immer aktivieren"
}
},
{
"if": "mapcomplete-a11y=never",
"then": {
"en": "Never enable accessibility features"
"en": "Never enable accessibility features",
"nl": "Gebruik geen toegankelijkheidsmode",
"de": "Barrierefrei-Modus niemals aktivieren"
}
}
]
@ -407,7 +418,8 @@
"question": {
"en": "Should a crosshair be shown in the center of the display?",
"cs": "Měl by se uprostřed displeje zobrazovat kříž?",
"de": "Soll ein Fadenkreuz in der Mitte des Bildschirms angezeigt werden?"
"de": "Soll ein Fadenkreuz in der Mitte des Bildschirms angezeigt werden?",
"nl": "Moet er een kruisje getoond worden in het centrum van je display?"
},
"questionHint": {
"en": "This can help to accurately position a new element",
@ -442,7 +454,8 @@
"en": "Should north always be up?",
"de": "Soll Norden immer oben sein?",
"ca": "El nord hauria d'estar sempre amunt?",
"cs": "Měl by být sever vždy nahoře?"
"cs": "Měl by být sever vždy nahoře?",
"nl": "Moet het noorden altijd naar boven getoond worden?"
},
"mappings": [
{
@ -464,7 +477,8 @@
"de": "Norden immer nach oben zeigen lassen",
"fr": "Toujours garder le nord en haut",
"ca": "Mantingueu sempre el nord apuntant cap amunt",
"cs": "Sever vždy směřujte nahoru"
"cs": "Sever vždy směřujte nahoru",
"nl": "Hou het noorden altijd naar boven"
}
}
]
@ -481,7 +495,8 @@
"de": "Laden Sie den privaten Schlüssel für Ihr Mangrove-Konto herunter",
"da": "Hent den private nøgle til din Mangrove-konto",
"ca": "Baixeu la clau privada del vostre compte de Mangrove",
"cs": "Stáhnout soukromý klíč pro Mangrove účet"
"cs": "Stáhnout soukromý klíč pro Mangrove účet",
"nl": "Download de private sleutel van je Mangrove-account"
}
},
"after": {

View file

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" width="375px" height="375px" viewBox="0 0 375 375" version="1.1">
<g id="surface1">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 94.136719 118.066406 L 102.421875 126.351562 L 127.28125 101.492188 L 118.996094 93.207031 Z M 94.136719 118.066406 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(53.333336%,52.549022%,57.647061%);fill-opacity:1;" d="M 102.421875 84.917969 L 94.136719 93.207031 L 106.566406 105.636719 L 123.140625 89.0625 C 127.707031 84.496094 127.710938 77.058594 123.140625 72.488281 L 98.28125 47.628906 C 93.710938 43.058594 86.273438 43.0625 81.707031 47.628906 L 77.5625 51.773438 L 102.421875 76.632812 C 104.710938 78.921875 104.710938 82.632812 102.421875 84.917969 Z M 102.421875 84.917969 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(71.372551%,72.156864%,74.509805%);fill-opacity:1;" d="M 94.136719 93.207031 L 85.851562 101.492188 C 83.5625 103.78125 79.851562 103.78125 77.5625 101.492188 L 52.703125 76.632812 L 48.5625 80.777344 C 43.992188 85.34375 43.992188 92.777344 48.5625 97.347656 L 73.421875 122.207031 C 77.992188 126.777344 85.425781 126.777344 89.992188 122.207031 L 94.136719 118.066406 L 106.566406 105.636719 Z M 94.136719 93.207031 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 272.292969 97.347656 L 235.003906 134.636719 L 210.144531 109.777344 L 247.433594 72.488281 Z M 272.292969 97.347656 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 214.289062 39.34375 L 189.429688 64.203125 C 182.578125 71.058594 182.578125 82.207031 189.429688 89.0625 L 201.859375 101.492188 L 239.148438 64.203125 Z M 214.289062 39.34375 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 317.871094 51.773438 L 280.582031 89.0625 L 255.722656 64.203125 L 293.011719 26.914062 Z M 317.871094 51.773438 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 284.722656 18.628906 L 272.292969 6.199219 C 265.441406 -0.65625 254.289062 -0.65625 247.433594 6.199219 L 222.574219 31.058594 L 247.433594 55.917969 Z M 284.722656 18.628906 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 351.015625 84.917969 L 313.726562 122.207031 L 288.867188 97.347656 L 326.15625 60.058594 Z M 351.015625 84.917969 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 305.441406 130.496094 L 268.152344 167.78125 L 243.292969 142.925781 L 280.582031 105.636719 Z M 305.441406 130.496094 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 346.871094 155.355469 L 371.730469 130.496094 C 378.585938 123.640625 378.585938 112.488281 371.730469 105.636719 L 359.300781 93.207031 L 322.011719 130.496094 Z M 346.871094 155.355469 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 276.4375 176.070312 L 288.867188 188.5 C 295.722656 195.351562 306.871094 195.351562 313.726562 188.5 L 338.585938 163.640625 L 313.726562 138.78125 Z M 276.4375 176.070312 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(53.333336%,52.549022%,57.647061%);fill-opacity:1;" d="M 359.300781 93.207031 L 351.015625 84.917969 L 313.726562 122.207031 L 288.867188 97.347656 L 326.15625 60.058594 L 317.871094 51.773438 L 280.582031 89.0625 L 255.722656 64.203125 L 293.011719 26.914062 L 284.722656 18.628906 L 247.433594 55.917969 L 222.574219 31.058594 L 214.289062 39.34375 L 239.148438 64.203125 L 201.859375 101.492188 L 210.144531 109.777344 L 247.433594 72.488281 L 272.292969 97.347656 L 235.003906 134.636719 L 226.71875 142.925781 L 235.003906 151.210938 L 243.292969 142.925781 L 280.582031 105.636719 L 305.441406 130.496094 L 268.152344 167.78125 L 276.4375 176.070312 L 313.726562 138.78125 L 338.585938 163.640625 L 346.871094 155.355469 L 322.011719 130.496094 Z M 359.300781 93.207031 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 89.992188 279.648438 L 52.703125 316.9375 L 27.84375 292.078125 L 65.132812 254.789062 Z M 89.992188 279.648438 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 102.421875 200.929688 L 89.992188 188.5 C 83.140625 181.644531 71.988281 181.644531 65.132812 188.5 L 40.273438 213.359375 L 65.132812 238.21875 Z M 102.421875 200.929688 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 31.988281 221.644531 L 7.128906 246.503906 C 0.277344 253.359375 0.277344 264.507812 7.128906 271.363281 L 19.558594 283.792969 L 56.847656 246.503906 Z M 31.988281 221.644531 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 135.570312 234.074219 L 98.28125 271.363281 L 73.421875 246.503906 L 110.710938 209.214844 Z M 135.570312 234.074219 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 164.570312 337.65625 L 189.429688 312.796875 C 196.285156 305.941406 196.285156 294.789062 189.429688 287.9375 L 177 275.507812 L 139.710938 312.796875 Z M 164.570312 337.65625 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 123.140625 312.796875 L 85.851562 350.085938 L 60.992188 325.226562 L 98.28125 287.9375 Z M 123.140625 312.796875 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 131.425781 370.800781 L 156.285156 345.941406 L 131.425781 321.082031 L 94.136719 358.371094 L 106.566406 370.800781 C 113.421875 377.652344 124.570312 377.652344 131.425781 370.800781 Z M 131.425781 370.800781 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 168.714844 267.21875 L 131.425781 304.507812 L 106.566406 279.648438 L 143.855469 242.359375 Z M 168.714844 267.21875 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(53.333336%,52.549022%,57.647061%);fill-opacity:1;" d="M 143.855469 225.789062 L 98.28125 271.363281 L 73.421875 246.503906 L 110.710938 209.214844 L 102.421875 200.929688 L 65.132812 238.21875 L 40.273438 213.359375 L 31.988281 221.644531 L 56.847656 246.503906 L 19.558594 283.792969 L 27.84375 292.078125 L 65.132812 254.789062 L 89.992188 279.648438 L 52.703125 316.9375 L 60.992188 325.226562 L 98.28125 287.9375 L 123.140625 312.796875 L 85.851562 350.085938 L 94.136719 358.371094 L 131.425781 321.082031 L 156.285156 345.941406 L 164.570312 337.65625 L 139.710938 312.796875 L 177 275.507812 L 168.714844 267.21875 L 131.425781 304.507812 L 106.566406 279.648438 L 152.140625 234.074219 Z M 143.855469 225.789062 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 218.433594 234.074219 L 227.34375 242.988281 C 229.636719 239.875 232.1875 236.890625 235.003906 234.074219 C 237.824219 231.257812 240.804688 228.707031 243.917969 226.414062 L 235.003906 217.5 L 226.71875 225.789062 Z M 218.433594 234.074219 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,81.176472%,0%);fill-opacity:1;" d="M 177 258.933594 C 181.570312 263.503906 189.003906 263.5 193.574219 258.933594 L 226.71875 225.789062 L 206.003906 205.070312 L 197.71875 213.359375 C 190.851562 220.222656 179.722656 220.222656 172.859375 213.359375 L 94.136719 134.636719 L 85.851562 142.925781 C 78.996094 149.777344 78.996094 160.929688 85.851562 167.78125 L 143.855469 225.789062 Z M 177 258.933594 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,57.647061%,0%);fill-opacity:1;" d="M 214.289062 196.785156 L 206.003906 205.070312 L 226.71875 225.789062 L 235.003906 217.5 L 259.863281 192.640625 C 264.433594 188.074219 264.433594 180.640625 259.863281 176.070312 L 226.71875 142.925781 L 168.714844 84.917969 C 161.859375 78.066406 150.710938 78.066406 143.855469 84.917969 L 135.570312 93.207031 L 214.289062 171.925781 C 221.15625 178.792969 221.15625 189.921875 214.289062 196.785156 Z M 214.289062 196.785156 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 299.582031 298.648438 L 286.441406 298.648438 L 274.722656 310.367188 L 303.011719 310.367188 L 306 313.355469 C 306.257812 312.390625 306.757812 311.480469 307.511719 310.722656 L 311.65625 306.582031 C 312.410156 305.824219 313.320312 305.324219 314.285156 305.066406 L 311.296875 302.082031 L 311.300781 273.789062 L 299.582031 285.507812 Z M 299.582031 298.648438 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(53.333336%,52.549022%,57.647061%);fill-opacity:1;" d="M 293.011719 292.078125 L 338.375 246.714844 C 340.699219 244.390625 341.945312 241.171875 341.792969 237.882812 C 341.648438 234.578125 340.101562 231.46875 337.5625 229.351562 C 310.191406 206.554688 271.773438 205.910156 243.917969 226.414062 C 240.804688 228.707031 237.824219 231.257812 235.003906 234.074219 Z M 293.011719 292.078125 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,81.176472%,0%);fill-opacity:1;" d="M 307.511719 310.722656 C 306.757812 311.480469 306.257812 312.390625 306 313.355469 C 305.476562 315.308594 305.980469 317.476562 307.511719 319.011719 L 319.941406 331.441406 C 322.230469 333.726562 325.941406 333.726562 328.226562 331.441406 L 332.371094 327.296875 C 334.660156 325.007812 334.660156 321.296875 332.371094 319.011719 L 319.941406 306.582031 C 318.410156 305.046875 316.238281 304.546875 314.285156 305.066406 C 313.320312 305.324219 312.410156 305.824219 311.65625 306.582031 Z M 307.511719 310.722656 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,45.490196%,0%);fill-opacity:1;" d="M 206.003906 205.070312 L 214.289062 196.785156 C 221.15625 189.921875 221.15625 178.792969 214.289062 171.925781 L 135.570312 93.207031 L 127.28125 101.492188 L 114.851562 113.921875 Z M 206.003906 205.070312 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(71.372551%,72.156864%,74.509805%);fill-opacity:1;" d="M 293.011719 292.078125 L 235.003906 234.074219 C 232.1875 236.890625 229.636719 239.875 227.34375 242.988281 C 206.839844 270.839844 207.484375 309.261719 230.285156 336.628906 C 232.402344 339.167969 235.507812 340.714844 238.8125 340.863281 C 242.101562 341.011719 245.324219 339.765625 247.644531 337.445312 Z M 293.011719 292.078125 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,57.647061%,0%);fill-opacity:1;" d="M 197.71875 213.359375 L 206.003906 205.070312 L 114.851562 113.921875 L 94.136719 134.636719 L 172.859375 213.359375 C 179.722656 220.222656 190.851562 220.222656 197.71875 213.359375 Z M 197.71875 213.359375 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(36.078432%,32.941177%,41.568628%);fill-opacity:1;" d="M 102.421875 84.917969 C 104.710938 82.632812 104.710938 78.921875 102.421875 76.632812 L 77.5625 51.773438 L 65.132812 64.203125 L 94.136719 93.207031 Z M 102.421875 84.917969 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(53.333336%,52.549022%,57.647061%);fill-opacity:1;" d="M 85.851562 101.492188 L 94.136719 93.207031 L 65.132812 64.203125 L 52.703125 76.632812 L 77.5625 101.492188 C 79.851562 103.78125 83.5625 103.78125 85.851562 101.492188 Z M 85.851562 101.492188 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

View file

@ -36,7 +36,7 @@
"name": {
"en": "Node to node links",
"de": "Knotenpunktverbindungen",
"es": "enlaces nodo a nodo",
"es": "Vínculos entre nodos",
"nl": "Verbindingen van node naar node",
"fr": "liens noeud à noeud",
"ca": "Enllaços node a node",
@ -57,7 +57,7 @@
"render": {
"en": "Node to node link",
"de": "Knotenpunktverbindung",
"es": "enlace nodo a nodo",
"es": "Vínculos entre nodos",
"nl": "Node-naar-node verbinding",
"fr": "lien noeud à noeud",
"ca": "Enllaç node a node",
@ -70,7 +70,7 @@
"then": {
"en": "Node to node link <strong>{ref}</strong>",
"de": "Knotenpunktverbindung <strong>{ref}</strong>",
"es": "enlace nodo a nodo <strong>{ref}</strong>",
"es": "Vínculos entre nodos <strong>{ref}</strong>",
"nl": "Node-naar-node verbinding <strong>{ref}</strong>",
"fr": "lien noeud à noeud <strong>{ref}</strong>",
"ca": "Enllaç node a node <strong>{ref}</strong>",
@ -131,7 +131,7 @@
"en": "Nodes",
"de": "Knotenpunkte",
"ca": "Nodes",
"es": "nodos",
"es": "Nodos",
"nb_NO": "noder",
"nl": "Knooppunten",
"fr": "noeuds",
@ -202,7 +202,8 @@
"then": {
"en": "Proposed cycle node <strong>{proposed:rcn_ref}</strong>",
"nl": "Voorgesteld fietsknooppunt <strong>{proposed:rcn_ref}</strong>",
"de": "Vorgeschlagener Radknoten <strong>{proposed:rcn_ref}</strong>"
"de": "Vorgeschlagener Radknoten <strong>{proposed:rcn_ref}</strong>",
"es": "Nodo de ciclo propuesto <strong>{proposed:rcn_ref}</strong>"
}
}
]
@ -215,7 +216,8 @@
"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?",
"ca": "Quin és el número de referència d'aquest node ciclista?"
"ca": "Quin és el número de referència d'aquest node ciclista?",
"es": "¿Cuál es el número de referencia de este nodo cíclico?"
},
"freeform": {
"key": "rcn_ref",
@ -224,7 +226,8 @@
"en": "e.g. 1",
"nl": "bijv. 1",
"de": "z.B. 1",
"cs": "e.g. 1"
"cs": "e.g. 1",
"es": "Por ejemplo, 1"
}
},
"render": {
@ -232,7 +235,8 @@
"nl": "Dit fietsknooppunt heeft referentienummer {rcn_ref}",
"de": "Knotenpunktnummer {rcn_ref} des Fahrradknotenpunktnetzwerks",
"cs": "Tento cyklistický uzel má referenční číslo {rcn_ref}",
"ca": "Aquest node ciclista té la referència número {rcn_ref}"
"ca": "Aquest node ciclista té la referència número {rcn_ref}",
"es": "Este nodo cíclico tiene el número de referencia {rcn_ref}"
},
"condition": "rcn_ref~*"
},
@ -290,7 +294,8 @@
"en": "e.g. 3",
"nl": "bijv. 3",
"de": "z.B. 3",
"cs": "e.g. 3"
"cs": "e.g. 3",
"es": "Por ejemplo, 3"
}
},
"id": "node-expected_rcn_route_relations"
@ -307,7 +312,8 @@
"en": "a cycling node",
"nl": "een fietsknooppunt",
"de": "ein Knoten eines Fahrradknotenpunktnetzwerks",
"ca": "un node ciclista"
"ca": "un node ciclista",
"es": "un nodo cíclico"
},
"snapToLayer": [
"cycleways_and_roads"
@ -341,13 +347,15 @@
"name": {
"en": "Cycling guideposts",
"de": "Fahrrad-Wegweiser",
"cs": "Cyklistické ukazatele"
"cs": "Cyklistické ukazatele",
"es": "Indicadores de ciclismo"
},
"title": {
"render": {
"en": "Cycling guidepost",
"de": "Fahrrad-Wegweiser",
"cs": "Cyklistický ukazatel"
"cs": "Cyklistický ukazatel",
"es": "Hito ciclista"
}
}
},
@ -375,7 +383,8 @@
"title": {
"en": "a route marker for a node to node link",
"de": "Eine Routenmarkierung für eine Verbindung von Knoten zu Knoten",
"cs": "značka trasy pro spojení mezi uzlem"
"cs": "značka trasy pro spojení mezi uzlem",
"es": "Un marcador de ruta para un enlace de nodo a nodo"
},
"=exampleImages": [
"./assets/layers/route_marker/bicycle_route_marker.jpg"

View file

@ -64,14 +64,16 @@
{
"question": {
"en": "No oil type preference",
"de": "Kein Öltyp bevorzugt"
"de": "Kein Öltyp bevorzugt",
"es": "No se prefiere ningún tipo de aceite"
}
},
{
"question": {
"en": "Only show fritures using vegetable oil",
"de": "Nur Friteusen mit Pflanzenöl anzeigen",
"ca": "Només mostra freiduries que utilitzen oli vegetal"
"ca": "Només mostra freiduries que utilitzen oli vegetal",
"es": "Solo muestra freiduras que utilizan aceite vegetal"
},
"osmTags": "friture:oil=vegetable"
},
@ -79,7 +81,8 @@
"question": {
"en": "Only show fritures using animal oil",
"de": "Nur Friteusen mit tierischem Öl anzeigen",
"ca": "Només mostra freiduries que utilitzen oli animal"
"ca": "Només mostra freiduries que utilitzen oli animal",
"es": "Solo muestra freiduras que utilizan aceite animal"
},
"osmTags": "friture:oil=animal"
}

View file

@ -1,8 +1,8 @@
{
"id": "hackerspaces",
"title": {
"en": "Hackerspaces",
"de": "Hackerspaces",
"en": "Hackerspaces and makerspaces",
"de": "Hackerspaces und Makerspaces",
"it": "Hackerspace",
"ru": "Хакерспейсы",
"zh_Hant": "駭客空間",
@ -13,7 +13,7 @@
"ca": "Espai per a hackers",
"pa_PK": "ہیکر دے تھاں",
"cs": "Hackerspaces",
"es": "Hackerspaces",
"es": "Hackerspaces and makerspaces",
"eu": "Hackerspace",
"pl": "Hackerspace'y"
},

View file

@ -4,16 +4,19 @@
"en": "Icecream",
"de": "Eiscreme",
"cs": "Zmrzlina",
"ca": "Gelat"
"ca": "Gelat",
"es": "Helado"
},
"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",
"ca": "Un mapa que mostra les gelateries i les màquines expenedores de gelats"
"ca": "Un mapa que mostra les gelateries i les màquines expenedores de gelats",
"es": "Mapa de heladerías y máquinas expendedoras de helados"
},
"icon": "./assets/layers/ice_cream/ice_cream.svg",
"layers": [
"ice_cream"
]
],
"minzoom": "14"
}

View file

@ -1,6 +1,5 @@
{
"id": "openlovemap",
"hideFromOverview": true,
"title": {
"en": "Open Love Map"
},
@ -8,6 +7,7 @@
"en": "<p><i>Love in the palm of your hand</i></p>Open Love Map lists various adult entries, such as brothels, erotic stores and stripclubs."
},
"icon": "./assets/layers/stripclub/stripclub.svg",
"hideFromOverview": true,
"layers": [
"brothel",
"stripclub",
@ -22,6 +22,9 @@
"=filter": [
"open_now"
],
"name": {
"en": "Erotic shops"
},
"=presets": [
{
"title": {
@ -39,7 +42,10 @@
"override": {
"minzoom": 18,
"=presets": [],
"=name": null
"=name": null,
"=filter": {
"sameAs": "erotic-shop"
}
}
},
{
@ -109,13 +115,14 @@
"override": {
"minzoom": 18,
"=presets": [],
"=name": null
"=name": null
}
},
{
"builtin": "cinema",
"hideTagRenderingsWithLabels": ["wikipedia"],
"hideTagRenderingsWithLabels": [
"wikipedia"
],
"override": {
"id": "erotic_cinema",
"pointRendering": [
@ -154,7 +161,9 @@
"=filter": [
"open_now"
],
"tagRenderings+": ["opening_hours"],
"tagRenderings+": [
"opening_hours"
],
"source": {
"osmTags": {
"=and": [
@ -182,29 +191,63 @@
"override": {
"minzoom": 18,
"=presets": [],
"=name": null
"=name": null
}
},
"love_hotel",
{
"builtin": "hotel",
"override": {
"minzoom": 17,
"+tagRenderings": [
{
"id": "hotel-type",
"question": {
"en": "What type of hotel is this?"
},
"mappings": [
{
"if": "tourism=hotel",
"then": "This is a regular, tourist hotel where people stay multiple days",
"addExtraTags": [
"amenity="
]
},
{
"if": "amenity=love_hotel",
"then": "This is a love hotel where people rent rooms for sexual activity. The hotel rent rooms for a few days",
"addExtraTags": [
"tourism="
]
}
]
}
],
"=presets": []
}
}
],
"overrideAll": {
"tagRenderings+": [{
"id": "has_video_booth",
"question": {"en":
"Does {title()} have a private video booth?"
},
"questionHint": {
"en": "This is for use by a single person."
},
"mappings": [
{
"if": "service:private_video_booth=yes",
"then": "Private video booths are available"
"tagRenderings+": [
{
"id": "has_video_booth",
"question": {
"en": "Does {title()} have a private video booth?"
},
{
"if": "service:private_video_booth=no",
"then": "No private video booths"
}
]
}]
"questionHint": {
"en": "This is for use by a single person."
},
"mappings": [
{
"if": "service:private_video_booth=yes",
"then": "Private video booths are available"
},
{
"if": "service:private_video_booth=no",
"then": "No private video booths"
}
]
}
]
}
}

View file

@ -347,7 +347,6 @@
"uploading": "S'està penjant la teva traça…"
},
"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",

View file

@ -345,7 +345,6 @@
"uploadPendingSingle": "Čeká se na jednu změnu",
"uploadingChanges": "Nahrávání změn…",
"useSearch": "Pro zobrazení předvoleb použijte vyhledávání výše",
"useSearchForMore": "Pomocí funkce hledání můžete v rámci {total} vyhledat více hodnot…",
"waitingForGeopermission": "Čekáme na vaše povolení používat geolokaci…",
"waitingForLocation": "Vyhledávání vaší aktuální polohy…",
"weekdays": {

View file

@ -186,7 +186,8 @@
"backgroundSwitch": "Hintergrund wechseln",
"cancel": "Abbrechen",
"confirm": "Bestätigen",
"customThemeIntro": "<h3>Benutzerdefinierte Themen</h3>Dies sind zuvor angesehene nutzergenerierte Themen.",
"customThemeIntro": "Bereits angesehene nutzergenerierte Themen.",
"customThemeTitle": "Benutzerdefinierte Themen",
"download": {
"downloadAsPdf": "Aktuelle Karte als PDF herunterladen",
"downloadAsPdfHelper": "Ideal zum Drucken der aktuellen Karte",
@ -230,6 +231,7 @@
"labels": {
"background": "Hintergrund ändern",
"filter": "Daten filtern",
"jumpToLocation": "Eigenen Standort anzeigen",
"menu": "Menü",
"zoomIn": "Hineinzoomen",
"zoomOut": "Herauszoomen"
@ -279,13 +281,17 @@
"openTheMap": "Karte öffnen",
"openTheMapAtGeolocation": "Zum eigenen Standort zoomen",
"opening_hours": {
"all_days_from": "Geöffnet täglich {ranges}",
"closed_permanently": "Geschlossen auf unbestimmte Zeit",
"closed_until": "Geschlossen bis {date}",
"error": "Öffnungszeiten können nicht ausgewertet werden",
"error_loading": "Fehler: Diese Öffnungszeiten können nicht angezeigt werden.",
"friday": "Am Freitag {ranges}",
"loadingCountry": "Land ermitteln…",
"monday": "Am Montag {ranges}",
"not_all_rules_parsed": "Die Öffnungszeiten sind kompliziert. Folgenden Regeln werden im Eingabefenster ignoriert:",
"on_weekdays": "Geöffnet werktags {ranges}",
"on_weekends": "Geöffnet am Wochenende {ranges}",
"openTill": "bis",
"open_24_7": "Durchgehend geöffnet",
"open_during_ph": "An Feiertagen ist hier",
@ -344,6 +350,7 @@
"searchShort": "Suche…",
"searching": "Suchen …"
},
"searchAnswer": "Option suchen…",
"share": "Teilen",
"sharescreen": {
"copiedToClipboard": "Verknüpfung in Zwischenablage kopiert",
@ -359,7 +366,7 @@
"testing": "Testen - Änderungen werden nicht gespeichert",
"uploadError": "Fehler beim Hochladen von Änderungen: {error}",
"uploadGpx": {
"choosePermission": "Wählen Sie unten, ob Ihre Strecke geteilt werden soll:",
"choosePermission": "Wählen Sie unten, wie Ihre Strecke geteilt werden soll:",
"confirm": "Hochladen bestätigen",
"gpxServiceOffline": "Der GPX-Dienst ist derzeit offline - ein Hochladen ist derzeit nicht möglich. Versuchen Sie es später noch einmal.",
"intro0": "Wenn Sie Ihre Strecke hochladen, behält OpenStreetMap.org eine vollständige Kopie der Strecke.",
@ -389,8 +396,8 @@
"uploadPendingSingle": "Eine Änderung ausstehend",
"uploadingChanges": "Änderungen werden hochgeladen…",
"useSearch": "Verwenden Sie die Suche oben, um Voreinstellungen anzuzeigen",
"useSearchForMore": "Verwenden Sie die Suchfunktion, um innerhalb von {total} weitere Werte zu suchen…",
"visualFeedback": {
"closestFeaturesAre": "{n} Objekte im Anzeigebereich.",
"directionsAbsolute": {
"E": "Ost",
"N": "Nord",
@ -402,6 +409,7 @@
"W": "West"
},
"directionsRelative": {
"behind": "in deinem Rücken",
"left": "links",
"right": "rechts",
"sharp_left": "scharf links",
@ -409,7 +417,23 @@
"slight_left": "leicht links",
"slight_right": "leicht rechts",
"straight": "geradeaus"
}
},
"east": "Nach Osten bewegen",
"fromGps": "{distance} {direction} von deinem Standort",
"fromMapCenter": "{distance} {direction} von der Kartenmitte",
"in": "Hineinzoomen auf Stufe {z}",
"islocked": "Die Ansicht ist an Ihren GPS-Standort gebunden, Bewegen ist deaktiviert. Drücken Sie zum Entsperren die Geolocation-Taste.",
"locked": "Die Ansicht ist jetzt an Ihren GPS-Standort gebunden, Bewegen ist deaktiviert.",
"navigation": "Verwenden Sie die Pfeiltasten, um die Karte zu bewegen, drücken Sie die Leertaste, um das nächstgelegene Objekt auszuwählen. Drücken Sie eine Zahl, um weiter entfernte Objekte auszuwählen.",
"noCloseFeatures": "Keine Objekte im Anzeigebereich.",
"north": "Nach Norden bewegen",
"oneFeatureInView": "Ein Objekt im Anzeigebereich.",
"out": "Herauszoomen auf Stufe {z}",
"south": "Nach Süden bewegen",
"unlocked": "Bewegen aktiviert.",
"viewportCenterCloseToGps": "Die Karte wird um Ihren Standort zentriert.",
"viewportCenterDetails": "Die Kartenmitte ist {distance} und {bearing} von Ihrem Standort entfernt.",
"west": "Nach Westen bewegen"
},
"waitingForGeopermission": "Warten auf Ihre Erlaubnis, Standortdaten zu verwenden…",
"waitingForLocation": "Ihr Standort wird gesucht…",
@ -461,18 +485,22 @@
"geolocate": "Karte auf den aktuellen Standort verschieben oder zoomen. Erfordert Standortberechtigung",
"intro": "MapComplete unterstützt folgende Tastaturbefehle:",
"key": "Tastenkombination",
"openFilterPanel": "Öffnet das Panel für POI-Ebenen und Filter",
"openLayersPanel": "Auswahl für Hintergrundebenen öffnen",
"queryCurrentLocation": "Adresse anzeigen, die der Kartenmitte am nächsten liegt",
"selectAerial": "Hintergrund als Luftbild oder Satellitenbild einstellen. Wechselt zwischen den zwei besten verfügbaren Ebenen",
"selectFavourites": "Favoriten anzeigen",
"selectItem": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am nächsten liegt. Nur wenn die Tastaturnavigation verwendet wird",
"selectItem2": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am zweitnächsten liegt. Nur wenn die Tastaturnavigation verwendet wird",
"selectItem3": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am drittnächsten liegt. Nur wenn die Tastaturnavigation verwendet wird",
"selectItemI": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am viertnächsten liegt. Nur wenn die Tastaturnavigation verwendet wird",
"selectItemI": "Objekt auswählen, das dem Kartenmittelpunkt (Fadenkreuz) am {i} nächsten liegt. Nur wenn die Tastaturnavigation verwendet wird",
"selectMap": "Karte aus externer Quelle als Hintergrund wählen. Wechselt zwischen den zwei besten verfügbaren Ebenen",
"selectMapnik": "OpenStreetMap-carto als Hintergrundebene wählen",
"selectOsmbasedmap": "OpenStreetMap-basierte Karte als Hintergrund auswählen (oder Hintergrundebene deaktivieren)",
"selectSearch": "Suchleiste auswählen, um nach Orten zu suchen",
"title": "Tastaturbefehle"
"shakePhone": "Telefon schütteln",
"title": "Tastaturbefehle",
"translationMode": "Übersetzungsmodus ein- oder ausschalten"
},
"image": {
"addPicture": "Bild hinzufügen",
@ -481,7 +509,9 @@
"dontDelete": "Abbrechen",
"isDeleted": "Gelöscht",
"nearby": {
"close": "Übersicht mit nahegelegenen Bildern ausklappen",
"link": "Dieses Bild zeigt das Objekt",
"noNearbyImages": "Keine nahegelegenen Bilder gefunden",
"seeNearby": "Bilder in der Nähe durchsuchen und verlinken",
"title": "Straßenbilder in der Nähe"
},
@ -628,15 +658,19 @@
"reviews": {
"affiliated_reviewer_warning": "(Partner-Rezension)",
"attribution": "Rezensionen von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar.",
"averageRating": "Mittlere Bewertung von {n} Sternen",
"i_am_affiliated": "Ich bin mit diesem Objekt vertraut",
"i_am_affiliated_explanation": "Prüfung, ob Sie der Eigentümer, Ersteller, Angestellter, … sind",
"name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen",
"no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!",
"question": "Wie bewerten Sie {title()}?",
"question_opinion": "Wie war Ihre Erfahrung?",
"rate": "Mit {n} Sternen bewerten",
"rated": "Mit {n} Sternen bewertet",
"reviewPlaceholder": "Beschreibe deine Erfahrung…",
"reviewing_as": "Als {nickname} bewerten",
"reviewing_as_anonymous": "Anonym bewerten",
"save": "Speichern",
"save": "Bewertung speichern",
"saved": "Bewertung gespeichert. Danke fürs Teilen!",
"saving_review": "Speichern…",
"title": "{count} Rezensionen",
@ -649,7 +683,7 @@
"hasBeenSplit": "Dieser Weg wurde geteilt",
"inviteToSplit": "Die Straße in Abschnitte teilen. Dadurch können je Abschnitt unterschiedliche Eigenschaften angegeben werden.",
"loginToSplit": "Anmeldung erforderlich, um Straßen zu teilen",
"split": "Teilen",
"split": "Aufteilen",
"splitAgain": "Diese Straße erneut teilen",
"splitTitle": "Wähle auf der Karte aus, wo sich die Eigenschaften dieser Straße ändern"
},
@ -723,6 +757,10 @@
"description": "eine positive, ganze Zahl",
"noZero": "Null ist nicht erlaubt"
},
"slope": {
"inputExplanation": "Legen Sie Ihr Telefon so auf den Boden, dass die Oberseite des Telefons zum oberen Ende des Hangs zeigt.",
"inputIncorrect": "Für korrekte Messungen achten Sie darauf, dass sich der Pfeil in der grünen Fläche befindet."
},
"string": {
"description": "ein Stück Text"
},

View file

@ -217,6 +217,7 @@
},
"enableGeolocationForSafari": "Did you not get the popup to ask for geopermission?",
"enableGeolocationForSafariLink": "Learn how to enable the geolocation permission in settings",
"eraseValue": "Erase this value",
"error": "Something went wrong",
"example": "Example",
"examples": "Examples",
@ -395,8 +396,7 @@
"uploadPending": "{count} changes pending",
"uploadPendingSingle": "One change pending",
"uploadingChanges": "Uploading changes…",
"useSearch": "Use the search above to see presets",
"useSearchForMore": "Use the search function to search within {total} more values…",
"useSearch": "Use the search above to see more options",
"visualFeedback": {
"closestFeaturesAre": "{n} features within viewport.",
"directionsAbsolute": {
@ -723,7 +723,8 @@
"fediverse": {
"description": "A fediverse handle, often @username@server.tld",
"feedback": "A fediverse handle consists of @username@server.tld or is a link to a profile",
"invalidHost": "{host} is not a valid hostname"
"invalidHost": "{host} is not a valid hostname",
"onYourServer": "See and follow on your server"
},
"float": {
"description": "a number",

View file

@ -157,6 +157,7 @@
"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",
"codeContributionsBy": "MapCompleten on tehneet {contributors} ja <a href='https://github.com/pietervdvn/MapComplete/graphs/contributors' target='_blank'>{hiddenCount} muuta</a>",
"donate": "Tue MapCompletea rahallisesti",
"editId": "Avaa OpenStreetMap-verkkoeditori tänne",
"editJosm": "Muokkaa täällä JOSM:illa",
@ -164,9 +165,17 @@
"iconAttribution": {
"title": "Käytetyt kuvakkeet"
},
"josmNotOpened": "JOSM:iin ei saatu yhteyttä. Tarkista, että se on auki ja etähallinta on käytössä",
"josmOpened": "JOSM on avattu",
"mapContributionsBy": "Tällä hetkellä näkyvää tietoa on muokannut {contributors}",
"mapContributionsByAndHidden": "Tällä hetkellä näkyvää tietoa on muokannut {contributors} ja {hiddenCount} muuta",
"mapDataByOsm": "Karttatiedot: OpenStreetMap",
"mapillaryHelp": "<b>Mapillary</b> on verkkopalvelu, joka kerää katutason kuvia ja tarjoaa niitä vapaan lisenssi mukaisesti. Näitä kuvia saa käyttää parantamaan OpenStreetMapiä",
"openIssueTracker": "Ilmoita ohjelmavirheestä",
"openMapillary": "Avaa Mapillary tänne",
"openOsmcha": "Näytä viimeisimmät muokkaukset, jotka on tehty teemalla {theme}",
"seeOnMapillary": "Näytä tämä kuva Mapillaryssä",
"themeBy": "Teemaa ylläpitää {author}",
"title": "Tekijänoikeudet ja alkuperä"
},
"backToIndex": "Palaa kaikkien teemakarttojen yleiskuvaan",

View file

@ -528,8 +528,8 @@
"render": {
"special": {
"question": "En quins idiomes té sortida de veu aquest caixer?",
"render_list_item": "Aquest caixer té sortida de veu en {language():font-bold}",
"render_single_language": "Aquest caixer té sortida de veu en {language():font-bold}"
"render_list_item": "Aquest caixer té sortida de veu en {language()}",
"render_single_language": "Aquest caixer té sortida de veu en {language()}"
}
}
}
@ -3220,8 +3220,8 @@
"render": {
"special": {
"question": "Aquest ascensor en quins idiomes té sortida de veu?",
"render_list_item": "Aquest ascensor té sortida de veu en {language():font-bold}",
"render_single_language": "Aquest ascensor té sortida de veu en {language():font-bold}"
"render_list_item": "Aquest ascensor té sortida de veu en {language()}",
"render_single_language": "Aquest ascensor té sortida de veu en {language()}"
}
}
},
@ -3243,8 +3243,8 @@
"render": {
"special": {
"question": "Aquest ascensor en quins idiomes té l'escriptura tàctil (braille)?",
"render_list_item": "Aquest ascensor té l'escriptura tàctil en {language():font-bold}",
"render_single_language": "Aquest ascensor té l'escriptura tàctil en {language():font-bold}"
"render_list_item": "Aquest ascensor té l'escriptura tàctil en {language()}",
"render_single_language": "Aquest ascensor té l'escriptura tàctil en {language()}"
}
}
}
@ -6828,7 +6828,7 @@
"no_known_languages": "La llengua principal d'aquesta escola és desconeguda",
"question": "Quina és la llengua principal d'aquesta escola?<div class='subtle'>Quina llengua es parla amb els estudiants en classes no relacionades amb la llengua i l'administració?</div>",
"render_all": "En aquesta escola s'utilitzen els idiomes següents:{list()}",
"render_single_language": "{language():font-bold} és la llengua principal d'aquesta escola"
"render_single_language": "{language()} és la llengua principal d'aquesta escola"
}
}
},
@ -7374,8 +7374,8 @@
"render": {
"special": {
"question": "En quins idiomes hi ha escriptura tàctil (braille) per a la navegació? <img src='./assets/layers/stairs/Braille_stairs.jpg' style='height: 300px; width: auto; display: block;' />",
"render_list_item": "Aquestes escales tenen escriptura tàctil en {language():font-bold}",
"render_single_language": "Aquestes escales tenen escriptura tàctil en {language():font-bold}"
"render_list_item": "Aquestes escales tenen escriptura tàctil en {language()}",
"render_single_language": "Aquestes escales tenen escriptura tàctil en {language()}"
}
}
}

View file

@ -489,8 +489,8 @@
"render": {
"special": {
"question": "V jakých jazycích má tento bankomat řečový výstup?",
"render_list_item": "Tento bankomat má řečový výstup v {language():font-bold}",
"render_single_language": "Tento bankomat má řečový výstup v {language():font-bold}"
"render_list_item": "Tento bankomat má řečový výstup v {language()}",
"render_single_language": "Tento bankomat má řečový výstup v {language()}"
}
}
}
@ -3269,8 +3269,8 @@
"render": {
"special": {
"question": "Ve kterých jazycích má tento výtah hlasový výstup?",
"render_list_item": "Tento výtah má hlasový výstup v {language():font-bold}",
"render_single_language": "Tento výtah má hlasový výstup v {language():font-bold}"
"render_list_item": "Tento výtah má hlasový výstup v {language()}",
"render_single_language": "Tento výtah má hlasový výstup v {language()}"
}
}
},
@ -3301,8 +3301,8 @@
"render": {
"special": {
"question": "Ve kterých jazycích má tento výtah hmatové písmo (braillovo písmo)?",
"render_list_item": "Tento výtah má hmatové písmo v {language():font-bold}",
"render_single_language": "Tento výtah má hmatové písmo v {language():font-bold}"
"render_list_item": "Tento výtah má hmatové písmo v {language()}",
"render_single_language": "Tento výtah má hmatové písmo v {language()}"
}
}
}
@ -7113,7 +7113,7 @@
"no_known_languages": "Hlavní jazyk této školy není znám",
"question": "Jaký je hlavní jazyk této školy?<div class='subtle'>Jakým jazykem se mluví se studenty v nejazykových kurzech a administrativou?</div>",
"render_all": "V této škole se používají následující jazyky:{list()}",
"render_single_language": "{language():font-bold} je hlavním jazykem této školy"
"render_single_language": "{language()} je hlavním jazykem této školy"
}
}
},
@ -7699,8 +7699,8 @@
"render": {
"special": {
"question": "Ve kterých jazycích existuje hmatové písmo (braillské písmo) pro navigaci? <img src='./assets/layers/stairs/Braille_stairs.jpg' style='height: 300px; width: auto; display: block;' />",
"render_list_item": "Tyto schody mají hmatové písmo v {language():font-bold}",
"render_single_language": "Tyto schody mají hmatové písmo v {language():font-bold}"
"render_list_item": "Tyto schody mají hmatové písmo v {language()}",
"render_single_language": "Tyto schody mají hmatové písmo v {language()}"
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -530,8 +530,8 @@
"render": {
"special": {
"question": "In which languages does this ATM have speech output?",
"render_list_item": "This ATM has speech output in {language():font-bold}",
"render_single_language": "This ATM has speech output in {language():font-bold}"
"render_list_item": "This ATM has speech output in {language()}",
"render_single_language": "This ATM has speech output in {language()}"
}
}
}
@ -1809,6 +1809,24 @@
"render": "Bird watching place"
}
},
"brothel": {
"description": "An establishment specifically dedicated to prostitution. ",
"name": "Brothels",
"presets": {
"0": {
"title": "a brothel"
}
},
"tagRenderings": {
"name": {
"question": "What is the name of this brothel?",
"render": "This brothel is named <b>{name}</b>"
}
},
"title": {
"render": "Brothel"
}
},
"cafe_pub": {
"deletion": {
"extraDeleteReasons": {
@ -2385,6 +2403,26 @@
"render": "Charging station"
}
},
"cinema": {
"description": " A place showing movies (films), generally open to the public for a fee. Commonly referred to as a movie theater in the US",
"name": "Cinema",
"tagRenderings": {
"cinema_type": {
"mappings": {
"0": {
"then": "This is a normal cinema showing movies for all ages"
},
"1": {
"then": "This is an erotic cinema showing adult movies"
}
},
"question": "What type of cinema is this?"
}
},
"title": {
"render": "Cinema"
}
},
"climbing": {
"description": "A dummy layer which contains tagrenderings, shared among the climbing layers",
"tagRenderings": {
@ -3859,8 +3897,8 @@
"render": {
"special": {
"question": "In which languages does this elevator have speech output?",
"render_list_item": "This elevator has speech output in {language():font-bold}",
"render_single_language": "This elevator has speech output in {language():font-bold}"
"render_list_item": "This elevator has speech output in {language()}",
"render_single_language": "This elevator has speech output in {language()}"
}
}
},
@ -3891,8 +3929,8 @@
"render": {
"special": {
"question": "In which languages does this elevator have tactile writing (braille)?",
"render_list_item": "This elevator has tactile writing in {language():font-bold}",
"render_single_language": "This elevator has tactile writing in {language():font-bold}"
"render_list_item": "This elevator has tactile writing in {language()}",
"render_single_language": "This elevator has tactile writing in {language()}"
}
}
}
@ -5024,6 +5062,9 @@
},
"1": {
"then": "There is no {negative-name} available at this hackerspace"
},
"2": {
"then": "There is a limited {negative-name} available at this hackerspace"
}
},
"question": "Is {device-name} available at this hackerspace?"
@ -5622,6 +5663,25 @@
}
}
},
"love_hotel": {
"description": "A love hotel is a type of short-stay hotel found around the world operated primarily for the purpose of allowing guests privacy for sexual activities",
"name": "Love hotels",
"presets": {
"0": {
"description": "A love hotel is a type of short-stay hotel found around the world operated primarily for the purpose of allowing guests privacy for sexual activities.",
"title": "a love hotel"
}
},
"tagRenderings": {
"name": {
"question": "What is the name of this love hotel?",
"render": "This love hotel is named <b>{name}</b>"
}
},
"title": {
"render": "Love Hotel <i>{name}</i>"
}
},
"map": {
"description": "A map, meant for tourists which is permanently installed in the public space",
"name": "Maps",
@ -7949,7 +8009,7 @@
"no_known_languages": "The main language of this school is unknown",
"question": "What is the main language of this school?<div class='subtle'>What language is spoken with the students in non-language related courses and with the administration?</div>",
"render_all": "The following languages are used in this school:{list()}",
"render_single_language": "{language():font-bold} is the main language of this school"
"render_single_language": "{language()} is the main language of this school"
}
}
},
@ -8620,8 +8680,8 @@
"render": {
"special": {
"question": "In which languages is there tactile writing (braille) for navigation? <img src='./assets/layers/stairs/Braille_stairs.jpg' style='height: 300px; width: auto; display: block;' />",
"render_list_item": "These stairs have tactile writing in {language():font-bold}",
"render_single_language": "These stairs have tactile writing in {language():font-bold}"
"render_list_item": "These stairs have tactile writing in {language()}",
"render_single_language": "These stairs have tactile writing in {language()}"
}
}
}
@ -8784,6 +8844,24 @@
"render": "Street Lamp"
}
},
"stripclub": {
"description": "A venue where erotic dance, striptease, or lap dances are performed commercially. ",
"name": "Stripclubs",
"presets": {
"0": {
"title": "a stripclub"
}
},
"tagRenderings": {
"name": {
"question": "What is the name of this stripclub?",
"render": "This stripclub is named <b>{name}</b>"
}
},
"title": {
"render": "Stripclub"
}
},
"surveillance_camera": {
"description": "This layer shows surveillance cameras and allows a contributor to update information and add new cameras",
"name": "Surveillance camera's",
@ -9105,20 +9183,20 @@
"toilet-changing_table:location": {
"mappings": {
"0": {
"then": "The changing table is in the toilet for women. "
"then": "A changing table is in the toilet for women"
},
"1": {
"then": "The changing table is in the toilet for men. "
"then": "A changing table is in the toilet for men"
},
"2": {
"then": "The changing table is in the toilet for wheelchair users. "
"then": "A changing table is in the toilet for wheelchair users"
},
"3": {
"then": "The changing table is in a dedicated room. "
"then": "A changing table is in a dedicated room"
}
},
"question": "Where is the changing table located?",
"render": "The changing table is located at {changing_table:location}"
"render": "A changing table is located at {changing_table:location}"
},
"toilet-charge": {
"freeform": {

View file

@ -530,8 +530,8 @@
"render": {
"special": {
"question": "¿En qué idiomas tiene salida de voz este cajero automático?",
"render_list_item": "Este cajero automático tiene salida de voz en {language():font-bold}",
"render_single_language": "Este cajero automático tiene salida de voz en {language():font-bold}"
"render_list_item": "Este cajero automático tiene salida de voz en {language()}",
"render_single_language": "Este cajero automático tiene salida de voz en {language()}"
}
}
}

View file

@ -5232,7 +5232,7 @@
"no_known_languages": "La langue principale de cette école est inconnue",
"question": "Quelle est la langue principale de cette école ?<div class='subtle'>Quelle langue est parlée avec les élèves des cours non linguistiques et avec l'administration ?</div>",
"render_all": "Ces langues sont utilisées dans cette école :{list()}",
"render_single_language": "{language():font-bold} est la langue principale dans cette école"
"render_single_language": "{language()} est la langue principale dans cette école"
}
}
},

View file

@ -281,8 +281,8 @@
"render": {
"special": {
"question": "באילו שפות יש לכספומט הזה פלט דיבור?",
"render_list_item": "לכספומט הזה יש פלט דיבור ב {language():font-bold}",
"render_single_language": "לכספומט הזה יש פלט דיבור ב {language():font-bold}"
"render_list_item": "לכספומט הזה יש פלט דיבור ב {language()}",
"render_single_language": "לכספומט הזה יש פלט דיבור ב {language()}"
}
}
}

View file

@ -69,15 +69,6 @@
"1": {
"then": "Murale"
},
"10": {
"then": "Azulejo (ornamento decorativo piastrellato spagnolo)"
},
"11": {
"then": "Mosaico di piastrelle"
},
"12": {
"then": "Scultura in legno"
},
"2": {
"then": "Dipinto"
},
@ -101,6 +92,15 @@
},
"9": {
"then": "Rilievo"
},
"10": {
"then": "Azulejo (ornamento decorativo piastrellato spagnolo)"
},
"11": {
"then": "Mosaico di piastrelle"
},
"12": {
"then": "Scultura in legno"
}
},
"question": "Che tipo di opera darte è questo?",
@ -1992,6 +1992,27 @@
"1": {
"question": "Riciclo di batterie"
},
"2": {
"question": "Riciclo di confezioni per bevande"
},
"3": {
"question": "Riciclo di lattine"
},
"4": {
"question": "Riciclo di abiti"
},
"5": {
"question": "Riciclo di olio da cucina"
},
"6": {
"question": "Riciclo di olio da motore"
},
"8": {
"question": "Riciclo di umido"
},
"9": {
"question": "Riciclo di bottiglie di vetro"
},
"10": {
"question": "Riciclo di vetro"
},
@ -2019,29 +2040,8 @@
"19": {
"question": "Riciclo di secco"
},
"2": {
"question": "Riciclo di confezioni per bevande"
},
"20": {
"question": "Riciclo di secco"
},
"3": {
"question": "Riciclo di lattine"
},
"4": {
"question": "Riciclo di abiti"
},
"5": {
"question": "Riciclo di olio da cucina"
},
"6": {
"question": "Riciclo di olio da motore"
},
"8": {
"question": "Riciclo di umido"
},
"9": {
"question": "Riciclo di bottiglie di vetro"
}
}
},
@ -2094,6 +2094,27 @@
"1": {
"then": "Cartoni per bevande"
},
"2": {
"then": "Lattine"
},
"3": {
"then": "Abiti"
},
"4": {
"then": "Olio da cucina"
},
"5": {
"then": "Olio di motore"
},
"7": {
"then": "Verde"
},
"8": {
"then": "Umido"
},
"9": {
"then": "Bottiglie di vetro"
},
"10": {
"then": "Vetro"
},
@ -2118,9 +2139,6 @@
"19": {
"then": "Scarpe"
},
"2": {
"then": "Lattine"
},
"20": {
"then": "Piccoli elettrodomestici"
},
@ -2132,24 +2150,6 @@
},
"23": {
"then": "Secco"
},
"3": {
"then": "Abiti"
},
"4": {
"then": "Olio da cucina"
},
"5": {
"then": "Olio di motore"
},
"7": {
"then": "Verde"
},
"8": {
"then": "Umido"
},
"9": {
"then": "Bottiglie di vetro"
}
},
"question": "Cosa si può riciclare qui?"
@ -2950,4 +2950,4 @@
"render": "pala eolica"
}
}
}
}

View file

@ -27,9 +27,6 @@
"advertising": {
"name": "Reclame",
"presets": {
"12": {
"title": "een muurschildering"
},
"3": {
"description": "Een klein uithangbord voor buurtadvertenties, meestal gericht op voetgangers",
"title": "een uithangbord"
@ -50,6 +47,9 @@
"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,9 +107,6 @@
},
"title": {
"mappings": {
"10": {
"then": "Muurschildering"
},
"3": {
"then": "Aanplakzuil"
},
@ -127,6 +124,9 @@
},
"9": {
"then": "Aanplakzuil"
},
"10": {
"then": "Muurschildering"
}
}
}
@ -208,15 +208,6 @@
"1": {
"then": "Muurschildering"
},
"10": {
"then": "Azulejo (Spaanse siertegels)"
},
"11": {
"then": "Tegelwerk"
},
"12": {
"then": "Houtsculptuur"
},
"2": {
"then": "Schilderij"
},
@ -240,6 +231,15 @@
},
"9": {
"then": "Reliëf"
},
"10": {
"then": "Azulejo (Spaanse siertegels)"
},
"11": {
"then": "Tegelwerk"
},
"12": {
"then": "Houtsculptuur"
}
},
"question": "Wat voor soort kunstwerk is dit?",
@ -385,8 +385,8 @@
"render": {
"special": {
"question": "In welke taal is de spraak van deze geldautomaat?",
"render_list_item": "Deze geldautomaat heeft spraak in {language():font-bold}",
"render_single_language": "Deze automaat heeft spraak in {language():font-bold}"
"render_list_item": "Deze geldautomaat heeft spraak in {language()}",
"render_single_language": "Deze automaat heeft spraak in {language()}"
}
}
}
@ -1791,27 +1791,6 @@
"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>"
},
@ -1835,6 +1814,27 @@
},
"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,6 +1890,30 @@
"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)"
},
@ -1920,9 +1944,6 @@
"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)"
},
@ -1953,32 +1974,11 @@
"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,24 +2172,6 @@
"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>"
},
@ -2213,6 +2195,24 @@
},
"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,15 +2978,6 @@
"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"
},
@ -3010,6 +3001,15 @@
},
"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,15 +3058,6 @@
"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"
},
@ -3090,6 +3081,15 @@
},
"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?",
@ -3684,8 +3684,8 @@
"render": {
"special": {
"question": "In welke talen heeft deze lift gesproken tekst?",
"render_list_item": "Deze lift heeft gesproken tekst in het {language():font-bold}",
"render_single_language": "Deze lift heeft gesproken tekst in het {language():font-bold}"
"render_list_item": "Deze lift heeft gesproken tekst in het {language()}",
"render_single_language": "Deze lift heeft gesproken tekst in het {language()}"
}
}
},
@ -3693,8 +3693,8 @@
"render": {
"special": {
"question": "In welke talen heeft deze lift voelbaar schrift (braille)?",
"render_list_item": "Deze lift heeft voelbaar schrift in het {language():font-bold}",
"render_single_language": "Deze lift heeft voelbaar schrift in het {language():font-bold}"
"render_list_item": "Deze lift heeft voelbaar schrift in het {language()}",
"render_single_language": "Deze lift heeft voelbaar schrift in het {language()}"
}
}
}
@ -4138,21 +4138,6 @@
"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"
},
@ -4176,6 +4161,21 @@
},
"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?",
@ -4498,6 +4498,9 @@
},
"1": {
"then": "Er is geen {negative-name} beschikbaar in deze hackerspace"
},
"2": {
"then": "Er is een beperkte {negative-name} beschikbaar in deze hackerspace"
}
},
"question": "Is er {device-name} beschikbaar in deze hackerspace?"
@ -5346,19 +5349,6 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Alle Notes"
},
"1": {
"question": "Verberg import Notes"
},
"2": {
"question": "Toon enkel import Notes"
}
}
},
"2": {
"options": {
"0": {
@ -5414,6 +5404,19 @@
"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",
@ -5705,21 +5708,6 @@
"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."
},
@ -5743,6 +5731,21 @@
},
"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?"
@ -6309,21 +6312,6 @@
"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"
},
@ -6347,6 +6335,21 @@
},
"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?"
@ -6359,15 +6362,6 @@
"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"
},
@ -6391,6 +6385,15 @@
},
"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?"
@ -6709,6 +6712,30 @@
"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,35 +6766,11 @@
"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"
}
}
},
@ -6835,6 +6838,30 @@
"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,9 +6892,6 @@
"19": {
"then": "Schoenen kunnen hier gerecycled worden"
},
"2": {
"then": "Blikken kunnen hier gerecycled worden"
},
"20": {
"then": "Kleine elektrische apparaten kunnen hier gerecycled worden"
},
@ -6882,27 +6906,6 @@
},
"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?"
@ -7533,8 +7536,8 @@
"render": {
"special": {
"question": "In welke talen is er voelbaar schrift (braille) voor navigatie? <img src='./assets/layers/stairs/Braille_stairs.jpg' style='height: 300px; width: auto; display: block;' />",
"render_list_item": "Deze trap heeft voelbaar schrijft in {language():font-bold}",
"render_single_language": "Deze trap heeft voelbaar schrijft in {language():font-bold}"
"render_list_item": "Deze trap heeft voelbaar schrijft in {language()}",
"render_single_language": "Deze trap heeft voelbaar schrijft in {language()}"
}
}
}
@ -7624,12 +7627,6 @@
"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"
},
@ -7653,6 +7650,12 @@
},
"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?"
@ -7965,20 +7968,20 @@
"toilet-changing_table:location": {
"mappings": {
"0": {
"then": "De luiertafel bevindt zich in de vrouwentoiletten "
"then": "Er bevindt zich een luiertafel in de vrouwentoiletten "
},
"1": {
"then": "De luiertafel bevindt zich in de herentoiletten "
"then": "Er bevindt zich een luiertafel in de herentoiletten "
},
"2": {
"then": "De luiertafel bevindt zich in de rolstoeltoegankelijke toilet "
"then": "Er bevindt zich een luiertafel in de rolstoeltoegankelijke toilet "
},
"3": {
"then": "De luiertafel bevindt zich in een daartoe voorziene kamer "
"then": "Er bevindt zich een luiertafel in een daartoe voorziene kamer "
}
},
"question": "Waar bevindt de luiertafel zich?",
"render": "De luiertafel bevindt zich in {changing_table:location}"
"render": "Er bevindt zich een luiertafel in {changing_table:location}"
},
"toilet-charge": {
"freeform": {
@ -8796,6 +8799,30 @@
"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"
},
@ -8826,9 +8853,6 @@
"19": {
"question": "Verkoop van bloemen"
},
"2": {
"question": "Verkoop van snoep"
},
"23": {
"question": "Verkoop van fietslampjes"
},
@ -8843,27 +8867,6 @@
},
"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"
}
}
}
@ -8904,6 +8907,30 @@
"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"
},
@ -8934,9 +8961,6 @@
"19": {
"then": "Parkeerkaarten worden verkocht"
},
"2": {
"then": "Eten wordt verkocht"
},
"21": {
"then": "Openbaar vervoerkaartjes worden verkocht"
},
@ -8954,27 +8978,6 @@
},
"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?",
@ -9267,4 +9270,4 @@
"render": "windturbine"
}
}
}
}

View file

@ -2604,7 +2604,7 @@
"render": {
"special": {
"render_all": "Następujące języki są używane w tej szkole:{list()}",
"render_single_language": "Język {language():font-bold} jest głównym językiem używanym w tej szkole"
"render_single_language": "Język {language()} jest głównym językiem używanym w tej szkole"
}
}
},

View file

@ -500,7 +500,7 @@
"render": {
"special": {
"question": "Em que línguas este multibanco tem saída de fala?",
"render_list_item": "Este multibanco tem saída de fala em {language():font-bold}"
"render_list_item": "Este multibanco tem saída de fala em {language()}"
}
}
}

View file

@ -489,8 +489,8 @@
"render": {
"special": {
"question": "Em quais línguas esse caixa eletrônico tem saída de fala?",
"render_list_item": "Este caixa eletrônico tem saída de fala em {language():font-bold}",
"render_single_language": "Este caixa eletrônico tem saída de fala em {language():font-bold}"
"render_list_item": "Este caixa eletrônico tem saída de fala em {language()}",
"render_single_language": "Este caixa eletrônico tem saída de fala em {language()}"
}
}
}

View file

@ -368,7 +368,6 @@
"uploading": "Traject uploaden…"
},
"useSearch": "Gebruik de zoekfunctie hierboven om meer opties te zien",
"useSearchForMore": "Gebruik de zoekfunctie om {total} meer waarden te vinden…",
"visualFeedback": {
"closestFeaturesAre": "{n} objecten in beeld.",
"east": "Naar het oosten",

View file

@ -345,7 +345,6 @@
"uploadPendingSingle": "Jedna oczekująca zmiana",
"uploadingChanges": "Przesyłanie zmian…",
"useSearch": "Skorzystaj z wyszukiwania powyżej, aby zobaczyć gotowe ustawienia",
"useSearchForMore": "Użyj funkcji wyszukiwania, aby wyszukać w obrębie ponad {total} więcej wartości…",
"waitingForGeopermission": "Oczekiwanie na Twoją zgodę na użycie geolokalizacji…",
"waitingForLocation": "Wyszukiwanie Twojej bieżącej lokalizacji…",
"weekdays": {

View file

@ -868,111 +868,6 @@
},
"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

@ -898,133 +898,6 @@
},
"title": "Bordsteine und Überwege"
},
"mapcomplete-changes": {
"description": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen",
"layers": {
"0": {
"description": "Zeigt alle MapComplete-Änderungen",
"filter": {
"0": {
"options": {
"0": {
"question": "Themename enthält {search}"
}
}
},
"1": {
"options": {
"0": {
"question": "Der Name enthält <b>nicht</b> {search}"
}
}
},
"10": {
"options": {
"0": {
"question": "Etymologie-Thema ausschließen"
}
}
},
"2": {
"options": {
"0": {
"question": "Der Name enthält <b>nicht</b> {search}"
}
}
},
"3": {
"options": {
"0": {
"question": "<b>Nicht</b> erstellt von {search}"
}
}
},
"4": {
"options": {
"0": {
"question": "Erstellt vor {search}"
}
}
},
"5": {
"options": {
"0": {
"question": "Erstellt nach {search}"
}
}
},
"6": {
"options": {
"0": {
"question": "Benutzersprache (ISO-Code) {search}"
}
}
},
"7": {
"options": {
"0": {
"question": "Erstellt mit Host {search}"
}
}
},
"8": {
"options": {
"0": {
"question": "Änderungssatz hat mindestens ein Bild hinzugefügt"
}
}
},
"9": {
"options": {
"0": {
"question": "GRB-Theme ausschließen"
}
}
}
},
"name": "Zentrum der Änderungssätze",
"tagRenderings": {
"contributor": {
"question": "Wer hat diese Änderung vorgenommen?",
"render": "Änderung von <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>"
},
"host": {
"question": "Über welchen Host (Webseite) wurde diese Änderung vorgenommen?",
"render": "Geändert über <a href='{host}'>{host}</a>"
},
"locale": {
"question": "In welcher Benutzersprache wurde diese Änderung vorgenommen?",
"render": "Benutzersprache {locale}"
},
"show_changeset_id": {
"render": "Änderungssatz <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
},
"theme-id": {
"question": "Welches Theme wurde für diese Änderung verwendet?",
"render": "Geändert mit Thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
},
"version": {
"question": "Welche Version von MapComplete wurde verwendet, um diese Änderung vorzunehmen?",
"render": "Erstellt mit {editor}"
}
},
"title": {
"render": "Änderungssatz für {theme}"
}
},
"1": {
"override": {
"tagRenderings+": {
"0": {
"render": "Mehr Statistiken gibt es <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a>"
}
}
}
}
},
"shortDescription": "Zeigt die von MapComplete vorgenommenen Änderungen an",
"title": "Mit MapComplete vorgenommene Änderungen"
},
"maproulette": {
"description": "Thema mit MapRoulette-Aufgaben, die Sie suchen, filtern und beheben können.",
"title": "MapRoulette-Aufgaben"
@ -1056,33 +929,6 @@
"onwheels": {
"description": "Auf dieser Karte können Sie öffentlich zugängliche Orte für Rollstuhlfahrer ansehen, bearbeiten oder hinzufügen",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistik"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Alle vorgeschlagenen Tags hinzufügen"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -1125,6 +971,33 @@
"override": {
"name": "Barrierefreie Parkplätze"
}
},
"19": {
"override": {
"=title": {
"render": "Statistik"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Alle vorgeschlagenen Tags hinzufügen"
}
}
}
}
}
}
},
"title": "Auf Rädern"
@ -1285,6 +1158,10 @@
"stations": {
"description": "Bahnhofsdetails ansehen, bearbeiten und hinzufügen",
"layers": {
"3": {
"description": "Ebene mit Bahnhöfen",
"name": "Bahnhöfe"
},
"16": {
"description": "Anzeigen der Züge, die von diesem Bahnhof abfahren",
"name": "Abfahrtstafeln",
@ -1316,10 +1193,6 @@
"title": {
"render": "Abfahrtstafel"
}
},
"3": {
"description": "Ebene mit Bahnhöfen",
"name": "Bahnhöfe"
}
},
"title": "Bahnhöfe"
@ -1498,4 +1371,4 @@
"shortDescription": "Eine Karte mit Abfalleimern",
"title": "Abfalleimer"
}
}
}

View file

@ -918,13 +918,6 @@
}
}
},
"10": {
"options": {
"0": {
"question": "Exclude etymology theme"
}
}
},
"2": {
"options": {
"0": {
@ -980,6 +973,13 @@
"question": "Exclude GRB theme"
}
}
},
"10": {
"options": {
"0": {
"question": "Exclude etymology theme"
}
}
}
},
"name": "Changeset centers",
@ -1056,33 +1056,6 @@
"onwheels": {
"description": "On this map, publicly weelchair accessible places are shown and can be easily added",
"layers": {
"19": {
"override": {
"=title": {
"render": "Statistics"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Add all the suggested tags"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -1125,10 +1098,88 @@
"override": {
"name": "Disabled parking spaces"
}
},
"19": {
"override": {
"=title": {
"render": "Statistics"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Import"
}
}
},
"1": {
"render": {
"special": {
"message": "Add all the suggested tags"
}
}
}
}
}
}
},
"title": "OnWheels"
},
"openlovemap": {
"description": "<p><i>Love in the palm of your hand</i></p>Open Love Map lists various adult entries, such as brothels, erotic stores and stripclubs.",
"layers": {
"2": {
"override": {
"=presets": {
"0": {
"title": "an erotic shop"
}
},
"name": "Erotic shops"
}
},
"4": {
"override": {
"=presets": {
"0": {
"title": "a condom vending machine"
}
}
}
},
"6": {
"override": {
"=presets": {
"0": {
"title": "an erotic cinema"
}
}
}
},
"9": {
"override": {
"+tagRenderings": {
"0": {
"question": "What type of hotel is this?"
}
}
}
}
},
"overrideAll": {
"tagRenderings+": {
"0": {
"question": "Does {title()} have a private video booth?",
"questionHint": "This is for use by a single person."
}
}
},
"title": "Open Love Map"
},
"openwindpowermap": {
"description": "A map for showing and editing wind turbines.",
"title": "Wind power generators"
@ -1285,6 +1336,10 @@
"stations": {
"description": "View, edit and add details to a train station",
"layers": {
"3": {
"description": "Layer showing train stations",
"name": "Train Stations"
},
"16": {
"description": "Displays showing the trains that will leave from this station",
"name": "Departures boards",
@ -1316,10 +1371,6 @@
"title": {
"render": "Departures board"
}
},
"3": {
"description": "Layer showing train stations",
"name": "Train Stations"
}
},
"title": "Train Stations"
@ -1498,4 +1549,4 @@
"shortDescription": "A map with waste baskets",
"title": "Waste Basket"
}
}
}

View file

@ -898,23 +898,6 @@
},
"title": "Bordillos y cruces"
},
"mapcomplete-changes": {
"description": "Este mapa muestra todos los cambios realizados con MapComplete",
"layers": {
"0": {
"description": "Muestra todos los cambios de MapComplete",
"filter": {
"0": {
"options": {
"0": {
"question": "El nombre del tema contiene {search}"
}
}
}
}
}
}
},
"maproulette": {
"description": "Tema que muestra las tareas de MapRoulette, permitiendo buscarlas, filtrarlas y arreglarlas.",
"title": "Tareas de MapRoulette"
@ -946,33 +929,6 @@
"onwheels": {
"description": "En este mapa se muestran los lugares accesibles al público en silla de ruedas, que pueden añadirse fácilmente",
"layers": {
"19": {
"override": {
"=title": {
"render": "Estadísticas"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Añadir todas las etiquetas sugeridas"
}
}
}
}
}
},
"4": {
"override": {
"filter": {
@ -1015,6 +971,33 @@
"override": {
"name": "Plazas de aparcamiento para discapacitados"
}
},
"19": {
"override": {
"=title": {
"render": "Estadísticas"
}
}
},
"20": {
"override": {
"+tagRenderings": {
"0": {
"render": {
"special": {
"text": "Importar"
}
}
},
"1": {
"render": {
"special": {
"message": "Añadir todas las etiquetas sugeridas"
}
}
}
}
}
}
},
"title": "Sobre ruedas"
@ -1175,6 +1158,10 @@
"stations": {
"description": "Ver, editar y añadir detalles a una estación de tren",
"layers": {
"3": {
"description": "Capa que muestra las estaciones de tren",
"name": "Estación de Tren"
},
"16": {
"description": "Pantallas que muestran los trenes que saldrán de esta estación",
"name": "Tableros de salidas",
@ -1206,10 +1193,6 @@
"title": {
"render": "Tablero de salidas"
}
},
"3": {
"description": "Capa que muestra las estaciones de tren",
"name": "Estación de Tren"
}
},
"title": "Estaciones de tren"
@ -1331,4 +1314,4 @@
"shortDescription": "Un mapa con papeleras",
"title": "Papeleras"
}
}
}

30
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "mapcomplete",
"version": "0.36.12",
"version": "0.37.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "mapcomplete",
"version": "0.36.12",
"version": "0.37.0",
"license": "GPL-3.0-or-later",
"dependencies": {
"@rgossiaux/svelte-headlessui": "^1.0.2",
@ -104,7 +104,7 @@
"ts2json-schema": "^1.4.0",
"tslib": "^2.5.0",
"typescript": "^4.7.4",
"vite": "^4.0.5"
"vite": "^4.5.2"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@ -5343,9 +5343,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001572",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz",
"integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==",
"version": "1.0.30001579",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz",
"integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==",
"dev": true,
"funding": [
{
@ -13298,9 +13298,9 @@
}
},
"node_modules/vite": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
"integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
"integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
"dependencies": {
"esbuild": "^0.18.10",
"postcss": "^8.4.27",
@ -17656,9 +17656,9 @@
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
},
"caniuse-lite": {
"version": "1.0.30001572",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz",
"integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==",
"version": "1.0.30001579",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz",
"integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==",
"dev": true
},
"canvg": {
@ -23616,9 +23616,9 @@
}
},
"vite": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
"integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
"integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
"requires": {
"esbuild": "^0.18.10",
"fsevents": "~2.3.2",

View file

@ -1,6 +1,6 @@
{
"name": "mapcomplete",
"version": "0.36.13",
"version": "0.37.1",
"repository": "https://github.com/pietervdvn/MapComplete",
"description": "A small website to edit OSM easily",
"bugs": "https://github.com/pietervdvn/MapComplete/issues",
@ -202,6 +202,6 @@
"ts2json-schema": "^1.4.0",
"tslib": "^2.5.0",
"typescript": "^4.7.4",
"vite": "^4.0.5"
"vite": "^4.5.2"
}
}

View file

@ -777,10 +777,6 @@ video {
float: left;
}
.m-8 {
margin: 2rem;
}
.m-4 {
margin: 1rem;
}
@ -793,6 +789,10 @@ video {
margin: 0px;
}
.m-8 {
margin: 2rem;
}
.m-2 {
margin: 0.5rem;
}
@ -891,10 +891,6 @@ video {
margin-right: 3rem;
}
.mb-4 {
margin-bottom: 1rem;
}
.mt-4 {
margin-top: 1rem;
}
@ -927,6 +923,10 @@ video {
margin-right: 0.25rem;
}
.mb-4 {
margin-bottom: 1rem;
}
.ml-1 {
margin-left: 0.25rem;
}
@ -1277,6 +1277,12 @@ video {
max-width: 100%;
}
.max-w-fit {
max-width: -webkit-fit-content;
max-width: -moz-fit-content;
max-width: fit-content;
}
.flex-none {
flex: none;
}
@ -2600,6 +2606,10 @@ label.checked:not(.neutral-label) {
border: 2px solid var(--foreground-color);
}
textarea {
color: black;
}
/************************* OTHER CATEGORIES ********************************/
/**

View file

@ -39,7 +39,7 @@ export default class ScriptUtils {
public static DownloadFileTo(url, targetFilePath: string): Promise<void> {
ScriptUtils.erasableLog("Downloading", url, "to", targetFilePath)
return new Promise<void>((resolve, err) => {
return new Promise<void>((resolve) => {
https.get(url, (res) => {
const filePath = fs.createWriteStream(targetFilePath)
res.pipe(filePath)

View file

@ -112,7 +112,7 @@ export class Conflate extends Script {
const changedObjects: OsmObject[] = []
for (const { match, replayed } of bestMatches) {
const { external_feature, d, osm_feature } = match
const { d, osm_feature } = match
const { possibly_imported, certainly_imported, resting_properties } = replayed
const status = resting_properties["status"]
delete resting_properties["status"]

View file

@ -7,6 +7,7 @@ function genImages(dryrun = false) {
"add",
"addSmall",
"back",
"circle",
"blocked",
"brick_wall",
"brick_wall_raw",
@ -33,6 +34,7 @@ function genImages(dryrun = false) {
"duplicate",
"elevator",
"elevator_wheelchair",
"envelope",
"eye",
"filter",
"filter_disable",
@ -65,6 +67,7 @@ function genImages(dryrun = false) {
"mapillary_black",
"mastodon",
"min",
"move",
"move-arrows",
"move_confirm",
"move_not_allowed",
@ -72,13 +75,19 @@ function genImages(dryrun = false) {
"osm_logo_us",
"osm-logo-us",
"party",
"pencil",
"person",
"pin",
"plantnet_logo",
"plus",
"reload",
"resolved",
"ring",
"robot",
"scissors",
"search",
"search_disable",
"share",
"SocialImageForeground",
"speech_bubble",
"speech_bubble_black_outline",
@ -89,8 +98,10 @@ function genImages(dryrun = false) {
"star_outline",
"teardrop",
"teardrop_with_hole_green",
"statistics",
"translate",
"triangle",
"up",
"Upload",
"wikidata",
"wikimedia-commons-white",

View file

@ -5,7 +5,6 @@ import { readFileSync, writeFileSync } from "fs"
import LayoutConfig from "../src/Models/ThemeConfig/LayoutConfig"
import LayerConfig from "../src/Models/ThemeConfig/LayerConfig"
import { Utils } from "../src/Utils"
import TagRenderingConfig from "../src/Models/ThemeConfig/TagRenderingConfig"
/**
* Generates all the files in "Docs/TagInfo". These are picked up by the taginfo project, showing a link to the mapcomplete theme if the key is used

View file

@ -30,17 +30,6 @@ t.OnEveryLanguage((txt, ln) => {
return txt
})
const articles = {
/* de: "eine",
es: 'una',
fr: 'une',
it: 'una',
nb_NO: 'en',
nl: 'een',
pt: 'uma',
pt_BR : 'uma',//*/
}
function reorder(object: object, order: string[]) {
const allKeys = new Set<string>(Object.keys(object))
const copy = {}
@ -54,38 +43,6 @@ function reorder(object: object, order: string[]) {
return copy
}
function addArticleToPresets(layerConfig: { presets?: { title: any }[] }) {
/*
if(layerConfig.presets === undefined){
return
}
for (const preset of layerConfig.presets) {
preset.title = new Translation(preset.title, "autofix")
.OnEveryLanguage((txt, lang) => {
let article = articles[lang]
if(lang === "en"){
if(["a","e","u","o","i"].some(vowel => txt.toLowerCase().startsWith(vowel))) {
article = "an"
}else{
article = "a"
}
}
if(article === undefined){
return txt;
}
if(txt.startsWith(article+" ")){
return txt;
}
if(txt.startsWith("an ")){
return txt;
}
return article +" " + txt.toLowerCase();
})
.translations
}
//*/
}
const layerFiles = ScriptUtils.getLayerFiles()
for (const layerFile of layerFiles) {
try {
@ -95,7 +52,6 @@ for (const layerFile of layerFiles) {
ConversionContext.construct([layerFile.path.split("/").at(-1)], ["update legacy"])
)
)
addArticleToPresets(fixed)
const reordered = reorder(fixed, layerAttributesOrder)
writeFileSync(layerFile.path, JSON.stringify(reordered, null, " ") + "\n")
} catch (e) {
@ -110,11 +66,7 @@ for (const themeFile of themeFiles) {
themeFile.parsed,
ConversionContext.construct([themeFile.path.split("/").at(-1)], ["update legacy layer"])
)
for (const layer of fixed.layers) {
if (layer["presets"] !== undefined) {
addArticleToPresets(<any>layer)
}
}
// extractInlineLayer(fixed)
const endsWithNewline = themeFile.raw.at(-1) === "\n"
const ordered = reorder(fixed, themeAttributesOrder)

View file

@ -15,7 +15,7 @@ export interface ExtraFuncParams {
*/
getFeaturesWithin: (
layerId: string,
bbox: BBox,
bbox: BBox
) => Feature<Geometry, Record<string, string>>[][]
getFeatureById: (id: string) => Feature<Geometry, Record<string, string>>
}
@ -71,7 +71,7 @@ class EnclosingFunc implements ExtraFunction {
if (
GeoOperations.completelyWithin(
<Feature>feat,
<Feature<Polygon | MultiPolygon, any>>otherFeature,
<Feature<Polygon | MultiPolygon, any>>otherFeature
)
) {
result.push({ feat: otherFeature })
@ -162,7 +162,7 @@ class IntersectionFunc implements ExtraFunction {
for (const otherFeature of otherFeatures) {
const intersections = GeoOperations.LineIntersections(
feat,
<Feature<any, Record<string, string>>>otherFeature,
<Feature<any, Record<string, string>>>otherFeature
)
if (intersections.length === 0) {
continue
@ -192,7 +192,7 @@ class DistanceToFunc implements ExtraFunction {
// Feature._lon and ._lat is conveniently place by one of the other metatags
return GeoOperations.distanceBetween(
[arg0, lat],
GeoOperations.centerpointCoordinates(feature),
GeoOperations.centerpointCoordinates(feature)
)
}
if (typeof arg0 === "string") {
@ -207,7 +207,7 @@ class DistanceToFunc implements ExtraFunction {
// arg0 is probably a geojsonfeature
return GeoOperations.distanceBetween(
GeoOperations.centerpointCoordinates(arg0),
GeoOperations.centerpointCoordinates(feature),
GeoOperations.centerpointCoordinates(feature)
)
}
}
@ -253,29 +253,34 @@ class ClosestNObjectFunc implements ExtraFunction {
params: ExtraFuncParams,
feature: any,
features: string | string[] | Feature[],
options?: { maxFeatures?: number; uniqueTag?: string | undefined; maxDistance?: number },
options?: { maxFeatures?: number; uniqueTag?: string | undefined; maxDistance?: number }
): { feat: any; distance: number }[] {
const maxFeatures = options?.maxFeatures ?? 1
const maxDistance = options?.maxDistance ?? 500
const uniqueTag: string | undefined = options?.uniqueTag
let allFeatures: Feature[][]
if (typeof features === "string") {
features = [features]
} else {
allFeatures = []
for (const spec of features) {
if (typeof spec === "string") {
const name = spec
const bbox = GeoOperations.bbox(
GeoOperations.buffer(GeoOperations.bbox(feature), maxDistance),
)
const coors = <[number, number][]>bbox.geometry.coordinates
allFeatures.push(...params.getFeaturesWithin(name, new BBox(coors)))
} else {
allFeatures.push([spec])
}
}
let allFeatures: Feature[][] = []
for (const spec of features) {
if (typeof spec === "string") {
const name = spec
const bbox = GeoOperations.bbox(
GeoOperations.buffer(GeoOperations.bbox(feature), maxDistance)
)
const coors = <[number, number][]>bbox.geometry.coordinates
allFeatures.push(...params.getFeaturesWithin(name, new BBox(coors)))
} else {
allFeatures.push([spec])
}
}
console.log(
"Determining features which are close to",
features,
"other features:",
allFeatures
)
if (features === undefined) {
return
}
@ -283,7 +288,7 @@ class ClosestNObjectFunc implements ExtraFunction {
const selfCenter = GeoOperations.centerpointCoordinates(feature)
let closestFeatures: { feat: any; distance: number }[] = []
for (const feats of allFeatures) {
for (const feats of allFeatures ?? []) {
for (const otherFeature of feats) {
if (otherFeature.properties === undefined) {
console.warn("OtherFeature does not have properties:", otherFeature)
@ -296,14 +301,14 @@ class ClosestNObjectFunc implements ExtraFunction {
}
const distance = GeoOperations.distanceBetween(
GeoOperations.centerpointCoordinates(otherFeature),
selfCenter,
selfCenter
)
if (distance === undefined || distance === null || isNaN(distance)) {
console.error(
"Could not calculate the distance between",
feature,
"and",
otherFeature,
otherFeature
)
throw "Undefined distance!"
}
@ -313,7 +318,7 @@ class ClosestNObjectFunc implements ExtraFunction {
"Got a suspiciously zero distance between",
otherFeature,
"and self-feature",
feature,
feature
)
}
@ -347,7 +352,7 @@ class ClosestNObjectFunc implements ExtraFunction {
const uniqueTagsMatch =
otherFeature.properties[uniqueTag] !== undefined &&
closestFeature.feat.properties[uniqueTag] ===
otherFeature.properties[uniqueTag]
otherFeature.properties[uniqueTag]
if (uniqueTagsMatch) {
targetIndex = -1
if (closestFeature.distance > distance) {
@ -440,7 +445,7 @@ class GetParsed implements ExtraFunction {
return parsed
} catch (e) {
console.warn(
"Could not parse property " + key + " due to: " + e + ", the value is " + value,
"Could not parse property " + key + " due to: " + e + ", the value is " + value
)
return undefined
}
@ -464,10 +469,10 @@ export class ExtraFunctions {
]),
"To enable this feature, add a field `calculatedTags` in the layer object, e.g.:",
"````",
"\"calculatedTags\": [",
" \"_someKey=javascript-expression (lazy execution)\",",
" \"_some_other_key:=javascript expression (strict execution)",
" \"name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator\",",
'"calculatedTags": [',
' "_someKey=javascript-expression (lazy execution)",',
' "_some_other_key:=javascript expression (strict execution)',
' "name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator",',
" \"_distanceCloserThen3Km=distanceTo(feat)( some_lon, some_lat) < 3 ? 'yes' : 'no'\" ",
" ]",
"````",
@ -506,7 +511,7 @@ export class ExtraFunctions {
]
public static constructHelpers(
params: ExtraFuncParams,
params: ExtraFuncParams
): Record<ExtraFuncType, (feature: Feature) => Function> {
const record: Record<string, (feature: GeoJSONFeature) => Function> = {}
for (const f of ExtraFunctions.allFuncs) {

View file

@ -159,7 +159,6 @@ export default class FavouritesFeatureSource extends StaticFeatureSource {
public removeFavourite(feature: Feature, tags?: UIEventSource<Record<string, string>>) {
const id = feature.properties.id.replace("/", "-")
const pref = this._osmConnection.GetPreference("favourite-" + id)
this._osmConnection.preferencesHandler.removeAllWithPrefix("mapcomplete-favourite-" + id)
if (tags) {
delete tags.data._favourite

View file

@ -46,7 +46,6 @@ export default class LayoutSource extends FeatureSourceMerger {
)
const overpassSource = LayoutSource.setupOverpass(
backend,
osmLayers,
bounds,
zoom,
@ -132,7 +131,6 @@ export default class LayoutSource extends FeatureSourceMerger {
}
private static setupOverpass(
backend: string,
osmLayers: LayerConfig[],
bounds: Store<BBox>,
zoom: Store<number>,

View file

@ -48,7 +48,7 @@ export default class NearbyFeatureSource implements FeatureSource {
flayer.layerDef.minzoom,
flayer.isDisplayed
)
calcSource.addCallbackAndRunD((features) => {
calcSource.addCallbackAndRunD(() => {
this.update()
})
this._allSources.push(calcSource)

View file

@ -103,7 +103,7 @@ export default class OverpassFeatureSource implements FeatureSource {
if (!result) {
return
}
const [bounds, date, updatedLayers] = result
const [bounds, _, __] = result
this._lastQueryBBox = bounds
}

View file

@ -133,7 +133,7 @@ export class Mapillary extends ImageProvider {
return [this.PrepareUrlAsync(key, value)]
}
public async DownloadAttribution(url: string): Promise<LicenseInfo> {
public async DownloadAttribution(_: string): Promise<LicenseInfo> {
const license = new LicenseInfo()
license.artist = undefined
license.license = "CC BY-SA 4.0"

View file

@ -15,11 +15,11 @@ export default class Maproulette {
public static readonly STATUS_MEANING = {
0: "Open",
1: "Fixed",
2: "False positive",
2: "False_positive",
3: "Skipped",
4: "Deleted",
5: "Already fixed",
6: "Too hard",
6: "Too_hard",
9: "Disabled",
}
public static singleton = new Maproulette()

View file

@ -416,7 +416,7 @@ export class OsmConnection {
): Promise<{ id: number }> {
if (this._dryRun.data) {
console.warn("Dryrun enabled - not actually uploading GPX ", gpx)
return new Promise<{ id: number }>((ok, error) => {
return new Promise<{ id: number }>((ok) => {
window.setTimeout(
() => ok({ id: Math.floor(Math.random() * 1000) }),
Math.random() * 5000

View file

@ -615,7 +615,7 @@ export default class SimpleMetaTaggers {
isLazy: true,
includesDates: true,
},
(feature, layer, tagsStore) => {
(feature) => {
Utils.AddLazyProperty(feature.properties, "_last_edit:passed_time", () => {
const lastEditTimestamp = new Date(
feature.properties["_last_edit:timestamp"]

View file

@ -20,11 +20,11 @@ export default class ComparingTag implements TagsFilter {
this._boundary = boundary
}
asChange(properties: Record<string, string>): { k: string; v: string }[] {
asChange(_: Record<string, string>): { k: string; v: string }[] {
throw "A comparable tag can not be used to be uploaded to OSM"
}
asHumanString(linkToWiki: boolean, shorten: boolean, properties: Record<string, string>) {
asHumanString() {
return this._key + this._representation + this._boundary
}

View file

@ -1,4 +1,3 @@
import exp from "constants"
import { Utils } from "../../Utils"
export interface TagInfoStats {
@ -16,9 +15,8 @@ export interface TagInfoStats {
}
export default class TagInfo {
private readonly _backend: string
public static readonly global = new TagInfo()
private readonly _backend: string
constructor(backend = "https://taginfo.openstreetmap.org/") {
this._backend = backend

View file

@ -122,7 +122,7 @@ export default class ThemeViewStateHashActor {
private loadStateFromHash(hash: string) {
const state = this._state
const parts = hash.split(":")
outer: for (const { toggle, name, showOverOthers, submenu } of state.guistate.allToggles) {
outer: for (const { toggle, name, submenu } of state.guistate.allToggles) {
for (const part of parts) {
if (part === name) {
toggle.setData(true)

View file

@ -1,11 +1,12 @@
import { Store, UIEventSource } from "../Logic/UIEventSource"
import { BBox } from "../Logic/BBox"
import { RasterLayerPolygon } from "./RasterLayers"
import { B } from "vitest/dist/types-aac763a5"
export interface KeyNavigationEvent {
date: Date
key: "north" | "east" | "south" | "west" | "in" | "out" | "islocked" | "locked" | "unlocked"
}
export interface MapProperties {
readonly location: UIEventSource<{ lon: number; lat: number }>
readonly zoom: UIEventSource<number>

View file

@ -2,7 +2,6 @@ import { LayerConfigJson } from "../Json/LayerConfigJson"
import { Utils } from "../../../Utils"
import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson"
import { ConversionContext } from "./ConversionContext"
import { T } from "vitest/dist/types-aac763a5"
export interface DesugaringContext {
tagRenderings: Map<string, QuestionableTagRenderingConfigJson>
@ -11,10 +10,11 @@ export interface DesugaringContext {
}
export type ConversionMsgLevel = "debug" | "information" | "warning" | "error"
export interface ConversionMessage {
context: ConversionContext
message: string
level: ConversionMsgLevel
readonly context: ConversionContext
readonly message: string
readonly level: ConversionMsgLevel
}
export abstract class Conversion<TIn, TOut> {
@ -85,6 +85,7 @@ export class Pure<TIn, TOut> extends Conversion<TIn, TOut> {
export class Bypass<T> extends DesugaringStep<T> {
private readonly _applyIf: (t: T) => boolean
private readonly _step: DesugaringStep<T>
constructor(applyIf: (t: T) => boolean, step: DesugaringStep<T>) {
super("Applies the step on the object, if the object satisfies the predicate", [], "Bypass")
this._applyIf = applyIf
@ -102,7 +103,6 @@ export class Bypass<T> extends DesugaringStep<T> {
export class Each<X, Y> extends Conversion<X[], Y[]> {
private readonly _step: Conversion<X, Y>
private readonly _msg: string
private readonly _filter: (x: X) => boolean
constructor(step: Conversion<X, Y>, options?: { msg?: string }) {
super(
@ -173,7 +173,7 @@ export class Pass<T> extends Conversion<T, T> {
super(message ?? "Does nothing, often to swap out steps in testing", [], "Pass")
}
convert(json: T, context: ConversionContext): T {
convert(json: T, _: ConversionContext): T {
return json
}
}
@ -224,6 +224,7 @@ export class FirstOf<T, X> extends Conversion<T, X> {
export class Cached<TIn, TOut> extends Conversion<TIn, TOut> {
private _step: Conversion<TIn, TOut>
private readonly key: string
constructor(step: Conversion<TIn, TOut>) {
super("Secretly caches the output for the given input", [], "cached")
this._step = step
@ -242,9 +243,11 @@ export class Cached<TIn, TOut> extends Conversion<TIn, TOut> {
return converted
}
}
export class Fuse<T> extends DesugaringStep<T> {
private readonly steps: DesugaringStep<T>[]
protected debug = false
private readonly steps: DesugaringStep<T>[]
constructor(doc: string, ...steps: DesugaringStep<T>[]) {
super(
(doc ?? "") +
@ -301,7 +304,7 @@ export class SetDefault<T> extends DesugaringStep<T> {
this._overrideEmptyString = overrideEmptyString
}
convert(json: T, context: ConversionContext): T {
convert(json: T, _: ConversionContext): T {
if (json === undefined) {
return undefined
}

View file

@ -1,6 +1,7 @@
import { ConversionMessage, ConversionMsgLevel } from "./Conversion"
export class ConversionContext {
private static reported = false
/**
* The path within the data structure where we are currently operating
*/
@ -10,7 +11,6 @@ export class ConversionContext {
*/
readonly operation: ReadonlyArray<string>
readonly messages: ConversionMessage[]
private _hasErrors: boolean = false
private constructor(
@ -32,7 +32,6 @@ export class ConversionContext {
}
}
}
private static reported = false
public static construct(path: (string | number)[], operation: string[]) {
return new ConversionContext([], [...path], [...operation])
@ -76,6 +75,31 @@ export class ConversionContext {
return "\x1b[31m" + s + "\x1b[0m"
}
/**
* Does an inline edit of the messages for which a new path is defined
* This is a slight hack
* @param rewritePath
*/
public rewriteMessages(
rewritePath: (
p: ReadonlyArray<number | string>
) => undefined | ReadonlyArray<number | string>
): void {
for (let i = 0; i < this.messages.length; i++) {
const m = this.messages[i]
const newPath = rewritePath(m.context.path)
if (!newPath) {
continue
}
const rewrittenContext = new ConversionContext(
this.messages,
newPath,
m.context.operation
)
this.messages[i] = <ConversionMessage>{ ...m, context: rewrittenContext }
}
}
public enter(key: string | number | (string | number)[]) {
if (!Array.isArray(key)) {
if (typeof key === "number" && key < 0) {

View file

@ -24,7 +24,7 @@ export default class CreateNoteImportLayer extends Conversion<LayerConfigJson, L
this._includeClosedNotesDays = includeClosedNotesDays
}
convert(layerJson: LayerConfigJson, context: ConversionContext): LayerConfigJson {
convert(layerJson: LayerConfigJson, _: ConversionContext): LayerConfigJson {
const t = Translations.t.importLayer
/**

View file

@ -589,7 +589,7 @@ export class AddEditingElements extends DesugaringStep<LayerConfigJson> {
this._desugaring = desugaring
}
convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson {
convert(json: LayerConfigJson, _: ConversionContext): LayerConfigJson {
if (this._desugaring.tagRenderings === null) {
return json
}
@ -1088,7 +1088,7 @@ class AddFavouriteBadges extends DesugaringStep<LayerConfigJson> {
)
}
convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson {
convert(json: LayerConfigJson, _: ConversionContext): LayerConfigJson {
if (json.source === "special" || json.source === "special:library") {
return json
}
@ -1113,7 +1113,7 @@ export class AddRatingBadge extends DesugaringStep<LayerConfigJson> {
)
}
convert(json: LayerConfigJson, context: ConversionContext): LayerConfigJson {
convert(json: LayerConfigJson, _: ConversionContext): LayerConfigJson {
if (!json.tagRenderings) {
return json
}

View file

@ -1,4 +1,14 @@
import { Concat, Conversion, DesugaringContext, DesugaringStep, Each, Fuse, On, Pass, SetDefault } from "./Conversion"
import {
Concat,
Conversion,
DesugaringContext,
DesugaringStep,
Each,
Fuse,
On,
Pass,
SetDefault,
} from "./Conversion"
import { LayoutConfigJson } from "../Json/LayoutConfigJson"
import { PrepareLayer } from "./PrepareLayer"
import { LayerConfigJson } from "../Json/LayerConfigJson"
@ -19,7 +29,7 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
super(
"Converts the identifier of a builtin layer into the actual layer, or converts a 'builtin' syntax with override in the fully expanded form. Note that 'tagRenderings+' will be inserted before 'leftover-questions'",
[],
"SubstituteLayer",
"SubstituteLayer"
)
this._state = state
}
@ -70,15 +80,16 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
(found["tagRenderings"] ?? []).length > 0
) {
context.err(
`When overriding a layer, an override is not allowed to override into tagRenderings. Use "+tagRenderings" or "tagRenderings+" instead to prepend or append some questions.`,
`When overriding a layer, an override is not allowed to override into tagRenderings. Use "+tagRenderings" or "tagRenderings+" instead to prepend or append some questions.`
)
}
try {
const trPlus = json["override"]["tagRenderings+"]
if(trPlus){
let index = found.tagRenderings.findIndex(tr => tr["id"] === "leftover-questions")
if(index < 0){
if (trPlus) {
let index = found.tagRenderings.findIndex(
(tr) => tr["id"] === "leftover-questions"
)
if (index < 0) {
index = found.tagRenderings.length
}
found.tagRenderings.splice(index, 0, ...trPlus)
@ -90,14 +101,18 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
} catch (e) {
context.err(
`Could not apply an override due to: ${e}.\nThe override is: ${JSON.stringify(
json["override"],
)}`,
json["override"]
)}`
)
}
if (json["hideTagRenderingsWithLabels"]) {
if (typeof json["hideTagRenderingsWithLabels"] === "string") {
throw "At " + context + ".hideTagRenderingsWithLabels should be a list containing strings, you specified a string"
throw (
"At " +
context +
".hideTagRenderingsWithLabels should be a list containing strings, you specified a string"
)
}
const hideLabels: Set<string> = new Set(json["hideTagRenderingsWithLabels"])
// These labels caused at least one deletion
@ -111,9 +126,9 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
usedLabels.add(labels[forbiddenLabel])
context.info(
"Dropping tagRendering " +
tr["id"] +
" as it has a forbidden label: " +
labels[forbiddenLabel],
tr["id"] +
" as it has a forbidden label: " +
labels[forbiddenLabel]
)
continue
}
@ -122,7 +137,7 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
if (hideLabels.has(tr["id"])) {
usedLabels.add(tr["id"])
context.info(
"Dropping tagRendering " + tr["id"] + " as its id is a forbidden label",
"Dropping tagRendering " + tr["id"] + " as its id is a forbidden label"
)
continue
}
@ -131,10 +146,10 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
usedLabels.add(tr["group"])
context.info(
"Dropping tagRendering " +
tr["id"] +
" as its group `" +
tr["group"] +
"` is a forbidden label",
tr["id"] +
" as its group `" +
tr["group"] +
"` is a forbidden label"
)
continue
}
@ -145,8 +160,8 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
if (unused.length > 0) {
context.err(
"This theme specifies that certain tagrenderings have to be removed based on forbidden layers. One or more of these layers did not match any tagRenderings and caused no deletions: " +
unused.join(", ") +
"\n This means that this label can be removed or that the original tagRendering that should be deleted does not have this label anymore",
unused.join(", ") +
"\n This means that this label can be removed or that the original tagRendering that should be deleted does not have this label anymore"
)
}
found.tagRenderings = filtered
@ -163,7 +178,7 @@ class AddDefaultLayers extends DesugaringStep<LayoutConfigJson> {
super(
"Adds the default layers, namely: " + Constants.added_by_default.join(", "),
["layers"],
"AddDefaultLayers",
"AddDefaultLayers"
)
this._state = state
}
@ -178,7 +193,7 @@ class AddDefaultLayers extends DesugaringStep<LayoutConfigJson> {
if (v === undefined) {
const msg = `Default layer ${layerName} not found. ${state.sharedLayers.size} layers are available`
if (layerName === "favourite") {
context.warn(msg)
// context.warn(msg)
continue
}
context.err(msg)
@ -187,10 +202,10 @@ class AddDefaultLayers extends DesugaringStep<LayoutConfigJson> {
if (alreadyLoaded.has(v.id)) {
context.warn(
"Layout " +
context +
" already has a layer with name " +
v.id +
"; skipping inclusion of this builtin layer",
context +
" already has a layer with name " +
v.id +
"; skipping inclusion of this builtin layer"
)
continue
}
@ -206,14 +221,14 @@ class AddImportLayers extends DesugaringStep<LayoutConfigJson> {
super(
"For every layer in the 'layers'-list, create a new layer which'll import notes. (Note that priviliged layers and layers which have a geojson-source set are ignored)",
["layers"],
"AddImportLayers",
"AddImportLayers"
)
}
convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson {
if (!(json.enableNoteImports ?? true)) {
context.info(
"Not creating a note import layers for theme " + json.id + " as they are disabled",
"Not creating a note import layers for theme " + json.id + " as they are disabled"
)
return json
}
@ -248,7 +263,7 @@ class AddImportLayers extends DesugaringStep<LayoutConfigJson> {
try {
const importLayerResult = creator.convert(
layer,
context.inOperation(this.name).enter(i1),
context.inOperation(this.name).enter(i1)
)
if (importLayerResult !== undefined) {
json.layers.push(importLayerResult)
@ -267,7 +282,7 @@ class AddContextToTranslationsInLayout extends DesugaringStep<LayoutConfigJson>
super(
"Adds context to translations, including the prefix 'themes:json.id'; this is to make sure terms in an 'overrides' or inline layer are linkable too",
["_context"],
"AddContextToTranlationsInLayout",
"AddContextToTranlationsInLayout"
)
}
@ -282,11 +297,11 @@ class ApplyOverrideAll extends DesugaringStep<LayoutConfigJson> {
super(
"Applies 'overrideAll' onto every 'layer'. The 'overrideAll'-field is removed afterwards",
["overrideAll", "layers"],
"ApplyOverrideAll",
"ApplyOverrideAll"
)
}
convert(json: LayoutConfigJson, context: ConversionContext): LayoutConfigJson {
convert(json: LayoutConfigJson, _: ConversionContext): LayoutConfigJson {
const overrideAll = json.overrideAll
if (overrideAll === undefined) {
return json
@ -310,8 +325,9 @@ class ApplyOverrideAll extends DesugaringStep<LayoutConfigJson> {
if (!layer.tagRenderings) {
layer.tagRenderings = tagRenderingsPlus
} else {
let index = layer.tagRenderings.findIndex(tr => tr["id"] === "leftover-questions")
let index = layer.tagRenderings.findIndex(
(tr) => tr["id"] === "leftover-questions"
)
if (index < 0) {
index = layer.tagRenderings.length - 1
}
@ -338,7 +354,7 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
Some layers (e.g. \`all_buildings_and_walls\' or \'streets_with_a_name\') are invisible, so by default, \'force_load\' is set too.
`,
["layers"],
"AddDependencyLayersToTheme",
"AddDependencyLayersToTheme"
)
this._state = state
}
@ -346,7 +362,7 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
private static CalculateDependencies(
alreadyLoaded: LayerConfigJson[],
allKnownLayers: Map<string, LayerConfigJson>,
themeId: string,
themeId: string
): { config: LayerConfigJson; reason: string }[] {
const dependenciesToAdd: { config: LayerConfigJson; reason: string }[] = []
const loadedLayerIds: Set<string> = new Set<string>(alreadyLoaded.map((l) => l.id))
@ -369,7 +385,7 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
for (const layerConfig of alreadyLoaded) {
try {
const layerDeps = DependencyCalculator.getLayerDependencies(
new LayerConfig(layerConfig, themeId + "(dependencies)"),
new LayerConfig(layerConfig, themeId + "(dependencies)")
)
dependencies.push(...layerDeps)
} catch (e) {
@ -406,10 +422,10 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
if (dep === undefined) {
const message = [
"Loading a dependency failed: layer " +
unmetDependency.neededLayer +
" is not found, neither as layer of " +
themeId +
" nor as builtin layer.",
unmetDependency.neededLayer +
" is not found, neither as layer of " +
themeId +
" nor as builtin layer.",
reason,
"Loaded layers are: " + alreadyLoaded.map((l) => l.id).join(","),
]
@ -425,7 +441,7 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
})
loadedLayerIds.add(dep.id)
unmetDependencies = unmetDependencies.filter(
(d) => d.neededLayer !== unmetDependency.neededLayer,
(d) => d.neededLayer !== unmetDependency.neededLayer
)
}
} while (unmetDependencies.length > 0)
@ -446,14 +462,12 @@ class AddDependencyLayersToTheme extends DesugaringStep<LayoutConfigJson> {
const dependencies = AddDependencyLayersToTheme.CalculateDependencies(
layers,
allKnownLayers,
theme.id,
theme.id
)
for (const dependency of dependencies) {
}
if (dependencies.length > 0) {
for (const dependency of dependencies) {
context.info(
"Added " + dependency.config.id + " to the theme. " + dependency.reason,
"Added " + dependency.config.id + " to the theme. " + dependency.reason
)
}
}
@ -495,7 +509,7 @@ class WarnForUnsubstitutedLayersInTheme extends DesugaringStep<LayoutConfigJson>
super(
"Generates a warning if a theme uses an unsubstituted layer",
["layers"],
"WarnForUnsubstitutedLayersInTheme",
"WarnForUnsubstitutedLayersInTheme"
)
}
@ -507,7 +521,7 @@ class WarnForUnsubstitutedLayersInTheme extends DesugaringStep<LayoutConfigJson>
context
.enter("layers")
.err(
"No layers are defined. You must define at least one layer to have a valid theme",
"No layers are defined. You must define at least one layer to have a valid theme"
)
return json
}
@ -531,10 +545,10 @@ class WarnForUnsubstitutedLayersInTheme extends DesugaringStep<LayoutConfigJson>
context.warn(
"The theme " +
json.id +
" has an inline layer: " +
layer["id"] +
". This is discouraged.",
json.id +
" has an inline layer: " +
layer["id"] +
". This is discouraged."
)
}
return json
@ -548,7 +562,7 @@ export class PrepareTheme extends Fuse<LayoutConfigJson> {
state: DesugaringContext,
options?: {
skipDefaultLayers: false | boolean
},
}
) {
super(
"Fully prepares and expands a theme",
@ -569,7 +583,7 @@ export class PrepareTheme extends Fuse<LayoutConfigJson> {
? new Pass("AddDefaultLayers is disabled due to the set flag")
: new AddDefaultLayers(state),
new AddDependencyLayersToTheme(state),
new AddImportLayers(),
new AddImportLayers()
)
this.state = state
}
@ -584,13 +598,13 @@ export class PrepareTheme extends Fuse<LayoutConfigJson> {
const needsNodeDatabase = result.layers?.some((l: LayerConfigJson) =>
l.tagRenderings?.some((tr) =>
ValidationUtils.getSpecialVisualisations(<any>tr)?.some(
(special) => special.needsNodeDatabase,
),
),
(special) => special.needsNodeDatabase
)
)
)
if (needsNodeDatabase) {
context.info(
"Setting 'enableNodeDatabase' as this theme uses a special visualisation which needs to keep track of _all_ nodes",
"Setting 'enableNodeDatabase' as this theme uses a special visualisation which needs to keep track of _all_ nodes"
)
result.enableNodeDatabase = true
}

View file

@ -13,7 +13,10 @@ import { And } from "../../../Logic/Tags/And"
import Translations from "../../../UI/i18n/Translations"
import FilterConfigJson from "../Json/FilterConfigJson"
import DeleteConfig from "../DeleteConfig"
import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson"
import {
MappingConfigJson,
QuestionableTagRenderingConfigJson,
} from "../Json/QuestionableTagRenderingConfigJson"
import Validators from "../../../UI/InputElement/Validators"
import TagRenderingConfig from "../TagRenderingConfig"
import { parse as parse_html } from "node-html-parser"
@ -21,9 +24,7 @@ import PresetConfig from "../PresetConfig"
import { TagsFilter } from "../../../Logic/Tags/TagsFilter"
import { Translatable } from "../Json/Translatable"
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> {
@ -178,7 +179,7 @@ export class ValidateTheme extends DesugaringStep<LayoutConfigJson> {
if (!json.title) {
context.enter("title").err(`The theme ${json.id} does not have a title defined.`)
}
if(!json.icon){
if (!json.icon) {
context.enter("icon").err("A theme should have an icon")
}
if (this._isBuiltin && this._extractImages !== undefined) {
@ -848,13 +849,32 @@ class MiscTagRenderingChecks extends DesugaringStep<TagRenderingConfigJson> {
CheckTranslation.allowUndefined.convert(json[key], context.enter(key))
}
for (let i = 0; i < json.mappings?.length ?? 0; i++) {
const mapping = json.mappings[i]
const mapping: MappingConfigJson = json.mappings[i]
CheckTranslation.noUndefined.convert(
mapping.then,
context.enters("mappings", i, "then")
)
if (!mapping.if) {
context.enters("mappings", i).err("No `if` is defined")
console.log(
"Checking mappings",
i,
"if",
mapping.if,
context.path.join("."),
mapping.then
)
context.enters("mappings", i, "if").err("No `if` is defined")
}
if (mapping.addExtraTags) {
for (let j = 0; j < mapping.addExtraTags.length; j++) {
if (!mapping.addExtraTags[j]) {
context
.enters("mappings", i, "addExtraTags", j)
.err(
"Detected a 'null' or 'undefined' value. Either specify a tag or delete this item"
)
}
}
}
const en = mapping?.then?.["en"]
if (en && this.detectYesOrNo(en)) {
@ -981,6 +1001,9 @@ class MiscTagRenderingChecks extends DesugaringStep<TagRenderingConfigJson> {
}
}
if (context.hasErrors()) {
return undefined
}
return json
}
@ -1000,6 +1023,7 @@ export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> {
constructor(layerConfig?: LayerConfigJson, doesImageExist?: DoesImageExist) {
super(
"Various validation on tagRenderingConfigs",
new MiscTagRenderingChecks(),
new DetectShadowedMappings(layerConfig),
new DetectConflictingAddExtraTags(),
// TODO enable new DetectNonErasedKeysInMappings(),
@ -1007,8 +1031,7 @@ export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> {
new On("render", new ValidatePossibleLinks()),
new On("question", new ValidatePossibleLinks()),
new On("questionHint", new ValidatePossibleLinks()),
new On("mappings", new Each(new On("then", new ValidatePossibleLinks()))),
new MiscTagRenderingChecks()
new On("mappings", new Each(new On("then", new ValidatePossibleLinks())))
)
}
}
@ -1023,7 +1046,12 @@ export class PrevalidateLayer extends DesugaringStep<LayerConfigJson> {
private readonly _studioValidations: boolean
private readonly _validatePointRendering = new ValidatePointRendering()
constructor(path: string, isBuiltin, doesImageExist, studioValidations) {
constructor(
path: string,
isBuiltin: boolean,
doesImageExist: DoesImageExist,
studioValidations: boolean
) {
super("Runs various checks against common mistakes for a layer", [], "PrevalidateLayer")
this._path = path
this._isBuiltin = isBuiltin
@ -1111,7 +1139,9 @@ 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)))
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'")
@ -1138,7 +1168,7 @@ export class PrevalidateLayer extends DesugaringStep<LayerConfigJson> {
}
if (json.tagRenderings !== undefined && json.tagRenderings.length > 0) {
new On("tagRendering", new Each(new ValidateTagRenderings(json)))
new On("tagRenderings", new Each(new ValidateTagRenderings(json)))
if (json.title === undefined && json.source !== "special:library") {
context
.enter("title")
@ -1428,29 +1458,33 @@ class ValidatePointRendering extends DesugaringStep<PointRenderingConfigJson> {
}
if (json["markers"]) {
context.enter("markers").err(`Detected a field 'markerS' in pointRendering. It is written as a singular case`)
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"
)
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. "
)
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

@ -3,7 +3,6 @@ import { Utils } from "../../../Utils"
import SpecialVisualizations from "../../../UI/SpecialVisualizations"
import { RenderingSpecification, SpecialVisualization } from "../../../UI/SpecialVisualization"
import { QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson"
import { render } from "sass"
export default class ValidationUtils {
public static getAllSpecialVisualisations(

View file

@ -3,7 +3,6 @@ import { ExtraFuncParams, ExtraFunctions } from "../../Logic/ExtraFunctions"
import LayerConfig from "./LayerConfig"
import { SpecialVisualization } from "../../UI/SpecialVisualization"
import SpecialVisualizations from "../../UI/SpecialVisualizations"
import { Exception } from "sass"
export default class DependencyCalculator {
public static GetTagRenderingDependencies(tr: TagRenderingConfig): string[] {

View file

@ -17,7 +17,6 @@ import {
import { FixedUiElement } from "../../UI/Base/FixedUiElement"
import Validators, { ValidatorType } from "../../UI/InputElement/Validators"
import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson"
import Constants from "../Constants"
import { RegexTag } from "../../Logic/Tags/RegexTag"
export interface Icon {}

View file

@ -1,6 +1,4 @@
import BaseUIElement from "../UI/BaseUIElement"
import { FixedUiElement } from "../UI/Base/FixedUiElement"
import Combine from "../UI/Base/Combine"
import { Denomination } from "./Denomination"
import UnitConfigJson from "./ThemeConfig/Json/UnitConfigJson"
import unit from "../../assets/layers/unit/unit.json"
@ -198,6 +196,7 @@ export class Unit {
const loaded = this.getFromLibrary(toLoad.quantity, ctx)
const quantity = toLoad.quantity
function fetchDenom(d: string): Denomination {
const found = loaded.denominations.find(
(denom) => denom.canonical.toLowerCase() === d

View file

@ -19,7 +19,7 @@
import { LayoutInformation } from "../Models/ThemeConfig/LayoutConfig"
import * as themeOverview from "../assets/generated/theme_overview.json"
import UnofficialThemeList from "./BigComponents/UnofficialThemeList.svelte"
import Eye from "@babeard/svelte-heroicons/mini/Eye"
import Eye from "../assets/svg/Eye.svelte"
const featureSwitches = new OsmConnectionFeatureSwitches()
const osmConnection = new OsmConnection({
@ -56,7 +56,7 @@
.filter((key) => key.startsWith(prefix))
.map((key) => key.substring(prefix.length, key.length - "-enabled".length))
)
return hiddenThemes.filter((theme) => knownIds.has(theme.id))
return hiddenThemes.filter((theme) => knownIds.has(theme.id) || state.osmConnection.userDetails.data.name === "Pieter Vander Vennet")
})
}
</script>

View file

@ -1,7 +1,6 @@
import { VariableUiElement } from "./VariableUIElement"
import Locale from "../i18n/Locale"
import Link from "./Link"
import Svg from "../../Svg"
import SvelteUIElement from "./SvelteUIElement"
import Translate from "../../assets/svg/Translate.svelte"

View file

@ -1,6 +1,4 @@
<script lang="ts">
import ToSvelte from "./ToSvelte.svelte"
import Svg from "../../Svg"
import { twMerge } from "tailwind-merge"
import Loading from "../../assets/svg/Loading.svelte"
@ -9,7 +7,7 @@
<div class={twMerge("flex p-1 pl-2", cls)}>
<div class="min-w-6 h-6 w-6 shrink-0 animate-spin self-center">
<Loading/>
<Loading />
</div>
<div class="ml-2">
<slot />

View file

@ -2,15 +2,14 @@
import { OsmConnection } from "../../Logic/Osm/OsmConnection"
import Translations from "../i18n/Translations.js"
import Tr from "./Tr.svelte"
import ToSvelte from "./ToSvelte.svelte"
import Svg from "../../Svg"
import Login from "../../assets/svg/Login.svelte"
export let osmConnection: OsmConnection
export let clss: string | undefined = undefined
</script>
<button class={clss} on:click={() => osmConnection.AttemptLogin()} style="margin-left: 0">
<ToSvelte construct={Svg.login_svg().SetClass("w-12 m-1")} />
<Login class="w-12 m-1" />
<slot>
<Tr t={Translations.t.general.loginWithOpenStreetMap} />
</slot>

View file

@ -1,5 +1,5 @@
import BaseUIElement from "../BaseUIElement"
import { Store, UIEventSource } from "../../Logic/UIEventSource"
import { Store } from "../../Logic/UIEventSource"
import { UIElement } from "../UIElement"
import SvelteUIElement from "./SvelteUIElement"
import SubtleLink from "./SubtleLink.svelte"

View file

@ -1,88 +0,0 @@
<script lang="ts">
import { Store, UIEventSource } from "../../Logic/UIEventSource"
import type { RasterLayerPolygon } from "../../Models/RasterLayers"
import { AvailableRasterLayers } from "../../Models/RasterLayers"
import { createEventDispatcher, onDestroy } from "svelte"
import Svg from "../../Svg"
import { Map as MlMap } from "maplibre-gl"
import type { MapProperties } from "../../Models/MapProperties"
import OverlayMap from "../Map/OverlayMap.svelte"
import RasterLayerPicker from "../Map/RasterLayerPicker.svelte"
export let mapproperties: MapProperties
export let normalMap: UIEventSource<MlMap>
/**
* The current background (raster) layer of the polygon.
* This is undefined if a vector layer is used
*/
let rasterLayer: UIEventSource<RasterLayerPolygon | undefined> = mapproperties.rasterLayer
let name = rasterLayer.data?.properties?.name
let icon = Svg.satellite_svg()
onDestroy(
rasterLayer.addCallback((polygon) => {
name = polygon.properties?.name
})
)
/**
* The layers that this component can offer as a choice.
*/
export let availableRasterLayers: Store<RasterLayerPolygon[]>
let raster0 = new UIEventSource<RasterLayerPolygon>(undefined)
let raster1 = new UIEventSource<RasterLayerPolygon>(undefined)
let currentLayer: RasterLayerPolygon
function updatedAltLayer() {
const available = availableRasterLayers.data
const current = rasterLayer.data
const defaultLayer = AvailableRasterLayers.maptilerDefaultLayer
const firstOther = available.find((l) => l !== defaultLayer)
const secondOther = available.find((l) => l !== defaultLayer && l !== firstOther)
raster0.setData(firstOther === current ? defaultLayer : firstOther)
raster1.setData(secondOther === current ? defaultLayer : secondOther)
}
updatedAltLayer()
onDestroy(mapproperties.rasterLayer.addCallbackAndRunD(updatedAltLayer))
onDestroy(availableRasterLayers.addCallbackAndRunD(updatedAltLayer))
function use(rasterLayer: UIEventSource<RasterLayerPolygon>): () => void {
return () => {
currentLayer = undefined
mapproperties.rasterLayer.setData(rasterLayer.data)
}
}
const dispatch = createEventDispatcher<{ copyright_clicked }>()
</script>
<div class="flex items-end opacity-50 hover:opacity-100">
<div class="flex flex-col md:flex-row">
<button class="m-0 h-12 w-16 overflow-hidden p-0 md:h-16 md:w-16" on:click={use(raster0)}>
<OverlayMap
placedOverMap={normalMap}
placedOverMapProperties={mapproperties}
rasterLayer={raster0}
/>
</button>
<button class="m-0 h-12 w-16 overflow-hidden p-0 md:h-16 md:w-16" on:click={use(raster1)}>
<OverlayMap
placedOverMap={normalMap}
placedOverMapProperties={mapproperties}
rasterLayer={raster1}
/>
</button>
</div>
<div class="ml-1 flex h-fit flex-col gap-y-1 text-sm">
<div class="low-interaction w-64 rounded p-1">
<RasterLayerPicker
availableLayers={availableRasterLayers}
value={mapproperties.rasterLayer}
/>
</div>
<button class="small" on:click={() => dispatch("copyright_clicked")}>© OpenStreetMap</button>
</div>
</div>

View file

@ -5,7 +5,9 @@ import Combine from "../Base/Combine"
import { FixedUiElement } from "../Base/FixedUiElement"
import { Utils } from "../../Utils"
import BaseUIElement from "../BaseUIElement"
import Svg from "../../Svg"
import SvelteUIElement from "../Base/SvelteUIElement"
import Up from "../../assets/svg/Up.svelte"
import Circle from "../../assets/svg/Circle.svelte"
export default class Histogram<T> extends VariableUiElement {
private static defaultPalette = [
@ -34,11 +36,11 @@ export default class Histogram<T> extends VariableUiElement {
sortMode.map((m) => {
switch (m) {
case "name":
return Svg.up_svg()
return new SvelteUIElement(Up)
case "name-rev":
return Svg.up_svg().SetStyle("transform: rotate(180deg)")
return new SvelteUIElement(Up).SetStyle("transform: rotate(180deg)")
default:
return Svg.circle_svg()
return new SvelteUIElement(Circle)
}
})
)
@ -56,11 +58,11 @@ export default class Histogram<T> extends VariableUiElement {
sortMode.map((m) => {
switch (m) {
case "count":
return Svg.up_svg()
return new SvelteUIElement(Up)
case "count-rev":
return Svg.up_svg().SetStyle("transform: rotate(180deg)")
return new SvelteUIElement(Up).SetStyle("transform: rotate(180deg)")
default:
return Svg.circle_svg()
return new SvelteUIElement(Circle)
}
})
)

View file

@ -1,11 +0,0 @@
import Combine from "../Base/Combine"
import Translations from "../i18n/Translations"
import { FixedUiElement } from "../Base/FixedUiElement"
export default class IndexText extends Combine {
constructor() {
super([])
this.SetClass("flex flex-row")
}
}

View file

@ -17,6 +17,7 @@
import ToSvelte from "../Base/ToSvelte.svelte"
import Translations from "../i18n/Translations"
import Tr from "../Base/Tr.svelte"
import Search_disable from "../../assets/svg/Search_disable.svelte"
export let search: UIEventSource<string>
@ -27,8 +28,8 @@
<h5>{t.noMatchingThemes.toString()}</h5>
<div class="flex justify-center">
<button on:click={() => search.setData("")}>
<ToSvelte construct={Svg.search_disable_svg().SetClass("w-6 mr-2")} />
<Tr slot="message" t={t.noSearch} />
<Search_disable class="w-6 mr-2" />
<Tr t={t.noSearch} />
</button>
</div>
</div>

View file

@ -4,7 +4,6 @@
**/
import Motion from "../../Sensors/Motion"
import { Geocoding } from "../../Logic/Osm/Geocoding"
import type { MapProperties } from "../../Models/MapProperties"
import Hotkeys from "../Base/Hotkeys"
import Translations from "../i18n/Translations"
import Locale from "../i18n/Locale"
@ -21,7 +20,7 @@
let result = await Geocoding.reverse(
mapProperties.location.data,
mapProperties.zoom.data,
Locale.language.data
Locale.language.data,
)
let properties = result.features[0].properties
currentLocation = properties.display_name
@ -45,7 +44,7 @@
() => {
displayLocation()
},
[Translations.t.hotkeyDocumentation.shakePhone]
[Translations.t.hotkeyDocumentation.shakePhone],
)
Motion.singleton.startListening()

View file

@ -36,7 +36,7 @@
</h3>
<div
class="no-weblate title-icons links-as-button mr-2 flex flex-row flex-wrap items-center gap-x-0.5 p-1 pt-0.5 sm:pt-1"
class="no-weblate title-icons links-as-button mr-2 flex flex-row flex-wrap items-center gap-x-0.5 pt-0.5 sm:pt-1"
>
{#each layer.titleIcons as titleIconConfig}
{#if (titleIconConfig.condition?.matchesProperties($tags) ?? true) && (titleIconConfig.metacondition?.matchesProperties({ ...$metatags, ...$tags }) ?? true) && titleIconConfig.IsKnown($tags)}

View file

@ -14,6 +14,7 @@
import Svg from "../../Svg"
import ToSvelte from "../Base/ToSvelte.svelte"
import { DocumentDuplicateIcon } from "@rgossiaux/svelte-heroicons/outline"
import Share from "../../assets/svg/Share.svelte"
export let state: ThemeViewState
const tr = Translations.t.general.sharescreen
@ -73,7 +74,7 @@
<div class="flex">
{#if typeof navigator?.share === "function"}
<button class="h-8 w-8 shrink-0 p-1" on:click={shareCurrentLink}>
<ToSvelte construct={Svg.share_svg()} />
<Share/>
</button>
{/if}
{#if navigator.clipboard !== undefined}

View file

@ -4,7 +4,6 @@
import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
import TagRenderingAnswer from "../Popup/TagRendering/TagRenderingAnswer.svelte"
import DirectionIndicator from "../Base/DirectionIndicator.svelte"
import ThemeViewState from "../../Models/ThemeViewState"
export let state: SpecialVisualizationState
export let feature: Feature

View file

@ -27,7 +27,7 @@
mapExtent: state.mapProperties.bounds.data,
width: maindiv.offsetWidth,
height: maindiv.offsetHeight,
noSelfIntersectingLines: true,
noSelfIntersectingLines,
})
}
</script>

View file

@ -4,7 +4,6 @@
import type { Feature } from "geojson"
import { UIEventSource } from "../../Logic/UIEventSource"
import { GeoOperations } from "../../Logic/GeoOperations"
import DirectionIndicator from "../Base/DirectionIndicator.svelte"
export let feature: Feature
let properties: Record<string, string> = feature.properties
@ -52,7 +51,7 @@
class="title-icons links-as-button flex flex-wrap items-center gap-x-0.5 self-end justify-self-end p-1 pt-0.5 sm:pt-1"
>
{#each favConfig.titleIcons as titleIconConfig}
{#if titleIconBlacklist.indexOf(titleIconConfig.id) < 0 && (titleIconConfig.condition?.matchesProperties(properties) ?? true) && (titleIconConfig.metacondition?.matchesProperties( { ...properties, ...state.userRelatedState.preferencesAsTags.data } ) ?? true) && titleIconConfig.IsKnown(properties)}
{#if titleIconBlacklist.indexOf(titleIconConfig.id) < 0 && (titleIconConfig.condition?.matchesProperties(properties) ?? true) && (titleIconConfig.metacondition?.matchesProperties({ ...properties, ...state.userRelatedState.preferencesAsTags.data }) ?? true) && titleIconConfig.IsKnown(properties)}
<div class={titleIconConfig.renderIconClass ?? "flex h-8 w-8 items-center"}>
<TagRenderingAnswer
config={titleIconConfig}

Some files were not shown because too many files have changed in this diff Show more