Fix tests, refactoring kindof works now

This commit is contained in:
Pieter Vander Vennet 2020-10-28 11:19:47 +01:00
parent 813e96f8df
commit 1447863fa7
11 changed files with 307 additions and 254 deletions

View file

@ -1,6 +1,6 @@
import {AndOrTagConfigJson} from "./TagConfigJson"; import {AndOrTagConfigJson} from "./TagConfigJson";
import {And, Or, RegexTag, Tag, TagsFilter} from "../../Logic/Tags"; import {And, Or, RegexTag, Tag, TagsFilter} from "../../Logic/Tags";
import Translation from "../../UI/i18n/Translation"; import {Translation} from "../../UI/i18n/Translations";
import {Utils} from "../../Utils"; import {Utils} from "../../Utils";

View file

@ -1,4 +1,4 @@
import Translation from "../../UI/i18n/Translation"; import {Translation} from "../../UI/i18n/Translations";
import {TagsFilter} from "../../Logic/Tags"; import {TagsFilter} from "../../Logic/Tags";
import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; import {TagRenderingConfigJson} from "./TagRenderingConfigJson";
import Translations from "../../UI/i18n/Translations"; import Translations from "../../UI/i18n/Translations";

View file

@ -1,6 +1,4 @@
import {Utils} from "../Utils"; import {Utils} from "../Utils";
import {Util} from "leaflet";
import indexOf = Util.indexOf;
export abstract class TagsFilter { export abstract class TagsFilter {
abstract matches(tags: { k: string, v: string }[]): boolean abstract matches(tags: { k: string, v: string }[]): boolean
@ -298,21 +296,49 @@ export class And extends TagsFilter {
} }
isEquivalent(other: TagsFilter): boolean { isEquivalent(other: TagsFilter): boolean {
if(other instanceof And){ if (!(other instanceof And)) {
return false;
}
for (const selfTag of this.and) { for (const selfTag of this.and) {
let matchFound = false; let matchFound = false;
for (let i = 0; i < other.and.length && !matchFound; i++){ for (let i = 0; i < other.and.length && !matchFound; i++) {
let otherTag = other.and[i]; let otherTag = other.and[i];
matchFound = selfTag.isEquivalent(otherTag); matchFound = selfTag.isEquivalent(otherTag);
} }
if(!matchFound){ if (!matchFound) {
return false; return false;
}
}
for (const selfTag of this.and) {
let matchFound = false;
for (const otherTag of other.and) {
matchFound = selfTag.isEquivalent(otherTag);
if (matchFound) {
break;
} }
} }
return true; if (!matchFound) {
return false;
}
} }
return false;
for (const otherTag of other.and) {
let matchFound = false;
for (const selfTag of this.and) {
matchFound = selfTag.isEquivalent(otherTag);
if (matchFound) {
break;
}
}
if (!matchFound) {
return false;
}
}
return true;
} }
} }
@ -356,7 +382,7 @@ export class TagUtils {
} }
const neededValues : string[] = neededTags[neededKey]; const neededValues : string[] = neededTags[neededKey];
for (const neededValue of neededValues) { for (const neededValue of neededValues) {
if(indexOf(availableValues, neededValue) < 0){ if (availableValues.indexOf(neededValue) < 0) {
return false; return false;
} }
} }

View file

@ -27,7 +27,6 @@ export default class QuestionBox extends UIElement {
.map((tagRendering, i) => new TagRenderingQuestion(this._tags, tagRendering, .map((tagRendering, i) => new TagRenderingQuestion(this._tags, tagRendering,
() => { () => {
// We save // We save
self._skippedQuestions.data.push(i)
self._skippedQuestions.ping(); self._skippedQuestions.ping();
}, },
Translations.t.general.skip.Clone() Translations.t.general.skip.Clone()

View file

@ -18,6 +18,11 @@ export default class TagRenderingAnswer extends UIElement {
} }
InnerRender(): string { InnerRender(): string {
if(this._configuration.condition !== undefined){
if(!this._configuration.condition.matchesProperties(this._tags.data)){
return "";
}
}
const tr = this._configuration.GetRenderValue(this._tags.data); const tr = this._configuration.GetRenderValue(this._tags.data);
if(tr === undefined){ if(tr === undefined){
return ""; return "";

View file

@ -5,7 +5,7 @@ import TagRenderingConfig from "../../Customizations/JSON/TagRenderingConfig";
import {InputElement} from "../Input/InputElement"; import {InputElement} from "../Input/InputElement";
import {And, Tag, TagsFilter, TagUtils} from "../../Logic/Tags"; import {And, Tag, TagsFilter, TagUtils} from "../../Logic/Tags";
import ValidatedTextField from "../Input/ValidatedTextField"; import ValidatedTextField from "../Input/ValidatedTextField";
import Translation from "../i18n/Translation"; import {Translation} from "../i18n/Translations";
import {FixedInputElement} from "../Input/FixedInputElement"; import {FixedInputElement} from "../Input/FixedInputElement";
import {SubstitutedTranslation} from "../SpecialVisualizations"; import {SubstitutedTranslation} from "../SpecialVisualizations";
import {RadioButton} from "../Input/RadioButton"; import {RadioButton} from "../Input/RadioButton";
@ -18,8 +18,6 @@ import {Changes} from "../../Logic/Osm/Changes";
import {VariableUiElement} from "../Base/VariableUIElement"; import {VariableUiElement} from "../Base/VariableUIElement";
import Translations from "../i18n/Translations"; import Translations from "../i18n/Translations";
import {FixedUiElement} from "../Base/FixedUiElement"; import {FixedUiElement} from "../Base/FixedUiElement";
import {Util} from "leaflet";
import indexOf = Util.indexOf;
/** /**
* Shows the question element. * Shows the question element.
@ -114,16 +112,13 @@ export default class TagRenderingQuestion extends UIElement {
} }
private SplitMultiAnswer(tags: TagsFilter) {
}
private GenerateMultiAnswer(elements: InputElement<TagsFilter>[], freeformField: InputElement<TagsFilter>): InputElement<TagsFilter> { private GenerateMultiAnswer(elements: InputElement<TagsFilter>[], freeformField: InputElement<TagsFilter>): InputElement<TagsFilter> {
const possibleTags = elements.map(el => el.GetValue().data); const possibleTags = elements.map(el => el.GetValue().data);
const checkBoxes = new CheckBoxes(elements); const checkBoxes = new CheckBoxes(elements);
const inputEl = new InputElementMap<number[], TagsFilter>( const inputEl = new InputElementMap<number[], TagsFilter>(
checkBoxes, checkBoxes,
(t0, t1) => { (t0, t1) => {
console.log("IsEquiv?",t0, t1, t0?.isEquivalent(t1))
return t0?.isEquivalent(t1) ?? false return t0?.isEquivalent(t1) ?? false
}, },
(indices) => { (indices) => {
@ -131,7 +126,8 @@ export default class TagRenderingQuestion extends UIElement {
return undefined; return undefined;
} }
const tags: TagsFilter[] = indices.map(i => elements[i].GetValue().data); const tags: TagsFilter[] = indices.map(i => elements[i].GetValue().data);
return TagUtils.FlattenMultiAnswer(tags); const multi = TagUtils.FlattenMultiAnswer(tags);
return multi;
}, },
(tags: TagsFilter) => { (tags: TagsFilter) => {
// {key --> values[]} // {key --> values[]}
@ -171,7 +167,7 @@ export default class TagRenderingQuestion extends UIElement {
if (freeformField) { if (freeformField) {
if (freeformExtras.length > 0) { if (freeformExtras.length > 0) {
freeformField.GetValue().setData(new Tag(this._configuration.freeform.key, freeformExtras.join(";"))); freeformField.GetValue().setData(new Tag(this._configuration.freeform.key, freeformExtras.join(";")));
indices.push(indexOf(elements, freeformField)) indices.push(elements.indexOf(freeformField))
} else { } else {
freeformField.GetValue().setData(undefined); freeformField.GetValue().setData(undefined);
} }

View file

@ -4,7 +4,7 @@ import {UIEventSource} from "../Logic/UIEventSource";
import {VariableUiElement} from "./Base/VariableUIElement"; import {VariableUiElement} from "./Base/VariableUIElement";
import LiveQueryHandler from "../Logic/Web/LiveQueryHandler"; import LiveQueryHandler from "../Logic/Web/LiveQueryHandler";
import {ImageCarousel} from "./Image/ImageCarousel"; import {ImageCarousel} from "./Image/ImageCarousel";
import Translation from "./i18n/Translation"; import {Translation} from "./i18n/Translations";
import Combine from "./Base/Combine"; import Combine from "./Base/Combine";
import {FixedUiElement} from "./Base/FixedUiElement"; import {FixedUiElement} from "./Base/FixedUiElement";
import Locale from "../UI/i18n/Locale"; import Locale from "../UI/i18n/Locale";

View file

@ -3,104 +3,3 @@ import Locale from "./Locale"
import Combine from "../Base/Combine"; import Combine from "../Base/Combine";
import {Utils} from "../../Utils"; import {Utils} from "../../Utils";
export default class Translation extends UIElement {
private static forcedLanguage = undefined;
public Subs(text: any): Translation {
const newTranslations = {};
for (const lang in this.translations) {
let template: string = this.translations[lang];
for (const k in text) {
const combined = [];
const parts = template.split("{" + k + "}");
const el: string | UIElement = text[k];
if (el === undefined) {
continue;
}
let rtext: string = "";
if (typeof (el) === "string") {
rtext = el;
} else {
Translation.forcedLanguage = lang; // This is a very dirty hack - it'll bite me one day
rtext = el.InnerRender();
}
for (let i = 0; i < parts.length - 1; i++) {
combined.push(parts[i]);
combined.push(rtext)
}
combined.push(parts[parts.length - 1]);
template = new Combine(combined).InnerRender();
}
newTranslations[lang] = template;
}
Translation.forcedLanguage = undefined;
return new Translation(newTranslations);
}
get txt(): string {
if (this.translations["*"]) {
return this.translations["*"];
}
const txt = this.translations[Translation.forcedLanguage ?? Locale.language.data];
if (txt !== undefined) {
return txt;
}
const en = this.translations["en"];
if (en !== undefined) {
return en;
}
for (const i in this.translations) {
return this.translations[i]; // Return a random language
}
console.error("Missing language ",Locale.language.data,"for",this.translations)
return undefined;
}
InnerRender(): string {
return this.txt
}
public readonly translations: object
constructor(translations: object) {
super(Locale.language)
let count = 0;
for (const translationsKey in translations) {
count++;
}
this.translations = translations
}
public replace(a: string, b: string) {
if(a.startsWith("{") && a.endsWith("}")){
a = a.substr(1, a.length - 2);
}
const result= this.Subs({[a]: b});
return result;
}
public Clone() {
return new Translation(this.translations)
}
FirstSentence() {
const tr = {};
for (const lng in this.translations) {
let txt = this.translations[lng];
txt = txt.replace(/\..*/, "");
txt = Utils.EllipsesAfter(txt, 255);
tr[lng] = txt;
}
return new Translation(tr);
}
}

View file

@ -1,9 +1,111 @@
import Translation from "./Translation";
import T from "./Translation";
import {UIElement} from "../UIElement"; import {UIElement} from "../UIElement";
import {FixedUiElement} from "../Base/FixedUiElement"; import {FixedUiElement} from "../Base/FixedUiElement";
import Combine from "../Base/Combine";
import Locale from "./Locale";
import {Utils} from "../../Utils";
export class Translation extends UIElement {
private static forcedLanguage = undefined;
public Subs(text: any): Translation {
const newTranslations = {};
for (const lang in this.translations) {
let template: string = this.translations[lang];
for (const k in text) {
const combined = [];
const parts = template.split("{" + k + "}");
const el: string | UIElement = text[k];
if (el === undefined) {
continue;
}
let rtext: string = "";
if (typeof (el) === "string") {
rtext = el;
} else {
Translation.forcedLanguage = lang; // This is a very dirty hack - it'll bite me one day
rtext = el.InnerRender();
}
for (let i = 0; i < parts.length - 1; i++) {
combined.push(parts[i]);
combined.push(rtext)
}
combined.push(parts[parts.length - 1]);
template = new Combine(combined).InnerRender();
}
newTranslations[lang] = template;
}
Translation.forcedLanguage = undefined;
return new Translation(newTranslations);
}
get txt(): string {
if (this.translations["*"]) {
return this.translations["*"];
}
const txt = this.translations[Translation.forcedLanguage ?? Locale.language.data];
if (txt !== undefined) {
return txt;
}
const en = this.translations["en"];
if (en !== undefined) {
return en;
}
for (const i in this.translations) {
return this.translations[i]; // Return a random language
}
console.error("Missing language ",Locale.language.data,"for",this.translations)
return undefined;
}
InnerRender(): string {
return this.txt
}
public readonly translations: object
constructor(translations: object) {
super(Locale.language)
let count = 0;
for (const translationsKey in translations) {
count++;
}
this.translations = translations
}
public replace(a: string, b: string) {
if(a.startsWith("{") && a.endsWith("}")){
a = a.substr(1, a.length - 2);
}
const result= this.Subs({[a]: b});
return result;
}
public Clone() {
return new Translation(this.translations)
}
FirstSentence() {
const tr = {};
for (const lng in this.translations) {
let txt = this.translations[lng];
txt = txt.replace(/\..*/, "");
txt = Utils.EllipsesAfter(txt, 255);
tr[lng] = txt;
}
return new Translation(tr);
}
}
export default class Translations { export default class Translations {
constructor() { constructor() {
@ -13,7 +115,7 @@ export default class Translations {
static t = { static t = {
image: { image: {
addPicture: new T({ addPicture: new Translation({
en: 'Add picture', en: 'Add picture',
es: 'Añadir foto', es: 'Añadir foto',
ca: 'Afegir foto', ca: 'Afegir foto',
@ -23,7 +125,7 @@ export default class Translations {
de: "Bild hinzufügen" de: "Bild hinzufügen"
}), }),
uploadingPicture: new T({ uploadingPicture: new Translation({
en: 'Uploading your picture...', en: 'Uploading your picture...',
nl: 'Bezig met een foto te uploaden...', nl: 'Bezig met een foto te uploaden...',
es: 'Subiendo tu imagen ...', es: 'Subiendo tu imagen ...',
@ -33,7 +135,7 @@ export default class Translations {
de: 'Ihr Bild hochladen...' de: 'Ihr Bild hochladen...'
}), }),
uploadingMultiple: new T({ uploadingMultiple: new Translation({
en: "Uploading {count} of your picture...", en: "Uploading {count} of your picture...",
nl: "Bezig met {count} foto's te uploaden...", nl: "Bezig met {count} foto's te uploaden...",
ca: "Pujant {count} de la teva imatge...", ca: "Pujant {count} de la teva imatge...",
@ -43,7 +145,7 @@ export default class Translations {
de: "{count} Ihrer Bilder hochgeladen..." de: "{count} Ihrer Bilder hochgeladen..."
}), }),
pleaseLogin: new T({ pleaseLogin: new Translation({
en: 'Please login to add a picure', en: 'Please login to add a picure',
nl: 'Gelieve je aan te melden om een foto toe te voegen', nl: 'Gelieve je aan te melden om een foto toe te voegen',
es: 'Entra para subir una foto', es: 'Entra para subir una foto',
@ -53,7 +155,7 @@ export default class Translations {
de: 'Bitte einloggen, um ein Bild hinzuzufügen' de: 'Bitte einloggen, um ein Bild hinzuzufügen'
}), }),
willBePublished: new T({ willBePublished: new Translation({
en: 'Your picture will be published: ', en: 'Your picture will be published: ',
es: 'Tu foto será publicada: ', es: 'Tu foto será publicada: ',
ca: 'La teva foto serà publicada: ', ca: 'La teva foto serà publicada: ',
@ -63,7 +165,7 @@ export default class Translations {
de: 'Ihr Bild wird veröffentlicht: ' de: 'Ihr Bild wird veröffentlicht: '
}), }),
cco: new T({ cco: new Translation({
en: 'in the public domain', en: 'in the public domain',
ca: 'en domini públic', ca: 'en domini públic',
es: 'en dominio público', es: 'en dominio público',
@ -73,7 +175,7 @@ export default class Translations {
de: 'in die Public Domain' de: 'in die Public Domain'
}), }),
ccbs: new T({ ccbs: new Translation({
en: 'under the CC-BY-SA-license', en: 'under the CC-BY-SA-license',
nl: 'onder de CC-BY-SA-licentie', nl: 'onder de CC-BY-SA-licentie',
ca: 'sota llicència CC-BY-SA', ca: 'sota llicència CC-BY-SA',
@ -82,7 +184,7 @@ export default class Translations {
gl: 'baixo a licenza CC-BY-SA', gl: 'baixo a licenza CC-BY-SA',
de: 'unter der CC-BY-SA-Lizenz' de: 'unter der CC-BY-SA-Lizenz'
}), }),
ccb: new T({ ccb: new Translation({
en: 'under the CC-BY-license', en: 'under the CC-BY-license',
ca: 'sota la llicència CC-BY', ca: 'sota la llicència CC-BY',
es: 'bajo licencia CC-BY', es: 'bajo licencia CC-BY',
@ -92,7 +194,7 @@ export default class Translations {
de: 'unter der CC-BY-Lizenz' de: 'unter der CC-BY-Lizenz'
}), }),
uploadFailed: new T({ uploadFailed: new Translation({
en: "Could not upload your picture. Do you have internet and are third party API's allowed? Brave browser or UMatrix might block them.", en: "Could not upload your picture. Do you have internet and are third party API's allowed? Brave browser or UMatrix might block them.",
nl: "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.", nl: "Afbeelding uploaden mislukt. Heb je internet? Gebruik je Brave of UMatrix? Dan moet je derde partijen toelaten.",
ca: "No s\'ha pogut carregar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.", ca: "No s\'ha pogut carregar la imatge. Tens Internet i es permeten API de tercers? El navegador Brave o UMatrix podria bloquejar-les.",
@ -102,7 +204,7 @@ export default class Translations {
de: "Wir konnten Ihr Bild nicht hochladen. Haben Sie Internet und sind API's von Dritten erlaubt? Brave Browser oder UMatrix blockieren evtl..", de: "Wir konnten Ihr Bild nicht hochladen. Haben Sie Internet und sind API's von Dritten erlaubt? Brave Browser oder UMatrix blockieren evtl..",
}), }),
respectPrivacy: new T({ respectPrivacy: new Translation({
en: "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.", en: "Do not photograph people nor license plates. Do not upload Google Maps, Google Streetview or other copyrighted sources.",
ca: "Respecta la privacitat. No fotografiïs gent o matrícules", ca: "Respecta la privacitat. No fotografiïs gent o matrícules",
es: "Respeta la privacidad. No fotografíes gente o matrículas", es: "Respeta la privacidad. No fotografíes gente o matrículas",
@ -111,7 +213,7 @@ export default class Translations {
gl: "Respecta a privacidade. Non fotografes xente ou matrículas", gl: "Respecta a privacidade. Non fotografes xente ou matrículas",
de: "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder" de: "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder"
}), }),
uploadDone: new T({ uploadDone: new Translation({
en: "<span class='thanks'>Your picture has been added. Thanks for helping out!</span>", en: "<span class='thanks'>Your picture has been added. Thanks for helping out!</span>",
ca: "<span class='thanks'>La teva imatge ha estat afegida. Gràcies per ajudar.</span>", ca: "<span class='thanks'>La teva imatge ha estat afegida. Gràcies per ajudar.</span>",
es: "<span class='thanks'>Tu imagen ha sido añadida. Gracias por ayudar.</span>", es: "<span class='thanks'>Tu imagen ha sido añadida. Gracias por ayudar.</span>",
@ -120,21 +222,21 @@ export default class Translations {
gl: "<span class='thanks'>A túa imaxe foi engadida. Grazas por axudar.</span>", gl: "<span class='thanks'>A túa imaxe foi engadida. Grazas por axudar.</span>",
de: "<span class='thanks'>Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!</span>", de: "<span class='thanks'>Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!</span>",
}), }),
dontDelete: new T({ dontDelete: new Translation({
"nl":"Terug", "nl":"Terug",
"en":"Cancel", "en":"Cancel",
"ca":"Cancel·lar", "ca":"Cancel·lar",
"es":"Cancelar", "es":"Cancelar",
"de": "Abbrechen" "de": "Abbrechen"
}), }),
doDelete: new T({ doDelete: new Translation({
"nl":"Verwijder afbeelding", "nl":"Verwijder afbeelding",
"en":"Remove image", "en":"Remove image",
"ca":"Esborrar imatge", "ca":"Esborrar imatge",
"es":"Borrar imagen", "es":"Borrar imagen",
"de": "Bild entfernen" "de": "Bild entfernen"
}), }),
isDeleted: new T({ isDeleted: new Translation({
"nl":"Verwijderd", "nl":"Verwijderd",
"en":"Deleted", "en":"Deleted",
"ca":"Esborrada", "ca":"Esborrada",
@ -143,7 +245,7 @@ export default class Translations {
}) })
}, },
centerMessage: { centerMessage: {
loadingData: new T({ loadingData: new Translation({
en: 'Loading data...', en: 'Loading data...',
ca: 'Carregant dades...', ca: 'Carregant dades...',
es: 'Cargando datos...', es: 'Cargando datos...',
@ -152,7 +254,7 @@ export default class Translations {
gl: 'Cargando os datos...', gl: 'Cargando os datos...',
de: 'Daten werden geladen...' de: 'Daten werden geladen...'
}), }),
zoomIn: new T({ zoomIn: new Translation({
en: 'Zoom in to view or edit the data', en: 'Zoom in to view or edit the data',
ca: 'Amplia per veure o editar les dades', ca: 'Amplia per veure o editar les dades',
es: 'Amplía para ver o editar los datos', es: 'Amplía para ver o editar los datos',
@ -161,7 +263,7 @@ export default class Translations {
gl: 'Achégate para ollar ou editar os datos', gl: 'Achégate para ollar ou editar os datos',
de: 'Vergrößern, um die Daten anzuzeigen oder zu bearbeiten' de: 'Vergrößern, um die Daten anzuzeigen oder zu bearbeiten'
}), }),
ready: new T({ ready: new Translation({
en: "Done!", en: "Done!",
ca: "Fet.", ca: "Fet.",
es: "Hecho.", es: "Hecho.",
@ -171,7 +273,7 @@ export default class Translations {
de: "Erledigt!" de: "Erledigt!"
}), }),
retrying: new T({ retrying: new Translation({
en: "Loading data failed. Trying again... ({count})", en: "Loading data failed. Trying again... ({count})",
ca: "La càrrega de dades ha fallat.Tornant-ho a intentar... ({count})", ca: "La càrrega de dades ha fallat.Tornant-ho a intentar... ({count})",
es: "La carga de datos ha fallado.Volviéndolo a probar... ({count})", es: "La carga de datos ha fallado.Volviéndolo a probar... ({count})",
@ -181,7 +283,7 @@ export default class Translations {
}, },
general: { general: {
loginWithOpenStreetMap: new T({ loginWithOpenStreetMap: new Translation({
en: "Login with OpenStreetMap", en: "Login with OpenStreetMap",
ca: "Entra a OpenStreetMap", ca: "Entra a OpenStreetMap",
es: "Entra en OpenStreetMap", es: "Entra en OpenStreetMap",
@ -191,7 +293,7 @@ export default class Translations {
de: "Anmeldung mit OpenStreetMap" de: "Anmeldung mit OpenStreetMap"
}), }),
welcomeBack: new T({ welcomeBack: new Translation({
en: "You are logged in, welcome back!", en: "You are logged in, welcome back!",
ca: "Has entrat, benvingut.", ca: "Has entrat, benvingut.",
es: "Has entrado, bienvenido.", es: "Has entrado, bienvenido.",
@ -200,7 +302,7 @@ export default class Translations {
gl: "Iniciaches a sesión, benvido.", gl: "Iniciaches a sesión, benvido.",
de: "Sie sind eingeloggt, willkommen zurück!" de: "Sie sind eingeloggt, willkommen zurück!"
}), }),
loginToStart: new T({ loginToStart: new Translation({
en: "Login to answer this question", en: "Login to answer this question",
ca: "Entra per contestar aquesta pregunta", ca: "Entra per contestar aquesta pregunta",
es: "Entra para contestar esta pregunta", es: "Entra para contestar esta pregunta",
@ -249,7 +351,7 @@ export default class Translations {
}) })
}, },
returnToTheMap: new T({ returnToTheMap: new Translation({
en: "Return to the map", en: "Return to the map",
ca: "Tornar al mapa", ca: "Tornar al mapa",
es: "Volver al mapa", es: "Volver al mapa",
@ -258,7 +360,7 @@ export default class Translations {
gl: "Voltar ó mapa", gl: "Voltar ó mapa",
de: "Zurück zur Karte" de: "Zurück zur Karte"
}), }),
save: new T({ save: new Translation({
en: "Save", en: "Save",
ca: "Desar", ca: "Desar",
es: "Guardar", es: "Guardar",
@ -267,7 +369,7 @@ export default class Translations {
gl: "Gardar", gl: "Gardar",
de: "Speichern" de: "Speichern"
}), }),
cancel: new T({ cancel: new Translation({
en: "Cancel", en: "Cancel",
ca: "Cancel·lar", ca: "Cancel·lar",
es: "Cancelar", es: "Cancelar",
@ -276,7 +378,7 @@ export default class Translations {
gl: "Desbotar", gl: "Desbotar",
de: "Abbrechen" de: "Abbrechen"
}), }),
skip: new T({ skip: new Translation({
en: "Skip this question", en: "Skip this question",
ca: "Saltar aquesta pregunta", ca: "Saltar aquesta pregunta",
es: "Saltar esta pregunta", es: "Saltar esta pregunta",
@ -285,7 +387,7 @@ export default class Translations {
gl: "Ignorar esta pregunta", gl: "Ignorar esta pregunta",
de: "Diese Frage überspringen" de: "Diese Frage überspringen"
}), }),
oneSkippedQuestion: new T({ oneSkippedQuestion: new Translation({
en: "One question is skipped", en: "One question is skipped",
ca: "Has ignorat una pregunta", ca: "Has ignorat una pregunta",
es: "Has ignorado una pregunta", es: "Has ignorado una pregunta",
@ -294,7 +396,7 @@ export default class Translations {
gl: "Ignoraches unha pregunta", gl: "Ignoraches unha pregunta",
de: "Eine Frage wurde übersprungen" de: "Eine Frage wurde übersprungen"
}), }),
skippedQuestions: new T({ skippedQuestions: new Translation({
en: "Some questions are skipped", en: "Some questions are skipped",
ca: "Has ignorat algunes preguntes", ca: "Has ignorat algunes preguntes",
es: "Has ignorado algunas preguntas", es: "Has ignorado algunas preguntas",
@ -303,7 +405,7 @@ export default class Translations {
gl: "Ignoraches algunhas preguntas", gl: "Ignoraches algunhas preguntas",
de: "Einige Fragen wurden übersprungen" de: "Einige Fragen wurden übersprungen"
}), }),
number: new T({ number: new Translation({
en: "number", en: "number",
ca: "nombre", ca: "nombre",
es: "número", es: "número",
@ -313,7 +415,7 @@ export default class Translations {
de: "Zahl" de: "Zahl"
}), }),
osmLinkTooltip: new T({ osmLinkTooltip: new Translation({
en: "See this object on OpenStreetMap for history and more editing options", en: "See this object on OpenStreetMap for history and more editing options",
ca: "Mira aquest objecte a OpenStreetMap per veure historial i altres opcions d\'edició", ca: "Mira aquest objecte a OpenStreetMap per veure historial i altres opcions d\'edició",
es: "Mira este objeto en OpenStreetMap para ver historial y otras opciones de edición", es: "Mira este objeto en OpenStreetMap para ver historial y otras opciones de edición",
@ -323,7 +425,7 @@ export default class Translations {
de: "Dieses Objekt auf OpenStreetMap anschauen für die Geschichte und weitere Bearbeitungsmöglichkeiten" de: "Dieses Objekt auf OpenStreetMap anschauen für die Geschichte und weitere Bearbeitungsmöglichkeiten"
}), }),
add: { add: {
addNew: new T({ addNew: new Translation({
en: "Add a new {category} here", en: "Add a new {category} here",
ca: "Afegir {category} aquí", ca: "Afegir {category} aquí",
es: "Añadir {category} aquí", es: "Añadir {category} aquí",
@ -332,7 +434,7 @@ export default class Translations {
gl: "Engadir {category} aquí", gl: "Engadir {category} aquí",
de: "Hier eine neue {category} hinzufügen" de: "Hier eine neue {category} hinzufügen"
}), }),
header: new T({ header: new Translation({
en: "<h2>Add a point?</h2>You clicked somewhere where no data is known yet.<br/>", en: "<h2>Add a point?</h2>You clicked somewhere where no data is known yet.<br/>",
ca: "<h2>Vols afegir un punt?</h2>Has marcat un lloc on no coneixem les dades.<br/>", ca: "<h2>Vols afegir un punt?</h2>Has marcat un lloc on no coneixem les dades.<br/>",
es: "<h2>Quieres añadir un punto?</h2>Has marcado un lugar del que no conocemos los datos.<br/>", es: "<h2>Quieres añadir un punto?</h2>Has marcado un lugar del que no conocemos los datos.<br/>",
@ -341,7 +443,7 @@ export default class Translations {
gl: "<h2>Queres engadir un punto?</h2>Marcaches un lugar onde non coñecemos os datos.<br/>", gl: "<h2>Queres engadir un punto?</h2>Marcaches un lugar onde non coñecemos os datos.<br/>",
de: "<h2>Punkt hinzufügen?</h2>Sie haben irgendwo geklickt, wo noch keine Daten bekannt sind.<br/>" de: "<h2>Punkt hinzufügen?</h2>Sie haben irgendwo geklickt, wo noch keine Daten bekannt sind.<br/>"
}), }),
pleaseLogin: new T({ pleaseLogin: new Translation({
en: "<a class='activate-osm-authentication'>Please log in to add a new point</a>", en: "<a class='activate-osm-authentication'>Please log in to add a new point</a>",
ca: "<a class='activate-osm-authentication'>Entra per afegir un nou punt</a>", ca: "<a class='activate-osm-authentication'>Entra per afegir un nou punt</a>",
es: "<a class='activate-osm-authentication'>Entra para añadir un nuevo punto</a>", es: "<a class='activate-osm-authentication'>Entra para añadir un nuevo punto</a>",
@ -350,7 +452,7 @@ export default class Translations {
gl: "<a class='activate-osm-authentication'>Inicia a sesión para engadir un novo punto</a>", gl: "<a class='activate-osm-authentication'>Inicia a sesión para engadir un novo punto</a>",
de: "<a class='activate-osm-authentication'>Bitte loggen Sie sich ein, um einen neuen Punkt hinzuzufügen</a>" de: "<a class='activate-osm-authentication'>Bitte loggen Sie sich ein, um einen neuen Punkt hinzuzufügen</a>"
}), }),
zoomInFurther: new T({ zoomInFurther: new Translation({
en: "Zoom in further to add a point.", en: "Zoom in further to add a point.",
ca: "Apropa per afegir un punt.", ca: "Apropa per afegir un punt.",
es: "Acerca para añadir un punto.", es: "Acerca para añadir un punto.",
@ -359,7 +461,7 @@ export default class Translations {
gl: "Achégate para engadir un punto.", gl: "Achégate para engadir un punto.",
de: "Weiter einzoomen, um einen Punkt hinzuzufügen." de: "Weiter einzoomen, um einen Punkt hinzuzufügen."
}), }),
stillLoading: new T({ stillLoading: new Translation({
en: "The data is still loading. Please wait a bit before you add a new point.", en: "The data is still loading. Please wait a bit before you add a new point.",
ca: "Les dades es segueixen carregant. Espera una mica abans d\'afegir cap punt.", ca: "Les dades es segueixen carregant. Espera una mica abans d\'afegir cap punt.",
es: "Los datos se siguen cargando. Espera un poco antes de añadir ningún punto.", es: "Los datos se siguen cargando. Espera un poco antes de añadir ningún punto.",
@ -368,7 +470,7 @@ export default class Translations {
gl: "Os datos seguen a cargarse. Agarda un intre antes de engadir ningún punto.", gl: "Os datos seguen a cargarse. Agarda un intre antes de engadir ningún punto.",
de: "Die Daten werden noch geladen. Bitte warten Sie etwas, bevor Sie einen neuen Punkt hinzufügen." de: "Die Daten werden noch geladen. Bitte warten Sie etwas, bevor Sie einen neuen Punkt hinzufügen."
}), }),
confirmIntro: new T({ confirmIntro: new Translation({
en: "<h3>Add a {title} here?</h3>The point you create here will be <b>visible for everyone</b>. Please, only add things on to the map if they truly exist. A lot of applications use this data.", en: "<h3>Add a {title} here?</h3>The point you create here will be <b>visible for everyone</b>. Please, only add things on to the map if they truly exist. A lot of applications use this data.",
ca: "<h3>Afegir {title} aquí?</h3>El punt que estàs creant <b>el veurà tothom</b>. Només afegeix coses que realment existeixin. Moltes aplicacions fan servir aquestes dades.", ca: "<h3>Afegir {title} aquí?</h3>El punt que estàs creant <b>el veurà tothom</b>. Només afegeix coses que realment existeixin. Moltes aplicacions fan servir aquestes dades.",
es: "<h3>Añadir {title} aquí?</h3>El punto que estás creando <b>lo verá todo el mundo</b>. Sólo añade cosas que realmente existan. Muchas aplicaciones usan estos datos.", es: "<h3>Añadir {title} aquí?</h3>El punto que estás creando <b>lo verá todo el mundo</b>. Sólo añade cosas que realmente existan. Muchas aplicaciones usan estos datos.",
@ -377,7 +479,7 @@ export default class Translations {
gl: "<h3>Engadir {title} aquí?</h3>O punto que estás a crear <b>será ollado por todo o mundo</b>. Só engade cousas que realmente existan. Moitas aplicacións empregan estes datos.", gl: "<h3>Engadir {title} aquí?</h3>O punto que estás a crear <b>será ollado por todo o mundo</b>. Só engade cousas que realmente existan. Moitas aplicacións empregan estes datos.",
de: "<h3>Hier einen {title} hinzufügen?</h3>Der Punkt, den Sie hier anlegen, wird <b>für alle sichtbar sein</b>. Bitte fügen Sie der Karte nur dann Dinge hinzu, wenn sie wirklich existieren. Viele Anwendungen verwenden diese Daten.", de: "<h3>Hier einen {title} hinzufügen?</h3>Der Punkt, den Sie hier anlegen, wird <b>für alle sichtbar sein</b>. Bitte fügen Sie der Karte nur dann Dinge hinzu, wenn sie wirklich existieren. Viele Anwendungen verwenden diese Daten.",
}), }),
confirmButton: new T({ confirmButton: new Translation({
en: "Add a {category} here", en: "Add a {category} here",
ca: "Afegir {category} aquí", ca: "Afegir {category} aquí",
es: "Añadir {category} aquí", es: "Añadir {category} aquí",
@ -386,7 +488,7 @@ export default class Translations {
gl: "Engadir {category} aquí", gl: "Engadir {category} aquí",
de: "Hier eine {category} hinzufügen" de: "Hier eine {category} hinzufügen"
}), }),
openLayerControl: new T({ openLayerControl: new Translation({
"en": "Open the layer control box", "en": "Open the layer control box",
"ca": "Obrir el control de capes", "ca": "Obrir el control de capes",
"es": "Abrir el control de capas", "es": "Abrir el control de capas",
@ -394,7 +496,7 @@ export default class Translations {
"de": "Das Ebenen-Kontrollkästchen öffnen" "de": "Das Ebenen-Kontrollkästchen öffnen"
}) })
, ,
layerNotEnabled: new T({ layerNotEnabled: new Translation({
"en": "The layer {layer} is not enabled. Enable this layer to add a point", "en": "The layer {layer} is not enabled. Enable this layer to add a point",
"ca": "La capa {layer} no està habilitada. Fes-ho per poder afegir un punt a aquesta capa", "ca": "La capa {layer} no està habilitada. Fes-ho per poder afegir un punt a aquesta capa",
"es": "La capa {layer} no está habilitada. Hazlo para poder añadir un punto en esta capa", "es": "La capa {layer} no está habilitada. Hazlo para poder añadir un punto en esta capa",
@ -402,7 +504,7 @@ export default class Translations {
"de": "Die Ebene {layer} ist nicht aktiviert. Aktivieren Sie diese Ebene, um einen Punkt hinzuzufügen" "de": "Die Ebene {layer} ist nicht aktiviert. Aktivieren Sie diese Ebene, um einen Punkt hinzuzufügen"
}) })
}, },
pickLanguage: new T({ pickLanguage: new Translation({
en: "Choose a language", en: "Choose a language",
ca: "Tria idioma", ca: "Tria idioma",
es: "Escoge idioma", es: "Escoge idioma",
@ -411,7 +513,7 @@ export default class Translations {
gl: "Escoller lingua", gl: "Escoller lingua",
de: "Wählen Sie eine Sprache" de: "Wählen Sie eine Sprache"
}), }),
about: new T({ about: new Translation({
en: "Easily edit and add OpenStreetMap for a certain theme", en: "Easily edit and add OpenStreetMap for a certain theme",
ca: "Edita facilment i afegeix punts a OpenStreetMap d\'una temàtica determinada", ca: "Edita facilment i afegeix punts a OpenStreetMap d\'una temàtica determinada",
es: "Edita facilmente y añade puntos en OpenStreetMap de un tema concreto", es: "Edita facilmente y añade puntos en OpenStreetMap de un tema concreto",
@ -420,7 +522,7 @@ export default class Translations {
gl: "Editar doadamente e engadir puntos no OpenStreetMap dun eido en concreto", gl: "Editar doadamente e engadir puntos no OpenStreetMap dun eido en concreto",
de: "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen" de: "OpenStreetMap für ein bestimmtes Thema einfach bearbeiten und hinzufügen"
}), }),
nameInlineQuestion: new T({ nameInlineQuestion: new Translation({
en: "The name of this {category} is $$$", en: "The name of this {category} is $$$",
ca: "{category}: El seu nom és $$$", ca: "{category}: El seu nom és $$$",
es: "{category}: Su nombre es $$$", es: "{category}: Su nombre es $$$",
@ -429,7 +531,7 @@ export default class Translations {
gl: "{category}: O teu nome é $$$", gl: "{category}: O teu nome é $$$",
de: "Der Name dieser {category} ist $$$" de: "Der Name dieser {category} ist $$$"
}), }),
noNameCategory: new T({ noNameCategory: new Translation({
en: "{category} without a name", en: "{category} without a name",
ca: "{category} sense nom", ca: "{category} sense nom",
es: "{category} sin nombre", es: "{category} sin nombre",
@ -439,7 +541,7 @@ export default class Translations {
de: "{category} ohne Namen", de: "{category} ohne Namen",
}), }),
questions: { questions: {
phoneNumberOf: new T({ phoneNumberOf: new Translation({
en: "What is the phone number of {category}?", en: "What is the phone number of {category}?",
ca: "Quin és el telèfon de {category}?", ca: "Quin és el telèfon de {category}?",
es: "Qué teléfono tiene {category}?", es: "Qué teléfono tiene {category}?",
@ -448,7 +550,7 @@ export default class Translations {
gl: "Cal é o número de teléfono de {category}?", gl: "Cal é o número de teléfono de {category}?",
de: "Wie lautet die Telefonnummer der {category}?" de: "Wie lautet die Telefonnummer der {category}?"
}), }),
phoneNumberIs: new T({ phoneNumberIs: new Translation({
en: "The phone number of this {category} is <a href='tel:{phone}' target='_blank'>{phone}</a>", en: "The phone number of this {category} is <a href='tel:{phone}' target='_blank'>{phone}</a>",
ca: "El número de telèfon de {category} és <a href='tel:{phone}' target='_blank'>{phone}</a>", ca: "El número de telèfon de {category} és <a href='tel:{phone}' target='_blank'>{phone}</a>",
es: "El número de teléfono de {category} es <a href='tel:{phone}' target='_blank'>{phone}</a>", es: "El número de teléfono de {category} es <a href='tel:{phone}' target='_blank'>{phone}</a>",
@ -457,7 +559,7 @@ export default class Translations {
gl: "O número de teléfono de {category} é <a href='tel:{phone}' target='_blank'>{phone}</a>", gl: "O número de teléfono de {category} é <a href='tel:{phone}' target='_blank'>{phone}</a>",
de: "Die Telefonnummer der {category} lautet <a href='tel:{phone}' target='_blank'>{phone}</a>" de: "Die Telefonnummer der {category} lautet <a href='tel:{phone}' target='_blank'>{phone}</a>"
}), }),
websiteOf: new T({ websiteOf: new Translation({
en: "What is the website of {category}?", en: "What is the website of {category}?",
ca: "Quina és la pàgina web de {category}?", ca: "Quina és la pàgina web de {category}?",
es: "Cual es la página web de {category}?", es: "Cual es la página web de {category}?",
@ -466,7 +568,7 @@ export default class Translations {
gl: "Cal é a páxina web de {category}?", gl: "Cal é a páxina web de {category}?",
de: "Was ist die Website der {category}?" de: "Was ist die Website der {category}?"
}), }),
websiteIs: new T({ websiteIs: new Translation({
en: "Website: <a href='{website}' target='_blank'>{website}</a>", en: "Website: <a href='{website}' target='_blank'>{website}</a>",
ca: "Pàgina web: <a href='{website}' target='_blank'>{website}</a>", ca: "Pàgina web: <a href='{website}' target='_blank'>{website}</a>",
es: "Página web: <a href='{website}' target='_blank'>{website}</a>", es: "Página web: <a href='{website}' target='_blank'>{website}</a>",
@ -475,7 +577,7 @@ export default class Translations {
gl: "Páxina web: <a href='{website}' target='_blank'>{website}</a>", gl: "Páxina web: <a href='{website}' target='_blank'>{website}</a>",
de: "Webseite: <a href='{website}' target='_blank'>{website}</a>", de: "Webseite: <a href='{website}' target='_blank'>{website}</a>",
}), }),
emailOf: new T({ emailOf: new Translation({
en: "What is the email address of {category}?", en: "What is the email address of {category}?",
ca: "Quina és l\'adreça de correu-e de {category}?", ca: "Quina és l\'adreça de correu-e de {category}?",
es: "¿Qué dirección de correu tiene {category}?", es: "¿Qué dirección de correu tiene {category}?",
@ -485,7 +587,7 @@ export default class Translations {
de: "Wie lautet die E-Mail-Adresse der {category}?" de: "Wie lautet die E-Mail-Adresse der {category}?"
} }
), ),
emailIs: new T({ emailIs: new Translation({
en: "The email address of this {category} is <a href='mailto:{email}' target='_blank'>{email}</a>", en: "The email address of this {category} is <a href='mailto:{email}' target='_blank'>{email}</a>",
ca: "L\'adreça de correu de {category} és <a href='mailto:{email}' target='_blank'>{email}</a>", ca: "L\'adreça de correu de {category} és <a href='mailto:{email}' target='_blank'>{email}</a>",
es: "La dirección de correo de {category} es <a href='mailto:{email}' target='_blank'>{email}</a>", es: "La dirección de correo de {category} es <a href='mailto:{email}' target='_blank'>{email}</a>",
@ -496,7 +598,7 @@ export default class Translations {
}), }),
}, },
openStreetMapIntro: new T({ openStreetMapIntro: new Translation({
en: "<h3>An Open Map</h3>" + en: "<h3>An Open Map</h3>" +
"<p>Wouldn't it be cool if there was a single map, which everyone could freely use and edit? " + "<p>Wouldn't it be cool if there was a single map, which everyone could freely use and edit? " +
"A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore.</p>" + "A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore.</p>" +
@ -553,7 +655,7 @@ export default class Translations {
}), }),
sharescreen: { sharescreen: {
intro: new T({ intro: new Translation({
en: "<h3>Share this map</h3> Share this map by copying the link below and sending it to friends and family:", en: "<h3>Share this map</h3> Share this map by copying the link below and sending it to friends and family:",
ca: "<h3>Comparteix aquest mapa</h3> Comparteix aquest mapa copiant l\'enllaç de sota i enviant-lo a amics i família:", ca: "<h3>Comparteix aquest mapa</h3> Comparteix aquest mapa copiant l\'enllaç de sota i enviant-lo a amics i família:",
es: "<h3>Comparte este mapa</h3> Comparte este mapa copiando el enlace de debajo y enviándolo a amigos y familia:", es: "<h3>Comparte este mapa</h3> Comparte este mapa copiando el enlace de debajo y enviándolo a amigos y familia:",
@ -563,7 +665,7 @@ export default class Translations {
de: "<h3>Diese Karte teilen</h3> Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:", de: "<h3>Diese Karte teilen</h3> Sie können diese Karte teilen, indem Sie den untenstehenden Link kopieren und an Freunde und Familie schicken:",
}), }),
addToHomeScreen: new T({ addToHomeScreen: new Translation({
en: "<h3>Add to your home screen</h3>You can easily add this website to your smartphone home screen for a native feel. Click the 'add to home screen button' in the URL bar to do this.", en: "<h3>Add to your home screen</h3>You can easily add this website to your smartphone home screen for a native feel. Click the 'add to home screen button' in the URL bar to do this.",
ca: "<h3>Afegir-lo a la pantalla d\'inici</h3>Pots afegir aquesta web a la pantalla d\'inici del teu smartphone per a que es vegi més nadiu. Apreta al botó 'afegir a l\'inici' a la barra d\'adreces URL per fer-ho.", ca: "<h3>Afegir-lo a la pantalla d\'inici</h3>Pots afegir aquesta web a la pantalla d\'inici del teu smartphone per a que es vegi més nadiu. Apreta al botó 'afegir a l\'inici' a la barra d\'adreces URL per fer-ho.",
es: "<h3>Añadir a la pantalla de inicio</h3>Puedes añadir esta web en la pantalla de inicio de tu smartphone para que se vea más nativo. Aprieta el botón 'añadir a inicio' en la barra de direcciones URL para hacerlo.", es: "<h3>Añadir a la pantalla de inicio</h3>Puedes añadir esta web en la pantalla de inicio de tu smartphone para que se vea más nativo. Aprieta el botón 'añadir a inicio' en la barra de direcciones URL para hacerlo.",
@ -572,7 +674,7 @@ export default class Translations {
nl: "<h3>Voeg toe aan je thuis-scherm</h3>Je kan deze website aan je thuisscherm van je smartphone toevoegen voor een native feel", nl: "<h3>Voeg toe aan je thuis-scherm</h3>Je kan deze website aan je thuisscherm van je smartphone toevoegen voor een native feel",
de: "<h3>Zum Startbildschirm hinzufügen</h3> Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.", de: "<h3>Zum Startbildschirm hinzufügen</h3> Sie können diese Website einfach zum Startbildschirm Ihres Smartphones hinzufügen, um ein natives Gefühl zu erhalten. Klicken Sie dazu in der URL-Leiste auf die Schaltfläche 'Zum Startbildschirm hinzufügen'.",
}), }),
embedIntro: new T({ embedIntro: new Translation({
en: "<h3>Embed on your website</h3>Please, embed this map into your website. <br/>We encourage you to do it - you don't even have to ask permission. <br/> It is free, and always will be. The more people using this, the more valuable it becomes.", en: "<h3>Embed on your website</h3>Please, embed this map into your website. <br/>We encourage you to do it - you don't even have to ask permission. <br/> It is free, and always will be. The more people using this, the more valuable it becomes.",
ca: "<h3>Inclou-ho a la teva pàgina web</h3>Inclou aquest mapa dins de la teva pàgina web. <br/> T\'animem a que ho facis, no cal que demanis permís. <br/> És de franc, i sempre ho serà. A més gent que ho faci servir més valuós serà.", ca: "<h3>Inclou-ho a la teva pàgina web</h3>Inclou aquest mapa dins de la teva pàgina web. <br/> T\'animem a que ho facis, no cal que demanis permís. <br/> És de franc, i sempre ho serà. A més gent que ho faci servir més valuós serà.",
es: "<h3>Inclúyelo en tu página web</h3>Incluye este mapa en tu página web. <br/> Te animamos a que lo hagas, no hace falta que pidas permiso. <br/> Es gratis, y siempre lo será. A más gente que lo use más valioso será.", es: "<h3>Inclúyelo en tu página web</h3>Incluye este mapa en tu página web. <br/> Te animamos a que lo hagas, no hace falta que pidas permiso. <br/> Es gratis, y siempre lo será. A más gente que lo use más valioso será.",
@ -581,7 +683,7 @@ export default class Translations {
nl: "<h3>Plaats dit op je website</h3>Voeg dit kaartje toe op je eigen website.<br/>We moedigen dit zelfs aan - je hoeft geen toestemming te vragen.<br/> Het is gratis en zal dat altijd blijven. Hoe meer het gebruikt wordt, hoe waardevoller", nl: "<h3>Plaats dit op je website</h3>Voeg dit kaartje toe op je eigen website.<br/>We moedigen dit zelfs aan - je hoeft geen toestemming te vragen.<br/> Het is gratis en zal dat altijd blijven. Hoe meer het gebruikt wordt, hoe waardevoller",
de: "<h3>Auf Ihrer Website einbetten</h3>Bitte, betten Sie diese Karte in Ihre Website ein. <br/>Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen. <br/> Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie." de: "<h3>Auf Ihrer Website einbetten</h3>Bitte, betten Sie diese Karte in Ihre Website ein. <br/>Wir ermutigen Sie, es zu tun - Sie müssen nicht einmal um Erlaubnis fragen. <br/> Es ist kostenlos und wird es immer sein. Je mehr Leute sie benutzen, desto wertvoller wird sie."
}), }),
copiedToClipboard: new T({ copiedToClipboard: new Translation({
en: "Link copied to clipboard", en: "Link copied to clipboard",
ca: "Enllaç copiat al portapapers", ca: "Enllaç copiat al portapapers",
es: "Enlace copiado en el portapapeles", es: "Enlace copiado en el portapapeles",
@ -589,7 +691,7 @@ export default class Translations {
nl: "Link gekopieerd naar klembord", nl: "Link gekopieerd naar klembord",
de: "Link in die Zwischenablage kopiert" de: "Link in die Zwischenablage kopiert"
}), }),
thanksForSharing: new T({ thanksForSharing: new Translation({
en: "Thanks for sharing!", en: "Thanks for sharing!",
ca: "Gràcies per compartir", ca: "Gràcies per compartir",
es: "Gracias por compartir", es: "Gracias por compartir",
@ -597,7 +699,7 @@ export default class Translations {
nl: "Bedankt om te delen!", nl: "Bedankt om te delen!",
de: "Danke für das Teilen!" de: "Danke für das Teilen!"
}), }),
editThisTheme: new T({ editThisTheme: new Translation({
en: "Edit this theme", en: "Edit this theme",
ca: "Editar aquest repte", ca: "Editar aquest repte",
es: "Editar este reto", es: "Editar este reto",
@ -605,7 +707,7 @@ export default class Translations {
nl: "Pas dit thema aan", nl: "Pas dit thema aan",
de: "Dieses Thema bearbeiten" de: "Dieses Thema bearbeiten"
}), }),
editThemeDescription: new T({ editThemeDescription: new Translation({
en: "Add or change questions to this map theme", en: "Add or change questions to this map theme",
ca: "Afegir o canviar preguntes d'aquest repte", ca: "Afegir o canviar preguntes d'aquest repte",
es: "Añadir o cambiar preguntas de este reto", es: "Añadir o cambiar preguntas de este reto",
@ -613,7 +715,7 @@ export default class Translations {
nl: "Pas vragen aan of voeg vragen toe aan dit kaartthema", nl: "Pas vragen aan of voeg vragen toe aan dit kaartthema",
de: "Fragen zu diesem Kartenthema hinzufügen oder ändern" de: "Fragen zu diesem Kartenthema hinzufügen oder ändern"
}), }),
fsUserbadge: new T({ fsUserbadge: new Translation({
en: "Enable the login-button", en: "Enable the login-button",
ca: "Activar el botó d'entrada", ca: "Activar el botó d'entrada",
es: "Activar el botón de entrada", es: "Activar el botón de entrada",
@ -621,7 +723,7 @@ export default class Translations {
nl: "Activeer de login-knop", nl: "Activeer de login-knop",
de:" Anmelde-Knopf aktivieren" de:" Anmelde-Knopf aktivieren"
}), }),
fsSearch: new T({ fsSearch: new Translation({
en: "Enable the search bar", en: "Enable the search bar",
ca: "Activar la barra de cerca", ca: "Activar la barra de cerca",
es: "Activar la barra de búsqueda", es: "Activar la barra de búsqueda",
@ -629,7 +731,7 @@ export default class Translations {
nl: "Activeer de zoekbalk", nl: "Activeer de zoekbalk",
de: " Suchleiste aktivieren" de: " Suchleiste aktivieren"
}), }),
fsWelcomeMessage: new T({ fsWelcomeMessage: new Translation({
en: "Show the welcome message popup and associated tabs", en: "Show the welcome message popup and associated tabs",
ca: "Mostra el missatge emergent de benvinguda i pestanyes associades", ca: "Mostra el missatge emergent de benvinguda i pestanyes associades",
es: "Muestra el mensaje emergente de bienvenida y pestañas asociadas", es: "Muestra el mensaje emergente de bienvenida y pestañas asociadas",
@ -637,7 +739,7 @@ export default class Translations {
nl: "Toon het welkomstbericht en de bijhorende tabbladen", nl: "Toon het welkomstbericht en de bijhorende tabbladen",
de: "Popup der Begrüßungsnachricht und zugehörige Registerkarten anzeigen" de: "Popup der Begrüßungsnachricht und zugehörige Registerkarten anzeigen"
}), }),
fsLayers: new T({ fsLayers: new Translation({
en: "Enable thelayer control", en: "Enable thelayer control",
ca: "Activar el control de capes", ca: "Activar el control de capes",
es: "Activar el control de capas", es: "Activar el control de capas",
@ -646,7 +748,7 @@ export default class Translations {
de: "Aktivieren der Layersteuerung" de: "Aktivieren der Layersteuerung"
}), }),
fsLayerControlToggle: new T({ fsLayerControlToggle: new Translation({
en: "Start with the layer control expanded", en: "Start with the layer control expanded",
gl: "Comenza co control de capas expandido", gl: "Comenza co control de capas expandido",
ca: "Iniciar el control de capes avançat", ca: "Iniciar el control de capes avançat",
@ -654,7 +756,7 @@ export default class Translations {
nl: "Toon de laagbediening meteen volledig", nl: "Toon de laagbediening meteen volledig",
de: "Mit der erweiterten Ebenenkontrolle beginnen" de: "Mit der erweiterten Ebenenkontrolle beginnen"
}), }),
fsAddNew: new T({ fsAddNew: new Translation({
en: "Enable the 'add new POI' button", en: "Enable the 'add new POI' button",
ca: "Activar el botó d'afegir nou PDI'", ca: "Activar el botó d'afegir nou PDI'",
es: "Activar el botón de añadir nuevo PDI'", es: "Activar el botón de añadir nuevo PDI'",
@ -662,7 +764,7 @@ export default class Translations {
gl: "Activar o botón de 'engadir novo PDI'", gl: "Activar o botón de 'engadir novo PDI'",
de: "Schaltfläche 'neuen POI hinzufügen' aktivieren", de: "Schaltfläche 'neuen POI hinzufügen' aktivieren",
}), }),
fsGeolocation: new T({ fsGeolocation: new Translation({
en: "Enable the 'geolocate-me' button (mobile only)", en: "Enable the 'geolocate-me' button (mobile only)",
ca: "Activar el botó de 'geolocalitza'm' (només mòbil)", ca: "Activar el botó de 'geolocalitza'm' (només mòbil)",
es: "Activar el botón de 'geolocalízame' (només mòbil)", es: "Activar el botón de 'geolocalízame' (només mòbil)",
@ -670,21 +772,21 @@ export default class Translations {
nl: "Toon het knopje voor geolocalisatie (enkel op mobiel)", nl: "Toon het knopje voor geolocalisatie (enkel op mobiel)",
de: "Die Schaltfläche 'Mich geolokalisieren' aktivieren (nur für Mobil)", de: "Die Schaltfläche 'Mich geolokalisieren' aktivieren (nur für Mobil)",
}), }),
fsIncludeCurrentBackgroundMap: new T({ fsIncludeCurrentBackgroundMap: new Translation({
en: "Include the current background choice <b>{name}</b>", en: "Include the current background choice <b>{name}</b>",
ca: "Incloure l'opció de fons actual <b>{name}</b>", ca: "Incloure l'opció de fons actual <b>{name}</b>",
es: "Incluir la opción de fondo actual <b>{name}</b>", es: "Incluir la opción de fondo actual <b>{name}</b>",
nl: "Gebruik de huidige achtergrond <b>{name}</b>", nl: "Gebruik de huidige achtergrond <b>{name}</b>",
de: "Die aktuelle Hintergrundwahl einschließen <b>{name}</b>", de: "Die aktuelle Hintergrundwahl einschließen <b>{name}</b>",
}), }),
fsIncludeCurrentLayers: new T({ fsIncludeCurrentLayers: new Translation({
en: "Include the current layer choices", en: "Include the current layer choices",
ca: "Incloure les opcions de capa actual", ca: "Incloure les opcions de capa actual",
es: "Incluir las opciones de capa actual", es: "Incluir las opciones de capa actual",
nl: "Toon enkel de huidig getoonde lagen", nl: "Toon enkel de huidig getoonde lagen",
de: "Die aktuelle Ebenenauswahl einbeziehen" de: "Die aktuelle Ebenenauswahl einbeziehen"
}), }),
fsIncludeCurrentLocation: new T({ fsIncludeCurrentLocation: new Translation({
en: "Include current location", en: "Include current location",
es: "Incluir localización actual", es: "Incluir localización actual",
ca: "Incloure localització actual", ca: "Incloure localització actual",
@ -693,7 +795,7 @@ export default class Translations {
}) })
}, },
morescreen: { morescreen: {
intro: new T({ intro: new Translation({
en: "<h3>More thematic maps?</h3>Do you enjoy collecting geodata? <br/>There are more themes available.", en: "<h3>More thematic maps?</h3>Do you enjoy collecting geodata? <br/>There are more themes available.",
ca: "<h3>Més peticions</h3>T\'agrada captar dades? <br/>Hi ha més capes disponibles.", ca: "<h3>Més peticions</h3>T\'agrada captar dades? <br/>Hi ha més capes disponibles.",
es: "<h3>Más peticiones</h3>Te gusta captar datos? <br/>Hay más capas disponibles.", es: "<h3>Más peticiones</h3>Te gusta captar datos? <br/>Hay más capas disponibles.",
@ -703,7 +805,7 @@ export default class Translations {
de: "<h3>Weitere Quests</h3>Sammeln Sie gerne Geodaten? <br/>Es sind weitere Themen verfügbar." de: "<h3>Weitere Quests</h3>Sammeln Sie gerne Geodaten? <br/>Es sind weitere Themen verfügbar."
}), }),
requestATheme: new T({ requestATheme: new Translation({
en: "If you want a custom-built quest, request it <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>here</a>", en: "If you want a custom-built quest, request it <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>here</a>",
ca: "Si vols que et fem una petició pròpia , demana-la <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>aquí</a>", ca: "Si vols que et fem una petició pròpia , demana-la <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>aquí</a>",
es: "Si quieres que te hagamos una petición propia , pídela <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>aquí</a>", es: "Si quieres que te hagamos una petición propia , pídela <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>aquí</a>",
@ -713,7 +815,7 @@ export default class Translations {
de: "Wenn Sie einen speziell angefertigte Quest wünschen, können Sie diesen <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>hier</a> anfragen", de: "Wenn Sie einen speziell angefertigte Quest wünschen, können Sie diesen <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>hier</a> anfragen",
}), }),
streetcomplete: new T({ streetcomplete: new Translation({
en: "Another, similar application is <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>", en: "Another, similar application is <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>",
ca: "Una altra aplicació similar és <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>", ca: "Una altra aplicació similar és <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>",
es: "Otra aplicación similar es <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>", es: "Otra aplicación similar es <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>",
@ -722,7 +824,7 @@ export default class Translations {
gl: "Outra aplicación semellante é <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>", gl: "Outra aplicación semellante é <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>",
de: "Eine andere, ähnliche Anwendung ist <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>", de: "Eine andere, ähnliche Anwendung ist <a href='https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete' target='_blank'>StreetComplete</a>",
}), }),
createYourOwnTheme: new T({ createYourOwnTheme: new Translation({
en: "Create your own MapComplete theme from scratch", en: "Create your own MapComplete theme from scratch",
ca: "Crea la teva pròpia petició completa de MapComplete des de zero.", ca: "Crea la teva pròpia petició completa de MapComplete des de zero.",
es: "Crea tu propia petición completa de MapComplete desde cero.", es: "Crea tu propia petición completa de MapComplete desde cero.",
@ -732,7 +834,7 @@ export default class Translations {
de: "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu", de: "Erstellen Sie Ihr eigenes MapComplete-Thema von Grund auf neu",
}) })
}, },
readYourMessages: new T({ readYourMessages: new Translation({
en: "Please, read all your OpenStreetMap-messages before adding a new point.", en: "Please, read all your OpenStreetMap-messages before adding a new point.",
ca: "Llegeix tots els teus missatges d\'OpenStreetMap abans d\'afegir nous punts.", ca: "Llegeix tots els teus missatges d\'OpenStreetMap abans d\'afegir nous punts.",
es: "Lee todos tus mensajes de OpenStreetMap antes de añadir nuevos puntos.", es: "Lee todos tus mensajes de OpenStreetMap antes de añadir nuevos puntos.",
@ -741,7 +843,7 @@ export default class Translations {
gl: "Le todos a túas mensaxes do OpenStreetMap antes de engadir novos puntos.", gl: "Le todos a túas mensaxes do OpenStreetMap antes de engadir novos puntos.",
de: "Bitte lesen Sie alle Ihre OpenStreetMap-Nachrichten, bevor Sie einen neuen Punkt hinzufügen" de: "Bitte lesen Sie alle Ihre OpenStreetMap-Nachrichten, bevor Sie einen neuen Punkt hinzufügen"
}), }),
fewChangesBefore: new T({ fewChangesBefore: new Translation({
en: "Please, answer a few questions of existing points before adding a new point.", en: "Please, answer a few questions of existing points before adding a new point.",
ca: "Contesta unes quantes preguntes sobre punts existents abans d\'afegir-ne un de nou.", ca: "Contesta unes quantes preguntes sobre punts existents abans d\'afegir-ne un de nou.",
es: "Contesta unas cuantas preguntas sobre puntos existentes antes de añadir nuevos.", es: "Contesta unas cuantas preguntas sobre puntos existentes antes de añadir nuevos.",
@ -750,7 +852,7 @@ export default class Translations {
gl: "Responde unhas cantas preguntas sobre puntos existentes antes de engadir novos.", gl: "Responde unhas cantas preguntas sobre puntos existentes antes de engadir novos.",
de: "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen." de: "Bitte beantworten Sie ein paar Fragen zu bestehenden Punkten, bevor Sie einen neuen Punkt hinzufügen."
}), }),
goToInbox: new T({ goToInbox: new Translation({
en: "Open inbox", en: "Open inbox",
es: "Abrir mensajes", es: "Abrir mensajes",
ca: "Obrir missatges", ca: "Obrir missatges",
@ -759,7 +861,7 @@ export default class Translations {
gl: "Abrir mensaxes", gl: "Abrir mensaxes",
de: "Posteingang öffnen" de: "Posteingang öffnen"
}), }),
getStartedLogin: new T({ getStartedLogin: new Translation({
en: "Login with OpenStreetMap to get started", en: "Login with OpenStreetMap to get started",
es: "Entra en OpenStreetMap para empezar", es: "Entra en OpenStreetMap para empezar",
ca: "Entra a OpenStreetMap per començar", ca: "Entra a OpenStreetMap per començar",
@ -767,7 +869,7 @@ export default class Translations {
fr: "Connectez vous avec OpenStreetMap pour commencer", fr: "Connectez vous avec OpenStreetMap pour commencer",
de: "Mit OpenStreetMap einloggen und loslegen" de: "Mit OpenStreetMap einloggen und loslegen"
}), }),
getStartedNewAccount: new T({ getStartedNewAccount: new Translation({
en: " or <a href='https://www.openstreetmap.org/user/new' target='_blank'>create a new account</a>", en: " or <a href='https://www.openstreetmap.org/user/new' target='_blank'>create a new account</a>",
nl: " of <a href='https://www.openstreetmap.org/user/new' target='_blank'>maak een nieuwe account aan</a> ", nl: " of <a href='https://www.openstreetmap.org/user/new' target='_blank'>maak een nieuwe account aan</a> ",
fr: " ou <a href='https://www.openstreetmap.org/user/new' target='_blank'>registrez vous</a>", fr: " ou <a href='https://www.openstreetmap.org/user/new' target='_blank'>registrez vous</a>",
@ -776,20 +878,20 @@ export default class Translations {
gl: " ou <a href='https://www.openstreetmap.org/user/new' target='_blank'>crea unha nova conta</a>", gl: " ou <a href='https://www.openstreetmap.org/user/new' target='_blank'>crea unha nova conta</a>",
de: " oder <a href='https://www.openstreetmap.org/user/new' target='_blank'>ein neues Konto anlegen</a>", de: " oder <a href='https://www.openstreetmap.org/user/new' target='_blank'>ein neues Konto anlegen</a>",
}), }),
noTagsSelected: new T({ noTagsSelected: new Translation({
en: "No tags selected", en: "No tags selected",
es: "No se han seleccionado etiquetas", es: "No se han seleccionado etiquetas",
ca: "No s\'han seleccionat etiquetes", ca: "No s\'han seleccionat etiquetes",
gl: "Non se seleccionaron etiquetas", gl: "Non se seleccionaron etiquetas",
de: "Keine Tags ausgewählt" de: "Keine Tags ausgewählt"
}), }),
customThemeIntro: new T({ customThemeIntro: new Translation({
en: "<h3>Custom themes</h3>These are previously visited user-generated themes.", en: "<h3>Custom themes</h3>These are previously visited user-generated themes.",
nl: "<h3>Onofficiële themea's</h3>Je bezocht deze thema's gemaakt door andere OpenStreetMappers eerder", nl: "<h3>Onofficiële themea's</h3>Je bezocht deze thema's gemaakt door andere OpenStreetMappers eerder",
gl: "<h3>Temas personalizados</h3>Estes son temas xerados por usuarios previamente visitados.", gl: "<h3>Temas personalizados</h3>Estes son temas xerados por usuarios previamente visitados.",
de: "<h3>Kundenspezifische Themen</h3>Dies sind zuvor besuchte benutzergenerierte Themen" de: "<h3>Kundenspezifische Themen</h3>Dies sind zuvor besuchte benutzergenerierte Themen"
}), }),
aboutMapcomplete: new T({ aboutMapcomplete: new Translation({
en: "<h3>About MapComplete</h3>" + en: "<h3>About MapComplete</h3>" +
"<p>MapComplete is an OpenStreetMap editor that is meant to help everyone to easily add information on a <b>single theme.</b></p>" + "<p>MapComplete is an OpenStreetMap editor that is meant to help everyone to easily add information on a <b>single theme.</b></p>" +
"<p>Only features relevant to a single theme are shown with a few predefined questions, in order to keep things <b>simple and extremly user-friendly</b>." + "<p>Only features relevant to a single theme are shown with a few predefined questions, in order to keep things <b>simple and extremly user-friendly</b>." +
@ -836,14 +938,14 @@ export default class Translations {
"<p>Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? " + "<p>Fällt Ihnen ein Problem mit MapComplete auf? Haben Sie einen Feature-Wunsch? Wollen Sie beim Übersetzen helfen? " +
"Gehen Sie <a href='https://github.com/pietervdvn/MapComplete' target='_blank'>zum Quellcode</a> oder <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>zur Problemverfolgung</a>.</p>", "Gehen Sie <a href='https://github.com/pietervdvn/MapComplete' target='_blank'>zum Quellcode</a> oder <a href='https://github.com/pietervdvn/MapComplete/issues' target='_blank'>zur Problemverfolgung</a>.</p>",
}), }),
backgroundMap: new T({ backgroundMap: new Translation({
"en": "Background map", "en": "Background map",
"ca": "Mapa de fons", "ca": "Mapa de fons",
"es": "Mapa de fondo", "es": "Mapa de fondo",
"nl": "Achtergrondkaart", "nl": "Achtergrondkaart",
"de": "Hintergrundkarte" "de": "Hintergrundkarte"
}), }),
zoomInToSeeThisLayer: new T({ zoomInToSeeThisLayer: new Translation({
"en": "Zoom in to see this layer", "en": "Zoom in to see this layer",
"ca": "Amplia per veure aquesta capa", "ca": "Amplia per veure aquesta capa",
"es": "Amplía para ver esta capa", "es": "Amplía para ver esta capa",
@ -852,49 +954,49 @@ export default class Translations {
}), }),
weekdays: { weekdays: {
abbreviations:{ abbreviations:{
monday: new T({ monday: new Translation({
"en": "Mon", "en": "Mon",
"ca": "Dil", "ca": "Dil",
"es": "Lun", "es": "Lun",
"nl": "Maan", "nl": "Maan",
"fr": "Lun", "fr": "Lun",
}), }),
tuesday: new T({ tuesday: new Translation({
"en": "Tue", "en": "Tue",
"ca": "Dim", "ca": "Dim",
"es": "Mar", "es": "Mar",
"nl": "Din", "nl": "Din",
"fr": "Mar", "fr": "Mar",
}), }),
wednesday: new T({ wednesday: new Translation({
"en": "Wed", "en": "Wed",
"ca": "Dic", "ca": "Dic",
"es": "Mie", "es": "Mie",
"nl": "Woe", "nl": "Woe",
"fr": "Mercr", "fr": "Mercr",
}), }),
thursday: new T({ thursday: new Translation({
"en": "Thu", "en": "Thu",
"ca": "Dij", "ca": "Dij",
"es": "Jue", "es": "Jue",
"nl": "Don", "nl": "Don",
"fr": "Jeudi", "fr": "Jeudi",
}), }),
friday: new T({ friday: new Translation({
"en": "Fri", "en": "Fri",
"ca": "Div", "ca": "Div",
"es": "Vie", "es": "Vie",
"nl": "Vrij", "nl": "Vrij",
"fr": "Vendr", "fr": "Vendr",
}), }),
saturday: new T({ saturday: new Translation({
"en": "Sat", "en": "Sat",
"ca": "Dis", "ca": "Dis",
"es": "Sab", "es": "Sab",
"nl": "Zat", "nl": "Zat",
"fr": "Sam", "fr": "Sam",
}), }),
sunday: new T({ sunday: new Translation({
"en": "Sun", "en": "Sun",
"ca": "Diu", "ca": "Diu",
"es": "Dom", "es": "Dom",
@ -902,49 +1004,49 @@ export default class Translations {
"fr": "Dim", "fr": "Dim",
}) })
}, },
monday: new T({ monday: new Translation({
"en": "Monday", "en": "Monday",
"ca": "Dilluns", "ca": "Dilluns",
"es": "Lunes", "es": "Lunes",
"nl": "Maandag", "nl": "Maandag",
"fr": "Lundi", "fr": "Lundi",
}), }),
tuesday: new T({ tuesday: new Translation({
"en": "Tuesday", "en": "Tuesday",
"ca": "Dimarts", "ca": "Dimarts",
"es": "Martes", "es": "Martes",
"nl": "Dinsdag", "nl": "Dinsdag",
"fr": "Mardi", "fr": "Mardi",
}), }),
wednesday: new T({ wednesday: new Translation({
"en": "Wednesday", "en": "Wednesday",
"ca": "Dimecres", "ca": "Dimecres",
"es": "Miércoles", "es": "Miércoles",
"nl": "Woensdag", "nl": "Woensdag",
"fr": "Mercredi", "fr": "Mercredi",
}), }),
thursday: new T({ thursday: new Translation({
"en": "Thursday", "en": "Thursday",
"ca": "Dijous", "ca": "Dijous",
"es": "Jueves", "es": "Jueves",
"nl": "Donderdag", "nl": "Donderdag",
"fr": "Jeudi", "fr": "Jeudi",
}), }),
friday: new T({ friday: new Translation({
"en": "Friday", "en": "Friday",
"ca": "Divendres", "ca": "Divendres",
"es": "Viernes", "es": "Viernes",
"nl": "Vrijdag", "nl": "Vrijdag",
"fr": "Vendredi", "fr": "Vendredi",
}), }),
saturday: new T({ saturday: new Translation({
"en": "Saturday", "en": "Saturday",
"ca": "Dissabte", "ca": "Dissabte",
"es": "Sábado", "es": "Sábado",
"nl": "Zaterdag", "nl": "Zaterdag",
"fr": "Samedi", "fr": "Samedi",
}), }),
sunday: new T({ sunday: new Translation({
"en": "Sunday", "en": "Sunday",
"ca": "Diumenge", "ca": "Diumenge",
"es": "Domingo", "es": "Domingo",
@ -953,53 +1055,53 @@ export default class Translations {
}) })
}, },
opening_hours: { opening_hours: {
open_during_ph: new T({ open_during_ph: new Translation({
"nl": "Op een feestdag is deze zaak", "nl": "Op een feestdag is deze zaak",
"ca": "Durant festes aquest servei és", "ca": "Durant festes aquest servei és",
"es": "Durante fiestas este servicio está", "es": "Durante fiestas este servicio está",
"en":"During a public holiday, this amenity is" "en":"During a public holiday, this amenity is"
}), }),
opensAt: new T({ opensAt: new Translation({
"en": "from", "en": "from",
"ca": "des de", "ca": "des de",
"es": "desde", "es": "desde",
"nl": "vanaf" "nl": "vanaf"
}), openTill: new T({ }), openTill: new Translation({
"en": "till", "en": "till",
"ca": "fins", "ca": "fins",
"es": " hasta", "es": " hasta",
"nl": "tot" "nl": "tot"
}), }),
not_all_rules_parsed: new T({ not_all_rules_parsed: new Translation({
"en": "The opening hours of this shop are complicated. The following rules are ignored in the input element:", "en": "The opening hours of this shop are complicated. The following rules are ignored in the input element:",
"ca": "L'horari d'aquesta botiga és complicat. Les normes següents seran ignorades en l'entrada:", "ca": "L'horari d'aquesta botiga és complicat. Les normes següents seran ignorades en l'entrada:",
"es": "El horario de esta tienda es complejo. Las normas siguientes serán ignoradas en la entrada:" "es": "El horario de esta tienda es complejo. Las normas siguientes serán ignoradas en la entrada:"
}), }),
closed_until: new T({ closed_until: new Translation({
"en": "Closed until {date}", "en": "Closed until {date}",
"ca": "Tancat fins {date}", "ca": "Tancat fins {date}",
"es": "Cerrado hasta {date}", "es": "Cerrado hasta {date}",
"nl": "Gesloten - open op {date}" "nl": "Gesloten - open op {date}"
}), }),
closed_permanently: new T({ closed_permanently: new Translation({
"en": "Closed - no opening day known", "en": "Closed - no opening day known",
"ca": "Tancat - sense dia d'obertura conegut", "ca": "Tancat - sense dia d'obertura conegut",
"es": "Cerrado - sin día de apertura conocido", "es": "Cerrado - sin día de apertura conocido",
"nl": "Gesloten" "nl": "Gesloten"
}), }),
ph_not_known: new T({ ph_not_known: new Translation({
"en": " ", "en": " ",
"ca": " ", "ca": " ",
"es": " ", "es": " ",
"nl": " " "nl": " "
}), }),
ph_closed: new T({ ph_closed: new Translation({
"en": "closed", "en": "closed",
"ca": "tancat", "ca": "tancat",
"es": "cerrado", "es": "cerrado",
"nl": "gesloten" "nl": "gesloten"
}), ph_open: new T({ }), ph_open: new Translation({
"en": "opened", "en": "opened",
"ca": "tancat", "ca": "tancat",
"es": "abierto", "es": "abierto",
@ -1010,7 +1112,7 @@ export default class Translations {
} }
}, },
favourite: { favourite: {
title: new T({ title: new Translation({
en: "Personal theme", en: "Personal theme",
nl: "Persoonlijk thema", nl: "Persoonlijk thema",
es: "Interficie personal", es: "Interficie personal",
@ -1018,28 +1120,28 @@ export default class Translations {
gl: "Tema personalizado", gl: "Tema personalizado",
de: "Persönliches Thema" de: "Persönliches Thema"
}), }),
description: new T({ description: new Translation({
en: "Create a personal theme based on all the available layers of all themes", en: "Create a personal theme based on all the available layers of all themes",
es: "Crea una interficie basada en todas las capas disponibles de todas las interficies", es: "Crea una interficie basada en todas las capas disponibles de todas las interficies",
ca: "Crea una interfície basada en totes les capes disponibles de totes les interfícies", ca: "Crea una interfície basada en totes les capes disponibles de totes les interfícies",
gl: "Crea un tema baseado en todas as capas dispoñíbeis de todos os temas", gl: "Crea un tema baseado en todas as capas dispoñíbeis de todos os temas",
de: "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen" de: "Erstellen Sie ein persönliches Thema auf der Grundlage aller verfügbaren Ebenen aller Themen"
}), }),
panelIntro: new T({ panelIntro: new Translation({
en: "<h3>Your personal theme</h3>Activate your favourite layers from all the official themes", en: "<h3>Your personal theme</h3>Activate your favourite layers from all the official themes",
ca: "<h3>La teva interfície personal</h3>Activa les teves capes favorites de totes les interfícies oficials", ca: "<h3>La teva interfície personal</h3>Activa les teves capes favorites de totes les interfícies oficials",
es: "<h3>Tu interficie personal</h3>Activa tus capas favoritas de todas las interficies oficiales", es: "<h3>Tu interficie personal</h3>Activa tus capas favoritas de todas las interficies oficiales",
gl: "<h3>O teu tema personalizado</h3>Activa as túas capas favoritas de todos os temas oficiais", gl: "<h3>O teu tema personalizado</h3>Activa as túas capas favoritas de todos os temas oficiais",
de: "<h3>Ihr persönliches Thema</h3>Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen" de: "<h3>Ihr persönliches Thema</h3>Aktivieren Sie Ihre Lieblingsebenen aus allen offiziellen Themen"
}), }),
loginNeeded: new T({ loginNeeded: new Translation({
en: "<h3>Log in</h3>A personal layout is only available for OpenStreetMap users", en: "<h3>Log in</h3>A personal layout is only available for OpenStreetMap users",
es: "<h3>Entrar</h3>El diseño personalizado sólo está disponible para los usuarios de OpenstreetMap", es: "<h3>Entrar</h3>El diseño personalizado sólo está disponible para los usuarios de OpenstreetMap",
ca: "<h3>Entrar</h3>El disseny personalizat només està disponible pels usuaris d\' OpenstreetMap", ca: "<h3>Entrar</h3>El disseny personalizat només està disponible pels usuaris d\' OpenstreetMap",
gl: "<h3>Iniciar a sesión</h3>O deseño personalizado só está dispoñíbel para os usuarios do OpenstreetMap", gl: "<h3>Iniciar a sesión</h3>O deseño personalizado só está dispoñíbel para os usuarios do OpenstreetMap",
de: "<h3>Anmelden</h3>Ein persönliches Layout ist nur für OpenStreetMap-Benutzer verfügbar", de: "<h3>Anmelden</h3>Ein persönliches Layout ist nur für OpenStreetMap-Benutzer verfügbar",
}), }),
reload: new T({ reload: new Translation({
en: "Reload the data", en: "Reload the data",
es: "Recargar datos", es: "Recargar datos",
ca: "Recarregar dades", ca: "Recarregar dades",

View file

@ -262,6 +262,7 @@
font-size: smaller; font-size: smaller;
border-radius: 0.3em; border-radius: 0.3em;
border: 1px solid #ccc; border: 1px solid #ccc;
word-break: initial;
} }

View file

@ -1,17 +1,19 @@
import {UIElement} from "../UI/UIElement"; import {UIElement} from "../UI/UIElement";
UIElement.runningFromConsole = true;
import {equal} from "assert"; import {equal} from "assert";
import Translation from "../UI/i18n/Translation";
import T from "./TestHelper"; import T from "./TestHelper";
import {FromJSON} from "../Customizations/JSON/FromJSON"; import {FromJSON} from "../Customizations/JSON/FromJSON";
import {And, Tag} from "../Logic/Tags"; import {And, Tag} from "../Logic/Tags";
import Locale from "../UI/i18n/Locale"; import Locale from "../UI/i18n/Locale";
import Translations from "../UI/i18n/Translations"; import Translations, {Translation} from "../UI/i18n/Translations";
import {UIEventSource} from "../Logic/UIEventSource"; import {UIEventSource} from "../Logic/UIEventSource";
import {OH, OpeningHour} from "../Logic/OpeningHours"; import {OH, OpeningHour} from "../Logic/OpeningHours";
import PublicHolidayInput from "../UI/Input/OpeningHours/PublicHolidayInput"; import PublicHolidayInput from "../UI/Input/OpeningHours/PublicHolidayInput";
import {TagRendering} from "../UI/Popup/TagRendering"; import TagRenderingConfig from "../Customizations/JSON/TagRenderingConfig";
import EditableTagRendering from "../UI/Popup/EditableTagRendering";
import {SubstitutedTranslation} from "../UI/SpecialVisualizations";
UIElement.runningFromConsole = true;
new T([ new T([
@ -32,10 +34,34 @@ new T([
equal((and.and[1] as Tag).value, "y"); equal((and.and[1] as Tag).value, "y");
})], })],
["Is equivalent test", (() => {
const t0 = new And([
new Tag("valves:special","A"),
new Tag("valves","A")
])
const t1 = new And([
new Tag("valves","A")
])
const t2 = new And([
new Tag("valves","B")
])
equal(true, t0.isEquivalent(t0))
equal(true, t1.isEquivalent(t1))
equal(true, t2.isEquivalent(t2))
equal(false, t0.isEquivalent(t1))
equal(false, t0.isEquivalent(t2))
equal(false, t1.isEquivalent(t0))
equal(false, t1.isEquivalent(t2))
equal(false, t2.isEquivalent(t0))
equal(false, t2.isEquivalent(t1))
})],
["Parse translation map", (() => { ["Parse translation map", (() => {
const json: any = {"en": "English", "nl": "Nederlands"}; const json: any = {"en": "English", "nl": "Nederlands"};
const translation = Translations.WT(FromJSON.Translation(json)); const translation = Translations.WT(new Translation(json));
Locale.language.setData("en"); Locale.language.setData("en");
equal(translation.txt, "English"); equal(translation.txt, "English");
Locale.language.setData("nl"); Locale.language.setData("nl");
@ -43,7 +69,7 @@ new T([
})], })],
["Parse tag rendering", (() => { ["Parse tag rendering", (() => {
Locale.language.setData("nl"); Locale.language.setData("nl");
const tr = FromJSON.TagRendering({ const tr = new TagRenderingConfig({
render: ({"en":"Name is {name}", "nl":"Ook een {name}"} as any), render: ({"en":"Name is {name}", "nl":"Ook een {name}"} as any),
question: "Wat is de naam van dit object?", question: "Wat is de naam van dit object?",
freeform: { freeform: {
@ -59,12 +85,12 @@ new T([
condition: "x=" condition: "x="
}, ""); }, "");
equal(true, tr.IsKnown({"noname": "yes"})); equal(undefined, tr.GetRenderValue({"foo": "bar"}));
equal(true, tr.IsKnown({"name": "ABC"})); equal("Has no name", tr.GetRenderValue({"noname": "yes"})?.txt);
equal(false, tr.IsKnown({"foo": "bar"})); equal("Ook een {name}", tr.GetRenderValue({"name": "xyz"})?.txt);
equal("Has no name", tr.GetContent({"noname": "yes"})?.txt); equal("Ook een xyz", new SubstitutedTranslation( tr.GetRenderValue({"name": "xyz"}),
equal("Ook een xyz", tr.GetContent({"name": "xyz"})?.txt); new UIEventSource<any>({"name":"xyz"})).InnerRender());
equal(undefined, tr.GetContent({"foo": "bar"})); equal(undefined, tr.GetRenderValue({"foo": "bar"}));
})], })],
@ -110,10 +136,9 @@ new T([
] ]
}; };
const constr = FromJSON.TagRendering(def, "test"); const constr = new TagRenderingConfig(def, "test");
TagRendering.injectFunction(); const uiEl = new EditableTagRendering(new UIEventSource<any>(
const uiEl = constr.construct(new UIEventSource<any>( {leisure: "park", "access": "no"}), constr
{leisure: "park", "access": "no"})
); );
const rendered = uiEl.InnerRender(); const rendered = uiEl.InnerRender();
equal(true, rendered.indexOf("Niet toegankelijk") > 0) equal(true, rendered.indexOf("Niet toegankelijk") > 0)