mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-05-30 19:54:55 -04:00
Merge branch 'advplyr:master' into master
This commit is contained in:
commit
2fdab39e27
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<p class="text-xs text-gray-300 italic">{{ Source }}</p>
|
<p class="text-xs text-gray-300 italic">{{ Source }}</p>
|
||||||
</div>
|
</div>
|
||||||
<a v-if="hasUpdate" :href="githubTagUrl" target="_blank" class="text-warning text-xs">Latest: {{ $config.version }}</a>
|
<a v-if="hasUpdate" :href="githubTagUrl" target="_blank" class="text-warning text-xs">Latest: {{ versionData.latestVersion }}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -69,6 +69,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center my-2 max-w-md">
|
||||||
|
<div class="w-1/2">
|
||||||
|
<p id="ereader-permissions-toggle">{{ $strings.LabelPermissionsCreateEreader }}</p>
|
||||||
|
</div>
|
||||||
|
<div class="w-1/2">
|
||||||
|
<ui-toggle-switch labeledBy="ereader-permissions-toggle" v-model="newUser.permissions.createEreader" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center my-2 max-w-md">
|
<div class="flex items-center my-2 max-w-md">
|
||||||
<div class="w-1/2">
|
<div class="w-1/2">
|
||||||
<p id="explicit-content-permissions-toggle">{{ $strings.LabelPermissionsAccessExplicitContent }}</p>
|
<p id="explicit-content-permissions-toggle">{{ $strings.LabelPermissionsAccessExplicitContent }}</p>
|
||||||
@ -354,7 +363,8 @@ export default {
|
|||||||
accessExplicitContent: type === 'admin',
|
accessExplicitContent: type === 'admin',
|
||||||
accessAllLibraries: true,
|
accessAllLibraries: true,
|
||||||
accessAllTags: true,
|
accessAllTags: true,
|
||||||
selectedTagsNotAccessible: false
|
selectedTagsNotAccessible: false,
|
||||||
|
createEreader: type === 'admin'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
init() {
|
init() {
|
||||||
@ -387,7 +397,8 @@ export default {
|
|||||||
accessAllLibraries: true,
|
accessAllLibraries: true,
|
||||||
accessAllTags: true,
|
accessAllTags: true,
|
||||||
accessExplicitContent: false,
|
accessExplicitContent: false,
|
||||||
selectedTagsNotAccessible: false
|
selectedTagsNotAccessible: false,
|
||||||
|
createEreader: false
|
||||||
},
|
},
|
||||||
librariesAccessible: [],
|
librariesAccessible: [],
|
||||||
itemTagsSelected: []
|
itemTagsSelected: []
|
||||||
|
188
client/components/modals/emails/UserEReaderDeviceModal.vue
Normal file
188
client/components/modals/emails/UserEReaderDeviceModal.vue
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
<template>
|
||||||
|
<modals-modal ref="modal" v-model="show" name="ereader-device-edit" :width="800" :height="'unset'" :processing="processing">
|
||||||
|
<template #outer>
|
||||||
|
<div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden">
|
||||||
|
<p class="text-3xl text-white truncate">{{ title }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<form @submit.prevent="submitForm">
|
||||||
|
<div class="w-full text-sm rounded-lg bg-bg shadow-lg border border-black-300">
|
||||||
|
<div class="w-full px-3 py-5 md:p-12">
|
||||||
|
<div class="flex items-center -mx-1 mb-4">
|
||||||
|
<div class="w-full md:w-1/2 px-1">
|
||||||
|
<ui-text-input-with-label ref="ereaderNameInput" v-model="newDevice.name" :disabled="processing" :label="$strings.LabelName" />
|
||||||
|
</div>
|
||||||
|
<div class="w-full md:w-1/2 px-1">
|
||||||
|
<ui-text-input-with-label ref="ereaderEmailInput" v-model="newDevice.email" :disabled="processing" :label="$strings.LabelEmail" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center pt-4">
|
||||||
|
<div class="flex-grow" />
|
||||||
|
<ui-btn color="success" type="submit">{{ $strings.ButtonSubmit }}</ui-btn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</modals-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
value: Boolean,
|
||||||
|
existingDevices: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
ereaderDevice: {
|
||||||
|
type: Object,
|
||||||
|
default: () => null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
processing: false,
|
||||||
|
newDevice: {
|
||||||
|
name: '',
|
||||||
|
email: '',
|
||||||
|
availabilityOption: 'adminAndUp',
|
||||||
|
users: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
show: {
|
||||||
|
handler(newVal) {
|
||||||
|
if (newVal) {
|
||||||
|
this.init()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
show: {
|
||||||
|
get() {
|
||||||
|
return this.value
|
||||||
|
},
|
||||||
|
set(val) {
|
||||||
|
this.$emit('input', val)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
user() {
|
||||||
|
return this.$store.state.user.user
|
||||||
|
},
|
||||||
|
title() {
|
||||||
|
return !this.ereaderDevice ? 'Create Device' : 'Update Device'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
submitForm() {
|
||||||
|
this.$refs.ereaderNameInput.blur()
|
||||||
|
this.$refs.ereaderEmailInput.blur()
|
||||||
|
|
||||||
|
if (!this.newDevice.name?.trim() || !this.newDevice.email?.trim()) {
|
||||||
|
this.$toast.error(this.$strings.ToastNameEmailRequired)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.newDevice.name = this.newDevice.name.trim()
|
||||||
|
this.newDevice.email = this.newDevice.email.trim()
|
||||||
|
|
||||||
|
// Only catches duplicate names for the current user
|
||||||
|
// Duplicates with other users caught on server side
|
||||||
|
if (!this.ereaderDevice) {
|
||||||
|
if (this.existingDevices.some((d) => d.name === this.newDevice.name)) {
|
||||||
|
this.$toast.error(this.$strings.ToastDeviceNameAlreadyExists)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.submitCreate()
|
||||||
|
} else {
|
||||||
|
if (this.ereaderDevice.name !== this.newDevice.name && this.existingDevices.some((d) => d.name === this.newDevice.name)) {
|
||||||
|
this.$toast.error(this.$strings.ToastDeviceNameAlreadyExists)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.submitUpdate()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
submitUpdate() {
|
||||||
|
this.processing = true
|
||||||
|
|
||||||
|
const existingDevicesWithoutThisOne = this.existingDevices.filter((d) => d.name !== this.ereaderDevice.name)
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
ereaderDevices: [
|
||||||
|
...existingDevicesWithoutThisOne,
|
||||||
|
{
|
||||||
|
...this.newDevice
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$axios
|
||||||
|
.$post(`/api/me/ereader-devices`, payload)
|
||||||
|
.then((data) => {
|
||||||
|
this.$emit('update', data.ereaderDevices)
|
||||||
|
this.show = false
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Failed to update device', error)
|
||||||
|
if (error.response?.data?.toLowerCase().includes('duplicate')) {
|
||||||
|
this.$toast.error(this.$strings.ToastDeviceNameAlreadyExists)
|
||||||
|
} else {
|
||||||
|
this.$toast.error(this.$strings.ToastDeviceAddFailed)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.processing = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
submitCreate() {
|
||||||
|
this.processing = true
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
ereaderDevices: [
|
||||||
|
...this.existingDevices,
|
||||||
|
{
|
||||||
|
...this.newDevice
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$axios
|
||||||
|
.$post('/api/me/ereader-devices', payload)
|
||||||
|
.then((data) => {
|
||||||
|
this.$emit('update', data.ereaderDevices || [])
|
||||||
|
this.show = false
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Failed to add device', error)
|
||||||
|
if (error.response?.data?.toLowerCase().includes('duplicate')) {
|
||||||
|
this.$toast.error(this.$strings.ToastDeviceNameAlreadyExists)
|
||||||
|
} else {
|
||||||
|
this.$toast.error(this.$strings.ToastDeviceAddFailed)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.processing = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
init() {
|
||||||
|
if (this.ereaderDevice) {
|
||||||
|
this.newDevice.name = this.ereaderDevice.name
|
||||||
|
this.newDevice.email = this.ereaderDevice.email
|
||||||
|
this.newDevice.availabilityOption = this.ereaderDevice.availabilityOption || 'specificUsers'
|
||||||
|
this.newDevice.users = this.ereaderDevice.users || [this.user.id]
|
||||||
|
} else {
|
||||||
|
this.newDevice.name = ''
|
||||||
|
this.newDevice.email = ''
|
||||||
|
this.newDevice.availabilityOption = 'specificUsers'
|
||||||
|
this.newDevice.users = [this.user.id]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {}
|
||||||
|
}
|
||||||
|
</script>
|
@ -111,7 +111,6 @@ export default {
|
|||||||
},
|
},
|
||||||
updateLibrary(library) {
|
updateLibrary(library) {
|
||||||
this.mapLibraryToCopy(library)
|
this.mapLibraryToCopy(library)
|
||||||
console.log('Updated library', this.libraryCopy)
|
|
||||||
},
|
},
|
||||||
getNewLibraryData() {
|
getNewLibraryData() {
|
||||||
return {
|
return {
|
||||||
@ -128,7 +127,9 @@ export default {
|
|||||||
autoScanCronExpression: null,
|
autoScanCronExpression: null,
|
||||||
hideSingleBookSeries: false,
|
hideSingleBookSeries: false,
|
||||||
onlyShowLaterBooksInContinueSeries: false,
|
onlyShowLaterBooksInContinueSeries: false,
|
||||||
metadataPrecedence: ['folderStructure', 'audioMetatags', 'nfoFile', 'txtFiles', 'opfFile', 'absMetadata']
|
metadataPrecedence: ['folderStructure', 'audioMetatags', 'nfoFile', 'txtFiles', 'opfFile', 'absMetadata'],
|
||||||
|
markAsFinishedPercentComplete: null,
|
||||||
|
markAsFinishedTimeRemaining: 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -236,7 +237,6 @@ export default {
|
|||||||
this.show = false
|
this.show = false
|
||||||
this.$toast.success(this.$getString('ToastLibraryCreateSuccess', [res.name]))
|
this.$toast.success(this.$getString('ToastLibraryCreateSuccess', [res.name]))
|
||||||
if (!this.$store.state.libraries.currentLibraryId) {
|
if (!this.$store.state.libraries.currentLibraryId) {
|
||||||
console.log('Setting initially library id', res.id)
|
|
||||||
// First library added
|
// First library added
|
||||||
this.$store.dispatch('libraries/fetch', res.id)
|
this.$store.dispatch('libraries/fetch', res.id)
|
||||||
}
|
}
|
||||||
|
@ -1,78 +1,94 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="w-full h-full px-1 md:px-4 py-1 mb-4">
|
<div class="w-full h-full px-1 md:px-4 py-1 mb-4">
|
||||||
<div class="flex items-center py-3">
|
<div class="flex flex-wrap">
|
||||||
<ui-toggle-switch v-model="useSquareBookCovers" @input="formUpdated" />
|
<div class="flex items-center p-2 w-full md:w-1/2">
|
||||||
<ui-tooltip :text="$strings.LabelSettingsSquareBookCoversHelp">
|
<ui-toggle-switch v-model="useSquareBookCovers" size="sm" @input="formUpdated" />
|
||||||
<p class="pl-4 text-base">
|
<ui-tooltip :text="$strings.LabelSettingsSquareBookCoversHelp">
|
||||||
{{ $strings.LabelSettingsSquareBookCovers }}
|
<p class="pl-4 text-sm">
|
||||||
<span class="material-symbols icon-text text-sm">info</span>
|
{{ $strings.LabelSettingsSquareBookCovers }}
|
||||||
</p>
|
|
||||||
</ui-tooltip>
|
|
||||||
</div>
|
|
||||||
<div class="py-3">
|
|
||||||
<div class="flex items-center">
|
|
||||||
<ui-toggle-switch v-if="!globalWatcherDisabled" v-model="enableWatcher" @input="formUpdated" />
|
|
||||||
<ui-toggle-switch v-else disabled :value="false" />
|
|
||||||
<p class="pl-4 text-base">{{ $strings.LabelSettingsEnableWatcherForLibrary }}</p>
|
|
||||||
</div>
|
|
||||||
<p v-if="globalWatcherDisabled" class="text-xs text-warning">*{{ $strings.MessageWatcherIsDisabledGlobally }}</p>
|
|
||||||
</div>
|
|
||||||
<div v-if="isBookLibrary" class="flex items-center py-3">
|
|
||||||
<ui-toggle-switch v-model="audiobooksOnly" @input="formUpdated" />
|
|
||||||
<ui-tooltip :text="$strings.LabelSettingsAudiobooksOnlyHelp">
|
|
||||||
<p class="pl-4 text-base">
|
|
||||||
{{ $strings.LabelSettingsAudiobooksOnly }}
|
|
||||||
<span class="material-symbols icon-text text-sm">info</span>
|
|
||||||
</p>
|
|
||||||
</ui-tooltip>
|
|
||||||
</div>
|
|
||||||
<div v-if="isBookLibrary" class="py-3">
|
|
||||||
<div class="flex items-center">
|
|
||||||
<ui-toggle-switch v-model="skipMatchingMediaWithAsin" @input="formUpdated" />
|
|
||||||
<p class="pl-4 text-base">{{ $strings.LabelSettingsSkipMatchingBooksWithASIN }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-if="isBookLibrary" class="py-3">
|
|
||||||
<div class="flex items-center">
|
|
||||||
<ui-toggle-switch v-model="skipMatchingMediaWithIsbn" @input="formUpdated" />
|
|
||||||
<p class="pl-4 text-base">{{ $strings.LabelSettingsSkipMatchingBooksWithISBN }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-if="isBookLibrary" class="py-3">
|
|
||||||
<div class="flex items-center">
|
|
||||||
<ui-toggle-switch v-model="hideSingleBookSeries" @input="formUpdated" />
|
|
||||||
<ui-tooltip :text="$strings.LabelSettingsHideSingleBookSeriesHelp">
|
|
||||||
<p class="pl-4 text-base">
|
|
||||||
{{ $strings.LabelSettingsHideSingleBookSeries }}
|
|
||||||
<span class="material-symbols icon-text text-sm">info</span>
|
<span class="material-symbols icon-text text-sm">info</span>
|
||||||
</p>
|
</p>
|
||||||
</ui-tooltip>
|
</ui-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="p-2 w-full md:w-1/2">
|
||||||
<div v-if="isBookLibrary" class="py-3">
|
<div class="flex items-center">
|
||||||
<div class="flex items-center">
|
<ui-toggle-switch v-if="!globalWatcherDisabled" v-model="enableWatcher" size="sm" @input="formUpdated" />
|
||||||
<ui-toggle-switch v-model="onlyShowLaterBooksInContinueSeries" @input="formUpdated" />
|
<ui-toggle-switch v-else disabled size="sm" :value="false" />
|
||||||
<ui-tooltip :text="$strings.LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp">
|
<p class="pl-4 text-sm">{{ $strings.LabelSettingsEnableWatcherForLibrary }}</p>
|
||||||
<p class="pl-4 text-base">
|
</div>
|
||||||
{{ $strings.LabelSettingsOnlyShowLaterBooksInContinueSeries }}
|
<p v-if="globalWatcherDisabled" class="text-xs text-warning">*{{ $strings.MessageWatcherIsDisabledGlobally }}</p>
|
||||||
|
</div>
|
||||||
|
<div v-if="isBookLibrary" class="flex items-center p-2 w-full md:w-1/2">
|
||||||
|
<ui-toggle-switch v-model="audiobooksOnly" size="sm" @input="formUpdated" />
|
||||||
|
<ui-tooltip :text="$strings.LabelSettingsAudiobooksOnlyHelp">
|
||||||
|
<p class="pl-4 text-sm">
|
||||||
|
{{ $strings.LabelSettingsAudiobooksOnly }}
|
||||||
<span class="material-symbols icon-text text-sm">info</span>
|
<span class="material-symbols icon-text text-sm">info</span>
|
||||||
</p>
|
</p>
|
||||||
</ui-tooltip>
|
</ui-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div v-if="isBookLibrary" class="p-2 w-full md:w-1/2">
|
||||||
<div v-if="isBookLibrary" class="py-3">
|
<div class="flex items-center">
|
||||||
<div class="flex items-center">
|
<ui-toggle-switch v-model="skipMatchingMediaWithAsin" size="sm" @input="formUpdated" />
|
||||||
<ui-toggle-switch v-model="epubsAllowScriptedContent" @input="formUpdated" />
|
<p class="pl-4 text-sm">{{ $strings.LabelSettingsSkipMatchingBooksWithASIN }}</p>
|
||||||
<ui-tooltip :text="$strings.LabelSettingsEpubsAllowScriptedContentHelp">
|
</div>
|
||||||
<p class="pl-4 text-base">
|
</div>
|
||||||
{{ $strings.LabelSettingsEpubsAllowScriptedContent }}
|
<div v-if="isBookLibrary" class="p-2 w-full md:w-1/2">
|
||||||
<span class="material-symbols icon-text text-sm">info</span>
|
<div class="flex items-center">
|
||||||
</p>
|
<ui-toggle-switch v-model="skipMatchingMediaWithIsbn" size="sm" @input="formUpdated" />
|
||||||
</ui-tooltip>
|
<p class="pl-4 text-sm">{{ $strings.LabelSettingsSkipMatchingBooksWithISBN }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="isBookLibrary" class="p-2 w-full md:w-1/2">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<ui-toggle-switch v-model="hideSingleBookSeries" size="sm" @input="formUpdated" />
|
||||||
|
<ui-tooltip :text="$strings.LabelSettingsHideSingleBookSeriesHelp">
|
||||||
|
<p class="pl-4 text-sm">
|
||||||
|
{{ $strings.LabelSettingsHideSingleBookSeries }}
|
||||||
|
<span class="material-symbols icon-text text-sm">info</span>
|
||||||
|
</p>
|
||||||
|
</ui-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="isBookLibrary" class="p-2 w-full md:w-1/2">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<ui-toggle-switch v-model="onlyShowLaterBooksInContinueSeries" size="sm" @input="formUpdated" />
|
||||||
|
<ui-tooltip :text="$strings.LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp">
|
||||||
|
<p class="pl-4 text-sm">
|
||||||
|
{{ $strings.LabelSettingsOnlyShowLaterBooksInContinueSeries }}
|
||||||
|
<span class="material-symbols icon-text text-sm">info</span>
|
||||||
|
</p>
|
||||||
|
</ui-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="isBookLibrary" class="p-2 w-full md:w-1/2">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<ui-toggle-switch v-model="epubsAllowScriptedContent" size="sm" @input="formUpdated" />
|
||||||
|
<ui-tooltip :text="$strings.LabelSettingsEpubsAllowScriptedContentHelp">
|
||||||
|
<p class="pl-4 text-sm">
|
||||||
|
{{ $strings.LabelSettingsEpubsAllowScriptedContent }}
|
||||||
|
<span class="material-symbols icon-text text-sm">info</span>
|
||||||
|
</p>
|
||||||
|
</ui-tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="isPodcastLibrary" class="p-2 w-full md:w-1/2">
|
||||||
|
<ui-dropdown :label="$strings.LabelPodcastSearchRegion" v-model="podcastSearchRegion" :items="$podcastSearchRegionOptions" small class="max-w-72" menu-max-height="200px" @input="formUpdated" />
|
||||||
|
</div>
|
||||||
|
<div class="p-2 w-full flex items-center space-x-2 flex-wrap">
|
||||||
|
<div>
|
||||||
|
<ui-dropdown v-model="markAsFinishedWhen" :items="maskAsFinishedWhenItems" :label="$strings.LabelSettingsLibraryMarkAsFinishedWhen" small class="w-72 min-w-72 text-sm" menu-max-height="200px" @input="markAsFinishedWhenChanged" />
|
||||||
|
</div>
|
||||||
|
<div class="w-16">
|
||||||
|
<div>
|
||||||
|
<label class="px-1 text-sm font-semibold"></label>
|
||||||
|
<div class="relative">
|
||||||
|
<ui-text-input v-model="markAsFinishedValue" type="number" label="" no-spinner custom-input-class="pr-5" @input="markAsFinishedChanged" />
|
||||||
|
<div class="absolute top-0 bottom-0 right-4 flex items-center">{{ markAsFinishedWhen === 'timeRemaining' ? '' : '%' }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div v-if="isPodcastLibrary" class="py-3">
|
|
||||||
<ui-dropdown :label="$strings.LabelPodcastSearchRegion" v-model="podcastSearchRegion" :items="$podcastSearchRegionOptions" small class="max-w-72" menu-max-height="200px" @input="formUpdated" />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -97,7 +113,9 @@ export default {
|
|||||||
epubsAllowScriptedContent: false,
|
epubsAllowScriptedContent: false,
|
||||||
hideSingleBookSeries: false,
|
hideSingleBookSeries: false,
|
||||||
onlyShowLaterBooksInContinueSeries: false,
|
onlyShowLaterBooksInContinueSeries: false,
|
||||||
podcastSearchRegion: 'us'
|
podcastSearchRegion: 'us',
|
||||||
|
markAsFinishedWhen: 'timeRemaining',
|
||||||
|
markAsFinishedValue: 10
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -119,10 +137,34 @@ export default {
|
|||||||
providers() {
|
providers() {
|
||||||
if (this.mediaType === 'podcast') return this.$store.state.scanners.podcastProviders
|
if (this.mediaType === 'podcast') return this.$store.state.scanners.podcastProviders
|
||||||
return this.$store.state.scanners.providers
|
return this.$store.state.scanners.providers
|
||||||
|
},
|
||||||
|
maskAsFinishedWhenItems() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
text: this.$strings.LabelSettingsLibraryMarkAsFinishedTimeRemaining,
|
||||||
|
value: 'timeRemaining'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: this.$strings.LabelSettingsLibraryMarkAsFinishedPercentComplete,
|
||||||
|
value: 'percentComplete'
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
markAsFinishedWhenChanged(val) {
|
||||||
|
if (val === 'percentComplete' && this.markAsFinishedValue > 100) {
|
||||||
|
this.markAsFinishedValue = 100
|
||||||
|
}
|
||||||
|
this.formUpdated()
|
||||||
|
},
|
||||||
|
markAsFinishedChanged(val) {
|
||||||
|
this.formUpdated()
|
||||||
|
},
|
||||||
getLibraryData() {
|
getLibraryData() {
|
||||||
|
let markAsFinishedTimeRemaining = this.markAsFinishedWhen === 'timeRemaining' ? Number(this.markAsFinishedValue) : null
|
||||||
|
let markAsFinishedPercentComplete = this.markAsFinishedWhen === 'percentComplete' ? Number(this.markAsFinishedValue) : null
|
||||||
|
|
||||||
return {
|
return {
|
||||||
settings: {
|
settings: {
|
||||||
coverAspectRatio: this.useSquareBookCovers ? this.$constants.BookCoverAspectRatio.SQUARE : this.$constants.BookCoverAspectRatio.STANDARD,
|
coverAspectRatio: this.useSquareBookCovers ? this.$constants.BookCoverAspectRatio.SQUARE : this.$constants.BookCoverAspectRatio.STANDARD,
|
||||||
@ -133,7 +175,9 @@ export default {
|
|||||||
epubsAllowScriptedContent: !!this.epubsAllowScriptedContent,
|
epubsAllowScriptedContent: !!this.epubsAllowScriptedContent,
|
||||||
hideSingleBookSeries: !!this.hideSingleBookSeries,
|
hideSingleBookSeries: !!this.hideSingleBookSeries,
|
||||||
onlyShowLaterBooksInContinueSeries: !!this.onlyShowLaterBooksInContinueSeries,
|
onlyShowLaterBooksInContinueSeries: !!this.onlyShowLaterBooksInContinueSeries,
|
||||||
podcastSearchRegion: this.podcastSearchRegion
|
podcastSearchRegion: this.podcastSearchRegion,
|
||||||
|
markAsFinishedTimeRemaining: markAsFinishedTimeRemaining,
|
||||||
|
markAsFinishedPercentComplete: markAsFinishedPercentComplete
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -150,6 +194,11 @@ export default {
|
|||||||
this.hideSingleBookSeries = !!this.librarySettings.hideSingleBookSeries
|
this.hideSingleBookSeries = !!this.librarySettings.hideSingleBookSeries
|
||||||
this.onlyShowLaterBooksInContinueSeries = !!this.librarySettings.onlyShowLaterBooksInContinueSeries
|
this.onlyShowLaterBooksInContinueSeries = !!this.librarySettings.onlyShowLaterBooksInContinueSeries
|
||||||
this.podcastSearchRegion = this.librarySettings.podcastSearchRegion || 'us'
|
this.podcastSearchRegion = this.librarySettings.podcastSearchRegion || 'us'
|
||||||
|
this.markAsFinishedWhen = this.librarySettings.markAsFinishedTimeRemaining ? 'timeRemaining' : 'percentComplete'
|
||||||
|
if (!this.librarySettings.markAsFinishedTimeRemaining && !this.librarySettings.markAsFinishedPercentComplete) {
|
||||||
|
this.markAsFinishedWhen = 'timeRemaining'
|
||||||
|
}
|
||||||
|
this.markAsFinishedValue = this.librarySettings.markAsFinishedTimeRemaining || this.librarySettings.markAsFinishedPercentComplete || 10
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -57,7 +57,8 @@ export default {
|
|||||||
inputName: String,
|
inputName: String,
|
||||||
showCopy: Boolean,
|
showCopy: Boolean,
|
||||||
step: [String, Number],
|
step: [String, Number],
|
||||||
min: [String, Number]
|
min: [String, Number],
|
||||||
|
customInputClass: String
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -82,6 +83,7 @@ export default {
|
|||||||
_list.push(`py-${this.paddingY}`)
|
_list.push(`py-${this.paddingY}`)
|
||||||
if (this.noSpinner) _list.push('no-spinner')
|
if (this.noSpinner) _list.push('no-spinner')
|
||||||
if (this.textCenter) _list.push('text-center')
|
if (this.textCenter) _list.push('text-center')
|
||||||
|
if (this.customInputClass) _list.push(this.customInputClass)
|
||||||
return _list.join(' ')
|
return _list.join(' ')
|
||||||
},
|
},
|
||||||
actualType() {
|
actualType() {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<button :aria-labelledby="labeledBy" role="checkbox" type="button" class="border rounded-full border-black-100 flex items-center cursor-pointer w-10 justify-start" :aria-checked="toggleValue" :class="className" @click="clickToggle">
|
<button :aria-labelledby="labeledBy" role="checkbox" type="button" class="border rounded-full border-black-100 flex items-center cursor-pointer justify-start" :style="{ width: buttonWidth + 'px' }" :aria-checked="toggleValue" :class="className" @click="clickToggle">
|
||||||
<span class="rounded-full border w-5 h-5 border-black-50 shadow transform transition-transform duration-100" :class="switchClassName"></span>
|
<span class="rounded-full border border-black-50 shadow transform transition-transform duration-100" :style="{ width: cursorHeightWidth + 'px', height: cursorHeightWidth + 'px' }" :class="switchClassName"></span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -19,7 +19,11 @@ export default {
|
|||||||
default: 'primary'
|
default: 'primary'
|
||||||
},
|
},
|
||||||
disabled: Boolean,
|
disabled: Boolean,
|
||||||
labeledBy: String
|
labeledBy: String,
|
||||||
|
size: {
|
||||||
|
type: String,
|
||||||
|
default: 'md'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
toggleValue: {
|
toggleValue: {
|
||||||
@ -37,6 +41,13 @@ export default {
|
|||||||
switchClassName() {
|
switchClassName() {
|
||||||
var bgColor = this.disabled ? 'bg-gray-300' : 'bg-white'
|
var bgColor = this.disabled ? 'bg-gray-300' : 'bg-white'
|
||||||
return this.toggleValue ? 'translate-x-5 ' + bgColor : bgColor
|
return this.toggleValue ? 'translate-x-5 ' + bgColor : bgColor
|
||||||
|
},
|
||||||
|
cursorHeightWidth() {
|
||||||
|
if (this.size === 'sm') return 16
|
||||||
|
return 20
|
||||||
|
},
|
||||||
|
buttonWidth() {
|
||||||
|
return this.cursorHeightWidth * 2
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
4
client/package-lock.json
generated
4
client/package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.15.1",
|
"version": "2.16.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.15.1",
|
"version": "2.16.1",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nuxtjs/axios": "^5.13.6",
|
"@nuxtjs/axios": "^5.13.6",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.15.1",
|
"version": "2.16.1",
|
||||||
"buildNumber": 1,
|
"buildNumber": 1,
|
||||||
"description": "Self-hosted audiobook and podcast client",
|
"description": "Self-hosted audiobook and podcast client",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
@ -32,9 +32,48 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div v-if="showEreaderTable">
|
||||||
|
<div class="w-full h-px bg-white/10 my-4" />
|
||||||
|
|
||||||
|
<app-settings-content :header-text="$strings.HeaderEreaderDevices">
|
||||||
|
<template #header-items>
|
||||||
|
<div class="flex-grow" />
|
||||||
|
|
||||||
|
<ui-btn color="primary" small @click="addNewDeviceClick">{{ $strings.ButtonAddDevice }}</ui-btn>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<table v-if="ereaderDevices.length" class="tracksTable mt-4">
|
||||||
|
<tr>
|
||||||
|
<th class="text-left">{{ $strings.LabelName }}</th>
|
||||||
|
<th class="text-left">{{ $strings.LabelEmail }}</th>
|
||||||
|
<th class="w-40"></th>
|
||||||
|
</tr>
|
||||||
|
<tr v-for="device in ereaderDevices" :key="device.name">
|
||||||
|
<td>
|
||||||
|
<p class="text-sm md:text-base text-gray-100">{{ device.name }}</p>
|
||||||
|
</td>
|
||||||
|
<td class="text-left">
|
||||||
|
<p class="text-sm md:text-base text-gray-100">{{ device.email }}</p>
|
||||||
|
</td>
|
||||||
|
<td class="w-40">
|
||||||
|
<div class="flex justify-end items-center h-10">
|
||||||
|
<ui-icon-btn icon="edit" borderless :size="8" icon-font-size="1.1rem" :disabled="deletingDeviceName === device.name || device.users?.length !== 1" class="mx-1" @click="editDeviceClick(device)" />
|
||||||
|
<ui-icon-btn icon="delete" borderless :size="8" icon-font-size="1.1rem" :disabled="deletingDeviceName === device.name || device.users?.length !== 1" @click="deleteDeviceClick(device)" />
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div v-else-if="!loading" class="text-center py-4">
|
||||||
|
<p class="text-lg text-gray-100">{{ $strings.MessageNoDevices }}</p>
|
||||||
|
</div>
|
||||||
|
</app-settings-content>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="py-4 mt-8 flex">
|
<div class="py-4 mt-8 flex">
|
||||||
<ui-btn color="primary flex items-center text-lg" @click="logout"><span class="material-symbols mr-4 icon-text">logout</span>{{ $strings.ButtonLogout }}</ui-btn>
|
<ui-btn color="primary flex items-center text-lg" @click="logout"><span class="material-symbols mr-4 icon-text">logout</span>{{ $strings.ButtonLogout }}</ui-btn>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<modals-emails-user-e-reader-device-modal v-model="showEReaderDeviceModal" :existing-devices="revisedEreaderDevices" :ereader-device="selectedEReaderDevice" @update="ereaderDevicesUpdated" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -43,11 +82,20 @@
|
|||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
loading: false,
|
||||||
password: null,
|
password: null,
|
||||||
newPassword: null,
|
newPassword: null,
|
||||||
confirmPassword: null,
|
confirmPassword: null,
|
||||||
changingPassword: false,
|
changingPassword: false,
|
||||||
selectedLanguage: ''
|
selectedLanguage: '',
|
||||||
|
newEReaderDevice: {
|
||||||
|
name: '',
|
||||||
|
email: ''
|
||||||
|
},
|
||||||
|
ereaderDevices: [],
|
||||||
|
deletingDeviceName: null,
|
||||||
|
selectedEReaderDevice: null,
|
||||||
|
showEReaderDeviceModal: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -75,6 +123,12 @@ export default {
|
|||||||
},
|
},
|
||||||
showChangePasswordForm() {
|
showChangePasswordForm() {
|
||||||
return !this.isGuest && this.isPasswordAuthEnabled
|
return !this.isGuest && this.isPasswordAuthEnabled
|
||||||
|
},
|
||||||
|
showEreaderTable() {
|
||||||
|
return this.usertype !== 'root' && this.usertype !== 'admin' && this.user.permissions?.createEreader
|
||||||
|
},
|
||||||
|
revisedEreaderDevices() {
|
||||||
|
return this.ereaderDevices.filter((device) => device.users?.length === 1)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -142,10 +196,52 @@ export default {
|
|||||||
this.$toast.error(this.$strings.ToastUnknownError)
|
this.$toast.error(this.$strings.ToastUnknownError)
|
||||||
this.changingPassword = false
|
this.changingPassword = false
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
addNewDeviceClick() {
|
||||||
|
this.selectedEReaderDevice = null
|
||||||
|
this.showEReaderDeviceModal = true
|
||||||
|
},
|
||||||
|
editDeviceClick(device) {
|
||||||
|
this.selectedEReaderDevice = device
|
||||||
|
this.showEReaderDeviceModal = true
|
||||||
|
},
|
||||||
|
deleteDeviceClick(device) {
|
||||||
|
const payload = {
|
||||||
|
message: this.$getString('MessageConfirmDeleteDevice', [device.name]),
|
||||||
|
callback: (confirmed) => {
|
||||||
|
if (confirmed) {
|
||||||
|
this.deleteDevice(device)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type: 'yesNo'
|
||||||
|
}
|
||||||
|
this.$store.commit('globals/setConfirmPrompt', payload)
|
||||||
|
},
|
||||||
|
deleteDevice(device) {
|
||||||
|
const payload = {
|
||||||
|
ereaderDevices: this.revisedEreaderDevices.filter((d) => d.name !== device.name)
|
||||||
|
}
|
||||||
|
this.deletingDeviceName = device.name
|
||||||
|
this.$axios
|
||||||
|
.$post(`/api/me/ereader-devices`, payload)
|
||||||
|
.then((data) => {
|
||||||
|
this.ereaderDevicesUpdated(data.ereaderDevices)
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Failed to delete device', error)
|
||||||
|
this.$toast.error(this.$strings.ToastRemoveFailed)
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.deletingDeviceName = null
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ereaderDevicesUpdated(ereaderDevices) {
|
||||||
|
this.ereaderDevices = ereaderDevices
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.selectedLanguage = this.$languageCodes.current
|
this.selectedLanguage = this.$languageCodes.current
|
||||||
|
this.ereaderDevices = this.$store.state.libraries.ereaderDevices || []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -88,7 +88,7 @@
|
|||||||
<ui-dropdown v-model="itemsPerPage" :items="itemsPerPageOptions" small class="w-24 mx-2" @input="updatedItemsPerPage" />
|
<ui-dropdown v-model="itemsPerPage" :items="itemsPerPageOptions" small class="w-24 mx-2" @input="updatedItemsPerPage" />
|
||||||
</div>
|
</div>
|
||||||
<div class="inline-flex items-center">
|
<div class="inline-flex items-center">
|
||||||
<p class="text-sm mx-2">Page {{ currentPage + 1 }} of {{ numPages }}</p>
|
<p class="text-sm mx-2">{{ $getString('LabelPaginationPageXOfY', [currentPage + 1, numPages]) }}</p>
|
||||||
<ui-icon-btn icon="arrow_back_ios_new" :size="9" icon-font-size="1rem" class="mx-1" :disabled="currentPage === 0" @click="prevPage" />
|
<ui-icon-btn icon="arrow_back_ios_new" :size="9" icon-font-size="1rem" class="mx-1" :disabled="currentPage === 0" @click="prevPage" />
|
||||||
<ui-icon-btn icon="arrow_forward_ios" :size="9" icon-font-size="1rem" class="mx-1" :disabled="currentPage >= numPages - 1" @click="nextPage" />
|
<ui-icon-btn icon="arrow_forward_ios" :size="9" icon-font-size="1rem" class="mx-1" :disabled="currentPage >= numPages - 1" @click="nextPage" />
|
||||||
</div>
|
</div>
|
||||||
@ -103,7 +103,7 @@
|
|||||||
<div v-if="openListeningSessions.length" class="w-full my-8 h-px bg-white/10" />
|
<div v-if="openListeningSessions.length" class="w-full my-8 h-px bg-white/10" />
|
||||||
|
|
||||||
<!-- open listening sessions table -->
|
<!-- open listening sessions table -->
|
||||||
<p v-if="openListeningSessions.length" class="text-lg my-4">Open Listening Sessions</p>
|
<p v-if="openListeningSessions.length" class="text-lg my-4">{{ $strings.HeaderOpenListeningSessions }}</p>
|
||||||
<div v-if="openListeningSessions.length" class="block max-w-full">
|
<div v-if="openListeningSessions.length" class="block max-w-full">
|
||||||
<table class="userSessionsTable">
|
<table class="userSessionsTable">
|
||||||
<tr class="bg-primary bg-opacity-40">
|
<tr class="bg-primary bg-opacity-40">
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<h1 class="text-xl pl-2">{{ username }}</h1>
|
<h1 class="text-xl pl-2">{{ username }}</h1>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="userToken" class="flex text-xs mt-4">
|
<div v-if="userToken" class="flex text-xs mt-4">
|
||||||
<ui-text-input-with-label label="API Token" :value="userToken" readonly />
|
<ui-text-input-with-label :label="$strings.LabelApiToken" :value="userToken" readonly />
|
||||||
|
|
||||||
<div class="px-1 mt-8 cursor-pointer" @click="copyToClipboard(userToken)">
|
<div class="px-1 mt-8 cursor-pointer" @click="copyToClipboard(userToken)">
|
||||||
<span class="material-symbols pl-2 text-base">content_copy</span>
|
<span class="material-symbols pl-2 text-base">content_copy</span>
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
</table>
|
</table>
|
||||||
<div class="flex items-center justify-end py-1">
|
<div class="flex items-center justify-end py-1">
|
||||||
<ui-icon-btn icon="arrow_back_ios_new" :size="7" icon-font-size="1rem" class="mx-1" :disabled="currentPage === 0" @click="prevPage" />
|
<ui-icon-btn icon="arrow_back_ios_new" :size="7" icon-font-size="1rem" class="mx-1" :disabled="currentPage === 0" @click="prevPage" />
|
||||||
<p class="text-sm mx-1">Page {{ currentPage + 1 }} of {{ numPages }}</p>
|
<p class="text-sm mx-1">{{ $getString('LabelPaginationPageXOfY', [currentPage + 1, numPages]) }}</p>
|
||||||
<ui-icon-btn icon="arrow_forward_ios" :size="7" icon-font-size="1rem" class="mx-1" :disabled="currentPage >= numPages - 1" @click="nextPage" />
|
<ui-icon-btn icon="arrow_forward_ios" :size="7" icon-font-size="1rem" class="mx-1" :disabled="currentPage >= numPages - 1" @click="nextPage" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
"ButtonChooseFiles": "Vybrat soubory",
|
"ButtonChooseFiles": "Vybrat soubory",
|
||||||
"ButtonClearFilter": "Vymazat filtr",
|
"ButtonClearFilter": "Vymazat filtr",
|
||||||
"ButtonCloseFeed": "Zavřít kanál",
|
"ButtonCloseFeed": "Zavřít kanál",
|
||||||
|
"ButtonCloseSession": "Zavřít otevřenou relaci",
|
||||||
"ButtonCollections": "Kolekce",
|
"ButtonCollections": "Kolekce",
|
||||||
"ButtonConfigureScanner": "Konfigurovat Prohledávání",
|
"ButtonConfigureScanner": "Konfigurovat Prohledávání",
|
||||||
"ButtonCreate": "Vytvořit",
|
"ButtonCreate": "Vytvořit",
|
||||||
@ -29,6 +30,8 @@
|
|||||||
"ButtonEditChapters": "Upravit kapitoly",
|
"ButtonEditChapters": "Upravit kapitoly",
|
||||||
"ButtonEditPodcast": "Upravit podcast",
|
"ButtonEditPodcast": "Upravit podcast",
|
||||||
"ButtonEnable": "Povolit",
|
"ButtonEnable": "Povolit",
|
||||||
|
"ButtonFireAndFail": "Spustit a selhat",
|
||||||
|
"ButtonFireOnTest": "Spustit událost onTest",
|
||||||
"ButtonForceReScan": "Vynutit opětovné prohledání",
|
"ButtonForceReScan": "Vynutit opětovné prohledání",
|
||||||
"ButtonFullPath": "Úplná cesta",
|
"ButtonFullPath": "Úplná cesta",
|
||||||
"ButtonHide": "Skrýt",
|
"ButtonHide": "Skrýt",
|
||||||
@ -58,10 +61,12 @@
|
|||||||
"ButtonPlaylists": "Seznamy skladeb",
|
"ButtonPlaylists": "Seznamy skladeb",
|
||||||
"ButtonPrevious": "Předchozí",
|
"ButtonPrevious": "Předchozí",
|
||||||
"ButtonPreviousChapter": "Předchozí Kapitola",
|
"ButtonPreviousChapter": "Předchozí Kapitola",
|
||||||
|
"ButtonProbeAudioFile": "Prozkoumat audio soubor",
|
||||||
"ButtonPurgeAllCache": "Vyčistit veškerou mezipaměť",
|
"ButtonPurgeAllCache": "Vyčistit veškerou mezipaměť",
|
||||||
"ButtonPurgeItemsCache": "Vyčistit mezipaměť položek",
|
"ButtonPurgeItemsCache": "Vyčistit mezipaměť položek",
|
||||||
"ButtonQueueAddItem": "Přidat do fronty",
|
"ButtonQueueAddItem": "Přidat do fronty",
|
||||||
"ButtonQueueRemoveItem": "Odstranit z fronty",
|
"ButtonQueueRemoveItem": "Odstranit z fronty",
|
||||||
|
"ButtonQuickEmbed": "Rychle Zapsat",
|
||||||
"ButtonQuickEmbedMetadata": "Rychle Zapsat Metadata",
|
"ButtonQuickEmbedMetadata": "Rychle Zapsat Metadata",
|
||||||
"ButtonQuickMatch": "Rychlé přiřazení",
|
"ButtonQuickMatch": "Rychlé přiřazení",
|
||||||
"ButtonReScan": "Znovu prohledat",
|
"ButtonReScan": "Znovu prohledat",
|
||||||
@ -175,6 +180,7 @@
|
|||||||
"HeaderRemoveEpisodes": "Odstranit {0} epizody",
|
"HeaderRemoveEpisodes": "Odstranit {0} epizody",
|
||||||
"HeaderSavedMediaProgress": "Průběh uložených médií",
|
"HeaderSavedMediaProgress": "Průběh uložených médií",
|
||||||
"HeaderSchedule": "Plán",
|
"HeaderSchedule": "Plán",
|
||||||
|
"HeaderScheduleEpisodeDownloads": "Naplánovat automatické stahování epizod",
|
||||||
"HeaderScheduleLibraryScans": "Naplánovat automatické prohledávání knihoven",
|
"HeaderScheduleLibraryScans": "Naplánovat automatické prohledávání knihoven",
|
||||||
"HeaderSession": "Relace",
|
"HeaderSession": "Relace",
|
||||||
"HeaderSetBackupSchedule": "Nastavit plán zálohování",
|
"HeaderSetBackupSchedule": "Nastavit plán zálohování",
|
||||||
@ -220,7 +226,11 @@
|
|||||||
"LabelAllUsersExcludingGuests": "Všichni uživatelé kromě hostů",
|
"LabelAllUsersExcludingGuests": "Všichni uživatelé kromě hostů",
|
||||||
"LabelAllUsersIncludingGuests": "Všichni uživatelé včetně hostů",
|
"LabelAllUsersIncludingGuests": "Všichni uživatelé včetně hostů",
|
||||||
"LabelAlreadyInYourLibrary": "Již ve vaší knihovně",
|
"LabelAlreadyInYourLibrary": "Již ve vaší knihovně",
|
||||||
|
"LabelApiToken": "API Token",
|
||||||
"LabelAppend": "Připojit",
|
"LabelAppend": "Připojit",
|
||||||
|
"LabelAudioBitrate": "Bitový tok zvuku (např. 128k)",
|
||||||
|
"LabelAudioChannels": "Zvukové kanály (1 nebo 2)",
|
||||||
|
"LabelAudioCodec": "Kodek audia",
|
||||||
"LabelAuthor": "Autor",
|
"LabelAuthor": "Autor",
|
||||||
"LabelAuthorFirstLast": "Autor (jméno a příjmení)",
|
"LabelAuthorFirstLast": "Autor (jméno a příjmení)",
|
||||||
"LabelAuthorLastFirst": "Autor (příjmení a jméno)",
|
"LabelAuthorLastFirst": "Autor (příjmení a jméno)",
|
||||||
@ -233,6 +243,7 @@
|
|||||||
"LabelAutoRegister": "Automatická registrace",
|
"LabelAutoRegister": "Automatická registrace",
|
||||||
"LabelAutoRegisterDescription": "Automaticky vytvářet nové uživatele po přihlášení",
|
"LabelAutoRegisterDescription": "Automaticky vytvářet nové uživatele po přihlášení",
|
||||||
"LabelBackToUser": "Zpět k uživateli",
|
"LabelBackToUser": "Zpět k uživateli",
|
||||||
|
"LabelBackupAudioFiles": "Zálohovat zvukové soubory",
|
||||||
"LabelBackupLocation": "Umístění zálohy",
|
"LabelBackupLocation": "Umístění zálohy",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Povolit automatické zálohování",
|
"LabelBackupsEnableAutomaticBackups": "Povolit automatické zálohování",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Zálohy uložené v /metadata/backups",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Zálohy uložené v /metadata/backups",
|
||||||
@ -241,6 +252,7 @@
|
|||||||
"LabelBackupsNumberToKeep": "Počet záloh, které se mají uchovat",
|
"LabelBackupsNumberToKeep": "Počet záloh, které se mají uchovat",
|
||||||
"LabelBackupsNumberToKeepHelp": "Najednou bude odstraněna pouze 1 záloha, takže pokud již máte více záloh, měli byste je odstranit ručně.",
|
"LabelBackupsNumberToKeepHelp": "Najednou bude odstraněna pouze 1 záloha, takže pokud již máte více záloh, měli byste je odstranit ručně.",
|
||||||
"LabelBitrate": "Datový tok",
|
"LabelBitrate": "Datový tok",
|
||||||
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Knihy",
|
"LabelBooks": "Knihy",
|
||||||
"LabelButtonText": "Text tlačítka",
|
"LabelButtonText": "Text tlačítka",
|
||||||
"LabelByAuthor": "od {0}",
|
"LabelByAuthor": "od {0}",
|
||||||
|
@ -163,6 +163,7 @@
|
|||||||
"HeaderNotificationUpdate": "Benachrichtigung bearbeiten",
|
"HeaderNotificationUpdate": "Benachrichtigung bearbeiten",
|
||||||
"HeaderNotifications": "Benachrichtigungen",
|
"HeaderNotifications": "Benachrichtigungen",
|
||||||
"HeaderOpenIDConnectAuthentication": "OpenID Connect Authentifizierung",
|
"HeaderOpenIDConnectAuthentication": "OpenID Connect Authentifizierung",
|
||||||
|
"HeaderOpenListeningSessions": "Aktive Hörbuch-Sitzungen",
|
||||||
"HeaderOpenRSSFeed": "RSS-Feed öffnen",
|
"HeaderOpenRSSFeed": "RSS-Feed öffnen",
|
||||||
"HeaderOtherFiles": "Sonstige Dateien",
|
"HeaderOtherFiles": "Sonstige Dateien",
|
||||||
"HeaderPasswordAuthentication": "Passwortauthentifizierung",
|
"HeaderPasswordAuthentication": "Passwortauthentifizierung",
|
||||||
@ -180,6 +181,7 @@
|
|||||||
"HeaderRemoveEpisodes": "Entferne {0} Episoden",
|
"HeaderRemoveEpisodes": "Entferne {0} Episoden",
|
||||||
"HeaderSavedMediaProgress": "Gespeicherte Hörfortschritte",
|
"HeaderSavedMediaProgress": "Gespeicherte Hörfortschritte",
|
||||||
"HeaderSchedule": "Zeitplan",
|
"HeaderSchedule": "Zeitplan",
|
||||||
|
"HeaderScheduleEpisodeDownloads": "Automatische Episoden-Downloads planen",
|
||||||
"HeaderScheduleLibraryScans": "Automatische Bibliotheksscans",
|
"HeaderScheduleLibraryScans": "Automatische Bibliotheksscans",
|
||||||
"HeaderSession": "Sitzung",
|
"HeaderSession": "Sitzung",
|
||||||
"HeaderSetBackupSchedule": "Zeitplan für die Datensicherung festlegen",
|
"HeaderSetBackupSchedule": "Zeitplan für die Datensicherung festlegen",
|
||||||
@ -225,6 +227,7 @@
|
|||||||
"LabelAllUsersExcludingGuests": "Alle Benutzer außer Gästen",
|
"LabelAllUsersExcludingGuests": "Alle Benutzer außer Gästen",
|
||||||
"LabelAllUsersIncludingGuests": "Alle Benutzer und Gäste",
|
"LabelAllUsersIncludingGuests": "Alle Benutzer und Gäste",
|
||||||
"LabelAlreadyInYourLibrary": "Bereits in der Bibliothek",
|
"LabelAlreadyInYourLibrary": "Bereits in der Bibliothek",
|
||||||
|
"LabelApiToken": "API Schlüssel",
|
||||||
"LabelAppend": "Anhängen",
|
"LabelAppend": "Anhängen",
|
||||||
"LabelAudioBitrate": "Audiobitrate (z. B. 128 kbit/s)",
|
"LabelAudioBitrate": "Audiobitrate (z. B. 128 kbit/s)",
|
||||||
"LabelAudioChannels": "Audiokanäle (1 oder 2)",
|
"LabelAudioChannels": "Audiokanäle (1 oder 2)",
|
||||||
@ -250,15 +253,18 @@
|
|||||||
"LabelBackupsNumberToKeep": "Anzahl der aufzubewahrenden Sicherungen",
|
"LabelBackupsNumberToKeep": "Anzahl der aufzubewahrenden Sicherungen",
|
||||||
"LabelBackupsNumberToKeepHelp": "Es wird immer nur 1 Sicherung auf einmal entfernt. Wenn du bereits mehrere Sicherungen als die definierte max. Anzahl hast, solltest du diese manuell entfernen.",
|
"LabelBackupsNumberToKeepHelp": "Es wird immer nur 1 Sicherung auf einmal entfernt. Wenn du bereits mehrere Sicherungen als die definierte max. Anzahl hast, solltest du diese manuell entfernen.",
|
||||||
"LabelBitrate": "Bitrate",
|
"LabelBitrate": "Bitrate",
|
||||||
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Bücher",
|
"LabelBooks": "Bücher",
|
||||||
"LabelButtonText": "Knopftext",
|
"LabelButtonText": "Knopftext",
|
||||||
"LabelByAuthor": "von {0}",
|
"LabelByAuthor": "von {0}",
|
||||||
"LabelChangePassword": "Passwort ändern",
|
"LabelChangePassword": "Passwort ändern",
|
||||||
"LabelChannels": "Kanäle",
|
"LabelChannels": "Kanäle",
|
||||||
|
"LabelChapterCount": "{0} Kapitel",
|
||||||
"LabelChapterTitle": "Kapitelüberschrift",
|
"LabelChapterTitle": "Kapitelüberschrift",
|
||||||
"LabelChapters": "Kapitel",
|
"LabelChapters": "Kapitel",
|
||||||
"LabelChaptersFound": "Gefundene Kapitel",
|
"LabelChaptersFound": "Gefundene Kapitel",
|
||||||
"LabelClickForMoreInfo": "Klicken für mehr Informationen",
|
"LabelClickForMoreInfo": "Klicken für mehr Informationen",
|
||||||
|
"LabelClickToUseCurrentValue": "Anklicken um aktuellen Wert zu verwenden",
|
||||||
"LabelClosePlayer": "Player schließen",
|
"LabelClosePlayer": "Player schließen",
|
||||||
"LabelCodec": "Codec",
|
"LabelCodec": "Codec",
|
||||||
"LabelCollapseSeries": "Serien einklappen",
|
"LabelCollapseSeries": "Serien einklappen",
|
||||||
@ -316,12 +322,17 @@
|
|||||||
"LabelEncodingStartedNavigation": "Sobald die Aufgabe gestartet ist, kann die Seite verlassen werden.",
|
"LabelEncodingStartedNavigation": "Sobald die Aufgabe gestartet ist, kann die Seite verlassen werden.",
|
||||||
"LabelEncodingTimeWarning": "Kodierung kann bis zu 30 Minuten dauern.",
|
"LabelEncodingTimeWarning": "Kodierung kann bis zu 30 Minuten dauern.",
|
||||||
"LabelEncodingWarningAdvancedSettings": "Achtung: Ändere diese Einstellungen nur, wenn du dich mit ffmpeg Kodierung auskennst.",
|
"LabelEncodingWarningAdvancedSettings": "Achtung: Ändere diese Einstellungen nur, wenn du dich mit ffmpeg Kodierung auskennst.",
|
||||||
|
"LabelEncodingWatcherDisabled": "Wenn der Watcher deaktiviert ist musst du das Hörbuch danach erneut scannen.",
|
||||||
"LabelEnd": "Ende",
|
"LabelEnd": "Ende",
|
||||||
"LabelEndOfChapter": "Ende des Kapitels",
|
"LabelEndOfChapter": "Ende des Kapitels",
|
||||||
"LabelEpisode": "Episode",
|
"LabelEpisode": "Episode",
|
||||||
|
"LabelEpisodeNotLinkedToRssFeed": "Episode nicht mit RSS-Feed verknüpft",
|
||||||
|
"LabelEpisodeNumber": "Episode #{0}",
|
||||||
"LabelEpisodeTitle": "Episodentitel",
|
"LabelEpisodeTitle": "Episodentitel",
|
||||||
"LabelEpisodeType": "Episodentyp",
|
"LabelEpisodeType": "Episodentyp",
|
||||||
|
"LabelEpisodeUrlFromRssFeed": "Episoden URL vom RSS-Feed",
|
||||||
"LabelEpisodes": "Episoden",
|
"LabelEpisodes": "Episoden",
|
||||||
|
"LabelEpisodic": "Episodisch",
|
||||||
"LabelExample": "Beispiel",
|
"LabelExample": "Beispiel",
|
||||||
"LabelExpandSeries": "Serie ausklappen",
|
"LabelExpandSeries": "Serie ausklappen",
|
||||||
"LabelExpandSubSeries": "Unterserie ausklappen",
|
"LabelExpandSubSeries": "Unterserie ausklappen",
|
||||||
@ -349,6 +360,7 @@
|
|||||||
"LabelFontScale": "Schriftgröße",
|
"LabelFontScale": "Schriftgröße",
|
||||||
"LabelFontStrikethrough": "Durchgestrichen",
|
"LabelFontStrikethrough": "Durchgestrichen",
|
||||||
"LabelFormat": "Format",
|
"LabelFormat": "Format",
|
||||||
|
"LabelFull": "Voll",
|
||||||
"LabelGenre": "Kategorie",
|
"LabelGenre": "Kategorie",
|
||||||
"LabelGenres": "Kategorien",
|
"LabelGenres": "Kategorien",
|
||||||
"LabelHardDeleteFile": "Datei dauerhaft löschen",
|
"LabelHardDeleteFile": "Datei dauerhaft löschen",
|
||||||
@ -404,6 +416,10 @@
|
|||||||
"LabelLowestPriority": "Niedrigste Priorität",
|
"LabelLowestPriority": "Niedrigste Priorität",
|
||||||
"LabelMatchExistingUsersBy": "Zuordnen existierender Benutzer mit",
|
"LabelMatchExistingUsersBy": "Zuordnen existierender Benutzer mit",
|
||||||
"LabelMatchExistingUsersByDescription": "Wird zum Verbinden vorhandener Benutzer verwendet. Sobald die Verbindung hergestellt ist, wird den Benutzern eine eindeutige ID vom SSO-Anbieter zugeordnet",
|
"LabelMatchExistingUsersByDescription": "Wird zum Verbinden vorhandener Benutzer verwendet. Sobald die Verbindung hergestellt ist, wird den Benutzern eine eindeutige ID vom SSO-Anbieter zugeordnet",
|
||||||
|
"LabelMaxEpisodesToDownload": "Max. Anzahl an Episoden zum Herunterladen, 0 für unbegrenzte Episoden.",
|
||||||
|
"LabelMaxEpisodesToDownloadPerCheck": "Max. Anzahl neuer Episoden zum Herunterladen pro Abfrage",
|
||||||
|
"LabelMaxEpisodesToKeep": "Max. Anzahl zu behaltender Episoden",
|
||||||
|
"LabelMaxEpisodesToKeepHelp": "0 setzt keine Begrenzung. Wenn eine neue Episode automatisch heruntergeladen wird, wird die älteste Episode gelöscht, wenn du mehr als X Episoden gespeichert hast. Es wird nur eine Episode pro neuem Download gelöscht.",
|
||||||
"LabelMediaPlayer": "Mediaplayer",
|
"LabelMediaPlayer": "Mediaplayer",
|
||||||
"LabelMediaType": "Medientyp",
|
"LabelMediaType": "Medientyp",
|
||||||
"LabelMetaTag": "Meta Schlagwort",
|
"LabelMetaTag": "Meta Schlagwort",
|
||||||
@ -449,12 +465,14 @@
|
|||||||
"LabelOpenIDGroupClaimDescription": "Name des OpenID-Claims, der eine Liste der Benutzergruppen enthält. Wird häufig als <code>groups</code> bezeichnet. <b>Wenn konfiguriert</b>, wird die Anwendung automatisch Rollen basierend auf den Gruppenmitgliedschaften des Benutzers zuweisen, vorausgesetzt, dass diese Gruppen im Claim als 'admin', 'user' oder 'guest' benannt sind (Groß/Kleinschreibung ist irrelevant). Der Claim eine Liste sein, und wenn ein Benutzer mehreren Gruppen angehört, wird die Anwendung die Rolle zuordnen, die dem höchsten Zugriffslevel entspricht. Wenn keine Gruppe übereinstimmt, wird der Zugang verweigert.",
|
"LabelOpenIDGroupClaimDescription": "Name des OpenID-Claims, der eine Liste der Benutzergruppen enthält. Wird häufig als <code>groups</code> bezeichnet. <b>Wenn konfiguriert</b>, wird die Anwendung automatisch Rollen basierend auf den Gruppenmitgliedschaften des Benutzers zuweisen, vorausgesetzt, dass diese Gruppen im Claim als 'admin', 'user' oder 'guest' benannt sind (Groß/Kleinschreibung ist irrelevant). Der Claim eine Liste sein, und wenn ein Benutzer mehreren Gruppen angehört, wird die Anwendung die Rolle zuordnen, die dem höchsten Zugriffslevel entspricht. Wenn keine Gruppe übereinstimmt, wird der Zugang verweigert.",
|
||||||
"LabelOpenRSSFeed": "Öffne RSS-Feed",
|
"LabelOpenRSSFeed": "Öffne RSS-Feed",
|
||||||
"LabelOverwrite": "Überschreiben",
|
"LabelOverwrite": "Überschreiben",
|
||||||
|
"LabelPaginationPageXOfY": "Seite {0} von {1}",
|
||||||
"LabelPassword": "Passwort",
|
"LabelPassword": "Passwort",
|
||||||
"LabelPath": "Pfad",
|
"LabelPath": "Pfad",
|
||||||
"LabelPermanent": "Dauerhaft",
|
"LabelPermanent": "Dauerhaft",
|
||||||
"LabelPermissionsAccessAllLibraries": "Zugriff auf alle Bibliotheken",
|
"LabelPermissionsAccessAllLibraries": "Zugriff auf alle Bibliotheken",
|
||||||
"LabelPermissionsAccessAllTags": "Zugriff auf alle Schlagwörter",
|
"LabelPermissionsAccessAllTags": "Zugriff auf alle Schlagwörter",
|
||||||
"LabelPermissionsAccessExplicitContent": "Zugriff auf explizite (alterbeschränkte) Inhalte",
|
"LabelPermissionsAccessExplicitContent": "Zugriff auf explizite (alterbeschränkte) Inhalte",
|
||||||
|
"LabelPermissionsCreateEreader": "Kann E-Reader erstellen",
|
||||||
"LabelPermissionsDelete": "Darf Löschen",
|
"LabelPermissionsDelete": "Darf Löschen",
|
||||||
"LabelPermissionsDownload": "Herunterladen",
|
"LabelPermissionsDownload": "Herunterladen",
|
||||||
"LabelPermissionsUpdate": "Aktualisieren",
|
"LabelPermissionsUpdate": "Aktualisieren",
|
||||||
@ -499,12 +517,17 @@
|
|||||||
"LabelRedo": "Wiederholen",
|
"LabelRedo": "Wiederholen",
|
||||||
"LabelRegion": "Region",
|
"LabelRegion": "Region",
|
||||||
"LabelReleaseDate": "Veröffentlichungsdatum",
|
"LabelReleaseDate": "Veröffentlichungsdatum",
|
||||||
|
"LabelRemoveAllMetadataAbs": "Alle metadata.abs Dateien löschen",
|
||||||
|
"LabelRemoveAllMetadataJson": "Alle metadata.json Dateien löschen",
|
||||||
"LabelRemoveCover": "Entferne Titelbild",
|
"LabelRemoveCover": "Entferne Titelbild",
|
||||||
|
"LabelRemoveMetadataFile": "Metadaten-Dateien in Bibliotheksordnern löschen",
|
||||||
|
"LabelRemoveMetadataFileHelp": "Alle metadata.json und metadata.abs Dateien aus den Ordnern {0} löschen.",
|
||||||
"LabelRowsPerPage": "Zeilen pro Seite",
|
"LabelRowsPerPage": "Zeilen pro Seite",
|
||||||
"LabelSearchTerm": "Begriff suchen",
|
"LabelSearchTerm": "Begriff suchen",
|
||||||
"LabelSearchTitle": "Titel suchen",
|
"LabelSearchTitle": "Titel suchen",
|
||||||
"LabelSearchTitleOrASIN": "Titel oder ASIN suchen",
|
"LabelSearchTitleOrASIN": "Titel oder ASIN suchen",
|
||||||
"LabelSeason": "Staffel",
|
"LabelSeason": "Staffel",
|
||||||
|
"LabelSeasonNumber": "Staffel #{0}",
|
||||||
"LabelSelectAll": "Alles auswählen",
|
"LabelSelectAll": "Alles auswählen",
|
||||||
"LabelSelectAllEpisodes": "Alle Episoden auswählen",
|
"LabelSelectAllEpisodes": "Alle Episoden auswählen",
|
||||||
"LabelSelectEpisodesShowing": "{0} ausgewählte Episoden werden angezeigt",
|
"LabelSelectEpisodesShowing": "{0} ausgewählte Episoden werden angezeigt",
|
||||||
@ -539,6 +562,9 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "Serien, die nur ein einzelnes Buch enthalten, werden auf der Startseite und in der Serienansicht ausgeblendet.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Serien, die nur ein einzelnes Buch enthalten, werden auf der Startseite und in der Serienansicht ausgeblendet.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Startseite verwendet die Bücherregalansicht",
|
"LabelSettingsHomePageBookshelfView": "Startseite verwendet die Bücherregalansicht",
|
||||||
"LabelSettingsLibraryBookshelfView": "Bibliothek verwendet die Bücherregalansicht",
|
"LabelSettingsLibraryBookshelfView": "Bibliothek verwendet die Bücherregalansicht",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "In Prozent gehört größer als",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Verbleibende Zeit ist weniger als (Sekunden)",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedWhen": "Markiere Mediendateien als fertig, wenn",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Überspringe vorherige Bücher in fortführender Serie",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Überspringe vorherige Bücher in fortführender Serie",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Die Startseite von \"Fortführende Serien\" zeigt das erste noch nicht begonnene Buch in Serien an, die mindestens ein Buch abgeschlossen und keine Bücher begonnen haben. Wenn diese Einstellung aktiviert wird, werden Serien ab dem letzten abgeschlossenen Buch fortgesetzt und nicht ab dem ersten nicht begonnenen Buch.",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Die Startseite von \"Fortführende Serien\" zeigt das erste noch nicht begonnene Buch in Serien an, die mindestens ein Buch abgeschlossen und keine Bücher begonnen haben. Wenn diese Einstellung aktiviert wird, werden Serien ab dem letzten abgeschlossenen Buch fortgesetzt und nicht ab dem ersten nicht begonnenen Buch.",
|
||||||
"LabelSettingsParseSubtitles": "Analysiere Untertitel",
|
"LabelSettingsParseSubtitles": "Analysiere Untertitel",
|
||||||
@ -603,6 +629,7 @@
|
|||||||
"LabelTimeDurationXMinutes": "{0} Minuten",
|
"LabelTimeDurationXMinutes": "{0} Minuten",
|
||||||
"LabelTimeDurationXSeconds": "{0} Sekunden",
|
"LabelTimeDurationXSeconds": "{0} Sekunden",
|
||||||
"LabelTimeInMinutes": "Zeit in Minuten",
|
"LabelTimeInMinutes": "Zeit in Minuten",
|
||||||
|
"LabelTimeLeft": "{0} verbleibend",
|
||||||
"LabelTimeListened": "Gehörte Zeit",
|
"LabelTimeListened": "Gehörte Zeit",
|
||||||
"LabelTimeListenedToday": "Heute gehörte Zeit",
|
"LabelTimeListenedToday": "Heute gehörte Zeit",
|
||||||
"LabelTimeRemaining": "{0} verbleibend",
|
"LabelTimeRemaining": "{0} verbleibend",
|
||||||
@ -623,6 +650,7 @@
|
|||||||
"LabelTracksMultiTrack": "Mehrfachdatei",
|
"LabelTracksMultiTrack": "Mehrfachdatei",
|
||||||
"LabelTracksNone": "Keine Dateien",
|
"LabelTracksNone": "Keine Dateien",
|
||||||
"LabelTracksSingleTrack": "Einzeldatei",
|
"LabelTracksSingleTrack": "Einzeldatei",
|
||||||
|
"LabelTrailer": "Vorschau",
|
||||||
"LabelType": "Typ",
|
"LabelType": "Typ",
|
||||||
"LabelUnabridged": "Ungekürzt",
|
"LabelUnabridged": "Ungekürzt",
|
||||||
"LabelUndo": "Rückgängig machen",
|
"LabelUndo": "Rückgängig machen",
|
||||||
@ -639,6 +667,7 @@
|
|||||||
"LabelUseAdvancedOptions": "Nutze Erweiterte Optionen",
|
"LabelUseAdvancedOptions": "Nutze Erweiterte Optionen",
|
||||||
"LabelUseChapterTrack": "Kapiteldatei verwenden",
|
"LabelUseChapterTrack": "Kapiteldatei verwenden",
|
||||||
"LabelUseFullTrack": "Gesamte Datei verwenden",
|
"LabelUseFullTrack": "Gesamte Datei verwenden",
|
||||||
|
"LabelUseZeroForUnlimited": "0 für unbegrenzt",
|
||||||
"LabelUser": "Benutzer",
|
"LabelUser": "Benutzer",
|
||||||
"LabelUsername": "Benutzername",
|
"LabelUsername": "Benutzername",
|
||||||
"LabelValue": "Wert",
|
"LabelValue": "Wert",
|
||||||
@ -697,6 +726,7 @@
|
|||||||
"MessageConfirmPurgeCache": "Cache leeren wird das ganze Verzeichnis <code>/metadata/cache</code> löschen. <br /><br />Bist du dir sicher, dass das Cache Verzeichnis gelöscht werden soll?",
|
"MessageConfirmPurgeCache": "Cache leeren wird das ganze Verzeichnis <code>/metadata/cache</code> löschen. <br /><br />Bist du dir sicher, dass das Cache Verzeichnis gelöscht werden soll?",
|
||||||
"MessageConfirmPurgeItemsCache": "Durch Elementcache leeren wird das gesamte Verzeichnis unter <code>/metadata/cache/items</code> gelöscht.<br />Bist du dir sicher?",
|
"MessageConfirmPurgeItemsCache": "Durch Elementcache leeren wird das gesamte Verzeichnis unter <code>/metadata/cache/items</code> gelöscht.<br />Bist du dir sicher?",
|
||||||
"MessageConfirmQuickEmbed": "Warnung! Audiodateien werden bei der Schnelleinbettung nicht gesichert! Achte darauf, dass du eine Sicherungskopie der Audiodateien besitzt. <br><br>Möchtest du fortfahren?",
|
"MessageConfirmQuickEmbed": "Warnung! Audiodateien werden bei der Schnelleinbettung nicht gesichert! Achte darauf, dass du eine Sicherungskopie der Audiodateien besitzt. <br><br>Möchtest du fortfahren?",
|
||||||
|
"MessageConfirmQuickMatchEpisodes": "Schnelles Zuordnen von Episoden überschreibt die Details, wenn eine Übereinstimmung gefunden wird. Nur nicht zugeordnete Episoden werden aktualisiert. Bist du sicher?",
|
||||||
"MessageConfirmReScanLibraryItems": "{0} Elemente werden erneut gescannt! Bist du dir sicher?",
|
"MessageConfirmReScanLibraryItems": "{0} Elemente werden erneut gescannt! Bist du dir sicher?",
|
||||||
"MessageConfirmRemoveAllChapters": "Alle Kapitel werden entfernt! Bist du dir sicher?",
|
"MessageConfirmRemoveAllChapters": "Alle Kapitel werden entfernt! Bist du dir sicher?",
|
||||||
"MessageConfirmRemoveAuthor": "Autor \"{0}\" wird enfernt! Bist du dir sicher?",
|
"MessageConfirmRemoveAuthor": "Autor \"{0}\" wird enfernt! Bist du dir sicher?",
|
||||||
@ -704,6 +734,7 @@
|
|||||||
"MessageConfirmRemoveEpisode": "Episode \"{0}\" wird entfernt! Bist du dir sicher?",
|
"MessageConfirmRemoveEpisode": "Episode \"{0}\" wird entfernt! Bist du dir sicher?",
|
||||||
"MessageConfirmRemoveEpisodes": "{0} Episoden werden entfernt! Bist du dir sicher?",
|
"MessageConfirmRemoveEpisodes": "{0} Episoden werden entfernt! Bist du dir sicher?",
|
||||||
"MessageConfirmRemoveListeningSessions": "Bist du dir sicher, dass du {0} Hörsitzungen enfernen möchtest?",
|
"MessageConfirmRemoveListeningSessions": "Bist du dir sicher, dass du {0} Hörsitzungen enfernen möchtest?",
|
||||||
|
"MessageConfirmRemoveMetadataFiles": "Bist du sicher, dass du alle metadata.{0} Dateien in deinen Bibliotheksordnern löschen willst?",
|
||||||
"MessageConfirmRemoveNarrator": "Erzähler \"{0}\" wird entfernt! Bist du dir sicher?",
|
"MessageConfirmRemoveNarrator": "Erzähler \"{0}\" wird entfernt! Bist du dir sicher?",
|
||||||
"MessageConfirmRemovePlaylist": "Wiedergabeliste \"{0}\" wird entfernt! Bist du dir sicher?",
|
"MessageConfirmRemovePlaylist": "Wiedergabeliste \"{0}\" wird entfernt! Bist du dir sicher?",
|
||||||
"MessageConfirmRenameGenre": "Kategorie \"{0}\" in \"{1}\" für alle Hörbücher/Podcasts werden umbenannt! Bist du dir sicher?",
|
"MessageConfirmRenameGenre": "Kategorie \"{0}\" in \"{1}\" für alle Hörbücher/Podcasts werden umbenannt! Bist du dir sicher?",
|
||||||
@ -719,6 +750,7 @@
|
|||||||
"MessageDragFilesIntoTrackOrder": "Verschiebe die Dateien in die richtige Reihenfolge",
|
"MessageDragFilesIntoTrackOrder": "Verschiebe die Dateien in die richtige Reihenfolge",
|
||||||
"MessageEmbedFailed": "Einbetten fehlgeschlagen!",
|
"MessageEmbedFailed": "Einbetten fehlgeschlagen!",
|
||||||
"MessageEmbedFinished": "Einbettung abgeschlossen!",
|
"MessageEmbedFinished": "Einbettung abgeschlossen!",
|
||||||
|
"MessageEmbedQueue": "Eingereiht zum einbinden von Metadaten ({0} in Warteschlange)",
|
||||||
"MessageEpisodesQueuedForDownload": "{0} Episode(n) in der Warteschlange zum Herunterladen",
|
"MessageEpisodesQueuedForDownload": "{0} Episode(n) in der Warteschlange zum Herunterladen",
|
||||||
"MessageEreaderDevices": "Um die Zustellung von E-Büchern sicherzustellen, musst du eventuell die oben genannte E-Mail-Adresse als gültigen Absender für jedes unten aufgeführte Gerät hinzufügen.",
|
"MessageEreaderDevices": "Um die Zustellung von E-Büchern sicherzustellen, musst du eventuell die oben genannte E-Mail-Adresse als gültigen Absender für jedes unten aufgeführte Gerät hinzufügen.",
|
||||||
"MessageFeedURLWillBe": "Feed-URL wird {0} sein",
|
"MessageFeedURLWillBe": "Feed-URL wird {0} sein",
|
||||||
@ -780,6 +812,10 @@
|
|||||||
"MessagePlaylistCreateFromCollection": "Erstelle eine Wiedergabeliste aus der Sammlung",
|
"MessagePlaylistCreateFromCollection": "Erstelle eine Wiedergabeliste aus der Sammlung",
|
||||||
"MessagePleaseWait": "Bitte warten...",
|
"MessagePleaseWait": "Bitte warten...",
|
||||||
"MessagePodcastHasNoRSSFeedForMatching": "Der Podcast hat keine RSS-Feed-Url welche für den Online-Abgleich verwendet werden kann",
|
"MessagePodcastHasNoRSSFeedForMatching": "Der Podcast hat keine RSS-Feed-Url welche für den Online-Abgleich verwendet werden kann",
|
||||||
|
"MessagePodcastSearchField": "Suchbegriff oder RSS-Feed URL eingeben",
|
||||||
|
"MessageQuickEmbedInProgress": "Schnellabgleich läuft",
|
||||||
|
"MessageQuickEmbedQueue": "In Warteschlange für Schnelles einbinden ({0} eingereiht)",
|
||||||
|
"MessageQuickMatchAllEpisodes": "Quick Match aller Episoden",
|
||||||
"MessageQuickMatchDescription": "Füllt leere Details und Titelbilder mit dem ersten Treffer aus '{0}'. Überschreibt keine Details, es sei denn, die Server-Einstellung \"Passende Metadaten bevorzugen\" ist aktiviert.",
|
"MessageQuickMatchDescription": "Füllt leere Details und Titelbilder mit dem ersten Treffer aus '{0}'. Überschreibt keine Details, es sei denn, die Server-Einstellung \"Passende Metadaten bevorzugen\" ist aktiviert.",
|
||||||
"MessageRemoveChapter": "Kapitel entfernen",
|
"MessageRemoveChapter": "Kapitel entfernen",
|
||||||
"MessageRemoveEpisodes": "Entferne {0} Episode(n)",
|
"MessageRemoveEpisodes": "Entferne {0} Episode(n)",
|
||||||
@ -822,6 +858,9 @@
|
|||||||
"MessageTaskOpmlImportFeedPodcastExists": "Der Podcast ist bereits im Pfad vorhanden",
|
"MessageTaskOpmlImportFeedPodcastExists": "Der Podcast ist bereits im Pfad vorhanden",
|
||||||
"MessageTaskOpmlImportFeedPodcastFailed": "Erstellen des Podcasts fehlgeschlagen",
|
"MessageTaskOpmlImportFeedPodcastFailed": "Erstellen des Podcasts fehlgeschlagen",
|
||||||
"MessageTaskOpmlImportFinished": "{0} Podcasts hinzugefügt",
|
"MessageTaskOpmlImportFinished": "{0} Podcasts hinzugefügt",
|
||||||
|
"MessageTaskOpmlParseFailed": "Fehler beim lesen der OPML Datei",
|
||||||
|
"MessageTaskOpmlParseFastFail": "Ungültie OPML Datei: <opml> ODER <outline> tag wurde nicht gefunden",
|
||||||
|
"MessageTaskOpmlParseNoneFound": "Keine feeds in der OPML Datei gefunden",
|
||||||
"MessageTaskScanItemsAdded": "{0} hinzugefügt",
|
"MessageTaskScanItemsAdded": "{0} hinzugefügt",
|
||||||
"MessageTaskScanItemsMissing": "{0} fehlend",
|
"MessageTaskScanItemsMissing": "{0} fehlend",
|
||||||
"MessageTaskScanItemsUpdated": "{0} aktualisiert",
|
"MessageTaskScanItemsUpdated": "{0} aktualisiert",
|
||||||
@ -846,6 +885,10 @@
|
|||||||
"NoteUploaderFoldersWithMediaFiles": "Ordner mit Mediendateien werden als separate Bibliothekselemente behandelt.",
|
"NoteUploaderFoldersWithMediaFiles": "Ordner mit Mediendateien werden als separate Bibliothekselemente behandelt.",
|
||||||
"NoteUploaderOnlyAudioFiles": "Wenn du nur Audiodateien hochlädst, wird jede Audiodatei als ein separates Medium behandelt.",
|
"NoteUploaderOnlyAudioFiles": "Wenn du nur Audiodateien hochlädst, wird jede Audiodatei als ein separates Medium behandelt.",
|
||||||
"NoteUploaderUnsupportedFiles": "Nicht unterstützte Dateien werden ignoriert. Bei der Auswahl oder dem Löschen eines Ordners werden andere Dateien, die sich nicht in einem Elementordner befinden, ignoriert.",
|
"NoteUploaderUnsupportedFiles": "Nicht unterstützte Dateien werden ignoriert. Bei der Auswahl oder dem Löschen eines Ordners werden andere Dateien, die sich nicht in einem Elementordner befinden, ignoriert.",
|
||||||
|
"NotificationOnBackupCompletedDescription": "Wird ausgeführt wenn ein Backup erstellt wurde",
|
||||||
|
"NotificationOnBackupFailedDescription": "Wird ausgeführt wenn ein Backup fehlgeschlagen ist",
|
||||||
|
"NotificationOnEpisodeDownloadedDescription": "Wird ausgeführt wenn eine Podcast Folge automatisch heruntergeladen wird",
|
||||||
|
"NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird",
|
||||||
"PlaceholderNewCollection": "Neuer Sammlungsname",
|
"PlaceholderNewCollection": "Neuer Sammlungsname",
|
||||||
"PlaceholderNewFolderPath": "Neuer Ordnerpfad",
|
"PlaceholderNewFolderPath": "Neuer Ordnerpfad",
|
||||||
"PlaceholderNewPlaylist": "Neuer Wiedergabelistenname",
|
"PlaceholderNewPlaylist": "Neuer Wiedergabelistenname",
|
||||||
@ -871,6 +914,7 @@
|
|||||||
"StatsYearInReview": "DAS JAHR IM RÜCKBLICK",
|
"StatsYearInReview": "DAS JAHR IM RÜCKBLICK",
|
||||||
"ToastAccountUpdateSuccess": "Konto aktualisiert",
|
"ToastAccountUpdateSuccess": "Konto aktualisiert",
|
||||||
"ToastAppriseUrlRequired": "Eine Apprise-URL ist notwendig",
|
"ToastAppriseUrlRequired": "Eine Apprise-URL ist notwendig",
|
||||||
|
"ToastAsinRequired": "ASIN ist erforderlich",
|
||||||
"ToastAuthorImageRemoveSuccess": "Autorenbild entfernt",
|
"ToastAuthorImageRemoveSuccess": "Autorenbild entfernt",
|
||||||
"ToastAuthorNotFound": "Autor \"{0}\" nicht gefunden",
|
"ToastAuthorNotFound": "Autor \"{0}\" nicht gefunden",
|
||||||
"ToastAuthorRemoveSuccess": "Autor entfernt",
|
"ToastAuthorRemoveSuccess": "Autor entfernt",
|
||||||
@ -890,6 +934,8 @@
|
|||||||
"ToastBackupUploadSuccess": "Sicherung hochgeladen",
|
"ToastBackupUploadSuccess": "Sicherung hochgeladen",
|
||||||
"ToastBatchDeleteFailed": "Batch-Löschen fehlgeschlagen",
|
"ToastBatchDeleteFailed": "Batch-Löschen fehlgeschlagen",
|
||||||
"ToastBatchDeleteSuccess": "Batch-Löschung erfolgreich",
|
"ToastBatchDeleteSuccess": "Batch-Löschung erfolgreich",
|
||||||
|
"ToastBatchQuickMatchFailed": "Batch-Schnellabgleich fehlgeschlagen!",
|
||||||
|
"ToastBatchQuickMatchStarted": "Batch-Schnellabgleich für {0} Bücher gestartet!",
|
||||||
"ToastBatchUpdateFailed": "Stapelaktualisierung fehlgeschlagen",
|
"ToastBatchUpdateFailed": "Stapelaktualisierung fehlgeschlagen",
|
||||||
"ToastBatchUpdateSuccess": "Stapelaktualisierung erfolgreich",
|
"ToastBatchUpdateSuccess": "Stapelaktualisierung erfolgreich",
|
||||||
"ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden",
|
"ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden",
|
||||||
@ -901,6 +947,7 @@
|
|||||||
"ToastChaptersHaveErrors": "Kapitel sind fehlerhaft",
|
"ToastChaptersHaveErrors": "Kapitel sind fehlerhaft",
|
||||||
"ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen",
|
"ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen",
|
||||||
"ToastChaptersRemoved": "Kapitel entfernt",
|
"ToastChaptersRemoved": "Kapitel entfernt",
|
||||||
|
"ToastChaptersUpdated": "Kapitel aktualisiert",
|
||||||
"ToastCollectionItemsAddFailed": "Das Hinzufügen von Element(en) zur Sammlung ist fehlgeschlagen",
|
"ToastCollectionItemsAddFailed": "Das Hinzufügen von Element(en) zur Sammlung ist fehlgeschlagen",
|
||||||
"ToastCollectionItemsAddSuccess": "Element(e) erfolgreich zur Sammlung hinzugefügt",
|
"ToastCollectionItemsAddSuccess": "Element(e) erfolgreich zur Sammlung hinzugefügt",
|
||||||
"ToastCollectionItemsRemoveSuccess": "Medien aus der Sammlung entfernt",
|
"ToastCollectionItemsRemoveSuccess": "Medien aus der Sammlung entfernt",
|
||||||
@ -918,11 +965,14 @@
|
|||||||
"ToastEncodeCancelSucces": "Encoding abgebrochen",
|
"ToastEncodeCancelSucces": "Encoding abgebrochen",
|
||||||
"ToastEpisodeDownloadQueueClearFailed": "Warteschlange konnte nicht gelöscht werden",
|
"ToastEpisodeDownloadQueueClearFailed": "Warteschlange konnte nicht gelöscht werden",
|
||||||
"ToastEpisodeDownloadQueueClearSuccess": "Warteschlange für Episoden-Downloads gelöscht",
|
"ToastEpisodeDownloadQueueClearSuccess": "Warteschlange für Episoden-Downloads gelöscht",
|
||||||
|
"ToastEpisodeUpdateSuccess": "{0} Episoden aktualisiert",
|
||||||
"ToastErrorCannotShare": "Das kann nicht nativ auf diesem Gerät freigegeben werden",
|
"ToastErrorCannotShare": "Das kann nicht nativ auf diesem Gerät freigegeben werden",
|
||||||
"ToastFailedToLoadData": "Daten laden fehlgeschlagen",
|
"ToastFailedToLoadData": "Daten laden fehlgeschlagen",
|
||||||
|
"ToastFailedToMatch": "Fehler beim Abgleich",
|
||||||
"ToastFailedToShare": "Fehler beim Teilen",
|
"ToastFailedToShare": "Fehler beim Teilen",
|
||||||
"ToastFailedToUpdate": "Aktualisierung ist fehlgeschlagen",
|
"ToastFailedToUpdate": "Aktualisierung ist fehlgeschlagen",
|
||||||
"ToastInvalidImageUrl": "Ungültiger Bild URL",
|
"ToastInvalidImageUrl": "Ungültiger Bild URL",
|
||||||
|
"ToastInvalidMaxEpisodesToDownload": "Ungültige Max. Anzahl an Episoden zum Herunterladen",
|
||||||
"ToastInvalidUrl": "Ungültiger URL",
|
"ToastInvalidUrl": "Ungültiger URL",
|
||||||
"ToastItemCoverUpdateSuccess": "Titelbild aktualisiert",
|
"ToastItemCoverUpdateSuccess": "Titelbild aktualisiert",
|
||||||
"ToastItemDeletedFailed": "Fehler beim löschen des Artikels",
|
"ToastItemDeletedFailed": "Fehler beim löschen des Artikels",
|
||||||
@ -941,14 +991,21 @@
|
|||||||
"ToastLibraryScanStarted": "Bibliotheksscan gestartet",
|
"ToastLibraryScanStarted": "Bibliotheksscan gestartet",
|
||||||
"ToastLibraryUpdateSuccess": "Bibliothek \"{0}\" aktualisiert",
|
"ToastLibraryUpdateSuccess": "Bibliothek \"{0}\" aktualisiert",
|
||||||
"ToastMatchAllAuthorsFailed": "Nicht alle Autoren konnten zugeordnet werden",
|
"ToastMatchAllAuthorsFailed": "Nicht alle Autoren konnten zugeordnet werden",
|
||||||
|
"ToastMetadataFilesRemovedError": "Fehler beim löschen von metadata.{0} Dateien",
|
||||||
|
"ToastMetadataFilesRemovedNoneFound": "Keine metadata.{0} Dateien in Bibliothek gefunden",
|
||||||
|
"ToastMetadataFilesRemovedNoneRemoved": "Keine metadata.{0} Dateien gelöscht",
|
||||||
|
"ToastMetadataFilesRemovedSuccess": "{0} metadata.{1} Datei(en) gelöscht",
|
||||||
|
"ToastMustHaveAtLeastOnePath": "Es muss mindestens ein Pfad angegeben werden",
|
||||||
"ToastNameEmailRequired": "Name und E-Mail sind erforderlich",
|
"ToastNameEmailRequired": "Name und E-Mail sind erforderlich",
|
||||||
"ToastNameRequired": "Name ist erforderlich",
|
"ToastNameRequired": "Name ist erforderlich",
|
||||||
|
"ToastNewEpisodesFound": "{0} neue Episoden gefunden",
|
||||||
"ToastNewUserCreatedFailed": "Fehler beim erstellen des Accounts: \"{ 0}\"",
|
"ToastNewUserCreatedFailed": "Fehler beim erstellen des Accounts: \"{ 0}\"",
|
||||||
"ToastNewUserCreatedSuccess": "Neuer Account erstellt",
|
"ToastNewUserCreatedSuccess": "Neuer Account erstellt",
|
||||||
"ToastNewUserLibraryError": "Mindestens eine Bibliothek muss ausgewählt werden",
|
"ToastNewUserLibraryError": "Mindestens eine Bibliothek muss ausgewählt werden",
|
||||||
"ToastNewUserPasswordError": "Passwort erforderlich, nur der root Benutzer darf ein leeres Passwort haben",
|
"ToastNewUserPasswordError": "Passwort erforderlich, nur der root Benutzer darf ein leeres Passwort haben",
|
||||||
"ToastNewUserTagError": "Mindestens ein Tag muss ausgewählt sein",
|
"ToastNewUserTagError": "Mindestens ein Tag muss ausgewählt sein",
|
||||||
"ToastNewUserUsernameError": "Nutzername eingeben",
|
"ToastNewUserUsernameError": "Nutzername eingeben",
|
||||||
|
"ToastNoNewEpisodesFound": "Keine neuen Episoden gefunden",
|
||||||
"ToastNoUpdatesNecessary": "Keine Änderungen nötig",
|
"ToastNoUpdatesNecessary": "Keine Änderungen nötig",
|
||||||
"ToastNotificationCreateFailed": "Fehler beim erstellen der Benachrichtig",
|
"ToastNotificationCreateFailed": "Fehler beim erstellen der Benachrichtig",
|
||||||
"ToastNotificationDeleteFailed": "Fehler beim löschen der Benachrichtigung",
|
"ToastNotificationDeleteFailed": "Fehler beim löschen der Benachrichtigung",
|
||||||
@ -967,6 +1024,7 @@
|
|||||||
"ToastPodcastGetFeedFailed": "Fehler beim abrufen des Podcast Feeds",
|
"ToastPodcastGetFeedFailed": "Fehler beim abrufen des Podcast Feeds",
|
||||||
"ToastPodcastNoEpisodesInFeed": "Keine Episoden in RSS Feed gefunden",
|
"ToastPodcastNoEpisodesInFeed": "Keine Episoden in RSS Feed gefunden",
|
||||||
"ToastPodcastNoRssFeed": "Podcast enthält keinen RSS Feed",
|
"ToastPodcastNoRssFeed": "Podcast enthält keinen RSS Feed",
|
||||||
|
"ToastProgressIsNotBeingSynced": "Fortschritt wird nicht synchronisiert, Wiedergabe wird neu gestartet",
|
||||||
"ToastProviderCreatedFailed": "Fehler beim hinzufügen des Anbieters",
|
"ToastProviderCreatedFailed": "Fehler beim hinzufügen des Anbieters",
|
||||||
"ToastProviderCreatedSuccess": "Neuer Anbieter hinzugefügt",
|
"ToastProviderCreatedSuccess": "Neuer Anbieter hinzugefügt",
|
||||||
"ToastProviderNameAndUrlRequired": "Name und URL notwendig",
|
"ToastProviderNameAndUrlRequired": "Name und URL notwendig",
|
||||||
@ -993,6 +1051,7 @@
|
|||||||
"ToastSessionCloseFailed": "Fehler beim schließen der Sitzung",
|
"ToastSessionCloseFailed": "Fehler beim schließen der Sitzung",
|
||||||
"ToastSessionDeleteFailed": "Sitzung konnte nicht gelöscht werden",
|
"ToastSessionDeleteFailed": "Sitzung konnte nicht gelöscht werden",
|
||||||
"ToastSessionDeleteSuccess": "Sitzung gelöscht",
|
"ToastSessionDeleteSuccess": "Sitzung gelöscht",
|
||||||
|
"ToastSleepTimerDone": "Einschlaf-Timer aktiviert... zZzzZz",
|
||||||
"ToastSlugMustChange": "URL-Schlüssel enthält ungültige Zeichen",
|
"ToastSlugMustChange": "URL-Schlüssel enthält ungültige Zeichen",
|
||||||
"ToastSlugRequired": "URL-Schlüssel erforderlich",
|
"ToastSlugRequired": "URL-Schlüssel erforderlich",
|
||||||
"ToastSocketConnected": "Verbindung zum WebSocket hergestellt",
|
"ToastSocketConnected": "Verbindung zum WebSocket hergestellt",
|
||||||
|
@ -163,6 +163,7 @@
|
|||||||
"HeaderNotificationUpdate": "Update Notification",
|
"HeaderNotificationUpdate": "Update Notification",
|
||||||
"HeaderNotifications": "Notifications",
|
"HeaderNotifications": "Notifications",
|
||||||
"HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
|
"HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
|
||||||
|
"HeaderOpenListeningSessions": "Open Listening Sessions",
|
||||||
"HeaderOpenRSSFeed": "Open RSS Feed",
|
"HeaderOpenRSSFeed": "Open RSS Feed",
|
||||||
"HeaderOtherFiles": "Other Files",
|
"HeaderOtherFiles": "Other Files",
|
||||||
"HeaderPasswordAuthentication": "Password Authentication",
|
"HeaderPasswordAuthentication": "Password Authentication",
|
||||||
@ -226,6 +227,7 @@
|
|||||||
"LabelAllUsersExcludingGuests": "All users excluding guests",
|
"LabelAllUsersExcludingGuests": "All users excluding guests",
|
||||||
"LabelAllUsersIncludingGuests": "All users including guests",
|
"LabelAllUsersIncludingGuests": "All users including guests",
|
||||||
"LabelAlreadyInYourLibrary": "Already in your library",
|
"LabelAlreadyInYourLibrary": "Already in your library",
|
||||||
|
"LabelApiToken": "API Token",
|
||||||
"LabelAppend": "Append",
|
"LabelAppend": "Append",
|
||||||
"LabelAudioBitrate": "Audio Bitrate (e.g. 128k)",
|
"LabelAudioBitrate": "Audio Bitrate (e.g. 128k)",
|
||||||
"LabelAudioChannels": "Audio Channels (1 or 2)",
|
"LabelAudioChannels": "Audio Channels (1 or 2)",
|
||||||
@ -463,12 +465,14 @@
|
|||||||
"LabelOpenIDGroupClaimDescription": "Name of the OpenID claim that contains a list of the user's groups. Commonly referred to as <code>groups</code>. <b>If configured</b>, the application will automatically assign roles based on the user's group memberships, provided that these groups are named case-insensitively 'admin', 'user', or 'guest' in the claim. The claim should contain a list, and if a user belongs to multiple groups, the application will assign the role corresponding to the highest level of access. If no group matches, access will be denied.",
|
"LabelOpenIDGroupClaimDescription": "Name of the OpenID claim that contains a list of the user's groups. Commonly referred to as <code>groups</code>. <b>If configured</b>, the application will automatically assign roles based on the user's group memberships, provided that these groups are named case-insensitively 'admin', 'user', or 'guest' in the claim. The claim should contain a list, and if a user belongs to multiple groups, the application will assign the role corresponding to the highest level of access. If no group matches, access will be denied.",
|
||||||
"LabelOpenRSSFeed": "Open RSS Feed",
|
"LabelOpenRSSFeed": "Open RSS Feed",
|
||||||
"LabelOverwrite": "Overwrite",
|
"LabelOverwrite": "Overwrite",
|
||||||
|
"LabelPaginationPageXOfY": "Page {0} of {1}",
|
||||||
"LabelPassword": "Password",
|
"LabelPassword": "Password",
|
||||||
"LabelPath": "Path",
|
"LabelPath": "Path",
|
||||||
"LabelPermanent": "Permanent",
|
"LabelPermanent": "Permanent",
|
||||||
"LabelPermissionsAccessAllLibraries": "Can Access All Libraries",
|
"LabelPermissionsAccessAllLibraries": "Can Access All Libraries",
|
||||||
"LabelPermissionsAccessAllTags": "Can Access All Tags",
|
"LabelPermissionsAccessAllTags": "Can Access All Tags",
|
||||||
"LabelPermissionsAccessExplicitContent": "Can Access Explicit Content",
|
"LabelPermissionsAccessExplicitContent": "Can Access Explicit Content",
|
||||||
|
"LabelPermissionsCreateEreader": "Can Create Ereader",
|
||||||
"LabelPermissionsDelete": "Can Delete",
|
"LabelPermissionsDelete": "Can Delete",
|
||||||
"LabelPermissionsDownload": "Can Download",
|
"LabelPermissionsDownload": "Can Download",
|
||||||
"LabelPermissionsUpdate": "Can Update",
|
"LabelPermissionsUpdate": "Can Update",
|
||||||
@ -559,6 +563,9 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Home page use bookshelf view",
|
"LabelSettingsHomePageBookshelfView": "Home page use bookshelf view",
|
||||||
"LabelSettingsLibraryBookshelfView": "Library use bookshelf view",
|
"LabelSettingsLibraryBookshelfView": "Library use bookshelf view",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Percent complete is greater than",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Time remaining is less than (seconds)",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedWhen": "Mark media item as finished when",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Skip earlier books in Continue Series",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Skip earlier books in Continue Series",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "The Continue Series home page shelf shows the first book not started in series that have at least one book finished and no books in progress. Enabling this setting will continue series from the furthest completed book instead of the first book not started.",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "The Continue Series home page shelf shows the first book not started in series that have at least one book finished and no books in progress. Enabling this setting will continue series from the furthest completed book instead of the first book not started.",
|
||||||
"LabelSettingsParseSubtitles": "Parse subtitles",
|
"LabelSettingsParseSubtitles": "Parse subtitles",
|
||||||
|
@ -251,6 +251,7 @@
|
|||||||
"LabelBackupsNumberToKeep": "Numero de respaldos para conservar",
|
"LabelBackupsNumberToKeep": "Numero de respaldos para conservar",
|
||||||
"LabelBackupsNumberToKeepHelp": "Solamente 1 respaldo se removerá a la vez. Si tiene mas respaldos guardados, debe removerlos manualmente.",
|
"LabelBackupsNumberToKeepHelp": "Solamente 1 respaldo se removerá a la vez. Si tiene mas respaldos guardados, debe removerlos manualmente.",
|
||||||
"LabelBitrate": "Tasa de bits",
|
"LabelBitrate": "Tasa de bits",
|
||||||
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Libros",
|
"LabelBooks": "Libros",
|
||||||
"LabelButtonText": "Texto del botón",
|
"LabelButtonText": "Texto del botón",
|
||||||
"LabelByAuthor": "por {0}",
|
"LabelByAuthor": "por {0}",
|
||||||
@ -329,6 +330,7 @@
|
|||||||
"LabelEpisodeType": "Tipo de Episodio",
|
"LabelEpisodeType": "Tipo de Episodio",
|
||||||
"LabelEpisodeUrlFromRssFeed": "URL del episodio del feed RSS",
|
"LabelEpisodeUrlFromRssFeed": "URL del episodio del feed RSS",
|
||||||
"LabelEpisodes": "Episodios",
|
"LabelEpisodes": "Episodios",
|
||||||
|
"LabelEpisodic": "Episodios",
|
||||||
"LabelExample": "Ejemplo",
|
"LabelExample": "Ejemplo",
|
||||||
"LabelExpandSeries": "Ampliar serie",
|
"LabelExpandSeries": "Ampliar serie",
|
||||||
"LabelExpandSubSeries": "Expandir la subserie",
|
"LabelExpandSubSeries": "Expandir la subserie",
|
||||||
|
@ -250,11 +250,13 @@
|
|||||||
"LabelBackupsNumberToKeep": "Nombre de sauvegardes à conserver",
|
"LabelBackupsNumberToKeep": "Nombre de sauvegardes à conserver",
|
||||||
"LabelBackupsNumberToKeepHelp": "Seule une sauvegarde sera supprimée à la fois. Si vous avez déjà plus de sauvegardes à effacer, vous devez les supprimer manuellement.",
|
"LabelBackupsNumberToKeepHelp": "Seule une sauvegarde sera supprimée à la fois. Si vous avez déjà plus de sauvegardes à effacer, vous devez les supprimer manuellement.",
|
||||||
"LabelBitrate": "Débit binaire",
|
"LabelBitrate": "Débit binaire",
|
||||||
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Livres",
|
"LabelBooks": "Livres",
|
||||||
"LabelButtonText": "Texte du bouton",
|
"LabelButtonText": "Texte du bouton",
|
||||||
"LabelByAuthor": "par {0}",
|
"LabelByAuthor": "par {0}",
|
||||||
"LabelChangePassword": "Modifier le mot de passe",
|
"LabelChangePassword": "Modifier le mot de passe",
|
||||||
"LabelChannels": "Canaux",
|
"LabelChannels": "Canaux",
|
||||||
|
"LabelChapterCount": "{0} Chapitres",
|
||||||
"LabelChapterTitle": "Titre du chapitre",
|
"LabelChapterTitle": "Titre du chapitre",
|
||||||
"LabelChapters": "Chapitres",
|
"LabelChapters": "Chapitres",
|
||||||
"LabelChaptersFound": "chapitres trouvés",
|
"LabelChaptersFound": "chapitres trouvés",
|
||||||
|
@ -163,6 +163,7 @@
|
|||||||
"HeaderNotificationUpdate": "Ažuriraj obavijest",
|
"HeaderNotificationUpdate": "Ažuriraj obavijest",
|
||||||
"HeaderNotifications": "Obavijesti",
|
"HeaderNotifications": "Obavijesti",
|
||||||
"HeaderOpenIDConnectAuthentication": "Prijava na OpenID Connect",
|
"HeaderOpenIDConnectAuthentication": "Prijava na OpenID Connect",
|
||||||
|
"HeaderOpenListeningSessions": "Otvorene sesije slušanja",
|
||||||
"HeaderOpenRSSFeed": "Otvori RSS izvor",
|
"HeaderOpenRSSFeed": "Otvori RSS izvor",
|
||||||
"HeaderOtherFiles": "Druge datoteke",
|
"HeaderOtherFiles": "Druge datoteke",
|
||||||
"HeaderPasswordAuthentication": "Provjera autentičnosti zaporkom",
|
"HeaderPasswordAuthentication": "Provjera autentičnosti zaporkom",
|
||||||
@ -226,6 +227,7 @@
|
|||||||
"LabelAllUsersExcludingGuests": "Svi korisnici osim gostiju",
|
"LabelAllUsersExcludingGuests": "Svi korisnici osim gostiju",
|
||||||
"LabelAllUsersIncludingGuests": "Svi korisnici uključujući i goste",
|
"LabelAllUsersIncludingGuests": "Svi korisnici uključujući i goste",
|
||||||
"LabelAlreadyInYourLibrary": "Već u vašoj knjižnici",
|
"LabelAlreadyInYourLibrary": "Već u vašoj knjižnici",
|
||||||
|
"LabelApiToken": "API Token",
|
||||||
"LabelAppend": "Pridodaj",
|
"LabelAppend": "Pridodaj",
|
||||||
"LabelAudioBitrate": "Kvaliteta zvučnog zapisa (npr. 128k)",
|
"LabelAudioBitrate": "Kvaliteta zvučnog zapisa (npr. 128k)",
|
||||||
"LabelAudioChannels": "Broj zvučnih kanala (1 ili 2)",
|
"LabelAudioChannels": "Broj zvučnih kanala (1 ili 2)",
|
||||||
@ -252,9 +254,9 @@
|
|||||||
"LabelBackupsNumberToKeepHelp": "Moguće je izbrisati samo jednu po jednu sigurnosnu kopiju, ako ih već imate više trebat ćete ih ručno ukloniti.",
|
"LabelBackupsNumberToKeepHelp": "Moguće je izbrisati samo jednu po jednu sigurnosnu kopiju, ako ih već imate više trebat ćete ih ručno ukloniti.",
|
||||||
"LabelBitrate": "Protok",
|
"LabelBitrate": "Protok",
|
||||||
"LabelBonus": "Bonus",
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "knjiga/e",
|
"LabelBooks": "Knjige",
|
||||||
"LabelButtonText": "Tekst gumba",
|
"LabelButtonText": "Tekst gumba",
|
||||||
"LabelByAuthor": "po {0}",
|
"LabelByAuthor": "autor: {0}",
|
||||||
"LabelChangePassword": "Promijeni zaporku",
|
"LabelChangePassword": "Promijeni zaporku",
|
||||||
"LabelChannels": "Kanali",
|
"LabelChannels": "Kanali",
|
||||||
"LabelChapterCount": "{0} Poglavlje/a",
|
"LabelChapterCount": "{0} Poglavlje/a",
|
||||||
@ -268,7 +270,7 @@
|
|||||||
"LabelCollapseSeries": "Serijale prikaži sažeto",
|
"LabelCollapseSeries": "Serijale prikaži sažeto",
|
||||||
"LabelCollapseSubSeries": "Podserijale prikaži sažeto",
|
"LabelCollapseSubSeries": "Podserijale prikaži sažeto",
|
||||||
"LabelCollection": "Zbirka",
|
"LabelCollection": "Zbirka",
|
||||||
"LabelCollections": "Zbirka/i",
|
"LabelCollections": "Zbirke",
|
||||||
"LabelComplete": "Dovršeno",
|
"LabelComplete": "Dovršeno",
|
||||||
"LabelConfirmPassword": "Potvrda zaporke",
|
"LabelConfirmPassword": "Potvrda zaporke",
|
||||||
"LabelContinueListening": "Nastavi slušati",
|
"LabelContinueListening": "Nastavi slušati",
|
||||||
@ -358,6 +360,7 @@
|
|||||||
"LabelFontScale": "Veličina slova",
|
"LabelFontScale": "Veličina slova",
|
||||||
"LabelFontStrikethrough": "Precrtano",
|
"LabelFontStrikethrough": "Precrtano",
|
||||||
"LabelFormat": "Format",
|
"LabelFormat": "Format",
|
||||||
|
"LabelFull": "Cijeli",
|
||||||
"LabelGenre": "Žanr",
|
"LabelGenre": "Žanr",
|
||||||
"LabelGenres": "Žanrovi",
|
"LabelGenres": "Žanrovi",
|
||||||
"LabelHardDeleteFile": "Obriši datoteku zauvijek",
|
"LabelHardDeleteFile": "Obriši datoteku zauvijek",
|
||||||
@ -462,12 +465,14 @@
|
|||||||
"LabelOpenIDGroupClaimDescription": "Naziv OpenID zahtjeva koji sadrži popis korisnikovih grupa. Često se naziva <code>groups</code>. <b>Ako se konfigurira</b>, aplikacija će automatski dodijeliti uloge temeljem korisnikovih članstava u grupama, pod uvjetom da se iste zovu 'admin', 'user' ili 'guest' u zahtjevu (ne razlikuju se velika i mala slova). Zahtjev treba sadržavati popis i ako je korisnik član više grupa, aplikacija će dodijeliti ulogu koja odgovara najvišoj razini pristupa. Ukoliko se niti jedna grupa ne podudara, pristup će biti onemogućen.",
|
"LabelOpenIDGroupClaimDescription": "Naziv OpenID zahtjeva koji sadrži popis korisnikovih grupa. Često se naziva <code>groups</code>. <b>Ako se konfigurira</b>, aplikacija će automatski dodijeliti uloge temeljem korisnikovih članstava u grupama, pod uvjetom da se iste zovu 'admin', 'user' ili 'guest' u zahtjevu (ne razlikuju se velika i mala slova). Zahtjev treba sadržavati popis i ako je korisnik član više grupa, aplikacija će dodijeliti ulogu koja odgovara najvišoj razini pristupa. Ukoliko se niti jedna grupa ne podudara, pristup će biti onemogućen.",
|
||||||
"LabelOpenRSSFeed": "Otvori RSS Feed",
|
"LabelOpenRSSFeed": "Otvori RSS Feed",
|
||||||
"LabelOverwrite": "Prepiši",
|
"LabelOverwrite": "Prepiši",
|
||||||
|
"LabelPaginationPageXOfY": "Stranica {0} od {1}",
|
||||||
"LabelPassword": "Zaporka",
|
"LabelPassword": "Zaporka",
|
||||||
"LabelPath": "Putanja",
|
"LabelPath": "Putanja",
|
||||||
"LabelPermanent": "Trajno",
|
"LabelPermanent": "Trajno",
|
||||||
"LabelPermissionsAccessAllLibraries": "Ima pristup svim knjižnicama",
|
"LabelPermissionsAccessAllLibraries": "Ima pristup svim knjižnicama",
|
||||||
"LabelPermissionsAccessAllTags": "Ima pristup svim oznakama",
|
"LabelPermissionsAccessAllTags": "Ima pristup svim oznakama",
|
||||||
"LabelPermissionsAccessExplicitContent": "Ima pristup eksplicitnom sadržaju",
|
"LabelPermissionsAccessExplicitContent": "Ima pristup eksplicitnom sadržaju",
|
||||||
|
"LabelPermissionsCreateEreader": "Može stvoriti e-čitač",
|
||||||
"LabelPermissionsDelete": "Smije brisati",
|
"LabelPermissionsDelete": "Smije brisati",
|
||||||
"LabelPermissionsDownload": "Smije preuzimati",
|
"LabelPermissionsDownload": "Smije preuzimati",
|
||||||
"LabelPermissionsUpdate": "Smije ažurirati",
|
"LabelPermissionsUpdate": "Smije ažurirati",
|
||||||
@ -491,8 +496,8 @@
|
|||||||
"LabelPubDate": "Datum izdavanja",
|
"LabelPubDate": "Datum izdavanja",
|
||||||
"LabelPublishYear": "Godina objavljivanja",
|
"LabelPublishYear": "Godina objavljivanja",
|
||||||
"LabelPublishedDate": "Objavljeno {0}",
|
"LabelPublishedDate": "Objavljeno {0}",
|
||||||
"LabelPublishedDecade": "Desetljeće objavljivanja",
|
"LabelPublishedDecade": "Desetljeće izdanja",
|
||||||
"LabelPublishedDecades": "Desetljeća objavljivanja",
|
"LabelPublishedDecades": "Desetljeća izdanja",
|
||||||
"LabelPublisher": "Izdavač",
|
"LabelPublisher": "Izdavač",
|
||||||
"LabelPublishers": "Izdavači",
|
"LabelPublishers": "Izdavači",
|
||||||
"LabelRSSFeedCustomOwnerEmail": "Prilagođena adresa e-pošte vlasnika",
|
"LabelRSSFeedCustomOwnerEmail": "Prilagođena adresa e-pošte vlasnika",
|
||||||
@ -530,7 +535,7 @@
|
|||||||
"LabelSendEbookToDevice": "Pošalji e-knjigu",
|
"LabelSendEbookToDevice": "Pošalji e-knjigu",
|
||||||
"LabelSequence": "Slijed",
|
"LabelSequence": "Slijed",
|
||||||
"LabelSerial": "Serijal",
|
"LabelSerial": "Serijal",
|
||||||
"LabelSeries": "Serijal/a",
|
"LabelSeries": "Serijal",
|
||||||
"LabelSeriesName": "Ime serijala",
|
"LabelSeriesName": "Ime serijala",
|
||||||
"LabelSeriesProgress": "Napredak u serijalu",
|
"LabelSeriesProgress": "Napredak u serijalu",
|
||||||
"LabelServerLogLevel": "Razina zapisa poslužitelja",
|
"LabelServerLogLevel": "Razina zapisa poslužitelja",
|
||||||
@ -558,6 +563,9 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "Serijali koji se sastoje od samo jedne knjige neće se prikazivati na stranici serijala i na policama početne stranice.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Serijali koji se sastoje od samo jedne knjige neće se prikazivati na stranici serijala i na policama početne stranice.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Prikaži početnu stranicu kao policu s knjigama",
|
"LabelSettingsHomePageBookshelfView": "Prikaži početnu stranicu kao policu s knjigama",
|
||||||
"LabelSettingsLibraryBookshelfView": "Prikaži knjižnicu kao policu s knjigama",
|
"LabelSettingsLibraryBookshelfView": "Prikaži knjižnicu kao policu s knjigama",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Postotak dovršenosti veći od",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Preostalo vrijeme je manje od (sekundi)",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedWhen": "Označi medij dovršenim kada",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Preskoči ranije knjige u funkciji Nastavi serijal",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Preskoči ranije knjige u funkciji Nastavi serijal",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Na polici početne stranice Nastavi serijal prikazuje se prva nezapočeta knjiga serijala koji imaju barem jednu dovršenu knjigu i nijednu započetu knjigu. Ako uključite ovu opciju, serijal će vam se nastaviti od zadnje dovršene knjige umjesto od prve nezapočete knjige.",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Na polici početne stranice Nastavi serijal prikazuje se prva nezapočeta knjiga serijala koji imaju barem jednu dovršenu knjigu i nijednu započetu knjigu. Ako uključite ovu opciju, serijal će vam se nastaviti od zadnje dovršene knjige umjesto od prve nezapočete knjige.",
|
||||||
"LabelSettingsParseSubtitles": "Raščlani podnaslove",
|
"LabelSettingsParseSubtitles": "Raščlani podnaslove",
|
||||||
@ -639,7 +647,7 @@
|
|||||||
"LabelTotalTimeListened": "Sveukupno vrijeme slušanja",
|
"LabelTotalTimeListened": "Sveukupno vrijeme slušanja",
|
||||||
"LabelTrackFromFilename": "Naslov iz imena datoteke",
|
"LabelTrackFromFilename": "Naslov iz imena datoteke",
|
||||||
"LabelTrackFromMetadata": "Naslov iz meta-podataka",
|
"LabelTrackFromMetadata": "Naslov iz meta-podataka",
|
||||||
"LabelTracks": "Naslovi",
|
"LabelTracks": "Zvučni zapisi",
|
||||||
"LabelTracksMultiTrack": "Više zvučnih zapisa",
|
"LabelTracksMultiTrack": "Više zvučnih zapisa",
|
||||||
"LabelTracksNone": "Nema zapisa",
|
"LabelTracksNone": "Nema zapisa",
|
||||||
"LabelTracksSingleTrack": "Jedan zvučni zapis",
|
"LabelTracksSingleTrack": "Jedan zvučni zapis",
|
||||||
@ -740,7 +748,7 @@
|
|||||||
"MessageConfirmSendEbookToDevice": "Sigurno želite poslati {0} e-knjiga/u \"{1}\" na uređaj \"{2}\"?",
|
"MessageConfirmSendEbookToDevice": "Sigurno želite poslati {0} e-knjiga/u \"{1}\" na uređaj \"{2}\"?",
|
||||||
"MessageConfirmUnlinkOpenId": "Sigurno želite odspojiti ovog korisnika s OpenID-ja?",
|
"MessageConfirmUnlinkOpenId": "Sigurno želite odspojiti ovog korisnika s OpenID-ja?",
|
||||||
"MessageDownloadingEpisode": "Preuzimam nastavak",
|
"MessageDownloadingEpisode": "Preuzimam nastavak",
|
||||||
"MessageDragFilesIntoTrackOrder": "Ispravi redoslijed zapisa prevlačenje datoteka",
|
"MessageDragFilesIntoTrackOrder": "Prevlačenjem datoteka složite pravilan redoslijed",
|
||||||
"MessageEmbedFailed": "Ugrađivanje nije uspjelo!",
|
"MessageEmbedFailed": "Ugrađivanje nije uspjelo!",
|
||||||
"MessageEmbedFinished": "Ugrađivanje je dovršeno!",
|
"MessageEmbedFinished": "Ugrađivanje je dovršeno!",
|
||||||
"MessageEmbedQueue": "Ugrađivanje meta-podataka dodano u red obrade ({0} u redu)",
|
"MessageEmbedQueue": "Ugrađivanje meta-podataka dodano u red obrade ({0} u redu)",
|
||||||
|
@ -66,6 +66,7 @@
|
|||||||
"ButtonPurgeItemsCache": "Elemek gyorsítótárának törlése",
|
"ButtonPurgeItemsCache": "Elemek gyorsítótárának törlése",
|
||||||
"ButtonQueueAddItem": "Hozzáadás a sorhoz",
|
"ButtonQueueAddItem": "Hozzáadás a sorhoz",
|
||||||
"ButtonQueueRemoveItem": "Eltávolítás a sorból",
|
"ButtonQueueRemoveItem": "Eltávolítás a sorból",
|
||||||
|
"ButtonQuickEmbed": "Gyors beágyazás",
|
||||||
"ButtonQuickEmbedMetadata": "Metaadat gyors beágyazása",
|
"ButtonQuickEmbedMetadata": "Metaadat gyors beágyazása",
|
||||||
"ButtonQuickMatch": "Gyors egyeztetés",
|
"ButtonQuickMatch": "Gyors egyeztetés",
|
||||||
"ButtonReScan": "Újraszkennelés",
|
"ButtonReScan": "Újraszkennelés",
|
||||||
@ -343,7 +344,7 @@
|
|||||||
"LabelHasSupplementaryEbook": "Van kiegészítő e-könyve",
|
"LabelHasSupplementaryEbook": "Van kiegészítő e-könyve",
|
||||||
"LabelHideSubtitles": "Alcím elrejtése",
|
"LabelHideSubtitles": "Alcím elrejtése",
|
||||||
"LabelHighestPriority": "Legmagasabb prioritás",
|
"LabelHighestPriority": "Legmagasabb prioritás",
|
||||||
"LabelHost": "Házigazda",
|
"LabelHost": "Kiszolgáló",
|
||||||
"LabelHour": "Óra",
|
"LabelHour": "Óra",
|
||||||
"LabelHours": "Órák",
|
"LabelHours": "Órák",
|
||||||
"LabelIcon": "Ikon",
|
"LabelIcon": "Ikon",
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
"ButtonEditChapters": "Hoofdstukken wijzigen",
|
"ButtonEditChapters": "Hoofdstukken wijzigen",
|
||||||
"ButtonEditPodcast": "Podcast wijzigen",
|
"ButtonEditPodcast": "Podcast wijzigen",
|
||||||
"ButtonEnable": "Aanzetten",
|
"ButtonEnable": "Aanzetten",
|
||||||
|
"ButtonFireAndFail": "Fire and Fail",
|
||||||
|
"ButtonFireOnTest": "Fire onTest event",
|
||||||
"ButtonForceReScan": "Forceer nieuwe scan",
|
"ButtonForceReScan": "Forceer nieuwe scan",
|
||||||
"ButtonFullPath": "Volledig pad",
|
"ButtonFullPath": "Volledig pad",
|
||||||
"ButtonHide": "Verberg",
|
"ButtonHide": "Verberg",
|
||||||
@ -65,6 +67,7 @@
|
|||||||
"ButtonQueueAddItem": "In wachtrij zetten",
|
"ButtonQueueAddItem": "In wachtrij zetten",
|
||||||
"ButtonQueueRemoveItem": "Uit wachtrij verwijderen",
|
"ButtonQueueRemoveItem": "Uit wachtrij verwijderen",
|
||||||
"ButtonQuickEmbed": "Snel Embedden",
|
"ButtonQuickEmbed": "Snel Embedden",
|
||||||
|
"ButtonQuickEmbedMetadata": "Snel Metadata Insluiten",
|
||||||
"ButtonQuickMatch": "Snelle match",
|
"ButtonQuickMatch": "Snelle match",
|
||||||
"ButtonReScan": "Nieuwe scan",
|
"ButtonReScan": "Nieuwe scan",
|
||||||
"ButtonRead": "Lees",
|
"ButtonRead": "Lees",
|
||||||
@ -97,6 +100,8 @@
|
|||||||
"ButtonStats": "Statistieken",
|
"ButtonStats": "Statistieken",
|
||||||
"ButtonSubmit": "Indienen",
|
"ButtonSubmit": "Indienen",
|
||||||
"ButtonTest": "Testen",
|
"ButtonTest": "Testen",
|
||||||
|
"ButtonUnlinkOpenId": "OpenID Ontkoppelen",
|
||||||
|
"ButtonUpload": "Upload",
|
||||||
"ButtonUploadBackup": "Upload back-up",
|
"ButtonUploadBackup": "Upload back-up",
|
||||||
"ButtonUploadCover": "Upload cover",
|
"ButtonUploadCover": "Upload cover",
|
||||||
"ButtonUploadOPMLFile": "Upload OPML-bestand",
|
"ButtonUploadOPMLFile": "Upload OPML-bestand",
|
||||||
@ -108,10 +113,12 @@
|
|||||||
"ErrorUploadFetchMetadataNoResults": "Kan metadata niet ophalen - probeer de titel en/of auteur te updaten",
|
"ErrorUploadFetchMetadataNoResults": "Kan metadata niet ophalen - probeer de titel en/of auteur te updaten",
|
||||||
"ErrorUploadLacksTitle": "Moet een titel hebben",
|
"ErrorUploadLacksTitle": "Moet een titel hebben",
|
||||||
"HeaderAccount": "Account",
|
"HeaderAccount": "Account",
|
||||||
|
"HeaderAddCustomMetadataProvider": "Aangepaste Metadataprovider Toevoegen",
|
||||||
"HeaderAdvanced": "Geavanceerd",
|
"HeaderAdvanced": "Geavanceerd",
|
||||||
"HeaderAppriseNotificationSettings": "Apprise-notificatie instellingen",
|
"HeaderAppriseNotificationSettings": "Apprise-notificatie instellingen",
|
||||||
"HeaderAudioTracks": "Audiotracks",
|
"HeaderAudioTracks": "Audiotracks",
|
||||||
"HeaderAudiobookTools": "Audioboekbestandbeheer tools",
|
"HeaderAudiobookTools": "Audioboekbestandbeheer tools",
|
||||||
|
"HeaderAuthentication": "Authenticatie",
|
||||||
"HeaderBackups": "Back-ups",
|
"HeaderBackups": "Back-ups",
|
||||||
"HeaderChangePassword": "Wachtwoord wijzigen",
|
"HeaderChangePassword": "Wachtwoord wijzigen",
|
||||||
"HeaderChapters": "Hoofdstukken",
|
"HeaderChapters": "Hoofdstukken",
|
||||||
@ -120,6 +127,8 @@
|
|||||||
"HeaderCollectionItems": "Collectie-objecten",
|
"HeaderCollectionItems": "Collectie-objecten",
|
||||||
"HeaderCover": "Omslag",
|
"HeaderCover": "Omslag",
|
||||||
"HeaderCurrentDownloads": "Huidige downloads",
|
"HeaderCurrentDownloads": "Huidige downloads",
|
||||||
|
"HeaderCustomMessageOnLogin": "Aangepast Bericht bij Aanmelden",
|
||||||
|
"HeaderCustomMetadataProviders": "Aangepaste Metadata Providers",
|
||||||
"HeaderDetails": "Details",
|
"HeaderDetails": "Details",
|
||||||
"HeaderDownloadQueue": "Download-wachtrij",
|
"HeaderDownloadQueue": "Download-wachtrij",
|
||||||
"HeaderEbookFiles": "Ebook bestanden",
|
"HeaderEbookFiles": "Ebook bestanden",
|
||||||
@ -140,16 +149,27 @@
|
|||||||
"HeaderLibraryStats": "Bibliotheekstatistieken",
|
"HeaderLibraryStats": "Bibliotheekstatistieken",
|
||||||
"HeaderListeningSessions": "Luistersessies",
|
"HeaderListeningSessions": "Luistersessies",
|
||||||
"HeaderListeningStats": "Luisterstatistieken",
|
"HeaderListeningStats": "Luisterstatistieken",
|
||||||
|
"HeaderLogin": "Aanmelden",
|
||||||
|
"HeaderLogs": "Logboek",
|
||||||
"HeaderManageGenres": "Genres beheren",
|
"HeaderManageGenres": "Genres beheren",
|
||||||
"HeaderManageTags": "Tags beheren",
|
"HeaderManageTags": "Tags beheren",
|
||||||
|
"HeaderMapDetails": "Map details",
|
||||||
|
"HeaderMatch": "Vergelijken",
|
||||||
|
"HeaderMetadataOrderOfPrecedence": "Metadata volgorde",
|
||||||
"HeaderMetadataToEmbed": "In te sluiten metadata",
|
"HeaderMetadataToEmbed": "In te sluiten metadata",
|
||||||
"HeaderNewAccount": "Nieuwe account",
|
"HeaderNewAccount": "Nieuwe account",
|
||||||
"HeaderNewLibrary": "Nieuwe bibliotheek",
|
"HeaderNewLibrary": "Nieuwe bibliotheek",
|
||||||
|
"HeaderNotificationCreate": "Notificatie Aanmaken",
|
||||||
|
"HeaderNotificationUpdate": "Update Notificatie",
|
||||||
"HeaderNotifications": "Notificaties",
|
"HeaderNotifications": "Notificaties",
|
||||||
|
"HeaderOpenIDConnectAuthentication": "OpenID Connect Authenticatie",
|
||||||
|
"HeaderOpenListeningSessions": "Open Luistersessies",
|
||||||
"HeaderOpenRSSFeed": "Open RSS-feed",
|
"HeaderOpenRSSFeed": "Open RSS-feed",
|
||||||
"HeaderOtherFiles": "Andere bestanden",
|
"HeaderOtherFiles": "Andere bestanden",
|
||||||
|
"HeaderPasswordAuthentication": "Wachtwoord Authenticatie",
|
||||||
"HeaderPermissions": "Toestemmingen",
|
"HeaderPermissions": "Toestemmingen",
|
||||||
"HeaderPlayerQueue": "Afspeelwachtrij",
|
"HeaderPlayerQueue": "Afspeelwachtrij",
|
||||||
|
"HeaderPlayerSettings": "Speler Instellingen",
|
||||||
"HeaderPlaylist": "Afspeellijst",
|
"HeaderPlaylist": "Afspeellijst",
|
||||||
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
||||||
"HeaderPodcastsToAdd": "Toe te voegen podcasts",
|
"HeaderPodcastsToAdd": "Toe te voegen podcasts",
|
||||||
@ -161,6 +181,7 @@
|
|||||||
"HeaderRemoveEpisodes": "Verwijder {0} afleveringen",
|
"HeaderRemoveEpisodes": "Verwijder {0} afleveringen",
|
||||||
"HeaderSavedMediaProgress": "Opgeslagen mediavoortgang",
|
"HeaderSavedMediaProgress": "Opgeslagen mediavoortgang",
|
||||||
"HeaderSchedule": "Schema",
|
"HeaderSchedule": "Schema",
|
||||||
|
"HeaderScheduleEpisodeDownloads": "Automatische afleveringsdownloads plannen",
|
||||||
"HeaderScheduleLibraryScans": "Schema automatische bibliotheekscans",
|
"HeaderScheduleLibraryScans": "Schema automatische bibliotheekscans",
|
||||||
"HeaderSession": "Sessie",
|
"HeaderSession": "Sessie",
|
||||||
"HeaderSetBackupSchedule": "Kies schema voor back-up",
|
"HeaderSetBackupSchedule": "Kies schema voor back-up",
|
||||||
@ -168,6 +189,7 @@
|
|||||||
"HeaderSettingsDisplay": "Toon",
|
"HeaderSettingsDisplay": "Toon",
|
||||||
"HeaderSettingsExperimental": "Experimentele functies",
|
"HeaderSettingsExperimental": "Experimentele functies",
|
||||||
"HeaderSettingsGeneral": "Algemeen",
|
"HeaderSettingsGeneral": "Algemeen",
|
||||||
|
"HeaderSettingsScanner": "Scanner",
|
||||||
"HeaderSleepTimer": "Slaaptimer",
|
"HeaderSleepTimer": "Slaaptimer",
|
||||||
"HeaderStatsLargestItems": "Grootste items",
|
"HeaderStatsLargestItems": "Grootste items",
|
||||||
"HeaderStatsLongestItems": "Langste items (uren)",
|
"HeaderStatsLongestItems": "Langste items (uren)",
|
||||||
@ -176,13 +198,18 @@
|
|||||||
"HeaderStatsTop10Authors": "Top 10 auteurs",
|
"HeaderStatsTop10Authors": "Top 10 auteurs",
|
||||||
"HeaderStatsTop5Genres": "Top 5 genres",
|
"HeaderStatsTop5Genres": "Top 5 genres",
|
||||||
"HeaderTableOfContents": "Inhoudsopgave",
|
"HeaderTableOfContents": "Inhoudsopgave",
|
||||||
|
"HeaderTools": "Gereedschap",
|
||||||
"HeaderUpdateAccount": "Account bijwerken",
|
"HeaderUpdateAccount": "Account bijwerken",
|
||||||
"HeaderUpdateAuthor": "Auteur bijwerken",
|
"HeaderUpdateAuthor": "Auteur bijwerken",
|
||||||
"HeaderUpdateDetails": "Details bijwerken",
|
"HeaderUpdateDetails": "Details bijwerken",
|
||||||
"HeaderUpdateLibrary": "Bibliotheek bijwerken",
|
"HeaderUpdateLibrary": "Bibliotheek bijwerken",
|
||||||
"HeaderUsers": "Gebruikers",
|
"HeaderUsers": "Gebruikers",
|
||||||
|
"HeaderYearReview": "Jaar {0} in Review",
|
||||||
"HeaderYourStats": "Je statistieken",
|
"HeaderYourStats": "Je statistieken",
|
||||||
"LabelAbridged": "Verkort",
|
"LabelAbridged": "Verkort",
|
||||||
|
"LabelAbridgedChecked": "Verkort (gechecked)",
|
||||||
|
"LabelAbridgedUnchecked": "Onverkort (niet gechecked)",
|
||||||
|
"LabelAccessibleBy": "Toegankelijk door",
|
||||||
"LabelAccountType": "Accounttype",
|
"LabelAccountType": "Accounttype",
|
||||||
"LabelAccountTypeAdmin": "Beheerder",
|
"LabelAccountTypeAdmin": "Beheerder",
|
||||||
"LabelAccountTypeGuest": "Gast",
|
"LabelAccountTypeGuest": "Gast",
|
||||||
@ -193,32 +220,55 @@
|
|||||||
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
|
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
|
||||||
"LabelAddToPlaylistBatch": "{0} onderdelen toevoegen aan afspeellijst",
|
"LabelAddToPlaylistBatch": "{0} onderdelen toevoegen aan afspeellijst",
|
||||||
"LabelAddedAt": "Toegevoegd op",
|
"LabelAddedAt": "Toegevoegd op",
|
||||||
|
"LabelAddedDate": "Toegevoegd {0}",
|
||||||
|
"LabelAdminUsersOnly": "Enkel Admin gebruikers",
|
||||||
"LabelAll": "Alle",
|
"LabelAll": "Alle",
|
||||||
"LabelAllUsers": "Alle gebruikers",
|
"LabelAllUsers": "Alle gebruikers",
|
||||||
|
"LabelAllUsersExcludingGuests": "Alle gebruikers exclusief gasten",
|
||||||
|
"LabelAllUsersIncludingGuests": "Alle gebruikers inclusief gasten",
|
||||||
"LabelAlreadyInYourLibrary": "Reeds in je bibliotheek",
|
"LabelAlreadyInYourLibrary": "Reeds in je bibliotheek",
|
||||||
|
"LabelApiToken": "API Token",
|
||||||
"LabelAppend": "Achteraan toevoegen",
|
"LabelAppend": "Achteraan toevoegen",
|
||||||
|
"LabelAudioBitrate": "Audio Bitrate (b.v. 128k)",
|
||||||
|
"LabelAudioChannels": "Audio Kanalen (1 of 2)",
|
||||||
|
"LabelAudioCodec": "Audio Codec",
|
||||||
"LabelAuthor": "Auteur",
|
"LabelAuthor": "Auteur",
|
||||||
"LabelAuthorFirstLast": "Auteur (Voornaam Achternaam)",
|
"LabelAuthorFirstLast": "Auteur (Voornaam Achternaam)",
|
||||||
"LabelAuthorLastFirst": "Auteur (Achternaam, Voornaam)",
|
"LabelAuthorLastFirst": "Auteur (Achternaam, Voornaam)",
|
||||||
"LabelAuthors": "Auteurs",
|
"LabelAuthors": "Auteurs",
|
||||||
"LabelAutoDownloadEpisodes": "Afleveringen automatisch downloaden",
|
"LabelAutoDownloadEpisodes": "Afleveringen automatisch downloaden",
|
||||||
|
"LabelAutoFetchMetadata": "Automatisch Metadata Ophalen",
|
||||||
|
"LabelAutoFetchMetadataHelp": "Haalt metadata op voor titel, auteur en serie om het uploaden te stroomlijnen. Aanvullende metadata moet mogelijk worden gematcht na het uploaden.",
|
||||||
|
"LabelAutoLaunch": "Automatisch Openen",
|
||||||
|
"LabelAutoLaunchDescription": "Automatisch doorverwijzen naar de auth-provider bij het navigeren naar de inlogpagina (handmatig pad <code>/login?autoLaunch=0</code>)",
|
||||||
|
"LabelAutoRegister": "Automatisch Registreren",
|
||||||
|
"LabelAutoRegisterDescription": "Automatisch nieuwe gebruikers aanmaken na inloggen",
|
||||||
"LabelBackToUser": "Terug naar gebruiker",
|
"LabelBackToUser": "Terug naar gebruiker",
|
||||||
|
"LabelBackupAudioFiles": "Back-up audiobestanden",
|
||||||
"LabelBackupLocation": "Back-up locatie",
|
"LabelBackupLocation": "Back-up locatie",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Automatische back-ups inschakelen",
|
"LabelBackupsEnableAutomaticBackups": "Automatische back-ups inschakelen",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Back-ups opgeslagen in /metadata/backups",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Back-ups opgeslagen in /metadata/backups",
|
||||||
"LabelBackupsMaxBackupSize": "Maximale back-up-grootte (in GB)",
|
"LabelBackupsMaxBackupSize": "Maximale back-up-grootte (in GB) (0 voor ongelimiteerd)",
|
||||||
"LabelBackupsMaxBackupSizeHelp": "Als een beveiliging tegen verkeerde instelling, zullen back-up mislukken als ze de ingestelde grootte overschrijden.",
|
"LabelBackupsMaxBackupSizeHelp": "Als een beveiliging tegen verkeerde instelling, zullen back-up mislukken als ze de ingestelde grootte overschrijden.",
|
||||||
"LabelBackupsNumberToKeep": "Aantal te bewaren back-ups",
|
"LabelBackupsNumberToKeep": "Aantal te bewaren back-ups",
|
||||||
"LabelBackupsNumberToKeepHelp": "Er wordt slechts 1 back-up per keer verwijderd, dus als je reeds meer back-ups dan dit hebt moet je ze handmatig verwijderen.",
|
"LabelBackupsNumberToKeepHelp": "Er wordt slechts 1 back-up per keer verwijderd, dus als je reeds meer back-ups dan dit hebt moet je ze handmatig verwijderen.",
|
||||||
|
"LabelBitrate": "Bitrate",
|
||||||
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Boeken",
|
"LabelBooks": "Boeken",
|
||||||
|
"LabelButtonText": "Knop Tekst",
|
||||||
|
"LabelByAuthor": "Door {0}",
|
||||||
"LabelChangePassword": "Wachtwoord wijzigen",
|
"LabelChangePassword": "Wachtwoord wijzigen",
|
||||||
"LabelChannels": "Kanalen",
|
"LabelChannels": "Kanalen",
|
||||||
|
"LabelChapterCount": "{0} Hoofdstukken",
|
||||||
"LabelChapterTitle": "Hoofdstuktitel",
|
"LabelChapterTitle": "Hoofdstuktitel",
|
||||||
"LabelChapters": "Hoofdstukken",
|
"LabelChapters": "Hoofdstukken",
|
||||||
"LabelChaptersFound": "Hoofdstukken gevonden",
|
"LabelChaptersFound": "Hoofdstukken gevonden",
|
||||||
"LabelClickForMoreInfo": "Klik voor meer informatie",
|
"LabelClickForMoreInfo": "Klik voor meer informatie",
|
||||||
|
"LabelClickToUseCurrentValue": "Klik om huidige waarde te gebruiken",
|
||||||
"LabelClosePlayer": "Sluit speler",
|
"LabelClosePlayer": "Sluit speler",
|
||||||
|
"LabelCodec": "Codec",
|
||||||
"LabelCollapseSeries": "Series inklappen",
|
"LabelCollapseSeries": "Series inklappen",
|
||||||
|
"LabelCollapseSubSeries": "Subserie samenvouwen",
|
||||||
"LabelCollection": "Collectie",
|
"LabelCollection": "Collectie",
|
||||||
"LabelCollections": "Collecties",
|
"LabelCollections": "Collecties",
|
||||||
"LabelComplete": "Compleet",
|
"LabelComplete": "Compleet",
|
||||||
@ -226,6 +276,7 @@
|
|||||||
"LabelContinueListening": "Verder Luisteren",
|
"LabelContinueListening": "Verder Luisteren",
|
||||||
"LabelContinueReading": "Verder lezen",
|
"LabelContinueReading": "Verder lezen",
|
||||||
"LabelContinueSeries": "Doorgaan met Serie",
|
"LabelContinueSeries": "Doorgaan met Serie",
|
||||||
|
"LabelCover": "Omslag",
|
||||||
"LabelCoverImageURL": "Coverafbeelding URL",
|
"LabelCoverImageURL": "Coverafbeelding URL",
|
||||||
"LabelCreatedAt": "Gecreëerd op",
|
"LabelCreatedAt": "Gecreëerd op",
|
||||||
"LabelCronExpression": "Cron-uitdrukking",
|
"LabelCronExpression": "Cron-uitdrukking",
|
||||||
@ -234,38 +285,68 @@
|
|||||||
"LabelCustomCronExpression": "Aangepaste Cron-uitdrukking:",
|
"LabelCustomCronExpression": "Aangepaste Cron-uitdrukking:",
|
||||||
"LabelDatetime": "Datum-tijd",
|
"LabelDatetime": "Datum-tijd",
|
||||||
"LabelDays": "Dagen",
|
"LabelDays": "Dagen",
|
||||||
|
"LabelDeleteFromFileSystemCheckbox": "Verwijderen uit bestandssysteem (uncheck om alleen uit database te verwijderen)",
|
||||||
"LabelDescription": "Beschrijving",
|
"LabelDescription": "Beschrijving",
|
||||||
"LabelDeselectAll": "Deselecteer alle",
|
"LabelDeselectAll": "Deselecteer alle",
|
||||||
"LabelDevice": "Apparaat",
|
"LabelDevice": "Apparaat",
|
||||||
"LabelDeviceInfo": "Apparaat info",
|
"LabelDeviceInfo": "Apparaat info",
|
||||||
|
"LabelDeviceIsAvailableTo": "Apparaat is beschikbaar voor...",
|
||||||
"LabelDirectory": "Map",
|
"LabelDirectory": "Map",
|
||||||
"LabelDiscFromFilename": "Schijf uit bestandsnaam",
|
"LabelDiscFromFilename": "Schijf uit bestandsnaam",
|
||||||
"LabelDiscFromMetadata": "Schijf uit metadata",
|
"LabelDiscFromMetadata": "Schijf uit metadata",
|
||||||
"LabelDiscover": "Ontdekken",
|
"LabelDiscover": "Ontdekken",
|
||||||
"LabelDownload": "Download",
|
"LabelDownload": "Download",
|
||||||
|
"LabelDownloadNEpisodes": "Download {0} afleveringen",
|
||||||
"LabelDuration": "Duur",
|
"LabelDuration": "Duur",
|
||||||
|
"LabelDurationComparisonExactMatch": "(exacte overeenkomst)",
|
||||||
|
"LabelDurationComparisonLonger": "({0} langer)",
|
||||||
|
"LabelDurationComparisonShorter": "({0} korter)",
|
||||||
"LabelDurationFound": "Gevonden duur:",
|
"LabelDurationFound": "Gevonden duur:",
|
||||||
"LabelEbook": "Ebook",
|
"LabelEbook": "Ebook",
|
||||||
"LabelEbooks": "Eboeken",
|
"LabelEbooks": "Eboeken",
|
||||||
"LabelEdit": "Wijzig",
|
"LabelEdit": "Wijzig",
|
||||||
|
"LabelEmail": "Email",
|
||||||
"LabelEmailSettingsFromAddress": "Van-adres",
|
"LabelEmailSettingsFromAddress": "Van-adres",
|
||||||
|
"LabelEmailSettingsRejectUnauthorized": "Ongeautoriseerde certificaten afwijzen",
|
||||||
|
"LabelEmailSettingsRejectUnauthorizedHelp": "Het uitschakelen van SSL-certificaatvalidatie kan uw verbinding blootstellen aan beveiligingsrisico's, zoals man-in-the-middle-aanvallen. Schakel deze optie alleen uit als u de implicaties begrijpt en de mailserver waarmee u verbinding maakt vertrouwt.",
|
||||||
"LabelEmailSettingsSecure": "Veilig",
|
"LabelEmailSettingsSecure": "Veilig",
|
||||||
"LabelEmailSettingsSecureHelp": "Als 'waar', dan gebruikt de verbinding TLS om met de server te verbinden. Als 'onwaar', dan wordt TLS gebruikt als de server de STARTTLS-extensie ondersteunt. In de meeste gevallen kies je voor 'waar' verbindt met poort 465. Voo poort 587 of 25, laat op 'onwaar'. (van nodemailer.com/smtp/#authentication)",
|
"LabelEmailSettingsSecureHelp": "Als 'waar', dan gebruikt de verbinding TLS om met de server te verbinden. Als 'onwaar', dan wordt TLS gebruikt als de server de STARTTLS-extensie ondersteunt. In de meeste gevallen kies je voor 'waar' verbindt met poort 465. Voo poort 587 of 25, laat op 'onwaar'. (van nodemailer.com/smtp/#authentication)",
|
||||||
"LabelEmailSettingsTestAddress": "Test-adres",
|
"LabelEmailSettingsTestAddress": "Test-adres",
|
||||||
"LabelEmbeddedCover": "Ingesloten cover",
|
"LabelEmbeddedCover": "Ingesloten cover",
|
||||||
"LabelEnable": "Inschakelen",
|
"LabelEnable": "Inschakelen",
|
||||||
|
"LabelEncodingBackupLocation": "Er wordt een back-up van uw originele audiobestanden opgeslagen in:",
|
||||||
|
"LabelEncodingChaptersNotEmbedded": "Hoofdstukken zijn niet ingesloten in audioboeken met meerdere sporen.",
|
||||||
|
"LabelEncodingClearItemCache": "Zorg ervoor dat u de cache van items regelmatig wist.",
|
||||||
|
"LabelEncodingFinishedM4B": "Een voltooide M4B wordt in uw audioboekfolder geplaatst in:",
|
||||||
|
"LabelEncodingInfoEmbedded": "Metagegevens worden ingesloten in de audiotracks in uw audioboekmap.",
|
||||||
|
"LabelEncodingStartedNavigation": "Eenmaal de taak is gestart kan u weg navigeren van deze pagina.",
|
||||||
|
"LabelEncodingTimeWarning": "Encoding kan tot 30 minuten duren.",
|
||||||
|
"LabelEncodingWarningAdvancedSettings": "Waarschuwing: update deze instellingen niet tenzij u bekend bent met de coderingsopties van ffmpeg.",
|
||||||
|
"LabelEncodingWatcherDisabled": "Als u de watcher hebt uitgeschakeld, moet u het audioboek daarna opnieuw scannen.",
|
||||||
"LabelEnd": "Einde",
|
"LabelEnd": "Einde",
|
||||||
"LabelEndOfChapter": "Einde van het Hoofdstuk",
|
"LabelEndOfChapter": "Einde van het Hoofdstuk",
|
||||||
"LabelEpisode": "Aflevering",
|
"LabelEpisode": "Aflevering",
|
||||||
|
"LabelEpisodeNotLinkedToRssFeed": "Aflevering niet gelinkt aan RSS feed",
|
||||||
|
"LabelEpisodeNumber": "Aflevering #{0}",
|
||||||
"LabelEpisodeTitle": "Afleveringtitel",
|
"LabelEpisodeTitle": "Afleveringtitel",
|
||||||
"LabelEpisodeType": "Afleveringtype",
|
"LabelEpisodeType": "Afleveringtype",
|
||||||
|
"LabelEpisodeUrlFromRssFeed": "Aflevering URL van RSS feed",
|
||||||
|
"LabelEpisodes": "Afleveringen",
|
||||||
|
"LabelEpisodic": "Episodisch",
|
||||||
"LabelExample": "Voorbeeld",
|
"LabelExample": "Voorbeeld",
|
||||||
|
"LabelExpandSeries": "Serie Uitvouwen",
|
||||||
|
"LabelExpandSubSeries": "Subserie Uitvouwen",
|
||||||
"LabelExplicit": "Expliciet",
|
"LabelExplicit": "Expliciet",
|
||||||
|
"LabelExplicitChecked": "Expliciet (gechecked)",
|
||||||
|
"LabelExplicitUnchecked": "Niet Expliciet (niet gechecked)",
|
||||||
|
"LabelExportOPML": "OPML exporteren",
|
||||||
"LabelFeedURL": "Feed URL",
|
"LabelFeedURL": "Feed URL",
|
||||||
"LabelFetchingMetadata": "Metadata ophalen",
|
"LabelFetchingMetadata": "Metadata ophalen",
|
||||||
"LabelFile": "Bestand",
|
"LabelFile": "Bestand",
|
||||||
"LabelFileBirthtime": "Aanmaaktijd bestand",
|
"LabelFileBirthtime": "Aanmaaktijd bestand",
|
||||||
|
"LabelFileBornDate": "Geboren {0}",
|
||||||
"LabelFileModified": "Bestand gewijzigd",
|
"LabelFileModified": "Bestand gewijzigd",
|
||||||
|
"LabelFileModifiedDate": "Gewijzigd {0}",
|
||||||
"LabelFilename": "Bestandsnaam",
|
"LabelFilename": "Bestandsnaam",
|
||||||
"LabelFilterByUser": "Filter op gebruiker",
|
"LabelFilterByUser": "Filter op gebruiker",
|
||||||
"LabelFindEpisodes": "Zoek afleveringen",
|
"LabelFindEpisodes": "Zoek afleveringen",
|
||||||
@ -275,20 +356,27 @@
|
|||||||
"LabelFontBold": "Vetgedrukt",
|
"LabelFontBold": "Vetgedrukt",
|
||||||
"LabelFontBoldness": "Font Boldness",
|
"LabelFontBoldness": "Font Boldness",
|
||||||
"LabelFontFamily": "Lettertypefamilie",
|
"LabelFontFamily": "Lettertypefamilie",
|
||||||
|
"LabelFontItalic": "Cursief",
|
||||||
"LabelFontScale": "Lettertype schaal",
|
"LabelFontScale": "Lettertype schaal",
|
||||||
|
"LabelFontStrikethrough": "Doorgestreept",
|
||||||
"LabelFormat": "Formaat",
|
"LabelFormat": "Formaat",
|
||||||
|
"LabelFull": "Vol",
|
||||||
"LabelGenre": "Genre",
|
"LabelGenre": "Genre",
|
||||||
"LabelGenres": "Genres",
|
"LabelGenres": "Genres",
|
||||||
"LabelHardDeleteFile": "Hard-delete bestand",
|
"LabelHardDeleteFile": "Hard-delete bestand",
|
||||||
"LabelHasEbook": "Heeft Ebook",
|
"LabelHasEbook": "Heeft Ebook",
|
||||||
"LabelHasSupplementaryEbook": "Heeft aanvullend Ebook",
|
"LabelHasSupplementaryEbook": "Heeft aanvullend Ebook",
|
||||||
|
"LabelHideSubtitles": "Ondertitels Verstoppen",
|
||||||
|
"LabelHighestPriority": "Hoogste Prioriteit",
|
||||||
"LabelHost": "Host",
|
"LabelHost": "Host",
|
||||||
"LabelHour": "Uur",
|
"LabelHour": "Uur",
|
||||||
"LabelHours": "Uren",
|
"LabelHours": "Uren",
|
||||||
"LabelIcon": "Icoon",
|
"LabelIcon": "Icoon",
|
||||||
|
"LabelImageURLFromTheWeb": "Afbeelding URL van web",
|
||||||
"LabelInProgress": "Bezig",
|
"LabelInProgress": "Bezig",
|
||||||
"LabelIncludeInTracklist": "Includeer in tracklijst",
|
"LabelIncludeInTracklist": "Includeer in tracklijst",
|
||||||
"LabelIncomplete": "Incompleet",
|
"LabelIncomplete": "Incompleet",
|
||||||
|
"LabelInterval": "Interval",
|
||||||
"LabelIntervalCustomDailyWeekly": "Aangepast dagelijks/wekelijks",
|
"LabelIntervalCustomDailyWeekly": "Aangepast dagelijks/wekelijks",
|
||||||
"LabelIntervalEvery12Hours": "Iedere 12 uur",
|
"LabelIntervalEvery12Hours": "Iedere 12 uur",
|
||||||
"LabelIntervalEvery15Minutes": "Iedere 15 minuten",
|
"LabelIntervalEvery15Minutes": "Iedere 15 minuten",
|
||||||
@ -299,8 +387,11 @@
|
|||||||
"LabelIntervalEveryHour": "Ieder uur",
|
"LabelIntervalEveryHour": "Ieder uur",
|
||||||
"LabelInvert": "Omdraaien",
|
"LabelInvert": "Omdraaien",
|
||||||
"LabelItem": "Onderdeel",
|
"LabelItem": "Onderdeel",
|
||||||
|
"LabelJumpBackwardAmount": "Terugspoelen hoeveelheid",
|
||||||
|
"LabelJumpForwardAmount": "Vooruitspoelen hoeveelheid",
|
||||||
"LabelLanguage": "Taal",
|
"LabelLanguage": "Taal",
|
||||||
"LabelLanguageDefaultServer": "Standaard servertaal",
|
"LabelLanguageDefaultServer": "Standaard servertaal",
|
||||||
|
"LabelLanguages": "Talen",
|
||||||
"LabelLastBookAdded": "Laatst toegevoegde boek",
|
"LabelLastBookAdded": "Laatst toegevoegde boek",
|
||||||
"LabelLastBookUpdated": "Laatst bijgewerkte boek",
|
"LabelLastBookUpdated": "Laatst bijgewerkte boek",
|
||||||
"LabelLastSeen": "Laatst gezien",
|
"LabelLastSeen": "Laatst gezien",
|
||||||
@ -312,20 +403,36 @@
|
|||||||
"LabelLess": "Minder",
|
"LabelLess": "Minder",
|
||||||
"LabelLibrariesAccessibleToUser": "Voor gebruiker toegankelijke bibliotheken",
|
"LabelLibrariesAccessibleToUser": "Voor gebruiker toegankelijke bibliotheken",
|
||||||
"LabelLibrary": "Bibliotheek",
|
"LabelLibrary": "Bibliotheek",
|
||||||
|
"LabelLibraryFilterSublistEmpty": "Nee {0}",
|
||||||
"LabelLibraryItem": "Bibliotheekonderdeel",
|
"LabelLibraryItem": "Bibliotheekonderdeel",
|
||||||
"LabelLibraryName": "Bibliotheeknaam",
|
"LabelLibraryName": "Bibliotheeknaam",
|
||||||
"LabelLimit": "Limiet",
|
"LabelLimit": "Limiet",
|
||||||
"LabelLineSpacing": "Regelruimte",
|
"LabelLineSpacing": "Regelruimte",
|
||||||
"LabelListenAgain": "Opnieuw Beluisteren",
|
"LabelListenAgain": "Opnieuw Beluisteren",
|
||||||
|
"LabelLogLevelDebug": "Debug",
|
||||||
|
"LabelLogLevelInfo": "Informatie",
|
||||||
"LabelLogLevelWarn": "Waarschuwing",
|
"LabelLogLevelWarn": "Waarschuwing",
|
||||||
"LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum",
|
"LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum",
|
||||||
|
"LabelLowestPriority": "Laagste Prioriteit",
|
||||||
|
"LabelMatchExistingUsersBy": "Bestaande gebruikers matchen op",
|
||||||
|
"LabelMatchExistingUsersByDescription": "Wordt gebruikt om bestaande gebruikers te verbinden. Zodra ze verbonden zijn, worden gebruikers gekoppeld aan een unieke id van uw SSO-provider.",
|
||||||
|
"LabelMaxEpisodesToDownload": "Maximale # afleveringen om te downloaden. Gebruik 0 voor ongelimiteerd.",
|
||||||
|
"LabelMaxEpisodesToDownloadPerCheck": "Maximale # nieuwe afleveringen om te downloaden per check",
|
||||||
|
"LabelMaxEpisodesToKeep": "Maximale # afleveringen om te houden",
|
||||||
|
"LabelMaxEpisodesToKeepHelp": "Waarde van 0 stelt geen maximumlimiet in. Nadat een nieuwe aflevering automatisch is gedownload, wordt de oudste aflevering verwijderd als u meer dan X afleveringen hebt. Hiermee wordt slechts 1 aflevering per nieuwe download verwijderd.",
|
||||||
"LabelMediaPlayer": "Mediaspeler",
|
"LabelMediaPlayer": "Mediaspeler",
|
||||||
"LabelMediaType": "Mediatype",
|
"LabelMediaType": "Mediatype",
|
||||||
"LabelMetaTag": "Meta-tag",
|
"LabelMetaTag": "Meta-tag",
|
||||||
"LabelMetaTags": "Meta-tags",
|
"LabelMetaTags": "Meta-tags",
|
||||||
|
"LabelMetadataOrderOfPrecedenceDescription": "Metadatabronnen met een hogere prioriteit zullen metadatabronnen met een lagere prioriteit overschrijven",
|
||||||
"LabelMetadataProvider": "Metadatabron",
|
"LabelMetadataProvider": "Metadatabron",
|
||||||
"LabelMinute": "Minuut",
|
"LabelMinute": "Minuut",
|
||||||
|
"LabelMinutes": "Minuten",
|
||||||
"LabelMissing": "Ontbrekend",
|
"LabelMissing": "Ontbrekend",
|
||||||
|
"LabelMissingEbook": "Heeft geen ebook",
|
||||||
|
"LabelMissingSupplementaryEbook": "Heeft geen supplementair ebook",
|
||||||
|
"LabelMobileRedirectURIs": "Toegestane mobiele omleidings-URL's",
|
||||||
|
"LabelMobileRedirectURIsDescription": "Dit is een whitelist met geldige redirect-URI's voor mobiele apps. De standaard is <code>audiobookshelf://oauth</code>, die u kunt verwijderen of aanvullen met extra URI's voor integratie met apps van derden. Als u een asterisk (<code>*</code>) als enige invoer gebruikt, is elke URI toegestaan.",
|
||||||
"LabelMore": "Meer",
|
"LabelMore": "Meer",
|
||||||
"LabelMoreInfo": "Meer info",
|
"LabelMoreInfo": "Meer info",
|
||||||
"LabelName": "Naam",
|
"LabelName": "Naam",
|
||||||
@ -337,10 +444,12 @@
|
|||||||
"LabelNewestEpisodes": "Nieuwste Afleveringen",
|
"LabelNewestEpisodes": "Nieuwste Afleveringen",
|
||||||
"LabelNextBackupDate": "Volgende back-up datum",
|
"LabelNextBackupDate": "Volgende back-up datum",
|
||||||
"LabelNextScheduledRun": "Volgende geplande run",
|
"LabelNextScheduledRun": "Volgende geplande run",
|
||||||
|
"LabelNoCustomMetadataProviders": "Geen custom metadata bronnen",
|
||||||
"LabelNoEpisodesSelected": "Geen afleveringen geselecteerd",
|
"LabelNoEpisodesSelected": "Geen afleveringen geselecteerd",
|
||||||
"LabelNotFinished": "Niet Voltooid",
|
"LabelNotFinished": "Niet Voltooid",
|
||||||
"LabelNotStarted": "Niet Gestart",
|
"LabelNotStarted": "Niet Gestart",
|
||||||
"LabelNotes": "Notities",
|
"LabelNotes": "Notities",
|
||||||
|
"LabelNotificationAppriseURL": "URL(s) van kennisgeving",
|
||||||
"LabelNotificationAvailableVariables": "Beschikbare variabelen",
|
"LabelNotificationAvailableVariables": "Beschikbare variabelen",
|
||||||
"LabelNotificationBodyTemplate": "Body-template",
|
"LabelNotificationBodyTemplate": "Body-template",
|
||||||
"LabelNotificationEvent": "Notificatie gebeurtenis",
|
"LabelNotificationEvent": "Notificatie gebeurtenis",
|
||||||
@ -351,10 +460,15 @@
|
|||||||
"LabelNotificationsMaxQueueSizeHelp": "Gebeurtenissen zijn beperkt tot 1 aftrap per seconde. Gebeurtenissen zullen genegeerd worden als de rij aan de maximale grootte zit. Dit voorkomt notificatie-spamming.",
|
"LabelNotificationsMaxQueueSizeHelp": "Gebeurtenissen zijn beperkt tot 1 aftrap per seconde. Gebeurtenissen zullen genegeerd worden als de rij aan de maximale grootte zit. Dit voorkomt notificatie-spamming.",
|
||||||
"LabelNumberOfBooks": "Aantal Boeken",
|
"LabelNumberOfBooks": "Aantal Boeken",
|
||||||
"LabelNumberOfEpisodes": "# afleveringen",
|
"LabelNumberOfEpisodes": "# afleveringen",
|
||||||
|
"LabelOpenIDAdvancedPermsClaimDescription": "Naam van de OpenID-claim die geavanceerde machtigingen bevat voor gebruikersacties binnen de applicatie die van toepassing zijn op niet-beheerdersrollen (<b>indien geconfigureerd</b>). Als de claim ontbreekt in het antwoord, wordt toegang tot ABS geweigerd. Als er één optie ontbreekt, wordt deze behandeld als <code>false</code>. Zorg ervoor dat de claim van de identiteitsprovider overeenkomt met de verwachte structuur:",
|
||||||
|
"LabelOpenIDClaims": "Laat de volgende opties leeg om geavanceerde groeps- en machtigingstoewijzing uit te schakelen en de groep 'Gebruiker' automatisch toe te wijzen.",
|
||||||
|
"LabelOpenIDGroupClaimDescription": "Naam van de OpenID-claim die een lijst met de groepen van de gebruiker bevat. Vaak aangeduid als <code>groepen</code>. <b>Indien geconfigureerd</b>, zal de applicatie automatisch rollen toewijzen op basis van de groepslidmaatschappen van de gebruiker, op voorwaarde dat deze groepen hoofdlettergevoelig 'admin', 'gebruiker' of 'gast' worden genoemd in de claim. De claim moet een lijst bevatten en als een gebruiker tot meerdere groepen behoort, zal de applicatie de rol toewijzen die overeenkomt met het hoogste toegangsniveau. Als er geen groep overeenkomt, wordt de toegang geweigerd.",
|
||||||
"LabelOpenRSSFeed": "Open RSS-feed",
|
"LabelOpenRSSFeed": "Open RSS-feed",
|
||||||
"LabelOverwrite": "Overschrijf",
|
"LabelOverwrite": "Overschrijf",
|
||||||
|
"LabelPaginationPageXOfY": "Pagina {0} van {1}",
|
||||||
"LabelPassword": "Wachtwoord",
|
"LabelPassword": "Wachtwoord",
|
||||||
"LabelPath": "Pad",
|
"LabelPath": "Pad",
|
||||||
|
"LabelPermanent": "Permanent",
|
||||||
"LabelPermissionsAccessAllLibraries": "Heeft toegang tot all bibliotheken",
|
"LabelPermissionsAccessAllLibraries": "Heeft toegang tot all bibliotheken",
|
||||||
"LabelPermissionsAccessAllTags": "Heeft toegang tot alle tags",
|
"LabelPermissionsAccessAllTags": "Heeft toegang tot alle tags",
|
||||||
"LabelPermissionsAccessExplicitContent": "Heeft toegang tot expliciete inhoud",
|
"LabelPermissionsAccessExplicitContent": "Heeft toegang tot expliciete inhoud",
|
||||||
@ -362,21 +476,29 @@
|
|||||||
"LabelPermissionsDownload": "Kan downloaden",
|
"LabelPermissionsDownload": "Kan downloaden",
|
||||||
"LabelPermissionsUpdate": "Kan bijwerken",
|
"LabelPermissionsUpdate": "Kan bijwerken",
|
||||||
"LabelPermissionsUpload": "Kan uploaden",
|
"LabelPermissionsUpload": "Kan uploaden",
|
||||||
|
"LabelPersonalYearReview": "Jouw jaar in review ({0})",
|
||||||
"LabelPhotoPathURL": "Foto pad/URL",
|
"LabelPhotoPathURL": "Foto pad/URL",
|
||||||
"LabelPlayMethod": "Afspeelwijze",
|
"LabelPlayMethod": "Afspeelwijze",
|
||||||
|
"LabelPlayerChapterNumberMarker": "{0} van {1}",
|
||||||
"LabelPlaylists": "Afspeellijsten",
|
"LabelPlaylists": "Afspeellijsten",
|
||||||
"LabelPodcast": "Podcast",
|
"LabelPodcast": "Podcast",
|
||||||
"LabelPodcastSearchRegion": "Podcast zoekregio",
|
"LabelPodcastSearchRegion": "Podcast zoekregio",
|
||||||
"LabelPodcastType": "Podcasttype",
|
"LabelPodcastType": "Podcasttype",
|
||||||
|
"LabelPodcasts": "Podcasts",
|
||||||
"LabelPort": "Poort",
|
"LabelPort": "Poort",
|
||||||
"LabelPrefixesToIgnore": "Te negeren voorzetsels (ongeacht hoofdlettergebruik)",
|
"LabelPrefixesToIgnore": "Te negeren voorzetsels (ongeacht hoofdlettergebruik)",
|
||||||
"LabelPreventIndexing": "Voorkom indexering van je feed door iTunes- en Google podcastmappen",
|
"LabelPreventIndexing": "Voorkom indexering van je feed door iTunes- en Google podcastmappen",
|
||||||
"LabelPrimaryEbook": "Primair ebook",
|
"LabelPrimaryEbook": "Primair ebook",
|
||||||
"LabelProgress": "Voortgang",
|
"LabelProgress": "Voortgang",
|
||||||
"LabelProvider": "Bron",
|
"LabelProvider": "Bron",
|
||||||
|
"LabelProviderAuthorizationValue": "Autorisatie Header Waarde",
|
||||||
"LabelPubDate": "Publicatiedatum",
|
"LabelPubDate": "Publicatiedatum",
|
||||||
"LabelPublishYear": "Jaar van uitgave",
|
"LabelPublishYear": "Jaar van uitgave",
|
||||||
|
"LabelPublishedDate": "Gepubliceerd {0}",
|
||||||
|
"LabelPublishedDecade": "Gepubliceerd Decennium",
|
||||||
|
"LabelPublishedDecades": "Gepubliceerd Decennia",
|
||||||
"LabelPublisher": "Uitgever",
|
"LabelPublisher": "Uitgever",
|
||||||
|
"LabelPublishers": "Uitgevers",
|
||||||
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
|
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
|
||||||
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
|
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
|
||||||
"LabelRSSFeedOpen": "RSS-feed open",
|
"LabelRSSFeedOpen": "RSS-feed open",
|
||||||
@ -384,31 +506,45 @@
|
|||||||
"LabelRSSFeedSlug": "RSS-feed slug",
|
"LabelRSSFeedSlug": "RSS-feed slug",
|
||||||
"LabelRSSFeedURL": "RSS-feed URL",
|
"LabelRSSFeedURL": "RSS-feed URL",
|
||||||
"LabelRandomly": "Willekeurig",
|
"LabelRandomly": "Willekeurig",
|
||||||
|
"LabelReAddSeriesToContinueListening": "Serie opnieuw toevoegen aan verder luisteren",
|
||||||
"LabelRead": "Lees",
|
"LabelRead": "Lees",
|
||||||
"LabelReadAgain": "Opnieuw Lezen",
|
"LabelReadAgain": "Opnieuw Lezen",
|
||||||
"LabelReadEbookWithoutProgress": "Lees ebook zonder voortgang bij te houden",
|
"LabelReadEbookWithoutProgress": "Lees ebook zonder voortgang bij te houden",
|
||||||
"LabelRecentSeries": "Recente Serie",
|
"LabelRecentSeries": "Recente Serie",
|
||||||
"LabelRecentlyAdded": "Recent Toegevoegd",
|
"LabelRecentlyAdded": "Recent Toegevoegd",
|
||||||
"LabelRecommended": "Aangeraden",
|
"LabelRecommended": "Aangeraden",
|
||||||
|
"LabelRedo": "Opnieuw",
|
||||||
"LabelRegion": "Regio",
|
"LabelRegion": "Regio",
|
||||||
"LabelReleaseDate": "Verschijningsdatum",
|
"LabelReleaseDate": "Verschijningsdatum",
|
||||||
|
"LabelRemoveAllMetadataAbs": "Verwijder alle metadata.abs bestanden",
|
||||||
|
"LabelRemoveAllMetadataJson": "Verwijder alle metadata.json bestanden",
|
||||||
"LabelRemoveCover": "Verwijder cover",
|
"LabelRemoveCover": "Verwijder cover",
|
||||||
|
"LabelRemoveMetadataFile": "Verwijder metadata bestanden in bibliotheek item folders",
|
||||||
|
"LabelRemoveMetadataFileHelp": "Verwijder alle metadata.json en metadata.abs bestanden in uw {0} folders.",
|
||||||
|
"LabelRowsPerPage": "Rijen per pagina",
|
||||||
"LabelSearchTerm": "Zoekterm",
|
"LabelSearchTerm": "Zoekterm",
|
||||||
"LabelSearchTitle": "Zoek titel",
|
"LabelSearchTitle": "Zoek titel",
|
||||||
"LabelSearchTitleOrASIN": "Zoek titel of ASIN",
|
"LabelSearchTitleOrASIN": "Zoek titel of ASIN",
|
||||||
"LabelSeason": "Seizoen",
|
"LabelSeason": "Seizoen",
|
||||||
|
"LabelSeasonNumber": "Seizoen #{0}",
|
||||||
|
"LabelSelectAll": "Alles selecteren",
|
||||||
"LabelSelectAllEpisodes": "Selecteer alle afleveringen",
|
"LabelSelectAllEpisodes": "Selecteer alle afleveringen",
|
||||||
"LabelSelectEpisodesShowing": "Selecteer {0} afleveringen laten zien",
|
"LabelSelectEpisodesShowing": "Selecteer {0} afleveringen laten zien",
|
||||||
|
"LabelSelectUsers": "Selecteer gebruikers",
|
||||||
"LabelSendEbookToDevice": "Stuur ebook naar...",
|
"LabelSendEbookToDevice": "Stuur ebook naar...",
|
||||||
"LabelSequence": "Sequentie",
|
"LabelSequence": "Sequentie",
|
||||||
|
"LabelSerial": "Serie",
|
||||||
"LabelSeries": "Serie",
|
"LabelSeries": "Serie",
|
||||||
"LabelSeriesName": "Naam serie",
|
"LabelSeriesName": "Naam serie",
|
||||||
"LabelSeriesProgress": "Voortgang serie",
|
"LabelSeriesProgress": "Voortgang serie",
|
||||||
|
"LabelServerLogLevel": "Server Log Niveau",
|
||||||
|
"LabelServerYearReview": "Server Jaar in Review ({0})",
|
||||||
"LabelSetEbookAsPrimary": "Stel in als primair",
|
"LabelSetEbookAsPrimary": "Stel in als primair",
|
||||||
"LabelSetEbookAsSupplementary": "Stel in als supplementair",
|
"LabelSetEbookAsSupplementary": "Stel in als supplementair",
|
||||||
"LabelSettingsAudiobooksOnly": "Alleen audiobooks",
|
"LabelSettingsAudiobooksOnly": "Alleen audiobooks",
|
||||||
"LabelSettingsAudiobooksOnlyHelp": "Deze instelling inschakelen zorgt ervoor dat ebook-bestanden genegeerd worden tenzij ze in een audiobook-map staan, in welk geval ze worden ingesteld als supplementaire ebooks",
|
"LabelSettingsAudiobooksOnlyHelp": "Deze instelling inschakelen zorgt ervoor dat ebook-bestanden genegeerd worden tenzij ze in een audiobook-map staan, in welk geval ze worden ingesteld als supplementaire ebooks",
|
||||||
"LabelSettingsBookshelfViewHelp": "Skeumorphisch design met houten planken",
|
"LabelSettingsBookshelfViewHelp": "Skeumorphisch design met houten planken",
|
||||||
|
"LabelSettingsChromecastSupport": "Chromecast ondersteuning",
|
||||||
"LabelSettingsDateFormat": "Datum format",
|
"LabelSettingsDateFormat": "Datum format",
|
||||||
"LabelSettingsDisableWatcher": "Watcher uitschakelen",
|
"LabelSettingsDisableWatcher": "Watcher uitschakelen",
|
||||||
"LabelSettingsDisableWatcherForLibrary": "Map-watcher voor bibliotheek uitschakelen",
|
"LabelSettingsDisableWatcherForLibrary": "Map-watcher voor bibliotheek uitschakelen",
|
||||||
@ -416,6 +552,8 @@
|
|||||||
"LabelSettingsEnableWatcher": "Watcher inschakelen",
|
"LabelSettingsEnableWatcher": "Watcher inschakelen",
|
||||||
"LabelSettingsEnableWatcherForLibrary": "Map-watcher voor bibliotheek inschakelen",
|
"LabelSettingsEnableWatcherForLibrary": "Map-watcher voor bibliotheek inschakelen",
|
||||||
"LabelSettingsEnableWatcherHelp": "Zorgt voor het automatisch toevoegen/bijwerken van onderdelen als bestandswijzigingen worden gedetecteerd. *Vereist herstarten van server",
|
"LabelSettingsEnableWatcherHelp": "Zorgt voor het automatisch toevoegen/bijwerken van onderdelen als bestandswijzigingen worden gedetecteerd. *Vereist herstarten van server",
|
||||||
|
"LabelSettingsEpubsAllowScriptedContent": "Sta scripted content toe in epubs",
|
||||||
|
"LabelSettingsEpubsAllowScriptedContentHelp": "Sta toe dat epub-bestanden scripts uitvoeren. Het wordt aanbevolen om deze instelling uitgeschakeld te houden, tenzij u de bron van de epub-bestanden vertrouwt.",
|
||||||
"LabelSettingsExperimentalFeatures": "Experimentele functies",
|
"LabelSettingsExperimentalFeatures": "Experimentele functies",
|
||||||
"LabelSettingsExperimentalFeaturesHelp": "Functies in ontwikkeling die je feedback en testing kunnen gebruiken. Klik om de Github-discussie te openen.",
|
"LabelSettingsExperimentalFeaturesHelp": "Functies in ontwikkeling die je feedback en testing kunnen gebruiken. Klik om de Github-discussie te openen.",
|
||||||
"LabelSettingsFindCovers": "Zoek covers",
|
"LabelSettingsFindCovers": "Zoek covers",
|
||||||
@ -424,6 +562,8 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "Series die slechts een enkel boek bevatten worden verborgen op de seriespagina en de homepagina-planken.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Series die slechts een enkel boek bevatten worden verborgen op de seriespagina en de homepagina-planken.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Boekenplank-view voor homepagina",
|
"LabelSettingsHomePageBookshelfView": "Boekenplank-view voor homepagina",
|
||||||
"LabelSettingsLibraryBookshelfView": "Boekenplank-view voor bibliotheek",
|
"LabelSettingsLibraryBookshelfView": "Boekenplank-view voor bibliotheek",
|
||||||
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Sla eedere boeken in Serie Verderzetten over",
|
||||||
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "De Continue Series home page shelf toont het eerste boek dat nog niet is begonnen in series waarvan er minstens één is voltooid en er geen boeken in uitvoering zijn. Als u deze instelling inschakelt, wordt de serie voortgezet vanaf het boek dat het verst is voltooid in plaats van het eerste boek dat nog niet is begonnen.",
|
||||||
"LabelSettingsParseSubtitles": "Parseer subtitel",
|
"LabelSettingsParseSubtitles": "Parseer subtitel",
|
||||||
"LabelSettingsParseSubtitlesHelp": "Haal subtitels uit mapnaam van audioboek.<br>Subtitel moet gescheiden zijn met \" - \"<br>b.v. \"Boektitel - Een Subtitel Hier\" heeft als subtitel \"Een Subtitel Hier\"",
|
"LabelSettingsParseSubtitlesHelp": "Haal subtitels uit mapnaam van audioboek.<br>Subtitel moet gescheiden zijn met \" - \"<br>b.v. \"Boektitel - Een Subtitel Hier\" heeft als subtitel \"Een Subtitel Hier\"",
|
||||||
"LabelSettingsPreferMatchedMetadata": "Prefereer gematchte metadata",
|
"LabelSettingsPreferMatchedMetadata": "Prefereer gematchte metadata",
|
||||||
@ -439,9 +579,15 @@
|
|||||||
"LabelSettingsStoreMetadataWithItem": "Bewaar metadata bij onderdeel",
|
"LabelSettingsStoreMetadataWithItem": "Bewaar metadata bij onderdeel",
|
||||||
"LabelSettingsStoreMetadataWithItemHelp": "Standaard worden metadata-bestanden bewaard in /metadata/items, door deze instelling in te schakelen zullen metadata bestanden in de map van je bibliotheekonderdeel bewaard worden",
|
"LabelSettingsStoreMetadataWithItemHelp": "Standaard worden metadata-bestanden bewaard in /metadata/items, door deze instelling in te schakelen zullen metadata bestanden in de map van je bibliotheekonderdeel bewaard worden",
|
||||||
"LabelSettingsTimeFormat": "Tijdformat",
|
"LabelSettingsTimeFormat": "Tijdformat",
|
||||||
|
"LabelShare": "Delen",
|
||||||
|
"LabelShareOpen": "Delen Open",
|
||||||
|
"LabelShareURL": "URL Delen",
|
||||||
"LabelShowAll": "Toon alle",
|
"LabelShowAll": "Toon alle",
|
||||||
|
"LabelShowSeconds": "Laat seconden zien",
|
||||||
|
"LabelShowSubtitles": "Laat Ondertitels zien",
|
||||||
"LabelSize": "Grootte",
|
"LabelSize": "Grootte",
|
||||||
"LabelSleepTimer": "Slaaptimer",
|
"LabelSleepTimer": "Slaaptimer",
|
||||||
|
"LabelSlug": "Slak",
|
||||||
"LabelStart": "Start",
|
"LabelStart": "Start",
|
||||||
"LabelStartTime": "Starttijd",
|
"LabelStartTime": "Starttijd",
|
||||||
"LabelStarted": "Gestart",
|
"LabelStarted": "Gestart",
|
||||||
@ -468,10 +614,19 @@
|
|||||||
"LabelTagsAccessibleToUser": "Tags toegankelijk voor de gebruiker",
|
"LabelTagsAccessibleToUser": "Tags toegankelijk voor de gebruiker",
|
||||||
"LabelTagsNotAccessibleToUser": "Tags niet toegankelijk voor de gebruiker",
|
"LabelTagsNotAccessibleToUser": "Tags niet toegankelijk voor de gebruiker",
|
||||||
"LabelTasks": "Lopende taken",
|
"LabelTasks": "Lopende taken",
|
||||||
|
"LabelTextEditorBulletedList": "Opgesomde lijst",
|
||||||
|
"LabelTextEditorLink": "Link",
|
||||||
|
"LabelTextEditorNumberedList": "Genummerde lijst",
|
||||||
|
"LabelTextEditorUnlink": "Unlink",
|
||||||
"LabelTheme": "Thema",
|
"LabelTheme": "Thema",
|
||||||
"LabelThemeDark": "Donker",
|
"LabelThemeDark": "Donker",
|
||||||
"LabelThemeLight": "Licht",
|
"LabelThemeLight": "Licht",
|
||||||
"LabelTimeBase": "Tijdsbasis",
|
"LabelTimeBase": "Tijdsbasis",
|
||||||
|
"LabelTimeDurationXHours": "{0} Uren",
|
||||||
|
"LabelTimeDurationXMinutes": "{0} minuten",
|
||||||
|
"LabelTimeDurationXSeconds": "{0} seconden",
|
||||||
|
"LabelTimeInMinutes": "Tijd in minuten",
|
||||||
|
"LabelTimeLeft": "{0} over",
|
||||||
"LabelTimeListened": "Tijd geluisterd",
|
"LabelTimeListened": "Tijd geluisterd",
|
||||||
"LabelTimeListenedToday": "Tijd geluisterd vandaag",
|
"LabelTimeListenedToday": "Tijd geluisterd vandaag",
|
||||||
"LabelTimeRemaining": "{0} te gaan",
|
"LabelTimeRemaining": "{0} te gaan",
|
||||||
@ -479,6 +634,7 @@
|
|||||||
"LabelTitle": "Titel",
|
"LabelTitle": "Titel",
|
||||||
"LabelToolsEmbedMetadata": "Metadata insluiten",
|
"LabelToolsEmbedMetadata": "Metadata insluiten",
|
||||||
"LabelToolsEmbedMetadataDescription": "Metadata insluiten in audiobestanden, inclusief coverafbeelding en hoofdstukken.",
|
"LabelToolsEmbedMetadataDescription": "Metadata insluiten in audiobestanden, inclusief coverafbeelding en hoofdstukken.",
|
||||||
|
"LabelToolsM4bEncoder": "M4B Encoder",
|
||||||
"LabelToolsMakeM4b": "Maak M4B-audioboekbestand",
|
"LabelToolsMakeM4b": "Maak M4B-audioboekbestand",
|
||||||
"LabelToolsMakeM4bDescription": "Genereer een .M4B-audioboekbestand met ingesloten metadata, coverafbeelding en hoofdstukken.",
|
"LabelToolsMakeM4bDescription": "Genereer een .M4B-audioboekbestand met ingesloten metadata, coverafbeelding en hoofdstukken.",
|
||||||
"LabelToolsSplitM4b": "Splitst M4B in MP3's",
|
"LabelToolsSplitM4b": "Splitst M4B in MP3's",
|
||||||
@ -488,12 +644,15 @@
|
|||||||
"LabelTrackFromFilename": "Track vanuit bestandsnaam",
|
"LabelTrackFromFilename": "Track vanuit bestandsnaam",
|
||||||
"LabelTrackFromMetadata": "Track vanuit metadata",
|
"LabelTrackFromMetadata": "Track vanuit metadata",
|
||||||
"LabelTracks": "Audiosporen",
|
"LabelTracks": "Audiosporen",
|
||||||
|
"LabelTracksMultiTrack": "Multi-spoor",
|
||||||
"LabelTracksNone": "Geen tracks",
|
"LabelTracksNone": "Geen tracks",
|
||||||
"LabelTracksSingleTrack": "Enkele track",
|
"LabelTracksSingleTrack": "Enkele track",
|
||||||
|
"LabelTrailer": "Trailer",
|
||||||
"LabelType": "Type",
|
"LabelType": "Type",
|
||||||
"LabelUnabridged": "Onverkort",
|
"LabelUnabridged": "Onverkort",
|
||||||
"LabelUndo": "Ongedaan maken",
|
"LabelUndo": "Ongedaan maken",
|
||||||
"LabelUnknown": "Onbekend",
|
"LabelUnknown": "Onbekend",
|
||||||
|
"LabelUnknownPublishDate": "Onbekende uitgeefdatum",
|
||||||
"LabelUpdateCover": "Cover bijwerken",
|
"LabelUpdateCover": "Cover bijwerken",
|
||||||
"LabelUpdateCoverHelp": "Sta overschrijven van bestaande covers toe voor de geselecteerde boeken wanneer een match is gevonden",
|
"LabelUpdateCoverHelp": "Sta overschrijven van bestaande covers toe voor de geselecteerde boeken wanneer een match is gevonden",
|
||||||
"LabelUpdateDetails": "Details bijwerken",
|
"LabelUpdateDetails": "Details bijwerken",
|
||||||
@ -501,16 +660,25 @@
|
|||||||
"LabelUpdatedAt": "Bijgewerkt op",
|
"LabelUpdatedAt": "Bijgewerkt op",
|
||||||
"LabelUploaderDragAndDrop": "Slepen & neerzeten van bestanden of mappen",
|
"LabelUploaderDragAndDrop": "Slepen & neerzeten van bestanden of mappen",
|
||||||
"LabelUploaderDropFiles": "Bestanden neerzetten",
|
"LabelUploaderDropFiles": "Bestanden neerzetten",
|
||||||
|
"LabelUploaderItemFetchMetadataHelp": "Automatisch titel, auteur en serie ophalen",
|
||||||
|
"LabelUseAdvancedOptions": "Gebruik Geavanceerde Instellingen",
|
||||||
"LabelUseChapterTrack": "Gebruik hoofdstuktrack",
|
"LabelUseChapterTrack": "Gebruik hoofdstuktrack",
|
||||||
"LabelUseFullTrack": "Gebruik volledige track",
|
"LabelUseFullTrack": "Gebruik volledige track",
|
||||||
|
"LabelUseZeroForUnlimited": "Gebruik 0 voor ongelimiteerd",
|
||||||
"LabelUser": "Gebruiker",
|
"LabelUser": "Gebruiker",
|
||||||
"LabelUsername": "Gebruikersnaam",
|
"LabelUsername": "Gebruikersnaam",
|
||||||
"LabelValue": "Waarde",
|
"LabelValue": "Waarde",
|
||||||
"LabelVersion": "Versie",
|
"LabelVersion": "Versie",
|
||||||
"LabelViewBookmarks": "Bekijk boekwijzers",
|
"LabelViewBookmarks": "Bekijk boekwijzers",
|
||||||
"LabelViewChapters": "Bekijk hoofdstukken",
|
"LabelViewChapters": "Bekijk hoofdstukken",
|
||||||
|
"LabelViewPlayerSettings": "Laat spelerinstellingen zien",
|
||||||
"LabelViewQueue": "Bekijk afspeelwachtrij",
|
"LabelViewQueue": "Bekijk afspeelwachtrij",
|
||||||
|
"LabelVolume": "Volume",
|
||||||
"LabelWeekdaysToRun": "Weekdagen om te draaien",
|
"LabelWeekdaysToRun": "Weekdagen om te draaien",
|
||||||
|
"LabelXBooks": "{0} boeken",
|
||||||
|
"LabelXItems": "{0} items",
|
||||||
|
"LabelYearReviewHide": "Verberg Jaar in Review",
|
||||||
|
"LabelYearReviewShow": "Laat Jaar in Review zien",
|
||||||
"LabelYourAudiobookDuration": "Je audioboekduur",
|
"LabelYourAudiobookDuration": "Je audioboekduur",
|
||||||
"LabelYourBookmarks": "Je boekwijzers",
|
"LabelYourBookmarks": "Je boekwijzers",
|
||||||
"LabelYourPlaylists": "Je afspeellijsten",
|
"LabelYourPlaylists": "Je afspeellijsten",
|
||||||
@ -518,10 +686,14 @@
|
|||||||
"MessageAddToPlayerQueue": "Toevoegen aan wachtrij",
|
"MessageAddToPlayerQueue": "Toevoegen aan wachtrij",
|
||||||
"MessageAppriseDescription": "Om deze functie te gebruiken heb je een draaiende instantie van <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nodig of een api die dezelfde requests afhandelt. <br />De Apprise API Url moet het volledige URL-pad zijn om de notificatie te verzenden, b.v., als je API-instantie draait op <code>http://192.168.1.1:8337</code> dan zou je <code>http://192.168.1.1:8337/notify</code> gebruiken.",
|
"MessageAppriseDescription": "Om deze functie te gebruiken heb je een draaiende instantie van <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nodig of een api die dezelfde requests afhandelt. <br />De Apprise API Url moet het volledige URL-pad zijn om de notificatie te verzenden, b.v., als je API-instantie draait op <code>http://192.168.1.1:8337</code> dan zou je <code>http://192.168.1.1:8337/notify</code> gebruiken.",
|
||||||
"MessageBackupsDescription": "Back-ups omvatten gebruikers, gebruikers' voortgang, bibliotheekonderdeeldetails, serverinstellingen en afbeeldingen bewaard in <code>/metadata/items</code> & <code>/metadata/authors</code>. Back-ups <strong>bevatten niet</strong> de bestanden bewaard in je bibliotheekmappen.",
|
"MessageBackupsDescription": "Back-ups omvatten gebruikers, gebruikers' voortgang, bibliotheekonderdeeldetails, serverinstellingen en afbeeldingen bewaard in <code>/metadata/items</code> & <code>/metadata/authors</code>. Back-ups <strong>bevatten niet</strong> de bestanden bewaard in je bibliotheekmappen.",
|
||||||
|
"MessageBackupsLocationEditNote": "Let op: het bijwerken van de back-uplocatie zal bestaande back-ups niet verplaatsen of wijzigen",
|
||||||
|
"MessageBackupsLocationNoEditNote": "Let op: De back-uplocatie wordt ingesteld via een omgevingsvariabele en kan hier niet worden gewijzigd.",
|
||||||
|
"MessageBackupsLocationPathEmpty": "Backup locatie pad kan niet leeg zijn",
|
||||||
"MessageBatchQuickMatchDescription": "Quick Match zal proberen ontbrekende covers en metadata voor de geselecteerde onderdelen te matchten. Schakel de opties hieronder in om Quick Match toe te staan bestaande covers en/of metadata te overschrijven.",
|
"MessageBatchQuickMatchDescription": "Quick Match zal proberen ontbrekende covers en metadata voor de geselecteerde onderdelen te matchten. Schakel de opties hieronder in om Quick Match toe te staan bestaande covers en/of metadata te overschrijven.",
|
||||||
"MessageBookshelfNoCollections": "Je hebt nog geen collecties gemaakt",
|
"MessageBookshelfNoCollections": "Je hebt nog geen collecties gemaakt",
|
||||||
"MessageBookshelfNoRSSFeeds": "Geen RSS-feeds geopend",
|
"MessageBookshelfNoRSSFeeds": "Geen RSS-feeds geopend",
|
||||||
"MessageBookshelfNoResultsForFilter": "Geen resultaten voor filter \"{0}: {1}\"",
|
"MessageBookshelfNoResultsForFilter": "Geen resultaten voor filter \"{0}: {1}\"",
|
||||||
|
"MessageBookshelfNoResultsForQuery": "Geen resultaten voor query",
|
||||||
"MessageBookshelfNoSeries": "Je hebt geen series",
|
"MessageBookshelfNoSeries": "Je hebt geen series",
|
||||||
"MessageChapterEndIsAfter": "Hoofdstukeinde is na het einde van je audioboek",
|
"MessageChapterEndIsAfter": "Hoofdstukeinde is na het einde van je audioboek",
|
||||||
"MessageChapterErrorFirstNotZero": "Eerste hoofdstuk moet starten op 0",
|
"MessageChapterErrorFirstNotZero": "Eerste hoofdstuk moet starten op 0",
|
||||||
@ -529,21 +701,37 @@
|
|||||||
"MessageChapterErrorStartLtPrev": "Ongeldig: starttijd moet be groter zijn dan of equal aan starttijd van vorig hoofdstuk",
|
"MessageChapterErrorStartLtPrev": "Ongeldig: starttijd moet be groter zijn dan of equal aan starttijd van vorig hoofdstuk",
|
||||||
"MessageChapterStartIsAfter": "Start van hoofdstuk is na het einde van je audioboek",
|
"MessageChapterStartIsAfter": "Start van hoofdstuk is na het einde van je audioboek",
|
||||||
"MessageCheckingCron": "Cron aan het checken...",
|
"MessageCheckingCron": "Cron aan het checken...",
|
||||||
|
"MessageConfirmCloseFeed": "Ben je zeker dat je deze feed wil sluiten?",
|
||||||
"MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?",
|
"MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?",
|
||||||
|
"MessageConfirmDeleteDevice": "Ben je zeker dat je e-reader apparaat \"{0}\" wil verwijderen?",
|
||||||
"MessageConfirmDeleteFile": "Dit verwijdert het bestand uit het bestandssysteem. Weet je het zeker?",
|
"MessageConfirmDeleteFile": "Dit verwijdert het bestand uit het bestandssysteem. Weet je het zeker?",
|
||||||
"MessageConfirmDeleteLibrary": "Weet je zeker dat je de bibliotheek \"{0}\" permanent wil verwijderen?",
|
"MessageConfirmDeleteLibrary": "Weet je zeker dat je de bibliotheek \"{0}\" permanent wil verwijderen?",
|
||||||
|
"MessageConfirmDeleteLibraryItem": "Hiermee wordt het bibliotheekitem uit de database en uw bestandssysteem verwijderd. Bent u zeker?",
|
||||||
|
"MessageConfirmDeleteLibraryItems": "Hiermee worden {0} bibliotheekitems uit de database en uw bestandssysteem verwijderd. Bent u zeker?",
|
||||||
|
"MessageConfirmDeleteMetadataProvider": "Weet u zeker dat u de aangepaste metadataprovider \"{0}\" wilt verwijderen?",
|
||||||
|
"MessageConfirmDeleteNotification": "Weet u zeker dat u deze melding wil verwijderen?",
|
||||||
"MessageConfirmDeleteSession": "Weet je zeker dat je deze sessie wil verwijderen?",
|
"MessageConfirmDeleteSession": "Weet je zeker dat je deze sessie wil verwijderen?",
|
||||||
|
"MessageConfirmEmbedMetadataInAudioFiles": "Weet u zeker dat u metagegevens wilt insluiten in {0} audiobestanden?",
|
||||||
"MessageConfirmForceReScan": "Weet je zeker dat je geforceerd opnieuw wil scannen?",
|
"MessageConfirmForceReScan": "Weet je zeker dat je geforceerd opnieuw wil scannen?",
|
||||||
"MessageConfirmMarkAllEpisodesFinished": "Weet je zeker dat je alle afleveringen als voltooid wil markeren?",
|
"MessageConfirmMarkAllEpisodesFinished": "Weet je zeker dat je alle afleveringen als voltooid wil markeren?",
|
||||||
"MessageConfirmMarkAllEpisodesNotFinished": "Weet je zeker dat je alle afleveringen als niet-voltooid wil markeren?",
|
"MessageConfirmMarkAllEpisodesNotFinished": "Weet je zeker dat je alle afleveringen als niet-voltooid wil markeren?",
|
||||||
|
"MessageConfirmMarkItemFinished": "Weet u zeker dat u \"{0}\" als voltooid wilt markeren?",
|
||||||
|
"MessageConfirmMarkItemNotFinished": "Weet u zeker dat u \"{0}\" als niet voltooid wilt markeren?",
|
||||||
"MessageConfirmMarkSeriesFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als voltooid?",
|
"MessageConfirmMarkSeriesFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als voltooid?",
|
||||||
"MessageConfirmMarkSeriesNotFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als niet voltooid?",
|
"MessageConfirmMarkSeriesNotFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als niet voltooid?",
|
||||||
|
"MessageConfirmNotificationTestTrigger": "Trigger deze melding met test data?",
|
||||||
|
"MessageConfirmPurgeCache": "Met Purge cache wordt de gehele directory op <code>/metadata/cache</code> verwijderd. <br /><br />Weet u zeker dat u de cachedirectory wilt verwijderen?",
|
||||||
|
"MessageConfirmPurgeItemsCache": "Met Purge items cache wordt de gehele directory op <code>/metadata/cache/items</code> verwijderd.<br />Weet u het zeker?",
|
||||||
|
"MessageConfirmQuickEmbed": "Waarschuwing! Quick embed maakt geen back-up van uw audiobestanden. Zorg ervoor dat u een back-up van uw audiobestanden hebt. <br><br>Wilt u doorgaan?",
|
||||||
|
"MessageConfirmQuickMatchEpisodes": "Snel matchende afleveringen overschrijven details als er een match is gevonden. Alleen niet-matchende afleveringen worden bijgewerkt. Weet u het zeker?",
|
||||||
|
"MessageConfirmReScanLibraryItems": "Bent u zeker dat u {0} items opnieuw wil scannen?",
|
||||||
"MessageConfirmRemoveAllChapters": "Weet je zeker dat je alle hoofdstukken wil verwijderen?",
|
"MessageConfirmRemoveAllChapters": "Weet je zeker dat je alle hoofdstukken wil verwijderen?",
|
||||||
"MessageConfirmRemoveAuthor": "Weet je zeker dat je auteur \"{0}\" wil verwijderen?",
|
"MessageConfirmRemoveAuthor": "Weet je zeker dat je auteur \"{0}\" wil verwijderen?",
|
||||||
"MessageConfirmRemoveCollection": "Weet je zeker dat je de collectie \"{0}\" wil verwijderen?",
|
"MessageConfirmRemoveCollection": "Weet je zeker dat je de collectie \"{0}\" wil verwijderen?",
|
||||||
"MessageConfirmRemoveEpisode": "Weet je zeker dat je de aflevering \"{0}\" wil verwijderen?",
|
"MessageConfirmRemoveEpisode": "Weet je zeker dat je de aflevering \"{0}\" wil verwijderen?",
|
||||||
"MessageConfirmRemoveEpisodes": "Weet je zeker dat je {0} afleveringen wil verwijderen?",
|
"MessageConfirmRemoveEpisodes": "Weet je zeker dat je {0} afleveringen wil verwijderen?",
|
||||||
"MessageConfirmRemoveListeningSessions": "Weet je zeker dat je {0} luistersessies wilt verwijderen?",
|
"MessageConfirmRemoveListeningSessions": "Weet je zeker dat je {0} luistersessies wilt verwijderen?",
|
||||||
|
"MessageConfirmRemoveMetadataFiles": "Bent u zeker dat u alle metadata wil verwijderen. {0} bestanden in uw bibliotheel item folders?",
|
||||||
"MessageConfirmRemoveNarrator": "Weet je zeker dat je verteller \"{0}\" wil verwijderen?",
|
"MessageConfirmRemoveNarrator": "Weet je zeker dat je verteller \"{0}\" wil verwijderen?",
|
||||||
"MessageConfirmRemovePlaylist": "Weet je zeker dat je je afspeellijst \"{0}\" wil verwijderen?",
|
"MessageConfirmRemovePlaylist": "Weet je zeker dat je je afspeellijst \"{0}\" wil verwijderen?",
|
||||||
"MessageConfirmRenameGenre": "Weet je zeker dat je genre \"{0}\" wil hernoemen naar \"{1}\" voor alle onderdelen?",
|
"MessageConfirmRenameGenre": "Weet je zeker dat je genre \"{0}\" wil hernoemen naar \"{1}\" voor alle onderdelen?",
|
||||||
@ -552,11 +740,16 @@
|
|||||||
"MessageConfirmRenameTag": "Weet je zeker dat je tag \"{0}\" wil hernoemen naar\"{1}\" voor alle onderdelen?",
|
"MessageConfirmRenameTag": "Weet je zeker dat je tag \"{0}\" wil hernoemen naar\"{1}\" voor alle onderdelen?",
|
||||||
"MessageConfirmRenameTagMergeNote": "Opmerking: Deze tag bestaat al, dus zullen ze worden samengevoegd.",
|
"MessageConfirmRenameTagMergeNote": "Opmerking: Deze tag bestaat al, dus zullen ze worden samengevoegd.",
|
||||||
"MessageConfirmRenameTagWarning": "Waarschuwing! Een gelijknamige tag met ander hoofdlettergebruik bestaat al: \"{0}\".",
|
"MessageConfirmRenameTagWarning": "Waarschuwing! Een gelijknamige tag met ander hoofdlettergebruik bestaat al: \"{0}\".",
|
||||||
|
"MessageConfirmResetProgress": "Bet u zeker dat u uw voortgang wil resetten?",
|
||||||
"MessageConfirmSendEbookToDevice": "Weet je zeker dat je {0} ebook \"{1}\" naar apparaat \"{2}\" wil sturen?",
|
"MessageConfirmSendEbookToDevice": "Weet je zeker dat je {0} ebook \"{1}\" naar apparaat \"{2}\" wil sturen?",
|
||||||
|
"MessageConfirmUnlinkOpenId": "Bent u zeker dat u deze gebruiker wil ontkoppelen van OpenID?",
|
||||||
"MessageDownloadingEpisode": "Aflevering aan het dowloaden",
|
"MessageDownloadingEpisode": "Aflevering aan het dowloaden",
|
||||||
"MessageDragFilesIntoTrackOrder": "Sleep bestanden in de juiste trackvolgorde",
|
"MessageDragFilesIntoTrackOrder": "Sleep bestanden in de juiste trackvolgorde",
|
||||||
|
"MessageEmbedFailed": "Insluiten Mislukt!",
|
||||||
"MessageEmbedFinished": "Insluiting voltooid!",
|
"MessageEmbedFinished": "Insluiting voltooid!",
|
||||||
|
"MessageEmbedQueue": "In de wachtrij voor metadata-embed ({0} in wachtrij)",
|
||||||
"MessageEpisodesQueuedForDownload": "{0} aflevering(en) in de rij om te downloaden",
|
"MessageEpisodesQueuedForDownload": "{0} aflevering(en) in de rij om te downloaden",
|
||||||
|
"MessageEreaderDevices": "Om de levering van e-books te garanderen, moet u mogelijk bovenstaand e-mailadres opgeven als geldige afzender voor elk hieronder vermeld apparaat.",
|
||||||
"MessageFeedURLWillBe": "Feed URL zal {0} zijn",
|
"MessageFeedURLWillBe": "Feed URL zal {0} zijn",
|
||||||
"MessageFetching": "Aan het ophalen...",
|
"MessageFetching": "Aan het ophalen...",
|
||||||
"MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.",
|
"MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.",
|
||||||
@ -568,6 +761,7 @@
|
|||||||
"MessageListeningSessionsInTheLastYear": "{0} luistersessies in het laatste jaar",
|
"MessageListeningSessionsInTheLastYear": "{0} luistersessies in het laatste jaar",
|
||||||
"MessageLoading": "Aan het laden...",
|
"MessageLoading": "Aan het laden...",
|
||||||
"MessageLoadingFolders": "Mappen aan het laden...",
|
"MessageLoadingFolders": "Mappen aan het laden...",
|
||||||
|
"MessageLogsDescription": "Logs worden opgeslagen in <code>/metadata/logs</code> als JSON-bestanden. Crashlogs worden opgeslagen in <code>/metadata/logs/crash_logs.txt</code>.",
|
||||||
"MessageM4BFailed": "M4B mislukt!",
|
"MessageM4BFailed": "M4B mislukt!",
|
||||||
"MessageM4BFinished": "M4B voltooid!",
|
"MessageM4BFinished": "M4B voltooid!",
|
||||||
"MessageMapChapterTitles": "Map hoofdstuktitels naar je bestaande audioboekhoofdstukken zonder aanpassing van tijden",
|
"MessageMapChapterTitles": "Map hoofdstuktitels naar je bestaande audioboekhoofdstukken zonder aanpassing van tijden",
|
||||||
@ -584,6 +778,7 @@
|
|||||||
"MessageNoCollections": "Geen collecties",
|
"MessageNoCollections": "Geen collecties",
|
||||||
"MessageNoCoversFound": "Geen covers gevonden",
|
"MessageNoCoversFound": "Geen covers gevonden",
|
||||||
"MessageNoDescription": "Geen beschrijving",
|
"MessageNoDescription": "Geen beschrijving",
|
||||||
|
"MessageNoDevices": "Geen Apparaten",
|
||||||
"MessageNoDownloadsInProgress": "Geen downloads bezig op dit moment",
|
"MessageNoDownloadsInProgress": "Geen downloads bezig op dit moment",
|
||||||
"MessageNoDownloadsQueued": "Geen downloads in de wachtrij",
|
"MessageNoDownloadsQueued": "Geen downloads in de wachtrij",
|
||||||
"MessageNoEpisodeMatchesFound": "Geen afleveringsmatches gevonden",
|
"MessageNoEpisodeMatchesFound": "Geen afleveringsmatches gevonden",
|
||||||
@ -597,6 +792,7 @@
|
|||||||
"MessageNoLogs": "Geen logs",
|
"MessageNoLogs": "Geen logs",
|
||||||
"MessageNoMediaProgress": "Geen mediavoortgang",
|
"MessageNoMediaProgress": "Geen mediavoortgang",
|
||||||
"MessageNoNotifications": "Geen notificaties",
|
"MessageNoNotifications": "Geen notificaties",
|
||||||
|
"MessageNoPodcastFeed": "Ongeldige podcast: Geen Feed",
|
||||||
"MessageNoPodcastsFound": "Geen podcasts gevonden",
|
"MessageNoPodcastsFound": "Geen podcasts gevonden",
|
||||||
"MessageNoResults": "Geen resultaten",
|
"MessageNoResults": "Geen resultaten",
|
||||||
"MessageNoSearchResultsFor": "Geen zoekresultaten voor \"{0}\"",
|
"MessageNoSearchResultsFor": "Geen zoekresultaten voor \"{0}\"",
|
||||||
@ -606,11 +802,17 @@
|
|||||||
"MessageNoUpdatesWereNecessary": "Geen bijwerkingen waren noodzakelijk",
|
"MessageNoUpdatesWereNecessary": "Geen bijwerkingen waren noodzakelijk",
|
||||||
"MessageNoUserPlaylists": "Je hebt geen afspeellijsten",
|
"MessageNoUserPlaylists": "Je hebt geen afspeellijsten",
|
||||||
"MessageNotYetImplemented": "Nog niet geimplementeerd",
|
"MessageNotYetImplemented": "Nog niet geimplementeerd",
|
||||||
|
"MessageOpmlPreviewNote": "Let op: Dit is een preview van het geparseerde OPML-bestand. De werkelijke podcasttitel wordt overgenomen uit de RSS-feed.",
|
||||||
"MessageOr": "of",
|
"MessageOr": "of",
|
||||||
"MessagePauseChapter": "Pauzeer afspelen hoofdstuk",
|
"MessagePauseChapter": "Pauzeer afspelen hoofdstuk",
|
||||||
"MessagePlayChapter": "Luister naar begin van hoofdstuk",
|
"MessagePlayChapter": "Luister naar begin van hoofdstuk",
|
||||||
"MessagePlaylistCreateFromCollection": "Afspeellijst aanmaken vanuit collectie",
|
"MessagePlaylistCreateFromCollection": "Afspeellijst aanmaken vanuit collectie",
|
||||||
|
"MessagePleaseWait": "Even geduld...",
|
||||||
"MessagePodcastHasNoRSSFeedForMatching": "Podcast heeft geen RSS-feed URL om te gebruiken voor matching",
|
"MessagePodcastHasNoRSSFeedForMatching": "Podcast heeft geen RSS-feed URL om te gebruiken voor matching",
|
||||||
|
"MessagePodcastSearchField": "Voer zoekterm of RSS-feed-URL in",
|
||||||
|
"MessageQuickEmbedInProgress": "Snelle inbedding in uitvoering",
|
||||||
|
"MessageQuickEmbedQueue": "In de wachtrij voor snelle insluiting ({0} in wachtrij)",
|
||||||
|
"MessageQuickMatchAllEpisodes": "Alle Afleveringen Snel Matchen",
|
||||||
"MessageQuickMatchDescription": "Vul lege onderdeeldetails & cover met eerste matchresultaat van '{0}'. Overschrijft geen details tenzij 'Prefereer gematchte metadata' serverinstelling is ingeschakeld.",
|
"MessageQuickMatchDescription": "Vul lege onderdeeldetails & cover met eerste matchresultaat van '{0}'. Overschrijft geen details tenzij 'Prefereer gematchte metadata' serverinstelling is ingeschakeld.",
|
||||||
"MessageRemoveChapter": "Verwijder hoofdstuk",
|
"MessageRemoveChapter": "Verwijder hoofdstuk",
|
||||||
"MessageRemoveEpisodes": "Verwijder {0} aflevering(en)",
|
"MessageRemoveEpisodes": "Verwijder {0} aflevering(en)",
|
||||||
@ -621,10 +823,48 @@
|
|||||||
"MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op",
|
"MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op",
|
||||||
"MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
|
"MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
|
||||||
"MessageSearchResultsFor": "Zoekresultaten voor",
|
"MessageSearchResultsFor": "Zoekresultaten voor",
|
||||||
|
"MessageSelected": "{0} geselecteerd",
|
||||||
"MessageServerCouldNotBeReached": "Server niet bereikbaar",
|
"MessageServerCouldNotBeReached": "Server niet bereikbaar",
|
||||||
"MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel",
|
"MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel",
|
||||||
|
"MessageShareExpirationWillBe": "Vervaldatum is <strong>{0}</strong>",
|
||||||
"MessageShareExpiresIn": "Vervalt in {0}",
|
"MessageShareExpiresIn": "Vervalt in {0}",
|
||||||
|
"MessageShareURLWillBe": "De gedeelde URL wordt <strong>{0}</strong>",
|
||||||
"MessageStartPlaybackAtTime": "Afspelen van \"{0}\" beginnen op {1}?",
|
"MessageStartPlaybackAtTime": "Afspelen van \"{0}\" beginnen op {1}?",
|
||||||
|
"MessageTaskAudioFileNotWritable": "Audiobestand \"{0}\" is niet beschrijfbaar",
|
||||||
|
"MessageTaskCanceledByUser": "Taak geannuleerd door gebruiker",
|
||||||
|
"MessageTaskDownloadingEpisodeDescription": "Aflevering \"{0}\" downloaden",
|
||||||
|
"MessageTaskEmbeddingMetadata": "Metadata insluiten",
|
||||||
|
"MessageTaskEmbeddingMetadataDescription": "Metadata insluiten in audioboek \"{0}\"",
|
||||||
|
"MessageTaskEncodingM4b": "M4B Encoden",
|
||||||
|
"MessageTaskEncodingM4bDescription": "Audioboek \"{0}\" coderen in één m4b-bestand",
|
||||||
|
"MessageTaskFailed": "Mislukt",
|
||||||
|
"MessageTaskFailedToBackupAudioFile": "Het is niet gelukt om een back-up te maken van audiobestand \"{0}\"",
|
||||||
|
"MessageTaskFailedToCreateCacheDirectory": "Het is niet gelukt om een cachemap te maken",
|
||||||
|
"MessageTaskFailedToEmbedMetadataInFile": "Het is niet gelukt om metagegevens in bestand \"{0}\" in te sluiten",
|
||||||
|
"MessageTaskFailedToMergeAudioFiles": "Audiobestanden samenvoegen mislukt",
|
||||||
|
"MessageTaskFailedToMoveM4bFile": "m4b bestand verplaatsen mislukt",
|
||||||
|
"MessageTaskFailedToWriteMetadataFile": "Metadata bestand schrijven mislukt",
|
||||||
|
"MessageTaskMatchingBooksInLibrary": "Overeenkomende boeken in bibliotheek \"{0}\"",
|
||||||
|
"MessageTaskNoFilesToScan": "Geen bestanden om te scannen",
|
||||||
|
"MessageTaskOpmlImport": "OPML importeren",
|
||||||
|
"MessageTaskOpmlImportDescription": "Podcasts maken van {0} RSS feeds",
|
||||||
|
"MessageTaskOpmlImportFeed": "OPML feed importeren",
|
||||||
|
"MessageTaskOpmlImportFeedDescription": "RSS feed \"{0}\" importeren",
|
||||||
|
"MessageTaskOpmlImportFeedFailed": "Podcastfeed kon niet worden opgehaald",
|
||||||
|
"MessageTaskOpmlImportFeedPodcastDescription": "Podcast \"{0}\" maken",
|
||||||
|
"MessageTaskOpmlImportFeedPodcastExists": "Podcast bestaat al in pad",
|
||||||
|
"MessageTaskOpmlImportFeedPodcastFailed": "Mislukt om podcast aan te maken",
|
||||||
|
"MessageTaskOpmlImportFinished": "{0} podcasts toegevoegd",
|
||||||
|
"MessageTaskOpmlParseFailed": "Het is niet gelukt om het OPML-bestand te parseren",
|
||||||
|
"MessageTaskOpmlParseFastFail": "Ongeldig OPML-bestand <opml> tag niet gevonden OF een <outline> tag is niet gevonden",
|
||||||
|
"MessageTaskOpmlParseNoneFound": "Geen feeds gevonden in OPML bestand",
|
||||||
|
"MessageTaskScanItemsAdded": "{0} toegevoegd",
|
||||||
|
"MessageTaskScanItemsMissing": "{0} missend",
|
||||||
|
"MessageTaskScanItemsUpdated": "{0} bijgewerkt",
|
||||||
|
"MessageTaskScanNoChangesNeeded": "Geen aanpassingen nodig",
|
||||||
|
"MessageTaskScanningFileChanges": "Scannen van bestandswijzigingen in \"{0}\"",
|
||||||
|
"MessageTaskScanningLibrary": "Scannen van bibliotheek \"{0}\"",
|
||||||
|
"MessageTaskTargetDirectoryNotWritable": "Doelmap is niet beschrijfbaar",
|
||||||
"MessageThinking": "Aan het denken...",
|
"MessageThinking": "Aan het denken...",
|
||||||
"MessageUploaderItemFailed": "Uploaden mislukt",
|
"MessageUploaderItemFailed": "Uploaden mislukt",
|
||||||
"MessageUploaderItemSuccess": "Uploaden gelukt!",
|
"MessageUploaderItemSuccess": "Uploaden gelukt!",
|
||||||
@ -642,40 +882,104 @@
|
|||||||
"NoteUploaderFoldersWithMediaFiles": "Mappen met mediabestanden zullen worden behandeld als aparte bibliotheekonderdelen.",
|
"NoteUploaderFoldersWithMediaFiles": "Mappen met mediabestanden zullen worden behandeld als aparte bibliotheekonderdelen.",
|
||||||
"NoteUploaderOnlyAudioFiles": "Bij uploaden van uitsluitend audiobestanden wordt ieder audiobestand als apart audiobook worden behandeld.",
|
"NoteUploaderOnlyAudioFiles": "Bij uploaden van uitsluitend audiobestanden wordt ieder audiobestand als apart audiobook worden behandeld.",
|
||||||
"NoteUploaderUnsupportedFiles": "Niet-ondersteunde bestanden worden genegeerd. Bij het kiezen of neerzetten van een map worden andere bestanden die niet in de map staan genegeerd.",
|
"NoteUploaderUnsupportedFiles": "Niet-ondersteunde bestanden worden genegeerd. Bij het kiezen of neerzetten van een map worden andere bestanden die niet in de map staan genegeerd.",
|
||||||
|
"NotificationOnBackupCompletedDescription": "Wordt geactiveerd wanneer een back-up is voltooid",
|
||||||
|
"NotificationOnBackupFailedDescription": "Wordt geactiveerd wanneer een back-up mislukt",
|
||||||
|
"NotificationOnEpisodeDownloadedDescription": "Wordt geactiveerd wanneer een podcastaflevering automatisch wordt gedownload",
|
||||||
|
"NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem",
|
||||||
"PlaceholderNewCollection": "Nieuwe naam collectie",
|
"PlaceholderNewCollection": "Nieuwe naam collectie",
|
||||||
"PlaceholderNewFolderPath": "Nieuwe locatie map",
|
"PlaceholderNewFolderPath": "Nieuwe locatie map",
|
||||||
"PlaceholderNewPlaylist": "Nieuwe naam afspeellijst",
|
"PlaceholderNewPlaylist": "Nieuwe naam afspeellijst",
|
||||||
"PlaceholderSearch": "Zoeken..",
|
"PlaceholderSearch": "Zoeken..",
|
||||||
"PlaceholderSearchEpisode": "Aflevering zoeken..",
|
"PlaceholderSearchEpisode": "Aflevering zoeken..",
|
||||||
|
"StatsAuthorsAdded": "auteurs toegevoegd",
|
||||||
|
"StatsBooksAdded": "boeken toegevoegd",
|
||||||
|
"StatsBooksAdditional": "Enkele toevoegingen zijn…",
|
||||||
|
"StatsBooksFinished": "boeken voltooid",
|
||||||
|
"StatsBooksFinishedThisYear": "Enkele boeken voltooid dit jaar…",
|
||||||
|
"StatsBooksListenedTo": "geluisterde boeken",
|
||||||
|
"StatsCollectionGrewTo": "Je boeken collectie groeide tot…",
|
||||||
|
"StatsSessions": "sessies",
|
||||||
|
"StatsSpentListening": "tijd geluisterd",
|
||||||
|
"StatsTopAuthor": "TOP AUTEUR",
|
||||||
|
"StatsTopAuthors": "TOP AUTEURS",
|
||||||
|
"StatsTopGenre": "TOP GENRE",
|
||||||
|
"StatsTopGenres": "TOP GENRES",
|
||||||
|
"StatsTopMonth": "TOP MAAND",
|
||||||
|
"StatsTopNarrator": "TOP VERTELLER",
|
||||||
|
"StatsTopNarrators": "TOP VERTELLERS",
|
||||||
|
"StatsTotalDuration": "Met een totale tijd van…",
|
||||||
|
"StatsYearInReview": "JAAR IN REVIEW",
|
||||||
"ToastAccountUpdateSuccess": "Account bijgewerkt",
|
"ToastAccountUpdateSuccess": "Account bijgewerkt",
|
||||||
|
"ToastAppriseUrlRequired": "Moet een Apprise URL invoeren",
|
||||||
|
"ToastAsinRequired": "ASIN is vereist",
|
||||||
"ToastAuthorImageRemoveSuccess": "Afbeelding auteur verwijderd",
|
"ToastAuthorImageRemoveSuccess": "Afbeelding auteur verwijderd",
|
||||||
|
"ToastAuthorNotFound": "Auteur \"{0}\" niet gevonden",
|
||||||
|
"ToastAuthorRemoveSuccess": "Auteur verwijderd",
|
||||||
|
"ToastAuthorSearchNotFound": "Auteur niet gevonden",
|
||||||
"ToastAuthorUpdateMerged": "Auteur samengevoegd",
|
"ToastAuthorUpdateMerged": "Auteur samengevoegd",
|
||||||
"ToastAuthorUpdateSuccess": "Auteur bijgewerkt",
|
"ToastAuthorUpdateSuccess": "Auteur bijgewerkt",
|
||||||
"ToastAuthorUpdateSuccessNoImageFound": "Auteur bijgewerkt (geen afbeelding gevonden)",
|
"ToastAuthorUpdateSuccessNoImageFound": "Auteur bijgewerkt (geen afbeelding gevonden)",
|
||||||
|
"ToastBackupAppliedSuccess": "Backup toegepast",
|
||||||
"ToastBackupCreateFailed": "Back-up maken mislukt",
|
"ToastBackupCreateFailed": "Back-up maken mislukt",
|
||||||
"ToastBackupCreateSuccess": "Back-up gemaakt",
|
"ToastBackupCreateSuccess": "Back-up gemaakt",
|
||||||
"ToastBackupDeleteFailed": "Verwijderen back-up mislukt",
|
"ToastBackupDeleteFailed": "Verwijderen back-up mislukt",
|
||||||
"ToastBackupDeleteSuccess": "Back-up verwijderd",
|
"ToastBackupDeleteSuccess": "Back-up verwijderd",
|
||||||
|
"ToastBackupInvalidMaxKeep": "Ongeldig aantal backups om bij te houden",
|
||||||
|
"ToastBackupInvalidMaxSize": "Ongeldige maximum backupgrootte",
|
||||||
"ToastBackupRestoreFailed": "Herstellen back-up mislukt",
|
"ToastBackupRestoreFailed": "Herstellen back-up mislukt",
|
||||||
"ToastBackupUploadFailed": "Uploaden back-up mislukt",
|
"ToastBackupUploadFailed": "Uploaden back-up mislukt",
|
||||||
"ToastBackupUploadSuccess": "Back-up geüpload",
|
"ToastBackupUploadSuccess": "Back-up geüpload",
|
||||||
|
"ToastBatchDeleteFailed": "Batch verwijderen mislukt",
|
||||||
|
"ToastBatchDeleteSuccess": "Batch verwijderen gelukt",
|
||||||
|
"ToastBatchQuickMatchFailed": "Batch Snel Vergelijken mislukt!",
|
||||||
|
"ToastBatchQuickMatchStarted": "Bulk Snel Vergelijken van {0} boeken gestart!",
|
||||||
"ToastBatchUpdateFailed": "Bulk-bijwerking mislukt",
|
"ToastBatchUpdateFailed": "Bulk-bijwerking mislukt",
|
||||||
"ToastBatchUpdateSuccess": "Bulk-bijwerking gelukt",
|
"ToastBatchUpdateSuccess": "Bulk-bijwerking gelukt",
|
||||||
"ToastBookmarkCreateFailed": "Aanmaken boekwijzer mislukt",
|
"ToastBookmarkCreateFailed": "Aanmaken boekwijzer mislukt",
|
||||||
"ToastBookmarkCreateSuccess": "boekwijzer toegevoegd",
|
"ToastBookmarkCreateSuccess": "boekwijzer toegevoegd",
|
||||||
"ToastBookmarkRemoveSuccess": "Boekwijzer verwijderd",
|
"ToastBookmarkRemoveSuccess": "Boekwijzer verwijderd",
|
||||||
"ToastBookmarkUpdateSuccess": "Boekwijzer bijgewerkt",
|
"ToastBookmarkUpdateSuccess": "Boekwijzer bijgewerkt",
|
||||||
|
"ToastCachePurgeFailed": "Cache wissen is mislukt",
|
||||||
|
"ToastCachePurgeSuccess": "Cache succesvol verwijderd",
|
||||||
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
|
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
|
||||||
"ToastChaptersMustHaveTitles": "Hoofdstukken moeten titels hebben",
|
"ToastChaptersMustHaveTitles": "Hoofdstukken moeten titels hebben",
|
||||||
|
"ToastChaptersRemoved": "Hoofdstukken verwijderd",
|
||||||
|
"ToastChaptersUpdated": "Hoofdstukken bijgewerkt",
|
||||||
|
"ToastCollectionItemsAddFailed": "Item(s) toegevoegd aan collectie mislukt",
|
||||||
|
"ToastCollectionItemsAddSuccess": "Item(s) toegevoegd aan collectie gelukt",
|
||||||
"ToastCollectionItemsRemoveSuccess": "Onderdeel (of onderdelen) verwijderd uit collectie",
|
"ToastCollectionItemsRemoveSuccess": "Onderdeel (of onderdelen) verwijderd uit collectie",
|
||||||
"ToastCollectionRemoveSuccess": "Collectie verwijderd",
|
"ToastCollectionRemoveSuccess": "Collectie verwijderd",
|
||||||
"ToastCollectionUpdateSuccess": "Collectie bijgewerkt",
|
"ToastCollectionUpdateSuccess": "Collectie bijgewerkt",
|
||||||
|
"ToastCoverUpdateFailed": "Cover update mislukt",
|
||||||
|
"ToastDeleteFileFailed": "Bestand verwijderen mislukt",
|
||||||
|
"ToastDeleteFileSuccess": "Bestand verwijderd",
|
||||||
|
"ToastDeviceAddFailed": "Apparaat toevoegen mislukt",
|
||||||
|
"ToastDeviceNameAlreadyExists": "Er bestaat al een e-reader met die naam",
|
||||||
|
"ToastDeviceTestEmailFailed": "Het is niet gelukt om een test-e-mail te verzenden",
|
||||||
|
"ToastDeviceTestEmailSuccess": "Test e-mail verzonden",
|
||||||
|
"ToastEmailSettingsUpdateSuccess": "Emaill intellingen bijgewerkt",
|
||||||
|
"ToastEncodeCancelFailed": "Het is niet gelukt om het coderen te annuleren",
|
||||||
|
"ToastEncodeCancelSucces": "Encode geannuleerd",
|
||||||
|
"ToastEpisodeDownloadQueueClearFailed": "Wachtrij legen mislukt",
|
||||||
|
"ToastEpisodeDownloadQueueClearSuccess": "Aflevering download-wachtrij geleegt",
|
||||||
|
"ToastEpisodeUpdateSuccess": "{0} afleveringen bijgewerkt",
|
||||||
|
"ToastErrorCannotShare": "Kan niet native delen op dit apparaat",
|
||||||
|
"ToastFailedToLoadData": "Data laden mislukt",
|
||||||
|
"ToastFailedToMatch": "Match mislukt",
|
||||||
|
"ToastFailedToShare": "Delen mislukt",
|
||||||
|
"ToastFailedToUpdate": "Update mislukt",
|
||||||
|
"ToastInvalidImageUrl": "Ongeldige afbeeldings-URL",
|
||||||
|
"ToastInvalidMaxEpisodesToDownload": "Ongeldig maximum aantal afleveringen om te downloaden",
|
||||||
|
"ToastInvalidUrl": "Ongeldige URL",
|
||||||
"ToastItemCoverUpdateSuccess": "Cover onderdeel bijgewerkt",
|
"ToastItemCoverUpdateSuccess": "Cover onderdeel bijgewerkt",
|
||||||
|
"ToastItemDeletedFailed": "Item verwijderen mislukt",
|
||||||
|
"ToastItemDeletedSuccess": "Verwijderd item",
|
||||||
"ToastItemDetailsUpdateSuccess": "Details onderdeel bijgewerkt",
|
"ToastItemDetailsUpdateSuccess": "Details onderdeel bijgewerkt",
|
||||||
"ToastItemMarkedAsFinishedFailed": "Markeren als Voltooid mislukt",
|
"ToastItemMarkedAsFinishedFailed": "Markeren als Voltooid mislukt",
|
||||||
"ToastItemMarkedAsFinishedSuccess": "Onderdeel gemarkeerd als Voltooid",
|
"ToastItemMarkedAsFinishedSuccess": "Onderdeel gemarkeerd als Voltooid",
|
||||||
"ToastItemMarkedAsNotFinishedFailed": "Markeren als Niet Voltooid mislukt",
|
"ToastItemMarkedAsNotFinishedFailed": "Markeren als Niet Voltooid mislukt",
|
||||||
"ToastItemMarkedAsNotFinishedSuccess": "Onderdeel gemarkeerd als Niet Voltooid",
|
"ToastItemMarkedAsNotFinishedSuccess": "Onderdeel gemarkeerd als Niet Voltooid",
|
||||||
|
"ToastItemUpdateSuccess": "Item bijgewerkt",
|
||||||
"ToastLibraryCreateFailed": "Bibliotheek aanmaken mislukt",
|
"ToastLibraryCreateFailed": "Bibliotheek aanmaken mislukt",
|
||||||
"ToastLibraryCreateSuccess": "Bibliotheek \"{0}\" aangemaakt",
|
"ToastLibraryCreateSuccess": "Bibliotheek \"{0}\" aangemaakt",
|
||||||
"ToastLibraryDeleteFailed": "Bibliotheek verwijderen mislukt",
|
"ToastLibraryDeleteFailed": "Bibliotheek verwijderen mislukt",
|
||||||
@ -683,25 +987,83 @@
|
|||||||
"ToastLibraryScanFailedToStart": "Starten scan mislukt",
|
"ToastLibraryScanFailedToStart": "Starten scan mislukt",
|
||||||
"ToastLibraryScanStarted": "Scannen bibliotheek gestart",
|
"ToastLibraryScanStarted": "Scannen bibliotheek gestart",
|
||||||
"ToastLibraryUpdateSuccess": "Bibliotheek \"{0}\" bijgewerkt",
|
"ToastLibraryUpdateSuccess": "Bibliotheek \"{0}\" bijgewerkt",
|
||||||
|
"ToastMatchAllAuthorsFailed": "Alle auteurs matchen mislukt",
|
||||||
|
"ToastMetadataFilesRemovedError": "Fout bij verwijderen van metadata. {0} bestanden",
|
||||||
|
"ToastMetadataFilesRemovedNoneFound": "Geen metadata. {0} bestanden gevonden in bibliotheek",
|
||||||
|
"ToastMetadataFilesRemovedNoneRemoved": "Geen metadata. {0} bestanden verwijderd",
|
||||||
|
"ToastMetadataFilesRemovedSuccess": "{0} metadata. {1} bestanden verwijderd",
|
||||||
|
"ToastMustHaveAtLeastOnePath": "Moet ten minste een pad hebben",
|
||||||
|
"ToastNameEmailRequired": "Naam en email zijn vereist",
|
||||||
|
"ToastNameRequired": "Naam is vereist",
|
||||||
|
"ToastNewEpisodesFound": "{0} nieuwe afleveringen gevonden",
|
||||||
|
"ToastNewUserCreatedFailed": "Account: \"{0}\" aanmaken mislukt",
|
||||||
|
"ToastNewUserCreatedSuccess": "Nieuw account aangemaakt",
|
||||||
|
"ToastNewUserLibraryError": "Moet ten minste een bibliotheek selecteren",
|
||||||
|
"ToastNewUserPasswordError": "Moet een wachtwoord hebben, enkel root gebruiker kan een leeg wachtwoord gebruiken",
|
||||||
|
"ToastNewUserTagError": "Moet ten minste een tag selecteren",
|
||||||
|
"ToastNewUserUsernameError": "Voer een gebruikersnaam in",
|
||||||
|
"ToastNoNewEpisodesFound": "Geen nieuwe afleveringen gevonden",
|
||||||
|
"ToastNoUpdatesNecessary": "Geen updates nodig",
|
||||||
|
"ToastNotificationCreateFailed": "Nieuwe melding aanmaken mislukt",
|
||||||
|
"ToastNotificationDeleteFailed": "Melding verwijderen mislukt",
|
||||||
|
"ToastNotificationFailedMaximum": "Maximum aantal pogingen moet >=0",
|
||||||
|
"ToastNotificationQueueMaximum": "Maximale meldingen wachtrij moet >=0",
|
||||||
|
"ToastNotificationSettingsUpdateSuccess": "Meldingsinstellingen bijgewerkt",
|
||||||
|
"ToastNotificationTestTriggerFailed": "Het is niet gelukt om een testmelding te activeren",
|
||||||
|
"ToastNotificationTestTriggerSuccess": "Geactiveerde testmelding",
|
||||||
|
"ToastNotificationUpdateSuccess": "Melding bijgewerkt",
|
||||||
"ToastPlaylistCreateFailed": "Aanmaken afspeellijst mislukt",
|
"ToastPlaylistCreateFailed": "Aanmaken afspeellijst mislukt",
|
||||||
"ToastPlaylistCreateSuccess": "Afspeellijst aangemaakt",
|
"ToastPlaylistCreateSuccess": "Afspeellijst aangemaakt",
|
||||||
"ToastPlaylistRemoveSuccess": "Afspeellijst verwijderd",
|
"ToastPlaylistRemoveSuccess": "Afspeellijst verwijderd",
|
||||||
"ToastPlaylistUpdateSuccess": "Afspeellijst bijgewerkt",
|
"ToastPlaylistUpdateSuccess": "Afspeellijst bijgewerkt",
|
||||||
"ToastPodcastCreateFailed": "Podcast aanmaken mislukt",
|
"ToastPodcastCreateFailed": "Podcast aanmaken mislukt",
|
||||||
"ToastPodcastCreateSuccess": "Podcast aangemaakt",
|
"ToastPodcastCreateSuccess": "Podcast aangemaakt",
|
||||||
|
"ToastPodcastGetFeedFailed": "Podcast feed ophalen mislukt",
|
||||||
|
"ToastPodcastNoEpisodesInFeed": "Geen afleveringen gevonden in RSS feed",
|
||||||
|
"ToastPodcastNoRssFeed": "Podcast heeft geen RSS feed",
|
||||||
|
"ToastProgressIsNotBeingSynced": "De voortgang wordt niet gesynchroniseerd, start het afspelen opnieuw",
|
||||||
|
"ToastProviderCreatedFailed": "Provider toevoegen mislukt",
|
||||||
|
"ToastProviderCreatedSuccess": "Nieuwe provider toegevoegd",
|
||||||
|
"ToastProviderNameAndUrlRequired": "Naam en URL vereist",
|
||||||
|
"ToastProviderRemoveSuccess": "Provider verwijderd",
|
||||||
"ToastRSSFeedCloseFailed": "Sluiten RSS-feed mislukt",
|
"ToastRSSFeedCloseFailed": "Sluiten RSS-feed mislukt",
|
||||||
"ToastRSSFeedCloseSuccess": "RSS-feed gesloten",
|
"ToastRSSFeedCloseSuccess": "RSS-feed gesloten",
|
||||||
|
"ToastRemoveFailed": "Verwijderen mislukt",
|
||||||
"ToastRemoveItemFromCollectionFailed": "Onderdeel verwijderen uit collectie mislukt",
|
"ToastRemoveItemFromCollectionFailed": "Onderdeel verwijderen uit collectie mislukt",
|
||||||
"ToastRemoveItemFromCollectionSuccess": "Onderdeel verwijderd uit collectie",
|
"ToastRemoveItemFromCollectionSuccess": "Onderdeel verwijderd uit collectie",
|
||||||
|
"ToastRemoveItemsWithIssuesFailed": "Verwijderen van bibliotheekitems met problemen mislukt",
|
||||||
|
"ToastRemoveItemsWithIssuesSuccess": "Bibliotheekitems met problemen verwijderd",
|
||||||
|
"ToastRenameFailed": "Hernoemen mislukt",
|
||||||
|
"ToastRescanFailed": "Opnieuw scannen mislukt voor {0}",
|
||||||
|
"ToastRescanRemoved": "Opnieuw scannen voltooid, item is verwijderd",
|
||||||
|
"ToastRescanUpToDate": "Rescan voltooid, item is up to date",
|
||||||
|
"ToastRescanUpdated": "Rescan voltooid, item is geupdated",
|
||||||
|
"ToastScanFailed": "Bibliotheek item scannen mislukt",
|
||||||
|
"ToastSelectAtLeastOneUser": "Selecteer ten minste een gebruiker",
|
||||||
"ToastSendEbookToDeviceFailed": "Ebook naar apparaat sturen mislukt",
|
"ToastSendEbookToDeviceFailed": "Ebook naar apparaat sturen mislukt",
|
||||||
"ToastSendEbookToDeviceSuccess": "Ebook verstuurd naar apparaat \"{0}\"",
|
"ToastSendEbookToDeviceSuccess": "Ebook verstuurd naar apparaat \"{0}\"",
|
||||||
"ToastSeriesUpdateFailed": "Bijwerken serie mislukt",
|
"ToastSeriesUpdateFailed": "Bijwerken serie mislukt",
|
||||||
"ToastSeriesUpdateSuccess": "Bijwerken serie gelukt",
|
"ToastSeriesUpdateSuccess": "Bijwerken serie gelukt",
|
||||||
|
"ToastServerSettingsUpdateSuccess": "Server instellingen bijgewerkt",
|
||||||
|
"ToastSessionCloseFailed": "Sessie sluiten mislukt",
|
||||||
"ToastSessionDeleteFailed": "Verwijderen sessie mislukt",
|
"ToastSessionDeleteFailed": "Verwijderen sessie mislukt",
|
||||||
"ToastSessionDeleteSuccess": "Sessie verwijderd",
|
"ToastSessionDeleteSuccess": "Sessie verwijderd",
|
||||||
|
"ToastSleepTimerDone": "Slaap timer voltooid... zZzzZz",
|
||||||
|
"ToastSlugMustChange": "Slug bevat ongeldige symbolen",
|
||||||
|
"ToastSlugRequired": "Slug is vereist",
|
||||||
"ToastSocketConnected": "Socket verbonden",
|
"ToastSocketConnected": "Socket verbonden",
|
||||||
"ToastSocketDisconnected": "Socket niet verbonden",
|
"ToastSocketDisconnected": "Socket niet verbonden",
|
||||||
"ToastSocketFailedToConnect": "Verbinding Socket mislukt",
|
"ToastSocketFailedToConnect": "Verbinding Socket mislukt",
|
||||||
|
"ToastSortingPrefixesEmptyError": "Moet ten minste 1 sorteer-prefix bevatten",
|
||||||
|
"ToastSortingPrefixesUpdateSuccess": "Sorteer prefixes geupdated ({0} items)",
|
||||||
|
"ToastTitleRequired": "Titel is vereist",
|
||||||
|
"ToastUnknownError": "Onbekende fout",
|
||||||
|
"ToastUnlinkOpenIdFailed": "Gebruiker ontkoppelen van OpenID mislukt",
|
||||||
|
"ToastUnlinkOpenIdSuccess": "Gebruiker ontkoppeld van OpenID",
|
||||||
"ToastUserDeleteFailed": "Verwijderen gebruiker mislukt",
|
"ToastUserDeleteFailed": "Verwijderen gebruiker mislukt",
|
||||||
"ToastUserDeleteSuccess": "Gebruiker verwijderd"
|
"ToastUserDeleteSuccess": "Gebruiker verwijderd",
|
||||||
|
"ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd",
|
||||||
|
"ToastUserPasswordMismatch": "Wachtwoorden komen niet overeen",
|
||||||
|
"ToastUserPasswordMustChange": "Het nieuwe wachtwoord kan niet overeenkomen met het oude wachtwoord",
|
||||||
|
"ToastUserRootRequireName": "U moet een root-gebruikersnaam invoeren"
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@
|
|||||||
"ButtonPurgeItemsCache": "Wyczyść dane tymczasowe pozycji",
|
"ButtonPurgeItemsCache": "Wyczyść dane tymczasowe pozycji",
|
||||||
"ButtonQueueAddItem": "Dodaj do kolejki",
|
"ButtonQueueAddItem": "Dodaj do kolejki",
|
||||||
"ButtonQueueRemoveItem": "Usuń z kolejki",
|
"ButtonQueueRemoveItem": "Usuń z kolejki",
|
||||||
|
"ButtonQuickEmbed": "Szybkie wstawienie",
|
||||||
"ButtonQuickEmbedMetadata": "Szybkie wstawianie metadanych",
|
"ButtonQuickEmbedMetadata": "Szybkie wstawianie metadanych",
|
||||||
"ButtonQuickMatch": "Szybkie dopasowanie",
|
"ButtonQuickMatch": "Szybkie dopasowanie",
|
||||||
"ButtonReScan": "Ponowne skanowanie",
|
"ButtonReScan": "Ponowne skanowanie",
|
||||||
@ -95,7 +96,7 @@
|
|||||||
"ButtonStartM4BEncode": "Eksportuj jako plik M4B",
|
"ButtonStartM4BEncode": "Eksportuj jako plik M4B",
|
||||||
"ButtonStartMetadataEmbed": "Osadź metadane",
|
"ButtonStartMetadataEmbed": "Osadź metadane",
|
||||||
"ButtonStats": "Statystyki",
|
"ButtonStats": "Statystyki",
|
||||||
"ButtonSubmit": "Pobierz",
|
"ButtonSubmit": "Zapisz",
|
||||||
"ButtonTest": "Test",
|
"ButtonTest": "Test",
|
||||||
"ButtonUnlinkOpenId": "Odłącz OpenID",
|
"ButtonUnlinkOpenId": "Odłącz OpenID",
|
||||||
"ButtonUpload": "Wgraj",
|
"ButtonUpload": "Wgraj",
|
||||||
@ -138,6 +139,7 @@
|
|||||||
"HeaderFindChapters": "Wyszukaj rozdziały",
|
"HeaderFindChapters": "Wyszukaj rozdziały",
|
||||||
"HeaderIgnoredFiles": "Zignoruj pliki",
|
"HeaderIgnoredFiles": "Zignoruj pliki",
|
||||||
"HeaderItemFiles": "Pliki",
|
"HeaderItemFiles": "Pliki",
|
||||||
|
"HeaderItemMetadataUtils": "Narzędzia dla metadanych",
|
||||||
"HeaderLastListeningSession": "Ostatnia sesja słuchania",
|
"HeaderLastListeningSession": "Ostatnia sesja słuchania",
|
||||||
"HeaderLatestEpisodes": "Najnowsze odcinki",
|
"HeaderLatestEpisodes": "Najnowsze odcinki",
|
||||||
"HeaderLibraries": "Biblioteki",
|
"HeaderLibraries": "Biblioteki",
|
||||||
@ -176,6 +178,7 @@
|
|||||||
"HeaderRemoveEpisodes": "Usuń {0} odcinków",
|
"HeaderRemoveEpisodes": "Usuń {0} odcinków",
|
||||||
"HeaderSavedMediaProgress": "Zapisany postęp",
|
"HeaderSavedMediaProgress": "Zapisany postęp",
|
||||||
"HeaderSchedule": "Harmonogram",
|
"HeaderSchedule": "Harmonogram",
|
||||||
|
"HeaderScheduleEpisodeDownloads": "Planowanie automatycznego ściągania odcinków",
|
||||||
"HeaderScheduleLibraryScans": "Zaplanuj automatyczne skanowanie biblioteki",
|
"HeaderScheduleLibraryScans": "Zaplanuj automatyczne skanowanie biblioteki",
|
||||||
"HeaderSession": "Sesja",
|
"HeaderSession": "Sesja",
|
||||||
"HeaderSetBackupSchedule": "Ustaw harmonogram tworzenia kopii zapasowej",
|
"HeaderSetBackupSchedule": "Ustaw harmonogram tworzenia kopii zapasowej",
|
||||||
@ -221,7 +224,11 @@
|
|||||||
"LabelAllUsersExcludingGuests": "Wszyscy użytkownicy z wyłączeniem gości",
|
"LabelAllUsersExcludingGuests": "Wszyscy użytkownicy z wyłączeniem gości",
|
||||||
"LabelAllUsersIncludingGuests": "Wszyscy użytkownicy, łącznie z gośćmi",
|
"LabelAllUsersIncludingGuests": "Wszyscy użytkownicy, łącznie z gośćmi",
|
||||||
"LabelAlreadyInYourLibrary": "Już istnieje w twojej bibliotece",
|
"LabelAlreadyInYourLibrary": "Już istnieje w twojej bibliotece",
|
||||||
|
"LabelApiToken": "API Token",
|
||||||
"LabelAppend": "Dołącz",
|
"LabelAppend": "Dołącz",
|
||||||
|
"LabelAudioBitrate": "Audio Bitrate (np. 128k)",
|
||||||
|
"LabelAudioChannels": "Kanały dźwięku (1 lub 2)",
|
||||||
|
"LabelAudioCodec": "Kodek audio",
|
||||||
"LabelAuthor": "Autor",
|
"LabelAuthor": "Autor",
|
||||||
"LabelAuthorFirstLast": "Autor (Rosnąco)",
|
"LabelAuthorFirstLast": "Autor (Rosnąco)",
|
||||||
"LabelAuthorLastFirst": "Author (Malejąco)",
|
"LabelAuthorLastFirst": "Author (Malejąco)",
|
||||||
@ -233,6 +240,7 @@
|
|||||||
"LabelAutoRegister": "Automatyczna rejestracja",
|
"LabelAutoRegister": "Automatyczna rejestracja",
|
||||||
"LabelAutoRegisterDescription": "Automatycznie utwórz nowych użytkowników po zalogowaniu",
|
"LabelAutoRegisterDescription": "Automatycznie utwórz nowych użytkowników po zalogowaniu",
|
||||||
"LabelBackToUser": "Powrót",
|
"LabelBackToUser": "Powrót",
|
||||||
|
"LabelBackupAudioFiles": "Kopia zapasowa plików audio",
|
||||||
"LabelBackupLocation": "Lokalizacja kopii zapasowej",
|
"LabelBackupLocation": "Lokalizacja kopii zapasowej",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Włącz automatyczne kopie zapasowe",
|
"LabelBackupsEnableAutomaticBackups": "Włącz automatyczne kopie zapasowe",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Kopie zapasowe są zapisywane w folderze /metadata/backups",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Kopie zapasowe są zapisywane w folderze /metadata/backups",
|
||||||
@ -241,15 +249,18 @@
|
|||||||
"LabelBackupsNumberToKeep": "Liczba kopii zapasowych do przechowywania",
|
"LabelBackupsNumberToKeep": "Liczba kopii zapasowych do przechowywania",
|
||||||
"LabelBackupsNumberToKeepHelp": "Tylko 1 kopia zapasowa zostanie usunięta, więc jeśli masz już więcej kopii zapasowych, powinieneś je ręcznie usunąć.",
|
"LabelBackupsNumberToKeepHelp": "Tylko 1 kopia zapasowa zostanie usunięta, więc jeśli masz już więcej kopii zapasowych, powinieneś je ręcznie usunąć.",
|
||||||
"LabelBitrate": "Bitrate",
|
"LabelBitrate": "Bitrate",
|
||||||
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Książki",
|
"LabelBooks": "Książki",
|
||||||
"LabelButtonText": "Tekst przycisku",
|
"LabelButtonText": "Tekst przycisku",
|
||||||
"LabelByAuthor": "autorstwa {0}",
|
"LabelByAuthor": "autorstwa {0}",
|
||||||
"LabelChangePassword": "Zmień hasło",
|
"LabelChangePassword": "Zmień hasło",
|
||||||
"LabelChannels": "Kanały",
|
"LabelChannels": "Kanały",
|
||||||
|
"LabelChapterCount": "{0} rozdziałów",
|
||||||
"LabelChapterTitle": "Tytuł rozdziału",
|
"LabelChapterTitle": "Tytuł rozdziału",
|
||||||
"LabelChapters": "Rozdziały",
|
"LabelChapters": "Rozdziały",
|
||||||
"LabelChaptersFound": "Znalezione rozdziały",
|
"LabelChaptersFound": "Znalezione rozdziały",
|
||||||
"LabelClickForMoreInfo": "Kliknij po więcej szczegółów",
|
"LabelClickForMoreInfo": "Kliknij po więcej szczegółów",
|
||||||
|
"LabelClickToUseCurrentValue": "Kliknij by zastosować aktualną wartość",
|
||||||
"LabelClosePlayer": "Zamknij odtwarzacz",
|
"LabelClosePlayer": "Zamknij odtwarzacz",
|
||||||
"LabelCodec": "Kodek",
|
"LabelCodec": "Kodek",
|
||||||
"LabelCollapseSeries": "Podsumuj serię",
|
"LabelCollapseSeries": "Podsumuj serię",
|
||||||
@ -299,6 +310,7 @@
|
|||||||
"LabelEmailSettingsTestAddress": "Adres testowy",
|
"LabelEmailSettingsTestAddress": "Adres testowy",
|
||||||
"LabelEmbeddedCover": "Wbudowana okładka",
|
"LabelEmbeddedCover": "Wbudowana okładka",
|
||||||
"LabelEnable": "Włącz",
|
"LabelEnable": "Włącz",
|
||||||
|
"LabelEncodingBackupLocation": "Kopia zapasowa twoich oryginalnych plików audio będzie się znajdować w:",
|
||||||
"LabelEnd": "Zakończ",
|
"LabelEnd": "Zakończ",
|
||||||
"LabelEndOfChapter": "Koniec rozdziału",
|
"LabelEndOfChapter": "Koniec rozdziału",
|
||||||
"LabelEpisode": "Odcinek",
|
"LabelEpisode": "Odcinek",
|
||||||
|
@ -66,6 +66,7 @@
|
|||||||
"ButtonPurgeItemsCache": "Очистить кэш элементов",
|
"ButtonPurgeItemsCache": "Очистить кэш элементов",
|
||||||
"ButtonQueueAddItem": "Добавить в очередь",
|
"ButtonQueueAddItem": "Добавить в очередь",
|
||||||
"ButtonQueueRemoveItem": "Удалить из очереди",
|
"ButtonQueueRemoveItem": "Удалить из очереди",
|
||||||
|
"ButtonQuickEmbed": "Быстрое внедрение",
|
||||||
"ButtonQuickEmbedMetadata": "Быстрое встраивание метаданных",
|
"ButtonQuickEmbedMetadata": "Быстрое встраивание метаданных",
|
||||||
"ButtonQuickMatch": "Быстрый поиск",
|
"ButtonQuickMatch": "Быстрый поиск",
|
||||||
"ButtonReScan": "Пересканировать",
|
"ButtonReScan": "Пересканировать",
|
||||||
@ -162,6 +163,7 @@
|
|||||||
"HeaderNotificationUpdate": "Уведомление об обновлении",
|
"HeaderNotificationUpdate": "Уведомление об обновлении",
|
||||||
"HeaderNotifications": "Уведомления",
|
"HeaderNotifications": "Уведомления",
|
||||||
"HeaderOpenIDConnectAuthentication": "Аутентификация OpenID Connect",
|
"HeaderOpenIDConnectAuthentication": "Аутентификация OpenID Connect",
|
||||||
|
"HeaderOpenListeningSessions": "Открытые сеансы прослушивания",
|
||||||
"HeaderOpenRSSFeed": "Открыть RSS-канал",
|
"HeaderOpenRSSFeed": "Открыть RSS-канал",
|
||||||
"HeaderOtherFiles": "Другие файлы",
|
"HeaderOtherFiles": "Другие файлы",
|
||||||
"HeaderPasswordAuthentication": "Аутентификация по паролю",
|
"HeaderPasswordAuthentication": "Аутентификация по паролю",
|
||||||
@ -179,6 +181,7 @@
|
|||||||
"HeaderRemoveEpisodes": "Удалить {0} эпизодов",
|
"HeaderRemoveEpisodes": "Удалить {0} эпизодов",
|
||||||
"HeaderSavedMediaProgress": "Прогресс медиа сохранен",
|
"HeaderSavedMediaProgress": "Прогресс медиа сохранен",
|
||||||
"HeaderSchedule": "Планировщик",
|
"HeaderSchedule": "Планировщик",
|
||||||
|
"HeaderScheduleEpisodeDownloads": "Запланируйте автоматическую загрузку эпизодов",
|
||||||
"HeaderScheduleLibraryScans": "Планировщик автоматического сканирования библиотеки",
|
"HeaderScheduleLibraryScans": "Планировщик автоматического сканирования библиотеки",
|
||||||
"HeaderSession": "Сеансы",
|
"HeaderSession": "Сеансы",
|
||||||
"HeaderSetBackupSchedule": "Установить планировщик бэкапов",
|
"HeaderSetBackupSchedule": "Установить планировщик бэкапов",
|
||||||
@ -224,7 +227,11 @@
|
|||||||
"LabelAllUsersExcludingGuests": "Все пользователи, кроме гостей",
|
"LabelAllUsersExcludingGuests": "Все пользователи, кроме гостей",
|
||||||
"LabelAllUsersIncludingGuests": "Все пользователи, включая гостей",
|
"LabelAllUsersIncludingGuests": "Все пользователи, включая гостей",
|
||||||
"LabelAlreadyInYourLibrary": "Уже в Вашей библиотеке",
|
"LabelAlreadyInYourLibrary": "Уже в Вашей библиотеке",
|
||||||
|
"LabelApiToken": "Токен API",
|
||||||
"LabelAppend": "Добавить",
|
"LabelAppend": "Добавить",
|
||||||
|
"LabelAudioBitrate": "Битрейт аудио (напр. 128k)",
|
||||||
|
"LabelAudioChannels": "Аудиоканалы (1 или 2)",
|
||||||
|
"LabelAudioCodec": "Аудиокодек",
|
||||||
"LabelAuthor": "Автор",
|
"LabelAuthor": "Автор",
|
||||||
"LabelAuthorFirstLast": "Автор (Имя Фамилия)",
|
"LabelAuthorFirstLast": "Автор (Имя Фамилия)",
|
||||||
"LabelAuthorLastFirst": "Автор (Фамилия, Имя)",
|
"LabelAuthorLastFirst": "Автор (Фамилия, Имя)",
|
||||||
@ -237,6 +244,7 @@
|
|||||||
"LabelAutoRegister": "Автоматическая регистрация",
|
"LabelAutoRegister": "Автоматическая регистрация",
|
||||||
"LabelAutoRegisterDescription": "Автоматическое создание новых пользователей после входа в систему",
|
"LabelAutoRegisterDescription": "Автоматическое создание новых пользователей после входа в систему",
|
||||||
"LabelBackToUser": "Назад к пользователю",
|
"LabelBackToUser": "Назад к пользователю",
|
||||||
|
"LabelBackupAudioFiles": "Резервное копирование аудиофайлов",
|
||||||
"LabelBackupLocation": "Путь для бэкапов",
|
"LabelBackupLocation": "Путь для бэкапов",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Включить автоматическое бэкапирование",
|
"LabelBackupsEnableAutomaticBackups": "Включить автоматическое бэкапирование",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Бэкапы сохраняются в /metadata/backups",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Бэкапы сохраняются в /metadata/backups",
|
||||||
@ -245,15 +253,18 @@
|
|||||||
"LabelBackupsNumberToKeep": "Сохранять бэкапов",
|
"LabelBackupsNumberToKeep": "Сохранять бэкапов",
|
||||||
"LabelBackupsNumberToKeepHelp": "За один раз только 1 бэкап будет удален, так что если у вас будет больше бэкапов, то их нужно удалить вручную.",
|
"LabelBackupsNumberToKeepHelp": "За один раз только 1 бэкап будет удален, так что если у вас будет больше бэкапов, то их нужно удалить вручную.",
|
||||||
"LabelBitrate": "Битрейт",
|
"LabelBitrate": "Битрейт",
|
||||||
|
"LabelBonus": "Бонус",
|
||||||
"LabelBooks": "Книги",
|
"LabelBooks": "Книги",
|
||||||
"LabelButtonText": "Текст кнопки",
|
"LabelButtonText": "Текст кнопки",
|
||||||
"LabelByAuthor": "{0}",
|
"LabelByAuthor": "{0}",
|
||||||
"LabelChangePassword": "Изменить пароль",
|
"LabelChangePassword": "Изменить пароль",
|
||||||
"LabelChannels": "Каналы",
|
"LabelChannels": "Каналы",
|
||||||
|
"LabelChapterCount": "{0} Главы",
|
||||||
"LabelChapterTitle": "Название главы",
|
"LabelChapterTitle": "Название главы",
|
||||||
"LabelChapters": "Главы",
|
"LabelChapters": "Главы",
|
||||||
"LabelChaptersFound": "глав найдено",
|
"LabelChaptersFound": "глав найдено",
|
||||||
"LabelClickForMoreInfo": "Нажмите, чтобы узнать больше",
|
"LabelClickForMoreInfo": "Нажмите, чтобы узнать больше",
|
||||||
|
"LabelClickToUseCurrentValue": "Нажмите, чтобы использовать текущее значение",
|
||||||
"LabelClosePlayer": "Закрыть проигрыватель",
|
"LabelClosePlayer": "Закрыть проигрыватель",
|
||||||
"LabelCodec": "Кодек",
|
"LabelCodec": "Кодек",
|
||||||
"LabelCollapseSeries": "Свернуть серии",
|
"LabelCollapseSeries": "Свернуть серии",
|
||||||
@ -303,12 +314,25 @@
|
|||||||
"LabelEmailSettingsTestAddress": "Тестовый адрес",
|
"LabelEmailSettingsTestAddress": "Тестовый адрес",
|
||||||
"LabelEmbeddedCover": "Встроенная обложка",
|
"LabelEmbeddedCover": "Встроенная обложка",
|
||||||
"LabelEnable": "Включить",
|
"LabelEnable": "Включить",
|
||||||
|
"LabelEncodingBackupLocation": "Резервная копия ваших оригинальных аудиофайлов будет сохранена в:",
|
||||||
|
"LabelEncodingChaptersNotEmbedded": "Главы не встраиваются в многодорожечные аудиокниги.",
|
||||||
|
"LabelEncodingClearItemCache": "Обязательно периодически очищайте кэш элементов.",
|
||||||
|
"LabelEncodingFinishedM4B": "Готовый M4B будет помещен в вашу папку с аудиокнигами по адресу:",
|
||||||
|
"LabelEncodingInfoEmbedded": "Метаданные будут встроены в звуковые дорожки внутри папки вашей аудиокниги.",
|
||||||
|
"LabelEncodingStartedNavigation": "Как только задача будет запущена, вы сможете перейти с этой страницы.",
|
||||||
|
"LabelEncodingTimeWarning": "Кодирование может занять до 30 минут.",
|
||||||
|
"LabelEncodingWarningAdvancedSettings": "Предупреждение: Не обновляйте эти настройки, если вы не знакомы с параметрами кодировки ffmpeg.",
|
||||||
|
"LabelEncodingWatcherDisabled": "Если у вас отключено наблюдение за папкой, вам нужно будет повторно пересканировать эту аудиокнигу.",
|
||||||
"LabelEnd": "Конец",
|
"LabelEnd": "Конец",
|
||||||
"LabelEndOfChapter": "Конец главы",
|
"LabelEndOfChapter": "Конец главы",
|
||||||
"LabelEpisode": "Эпизод",
|
"LabelEpisode": "Эпизод",
|
||||||
|
"LabelEpisodeNotLinkedToRssFeed": "Эпизод, не связанный с RSS-каналом",
|
||||||
|
"LabelEpisodeNumber": "Эпизод #{0}",
|
||||||
"LabelEpisodeTitle": "Имя эпизода",
|
"LabelEpisodeTitle": "Имя эпизода",
|
||||||
"LabelEpisodeType": "Тип эпизода",
|
"LabelEpisodeType": "Тип эпизода",
|
||||||
|
"LabelEpisodeUrlFromRssFeed": "URL-адрес эпизода из RSS-ленты",
|
||||||
"LabelEpisodes": "Эпизодов",
|
"LabelEpisodes": "Эпизодов",
|
||||||
|
"LabelEpisodic": "Эпизодический",
|
||||||
"LabelExample": "Пример",
|
"LabelExample": "Пример",
|
||||||
"LabelExpandSeries": "Развернуть серию",
|
"LabelExpandSeries": "Развернуть серию",
|
||||||
"LabelExpandSubSeries": "Развернуть подсерию",
|
"LabelExpandSubSeries": "Развернуть подсерию",
|
||||||
@ -336,6 +360,7 @@
|
|||||||
"LabelFontScale": "Масштаб шрифта",
|
"LabelFontScale": "Масштаб шрифта",
|
||||||
"LabelFontStrikethrough": "Зачеркнутый",
|
"LabelFontStrikethrough": "Зачеркнутый",
|
||||||
"LabelFormat": "Формат",
|
"LabelFormat": "Формат",
|
||||||
|
"LabelFull": "Полный",
|
||||||
"LabelGenre": "Жанр",
|
"LabelGenre": "Жанр",
|
||||||
"LabelGenres": "Жанры",
|
"LabelGenres": "Жанры",
|
||||||
"LabelHardDeleteFile": "Жесткое удаление файла",
|
"LabelHardDeleteFile": "Жесткое удаление файла",
|
||||||
@ -391,6 +416,10 @@
|
|||||||
"LabelLowestPriority": "Самый низкий приоритет",
|
"LabelLowestPriority": "Самый низкий приоритет",
|
||||||
"LabelMatchExistingUsersBy": "Сопоставление существующих пользователей по",
|
"LabelMatchExistingUsersBy": "Сопоставление существующих пользователей по",
|
||||||
"LabelMatchExistingUsersByDescription": "Используется для подключения существующих пользователей. После подключения пользователям будет присвоен уникальный идентификатор от поставщика единого входа",
|
"LabelMatchExistingUsersByDescription": "Используется для подключения существующих пользователей. После подключения пользователям будет присвоен уникальный идентификатор от поставщика единого входа",
|
||||||
|
"LabelMaxEpisodesToDownload": "Максимальное количество эпизодов для загрузки. Используйте 0 для неограниченного количества.",
|
||||||
|
"LabelMaxEpisodesToDownloadPerCheck": "Максимальное количество новых эпизодов для загрузки за одну проверку",
|
||||||
|
"LabelMaxEpisodesToKeep": "Максимальное количество сохраняемых эпизодов",
|
||||||
|
"LabelMaxEpisodesToKeepHelp": "Значение 0 не устанавливает максимального ограничения. После автоматической загрузки нового эпизода самый старый эпизод будет удален, если у вас более X эпизодов. При этом будет удален только 1 эпизод за каждую новую загрузку.",
|
||||||
"LabelMediaPlayer": "Медиа проигрыватель",
|
"LabelMediaPlayer": "Медиа проигрыватель",
|
||||||
"LabelMediaType": "Тип медиа",
|
"LabelMediaType": "Тип медиа",
|
||||||
"LabelMetaTag": "Мета тег",
|
"LabelMetaTag": "Мета тег",
|
||||||
@ -436,12 +465,14 @@
|
|||||||
"LabelOpenIDGroupClaimDescription": "Имя утверждения OpenID, содержащего список групп пользователя. Обычно их называют <code>groups</code>. <b>Если эта настройка</b> настроена, приложение будет автоматически назначать роли на основе членства пользователя в группах при условии, что эти группы названы в утверждении без учета регистра \"admin\", \"user\" или \"guest\". Утверждение должно содержать список, и если пользователь принадлежит к нескольким группам, то приложение назначит роль, соответствующую самому высокому уровню доступа. Если ни одна из групп не совпадает, доступ будет запрещен.",
|
"LabelOpenIDGroupClaimDescription": "Имя утверждения OpenID, содержащего список групп пользователя. Обычно их называют <code>groups</code>. <b>Если эта настройка</b> настроена, приложение будет автоматически назначать роли на основе членства пользователя в группах при условии, что эти группы названы в утверждении без учета регистра \"admin\", \"user\" или \"guest\". Утверждение должно содержать список, и если пользователь принадлежит к нескольким группам, то приложение назначит роль, соответствующую самому высокому уровню доступа. Если ни одна из групп не совпадает, доступ будет запрещен.",
|
||||||
"LabelOpenRSSFeed": "Открыть RSS-канал",
|
"LabelOpenRSSFeed": "Открыть RSS-канал",
|
||||||
"LabelOverwrite": "Перезаписать",
|
"LabelOverwrite": "Перезаписать",
|
||||||
|
"LabelPaginationPageXOfY": "Страница {0} из {1}",
|
||||||
"LabelPassword": "Пароль",
|
"LabelPassword": "Пароль",
|
||||||
"LabelPath": "Путь",
|
"LabelPath": "Путь",
|
||||||
"LabelPermanent": "Постоянный",
|
"LabelPermanent": "Постоянный",
|
||||||
"LabelPermissionsAccessAllLibraries": "Есть доступ ко всем библиотекам",
|
"LabelPermissionsAccessAllLibraries": "Есть доступ ко всем библиотекам",
|
||||||
"LabelPermissionsAccessAllTags": "Есть доступ ко всем тегам",
|
"LabelPermissionsAccessAllTags": "Есть доступ ко всем тегам",
|
||||||
"LabelPermissionsAccessExplicitContent": "Есть доступ к явному содержимому",
|
"LabelPermissionsAccessExplicitContent": "Есть доступ к явному содержимому",
|
||||||
|
"LabelPermissionsCreateEreader": "Можно создать читалку",
|
||||||
"LabelPermissionsDelete": "Может удалять",
|
"LabelPermissionsDelete": "Может удалять",
|
||||||
"LabelPermissionsDownload": "Может скачивать",
|
"LabelPermissionsDownload": "Может скачивать",
|
||||||
"LabelPermissionsUpdate": "Может обновлять",
|
"LabelPermissionsUpdate": "Может обновлять",
|
||||||
@ -465,6 +496,8 @@
|
|||||||
"LabelPubDate": "Дата публикации",
|
"LabelPubDate": "Дата публикации",
|
||||||
"LabelPublishYear": "Год публикации",
|
"LabelPublishYear": "Год публикации",
|
||||||
"LabelPublishedDate": "Опубликовано {0}",
|
"LabelPublishedDate": "Опубликовано {0}",
|
||||||
|
"LabelPublishedDecade": "Опубликованное десятилетие",
|
||||||
|
"LabelPublishedDecades": "Опубликованные десятилетия",
|
||||||
"LabelPublisher": "Издатель",
|
"LabelPublisher": "Издатель",
|
||||||
"LabelPublishers": "Издатели",
|
"LabelPublishers": "Издатели",
|
||||||
"LabelRSSFeedCustomOwnerEmail": "Пользовательский Email владельца",
|
"LabelRSSFeedCustomOwnerEmail": "Пользовательский Email владельца",
|
||||||
@ -484,21 +517,28 @@
|
|||||||
"LabelRedo": "Повторить",
|
"LabelRedo": "Повторить",
|
||||||
"LabelRegion": "Регион",
|
"LabelRegion": "Регион",
|
||||||
"LabelReleaseDate": "Дата выхода",
|
"LabelReleaseDate": "Дата выхода",
|
||||||
|
"LabelRemoveAllMetadataAbs": "Удалите все файлы metadata.abs",
|
||||||
|
"LabelRemoveAllMetadataJson": "Удалите все файлы metadata.json",
|
||||||
"LabelRemoveCover": "Удалить обложку",
|
"LabelRemoveCover": "Удалить обложку",
|
||||||
|
"LabelRemoveMetadataFile": "Удаление файлов метаданных в папках элементов библиотеки",
|
||||||
|
"LabelRemoveMetadataFileHelp": "Удалите все файлы metadata.json и metadata.abs из ваших папок {0}.",
|
||||||
"LabelRowsPerPage": "Строк на странице",
|
"LabelRowsPerPage": "Строк на странице",
|
||||||
"LabelSearchTerm": "Поисковый запрос",
|
"LabelSearchTerm": "Поисковый запрос",
|
||||||
"LabelSearchTitle": "Поиск по названию",
|
"LabelSearchTitle": "Поиск по названию",
|
||||||
"LabelSearchTitleOrASIN": "Поиск по названию или ASIN",
|
"LabelSearchTitleOrASIN": "Поиск по названию или ASIN",
|
||||||
"LabelSeason": "Сезон",
|
"LabelSeason": "Сезон",
|
||||||
|
"LabelSeasonNumber": "Сезон #{0}",
|
||||||
"LabelSelectAll": "Выбрать все",
|
"LabelSelectAll": "Выбрать все",
|
||||||
"LabelSelectAllEpisodes": "Выбрать все эпизоды",
|
"LabelSelectAllEpisodes": "Выбрать все эпизоды",
|
||||||
"LabelSelectEpisodesShowing": "Выберите {0} эпизодов для показа",
|
"LabelSelectEpisodesShowing": "Выберите {0} эпизодов для показа",
|
||||||
"LabelSelectUsers": "Выбор пользователей",
|
"LabelSelectUsers": "Выбор пользователей",
|
||||||
"LabelSendEbookToDevice": "Отправить e-книгу в...",
|
"LabelSendEbookToDevice": "Отправить e-книгу в...",
|
||||||
"LabelSequence": "Последовательность",
|
"LabelSequence": "Последовательность",
|
||||||
|
"LabelSerial": "Серийный",
|
||||||
"LabelSeries": "Серия",
|
"LabelSeries": "Серия",
|
||||||
"LabelSeriesName": "Имя серии",
|
"LabelSeriesName": "Имя серии",
|
||||||
"LabelSeriesProgress": "Прогресс серии",
|
"LabelSeriesProgress": "Прогресс серии",
|
||||||
|
"LabelServerLogLevel": "Уровень журнала сервера",
|
||||||
"LabelServerYearReview": "Итоги года всего сервера ({0})",
|
"LabelServerYearReview": "Итоги года всего сервера ({0})",
|
||||||
"LabelSetEbookAsPrimary": "Установить как основную",
|
"LabelSetEbookAsPrimary": "Установить как основную",
|
||||||
"LabelSetEbookAsSupplementary": "Установить как дополнительную",
|
"LabelSetEbookAsSupplementary": "Установить как дополнительную",
|
||||||
@ -523,6 +563,9 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "Серии, в которых всего одна книга, будут скрыты со страницы серий и полок домашней страницы.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Серии, в которых всего одна книга, будут скрыты со страницы серий и полок домашней страницы.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Вид книжной полки на Домашней странице",
|
"LabelSettingsHomePageBookshelfView": "Вид книжной полки на Домашней странице",
|
||||||
"LabelSettingsLibraryBookshelfView": "Вид книжной полки в Библиотеке",
|
"LabelSettingsLibraryBookshelfView": "Вид книжной полки в Библиотеке",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Процент выполнения больше, чем",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Оставшееся время составляет менее (секунд)",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedWhen": "Отметьте мультимедийный элемент как законченный, когда",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Пропустить предыдущие книги в \"Продолжить серию\"",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Пропустить предыдущие книги в \"Продолжить серию\"",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "На домашней странице \"Продолжить серию\" отображается первая книга, не начатая в серии, в которой закончена хотя бы одна книга и нет начатых книг. При включении этого параметра серия будет продолжена с самой последней завершенной книги, а не с первой, которая не начата.",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "На домашней странице \"Продолжить серию\" отображается первая книга, не начатая в серии, в которой закончена хотя бы одна книга и нет начатых книг. При включении этого параметра серия будет продолжена с самой последней завершенной книги, а не с первой, которая не начата.",
|
||||||
"LabelSettingsParseSubtitles": "Разбор подзаголовков",
|
"LabelSettingsParseSubtitles": "Разбор подзаголовков",
|
||||||
@ -587,13 +630,15 @@
|
|||||||
"LabelTimeDurationXMinutes": "{0} минут",
|
"LabelTimeDurationXMinutes": "{0} минут",
|
||||||
"LabelTimeDurationXSeconds": "{0} секунд",
|
"LabelTimeDurationXSeconds": "{0} секунд",
|
||||||
"LabelTimeInMinutes": "Время в минутах",
|
"LabelTimeInMinutes": "Время в минутах",
|
||||||
|
"LabelTimeLeft": "{0} осталось",
|
||||||
"LabelTimeListened": "Время прослушивания",
|
"LabelTimeListened": "Время прослушивания",
|
||||||
"LabelTimeListenedToday": "Время прослушивания сегодня",
|
"LabelTimeListenedToday": "Время прослушивания сегодня",
|
||||||
"LabelTimeRemaining": "{0} осталось",
|
"LabelTimeRemaining": "{0} осталось",
|
||||||
"LabelTimeToShift": "Время смещения в сек.",
|
"LabelTimeToShift": "Время смещения в секундах",
|
||||||
"LabelTitle": "Название",
|
"LabelTitle": "Название",
|
||||||
"LabelToolsEmbedMetadata": "Встроить метаданные",
|
"LabelToolsEmbedMetadata": "Встроить метаданные",
|
||||||
"LabelToolsEmbedMetadataDescription": "Встроить метаданные в аудио файлы, включая обложку и главы.",
|
"LabelToolsEmbedMetadataDescription": "Встроить метаданные в аудио файлы, включая обложку и главы.",
|
||||||
|
"LabelToolsM4bEncoder": "Кодировщик M4B",
|
||||||
"LabelToolsMakeM4b": "Создать M4B файл аудиокниги",
|
"LabelToolsMakeM4b": "Создать M4B файл аудиокниги",
|
||||||
"LabelToolsMakeM4bDescription": "Создает .M4B файл аудиокниги с встроенными метаданными, обложкой и главами.",
|
"LabelToolsMakeM4bDescription": "Создает .M4B файл аудиокниги с встроенными метаданными, обложкой и главами.",
|
||||||
"LabelToolsSplitM4b": "Разделить M4B на MP3 файлы",
|
"LabelToolsSplitM4b": "Разделить M4B на MP3 файлы",
|
||||||
@ -606,6 +651,7 @@
|
|||||||
"LabelTracksMultiTrack": "Мультитрек",
|
"LabelTracksMultiTrack": "Мультитрек",
|
||||||
"LabelTracksNone": "Нет треков",
|
"LabelTracksNone": "Нет треков",
|
||||||
"LabelTracksSingleTrack": "Один трек",
|
"LabelTracksSingleTrack": "Один трек",
|
||||||
|
"LabelTrailer": "Трейлер",
|
||||||
"LabelType": "Тип",
|
"LabelType": "Тип",
|
||||||
"LabelUnabridged": "Полное издание",
|
"LabelUnabridged": "Полное издание",
|
||||||
"LabelUndo": "Отменить",
|
"LabelUndo": "Отменить",
|
||||||
@ -619,8 +665,10 @@
|
|||||||
"LabelUploaderDragAndDrop": "Перетащите файлы или каталоги",
|
"LabelUploaderDragAndDrop": "Перетащите файлы или каталоги",
|
||||||
"LabelUploaderDropFiles": "Перетащите файлы",
|
"LabelUploaderDropFiles": "Перетащите файлы",
|
||||||
"LabelUploaderItemFetchMetadataHelp": "Автоматическое извлечение названия, автора и серии",
|
"LabelUploaderItemFetchMetadataHelp": "Автоматическое извлечение названия, автора и серии",
|
||||||
|
"LabelUseAdvancedOptions": "Используйте расширенные опции",
|
||||||
"LabelUseChapterTrack": "Показывать время главы",
|
"LabelUseChapterTrack": "Показывать время главы",
|
||||||
"LabelUseFullTrack": "Показывать время книги",
|
"LabelUseFullTrack": "Показывать время книги",
|
||||||
|
"LabelUseZeroForUnlimited": "Используйте 0 для неограниченного количества",
|
||||||
"LabelUser": "Пользователь",
|
"LabelUser": "Пользователь",
|
||||||
"LabelUsername": "Имя пользователя",
|
"LabelUsername": "Имя пользователя",
|
||||||
"LabelValue": "Значение",
|
"LabelValue": "Значение",
|
||||||
@ -667,6 +715,7 @@
|
|||||||
"MessageConfirmDeleteMetadataProvider": "Вы уверены, что хотите удалить пользовательский поставщик метаданных \"{0}\"?",
|
"MessageConfirmDeleteMetadataProvider": "Вы уверены, что хотите удалить пользовательский поставщик метаданных \"{0}\"?",
|
||||||
"MessageConfirmDeleteNotification": "Вы уверены, что хотите удалить это уведомление?",
|
"MessageConfirmDeleteNotification": "Вы уверены, что хотите удалить это уведомление?",
|
||||||
"MessageConfirmDeleteSession": "Вы уверены, что хотите удалить этот сеанс?",
|
"MessageConfirmDeleteSession": "Вы уверены, что хотите удалить этот сеанс?",
|
||||||
|
"MessageConfirmEmbedMetadataInAudioFiles": "Вы уверены, что хотите вставить метаданные в {0} аудиофайлов?",
|
||||||
"MessageConfirmForceReScan": "Вы уверены, что хотите принудительно выполнить повторное сканирование?",
|
"MessageConfirmForceReScan": "Вы уверены, что хотите принудительно выполнить повторное сканирование?",
|
||||||
"MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все эпизоды как завершенные?",
|
"MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все эпизоды как завершенные?",
|
||||||
"MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все эпизоды как не завершенные?",
|
"MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все эпизоды как не завершенные?",
|
||||||
@ -678,6 +727,7 @@
|
|||||||
"MessageConfirmPurgeCache": "Очистка кэша удалит весь каталог в <code>/metadata/cache</code>. <br /><br />Вы уверены, что хотите удалить каталог кэша?",
|
"MessageConfirmPurgeCache": "Очистка кэша удалит весь каталог в <code>/metadata/cache</code>. <br /><br />Вы уверены, что хотите удалить каталог кэша?",
|
||||||
"MessageConfirmPurgeItemsCache": "Очистка кэша элементов удалит весь каталог в <code>/metadata/cache/items</code>.<br />Вы уверены?",
|
"MessageConfirmPurgeItemsCache": "Очистка кэша элементов удалит весь каталог в <code>/metadata/cache/items</code>.<br />Вы уверены?",
|
||||||
"MessageConfirmQuickEmbed": "Предупреждение! Быстрое встраивание не позволяет создавать резервные копии аудиофайлов. Убедитесь, что у вас есть резервная копия аудиофайлов. <br><br>Хотите продолжить?",
|
"MessageConfirmQuickEmbed": "Предупреждение! Быстрое встраивание не позволяет создавать резервные копии аудиофайлов. Убедитесь, что у вас есть резервная копия аудиофайлов. <br><br>Хотите продолжить?",
|
||||||
|
"MessageConfirmQuickMatchEpisodes": "При обнаружении совпадений информация о эпизодах быстрого поиска будет перезаписана. Будут обновлены только несопоставимые эпизоды. Вы уверены?",
|
||||||
"MessageConfirmReScanLibraryItems": "Вы уверены, что хотите пересканировать {0} элементов?",
|
"MessageConfirmReScanLibraryItems": "Вы уверены, что хотите пересканировать {0} элементов?",
|
||||||
"MessageConfirmRemoveAllChapters": "Вы уверены, что хотите удалить все главы?",
|
"MessageConfirmRemoveAllChapters": "Вы уверены, что хотите удалить все главы?",
|
||||||
"MessageConfirmRemoveAuthor": "Вы уверены, что хотите удалить автора \"{0}\"?",
|
"MessageConfirmRemoveAuthor": "Вы уверены, что хотите удалить автора \"{0}\"?",
|
||||||
@ -685,6 +735,7 @@
|
|||||||
"MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить эпизод \"{0}\"?",
|
"MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить эпизод \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} эпизодов?",
|
"MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} эпизодов?",
|
||||||
"MessageConfirmRemoveListeningSessions": "Вы уверены, что хотите удалить {0} сеансов прослушивания?",
|
"MessageConfirmRemoveListeningSessions": "Вы уверены, что хотите удалить {0} сеансов прослушивания?",
|
||||||
|
"MessageConfirmRemoveMetadataFiles": "Вы уверены, что хотите удалить все файлы metadata. {0} файлов из папок элементов вашей библиотеки?",
|
||||||
"MessageConfirmRemoveNarrator": "Вы уверены, что хотите удалить чтеца \"{0}\"?",
|
"MessageConfirmRemoveNarrator": "Вы уверены, что хотите удалить чтеца \"{0}\"?",
|
||||||
"MessageConfirmRemovePlaylist": "Вы уверены, что хотите удалить плейлист \"{0}\"?",
|
"MessageConfirmRemovePlaylist": "Вы уверены, что хотите удалить плейлист \"{0}\"?",
|
||||||
"MessageConfirmRenameGenre": "Вы уверены, что хотите переименовать жанр \"{0}\" в \"{1}\" для всех элементов?",
|
"MessageConfirmRenameGenre": "Вы уверены, что хотите переименовать жанр \"{0}\" в \"{1}\" для всех элементов?",
|
||||||
@ -700,6 +751,7 @@
|
|||||||
"MessageDragFilesIntoTrackOrder": "Перетащите файлы для исправления порядка треков",
|
"MessageDragFilesIntoTrackOrder": "Перетащите файлы для исправления порядка треков",
|
||||||
"MessageEmbedFailed": "Вставка не удалась!",
|
"MessageEmbedFailed": "Вставка не удалась!",
|
||||||
"MessageEmbedFinished": "Встраивание завершено!",
|
"MessageEmbedFinished": "Встраивание завершено!",
|
||||||
|
"MessageEmbedQueue": "Поставлен в очередь для внедрения метаданных ({0} в очереди)",
|
||||||
"MessageEpisodesQueuedForDownload": "{0} Эпизод(ов) запланировано для закачки",
|
"MessageEpisodesQueuedForDownload": "{0} Эпизод(ов) запланировано для закачки",
|
||||||
"MessageEreaderDevices": "Чтобы обеспечить доставку электронных книг, вам может потребоваться добавить указанный выше адрес электронной почты в качестве действительного отправителя для каждого устройства, перечисленного ниже.",
|
"MessageEreaderDevices": "Чтобы обеспечить доставку электронных книг, вам может потребоваться добавить указанный выше адрес электронной почты в качестве действительного отправителя для каждого устройства, перечисленного ниже.",
|
||||||
"MessageFeedURLWillBe": "URL канала будет {0}",
|
"MessageFeedURLWillBe": "URL канала будет {0}",
|
||||||
@ -744,6 +796,7 @@
|
|||||||
"MessageNoLogs": "Нет логов",
|
"MessageNoLogs": "Нет логов",
|
||||||
"MessageNoMediaProgress": "Нет прогресса медиа",
|
"MessageNoMediaProgress": "Нет прогресса медиа",
|
||||||
"MessageNoNotifications": "Нет уведомлений",
|
"MessageNoNotifications": "Нет уведомлений",
|
||||||
|
"MessageNoPodcastFeed": "Недопустимый подкаст: Нет канала",
|
||||||
"MessageNoPodcastsFound": "Подкасты не найдены",
|
"MessageNoPodcastsFound": "Подкасты не найдены",
|
||||||
"MessageNoResults": "Нет результатов",
|
"MessageNoResults": "Нет результатов",
|
||||||
"MessageNoSearchResultsFor": "Нет результатов поиска для \"{0}\"",
|
"MessageNoSearchResultsFor": "Нет результатов поиска для \"{0}\"",
|
||||||
@ -760,6 +813,10 @@
|
|||||||
"MessagePlaylistCreateFromCollection": "Создать плейлист из коллекции",
|
"MessagePlaylistCreateFromCollection": "Создать плейлист из коллекции",
|
||||||
"MessagePleaseWait": "Пожалуйста подождите...",
|
"MessagePleaseWait": "Пожалуйста подождите...",
|
||||||
"MessagePodcastHasNoRSSFeedForMatching": "Подкаст не имеет URL-адреса RSS-канала, который можно использовать для поиска",
|
"MessagePodcastHasNoRSSFeedForMatching": "Подкаст не имеет URL-адреса RSS-канала, который можно использовать для поиска",
|
||||||
|
"MessagePodcastSearchField": "Введите поисковый запрос или URL-адрес RSS-канала",
|
||||||
|
"MessageQuickEmbedInProgress": "Быстрое внедрение в процессе выполнения",
|
||||||
|
"MessageQuickEmbedQueue": "Поставлен в очередь для быстрого внедрения ({0} в очереди)",
|
||||||
|
"MessageQuickMatchAllEpisodes": "Быстрое сопоставление всех эпизодов",
|
||||||
"MessageQuickMatchDescription": "Заполняет пустые детали элемента и обложку первым результатом поиска из «{0}». Не перезаписывает сведения, если не включен параметр сервера 'Предпочитать метаданные поиска'.",
|
"MessageQuickMatchDescription": "Заполняет пустые детали элемента и обложку первым результатом поиска из «{0}». Не перезаписывает сведения, если не включен параметр сервера 'Предпочитать метаданные поиска'.",
|
||||||
"MessageRemoveChapter": "Удалить главу",
|
"MessageRemoveChapter": "Удалить главу",
|
||||||
"MessageRemoveEpisodes": "Удалить {0} эпизод(ов)",
|
"MessageRemoveEpisodes": "Удалить {0} эпизод(ов)",
|
||||||
@ -777,6 +834,41 @@
|
|||||||
"MessageShareExpiresIn": "Срок действия истекает через {0}",
|
"MessageShareExpiresIn": "Срок действия истекает через {0}",
|
||||||
"MessageShareURLWillBe": "URL-адрес общего доступа будет <strong>{0}</strong>",
|
"MessageShareURLWillBe": "URL-адрес общего доступа будет <strong>{0}</strong>",
|
||||||
"MessageStartPlaybackAtTime": "Начать воспроизведение для \"{0}\" с {1}?",
|
"MessageStartPlaybackAtTime": "Начать воспроизведение для \"{0}\" с {1}?",
|
||||||
|
"MessageTaskAudioFileNotWritable": "Аудиофайл \"{0}\" недоступен для записи",
|
||||||
|
"MessageTaskCanceledByUser": "Задание отменено пользователем",
|
||||||
|
"MessageTaskDownloadingEpisodeDescription": "Загрузка эпизода \"{0}\"",
|
||||||
|
"MessageTaskEmbeddingMetadata": "Внедрение метаданных",
|
||||||
|
"MessageTaskEmbeddingMetadataDescription": "Встраивание метаданных в аудиокнигу \"{0}\"",
|
||||||
|
"MessageTaskEncodingM4b": "Кодировка M4B",
|
||||||
|
"MessageTaskEncodingM4bDescription": "Кодирование аудиокниги \"{0}\" в один файл формата m4b",
|
||||||
|
"MessageTaskFailed": "Неудачный",
|
||||||
|
"MessageTaskFailedToBackupAudioFile": "Не удалось создать резервную копию аудиофайла \"{0}\"",
|
||||||
|
"MessageTaskFailedToCreateCacheDirectory": "Не удалось создать каталог кэша",
|
||||||
|
"MessageTaskFailedToEmbedMetadataInFile": "Не удалось вставить метаданные в файл \"{0}\"",
|
||||||
|
"MessageTaskFailedToMergeAudioFiles": "Не удалось объединить аудиофайлы",
|
||||||
|
"MessageTaskFailedToMoveM4bFile": "Не удалось переместить файл m4b",
|
||||||
|
"MessageTaskFailedToWriteMetadataFile": "Не удалось записать файл метаданных",
|
||||||
|
"MessageTaskMatchingBooksInLibrary": "Сопоставление книг в библиотеке \"{0}\"",
|
||||||
|
"MessageTaskNoFilesToScan": "Нет файлов для сканирования",
|
||||||
|
"MessageTaskOpmlImport": "Импорт OPML",
|
||||||
|
"MessageTaskOpmlImportDescription": "Создание подкастов из {0} RSS-каналов",
|
||||||
|
"MessageTaskOpmlImportFeed": "Канал импорта OPML",
|
||||||
|
"MessageTaskOpmlImportFeedDescription": "Импорт RSS-канала \"{0}\"",
|
||||||
|
"MessageTaskOpmlImportFeedFailed": "Не удалось получить ленту подкаста",
|
||||||
|
"MessageTaskOpmlImportFeedPodcastDescription": "Создание подкаста \"{0}\"",
|
||||||
|
"MessageTaskOpmlImportFeedPodcastExists": "Подкаст уже существует по адресу",
|
||||||
|
"MessageTaskOpmlImportFeedPodcastFailed": "Не удалось создать подкаст",
|
||||||
|
"MessageTaskOpmlImportFinished": "Добавлено {0} подкастов",
|
||||||
|
"MessageTaskOpmlParseFailed": "Не удалось разобрать OPML-файл",
|
||||||
|
"MessageTaskOpmlParseFastFail": "Недопустимый тег <opml> файла OPML не найден ИЛИ тег <outline> не найден",
|
||||||
|
"MessageTaskOpmlParseNoneFound": "В OPML-файле не найдено ни одного канала",
|
||||||
|
"MessageTaskScanItemsAdded": "{0} добавлено",
|
||||||
|
"MessageTaskScanItemsMissing": "{0} отсутствует",
|
||||||
|
"MessageTaskScanItemsUpdated": "{0} обновлено",
|
||||||
|
"MessageTaskScanNoChangesNeeded": "Никаких изменений не требуется",
|
||||||
|
"MessageTaskScanningFileChanges": "Проверка изменений файлов в \"{0}\"",
|
||||||
|
"MessageTaskScanningLibrary": "Сканирование библиотеки \"{0}\"",
|
||||||
|
"MessageTaskTargetDirectoryNotWritable": "Целевой каталог недоступен для записи",
|
||||||
"MessageThinking": "Думаю...",
|
"MessageThinking": "Думаю...",
|
||||||
"MessageUploaderItemFailed": "Не удалось загрузить",
|
"MessageUploaderItemFailed": "Не удалось загрузить",
|
||||||
"MessageUploaderItemSuccess": "Успешно загружено!",
|
"MessageUploaderItemSuccess": "Успешно загружено!",
|
||||||
@ -794,6 +886,10 @@
|
|||||||
"NoteUploaderFoldersWithMediaFiles": "Папки с медиафайлами будут обрабатываться как отдельные элементы библиотеки.",
|
"NoteUploaderFoldersWithMediaFiles": "Папки с медиафайлами будут обрабатываться как отдельные элементы библиотеки.",
|
||||||
"NoteUploaderOnlyAudioFiles": "Если загружать только аудиофайлы, то каждый аудиофайл будет обрабатываться как отдельная аудиокнига.",
|
"NoteUploaderOnlyAudioFiles": "Если загружать только аудиофайлы, то каждый аудиофайл будет обрабатываться как отдельная аудиокнига.",
|
||||||
"NoteUploaderUnsupportedFiles": "Неподдерживаемые файлы игнорируются. При выборе или удалении папки другие файлы, не находящиеся в папке элемента, игнорируются.",
|
"NoteUploaderUnsupportedFiles": "Неподдерживаемые файлы игнорируются. При выборе или удалении папки другие файлы, не находящиеся в папке элемента, игнорируются.",
|
||||||
|
"NotificationOnBackupCompletedDescription": "Запускается при завершении резервного копирования",
|
||||||
|
"NotificationOnBackupFailedDescription": "Срабатывает при сбое резервного копирования",
|
||||||
|
"NotificationOnEpisodeDownloadedDescription": "Запускается при автоматической загрузке эпизода подкаста",
|
||||||
|
"NotificationOnTestDescription": "Событие для тестирования системы оповещения",
|
||||||
"PlaceholderNewCollection": "Новое имя коллекции",
|
"PlaceholderNewCollection": "Новое имя коллекции",
|
||||||
"PlaceholderNewFolderPath": "Путь к новой папке",
|
"PlaceholderNewFolderPath": "Путь к новой папке",
|
||||||
"PlaceholderNewPlaylist": "Новое название плейлиста",
|
"PlaceholderNewPlaylist": "Новое название плейлиста",
|
||||||
@ -819,6 +915,7 @@
|
|||||||
"StatsYearInReview": "ИТОГИ ГОДА",
|
"StatsYearInReview": "ИТОГИ ГОДА",
|
||||||
"ToastAccountUpdateSuccess": "Учетная запись обновлена",
|
"ToastAccountUpdateSuccess": "Учетная запись обновлена",
|
||||||
"ToastAppriseUrlRequired": "Необходимо ввести URL-адрес Apprise",
|
"ToastAppriseUrlRequired": "Необходимо ввести URL-адрес Apprise",
|
||||||
|
"ToastAsinRequired": "Требуется ASIN",
|
||||||
"ToastAuthorImageRemoveSuccess": "Изображение автора удалено",
|
"ToastAuthorImageRemoveSuccess": "Изображение автора удалено",
|
||||||
"ToastAuthorNotFound": "Автор \"{0}\" не найден",
|
"ToastAuthorNotFound": "Автор \"{0}\" не найден",
|
||||||
"ToastAuthorRemoveSuccess": "Автор удален",
|
"ToastAuthorRemoveSuccess": "Автор удален",
|
||||||
@ -838,6 +935,8 @@
|
|||||||
"ToastBackupUploadSuccess": "Бэкап загружен",
|
"ToastBackupUploadSuccess": "Бэкап загружен",
|
||||||
"ToastBatchDeleteFailed": "Не удалось выполнить пакетное удаление",
|
"ToastBatchDeleteFailed": "Не удалось выполнить пакетное удаление",
|
||||||
"ToastBatchDeleteSuccess": "Успешное пакетное удаление",
|
"ToastBatchDeleteSuccess": "Успешное пакетное удаление",
|
||||||
|
"ToastBatchQuickMatchFailed": "Не удалось выполнить пакетное быстрое сопоставление!",
|
||||||
|
"ToastBatchQuickMatchStarted": "Начато пакетное быстрое сопоставление {0} книг!",
|
||||||
"ToastBatchUpdateFailed": "Сбой пакетного обновления",
|
"ToastBatchUpdateFailed": "Сбой пакетного обновления",
|
||||||
"ToastBatchUpdateSuccess": "Успешное пакетное обновление",
|
"ToastBatchUpdateSuccess": "Успешное пакетное обновление",
|
||||||
"ToastBookmarkCreateFailed": "Не удалось создать закладку",
|
"ToastBookmarkCreateFailed": "Не удалось создать закладку",
|
||||||
@ -849,6 +948,7 @@
|
|||||||
"ToastChaptersHaveErrors": "Главы имеют ошибки",
|
"ToastChaptersHaveErrors": "Главы имеют ошибки",
|
||||||
"ToastChaptersMustHaveTitles": "Главы должны содержать названия",
|
"ToastChaptersMustHaveTitles": "Главы должны содержать названия",
|
||||||
"ToastChaptersRemoved": "Удалены главы",
|
"ToastChaptersRemoved": "Удалены главы",
|
||||||
|
"ToastChaptersUpdated": "Обновленные главы",
|
||||||
"ToastCollectionItemsAddFailed": "Не удалось добавить элемент(ы) в коллекцию",
|
"ToastCollectionItemsAddFailed": "Не удалось добавить элемент(ы) в коллекцию",
|
||||||
"ToastCollectionItemsAddSuccess": "Элемент(ы) добавлены в коллекцию",
|
"ToastCollectionItemsAddSuccess": "Элемент(ы) добавлены в коллекцию",
|
||||||
"ToastCollectionItemsRemoveSuccess": "Элемент(ы), удалены из коллекции",
|
"ToastCollectionItemsRemoveSuccess": "Элемент(ы), удалены из коллекции",
|
||||||
@ -866,10 +966,14 @@
|
|||||||
"ToastEncodeCancelSucces": "Кодирование отменено",
|
"ToastEncodeCancelSucces": "Кодирование отменено",
|
||||||
"ToastEpisodeDownloadQueueClearFailed": "Не удалось очистить очередь",
|
"ToastEpisodeDownloadQueueClearFailed": "Не удалось очистить очередь",
|
||||||
"ToastEpisodeDownloadQueueClearSuccess": "Очередь загрузки эпизода очищена",
|
"ToastEpisodeDownloadQueueClearSuccess": "Очередь загрузки эпизода очищена",
|
||||||
|
"ToastEpisodeUpdateSuccess": "{0 эпизодов обновлено",
|
||||||
"ToastErrorCannotShare": "Невозможно предоставить общий доступ на этом устройстве",
|
"ToastErrorCannotShare": "Невозможно предоставить общий доступ на этом устройстве",
|
||||||
"ToastFailedToLoadData": "Не удалось загрузить данные",
|
"ToastFailedToLoadData": "Не удалось загрузить данные",
|
||||||
|
"ToastFailedToMatch": "Не удалось найти совпадения",
|
||||||
"ToastFailedToShare": "Не удалось поделиться",
|
"ToastFailedToShare": "Не удалось поделиться",
|
||||||
|
"ToastFailedToUpdate": "Не удалось обновить",
|
||||||
"ToastInvalidImageUrl": "Неверный URL изображения",
|
"ToastInvalidImageUrl": "Неверный URL изображения",
|
||||||
|
"ToastInvalidMaxEpisodesToDownload": "Недопустимое максимальное количество загружаемых эпизодов",
|
||||||
"ToastInvalidUrl": "Неверный URL",
|
"ToastInvalidUrl": "Неверный URL",
|
||||||
"ToastItemCoverUpdateSuccess": "Обложка элемента обновлена",
|
"ToastItemCoverUpdateSuccess": "Обложка элемента обновлена",
|
||||||
"ToastItemDeletedFailed": "Не удалось удалить элемент",
|
"ToastItemDeletedFailed": "Не удалось удалить элемент",
|
||||||
@ -887,14 +991,22 @@
|
|||||||
"ToastLibraryScanFailedToStart": "Не удалось запустить сканирование",
|
"ToastLibraryScanFailedToStart": "Не удалось запустить сканирование",
|
||||||
"ToastLibraryScanStarted": "Запущено сканирование библиотеки",
|
"ToastLibraryScanStarted": "Запущено сканирование библиотеки",
|
||||||
"ToastLibraryUpdateSuccess": "Библиотека \"{0}\" обновлена",
|
"ToastLibraryUpdateSuccess": "Библиотека \"{0}\" обновлена",
|
||||||
|
"ToastMatchAllAuthorsFailed": "Не удалось найти совпадения со всеми авторами",
|
||||||
|
"ToastMetadataFilesRemovedError": "Ошибка при удалении файлов metadata.{0}",
|
||||||
|
"ToastMetadataFilesRemovedNoneFound": "В библиотеке не найдено файлов metadata.{0}",
|
||||||
|
"ToastMetadataFilesRemovedNoneRemoved": "Нет удаленных файлов metadata.{0}",
|
||||||
|
"ToastMetadataFilesRemovedSuccess": "{0} metadata.{1} файлов удалено",
|
||||||
|
"ToastMustHaveAtLeastOnePath": "Должен быть хотя бы один путь",
|
||||||
"ToastNameEmailRequired": "Имя и адрес электронной почты обязательны",
|
"ToastNameEmailRequired": "Имя и адрес электронной почты обязательны",
|
||||||
"ToastNameRequired": "Имя обязательно для заполнения",
|
"ToastNameRequired": "Имя обязательно для заполнения",
|
||||||
|
"ToastNewEpisodesFound": "{0} новых эпизодов найдено",
|
||||||
"ToastNewUserCreatedFailed": "Не удалось создать учетную запись: \"{0}\"",
|
"ToastNewUserCreatedFailed": "Не удалось создать учетную запись: \"{0}\"",
|
||||||
"ToastNewUserCreatedSuccess": "Новая учетная запись создана",
|
"ToastNewUserCreatedSuccess": "Новая учетная запись создана",
|
||||||
"ToastNewUserLibraryError": "Необходимо выбрать хотя бы одну библиотеку",
|
"ToastNewUserLibraryError": "Необходимо выбрать хотя бы одну библиотеку",
|
||||||
"ToastNewUserPasswordError": "Должен иметь пароль, только пользователь root может иметь пустой пароль",
|
"ToastNewUserPasswordError": "Должен иметь пароль, только пользователь root может иметь пустой пароль",
|
||||||
"ToastNewUserTagError": "Необходимо выбрать хотя бы один тег",
|
"ToastNewUserTagError": "Необходимо выбрать хотя бы один тег",
|
||||||
"ToastNewUserUsernameError": "Введите имя пользователя",
|
"ToastNewUserUsernameError": "Введите имя пользователя",
|
||||||
|
"ToastNoNewEpisodesFound": "Новых эпизодов не найдено",
|
||||||
"ToastNoUpdatesNecessary": "Обновления не требуются",
|
"ToastNoUpdatesNecessary": "Обновления не требуются",
|
||||||
"ToastNotificationCreateFailed": "Не удалось создать уведомление",
|
"ToastNotificationCreateFailed": "Не удалось создать уведомление",
|
||||||
"ToastNotificationDeleteFailed": "Не удалось удалить уведомление",
|
"ToastNotificationDeleteFailed": "Не удалось удалить уведомление",
|
||||||
@ -913,6 +1025,7 @@
|
|||||||
"ToastPodcastGetFeedFailed": "Не удалось получить ленту подкастов",
|
"ToastPodcastGetFeedFailed": "Не удалось получить ленту подкастов",
|
||||||
"ToastPodcastNoEpisodesInFeed": "В RSS-ленте эпизодов не найдено",
|
"ToastPodcastNoEpisodesInFeed": "В RSS-ленте эпизодов не найдено",
|
||||||
"ToastPodcastNoRssFeed": "В подкасте нет RSS-канала",
|
"ToastPodcastNoRssFeed": "В подкасте нет RSS-канала",
|
||||||
|
"ToastProgressIsNotBeingSynced": "Прогресс не синхронизируется, перезапустите воспроизведение",
|
||||||
"ToastProviderCreatedFailed": "Не удалось добавить провайдера",
|
"ToastProviderCreatedFailed": "Не удалось добавить провайдера",
|
||||||
"ToastProviderCreatedSuccess": "Добавлен новый провайдер",
|
"ToastProviderCreatedSuccess": "Добавлен новый провайдер",
|
||||||
"ToastProviderNameAndUrlRequired": "Имя и URL обязательные",
|
"ToastProviderNameAndUrlRequired": "Имя и URL обязательные",
|
||||||
@ -939,6 +1052,7 @@
|
|||||||
"ToastSessionCloseFailed": "Не удалось закрыть сеанс",
|
"ToastSessionCloseFailed": "Не удалось закрыть сеанс",
|
||||||
"ToastSessionDeleteFailed": "Не удалось удалить сеанс",
|
"ToastSessionDeleteFailed": "Не удалось удалить сеанс",
|
||||||
"ToastSessionDeleteSuccess": "Сеанс удален",
|
"ToastSessionDeleteSuccess": "Сеанс удален",
|
||||||
|
"ToastSleepTimerDone": "Выполнен таймер сна... Хр-р-р-р",
|
||||||
"ToastSlugMustChange": "Slug содержит недопустимые символы",
|
"ToastSlugMustChange": "Slug содержит недопустимые символы",
|
||||||
"ToastSlugRequired": "Требуется Slug",
|
"ToastSlugRequired": "Требуется Slug",
|
||||||
"ToastSocketConnected": "Сокет подключен",
|
"ToastSocketConnected": "Сокет подключен",
|
||||||
|
@ -163,6 +163,7 @@
|
|||||||
"HeaderNotificationUpdate": "Posodobi obvestilo",
|
"HeaderNotificationUpdate": "Posodobi obvestilo",
|
||||||
"HeaderNotifications": "Obvestila",
|
"HeaderNotifications": "Obvestila",
|
||||||
"HeaderOpenIDConnectAuthentication": "Prijava z OpenID Connect",
|
"HeaderOpenIDConnectAuthentication": "Prijava z OpenID Connect",
|
||||||
|
"HeaderOpenListeningSessions": "Odprte seje poslušanja",
|
||||||
"HeaderOpenRSSFeed": "Odpri vir RSS",
|
"HeaderOpenRSSFeed": "Odpri vir RSS",
|
||||||
"HeaderOtherFiles": "Ostale datoteke",
|
"HeaderOtherFiles": "Ostale datoteke",
|
||||||
"HeaderPasswordAuthentication": "Preverjanje pristnosti z geslom",
|
"HeaderPasswordAuthentication": "Preverjanje pristnosti z geslom",
|
||||||
@ -226,6 +227,7 @@
|
|||||||
"LabelAllUsersExcludingGuests": "Vsi uporabniki razen gosti",
|
"LabelAllUsersExcludingGuests": "Vsi uporabniki razen gosti",
|
||||||
"LabelAllUsersIncludingGuests": "Vsi uporabniki vključno z gosti",
|
"LabelAllUsersIncludingGuests": "Vsi uporabniki vključno z gosti",
|
||||||
"LabelAlreadyInYourLibrary": "Že v tvoji knjižnici",
|
"LabelAlreadyInYourLibrary": "Že v tvoji knjižnici",
|
||||||
|
"LabelApiToken": "API žeton",
|
||||||
"LabelAppend": "Priloži",
|
"LabelAppend": "Priloži",
|
||||||
"LabelAudioBitrate": "Avdio bitna hitrost (npr. 128k)",
|
"LabelAudioBitrate": "Avdio bitna hitrost (npr. 128k)",
|
||||||
"LabelAudioChannels": "Avdio kanali (1 ali 2)",
|
"LabelAudioChannels": "Avdio kanali (1 ali 2)",
|
||||||
@ -243,7 +245,7 @@
|
|||||||
"LabelAutoRegisterDescription": "Po prijavi samodejno ustvari nove uporabnike",
|
"LabelAutoRegisterDescription": "Po prijavi samodejno ustvari nove uporabnike",
|
||||||
"LabelBackToUser": "Nazaj na uporabnika",
|
"LabelBackToUser": "Nazaj na uporabnika",
|
||||||
"LabelBackupAudioFiles": "Varnostno kopiranje zvočnih datotek",
|
"LabelBackupAudioFiles": "Varnostno kopiranje zvočnih datotek",
|
||||||
"LabelBackupLocation": "Lokacija rezervne kopije",
|
"LabelBackupLocation": "Lokacija varnostnih kopij",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Omogoči samodejno varnostno kopiranje",
|
"LabelBackupsEnableAutomaticBackups": "Omogoči samodejno varnostno kopiranje",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Varnostne kopije shranjene v /metadata/backups",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Varnostne kopije shranjene v /metadata/backups",
|
||||||
"LabelBackupsMaxBackupSize": "Največja velikost varnostne kopije (v GB) (0 za neomejeno)",
|
"LabelBackupsMaxBackupSize": "Največja velikost varnostne kopije (v GB) (0 za neomejeno)",
|
||||||
@ -325,7 +327,7 @@
|
|||||||
"LabelEndOfChapter": "Konec poglavja",
|
"LabelEndOfChapter": "Konec poglavja",
|
||||||
"LabelEpisode": "Epizoda",
|
"LabelEpisode": "Epizoda",
|
||||||
"LabelEpisodeNotLinkedToRssFeed": "Epizoda ni povezana z virom RSS",
|
"LabelEpisodeNotLinkedToRssFeed": "Epizoda ni povezana z virom RSS",
|
||||||
"LabelEpisodeNumber": "Epizoda #{0}",
|
"LabelEpisodeNumber": "{0}. epizoda",
|
||||||
"LabelEpisodeTitle": "Naslov epizode",
|
"LabelEpisodeTitle": "Naslov epizode",
|
||||||
"LabelEpisodeType": "Tip epizode",
|
"LabelEpisodeType": "Tip epizode",
|
||||||
"LabelEpisodeUrlFromRssFeed": "URL epizode iz vira RSS",
|
"LabelEpisodeUrlFromRssFeed": "URL epizode iz vira RSS",
|
||||||
@ -393,7 +395,7 @@
|
|||||||
"LabelLastBookAdded": "Zadnja dodana knjiga",
|
"LabelLastBookAdded": "Zadnja dodana knjiga",
|
||||||
"LabelLastBookUpdated": "Zadnja posodobljena knjiga",
|
"LabelLastBookUpdated": "Zadnja posodobljena knjiga",
|
||||||
"LabelLastSeen": "Nazadnje viden",
|
"LabelLastSeen": "Nazadnje viden",
|
||||||
"LabelLastTime": "Zadnji čas",
|
"LabelLastTime": "Nazadnje",
|
||||||
"LabelLastUpdate": "Zadnja posodobitev",
|
"LabelLastUpdate": "Zadnja posodobitev",
|
||||||
"LabelLayout": "Postavitev",
|
"LabelLayout": "Postavitev",
|
||||||
"LabelLayoutSinglePage": "Ena stran",
|
"LabelLayoutSinglePage": "Ena stran",
|
||||||
@ -457,18 +459,20 @@
|
|||||||
"LabelNotificationsMaxQueueSize": "Največja velikost čakalne vrste za dogodke obvestil",
|
"LabelNotificationsMaxQueueSize": "Največja velikost čakalne vrste za dogodke obvestil",
|
||||||
"LabelNotificationsMaxQueueSizeHelp": "Dogodki so omejeni na sprožitev 1 na sekundo. Dogodki bodo prezrti, če je čakalna vrsta najvišja. To preprečuje neželeno pošiljanje obvestil.",
|
"LabelNotificationsMaxQueueSizeHelp": "Dogodki so omejeni na sprožitev 1 na sekundo. Dogodki bodo prezrti, če je čakalna vrsta najvišja. To preprečuje neželeno pošiljanje obvestil.",
|
||||||
"LabelNumberOfBooks": "Število knjig",
|
"LabelNumberOfBooks": "Število knjig",
|
||||||
"LabelNumberOfEpisodes": "# od epizod",
|
"LabelNumberOfEpisodes": "število epizod",
|
||||||
"LabelOpenIDAdvancedPermsClaimDescription": "Ime zahtevka OpenID, ki vsebuje napredna dovoljenja za uporabniška dejanja v aplikaciji, ki bodo veljala za neskrbniške vloge (<b>če je konfigurirano</b>). Če trditev manjka v odgovoru, bo dostop do ABS zavrnjen. Če ena možnost manjka, bo obravnavana kot <code>false</code>. Zagotovite, da se zahtevek ponudnika identitete ujema s pričakovano strukturo:",
|
"LabelOpenIDAdvancedPermsClaimDescription": "Ime zahtevka OpenID, ki vsebuje napredna dovoljenja za uporabniška dejanja v aplikaciji, ki bodo veljala za neskrbniške vloge (<b>če je konfigurirano</b>). Če trditev manjka v odgovoru, bo dostop do ABS zavrnjen. Če ena možnost manjka, bo obravnavana kot <code>false</code>. Zagotovite, da se zahtevek ponudnika identitete ujema s pričakovano strukturo:",
|
||||||
"LabelOpenIDClaims": "Pustite naslednje možnosti prazne, da onemogočite napredno dodeljevanje skupin in dovoljenj, nato pa samodejno dodelite skupino 'Uporabnik'.",
|
"LabelOpenIDClaims": "Pustite naslednje možnosti prazne, da onemogočite napredno dodeljevanje skupin in dovoljenj, nato pa samodejno dodelite skupino 'Uporabnik'.",
|
||||||
"LabelOpenIDGroupClaimDescription": "Ime zahtevka OpenID, ki vsebuje seznam uporabnikovih skupin. Običajno imenovane <code>skupine</code>. <b>Če je konfigurirana</b>, bo aplikacija samodejno dodelila vloge na podlagi članstva v skupini uporabnika, pod pogojem, da so te skupine v zahtevku poimenovane 'admin', 'user' ali 'guest' brez razlikovanja med velikimi in malimi črkami. Zahtevek mora vsebovati seznam in če uporabnik pripada več skupinam, mu aplikacija dodeli vlogo, ki ustreza najvišjemu nivoju dostopa. Če se nobena skupina ne ujema, bo dostop zavrnjen.",
|
"LabelOpenIDGroupClaimDescription": "Ime zahtevka OpenID, ki vsebuje seznam uporabnikovih skupin. Običajno imenovane <code>skupine</code>. <b>Če je konfigurirana</b>, bo aplikacija samodejno dodelila vloge na podlagi članstva v skupini uporabnika, pod pogojem, da so te skupine v zahtevku poimenovane 'admin', 'user' ali 'guest' brez razlikovanja med velikimi in malimi črkami. Zahtevek mora vsebovati seznam in če uporabnik pripada več skupinam, mu aplikacija dodeli vlogo, ki ustreza najvišjemu nivoju dostopa. Če se nobena skupina ne ujema, bo dostop zavrnjen.",
|
||||||
"LabelOpenRSSFeed": "Odpri vir RSS",
|
"LabelOpenRSSFeed": "Odpri vir RSS",
|
||||||
"LabelOverwrite": "Prepiši",
|
"LabelOverwrite": "Prepiši",
|
||||||
|
"LabelPaginationPageXOfY": "Stran {0} od {1}",
|
||||||
"LabelPassword": "Geslo",
|
"LabelPassword": "Geslo",
|
||||||
"LabelPath": "Pot",
|
"LabelPath": "Pot",
|
||||||
"LabelPermanent": "Trajno",
|
"LabelPermanent": "Trajno",
|
||||||
"LabelPermissionsAccessAllLibraries": "Lahko dostopa do vseh knjižnic",
|
"LabelPermissionsAccessAllLibraries": "Lahko dostopa do vseh knjižnic",
|
||||||
"LabelPermissionsAccessAllTags": "Lahko dostopa do vseh oznak",
|
"LabelPermissionsAccessAllTags": "Lahko dostopa do vseh oznak",
|
||||||
"LabelPermissionsAccessExplicitContent": "Lahko dostopa do eksplicitne vsebine",
|
"LabelPermissionsAccessExplicitContent": "Lahko dostopa do eksplicitne vsebine",
|
||||||
|
"LabelPermissionsCreateEreader": "Lahko ustvari e-bralnik",
|
||||||
"LabelPermissionsDelete": "Lahko briše",
|
"LabelPermissionsDelete": "Lahko briše",
|
||||||
"LabelPermissionsDownload": "Lahko prenaša",
|
"LabelPermissionsDownload": "Lahko prenaša",
|
||||||
"LabelPermissionsUpdate": "Lahko posodablja",
|
"LabelPermissionsUpdate": "Lahko posodablja",
|
||||||
@ -559,6 +563,9 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "Serije, ki imajo eno knjigo, bodo skrite na strani serije in policah domače strani.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Serije, ki imajo eno knjigo, bodo skrite na strani serije in policah domače strani.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Domača stran bo imela pogled knjižne police",
|
"LabelSettingsHomePageBookshelfView": "Domača stran bo imela pogled knjižne police",
|
||||||
"LabelSettingsLibraryBookshelfView": "Knjižnična uporaba pogleda knjižne police",
|
"LabelSettingsLibraryBookshelfView": "Knjižnična uporaba pogleda knjižne police",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Odstotek dokončanega je večji od",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Preostali čas je manj kot (sekund)",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedWhen": "Označi medijski element kot končan, ko",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Preskoči prejšnje knjige v nadaljevanju serije",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Preskoči prejšnje knjige v nadaljevanju serije",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Polica z domačo stranjo Nadaljuj serijo prikazuje prvo nezačeto knjigo v seriji, ki ima vsaj eno dokončano knjigo in ni nobene knjige v teku. Če omogočite to nastavitev, se bo serija nadaljevala od najbolj dokončane knjige namesto od prve nezačete knjige.",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Polica z domačo stranjo Nadaljuj serijo prikazuje prvo nezačeto knjigo v seriji, ki ima vsaj eno dokončano knjigo in ni nobene knjige v teku. Če omogočite to nastavitev, se bo serija nadaljevala od najbolj dokončane knjige namesto od prve nezačete knjige.",
|
||||||
"LabelSettingsParseSubtitles": "Uporabi podnapise",
|
"LabelSettingsParseSubtitles": "Uporabi podnapise",
|
||||||
@ -586,7 +593,7 @@
|
|||||||
"LabelSleepTimer": "Časovnik za spanje",
|
"LabelSleepTimer": "Časovnik za spanje",
|
||||||
"LabelSlug": "Slug",
|
"LabelSlug": "Slug",
|
||||||
"LabelStart": "Začetek",
|
"LabelStart": "Začetek",
|
||||||
"LabelStartTime": "Začetni čas",
|
"LabelStartTime": "Čas začetka",
|
||||||
"LabelStarted": "Začeto",
|
"LabelStarted": "Začeto",
|
||||||
"LabelStartedAt": "Začeto ob",
|
"LabelStartedAt": "Začeto ob",
|
||||||
"LabelStatsAudioTracks": "Zvočni posnetki",
|
"LabelStatsAudioTracks": "Zvočni posnetki",
|
||||||
|
@ -163,6 +163,7 @@
|
|||||||
"HeaderNotificationUpdate": "更新通知",
|
"HeaderNotificationUpdate": "更新通知",
|
||||||
"HeaderNotifications": "通知",
|
"HeaderNotifications": "通知",
|
||||||
"HeaderOpenIDConnectAuthentication": "OpenID 连接身份验证",
|
"HeaderOpenIDConnectAuthentication": "OpenID 连接身份验证",
|
||||||
|
"HeaderOpenListeningSessions": "打开收听会话",
|
||||||
"HeaderOpenRSSFeed": "打开 RSS 源",
|
"HeaderOpenRSSFeed": "打开 RSS 源",
|
||||||
"HeaderOtherFiles": "其他文件",
|
"HeaderOtherFiles": "其他文件",
|
||||||
"HeaderPasswordAuthentication": "密码认证",
|
"HeaderPasswordAuthentication": "密码认证",
|
||||||
@ -226,6 +227,7 @@
|
|||||||
"LabelAllUsersExcludingGuests": "除访客外的所有用户",
|
"LabelAllUsersExcludingGuests": "除访客外的所有用户",
|
||||||
"LabelAllUsersIncludingGuests": "包括访客的所有用户",
|
"LabelAllUsersIncludingGuests": "包括访客的所有用户",
|
||||||
"LabelAlreadyInYourLibrary": "已存在你的库中",
|
"LabelAlreadyInYourLibrary": "已存在你的库中",
|
||||||
|
"LabelApiToken": "API 令牌",
|
||||||
"LabelAppend": "附加",
|
"LabelAppend": "附加",
|
||||||
"LabelAudioBitrate": "音频比特率 (例如: 128k)",
|
"LabelAudioBitrate": "音频比特率 (例如: 128k)",
|
||||||
"LabelAudioChannels": "音频通道 (1 或 2)",
|
"LabelAudioChannels": "音频通道 (1 或 2)",
|
||||||
@ -463,12 +465,14 @@
|
|||||||
"LabelOpenIDGroupClaimDescription": "OpenID 声明的名称, 该声明包含用户组的列表. 通常称为<code>组</code><b>如果已配置</b>, 应用程序将根据用户的组成员身份自动分配角色, 前提是这些组在声明中以不区分大小写的方式命名为 'Admin', 'User' 或 'Guest'. 声明应包含一个列表, 如果用户属于多个组, 则应用程序将分配与最高访问级别相对应的角色. 如果没有组匹配, 访问将被拒绝.",
|
"LabelOpenIDGroupClaimDescription": "OpenID 声明的名称, 该声明包含用户组的列表. 通常称为<code>组</code><b>如果已配置</b>, 应用程序将根据用户的组成员身份自动分配角色, 前提是这些组在声明中以不区分大小写的方式命名为 'Admin', 'User' 或 'Guest'. 声明应包含一个列表, 如果用户属于多个组, 则应用程序将分配与最高访问级别相对应的角色. 如果没有组匹配, 访问将被拒绝.",
|
||||||
"LabelOpenRSSFeed": "打开 RSS 源",
|
"LabelOpenRSSFeed": "打开 RSS 源",
|
||||||
"LabelOverwrite": "覆盖",
|
"LabelOverwrite": "覆盖",
|
||||||
|
"LabelPaginationPageXOfY": "第 {0} 页 共 {1} 页",
|
||||||
"LabelPassword": "密码",
|
"LabelPassword": "密码",
|
||||||
"LabelPath": "路径",
|
"LabelPath": "路径",
|
||||||
"LabelPermanent": "永久的",
|
"LabelPermanent": "永久的",
|
||||||
"LabelPermissionsAccessAllLibraries": "可以访问所有媒体库",
|
"LabelPermissionsAccessAllLibraries": "可以访问所有媒体库",
|
||||||
"LabelPermissionsAccessAllTags": "可以访问所有标签",
|
"LabelPermissionsAccessAllTags": "可以访问所有标签",
|
||||||
"LabelPermissionsAccessExplicitContent": "可以访问显式内容",
|
"LabelPermissionsAccessExplicitContent": "可以访问显式内容",
|
||||||
|
"LabelPermissionsCreateEreader": "可以创建电子阅读器",
|
||||||
"LabelPermissionsDelete": "可以删除",
|
"LabelPermissionsDelete": "可以删除",
|
||||||
"LabelPermissionsDownload": "可以下载",
|
"LabelPermissionsDownload": "可以下载",
|
||||||
"LabelPermissionsUpdate": "可以更新",
|
"LabelPermissionsUpdate": "可以更新",
|
||||||
@ -559,6 +563,9 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "只有一本书的系列将从系列页面和主页书架中隐藏.",
|
"LabelSettingsHideSingleBookSeriesHelp": "只有一本书的系列将从系列页面和主页书架中隐藏.",
|
||||||
"LabelSettingsHomePageBookshelfView": "首页使用书架视图",
|
"LabelSettingsHomePageBookshelfView": "首页使用书架视图",
|
||||||
"LabelSettingsLibraryBookshelfView": "媒体库使用书架视图",
|
"LabelSettingsLibraryBookshelfView": "媒体库使用书架视图",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "完成百分比大于",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "剩余时间少于 (秒)",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedWhen": "当发生以下情况时将媒体项目标记为已完成",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "跳过继续系列中的早期书籍",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "跳过继续系列中的早期书籍",
|
||||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "继续系列主页书架显示系列中未开始的第一本书, 该系列至少有一本书已完成且没有正在进行的书. 启用此设置将从最远完成的书开始系列, 而不是从第一本书开始.",
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "继续系列主页书架显示系列中未开始的第一本书, 该系列至少有一本书已完成且没有正在进行的书. 启用此设置将从最远完成的书开始系列, 而不是从第一本书开始.",
|
||||||
"LabelSettingsParseSubtitles": "解析副标题",
|
"LabelSettingsParseSubtitles": "解析副标题",
|
||||||
|
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.15.1",
|
"version": "2.16.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.15.1",
|
"version": "2.16.1",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.15.1",
|
"version": "2.16.1",
|
||||||
"buildNumber": 1,
|
"buildNumber": 1,
|
||||||
"description": "Self-hosted audiobook and podcast server",
|
"description": "Self-hosted audiobook and podcast server",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
@ -235,12 +235,14 @@ class LibraryController {
|
|||||||
for (const key of keysToCheck) {
|
for (const key of keysToCheck) {
|
||||||
if (!req.body[key]) continue
|
if (!req.body[key]) continue
|
||||||
if (typeof req.body[key] !== 'string') {
|
if (typeof req.body[key] !== 'string') {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. ${key} must be a string`)
|
||||||
return res.status(400).send(`Invalid request. ${key} must be a string`)
|
return res.status(400).send(`Invalid request. ${key} must be a string`)
|
||||||
}
|
}
|
||||||
updatePayload[key] = req.body[key]
|
updatePayload[key] = req.body[key]
|
||||||
}
|
}
|
||||||
if (req.body.displayOrder !== undefined) {
|
if (req.body.displayOrder !== undefined) {
|
||||||
if (isNaN(req.body.displayOrder)) {
|
if (isNaN(req.body.displayOrder)) {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. displayOrder must be a number`)
|
||||||
return res.status(400).send('Invalid request. displayOrder must be a number')
|
return res.status(400).send('Invalid request. displayOrder must be a number')
|
||||||
}
|
}
|
||||||
updatePayload.displayOrder = req.body.displayOrder
|
updatePayload.displayOrder = req.body.displayOrder
|
||||||
@ -255,18 +257,29 @@ class LibraryController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Validate settings
|
// Validate settings
|
||||||
|
const defaultLibrarySettings = Database.libraryModel.getDefaultLibrarySettingsForMediaType(req.library.mediaType)
|
||||||
const updatedSettings = {
|
const updatedSettings = {
|
||||||
...(req.library.settings || Database.libraryModel.getDefaultLibrarySettingsForMediaType(req.library.mediaType))
|
...(req.library.settings || defaultLibrarySettings)
|
||||||
}
|
}
|
||||||
|
// In case new settings are added in the future, ensure all settings are present
|
||||||
|
for (const key in defaultLibrarySettings) {
|
||||||
|
if (updatedSettings[key] === undefined) {
|
||||||
|
updatedSettings[key] = defaultLibrarySettings[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let hasUpdates = false
|
let hasUpdates = false
|
||||||
let hasUpdatedDisableWatcher = false
|
let hasUpdatedDisableWatcher = false
|
||||||
let hasUpdatedScanCron = false
|
let hasUpdatedScanCron = false
|
||||||
if (req.body.settings) {
|
if (req.body.settings) {
|
||||||
for (const key in req.body.settings) {
|
for (const key in req.body.settings) {
|
||||||
if (updatedSettings[key] === undefined) continue
|
if (!Object.keys(defaultLibrarySettings).includes(key)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if (key === 'metadataPrecedence') {
|
if (key === 'metadataPrecedence') {
|
||||||
if (!Array.isArray(req.body.settings[key])) {
|
if (!Array.isArray(req.body.settings[key])) {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. Settings "metadataPrecedence" must be an array`)
|
||||||
return res.status(400).send('Invalid request. Settings "metadataPrecedence" must be an array')
|
return res.status(400).send('Invalid request. Settings "metadataPrecedence" must be an array')
|
||||||
}
|
}
|
||||||
if (JSON.stringify(req.body.settings[key]) !== JSON.stringify(updatedSettings[key])) {
|
if (JSON.stringify(req.body.settings[key]) !== JSON.stringify(updatedSettings[key])) {
|
||||||
@ -276,6 +289,7 @@ class LibraryController {
|
|||||||
}
|
}
|
||||||
} else if (key === 'autoScanCronExpression' || key === 'podcastSearchRegion') {
|
} else if (key === 'autoScanCronExpression' || key === 'podcastSearchRegion') {
|
||||||
if (req.body.settings[key] !== null && typeof req.body.settings[key] !== 'string') {
|
if (req.body.settings[key] !== null && typeof req.body.settings[key] !== 'string') {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. Settings "${key}" must be a string`)
|
||||||
return res.status(400).send(`Invalid request. Settings "${key}" must be a string`)
|
return res.status(400).send(`Invalid request. Settings "${key}" must be a string`)
|
||||||
}
|
}
|
||||||
if (req.body.settings[key] !== updatedSettings[key]) {
|
if (req.body.settings[key] !== updatedSettings[key]) {
|
||||||
@ -285,8 +299,35 @@ class LibraryController {
|
|||||||
updatedSettings[key] = req.body.settings[key]
|
updatedSettings[key] = req.body.settings[key]
|
||||||
Logger.debug(`[LibraryController] Library "${req.library.name}" updating setting "${key}" to "${updatedSettings[key]}"`)
|
Logger.debug(`[LibraryController] Library "${req.library.name}" updating setting "${key}" to "${updatedSettings[key]}"`)
|
||||||
}
|
}
|
||||||
|
} else if (key === 'markAsFinishedPercentComplete') {
|
||||||
|
if (req.body.settings[key] !== null && isNaN(req.body.settings[key])) {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. Setting "${key}" must be a number`)
|
||||||
|
return res.status(400).send(`Invalid request. Setting "${key}" must be a number`)
|
||||||
|
} else if (req.body.settings[key] !== null && (Number(req.body.settings[key]) < 0 || Number(req.body.settings[key]) > 100)) {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. Setting "${key}" must be between 0 and 100`)
|
||||||
|
return res.status(400).send(`Invalid request. Setting "${key}" must be between 0 and 100`)
|
||||||
|
}
|
||||||
|
if (req.body.settings[key] !== updatedSettings[key]) {
|
||||||
|
hasUpdates = true
|
||||||
|
updatedSettings[key] = Number(req.body.settings[key])
|
||||||
|
Logger.debug(`[LibraryController] Library "${req.library.name}" updating setting "${key}" to "${updatedSettings[key]}"`)
|
||||||
|
}
|
||||||
|
} else if (key === 'markAsFinishedTimeRemaining') {
|
||||||
|
if (req.body.settings[key] !== null && isNaN(req.body.settings[key])) {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. Setting "${key}" must be a number`)
|
||||||
|
return res.status(400).send(`Invalid request. Setting "${key}" must be a number`)
|
||||||
|
} else if (req.body.settings[key] !== null && Number(req.body.settings[key]) < 0) {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. Setting "${key}" must be greater than or equal to 0`)
|
||||||
|
return res.status(400).send(`Invalid request. Setting "${key}" must be greater than or equal to 0`)
|
||||||
|
}
|
||||||
|
if (req.body.settings[key] !== updatedSettings[key]) {
|
||||||
|
hasUpdates = true
|
||||||
|
updatedSettings[key] = Number(req.body.settings[key])
|
||||||
|
Logger.debug(`[LibraryController] Library "${req.library.name}" updating setting "${key}" to "${updatedSettings[key]}"`)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (typeof req.body.settings[key] !== typeof updatedSettings[key]) {
|
if (typeof req.body.settings[key] !== typeof updatedSettings[key]) {
|
||||||
|
Logger.error(`[LibraryController] Invalid request. Setting "${key}" must be of type ${typeof updatedSettings[key]}`)
|
||||||
return res.status(400).send(`Invalid request. Setting "${key}" must be of type ${typeof updatedSettings[key]}`)
|
return res.status(400).send(`Invalid request. Setting "${key}" must be of type ${typeof updatedSettings[key]}`)
|
||||||
}
|
}
|
||||||
if (req.body.settings[key] !== updatedSettings[key]) {
|
if (req.body.settings[key] !== updatedSettings[key]) {
|
||||||
@ -328,6 +369,7 @@ class LibraryController {
|
|||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
if (!success) {
|
if (!success) {
|
||||||
|
Logger.error(`[LibraryController] Invalid folder directory "${path}"`)
|
||||||
return res.status(400).send(`Invalid folder directory "${path}"`)
|
return res.status(400).send(`Invalid folder directory "${path}"`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,6 +115,16 @@ class LibraryItemController {
|
|||||||
res.sendStatus(200)
|
res.sendStatus(200)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static handleDownloadError(error, res) {
|
||||||
|
if (!res.headersSent) {
|
||||||
|
if (error.code === 'ENOENT') {
|
||||||
|
return res.status(404).send('File not found')
|
||||||
|
} else {
|
||||||
|
return res.status(500).send('Download failed')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET: /api/items/:id/download
|
* GET: /api/items/:id/download
|
||||||
* Download library item. Zip file if multiple files.
|
* Download library item. Zip file if multiple files.
|
||||||
@ -122,7 +132,7 @@ class LibraryItemController {
|
|||||||
* @param {RequestWithUser} req
|
* @param {RequestWithUser} req
|
||||||
* @param {Response} res
|
* @param {Response} res
|
||||||
*/
|
*/
|
||||||
download(req, res) {
|
async download(req, res) {
|
||||||
if (!req.user.canDownload) {
|
if (!req.user.canDownload) {
|
||||||
Logger.warn(`User "${req.user.username}" attempted to download without permission`)
|
Logger.warn(`User "${req.user.username}" attempted to download without permission`)
|
||||||
return res.sendStatus(403)
|
return res.sendStatus(403)
|
||||||
@ -130,21 +140,26 @@ class LibraryItemController {
|
|||||||
const libraryItemPath = req.libraryItem.path
|
const libraryItemPath = req.libraryItem.path
|
||||||
const itemTitle = req.libraryItem.media.metadata.title
|
const itemTitle = req.libraryItem.media.metadata.title
|
||||||
|
|
||||||
// If library item is a single file in root dir then no need to zip
|
|
||||||
if (req.libraryItem.isFile) {
|
|
||||||
// Express does not set the correct mimetype for m4b files so use our defined mimetypes if available
|
|
||||||
const audioMimeType = getAudioMimeTypeFromExtname(Path.extname(libraryItemPath))
|
|
||||||
if (audioMimeType) {
|
|
||||||
res.setHeader('Content-Type', audioMimeType)
|
|
||||||
}
|
|
||||||
Logger.info(`[LibraryItemController] User "${req.user.username}" requested download for item "${itemTitle}" at "${libraryItemPath}"`)
|
|
||||||
res.download(libraryItemPath, req.libraryItem.relPath)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.info(`[LibraryItemController] User "${req.user.username}" requested download for item "${itemTitle}" at "${libraryItemPath}"`)
|
Logger.info(`[LibraryItemController] User "${req.user.username}" requested download for item "${itemTitle}" at "${libraryItemPath}"`)
|
||||||
const filename = `${itemTitle}.zip`
|
|
||||||
zipHelpers.zipDirectoryPipe(libraryItemPath, filename, res)
|
try {
|
||||||
|
// If library item is a single file in root dir then no need to zip
|
||||||
|
if (req.libraryItem.isFile) {
|
||||||
|
// Express does not set the correct mimetype for m4b files so use our defined mimetypes if available
|
||||||
|
const audioMimeType = getAudioMimeTypeFromExtname(Path.extname(libraryItemPath))
|
||||||
|
if (audioMimeType) {
|
||||||
|
res.setHeader('Content-Type', audioMimeType)
|
||||||
|
}
|
||||||
|
await new Promise((resolve, reject) => res.download(libraryItemPath, req.libraryItem.relPath, (error) => (error ? reject(error) : resolve())))
|
||||||
|
} else {
|
||||||
|
const filename = `${itemTitle}.zip`
|
||||||
|
await zipHelpers.zipDirectoryPipe(libraryItemPath, filename, res)
|
||||||
|
}
|
||||||
|
Logger.info(`[LibraryItemController] Downloaded item "${itemTitle}" at "${libraryItemPath}"`)
|
||||||
|
} catch (error) {
|
||||||
|
Logger.error(`[LibraryItemController] Download failed for item "${itemTitle}" at "${libraryItemPath}"`, error)
|
||||||
|
LibraryItemController.handleDownloadError(error, res)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -845,7 +860,13 @@ class LibraryItemController {
|
|||||||
res.setHeader('Content-Type', audioMimeType)
|
res.setHeader('Content-Type', audioMimeType)
|
||||||
}
|
}
|
||||||
|
|
||||||
res.download(libraryFile.metadata.path, libraryFile.metadata.filename)
|
try {
|
||||||
|
await new Promise((resolve, reject) => res.download(libraryFile.metadata.path, libraryFile.metadata.filename, (error) => (error ? reject(error) : resolve())))
|
||||||
|
Logger.info(`[LibraryItemController] Downloaded file "${libraryFile.metadata.path}"`)
|
||||||
|
} catch (error) {
|
||||||
|
Logger.error(`[LibraryItemController] Failed to download file "${libraryFile.metadata.path}"`, error)
|
||||||
|
LibraryItemController.handleDownloadError(error, res)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -883,7 +904,13 @@ class LibraryItemController {
|
|||||||
return res.status(204).header({ 'X-Accel-Redirect': encodedURI }).send()
|
return res.status(204).header({ 'X-Accel-Redirect': encodedURI }).send()
|
||||||
}
|
}
|
||||||
|
|
||||||
res.sendFile(ebookFilePath)
|
try {
|
||||||
|
await new Promise((resolve, reject) => res.sendFile(ebookFilePath, (error) => (error ? reject(error) : resolve())))
|
||||||
|
Logger.info(`[LibraryItemController] Downloaded ebook file "${ebookFilePath}"`)
|
||||||
|
} catch (error) {
|
||||||
|
Logger.error(`[LibraryItemController] Failed to download ebook file "${ebookFilePath}"`, error)
|
||||||
|
LibraryItemController.handleDownloadError(error, res)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -394,6 +394,58 @@ class MeController {
|
|||||||
res.json(req.user.toOldJSONForBrowser())
|
res.json(req.user.toOldJSONForBrowser())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST: /api/me/ereader-devices
|
||||||
|
*
|
||||||
|
* @param {RequestWithUser} req
|
||||||
|
* @param {Response} res
|
||||||
|
*/
|
||||||
|
async updateUserEReaderDevices(req, res) {
|
||||||
|
if (!req.body.ereaderDevices || !Array.isArray(req.body.ereaderDevices)) {
|
||||||
|
return res.status(400).send('Invalid payload. ereaderDevices array required')
|
||||||
|
}
|
||||||
|
|
||||||
|
const userEReaderDevices = req.body.ereaderDevices
|
||||||
|
for (const device of userEReaderDevices) {
|
||||||
|
if (!device.name || !device.email) {
|
||||||
|
return res.status(400).send('Invalid payload. ereaderDevices array items must have name and email')
|
||||||
|
} else if (device.availabilityOption !== 'specificUsers' || device.users?.length !== 1 || device.users[0] !== req.user.id) {
|
||||||
|
return res.status(400).send('Invalid payload. ereaderDevices array items must have availabilityOption "specificUsers" and only the current user')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const otherDevices = Database.emailSettings.ereaderDevices.filter((device) => {
|
||||||
|
return !Database.emailSettings.checkUserCanAccessDevice(device, req.user) || device.users?.length !== 1
|
||||||
|
})
|
||||||
|
|
||||||
|
const ereaderDevices = otherDevices.concat(userEReaderDevices)
|
||||||
|
|
||||||
|
// Check for duplicate names
|
||||||
|
const nameSet = new Set()
|
||||||
|
const hasDupes = ereaderDevices.some((device) => {
|
||||||
|
if (nameSet.has(device.name)) {
|
||||||
|
return true // Duplicate found
|
||||||
|
}
|
||||||
|
nameSet.add(device.name)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
if (hasDupes) {
|
||||||
|
return res.status(400).send('Invalid payload. Duplicate "name" field found.')
|
||||||
|
}
|
||||||
|
|
||||||
|
const updated = Database.emailSettings.update({ ereaderDevices })
|
||||||
|
if (updated) {
|
||||||
|
await Database.updateSetting(Database.emailSettings)
|
||||||
|
SocketAuthority.clientEmitter(req.user.id, 'ereader-devices-updated', {
|
||||||
|
ereaderDevices: Database.emailSettings.ereaderDevices
|
||||||
|
})
|
||||||
|
}
|
||||||
|
res.json({
|
||||||
|
ereaderDevices: Database.emailSettings.getEReaderDevices(req.user)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GET: /api/me/stats/year/:year
|
* GET: /api/me/stats/year/:year
|
||||||
*
|
*
|
||||||
|
@ -119,6 +119,7 @@ class PlaybackSessionManager {
|
|||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
async syncLocalSession(user, sessionJson, deviceInfo) {
|
async syncLocalSession(user, sessionJson, deviceInfo) {
|
||||||
|
// TODO: Combine libraryItem query with library query
|
||||||
const libraryItem = await Database.libraryItemModel.getOldById(sessionJson.libraryItemId)
|
const libraryItem = await Database.libraryItemModel.getOldById(sessionJson.libraryItemId)
|
||||||
const episode = sessionJson.episodeId && libraryItem && libraryItem.isPodcast ? libraryItem.media.getEpisode(sessionJson.episodeId) : null
|
const episode = sessionJson.episodeId && libraryItem && libraryItem.isPodcast ? libraryItem.media.getEpisode(sessionJson.episodeId) : null
|
||||||
if (!libraryItem || (libraryItem.isPodcast && !episode)) {
|
if (!libraryItem || (libraryItem.isPodcast && !episode)) {
|
||||||
@ -130,6 +131,16 @@ class PlaybackSessionManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const library = await Database.libraryModel.findByPk(libraryItem.libraryId)
|
||||||
|
if (!library) {
|
||||||
|
Logger.error(`[PlaybackSessionManager] syncLocalSession: Library not found for session "${sessionJson.displayTitle}" (${sessionJson.id})`)
|
||||||
|
return {
|
||||||
|
id: sessionJson.id,
|
||||||
|
success: false,
|
||||||
|
error: 'Library not found'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sessionJson.userId = user.id
|
sessionJson.userId = user.id
|
||||||
sessionJson.serverVersion = serverVersion
|
sessionJson.serverVersion = serverVersion
|
||||||
|
|
||||||
@ -199,7 +210,9 @@ class PlaybackSessionManager {
|
|||||||
const updateResponse = await user.createUpdateMediaProgressFromPayload({
|
const updateResponse = await user.createUpdateMediaProgressFromPayload({
|
||||||
libraryItemId: libraryItem.id,
|
libraryItemId: libraryItem.id,
|
||||||
episodeId: session.episodeId,
|
episodeId: session.episodeId,
|
||||||
...session.mediaProgressObject
|
...session.mediaProgressObject,
|
||||||
|
markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete,
|
||||||
|
markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining
|
||||||
})
|
})
|
||||||
result.progressSynced = !!updateResponse.mediaProgress
|
result.progressSynced = !!updateResponse.mediaProgress
|
||||||
if (result.progressSynced) {
|
if (result.progressSynced) {
|
||||||
@ -211,7 +224,9 @@ class PlaybackSessionManager {
|
|||||||
const updateResponse = await user.createUpdateMediaProgressFromPayload({
|
const updateResponse = await user.createUpdateMediaProgressFromPayload({
|
||||||
libraryItemId: libraryItem.id,
|
libraryItemId: libraryItem.id,
|
||||||
episodeId: session.episodeId,
|
episodeId: session.episodeId,
|
||||||
...session.mediaProgressObject
|
...session.mediaProgressObject,
|
||||||
|
markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete,
|
||||||
|
markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining
|
||||||
})
|
})
|
||||||
result.progressSynced = !!updateResponse.mediaProgress
|
result.progressSynced = !!updateResponse.mediaProgress
|
||||||
if (result.progressSynced) {
|
if (result.progressSynced) {
|
||||||
@ -330,12 +345,19 @@ class PlaybackSessionManager {
|
|||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
async syncSession(user, session, syncData) {
|
async syncSession(user, session, syncData) {
|
||||||
|
// TODO: Combine libraryItem query with library query
|
||||||
const libraryItem = await Database.libraryItemModel.getOldById(session.libraryItemId)
|
const libraryItem = await Database.libraryItemModel.getOldById(session.libraryItemId)
|
||||||
if (!libraryItem) {
|
if (!libraryItem) {
|
||||||
Logger.error(`[PlaybackSessionManager] syncSession Library Item not found "${session.libraryItemId}"`)
|
Logger.error(`[PlaybackSessionManager] syncSession Library Item not found "${session.libraryItemId}"`)
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const library = await Database.libraryModel.findByPk(libraryItem.libraryId)
|
||||||
|
if (!library) {
|
||||||
|
Logger.error(`[PlaybackSessionManager] syncSession Library not found "${libraryItem.libraryId}"`)
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
session.currentTime = syncData.currentTime
|
session.currentTime = syncData.currentTime
|
||||||
session.addListeningTime(syncData.timeListened)
|
session.addListeningTime(syncData.timeListened)
|
||||||
Logger.debug(`[PlaybackSessionManager] syncSession "${session.id}" (Device: ${session.deviceDescription}) | Total Time Listened: ${session.timeListening}`)
|
Logger.debug(`[PlaybackSessionManager] syncSession "${session.id}" (Device: ${session.deviceDescription}) | Total Time Listened: ${session.timeListening}`)
|
||||||
@ -344,12 +366,11 @@ class PlaybackSessionManager {
|
|||||||
libraryItemId: libraryItem.id,
|
libraryItemId: libraryItem.id,
|
||||||
episodeId: session.episodeId,
|
episodeId: session.episodeId,
|
||||||
// duration no longer required (v2.15.1) but used if available
|
// duration no longer required (v2.15.1) but used if available
|
||||||
duration: syncData.duration || libraryItem.media.duration || 0,
|
duration: syncData.duration || session.duration || 0,
|
||||||
currentTime: syncData.currentTime,
|
currentTime: syncData.currentTime,
|
||||||
progress: session.progress
|
progress: session.progress,
|
||||||
// TODO: Add support for passing in these values from library settings
|
markAsFinishedTimeRemaining: library.librarySettings.markAsFinishedTimeRemaining,
|
||||||
// markAsFinishedTimeRemaining: 5,
|
markAsFinishedPercentComplete: library.librarySettings.markAsFinishedPercentComplete
|
||||||
// markAsFinishedPercentageComplete: 95
|
|
||||||
})
|
})
|
||||||
if (updateResponse.mediaProgress) {
|
if (updateResponse.mediaProgress) {
|
||||||
SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', {
|
SocketAuthority.clientEmitter(user.id, 'user_item_progress_updated', {
|
||||||
|
@ -12,6 +12,8 @@ const Logger = require('../Logger')
|
|||||||
* @property {boolean} hideSingleBookSeries Do not show series that only have 1 book
|
* @property {boolean} hideSingleBookSeries Do not show series that only have 1 book
|
||||||
* @property {boolean} onlyShowLaterBooksInContinueSeries Skip showing books that are earlier than the max sequence read
|
* @property {boolean} onlyShowLaterBooksInContinueSeries Skip showing books that are earlier than the max sequence read
|
||||||
* @property {string[]} metadataPrecedence
|
* @property {string[]} metadataPrecedence
|
||||||
|
* @property {number} markAsFinishedTimeRemaining Time remaining in seconds to mark as finished. (defaults to 10s)
|
||||||
|
* @property {number} markAsFinishedPercentComplete Percent complete to mark as finished (0-100). If this is set it will be used over markAsFinishedTimeRemaining.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Library extends Model {
|
class Library extends Model {
|
||||||
@ -57,7 +59,9 @@ class Library extends Model {
|
|||||||
coverAspectRatio: 1, // Square
|
coverAspectRatio: 1, // Square
|
||||||
disableWatcher: false,
|
disableWatcher: false,
|
||||||
autoScanCronExpression: null,
|
autoScanCronExpression: null,
|
||||||
podcastSearchRegion: 'us'
|
podcastSearchRegion: 'us',
|
||||||
|
markAsFinishedPercentComplete: null,
|
||||||
|
markAsFinishedTimeRemaining: 10
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
@ -70,7 +74,9 @@ class Library extends Model {
|
|||||||
epubsAllowScriptedContent: false,
|
epubsAllowScriptedContent: false,
|
||||||
hideSingleBookSeries: false,
|
hideSingleBookSeries: false,
|
||||||
onlyShowLaterBooksInContinueSeries: false,
|
onlyShowLaterBooksInContinueSeries: false,
|
||||||
metadataPrecedence: this.defaultMetadataPrecedence
|
metadataPrecedence: this.defaultMetadataPrecedence,
|
||||||
|
markAsFinishedPercentComplete: null,
|
||||||
|
markAsFinishedTimeRemaining: 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,6 +202,13 @@ class Library extends Model {
|
|||||||
return this.extraData?.lastScanMetadataPrecedence || []
|
return this.extraData?.lastScanMetadataPrecedence || []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {LibrarySettingsObject}
|
||||||
|
*/
|
||||||
|
get librarySettings() {
|
||||||
|
return this.settings || Library.getDefaultLibrarySettingsForMediaType(this.mediaType)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Update to use new model
|
* TODO: Update to use new model
|
||||||
*/
|
*/
|
||||||
|
@ -229,30 +229,30 @@ class MediaProgress extends Model {
|
|||||||
const timeRemaining = this.duration - this.currentTime
|
const timeRemaining = this.duration - this.currentTime
|
||||||
|
|
||||||
// Check if progress is far enough to mark as finished
|
// Check if progress is far enough to mark as finished
|
||||||
// - If markAsFinishedPercentageComplete is provided, use that otherwise use markAsFinishedTimeRemaining (default 5 seconds)
|
// - If markAsFinishedPercentComplete is provided, use that otherwise use markAsFinishedTimeRemaining (default 10 seconds)
|
||||||
let shouldMarkAsFinished = false
|
let shouldMarkAsFinished = false
|
||||||
if (!this.isFinished && this.duration) {
|
if (this.duration) {
|
||||||
if (!isNullOrNaN(progressPayload.markAsFinishedPercentageComplete)) {
|
if (!isNullOrNaN(progressPayload.markAsFinishedPercentComplete) && progressPayload.markAsFinishedPercentComplete > 0) {
|
||||||
const markAsFinishedPercentageComplete = Number(progressPayload.markAsFinishedPercentageComplete) / 100
|
const markAsFinishedPercentComplete = Number(progressPayload.markAsFinishedPercentComplete) / 100
|
||||||
shouldMarkAsFinished = markAsFinishedPercentageComplete <= this.progress
|
shouldMarkAsFinished = markAsFinishedPercentComplete < this.progress
|
||||||
if (shouldMarkAsFinished) {
|
if (shouldMarkAsFinished) {
|
||||||
Logger.debug(`[MediaProgress] Marking media progress as finished because progress (${this.progress}) is greater than ${markAsFinishedPercentageComplete}`)
|
Logger.debug(`[MediaProgress] Marking media progress as finished because progress (${this.progress}) is greater than ${markAsFinishedPercentComplete}`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const markAsFinishedTimeRemaining = isNullOrNaN(progressPayload.markAsFinishedTimeRemaining) ? 5 : Number(progressPayload.markAsFinishedTimeRemaining)
|
const markAsFinishedTimeRemaining = isNullOrNaN(progressPayload.markAsFinishedTimeRemaining) ? 10 : Number(progressPayload.markAsFinishedTimeRemaining)
|
||||||
shouldMarkAsFinished = timeRemaining <= markAsFinishedTimeRemaining
|
shouldMarkAsFinished = timeRemaining < markAsFinishedTimeRemaining
|
||||||
if (shouldMarkAsFinished) {
|
if (shouldMarkAsFinished) {
|
||||||
Logger.debug(`[MediaProgress] Marking media progress as finished because time remaining (${timeRemaining}) is less than ${markAsFinishedTimeRemaining} seconds`)
|
Logger.debug(`[MediaProgress] Marking media progress as finished because time remaining (${timeRemaining}) is less than ${markAsFinishedTimeRemaining} seconds`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldMarkAsFinished) {
|
if (!this.isFinished && shouldMarkAsFinished) {
|
||||||
this.isFinished = true
|
this.isFinished = true
|
||||||
this.finishedAt = this.finishedAt || Date.now()
|
this.finishedAt = this.finishedAt || Date.now()
|
||||||
this.extraData.progress = 1
|
this.extraData.progress = 1
|
||||||
this.changed('extraData', true)
|
this.changed('extraData', true)
|
||||||
} else if (this.isFinished && this.changed('currentTime') && this.currentTime < this.duration) {
|
} else if (this.isFinished && this.changed('currentTime') && !shouldMarkAsFinished) {
|
||||||
this.isFinished = false
|
this.isFinished = false
|
||||||
this.finishedAt = null
|
this.finishedAt = null
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ const { DataTypes, Model } = sequelize
|
|||||||
* @property {string} [finishedAt]
|
* @property {string} [finishedAt]
|
||||||
* @property {number} [lastUpdate]
|
* @property {number} [lastUpdate]
|
||||||
* @property {number} [markAsFinishedTimeRemaining]
|
* @property {number} [markAsFinishedTimeRemaining]
|
||||||
* @property {number} [markAsFinishedPercentageComplete]
|
* @property {number} [markAsFinishedPercentComplete]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class User extends Model {
|
class User extends Model {
|
||||||
@ -82,6 +82,7 @@ class User extends Model {
|
|||||||
canAccessExplicitContent: 'accessExplicitContent',
|
canAccessExplicitContent: 'accessExplicitContent',
|
||||||
canAccessAllLibraries: 'accessAllLibraries',
|
canAccessAllLibraries: 'accessAllLibraries',
|
||||||
canAccessAllTags: 'accessAllTags',
|
canAccessAllTags: 'accessAllTags',
|
||||||
|
canCreateEReader: 'createEreader',
|
||||||
tagsAreDenylist: 'selectedTagsNotAccessible',
|
tagsAreDenylist: 'selectedTagsNotAccessible',
|
||||||
// Direct mapping for array-based permissions
|
// Direct mapping for array-based permissions
|
||||||
allowedLibraries: 'librariesAccessible',
|
allowedLibraries: 'librariesAccessible',
|
||||||
@ -122,6 +123,7 @@ class User extends Model {
|
|||||||
update: type === 'root' || type === 'admin',
|
update: type === 'root' || type === 'admin',
|
||||||
delete: type === 'root',
|
delete: type === 'root',
|
||||||
upload: type === 'root' || type === 'admin',
|
upload: type === 'root' || type === 'admin',
|
||||||
|
createEreader: type === 'root' || type === 'admin',
|
||||||
accessAllLibraries: true,
|
accessAllLibraries: true,
|
||||||
accessAllTags: true,
|
accessAllTags: true,
|
||||||
accessExplicitContent: type === 'root' || type === 'admin',
|
accessExplicitContent: type === 'root' || type === 'admin',
|
||||||
|
@ -190,6 +190,7 @@ class ApiRouter {
|
|||||||
this.router.get('/me/series/:id/remove-from-continue-listening', MeController.removeSeriesFromContinueListening.bind(this))
|
this.router.get('/me/series/:id/remove-from-continue-listening', MeController.removeSeriesFromContinueListening.bind(this))
|
||||||
this.router.get('/me/series/:id/readd-to-continue-listening', MeController.readdSeriesFromContinueListening.bind(this))
|
this.router.get('/me/series/:id/readd-to-continue-listening', MeController.readdSeriesFromContinueListening.bind(this))
|
||||||
this.router.get('/me/stats/year/:year', MeController.getStatsForYear.bind(this))
|
this.router.get('/me/stats/year/:year', MeController.getStatsForYear.bind(this))
|
||||||
|
this.router.post('/me/ereader-devices', MeController.updateUserEReaderDevices.bind(this))
|
||||||
|
|
||||||
//
|
//
|
||||||
// Backup Routes
|
// Backup Routes
|
||||||
|
Loading…
x
Reference in New Issue
Block a user