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 {And, Or, RegexTag, Tag, TagsFilter} from "../../Logic/Tags";
import Translation from "../../UI/i18n/Translation";
import {Translation} from "../../UI/i18n/Translations";
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 {TagRenderingConfigJson} from "./TagRenderingConfigJson";
import Translations from "../../UI/i18n/Translations";

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -3,104 +3,3 @@ import Locale from "./Locale"
import Combine from "../Base/Combine";
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 {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 {
constructor() {
@ -13,7 +115,7 @@ export default class Translations {
static t = {
image: {
addPicture: new T({
addPicture: new Translation({
en: 'Add picture',
es: 'Añadir foto',
ca: 'Afegir foto',
@ -23,7 +125,7 @@ export default class Translations {
de: "Bild hinzufügen"
}),
uploadingPicture: new T({
uploadingPicture: new Translation({
en: 'Uploading your picture...',
nl: 'Bezig met een foto te uploaden...',
es: 'Subiendo tu imagen ...',
@ -33,7 +135,7 @@ export default class Translations {
de: 'Ihr Bild hochladen...'
}),
uploadingMultiple: new T({
uploadingMultiple: new Translation({
en: "Uploading {count} of your picture...",
nl: "Bezig met {count} foto's te uploaden...",
ca: "Pujant {count} de la teva imatge...",
@ -43,7 +145,7 @@ export default class Translations {
de: "{count} Ihrer Bilder hochgeladen..."
}),
pleaseLogin: new T({
pleaseLogin: new Translation({
en: 'Please login to add a picure',
nl: 'Gelieve je aan te melden om een foto toe te voegen',
es: 'Entra para subir una foto',
@ -53,7 +155,7 @@ export default class Translations {
de: 'Bitte einloggen, um ein Bild hinzuzufügen'
}),
willBePublished: new T({
willBePublished: new Translation({
en: 'Your picture will be published: ',
es: 'Tu foto será publicada: ',
ca: 'La teva foto serà publicada: ',
@ -63,7 +165,7 @@ export default class Translations {
de: 'Ihr Bild wird veröffentlicht: '
}),
cco: new T({
cco: new Translation({
en: 'in the public domain',
ca: 'en domini públic',
es: 'en dominio público',
@ -73,7 +175,7 @@ export default class Translations {
de: 'in die Public Domain'
}),
ccbs: new T({
ccbs: new Translation({
en: 'under the CC-BY-SA-license',
nl: 'onder de CC-BY-SA-licentie',
ca: 'sota llicència CC-BY-SA',
@ -82,7 +184,7 @@ export default class Translations {
gl: 'baixo a licenza CC-BY-SA',
de: 'unter der CC-BY-SA-Lizenz'
}),
ccb: new T({
ccb: new Translation({
en: 'under the CC-BY-license',
ca: 'sota la llicència CC-BY',
es: 'bajo licencia CC-BY',
@ -92,7 +194,7 @@ export default class Translations {
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.",
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.",
@ -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..",
}),
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.",
ca: "Respecta la privacitat. No fotografiïs gent o matrícules",
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",
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>",
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>",
@ -120,21 +222,21 @@ export default class Translations {
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>",
}),
dontDelete: new T({
dontDelete: new Translation({
"nl":"Terug",
"en":"Cancel",
"ca":"Cancel·lar",
"es":"Cancelar",
"de": "Abbrechen"
}),
doDelete: new T({
doDelete: new Translation({
"nl":"Verwijder afbeelding",
"en":"Remove image",
"ca":"Esborrar imatge",
"es":"Borrar imagen",
"de": "Bild entfernen"
}),
isDeleted: new T({
isDeleted: new Translation({
"nl":"Verwijderd",
"en":"Deleted",
"ca":"Esborrada",
@ -143,7 +245,7 @@ export default class Translations {
})
},
centerMessage: {
loadingData: new T({
loadingData: new Translation({
en: 'Loading data...',
ca: 'Carregant dades...',
es: 'Cargando datos...',
@ -152,7 +254,7 @@ export default class Translations {
gl: 'Cargando os datos...',
de: 'Daten werden geladen...'
}),
zoomIn: new T({
zoomIn: new Translation({
en: 'Zoom in to view or edit the data',
ca: 'Amplia per veure o editar les dades',
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',
de: 'Vergrößern, um die Daten anzuzeigen oder zu bearbeiten'
}),
ready: new T({
ready: new Translation({
en: "Done!",
ca: "Fet.",
es: "Hecho.",
@ -171,7 +273,7 @@ export default class Translations {
de: "Erledigt!"
}),
retrying: new T({
retrying: new Translation({
en: "Loading data failed. Trying again... ({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})",
@ -181,7 +283,7 @@ export default class Translations {
},
general: {
loginWithOpenStreetMap: new T({
loginWithOpenStreetMap: new Translation({
en: "Login with OpenStreetMap",
ca: "Entra a OpenStreetMap",
es: "Entra en OpenStreetMap",
@ -191,7 +293,7 @@ export default class Translations {
de: "Anmeldung mit OpenStreetMap"
}),
welcomeBack: new T({
welcomeBack: new Translation({
en: "You are logged in, welcome back!",
ca: "Has entrat, benvingut.",
es: "Has entrado, bienvenido.",
@ -200,7 +302,7 @@ export default class Translations {
gl: "Iniciaches a sesión, benvido.",
de: "Sie sind eingeloggt, willkommen zurück!"
}),
loginToStart: new T({
loginToStart: new Translation({
en: "Login to answer this question",
ca: "Entra per contestar aquesta 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",
ca: "Tornar al mapa",
es: "Volver al mapa",
@ -258,7 +360,7 @@ export default class Translations {
gl: "Voltar ó mapa",
de: "Zurück zur Karte"
}),
save: new T({
save: new Translation({
en: "Save",
ca: "Desar",
es: "Guardar",
@ -267,7 +369,7 @@ export default class Translations {
gl: "Gardar",
de: "Speichern"
}),
cancel: new T({
cancel: new Translation({
en: "Cancel",
ca: "Cancel·lar",
es: "Cancelar",
@ -276,7 +378,7 @@ export default class Translations {
gl: "Desbotar",
de: "Abbrechen"
}),
skip: new T({
skip: new Translation({
en: "Skip this question",
ca: "Saltar aquesta pregunta",
es: "Saltar esta pregunta",
@ -285,7 +387,7 @@ export default class Translations {
gl: "Ignorar esta pregunta",
de: "Diese Frage überspringen"
}),
oneSkippedQuestion: new T({
oneSkippedQuestion: new Translation({
en: "One question is skipped",
ca: "Has ignorat una pregunta",
es: "Has ignorado una pregunta",
@ -294,7 +396,7 @@ export default class Translations {
gl: "Ignoraches unha pregunta",
de: "Eine Frage wurde übersprungen"
}),
skippedQuestions: new T({
skippedQuestions: new Translation({
en: "Some questions are skipped",
ca: "Has ignorat algunes preguntes",
es: "Has ignorado algunas preguntas",
@ -303,7 +405,7 @@ export default class Translations {
gl: "Ignoraches algunhas preguntas",
de: "Einige Fragen wurden übersprungen"
}),
number: new T({
number: new Translation({
en: "number",
ca: "nombre",
es: "número",
@ -313,7 +415,7 @@ export default class Translations {
de: "Zahl"
}),
osmLinkTooltip: new T({
osmLinkTooltip: new Translation({
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ó",
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"
}),
add: {
addNew: new T({
addNew: new Translation({
en: "Add a new {category} here",
ca: "Afegir {category} aquí",
es: "Añadir {category} aquí",
@ -332,7 +434,7 @@ export default class Translations {
gl: "Engadir {category} aquí",
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/>",
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/>",
@ -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/>",
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>",
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>",
@ -350,7 +452,7 @@ export default class Translations {
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>"
}),
zoomInFurther: new T({
zoomInFurther: new Translation({
en: "Zoom in further to add a point.",
ca: "Apropa per afegir un punt.",
es: "Acerca para añadir un punto.",
@ -359,7 +461,7 @@ export default class Translations {
gl: "Achégate para engadir un punto.",
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.",
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.",
@ -368,7 +470,7 @@ export default class Translations {
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."
}),
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.",
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.",
@ -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.",
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",
ca: "Afegir {category} aquí",
es: "Añadir {category} aquí",
@ -386,7 +488,7 @@ export default class Translations {
gl: "Engadir {category} aquí",
de: "Hier eine {category} hinzufügen"
}),
openLayerControl: new T({
openLayerControl: new Translation({
"en": "Open the layer control box",
"ca": "Obrir el control de capes",
"es": "Abrir el control de capas",
@ -394,7 +496,7 @@ export default class Translations {
"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",
"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",
@ -402,7 +504,7 @@ export default class Translations {
"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",
ca: "Tria idioma",
es: "Escoge idioma",
@ -411,7 +513,7 @@ export default class Translations {
gl: "Escoller lingua",
de: "Wählen Sie eine Sprache"
}),
about: new T({
about: new Translation({
en: "Easily edit and add OpenStreetMap for a certain theme",
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",
@ -420,7 +522,7 @@ export default class Translations {
gl: "Editar doadamente e engadir puntos no OpenStreetMap dun eido en concreto",
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 $$$",
ca: "{category}: El seu nom és $$$",
es: "{category}: Su nombre es $$$",
@ -429,7 +531,7 @@ export default class Translations {
gl: "{category}: O teu nome é $$$",
de: "Der Name dieser {category} ist $$$"
}),
noNameCategory: new T({
noNameCategory: new Translation({
en: "{category} without a name",
ca: "{category} sense nom",
es: "{category} sin nombre",
@ -439,7 +541,7 @@ export default class Translations {
de: "{category} ohne Namen",
}),
questions: {
phoneNumberOf: new T({
phoneNumberOf: new Translation({
en: "What is the phone number of {category}?",
ca: "Quin és el telèfon de {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}?",
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>",
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>",
@ -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>",
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}?",
ca: "Quina és 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}?",
de: "Was ist die Website der {category}?"
}),
websiteIs: new T({
websiteIs: new Translation({
en: "Website: <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>",
@ -475,7 +577,7 @@ export default class Translations {
gl: "Páxina web: <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}?",
ca: "Quina és l\'adreça de correu-e de {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}?"
}
),
emailIs: new T({
emailIs: new Translation({
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>",
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>" +
"<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>" +
@ -553,7 +655,7 @@ export default class Translations {
}),
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:",
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:",
@ -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:",
}),
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.",
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.",
@ -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",
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.",
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á.",
@ -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",
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",
ca: "Enllaç copiat al portapapers",
es: "Enlace copiado en el portapapeles",
@ -589,7 +691,7 @@ export default class Translations {
nl: "Link gekopieerd naar klembord",
de: "Link in die Zwischenablage kopiert"
}),
thanksForSharing: new T({
thanksForSharing: new Translation({
en: "Thanks for sharing!",
ca: "Gràcies per compartir",
es: "Gracias por compartir",
@ -597,7 +699,7 @@ export default class Translations {
nl: "Bedankt om te delen!",
de: "Danke für das Teilen!"
}),
editThisTheme: new T({
editThisTheme: new Translation({
en: "Edit this theme",
ca: "Editar aquest repte",
es: "Editar este reto",
@ -605,7 +707,7 @@ export default class Translations {
nl: "Pas dit thema aan",
de: "Dieses Thema bearbeiten"
}),
editThemeDescription: new T({
editThemeDescription: new Translation({
en: "Add or change questions to this map theme",
ca: "Afegir o canviar preguntes d'aquest repte",
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",
de: "Fragen zu diesem Kartenthema hinzufügen oder ändern"
}),
fsUserbadge: new T({
fsUserbadge: new Translation({
en: "Enable the login-button",
ca: "Activar el botó d'entrada",
es: "Activar el botón de entrada",
@ -621,7 +723,7 @@ export default class Translations {
nl: "Activeer de login-knop",
de:" Anmelde-Knopf aktivieren"
}),
fsSearch: new T({
fsSearch: new Translation({
en: "Enable the search bar",
ca: "Activar la barra de cerca",
es: "Activar la barra de búsqueda",
@ -629,7 +731,7 @@ export default class Translations {
nl: "Activeer de zoekbalk",
de: " Suchleiste aktivieren"
}),
fsWelcomeMessage: new T({
fsWelcomeMessage: new Translation({
en: "Show the welcome message popup and associated tabs",
ca: "Mostra el missatge emergent de benvinguda i pestanyes associades",
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",
de: "Popup der Begrüßungsnachricht und zugehörige Registerkarten anzeigen"
}),
fsLayers: new T({
fsLayers: new Translation({
en: "Enable thelayer control",
ca: "Activar el control de capes",
es: "Activar el control de capas",
@ -646,7 +748,7 @@ export default class Translations {
de: "Aktivieren der Layersteuerung"
}),
fsLayerControlToggle: new T({
fsLayerControlToggle: new Translation({
en: "Start with the layer control expanded",
gl: "Comenza co control de capas expandido",
ca: "Iniciar el control de capes avançat",
@ -654,7 +756,7 @@ export default class Translations {
nl: "Toon de laagbediening meteen volledig",
de: "Mit der erweiterten Ebenenkontrolle beginnen"
}),
fsAddNew: new T({
fsAddNew: new Translation({
en: "Enable the 'add new POI' button",
ca: "Activar el botó d'afegir nou 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'",
de: "Schaltfläche 'neuen POI hinzufügen' aktivieren",
}),
fsGeolocation: new T({
fsGeolocation: new Translation({
en: "Enable the 'geolocate-me' button (mobile only)",
ca: "Activar el botó de 'geolocalitza'm' (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)",
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>",
ca: "Incloure l'opció de fons actual <b>{name}</b>",
es: "Incluir la opción de fondo actual <b>{name}</b>",
nl: "Gebruik de huidige achtergrond <b>{name}</b>",
de: "Die aktuelle Hintergrundwahl einschließen <b>{name}</b>",
}),
fsIncludeCurrentLayers: new T({
fsIncludeCurrentLayers: new Translation({
en: "Include the current layer choices",
ca: "Incloure les opcions de capa actual",
es: "Incluir las opciones de capa actual",
nl: "Toon enkel de huidig getoonde lagen",
de: "Die aktuelle Ebenenauswahl einbeziehen"
}),
fsIncludeCurrentLocation: new T({
fsIncludeCurrentLocation: new Translation({
en: "Include current location",
es: "Incluir localización actual",
ca: "Incloure localització actual",
@ -693,7 +795,7 @@ export default class Translations {
})
},
morescreen: {
intro: new T({
intro: new Translation({
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.",
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."
}),
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>",
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>",
@ -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",
}),
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>",
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>",
@ -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>",
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",
ca: "Crea la teva pròpia petició completa de MapComplete des de zero.",
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",
})
},
readYourMessages: new T({
readYourMessages: new Translation({
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.",
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.",
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.",
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.",
@ -750,7 +852,7 @@ export default class Translations {
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."
}),
goToInbox: new T({
goToInbox: new Translation({
en: "Open inbox",
es: "Abrir mensajes",
ca: "Obrir missatges",
@ -759,7 +861,7 @@ export default class Translations {
gl: "Abrir mensaxes",
de: "Posteingang öffnen"
}),
getStartedLogin: new T({
getStartedLogin: new Translation({
en: "Login with OpenStreetMap to get started",
es: "Entra en OpenStreetMap para empezar",
ca: "Entra a OpenStreetMap per començar",
@ -767,7 +869,7 @@ export default class Translations {
fr: "Connectez vous avec OpenStreetMap pour commencer",
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>",
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>",
@ -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>",
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",
es: "No se han seleccionado etiquetas",
ca: "No s\'han seleccionat etiquetes",
gl: "Non se seleccionaron etiquetas",
de: "Keine Tags ausgewählt"
}),
customThemeIntro: new T({
customThemeIntro: new Translation({
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",
gl: "<h3>Temas personalizados</h3>Estes son temas xerados por usuarios previamente visitados.",
de: "<h3>Kundenspezifische Themen</h3>Dies sind zuvor besuchte benutzergenerierte Themen"
}),
aboutMapcomplete: new T({
aboutMapcomplete: new Translation({
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>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? " +
"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",
"ca": "Mapa de fons",
"es": "Mapa de fondo",
"nl": "Achtergrondkaart",
"de": "Hintergrundkarte"
}),
zoomInToSeeThisLayer: new T({
zoomInToSeeThisLayer: new Translation({
"en": "Zoom in to see this layer",
"ca": "Amplia per veure aquesta capa",
"es": "Amplía para ver esta capa",
@ -852,49 +954,49 @@ export default class Translations {
}),
weekdays: {
abbreviations:{
monday: new T({
monday: new Translation({
"en": "Mon",
"ca": "Dil",
"es": "Lun",
"nl": "Maan",
"fr": "Lun",
}),
tuesday: new T({
tuesday: new Translation({
"en": "Tue",
"ca": "Dim",
"es": "Mar",
"nl": "Din",
"fr": "Mar",
}),
wednesday: new T({
wednesday: new Translation({
"en": "Wed",
"ca": "Dic",
"es": "Mie",
"nl": "Woe",
"fr": "Mercr",
}),
thursday: new T({
thursday: new Translation({
"en": "Thu",
"ca": "Dij",
"es": "Jue",
"nl": "Don",
"fr": "Jeudi",
}),
friday: new T({
friday: new Translation({
"en": "Fri",
"ca": "Div",
"es": "Vie",
"nl": "Vrij",
"fr": "Vendr",
}),
saturday: new T({
saturday: new Translation({
"en": "Sat",
"ca": "Dis",
"es": "Sab",
"nl": "Zat",
"fr": "Sam",
}),
sunday: new T({
sunday: new Translation({
"en": "Sun",
"ca": "Diu",
"es": "Dom",
@ -902,49 +1004,49 @@ export default class Translations {
"fr": "Dim",
})
},
monday: new T({
monday: new Translation({
"en": "Monday",
"ca": "Dilluns",
"es": "Lunes",
"nl": "Maandag",
"fr": "Lundi",
}),
tuesday: new T({
tuesday: new Translation({
"en": "Tuesday",
"ca": "Dimarts",
"es": "Martes",
"nl": "Dinsdag",
"fr": "Mardi",
}),
wednesday: new T({
wednesday: new Translation({
"en": "Wednesday",
"ca": "Dimecres",
"es": "Miércoles",
"nl": "Woensdag",
"fr": "Mercredi",
}),
thursday: new T({
thursday: new Translation({
"en": "Thursday",
"ca": "Dijous",
"es": "Jueves",
"nl": "Donderdag",
"fr": "Jeudi",
}),
friday: new T({
friday: new Translation({
"en": "Friday",
"ca": "Divendres",
"es": "Viernes",
"nl": "Vrijdag",
"fr": "Vendredi",
}),
saturday: new T({
saturday: new Translation({
"en": "Saturday",
"ca": "Dissabte",
"es": "Sábado",
"nl": "Zaterdag",
"fr": "Samedi",
}),
sunday: new T({
sunday: new Translation({
"en": "Sunday",
"ca": "Diumenge",
"es": "Domingo",
@ -953,53 +1055,53 @@ export default class Translations {
})
},
opening_hours: {
open_during_ph: new T({
open_during_ph: new Translation({
"nl": "Op een feestdag is deze zaak",
"ca": "Durant festes aquest servei és",
"es": "Durante fiestas este servicio está",
"en":"During a public holiday, this amenity is"
}),
opensAt: new T({
opensAt: new Translation({
"en": "from",
"ca": "des de",
"es": "desde",
"nl": "vanaf"
}), openTill: new T({
}), openTill: new Translation({
"en": "till",
"ca": "fins",
"es": " hasta",
"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:",
"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:"
}),
closed_until: new T({
closed_until: new Translation({
"en": "Closed until {date}",
"ca": "Tancat fins {date}",
"es": "Cerrado hasta {date}",
"nl": "Gesloten - open op {date}"
}),
closed_permanently: new T({
closed_permanently: new Translation({
"en": "Closed - no opening day known",
"ca": "Tancat - sense dia d'obertura conegut",
"es": "Cerrado - sin día de apertura conocido",
"nl": "Gesloten"
}),
ph_not_known: new T({
ph_not_known: new Translation({
"en": " ",
"ca": " ",
"es": " ",
"nl": " "
}),
ph_closed: new T({
ph_closed: new Translation({
"en": "closed",
"ca": "tancat",
"es": "cerrado",
"nl": "gesloten"
}), ph_open: new T({
}), ph_open: new Translation({
"en": "opened",
"ca": "tancat",
"es": "abierto",
@ -1010,7 +1112,7 @@ export default class Translations {
}
},
favourite: {
title: new T({
title: new Translation({
en: "Personal theme",
nl: "Persoonlijk thema",
es: "Interficie personal",
@ -1018,28 +1120,28 @@ export default class Translations {
gl: "Tema personalizado",
de: "Persönliches Thema"
}),
description: new T({
description: new Translation({
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",
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",
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",
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",
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"
}),
loginNeeded: new T({
loginNeeded: new Translation({
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",
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",
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",
es: "Recargar datos",
ca: "Recarregar dades",

View file

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

View file

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