Fix tests, refactoring kindof works now
This commit is contained in:
parent
813e96f8df
commit
1447863fa7
11 changed files with 307 additions and 254 deletions
|
@ -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";
|
||||
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 "";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -262,6 +262,7 @@
|
|||
font-size: smaller;
|
||||
border-radius: 0.3em;
|
||||
border: 1px solid #ccc;
|
||||
word-break: initial;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue