diff --git a/src/app/pages/unavailable/unavailable.component.html b/src/app/pages/unavailable/unavailable.component.html index fba5928..cc2f2f6 100644 --- a/src/app/pages/unavailable/unavailable.component.html +++ b/src/app/pages/unavailable/unavailable.component.html @@ -12,7 +12,7 @@ {{'service-unavailable.retry' | i18n}} - + {{'service-unavailable.support' | i18n}} diff --git a/src/app/services/i18n.service.ts b/src/app/services/i18n.service.ts index fe5d08a..1ef8fe6 100644 --- a/src/app/services/i18n.service.ts +++ b/src/app/services/i18n.service.ts @@ -11,7 +11,7 @@ import { ActivatedRoute } from '@angular/router'; export class I18nService { locale: string = "de-informal"; - locales: any = [ "de-informal" ]; + locales: any = ["en", "de-informal"]; i18n: any; constructor(private http: HttpClient, @@ -30,19 +30,22 @@ export class I18nService { } async fetch() { - this.locales = await firstValueFrom(this.http.get(environment.apiUrl + "/i18n")); - + try { + this.locales = await firstValueFrom(this.http.get(environment.apiUrl + "/i18n")); + } catch { + this.locales = ["en", "de-informal"]; + } let browserLocale = window.navigator.language || window.parent.navigator.language; if (browserLocale.indexOf("-") != -1) { - browserLocale = browserLocale.split("-")[ 0 ]; + browserLocale = browserLocale.split("-")[0]; } - let locale = browserLocale || this.locales[ 0 ]; + let locale = browserLocale || this.locales[0]; try { locale = localStorage.getItem("bstly.locale") || locale; } catch { - locale = window.location.search.split("locale=")[ 1 ]; + locale = window.location.search.split("locale=")[1]; } if (locale == 'de') { @@ -50,7 +53,7 @@ export class I18nService { } if (this.locales.indexOf(locale) == -1) { - locale = this.locales[ 0 ]; + locale = this.locales[0]; } @@ -75,19 +78,19 @@ export class I18nService { key += ''; if (!from) { return empty ? this.empty(key, args, path) : (key || ""); - } else if (from[ key ]) { - if (typeof from[ key ] === 'object') { - if (from[ key ][ "." ]) { - return this.insertArguments(from[ key ][ "." ], args); + } else if (from[key]) { + if (typeof from[key] === 'object') { + if (from[key]["."]) { + return this.insertArguments(from[key]["."], args); } return empty ? this.empty(key, args, path) : (key || ""); } - return this.insertArguments(from[ key ], args); + return this.insertArguments(from[key], args); } else { let keys = key.split("."); - if (from[ keys[ 0 ] ]) { + if (from[keys[0]]) { key = keys.slice(1, keys.length).join("."); - return this.getInternal(key, args, from[ keys[ 0 ] ], path + keys[ 0 ] + ".", empty) + return this.getInternal(key, args, from[keys[0]], path + keys[0] + ".", empty) } } @@ -101,7 +104,7 @@ export class I18nService { insertArguments(label: string, args: string[]) { if (args) { for (let index in args) { - label = label.replace(`{${index}}`, this.get(args[ index ], null)); + label = label.replace(`{${index}}`, this.get(args[index], null)); } } return label; @@ -143,6 +146,6 @@ export class I18nPaginatorIntl implements MatPaginatorIntl { } const amountPages = Math.ceil(length / pageSize); - return this.i18n.get('paginator.range', [ page + 1 + "", amountPages + "" ]); + return this.i18n.get('paginator.range', [page + 1 + "", amountPages + ""]); } } \ No newline at end of file diff --git a/src/assets/i18n/de-informal.json b/src/assets/i18n/de-informal.json index 74ce576..714048f 100644 --- a/src/assets/i18n/de-informal.json +++ b/src/assets/i18n/de-informal.json @@ -5,10 +5,92 @@ ".": "Erweitert" } }, + "borrow": { + ".": "Ausleihen", + "items": { + ".": "Verleihbare Items", + "actions": "Aktionen", + "autoAccept": "Automatisch akzeptieren", + "availability": { + ".": "Verfügbarkeit", + "ALWAYS": "Immer", + "MANUAL": "Manuel", + "PERIOD": "Periodisch" + }, + "create": "Neues Item erstellen", + "confirmDelete": "Bist du sicher, dass du das Item '{0}' löschen möchtest?", + "delete": "Item löschen", + "description": "Beschreibung", + "edit": "Item bearbeiten", + "email": "E-Mail", + "emailNotification": "E-Mail Benachrichtigungen", + "error": { + "availability": "Bitte Verfügbarkeit auswählen.", + "description": "Bitte eine Beschreibung eintragen.", + "email": "Bitte eine gültige E-Mail Addresse eintragen.", + "name": "Bitte einen Namen eintragen.", + "maxDuration": "Max. Dauer muss größer als die min. Dauer sein.", + "minDuration": "Min. Dauer muss kleiner als die max. Dauer sein.", + "slot": { + "end": "Ende muss nach dem Beginn sein.", + "endDay": "Wochentag muss größer oder gleich dem Beginn sein.", + "endTime": "Ende muss nach dem Beginn sein.", + "start": "Beginn muss kleiner dem Ende sein.", + "startDay": "Wochentag muss kleiner oder gleich dem Ende sein.", + "startTime": "Beginn muss vor dem Ende sein." + }, + "url": "Bitte eine gültige Url eintragen." + }, + "maxDuration": "Max. Dauer", + "minDuration": "Min. Dauer", + "mine": "Meine", + "name": "Name", + "save": "Item speichern", + "search": "Suche", + "slot": { + ".": "Slot", + "addManual": "Manuellen Slot hinzufügen", + "addPeriod": "Periodischen Slot hinzufügen", + "day": { + ".": "Tag", + "MONDAY": "Montag", + "TUESDAY": "Dienstag", + "WEDNESDAY": "Mittwoch", + "THURSDAY": "Donnerstag", + "FRIDAY": "Freitag", + "SATURDAY": "Samstag", + "SUNDAY": "Sonntag" + }, + "delete": "Slot entfernen", + "end": "Ende", + "endDay": "Wochentag Ende", + "endTime": "Ende", + "MANUAL": "Manuelle Slots", + "PERIOD": "Periodische Slots", + "start": "Beginn", + "startDay": "Wochentag Beginn", + "startTime": "Beginn" + }, + "url": "Url" + }, + "proving": { + ".": "Proving", + "camera": "Camera", + "flash": "Flash" + }, + "requests": { + ".": "Requests" + } + }, "cancel": "Abbrechen", "close": "Schließen", "confirm": "Bestätigen", - "delete" : "Löschen", + "delete": "Löschen", + "durationpicker": { + "days": "Tage", + "hours": "Stunden", + "minutes": "Minuten" + }, "email": { ".": "E-Mail Adresse", "invalid": "ungültige E-Mail Adresse", @@ -18,19 +100,20 @@ } }, "format": { - "date": "dd.MM.yyyy", - "datetime": "dd.MM.yyyy HH:mm", + "date": "DD.MM.YYYY", + "datetime": "DD.MM.YYYY HH:mm", "time": "HH:mm:ss" }, "greet": "Hallo {0}", "help": "Hilfe", - "help-button" : "Finde Hilfe im Wiki", + "help-button": "Finde Hilfe im Wiki", "imprint": "Impressum", "info": { ".": "Info" }, "invite": { ".": "Einleidung", + "actions": "Aktionen", "create": "Einladung erstellen", "expires": "Gültig bis", "link": "Link", @@ -43,10 +126,21 @@ }, "invites": { ".": "Einladungen", - "info": "Hier kannst du neue Einladungen erstellen. Um die Einladung zu bearbeiten klicke einfach auf den Link. Wenn du authoriziert bist, kannst du dort direkt den persönlichen Einladungstext bearbeiten oder eine Notiz hinzufügen. Danach kannst du denselben Link einfach an die einzuladene Person verschicken oder die Seite für eine analoge Einladung ausdrucken. Wird der Link ohne Authorizierung aufgerufen, erscheint unten auf der Seite ein Formular zur Registrierung!", + "edit": { + ".": "Edit Invite", + "save": "Save Invite" + }, + "info": "Hier kannst du neue Einladungen erstellen. Um die Einladung zu bearbeiten klicke einfach auf den Bearbeiten-Button. Wenn du authoriziert bist, kannst du den persönlichen Einladungstext auch direkt unter dem Einladungslink bearbeiten oder eine Notiz hinzufügen. Danach kannst du denselben Link einfach an die einzuladene Person verschicken. Wird der Link ohne Authorizierung aufgerufen, erscheint unten auf der Seite ein Formular zur Registrierung!", "left": "Du kannst noch {0} Einladungen erstellen.", "noQuota": "Deine Quota für Einladungen ist leider aufgebraucht.", "others": "Einladungen anderer Mitglieder", + "quota": { + "pubquiz": { + ".": "Pubquiz", + "icon": "quiz", + "text": "Einladung zum Pubquiz." + } + }, "redeemed": { "filter": { ".": "Einglöst-Filter", @@ -55,18 +149,34 @@ "true": "Eingelöst" } }, + "register": { + ".": "Einladung einlösen", + "error": { + "ALREADY_REDEEMED": "Der Einladungscode wurde bereits eingelöst.", + "EXPIRED": "Der Einladungscode ist abgelaufen!", + "INVALID_CODE": "Der Einladungscode ist ungültig!", + "NO_CODE": "Kein Einladungscode mitgegeben!" + }, + "login": "Login", + "success": { + ".": "Finished registration", + "text": "Successfully registered your Account. You can login now!" + }, + "time": "Invite valid from {0} till {1}", + "url": "Mehr Informationen" + }, "search": "Suche" }, "jitsi": { "rooms": { ".": "Jitsi Räume", - "clipboard" : { - "copied" : "Jitsi Room Url in die Zwischenablage kopiert!" + "clipboard": { + "copied": "Jitsi Room Url in die Zwischenablage kopiert!" }, "confirmDelete": "Möchtest du wirklich deinen Jitsi Raum '{0}' löschen?", "create": "Jitsi Raum erstellen", "delete": "Löschen", - "edit" : "Bearbeiten", + "edit": "Bearbeiten", "error": { "expires": "Ungültiges Ende.", "moderationStarts": "Ungültiger Beginn Moderation. Moderation muss vor Beginn liegen.", @@ -81,7 +191,7 @@ "noQuota": "Deine Quota für Jitsi Räume ist leider aufgebraucht.", "notStarted": "Die Konferenz hat noch nicht begonnen, Url in die Zwischenablage kopieren.", "room": "Name", - "save" : "Speichern", + "save": "Speichern", "starts": "Beginn" }, "share": { @@ -104,6 +214,32 @@ } } }, + "jukebox": { + ".": "Jukebox", + "addToQueue": { + ".": "Zur Warteliste hinzufügen", + "confirm": "Möchtest du '{0} - {1}' zur Warteliste hinzufügen?", + "error": "Fehler", + "success": "Erfolg" + }, + "current": "Aktueller Titel", + "forbidden": { + ".": "Keine Berechtigungen", + "hint": "Dir fehlen dir nötigen Berechtigungen die Jukebox zu verwenden." + }, + "search": { + ".": "Suche", + "icon": "search", + "more": "Mehr anzeigen", + "submit": "Abschicken" + }, + "timeout": "Bitte warte {0} Sekunden bis zu deiner nächsten Anfrage.", + "unavailable": { + ".": "Nicht verfügbar", + "hint": "Aktuell ist die Jukebox ausgestellt." + }, + "wait": "Bitte warten." + }, "locale": { "de-informal": { "long": "Deutsch", @@ -142,19 +278,53 @@ "text": "Diese Seite wurde nicht gefunden." }, "ok": "Ok", + "paginator": { + "empty": "Keine Ergebnisse", + "firstPage": "Erste Seite", + "itemsPerPage": "Einträge pro Seite:", + "lastPage": "Letzte Seite", + "nextPage": "Nächste Seite", + "previousPage": "Vorherige Seite", + "range": "Seite {0} von {1}" + }, "partey": { ".": "Partey", - "tags" : { - "." : "Partey Tags", - "none" : "Keine" - }, + "tag": { + ".": "Partey Tag", + "access-storage": { + ".": "Zugang Lagerraum", + "hint": "Zugang zum Lagerraum im Erdgeschoss." + }, + "admin": { + ".": "Administrator", + "hint": "Sende Nachrichten an Räume." + }, + "cinema-mod": { + ".": "Moderator Kinosaal", + "hint": "Im Kinosaal: Zugang zur Bühne, Festlegen der Stream-Url, Moderationsrechte im Chatraum." + }, + "disco-mod": { + ".": "Moderator Disco", + "hint": "In der Disco: Zugang zur Bühne, Festlegen des Bühnenlayouts, Moderationsrechte im Chatraum." + }, + "game-mod": { + ".": "Spielezimmer Moderator", + "hint": "Im Spielezimmer: Festlegen der Tischbezeichungen, Moderationsrechte im Chatraum." + } + }, + "tags": { + ".": "Partey Tags", + "none": "Keine" + }, "timeslots": { ".": "Partey Sendeplätze", "confirmDelete": "Möchtest du wirklich deinen Sendeplatz '{0}' um {1} löschen?", "create": { ".": "Neuen Sendplatz erstellen", "AUDIO": "Neuer Audio Sendplatz", - "VIDEO": "Neuer Video Sendplatz" + "AUDIO_STREAM": "Neuer Audio Stream Sendplatz", + "VIDEO": "Neuer Video Sendplatz", + "VIDEO_STREAM": "Neuer Video Stream Sendplatz" }, "delete": "Löschen", "description": "Beschreibung", @@ -178,7 +348,9 @@ ".": "Typ", "all": "Alle", "AUDIO": "Audio", - "VIDEO": "Video" + "AUDIO_STREAM": "Audio Stream", + "VIDEO": "Video", + "VIDEO_STREAM": "Video Stream" } }, "info": "Info", @@ -190,6 +362,10 @@ "copied": "In die Zwischenablage kopiert", "copy": "Audio Stream Secret kopieren" }, + "share": { + ".": "Freigabe", + "placeholder": "Dateiname der Freigabe" + }, "starts": "Beginn", "stream": { ".": "Stream", @@ -201,10 +377,18 @@ ".": "Typ", "AUDIO": { ".": "Audio", + "icon": "library_music" + }, + "AUDIO_STREAM": { + ".": "Audio Stream", "icon": "music_note" }, "VIDEO": { ".": "Video", + "icon": "movie" + }, + "VIDEO_STREAM": { + ".": "Video Stream", "icon": "live_tv" } } @@ -368,18 +552,30 @@ "text": "Deine Registrierung war erfolgreich. Du kannst dich nun einloggen!", "title": "Registrierung abgeschlossen" }, - "token.missing": "Du benötigst leider ein gültiges Token!" + "token": { + "locked": { + ".": "Benötigst einen Account um dieses Token einzulösen!", + "action": "Bitte logge dich ein." + }, + "missing": { + ".": "Du benötigst leider ein gültiges Token!", + "action": "Token einlösen" + } + } }, "save": "Speichern", "security": { ".": "Sicherheit", "2fa": { ".": "Zwei-Faktor-Authentifizierung (2FA)", + "code": "Code", "external": "2FA erforderlich", "info": "Du kannst hier einen zweiten Faktor zusätzlich zu deinem Passwort hinzufügen. Beachte, dass dies nur den Login in deinen we.bstly-Account betrifft. 2FA gilt nicht für deinen E-Mail Account. Aktuell wird nur TOTP (bekannt als Google Authenticator) unterstützt.", "invalid": "Ungültiger Code", + "keepSession": "2FA für dieses Gerät merken", "login": "Code prüfen", "missing": "Bitte 2FA Code angeben", + "provider": "Provider", "totp": { ".": "2FA (TOTP)", "activate": "Um TOTP als 2FA zu aktivieren, gebe bitte deinen aktuellen Code ein.", @@ -389,12 +585,20 @@ "external": "2FA (TOTP)", "hint": "Um TOTP als zweiten Faktor beim Login zu verwenden, scanne den QRCode mit deiner TOTP App.", "invalid": "TOTP Code ist ungültig", - "keepSession": "2FA (TOTP) für dieses Gerät merken", "login": "Code verfizieren", "missing": "Bitte TOTP Code eingeben", "remove": "2FA (TOTP) deaktivieren" } }, + "oidc": { + ".": "OpenID Connect Login", + "alias": "Alias auswählen", + "authorize": { + ".": "Authorisieren", + "hint": "Authorisiere die Application auf Teile deines Profile zuzugreifen um dich zu authentifizieren." + }, + "login": "Login" + }, "status": { ".": "Status", "change": "Status aktualisieren", @@ -432,11 +636,29 @@ "text": "Du kannst zusätzlich zu deinem Usernamen noch alternative Namen anlegen.", "title": "Alternative Namen" }, - "category" : { - "we-tools" : "we.bstly Tools", - "ztools" : "Tools" + "bstlboard": { + "icon": "code", + "subtitle": "Message Board und Link Aggregator", + "text": "Poste Links, diskutiere, teile oder frage die Community.", + "title": "bstlboard" + }, + "category": { + "we-tools": "we.bstly Tools", + "ztools": "Tools" + }, + "dyndns": { + "icon": "public", + "subtitle": "Dynamischer DNS Service", + "text": "Erreiche dein Heimnetzwerk von überall aus über deine we.bstly.de-Domain", + "title": "DynDns" }, "empty": "Du hast aktuell keine Berechtigungen zur Nutzung von Diensten.", + "funkwhale_access": { + "icon": "account_box", + "subtitle": "Funkwhale Account erstellen", + "text": "Erstelle Account für Funkwhale", + "title": "Funkwhale Account" + }, "gitea": { "icon": "code", "subtitle": "Git-Repositories", @@ -450,6 +672,12 @@ "text": "Hier kannst du Einladungen für die Eröffnungs-Partey erstellen.", "title": "Partey-Einladung" }, + "invite_pubquiz": { + "icon": "sports_bar", + "subtitle": "Einladungen zum Pubquiz", + "text": "Hier kannst du Einladungen für das Pubquiz erstellen.", + "title": "Pubquiz-Einladungen" + }, "jitsi": { "icon": "video_call", "subtitle": "Video Konferenzen", @@ -462,24 +690,36 @@ "text": "Catch-All an @{username}.we.bstly.de, lernender Spam-Filter und PGP Verschlüsselung.", "title": "E-Mail Postfach" }, + "mastodon": { + "icon": "rss_feed", + "subtitle": "Mikroblogging Dienst im Fediverse", + "text": "Mastodon ist eine dezentrale und datenschutzfreundliche Twitter-Alternative angesiedelt im Fediverse.", + "title": "Mastodon" + }, "matrix": { "icon": "question_answer", "subtitle": "Messenger Plattform", "text": "mit anderen Austauschen, sich Informieren oder einfach quatschen.", "title": "Matrix" }, - "minetest" : { + "minetest": { "icon": "widgets", "subtitle": "Open-Source Minecraft Klon", "text": "Minetest mit Mineclone2 Game ist ein open-source Minecraft-artiges Spiel.", "title": "Minetest" }, - "minetest_accounts" : { + "minetest_accounts": { "icon": "account_box", "subtitle": "Minetest Account erstellen", "text": "Erstelle Account(s) für Minetest", "title": "Minetest Accounts" }, + "mobilizon": { + "icon": "event", + "subtitle": "Dezentraler Veranstaltungsmanager", + "text": "Mobilizon ist ein Werkzeug zur Erstellung und Organisation von Veranstaltungen.", + "title": "Mobilizon" + }, "monitoring": { "icon": "check", "subtitle": "System Status", @@ -588,14 +828,20 @@ "token": "Token", "tokens": { ".": "Tokens", - "active" : "Aktuelle Tokens", + "active": "Aktuelle Tokens", "enter": "Token einlösen", "get": "Mitgliedschaft", "invalid": "Das Token ist leider nicht gültig.", + "login": "Du hast schon einen Account? Dann logge dich ein um das Token für deinem Account einzulösen.", + "loginRequired": "Für dieses Token ist ein Account erforderlich. Bitte logge dich ein um das Token für deinem Account einzulösen.", "provide-valid": "Bitte gebe ein gültiges Token ein.", "redeem": "Tokens einlösen", "redeemed": "Das Token wurde bereits eingelöst.", - "validate": "Prüfen" + "register": "Du bist neu hier? Dann registriere jetzt deinen Account um das Token einzulösen.", + "validate": { + ".": "Token prüfen", + "other": "Neues Token prüfen" + } }, "urlshortener": { ".": "Urlshortener", @@ -604,7 +850,7 @@ "confirmDelete": "Möchtest du wirklich deinen verkürzten Link für '{0}' löschen?", "create": "Verkürzten Link erstellen", "delete": "Löschen", - "edit" : "Bearbeiten", + "edit": "Bearbeiten", "error": { "code": "Kürzel wird bereits verwendet", "expires": "Das Ablaufdatum muss in der Zukunft liegen", @@ -614,7 +860,7 @@ "info": "Du kannst hier verkürzte Links erstellen. Die Anzahl wird über eine Quota begrenzt.", "left": "Du kannst noch {0} verkürtze/n Link/s erstellen.", "link": "Link", - "newPassword" : "Neues Passwort", + "newPassword": "Neues Passwort", "noQuota": "Deine Quota für verkürzte Links ist leider aufgebraucht.", "note": "Notiz", "password": { @@ -622,11 +868,11 @@ "invalid": "Das angebene Passwort ist ungültig.", "submit": "Abschicken" }, - "queryParameters" : { - "." : "Query Parameter weiterreichen", - "info" : "Query Parameter werden an die Ziel Url weitergereicht" + "queryParameters": { + ".": "Query Parameter weiterreichen", + "info": "Query Parameter werden an die Ziel Url weitergereicht" }, - "save" : "Speichern", + "save": "Speichern", "search": "Suche", "share": { ".": "Teilen", @@ -671,6 +917,18 @@ }, "validated": "Validiert" }, + "dyndns": { + ".": "DynDns", + "create": "Erstelle DynDns Token", + "new": "Erstelle neues DynDns Token", + "token": { + ".": "DynDns Token", + "copied": "In die Zwischenablage kopiert", + "copy": "Token in die Zwischenablage kopieren", + "exists": "Du hast aktuell ein aktives DynDns Token. Wenn du ein neues Token generierst, wird das aktuelle Token gelöscht.", + "store": "Bitte speichere das Token sicher ab. Nach Verlassen der Seite wird es nicht mehr angezeigt." + } + }, "unavailable": { ".": "Zugriff verweigert", "text": "Dieser Benutzer existiert nicht oder du hast keine Berechtigungen, um auf das Profil zuzugreifen." @@ -703,9 +961,15 @@ }, "vouchers": { ".": "Gutscheincodes", - "add-on": "Add-On", - "info": "Hier kannst du Gutscheincodes für Add-Ons und Registrierung generieren.", - "registration": "Registrierung", + "addon": { + ".": "Add-On", + "text": "Dieser Gutscheincode ist für verschiedene Erweiterungen für deinen Account." + }, + "info": "Hier kannst du verschiedene Gutscheincodes generieren.", + "registration": { + ".": "Registrierung", + "text": "Dieser Gutscheincode ist für die Registrierung eines neuen Accounts." + }, "stored-safely": { ".": "Da wir keine Verbindungen von Gutscheincodes zu deinem Account speichern, speichere diesen Code bitte selber sicher ab. Falls du die Seite verlässt oder neu lädst ist der Code nicht mehr verfügbar!", "confirm": "Ich habe den Code sicher abgespeichert!" diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 627f9f6..6bc4483 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -5,10 +5,92 @@ ".": "Advanced" } }, + "borrow": { + ".": "Borrow", + "items": { + ".": "Borrow Items", + "actions": "Actions", + "autoAccept": "Accept automatically", + "availability": { + ".": "Availability", + "ALWAYS": "Always", + "MANUAL": "Manual", + "PERIOD": "Period" + }, + "create": "Create new item", + "confirmDelete": "Are you sure you want to delete item '{0}'?", + "delete": "Delete Item", + "description": "Description", + "edit": "Edit Item", + "email": "Email", + "emailNotification": "Email Notifications", + "error": { + "availability": "Please select a availability.", + "description": "Please provide a valid description.", + "email": "Please provide a valid email adress.", + "name": "Please provide a name.", + "maxDuration": "Max. Duration must be greater than min. Duration.", + "minDuration": "Min. Duration must be lower than max. Duration.", + "slot": { + "end": "End must be after start.", + "endDay": "End day must be equal or after start day.", + "endTime": "End time must be after start time.", + "start": "Start must be before end.", + "startDay": "Start day must be equal or before end day.", + "startTime": "Start time must be before end time." + }, + "url": "Please provide a valid url." + }, + "maxDuration": "Max. Duration", + "minDuration": "Min. Duration", + "mine": "Mine", + "name": "Name", + "save": "Save Item", + "search": "Search", + "slot": { + ".": "Slot", + "addManual": "Add manual slot", + "addPeriod": "Add period slot", + "day": { + ".": "Day", + "MONDAY": "Monday", + "TUESDAY": "Tuesday", + "WEDNESDAY": "Wednesday", + "THURSDAY": "Thursday", + "FRIDAY": "Friday", + "SATURDAY": "Saturday", + "SUNDAY": "Sunday" + }, + "delete": "Remove slot", + "end": "End date", + "endDay": "End day", + "endTime": "End time", + "MANUAL": "Manual slots", + "PERIOD": "Period slots", + "start": "Start date", + "startDay": "Start day", + "startTime": "Start time" + }, + "url": "Url" + }, + "proving": { + ".": "Proving", + "camera": "Camera", + "flash": "Flash" + }, + "requests": { + ".": "Requests" + } + }, "cancel": "Cancel", "close": "Close", "confirm": "Confirm", - "delete" : "Delete", + "delete": "Delete", + "durationpicker": { + "days": "Days", + "hours": "Hours", + "minutes": "Minutes" + }, "email": { ".": "Email address", "invalid": "invalid email address", @@ -18,19 +100,20 @@ } }, "format": { - "date": "MM/dd/yyy", - "datetime": "MM/dd/yyy h:mm a", + "date": "MM/DD/YYYY", + "datetime": "MM/DD/YYYY h:mm a", "time": "h:mm:ss a" }, "greet": "Hello {0}", "help": "Help", - "help-button" : "Find help in Wiki", + "help-button": "Find help in Wiki", "imprint": "Imprint", "info": { ".": "Info" }, "invite": { ".": "Invite", + "actions": "Actions", "create": "Create Invite", "expires": "Expires", "link": "Link", @@ -43,10 +126,21 @@ }, "invites": { ".": "Invites", - "info": "You can create new invites here. To edit an invite like adding a note or change the personal invite message just click on the invite link. If you are authorized, you can change the texts directly on the invite page. Afterwards just send the same link to the person to invite or print out for an analog invite. If not authorized, a registration formular will be shown on bottom of page.", + "edit": { + ".": "Edit Invite", + "save": "Save Invite" + }, + "info": "You can create new invites here. To edit an invite like adding a note or change the personal invite message just click on the edit button. If you are authorized, you can also change the texts directly on the invite page. Afterwards just send the same link to the person to invite. If not authorized, a registration formular will be shown on bottom of page.", "left": "You have {0} invites left.", "noQuota": "Your quota for invites is depleted.", "others": "Other's invites", + "quota": { + "pubquiz": { + ".": "Pubquiz", + "icon": "quiz", + "text": "Invite to Pubquiz." + } + }, "redeemed": { "filter": { ".": "Filter redeemed status", @@ -55,18 +149,34 @@ "true": "Redeemed" } }, + "register": { + ".": "Redeem Invite", + "error": { + "ALREADY_REDEEMED": "The provided code is already redeemed!", + "EXPIRED": "The provided code is expired!", + "INVALID_CODE": "The provided code is invalid.", + "NO_CODE": "No code provided!" + }, + "login": "Login", + "success": { + ".": "Finished registration", + "text": "Successfully registered your Account. You can login now!" + }, + "time": "Invite valid from {0} till {1}", + "url": "More information" + }, "search": "Search" }, "jitsi": { "rooms": { ".": "Jitsi Rooms", - "clipboard" : { - "copied" : "Jitsi Room url copied to clipboard!" + "clipboard": { + "copied": "Jitsi Room url copied to clipboard!" }, "confirmDelete": "Are you sure you want to delete your Jitsi Room '{0}'?", "create": "Create Jitsi Room", "delete": "Delete", - "edit" : "Edit", + "edit": "Edit", "error": { "expires": "Invalid expiry.", "moderationStarts": "Invalid moderation starts. Moderation have to start before conference starts", @@ -81,7 +191,7 @@ "noQuota": "Your quota for Jitsi Rooms is depleted.", "notStarted": "The conference has not started yet, copy url to clipboard.", "room": "Name", - "save" : "Save", + "save": "Save", "starts": "Starts" }, "share": { @@ -104,6 +214,32 @@ } } }, + "jukebox": { + ".": "Jukebox", + "addToQueue": { + ".": "Add to queue", + "confirm": "Add '{0} - {1}' to queue?", + "error": "Error", + "success": "Sucess" + }, + "current": "Current track", + "forbidden": { + ".": "Forbidden", + "hint": "You are not allowed to use the Jukebox." + }, + "search": { + ".": "Search", + "icon": "search", + "more": "Show more", + "submit": "Submit" + }, + "timeout": "Please wait {0} seconds before next request.", + "unavailable": { + ".": "unavailable", + "hint": "Currently the Jukebox is turned off." + }, + "wait": "Please wait." + }, "locale": { "de-informal": { "long": "Deutsch", @@ -142,19 +278,53 @@ "text": "This page was not found." }, "ok": "Ok", + "paginator": { + "empty": "No results", + "firstPage": "first page", + "itemsPerPage": "items per page:", + "lastPage": "last page", + "nextPage": "next page", + "previousPage": "previous page", + "range": "page {0} of {1}" + }, "partey": { ".": "Partey", - "tags" : { - "." : "Partey Tags", - "none" : "None" - }, + "tag": { + ".": "Partey Tag", + "access-storage": { + ".": "Access Storage", + "hint": "Access to storage room in ground floor." + }, + "admin": { + ".": "Administrator", + "hint": "Send room messages." + }, + "cinema-mod": { + ".": "Cinema Moderator", + "hint": "In cinema: Enter stage, set stream url, moderate chat room." + }, + "disco-mod": { + ".": "Disco Moderator", + "hint": "In cinema: Enter stage, change stage layer, moderate chat room." + }, + "game-mod": { + ".": "Game Moderator", + "hint": "In game room: Set table label, moderate chat room." + } + }, + "tags": { + ".": "Partey Tags", + "none": "None" + }, "timeslots": { ".": "Partey Timeslots", "confirmDelete": "Are you sure you want to delete your Timeslot '{0}' from {1}?", "create": { ".": "Create new Timeslot", "AUDIO": "New Audio Timeslot", - "VIDEO": "New Video Timeslot" + "AUDIO_STREAM": "New Audio Stream Timeslot", + "VIDEO": "New Video Timeslot", + "VIDEO_STREAM": "New Video Stream Timeslot" }, "delete": "Delete", "description": "Description", @@ -178,7 +348,9 @@ ".": "Type", "all": "All", "AUDIO": "Audio", - "VIDEO": "Video" + "AUDIO_STREAM": "Audio Stream", + "VIDEO": "Video", + "VIDEO_STREAM": "Video Stream" } }, "info": "You can create new timeslots for Partey here. The number is limited due to a quota.", @@ -190,6 +362,10 @@ "copied": "Copied to clipboard", "copy": "Copy Audio Stream Secret" }, + "share": { + ".": "Share", + "placeholder": "Filename of share" + }, "starts": "Starts", "stream": { ".": "Stream", @@ -201,10 +377,18 @@ ".": "Type", "AUDIO": { ".": "Audio", + "icon": "library_music" + }, + "AUDIO_STREAM": { + ".": "Audio Stream", "icon": "music_note" }, "VIDEO": { ".": "Video", + "icon": "movie" + }, + "VIDEO_STREAM": { + ".": "Video Stream", "icon": "live_tv" } } @@ -279,6 +463,9 @@ "DATE": { ".": "Invalid date" }, + "DATETIME": { + ".": "Invalid date or time" + }, "EMAIL": { ".": "Invalid email address" }, @@ -317,6 +504,9 @@ "DATE": { ".": "Date" }, + "DATETIME": { + ".": "Date with time" + }, "EMAIL": { ".": "Email" }, @@ -356,18 +546,30 @@ "text": "Successfully registered your Account. You can login now!", "title": "Finished registration" }, - "token.missing": "You need a valid token!" + "token": { + "locked": { + ".": "You need an account to redeem this token!", + "action": "Please login." + }, + "missing": { + ".": "You need a valid token!", + "action": "Provide token" + } + } }, "save": "Save", "security": { ".": "Security", "2fa": { ".": "Two-Factor-Authentication (2FA)", + "code": "Code", "external": "2FA required", "info": "You can additionally add a second factor to your password. Please keep in mind, that this only affects your we.bstly-Account and not your email login. Currently only TOTP (also known as Google Authenticator) is supported as 2FA method.", "invalid": "Invalid code", + "keepSession": "Remember 2FA for this device", "login": "Verify code", "missing": "Please enter 2FA code", + "provider": "Provider", "totp": { ".": "2FA (TOTP)", "activate": "Please enter your current code to enable TOTP as your 2FA.", @@ -375,10 +577,18 @@ "create": "2FA (TOTP) create", "enable": "Enable 2FA (TOTP)", "hint": "To use TOP as second factor, please scan the shown QR-Code with your TOTP App.", - "keepSession": "Remember 2FA (TOTP) for this device", "remove": "Disable 2FA (TOTP)" } }, + "oidc": { + ".": "OpenID Connect Login", + "alias": "Choose alias", + "authorize": { + ".": "Authorize", + "hint": "Authorize this application to access parts of your profile for authentication." + }, + "login": "Login" + }, "status": { ".": "Status", "change": "Change status", @@ -416,11 +626,29 @@ "text": "You can add additional aliases besides your username.", "title": "Aliases" }, - "category" : { - "we-tools" : "we.bstly tools", - "ztools" : "Tools" + "bstlboard": { + "icon": "code", + "subtitle": "message board and link aggregator", + "text": "Post links, discuss, share or ask the community.", + "title": "bstlboard" + }, + "category": { + "we-tools": "we.bstly tools", + "ztools": "Tools" + }, + "dyndns": { + "icon": "public", + "subtitle": "Dynamic DNS Service", + "text": "Reach your home-network from everywhere with your we.bstly.de-domain", + "title": "DynDns" }, "empty": "You have insufficient permissions to use any services.", + "funkwhale_access": { + "icon": "account_box", + "subtitle": "Funkwhale account creation", + "text": "Create Account for Funkwhale", + "title": "Funkwhale Account" + }, "gitea": { "icon": "code", "subtitle": "Git-Repositories", @@ -434,6 +662,12 @@ "text": "Create Invites for Opening Partey.", "title": "Partey-Invites" }, + "invite_pubquiz": { + "icon": "sports_bar", + "subtitle": "Invite to Pubquiz", + "text": "Create Invites for Pubquiz.", + "title": "Pubquiz-Invites" + }, "jitsi": { "icon": "video_call", "subtitle": "Video conferencing", @@ -446,24 +680,36 @@ "text": "Catch-All to @{username}.we.bstly.de, learning spam-filter and PGP encryption.", "title": "Email Account" }, + "mastodon": { + "icon": "rss_feed", + "subtitle": "federated microblogging service", + "text": "Mastodon is a Twitter-like plattform, but as part of the fediverse a privacy, decentralized alternative.", + "title": "Mastodon" + }, "matrix": { "icon": "question_answer", "subtitle": "Messenger", "text": "talk, exchange, discuss with others", "title": "Matrix" }, - "minetest" : { + "minetest": { "icon": "widgets", "subtitle": "Open-Source Minecraft Clone", "text": "Minetest with Mineclone2 game is an open-source Minecraft-like game.", "title": "Minetest" }, - "minetest_accounts" : { + "minetest_accounts": { "icon": "account_box", "subtitle": "Minetest Account creation", "text": "Create Account(s) for Minetest", "title": "Minetest Accounts" }, + "mobilizon": { + "icon": "event", + "subtitle": "federated event manager", + "text": "Mobilizon is a tool that for creating and organizing events.", + "title": "Mobilizon" + }, "monitoring": { "icon": "check", "subtitle": "System Status", @@ -572,14 +818,20 @@ "token": "Token", "tokens": { ".": "Token", - "active" : "Current Tokens", + "active": "Current Tokens", "enter": "Enter token", "get": "Membership", "invalid": "The provided token is invalid.", + "login": "You already have an account? Please login to redeem token with your account.", + "loginRequired": "You need an Account for this token. Please login to redeem token with your account.", "provide-valid": "Please provide a valid token.", "redeem": "Redeem token", "redeemed": "The provided token has already been redeemed.", - "validate": "Validate" + "register": "New here and need an account? Register a new account to redeem token.", + "validate": { + ".": "Validate token", + "other": "Valiate new token" + } }, "urlshortener": { ".": "Urlshortener", @@ -588,7 +840,7 @@ "confirmDelete": "Are you sure you want to delete your shortened link for '{0}'?", "create": "Create shortened link", "delete": "Delete", - "edit" : "Edit", + "edit": "Edit", "error": { "code": "Code already in use", "expires": "Expires must be set in future", @@ -598,7 +850,7 @@ "info": "You can create new shortened links here. The number is limited due to a quota.", "left": "You have {0} shortened link(s) left.", "link": "Link", - "newPassword" : "New Password", + "newPassword": "New Password", "noQuota": "Your quota for shortened links is depleted.", "note": "Note", "password": { @@ -606,11 +858,11 @@ "invalid": "The given password is invalid.", "submit": "Submit" }, - "queryParameters" : { - "." : "Pass query parameters", - "info" : "Pass query parameters to target url" + "queryParameters": { + ".": "Pass query parameters", + "info": "Pass query parameters to target url" }, - "save" : "Save", + "save": "Save", "share": { ".": "Share", "clipboard": { @@ -654,6 +906,18 @@ }, "validated": "Validated" }, + "dyndns": { + ".": "DynDns", + "create": "Create DynDns Token", + "new": "Create new DynDns Token", + "token": { + ".": "DynDns Token", + "copied": "Copied to clipboard", + "copy": "Copy Token to clipboard", + "exists": "You currently have an active Token. If you create a new token, the old one will be deleted.", + "store": "Please store this token carefully. It will not be available after leaving this site." + } + }, "unavailable": { ".": "Access denied", "text": "The provided user does not exists or you have insufficient privileges to access profile." @@ -686,9 +950,15 @@ }, "vouchers": { ".": "Vouchers", - "add-on": "Add-On", - "info": "Generate vouchers for Add-Ons and registration.", - "registration": "Registration", + "addon": { + ".": "Add-On", + "text": "This voucher is for different extension of your account." + }, + "info": "Generate different vouchers.", + "registration": { + ".": "Registration", + "text": "This voucher is for a registration of a new account." + }, "stored-safely": { ".": "Please store the provided voucher code securely, since we do not store any relation of vouchers to your account. If you leave page or reload the code won't be shown up again!", "confirm": "I securely stored the given voucher!"