diff --git a/src/i18n/lang/de.json b/src/i18n/lang/de.json deleted file mode 100644 index df9dd1d1c..000000000 --- a/src/i18n/lang/de.json +++ /dev/null @@ -1,309 +0,0 @@ -{ - "404": { - "title": "Nicht gefunden", - "text": "Die angeforderte Seite existiert nicht." - }, - "filters": { - "create": { - "action": "Neuen gespeicherten Filter erstellen", - "description": "Ein gespeicherter Filter ist eine virtuelle Liste, die bei jedem Zugriff aus einem Satz von Filtern errechnet wird. Einmal erstellt, erscheint er in einem speziellen Namensraum.", - "title": "Einen gespeicherten Filter erstellen" - }, - "attributes": { - "descriptionPlaceholder": "Die Beschreibung steht hier …", - "description": "Beschreibung", - "titlePlaceholder": "Der gespeicherte Filtertitel steht hier …", - "title": "Titel" - }, - "delete": { - "header": "Diesen gespeicherten Filter löschen", - "success": "Der Filter wurde erfolgreich gelöscht." - }, - "edit": { - "success": "Der Filter wurde erfolgreich gespeichert.", - "title": "Diesen gespeicherten Filter bearbeiten" - }, - "title": "Filter" - }, - "sharing": { - "authenticating": "Authentifizierung …", - "invalidPassword": "Das Passwort ist ungültig.", - "error": "Es ist ein Fehler aufgetreten." - }, - "label": { - "attributes": { - "color": "Farbe", - "description": "Beschreibung", - "title": "Titel" - } - }, - "misc": { - "search": "Suchen", - "copy": "In Zwischenablage kopieren", - "disable": "Deaktivieren", - "confirm": "Bestätigen", - "delete": "Löschen", - "save": "Speichern", - "loading": "Wird geladen …", - "previous": "Vorherige", - "next": "Weiter" - }, - "task": { - "delete": "Diese Aufgabe löschen", - "new": "Eine neue Aufgabe erstellen", - "task": "Aufgabe", - "show": { - "titleCurrent": "Aktuelle Aufgaben", - "noTasks": "Nichts zu tun – Einen schönen Tag noch!", - "today": "Heute", - "nextWeek": "Nächste Woche" - }, - "detail": { - "created": "Erstellt {0} von {1}", - "undone": "Als unerledigt markieren", - "done": "Fertig!", - "move": "Aufgabe in eine andere Liste verschieben", - "delete": { - "header": "Diese Aufgabe löschen" - }, - "deleteSuccess": "Die Aufgabe wurde erfolgreich gelöscht.", - "updateSuccess": "Die Aufgabe wurde erfolgreich gespeichert.", - "doneAt": "Erledigt {0}", - "updated": "Aktualisiert {0}", - "actions": { - "priority": "Priorität einstellen", - "reminders": "Erinnerungen einstellen", - "relatedTasks": "Aufgabenbeziehungen hinzufügen", - "attachments": "Anhänge hinzufügen", - "delete": "Aufgabe löschen", - "color": "Taskfarbe einstellen", - "moveList": "Aufgabe verschieben" - } - }, - "attributes": { - "color": "Farbe", - "done": "Fertig", - "createdBy": "Erstellt von", - "created": "Erstellt", - "endDate": "Enddatum", - "dueDate": "Fälligkeitsdatum", - "title": "Titel", - "startDate": "Anfangsdatum", - "relatedTasks": "Verwandte Aufgaben", - "priority": "Priorität", - "percentDone": "% erledigt", - "repeat": "Wiederholen", - "reminders": "Erinnerungen", - "updated": "Aktualisiert" - } - }, - "team": { - "edit": { - "delete": { - "header": "Team löschen", - "success": "Das Team wurde erfolgreich gelöscht." - }, - "madeAdmin": "Das Teammitglied wurde erfolgreich zum Admin gemacht.", - "madeMember": "Das Teammitglied wurde erfolgreich zum Mitglied gemacht.", - "userAddedSuccess": "Das Teammitglied wurde erfolgreich hinzugefügt.", - "success": "Das Team wurde erfolgreich aktualisiert.", - "addUser": "Zum Team hinzufügen", - "members": "Teammitglieder", - "title": "Team „{team}“ bearbeiten", - "deleteUser": { - "header": "Benutzer aus dem Team entfernen" - } - }, - "create": { - "success": "Das Team wurde erfolgreich erstellt.", - "title": "Ein neues Team erstellen" - }, - "title": "Teams", - "attributes": { - "description": "Beschreibung", - "descriptionPlaceholder": "Die Beschreibung des Teams steht hier …", - "member": "Mitglied", - "admin": "Admin", - "name": "Teamname", - "namePlaceholder": "Der Name des Teams steht hier …" - } - }, - "namespace": { - "create": { - "explanation": "Ein Namensraum ist eine Sammlung von Listen, die man teilen und verwenden kann, um seine Listen zu organisieren. Tatsächlich gehört jede Liste zu einem Namensraum.", - "success": "Der Namensraum wurde erfolgreich angelegt.", - "tooltip": "Was ist ein Namensraum?", - "title": "Einen neuen Namensraum erstellen" - }, - "attributes": { - "isArchived": "Dieser Namensraum wird archiviert", - "archived": "Ist archiviert", - "color": "Farbe", - "descriptionPlaceholder": "Die Beschreibung des Namensraums steht hier …", - "description": "Beschreibung", - "titlePlaceholder": "Der Titel des Namensraums steht hier …", - "title": "Namensraumtitel" - }, - "share": { - "title": "„{namespace}“ teilen" - }, - "edit": { - "success": "Der Namensraum wurde erfolgreich aktualisiert.", - "title": "„{namespace}“ bearbeiten" - }, - "delete": { - "success": "Der Namensraum wurde erfolgreich gelöscht.", - "text2": "Dies umfasst alle Listen und Aufgaben und kann NICHT rückgängig gemacht werden!", - "title": "„{namespace}“ löschen" - }, - "archive": { - "description": "Wenn ein Namensraum archiviert ist, kann man keine neuen Listen erstellen oder ihn bearbeiten.", - "success": "Der Namensraum wurde erfolgreich archiviert.", - "titleUnarchive": "Archivierung von „{namespace}“ aufheben", - "titleArchive": "„{namespace}“ archivieren" - }, - "noLists": "Dieser Namensraum enthält keine Listen.", - "title": "Namensräume & Listen", - "unarchive": "Archivierung aufheben", - "archived": "Archiviert", - "showArchived": "Archivierte anzeigen" - }, - "list": { - "kanban": { - "bucketTitleSavedSuccess": "Der Eimertitel wurde erfolgreich gespeichert.", - "deleteBucketSuccess": "Der Eimer wurde erfolgreich gelöscht.", - "deleteBucketText2": "Dies löscht keine Aufgaben, sondern verschiebt sie in den Standard-Eimer.", - "deleteHeaderBucket": "Den Eimer löschen", - "addBucket": "Einen neuen Eimer erstellen", - "addAnotherTask": "Weitere Aufgabe hinzufügen", - "addTask": "Eine Aufgabe hinzufügen", - "doneBucket": "Erledigte-Dinge-Eimer", - "noLimit": "Nicht eingestellt" - }, - "table": { - "columns": "Spalten", - "title": "Tabelle" - }, - "gantt": { - "to": "An", - "from": "Von", - "day": "Tag", - "month": "Monat", - "default": "Standard", - "size": "Größe", - "showTasksWithoutDates": "Aufgaben anzeigen, für die keine Termine festgelegt sind", - "title": "Gantt" - }, - "list": { - "empty": "Diese Liste ist derzeit leer.", - "addPlaceholder": "Eine neue Aufgabe hinzufügen …", - "add": "Hinzufügen", - "title": "Liste" - }, - "share": { - "title": "„{Liste}“ teilen", - "header": "Diese Liste teilen" - }, - "edit": { - "success": "Die Liste wurde erfolgreich aktualisiert.", - "color": "Farbe", - "descriptionPlaceholder": "Die Listenbeschreibung geht hier …", - "description": "Beschreibung", - "identifierPlaceholder": "Der Listenbezeichner geht hier …", - "identifier": "Listebezeichner", - "identifierTooltip": "Der Listenbezeichner kann zur eindeutigen Identifizierung einer Aufgabe über Listen hinweg verwendet werden. Man kann ihn auf leer setzen, um ihn zu deaktivieren.", - "titlePlaceholder": "Der Titel der Liste steht hier …", - "title": "„{list}“ bearbeiten", - "header": "Diese Liste bearbeiten" - }, - "duplicate": { - "success": "Die Liste wurde erfolgreich dupliziert.", - "label": "Duplizieren", - "title": "Diese Liste duplizieren" - }, - "delete": { - "success": "Die Liste wurde erfolgreich gelöscht.", - "text2": "Dies umfasst alle Aufgaben und kann NICHT rückgängig gemacht werden!", - "header": "Diese Liste löschen", - "title": "„{list}“ löschen" - }, - "background": { - "removeSuccess": "Der Hintergrund ist erfolgreich entfernt worden!", - "success": "Der Hintergrund ist erfolgreich eingestellt worden!", - "loadMore": "Mehr Fotos laden", - "poweredByUnsplash": "Angetrieben von Unsplash", - "searchPlaceholder": "Nach einem Hintergrund suchen …", - "remove": "Hintergrund entfernen", - "title": "Listenhintergrund festlegen" - }, - "archive": { - "success": "Die Liste wurde erfolgreich archiviert.", - "unarchive": "Archivierung dieser Liste aufheben", - "archive": "Diese Liste archivieren", - "title": "„{Liste}“ archivieren" - }, - "create": { - "createdSuccess": "Die Liste wurde erfolgreich erstellt.", - "titlePlaceholder": "Der Titel der Liste steht hier …", - "header": "Eine neue Liste erstellen" - }, - "color": "Farbe" - }, - "user": { - "settings": { - "caldav": { - "title": "Caldav" - }, - "totp": { - "disableSuccess": "Die Zwei-Faktor-Authentifizierung wurde erfolgreich deaktiviert.", - "passcode": "Passcode", - "enroll": "Einschreiben", - "title": "Zwei-Faktor-Authentifizierung" - }, - "general": { - "weekStartMonday": "Montag", - "weekStartSunday": "Sonntag", - "weekStart": "Woche beginnt am", - "playSoundWhenDone": "Einen Ton abspielen, wenn Aufgaben als erledigt markiert werden", - "discoverableByEmail": "Andere Benutzer mich finden lassen, wenn sie nach meiner vollständigen E-Mail suchen", - "discoverableByName": "Andere Benutzer mich finden lassen, wenn sie nach meinem Namen suchen", - "overdueReminders": "Mir jeden Morgen Erinnerungen für überfällige unerledigte Aufgaben per E-Mail senden", - "emailReminders": "Mir Erinnerungen für Aufgaben per E-Mail senden", - "savedSuccess": "Die Einstellungen wurden erfolgreich aktualisiert.", - "newName": "Der neue Name", - "name": "Name", - "title": "Allgemeine Einstellungen" - }, - "updateEmailNew": "Neue E-Mail-Adresse", - "passwordUpdateSuccess": "Das Passwort wurde erfolgreich aktualisiert.", - "passwordsDontMatch": "Das neue Passwort und seine Bestätigung stimmen nicht überein.", - "currentPassword": "Aktuelles Passwort", - "newPasswordConfirm": "Neue Passwortbestätigung", - "newPassword": "Neues Passwort", - "title": "Einstellungen" - }, - "auth": { - "openIdStateError": "Zustand stimmt nicht überein, weigert sich fortzufahren!", - "authenticating": "Authentifizierung …", - "loginWith": "Mit {provider} anmelden", - "register": "Registrieren", - "login": "Anmelden", - "totpPlaceholder": "z.B. 123456", - "totpTitle": "Zwei-Faktor-Authentifizierungscode", - "passwordsDontMatch": "Passwörter stimmen nicht überein", - "passwordPlaceholder": "z.B. •••••••••••", - "password": "Passwort", - "emailPlaceholder": "z.B. frederic@vikunja.io", - "email": "E-Mail-Adresse", - "usernamePlaceholder": "z.B. frederick", - "usernameEmail": "Benutzername oder E-Mail-Adresse", - "username": "Benutzername" - } - }, - "home": { - "list": { - "new": "Eine neue Liste erstellen" - }, - "welcome": "Hallo {username}" - } -} diff --git a/src/i18n/lang/es.json b/src/i18n/lang/es.json deleted file mode 100644 index 9e26dfeeb..000000000 --- a/src/i18n/lang/es.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/i18n/lang/fr.json b/src/i18n/lang/fr.json deleted file mode 100644 index 9e26dfeeb..000000000 --- a/src/i18n/lang/fr.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/i18n/lang/ro.json b/src/i18n/lang/ro.json deleted file mode 100644 index 9e26dfeeb..000000000 --- a/src/i18n/lang/ro.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/i18n/lang/ru.json b/src/i18n/lang/ru.json deleted file mode 100644 index 9e26dfeeb..000000000 --- a/src/i18n/lang/ru.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/i18n/setup.js b/src/i18n/setup.js index 7e7efab14..44a09333c 100644 --- a/src/i18n/setup.js +++ b/src/i18n/setup.js @@ -14,7 +14,10 @@ export const i18n = new VueI18n({ export const availableLanguages = { en: 'English', - de: 'Deutsch', + 'de-DE': 'Deutsch', + 'de-swiss': 'Schwizertütsch', + 'ru-RU': 'Русский', + 'fr-FR': 'Français', } const loadedLanguages = ['en'] // our default language that is preloaded @@ -48,18 +51,16 @@ export const loadLanguageAsync = lang => { export const getCurrentLanguage = () => { const savedLanguage = localStorage.getItem('language') - if(savedLanguage !== null) { + if (savedLanguage !== null) { return savedLanguage } let browserLanguage = navigator.language || navigator.userLanguage - if (browserLanguage.startsWith('en-')) { - browserLanguage = 'en' - } - - if (typeof availableLanguages[browserLanguage] !== 'undefined') { - return browserLanguage + for (let k in availableLanguages) { + if (browserLanguage[k] === browserLanguage || k.startsWith(browserLanguage + '-')) { + return k + } } return 'en' diff --git a/src/views/user/Settings.vue b/src/views/user/Settings.vue index 58c8ca636..7c8e30755 100644 --- a/src/views/user/Settings.vue +++ b/src/views/user/Settings.vue @@ -71,8 +71,8 @@ {{ $t('user.settings.general.language') }}
- +
@@ -288,7 +288,7 @@ import TotpService from '../../services/totp' import UserSettingsService from '../../services/userSettings' import UserSettingsModel from '../../models/userSettings' import {playSoundWhenDoneKey} from '@/helpers/playPop' -import {availableLanguages, saveLanguage, getCurrentLanguage} from '@/i18n/setup' +import {availableLanguages, saveLanguage, getCurrentLanguage} from '../../i18n/setup' import {mapState} from 'vuex' @@ -367,7 +367,9 @@ export default { return `${apiBase}/dav/principals/${this.userInfo.username}/` }, availableLanguages() { - return availableLanguages + return Object.entries(availableLanguages) + .map(l => ({code: l[0], title: l[1]})) + .sort((a, b) => a.title > b.title) }, ...mapState({ totpEnabled: state => state.config.totpEnabled,