mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-04-30 01:15:24 +02:00
Merge branch 'master' into plugin-implementation-demo
This commit is contained in:
commit
3cae110360
@ -2,6 +2,10 @@
|
|||||||
<div id="bookshelf" ref="bookshelf" class="w-full overflow-y-auto" :style="{ fontSize: sizeMultiplier + 'rem' }">
|
<div id="bookshelf" ref="bookshelf" class="w-full overflow-y-auto" :style="{ fontSize: sizeMultiplier + 'rem' }">
|
||||||
<template v-for="shelf in totalShelves">
|
<template v-for="shelf in totalShelves">
|
||||||
<div :key="shelf" :id="`shelf-${shelf - 1}`" class="w-full px-4e sm:px-8e relative" :class="{ bookshelfRow: !isAlternativeBookshelfView }" :style="{ height: shelfHeight + 'px' }">
|
<div :key="shelf" :id="`shelf-${shelf - 1}`" class="w-full px-4e sm:px-8e relative" :class="{ bookshelfRow: !isAlternativeBookshelfView }" :style="{ height: shelfHeight + 'px' }">
|
||||||
|
<!-- Card skeletons -->
|
||||||
|
<template v-for="entityIndex in entitiesInShelf(shelf)">
|
||||||
|
<div :key="entityIndex" class="w-full h-full absolute rounded z-5 top-0 left-0 bg-primary box-shadow-book" :style="{ transform: entityTransform(entityIndex), width: cardWidth + 'px', height: coverHeight + 'px' }" />
|
||||||
|
</template>
|
||||||
<div v-if="!isAlternativeBookshelfView" class="bookshelfDivider w-full absolute bottom-0 left-0 right-0 z-20 h-6e" />
|
<div v-if="!isAlternativeBookshelfView" class="bookshelfDivider w-full absolute bottom-0 left-0 right-0 z-20 h-6e" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -65,7 +69,13 @@ export default {
|
|||||||
tempIsScanning: false,
|
tempIsScanning: false,
|
||||||
cardWidth: 0,
|
cardWidth: 0,
|
||||||
cardHeight: 0,
|
cardHeight: 0,
|
||||||
resizeObserver: null
|
coverHeight: 0,
|
||||||
|
resizeObserver: null,
|
||||||
|
lastScrollTop: 0,
|
||||||
|
lastTimestamp: 0,
|
||||||
|
postScrollTimeout: null,
|
||||||
|
currFirstEntityIndex: -1,
|
||||||
|
currLastEntityIndex: -1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -171,9 +181,6 @@ export default {
|
|||||||
bookWidth() {
|
bookWidth() {
|
||||||
return this.cardWidth
|
return this.cardWidth
|
||||||
},
|
},
|
||||||
bookHeight() {
|
|
||||||
return this.cardHeight
|
|
||||||
},
|
|
||||||
shelfPadding() {
|
shelfPadding() {
|
||||||
if (this.bookshelfWidth < 640) return 32 * this.sizeMultiplier
|
if (this.bookshelfWidth < 640) return 32 * this.sizeMultiplier
|
||||||
return 64 * this.sizeMultiplier
|
return 64 * this.sizeMultiplier
|
||||||
@ -184,9 +191,6 @@ export default {
|
|||||||
entityWidth() {
|
entityWidth() {
|
||||||
return this.cardWidth
|
return this.cardWidth
|
||||||
},
|
},
|
||||||
entityHeight() {
|
|
||||||
return this.cardHeight
|
|
||||||
},
|
|
||||||
shelfPaddingHeight() {
|
shelfPaddingHeight() {
|
||||||
return 16
|
return 16
|
||||||
},
|
},
|
||||||
@ -354,50 +358,53 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
loadPage(page) {
|
loadPage(page) {
|
||||||
this.pagesLoaded[page] = true
|
if (!this.pagesLoaded[page]) this.pagesLoaded[page] = this.fetchEntites(page)
|
||||||
this.fetchEntites(page)
|
return this.pagesLoaded[page]
|
||||||
},
|
},
|
||||||
showHideBookPlaceholder(index, show) {
|
showHideBookPlaceholder(index, show) {
|
||||||
var el = document.getElementById(`book-${index}-placeholder`)
|
var el = document.getElementById(`book-${index}-placeholder`)
|
||||||
if (el) el.style.display = show ? 'flex' : 'none'
|
if (el) el.style.display = show ? 'flex' : 'none'
|
||||||
},
|
},
|
||||||
mountEntites(fromIndex, toIndex) {
|
mountEntities(fromIndex, toIndex) {
|
||||||
for (let i = fromIndex; i < toIndex; i++) {
|
for (let i = fromIndex; i < toIndex; i++) {
|
||||||
if (!this.entityIndexesMounted.includes(i)) {
|
if (!this.entityIndexesMounted.includes(i)) {
|
||||||
this.cardsHelpers.mountEntityCard(i)
|
this.cardsHelpers.mountEntityCard(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleScroll(scrollTop) {
|
getVisibleIndices(scrollTop) {
|
||||||
this.currScrollTop = scrollTop
|
const firstShelfIndex = Math.floor(scrollTop / this.shelfHeight)
|
||||||
var firstShelfIndex = Math.floor(scrollTop / this.shelfHeight)
|
const lastShelfIndex = Math.min(Math.ceil((scrollTop + this.bookshelfHeight) / this.shelfHeight), this.totalShelves - 1)
|
||||||
var lastShelfIndex = Math.ceil((scrollTop + this.bookshelfHeight) / this.shelfHeight)
|
const firstEntityIndex = firstShelfIndex * this.entitiesPerShelf
|
||||||
lastShelfIndex = Math.min(this.totalShelves - 1, lastShelfIndex)
|
const lastEntityIndex = Math.min(lastShelfIndex * this.entitiesPerShelf + this.entitiesPerShelf, this.totalEntities)
|
||||||
|
return { firstEntityIndex, lastEntityIndex }
|
||||||
var firstBookIndex = firstShelfIndex * this.entitiesPerShelf
|
},
|
||||||
var lastBookIndex = lastShelfIndex * this.entitiesPerShelf + this.entitiesPerShelf
|
postScroll() {
|
||||||
lastBookIndex = Math.min(this.totalEntities, lastBookIndex)
|
const { firstEntityIndex, lastEntityIndex } = this.getVisibleIndices(this.currScrollTop)
|
||||||
|
|
||||||
var firstBookPage = Math.floor(firstBookIndex / this.booksPerFetch)
|
|
||||||
var lastBookPage = Math.floor(lastBookIndex / this.booksPerFetch)
|
|
||||||
if (!this.pagesLoaded[firstBookPage]) {
|
|
||||||
// console.log('Must load next batch', firstBookPage, 'book index', firstBookIndex)
|
|
||||||
this.loadPage(firstBookPage)
|
|
||||||
}
|
|
||||||
if (!this.pagesLoaded[lastBookPage]) {
|
|
||||||
// console.log('Must load last next batch', lastBookPage, 'book index', lastBookIndex)
|
|
||||||
this.loadPage(lastBookPage)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.entityIndexesMounted = this.entityIndexesMounted.filter((_index) => {
|
this.entityIndexesMounted = this.entityIndexesMounted.filter((_index) => {
|
||||||
if (_index < firstBookIndex || _index >= lastBookIndex) {
|
if (_index < firstEntityIndex || _index >= lastEntityIndex) {
|
||||||
var el = document.getElementById(`book-card-${_index}`)
|
var el = this.entityComponentRefs[_index]
|
||||||
if (el) el.remove()
|
if (el && el.$el) el.$el.remove()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
this.mountEntites(firstBookIndex, lastBookIndex)
|
},
|
||||||
|
handleScroll(scrollTop) {
|
||||||
|
this.currScrollTop = scrollTop
|
||||||
|
const { firstEntityIndex, lastEntityIndex } = this.getVisibleIndices(scrollTop)
|
||||||
|
if (firstEntityIndex === this.currFirstEntityIndex && lastEntityIndex === this.currLastEntityIndex) return
|
||||||
|
this.currFirstEntityIndex = firstEntityIndex
|
||||||
|
this.currLastEntityIndex = lastEntityIndex
|
||||||
|
|
||||||
|
clearTimeout(this.postScrollTimeout)
|
||||||
|
const firstPage = Math.floor(firstEntityIndex / this.booksPerFetch)
|
||||||
|
const lastPage = Math.floor(lastEntityIndex / this.booksPerFetch)
|
||||||
|
Promise.all([this.loadPage(firstPage), this.loadPage(lastPage)])
|
||||||
|
.then(() => this.mountEntities(firstEntityIndex, lastEntityIndex))
|
||||||
|
.catch((error) => console.error('Failed to load page', error))
|
||||||
|
|
||||||
|
this.postScrollTimeout = setTimeout(this.postScroll, 500)
|
||||||
},
|
},
|
||||||
async resetEntities() {
|
async resetEntities() {
|
||||||
if (this.isFetchingEntities) {
|
if (this.isFetchingEntities) {
|
||||||
@ -405,8 +412,6 @@ export default {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.destroyEntityComponents()
|
this.destroyEntityComponents()
|
||||||
this.entityIndexesMounted = []
|
|
||||||
this.entityComponentRefs = {}
|
|
||||||
this.pagesLoaded = {}
|
this.pagesLoaded = {}
|
||||||
this.entities = []
|
this.entities = []
|
||||||
this.totalShelves = 0
|
this.totalShelves = 0
|
||||||
@ -416,40 +421,21 @@ export default {
|
|||||||
this.initialized = false
|
this.initialized = false
|
||||||
|
|
||||||
this.initSizeData()
|
this.initSizeData()
|
||||||
this.pagesLoaded[0] = true
|
await this.loadPage(0)
|
||||||
await this.fetchEntites(0)
|
|
||||||
var lastBookIndex = Math.min(this.totalEntities, this.shelvesPerPage * this.entitiesPerShelf)
|
var lastBookIndex = Math.min(this.totalEntities, this.shelvesPerPage * this.entitiesPerShelf)
|
||||||
this.mountEntites(0, lastBookIndex)
|
this.mountEntities(0, lastBookIndex)
|
||||||
},
|
},
|
||||||
remountEntities() {
|
async rebuild() {
|
||||||
for (const key in this.entityComponentRefs) {
|
|
||||||
if (this.entityComponentRefs[key]) {
|
|
||||||
this.entityComponentRefs[key].destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.entityComponentRefs = {}
|
|
||||||
this.entityIndexesMounted.forEach((i) => {
|
|
||||||
this.cardsHelpers.mountEntityCard(i)
|
|
||||||
})
|
|
||||||
},
|
|
||||||
rebuild() {
|
|
||||||
this.initSizeData()
|
this.initSizeData()
|
||||||
|
|
||||||
var lastBookIndex = Math.min(this.totalEntities, this.booksPerFetch)
|
var lastBookIndex = Math.min(this.totalEntities, this.booksPerFetch)
|
||||||
this.entityIndexesMounted = []
|
this.destroyEntityComponents()
|
||||||
for (let i = 0; i < lastBookIndex; i++) {
|
await this.loadPage(0)
|
||||||
this.entityIndexesMounted.push(i)
|
|
||||||
if (!this.entities[i]) {
|
|
||||||
const page = Math.floor(i / this.booksPerFetch)
|
|
||||||
this.loadPage(page)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var bookshelfEl = document.getElementById('bookshelf')
|
var bookshelfEl = document.getElementById('bookshelf')
|
||||||
if (bookshelfEl) {
|
if (bookshelfEl) {
|
||||||
bookshelfEl.scrollTop = 0
|
bookshelfEl.scrollTop = 0
|
||||||
}
|
}
|
||||||
|
this.mountEntities(0, lastBookIndex)
|
||||||
this.$nextTick(this.remountEntities)
|
|
||||||
},
|
},
|
||||||
buildSearchParams() {
|
buildSearchParams() {
|
||||||
if (this.page === 'search' || this.page === 'collections') {
|
if (this.page === 'search' || this.page === 'collections') {
|
||||||
@ -513,12 +499,29 @@ export default {
|
|||||||
if (wasUpdated) {
|
if (wasUpdated) {
|
||||||
this.resetEntities()
|
this.resetEntities()
|
||||||
} else if (settings.bookshelfCoverSize !== this.currentBookWidth) {
|
} else if (settings.bookshelfCoverSize !== this.currentBookWidth) {
|
||||||
this.executeRebuild()
|
this.rebuild()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getScrollRate() {
|
||||||
|
const currentTimestamp = Date.now()
|
||||||
|
const timeDelta = currentTimestamp - this.lastTimestamp
|
||||||
|
const scrollDelta = this.currScrollTop - this.lastScrollTop
|
||||||
|
const scrollRate = Math.abs(scrollDelta) / (timeDelta || 1)
|
||||||
|
this.lastScrollTop = this.currScrollTop
|
||||||
|
this.lastTimestamp = currentTimestamp
|
||||||
|
return scrollRate
|
||||||
|
},
|
||||||
scroll(e) {
|
scroll(e) {
|
||||||
if (!e || !e.target) return
|
if (!e || !e.target) return
|
||||||
var { scrollTop } = e.target
|
clearTimeout(this.scrollTimeout)
|
||||||
|
const { scrollTop } = e.target
|
||||||
|
const scrollRate = this.getScrollRate()
|
||||||
|
if (scrollRate > 5) {
|
||||||
|
this.scrollTimeout = setTimeout(() => {
|
||||||
|
this.handleScroll(scrollTop)
|
||||||
|
}, 25)
|
||||||
|
return
|
||||||
|
}
|
||||||
this.handleScroll(scrollTop)
|
this.handleScroll(scrollTop)
|
||||||
},
|
},
|
||||||
libraryItemAdded(libraryItem) {
|
libraryItemAdded(libraryItem) {
|
||||||
@ -667,13 +670,14 @@ export default {
|
|||||||
},
|
},
|
||||||
updatePagesLoaded() {
|
updatePagesLoaded() {
|
||||||
let numPages = Math.ceil(this.totalEntities / this.booksPerFetch)
|
let numPages = Math.ceil(this.totalEntities / this.booksPerFetch)
|
||||||
|
this.pagesLoaded = {}
|
||||||
for (let page = 0; page < numPages; page++) {
|
for (let page = 0; page < numPages; page++) {
|
||||||
let numEntities = Math.min(this.totalEntities - page * this.booksPerFetch, this.booksPerFetch)
|
let numEntities = Math.min(this.totalEntities - page * this.booksPerFetch, this.booksPerFetch)
|
||||||
this.pagesLoaded[page] = true
|
this.pagesLoaded[page] = Promise.resolve()
|
||||||
for (let i = 0; i < numEntities; i++) {
|
for (let i = 0; i < numEntities; i++) {
|
||||||
const index = page * this.booksPerFetch + i
|
const index = page * this.booksPerFetch + i
|
||||||
if (!this.entities[index]) {
|
if (!this.entities[index]) {
|
||||||
this.pagesLoaded[page] = false
|
if (this.pagesLoaded[page]) delete this.pagesLoaded[page]
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -688,7 +692,6 @@ export default {
|
|||||||
var entitiesPerShelfBefore = this.entitiesPerShelf
|
var entitiesPerShelfBefore = this.entitiesPerShelf
|
||||||
|
|
||||||
var { clientHeight, clientWidth } = bookshelf
|
var { clientHeight, clientWidth } = bookshelf
|
||||||
// console.log('Init bookshelf width', clientWidth, 'window width', window.innerWidth)
|
|
||||||
this.mountWindowWidth = window.innerWidth
|
this.mountWindowWidth = window.innerWidth
|
||||||
this.bookshelfHeight = clientHeight
|
this.bookshelfHeight = clientHeight
|
||||||
this.bookshelfWidth = clientWidth
|
this.bookshelfWidth = clientWidth
|
||||||
@ -713,10 +716,9 @@ export default {
|
|||||||
this.initSizeData(bookshelf)
|
this.initSizeData(bookshelf)
|
||||||
this.checkUpdateSearchParams()
|
this.checkUpdateSearchParams()
|
||||||
|
|
||||||
this.pagesLoaded[0] = true
|
await this.loadPage(0)
|
||||||
await this.fetchEntites(0)
|
|
||||||
var lastBookIndex = Math.min(this.totalEntities, this.shelvesPerPage * this.entitiesPerShelf)
|
var lastBookIndex = Math.min(this.totalEntities, this.shelvesPerPage * this.entitiesPerShelf)
|
||||||
this.mountEntites(0, lastBookIndex)
|
this.mountEntities(0, lastBookIndex)
|
||||||
|
|
||||||
// Set last scroll position for this bookshelf page
|
// Set last scroll position for this bookshelf page
|
||||||
if (this.$store.state.lastBookshelfScrollData[this.page] && window.bookshelf) {
|
if (this.$store.state.lastBookshelfScrollData[this.page] && window.bookshelf) {
|
||||||
@ -747,7 +749,7 @@ export default {
|
|||||||
var bookshelf = document.getElementById('bookshelf')
|
var bookshelf = document.getElementById('bookshelf')
|
||||||
if (bookshelf) {
|
if (bookshelf) {
|
||||||
this.init(bookshelf)
|
this.init(bookshelf)
|
||||||
bookshelf.addEventListener('scroll', this.scroll)
|
bookshelf.addEventListener('scroll', this.scroll, { passive: true })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -810,10 +812,14 @@ export default {
|
|||||||
},
|
},
|
||||||
destroyEntityComponents() {
|
destroyEntityComponents() {
|
||||||
for (const key in this.entityComponentRefs) {
|
for (const key in this.entityComponentRefs) {
|
||||||
if (this.entityComponentRefs[key] && this.entityComponentRefs[key].destroy) {
|
const ref = this.entityComponentRefs[key]
|
||||||
this.entityComponentRefs[key].destroy()
|
if (ref && ref.destroy) {
|
||||||
|
if (ref.$el) ref.$el.remove()
|
||||||
|
ref.destroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.entityComponentRefs = {}
|
||||||
|
this.entityIndexesMounted = []
|
||||||
},
|
},
|
||||||
scan() {
|
scan() {
|
||||||
this.tempIsScanning = true
|
this.tempIsScanning = true
|
||||||
@ -826,6 +832,14 @@ export default {
|
|||||||
.finally(() => {
|
.finally(() => {
|
||||||
this.tempIsScanning = false
|
this.tempIsScanning = false
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
entitiesInShelf(shelf) {
|
||||||
|
return shelf == this.totalShelves ? this.totalEntities % this.entitiesPerShelf || this.entitiesPerShelf : this.entitiesPerShelf
|
||||||
|
},
|
||||||
|
entityTransform(entityIndex) {
|
||||||
|
const shelfOffsetY = this.shelfPaddingHeight * this.sizeMultiplier
|
||||||
|
const shelfOffsetX = (entityIndex - 1) * this.totalEntityCardWidth + this.bookshelfMarginLeft
|
||||||
|
return `translate3d(${shelfOffsetX}px, ${shelfOffsetY}px, 0px)`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
|
@ -68,6 +68,9 @@ export default {
|
|||||||
cardHeight() {
|
cardHeight() {
|
||||||
return this.height * this.sizeMultiplier
|
return this.height * this.sizeMultiplier
|
||||||
},
|
},
|
||||||
|
coverHeight() {
|
||||||
|
return this.cardHeight
|
||||||
|
},
|
||||||
userToken() {
|
userToken() {
|
||||||
return this.store.getters['user/getToken']
|
return this.store.getters['user/getToken']
|
||||||
},
|
},
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Cover Image -->
|
<!-- Cover Image -->
|
||||||
<img cy-id="coverImage" v-show="libraryItem" :alt="`${displayTitle}, ${$strings.LabelCover}`" ref="cover" aria-hidden="true" :src="bookCoverSrc" class="relative w-full h-full transition-opacity duration-300" :class="showCoverBg ? 'object-contain' : 'object-fill'" @load="imageLoaded" :style="{ opacity: imageReady ? 1 : 0 }" />
|
<img cy-id="coverImage" v-if="libraryItem" :alt="`${displayTitle}, ${$strings.LabelCover}`" ref="cover" aria-hidden="true" :src="bookCoverSrc" class="relative w-full h-full transition-opacity duration-300" :class="showCoverBg ? 'object-contain' : 'object-fill'" @load="imageLoaded" :style="{ opacity: imageReady ? 1 : 0 }" />
|
||||||
|
|
||||||
<!-- Placeholder Cover Title & Author -->
|
<!-- Placeholder Cover Title & Author -->
|
||||||
<div cy-id="placeholderTitle" v-if="!hasCover" class="absolute top-0 left-0 right-0 bottom-0 w-full h-full flex items-center justify-center" :style="{ padding: placeholderCoverPadding + 'em' }">
|
<div cy-id="placeholderTitle" v-if="!hasCover" class="absolute top-0 left-0 right-0 bottom-0 w-full h-full flex items-center justify-center" :style="{ padding: placeholderCoverPadding + 'em' }">
|
||||||
|
@ -19,12 +19,13 @@
|
|||||||
<ui-text-input v-model="currentShareUrl" show-copy readonly class="text-base h-10" />
|
<ui-text-input v-model="currentShareUrl" show-copy readonly class="text-base h-10" />
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full py-2 px-1">
|
<div class="w-full py-2 px-1">
|
||||||
<p v-if="currentShare.expiresAt" class="text-base">{{ $getString('MessageShareExpiresIn', [currentShareTimeRemaining]) }}</p>
|
<p v-if="currentShare.isDownloadable" class="text-sm mb-2">{{ $strings.LabelDownloadable }}</p>
|
||||||
|
<p v-if="currentShare.expiresAt">{{ $getString('MessageShareExpiresIn', [currentShareTimeRemaining]) }}</p>
|
||||||
<p v-else>{{ $strings.LabelPermanent }}</p>
|
<p v-else>{{ $strings.LabelPermanent }}</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="flex flex-col sm:flex-row items-center justify-between space-y-4 sm:space-y-0 sm:space-x-4 mb-4">
|
<div class="flex flex-col sm:flex-row items-center justify-between space-y-4 sm:space-y-0 sm:space-x-4 mb-2">
|
||||||
<div class="w-full sm:w-48">
|
<div class="w-full sm:w-48">
|
||||||
<label class="px-1 text-sm font-semibold block">{{ $strings.LabelSlug }}</label>
|
<label class="px-1 text-sm font-semibold block">{{ $strings.LabelSlug }}</label>
|
||||||
<ui-text-input v-model="newShareSlug" class="text-base h-10" />
|
<ui-text-input v-model="newShareSlug" class="text-base h-10" />
|
||||||
@ -46,6 +47,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex items-center w-full md:w-1/2 mb-4">
|
||||||
|
<p class="text-sm text-gray-300 py-1 px-1">{{ $strings.LabelDownloadable }}</p>
|
||||||
|
<ui-toggle-switch size="sm" v-model="isDownloadable" />
|
||||||
|
<ui-tooltip :text="$strings.LabelShareDownloadableHelp">
|
||||||
|
<p class="pl-4 text-sm">
|
||||||
|
<span class="material-symbols icon-text text-sm">info</span>
|
||||||
|
</p>
|
||||||
|
</ui-tooltip>
|
||||||
|
</div>
|
||||||
<p class="text-sm text-gray-300 py-1 px-1" v-html="$getString('MessageShareURLWillBe', [demoShareUrl])" />
|
<p class="text-sm text-gray-300 py-1 px-1" v-html="$getString('MessageShareURLWillBe', [demoShareUrl])" />
|
||||||
<p class="text-sm text-gray-300 py-1 px-1" v-html="$getString('MessageShareExpirationWillBe', [expirationDateString])" />
|
<p class="text-sm text-gray-300 py-1 px-1" v-html="$getString('MessageShareExpirationWillBe', [expirationDateString])" />
|
||||||
</template>
|
</template>
|
||||||
@ -81,7 +91,8 @@ export default {
|
|||||||
text: this.$strings.LabelDays,
|
text: this.$strings.LabelDays,
|
||||||
value: 'days'
|
value: 'days'
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
isDownloadable: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -172,7 +183,8 @@ export default {
|
|||||||
slug: this.newShareSlug,
|
slug: this.newShareSlug,
|
||||||
mediaItemType: 'book',
|
mediaItemType: 'book',
|
||||||
mediaItemId: this.libraryItem.media.id,
|
mediaItemId: this.libraryItem.media.id,
|
||||||
expiresAt: this.expireDurationSeconds ? Date.now() + this.expireDurationSeconds * 1000 : 0
|
expiresAt: this.expireDurationSeconds ? Date.now() + this.expireDurationSeconds * 1000 : 0,
|
||||||
|
isDownloadable: this.isDownloadable
|
||||||
}
|
}
|
||||||
this.processing = true
|
this.processing = true
|
||||||
this.$axios
|
this.$axios
|
||||||
|
@ -57,9 +57,10 @@ export default {
|
|||||||
for (let entry of entries) {
|
for (let entry of entries) {
|
||||||
this.cardWidth = entry.borderBoxSize[0].inlineSize
|
this.cardWidth = entry.borderBoxSize[0].inlineSize
|
||||||
this.cardHeight = entry.borderBoxSize[0].blockSize
|
this.cardHeight = entry.borderBoxSize[0].blockSize
|
||||||
this.resizeObserver.disconnect()
|
|
||||||
this.$refs.bookshelf.removeChild(instance.$el)
|
|
||||||
}
|
}
|
||||||
|
this.coverHeight = instance.coverHeight
|
||||||
|
this.resizeObserver.disconnect()
|
||||||
|
this.$refs.bookshelf.removeChild(instance.$el)
|
||||||
})
|
})
|
||||||
instance.$el.style.visibility = 'hidden'
|
instance.$el.style.visibility = 'hidden'
|
||||||
instance.$el.style.position = 'absolute'
|
instance.$el.style.position = 'absolute'
|
||||||
@ -131,10 +132,7 @@ export default {
|
|||||||
this.entityComponentRefs[index] = instance
|
this.entityComponentRefs[index] = instance
|
||||||
|
|
||||||
instance.$mount()
|
instance.$mount()
|
||||||
const shelfOffsetY = this.shelfPaddingHeight * this.sizeMultiplier
|
instance.$el.style.transform = this.entityTransform((index % this.entitiesPerShelf) + 1)
|
||||||
const row = index % this.entitiesPerShelf
|
|
||||||
const shelfOffsetX = row * this.totalEntityCardWidth + this.bookshelfMarginLeft
|
|
||||||
instance.$el.style.transform = `translate3d(${shelfOffsetX}px, ${shelfOffsetY}px, 0px)`
|
|
||||||
instance.$el.classList.add('absolute', 'top-0', 'left-0')
|
instance.$el.classList.add('absolute', 'top-0', 'left-0')
|
||||||
shelfEl.appendChild(instance.$el)
|
shelfEl.appendChild(instance.$el)
|
||||||
|
|
||||||
|
4
client/package-lock.json
generated
4
client/package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.17.5",
|
"version": "2.17.6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "2.17.5",
|
"version": "2.17.6",
|
||||||
"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.17.5",
|
"version": "2.17.6",
|
||||||
"buildNumber": 1,
|
"buildNumber": 1,
|
||||||
"description": "Self-hosted audiobook and podcast client",
|
"description": "Self-hosted audiobook and podcast client",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
<tr v-for="feed in feeds" :key="feed.id" class="cursor-pointer h-12" @click="showFeed(feed)">
|
<tr v-for="feed in feeds" :key="feed.id" class="cursor-pointer h-12" @click="showFeed(feed)">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td>
|
<td>
|
||||||
<img :src="coverUrl(feed)" class="h-full w-full" />
|
<img :src="coverUrl(feed)" class="h-auto w-full" />
|
||||||
</td>
|
</td>
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<td class="w-48 max-w-64 min-w-24 text-left truncate">
|
<td class="w-48 max-w-64 min-w-24 text-left truncate">
|
||||||
|
@ -12,6 +12,10 @@
|
|||||||
<div class="w-full pt-16">
|
<div class="w-full pt-16">
|
||||||
<player-ui ref="audioPlayer" :chapters="chapters" :current-chapter="currentChapter" :paused="isPaused" :loading="!hasLoaded" :is-podcast="false" hide-bookmarks hide-sleep-timer @playPause="playPause" @jumpForward="jumpForward" @jumpBackward="jumpBackward" @setVolume="setVolume" @setPlaybackRate="setPlaybackRate" @seek="seek" />
|
<player-ui ref="audioPlayer" :chapters="chapters" :current-chapter="currentChapter" :paused="isPaused" :loading="!hasLoaded" :is-podcast="false" hide-bookmarks hide-sleep-timer @playPause="playPause" @jumpForward="jumpForward" @jumpBackward="jumpBackward" @setVolume="setVolume" @setPlaybackRate="setPlaybackRate" @seek="seek" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ui-tooltip v-if="mediaItemShare.isDownloadable" direction="bottom" :text="$strings.LabelDownload" class="absolute top-0 left-0 m-4">
|
||||||
|
<button aria-label="Download" class="text-gray-300 hover:text-white" @click="downloadShareItem"><span class="material-symbols text-2xl sm:text-3xl">download</span></button>
|
||||||
|
</ui-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -63,6 +67,9 @@ export default {
|
|||||||
if (!this.playbackSession.coverPath) return `${this.$config.routerBasePath}/book_placeholder.jpg`
|
if (!this.playbackSession.coverPath) return `${this.$config.routerBasePath}/book_placeholder.jpg`
|
||||||
return `${this.$config.routerBasePath}/public/share/${this.mediaItemShare.slug}/cover`
|
return `${this.$config.routerBasePath}/public/share/${this.mediaItemShare.slug}/cover`
|
||||||
},
|
},
|
||||||
|
downloadUrl() {
|
||||||
|
return `${process.env.serverUrl}/public/share/${this.mediaItemShare.slug}/download`
|
||||||
|
},
|
||||||
audioTracks() {
|
audioTracks() {
|
||||||
return (this.playbackSession.audioTracks || []).map((track) => {
|
return (this.playbackSession.audioTracks || []).map((track) => {
|
||||||
track.relativeContentUrl = track.contentUrl
|
track.relativeContentUrl = track.contentUrl
|
||||||
@ -247,6 +254,9 @@ export default {
|
|||||||
},
|
},
|
||||||
playerFinished() {
|
playerFinished() {
|
||||||
console.log('Player finished')
|
console.log('Player finished')
|
||||||
|
},
|
||||||
|
downloadShareItem() {
|
||||||
|
this.$downloadFile(this.downloadUrl)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -234,7 +234,7 @@
|
|||||||
"LabelAppend": "Připojit",
|
"LabelAppend": "Připojit",
|
||||||
"LabelAudioBitrate": "Bitový tok zvuku (např. 128k)",
|
"LabelAudioBitrate": "Bitový tok zvuku (např. 128k)",
|
||||||
"LabelAudioChannels": "Zvukové kanály (1 nebo 2)",
|
"LabelAudioChannels": "Zvukové kanály (1 nebo 2)",
|
||||||
"LabelAudioCodec": "Kodek audia",
|
"LabelAudioCodec": "Audio Kodek",
|
||||||
"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)",
|
||||||
@ -420,6 +420,7 @@
|
|||||||
"LabelMatchExistingUsersBy": "Přiřadit stávající uživatele podle",
|
"LabelMatchExistingUsersBy": "Přiřadit stávající uživatele podle",
|
||||||
"LabelMatchExistingUsersByDescription": "Slouží k propojení stávajících uživatelů. Po propojení budou uživatelé přiřazeni k jedinečnému ID od poskytovatele SSO.",
|
"LabelMatchExistingUsersByDescription": "Slouží k propojení stávajících uživatelů. Po propojení budou uživatelé přiřazeni k jedinečnému ID od poskytovatele SSO.",
|
||||||
"LabelMaxEpisodesToDownload": "Maximální # epizod pro stažení. Použijte 0 pro bez omezení.",
|
"LabelMaxEpisodesToDownload": "Maximální # epizod pro stažení. Použijte 0 pro bez omezení.",
|
||||||
|
"LabelMaxEpisodesToDownloadPerCheck": "Maximální počet nových epizod ke stažení při jedné kontrole",
|
||||||
"LabelMaxEpisodesToKeep": "Maximální počet epizod k zachování",
|
"LabelMaxEpisodesToKeep": "Maximální počet epizod k zachování",
|
||||||
"LabelMaxEpisodesToKeepHelp": "Hodnotou 0 není nastaven žádný maximální limit. Po automatickém stažení nové epizody se odstraní nejstarší epizoda, pokud máte více než X epizod. Při každém novém stažení se odstraní pouze 1 epizoda.",
|
"LabelMaxEpisodesToKeepHelp": "Hodnotou 0 není nastaven žádný maximální limit. Po automatickém stažení nové epizody se odstraní nejstarší epizoda, pokud máte více než X epizod. Při každém novém stažení se odstraní pouze 1 epizoda.",
|
||||||
"LabelMediaPlayer": "Přehrávač médií",
|
"LabelMediaPlayer": "Přehrávač médií",
|
||||||
@ -735,6 +736,7 @@
|
|||||||
"MessageConfirmPurgeCache": "Vyčistit mezipaměť odstraní celý adresář na adrese <code>/metadata/cache</code>. <br /><br />Určitě chcete odstranit adresář mezipaměti?",
|
"MessageConfirmPurgeCache": "Vyčistit mezipaměť odstraní celý adresář na adrese <code>/metadata/cache</code>. <br /><br />Určitě chcete odstranit adresář mezipaměti?",
|
||||||
"MessageConfirmPurgeItemsCache": "Vyčištění mezipaměti položek odstraní celý adresář <code>/metadata/cache/items</code>.<br />Jste si jistí?",
|
"MessageConfirmPurgeItemsCache": "Vyčištění mezipaměti položek odstraní celý adresář <code>/metadata/cache/items</code>.<br />Jste si jistí?",
|
||||||
"MessageConfirmQuickEmbed": "Varování! Rychlé vložení nezálohuje vaše zvukové soubory. Ujistěte se, že máte zálohu zvukových souborů. <br><br>Chcete pokračovat?",
|
"MessageConfirmQuickEmbed": "Varování! Rychlé vložení nezálohuje vaše zvukové soubory. Ujistěte se, že máte zálohu zvukových souborů. <br><br>Chcete pokračovat?",
|
||||||
|
"MessageConfirmQuickMatchEpisodes": "Pokud je nalezena shoda při rychlém párování epizod, dojde k přepsání podrobností. Aktualizovány budou pouze nespárované epizody. Jste si jisti?",
|
||||||
"MessageConfirmReScanLibraryItems": "Opravdu chcete znovu prohledat {0} položky?",
|
"MessageConfirmReScanLibraryItems": "Opravdu chcete znovu prohledat {0} položky?",
|
||||||
"MessageConfirmRemoveAllChapters": "Opravdu chcete odstranit všechny kapitoly?",
|
"MessageConfirmRemoveAllChapters": "Opravdu chcete odstranit všechny kapitoly?",
|
||||||
"MessageConfirmRemoveAuthor": "Opravdu chcete odstranit autora \"{0}\"?",
|
"MessageConfirmRemoveAuthor": "Opravdu chcete odstranit autora \"{0}\"?",
|
||||||
@ -742,6 +744,7 @@
|
|||||||
"MessageConfirmRemoveEpisode": "Opravdu chcete odstranit epizodu \"{0}\"?",
|
"MessageConfirmRemoveEpisode": "Opravdu chcete odstranit epizodu \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisodes": "Opravdu chcete odstranit {0} epizody?",
|
"MessageConfirmRemoveEpisodes": "Opravdu chcete odstranit {0} epizody?",
|
||||||
"MessageConfirmRemoveListeningSessions": "Opravdu chcete odebrat {0} poslechových relací?",
|
"MessageConfirmRemoveListeningSessions": "Opravdu chcete odebrat {0} poslechových relací?",
|
||||||
|
"MessageConfirmRemoveMetadataFiles": "Jste si jisti, že chcete odstranit všechny metadata.{0} soubory ve složkách s položkami ve vaší knihovně?",
|
||||||
"MessageConfirmRemoveNarrator": "Opravdu chcete odebrat předčítání \"{0}\"?",
|
"MessageConfirmRemoveNarrator": "Opravdu chcete odebrat předčítání \"{0}\"?",
|
||||||
"MessageConfirmRemovePlaylist": "Opravdu chcete odstranit svůj playlist \"{0}\"?",
|
"MessageConfirmRemovePlaylist": "Opravdu chcete odstranit svůj playlist \"{0}\"?",
|
||||||
"MessageConfirmRenameGenre": "Opravdu chcete přejmenovat žánr \"{0}\" na \"{1}\" pro všechny položky?",
|
"MessageConfirmRenameGenre": "Opravdu chcete přejmenovat žánr \"{0}\" na \"{1}\" pro všechny položky?",
|
||||||
@ -757,6 +760,7 @@
|
|||||||
"MessageDragFilesIntoTrackOrder": "Přetáhněte soubory do správného pořadí stop",
|
"MessageDragFilesIntoTrackOrder": "Přetáhněte soubory do správného pořadí stop",
|
||||||
"MessageEmbedFailed": "Vložení selhalo!",
|
"MessageEmbedFailed": "Vložení selhalo!",
|
||||||
"MessageEmbedFinished": "Vložení dokončeno!",
|
"MessageEmbedFinished": "Vložení dokončeno!",
|
||||||
|
"MessageEmbedQueue": "Zařazeno do fronty pro vložení metadat ({0} ve frontě)",
|
||||||
"MessageEpisodesQueuedForDownload": "{0} Epizody zařazené do fronty ke stažení",
|
"MessageEpisodesQueuedForDownload": "{0} Epizody zařazené do fronty ke stažení",
|
||||||
"MessageEreaderDevices": "Aby bylo zajištěno doručení elektronických knih, může být nutné přidat výše uvedenou e-mailovou adresu jako platného odesílatele pro každé zařízení uvedené níže.",
|
"MessageEreaderDevices": "Aby bylo zajištěno doručení elektronických knih, může být nutné přidat výše uvedenou e-mailovou adresu jako platného odesílatele pro každé zařízení uvedené níže.",
|
||||||
"MessageFeedURLWillBe": "URL zdroje bude {0}",
|
"MessageFeedURLWillBe": "URL zdroje bude {0}",
|
||||||
@ -801,6 +805,7 @@
|
|||||||
"MessageNoLogs": "Žádné protokoly",
|
"MessageNoLogs": "Žádné protokoly",
|
||||||
"MessageNoMediaProgress": "Žádný průběh médií",
|
"MessageNoMediaProgress": "Žádný průběh médií",
|
||||||
"MessageNoNotifications": "Žádná oznámení",
|
"MessageNoNotifications": "Žádná oznámení",
|
||||||
|
"MessageNoPodcastFeed": "Neplatný podcast: Žádný kanál",
|
||||||
"MessageNoPodcastsFound": "Nebyly nalezeny žádné podcasty",
|
"MessageNoPodcastsFound": "Nebyly nalezeny žádné podcasty",
|
||||||
"MessageNoResults": "Žádné výsledky",
|
"MessageNoResults": "Žádné výsledky",
|
||||||
"MessageNoSearchResultsFor": "Nebyly nalezeny žádné výsledky hledání pro \"{0}\"",
|
"MessageNoSearchResultsFor": "Nebyly nalezeny žádné výsledky hledání pro \"{0}\"",
|
||||||
@ -817,7 +822,10 @@
|
|||||||
"MessagePlaylistCreateFromCollection": "Vytvořit seznam skladeb z kolekce",
|
"MessagePlaylistCreateFromCollection": "Vytvořit seznam skladeb z kolekce",
|
||||||
"MessagePleaseWait": "Čekejte prosím...",
|
"MessagePleaseWait": "Čekejte prosím...",
|
||||||
"MessagePodcastHasNoRSSFeedForMatching": "Podcast nemá žádnou adresu URL kanálu RSS, kterou by mohl použít pro porovnávání",
|
"MessagePodcastHasNoRSSFeedForMatching": "Podcast nemá žádnou adresu URL kanálu RSS, kterou by mohl použít pro porovnávání",
|
||||||
"MessageQuickMatchDescription": "Vyplňte prázdné detaily položky a obálku prvním výsledkem shody z '{0}'. Nepřepisuje podrobnosti, pokud není povoleno nastavení serveru \"Preferovat párování metadata\".",
|
"MessageQuickEmbedInProgress": "Probíhá rychlé vkládání",
|
||||||
|
"MessageQuickEmbedQueue": "Zařazeno do fronty pro rychlé vložení ({0} ve frontě)",
|
||||||
|
"MessageQuickMatchAllEpisodes": "Rychlá shoda všech epizod",
|
||||||
|
"MessageQuickMatchDescription": "Vyplnit prázdné detaily položky a obálky prvním výsledkem shody z '{0}'. Nepřepisuje detaily, pokud není povoleno nastavení serveru 'Preferovat shodná metadata'.",
|
||||||
"MessageRemoveChapter": "Odstranit kapitolu",
|
"MessageRemoveChapter": "Odstranit kapitolu",
|
||||||
"MessageRemoveEpisodes": "Odstranit {0} epizodu",
|
"MessageRemoveEpisodes": "Odstranit {0} epizodu",
|
||||||
"MessageRemoveFromPlayerQueue": "Odstranit z fronty přehrávače",
|
"MessageRemoveFromPlayerQueue": "Odstranit z fronty přehrávače",
|
||||||
@ -848,10 +856,13 @@
|
|||||||
"MessageTaskFailedToMergeAudioFiles": "Spojení audio souborů selhalo",
|
"MessageTaskFailedToMergeAudioFiles": "Spojení audio souborů selhalo",
|
||||||
"MessageTaskFailedToMoveM4bFile": "Přesunutí m4b souboru selhalo",
|
"MessageTaskFailedToMoveM4bFile": "Přesunutí m4b souboru selhalo",
|
||||||
"MessageTaskFailedToWriteMetadataFile": "Zápis souboru metadat selhal",
|
"MessageTaskFailedToWriteMetadataFile": "Zápis souboru metadat selhal",
|
||||||
|
"MessageTaskMatchingBooksInLibrary": "Párování knih v knihovně „{0}“",
|
||||||
"MessageTaskNoFilesToScan": "Žádné soubory ke skenování",
|
"MessageTaskNoFilesToScan": "Žádné soubory ke skenování",
|
||||||
"MessageTaskOpmlImport": "Import OPML",
|
"MessageTaskOpmlImport": "Import OPML",
|
||||||
"MessageTaskOpmlImportDescription": "Vytváření podcastů z {0} RSS feedů",
|
"MessageTaskOpmlImportDescription": "Vytváření podcastů z {0} RSS feedů",
|
||||||
|
"MessageTaskOpmlImportFeed": "Importní zdroj OPML",
|
||||||
"MessageTaskOpmlImportFeedDescription": "Importování RSS feedu \"{0}\"",
|
"MessageTaskOpmlImportFeedDescription": "Importování RSS feedu \"{0}\"",
|
||||||
|
"MessageTaskOpmlImportFeedFailed": "Nepodařilo se získat kanál podcastu",
|
||||||
"MessageTaskOpmlImportFeedPodcastDescription": "Vytváření podcastu \"{0}\"",
|
"MessageTaskOpmlImportFeedPodcastDescription": "Vytváření podcastu \"{0}\"",
|
||||||
"MessageTaskOpmlImportFeedPodcastExists": "Podcast se stejnou cestou již existuje",
|
"MessageTaskOpmlImportFeedPodcastExists": "Podcast se stejnou cestou již existuje",
|
||||||
"MessageTaskOpmlImportFeedPodcastFailed": "Vytváření podcastu selhalo",
|
"MessageTaskOpmlImportFeedPodcastFailed": "Vytváření podcastu selhalo",
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
"ButtonChooseFiles": "Vælg filer",
|
"ButtonChooseFiles": "Vælg filer",
|
||||||
"ButtonClearFilter": "Ryd filter",
|
"ButtonClearFilter": "Ryd filter",
|
||||||
"ButtonCloseFeed": "Luk feed",
|
"ButtonCloseFeed": "Luk feed",
|
||||||
|
"ButtonCloseSession": "Luk Åben Session",
|
||||||
"ButtonCollections": "Samlinger",
|
"ButtonCollections": "Samlinger",
|
||||||
"ButtonConfigureScanner": "Konfigurer scanner",
|
"ButtonConfigureScanner": "Konfigurer scanner",
|
||||||
"ButtonCreate": "Opret",
|
"ButtonCreate": "Opret",
|
||||||
@ -29,7 +30,9 @@
|
|||||||
"ButtonEditChapters": "Rediger kapitler",
|
"ButtonEditChapters": "Rediger kapitler",
|
||||||
"ButtonEditPodcast": "Rediger podcast",
|
"ButtonEditPodcast": "Rediger podcast",
|
||||||
"ButtonEnable": "Aktiver",
|
"ButtonEnable": "Aktiver",
|
||||||
"ButtonForceReScan": "Tvungen genindlæsning",
|
"ButtonFireAndFail": "Affyring Og Fejl",
|
||||||
|
"ButtonFireOnTest": "Affyring vedTest begivenhed",
|
||||||
|
"ButtonForceReScan": "Tving genindlæsning",
|
||||||
"ButtonFullPath": "Fuld sti",
|
"ButtonFullPath": "Fuld sti",
|
||||||
"ButtonHide": "Skjul",
|
"ButtonHide": "Skjul",
|
||||||
"ButtonHome": "Hjem",
|
"ButtonHome": "Hjem",
|
||||||
|
@ -300,6 +300,7 @@
|
|||||||
"LabelDiscover": "Discover",
|
"LabelDiscover": "Discover",
|
||||||
"LabelDownload": "Download",
|
"LabelDownload": "Download",
|
||||||
"LabelDownloadNEpisodes": "Download {0} episodes",
|
"LabelDownloadNEpisodes": "Download {0} episodes",
|
||||||
|
"LabelDownloadable": "Downloadable",
|
||||||
"LabelDuration": "Duration",
|
"LabelDuration": "Duration",
|
||||||
"LabelDurationComparisonExactMatch": "(exact match)",
|
"LabelDurationComparisonExactMatch": "(exact match)",
|
||||||
"LabelDurationComparisonLonger": "({0} longer)",
|
"LabelDurationComparisonLonger": "({0} longer)",
|
||||||
@ -588,6 +589,7 @@
|
|||||||
"LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders",
|
"LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders",
|
||||||
"LabelSettingsTimeFormat": "Time Format",
|
"LabelSettingsTimeFormat": "Time Format",
|
||||||
"LabelShare": "Share",
|
"LabelShare": "Share",
|
||||||
|
"LabelShareDownloadableHelp": "Allows users with the share link to download a zip file of the library item.",
|
||||||
"LabelShareOpen": "Share Open",
|
"LabelShareOpen": "Share Open",
|
||||||
"LabelShareURL": "Share URL",
|
"LabelShareURL": "Share URL",
|
||||||
"LabelShowAll": "Show All",
|
"LabelShowAll": "Show All",
|
||||||
|
@ -206,7 +206,7 @@
|
|||||||
"HeaderUpdateDetails": "Részletek frissítése",
|
"HeaderUpdateDetails": "Részletek frissítése",
|
||||||
"HeaderUpdateLibrary": "Könyvtár frissítése",
|
"HeaderUpdateLibrary": "Könyvtár frissítése",
|
||||||
"HeaderUsers": "Felhasználók",
|
"HeaderUsers": "Felhasználók",
|
||||||
"HeaderYearReview": "{0} év áttekintése",
|
"HeaderYearReview": "{0} év visszatekintése",
|
||||||
"HeaderYourStats": "Saját statisztikák",
|
"HeaderYourStats": "Saját statisztikák",
|
||||||
"LabelAbridged": "Tömörített",
|
"LabelAbridged": "Tömörített",
|
||||||
"LabelAbridgedChecked": "Rövidített (ellenőrizve)",
|
"LabelAbridgedChecked": "Rövidített (ellenőrizve)",
|
||||||
@ -478,7 +478,7 @@
|
|||||||
"LabelPermissionsDownload": "Letölthet",
|
"LabelPermissionsDownload": "Letölthet",
|
||||||
"LabelPermissionsUpdate": "Frissíthet",
|
"LabelPermissionsUpdate": "Frissíthet",
|
||||||
"LabelPermissionsUpload": "Feltölthet",
|
"LabelPermissionsUpload": "Feltölthet",
|
||||||
"LabelPersonalYearReview": "Az éved áttekintése ({0})",
|
"LabelPersonalYearReview": "Az évvisszatekintésed ({0})",
|
||||||
"LabelPhotoPathURL": "Fénykép útvonal/URL",
|
"LabelPhotoPathURL": "Fénykép útvonal/URL",
|
||||||
"LabelPlayMethod": "Lejátszási módszer",
|
"LabelPlayMethod": "Lejátszási módszer",
|
||||||
"LabelPlayerChapterNumberMarker": "{0} a {1} -ből",
|
"LabelPlayerChapterNumberMarker": "{0} a {1} -ből",
|
||||||
@ -539,7 +539,7 @@
|
|||||||
"LabelSeriesName": "Sorozat neve",
|
"LabelSeriesName": "Sorozat neve",
|
||||||
"LabelSeriesProgress": "Sorozat haladása",
|
"LabelSeriesProgress": "Sorozat haladása",
|
||||||
"LabelServerLogLevel": "Kiszolgáló naplózási szint",
|
"LabelServerLogLevel": "Kiszolgáló naplózási szint",
|
||||||
"LabelServerYearReview": "Szerver évértékelő ({0})",
|
"LabelServerYearReview": "Szerver évvisszatekintés ({0})",
|
||||||
"LabelSetEbookAsPrimary": "Beállítás elsődlegesként",
|
"LabelSetEbookAsPrimary": "Beállítás elsődlegesként",
|
||||||
"LabelSetEbookAsSupplementary": "Beállítás kiegészítőként",
|
"LabelSetEbookAsSupplementary": "Beállítás kiegészítőként",
|
||||||
"LabelSettingsAllowIframe": "A beágyazás engedélyezése egy iframe-be",
|
"LabelSettingsAllowIframe": "A beágyazás engedélyezése egy iframe-be",
|
||||||
@ -684,8 +684,8 @@
|
|||||||
"LabelWeekdaysToRun": "Futás napjai",
|
"LabelWeekdaysToRun": "Futás napjai",
|
||||||
"LabelXBooks": "{0} könyv",
|
"LabelXBooks": "{0} könyv",
|
||||||
"LabelXItems": "{0} elem",
|
"LabelXItems": "{0} elem",
|
||||||
"LabelYearReviewHide": "Évértékelő elrejtése",
|
"LabelYearReviewHide": "Az évvisszatekintés elrejtése",
|
||||||
"LabelYearReviewShow": "Évértékelés megtekintése",
|
"LabelYearReviewShow": "Évvisszatekintés megtekintése",
|
||||||
"LabelYourAudiobookDuration": "Hangoskönyv időtartama",
|
"LabelYourAudiobookDuration": "Hangoskönyv időtartama",
|
||||||
"LabelYourBookmarks": "Könyvjelzőid",
|
"LabelYourBookmarks": "Könyvjelzőid",
|
||||||
"LabelYourPlaylists": "Lejátszási listáid",
|
"LabelYourPlaylists": "Lejátszási listáid",
|
||||||
@ -910,7 +910,7 @@
|
|||||||
"StatsTopNarrator": "TOP ELŐADÓ",
|
"StatsTopNarrator": "TOP ELŐADÓ",
|
||||||
"StatsTopNarrators": "TOP ELŐADÓ",
|
"StatsTopNarrators": "TOP ELŐADÓ",
|
||||||
"StatsTotalDuration": "A teljes időtartam…",
|
"StatsTotalDuration": "A teljes időtartam…",
|
||||||
"StatsYearInReview": "ÉVÉRTÉKELÉS",
|
"StatsYearInReview": "ÉVVISSZATEKINTÉS",
|
||||||
"ToastAccountUpdateSuccess": "Fiók frissítve",
|
"ToastAccountUpdateSuccess": "Fiók frissítve",
|
||||||
"ToastAppriseUrlRequired": "Meg kell adnia egy Apprise URL-címet",
|
"ToastAppriseUrlRequired": "Meg kell adnia egy Apprise URL-címet",
|
||||||
"ToastAsinRequired": "ASIN kötelező",
|
"ToastAsinRequired": "ASIN kötelező",
|
||||||
|
@ -104,7 +104,7 @@
|
|||||||
"ButtonViewAll": "Peržiūrėti visus",
|
"ButtonViewAll": "Peržiūrėti visus",
|
||||||
"ButtonYes": "Taip",
|
"ButtonYes": "Taip",
|
||||||
"ErrorUploadFetchMetadataAPI": "Klaida gaunant metaduomenis",
|
"ErrorUploadFetchMetadataAPI": "Klaida gaunant metaduomenis",
|
||||||
"ErrorUploadFetchMetadataNoResults": "Nepavyko gauti metaduomenų - pabandykite atnaujinti pavadinimą ir/ar autorių.",
|
"ErrorUploadFetchMetadataNoResults": "Nepavyko gauti metaduomenų - pabandykite atnaujinti pavadinimą ir/ar autorių",
|
||||||
"ErrorUploadLacksTitle": "Pavadinimas yra privalomas",
|
"ErrorUploadLacksTitle": "Pavadinimas yra privalomas",
|
||||||
"HeaderAccount": "Paskyra",
|
"HeaderAccount": "Paskyra",
|
||||||
"HeaderAdvanced": "Papildomi",
|
"HeaderAdvanced": "Papildomi",
|
||||||
@ -419,7 +419,7 @@
|
|||||||
"LabelSettingsExperimentalFeatures": "Eksperimentiniai funkcionalumai",
|
"LabelSettingsExperimentalFeatures": "Eksperimentiniai funkcionalumai",
|
||||||
"LabelSettingsExperimentalFeaturesHelp": "Funkcijos, kurios yra kuriamos ir laukiami jūsų komentarai. Spustelėkite, kad atidarytumėte „GitHub“ diskusiją.",
|
"LabelSettingsExperimentalFeaturesHelp": "Funkcijos, kurios yra kuriamos ir laukiami jūsų komentarai. Spustelėkite, kad atidarytumėte „GitHub“ diskusiją.",
|
||||||
"LabelSettingsFindCovers": "Rasti viršelius",
|
"LabelSettingsFindCovers": "Rasti viršelius",
|
||||||
"LabelSettingsFindCoversHelp": "Jei jūsų audioknyga neturi įterpto viršelio arba viršelio paveikslėlio aplanke, bandyti rasti viršelį.<br>Pastaba: Tai padidins skenavimo trukmę.",
|
"LabelSettingsFindCoversHelp": "Jei jūsų audioknyga neturi įterpto viršelio arba viršelio paveikslėlio aplanke, bandyti rasti viršelį.<br>Pastaba: Tai padidins skenavimo trukmę",
|
||||||
"LabelSettingsHideSingleBookSeries": "Slėpti serijas, turinčias tik vieną knygą",
|
"LabelSettingsHideSingleBookSeries": "Slėpti serijas, turinčias tik vieną knygą",
|
||||||
"LabelSettingsHideSingleBookSeriesHelp": "Serijos, turinčios tik vieną knygą, bus paslėptos nuo serijų puslapio ir pagrindinio puslapio lentynų.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Serijos, turinčios tik vieną knygą, bus paslėptos nuo serijų puslapio ir pagrindinio puslapio lentynų.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Naudoti pagrindinio puslapio knygų lentynų vaizdą",
|
"LabelSettingsHomePageBookshelfView": "Naudoti pagrindinio puslapio knygų lentynų vaizdą",
|
||||||
|
@ -29,13 +29,16 @@
|
|||||||
"ButtonEdit": "Rediger",
|
"ButtonEdit": "Rediger",
|
||||||
"ButtonEditChapters": "Rediger kapittel",
|
"ButtonEditChapters": "Rediger kapittel",
|
||||||
"ButtonEditPodcast": "Rediger podcast",
|
"ButtonEditPodcast": "Rediger podcast",
|
||||||
|
"ButtonEnable": "Aktiver",
|
||||||
|
"ButtonFireAndFail": "Kjør ved feil",
|
||||||
|
"ButtonFireOnTest": "Kjør onTest-kommando",
|
||||||
"ButtonForceReScan": "Tving skann",
|
"ButtonForceReScan": "Tving skann",
|
||||||
"ButtonFullPath": "Full sti",
|
"ButtonFullPath": "Full sti",
|
||||||
"ButtonHide": "Gjøm",
|
"ButtonHide": "Gjøm",
|
||||||
"ButtonHome": "Hjem",
|
"ButtonHome": "Hjem",
|
||||||
"ButtonIssues": "Problemer",
|
"ButtonIssues": "Problemer",
|
||||||
"ButtonJumpBackward": "Hopp Bakover",
|
"ButtonJumpBackward": "Hopp bakover",
|
||||||
"ButtonJumpForward": "Hopp Fremover",
|
"ButtonJumpForward": "Hopp frem",
|
||||||
"ButtonLatest": "Siste",
|
"ButtonLatest": "Siste",
|
||||||
"ButtonLibrary": "Bibliotek",
|
"ButtonLibrary": "Bibliotek",
|
||||||
"ButtonLogout": "Logg ut",
|
"ButtonLogout": "Logg ut",
|
||||||
@ -45,24 +48,31 @@
|
|||||||
"ButtonMatchAllAuthors": "Søk opp alle forfattere",
|
"ButtonMatchAllAuthors": "Søk opp alle forfattere",
|
||||||
"ButtonMatchBooks": "Søk opp bøker",
|
"ButtonMatchBooks": "Søk opp bøker",
|
||||||
"ButtonNevermind": "Avbryt",
|
"ButtonNevermind": "Avbryt",
|
||||||
|
"ButtonNext": "Neste",
|
||||||
"ButtonNextChapter": "Neste Kapittel",
|
"ButtonNextChapter": "Neste Kapittel",
|
||||||
|
"ButtonNextItemInQueue": "Neste element i køen",
|
||||||
|
"ButtonOk": "Ok",
|
||||||
"ButtonOpenFeed": "Åpne Feed",
|
"ButtonOpenFeed": "Åpne Feed",
|
||||||
"ButtonOpenManager": "Åpne behandler",
|
"ButtonOpenManager": "Åpne behandler",
|
||||||
|
"ButtonPause": "Pause",
|
||||||
"ButtonPlay": "Spill av",
|
"ButtonPlay": "Spill av",
|
||||||
|
"ButtonPlayAll": "Spill av alle",
|
||||||
"ButtonPlaying": "Spiller av",
|
"ButtonPlaying": "Spiller av",
|
||||||
"ButtonPlaylists": "Spillelister",
|
"ButtonPlaylists": "Spillelister",
|
||||||
"ButtonPrevious": "Forrige",
|
"ButtonPrevious": "Forrige",
|
||||||
"ButtonPreviousChapter": "Forrige Kapittel",
|
"ButtonPreviousChapter": "Forrige Kapittel",
|
||||||
|
"ButtonProbeAudioFile": "Analyser lydfil",
|
||||||
"ButtonPurgeAllCache": "Tøm alle mellomlager",
|
"ButtonPurgeAllCache": "Tøm alle mellomlager",
|
||||||
"ButtonPurgeItemsCache": "Tøm mellomlager",
|
"ButtonPurgeItemsCache": "Tøm mellomlager",
|
||||||
"ButtonQueueAddItem": "Legg til kø",
|
"ButtonQueueAddItem": "Legg til kø",
|
||||||
"ButtonQueueRemoveItem": "Fjern fra kø",
|
"ButtonQueueRemoveItem": "Fjern fra kø",
|
||||||
"ButtonQuickEmbedMetadata": "Hurtig Innbygging Av Metadata",
|
"ButtonQuickEmbed": "Hurtiginnbygging",
|
||||||
|
"ButtonQuickEmbedMetadata": "Bygg inn metadata",
|
||||||
"ButtonQuickMatch": "Kjapt søk",
|
"ButtonQuickMatch": "Kjapt søk",
|
||||||
"ButtonReScan": "Skann på nytt",
|
"ButtonReScan": "Skann på nytt",
|
||||||
"ButtonRead": "Les",
|
"ButtonRead": "Les",
|
||||||
"ButtonReadLess": "Les Mindre",
|
"ButtonReadLess": "Vis mindre",
|
||||||
"ButtonReadMore": "Les Mer",
|
"ButtonReadMore": "Vis mer",
|
||||||
"ButtonRefresh": "Oppdater",
|
"ButtonRefresh": "Oppdater",
|
||||||
"ButtonRemove": "Fjern",
|
"ButtonRemove": "Fjern",
|
||||||
"ButtonRemoveAll": "Fjern alle",
|
"ButtonRemoveAll": "Fjern alle",
|
||||||
@ -71,12 +81,15 @@
|
|||||||
"ButtonRemoveFromContinueReading": "Fjern fra Fortsett å lese",
|
"ButtonRemoveFromContinueReading": "Fjern fra Fortsett å lese",
|
||||||
"ButtonRemoveSeriesFromContinueSeries": "Fjern serie fra Fortsett serie",
|
"ButtonRemoveSeriesFromContinueSeries": "Fjern serie fra Fortsett serie",
|
||||||
"ButtonReset": "Nullstill",
|
"ButtonReset": "Nullstill",
|
||||||
|
"ButtonResetToDefault": "Tilbakestill til standard",
|
||||||
"ButtonRestore": "Gjenopprett",
|
"ButtonRestore": "Gjenopprett",
|
||||||
"ButtonSave": "Lagre",
|
"ButtonSave": "Lagre",
|
||||||
"ButtonSaveAndClose": "Lagre og lukk",
|
"ButtonSaveAndClose": "Lagre og lukk",
|
||||||
"ButtonSaveTracklist": "Lagre spilleliste",
|
"ButtonSaveTracklist": "Lagre spilleliste",
|
||||||
"ButtonScan": "Skann",
|
"ButtonScan": "Skann",
|
||||||
"ButtonScanLibrary": "Skann bibliotek",
|
"ButtonScanLibrary": "Skann bibliotek",
|
||||||
|
"ButtonScrollLeft": "Rull til venstre",
|
||||||
|
"ButtonScrollRight": "Rull til høyre",
|
||||||
"ButtonSearch": "Søk",
|
"ButtonSearch": "Søk",
|
||||||
"ButtonSelectFolderPath": "Velg mappe",
|
"ButtonSelectFolderPath": "Velg mappe",
|
||||||
"ButtonSeries": "Serier",
|
"ButtonSeries": "Serier",
|
||||||
@ -88,20 +101,26 @@
|
|||||||
"ButtonStartMetadataEmbed": "Start Metadata innbaking",
|
"ButtonStartMetadataEmbed": "Start Metadata innbaking",
|
||||||
"ButtonStats": "Statistikk",
|
"ButtonStats": "Statistikk",
|
||||||
"ButtonSubmit": "Send inn",
|
"ButtonSubmit": "Send inn",
|
||||||
|
"ButtonTest": "Test",
|
||||||
|
"ButtonUnlinkOpenId": "Koble fra OpenID",
|
||||||
"ButtonUpload": "Last opp",
|
"ButtonUpload": "Last opp",
|
||||||
"ButtonUploadBackup": "Last opp sikkerhetskopi",
|
"ButtonUploadBackup": "Last opp sikkerhetskopi",
|
||||||
"ButtonUploadCover": "Last opp cover",
|
"ButtonUploadCover": "Last opp cover",
|
||||||
"ButtonUploadOPMLFile": "Last opp OPML fil",
|
"ButtonUploadOPMLFile": "Last opp OPML fil",
|
||||||
"ButtonUserDelete": "Slett bruker {0}",
|
"ButtonUserDelete": "Slett bruker {0}",
|
||||||
"ButtonUserEdit": "Rediger bruker {0}",
|
"ButtonUserEdit": "Rediger bruker {0}",
|
||||||
"ButtonViewAll": "Vis alt",
|
"ButtonViewAll": "Vis alle",
|
||||||
"ButtonYes": "Ja",
|
"ButtonYes": "Ja",
|
||||||
"ErrorUploadFetchMetadataAPI": "Feil ved innhenting av metadata",
|
"ErrorUploadFetchMetadataAPI": "Feil ved innhenting av metadata",
|
||||||
|
"ErrorUploadFetchMetadataNoResults": "Kunne ikke hente metadata - forsøk å oppdatere tittel og/eller forfatter",
|
||||||
|
"ErrorUploadLacksTitle": "Tittel kreves",
|
||||||
"HeaderAccount": "Konto",
|
"HeaderAccount": "Konto",
|
||||||
|
"HeaderAddCustomMetadataProvider": "Legg til egendefinert metadata tilbyder",
|
||||||
"HeaderAdvanced": "Avansert",
|
"HeaderAdvanced": "Avansert",
|
||||||
"HeaderAppriseNotificationSettings": "Apprise notifikasjonsinstillinger",
|
"HeaderAppriseNotificationSettings": "Apprise varslingsinstillinger",
|
||||||
"HeaderAudioTracks": "Lydspor",
|
"HeaderAudioTracks": "Lydspor",
|
||||||
"HeaderAudiobookTools": "Lydbok Filbehandlingsverktøy",
|
"HeaderAudiobookTools": "Lydbok Filbehandlingsverktøy",
|
||||||
|
"HeaderAuthentication": "Autentisering",
|
||||||
"HeaderBackups": "Sikkerhetskopier",
|
"HeaderBackups": "Sikkerhetskopier",
|
||||||
"HeaderChangePassword": "Bytt passord",
|
"HeaderChangePassword": "Bytt passord",
|
||||||
"HeaderChapters": "Kapittel",
|
"HeaderChapters": "Kapittel",
|
||||||
@ -110,6 +129,8 @@
|
|||||||
"HeaderCollectionItems": "Samlingsgjenstander",
|
"HeaderCollectionItems": "Samlingsgjenstander",
|
||||||
"HeaderCover": "Omslag",
|
"HeaderCover": "Omslag",
|
||||||
"HeaderCurrentDownloads": "Aktive nedlastinger",
|
"HeaderCurrentDownloads": "Aktive nedlastinger",
|
||||||
|
"HeaderCustomMessageOnLogin": "Egendefinert melding ved pålogging",
|
||||||
|
"HeaderCustomMetadataProviders": "Egendefinerte metadata tilbydere",
|
||||||
"HeaderDetails": "Detaljer",
|
"HeaderDetails": "Detaljer",
|
||||||
"HeaderDownloadQueue": "Last ned kø",
|
"HeaderDownloadQueue": "Last ned kø",
|
||||||
"HeaderEbookFiles": "Ebook filer",
|
"HeaderEbookFiles": "Ebook filer",
|
||||||
@ -140,12 +161,17 @@
|
|||||||
"HeaderMetadataToEmbed": "Metadata å bake inn",
|
"HeaderMetadataToEmbed": "Metadata å bake inn",
|
||||||
"HeaderNewAccount": "Ny konto",
|
"HeaderNewAccount": "Ny konto",
|
||||||
"HeaderNewLibrary": "Ny bibliotek",
|
"HeaderNewLibrary": "Ny bibliotek",
|
||||||
"HeaderNotifications": "Notifikasjoner",
|
"HeaderNotificationCreate": "Opprett varsling",
|
||||||
|
"HeaderNotificationUpdate": "Oppdater varsling",
|
||||||
|
"HeaderNotifications": "Varslinger",
|
||||||
"HeaderOpenIDConnectAuthentication": "Autentisering med OpenID Connect",
|
"HeaderOpenIDConnectAuthentication": "Autentisering med OpenID Connect",
|
||||||
|
"HeaderOpenListeningSessions": "Åpne lyttesesjoner",
|
||||||
"HeaderOpenRSSFeed": "Åpne RSS Feed",
|
"HeaderOpenRSSFeed": "Åpne RSS Feed",
|
||||||
"HeaderOtherFiles": "Andre filer",
|
"HeaderOtherFiles": "Andre filer",
|
||||||
|
"HeaderPasswordAuthentication": "Logg inn med brukernavn og passord",
|
||||||
"HeaderPermissions": "Rettigheter",
|
"HeaderPermissions": "Rettigheter",
|
||||||
"HeaderPlayerQueue": "Spiller kø",
|
"HeaderPlayerQueue": "Spiller kø",
|
||||||
|
"HeaderPlayerSettings": "Avspillingsinnstillinger",
|
||||||
"HeaderPlaylist": "Spilleliste",
|
"HeaderPlaylist": "Spilleliste",
|
||||||
"HeaderPlaylistItems": "Spillelisteelement",
|
"HeaderPlaylistItems": "Spillelisteelement",
|
||||||
"HeaderPodcastsToAdd": "Podcaster å legge til",
|
"HeaderPodcastsToAdd": "Podcaster å legge til",
|
||||||
@ -157,6 +183,7 @@
|
|||||||
"HeaderRemoveEpisodes": "Fjern {0} episoder",
|
"HeaderRemoveEpisodes": "Fjern {0} episoder",
|
||||||
"HeaderSavedMediaProgress": "Lagret mediefremgang",
|
"HeaderSavedMediaProgress": "Lagret mediefremgang",
|
||||||
"HeaderSchedule": "Timeplan",
|
"HeaderSchedule": "Timeplan",
|
||||||
|
"HeaderScheduleEpisodeDownloads": "Planlegg automatisk nedlasting av episoder",
|
||||||
"HeaderScheduleLibraryScans": "Planlegg automatisk bibliotek skann",
|
"HeaderScheduleLibraryScans": "Planlegg automatisk bibliotek skann",
|
||||||
"HeaderSession": "Sesjon",
|
"HeaderSession": "Sesjon",
|
||||||
"HeaderSetBackupSchedule": "Sett timeplan for sikkerhetskopi",
|
"HeaderSetBackupSchedule": "Sett timeplan for sikkerhetskopi",
|
||||||
@ -165,6 +192,7 @@
|
|||||||
"HeaderSettingsExperimental": "Eksperimentelle funksjoner",
|
"HeaderSettingsExperimental": "Eksperimentelle funksjoner",
|
||||||
"HeaderSettingsGeneral": "Generell",
|
"HeaderSettingsGeneral": "Generell",
|
||||||
"HeaderSettingsScanner": "Skanner",
|
"HeaderSettingsScanner": "Skanner",
|
||||||
|
"HeaderSettingsWebClient": "Webklient",
|
||||||
"HeaderSleepTimer": "Sove timer",
|
"HeaderSleepTimer": "Sove timer",
|
||||||
"HeaderStatsLargestItems": "Største enheter",
|
"HeaderStatsLargestItems": "Største enheter",
|
||||||
"HeaderStatsLongestItems": "Lengste enheter (timer)",
|
"HeaderStatsLongestItems": "Lengste enheter (timer)",
|
||||||
@ -179,9 +207,14 @@
|
|||||||
"HeaderUpdateDetails": "Oppdater detaljer",
|
"HeaderUpdateDetails": "Oppdater detaljer",
|
||||||
"HeaderUpdateLibrary": "Oppdater bibliotek",
|
"HeaderUpdateLibrary": "Oppdater bibliotek",
|
||||||
"HeaderUsers": "Brukere",
|
"HeaderUsers": "Brukere",
|
||||||
|
"HeaderYearReview": "{0} oppsummert",
|
||||||
"HeaderYourStats": "Din statistikk",
|
"HeaderYourStats": "Din statistikk",
|
||||||
"LabelAbridged": "Forkortet",
|
"LabelAbridged": "Forkortet",
|
||||||
|
"LabelAbridgedChecked": "Forkortet (valgt)",
|
||||||
|
"LabelAbridgedUnchecked": "Forkortet (ikke valgt)",
|
||||||
|
"LabelAccessibleBy": "Tilgjengelig via",
|
||||||
"LabelAccountType": "Kontotype",
|
"LabelAccountType": "Kontotype",
|
||||||
|
"LabelAccountTypeAdmin": "Administrator",
|
||||||
"LabelAccountTypeGuest": "Gjest",
|
"LabelAccountTypeGuest": "Gjest",
|
||||||
"LabelAccountTypeUser": "Bruker",
|
"LabelAccountTypeUser": "Bruker",
|
||||||
"LabelActivity": "Aktivitet",
|
"LabelActivity": "Aktivitet",
|
||||||
@ -190,32 +223,55 @@
|
|||||||
"LabelAddToPlaylist": "Legg til i spilleliste",
|
"LabelAddToPlaylist": "Legg til i spilleliste",
|
||||||
"LabelAddToPlaylistBatch": "Legg {0} enheter til i spilleliste",
|
"LabelAddToPlaylistBatch": "Legg {0} enheter til i spilleliste",
|
||||||
"LabelAddedAt": "Lagt Til",
|
"LabelAddedAt": "Lagt Til",
|
||||||
|
"LabelAddedDate": "La til {0}",
|
||||||
|
"LabelAdminUsersOnly": "Kun administratorer",
|
||||||
"LabelAll": "Alle",
|
"LabelAll": "Alle",
|
||||||
"LabelAllUsers": "Alle brukere",
|
"LabelAllUsers": "Alle brukere",
|
||||||
|
"LabelAllUsersExcludingGuests": "Alle brukere bortsett fra gjester",
|
||||||
|
"LabelAllUsersIncludingGuests": "Alle brukere inkludert gjester",
|
||||||
"LabelAlreadyInYourLibrary": "Allerede i biblioteket",
|
"LabelAlreadyInYourLibrary": "Allerede i biblioteket",
|
||||||
|
"LabelApiToken": "API token",
|
||||||
"LabelAppend": "Legge til",
|
"LabelAppend": "Legge til",
|
||||||
|
"LabelAudioBitrate": "Bitrate for lyd (f.eks. 128k)",
|
||||||
|
"LabelAudioChannels": "Lydkanaler (1 eller 2)",
|
||||||
|
"LabelAudioCodec": "Audio Codec",
|
||||||
"LabelAuthor": "Forfatter",
|
"LabelAuthor": "Forfatter",
|
||||||
"LabelAuthorFirstLast": "Forfatter (Fornavn Etternavn)",
|
"LabelAuthorFirstLast": "Forfatter (Fornavn Etternavn)",
|
||||||
"LabelAuthorLastFirst": "Forfatter (Etternavn Fornavn)",
|
"LabelAuthorLastFirst": "Forfatter (Etternavn Fornavn)",
|
||||||
"LabelAuthors": "Forfattere",
|
"LabelAuthors": "Forfattere",
|
||||||
"LabelAutoDownloadEpisodes": "Last ned episoder automatisk",
|
"LabelAutoDownloadEpisodes": "Last ned episoder automatisk",
|
||||||
|
"LabelAutoFetchMetadata": "Automatisk henting av metadata",
|
||||||
|
"LabelAutoFetchMetadataHelp": "Henter metadata for tittel, forfatter og serie for å optimalisere opplasting. Ekstra metadata må kanskje bekreftes etter opplasting.",
|
||||||
|
"LabelAutoLaunch": "Autostart",
|
||||||
|
"LabelAutoLaunchDescription": "Omdiriger til leverandør for innlogging automatisk når innloggingssiden åpnes. (Kan overstyres med <code>/login?autoLaunch=0</code>)",
|
||||||
|
"LabelAutoRegister": "Automatisk registrering",
|
||||||
|
"LabelAutoRegisterDescription": "Lag bruker automatisk ved første innlogging",
|
||||||
"LabelBackToUser": "Tilbake til bruker",
|
"LabelBackToUser": "Tilbake til bruker",
|
||||||
|
"LabelBackupAudioFiles": "Sikkerhetskopier lydfiler",
|
||||||
|
"LabelBackupLocation": "Mappe for sikkerhetskopiering",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Aktiver automatisk sikkerhetskopi",
|
"LabelBackupsEnableAutomaticBackups": "Aktiver automatisk sikkerhetskopi",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Sikkerhetskopier lagret under /metadata/backups",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Sikkerhetskopier lagret under /metadata/backups",
|
||||||
"LabelBackupsMaxBackupSize": "Maks sikkerhetskopi størrelse (i GB)",
|
"LabelBackupsMaxBackupSize": "Maksimal størrelse for sikkerhetskopi (i GB) (0 for ubegrenset)",
|
||||||
"LabelBackupsMaxBackupSizeHelp": "For å forhindre feilkonfigurasjon, vil sikkerhetskopier mislykkes hvis de oveskride konfigurert størrelse.",
|
"LabelBackupsMaxBackupSizeHelp": "For å forhindre feilkonfigurasjon, vil sikkerhetskopier mislykkes hvis de oveskride konfigurert størrelse.",
|
||||||
"LabelBackupsNumberToKeep": "Antall sikkerhetskopier som skal beholdes",
|
"LabelBackupsNumberToKeep": "Antall sikkerhetskopier som skal beholdes",
|
||||||
"LabelBackupsNumberToKeepHelp": "Kun 1 sikkerhetskopi vil bli fjernet om gangen, hvis du allerede har flere sikkerhetskopier enn dette bør du fjerne de manuelt.",
|
"LabelBackupsNumberToKeepHelp": "Kun 1 sikkerhetskopi vil bli fjernet om gangen, hvis du allerede har flere sikkerhetskopier enn dette bør du fjerne de manuelt.",
|
||||||
"LabelBitrate": "Bithastighet",
|
"LabelBitrate": "Bithastighet",
|
||||||
|
"LabelBonus": "Bonus",
|
||||||
"LabelBooks": "Bøker",
|
"LabelBooks": "Bøker",
|
||||||
|
"LabelButtonText": "Tekst på knappen",
|
||||||
|
"LabelByAuthor": "av {0}",
|
||||||
"LabelChangePassword": "Endre passord",
|
"LabelChangePassword": "Endre passord",
|
||||||
"LabelChannels": "Kanaler",
|
"LabelChannels": "Kanaler",
|
||||||
|
"LabelChapterCount": "{0} kapitler",
|
||||||
"LabelChapterTitle": "Kapittel tittel",
|
"LabelChapterTitle": "Kapittel tittel",
|
||||||
"LabelChapters": "Kapitler",
|
"LabelChapters": "Kapitler",
|
||||||
"LabelChaptersFound": "kapitler funnet",
|
"LabelChaptersFound": "kapitler funnet",
|
||||||
|
"LabelClickForMoreInfo": "Klikk for mer informasjon",
|
||||||
|
"LabelClickToUseCurrentValue": "Klikk for å bruke valgt verdi",
|
||||||
"LabelClosePlayer": "Lukk spiller",
|
"LabelClosePlayer": "Lukk spiller",
|
||||||
"LabelCodec": "Kodek",
|
"LabelCodec": "Kodek",
|
||||||
"LabelCollapseSeries": "Minimer serier",
|
"LabelCollapseSeries": "Minimer serier",
|
||||||
|
"LabelCollapseSubSeries": "Skjul underserier",
|
||||||
"LabelCollection": "Samling",
|
"LabelCollection": "Samling",
|
||||||
"LabelCollections": "Samlings",
|
"LabelCollections": "Samlings",
|
||||||
"LabelComplete": "Fullfør",
|
"LabelComplete": "Fullfør",
|
||||||
@ -232,58 +288,94 @@
|
|||||||
"LabelCustomCronExpression": "Tilpasset Cron utrykk:",
|
"LabelCustomCronExpression": "Tilpasset Cron utrykk:",
|
||||||
"LabelDatetime": "Dato tid",
|
"LabelDatetime": "Dato tid",
|
||||||
"LabelDays": "Dager",
|
"LabelDays": "Dager",
|
||||||
|
"LabelDeleteFromFileSystemCheckbox": "Slett fra filsystemet (fjern haken for kun å ta bort fra databasen)",
|
||||||
"LabelDescription": "Beskrivelse",
|
"LabelDescription": "Beskrivelse",
|
||||||
"LabelDeselectAll": "Fjern valg",
|
"LabelDeselectAll": "Fjern valg",
|
||||||
"LabelDevice": "Enhet",
|
"LabelDevice": "Enhet",
|
||||||
"LabelDeviceInfo": "Enhetsinformasjon",
|
"LabelDeviceInfo": "Enhetsinformasjon",
|
||||||
|
"LabelDeviceIsAvailableTo": "Enheten er tilgjengelig for...",
|
||||||
"LabelDirectory": "Mappe",
|
"LabelDirectory": "Mappe",
|
||||||
"LabelDiscFromFilename": "Disk fra filnavn",
|
"LabelDiscFromFilename": "Disk fra filnavn",
|
||||||
"LabelDiscFromMetadata": "Disk fra metadata",
|
"LabelDiscFromMetadata": "Disk fra metadata",
|
||||||
"LabelDiscover": "Oppdagelse",
|
"LabelDiscover": "Oppdag",
|
||||||
"LabelDownload": "Last ned",
|
"LabelDownload": "Last ned",
|
||||||
"LabelDownloadNEpisodes": "Last ned {0} episoder",
|
"LabelDownloadNEpisodes": "Last ned {0} episoder",
|
||||||
"LabelDuration": "Varighet",
|
"LabelDuration": "Varighet",
|
||||||
|
"LabelDurationComparisonExactMatch": "(nøyaktig treff)",
|
||||||
|
"LabelDurationComparisonLonger": "({0} lenger)",
|
||||||
|
"LabelDurationComparisonShorter": "({0} kortere)",
|
||||||
"LabelDurationFound": "Varighet funnet:",
|
"LabelDurationFound": "Varighet funnet:",
|
||||||
"LabelEbook": "Ebok",
|
"LabelEbook": "Ebok",
|
||||||
"LabelEbooks": "E-bøker",
|
"LabelEbooks": "E-bøker",
|
||||||
"LabelEdit": "Rediger",
|
"LabelEdit": "Rediger",
|
||||||
"LabelEmail": "Epost",
|
"LabelEmail": "Epost",
|
||||||
"LabelEmailSettingsFromAddress": "Fra Adresse",
|
"LabelEmailSettingsFromAddress": "Fra Adresse",
|
||||||
|
"LabelEmailSettingsRejectUnauthorized": "Avvis uautoriserte sertifikat",
|
||||||
|
"LabelEmailSettingsRejectUnauthorizedHelp": "Ved å deaktivere sjekk av SSL sertifikat eksponerer man tilkoblingen for sikkerhetsrisiko, som for eksempel mann-i-midten-angrep. Slå av kun om du forstår implikasjonene og stoler på e-post-serveren du kobler til!",
|
||||||
"LabelEmailSettingsSecure": "Sikker",
|
"LabelEmailSettingsSecure": "Sikker",
|
||||||
"LabelEmailSettingsSecureHelp": "Hvis aktivert, vil tilkoblingen bruke TLS under tilkobling til tjeneren. Ellers vil TLS bli brukt hvis tjeneren støtter STARTTLS utvidelsen. I de fleste tilfeller aktiver valget hvis du kobler til med port 465. Med port 587 eller 25 deaktiver valget. (fra nodemailer.com/smtp/#authentication)",
|
"LabelEmailSettingsSecureHelp": "Hvis aktivert, vil tilkoblingen bruke TLS under tilkobling til tjeneren. Ellers vil TLS bli brukt hvis tjeneren støtter STARTTLS utvidelsen. I de fleste tilfeller aktiver valget hvis du kobler til med port 465. Med port 587 eller 25 deaktiver valget. (fra nodemailer.com/smtp/#authentication)",
|
||||||
"LabelEmailSettingsTestAddress": "Test Adresse",
|
"LabelEmailSettingsTestAddress": "Test Adresse",
|
||||||
"LabelEmbeddedCover": "Bak inn omslag",
|
"LabelEmbeddedCover": "Bak inn omslag",
|
||||||
"LabelEnable": "Aktiver",
|
"LabelEnable": "Aktiver",
|
||||||
|
"LabelEncodingBackupLocation": "En sikkerhetskopi av de originale lyd-filene lagres i mappen:",
|
||||||
|
"LabelEncodingChaptersNotEmbedded": "Kapitler er ikke bygget inn i flersporede lydbøker.",
|
||||||
|
"LabelEncodingClearItemCache": "Husk å tømme mellomlageret med jevne mellomrom.",
|
||||||
|
"LabelEncodingFinishedM4B": "Ferdig konvertert M4B-lydbøker legges i lydbok-mappen:",
|
||||||
|
"LabelEncodingInfoEmbedded": "Metadata bygges inn i lydsporene i lydbokmappen.",
|
||||||
|
"LabelEncodingStartedNavigation": "Så snart oppgaven er startet kan du navigere bort fra denne siden.",
|
||||||
|
"LabelEncodingTimeWarning": "Konvertering kan ta opptil 30 minutter.",
|
||||||
|
"LabelEncodingWarningAdvancedSettings": "Advarsel: Ikke oppdater disse innstillingene med mindre du er godt kjent med hvordan ffmpeg og konverteringsvalgene fungerer.",
|
||||||
|
"LabelEncodingWatcherDisabled": "Hvis du har slått av overvåking så må du skanne dette biblioteket på nytt etterpå.",
|
||||||
"LabelEnd": "Slutt",
|
"LabelEnd": "Slutt",
|
||||||
"LabelEndOfChapter": "Slutt på kapittel",
|
"LabelEndOfChapter": "Slutt på kapittel",
|
||||||
|
"LabelEpisode": "Episode",
|
||||||
|
"LabelEpisodeNotLinkedToRssFeed": "Episode er ikke koblet til en RSS feed",
|
||||||
|
"LabelEpisodeNumber": "Episode #{0}",
|
||||||
"LabelEpisodeTitle": "Episode tittel",
|
"LabelEpisodeTitle": "Episode tittel",
|
||||||
"LabelEpisodeType": "Episode type",
|
"LabelEpisodeType": "Episode type",
|
||||||
|
"LabelEpisodeUrlFromRssFeed": "Episode URL fra RSS feed",
|
||||||
|
"LabelEpisodes": "Episoder",
|
||||||
|
"LabelEpisodic": "Episodisk",
|
||||||
"LabelExample": "Eksempel",
|
"LabelExample": "Eksempel",
|
||||||
|
"LabelExpandSeries": "Vis serie",
|
||||||
|
"LabelExpandSubSeries": "Vis underserie",
|
||||||
"LabelExplicit": "Eksplisitt",
|
"LabelExplicit": "Eksplisitt",
|
||||||
|
"LabelExplicitChecked": "Eksplisitt (avhuket)",
|
||||||
|
"LabelExplicitUnchecked": "Ikke eksplisitt (ikke avhuket)",
|
||||||
"LabelExportOPML": "Eksporter OPML",
|
"LabelExportOPML": "Eksporter OPML",
|
||||||
"LabelFeedURL": "Feed Adresse",
|
"LabelFeedURL": "Feed Adresse",
|
||||||
|
"LabelFetchingMetadata": "Henter metadata",
|
||||||
"LabelFile": "Fil",
|
"LabelFile": "Fil",
|
||||||
"LabelFileBirthtime": "Fil Opprettelsesdato",
|
"LabelFileBirthtime": "Fil Opprettelsesdato",
|
||||||
|
"LabelFileBornDate": "Født {0}",
|
||||||
"LabelFileModified": "Fil Endret",
|
"LabelFileModified": "Fil Endret",
|
||||||
|
"LabelFileModifiedDate": "Redigert {0}",
|
||||||
"LabelFilename": "Filnavn",
|
"LabelFilename": "Filnavn",
|
||||||
"LabelFilterByUser": "Filtrer etter bruker",
|
"LabelFilterByUser": "Filtrer etter bruker",
|
||||||
"LabelFindEpisodes": "Finn episoder",
|
"LabelFindEpisodes": "Finn episoder",
|
||||||
"LabelFinished": "Fullført",
|
"LabelFinished": "Fullført",
|
||||||
"LabelFolder": "Mappe",
|
"LabelFolder": "Mappe",
|
||||||
"LabelFolders": "Mapper",
|
"LabelFolders": "Mapper",
|
||||||
|
"LabelFontBold": "Fet",
|
||||||
"LabelFontBoldness": "Skrifttykkelse",
|
"LabelFontBoldness": "Skrifttykkelse",
|
||||||
"LabelFontFamily": "Fontfamilie",
|
"LabelFontFamily": "Fontfamilie",
|
||||||
|
"LabelFontItalic": "Kursiv",
|
||||||
"LabelFontScale": "Font størrelse",
|
"LabelFontScale": "Font størrelse",
|
||||||
|
"LabelFontStrikethrough": "Gjennomstreking",
|
||||||
|
"LabelFormat": "Format",
|
||||||
|
"LabelFull": "Full",
|
||||||
"LabelGenre": "Sjanger",
|
"LabelGenre": "Sjanger",
|
||||||
"LabelGenres": "Sjangers",
|
"LabelGenres": "Sjangers",
|
||||||
"LabelHardDeleteFile": "Tving sletting av fil",
|
"LabelHardDeleteFile": "Tving sletting av fil",
|
||||||
"LabelHasEbook": "Har e-bok",
|
"LabelHasEbook": "Har e-bok",
|
||||||
"LabelHasSupplementaryEbook": "Har komplimentær e-bok",
|
"LabelHasSupplementaryEbook": "Har komplimentær e-bok",
|
||||||
"LabelHideSubtitles": "Skjul undertekster",
|
"LabelHideSubtitles": "Skjul undertekster",
|
||||||
|
"LabelHighestPriority": "Høyeste prioritet",
|
||||||
"LabelHost": "Tjener",
|
"LabelHost": "Tjener",
|
||||||
"LabelHour": "Time",
|
"LabelHour": "Time",
|
||||||
"LabelHours": "Timer",
|
"LabelHours": "Timer",
|
||||||
"LabelIcon": "Ikon",
|
"LabelIcon": "Ikon",
|
||||||
|
"LabelImageURLFromTheWeb": "Bilde-URL fra nett",
|
||||||
"LabelInProgress": "I gang",
|
"LabelInProgress": "I gang",
|
||||||
"LabelIncludeInTracklist": "Inkluder i sporliste",
|
"LabelIncludeInTracklist": "Inkluder i sporliste",
|
||||||
"LabelIncomplete": "Ufullstendig",
|
"LabelIncomplete": "Ufullstendig",
|
||||||
@ -298,8 +390,11 @@
|
|||||||
"LabelIntervalEveryHour": "Hver time",
|
"LabelIntervalEveryHour": "Hver time",
|
||||||
"LabelInvert": "Inverter",
|
"LabelInvert": "Inverter",
|
||||||
"LabelItem": "Enhet",
|
"LabelItem": "Enhet",
|
||||||
|
"LabelJumpBackwardAmount": "Hopp bakover med",
|
||||||
|
"LabelJumpForwardAmount": "Hopp forover med",
|
||||||
"LabelLanguage": "Språk",
|
"LabelLanguage": "Språk",
|
||||||
"LabelLanguageDefaultServer": "Standard tjener språk",
|
"LabelLanguageDefaultServer": "Standard tjener språk",
|
||||||
|
"LabelLanguages": "Språk",
|
||||||
"LabelLastBookAdded": "Siste bok lagt til",
|
"LabelLastBookAdded": "Siste bok lagt til",
|
||||||
"LabelLastBookUpdated": "Siste bok oppdatert",
|
"LabelLastBookUpdated": "Siste bok oppdatert",
|
||||||
"LabelLastSeen": "Sist sett",
|
"LabelLastSeen": "Sist sett",
|
||||||
@ -311,17 +406,36 @@
|
|||||||
"LabelLess": "Mindre",
|
"LabelLess": "Mindre",
|
||||||
"LabelLibrariesAccessibleToUser": "Biblioteker tilgjengelig for bruker",
|
"LabelLibrariesAccessibleToUser": "Biblioteker tilgjengelig for bruker",
|
||||||
"LabelLibrary": "Bibliotek",
|
"LabelLibrary": "Bibliotek",
|
||||||
|
"LabelLibraryFilterSublistEmpty": "",
|
||||||
"LabelLibraryItem": "Bibliotek enhet",
|
"LabelLibraryItem": "Bibliotek enhet",
|
||||||
"LabelLibraryName": "Bibliotek navn",
|
"LabelLibraryName": "Bibliotek navn",
|
||||||
"LabelLimit": "Begrensning",
|
"LabelLimit": "Begrensning",
|
||||||
"LabelLineSpacing": "Linjemellomrom",
|
"LabelLineSpacing": "Linjemellomrom",
|
||||||
"LabelListenAgain": "Lytt igjen",
|
"LabelListenAgain": "Lytt igjen",
|
||||||
|
"LabelLogLevelDebug": "Debug",
|
||||||
|
"LabelLogLevelInfo": "Info",
|
||||||
|
"LabelLogLevelWarn": "Warn",
|
||||||
"LabelLookForNewEpisodesAfterDate": "Se etter nye episoder etter denne datoen",
|
"LabelLookForNewEpisodesAfterDate": "Se etter nye episoder etter denne datoen",
|
||||||
|
"LabelLowestPriority": "Laveste prioritet",
|
||||||
|
"LabelMatchExistingUsersBy": "Knytt sammen eksisterende brukere basert på",
|
||||||
|
"LabelMatchExistingUsersByDescription": "Brukes for å koble til eksisterende brukere. Når koblingen er i orden vil brukerne bli identifisert med en unik id fra SSO-tilbyderen.",
|
||||||
|
"LabelMaxEpisodesToDownload": "Maksimalt antall episoder som skal lastes ned. Bruk 0 for ubegrenset.",
|
||||||
|
"LabelMaxEpisodesToDownloadPerCheck": "Maksimalt antall nye episoder som skal lastes ned per sjekk",
|
||||||
|
"LabelMaxEpisodesToKeep": "Maksimalt antall episoder som skal beholdes",
|
||||||
|
"LabelMaxEpisodesToKeepHelp": "Sett verdien til null (0) for ubegrenset. Etter at en episode lastes ned automatisk, så slettes den eldste episoden, om du har mer enn X episoder. Det slettes kun én episode per nye nedlasting.",
|
||||||
"LabelMediaPlayer": "Mediespiller",
|
"LabelMediaPlayer": "Mediespiller",
|
||||||
"LabelMediaType": "Medie type",
|
"LabelMediaType": "Medie type",
|
||||||
|
"LabelMetaTag": "Meta tag",
|
||||||
|
"LabelMetaTags": "Meta tags",
|
||||||
|
"LabelMetadataOrderOfPrecedenceDescription": "Høyere prioritert kilder for metadata overstyrer laverer prioriterte kilder for metadata.",
|
||||||
"LabelMetadataProvider": "Metadata Leverandør",
|
"LabelMetadataProvider": "Metadata Leverandør",
|
||||||
"LabelMinute": "Minutt",
|
"LabelMinute": "Minutt",
|
||||||
|
"LabelMinutes": "Minutter",
|
||||||
"LabelMissing": "Mangler",
|
"LabelMissing": "Mangler",
|
||||||
|
"LabelMissingEbook": "Har ingen e-bok",
|
||||||
|
"LabelMissingSupplementaryEbook": "Har ingen komplementær e-bok",
|
||||||
|
"LabelMobileRedirectURIs": "Tillatte URL-er for vidersending",
|
||||||
|
"LabelMobileRedirectURIsDescription": "Dette er en liste over godkjente videresendings-URL-er for mobil-apper. Standarden er <code>audiobookshelf://oauth</code>, som du kan fjerne eller supplere med ekstra URL-er for tredjeparts app-integrasjoner. For å tillate alle URL-er kan du bruke kun en (<code>*</code>) .",
|
||||||
"LabelMore": "Mer",
|
"LabelMore": "Mer",
|
||||||
"LabelMoreInfo": "Mer info",
|
"LabelMoreInfo": "Mer info",
|
||||||
"LabelName": "Navn",
|
"LabelName": "Navn",
|
||||||
@ -333,6 +447,7 @@
|
|||||||
"LabelNewestEpisodes": "Nyeste episoder",
|
"LabelNewestEpisodes": "Nyeste episoder",
|
||||||
"LabelNextBackupDate": "Neste sikkerhetskopi dato",
|
"LabelNextBackupDate": "Neste sikkerhetskopi dato",
|
||||||
"LabelNextScheduledRun": "Neste planlagte kjøring",
|
"LabelNextScheduledRun": "Neste planlagte kjøring",
|
||||||
|
"LabelNoCustomMetadataProviders": "Ingen egendefinerte tilbydere for metadata",
|
||||||
"LabelNoEpisodesSelected": "Ingen episoder valgt",
|
"LabelNoEpisodesSelected": "Ingen episoder valgt",
|
||||||
"LabelNotFinished": "Ikke fullført",
|
"LabelNotFinished": "Ikke fullført",
|
||||||
"LabelNotStarted": "Ikke startet",
|
"LabelNotStarted": "Ikke startet",
|
||||||
@ -340,66 +455,95 @@
|
|||||||
"LabelNotificationAppriseURL": "Apprise URL(er)",
|
"LabelNotificationAppriseURL": "Apprise URL(er)",
|
||||||
"LabelNotificationAvailableVariables": "Tilgjengelige variabler",
|
"LabelNotificationAvailableVariables": "Tilgjengelige variabler",
|
||||||
"LabelNotificationBodyTemplate": "Kroppsmal",
|
"LabelNotificationBodyTemplate": "Kroppsmal",
|
||||||
"LabelNotificationEvent": "Notifikasjons hendelse",
|
"LabelNotificationEvent": "Varsling",
|
||||||
"LabelNotificationTitleTemplate": "Tittel mal",
|
"LabelNotificationTitleTemplate": "Tittel mal",
|
||||||
"LabelNotificationsMaxFailedAttempts": "Maks mislykkede forsøk",
|
"LabelNotificationsMaxFailedAttempts": "Maks mislykkede forsøk",
|
||||||
"LabelNotificationsMaxFailedAttemptsHelp": "Notifikasjoner er deaktivert når de mislykkes på sende dette flere ganger",
|
"LabelNotificationsMaxFailedAttemptsHelp": "Varslinger deaktiveres når sending feiles dette antallet ganger",
|
||||||
"LabelNotificationsMaxQueueSize": "Maks kø lengde for Notifikasjonshendelser",
|
"LabelNotificationsMaxQueueSize": "Maksimalt antall varslinger i kø",
|
||||||
"LabelNotificationsMaxQueueSizeHelp": "Hendelser er begrenset til avfyre 1 gang per sekund. Hendelser vil bli ignorert om køen er full. Dette forhindrer Notifikasjon spam.",
|
"LabelNotificationsMaxQueueSizeHelp": "Hendelser er begrenset til avfyre én gang per sekund. Hendelser blir ignorert om køen er full. Dette forhindrer overflod av varslinger.",
|
||||||
"LabelNumberOfBooks": "Antall bøker",
|
"LabelNumberOfBooks": "Antall bøker",
|
||||||
"LabelNumberOfEpisodes": "Antall episoder",
|
"LabelNumberOfEpisodes": "Antall episoder",
|
||||||
|
"LabelOpenIDClaims": "La følge valg være tomme for å slå av avanserte gruppe og tillatelser. Gruppen \"Bruker\" vil da også automatisk legges til.",
|
||||||
"LabelOpenRSSFeed": "Åpne RSS Feed",
|
"LabelOpenRSSFeed": "Åpne RSS Feed",
|
||||||
"LabelOverwrite": "Overskriv",
|
"LabelOverwrite": "Overskriv",
|
||||||
|
"LabelPaginationPageXOfY": "Side {0} av {1}",
|
||||||
"LabelPassword": "Passord",
|
"LabelPassword": "Passord",
|
||||||
"LabelPath": "Sti",
|
"LabelPath": "Sti",
|
||||||
"LabelPermanent": "Fast",
|
"LabelPermanent": "Fast",
|
||||||
"LabelPermissionsAccessAllLibraries": "Har tilgang til alle bibliotek",
|
"LabelPermissionsAccessAllLibraries": "Har tilgang til alle bibliotek",
|
||||||
"LabelPermissionsAccessAllTags": "Har til gang til alle tags",
|
"LabelPermissionsAccessAllTags": "Har til gang til alle tags",
|
||||||
"LabelPermissionsAccessExplicitContent": "Har tilgang til eksplisitt material",
|
"LabelPermissionsAccessExplicitContent": "Har tilgang til eksplisitt material",
|
||||||
|
"LabelPermissionsCreateEreader": "Kan opprette e-leser",
|
||||||
"LabelPermissionsDelete": "Kan slette",
|
"LabelPermissionsDelete": "Kan slette",
|
||||||
"LabelPermissionsDownload": "Kan laste ned",
|
"LabelPermissionsDownload": "Kan laste ned",
|
||||||
"LabelPermissionsUpdate": "Kan oppdatere",
|
"LabelPermissionsUpdate": "Kan oppdatere",
|
||||||
"LabelPermissionsUpload": "Kan laste opp",
|
"LabelPermissionsUpload": "Kan laste opp",
|
||||||
|
"LabelPersonalYearReview": "Oppsummering av året ditt ({0})",
|
||||||
"LabelPhotoPathURL": "Bilde sti/URL",
|
"LabelPhotoPathURL": "Bilde sti/URL",
|
||||||
"LabelPlayMethod": "Avspillingsmetode",
|
"LabelPlayMethod": "Avspillingsmetode",
|
||||||
|
"LabelPlayerChapterNumberMarker": "{0} av {1}",
|
||||||
"LabelPlaylists": "Spilleliste",
|
"LabelPlaylists": "Spilleliste",
|
||||||
|
"LabelPodcast": "Podcast",
|
||||||
"LabelPodcastSearchRegion": "Podcast-søkeområde",
|
"LabelPodcastSearchRegion": "Podcast-søkeområde",
|
||||||
"LabelPodcastType": "Podcast type",
|
"LabelPodcastType": "Podcast type",
|
||||||
"LabelPodcasts": "Podcaster",
|
"LabelPodcasts": "Podcaster",
|
||||||
|
"LabelPort": "Port",
|
||||||
"LabelPrefixesToIgnore": "Prefiks som skal ignoreres (skiller ikke mellom store og små bokstaver)",
|
"LabelPrefixesToIgnore": "Prefiks som skal ignoreres (skiller ikke mellom store og små bokstaver)",
|
||||||
"LabelPreventIndexing": "Forhindre at din feed fra å bli indeksert av iTunes og Google podcast kataloger",
|
"LabelPreventIndexing": "Forhindre at din feed fra å bli indeksert av iTunes og Google podcast kataloger",
|
||||||
"LabelPrimaryEbook": "Primær ebok",
|
"LabelPrimaryEbook": "Primær ebok",
|
||||||
"LabelProgress": "Framgang",
|
"LabelProgress": "Framgang",
|
||||||
"LabelProvider": "Tilbyder",
|
"LabelProvider": "Tilbyder",
|
||||||
|
"LabelProviderAuthorizationValue": "Autorisasjons header-verdi",
|
||||||
"LabelPubDate": "Publiseringsdato",
|
"LabelPubDate": "Publiseringsdato",
|
||||||
"LabelPublishYear": "Publikasjonsår",
|
"LabelPublishYear": "Publikasjonsår",
|
||||||
|
"LabelPublishedDate": "Publisert {0}",
|
||||||
|
"LabelPublishedDecade": "Tiår for utgivelse",
|
||||||
|
"LabelPublishedDecades": "Tiår for utgivelse",
|
||||||
"LabelPublisher": "Forlegger",
|
"LabelPublisher": "Forlegger",
|
||||||
|
"LabelPublishers": "Utgivere",
|
||||||
"LabelRSSFeedCustomOwnerEmail": "Tilpasset eier e-post",
|
"LabelRSSFeedCustomOwnerEmail": "Tilpasset eier e-post",
|
||||||
"LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn",
|
"LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn",
|
||||||
"LabelRSSFeedOpen": "RSS Feed åpne",
|
"LabelRSSFeedOpen": "RSS Feed åpne",
|
||||||
"LabelRSSFeedPreventIndexing": "Forhindre indeksering",
|
"LabelRSSFeedPreventIndexing": "Forhindre indeksering",
|
||||||
"LabelRSSFeedSlug": "RSS-informasjonskanalunderadresse",
|
"LabelRSSFeedSlug": "RSS-feed ID",
|
||||||
|
"LabelRSSFeedURL": "RSS-feed URL",
|
||||||
|
"LabelRandomly": "Tilfeldig",
|
||||||
|
"LabelReAddSeriesToContinueListening": "Legg til igjen til \"Fortsett å lytte\"",
|
||||||
"LabelRead": "Les",
|
"LabelRead": "Les",
|
||||||
"LabelReadAgain": "Les igjen",
|
"LabelReadAgain": "Les igjen",
|
||||||
"LabelReadEbookWithoutProgress": "Les ebok uten å beholde fremgang",
|
"LabelReadEbookWithoutProgress": "Les ebok uten å beholde fremgang",
|
||||||
"LabelRecentSeries": "Nylige serier",
|
"LabelRecentSeries": "Nylige serier",
|
||||||
"LabelRecentlyAdded": "Nylig tillagt",
|
"LabelRecentlyAdded": "Nylig tillagt",
|
||||||
"LabelRecommended": "Anbefalte",
|
"LabelRecommended": "Anbefalte",
|
||||||
|
"LabelRedo": "Gjenta",
|
||||||
|
"LabelRegion": "Region",
|
||||||
"LabelReleaseDate": "Utgivelsesdato",
|
"LabelReleaseDate": "Utgivelsesdato",
|
||||||
|
"LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer",
|
||||||
|
"LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer",
|
||||||
"LabelRemoveCover": "Fjern omslag",
|
"LabelRemoveCover": "Fjern omslag",
|
||||||
|
"LabelRemoveMetadataFile": "Fjern metadata-filer fra biblioteks-mapper",
|
||||||
|
"LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs i alle {0} mappene.",
|
||||||
|
"LabelRowsPerPage": "Rader per side",
|
||||||
"LabelSearchTerm": "Søkeord",
|
"LabelSearchTerm": "Søkeord",
|
||||||
"LabelSearchTitle": "Søk tittel",
|
"LabelSearchTitle": "Søk tittel",
|
||||||
"LabelSearchTitleOrASIN": "Søk tittel eller ASIN",
|
"LabelSearchTitleOrASIN": "Søk tittel eller ASIN",
|
||||||
"LabelSeason": "Sesong",
|
"LabelSeason": "Sesong",
|
||||||
|
"LabelSeasonNumber": "Sesong #{0}",
|
||||||
|
"LabelSelectAll": "Velg alt",
|
||||||
"LabelSelectAllEpisodes": "Velg alle episoder",
|
"LabelSelectAllEpisodes": "Velg alle episoder",
|
||||||
"LabelSelectEpisodesShowing": "Velg {0} episoder vist",
|
"LabelSelectEpisodesShowing": "Velg {0} episoder vist",
|
||||||
|
"LabelSelectUsers": "Velg brukere",
|
||||||
"LabelSendEbookToDevice": "Send Ebok til...",
|
"LabelSendEbookToDevice": "Send Ebok til...",
|
||||||
"LabelSequence": "Sekvens",
|
"LabelSequence": "Sekvens",
|
||||||
|
"LabelSerial": "Serienr.",
|
||||||
"LabelSeries": "Serier",
|
"LabelSeries": "Serier",
|
||||||
"LabelSeriesName": "Serier Navn",
|
"LabelSeriesName": "Serier Navn",
|
||||||
"LabelSeriesProgress": "Serier fremgang",
|
"LabelSeriesProgress": "Serier fremgang",
|
||||||
|
"LabelServerLogLevel": "Server logg-nivå",
|
||||||
|
"LabelServerYearReview": "Server - Oppsummering av året ({0})",
|
||||||
"LabelSetEbookAsPrimary": "Sett som primær",
|
"LabelSetEbookAsPrimary": "Sett som primær",
|
||||||
"LabelSetEbookAsSupplementary": "Sett som supplerende",
|
"LabelSetEbookAsSupplementary": "Sett som supplerende",
|
||||||
|
"LabelSettingsAllowIframe": "Tillat å bygge inn i en iframe",
|
||||||
"LabelSettingsAudiobooksOnly": "Kun lydbøker",
|
"LabelSettingsAudiobooksOnly": "Kun lydbøker",
|
||||||
"LabelSettingsAudiobooksOnlyHelp": "Aktivering av dette valget til ignorere ebok filer utenom de er i en lydbok mappe hvor de vil bli satt som supplerende ebøker",
|
"LabelSettingsAudiobooksOnlyHelp": "Aktivering av dette valget til ignorere ebok filer utenom de er i en lydbok mappe hvor de vil bli satt som supplerende ebøker",
|
||||||
"LabelSettingsBookshelfViewHelp": "Skeuomorf design med hyller av ved",
|
"LabelSettingsBookshelfViewHelp": "Skeuomorf design med hyller av ved",
|
||||||
@ -411,6 +555,8 @@
|
|||||||
"LabelSettingsEnableWatcher": "Aktiver overvåker",
|
"LabelSettingsEnableWatcher": "Aktiver overvåker",
|
||||||
"LabelSettingsEnableWatcherForLibrary": "Aktiver mappe overvåker for bibliotek",
|
"LabelSettingsEnableWatcherForLibrary": "Aktiver mappe overvåker for bibliotek",
|
||||||
"LabelSettingsEnableWatcherHelp": "Aktiverer automatisk opprettelse/oppdatering av enheter når filendringer er oppdaget. *Krever restart av server*",
|
"LabelSettingsEnableWatcherHelp": "Aktiverer automatisk opprettelse/oppdatering av enheter når filendringer er oppdaget. *Krever restart av server*",
|
||||||
|
"LabelSettingsEpubsAllowScriptedContent": "Tillat scripting i innholdet i ebub-bøker",
|
||||||
|
"LabelSettingsEpubsAllowScriptedContentHelp": "Tillat epub-filer å kjøre script. Det er anbefalt å slå av denne innstillingen med mindre du stoler på kilden til epub-filene.",
|
||||||
"LabelSettingsExperimentalFeatures": "Eksperimentelle funksjoner",
|
"LabelSettingsExperimentalFeatures": "Eksperimentelle funksjoner",
|
||||||
"LabelSettingsExperimentalFeaturesHelp": "Funksjoner under utvikling som kan trenge din tilbakemelding og hjelp med testing. Klikk for å åpne GitHub diskusjon.",
|
"LabelSettingsExperimentalFeaturesHelp": "Funksjoner under utvikling som kan trenge din tilbakemelding og hjelp med testing. Klikk for å åpne GitHub diskusjon.",
|
||||||
"LabelSettingsFindCovers": "Finn omslag",
|
"LabelSettingsFindCovers": "Finn omslag",
|
||||||
@ -419,8 +565,13 @@
|
|||||||
"LabelSettingsHideSingleBookSeriesHelp": "Serier som har kun en bok vil bli gjemt på serie- og hjemmeside hyllen.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Serier som har kun en bok vil bli gjemt på serie- og hjemmeside hyllen.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Hjemmeside bruk bokhyllevisning",
|
"LabelSettingsHomePageBookshelfView": "Hjemmeside bruk bokhyllevisning",
|
||||||
"LabelSettingsLibraryBookshelfView": "Bibliotek bruk bokhyllevisning",
|
"LabelSettingsLibraryBookshelfView": "Bibliotek bruk bokhyllevisning",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Prosent ferdig er større enn",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Gjenværende tid er mindre enn (sekunder)",
|
||||||
|
"LabelSettingsLibraryMarkAsFinishedWhen": "Marker som ferdig når",
|
||||||
|
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Hopp over tidligere bøker i \"Fortsett serien\"",
|
||||||
|
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "\"Fortsett serie\"-siden viser første bok som ikke er påbegynt i serier der en bok er lest og ingen bøker leses nå. Ved å slå på denne innstillingen så vil man fortsette på serien etter siste leste bok, fremfor første bok som ikke er startet på i en serie.",
|
||||||
"LabelSettingsParseSubtitles": "Analyser undertekster",
|
"LabelSettingsParseSubtitles": "Analyser undertekster",
|
||||||
"LabelSettingsParseSubtitlesHelp": "Trekk ut undertekster fra lydbok mappenavn.<br>undertekster må være separert med \" - \"<br>f.eks. \"Boktittel - Undertekst her\" har Undertekst \"Undertekst her\"",
|
"LabelSettingsParseSubtitlesHelp": "Hent undertittel fra lydbokens mappenavn.<br>Undertittel må være separert med \" - \"<br>f.eks. \"Boktittel - En lengre tittel\" har undertittel \"En lengre tittel\".",
|
||||||
"LabelSettingsPreferMatchedMetadata": "Foretrekk funnet metadata",
|
"LabelSettingsPreferMatchedMetadata": "Foretrekk funnet metadata",
|
||||||
"LabelSettingsPreferMatchedMetadataHelp": "Funnet data vil overskrive enhetens detaljene når man bruker Kjapt søk. Som standard vil Kjapt søk kun fylle inn manglende detaljer.",
|
"LabelSettingsPreferMatchedMetadataHelp": "Funnet data vil overskrive enhetens detaljene når man bruker Kjapt søk. Som standard vil Kjapt søk kun fylle inn manglende detaljer.",
|
||||||
"LabelSettingsSkipMatchingBooksWithASIN": "Hopp over bøker som allerede har ASIN",
|
"LabelSettingsSkipMatchingBooksWithASIN": "Hopp over bøker som allerede har ASIN",
|
||||||
@ -435,10 +586,17 @@
|
|||||||
"LabelSettingsStoreMetadataWithItemHelp": "Som standard vil metadata bli lagret under /metadata/items, aktiveres dette valget vil metadata bli lagret i samme mappe som gjenstanden",
|
"LabelSettingsStoreMetadataWithItemHelp": "Som standard vil metadata bli lagret under /metadata/items, aktiveres dette valget vil metadata bli lagret i samme mappe som gjenstanden",
|
||||||
"LabelSettingsTimeFormat": "Tid format",
|
"LabelSettingsTimeFormat": "Tid format",
|
||||||
"LabelShare": "Dele",
|
"LabelShare": "Dele",
|
||||||
|
"LabelShareOpen": "Åpne deling",
|
||||||
"LabelShareURL": "Dele URL",
|
"LabelShareURL": "Dele URL",
|
||||||
"LabelShowAll": "Vis alt",
|
"LabelShowAll": "Vis alle",
|
||||||
|
"LabelShowSeconds": "Vis sekunder",
|
||||||
|
"LabelShowSubtitles": "Vis undertitler",
|
||||||
"LabelSize": "Størrelse",
|
"LabelSize": "Størrelse",
|
||||||
"LabelSleepTimer": "Sove-timer",
|
"LabelSleepTimer": "Sove-timer",
|
||||||
|
"LabelSlug": "Slug",
|
||||||
|
"LabelSortAscending": "Stigende",
|
||||||
|
"LabelSortDescending": "Synkende",
|
||||||
|
"LabelStart": "Start",
|
||||||
"LabelStartTime": "Start Tid",
|
"LabelStartTime": "Start Tid",
|
||||||
"LabelStarted": "Startet",
|
"LabelStarted": "Startet",
|
||||||
"LabelStartedAt": "Startet",
|
"LabelStartedAt": "Startet",
|
||||||
@ -459,15 +617,24 @@
|
|||||||
"LabelStatsWeekListening": "Uker lyttet",
|
"LabelStatsWeekListening": "Uker lyttet",
|
||||||
"LabelSubtitle": "undertekster",
|
"LabelSubtitle": "undertekster",
|
||||||
"LabelSupportedFileTypes": "Støttede filtyper",
|
"LabelSupportedFileTypes": "Støttede filtyper",
|
||||||
|
"LabelTag": "Tag",
|
||||||
"LabelTags": "Tagger",
|
"LabelTags": "Tagger",
|
||||||
"LabelTagsAccessibleToUser": "Tagger tilgjengelig for bruker",
|
"LabelTagsAccessibleToUser": "Tagger tilgjengelig for bruker",
|
||||||
"LabelTagsNotAccessibleToUser": "Tagger ikke tilgjengelig for bruker",
|
"LabelTagsNotAccessibleToUser": "Tagger ikke tilgjengelig for bruker",
|
||||||
"LabelTasks": "Oppgaver som kjører",
|
"LabelTasks": "Oppgaver som kjører",
|
||||||
|
"LabelTextEditorBulletedList": "Punkt-liste",
|
||||||
|
"LabelTextEditorLink": "Link",
|
||||||
|
"LabelTextEditorNumberedList": "Nummerert liste",
|
||||||
|
"LabelTextEditorUnlink": "Fjern link",
|
||||||
"LabelTheme": "Tema",
|
"LabelTheme": "Tema",
|
||||||
"LabelThemeDark": "Mørk",
|
"LabelThemeDark": "Mørk",
|
||||||
"LabelThemeLight": "Lys",
|
"LabelThemeLight": "Lys",
|
||||||
"LabelTimeBase": "Tidsbase",
|
"LabelTimeBase": "Tidsbase",
|
||||||
|
"LabelTimeDurationXHours": "{0} timer",
|
||||||
|
"LabelTimeDurationXMinutes": "{0} minutter",
|
||||||
|
"LabelTimeDurationXSeconds": "{0} sekunder",
|
||||||
"LabelTimeInMinutes": "Timer i minutter",
|
"LabelTimeInMinutes": "Timer i minutter",
|
||||||
|
"LabelTimeLeft": "{0} gjenstår",
|
||||||
"LabelTimeListened": "Tid lyttet",
|
"LabelTimeListened": "Tid lyttet",
|
||||||
"LabelTimeListenedToday": "Tid lyttet idag",
|
"LabelTimeListenedToday": "Tid lyttet idag",
|
||||||
"LabelTimeRemaining": "{0} gjennstående",
|
"LabelTimeRemaining": "{0} gjennstående",
|
||||||
@ -475,6 +642,7 @@
|
|||||||
"LabelTitle": "Tittel",
|
"LabelTitle": "Tittel",
|
||||||
"LabelToolsEmbedMetadata": "Bak inn metadata",
|
"LabelToolsEmbedMetadata": "Bak inn metadata",
|
||||||
"LabelToolsEmbedMetadataDescription": "Bak inn metadata i lydfilen, inkludert omslagsbilde og kapitler.",
|
"LabelToolsEmbedMetadataDescription": "Bak inn metadata i lydfilen, inkludert omslagsbilde og kapitler.",
|
||||||
|
"LabelToolsM4bEncoder": "M4B enkoder",
|
||||||
"LabelToolsMakeM4b": "Lag M4B Lydbokfil",
|
"LabelToolsMakeM4b": "Lag M4B Lydbokfil",
|
||||||
"LabelToolsMakeM4bDescription": "Lager en.M4B lydbokfil med innbakte omslagsbilde og kapitler.",
|
"LabelToolsMakeM4bDescription": "Lager en.M4B lydbokfil med innbakte omslagsbilde og kapitler.",
|
||||||
"LabelToolsSplitM4b": "Del M4B inn i MP3er",
|
"LabelToolsSplitM4b": "Del M4B inn i MP3er",
|
||||||
@ -487,39 +655,56 @@
|
|||||||
"LabelTracksMultiTrack": "Flerspor",
|
"LabelTracksMultiTrack": "Flerspor",
|
||||||
"LabelTracksNone": "Ingen spor",
|
"LabelTracksNone": "Ingen spor",
|
||||||
"LabelTracksSingleTrack": "Enkelspor",
|
"LabelTracksSingleTrack": "Enkelspor",
|
||||||
|
"LabelTrailer": "Trailer",
|
||||||
|
"LabelType": "Type",
|
||||||
"LabelUnabridged": "Uavkortet",
|
"LabelUnabridged": "Uavkortet",
|
||||||
|
"LabelUndo": "Angre",
|
||||||
"LabelUnknown": "Ukjent",
|
"LabelUnknown": "Ukjent",
|
||||||
|
"LabelUnknownPublishDate": "Ukjent publiseringsdato",
|
||||||
"LabelUpdateCover": "Oppdater omslag",
|
"LabelUpdateCover": "Oppdater omslag",
|
||||||
"LabelUpdateCoverHelp": "Tillat overskriving av eksisterende omslag for de valgte bøkene når en lik bok er funnet",
|
"LabelUpdateCoverHelp": "Tillat overskriving av eksisterende omslag for de valgte bøkene når en lik bok er funnet",
|
||||||
"LabelUpdateDetails": "Oppdater detaljer",
|
"LabelUpdateDetails": "Oppdater detaljer",
|
||||||
"LabelUpdateDetailsHelp": "Tillat overskriving av eksisterende detaljer for de valgte bøkene når en lik bok er funnet",
|
"LabelUpdateDetailsHelp": "Tillat overskriving av eksisterende detaljer for de valgte bøkene når en lik bok er funnet",
|
||||||
"LabelUpdatedAt": "Oppdatert",
|
"LabelUpdatedAt": "Oppdatert",
|
||||||
"LabelUploaderDragAndDrop": "Dra og slipp filer eller mapper",
|
"LabelUploaderDragAndDrop": "Dra og slipp filer eller mapper",
|
||||||
|
"LabelUploaderDragAndDropFilesOnly": "Dra & slipp filer",
|
||||||
"LabelUploaderDropFiles": "Slipp filer",
|
"LabelUploaderDropFiles": "Slipp filer",
|
||||||
|
"LabelUploaderItemFetchMetadataHelp": "Hent tittel, forfatter og serie automatisk",
|
||||||
|
"LabelUseAdvancedOptions": "Bruk avanserte valg",
|
||||||
"LabelUseChapterTrack": "Bruk kapittelspor",
|
"LabelUseChapterTrack": "Bruk kapittelspor",
|
||||||
"LabelUseFullTrack": "Bruke hele sporet",
|
"LabelUseFullTrack": "Bruke hele sporet",
|
||||||
|
"LabelUseZeroForUnlimited": "Bruk 0 for ubegrenset",
|
||||||
"LabelUser": "Bruker",
|
"LabelUser": "Bruker",
|
||||||
"LabelUsername": "Brukernavn",
|
"LabelUsername": "Brukernavn",
|
||||||
"LabelValue": "Verdi",
|
"LabelValue": "Verdi",
|
||||||
"LabelVersion": "Versjon",
|
"LabelVersion": "Versjon",
|
||||||
"LabelViewBookmarks": "Vis bokmerker",
|
"LabelViewBookmarks": "Vis bokmerker",
|
||||||
"LabelViewChapters": "Vis kapitler",
|
"LabelViewChapters": "Vis kapitler",
|
||||||
|
"LabelViewPlayerSettings": "Vis innstillinger for avspiller",
|
||||||
"LabelViewQueue": "Vis spillerkø",
|
"LabelViewQueue": "Vis spillerkø",
|
||||||
"LabelVolume": "Volum",
|
"LabelVolume": "Volum",
|
||||||
|
"LabelWebRedirectURLsDescription": "Godkjenn disse URL-ene hos OAuth-tilbyder for å tillate videresending til web-appen etter innlogging:",
|
||||||
|
"LabelWebRedirectURLsSubfolder": "Undermapper for videresendings-URL-er",
|
||||||
"LabelWeekdaysToRun": "Ukedager å kjøre",
|
"LabelWeekdaysToRun": "Ukedager å kjøre",
|
||||||
|
"LabelXBooks": "{0} bøker",
|
||||||
|
"LabelXItems": "{0} elementer",
|
||||||
|
"LabelYearReviewHide": "Skjul oppsummering av året",
|
||||||
|
"LabelYearReviewShow": "Vis oppsummering av året",
|
||||||
"LabelYourAudiobookDuration": "Din lydbok lengde",
|
"LabelYourAudiobookDuration": "Din lydbok lengde",
|
||||||
"LabelYourBookmarks": "Dine bokmerker",
|
"LabelYourBookmarks": "Dine bokmerker",
|
||||||
"LabelYourPlaylists": "Dine spillelister",
|
"LabelYourPlaylists": "Dine spillelister",
|
||||||
"LabelYourProgress": "Din fremgang",
|
"LabelYourProgress": "Din fremgang",
|
||||||
"MessageAddToPlayerQueue": "Legg til i kø",
|
"MessageAddToPlayerQueue": "Legg til i kø",
|
||||||
"MessageAppriseDescription": "For å bruke denne funksjonen trenger du en instans av <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kjørende eller ett api som vil håndere disse forespørslene. <br />Apprise API Url skal være den fulle URL stien for å sende Notifikasjonen, f.eks., hvis din API instans er hos <code>http://192.168.1.1:8337</code> vil du bruke <code>http://192.168.1.1:8337/notify</code>.",
|
"MessageAppriseDescription": "For å bruke denne funksjonen trenger du en instans av <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kjørende eller et API som håndterer disse forespørslene. <br />Apprise API URL skal være hele URL-en til varslingen, f.eks., hvis din API-instans er på <code>http://192.168.1.1:8337</code> så skal du bruke <code>http://192.168.1.1:8337/notify</code>.",
|
||||||
"MessageBackupsDescription": "Sikkerhetskopier inkluderer, brukerfremgang, detaljer om bibliotekgjenstander, tjener instillinger og bilder lagret under <code>/metadata/items</code> og <code>/metadata/authors</code>. Sikkerhetskopier <strong>vil ikke</strong> inkludere filer som er lagret i bibliotek mappene.",
|
"MessageBackupsDescription": "Sikkerhetskopier inkluderer, brukerfremgang, detaljer om bibliotekgjenstander, tjener instillinger og bilder lagret under <code>/metadata/items</code> og <code>/metadata/authors</code>. Sikkerhetskopier <strong>vil ikke</strong> inkludere filer som er lagret i bibliotek mappene.",
|
||||||
"MessageBackupsLocationEditNote": "Merk: Endring av sikkerhetskopieringssted hverken endrer eller flytter eksisterende sikkerhetskopier",
|
"MessageBackupsLocationEditNote": "Viktig: Endring av mappen for sikkerhetskopi hverken endrer eller flytter eksisterende sikkerhetskopier!",
|
||||||
"MessageBackupsLocationPathEmpty": "Sti til sikkerhetskopieringssted må angis",
|
"MessageBackupsLocationNoEditNote": "NB: Mappen for sikkerhetskopi settes i en miljøvariabel og kan ikke endres her.",
|
||||||
|
"MessageBackupsLocationPathEmpty": "Mappen for sikkerhetskopiering må angis",
|
||||||
"MessageBatchQuickMatchDescription": "Kjapt søk vil forsøke å legge til manglende omslag og metadata for de valgte gjenstandene. Aktiver dette valget for å tillate Kjapt søk til å overskrive eksisterende omslag og/eller metadata.",
|
"MessageBatchQuickMatchDescription": "Kjapt søk vil forsøke å legge til manglende omslag og metadata for de valgte gjenstandene. Aktiver dette valget for å tillate Kjapt søk til å overskrive eksisterende omslag og/eller metadata.",
|
||||||
"MessageBookshelfNoCollections": "Du har ikke laget noen samlinger ennå",
|
"MessageBookshelfNoCollections": "Du har ikke laget noen samlinger ennå",
|
||||||
"MessageBookshelfNoRSSFeeds": "Ingen RSS feed er åpen",
|
"MessageBookshelfNoRSSFeeds": "Ingen RSS feed er åpen",
|
||||||
"MessageBookshelfNoResultsForFilter": "Ingen resultat for filter \"{0}: {1}\"",
|
"MessageBookshelfNoResultsForFilter": "Ingen resultat for filter \"{0}: {1}\"",
|
||||||
|
"MessageBookshelfNoResultsForQuery": "Ingen resultater for søket",
|
||||||
"MessageBookshelfNoSeries": "Du har ingen serier",
|
"MessageBookshelfNoSeries": "Du har ingen serier",
|
||||||
"MessageChapterEndIsAfter": "Kapittel slutt er etter slutt av lydboken",
|
"MessageChapterEndIsAfter": "Kapittel slutt er etter slutt av lydboken",
|
||||||
"MessageChapterErrorFirstNotZero": "Første kapittel starter på 0",
|
"MessageChapterErrorFirstNotZero": "Første kapittel starter på 0",
|
||||||
@ -529,18 +714,35 @@
|
|||||||
"MessageCheckingCron": "Sjekker cron...",
|
"MessageCheckingCron": "Sjekker cron...",
|
||||||
"MessageConfirmCloseFeed": "Er du sikker på at du vil lukke denne feeden?",
|
"MessageConfirmCloseFeed": "Er du sikker på at du vil lukke denne feeden?",
|
||||||
"MessageConfirmDeleteBackup": "Er du sikker på at du vil slette sikkerhetskopi for {0}?",
|
"MessageConfirmDeleteBackup": "Er du sikker på at du vil slette sikkerhetskopi for {0}?",
|
||||||
|
"MessageConfirmDeleteDevice": "Er du sikker på at du vil slette e-leser enheten \"{0}\"?",
|
||||||
"MessageConfirmDeleteFile": "Dette vil slette filen fra filsystemet. Er du sikker?",
|
"MessageConfirmDeleteFile": "Dette vil slette filen fra filsystemet. Er du sikker?",
|
||||||
"MessageConfirmDeleteLibrary": "Er du sikker på at du vil slette biblioteket \"{0}\" for godt?",
|
"MessageConfirmDeleteLibrary": "Er du sikker på at du vil slette biblioteket \"{0}\" for godt?",
|
||||||
|
"MessageConfirmDeleteLibraryItem": "Nå slettes elementet fra databasen og fil-systemet. Er du sikker?",
|
||||||
|
"MessageConfirmDeleteLibraryItems": "Nå slettes {0} elementer fra databasen og fil-systemet. Er du sikker?",
|
||||||
|
"MessageConfirmDeleteMetadataProvider": "Er du sikker på at du vil slette den egendefinerte leverandøren av metadata: \"{0}\"?",
|
||||||
|
"MessageConfirmDeleteNotification": "Er du sikker på at du vil slette dette varselet?",
|
||||||
"MessageConfirmDeleteSession": "Er du sikker på at du vil slette denne sesjonen?",
|
"MessageConfirmDeleteSession": "Er du sikker på at du vil slette denne sesjonen?",
|
||||||
|
"MessageConfirmEmbedMetadataInAudioFiles": "Er du sikker på at du vil legge til metadata i {0} lyd-filer?",
|
||||||
"MessageConfirmForceReScan": "Er du sikker på at du vil tvinge en ny skann?",
|
"MessageConfirmForceReScan": "Er du sikker på at du vil tvinge en ny skann?",
|
||||||
"MessageConfirmMarkAllEpisodesFinished": "Er du sikker på at du vil markere alle episodene som fullført?",
|
"MessageConfirmMarkAllEpisodesFinished": "Er du sikker på at du vil markere alle episodene som fullført?",
|
||||||
"MessageConfirmMarkAllEpisodesNotFinished": "Er du sikker på at du vil markere alle episodene som ikke fullført?",
|
"MessageConfirmMarkAllEpisodesNotFinished": "Er du sikker på at du vil markere alle episodene som ikke fullført?",
|
||||||
|
"MessageConfirmMarkItemFinished": "Er du sikker på at du vil markere {0} som ferdig?",
|
||||||
|
"MessageConfirmMarkItemNotFinished": "Er du sikker på at du vil markere {0} som ikke ferdig?",
|
||||||
"MessageConfirmMarkSeriesFinished": "Er du sikker på at du vil markere alle bøkene i serien som fullført?",
|
"MessageConfirmMarkSeriesFinished": "Er du sikker på at du vil markere alle bøkene i serien som fullført?",
|
||||||
"MessageConfirmMarkSeriesNotFinished": "Er du sikker på at du vil markere alle bøkene i serien som ikke fullført?",
|
"MessageConfirmMarkSeriesNotFinished": "Er du sikker på at du vil markere alle bøkene i serien som ikke fullført?",
|
||||||
|
"MessageConfirmNotificationTestTrigger": "Utløs dette varselet med test-data?",
|
||||||
|
"MessageConfirmPurgeCache": "(Purge cache) Dette vil sletter hele mappen <code>/metadata/cache</code>. <br /><br />Er du sikker på at du du vil slette cache-mappen?",
|
||||||
|
"MessageConfirmPurgeItemsCache": "(Purge items cache) Dette vil sletter hele mappen <code>/metadata/cache/items</code>.<br />Er du sikker?",
|
||||||
|
"MessageConfirmQuickEmbed": "Advarsel! Rask innbygging av metadata tar ikke backup av lyd-filene først. Forsikre deg om at du har sikkerhetskopi av filene. <br><br> Fortsett?",
|
||||||
|
"MessageConfirmQuickMatchEpisodes": "Hurtig gjenkjenning av episoder overskriver detaljene hvis en match blir funnet. Kun episoder som ikke allerede er matchet blir oppdatert. Er du sikker?",
|
||||||
|
"MessageConfirmReScanLibraryItems": "Er du sikker på at du ønsker å skanne {0} elementer på nytt?",
|
||||||
"MessageConfirmRemoveAllChapters": "Er du sikker på at du vil fjerne alle kapitler?",
|
"MessageConfirmRemoveAllChapters": "Er du sikker på at du vil fjerne alle kapitler?",
|
||||||
|
"MessageConfirmRemoveAuthor": "Er du sikker på at du vil fjerne forfatteren \"{0}\"?",
|
||||||
"MessageConfirmRemoveCollection": "Er du sikker på at du vil fjerne samling\"{0}\"?",
|
"MessageConfirmRemoveCollection": "Er du sikker på at du vil fjerne samling\"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisode": "Er du sikker på at du vil fjerne episode \"{0}\"?",
|
"MessageConfirmRemoveEpisode": "Er du sikker på at du vil fjerne episode \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisodes": "Er du sikker på at du vil fjerne {0} episoder?",
|
"MessageConfirmRemoveEpisodes": "Er du sikker på at du vil fjerne {0} episoder?",
|
||||||
|
"MessageConfirmRemoveListeningSessions": "Er du sikker på at du vil fjerne {0} lytte-sesjoner?",
|
||||||
|
"MessageConfirmRemoveMetadataFiles": "Er du sikker på at du vil fjerne alle metadata.{0}-filer i mappene for biblioteks-elementer?",
|
||||||
"MessageConfirmRemoveNarrator": "Er du sikker på at du vil fjerne forteller \"{0}\"?",
|
"MessageConfirmRemoveNarrator": "Er du sikker på at du vil fjerne forteller \"{0}\"?",
|
||||||
"MessageConfirmRemovePlaylist": "Er du sikker på at du vil fjerne spillelisten \"{0}\"?",
|
"MessageConfirmRemovePlaylist": "Er du sikker på at du vil fjerne spillelisten \"{0}\"?",
|
||||||
"MessageConfirmRenameGenre": "Er du sikker på at du vil endre sjanger \"{0}\" til \"{1}\" for alle gjenstandene?",
|
"MessageConfirmRenameGenre": "Er du sikker på at du vil endre sjanger \"{0}\" til \"{1}\" for alle gjenstandene?",
|
||||||
@ -549,11 +751,16 @@
|
|||||||
"MessageConfirmRenameTag": "Er du sikker på at du vil endre tag \"{0}\" til \"{1}\" for alle gjenstandene?",
|
"MessageConfirmRenameTag": "Er du sikker på at du vil endre tag \"{0}\" til \"{1}\" for alle gjenstandene?",
|
||||||
"MessageConfirmRenameTagMergeNote": "Notis: Denne taggen finnes allerede så de vil bli slått sammen.",
|
"MessageConfirmRenameTagMergeNote": "Notis: Denne taggen finnes allerede så de vil bli slått sammen.",
|
||||||
"MessageConfirmRenameTagWarning": "Advarsel! En lignende tag eksisterer allerede (med forsjellige store / små bokstaver) \"{0}\".",
|
"MessageConfirmRenameTagWarning": "Advarsel! En lignende tag eksisterer allerede (med forsjellige store / små bokstaver) \"{0}\".",
|
||||||
|
"MessageConfirmResetProgress": "Er du sikkert på at du vil tilbakestille fremgangen?",
|
||||||
"MessageConfirmSendEbookToDevice": "Er du sikker på at du vil sende {0} ebok \"{1}\" til enhet \"{2}\"?",
|
"MessageConfirmSendEbookToDevice": "Er du sikker på at du vil sende {0} ebok \"{1}\" til enhet \"{2}\"?",
|
||||||
|
"MessageConfirmUnlinkOpenId": "Er du sikker på at du vil koble denne brukeren fra OpenID?",
|
||||||
"MessageDownloadingEpisode": "Laster ned episode",
|
"MessageDownloadingEpisode": "Laster ned episode",
|
||||||
"MessageDragFilesIntoTrackOrder": "Dra filene i rett spor rekkefølge",
|
"MessageDragFilesIntoTrackOrder": "Dra filene i rett spor rekkefølge",
|
||||||
|
"MessageEmbedFailed": "Innbygging feilet!",
|
||||||
"MessageEmbedFinished": "Bak inn Fullført!",
|
"MessageEmbedFinished": "Bak inn Fullført!",
|
||||||
|
"MessageEmbedQueue": "Lagt i køen for innbygging av metadata ({0} i kø)",
|
||||||
"MessageEpisodesQueuedForDownload": "{0} Episode(r) lagt til i kø for nedlasting",
|
"MessageEpisodesQueuedForDownload": "{0} Episode(r) lagt til i kø for nedlasting",
|
||||||
|
"MessageEreaderDevices": "For å sikre sendingen av e-bøker, så må du kanskje legge til e-postadressen over som en gyldig avsender for hver enhet i listen over.",
|
||||||
"MessageFeedURLWillBe": "Feed URL vil bli {0}",
|
"MessageFeedURLWillBe": "Feed URL vil bli {0}",
|
||||||
"MessageFetching": "Henter...",
|
"MessageFetching": "Henter...",
|
||||||
"MessageForceReScanDescription": "vil skanne alle filene igjen som en ny skann. Lyd fil ID3 tagger, OPF filer og tekstfiler vil bli skannet som nye.",
|
"MessageForceReScanDescription": "vil skanne alle filene igjen som en ny skann. Lyd fil ID3 tagger, OPF filer og tekstfiler vil bli skannet som nye.",
|
||||||
@ -593,7 +800,7 @@
|
|||||||
"MessageNoListeningSessions": "Ingen Lyttesesjoner",
|
"MessageNoListeningSessions": "Ingen Lyttesesjoner",
|
||||||
"MessageNoLogs": "Ingen logger",
|
"MessageNoLogs": "Ingen logger",
|
||||||
"MessageNoMediaProgress": "Ingen mediefremgang",
|
"MessageNoMediaProgress": "Ingen mediefremgang",
|
||||||
"MessageNoNotifications": "Ingen notifikasjoner",
|
"MessageNoNotifications": "Ingen varslinger",
|
||||||
"MessageNoPodcastsFound": "Ingen podcaster funnet",
|
"MessageNoPodcastsFound": "Ingen podcaster funnet",
|
||||||
"MessageNoResults": "Ingen resultat",
|
"MessageNoResults": "Ingen resultat",
|
||||||
"MessageNoSearchResultsFor": "Ingen søkeresultat for \"{0}\"",
|
"MessageNoSearchResultsFor": "Ingen søkeresultat for \"{0}\"",
|
||||||
@ -648,30 +855,66 @@
|
|||||||
"ToastAuthorUpdateMerged": "Forfatter slått sammen",
|
"ToastAuthorUpdateMerged": "Forfatter slått sammen",
|
||||||
"ToastAuthorUpdateSuccess": "Forfatter oppdatert",
|
"ToastAuthorUpdateSuccess": "Forfatter oppdatert",
|
||||||
"ToastAuthorUpdateSuccessNoImageFound": "Forfatter oppdater (ingen bilde funnet)",
|
"ToastAuthorUpdateSuccessNoImageFound": "Forfatter oppdater (ingen bilde funnet)",
|
||||||
|
"ToastBackupAppliedSuccess": "Sikkerhetskopi slått på",
|
||||||
"ToastBackupCreateFailed": "Mislykkes å lage sikkerhetskopi",
|
"ToastBackupCreateFailed": "Mislykkes å lage sikkerhetskopi",
|
||||||
"ToastBackupCreateSuccess": "Sikkerhetskopi opprettet",
|
"ToastBackupCreateSuccess": "Sikkerhetskopi opprettet",
|
||||||
"ToastBackupDeleteFailed": "Mislykkes å slette sikkerhetskopi",
|
"ToastBackupDeleteFailed": "Mislykkes å slette sikkerhetskopi",
|
||||||
"ToastBackupDeleteSuccess": "Sikkerhetskopi slettet",
|
"ToastBackupDeleteSuccess": "Sikkerhetskopi slettet",
|
||||||
|
"ToastBackupInvalidMaxKeep": "Ugyldig antall sikkerhetskopier ønskes beholdt",
|
||||||
|
"ToastBackupInvalidMaxSize": "Ugyldig maksimal størrelse for sikkerhetskopi",
|
||||||
"ToastBackupRestoreFailed": "Misslykkes å gjenopprette sikkerhetskopi",
|
"ToastBackupRestoreFailed": "Misslykkes å gjenopprette sikkerhetskopi",
|
||||||
"ToastBackupUploadFailed": "Misslykkes å laste opp sikkerhetskopi",
|
"ToastBackupUploadFailed": "Misslykkes å laste opp sikkerhetskopi",
|
||||||
"ToastBackupUploadSuccess": "Sikkerhetskopi lastet opp",
|
"ToastBackupUploadSuccess": "Sikkerhetskopi lastet opp",
|
||||||
|
"ToastBatchDeleteFailed": "Sletting feilet på utvalget",
|
||||||
|
"ToastBatchDeleteSuccess": "Sletting av samling utført",
|
||||||
|
"ToastBatchQuickMatchFailed": "Feil ved rask integrering av metadata!",
|
||||||
|
"ToastBatchQuickMatchStarted": "Rask integrering av metadata for {0} bøker startet!",
|
||||||
"ToastBatchUpdateFailed": "Bulk oppdatering mislykket",
|
"ToastBatchUpdateFailed": "Bulk oppdatering mislykket",
|
||||||
"ToastBatchUpdateSuccess": "Bulk oppdatering fullført",
|
"ToastBatchUpdateSuccess": "Bulk oppdatering fullført",
|
||||||
"ToastBookmarkCreateFailed": "Misslykkes å opprette bokmerke",
|
"ToastBookmarkCreateFailed": "Misslykkes å opprette bokmerke",
|
||||||
"ToastBookmarkCreateSuccess": "Bokmerke lagt til",
|
"ToastBookmarkCreateSuccess": "Bokmerke lagt til",
|
||||||
"ToastBookmarkRemoveSuccess": "Bokmerke fjernet",
|
"ToastBookmarkRemoveSuccess": "Bokmerke fjernet",
|
||||||
"ToastBookmarkUpdateSuccess": "Bokmerke oppdatert",
|
"ToastBookmarkUpdateSuccess": "Bokmerke oppdatert",
|
||||||
|
"ToastCachePurgeFailed": "Kunne ikke å slette mellomlager",
|
||||||
|
"ToastCachePurgeSuccess": "Mellomlager slettet",
|
||||||
"ToastChaptersHaveErrors": "Kapittel har feil",
|
"ToastChaptersHaveErrors": "Kapittel har feil",
|
||||||
"ToastChaptersMustHaveTitles": "Kapittel må ha titler",
|
"ToastChaptersMustHaveTitles": "Kapittel må ha titler",
|
||||||
|
"ToastChaptersRemoved": "Kapitler fjernet",
|
||||||
|
"ToastChaptersUpdated": "Kapitler oppdatert",
|
||||||
|
"ToastCollectionItemsAddFailed": "Feil med å legge til element(er)",
|
||||||
|
"ToastCollectionItemsAddSuccess": "Element(er) lagt til samlingen",
|
||||||
"ToastCollectionItemsRemoveSuccess": "Gjenstand(er) fjernet fra samling",
|
"ToastCollectionItemsRemoveSuccess": "Gjenstand(er) fjernet fra samling",
|
||||||
"ToastCollectionRemoveSuccess": "Samling fjernet",
|
"ToastCollectionRemoveSuccess": "Samling fjernet",
|
||||||
"ToastCollectionUpdateSuccess": "samlingupdated",
|
"ToastCollectionUpdateSuccess": "samlingupdated",
|
||||||
|
"ToastCoverUpdateFailed": "Oppdatering av bilde feilet",
|
||||||
|
"ToastDeleteFileFailed": "Kunne ikke slette fil",
|
||||||
|
"ToastDeleteFileSuccess": "Fil slettet",
|
||||||
|
"ToastDeviceAddFailed": "Kunne ikke legge til enhet",
|
||||||
|
"ToastDeviceNameAlreadyExists": "E-leser med dette navnet eksisterer allerede",
|
||||||
|
"ToastDeviceTestEmailFailed": "Kunne ikke sende test e-post",
|
||||||
|
"ToastDeviceTestEmailSuccess": "E-post for testing er sendt",
|
||||||
|
"ToastEmailSettingsUpdateSuccess": "Innstillinger for e-post oppdatert",
|
||||||
|
"ToastEncodeCancelFailed": "Kunne ikke stoppe konverteringen",
|
||||||
|
"ToastEncodeCancelSucces": "Konvertering kansellert",
|
||||||
|
"ToastEpisodeDownloadQueueClearFailed": "Kunne ikke tømme køen",
|
||||||
|
"ToastEpisodeDownloadQueueClearSuccess": "Nedlastingskø for eposider tømt",
|
||||||
|
"ToastEpisodeUpdateSuccess": "{0} episoder oppdatert",
|
||||||
|
"ToastFailedToLoadData": "Kunne ikke laste inn data",
|
||||||
|
"ToastFailedToMatch": "Kunne ikke matche",
|
||||||
|
"ToastFailedToShare": "Deling feilet",
|
||||||
|
"ToastFailedToUpdate": "Oppdatering feilet",
|
||||||
|
"ToastInvalidImageUrl": "Ugyldig URL for bilde",
|
||||||
|
"ToastInvalidMaxEpisodesToDownload": "Ugyldig maksimalt antall for nedlasting av episoder",
|
||||||
|
"ToastInvalidUrl": "Ugyldig URL",
|
||||||
"ToastItemCoverUpdateSuccess": "Omslag oppdatert",
|
"ToastItemCoverUpdateSuccess": "Omslag oppdatert",
|
||||||
|
"ToastItemDeletedFailed": "Kunne ikke slette element",
|
||||||
|
"ToastItemDeletedSuccess": "Element slettet",
|
||||||
"ToastItemDetailsUpdateSuccess": "Detaljer oppdatert",
|
"ToastItemDetailsUpdateSuccess": "Detaljer oppdatert",
|
||||||
"ToastItemMarkedAsFinishedFailed": "Misslykkes å markere som Fullført",
|
"ToastItemMarkedAsFinishedFailed": "Misslykkes å markere som Fullført",
|
||||||
"ToastItemMarkedAsFinishedSuccess": "Gjenstand marker som Fullført",
|
"ToastItemMarkedAsFinishedSuccess": "Gjenstand marker som Fullført",
|
||||||
"ToastItemMarkedAsNotFinishedFailed": "Misslykkes å markere som Ikke Fullført",
|
"ToastItemMarkedAsNotFinishedFailed": "Misslykkes å markere som Ikke Fullført",
|
||||||
"ToastItemMarkedAsNotFinishedSuccess": "Markert som Ikke Fullført",
|
"ToastItemMarkedAsNotFinishedSuccess": "Markert som Ikke Fullført",
|
||||||
|
"ToastItemUpdateSuccess": "Element oppdatert",
|
||||||
"ToastLibraryCreateFailed": "Misslykkes å opprette bibliotek",
|
"ToastLibraryCreateFailed": "Misslykkes å opprette bibliotek",
|
||||||
"ToastLibraryCreateSuccess": "Bibliotek \"{0}\" opprettet",
|
"ToastLibraryCreateSuccess": "Bibliotek \"{0}\" opprettet",
|
||||||
"ToastLibraryDeleteFailed": "Misslykkes å slette bibliotek",
|
"ToastLibraryDeleteFailed": "Misslykkes å slette bibliotek",
|
||||||
@ -679,25 +922,83 @@
|
|||||||
"ToastLibraryScanFailedToStart": "Misslykkes å starte skann",
|
"ToastLibraryScanFailedToStart": "Misslykkes å starte skann",
|
||||||
"ToastLibraryScanStarted": "Bibliotek skann startet",
|
"ToastLibraryScanStarted": "Bibliotek skann startet",
|
||||||
"ToastLibraryUpdateSuccess": "Bibliotek \"{0}\" oppdatert",
|
"ToastLibraryUpdateSuccess": "Bibliotek \"{0}\" oppdatert",
|
||||||
|
"ToastMatchAllAuthorsFailed": "Kunne ikke finne match for alle forfattere",
|
||||||
|
"ToastMetadataFilesRemovedError": "Feil ved fjerning av metadata.{0}-filer",
|
||||||
|
"ToastMetadataFilesRemovedNoneFound": "Ingen metata.{0}-filer funnet i biblioteket",
|
||||||
|
"ToastMetadataFilesRemovedNoneRemoved": "Ingen metata.{0}-filer fjernet",
|
||||||
|
"ToastMetadataFilesRemovedSuccess": "{0} metata.{1}-filer fjernet",
|
||||||
|
"ToastMustHaveAtLeastOnePath": "Påkrevd med minst én mappe",
|
||||||
|
"ToastNameEmailRequired": "Navn og e-post påkrevd",
|
||||||
|
"ToastNameRequired": "Navn er påkrevd",
|
||||||
|
"ToastNewEpisodesFound": "{0} nye episoder funnet",
|
||||||
|
"ToastNewUserCreatedFailed": "Kunne ikke opprette konto: \"{0}\"",
|
||||||
|
"ToastNewUserCreatedSuccess": "Ny konto opprettet",
|
||||||
|
"ToastNewUserLibraryError": "Velg minst ett bibliotek",
|
||||||
|
"ToastNewUserPasswordError": "Passord kreves. Kun root-bruker kan ha blankt passord",
|
||||||
|
"ToastNewUserTagError": "Velg minst en tag",
|
||||||
|
"ToastNewUserUsernameError": "Skriv inn brukernavn",
|
||||||
|
"ToastNoNewEpisodesFound": "Ingen nye episoder funnet",
|
||||||
|
"ToastNoUpdatesNecessary": "Ingen oppdateringer nødvendig",
|
||||||
|
"ToastNotificationCreateFailed": "Kunne ikke opprette varsling",
|
||||||
|
"ToastNotificationDeleteFailed": "Kunne ikke slette varsling",
|
||||||
|
"ToastNotificationFailedMaximum": "Maksimalt antall forsøk som feiler må være større eller lik null (0)",
|
||||||
|
"ToastNotificationQueueMaximum": "Maksimal størrelse på varsel-kø må være større eller lik null (0)",
|
||||||
|
"ToastNotificationSettingsUpdateSuccess": "Innstillinger for varsling oppdatert",
|
||||||
|
"ToastNotificationTestTriggerFailed": "Kunne ikke utløse test-varsel",
|
||||||
|
"ToastNotificationTestTriggerSuccess": "Test-varsel utløst",
|
||||||
|
"ToastNotificationUpdateSuccess": "Varsel oppdatert",
|
||||||
"ToastPlaylistCreateFailed": "Misslykkes å opprette spilleliste",
|
"ToastPlaylistCreateFailed": "Misslykkes å opprette spilleliste",
|
||||||
"ToastPlaylistCreateSuccess": "Spilleliste opprettet",
|
"ToastPlaylistCreateSuccess": "Spilleliste opprettet",
|
||||||
"ToastPlaylistRemoveSuccess": "Spilleliste fjernet",
|
"ToastPlaylistRemoveSuccess": "Spilleliste fjernet",
|
||||||
"ToastPlaylistUpdateSuccess": "Spilleliste oppdatert",
|
"ToastPlaylistUpdateSuccess": "Spilleliste oppdatert",
|
||||||
"ToastPodcastCreateFailed": "Misslykkes å opprette podcast",
|
"ToastPodcastCreateFailed": "Misslykkes å opprette podcast",
|
||||||
"ToastPodcastCreateSuccess": "Podcast opprettet",
|
"ToastPodcastCreateSuccess": "Podcast opprettet",
|
||||||
|
"ToastPodcastGetFeedFailed": "Kunne ikke hente podcast-feed",
|
||||||
|
"ToastPodcastNoEpisodesInFeed": "Ingen episoder funnet i RSS-feed",
|
||||||
|
"ToastPodcastNoRssFeed": "Podcast har ingen RSS-feed",
|
||||||
|
"ToastProgressIsNotBeingSynced": "Progresjon synkroniserer ikke, start avspilling på nytt",
|
||||||
|
"ToastProviderCreatedFailed": "Kunne ikke legge til tilbyder",
|
||||||
|
"ToastProviderCreatedSuccess": "Ny tilbyder lagt til",
|
||||||
|
"ToastProviderNameAndUrlRequired": "Navn og URL er påkrevd",
|
||||||
|
"ToastProviderRemoveSuccess": "Tilbyder fjernet",
|
||||||
"ToastRSSFeedCloseFailed": "Misslykkes å lukke RSS feed",
|
"ToastRSSFeedCloseFailed": "Misslykkes å lukke RSS feed",
|
||||||
"ToastRSSFeedCloseSuccess": "RSS feed lukket",
|
"ToastRSSFeedCloseSuccess": "RSS feed lukket",
|
||||||
|
"ToastRemoveFailed": "Kunne ikke fjerne",
|
||||||
"ToastRemoveItemFromCollectionFailed": "Misslykkes å fjerne gjenstsand fra samling",
|
"ToastRemoveItemFromCollectionFailed": "Misslykkes å fjerne gjenstsand fra samling",
|
||||||
"ToastRemoveItemFromCollectionSuccess": "Gjenstand fjernet fra samling",
|
"ToastRemoveItemFromCollectionSuccess": "Gjenstand fjernet fra samling",
|
||||||
|
"ToastRemoveItemsWithIssuesFailed": "Kunne ikke fjerne bibliotek-elementer med feil",
|
||||||
|
"ToastRemoveItemsWithIssuesSuccess": "Fjernet bibliotek-elementer med feil",
|
||||||
|
"ToastRenameFailed": "Kunne ikke endre navn",
|
||||||
|
"ToastRescanFailed": "Ny skanning feilet for {0}",
|
||||||
|
"ToastRescanRemoved": "Ny skanning utført og element fjernet",
|
||||||
|
"ToastRescanUpToDate": "Ny skanning utført og element var oppdatert",
|
||||||
|
"ToastRescanUpdated": "Ny skanning utført og element oppdatert",
|
||||||
|
"ToastScanFailed": "Kunne ikke skanne bibliotek-element",
|
||||||
|
"ToastSelectAtLeastOneUser": "Velg minst én bruker",
|
||||||
"ToastSendEbookToDeviceFailed": "Misslykkes å sende ebok",
|
"ToastSendEbookToDeviceFailed": "Misslykkes å sende ebok",
|
||||||
"ToastSendEbookToDeviceSuccess": "Ebok sendt til \"{0}\"",
|
"ToastSendEbookToDeviceSuccess": "Ebok sendt til \"{0}\"",
|
||||||
"ToastSeriesUpdateFailed": "Misslykkes å oppdatere serie",
|
"ToastSeriesUpdateFailed": "Misslykkes å oppdatere serie",
|
||||||
"ToastSeriesUpdateSuccess": "Serie oppdatert",
|
"ToastSeriesUpdateSuccess": "Serie oppdatert",
|
||||||
|
"ToastServerSettingsUpdateSuccess": "Server-innstillinger oppdatert",
|
||||||
|
"ToastSessionCloseFailed": "Kunne ikke avslutte sesjon",
|
||||||
"ToastSessionDeleteFailed": "Misslykkes å slette sesjon",
|
"ToastSessionDeleteFailed": "Misslykkes å slette sesjon",
|
||||||
"ToastSessionDeleteSuccess": "Sesjon slettet",
|
"ToastSessionDeleteSuccess": "Sesjon slettet",
|
||||||
|
"ToastSleepTimerDone": "Søvn-timer ferdig... zZzzZz",
|
||||||
|
"ToastSlugMustChange": "Slug inneholder ugyldige tegn",
|
||||||
|
"ToastSlugRequired": "Slug påkrevd",
|
||||||
"ToastSocketConnected": "Socket koblet til",
|
"ToastSocketConnected": "Socket koblet til",
|
||||||
"ToastSocketDisconnected": "Socket koblet fra",
|
"ToastSocketDisconnected": "Socket koblet fra",
|
||||||
"ToastSocketFailedToConnect": "Misslykkes å koble til Socket",
|
"ToastSocketFailedToConnect": "Misslykkes å koble til Socket",
|
||||||
|
"ToastSortingPrefixesEmptyError": "Må ha minst én sorteringsprefiks",
|
||||||
|
"ToastSortingPrefixesUpdateSuccess": "Sorteringsprefiks oppdatert ({0} element)",
|
||||||
|
"ToastTitleRequired": "Tittel påkrevd",
|
||||||
|
"ToastUnknownError": "Ukjent feil",
|
||||||
|
"ToastUnlinkOpenIdFailed": "Kunne ikke koble bruker fra OpenID",
|
||||||
|
"ToastUnlinkOpenIdSuccess": "Bruker koblet fra OpenID",
|
||||||
"ToastUserDeleteFailed": "Misslykkes å slette bruker",
|
"ToastUserDeleteFailed": "Misslykkes å slette bruker",
|
||||||
"ToastUserDeleteSuccess": "Bruker slettet"
|
"ToastUserDeleteSuccess": "Bruker slettet",
|
||||||
|
"ToastUserPasswordChangeSuccess": "Passord ble endret",
|
||||||
|
"ToastUserPasswordMismatch": "Passord må stemme overens",
|
||||||
|
"ToastUserPasswordMustChange": "Nytt passord kan ikke være identisk med gammelt passord",
|
||||||
|
"ToastUserRootRequireName": "Root-brukernavn er påkrevd"
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
"ButtonBrowseForFolder": "Bläddra efter mapp",
|
"ButtonBrowseForFolder": "Bläddra efter mapp",
|
||||||
"ButtonCancel": "Avbryt",
|
"ButtonCancel": "Avbryt",
|
||||||
"ButtonCancelEncode": "Avbryt kodning",
|
"ButtonCancelEncode": "Avbryt kodning",
|
||||||
"ButtonChangeRootPassword": "Ändra rootlösenord",
|
"ButtonChangeRootPassword": "Ändra lösenordet för root",
|
||||||
"ButtonCheckAndDownloadNewEpisodes": "Kontrollera och ladda ner nya avsnitt",
|
"ButtonCheckAndDownloadNewEpisodes": "Kontrollera och ladda ner nya avsnitt",
|
||||||
"ButtonChooseAFolder": "Välj en mapp",
|
"ButtonChooseAFolder": "Välj en mapp",
|
||||||
"ButtonChooseFiles": "Välj filer",
|
"ButtonChooseFiles": "Välj filer",
|
||||||
@ -29,7 +29,7 @@
|
|||||||
"ButtonEditChapters": "Redigera kapitel",
|
"ButtonEditChapters": "Redigera kapitel",
|
||||||
"ButtonEditPodcast": "Redigera podcast",
|
"ButtonEditPodcast": "Redigera podcast",
|
||||||
"ButtonForceReScan": "Tvinga omstart",
|
"ButtonForceReScan": "Tvinga omstart",
|
||||||
"ButtonFullPath": "Full sökväg",
|
"ButtonFullPath": "Fullständig sökväg",
|
||||||
"ButtonHide": "Dölj",
|
"ButtonHide": "Dölj",
|
||||||
"ButtonHome": "Hem",
|
"ButtonHome": "Hem",
|
||||||
"ButtonIssues": "Problem",
|
"ButtonIssues": "Problem",
|
||||||
@ -42,13 +42,18 @@
|
|||||||
"ButtonMatchAllAuthors": "Matcha alla författare",
|
"ButtonMatchAllAuthors": "Matcha alla författare",
|
||||||
"ButtonMatchBooks": "Matcha böcker",
|
"ButtonMatchBooks": "Matcha böcker",
|
||||||
"ButtonNevermind": "Glöm det",
|
"ButtonNevermind": "Glöm det",
|
||||||
"ButtonOk": "Okej",
|
"ButtonNext": "Nästa",
|
||||||
|
"ButtonNextChapter": "Nästa kapitel",
|
||||||
|
"ButtonOk": "Ok",
|
||||||
"ButtonOpenFeed": "Öppna flöde",
|
"ButtonOpenFeed": "Öppna flöde",
|
||||||
"ButtonOpenManager": "Öppna Manager",
|
"ButtonOpenManager": "Öppna Manager",
|
||||||
"ButtonPause": "Pausa",
|
"ButtonPause": "Pausa",
|
||||||
"ButtonPlay": "Spela",
|
"ButtonPlay": "Spela",
|
||||||
|
"ButtonPlayAll": "Spela alla",
|
||||||
"ButtonPlaying": "Spelar",
|
"ButtonPlaying": "Spelar",
|
||||||
"ButtonPlaylists": "Spellistor",
|
"ButtonPlaylists": "Spellistor",
|
||||||
|
"ButtonPrevious": "Föregående",
|
||||||
|
"ButtonPreviousChapter": "Föregående kapitel",
|
||||||
"ButtonPurgeAllCache": "Rensa all cache",
|
"ButtonPurgeAllCache": "Rensa all cache",
|
||||||
"ButtonPurgeItemsCache": "Rensa föremåls-cache",
|
"ButtonPurgeItemsCache": "Rensa föremåls-cache",
|
||||||
"ButtonQueueAddItem": "Lägg till i kön",
|
"ButtonQueueAddItem": "Lägg till i kön",
|
||||||
@ -56,6 +61,9 @@
|
|||||||
"ButtonQuickMatch": "Snabb matchning",
|
"ButtonQuickMatch": "Snabb matchning",
|
||||||
"ButtonReScan": "Omstart",
|
"ButtonReScan": "Omstart",
|
||||||
"ButtonRead": "Läs",
|
"ButtonRead": "Läs",
|
||||||
|
"ButtonReadLess": "Visa mindre",
|
||||||
|
"ButtonReadMore": "Visa mer",
|
||||||
|
"ButtonRefresh": "Uppdatera",
|
||||||
"ButtonRemove": "Ta bort",
|
"ButtonRemove": "Ta bort",
|
||||||
"ButtonRemoveAll": "Ta bort alla",
|
"ButtonRemoveAll": "Ta bort alla",
|
||||||
"ButtonRemoveAllLibraryItems": "Ta bort alla biblioteksobjekt",
|
"ButtonRemoveAllLibraryItems": "Ta bort alla biblioteksobjekt",
|
||||||
@ -72,12 +80,13 @@
|
|||||||
"ButtonScanLibrary": "Skanna bibliotek",
|
"ButtonScanLibrary": "Skanna bibliotek",
|
||||||
"ButtonSearch": "Sök",
|
"ButtonSearch": "Sök",
|
||||||
"ButtonSelectFolderPath": "Välj mappens sökväg",
|
"ButtonSelectFolderPath": "Välj mappens sökväg",
|
||||||
"ButtonSeries": "Serie",
|
"ButtonSeries": "Serier",
|
||||||
"ButtonSetChaptersFromTracks": "Ställ in kapitel från spår",
|
"ButtonSetChaptersFromTracks": "Ställ in kapitel från spår",
|
||||||
"ButtonShiftTimes": "Förskjut tider",
|
"ButtonShiftTimes": "Förskjut tider",
|
||||||
"ButtonShow": "Visa",
|
"ButtonShow": "Visa",
|
||||||
"ButtonStartM4BEncode": "Starta M4B-kodning",
|
"ButtonStartM4BEncode": "Starta M4B-kodning",
|
||||||
"ButtonStartMetadataEmbed": "Starta inbäddning av metadata",
|
"ButtonStartMetadataEmbed": "Starta inbäddning av metadata",
|
||||||
|
"ButtonStats": "Statistik",
|
||||||
"ButtonSubmit": "Skicka",
|
"ButtonSubmit": "Skicka",
|
||||||
"ButtonTest": "Testa",
|
"ButtonTest": "Testa",
|
||||||
"ButtonUpload": "Ladda upp",
|
"ButtonUpload": "Ladda upp",
|
||||||
@ -123,7 +132,7 @@
|
|||||||
"HeaderListeningStats": "Lyssningsstatistik",
|
"HeaderListeningStats": "Lyssningsstatistik",
|
||||||
"HeaderLogin": "Logga in",
|
"HeaderLogin": "Logga in",
|
||||||
"HeaderLogs": "Loggar",
|
"HeaderLogs": "Loggar",
|
||||||
"HeaderManageGenres": "Hantera genrer",
|
"HeaderManageGenres": "Hantera kategorier",
|
||||||
"HeaderManageTags": "Hantera taggar",
|
"HeaderManageTags": "Hantera taggar",
|
||||||
"HeaderMapDetails": "Karta detaljer",
|
"HeaderMapDetails": "Karta detaljer",
|
||||||
"HeaderMatch": "Matcha",
|
"HeaderMatch": "Matcha",
|
||||||
@ -154,13 +163,14 @@
|
|||||||
"HeaderSettingsExperimental": "Experimentella funktioner",
|
"HeaderSettingsExperimental": "Experimentella funktioner",
|
||||||
"HeaderSettingsGeneral": "Allmänt",
|
"HeaderSettingsGeneral": "Allmänt",
|
||||||
"HeaderSettingsScanner": "Skanner",
|
"HeaderSettingsScanner": "Skanner",
|
||||||
|
"HeaderSettingsWebClient": "Webklient",
|
||||||
"HeaderSleepTimer": "Sovtidtagare",
|
"HeaderSleepTimer": "Sovtidtagare",
|
||||||
"HeaderStatsLargestItems": "Största föremål",
|
"HeaderStatsLargestItems": "Största objekt",
|
||||||
"HeaderStatsLongestItems": "Längsta föremål (tim)",
|
"HeaderStatsLongestItems": "Längsta objekt (tim)",
|
||||||
"HeaderStatsMinutesListeningChart": "Minuters lyssning (senaste 7 dagar)",
|
"HeaderStatsMinutesListeningChart": "Minuters lyssning (senaste 7 dagar)",
|
||||||
"HeaderStatsRecentSessions": "Senaste sessioner",
|
"HeaderStatsRecentSessions": "Senaste sessioner",
|
||||||
"HeaderStatsTop10Authors": "Topp 10 författare",
|
"HeaderStatsTop10Authors": "10 populäraste författarna",
|
||||||
"HeaderStatsTop5Genres": "Topp 5 genrer",
|
"HeaderStatsTop5Genres": "5 populäraste kategorierna",
|
||||||
"HeaderTableOfContents": "Innehållsförteckning",
|
"HeaderTableOfContents": "Innehållsförteckning",
|
||||||
"HeaderTools": "Verktyg",
|
"HeaderTools": "Verktyg",
|
||||||
"HeaderUpdateAccount": "Uppdatera konto",
|
"HeaderUpdateAccount": "Uppdatera konto",
|
||||||
@ -168,7 +178,8 @@
|
|||||||
"HeaderUpdateDetails": "Uppdatera detaljer",
|
"HeaderUpdateDetails": "Uppdatera detaljer",
|
||||||
"HeaderUpdateLibrary": "Uppdatera bibliotek",
|
"HeaderUpdateLibrary": "Uppdatera bibliotek",
|
||||||
"HeaderUsers": "Användare",
|
"HeaderUsers": "Användare",
|
||||||
"HeaderYourStats": "Dina statistik",
|
"HeaderYearReview": "Sammanställning för {0}",
|
||||||
|
"HeaderYourStats": "Din statistik",
|
||||||
"LabelAbridged": "Förkortad",
|
"LabelAbridged": "Förkortad",
|
||||||
"LabelAccountType": "Kontotyp",
|
"LabelAccountType": "Kontotyp",
|
||||||
"LabelAccountTypeGuest": "Gäst",
|
"LabelAccountTypeGuest": "Gäst",
|
||||||
@ -191,18 +202,23 @@
|
|||||||
"LabelAuthorLastFirst": "Författare (Efternamn, Förnamn)",
|
"LabelAuthorLastFirst": "Författare (Efternamn, Förnamn)",
|
||||||
"LabelAuthors": "Författare",
|
"LabelAuthors": "Författare",
|
||||||
"LabelAutoDownloadEpisodes": "Automatisk nedladdning av avsnitt",
|
"LabelAutoDownloadEpisodes": "Automatisk nedladdning av avsnitt",
|
||||||
|
"LabelAutoFetchMetadata": "Automatisk nedladdning av metadata",
|
||||||
|
"LabelAutoFetchMetadataHelp": "Hämtar metadata för titel, författare och serier. Kompletterande metadata får adderas efter uppladdningen.",
|
||||||
"LabelBackToUser": "Tillbaka till användaren",
|
"LabelBackToUser": "Tillbaka till användaren",
|
||||||
"LabelBackupLocation": "Säkerhetskopia Plats",
|
"LabelBackupLocation": "Plats för säkerhetskopia",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Aktivera automatiska säkerhetskopior",
|
"LabelBackupsEnableAutomaticBackups": "Aktivera automatiska säkerhetskopior",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Säkerhetskopior sparas i /metadata/säkerhetskopior",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Säkerhetskopior sparas i \"/metadata/backups\"",
|
||||||
"LabelBackupsMaxBackupSize": "Maximal säkerhetskopiostorlek (i GB)",
|
"LabelBackupsMaxBackupSize": "Maximal storlek på säkerhetskopia (i GB) (0 = obegränsad)",
|
||||||
"LabelBackupsMaxBackupSizeHelp": "Som ett skydd mot felkonfiguration kommer säkerhetskopior att misslyckas om de överskrider den konfigurerade storleken.",
|
"LabelBackupsMaxBackupSizeHelp": "Som ett skydd mot felkonfiguration kommer säkerhetskopior att misslyckas om de överskrider den konfigurerade storleken.",
|
||||||
"LabelBackupsNumberToKeep": "Antal säkerhetskopior att behålla",
|
"LabelBackupsNumberToKeep": "Antal säkerhetskopior att behålla",
|
||||||
"LabelBackupsNumberToKeepHelp": "Endast en säkerhetskopia tas bort åt gången, så om du redan har fler säkerhetskopior än detta bör du ta bort dem manuellt.",
|
"LabelBackupsNumberToKeepHelp": "Endast en säkerhetskopia tas bort åt gången, så om du redan har fler säkerhetskopior än detta bör du ta bort dem manuellt.",
|
||||||
"LabelBitrate": "Bitfrekvens",
|
"LabelBitrate": "Bitfrekvens",
|
||||||
"LabelBooks": "Böcker",
|
"LabelBooks": "Böcker",
|
||||||
|
"LabelButtonText": "Knapptext",
|
||||||
|
"LabelByAuthor": "av {0}",
|
||||||
"LabelChangePassword": "Ändra lösenord",
|
"LabelChangePassword": "Ändra lösenord",
|
||||||
"LabelChannels": "Kanaler",
|
"LabelChannels": "Kanaler",
|
||||||
|
"LabelChapterCount": "{0} kapitel",
|
||||||
"LabelChapterTitle": "Kapitelrubrik",
|
"LabelChapterTitle": "Kapitelrubrik",
|
||||||
"LabelChapters": "Kapitel",
|
"LabelChapters": "Kapitel",
|
||||||
"LabelChaptersFound": "hittade kapitel",
|
"LabelChaptersFound": "hittade kapitel",
|
||||||
@ -215,7 +231,7 @@
|
|||||||
"LabelConfirmPassword": "Bekräfta lösenord",
|
"LabelConfirmPassword": "Bekräfta lösenord",
|
||||||
"LabelContinueListening": "Fortsätt Lyssna",
|
"LabelContinueListening": "Fortsätt Lyssna",
|
||||||
"LabelContinueReading": "Fortsätt Läsa",
|
"LabelContinueReading": "Fortsätt Läsa",
|
||||||
"LabelContinueSeries": "Forsätt Serie",
|
"LabelContinueSeries": "Fortsätt Serie",
|
||||||
"LabelCover": "Omslag",
|
"LabelCover": "Omslag",
|
||||||
"LabelCoverImageURL": "URL till omslagsbild",
|
"LabelCoverImageURL": "URL till omslagsbild",
|
||||||
"LabelCreatedAt": "Skapad vid",
|
"LabelCreatedAt": "Skapad vid",
|
||||||
@ -267,8 +283,8 @@
|
|||||||
"LabelFontBoldness": "Fetstil",
|
"LabelFontBoldness": "Fetstil",
|
||||||
"LabelFontFamily": "Teckensnittsfamilj",
|
"LabelFontFamily": "Teckensnittsfamilj",
|
||||||
"LabelFontScale": "Teckensnittsskala",
|
"LabelFontScale": "Teckensnittsskala",
|
||||||
"LabelGenre": "Genre",
|
"LabelGenre": "Kategori",
|
||||||
"LabelGenres": "Genrer",
|
"LabelGenres": "Kategorier",
|
||||||
"LabelHardDeleteFile": "Hård radering av fil",
|
"LabelHardDeleteFile": "Hård radering av fil",
|
||||||
"LabelHasEbook": "Har E-bok",
|
"LabelHasEbook": "Har E-bok",
|
||||||
"LabelHasSupplementaryEbook": "Har komplimenterande E-bok",
|
"LabelHasSupplementaryEbook": "Har komplimenterande E-bok",
|
||||||
@ -316,19 +332,19 @@
|
|||||||
"LabelMediaType": "Mediatyp",
|
"LabelMediaType": "Mediatyp",
|
||||||
"LabelMetaTag": "Metamärke",
|
"LabelMetaTag": "Metamärke",
|
||||||
"LabelMetaTags": "Metamärken",
|
"LabelMetaTags": "Metamärken",
|
||||||
"LabelMetadataProvider": "Metadataleverantör",
|
"LabelMetadataProvider": "Källa för metadata",
|
||||||
"LabelMinute": "Minut",
|
"LabelMinute": "Minut",
|
||||||
"LabelMissing": "Saknad",
|
"LabelMissing": "Saknad",
|
||||||
"LabelMore": "Mer",
|
"LabelMore": "Mer",
|
||||||
"LabelMoreInfo": "Mer information",
|
"LabelMoreInfo": "Mer information",
|
||||||
"LabelName": "Namn",
|
"LabelName": "Namn",
|
||||||
"LabelNarrator": "Berättare",
|
"LabelNarrator": "Uppläsare",
|
||||||
"LabelNarrators": "Berättare",
|
"LabelNarrators": "Uppläsare",
|
||||||
"LabelNew": "Ny",
|
"LabelNew": "Ny",
|
||||||
"LabelNewPassword": "Nytt lösenord",
|
"LabelNewPassword": "Nytt lösenord",
|
||||||
"LabelNewestAuthors": "Senast tillagda författare",
|
"LabelNewestAuthors": "Senast tillagda författare",
|
||||||
"LabelNewestEpisodes": "Senast tillagda avsnitt",
|
"LabelNewestEpisodes": "Senast tillagda avsnitt",
|
||||||
"LabelNextBackupDate": "Nästa säkerhetskopia datum",
|
"LabelNextBackupDate": "Nästa datum för säkerhetskopia",
|
||||||
"LabelNextScheduledRun": "Nästa schemalagda körning",
|
"LabelNextScheduledRun": "Nästa schemalagda körning",
|
||||||
"LabelNoEpisodesSelected": "Inga avsnitt valda",
|
"LabelNoEpisodesSelected": "Inga avsnitt valda",
|
||||||
"LabelNotFinished": "Ej avslutad",
|
"LabelNotFinished": "Ej avslutad",
|
||||||
@ -367,7 +383,7 @@
|
|||||||
"LabelPreventIndexing": "Förhindra att ditt flöde indexeras av iTunes och Google-podcastsökmotorer",
|
"LabelPreventIndexing": "Förhindra att ditt flöde indexeras av iTunes och Google-podcastsökmotorer",
|
||||||
"LabelPrimaryEbook": "Primär e-bok",
|
"LabelPrimaryEbook": "Primär e-bok",
|
||||||
"LabelProgress": "Framsteg",
|
"LabelProgress": "Framsteg",
|
||||||
"LabelProvider": "Leverantör",
|
"LabelProvider": "Källa",
|
||||||
"LabelPubDate": "Publiceringsdatum",
|
"LabelPubDate": "Publiceringsdatum",
|
||||||
"LabelPublishYear": "Publiceringsår",
|
"LabelPublishYear": "Publiceringsår",
|
||||||
"LabelPublisher": "Utgivare",
|
"LabelPublisher": "Utgivare",
|
||||||
@ -388,14 +404,14 @@
|
|||||||
"LabelRemoveCover": "Ta bort omslag",
|
"LabelRemoveCover": "Ta bort omslag",
|
||||||
"LabelSearchTerm": "Sökterm",
|
"LabelSearchTerm": "Sökterm",
|
||||||
"LabelSearchTitle": "Sök titel",
|
"LabelSearchTitle": "Sök titel",
|
||||||
"LabelSearchTitleOrASIN": "Sök titel eller ASIN",
|
"LabelSearchTitleOrASIN": "Sök titel eller ASIN-kod",
|
||||||
"LabelSeason": "Säsong",
|
"LabelSeason": "Säsong",
|
||||||
"LabelSelectAllEpisodes": "Välj alla avsnitt",
|
"LabelSelectAllEpisodes": "Välj alla avsnitt",
|
||||||
"LabelSelectEpisodesShowing": "Välj {0} avsnitt som visas",
|
"LabelSelectEpisodesShowing": "Välj {0} avsnitt som visas",
|
||||||
"LabelSelectUsers": "Välj användare",
|
"LabelSelectUsers": "Välj användare",
|
||||||
"LabelSendEbookToDevice": "Skicka e-bok till...",
|
"LabelSendEbookToDevice": "Skicka e-bok till...",
|
||||||
"LabelSequence": "Sekvens",
|
"LabelSequence": "Sekvens",
|
||||||
"LabelSeries": "Serie",
|
"LabelSeries": "Serier",
|
||||||
"LabelSeriesName": "Serienamn",
|
"LabelSeriesName": "Serienamn",
|
||||||
"LabelSeriesProgress": "Serieframsteg",
|
"LabelSeriesProgress": "Serieframsteg",
|
||||||
"LabelSetEbookAsPrimary": "Ange som primär",
|
"LabelSetEbookAsPrimary": "Ange som primär",
|
||||||
@ -403,7 +419,7 @@
|
|||||||
"LabelSettingsAudiobooksOnly": "Endast ljudböcker",
|
"LabelSettingsAudiobooksOnly": "Endast ljudböcker",
|
||||||
"LabelSettingsAudiobooksOnlyHelp": "Aktivera detta alternativ kommer att ignorera e-boksfiler om de inte finns inom en ljudboksmapp, i vilket fall de kommer att anges som kompletterande e-böcker",
|
"LabelSettingsAudiobooksOnlyHelp": "Aktivera detta alternativ kommer att ignorera e-boksfiler om de inte finns inom en ljudboksmapp, i vilket fall de kommer att anges som kompletterande e-böcker",
|
||||||
"LabelSettingsBookshelfViewHelp": "Skeumorfisk design med trähyllor",
|
"LabelSettingsBookshelfViewHelp": "Skeumorfisk design med trähyllor",
|
||||||
"LabelSettingsChromecastSupport": "Chromecast-stöd",
|
"LabelSettingsChromecastSupport": "Stöd för Chromecast",
|
||||||
"LabelSettingsDateFormat": "Datumformat",
|
"LabelSettingsDateFormat": "Datumformat",
|
||||||
"LabelSettingsDisableWatcher": "Inaktivera Watcher",
|
"LabelSettingsDisableWatcher": "Inaktivera Watcher",
|
||||||
"LabelSettingsDisableWatcherForLibrary": "Inaktivera mappbevakning för bibliotek",
|
"LabelSettingsDisableWatcherForLibrary": "Inaktivera mappbevakning för bibliotek",
|
||||||
@ -415,24 +431,24 @@
|
|||||||
"LabelSettingsExperimentalFeaturesHelp": "Funktioner under utveckling som behöver din feedback och hjälp med testning. Klicka för att öppna diskussionen på GitHub.",
|
"LabelSettingsExperimentalFeaturesHelp": "Funktioner under utveckling som behöver din feedback och hjälp med testning. Klicka för att öppna diskussionen på GitHub.",
|
||||||
"LabelSettingsFindCovers": "Hitta omslag",
|
"LabelSettingsFindCovers": "Hitta omslag",
|
||||||
"LabelSettingsFindCoversHelp": "Om din ljudbok inte har ett inbäddat omslag eller en omslagsbild i mappen kommer skannern att försöka hitta ett omslag.<br>Observera: Detta kommer att förlänga skannningstiden",
|
"LabelSettingsFindCoversHelp": "Om din ljudbok inte har ett inbäddat omslag eller en omslagsbild i mappen kommer skannern att försöka hitta ett omslag.<br>Observera: Detta kommer att förlänga skannningstiden",
|
||||||
"LabelSettingsHideSingleBookSeries": "Dölj enboksserier",
|
"LabelSettingsHideSingleBookSeries": "Dölj serier med en bok",
|
||||||
"LabelSettingsHideSingleBookSeriesHelp": "Serier som har en enda bok kommer att döljas från seriesidan och hyllsidan på startsidan.",
|
"LabelSettingsHideSingleBookSeriesHelp": "Serier som har en enda bok kommer att döljas från seriesidan och hyllsidan på startsidan.",
|
||||||
"LabelSettingsHomePageBookshelfView": "Startsida använd bokhyllvy",
|
"LabelSettingsHomePageBookshelfView": "Startsida använd bokhyllvy",
|
||||||
"LabelSettingsLibraryBookshelfView": "Bibliotek använd bokhyllvy",
|
"LabelSettingsLibraryBookshelfView": "Bibliotek använd bokhyllvy",
|
||||||
"LabelSettingsParseSubtitles": "Analysera undertexter",
|
"LabelSettingsParseSubtitles": "Analysera undertexter",
|
||||||
"LabelSettingsParseSubtitlesHelp": "Extrahera undertexter från mappnamn för ljudböcker.<br>Undertext måste vara åtskilda av \" - \"<br>t.ex. \"Boktitel - En undertitel här\" har undertiteln \"En undertitel här\"",
|
"LabelSettingsParseSubtitlesHelp": "Extrahera undertitlar från namnet på mappar för ljudböcker.<br>Undertiteln måste vara åtskilda med ett bindestreck \" - \".<br>Mappen \"Boktitel - En undertitel här\" har undertiteln \"En undertitel här\"",
|
||||||
"LabelSettingsPreferMatchedMetadata": "Föredra matchad metadata",
|
"LabelSettingsPreferMatchedMetadata": "Föredra matchad metadata",
|
||||||
"LabelSettingsPreferMatchedMetadataHelp": "Matchad data kommer att åsidosätta objektdetaljer vid snabbmatchning. Som standard kommer snabbmatchning endast att fylla i saknade detaljer.",
|
"LabelSettingsPreferMatchedMetadataHelp": "Matchad data kommer att åsidosätta objektdetaljer vid snabbmatchning. Som standard kommer snabbmatchning endast att fylla i saknade detaljer.",
|
||||||
"LabelSettingsSkipMatchingBooksWithASIN": "Hoppa över matchande böcker med ASIN",
|
"LabelSettingsSkipMatchingBooksWithASIN": "Hoppa över matchande böcker med ASIN-kod",
|
||||||
"LabelSettingsSkipMatchingBooksWithISBN": "Hoppa över matchande böcker med ISBN",
|
"LabelSettingsSkipMatchingBooksWithISBN": "Hoppa över matchande böcker med ISBN",
|
||||||
"LabelSettingsSortingIgnorePrefixes": "Ignorera prefix vid sortering",
|
"LabelSettingsSortingIgnorePrefixes": "Ignorera prefix vid sortering",
|
||||||
"LabelSettingsSortingIgnorePrefixesHelp": "t.ex. för prefixet \"the\" kommer boktiteln \"The Book Title\" att sorteras som \"Book Title, The\"",
|
"LabelSettingsSortingIgnorePrefixesHelp": "För prefix som t.ex. \"the\" kommer boktiteln \"The Book Title\" att sorteras som \"Book Title, The\"",
|
||||||
"LabelSettingsSquareBookCovers": "Använd fyrkantiga bokomslag",
|
"LabelSettingsSquareBookCovers": "Använd fyrkantiga bokomslag",
|
||||||
"LabelSettingsSquareBookCoversHelp": "Föredrar att använda fyrkantiga omslag över standard 1.6:1 bokomslag",
|
"LabelSettingsSquareBookCoversHelp": "Föredrar att använda fyrkantiga omslag över standard 1.6:1 bokomslag",
|
||||||
"LabelSettingsStoreCoversWithItem": "Lagra omslag med objekt",
|
"LabelSettingsStoreCoversWithItem": "Lagra omslag med objekt",
|
||||||
"LabelSettingsStoreCoversWithItemHelp": "Som standard lagras omslag i /metadata/items, att aktivera detta alternativ kommer att lagra omslag i din biblioteksmapp. Endast en fil med namnet \"cover\" kommer att behållas",
|
"LabelSettingsStoreCoversWithItemHelp": "Som standard lagras bokomslag i mappen /metadata/items. Genom att aktivera detta alternativ kommer omslagen att lagra i din biblioteksmapp. Endast en fil med namnet \"cover\" kommer att behållas",
|
||||||
"LabelSettingsStoreMetadataWithItem": "Lagra metadata med objekt",
|
"LabelSettingsStoreMetadataWithItem": "Lagra metadata med objekt",
|
||||||
"LabelSettingsStoreMetadataWithItemHelp": "Som standard lagras metadatafiler i /metadata/items, att aktivera detta alternativ kommer att lagra metadatafiler i dina biblioteksmappar",
|
"LabelSettingsStoreMetadataWithItemHelp": "Som standard lagras metadatafiler i mappen /metadata/items. Genom att aktivera detta alternativ kommer metadatafilerna att lagras i dina biblioteksmappar",
|
||||||
"LabelSettingsTimeFormat": "Tidsformat",
|
"LabelSettingsTimeFormat": "Tidsformat",
|
||||||
"LabelShowAll": "Visa alla",
|
"LabelShowAll": "Visa alla",
|
||||||
"LabelSize": "Storlek",
|
"LabelSize": "Storlek",
|
||||||
@ -457,7 +473,7 @@
|
|||||||
"LabelStatsOverallHours": "Totalt antal timmar",
|
"LabelStatsOverallHours": "Totalt antal timmar",
|
||||||
"LabelStatsWeekListening": "Veckans lyssnande",
|
"LabelStatsWeekListening": "Veckans lyssnande",
|
||||||
"LabelSubtitle": "Underrubrik",
|
"LabelSubtitle": "Underrubrik",
|
||||||
"LabelSupportedFileTypes": "Stödda filtyper",
|
"LabelSupportedFileTypes": "Filtyper som accepteras",
|
||||||
"LabelTag": "Tagg",
|
"LabelTag": "Tagg",
|
||||||
"LabelTags": "Taggar",
|
"LabelTags": "Taggar",
|
||||||
"LabelTagsAccessibleToUser": "Taggar tillgängliga för användaren",
|
"LabelTagsAccessibleToUser": "Taggar tillgängliga för användaren",
|
||||||
@ -467,17 +483,22 @@
|
|||||||
"LabelThemeDark": "Mörkt",
|
"LabelThemeDark": "Mörkt",
|
||||||
"LabelThemeLight": "Ljust",
|
"LabelThemeLight": "Ljust",
|
||||||
"LabelTimeBase": "Tidsbas",
|
"LabelTimeBase": "Tidsbas",
|
||||||
|
"LabelTimeDurationXHours": "{0} timmar",
|
||||||
|
"LabelTimeDurationXMinutes": "{0} minuter",
|
||||||
|
"LabelTimeDurationXSeconds": "{0} sekunder",
|
||||||
|
"LabelTimeInMinutes": "Tid i minuter",
|
||||||
|
"LabelTimeLeft": "{0} återstår",
|
||||||
"LabelTimeListened": "Tid lyssnad",
|
"LabelTimeListened": "Tid lyssnad",
|
||||||
"LabelTimeListenedToday": "Tid lyssnad idag",
|
"LabelTimeListenedToday": "Tid lyssnad idag",
|
||||||
"LabelTimeRemaining": "{0} kvar",
|
"LabelTimeRemaining": "{0} återstår",
|
||||||
"LabelTimeToShift": "Tid att skifta i sekunder",
|
"LabelTimeToShift": "Tid att skifta i sekunder",
|
||||||
"LabelTitle": "Titel",
|
"LabelTitle": "Titel",
|
||||||
"LabelToolsEmbedMetadata": "Bädda in metadata",
|
"LabelToolsEmbedMetadata": "Bädda in metadata",
|
||||||
"LabelToolsEmbedMetadataDescription": "Bädda in metadata i ljudfiler, inklusive omslagsbild och kapitel.",
|
"LabelToolsEmbedMetadataDescription": "Bädda in metadata i ljudfiler, inklusive omslagsbild och kapitel.",
|
||||||
"LabelToolsMakeM4b": "Skapa M4B ljudbok",
|
"LabelToolsMakeM4b": "Skapa M4B ljudbok",
|
||||||
"LabelToolsMakeM4bDescription": "Skapa en .M4B ljudboksfil med inbäddad metadata, omslagsbild och kapitel.",
|
"LabelToolsMakeM4bDescription": "Skapa en .M4B ljudboksfil med inbäddad metadata, omslagsbild och kapitel.",
|
||||||
"LabelToolsSplitM4b": "Dela M4B till MP3-filer",
|
"LabelToolsSplitM4b": "Dela upp M4B-fil i MP3-filer",
|
||||||
"LabelToolsSplitM4bDescription": "Skapa MP3-filer från en M4B fil uppdelad i kapitel med inbäddad metadata, omslagsbild och kapitel.",
|
"LabelToolsSplitM4bDescription": "Skapa MP3-filer från en M4B-fil uppdelad i kapitel med inbäddad metadata, omslagsbild och kapitel.",
|
||||||
"LabelTotalDuration": "Total varaktighet",
|
"LabelTotalDuration": "Total varaktighet",
|
||||||
"LabelTotalTimeListened": "Total tid lyssnad",
|
"LabelTotalTimeListened": "Total tid lyssnad",
|
||||||
"LabelTrackFromFilename": "Spår från filnamn",
|
"LabelTrackFromFilename": "Spår från filnamn",
|
||||||
@ -486,6 +507,7 @@
|
|||||||
"LabelTracksMultiTrack": "Flerspårigt",
|
"LabelTracksMultiTrack": "Flerspårigt",
|
||||||
"LabelTracksNone": "Inga spår",
|
"LabelTracksNone": "Inga spår",
|
||||||
"LabelTracksSingleTrack": "Enspårigt",
|
"LabelTracksSingleTrack": "Enspårigt",
|
||||||
|
"LabelTrailer": "Trailer",
|
||||||
"LabelType": "Typ",
|
"LabelType": "Typ",
|
||||||
"LabelUnabridged": "Oavkortad",
|
"LabelUnabridged": "Oavkortad",
|
||||||
"LabelUnknown": "Okänd",
|
"LabelUnknown": "Okänd",
|
||||||
@ -496,16 +518,20 @@
|
|||||||
"LabelUpdatedAt": "Uppdaterad vid",
|
"LabelUpdatedAt": "Uppdaterad vid",
|
||||||
"LabelUploaderDragAndDrop": "Dra och släpp filer eller mappar",
|
"LabelUploaderDragAndDrop": "Dra och släpp filer eller mappar",
|
||||||
"LabelUploaderDropFiles": "Släpp filer",
|
"LabelUploaderDropFiles": "Släpp filer",
|
||||||
|
"LabelUploaderItemFetchMetadataHelp": "Hämtar automatiskt titel, författare och serier.",
|
||||||
"LabelUseChapterTrack": "Använd kapitelspår",
|
"LabelUseChapterTrack": "Använd kapitelspår",
|
||||||
"LabelUseFullTrack": "Använd hela spåret",
|
"LabelUseFullTrack": "Använd hela spåret",
|
||||||
"LabelUser": "Användare",
|
"LabelUser": "Användare",
|
||||||
"LabelUsername": "Användarnamn",
|
"LabelUsername": "Användarnamn",
|
||||||
"LabelValue": "Värde",
|
"LabelValue": "Värde",
|
||||||
|
"LabelVersion": "Version",
|
||||||
"LabelViewBookmarks": "Visa bokmärken",
|
"LabelViewBookmarks": "Visa bokmärken",
|
||||||
"LabelViewChapters": "Visa kapitel",
|
"LabelViewChapters": "Visa kapitel",
|
||||||
"LabelViewQueue": "Visa spellista",
|
"LabelViewQueue": "Visa spellista",
|
||||||
"LabelVolume": "Volym",
|
"LabelVolume": "Volym",
|
||||||
"LabelWeekdaysToRun": "Vardagar att köra",
|
"LabelWeekdaysToRun": "Vardagar att köra",
|
||||||
|
"LabelYearReviewHide": "Dölj sammanställning för året",
|
||||||
|
"LabelYearReviewShow": "Visa sammanställning för året",
|
||||||
"LabelYourAudiobookDuration": "Din ljudboks varaktighet",
|
"LabelYourAudiobookDuration": "Din ljudboks varaktighet",
|
||||||
"LabelYourBookmarks": "Dina bokmärken",
|
"LabelYourBookmarks": "Dina bokmärken",
|
||||||
"LabelYourPlaylists": "Dina spellistor",
|
"LabelYourPlaylists": "Dina spellistor",
|
||||||
@ -535,22 +561,22 @@
|
|||||||
"MessageConfirmMarkAllEpisodesFinished": "Är du säker på att du vill markera alla avsnitt som avslutade?",
|
"MessageConfirmMarkAllEpisodesFinished": "Är du säker på att du vill markera alla avsnitt som avslutade?",
|
||||||
"MessageConfirmMarkAllEpisodesNotFinished": "Är du säker på att du vill markera alla avsnitt som inte avslutade?",
|
"MessageConfirmMarkAllEpisodesNotFinished": "Är du säker på att du vill markera alla avsnitt som inte avslutade?",
|
||||||
"MessageConfirmMarkSeriesFinished": "Är du säker på att du vill markera alla böcker i denna serie som avslutade?",
|
"MessageConfirmMarkSeriesFinished": "Är du säker på att du vill markera alla böcker i denna serie som avslutade?",
|
||||||
"MessageConfirmMarkSeriesNotFinished": "Är du säker på att du vill markera alla böcker i denna serie som inte avslutade?",
|
"MessageConfirmMarkSeriesNotFinished": "Är du säker på att du vill markera alla böcker i denna serie som ej avslutade?",
|
||||||
"MessageConfirmQuickEmbed": "Varning! Quick embed kommer inte att säkerhetskopiera dina ljudfiler. Se till att du har en säkerhetskopia av dina ljudfiler. <br><br>Vill du fortsätta?",
|
"MessageConfirmQuickEmbed": "VARNING! Quick embed kommer inte att säkerhetskopiera dina ljudfiler. Se till att du har en säkerhetskopia av dina ljudfiler. <br><br>Vill du fortsätta?",
|
||||||
"MessageConfirmReScanLibraryItems": "Är du säker på att du vill göra omgenomsökning för {0} objekt?",
|
"MessageConfirmReScanLibraryItems": "Är du säker på att du vill göra omgenomsökning för {0} objekt?",
|
||||||
"MessageConfirmRemoveAllChapters": "Är du säker på att du vill ta bort alla kapitel?",
|
"MessageConfirmRemoveAllChapters": "Är du säker på att du vill ta bort alla kapitel?",
|
||||||
"MessageConfirmRemoveAuthor": "Är du säker på att du vill ta bort författaren \"{0}\"?",
|
"MessageConfirmRemoveAuthor": "Är du säker på att du vill ta bort författaren \"{0}\"?",
|
||||||
"MessageConfirmRemoveCollection": "Är du säker på att du vill ta bort samlingen \"{0}\"?",
|
"MessageConfirmRemoveCollection": "Är du säker på att du vill ta bort samlingen \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisode": "Är du säker på att du vill ta bort avsnittet \"{0}\"?",
|
"MessageConfirmRemoveEpisode": "Är du säker på att du vill ta bort avsnittet \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisodes": "Är du säker på att du vill ta bort {0} avsnitt?",
|
"MessageConfirmRemoveEpisodes": "Är du säker på att du vill ta bort {0} avsnitt?",
|
||||||
"MessageConfirmRemoveNarrator": "Är du säker på att du vill ta bort berättaren \"{0}\"?",
|
"MessageConfirmRemoveNarrator": "Är du säker på att du vill ta bort uppläsaren \"{0}\"?",
|
||||||
"MessageConfirmRemovePlaylist": "Är du säker på att du vill ta bort din spellista \"{0}\"?",
|
"MessageConfirmRemovePlaylist": "Är du säker på att du vill ta bort din spellista \"{0}\"?",
|
||||||
"MessageConfirmRenameGenre": "Är du säker på att du vill byta namn på genren \"{0}\" till \"{1}\" för alla objekt?",
|
"MessageConfirmRenameGenre": "Är du säker på att du vill byta namn på kategori \"{0}\" till \"{1}\" för alla objekt?",
|
||||||
"MessageConfirmRenameGenreMergeNote": "Observera: Den här genren finns redan, så de kommer att slås samman.",
|
"MessageConfirmRenameGenreMergeNote": "OBS: Den här kategorin finns redan, så de kommer att slås samman.",
|
||||||
"MessageConfirmRenameGenreWarning": "Varning! En liknande genre med annat skrivsätt finns redan \"{0}\".",
|
"MessageConfirmRenameGenreWarning": "Varning! En liknande kategori med annat skrivsätt finns redan \"{0}\".",
|
||||||
"MessageConfirmRenameTag": "Är du säker på att du vill byta namn på taggen \"{0}\" till \"{1}\" för alla objekt?",
|
"MessageConfirmRenameTag": "Är du säker på att du vill byta namn på taggen \"{0}\" till \"{1}\" för alla objekt?",
|
||||||
"MessageConfirmRenameTagMergeNote": "Observera: Den här taggen finns redan, så de kommer att slås samman.",
|
"MessageConfirmRenameTagMergeNote": "OBS: Den här taggen finns redan, så de kommer att slås samman.",
|
||||||
"MessageConfirmRenameTagWarning": "Varning! En liknande tagg med annat skrivsätt finns redan \"{0}\".",
|
"MessageConfirmRenameTagWarning": "VARNING! En liknande tagg med annat skrivsätt finns redan \"{0}\".",
|
||||||
"MessageConfirmSendEbookToDevice": "Är du säker på att du vill skicka {0} e-bok \"{1}\" till enheten \"{2}\"?",
|
"MessageConfirmSendEbookToDevice": "Är du säker på att du vill skicka {0} e-bok \"{1}\" till enheten \"{2}\"?",
|
||||||
"MessageDownloadingEpisode": "Laddar ner avsnitt",
|
"MessageDownloadingEpisode": "Laddar ner avsnitt",
|
||||||
"MessageDragFilesIntoTrackOrder": "Dra filer till rätt spårordning",
|
"MessageDragFilesIntoTrackOrder": "Dra filer till rätt spårordning",
|
||||||
@ -574,7 +600,7 @@
|
|||||||
"MessageMarkAllEpisodesNotFinished": "Markera alla avsnitt som inte avslutade",
|
"MessageMarkAllEpisodesNotFinished": "Markera alla avsnitt som inte avslutade",
|
||||||
"MessageMarkAsFinished": "Markera som avslutad",
|
"MessageMarkAsFinished": "Markera som avslutad",
|
||||||
"MessageMarkAsNotFinished": "Markera som inte avslutad",
|
"MessageMarkAsNotFinished": "Markera som inte avslutad",
|
||||||
"MessageMatchBooksDescription": "kommer att försöka matcha böcker i biblioteket med en bok från den valda sökleverantören och fylla i tomma detaljer och omslagskonst. Överskriver inte detaljer.",
|
"MessageMatchBooksDescription": "kommer att försöka matcha böcker i biblioteket med en bok från den valda källan och fylla i uppgifter som saknas och bokomslag. Inga befintliga uppgifter kommer att ersättas.",
|
||||||
"MessageNoAudioTracks": "Inga ljudspår",
|
"MessageNoAudioTracks": "Inga ljudspår",
|
||||||
"MessageNoAuthors": "Inga författare",
|
"MessageNoAuthors": "Inga författare",
|
||||||
"MessageNoBackups": "Inga säkerhetskopior",
|
"MessageNoBackups": "Inga säkerhetskopior",
|
||||||
@ -588,7 +614,7 @@
|
|||||||
"MessageNoEpisodeMatchesFound": "Inga matchande avsnitt hittades",
|
"MessageNoEpisodeMatchesFound": "Inga matchande avsnitt hittades",
|
||||||
"MessageNoEpisodes": "Inga avsnitt",
|
"MessageNoEpisodes": "Inga avsnitt",
|
||||||
"MessageNoFoldersAvailable": "Inga mappar tillgängliga",
|
"MessageNoFoldersAvailable": "Inga mappar tillgängliga",
|
||||||
"MessageNoGenres": "Inga genrer",
|
"MessageNoGenres": "Inga kategorier",
|
||||||
"MessageNoIssues": "Inga problem",
|
"MessageNoIssues": "Inga problem",
|
||||||
"MessageNoItems": "Inga objekt",
|
"MessageNoItems": "Inga objekt",
|
||||||
"MessageNoItemsFound": "Inga objekt hittades",
|
"MessageNoItemsFound": "Inga objekt hittades",
|
||||||
@ -637,7 +663,7 @@
|
|||||||
"NoteFolderPicker": "Obs: Mappar som redan är kartlagda kommer inte att visas",
|
"NoteFolderPicker": "Obs: Mappar som redan är kartlagda kommer inte att visas",
|
||||||
"NoteRSSFeedPodcastAppsHttps": "Varning: De flesta podcastappar kräver att RSS-flödets URL används med HTTPS",
|
"NoteRSSFeedPodcastAppsHttps": "Varning: De flesta podcastappar kräver att RSS-flödets URL används med HTTPS",
|
||||||
"NoteRSSFeedPodcastAppsPubDate": "Varning: 1 eller flera av dina avsnitt har inte ett publiceringsdatum. Vissa podcastappar kräver detta.",
|
"NoteRSSFeedPodcastAppsPubDate": "Varning: 1 eller flera av dina avsnitt har inte ett publiceringsdatum. Vissa podcastappar kräver detta.",
|
||||||
"NoteUploaderFoldersWithMediaFiles": "Mappar med mediefiler hanteras som separata biblioteksobjekt.",
|
"NoteUploaderFoldersWithMediaFiles": "Mappar med flera mediefiler hanteras som separata objekt i biblioteket.",
|
||||||
"NoteUploaderOnlyAudioFiles": "Om du bara laddar upp ljudfiler kommer varje ljudfil att hanteras som en separat ljudbok.",
|
"NoteUploaderOnlyAudioFiles": "Om du bara laddar upp ljudfiler kommer varje ljudfil att hanteras som en separat ljudbok.",
|
||||||
"NoteUploaderUnsupportedFiles": "Oaccepterade filer ignoreras. När du väljer eller släpper en mapp ignoreras andra filer som inte finns i ett objektmapp.",
|
"NoteUploaderUnsupportedFiles": "Oaccepterade filer ignoreras. När du väljer eller släpper en mapp ignoreras andra filer som inte finns i ett objektmapp.",
|
||||||
"PlaceholderNewCollection": "Nytt samlingsnamn",
|
"PlaceholderNewCollection": "Nytt samlingsnamn",
|
||||||
@ -645,29 +671,43 @@
|
|||||||
"PlaceholderNewPlaylist": "Nytt spellistanamn",
|
"PlaceholderNewPlaylist": "Nytt spellistanamn",
|
||||||
"PlaceholderSearch": "Sök...",
|
"PlaceholderSearch": "Sök...",
|
||||||
"PlaceholderSearchEpisode": "Sök avsnitt...",
|
"PlaceholderSearchEpisode": "Sök avsnitt...",
|
||||||
|
"StatsTopAuthor": "POPULÄRAST FÖRFATTAREN",
|
||||||
|
"StatsTopAuthors": "POPULÄRASTE FÖRFATTARNA",
|
||||||
|
"StatsTopGenre": "Populäraste kategorin",
|
||||||
|
"StatsTopGenres": "Populäraste kategorierna",
|
||||||
|
"StatsTopMonth": "Bästa månaden",
|
||||||
|
"StatsTopNarrator": "Populärast uppläsarna",
|
||||||
|
"StatsTopNarrators": "Populäraste uppläsaren",
|
||||||
|
"StatsYearInReview": "SAMMANSTÄLLNING AV ÅRET",
|
||||||
"ToastAccountUpdateSuccess": "Kontot uppdaterat",
|
"ToastAccountUpdateSuccess": "Kontot uppdaterat",
|
||||||
|
"ToastAsinRequired": "En ASIN-kod krävs",
|
||||||
"ToastAuthorImageRemoveSuccess": "Författarens bild borttagen",
|
"ToastAuthorImageRemoveSuccess": "Författarens bild borttagen",
|
||||||
|
"ToastAuthorNotFound": "Författaren \"{0}\" kunde inte identifieras",
|
||||||
|
"ToastAuthorRemoveSuccess": "Författaren har raderats",
|
||||||
|
"ToastAuthorSearchNotFound": "Författaren kunde inte identifieras",
|
||||||
"ToastAuthorUpdateMerged": "Författaren sammanslagen",
|
"ToastAuthorUpdateMerged": "Författaren sammanslagen",
|
||||||
"ToastAuthorUpdateSuccess": "Författaren uppdaterad",
|
"ToastAuthorUpdateSuccess": "Författaren uppdaterad",
|
||||||
"ToastAuthorUpdateSuccessNoImageFound": "Författaren uppdaterad (ingen bild hittad)",
|
"ToastAuthorUpdateSuccessNoImageFound": "Författaren uppdaterad (ingen bild hittad)",
|
||||||
"ToastBackupCreateFailed": "Det gick inte att skapa en säkerhetskopia",
|
"ToastBackupCreateFailed": "Det gick inte att skapa en säkerhetskopia",
|
||||||
"ToastBackupCreateSuccess": "Säkerhetskopia skapad",
|
"ToastBackupCreateSuccess": "Säkerhetskopian har skapats",
|
||||||
"ToastBackupDeleteFailed": "Det gick inte att ta bort säkerhetskopian",
|
"ToastBackupDeleteFailed": "Det gick inte att radera säkerhetskopian",
|
||||||
"ToastBackupDeleteSuccess": "Säkerhetskopan borttagen",
|
"ToastBackupDeleteSuccess": "Säkerhetskopian har raderats",
|
||||||
"ToastBackupRestoreFailed": "Det gick inte att återställa säkerhetskopan",
|
"ToastBackupInvalidMaxKeep": "Felaktigt antal kopior av backup har angivits",
|
||||||
"ToastBackupUploadFailed": "Det gick inte att ladda upp säkerhetskopan",
|
"ToastBackupInvalidMaxSize": "Felaktig storlek på backup har angivits",
|
||||||
"ToastBackupUploadSuccess": "Säkerhetskopan uppladdad",
|
"ToastBackupRestoreFailed": "Det gick inte att återställa säkerhetskopian",
|
||||||
|
"ToastBackupUploadFailed": "Det gick inte att ladda upp säkerhetskopian",
|
||||||
|
"ToastBackupUploadSuccess": "Säkerhetskopian uppladdad",
|
||||||
"ToastBatchUpdateFailed": "Batchuppdateringen misslyckades",
|
"ToastBatchUpdateFailed": "Batchuppdateringen misslyckades",
|
||||||
"ToastBatchUpdateSuccess": "Batchuppdateringen lyckades",
|
"ToastBatchUpdateSuccess": "Batchuppdateringen lyckades",
|
||||||
"ToastBookmarkCreateFailed": "Det gick inte att skapa bokmärket",
|
"ToastBookmarkCreateFailed": "Det gick inte att skapa bokmärket",
|
||||||
"ToastBookmarkCreateSuccess": "Bokmärket tillagt",
|
"ToastBookmarkCreateSuccess": "Bokmärket har adderats",
|
||||||
"ToastBookmarkRemoveSuccess": "Bokmärket borttaget",
|
"ToastBookmarkRemoveSuccess": "Bokmärket har raderats",
|
||||||
"ToastBookmarkUpdateSuccess": "Bokmärket uppdaterat",
|
"ToastBookmarkUpdateSuccess": "Bokmärket har uppdaterats",
|
||||||
"ToastChaptersHaveErrors": "Kapitlen har fel",
|
"ToastChaptersHaveErrors": "Kapitlen har fel",
|
||||||
"ToastChaptersMustHaveTitles": "Kapitel måste ha titlar",
|
"ToastChaptersMustHaveTitles": "Kapitel måste ha titlar",
|
||||||
"ToastCollectionItemsRemoveSuccess": "Objekt borttagna från samlingen",
|
"ToastCollectionItemsRemoveSuccess": "Objekt borttagna från samlingen",
|
||||||
"ToastCollectionRemoveSuccess": "Samlingen borttagen",
|
"ToastCollectionRemoveSuccess": "Samlingen har raderats",
|
||||||
"ToastCollectionUpdateSuccess": "Samlingen uppdaterad",
|
"ToastCollectionUpdateSuccess": "Samlingen har uppdaterats",
|
||||||
"ToastItemCoverUpdateSuccess": "Objektets omslag uppdaterat",
|
"ToastItemCoverUpdateSuccess": "Objektets omslag uppdaterat",
|
||||||
"ToastItemDetailsUpdateSuccess": "Objektdetaljer uppdaterade",
|
"ToastItemDetailsUpdateSuccess": "Objektdetaljer uppdaterade",
|
||||||
"ToastItemMarkedAsFinishedFailed": "Misslyckades med att markera som färdig",
|
"ToastItemMarkedAsFinishedFailed": "Misslyckades med att markera som färdig",
|
||||||
@ -693,8 +733,8 @@
|
|||||||
"ToastRemoveItemFromCollectionSuccess": "Objektet borttaget från samlingen",
|
"ToastRemoveItemFromCollectionSuccess": "Objektet borttaget från samlingen",
|
||||||
"ToastSendEbookToDeviceFailed": "Misslyckades med att skicka e-boken till enheten",
|
"ToastSendEbookToDeviceFailed": "Misslyckades med att skicka e-boken till enheten",
|
||||||
"ToastSendEbookToDeviceSuccess": "E-boken skickad till enheten \"{0}\"",
|
"ToastSendEbookToDeviceSuccess": "E-boken skickad till enheten \"{0}\"",
|
||||||
"ToastSeriesUpdateFailed": "Serieuppdateringen misslyckades",
|
"ToastSeriesUpdateFailed": "Uppdateringen av serier misslyckades",
|
||||||
"ToastSeriesUpdateSuccess": "Serieuppdateringen lyckades",
|
"ToastSeriesUpdateSuccess": "Uppdateringen av serierna lyckades",
|
||||||
"ToastSessionDeleteFailed": "Misslyckades med att ta bort sessionen",
|
"ToastSessionDeleteFailed": "Misslyckades med att ta bort sessionen",
|
||||||
"ToastSessionDeleteSuccess": "Sessionen borttagen",
|
"ToastSessionDeleteSuccess": "Sessionen borttagen",
|
||||||
"ToastSocketConnected": "Socket ansluten",
|
"ToastSocketConnected": "Socket ansluten",
|
||||||
|
@ -88,6 +88,8 @@
|
|||||||
"ButtonSaveTracklist": "保存音轨列表",
|
"ButtonSaveTracklist": "保存音轨列表",
|
||||||
"ButtonScan": "扫描",
|
"ButtonScan": "扫描",
|
||||||
"ButtonScanLibrary": "扫描库",
|
"ButtonScanLibrary": "扫描库",
|
||||||
|
"ButtonScrollLeft": "向左滚动",
|
||||||
|
"ButtonScrollRight": "向右滚动",
|
||||||
"ButtonSearch": "查找",
|
"ButtonSearch": "查找",
|
||||||
"ButtonSelectFolderPath": "选择文件夹路径",
|
"ButtonSelectFolderPath": "选择文件夹路径",
|
||||||
"ButtonSeries": "系列",
|
"ButtonSeries": "系列",
|
||||||
@ -190,6 +192,7 @@
|
|||||||
"HeaderSettingsExperimental": "实验功能",
|
"HeaderSettingsExperimental": "实验功能",
|
||||||
"HeaderSettingsGeneral": "通用",
|
"HeaderSettingsGeneral": "通用",
|
||||||
"HeaderSettingsScanner": "扫描",
|
"HeaderSettingsScanner": "扫描",
|
||||||
|
"HeaderSettingsWebClient": "网页客户端",
|
||||||
"HeaderSleepTimer": "睡眠计时",
|
"HeaderSleepTimer": "睡眠计时",
|
||||||
"HeaderStatsLargestItems": "最大的项目",
|
"HeaderStatsLargestItems": "最大的项目",
|
||||||
"HeaderStatsLongestItems": "项目时长(小时)",
|
"HeaderStatsLongestItems": "项目时长(小时)",
|
||||||
@ -542,6 +545,7 @@
|
|||||||
"LabelServerYearReview": "服务器年度回顾 ({0})",
|
"LabelServerYearReview": "服务器年度回顾 ({0})",
|
||||||
"LabelSetEbookAsPrimary": "设置为主",
|
"LabelSetEbookAsPrimary": "设置为主",
|
||||||
"LabelSetEbookAsSupplementary": "设置为补充",
|
"LabelSetEbookAsSupplementary": "设置为补充",
|
||||||
|
"LabelSettingsAllowIframe": "允许嵌入到 iframe 中",
|
||||||
"LabelSettingsAudiobooksOnly": "只有有声读物",
|
"LabelSettingsAudiobooksOnly": "只有有声读物",
|
||||||
"LabelSettingsAudiobooksOnlyHelp": "启用此设置将忽略电子书文件, 除非它们位于有声读物文件夹中, 在这种情况下, 它们将被设置为补充电子书",
|
"LabelSettingsAudiobooksOnlyHelp": "启用此设置将忽略电子书文件, 除非它们位于有声读物文件夹中, 在这种情况下, 它们将被设置为补充电子书",
|
||||||
"LabelSettingsBookshelfViewHelp": "带有木架子的拟物化设计",
|
"LabelSettingsBookshelfViewHelp": "带有木架子的拟物化设计",
|
||||||
@ -592,6 +596,8 @@
|
|||||||
"LabelSize": "文件大小",
|
"LabelSize": "文件大小",
|
||||||
"LabelSleepTimer": "睡眠定时",
|
"LabelSleepTimer": "睡眠定时",
|
||||||
"LabelSlug": "Slug",
|
"LabelSlug": "Slug",
|
||||||
|
"LabelSortAscending": "升序",
|
||||||
|
"LabelSortDescending": "降序",
|
||||||
"LabelStart": "开始",
|
"LabelStart": "开始",
|
||||||
"LabelStartTime": "开始时间",
|
"LabelStartTime": "开始时间",
|
||||||
"LabelStarted": "开始于",
|
"LabelStarted": "开始于",
|
||||||
|
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.17.5",
|
"version": "2.17.6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "2.17.5",
|
"version": "2.17.6",
|
||||||
"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.17.5",
|
"version": "2.17.6",
|
||||||
"buildNumber": 1,
|
"buildNumber": 1,
|
||||||
"description": "Self-hosted audiobook and podcast server",
|
"description": "Self-hosted audiobook and podcast server",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
@ -7,6 +7,7 @@ const Database = require('../Database')
|
|||||||
|
|
||||||
const { PlayMethod } = require('../utils/constants')
|
const { PlayMethod } = require('../utils/constants')
|
||||||
const { getAudioMimeTypeFromExtname, encodeUriPath } = require('../utils/fileUtils')
|
const { getAudioMimeTypeFromExtname, encodeUriPath } = require('../utils/fileUtils')
|
||||||
|
const zipHelpers = require('../utils/zipHelpers')
|
||||||
|
|
||||||
const PlaybackSession = require('../objects/PlaybackSession')
|
const PlaybackSession = require('../objects/PlaybackSession')
|
||||||
const ShareManager = require('../managers/ShareManager')
|
const ShareManager = require('../managers/ShareManager')
|
||||||
@ -210,6 +211,65 @@ class ShareController {
|
|||||||
res.sendFile(audioTrackPath)
|
res.sendFile(audioTrackPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public route - requires share_session_id cookie
|
||||||
|
*
|
||||||
|
* GET: /api/share/:slug/download
|
||||||
|
* Downloads media item share
|
||||||
|
*
|
||||||
|
* @param {Request} req
|
||||||
|
* @param {Response} res
|
||||||
|
*/
|
||||||
|
async downloadMediaItemShare(req, res) {
|
||||||
|
if (!req.cookies.share_session_id) {
|
||||||
|
return res.status(404).send('Share session not set')
|
||||||
|
}
|
||||||
|
|
||||||
|
const { slug } = req.params
|
||||||
|
const mediaItemShare = ShareManager.findBySlug(slug)
|
||||||
|
if (!mediaItemShare) {
|
||||||
|
return res.status(404)
|
||||||
|
}
|
||||||
|
if (!mediaItemShare.isDownloadable) {
|
||||||
|
return res.status(403).send('Download is not allowed for this item')
|
||||||
|
}
|
||||||
|
|
||||||
|
const playbackSession = ShareManager.findPlaybackSessionBySessionId(req.cookies.share_session_id)
|
||||||
|
if (!playbackSession || playbackSession.mediaItemShareId !== mediaItemShare.id) {
|
||||||
|
return res.status(404).send('Share session not found')
|
||||||
|
}
|
||||||
|
|
||||||
|
const libraryItem = await Database.libraryItemModel.findByPk(playbackSession.libraryItemId, {
|
||||||
|
attributes: ['id', 'path', 'relPath', 'isFile']
|
||||||
|
})
|
||||||
|
if (!libraryItem) {
|
||||||
|
return res.status(404).send('Library item not found')
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemPath = libraryItem.path
|
||||||
|
const itemTitle = playbackSession.displayTitle
|
||||||
|
|
||||||
|
Logger.info(`[ShareController] Requested download for book "${itemTitle}" at "${itemPath}"`)
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (libraryItem.isFile) {
|
||||||
|
const audioMimeType = getAudioMimeTypeFromExtname(Path.extname(itemPath))
|
||||||
|
if (audioMimeType) {
|
||||||
|
res.setHeader('Content-Type', audioMimeType)
|
||||||
|
}
|
||||||
|
await new Promise((resolve, reject) => res.download(itemPath, libraryItem.relPath, (error) => (error ? reject(error) : resolve())))
|
||||||
|
} else {
|
||||||
|
const filename = `${itemTitle}.zip`
|
||||||
|
await zipHelpers.zipDirectoryPipe(itemPath, filename, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.info(`[ShareController] Downloaded item "${itemTitle}" at "${itemPath}"`)
|
||||||
|
} catch (error) {
|
||||||
|
Logger.error(`[ShareController] Download failed for item "${itemTitle}" at "${itemPath}"`, error)
|
||||||
|
res.status(500).send('Failed to download the item')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Public route - requires share_session_id cookie
|
* Public route - requires share_session_id cookie
|
||||||
*
|
*
|
||||||
@ -259,7 +319,7 @@ class ShareController {
|
|||||||
return res.sendStatus(403)
|
return res.sendStatus(403)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { slug, expiresAt, mediaItemType, mediaItemId } = req.body
|
const { slug, expiresAt, mediaItemType, mediaItemId, isDownloadable } = req.body
|
||||||
|
|
||||||
if (!slug?.trim?.() || typeof mediaItemType !== 'string' || typeof mediaItemId !== 'string') {
|
if (!slug?.trim?.() || typeof mediaItemType !== 'string' || typeof mediaItemId !== 'string') {
|
||||||
return res.status(400).send('Missing or invalid required fields')
|
return res.status(400).send('Missing or invalid required fields')
|
||||||
@ -298,7 +358,8 @@ class ShareController {
|
|||||||
expiresAt: expiresAt || null,
|
expiresAt: expiresAt || null,
|
||||||
mediaItemId,
|
mediaItemId,
|
||||||
mediaItemType,
|
mediaItemType,
|
||||||
userId: req.user.id
|
userId: req.user.id,
|
||||||
|
isDownloadable
|
||||||
})
|
})
|
||||||
|
|
||||||
ShareManager.openMediaItemShare(mediaItemShare)
|
ShareManager.openMediaItemShare(mediaItemShare)
|
||||||
|
@ -11,3 +11,4 @@ Please add a record of every database migration that you create to this file. Th
|
|||||||
| v2.17.3 | v2.17.3-fk-constraints | Changes the foreign key constraints for tables due to sequelize bug dropping constraints in v2.17.0 migration |
|
| v2.17.3 | v2.17.3-fk-constraints | Changes the foreign key constraints for tables due to sequelize bug dropping constraints in v2.17.0 migration |
|
||||||
| v2.17.4 | v2.17.4-use-subfolder-for-oidc-redirect-uris | Save subfolder to OIDC redirect URIs to support existing installations |
|
| v2.17.4 | v2.17.4-use-subfolder-for-oidc-redirect-uris | Save subfolder to OIDC redirect URIs to support existing installations |
|
||||||
| v2.17.5 | v2.17.5-remove-host-from-feed-urls | removes the host (serverAddress) from URL columns in the feeds and feedEpisodes tables |
|
| v2.17.5 | v2.17.5-remove-host-from-feed-urls | removes the host (serverAddress) from URL columns in the feeds and feedEpisodes tables |
|
||||||
|
| v2.17.6 | v2.17.6-share-add-isdownloadable | Adds the isDownloadable column to the mediaItemShares table |
|
||||||
|
68
server/migrations/v2.17.6-share-add-isdownloadable.js
Normal file
68
server/migrations/v2.17.6-share-add-isdownloadable.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* @typedef MigrationContext
|
||||||
|
* @property {import('sequelize').QueryInterface} queryInterface - a Sequelize QueryInterface object.
|
||||||
|
* @property {import('../Logger')} logger - a Logger object.
|
||||||
|
*
|
||||||
|
* @typedef MigrationOptions
|
||||||
|
* @property {MigrationContext} context - an object containing the migration context.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const migrationVersion = '2.17.6'
|
||||||
|
const migrationName = `${migrationVersion}-share-add-isdownloadable`
|
||||||
|
const loggerPrefix = `[${migrationVersion} migration]`
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This migration script adds the isDownloadable column to the mediaItemShares table.
|
||||||
|
*
|
||||||
|
* @param {MigrationOptions} options - an object containing the migration context.
|
||||||
|
* @returns {Promise<void>} - A promise that resolves when the migration is complete.
|
||||||
|
*/
|
||||||
|
async function up({ context: { queryInterface, logger } }) {
|
||||||
|
logger.info(`${loggerPrefix} UPGRADE BEGIN: ${migrationName}`)
|
||||||
|
|
||||||
|
if (await queryInterface.tableExists('mediaItemShares')) {
|
||||||
|
const tableDescription = await queryInterface.describeTable('mediaItemShares')
|
||||||
|
if (!tableDescription.isDownloadable) {
|
||||||
|
logger.info(`${loggerPrefix} Adding isDownloadable column to mediaItemShares table`)
|
||||||
|
await queryInterface.addColumn('mediaItemShares', 'isDownloadable', {
|
||||||
|
type: queryInterface.sequelize.Sequelize.DataTypes.BOOLEAN,
|
||||||
|
defaultValue: false,
|
||||||
|
allowNull: false
|
||||||
|
})
|
||||||
|
logger.info(`${loggerPrefix} Added isDownloadable column to mediaItemShares table`)
|
||||||
|
} else {
|
||||||
|
logger.info(`${loggerPrefix} isDownloadable column already exists in mediaItemShares table`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.info(`${loggerPrefix} mediaItemShares table does not exist`)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(`${loggerPrefix} UPGRADE END: ${migrationName}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This migration script removes the isDownloadable column from the mediaItemShares table.
|
||||||
|
*
|
||||||
|
* @param {MigrationOptions} options - an object containing the migration context.
|
||||||
|
* @returns {Promise<void>} - A promise that resolves when the migration is complete.
|
||||||
|
*/
|
||||||
|
async function down({ context: { queryInterface, logger } }) {
|
||||||
|
logger.info(`${loggerPrefix} DOWNGRADE BEGIN: ${migrationName}`)
|
||||||
|
|
||||||
|
if (await queryInterface.tableExists('mediaItemShares')) {
|
||||||
|
const tableDescription = await queryInterface.describeTable('mediaItemShares')
|
||||||
|
if (tableDescription.isDownloadable) {
|
||||||
|
logger.info(`${loggerPrefix} Removing isDownloadable column from mediaItemShares table`)
|
||||||
|
await queryInterface.removeColumn('mediaItemShares', 'isDownloadable')
|
||||||
|
logger.info(`${loggerPrefix} Removed isDownloadable column from mediaItemShares table`)
|
||||||
|
} else {
|
||||||
|
logger.info(`${loggerPrefix} isDownloadable column does not exist in mediaItemShares table`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.info(`${loggerPrefix} mediaItemShares table does not exist`)
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(`${loggerPrefix} DOWNGRADE END: ${migrationName}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { up, down }
|
@ -138,7 +138,7 @@ class FeedEpisode extends Model {
|
|||||||
|
|
||||||
const contentUrl = `/feed/${slug}/item/${episodeId}/media${Path.extname(audioTrack.metadata.filename)}`
|
const contentUrl = `/feed/${slug}/item/${episodeId}/media${Path.extname(audioTrack.metadata.filename)}`
|
||||||
|
|
||||||
let title = audioTrack.title
|
let title = Path.basename(audioTrack.metadata.filename, Path.extname(audioTrack.metadata.filename))
|
||||||
if (book.trackList.length == 1) {
|
if (book.trackList.length == 1) {
|
||||||
// If audiobook is a single file, use book title instead of chapter/file title
|
// If audiobook is a single file, use book title instead of chapter/file title
|
||||||
title = book.title
|
title = book.title
|
||||||
|
@ -12,6 +12,7 @@ const { DataTypes, Model } = require('sequelize')
|
|||||||
* @property {Object} extraData
|
* @property {Object} extraData
|
||||||
* @property {Date} createdAt
|
* @property {Date} createdAt
|
||||||
* @property {Date} updatedAt
|
* @property {Date} updatedAt
|
||||||
|
* @property {boolean} isDownloadable
|
||||||
*
|
*
|
||||||
* @typedef {MediaItemShareObject & MediaItemShare} MediaItemShareModel
|
* @typedef {MediaItemShareObject & MediaItemShare} MediaItemShareModel
|
||||||
*/
|
*/
|
||||||
@ -25,11 +26,40 @@ const { DataTypes, Model } = require('sequelize')
|
|||||||
* @property {Date} expiresAt
|
* @property {Date} expiresAt
|
||||||
* @property {Date} createdAt
|
* @property {Date} createdAt
|
||||||
* @property {Date} updatedAt
|
* @property {Date} updatedAt
|
||||||
|
* @property {boolean} isDownloadable
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class MediaItemShare extends Model {
|
class MediaItemShare extends Model {
|
||||||
constructor(values, options) {
|
constructor(values, options) {
|
||||||
super(values, options)
|
super(values, options)
|
||||||
|
|
||||||
|
/** @type {UUIDV4} */
|
||||||
|
this.id
|
||||||
|
/** @type {UUIDV4} */
|
||||||
|
this.mediaItemId
|
||||||
|
/** @type {string} */
|
||||||
|
this.mediaItemType
|
||||||
|
/** @type {string} */
|
||||||
|
this.slug
|
||||||
|
/** @type {string} */
|
||||||
|
this.pash
|
||||||
|
/** @type {UUIDV4} */
|
||||||
|
this.userId
|
||||||
|
/** @type {Date} */
|
||||||
|
this.expiresAt
|
||||||
|
/** @type {Object} */
|
||||||
|
this.extraData
|
||||||
|
/** @type {Date} */
|
||||||
|
this.createdAt
|
||||||
|
/** @type {Date} */
|
||||||
|
this.updatedAt
|
||||||
|
/** @type {boolean} */
|
||||||
|
this.isDownloadable
|
||||||
|
|
||||||
|
// Expanded properties
|
||||||
|
|
||||||
|
/** @type {import('./Book')|import('./PodcastEpisode')} */
|
||||||
|
this.mediaItem
|
||||||
}
|
}
|
||||||
|
|
||||||
toJSONForClient() {
|
toJSONForClient() {
|
||||||
@ -40,7 +70,8 @@ class MediaItemShare extends Model {
|
|||||||
slug: this.slug,
|
slug: this.slug,
|
||||||
expiresAt: this.expiresAt,
|
expiresAt: this.expiresAt,
|
||||||
createdAt: this.createdAt,
|
createdAt: this.createdAt,
|
||||||
updatedAt: this.updatedAt
|
updatedAt: this.updatedAt,
|
||||||
|
isDownloadable: this.isDownloadable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,7 +145,8 @@ class MediaItemShare extends Model {
|
|||||||
slug: DataTypes.STRING,
|
slug: DataTypes.STRING,
|
||||||
pash: DataTypes.STRING,
|
pash: DataTypes.STRING,
|
||||||
expiresAt: DataTypes.DATE,
|
expiresAt: DataTypes.DATE,
|
||||||
extraData: DataTypes.JSON
|
extraData: DataTypes.JSON,
|
||||||
|
isDownloadable: DataTypes.BOOLEAN
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sequelize,
|
sequelize,
|
||||||
|
@ -15,6 +15,7 @@ class PublicRouter {
|
|||||||
this.router.get('/share/:slug', ShareController.getMediaItemShareBySlug.bind(this))
|
this.router.get('/share/:slug', ShareController.getMediaItemShareBySlug.bind(this))
|
||||||
this.router.get('/share/:slug/track/:index', ShareController.getMediaItemShareAudioTrack.bind(this))
|
this.router.get('/share/:slug/track/:index', ShareController.getMediaItemShareAudioTrack.bind(this))
|
||||||
this.router.get('/share/:slug/cover', ShareController.getMediaItemShareCoverImage.bind(this))
|
this.router.get('/share/:slug/cover', ShareController.getMediaItemShareCoverImage.bind(this))
|
||||||
|
this.router.get('/share/:slug/download', ShareController.downloadMediaItemShare.bind(this))
|
||||||
this.router.patch('/share/:slug/progress', ShareController.updateMediaItemShareProgress.bind(this))
|
this.router.patch('/share/:slug/progress', ShareController.updateMediaItemShareProgress.bind(this))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
const chai = require('chai')
|
||||||
|
const sinon = require('sinon')
|
||||||
|
const { expect } = chai
|
||||||
|
|
||||||
|
const { DataTypes } = require('sequelize')
|
||||||
|
|
||||||
|
const { up, down } = require('../../../server/migrations/v2.17.6-share-add-isdownloadable')
|
||||||
|
|
||||||
|
describe('Migration v2.17.6-share-add-isDownloadable', () => {
|
||||||
|
let queryInterface, logger
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
queryInterface = {
|
||||||
|
addColumn: sinon.stub().resolves(),
|
||||||
|
removeColumn: sinon.stub().resolves(),
|
||||||
|
tableExists: sinon.stub().resolves(true),
|
||||||
|
describeTable: sinon.stub().resolves({ isDownloadable: undefined }),
|
||||||
|
sequelize: {
|
||||||
|
Sequelize: {
|
||||||
|
DataTypes: {
|
||||||
|
BOOLEAN: DataTypes.BOOLEAN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger = {
|
||||||
|
info: sinon.stub(),
|
||||||
|
error: sinon.stub()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('up', () => {
|
||||||
|
it('should add the isDownloadable column to mediaItemShares table', async () => {
|
||||||
|
await up({ context: { queryInterface, logger } })
|
||||||
|
|
||||||
|
expect(queryInterface.addColumn.calledOnce).to.be.true
|
||||||
|
expect(
|
||||||
|
queryInterface.addColumn.calledWith('mediaItemShares', 'isDownloadable', {
|
||||||
|
type: DataTypes.BOOLEAN,
|
||||||
|
defaultValue: false,
|
||||||
|
allowNull: false
|
||||||
|
})
|
||||||
|
).to.be.true
|
||||||
|
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] UPGRADE BEGIN: 2.17.6-share-add-isdownloadable')).to.be.true
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] Adding isDownloadable column to mediaItemShares table')).to.be.true
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] Added isDownloadable column to mediaItemShares table')).to.be.true
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] UPGRADE END: 2.17.6-share-add-isdownloadable')).to.be.true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('down', () => {
|
||||||
|
it('should remove the isDownloadable column from mediaItemShares table', async () => {
|
||||||
|
queryInterface.describeTable.resolves({ isDownloadable: true })
|
||||||
|
|
||||||
|
await down({ context: { queryInterface, logger } })
|
||||||
|
|
||||||
|
expect(queryInterface.removeColumn.calledOnce).to.be.true
|
||||||
|
expect(queryInterface.removeColumn.calledWith('mediaItemShares', 'isDownloadable')).to.be.true
|
||||||
|
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] DOWNGRADE BEGIN: 2.17.6-share-add-isdownloadable')).to.be.true
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] Removing isDownloadable column from mediaItemShares table')).to.be.true
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] Removed isDownloadable column from mediaItemShares table')).to.be.true
|
||||||
|
expect(logger.info.calledWith('[2.17.6 migration] DOWNGRADE END: 2.17.6-share-add-isdownloadable')).to.be.true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user