Add proofread languages to available languages

This commit is contained in:
kolaente 2021-09-05 13:31:53 +02:00
parent 7a4e568898
commit e0c9332634
No known key found for this signature in database
GPG key ID: F40E70337AB24C9B
7 changed files with 15 additions and 325 deletions

View file

@ -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}"
}
}

View file

@ -1 +0,0 @@
{}

View file

@ -1 +0,0 @@
{}

View file

@ -1 +0,0 @@
{}

View file

@ -1 +0,0 @@
{}

View file

@ -14,7 +14,10 @@ export const i18n = new VueI18n({
export const availableLanguages = { export const availableLanguages = {
en: 'English', 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 const loadedLanguages = ['en'] // our default language that is preloaded
@ -48,18 +51,16 @@ export const loadLanguageAsync = lang => {
export const getCurrentLanguage = () => { export const getCurrentLanguage = () => {
const savedLanguage = localStorage.getItem('language') const savedLanguage = localStorage.getItem('language')
if(savedLanguage !== null) { if (savedLanguage !== null) {
return savedLanguage return savedLanguage
} }
let browserLanguage = navigator.language || navigator.userLanguage let browserLanguage = navigator.language || navigator.userLanguage
if (browserLanguage.startsWith('en-')) { for (let k in availableLanguages) {
browserLanguage = 'en' if (browserLanguage[k] === browserLanguage || k.startsWith(browserLanguage + '-')) {
return k
} }
if (typeof availableLanguages[browserLanguage] !== 'undefined') {
return browserLanguage
} }
return 'en' return 'en'

View file

@ -71,8 +71,8 @@
{{ $t('user.settings.general.language') }} {{ $t('user.settings.general.language') }}
</span> </span>
<div class="select ml-2"> <div class="select ml-2">
<select v-model.number="language"> <select v-model="language">
<option :value="l" v-for="(lang, l) in availableLanguages" :key="l">{{ lang }}</option> <option :value="lang.code" v-for="lang in availableLanguages" :key="lang.code">{{ lang.title }}</option>
</select> </select>
</div> </div>
</label> </label>
@ -288,7 +288,7 @@ import TotpService from '../../services/totp'
import UserSettingsService from '../../services/userSettings' import UserSettingsService from '../../services/userSettings'
import UserSettingsModel from '../../models/userSettings' import UserSettingsModel from '../../models/userSettings'
import {playSoundWhenDoneKey} from '@/helpers/playPop' import {playSoundWhenDoneKey} from '@/helpers/playPop'
import {availableLanguages, saveLanguage, getCurrentLanguage} from '@/i18n/setup' import {availableLanguages, saveLanguage, getCurrentLanguage} from '../../i18n/setup'
import {mapState} from 'vuex' import {mapState} from 'vuex'
@ -367,7 +367,9 @@ export default {
return `${apiBase}/dav/principals/${this.userInfo.username}/` return `${apiBase}/dav/principals/${this.userInfo.username}/`
}, },
availableLanguages() { availableLanguages() {
return availableLanguages return Object.entries(availableLanguages)
.map(l => ({code: l[0], title: l[1]}))
.sort((a, b) => a.title > b.title)
}, },
...mapState({ ...mapState({
totpEnabled: state => state.config.totpEnabled, totpEnabled: state => state.config.totpEnabled,