mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-07 09:51:37 +00:00
Compare commits
No commits in common. "e24eaab3f187eaa8cac3b9bc73d710d1303154f3" and "e59babdf24cfa3283b9ea6fd6c8f0e22a76f15ec" have entirely different histories.
e24eaab3f1
...
e59babdf24
20 changed files with 152 additions and 256 deletions
|
|
@ -778,6 +778,10 @@ export default {
|
||||||
windowResize() {
|
windowResize() {
|
||||||
this.executeRebuild()
|
this.executeRebuild()
|
||||||
},
|
},
|
||||||
|
socketInit() {
|
||||||
|
// Server settings are set on socket init
|
||||||
|
this.executeRebuild()
|
||||||
|
},
|
||||||
initListeners() {
|
initListeners() {
|
||||||
window.addEventListener('resize', this.windowResize)
|
window.addEventListener('resize', this.windowResize)
|
||||||
|
|
||||||
|
|
@ -790,6 +794,7 @@ export default {
|
||||||
})
|
})
|
||||||
|
|
||||||
this.$eventBus.$on('bookshelf_clear_selection', this.clearSelectedEntities)
|
this.$eventBus.$on('bookshelf_clear_selection', this.clearSelectedEntities)
|
||||||
|
this.$eventBus.$on('socket_init', this.socketInit)
|
||||||
this.$eventBus.$on('user-settings', this.settingsUpdated)
|
this.$eventBus.$on('user-settings', this.settingsUpdated)
|
||||||
|
|
||||||
if (this.$root.socket) {
|
if (this.$root.socket) {
|
||||||
|
|
@ -821,6 +826,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.$eventBus.$off('bookshelf_clear_selection', this.clearSelectedEntities)
|
this.$eventBus.$off('bookshelf_clear_selection', this.clearSelectedEntities)
|
||||||
|
this.$eventBus.$off('socket_init', this.socketInit)
|
||||||
this.$eventBus.$off('user-settings', this.settingsUpdated)
|
this.$eventBus.$off('user-settings', this.settingsUpdated)
|
||||||
|
|
||||||
if (this.$root.socket) {
|
if (this.$root.socket) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
{{ $getString('MessageConfirmRemoveEpisode', [episodeTitle]) }}
|
{{ $getString('MessageConfirmRemoveEpisode', [episodeTitle]) }}
|
||||||
</p>
|
</p>
|
||||||
<p v-else class="text-lg text-gray-200 mb-4">{{ $getString('MessageConfirmRemoveEpisodes', [episodes.length]) }}</p>
|
<p v-else class="text-lg text-gray-200 mb-4">{{ $getString('MessageConfirmRemoveEpisodes', [episodes.length]) }}</p>
|
||||||
<p class="text-xs font-semibold text-warning/90">{{ $strings.MessageConfirmRemoveEpisodeNote }}</p>
|
<p class="text-xs font-semibold text-warning/90">Note: This does not delete the audio file unless toggling "Hard delete file"</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-between items-center pt-4">
|
<div class="flex justify-between items-center pt-4">
|
||||||
<ui-checkbox v-model="hardDeleteFile" :label="$strings.LabelHardDeleteFile" check-color="error" checkbox-bg="bg" small label-class="text-base text-gray-200 pl-3" />
|
<ui-checkbox v-model="hardDeleteFile" :label="$strings.LabelHardDeleteFile" check-color="error" checkbox-bg="bg" small label-class="text-base text-gray-200 pl-3" />
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ export default {
|
||||||
this.$toast.error(data.error)
|
this.$toast.error(data.error)
|
||||||
} else {
|
} else {
|
||||||
this.removeApiKey(apiKey.id)
|
this.removeApiKey(apiKey.id)
|
||||||
this.$emit('numApiKeys', this.apiKeys.length)
|
this.$emit('deleted', apiKey.id)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,6 @@ export default {
|
||||||
return {
|
return {
|
||||||
socket: null,
|
socket: null,
|
||||||
isSocketConnected: false,
|
isSocketConnected: false,
|
||||||
isSocketAuthenticated: false,
|
|
||||||
isFirstSocketConnection: true,
|
isFirstSocketConnection: true,
|
||||||
socketConnectionToastId: null,
|
socketConnectionToastId: null,
|
||||||
currentLang: null,
|
currentLang: null,
|
||||||
|
|
@ -82,28 +81,9 @@ export default {
|
||||||
document.body.classList.add('app-bar')
|
document.body.classList.add('app-bar')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tokenRefreshed(newAccessToken) {
|
|
||||||
if (this.isSocketConnected && !this.isSocketAuthenticated) {
|
|
||||||
console.log('[SOCKET] Re-authenticating socket after token refresh')
|
|
||||||
this.socket.emit('auth', newAccessToken)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
updateSocketConnectionToast(content, type, timeout) {
|
updateSocketConnectionToast(content, type, timeout) {
|
||||||
if (this.socketConnectionToastId !== null && this.socketConnectionToastId !== undefined) {
|
if (this.socketConnectionToastId !== null && this.socketConnectionToastId !== undefined) {
|
||||||
const toastUpdateOptions = {
|
this.$toast.update(this.socketConnectionToastId, { content: content, options: { timeout: timeout, type: type, closeButton: false, position: 'bottom-center', onClose: () => null, closeOnClick: timeout !== null } }, false)
|
||||||
content: content,
|
|
||||||
options: {
|
|
||||||
timeout: timeout,
|
|
||||||
type: type,
|
|
||||||
closeButton: false,
|
|
||||||
position: 'bottom-center',
|
|
||||||
onClose: () => {
|
|
||||||
this.socketConnectionToastId = null
|
|
||||||
},
|
|
||||||
closeOnClick: timeout !== null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.$toast.update(this.socketConnectionToastId, toastUpdateOptions, false)
|
|
||||||
} else {
|
} else {
|
||||||
this.socketConnectionToastId = this.$toast[type](content, { position: 'bottom-center', timeout: timeout, closeButton: false, closeOnClick: timeout !== null })
|
this.socketConnectionToastId = this.$toast[type](content, { position: 'bottom-center', timeout: timeout, closeButton: false, closeOnClick: timeout !== null })
|
||||||
}
|
}
|
||||||
|
|
@ -129,7 +109,7 @@ export default {
|
||||||
this.updateSocketConnectionToast(this.$strings.ToastSocketDisconnected, 'error', null)
|
this.updateSocketConnectionToast(this.$strings.ToastSocketDisconnected, 'error', null)
|
||||||
},
|
},
|
||||||
reconnect() {
|
reconnect() {
|
||||||
console.log('[SOCKET] reconnected')
|
console.error('[SOCKET] reconnected')
|
||||||
},
|
},
|
||||||
reconnectAttempt(val) {
|
reconnectAttempt(val) {
|
||||||
console.log(`[SOCKET] reconnect attempt ${val}`)
|
console.log(`[SOCKET] reconnect attempt ${val}`)
|
||||||
|
|
@ -140,10 +120,6 @@ export default {
|
||||||
reconnectFailed() {
|
reconnectFailed() {
|
||||||
console.error('[SOCKET] reconnect failed')
|
console.error('[SOCKET] reconnect failed')
|
||||||
},
|
},
|
||||||
authFailed(payload) {
|
|
||||||
console.error('[SOCKET] auth failed', payload.message)
|
|
||||||
this.isSocketAuthenticated = false
|
|
||||||
},
|
|
||||||
init(payload) {
|
init(payload) {
|
||||||
console.log('Init Payload', payload)
|
console.log('Init Payload', payload)
|
||||||
|
|
||||||
|
|
@ -151,7 +127,7 @@ export default {
|
||||||
this.$store.commit('users/setUsersOnline', payload.usersOnline)
|
this.$store.commit('users/setUsersOnline', payload.usersOnline)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.isSocketAuthenticated = true
|
this.$eventBus.$emit('socket_init')
|
||||||
},
|
},
|
||||||
streamOpen(stream) {
|
streamOpen(stream) {
|
||||||
if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamOpen(stream)
|
if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamOpen(stream)
|
||||||
|
|
@ -378,15 +354,6 @@ export default {
|
||||||
this.$store.commit('scanners/removeCustomMetadataProvider', provider)
|
this.$store.commit('scanners/removeCustomMetadataProvider', provider)
|
||||||
},
|
},
|
||||||
initializeSocket() {
|
initializeSocket() {
|
||||||
if (this.$root.socket) {
|
|
||||||
// Can happen in dev due to hot reload
|
|
||||||
console.warn('Socket already initialized')
|
|
||||||
this.socket = this.$root.socket
|
|
||||||
this.isSocketConnected = this.$root.socket?.connected
|
|
||||||
this.isFirstSocketConnection = false
|
|
||||||
this.socketConnectionToastId = null
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.socket = this.$nuxtSocket({
|
this.socket = this.$nuxtSocket({
|
||||||
name: process.env.NODE_ENV === 'development' ? 'dev' : 'prod',
|
name: process.env.NODE_ENV === 'development' ? 'dev' : 'prod',
|
||||||
persist: 'main',
|
persist: 'main',
|
||||||
|
|
@ -397,7 +364,6 @@ export default {
|
||||||
path: `${this.$config.routerBasePath}/socket.io`
|
path: `${this.$config.routerBasePath}/socket.io`
|
||||||
})
|
})
|
||||||
this.$root.socket = this.socket
|
this.$root.socket = this.socket
|
||||||
this.isSocketAuthenticated = false
|
|
||||||
console.log('Socket initialized')
|
console.log('Socket initialized')
|
||||||
|
|
||||||
// Pre-defined socket events
|
// Pre-defined socket events
|
||||||
|
|
@ -411,7 +377,6 @@ export default {
|
||||||
|
|
||||||
// Event received after authorizing socket
|
// Event received after authorizing socket
|
||||||
this.socket.on('init', this.init)
|
this.socket.on('init', this.init)
|
||||||
this.socket.on('auth_failed', this.authFailed)
|
|
||||||
|
|
||||||
// Stream Listeners
|
// Stream Listeners
|
||||||
this.socket.on('stream_open', this.streamOpen)
|
this.socket.on('stream_open', this.streamOpen)
|
||||||
|
|
@ -606,7 +571,6 @@ export default {
|
||||||
this.updateBodyClass()
|
this.updateBodyClass()
|
||||||
this.resize()
|
this.resize()
|
||||||
this.$eventBus.$on('change-lang', this.changeLanguage)
|
this.$eventBus.$on('change-lang', this.changeLanguage)
|
||||||
this.$eventBus.$on('token_refreshed', this.tokenRefreshed)
|
|
||||||
window.addEventListener('resize', this.resize)
|
window.addEventListener('resize', this.resize)
|
||||||
window.addEventListener('keydown', this.keyDown)
|
window.addEventListener('keydown', this.keyDown)
|
||||||
|
|
||||||
|
|
@ -630,7 +594,6 @@ export default {
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
this.$eventBus.$off('change-lang', this.changeLanguage)
|
this.$eventBus.$off('change-lang', this.changeLanguage)
|
||||||
this.$eventBus.$off('token_refreshed', this.tokenRefreshed)
|
|
||||||
window.removeEventListener('resize', this.resize)
|
window.removeEventListener('resize', this.resize)
|
||||||
window.removeEventListener('keydown', this.keyDown)
|
window.removeEventListener('keydown', this.keyDown)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
<tables-api-keys-table ref="apiKeysTable" class="pt-2" @edit="setShowApiKeyModal" @numApiKeys="(count) => (numApiKeys = count)" />
|
<tables-api-keys-table ref="apiKeysTable" class="pt-2" @edit="setShowApiKeyModal" @numApiKeys="(count) => (numApiKeys = count)" />
|
||||||
</app-settings-content>
|
</app-settings-content>
|
||||||
<modals-api-key-modal ref="apiKeyModal" v-model="showApiKeyModal" :api-key="selectedApiKey" :users="users" @created="apiKeyCreated" @updated="apiKeyUpdated" />
|
<modals-api-key-modal ref="apiKeyModal" v-model="showApiKeyModal" :api-key="selectedApiKey" :users="users" @created="apiKeyCreated" @deleted="apiKeyDeleted" @updated="apiKeyUpdated" />
|
||||||
<modals-api-key-created-modal ref="apiKeyCreatedModal" v-model="showApiKeyCreatedModal" :api-key="selectedApiKey" />
|
<modals-api-key-created-modal ref="apiKeyCreatedModal" v-model="showApiKeyCreatedModal" :api-key="selectedApiKey" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -50,6 +50,9 @@ export default {
|
||||||
this.$refs.apiKeysTable.addApiKey(apiKey)
|
this.$refs.apiKeysTable.addApiKey(apiKey)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
apiKeyDeleted() {
|
||||||
|
this.numApiKeys--
|
||||||
|
},
|
||||||
apiKeyUpdated(apiKey) {
|
apiKeyUpdated(apiKey) {
|
||||||
if (this.$refs.apiKeysTable) {
|
if (this.$refs.apiKeysTable) {
|
||||||
this.$refs.apiKeysTable.updateApiKey(apiKey)
|
this.$refs.apiKeysTable.updateApiKey(apiKey)
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-for="narrator in narrators" :key="narrator.id">
|
<tr v-for="narrator in narrators" :key="narrator.id">
|
||||||
<td>
|
<td>
|
||||||
<nuxt-link v-if="selectedNarrator?.id !== narrator.id" :to="`/library/${currentLibraryId}/bookshelf?filter=narrators.${narrator.id}`" class="text-sm md:text-base text-gray-100 hover:underline">{{ narrator.name }}</nuxt-link>
|
<p v-if="selectedNarrator?.id !== narrator.id" class="text-sm md:text-base text-gray-100">{{ narrator.name }}</p>
|
||||||
<form v-else @submit.prevent="saveClick">
|
<form v-else @submit.prevent="saveClick">
|
||||||
<ui-text-input v-model="newNarratorName" />
|
<ui-text-input v-model="newNarratorName" />
|
||||||
</form>
|
</form>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
export default function ({ $axios, store, $root, app }) {
|
export default function ({ $axios, store, $config, app }) {
|
||||||
// Track if we're currently refreshing to prevent multiple refresh attempts
|
// Track if we're currently refreshing to prevent multiple refresh attempts
|
||||||
let isRefreshing = false
|
let isRefreshing = false
|
||||||
let failedQueue = []
|
let failedQueue = []
|
||||||
|
|
@ -82,11 +82,6 @@ export default function ({ $axios, store, $root, app }) {
|
||||||
// Update the token in store and localStorage
|
// Update the token in store and localStorage
|
||||||
store.commit('user/setUser', response.user)
|
store.commit('user/setUser', response.user)
|
||||||
|
|
||||||
// Emit event used to re-authenticate socket in default.vue since $root is not available here
|
|
||||||
if (app.$eventBus) {
|
|
||||||
app.$eventBus.$emit('token_refreshed', newAccessToken)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the original request with new token
|
// Update the original request with new token
|
||||||
if (!originalRequest.headers) {
|
if (!originalRequest.headers) {
|
||||||
originalRequest.headers = {}
|
originalRequest.headers = {}
|
||||||
|
|
|
||||||
|
|
@ -918,8 +918,6 @@
|
||||||
"NotificationOnBackupCompletedDescription": "Spuštěno po dokončení zálohování",
|
"NotificationOnBackupCompletedDescription": "Spuštěno po dokončení zálohování",
|
||||||
"NotificationOnBackupFailedDescription": "Spuštěno pokud zálohování selže",
|
"NotificationOnBackupFailedDescription": "Spuštěno pokud zálohování selže",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Spuštěno při automatickém stažení epizody podcastu",
|
"NotificationOnEpisodeDownloadedDescription": "Spuštěno při automatickém stažení epizody podcastu",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "Aktivováno když je automatické stahování pozastaveno z důvodu příliš mnoho neůspěšných pokusů",
|
|
||||||
"NotificationOnRSSFeedFailedDescription": "Aktivováno když selže RSS kanál pro stahování epizod",
|
|
||||||
"NotificationOnTestDescription": "Akce pro otestování upozorňovacího systému",
|
"NotificationOnTestDescription": "Akce pro otestování upozorňovacího systému",
|
||||||
"PlaceholderNewCollection": "Nový název kolekce",
|
"PlaceholderNewCollection": "Nový název kolekce",
|
||||||
"PlaceholderNewFolderPath": "Nová cesta ke složce",
|
"PlaceholderNewFolderPath": "Nová cesta ke složce",
|
||||||
|
|
@ -964,7 +962,7 @@
|
||||||
"ToastBackupRestoreFailed": "Nepodařilo se obnovit zálohu",
|
"ToastBackupRestoreFailed": "Nepodařilo se obnovit zálohu",
|
||||||
"ToastBackupUploadFailed": "Nepodařilo se nahrát zálohu",
|
"ToastBackupUploadFailed": "Nepodařilo se nahrát zálohu",
|
||||||
"ToastBackupUploadSuccess": "Záloha nahrána",
|
"ToastBackupUploadSuccess": "Záloha nahrána",
|
||||||
"ToastBatchApplyDetailsToItemsSuccess": "Detaily byly aplikované na položky",
|
"ToastBatchApplyDetailsToItemsSuccess": "Detaily aplikované na položky",
|
||||||
"ToastBatchDeleteFailed": "Hromadné smazání selhalo",
|
"ToastBatchDeleteFailed": "Hromadné smazání selhalo",
|
||||||
"ToastBatchDeleteSuccess": "Hromadné smazání proběhlo úspěšně",
|
"ToastBatchDeleteSuccess": "Hromadné smazání proběhlo úspěšně",
|
||||||
"ToastBatchQuickMatchFailed": "Rychlá schoda dávky se nezdařila!",
|
"ToastBatchQuickMatchFailed": "Rychlá schoda dávky se nezdařila!",
|
||||||
|
|
@ -978,7 +976,7 @@
|
||||||
"ToastCachePurgeSuccess": "Vyrovnávací paměť úspěšně vyčištěna",
|
"ToastCachePurgeSuccess": "Vyrovnávací paměť úspěšně vyčištěna",
|
||||||
"ToastChaptersHaveErrors": "Kapitoly obsahují chyby",
|
"ToastChaptersHaveErrors": "Kapitoly obsahují chyby",
|
||||||
"ToastChaptersInvalidShiftAmountLast": "Nesprávná délka posunu. Čas začátku poslední kapitoly by přesáhl dobu trvání této audioknihy.",
|
"ToastChaptersInvalidShiftAmountLast": "Nesprávná délka posunu. Čas začátku poslední kapitoly by přesáhl dobu trvání této audioknihy.",
|
||||||
"ToastChaptersInvalidShiftAmountStart": "Nesprávná délka posunu. První kapitola by měla nulovou nebo zápornou délku a byla by přepsána druhou kapitolou. Zvětšete čas začátku druhé kapitoly.",
|
"ToastChaptersInvalidShiftAmountStart": "Nesprávná délka posunu. První kapitola by měla nulovou nebo zápornou délku a byla by přepsána druhou kapitolou. Zvětšete počáteční délku druhé kapitoly.",
|
||||||
"ToastChaptersMustHaveTitles": "Kapitoly musí mít názvy",
|
"ToastChaptersMustHaveTitles": "Kapitoly musí mít názvy",
|
||||||
"ToastChaptersRemoved": "Kapitoly odstraněny",
|
"ToastChaptersRemoved": "Kapitoly odstraněny",
|
||||||
"ToastChaptersUpdated": "Kapitola aktualizována",
|
"ToastChaptersUpdated": "Kapitola aktualizována",
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,6 @@
|
||||||
"HeaderPlaylist": "Afspilningsliste",
|
"HeaderPlaylist": "Afspilningsliste",
|
||||||
"HeaderPlaylistItems": "Afspilningsliste Elementer",
|
"HeaderPlaylistItems": "Afspilningsliste Elementer",
|
||||||
"HeaderPodcastsToAdd": "Podcasts til Tilføjelse",
|
"HeaderPodcastsToAdd": "Podcasts til Tilføjelse",
|
||||||
"HeaderPresets": "Forudindstillinger",
|
|
||||||
"HeaderPreviewCover": "Forhåndsvis Omslag",
|
"HeaderPreviewCover": "Forhåndsvis Omslag",
|
||||||
"HeaderRSSFeedGeneral": "RSS Detaljer",
|
"HeaderRSSFeedGeneral": "RSS Detaljer",
|
||||||
"HeaderRSSFeedIsOpen": "RSS Feed er Åben",
|
"HeaderRSSFeedIsOpen": "RSS Feed er Åben",
|
||||||
|
|
@ -531,7 +530,6 @@
|
||||||
"LabelReleaseDate": "Udgivelsesdato",
|
"LabelReleaseDate": "Udgivelsesdato",
|
||||||
"LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer",
|
"LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer",
|
||||||
"LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer",
|
"LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer",
|
||||||
"LabelRemoveAudibleBranding": "Fjern Audible intro og outro fra kapitler",
|
|
||||||
"LabelRemoveCover": "Fjern omslag",
|
"LabelRemoveCover": "Fjern omslag",
|
||||||
"LabelRemoveMetadataFile": "Fjern alle metadata filer i biblioteksmapper",
|
"LabelRemoveMetadataFile": "Fjern alle metadata filer i biblioteksmapper",
|
||||||
"LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs filer i dine {0} mapper.",
|
"LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs filer i dine {0} mapper.",
|
||||||
|
|
@ -606,7 +604,6 @@
|
||||||
"LabelSlug": "Snegl",
|
"LabelSlug": "Snegl",
|
||||||
"LabelSortAscending": "Stigende",
|
"LabelSortAscending": "Stigende",
|
||||||
"LabelSortDescending": "Faldende",
|
"LabelSortDescending": "Faldende",
|
||||||
"LabelSortPubDate": "Sortér Pub Dato",
|
|
||||||
"LabelStart": "Start",
|
"LabelStart": "Start",
|
||||||
"LabelStartTime": "Starttid",
|
"LabelStartTime": "Starttid",
|
||||||
"LabelStarted": "Startet",
|
"LabelStarted": "Startet",
|
||||||
|
|
@ -707,8 +704,6 @@
|
||||||
"LabelYourProgress": "Din fremgang",
|
"LabelYourProgress": "Din fremgang",
|
||||||
"MessageAddToPlayerQueue": "Tilføj til afspilningskø",
|
"MessageAddToPlayerQueue": "Tilføj til afspilningskø",
|
||||||
"MessageAppriseDescription": "For at bruge denne funktion skal du have en instans af <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kørende eller en API, der håndterer de samme anmodninger. <br /> Apprise API-webadressen skal være den fulde URL-sti for at sende underretningen, f.eks. hvis din API-instans er tilgængelig på <code>http://192.168.1.1:8337</code>, så skal du bruge <code>http://192.168.1.1:8337/notify</code>.",
|
"MessageAppriseDescription": "For at bruge denne funktion skal du have en instans af <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kørende eller en API, der håndterer de samme anmodninger. <br /> Apprise API-webadressen skal være den fulde URL-sti for at sende underretningen, f.eks. hvis din API-instans er tilgængelig på <code>http://192.168.1.1:8337</code>, så skal du bruge <code>http://192.168.1.1:8337/notify</code>.",
|
||||||
"MessageAsinCheck": "Sikr dig at du bruger ASIN fra den korrekte Audible region, ikke Amazon.",
|
|
||||||
"MessageAuthenticationOIDCChangesRestart": "Genstart sin server efter du har gemt for at bekræfte OIDC ændringer.",
|
|
||||||
"MessageBackupsDescription": "Backups inkluderer brugere, brugerfremskridt, biblioteksvareoplysninger, serverindstillinger og billeder gemt i <code>/metadata/items</code> og <code>/metadata/authors</code>. Backups inkluderer <strong>ikke</strong> nogen filer gemt i dine biblioteksmapper.",
|
"MessageBackupsDescription": "Backups inkluderer brugere, brugerfremskridt, biblioteksvareoplysninger, serverindstillinger og billeder gemt i <code>/metadata/items</code> og <code>/metadata/authors</code>. Backups inkluderer <strong>ikke</strong> nogen filer gemt i dine biblioteksmapper.",
|
||||||
"MessageBackupsLocationEditNote": "Note: Opdatering af backup sti vil ikke fjerne eller modificere eksisterende backups",
|
"MessageBackupsLocationEditNote": "Note: Opdatering af backup sti vil ikke fjerne eller modificere eksisterende backups",
|
||||||
"MessageBackupsLocationNoEditNote": "Note: Backup sti er sat igennem miljøvariabel og kan ikke ændres her.",
|
"MessageBackupsLocationNoEditNote": "Note: Backup sti er sat igennem miljøvariabel og kan ikke ændres her.",
|
||||||
|
|
@ -727,7 +722,6 @@
|
||||||
"MessageChapterErrorStartGteDuration": "Ugyldig starttid skal være mindre end lydbogens varighed",
|
"MessageChapterErrorStartGteDuration": "Ugyldig starttid skal være mindre end lydbogens varighed",
|
||||||
"MessageChapterErrorStartLtPrev": "Ugyldig starttid skal være større end eller lig med den foregående kapitels starttid",
|
"MessageChapterErrorStartLtPrev": "Ugyldig starttid skal være større end eller lig med den foregående kapitels starttid",
|
||||||
"MessageChapterStartIsAfter": "Kapitelstarten er efter slutningen af din lydbog",
|
"MessageChapterStartIsAfter": "Kapitelstarten er efter slutningen af din lydbog",
|
||||||
"MessageChaptersNotFound": "Kapitler ikke fundet",
|
|
||||||
"MessageCheckingCron": "Tjekker cron...",
|
"MessageCheckingCron": "Tjekker cron...",
|
||||||
"MessageConfirmCloseFeed": "Er du sikker på, at du vil lukke dette feed?",
|
"MessageConfirmCloseFeed": "Er du sikker på, at du vil lukke dette feed?",
|
||||||
"MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?",
|
"MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?",
|
||||||
|
|
@ -784,7 +778,6 @@
|
||||||
"MessageForceReScanDescription": "vil scanne alle filer igen som en frisk scanning. Lydfilens ID3-tags, OPF-filer og tekstfiler scannes som nye.",
|
"MessageForceReScanDescription": "vil scanne alle filer igen som en frisk scanning. Lydfilens ID3-tags, OPF-filer og tekstfiler scannes som nye.",
|
||||||
"MessageImportantNotice": "Vigtig besked!",
|
"MessageImportantNotice": "Vigtig besked!",
|
||||||
"MessageInsertChapterBelow": "Indsæt kapitel nedenfor",
|
"MessageInsertChapterBelow": "Indsæt kapitel nedenfor",
|
||||||
"MessageInvalidAsin": "Ugyldig ASIN",
|
|
||||||
"MessageItemsSelected": "{0} elementer valgt",
|
"MessageItemsSelected": "{0} elementer valgt",
|
||||||
"MessageItemsUpdated": "{0} elementer opdateret",
|
"MessageItemsUpdated": "{0} elementer opdateret",
|
||||||
"MessageJoinUsOn": "Deltag i os på",
|
"MessageJoinUsOn": "Deltag i os på",
|
||||||
|
|
@ -856,7 +849,6 @@
|
||||||
"MessageScheduleRunEveryWeekdayAtTime": "Kør hvert {0} af {1}",
|
"MessageScheduleRunEveryWeekdayAtTime": "Kør hvert {0} af {1}",
|
||||||
"MessageSearchResultsFor": "Søgeresultater for",
|
"MessageSearchResultsFor": "Søgeresultater for",
|
||||||
"MessageSelected": "{0} valgt",
|
"MessageSelected": "{0} valgt",
|
||||||
"MessageSeriesSequenceCannotContainSpaces": "Serie sekvens kan ikke indeholde mellemrum",
|
|
||||||
"MessageServerCouldNotBeReached": "Serveren kunne ikke nås",
|
"MessageServerCouldNotBeReached": "Serveren kunne ikke nås",
|
||||||
"MessageSetChaptersFromTracksDescription": "Indstil kapitler ved at bruge hver lydfil som et kapitel og kapiteloverskrift som lydfilnavn",
|
"MessageSetChaptersFromTracksDescription": "Indstil kapitler ved at bruge hver lydfil som et kapitel og kapiteloverskrift som lydfilnavn",
|
||||||
"MessageShareExpirationWillBe": "Udløb vil være <strong>{0}</strong>",
|
"MessageShareExpirationWillBe": "Udløb vil være <strong>{0}</strong>",
|
||||||
|
|
@ -918,8 +910,6 @@
|
||||||
"NotificationOnBackupCompletedDescription": "Udløst når backup er færdig",
|
"NotificationOnBackupCompletedDescription": "Udløst når backup er færdig",
|
||||||
"NotificationOnBackupFailedDescription": "Udløst når backup fejler",
|
"NotificationOnBackupFailedDescription": "Udløst når backup fejler",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Udløst når et podcast afsnit er automatisk downloadet",
|
"NotificationOnEpisodeDownloadedDescription": "Udløst når et podcast afsnit er automatisk downloadet",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "Aktiveret når automatiske episode-downloads er slået fra, på grund af for mange forsøg",
|
|
||||||
"NotificationOnRSSFeedFailedDescription": "Aktiveret når anmodning om RSS-feedet fejler for en automatisk episode-download",
|
|
||||||
"NotificationOnTestDescription": "Event for test af notifikationssystemet",
|
"NotificationOnTestDescription": "Event for test af notifikationssystemet",
|
||||||
"PlaceholderNewCollection": "Nyt samlingnavn",
|
"PlaceholderNewCollection": "Nyt samlingnavn",
|
||||||
"PlaceholderNewFolderPath": "Ny mappes sti",
|
"PlaceholderNewFolderPath": "Ny mappes sti",
|
||||||
|
|
@ -964,7 +954,6 @@
|
||||||
"ToastBackupRestoreFailed": "Mislykkedes gendannelse af sikkerhedskopi",
|
"ToastBackupRestoreFailed": "Mislykkedes gendannelse af sikkerhedskopi",
|
||||||
"ToastBackupUploadFailed": "Mislykkedes upload af sikkerhedskopi",
|
"ToastBackupUploadFailed": "Mislykkedes upload af sikkerhedskopi",
|
||||||
"ToastBackupUploadSuccess": "Sikkerhedskopi uploadet",
|
"ToastBackupUploadSuccess": "Sikkerhedskopi uploadet",
|
||||||
"ToastBatchApplyDetailsToItemsSuccess": "Detaljer bekræftet på element",
|
|
||||||
"ToastBatchDeleteFailed": "Batch slet fejlede",
|
"ToastBatchDeleteFailed": "Batch slet fejlede",
|
||||||
"ToastBatchDeleteSuccess": "Batch slet succes",
|
"ToastBatchDeleteSuccess": "Batch slet succes",
|
||||||
"ToastBatchQuickMatchFailed": "Batch Hurtig Match fejlede!",
|
"ToastBatchQuickMatchFailed": "Batch Hurtig Match fejlede!",
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@
|
||||||
"ButtonNext": "Vor",
|
"ButtonNext": "Vor",
|
||||||
"ButtonNextChapter": "Nächstes Kapitel",
|
"ButtonNextChapter": "Nächstes Kapitel",
|
||||||
"ButtonNextItemInQueue": "Das nächste Element in der Warteschlange",
|
"ButtonNextItemInQueue": "Das nächste Element in der Warteschlange",
|
||||||
"ButtonOk": "Ok",
|
"ButtonOk": "Einverstanden",
|
||||||
"ButtonOpenFeed": "Feed öffnen",
|
"ButtonOpenFeed": "Feed öffnen",
|
||||||
"ButtonOpenManager": "Manager öffnen",
|
"ButtonOpenManager": "Manager öffnen",
|
||||||
"ButtonPause": "Pausieren",
|
"ButtonPause": "Pausieren",
|
||||||
|
|
@ -708,7 +708,7 @@
|
||||||
"MessageAddToPlayerQueue": "Zur Abspielwarteliste hinzufügen",
|
"MessageAddToPlayerQueue": "Zur Abspielwarteliste hinzufügen",
|
||||||
"MessageAppriseDescription": "Um diese Funktion nutzen zu können, musst du eine Instanz von <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> laufen haben oder eine API verwenden welche dieselbe Anfragen bearbeiten kann. <br />Die Apprise API Url muss der vollständige URL-Pfad sein, an den die Benachrichtigung gesendet werden soll, z.B. wenn Ihre API-Instanz unter <code>http://192.168.1.1:8337</code> läuft, würdest du <code>http://192.168.1.1:8337/notify</code> eingeben.",
|
"MessageAppriseDescription": "Um diese Funktion nutzen zu können, musst du eine Instanz von <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> laufen haben oder eine API verwenden welche dieselbe Anfragen bearbeiten kann. <br />Die Apprise API Url muss der vollständige URL-Pfad sein, an den die Benachrichtigung gesendet werden soll, z.B. wenn Ihre API-Instanz unter <code>http://192.168.1.1:8337</code> läuft, würdest du <code>http://192.168.1.1:8337/notify</code> eingeben.",
|
||||||
"MessageAsinCheck": "Stellen Sie sicher, dass Sie die ASIN aus der richtigen Audible Region verwenden, nicht Amazon.",
|
"MessageAsinCheck": "Stellen Sie sicher, dass Sie die ASIN aus der richtigen Audible Region verwenden, nicht Amazon.",
|
||||||
"MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muss der Server neugestartet werden um die OIDC Änderungen zu übernehmen.",
|
"MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muß der Server neugestartet werden um die OIDC Änderungen zu übernehmen.",
|
||||||
"MessageBackupsDescription": "In einer Sicherung werden Benutzer, Benutzerfortschritte, Details zu den Bibliotheksobjekten, Servereinstellungen und Bilder welche in <code>/metadata/items</code> & <code>/metadata/authors</code> gespeichert sind gespeichert. Sicherungen enthalten keine Dateien welche in den einzelnen Bibliotheksordnern (Medien-Ordnern) gespeichert sind.",
|
"MessageBackupsDescription": "In einer Sicherung werden Benutzer, Benutzerfortschritte, Details zu den Bibliotheksobjekten, Servereinstellungen und Bilder welche in <code>/metadata/items</code> & <code>/metadata/authors</code> gespeichert sind gespeichert. Sicherungen enthalten keine Dateien welche in den einzelnen Bibliotheksordnern (Medien-Ordnern) gespeichert sind.",
|
||||||
"MessageBackupsLocationEditNote": "Hinweis: Durch das Aktualisieren des Backup-Speicherorts werden vorhandene Sicherungen nicht verschoben oder geändert",
|
"MessageBackupsLocationEditNote": "Hinweis: Durch das Aktualisieren des Backup-Speicherorts werden vorhandene Sicherungen nicht verschoben oder geändert",
|
||||||
"MessageBackupsLocationNoEditNote": "Hinweis: Der Sicherungsspeicherort wird über eine Umgebungsvariable festgelegt und kann hier nicht geändert werden.",
|
"MessageBackupsLocationNoEditNote": "Hinweis: Der Sicherungsspeicherort wird über eine Umgebungsvariable festgelegt und kann hier nicht geändert werden.",
|
||||||
|
|
@ -852,7 +852,7 @@
|
||||||
"MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Bist du dir sicher?",
|
"MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Bist du dir sicher?",
|
||||||
"MessageRestoreBackupConfirm": "Bist du dir sicher, dass du die Sicherung wiederherstellen willst, welche am",
|
"MessageRestoreBackupConfirm": "Bist du dir sicher, dass du die Sicherung wiederherstellen willst, welche am",
|
||||||
"MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.<br /><br />Bei der Sicherung werden keine Dateien in deinen Bibliotheksordnern verändert. Wenn du die Servereinstellungen aktiviert hast, um Cover und Metadaten in deinen Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.<br /><br />Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.",
|
"MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.<br /><br />Bei der Sicherung werden keine Dateien in deinen Bibliotheksordnern verändert. Wenn du die Servereinstellungen aktiviert hast, um Cover und Metadaten in deinen Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.<br /><br />Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.",
|
||||||
"MessageScheduleLibraryScanNote": "Für die meisten Anwender wird empfohlen, diese Funktion deaktiviert und die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung wird Änderungen in den Bibliotheksordnern automatisch erkennen. Die Ordnerüberwachung funktioniert nicht mit allen Dateisystemen (wie NFS), hier kann stattdessen die automatischen Bibliothekssuchen verwendet werden.",
|
"MessageScheduleLibraryScanNote": "Für die meisten Nutzer wird empfohlen, diese Funktion deaktiviert zu lassen und stattdessen die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung erkennt automatisch Änderungen in deinen Bibliotheksordnern. Da die Ordnerüberwachung jedoch nicht mit jedem Dateisystem (z.B. NFS) funktioniert, können alternativ hier geplante Bibliotheks-Scans aktiviert werden.",
|
||||||
"MessageScheduleRunEveryWeekdayAtTime": "Immer {0} um {1} ausführen",
|
"MessageScheduleRunEveryWeekdayAtTime": "Immer {0} um {1} ausführen",
|
||||||
"MessageSearchResultsFor": "Suchergebnisse für",
|
"MessageSearchResultsFor": "Suchergebnisse für",
|
||||||
"MessageSelected": "{0} ausgewählt",
|
"MessageSelected": "{0} ausgewählt",
|
||||||
|
|
@ -918,8 +918,6 @@
|
||||||
"NotificationOnBackupCompletedDescription": "Wird ausgeführt wenn ein Backup erstellt wurde",
|
"NotificationOnBackupCompletedDescription": "Wird ausgeführt wenn ein Backup erstellt wurde",
|
||||||
"NotificationOnBackupFailedDescription": "Wird ausgeführt wenn ein Backup fehlgeschlagen ist",
|
"NotificationOnBackupFailedDescription": "Wird ausgeführt wenn ein Backup fehlgeschlagen ist",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Wird ausgeführt wenn eine Podcast Folge automatisch heruntergeladen wird",
|
"NotificationOnEpisodeDownloadedDescription": "Wird ausgeführt wenn eine Podcast Folge automatisch heruntergeladen wird",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "Wird ausgeführt wenn automatische Downloads von Episoden wegen zu vielen fehlgeschlagenen Versuchen deaktiviert sind",
|
|
||||||
"NotificationOnRSSFeedFailedDescription": "Wird ausgelöst, wenn die RSS-Feed-Anforderung für einen automatischen Episoden-Download fehlschlägt",
|
|
||||||
"NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird",
|
"NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird",
|
||||||
"PlaceholderNewCollection": "Neuer Sammlungsname",
|
"PlaceholderNewCollection": "Neuer Sammlungsname",
|
||||||
"PlaceholderNewFolderPath": "Neuer Ordnerpfad",
|
"PlaceholderNewFolderPath": "Neuer Ordnerpfad",
|
||||||
|
|
|
||||||
|
|
@ -773,7 +773,6 @@
|
||||||
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
|
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
|
||||||
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
|
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
|
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
|
||||||
"MessageConfirmRemoveEpisodeNote": "Note: This does not delete the audio file unless toggling \"Hard delete file\"",
|
|
||||||
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
|
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
|
||||||
"MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
|
"MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
|
||||||
"MessageConfirmRemoveMetadataFiles": "Are you sure you want to remove all metadata.{0} files in your library item folders?",
|
"MessageConfirmRemoveMetadataFiles": "Are you sure you want to remove all metadata.{0} files in your library item folders?",
|
||||||
|
|
|
||||||
|
|
@ -918,8 +918,6 @@
|
||||||
"NotificationOnBackupCompletedDescription": "Pokreće se po završetku sigurnosnog kopiranja",
|
"NotificationOnBackupCompletedDescription": "Pokreće se po završetku sigurnosnog kopiranja",
|
||||||
"NotificationOnBackupFailedDescription": "Pokreće se kada sigurnosno kopiranje ne uspije",
|
"NotificationOnBackupFailedDescription": "Pokreće se kada sigurnosno kopiranje ne uspije",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Pokreće se kada se nastavak podcasta automatski preuzme",
|
"NotificationOnEpisodeDownloadedDescription": "Pokreće se kada se nastavak podcasta automatski preuzme",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "Pokreće se kada su automatska preuzimanja nastavaka onemogućena zbog previše neuspjelih pokušaja",
|
|
||||||
"NotificationOnRSSFeedFailedDescription": "Pokreće se u slučaju pogreške pri pokušaju automatskog preuzimanja nastavka s RSS izvora",
|
|
||||||
"NotificationOnTestDescription": "Događaj za testiranje sustava obavijesti",
|
"NotificationOnTestDescription": "Događaj za testiranje sustava obavijesti",
|
||||||
"PlaceholderNewCollection": "Ime nove zbirke",
|
"PlaceholderNewCollection": "Ime nove zbirke",
|
||||||
"PlaceholderNewFolderPath": "Nova putanja mape",
|
"PlaceholderNewFolderPath": "Nova putanja mape",
|
||||||
|
|
|
||||||
|
|
@ -514,7 +514,7 @@
|
||||||
"LabelPublishers": "Editori",
|
"LabelPublishers": "Editori",
|
||||||
"LabelRSSFeedCustomOwnerEmail": "E-mail del proprietario personalizzato",
|
"LabelRSSFeedCustomOwnerEmail": "E-mail del proprietario personalizzato",
|
||||||
"LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato",
|
"LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato",
|
||||||
"LabelRSSFeedOpen": "Feed RSS aperto",
|
"LabelRSSFeedOpen": "Flusso RSS aperto",
|
||||||
"LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione",
|
"LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione",
|
||||||
"LabelRSSFeedSlug": "Parole chiave del flusso RSS",
|
"LabelRSSFeedSlug": "Parole chiave del flusso RSS",
|
||||||
"LabelRSSFeedURL": "URL del flusso RSS",
|
"LabelRSSFeedURL": "URL del flusso RSS",
|
||||||
|
|
@ -918,8 +918,6 @@
|
||||||
"NotificationOnBackupCompletedDescription": "Attivato al completamento di un backup",
|
"NotificationOnBackupCompletedDescription": "Attivato al completamento di un backup",
|
||||||
"NotificationOnBackupFailedDescription": "Attivato quando un backup fallisce",
|
"NotificationOnBackupFailedDescription": "Attivato quando un backup fallisce",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Attivato quando un episodio di podcast viene scaricato automaticamente",
|
"NotificationOnEpisodeDownloadedDescription": "Attivato quando un episodio di podcast viene scaricato automaticamente",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "Attivato quando i download automatici degli episodi vengono disabilitati a causa di troppi tentativi falliti",
|
|
||||||
"NotificationOnRSSFeedFailedDescription": "Attivato quando la richiesta del feed RSS per il download automatico di un episodio fallisce",
|
|
||||||
"NotificationOnTestDescription": "test il sistema di notifica",
|
"NotificationOnTestDescription": "test il sistema di notifica",
|
||||||
"PlaceholderNewCollection": "Nome Nuova Raccolta",
|
"PlaceholderNewCollection": "Nome Nuova Raccolta",
|
||||||
"PlaceholderNewFolderPath": "Nuovo Percorso Cartella",
|
"PlaceholderNewFolderPath": "Nuovo Percorso Cartella",
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,6 @@
|
||||||
"HeaderPlaylist": "Afspeellijst",
|
"HeaderPlaylist": "Afspeellijst",
|
||||||
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
||||||
"HeaderPodcastsToAdd": "Toe te voegen podcasts",
|
"HeaderPodcastsToAdd": "Toe te voegen podcasts",
|
||||||
"HeaderPresets": "Voorinstellingen",
|
|
||||||
"HeaderPreviewCover": "Preview cover",
|
"HeaderPreviewCover": "Preview cover",
|
||||||
"HeaderRSSFeedGeneral": "RSS-details",
|
"HeaderRSSFeedGeneral": "RSS-details",
|
||||||
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
||||||
|
|
@ -514,7 +513,7 @@
|
||||||
"LabelPublishers": "Uitgevers",
|
"LabelPublishers": "Uitgevers",
|
||||||
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
|
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
|
||||||
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
|
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
|
||||||
"LabelRSSFeedOpen": "RSS Feed Open",
|
"LabelRSSFeedOpen": "RSS-feed open",
|
||||||
"LabelRSSFeedPreventIndexing": "Voorkom indexering",
|
"LabelRSSFeedPreventIndexing": "Voorkom indexering",
|
||||||
"LabelRSSFeedSlug": "RSS-feed slug",
|
"LabelRSSFeedSlug": "RSS-feed slug",
|
||||||
"LabelRSSFeedURL": "RSS-feed URL",
|
"LabelRSSFeedURL": "RSS-feed URL",
|
||||||
|
|
@ -606,7 +605,6 @@
|
||||||
"LabelSlug": "Slak",
|
"LabelSlug": "Slak",
|
||||||
"LabelSortAscending": "Oplopend",
|
"LabelSortAscending": "Oplopend",
|
||||||
"LabelSortDescending": "Aflopend",
|
"LabelSortDescending": "Aflopend",
|
||||||
"LabelSortPubDate": "Sorteer Pub Datum",
|
|
||||||
"LabelStart": "Start",
|
"LabelStart": "Start",
|
||||||
"LabelStartTime": "Starttijd",
|
"LabelStartTime": "Starttijd",
|
||||||
"LabelStarted": "Gestart",
|
"LabelStarted": "Gestart",
|
||||||
|
|
@ -707,8 +705,6 @@
|
||||||
"LabelYourProgress": "Je voortgang",
|
"LabelYourProgress": "Je voortgang",
|
||||||
"MessageAddToPlayerQueue": "Toevoegen aan wachtrij",
|
"MessageAddToPlayerQueue": "Toevoegen aan wachtrij",
|
||||||
"MessageAppriseDescription": "Om deze functie te gebruiken heb je een draaiende instantie van <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nodig of een api die dezelfde requests afhandelt. <br />De Apprise API Url moet het volledige URL-pad zijn om de notificatie te verzenden, b.v., als je API-instantie draait op <code>http://192.168.1.1:8337</code> dan zou je <code>http://192.168.1.1:8337/notify</code> gebruiken.",
|
"MessageAppriseDescription": "Om deze functie te gebruiken heb je een draaiende instantie van <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nodig of een api die dezelfde requests afhandelt. <br />De Apprise API Url moet het volledige URL-pad zijn om de notificatie te verzenden, b.v., als je API-instantie draait op <code>http://192.168.1.1:8337</code> dan zou je <code>http://192.168.1.1:8337/notify</code> gebruiken.",
|
||||||
"MessageAsinCheck": "Zorg ervoor dat u de ASIN van de juiste Audible-regio gebruikt, niet die van Amazon.",
|
|
||||||
"MessageAuthenticationOIDCChangesRestart": "Start uw server opnieuw op nadat u het opslaan hebt uitgevoerd, om de OIDC-wijzigingen toe te passen.",
|
|
||||||
"MessageBackupsDescription": "Back-ups omvatten gebruikers, gebruikers' voortgang, bibliotheekonderdeeldetails, serverinstellingen en afbeeldingen bewaard in <code>/metadata/items</code> & <code>/metadata/authors</code>. Back-ups <strong>bevatten niet</strong> de bestanden bewaard in je bibliotheekmappen.",
|
"MessageBackupsDescription": "Back-ups omvatten gebruikers, gebruikers' voortgang, bibliotheekonderdeeldetails, serverinstellingen en afbeeldingen bewaard in <code>/metadata/items</code> & <code>/metadata/authors</code>. Back-ups <strong>bevatten niet</strong> de bestanden bewaard in je bibliotheekmappen.",
|
||||||
"MessageBackupsLocationEditNote": "Let op: het bijwerken van de back-uplocatie zal bestaande back-ups niet verplaatsen of wijzigen",
|
"MessageBackupsLocationEditNote": "Let op: het bijwerken van de back-uplocatie zal bestaande back-ups niet verplaatsen of wijzigen",
|
||||||
"MessageBackupsLocationNoEditNote": "Let op: De back-uplocatie wordt ingesteld via een omgevingsvariabele en kan hier niet worden gewijzigd.",
|
"MessageBackupsLocationNoEditNote": "Let op: De back-uplocatie wordt ingesteld via een omgevingsvariabele en kan hier niet worden gewijzigd.",
|
||||||
|
|
@ -785,8 +781,8 @@
|
||||||
"MessageImportantNotice": "Belangrijke opmerking!",
|
"MessageImportantNotice": "Belangrijke opmerking!",
|
||||||
"MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen",
|
"MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen",
|
||||||
"MessageInvalidAsin": "Ongeldige ASIN",
|
"MessageInvalidAsin": "Ongeldige ASIN",
|
||||||
"MessageItemsSelected": "{0} items geselecteerd",
|
"MessageItemsSelected": "{0} onderdelen geselecteerd",
|
||||||
"MessageItemsUpdated": "{0} items bijgewerkt",
|
"MessageItemsUpdated": "{0} onderdelen bijgewerkt",
|
||||||
"MessageJoinUsOn": "Doe mee op",
|
"MessageJoinUsOn": "Doe mee op",
|
||||||
"MessageLoading": "Aan het laden...",
|
"MessageLoading": "Aan het laden...",
|
||||||
"MessageLoadingFolders": "Mappen aan het laden...",
|
"MessageLoadingFolders": "Mappen aan het laden...",
|
||||||
|
|
@ -853,10 +849,8 @@
|
||||||
"MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op",
|
"MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op",
|
||||||
"MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
|
"MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
|
||||||
"MessageScheduleLibraryScanNote": "Voor de meeste gebruikers is het raadzaam om deze functie uitgeschakeld te laten en de folder watcher-instelling ingeschakeld te houden. De folder watcher detecteert automatisch wijzigingen in uw bibliotheekmappen. De folder watcher werkt niet voor elk bestandssysteem (zoals NFS), dus geplande bibliotheekscans kunnen in plaats daarvan worden gebruikt.",
|
"MessageScheduleLibraryScanNote": "Voor de meeste gebruikers is het raadzaam om deze functie uitgeschakeld te laten en de folder watcher-instelling ingeschakeld te houden. De folder watcher detecteert automatisch wijzigingen in uw bibliotheekmappen. De folder watcher werkt niet voor elk bestandssysteem (zoals NFS), dus geplande bibliotheekscans kunnen in plaats daarvan worden gebruikt.",
|
||||||
"MessageScheduleRunEveryWeekdayAtTime": "Elke {0} uitvoeren op {1}",
|
|
||||||
"MessageSearchResultsFor": "Zoekresultaten voor",
|
"MessageSearchResultsFor": "Zoekresultaten voor",
|
||||||
"MessageSelected": "{0} geselecteerd",
|
"MessageSelected": "{0} geselecteerd",
|
||||||
"MessageSeriesSequenceCannotContainSpaces": "Serievolgorde mag geen spaties bevatten",
|
|
||||||
"MessageServerCouldNotBeReached": "Server niet bereikbaar",
|
"MessageServerCouldNotBeReached": "Server niet bereikbaar",
|
||||||
"MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel",
|
"MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel",
|
||||||
"MessageShareExpirationWillBe": "Vervaldatum is <strong>{0}</strong>",
|
"MessageShareExpirationWillBe": "Vervaldatum is <strong>{0}</strong>",
|
||||||
|
|
@ -918,8 +912,6 @@
|
||||||
"NotificationOnBackupCompletedDescription": "Wordt geactiveerd wanneer een back-up is voltooid",
|
"NotificationOnBackupCompletedDescription": "Wordt geactiveerd wanneer een back-up is voltooid",
|
||||||
"NotificationOnBackupFailedDescription": "Wordt geactiveerd wanneer een back-up mislukt",
|
"NotificationOnBackupFailedDescription": "Wordt geactiveerd wanneer een back-up mislukt",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Wordt geactiveerd wanneer een podcastaflevering automatisch wordt gedownload",
|
"NotificationOnEpisodeDownloadedDescription": "Wordt geactiveerd wanneer een podcastaflevering automatisch wordt gedownload",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "Wordt geactiveerd wanneer automatische afleveringsdownloads zijn uitgeschakeld vanwege te veel mislukte pogingen",
|
|
||||||
"NotificationOnRSSFeedFailedDescription": "Getriggerd wanneer de RSS feed aanvraag faalt voor een automatische aflevering download",
|
|
||||||
"NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem",
|
"NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem",
|
||||||
"PlaceholderNewCollection": "Nieuwe naam collectie",
|
"PlaceholderNewCollection": "Nieuwe naam collectie",
|
||||||
"PlaceholderNewFolderPath": "Nieuwe locatie map",
|
"PlaceholderNewFolderPath": "Nieuwe locatie map",
|
||||||
|
|
@ -964,7 +956,6 @@
|
||||||
"ToastBackupRestoreFailed": "Herstellen back-up mislukt",
|
"ToastBackupRestoreFailed": "Herstellen back-up mislukt",
|
||||||
"ToastBackupUploadFailed": "Uploaden back-up mislukt",
|
"ToastBackupUploadFailed": "Uploaden back-up mislukt",
|
||||||
"ToastBackupUploadSuccess": "Back-up geüpload",
|
"ToastBackupUploadSuccess": "Back-up geüpload",
|
||||||
"ToastBatchApplyDetailsToItemsSuccess": "Details toegepast op items",
|
|
||||||
"ToastBatchDeleteFailed": "Batch verwijderen mislukt",
|
"ToastBatchDeleteFailed": "Batch verwijderen mislukt",
|
||||||
"ToastBatchDeleteSuccess": "Batch verwijderen gelukt",
|
"ToastBatchDeleteSuccess": "Batch verwijderen gelukt",
|
||||||
"ToastBatchQuickMatchFailed": "Batch Snel Vergelijken mislukt!",
|
"ToastBatchQuickMatchFailed": "Batch Snel Vergelijken mislukt!",
|
||||||
|
|
@ -977,8 +968,6 @@
|
||||||
"ToastCachePurgeFailed": "Cache wissen is mislukt",
|
"ToastCachePurgeFailed": "Cache wissen is mislukt",
|
||||||
"ToastCachePurgeSuccess": "Cache succesvol verwijderd",
|
"ToastCachePurgeSuccess": "Cache succesvol verwijderd",
|
||||||
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
|
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
|
||||||
"ToastChaptersInvalidShiftAmountLast": "Ongeldige shift-tijd. De starttijd van het laatste hoofdstuk zou langer zijn dan de duur van dit audioboek.",
|
|
||||||
"ToastChaptersInvalidShiftAmountStart": "Ongeldige shift-lengte. Het eerste hoofdstuk zou nul of een negatieve lengte hebben en zou worden overschreven door het tweede hoofdstuk. Verleng de startduur van het tweede hoofdstuk.",
|
|
||||||
"ToastChaptersMustHaveTitles": "Hoofdstukken moeten titels hebben",
|
"ToastChaptersMustHaveTitles": "Hoofdstukken moeten titels hebben",
|
||||||
"ToastChaptersRemoved": "Hoofdstukken verwijderd",
|
"ToastChaptersRemoved": "Hoofdstukken verwijderd",
|
||||||
"ToastChaptersUpdated": "Hoofdstukken bijgewerkt",
|
"ToastChaptersUpdated": "Hoofdstukken bijgewerkt",
|
||||||
|
|
@ -1079,7 +1068,6 @@
|
||||||
"ToastSelectAtLeastOneUser": "Selecteer ten minste een gebruiker",
|
"ToastSelectAtLeastOneUser": "Selecteer ten minste een gebruiker",
|
||||||
"ToastSendEbookToDeviceFailed": "Ebook naar apparaat sturen mislukt",
|
"ToastSendEbookToDeviceFailed": "Ebook naar apparaat sturen mislukt",
|
||||||
"ToastSendEbookToDeviceSuccess": "Ebook verstuurd naar apparaat \"{0}\"",
|
"ToastSendEbookToDeviceSuccess": "Ebook verstuurd naar apparaat \"{0}\"",
|
||||||
"ToastSeriesSubmitFailedSameName": "Kan niet twee series met dezelfde naam toevoegen",
|
|
||||||
"ToastSeriesUpdateFailed": "Bijwerken serie mislukt",
|
"ToastSeriesUpdateFailed": "Bijwerken serie mislukt",
|
||||||
"ToastSeriesUpdateSuccess": "Bijwerken serie gelukt",
|
"ToastSeriesUpdateSuccess": "Bijwerken serie gelukt",
|
||||||
"ToastServerSettingsUpdateSuccess": "Server instellingen bijgewerkt",
|
"ToastServerSettingsUpdateSuccess": "Server instellingen bijgewerkt",
|
||||||
|
|
@ -1098,8 +1086,6 @@
|
||||||
"ToastUnknownError": "Onbekende fout",
|
"ToastUnknownError": "Onbekende fout",
|
||||||
"ToastUnlinkOpenIdFailed": "Gebruiker ontkoppelen van OpenID mislukt",
|
"ToastUnlinkOpenIdFailed": "Gebruiker ontkoppelen van OpenID mislukt",
|
||||||
"ToastUnlinkOpenIdSuccess": "Gebruiker ontkoppeld van OpenID",
|
"ToastUnlinkOpenIdSuccess": "Gebruiker ontkoppeld van OpenID",
|
||||||
"ToastUploaderFilepathExistsError": "Bestandspad \"{0}\" bestaat al op de server",
|
|
||||||
"ToastUploaderItemExistsInSubdirectoryError": "Item \"{0}\" gebruikt een submap van het uploadpad.",
|
|
||||||
"ToastUserDeleteFailed": "Verwijderen gebruiker mislukt",
|
"ToastUserDeleteFailed": "Verwijderen gebruiker mislukt",
|
||||||
"ToastUserDeleteSuccess": "Gebruiker verwijderd",
|
"ToastUserDeleteSuccess": "Gebruiker verwijderd",
|
||||||
"ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd",
|
"ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd",
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
"ButtonAddChapters": "Додати глави",
|
"ButtonAddChapters": "Додати глави",
|
||||||
"ButtonAddDevice": "Додати пристрій",
|
"ButtonAddDevice": "Додати пристрій",
|
||||||
"ButtonAddLibrary": "Додати бібліотеку",
|
"ButtonAddLibrary": "Додати бібліотеку",
|
||||||
"ButtonAddPodcasts": "Додати подкасти",
|
"ButtonAddPodcasts": "Додати подкаст",
|
||||||
"ButtonAddUser": "Додати користувача",
|
"ButtonAddUser": "Додати користувача",
|
||||||
"ButtonAddYourFirstLibrary": "Додайте вашу першу бібліотеку",
|
"ButtonAddYourFirstLibrary": "Додайте вашу першу бібліотеку",
|
||||||
"ButtonApply": "Застосувати",
|
"ButtonApply": "Застосувати",
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
"ButtonCancel": "Скасувати",
|
"ButtonCancel": "Скасувати",
|
||||||
"ButtonCancelEncode": "Скасувати кодування",
|
"ButtonCancelEncode": "Скасувати кодування",
|
||||||
"ButtonChangeRootPassword": "Змінити кореневий пароль",
|
"ButtonChangeRootPassword": "Змінити кореневий пароль",
|
||||||
"ButtonCheckAndDownloadNewEpisodes": "Перевірити та скачати нові епізоди",
|
"ButtonCheckAndDownloadNewEpisodes": "Перевірити та завантажити нові епізоди",
|
||||||
"ButtonChooseAFolder": "Обрати теку",
|
"ButtonChooseAFolder": "Обрати теку",
|
||||||
"ButtonChooseFiles": "Обрати файли",
|
"ButtonChooseFiles": "Обрати файли",
|
||||||
"ButtonClearFilter": "Очистити фільтр",
|
"ButtonClearFilter": "Очистити фільтр",
|
||||||
|
|
@ -32,8 +32,8 @@
|
||||||
"ButtonEditChapters": "Редагувати глави",
|
"ButtonEditChapters": "Редагувати глави",
|
||||||
"ButtonEditPodcast": "Редагувати подкаст",
|
"ButtonEditPodcast": "Редагувати подкаст",
|
||||||
"ButtonEnable": "Увімкнути",
|
"ButtonEnable": "Увімкнути",
|
||||||
"ButtonFireAndFail": "Виконати і завершити з помилкою",
|
"ButtonFireAndFail": "Вогонь і невдача",
|
||||||
"ButtonFireOnTest": "Виконати подію onTest",
|
"ButtonFireOnTest": "Випробування на вогнестійкість",
|
||||||
"ButtonForceReScan": "Примусово сканувати",
|
"ButtonForceReScan": "Примусово сканувати",
|
||||||
"ButtonFullPath": "Повний шлях",
|
"ButtonFullPath": "Повний шлях",
|
||||||
"ButtonHide": "Приховати",
|
"ButtonHide": "Приховати",
|
||||||
|
|
@ -57,7 +57,7 @@
|
||||||
"ButtonOpenFeed": "Відкрити стрічку",
|
"ButtonOpenFeed": "Відкрити стрічку",
|
||||||
"ButtonOpenManager": "Відкрити менеджер",
|
"ButtonOpenManager": "Відкрити менеджер",
|
||||||
"ButtonPause": "Пауза",
|
"ButtonPause": "Пауза",
|
||||||
"ButtonPlay": "Відтворити",
|
"ButtonPlay": "Слухати",
|
||||||
"ButtonPlayAll": "Відтворити все",
|
"ButtonPlayAll": "Відтворити все",
|
||||||
"ButtonPlaying": "Відтворюється",
|
"ButtonPlaying": "Відтворюється",
|
||||||
"ButtonPlaylists": "Списки відтворення",
|
"ButtonPlaylists": "Списки відтворення",
|
||||||
|
|
@ -86,7 +86,7 @@
|
||||||
"ButtonResetToDefault": "Скинути до стандартних",
|
"ButtonResetToDefault": "Скинути до стандартних",
|
||||||
"ButtonRestore": "Відновити",
|
"ButtonRestore": "Відновити",
|
||||||
"ButtonSave": "Зберегти",
|
"ButtonSave": "Зберегти",
|
||||||
"ButtonSaveAndClose": "Зберегти і закрити",
|
"ButtonSaveAndClose": "Зберегти та закрити",
|
||||||
"ButtonSaveTracklist": "Зберегти порядок",
|
"ButtonSaveTracklist": "Зберегти порядок",
|
||||||
"ButtonScan": "Сканувати",
|
"ButtonScan": "Сканувати",
|
||||||
"ButtonScanLibrary": "Сканувати бібліотеку",
|
"ButtonScanLibrary": "Сканувати бібліотеку",
|
||||||
|
|
@ -103,7 +103,7 @@
|
||||||
"ButtonStartMetadataEmbed": "Почати вбудування метаданих",
|
"ButtonStartMetadataEmbed": "Почати вбудування метаданих",
|
||||||
"ButtonStats": "Статистика",
|
"ButtonStats": "Статистика",
|
||||||
"ButtonSubmit": "Надіслати",
|
"ButtonSubmit": "Надіслати",
|
||||||
"ButtonTest": "Тест",
|
"ButtonTest": "Перевірити",
|
||||||
"ButtonUnlinkOpenId": "Вимкнути OpenID",
|
"ButtonUnlinkOpenId": "Вимкнути OpenID",
|
||||||
"ButtonUpload": "Завантажити",
|
"ButtonUpload": "Завантажити",
|
||||||
"ButtonUploadBackup": "Завантажити резервну копію",
|
"ButtonUploadBackup": "Завантажити резервну копію",
|
||||||
|
|
@ -115,7 +115,7 @@
|
||||||
"ButtonYes": "Так",
|
"ButtonYes": "Так",
|
||||||
"ErrorUploadFetchMetadataAPI": "Помилка при отриманні метаданих",
|
"ErrorUploadFetchMetadataAPI": "Помилка при отриманні метаданих",
|
||||||
"ErrorUploadFetchMetadataNoResults": "Не вдалося отримати метадані — спробуйте оновити заголовок та/або автора",
|
"ErrorUploadFetchMetadataNoResults": "Не вдалося отримати метадані — спробуйте оновити заголовок та/або автора",
|
||||||
"ErrorUploadLacksTitle": "Потрібна назва",
|
"ErrorUploadLacksTitle": "Назва обов'язкова",
|
||||||
"HeaderAccount": "Профіль",
|
"HeaderAccount": "Профіль",
|
||||||
"HeaderAddCustomMetadataProvider": "Додати користувацький постачальник метаданих",
|
"HeaderAddCustomMetadataProvider": "Додати користувацький постачальник метаданих",
|
||||||
"HeaderAdvanced": "Розширені",
|
"HeaderAdvanced": "Розширені",
|
||||||
|
|
@ -130,11 +130,11 @@
|
||||||
"HeaderCollection": "Добірка",
|
"HeaderCollection": "Добірка",
|
||||||
"HeaderCollectionItems": "Елементи добірки",
|
"HeaderCollectionItems": "Елементи добірки",
|
||||||
"HeaderCover": "Обкладинка",
|
"HeaderCover": "Обкладинка",
|
||||||
"HeaderCurrentDownloads": "Поточні скачування",
|
"HeaderCurrentDownloads": "Поточні завантаження",
|
||||||
"HeaderCustomMessageOnLogin": "Повідомлення при вході",
|
"HeaderCustomMessageOnLogin": "Повідомлення при вході",
|
||||||
"HeaderCustomMetadataProviders": "Постачальники метаданих",
|
"HeaderCustomMetadataProviders": "Постачальники метаданих",
|
||||||
"HeaderDetails": "Подробиці",
|
"HeaderDetails": "Подробиці",
|
||||||
"HeaderDownloadQueue": "Черга скачувань",
|
"HeaderDownloadQueue": "Черга завантажень",
|
||||||
"HeaderEbookFiles": "Файли електронних книг",
|
"HeaderEbookFiles": "Файли електронних книг",
|
||||||
"HeaderEmail": "Електронна пошта",
|
"HeaderEmail": "Електронна пошта",
|
||||||
"HeaderEmailSettings": "Налаштування електронної пошти",
|
"HeaderEmailSettings": "Налаштування електронної пошти",
|
||||||
|
|
@ -152,13 +152,13 @@
|
||||||
"HeaderLibraryFiles": "Файли бібліотеки",
|
"HeaderLibraryFiles": "Файли бібліотеки",
|
||||||
"HeaderLibraryStats": "Статистика бібліотеки",
|
"HeaderLibraryStats": "Статистика бібліотеки",
|
||||||
"HeaderListeningSessions": "Сеанси прослуховування",
|
"HeaderListeningSessions": "Сеанси прослуховування",
|
||||||
"HeaderListeningStats": "Статистика прослуховування",
|
"HeaderListeningStats": "Статистика відтворення",
|
||||||
"HeaderLogin": "Вхід",
|
"HeaderLogin": "Вхід",
|
||||||
"HeaderLogs": "Журнал",
|
"HeaderLogs": "Журнал",
|
||||||
"HeaderManageGenres": "Керувати жанрами",
|
"HeaderManageGenres": "Керувати жанрами",
|
||||||
"HeaderManageTags": "Керувати мітками",
|
"HeaderManageTags": "Керувати мітками",
|
||||||
"HeaderMapDetails": "Призначити подробиці",
|
"HeaderMapDetails": "Призначити подробиці",
|
||||||
"HeaderMatch": "Допасуй",
|
"HeaderMatch": "Пошук",
|
||||||
"HeaderMetadataOrderOfPrecedence": "Порядок метаданих",
|
"HeaderMetadataOrderOfPrecedence": "Порядок метаданих",
|
||||||
"HeaderMetadataToEmbed": "Вбудувати метадані",
|
"HeaderMetadataToEmbed": "Вбудувати метадані",
|
||||||
"HeaderNewAccount": "Новий профіль",
|
"HeaderNewAccount": "Новий профіль",
|
||||||
|
|
@ -176,7 +176,7 @@
|
||||||
"HeaderPlayerSettings": "Налаштування програвача",
|
"HeaderPlayerSettings": "Налаштування програвача",
|
||||||
"HeaderPlaylist": "Список відтворення",
|
"HeaderPlaylist": "Список відтворення",
|
||||||
"HeaderPlaylistItems": "Елементи списку відтворення",
|
"HeaderPlaylistItems": "Елементи списку відтворення",
|
||||||
"HeaderPodcastsToAdd": "Подкасти для додання",
|
"HeaderPodcastsToAdd": "Додати подкасти",
|
||||||
"HeaderPresets": "Пресети",
|
"HeaderPresets": "Пресети",
|
||||||
"HeaderPreviewCover": "Попередній перегляд",
|
"HeaderPreviewCover": "Попередній перегляд",
|
||||||
"HeaderRSSFeedGeneral": "Подробиці RSS",
|
"HeaderRSSFeedGeneral": "Подробиці RSS",
|
||||||
|
|
@ -186,7 +186,7 @@
|
||||||
"HeaderRemoveEpisodes": "Видалити епізодів: {0}",
|
"HeaderRemoveEpisodes": "Видалити епізодів: {0}",
|
||||||
"HeaderSavedMediaProgress": "Збережений прогрес медіа",
|
"HeaderSavedMediaProgress": "Збережений прогрес медіа",
|
||||||
"HeaderSchedule": "Розклад",
|
"HeaderSchedule": "Розклад",
|
||||||
"HeaderScheduleEpisodeDownloads": "Запланувати автоматичне скачування епізодів",
|
"HeaderScheduleEpisodeDownloads": "Запланувати автоматичне завантаження епізодів",
|
||||||
"HeaderScheduleLibraryScans": "Розклад автосканування бібліотеки",
|
"HeaderScheduleLibraryScans": "Розклад автосканування бібліотеки",
|
||||||
"HeaderSession": "Сеанс",
|
"HeaderSession": "Сеанс",
|
||||||
"HeaderSetBackupSchedule": "Встановити розклад резервного копіювання",
|
"HeaderSetBackupSchedule": "Встановити розклад резервного копіювання",
|
||||||
|
|
@ -223,21 +223,21 @@
|
||||||
"LabelActivities": "Діяльність",
|
"LabelActivities": "Діяльність",
|
||||||
"LabelActivity": "Активність",
|
"LabelActivity": "Активність",
|
||||||
"LabelAddToCollection": "Додати у добірку",
|
"LabelAddToCollection": "Додати у добірку",
|
||||||
"LabelAddToCollectionBatch": "Додати {0} книг до добірки",
|
"LabelAddToCollectionBatch": "Додати книги до добірки: {0}",
|
||||||
"LabelAddToPlaylist": "Додати до списку відтворення",
|
"LabelAddToPlaylist": "Додати до списку відтворення",
|
||||||
"LabelAddToPlaylistBatch": "Додати {0} елементів до списку відтворення",
|
"LabelAddToPlaylistBatch": "Додано елементів у список відтворення: {0}",
|
||||||
"LabelAddedAt": "Дата додавання",
|
"LabelAddedAt": "Дата додавання",
|
||||||
"LabelAddedDate": "Додано {0}",
|
"LabelAddedDate": "Додано {0}",
|
||||||
"LabelAdminUsersOnly": "Тільки для адміністраторів",
|
"LabelAdminUsersOnly": "Тільки для адміністраторів",
|
||||||
"LabelAll": "Усе",
|
"LabelAll": "Усе",
|
||||||
"LabelAllEpisodesDownloaded": "Усі епізоди скачано",
|
"LabelAllEpisodesDownloaded": "Усі серії завантажено",
|
||||||
"LabelAllUsers": "Усі користувачі",
|
"LabelAllUsers": "Усі користувачі",
|
||||||
"LabelAllUsersExcludingGuests": "Усі, крім гостей",
|
"LabelAllUsersExcludingGuests": "Усі, крім гостей",
|
||||||
"LabelAllUsersIncludingGuests": "Усі, включно з гостями",
|
"LabelAllUsersIncludingGuests": "Усі, включно з гостями",
|
||||||
"LabelAlreadyInYourLibrary": "Вже у вашій бібліотеці",
|
"LabelAlreadyInYourLibrary": "Вже у вашій бібліотеці",
|
||||||
"LabelApiToken": "Токен API",
|
"LabelApiToken": "Токен API",
|
||||||
"LabelAppend": "Додати",
|
"LabelAppend": "Додати",
|
||||||
"LabelAudioBitrate": "Бітрейт аудіо (наприклад, 128k)",
|
"LabelAudioBitrate": "Бітрейт аудіо (напр. 128k)",
|
||||||
"LabelAudioChannels": "Канали аудіо (1 або 2)",
|
"LabelAudioChannels": "Канали аудіо (1 або 2)",
|
||||||
"LabelAudioCodec": "Аудіокодек",
|
"LabelAudioCodec": "Аудіокодек",
|
||||||
"LabelAuthor": "Автор",
|
"LabelAuthor": "Автор",
|
||||||
|
|
@ -256,18 +256,18 @@
|
||||||
"LabelBackupLocation": "Розташування резервних копій",
|
"LabelBackupLocation": "Розташування резервних копій",
|
||||||
"LabelBackupsEnableAutomaticBackups": "Автоматичне резервне копіювання",
|
"LabelBackupsEnableAutomaticBackups": "Автоматичне резервне копіювання",
|
||||||
"LabelBackupsEnableAutomaticBackupsHelp": "Резервні копії збережено у /metadata/backups",
|
"LabelBackupsEnableAutomaticBackupsHelp": "Резервні копії збережено у /metadata/backups",
|
||||||
"LabelBackupsMaxBackupSize": "Максимальний розмір резервної копії (у ГБ) (0 — без обмежень)",
|
"LabelBackupsMaxBackupSize": "Максимальний розмір резервної копії (у ГБ) (0 — необмежене)",
|
||||||
"LabelBackupsMaxBackupSizeHelp": "У якості захисту від неправильного налаштування, резервну копію не буде збережено, якщо її розмір перевищуватиме вказаний.",
|
"LabelBackupsMaxBackupSizeHelp": "У якості захисту від неправильного налаштування, резервну копію не буде збережено, якщо її розмір перевищуватиме вказаний.",
|
||||||
"LabelBackupsNumberToKeep": "Кількість резервних копій",
|
"LabelBackupsNumberToKeep": "Кількість резервних копій",
|
||||||
"LabelBackupsNumberToKeepHelp": "Видаляється лише 1 резервна копія за раз, тому якщо у вас більше копій, видаліть їх вручну.",
|
"LabelBackupsNumberToKeepHelp": "Лиш 1 резервну копію буде видалено за раз, тож якщо їх багато, то вам варто видалити їх вручну.",
|
||||||
"LabelBitrate": "Бітрейт",
|
"LabelBitrate": "Бітрейт",
|
||||||
"LabelBonus": "Бонус",
|
"LabelBonus": "Бонус",
|
||||||
"LabelBooks": "Книг",
|
"LabelBooks": "Книги",
|
||||||
"LabelButtonText": "Текст кнопки",
|
"LabelButtonText": "Текст кнопки",
|
||||||
"LabelByAuthor": "від {0}",
|
"LabelByAuthor": "від {0}",
|
||||||
"LabelChangePassword": "Змінити пароль",
|
"LabelChangePassword": "Змінити пароль",
|
||||||
"LabelChannels": "Канали",
|
"LabelChannels": "Канали",
|
||||||
"LabelChapterCount": "{0} глав",
|
"LabelChapterCount": "{0} Глав",
|
||||||
"LabelChapterTitle": "Назва глави",
|
"LabelChapterTitle": "Назва глави",
|
||||||
"LabelChapters": "Глави",
|
"LabelChapters": "Глави",
|
||||||
"LabelChaptersFound": "глав знайдено",
|
"LabelChaptersFound": "глав знайдено",
|
||||||
|
|
@ -304,9 +304,9 @@
|
||||||
"LabelDiscFromFilename": "Диск за назвою файлу",
|
"LabelDiscFromFilename": "Диск за назвою файлу",
|
||||||
"LabelDiscFromMetadata": "Диск за метаданими",
|
"LabelDiscFromMetadata": "Диск за метаданими",
|
||||||
"LabelDiscover": "Огляд",
|
"LabelDiscover": "Огляд",
|
||||||
"LabelDownload": "Скачати",
|
"LabelDownload": "Завантажити",
|
||||||
"LabelDownloadNEpisodes": "Скачати {0} епізодів",
|
"LabelDownloadNEpisodes": "Завантажити епізодів: {0}",
|
||||||
"LabelDownloadable": "Можна скачати",
|
"LabelDownloadable": "Можна завантажити",
|
||||||
"LabelDuration": "Тривалість",
|
"LabelDuration": "Тривалість",
|
||||||
"LabelDurationComparisonExactMatch": "(повний збіг)",
|
"LabelDurationComparisonExactMatch": "(повний збіг)",
|
||||||
"LabelDurationComparisonLonger": "(на {0} довше)",
|
"LabelDurationComparisonLonger": "(на {0} довше)",
|
||||||
|
|
@ -353,9 +353,9 @@
|
||||||
"LabelFeedURL": "Адреса стрічки",
|
"LabelFeedURL": "Адреса стрічки",
|
||||||
"LabelFetchingMetadata": "Отримання метаданих",
|
"LabelFetchingMetadata": "Отримання метаданих",
|
||||||
"LabelFile": "Файл",
|
"LabelFile": "Файл",
|
||||||
"LabelFileBirthtime": "Дата створення файлу",
|
"LabelFileBirthtime": "Дата створення",
|
||||||
"LabelFileBornDate": "Народився {0}",
|
"LabelFileBornDate": "Народився {0}",
|
||||||
"LabelFileModified": "Дата зміни файлу",
|
"LabelFileModified": "Дата змінення",
|
||||||
"LabelFileModifiedDate": "Змінено {0}",
|
"LabelFileModifiedDate": "Змінено {0}",
|
||||||
"LabelFilename": "Ім'я файлу",
|
"LabelFilename": "Ім'я файлу",
|
||||||
"LabelFilterByUser": "Фільтрувати за користувачем",
|
"LabelFilterByUser": "Фільтрувати за користувачем",
|
||||||
|
|
@ -395,7 +395,7 @@
|
||||||
"LabelIntervalEvery6Hours": "Кожні 6 годин",
|
"LabelIntervalEvery6Hours": "Кожні 6 годин",
|
||||||
"LabelIntervalEveryDay": "Щодня",
|
"LabelIntervalEveryDay": "Щодня",
|
||||||
"LabelIntervalEveryHour": "Щогодини",
|
"LabelIntervalEveryHour": "Щогодини",
|
||||||
"LabelIntervalEveryMinute": "Щохвилини",
|
"LabelIntervalEveryMinute": "Кожну хвилину",
|
||||||
"LabelInvert": "Інвертувати",
|
"LabelInvert": "Інвертувати",
|
||||||
"LabelItem": "Елемент",
|
"LabelItem": "Елемент",
|
||||||
"LabelJumpBackwardAmount": "Час переходу назад",
|
"LabelJumpBackwardAmount": "Час переходу назад",
|
||||||
|
|
@ -427,10 +427,10 @@
|
||||||
"LabelLowestPriority": "Найнижчий пріоритет",
|
"LabelLowestPriority": "Найнижчий пріоритет",
|
||||||
"LabelMatchExistingUsersBy": "Шукати наявних користувачів за",
|
"LabelMatchExistingUsersBy": "Шукати наявних користувачів за",
|
||||||
"LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO",
|
"LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO",
|
||||||
"LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для скачування. Використовуйте 0 для необмеженої кількості.",
|
"LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для завантаження. Використовуйте 0 для необмеженої кількості.",
|
||||||
"LabelMaxEpisodesToDownloadPerCheck": "Максимальна кількість нових епізодів для скачування за перевірку",
|
"LabelMaxEpisodesToDownloadPerCheck": "Максимальна кількість нових епізодів для завантаження за перевірку",
|
||||||
"LabelMaxEpisodesToKeep": "Максимальна кількість епізодів для зберігання",
|
"LabelMaxEpisodesToKeep": "Максимальна кількість епізодів для зберігання",
|
||||||
"LabelMaxEpisodesToKeepHelp": "Значення 0 — без обмежень. Після автоматичного завантаження нового епізоду буде видалено найстаріший, якщо їх більше X. Видаляється лише 1 епізод за одне нове завантаження.",
|
"LabelMaxEpisodesToKeepHelp": "Значення 0 не встановлює обмеження. Після автоматичного завантаження нового епізоду, буде видалено найстаріший епізод, якщо у вас більше ніж X епізодів. Видаляється лише 1 епізод за одне нове завантаження.",
|
||||||
"LabelMediaPlayer": "Програвач медіа",
|
"LabelMediaPlayer": "Програвач медіа",
|
||||||
"LabelMediaType": "Тип медіа",
|
"LabelMediaType": "Тип медіа",
|
||||||
"LabelMetaTag": "Метатег",
|
"LabelMetaTag": "Метатег",
|
||||||
|
|
@ -485,7 +485,7 @@
|
||||||
"LabelPermissionsAccessExplicitContent": "Доступ до відвертого вмісту",
|
"LabelPermissionsAccessExplicitContent": "Доступ до відвертого вмісту",
|
||||||
"LabelPermissionsCreateEreader": "Можна створити читалку",
|
"LabelPermissionsCreateEreader": "Можна створити читалку",
|
||||||
"LabelPermissionsDelete": "Може видаляти",
|
"LabelPermissionsDelete": "Може видаляти",
|
||||||
"LabelPermissionsDownload": "Може скачувати",
|
"LabelPermissionsDownload": "Може завантажувати",
|
||||||
"LabelPermissionsUpdate": "Може оновлювати",
|
"LabelPermissionsUpdate": "Може оновлювати",
|
||||||
"LabelPermissionsUpload": "Може завантажувати",
|
"LabelPermissionsUpload": "Може завантажувати",
|
||||||
"LabelPersonalYearReview": "Ваші підсумки року ({0})",
|
"LabelPersonalYearReview": "Ваші підсумки року ({0})",
|
||||||
|
|
@ -542,8 +542,8 @@
|
||||||
"LabelSeason": "Сезон",
|
"LabelSeason": "Сезон",
|
||||||
"LabelSeasonNumber": "Сезон #{0}",
|
"LabelSeasonNumber": "Сезон #{0}",
|
||||||
"LabelSelectAll": "Вибрати все",
|
"LabelSelectAll": "Вибрати все",
|
||||||
"LabelSelectAllEpisodes": "Вибрати всі епізоди",
|
"LabelSelectAllEpisodes": "Вибрати всі серії",
|
||||||
"LabelSelectEpisodesShowing": "Вибрати {0} показаних епізодів",
|
"LabelSelectEpisodesShowing": "Обрати показані епізоди: {0}",
|
||||||
"LabelSelectUsers": "Вибрати користувачів",
|
"LabelSelectUsers": "Вибрати користувачів",
|
||||||
"LabelSendEbookToDevice": "Надіслати електронну книгу на...",
|
"LabelSendEbookToDevice": "Надіслати електронну книгу на...",
|
||||||
"LabelSequence": "Послідовність",
|
"LabelSequence": "Послідовність",
|
||||||
|
|
@ -595,7 +595,7 @@
|
||||||
"LabelSettingsStoreMetadataWithItemHelp": "За замовчуванням файли метаданих зберігаються у /metadata/items. Цей параметр увімкне збереження метаданих у теці елемента бібліотеки",
|
"LabelSettingsStoreMetadataWithItemHelp": "За замовчуванням файли метаданих зберігаються у /metadata/items. Цей параметр увімкне збереження метаданих у теці елемента бібліотеки",
|
||||||
"LabelSettingsTimeFormat": "Формат часу",
|
"LabelSettingsTimeFormat": "Формат часу",
|
||||||
"LabelShare": "Поділитися",
|
"LabelShare": "Поділитися",
|
||||||
"LabelShareDownloadableHelp": "Дозволяє користувачам із посиланням для спільного доступу скачування zip-файлу елемента бібліотеки.",
|
"LabelShareDownloadableHelp": "Дозволяє користувачам із посиланням для спільного доступу завантажувати zip-файл елемента бібліотеки.",
|
||||||
"LabelShareOpen": "Поділитися відкрито",
|
"LabelShareOpen": "Поділитися відкрито",
|
||||||
"LabelShareURL": "Поділитися URL",
|
"LabelShareURL": "Поділитися URL",
|
||||||
"LabelShowAll": "Показати все",
|
"LabelShowAll": "Показати все",
|
||||||
|
|
@ -714,19 +714,19 @@
|
||||||
"MessageBackupsLocationNoEditNote": "Примітка: розташування резервної копії встановлюється за допомогою змінної середовища та не може бути змінене тут.",
|
"MessageBackupsLocationNoEditNote": "Примітка: розташування резервної копії встановлюється за допомогою змінної середовища та не може бути змінене тут.",
|
||||||
"MessageBackupsLocationPathEmpty": "Шлях розташування резервної копії не може бути порожнім",
|
"MessageBackupsLocationPathEmpty": "Шлях розташування резервної копії не може бути порожнім",
|
||||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Заповнити увімкнені поля даними з усіх елементів. Поля з кількома значеннями буде об’єднано",
|
"MessageBatchEditPopulateMapDetailsAllHelp": "Заповнити увімкнені поля даними з усіх елементів. Поля з кількома значеннями буде об’єднано",
|
||||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Заповнити увімкнені поля деталізації даними з цього елемента",
|
"MessageBatchEditPopulateMapDetailsItemHelp": "Заповніть увімкнені поля деталей карти даними з цього елемента",
|
||||||
"MessageBatchQuickMatchDescription": "Швидкий пошук спробує знайти відсутні обкладинки та метадані обраних елементів. Увімкніть налаштування нижче, аби дозволити заміну наявних обкладинок та/або метаданих під час швидкого пошуку.",
|
"MessageBatchQuickMatchDescription": "Швидкий пошук спробує знайти відсутні обкладинки та метадані обраних елементів. Увімкніть налаштування нижче, аби дозволити заміну наявних обкладинок та/або метаданих під час швидкого пошуку.",
|
||||||
"MessageBookshelfNoCollections": "Ви ще не створили жодної добірки",
|
"MessageBookshelfNoCollections": "Ви не створили жодної добірки",
|
||||||
"MessageBookshelfNoCollectionsHelp": "Колекції публічні. Їх можуть бачити всі користувачі, які мають доступ до бібліотеки.",
|
"MessageBookshelfNoCollectionsHelp": "Колекції публічні. Їх можуть бачити всі користувачі, які мають доступ до бібліотеки.",
|
||||||
"MessageBookshelfNoRSSFeeds": "Немає відкритих RSS-каналів",
|
"MessageBookshelfNoRSSFeeds": "Немає відкритих RSS-каналів",
|
||||||
"MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"",
|
"MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"",
|
||||||
"MessageBookshelfNoResultsForQuery": "Немає результатів за запитом",
|
"MessageBookshelfNoResultsForQuery": "Немає результатів за запитом",
|
||||||
"MessageBookshelfNoSeries": "У вас немає серій",
|
"MessageBookshelfNoSeries": "Серії відсутні",
|
||||||
"MessageChapterEndIsAfter": "Кінець глави після завершення аудіокниги",
|
"MessageChapterEndIsAfter": "Кінець глави знаходиться після закінчення книги",
|
||||||
"MessageChapterErrorFirstNotZero": "Перша глава повинна починатися з 0",
|
"MessageChapterErrorFirstNotZero": "Перша глава мусить починатися з 0",
|
||||||
"MessageChapterErrorStartGteDuration": "Час початку має бути меншим за тривалість аудіокниги",
|
"MessageChapterErrorStartGteDuration": "Час початку мусить бути меншим за тривалість аудіокниги",
|
||||||
"MessageChapterErrorStartLtPrev": "Час початку має бути більшим або рівним часу початку попередньої глави",
|
"MessageChapterErrorStartLtPrev": "Неприпустимий час початку, має бути більшим за час початку попередньої глави",
|
||||||
"MessageChapterStartIsAfter": "Початок глави після завершення аудіокниги",
|
"MessageChapterStartIsAfter": "Початок глави знаходиться після закінчення книги",
|
||||||
"MessageChaptersNotFound": "Розділи не знайдені",
|
"MessageChaptersNotFound": "Розділи не знайдені",
|
||||||
"MessageCheckingCron": "Перевірка планувальника...",
|
"MessageCheckingCron": "Перевірка планувальника...",
|
||||||
"MessageConfirmCloseFeed": "Ви дійсно бажаєте закрити цей канал?",
|
"MessageConfirmCloseFeed": "Ви дійсно бажаєте закрити цей канал?",
|
||||||
|
|
@ -734,25 +734,25 @@
|
||||||
"MessageConfirmDeleteDevice": "Ви впевнені, що хочете видалити пристрій для читання \"{0}\"?",
|
"MessageConfirmDeleteDevice": "Ви впевнені, що хочете видалити пристрій для читання \"{0}\"?",
|
||||||
"MessageConfirmDeleteFile": "Файл буде видалено з вашої файлової системи. Ви впевнені?",
|
"MessageConfirmDeleteFile": "Файл буде видалено з вашої файлової системи. Ви впевнені?",
|
||||||
"MessageConfirmDeleteLibrary": "Ви дійсно бажаєте назавжди видалити бібліотеку \"{0}\"?",
|
"MessageConfirmDeleteLibrary": "Ви дійсно бажаєте назавжди видалити бібліотеку \"{0}\"?",
|
||||||
"MessageConfirmDeleteLibraryItem": "Елемент бібліотеки буде видалено з бази даних і файлової системи. Ви впевнені?",
|
"MessageConfirmDeleteLibraryItem": "Елемент бібліотеки буде видалено з бази даних та вашої файлової системи. Ви впевнені?",
|
||||||
"MessageConfirmDeleteLibraryItems": "Буде видалено {0} елементів бібліотеки з бази даних і файлової системи. Ви впевнені?",
|
"MessageConfirmDeleteLibraryItems": "З бази даних та вашої файлової системи будуть видалені елементи бібліотеки: {0}. Ви впевнені?",
|
||||||
"MessageConfirmDeleteMetadataProvider": "Ви впевнені, що хочете видалити користувацького постачальника метаданих \"{0}\"?",
|
"MessageConfirmDeleteMetadataProvider": "Ви впевнені, що хочете видалити користувацького постачальника метаданих \"{0}\"?",
|
||||||
"MessageConfirmDeleteNotification": "Ви впевнені, що хочете видалити це сповіщення?",
|
"MessageConfirmDeleteNotification": "Ви впевнені, що хочете видалити це сповіщення?",
|
||||||
"MessageConfirmDeleteSession": "Ви дійсно бажаєте видалити цей сеанс?",
|
"MessageConfirmDeleteSession": "Ви дійсно бажаєте видалити цей сеанс?",
|
||||||
"MessageConfirmEmbedMetadataInAudioFiles": "Ви впевнені, що хочете вбудувати метадані у {0} аудіофайлів?",
|
"MessageConfirmEmbedMetadataInAudioFiles": "Ви впевнені, що хочете вставити метадані в {0} аудіофайлів?",
|
||||||
"MessageConfirmForceReScan": "Ви дійсно бажаєте примусово пересканувати?",
|
"MessageConfirmForceReScan": "Ви дійсно бажаєте примусово пересканувати?",
|
||||||
"MessageConfirmMarkAllEpisodesFinished": "Ви впевнені, що хочете позначити всі епізоди завершеними?",
|
"MessageConfirmMarkAllEpisodesFinished": "Ви дійсно бажаєте позначити усі епізоди завершеними?",
|
||||||
"MessageConfirmMarkAllEpisodesNotFinished": "Ви впевнені, що хочете позначити всі епізоди незавершеними?",
|
"MessageConfirmMarkAllEpisodesNotFinished": "Ви дійсно бажаєте позначити усі епізоди незавершеними?",
|
||||||
"MessageConfirmMarkItemFinished": "Ви впевнені, що хочете позначити \"{0}\" як завершене?",
|
"MessageConfirmMarkItemFinished": "Ви впевнені, що хочете позначити \"{0}\" як завершене?",
|
||||||
"MessageConfirmMarkItemNotFinished": "Ви впевнені, що хочете позначити \"{0}\" як незавершене?",
|
"MessageConfirmMarkItemNotFinished": "Ви впевнені, що хочете позначити \"{0}\" як незавершене?",
|
||||||
"MessageConfirmMarkSeriesFinished": "Ви дійсно бажаєте позначити усі книги серії завершеними?",
|
"MessageConfirmMarkSeriesFinished": "Ви дійсно бажаєте позначити усі книги серії завершеними?",
|
||||||
"MessageConfirmMarkSeriesNotFinished": "Ви дійсно бажаєте позначити всі книги серії незавершеними?",
|
"MessageConfirmMarkSeriesNotFinished": "Ви дійсно бажаєте позначити всі книги серії незавершеними?",
|
||||||
"MessageConfirmNotificationTestTrigger": "Активувати це сповіщення з тестовими даними?",
|
"MessageConfirmNotificationTestTrigger": "Активувати це сповіщення з тестовими даними?",
|
||||||
"MessageConfirmPurgeCache": "Очищення кешу видалить всю теку <code>/metadata/cache</code>. <br /><br />Ви впевнені, що хочете видалити теку кешу?",
|
"MessageConfirmPurgeCache": "Очищення кешу видалить усю теку <code>/metadata/cache</code>. <br /><br />Ви дійсно бажаєте видалити теку кешу?",
|
||||||
"MessageConfirmPurgeItemsCache": "Очищення кешу елементів видалить всю теку <code>/metadata/cache/items</code>.<br />Ви впевнені?",
|
"MessageConfirmPurgeItemsCache": "Очищення кешу елементів видалить усю теку <code>/metadata/cache/items</code>. <br />Ви певні?",
|
||||||
"MessageConfirmQuickEmbed": "Увага! Швидке вбудовування не створює резервних копій ваших аудіофайлів. Переконайтеся, що маєте резервну копію. <br><br>Продовжити?",
|
"MessageConfirmQuickEmbed": "Увага! Швидке вбудування не створює резервних копій ваших аудіо. Переконайтеся, що маєте копію ваших файлів.<br><br>Продовжити?",
|
||||||
"MessageConfirmQuickMatchEpisodes": "Швидке співставлення епізодів перезапише подробиці, якщо знайдено відповідність. Оновлюються лише невідповідні епізоди. Ви впевнені?",
|
"MessageConfirmQuickMatchEpisodes": "При виявленні співпадінь інформація про епізоди швидкого пошуку буде перезаписана. Будуть оновлені тільки несуперечливі епізоди. Ви впевнені?",
|
||||||
"MessageConfirmReScanLibraryItems": "Ви впевнені, що хочете пересканувати {0} елементів?",
|
"MessageConfirmReScanLibraryItems": "Ви дійсно бажаєте пересканувати елементи: {0}?",
|
||||||
"MessageConfirmRemoveAllChapters": "Ви дійсно бажаєте видалити усі глави?",
|
"MessageConfirmRemoveAllChapters": "Ви дійсно бажаєте видалити усі глави?",
|
||||||
"MessageConfirmRemoveAuthor": "Ви дійсно бажаєте видалити автора \"{0}\"?",
|
"MessageConfirmRemoveAuthor": "Ви дійсно бажаєте видалити автора \"{0}\"?",
|
||||||
"MessageConfirmRemoveCollection": "Ви дійсно бажаєте видалити добірку \"{0}\"?",
|
"MessageConfirmRemoveCollection": "Ви дійсно бажаєте видалити добірку \"{0}\"?",
|
||||||
|
|
@ -761,44 +761,44 @@
|
||||||
"MessageConfirmRemoveListeningSessions": "Ви дійсно бажаєте видалити сеанси прослуховування: {0}?",
|
"MessageConfirmRemoveListeningSessions": "Ви дійсно бажаєте видалити сеанси прослуховування: {0}?",
|
||||||
"MessageConfirmRemoveMetadataFiles": "Ви впевнені, що хочете видалити всі файли metadata.{0} у папках елементів вашої бібліотеки?",
|
"MessageConfirmRemoveMetadataFiles": "Ви впевнені, що хочете видалити всі файли metadata.{0} у папках елементів вашої бібліотеки?",
|
||||||
"MessageConfirmRemoveNarrator": "Ви дійсно бажаєте видалити читця \"{0}\"?",
|
"MessageConfirmRemoveNarrator": "Ви дійсно бажаєте видалити читця \"{0}\"?",
|
||||||
"MessageConfirmRemovePlaylist": "Ви дійсно бажаєте видалити ваш список відтворення \"{0}\"?",
|
"MessageConfirmRemovePlaylist": "Ви дійсно бажаєте видалити список відтворення \"{0}\"?",
|
||||||
"MessageConfirmRenameGenre": "Ви впевнені, що хочете перейменувати жанр \"{0}\" на \"{1}\" для всіх елементів?",
|
"MessageConfirmRenameGenre": "Ви дійсно бажаєте замінити жанр \"{0}\" на \"{1}\" для усіх елементів?",
|
||||||
"MessageConfirmRenameGenreMergeNote": "Примітка: Такий жанр вже існує, тому вони будуть об'єднані.",
|
"MessageConfirmRenameGenreMergeNote": "Примітка: такий жанр вже існує, тож їх буде об'єднано.",
|
||||||
"MessageConfirmRenameGenreWarning": "Увага! Схожий жанр з іншом регістром вже існує \"{0}\".",
|
"MessageConfirmRenameGenreWarning": "Увага! Вже існує схожий жанр у іншому регістрі \"{0}\".",
|
||||||
"MessageConfirmRenameTag": "Ви впевнені, що хочете перейменувати мітку \"{0}\" на \"{1}\" для всіх елементів?",
|
"MessageConfirmRenameTag": "Ви дійсно бажаєте замінити мітку \"{0}\" на \"{1}\" для усіх елементів?",
|
||||||
"MessageConfirmRenameTagMergeNote": "Примітка: Така мітка вже існує, тому вони будуть об'єднані.",
|
"MessageConfirmRenameTagMergeNote": "Примітка: така мітка вже існує, тож їх буде об'єднано.",
|
||||||
"MessageConfirmRenameTagWarning": "Увага! Схожа мітка з іншою регістром вже існує \"{0}\".",
|
"MessageConfirmRenameTagWarning": "Увага! Вже існує схожа мітка у іншому регістрі \"{0}\".",
|
||||||
"MessageConfirmResetProgress": "Ви впевнені, що хочете скинути свій прогрес?",
|
"MessageConfirmResetProgress": "Ви впевнені, що хочете скинути свій прогрес?",
|
||||||
"MessageConfirmSendEbookToDevice": "Ви дійсно хочете відправити на пристрій \"{2}\" електроні книги: {0}, \"{1}\"?",
|
"MessageConfirmSendEbookToDevice": "Ви дійсно хочете відправити на пристрій \"{2}\" електроні книги: {0}, \"{1}\"?",
|
||||||
"MessageConfirmUnlinkOpenId": "Ви впевнені, що хочете відв'язати цього користувача від OpenID?",
|
"MessageConfirmUnlinkOpenId": "Ви впевнені, що хочете відв'язати цього користувача від OpenID?",
|
||||||
"MessageDaysListenedInTheLastYear": "{0} днів, прослуханих за останній рік",
|
"MessageDaysListenedInTheLastYear": "{0} днів, прослуханих за останній рік",
|
||||||
"MessageDownloadingEpisode": "Скачування епізоду",
|
"MessageDownloadingEpisode": "Завантаження епізоду",
|
||||||
"MessageDragFilesIntoTrackOrder": "Перетягніть файли до правильного порядку",
|
"MessageDragFilesIntoTrackOrder": "Перетягніть файли до правильного порядку",
|
||||||
"MessageEmbedFailed": "Не вдалося вбудувати!",
|
"MessageEmbedFailed": "Не вдалося вбудувати!",
|
||||||
"MessageEmbedFinished": "Вбудовування завершено!",
|
"MessageEmbedFinished": "Вбудовано!",
|
||||||
"MessageEmbedQueue": "У черзі на вбудовування метаданих ({0} у черзі)",
|
"MessageEmbedQueue": "В черзі на вбудовування метаданих ({0} в черзі)",
|
||||||
"MessageEpisodesQueuedForDownload": "{0} епізод(ів) у черзі на завантаження",
|
"MessageEpisodesQueuedForDownload": "Епізодів у черзі завантаження: {0}",
|
||||||
"MessageEreaderDevices": "Аби гарантувати отримання електронних книг, вам може знадобитися додати вказану вище адресу електронної пошти як правильного відправника на кожному з пристроїв зі списку нижче.",
|
"MessageEreaderDevices": "Аби гарантувати отримання електронних книг, вам може знадобитися додати вказану вище адресу електронної пошти як правильного відправника на кожному з пристроїв зі списку нижче.",
|
||||||
"MessageFeedURLWillBe": "URL-адреса каналу буде {0}",
|
"MessageFeedURLWillBe": "URL-адреса каналу буде {0}",
|
||||||
"MessageFetching": "Отримання...",
|
"MessageFetching": "Отримання...",
|
||||||
"MessageForceReScanDescription": "Просканує всі файли заново, як при першому скануванні. ID3-мітки, OPF-файли та текстові файли будуть проскановані як нові.",
|
"MessageForceReScanDescription": "Просканує усі файли заново, неначе вперше. ID3-мітки, файли OPF та текстові файли будуть проскановані як нові.",
|
||||||
"MessageImportantNotice": "Важливе повідомлення!",
|
"MessageImportantNotice": "Важливе повідомлення!",
|
||||||
"MessageInsertChapterBelow": "Введіть главу нижче",
|
"MessageInsertChapterBelow": "Введіть главу нижче",
|
||||||
"MessageInvalidAsin": "Невірний ASIN",
|
"MessageInvalidAsin": "Невірний ASIN",
|
||||||
"MessageItemsSelected": "Вибрано {0} елементів",
|
"MessageItemsSelected": "Вибрано елементів: {0}",
|
||||||
"MessageItemsUpdated": "Оновлено {0} елементів",
|
"MessageItemsUpdated": "Оновлено елементів: {0}",
|
||||||
"MessageJoinUsOn": "Приєднуйтесь до",
|
"MessageJoinUsOn": "Приєднуйтесь до",
|
||||||
"MessageLoading": "Завантаження...",
|
"MessageLoading": "Завантаження...",
|
||||||
"MessageLoadingFolders": "Завантаження папок...",
|
"MessageLoadingFolders": "Завантаження тек...",
|
||||||
"MessageLogsDescription": "Журнали зберігаються у <code>/metadata/logs</code> як JSON-файли. Журнали збоїв зберігаються у <code>/metadata/logs/crash_logs.txt</code>.",
|
"MessageLogsDescription": "Журнали зберігаються у <code>/metadata/logs</code> як JSON-файли. Журнали збоїв зберігаються у <code>/metadata/logs/crash_logs.txt</code>.",
|
||||||
"MessageM4BFailed": "Помилка M4B!",
|
"MessageM4BFailed": "Помилка M4B!",
|
||||||
"MessageM4BFinished": "M4B створено!",
|
"MessageM4BFinished": "M4B створено!",
|
||||||
"MessageMapChapterTitles": "Встановіть назви глав вашої аудіокниги без зміни часових міток",
|
"MessageMapChapterTitles": "Встановіть назви глав вашої аудіокниги без визначення налаштувань тривалості",
|
||||||
"MessageMarkAllEpisodesFinished": "Позначити всі епізоди завершеними",
|
"MessageMarkAllEpisodesFinished": "Позначити всі епізоди завершеними",
|
||||||
"MessageMarkAllEpisodesNotFinished": "Позначити всі епізоди незавершеними",
|
"MessageMarkAllEpisodesNotFinished": "Позначити всі епізоди незавершеними",
|
||||||
"MessageMarkAsFinished": "Позначити як завершене",
|
"MessageMarkAsFinished": "Позначити завершеним",
|
||||||
"MessageMarkAsNotFinished": "Позначити як незавершене",
|
"MessageMarkAsNotFinished": "Позначити незавершеним",
|
||||||
"MessageMatchBooksDescription": "Спробує знайти книги у бібліотеці у вибраному джерелі пошуку та заповнити порожні подробиці й обкладинку. Не перезаписує подробиці.",
|
"MessageMatchBooksDescription": "Спробує віднайти книгу у вказаному джерелі пошуку та встановити подробиці та обкладинку, яких бракує. Не перезаписує подробиці.",
|
||||||
"MessageNoAudioTracks": "Аудіодоріжки відсутні",
|
"MessageNoAudioTracks": "Аудіодоріжки відсутні",
|
||||||
"MessageNoAuthors": "Автори відсутні",
|
"MessageNoAuthors": "Автори відсутні",
|
||||||
"MessageNoBackups": "Резервні копії відсутні",
|
"MessageNoBackups": "Резервні копії відсутні",
|
||||||
|
|
@ -808,8 +808,8 @@
|
||||||
"MessageNoCoversFound": "Обкладинок не знайдено",
|
"MessageNoCoversFound": "Обкладинок не знайдено",
|
||||||
"MessageNoDescription": "Без опису",
|
"MessageNoDescription": "Без опису",
|
||||||
"MessageNoDevices": "Немає пристроїв",
|
"MessageNoDevices": "Немає пристроїв",
|
||||||
"MessageNoDownloadsInProgress": "Немає активних скачувань",
|
"MessageNoDownloadsInProgress": "Немає активних завантажень",
|
||||||
"MessageNoDownloadsQueued": "Немає скачувань у черзі",
|
"MessageNoDownloadsQueued": "Немає завантажень у черзі",
|
||||||
"MessageNoEpisodeMatchesFound": "Відповідних епізодів не знайдено",
|
"MessageNoEpisodeMatchesFound": "Відповідних епізодів не знайдено",
|
||||||
"MessageNoEpisodes": "Епізоди відсутні",
|
"MessageNoEpisodes": "Епізоди відсутні",
|
||||||
"MessageNoFoldersAvailable": "Немає доступних тек",
|
"MessageNoFoldersAvailable": "Немає доступних тек",
|
||||||
|
|
@ -818,21 +818,21 @@
|
||||||
"MessageNoItems": "Елементи відсутні",
|
"MessageNoItems": "Елементи відсутні",
|
||||||
"MessageNoItemsFound": "Елементів не знайдено",
|
"MessageNoItemsFound": "Елементів не знайдено",
|
||||||
"MessageNoListeningSessions": "Сеанси прослуховування відсутні",
|
"MessageNoListeningSessions": "Сеанси прослуховування відсутні",
|
||||||
"MessageNoLogs": "Немає журналів",
|
"MessageNoLogs": "Немає журнали",
|
||||||
"MessageNoMediaProgress": "Прогрес відсутній",
|
"MessageNoMediaProgress": "Прогрес відсутній",
|
||||||
"MessageNoNotifications": "Сповіщення відсутні",
|
"MessageNoNotifications": "Сповіщення відсутні",
|
||||||
"MessageNoPodcastFeed": "Некоректний подкаст: немає каналу",
|
"MessageNoPodcastFeed": "Невірний подкаст: Немає каналу",
|
||||||
"MessageNoPodcastsFound": "Подкастів не знайдено",
|
"MessageNoPodcastsFound": "Подкастів не знайдено",
|
||||||
"MessageNoResults": "Немає результатів",
|
"MessageNoResults": "Немає результатів",
|
||||||
"MessageNoSearchResultsFor": "Немає результатів пошуку для \"{0}\"",
|
"MessageNoSearchResultsFor": "Немає результатів пошуку для \"{0}\"",
|
||||||
"MessageNoSeries": "Немає серій",
|
"MessageNoSeries": "Без серії",
|
||||||
"MessageNoTags": "Немає міток",
|
"MessageNoTags": "Без міток",
|
||||||
"MessageNoTasksRunning": "Немає активних завдань",
|
"MessageNoTasksRunning": "Немає активних завдань",
|
||||||
"MessageNoUpdatesWereNecessary": "Оновлення не потрібні",
|
"MessageNoUpdatesWereNecessary": "Оновлень не потрібно",
|
||||||
"MessageNoUserPlaylists": "У вас немає списків відтворення",
|
"MessageNoUserPlaylists": "У вас немає списків відтворення",
|
||||||
"MessageNoUserPlaylistsHelp": "Списки відтворення приватні. Лише користувач, який їх створив, може їх бачити.",
|
"MessageNoUserPlaylistsHelp": "Списки відтворення приватні. Лише користувач, який їх створює, може бачити їх.",
|
||||||
"MessageNotYetImplemented": "Ще не реалізовано",
|
"MessageNotYetImplemented": "Ще не реалізовано",
|
||||||
"MessageOpmlPreviewNote": "Примітка: це попередній перегляд OPML-файлу. Актуальна назва подкасту буде взята з RSS-каналу.",
|
"MessageOpmlPreviewNote": "Примітка: це попередній перегляд OPML-файлу. Актуальна назва подкасту буде завантажена з RSS-каналу.",
|
||||||
"MessageOr": "або",
|
"MessageOr": "або",
|
||||||
"MessagePauseChapter": "Призупинити відтворення глави",
|
"MessagePauseChapter": "Призупинити відтворення глави",
|
||||||
"MessagePlayChapter": "Слухати початок глави",
|
"MessagePlayChapter": "Слухати початок глави",
|
||||||
|
|
@ -841,7 +841,7 @@
|
||||||
"MessagePodcastHasNoRSSFeedForMatching": "Подкаст не має RSS-каналу для пошуку",
|
"MessagePodcastHasNoRSSFeedForMatching": "Подкаст не має RSS-каналу для пошуку",
|
||||||
"MessagePodcastSearchField": "Введіть пошуковий запит або URL RSS-стрічки",
|
"MessagePodcastSearchField": "Введіть пошуковий запит або URL RSS-стрічки",
|
||||||
"MessageQuickEmbedInProgress": "Швидке вбудовування в процесі",
|
"MessageQuickEmbedInProgress": "Швидке вбудовування в процесі",
|
||||||
"MessageQuickEmbedQueue": "У черзі на швидке вбудовування ({0} в черзі)",
|
"MessageQuickEmbedQueue": "В черзі на швидке вбудовування ({0} в черзі)",
|
||||||
"MessageQuickMatchAllEpisodes": "Швидке співставлення всіх епізодів",
|
"MessageQuickMatchAllEpisodes": "Швидке співставлення всіх епізодів",
|
||||||
"MessageQuickMatchDescription": "Заповнити відсутні подробиці та обкладинку першим результатом пошуку '{0}'. Не перезаписує подробиці, якщо не увімкнено параметр \"Надавати перевагу віднайденим метаданим\".",
|
"MessageQuickMatchDescription": "Заповнити відсутні подробиці та обкладинку першим результатом пошуку '{0}'. Не перезаписує подробиці, якщо не увімкнено параметр \"Надавати перевагу віднайденим метаданим\".",
|
||||||
"MessageRemoveChapter": "Видалити главу",
|
"MessageRemoveChapter": "Видалити главу",
|
||||||
|
|
@ -849,9 +849,9 @@
|
||||||
"MessageRemoveFromPlayerQueue": "Вилучити з черги відтворення",
|
"MessageRemoveFromPlayerQueue": "Вилучити з черги відтворення",
|
||||||
"MessageRemoveUserWarning": "Ви дійсно бажаєте назавжди видалити користувача \"{0}\"?",
|
"MessageRemoveUserWarning": "Ви дійсно бажаєте назавжди видалити користувача \"{0}\"?",
|
||||||
"MessageReportBugsAndContribute": "Повідомляйте про помилки, пропонуйте функції та долучайтеся на",
|
"MessageReportBugsAndContribute": "Повідомляйте про помилки, пропонуйте функції та долучайтеся на",
|
||||||
"MessageResetChaptersConfirm": "Ви впевнені, що хочете скинути глави та скасувати внесені зміни?",
|
"MessageResetChaptersConfirm": "Ви дійсно бажаєте скинути глави та скасувати внесені зміни?",
|
||||||
"MessageRestoreBackupConfirm": "Ви впевнені, що хочете відновити резервну копію, створену",
|
"MessageRestoreBackupConfirm": "Ви дійсно бажаєте відновити резервну копію від",
|
||||||
"MessageRestoreBackupWarning": "Відновлення резервної копії перезапише всю базу даних у /config і зображення обкладинок у /metadata/items та /metadata/authors.<br /><br />Резервні копії не змінюють файли у теках бібліотеки. Якщо у налаштуваннях сервера увімкнено збереження обкладинок і метаданих у теках бібліотеки, вони не створюються під час резервного копіювання і не перезаписуються.<br /><br />Всі клієнти, що користуються вашим сервером, будуть автоматично оновлені.",
|
"MessageRestoreBackupWarning": "Відновлення резервної копії перезапише всю базу даних, розташовану в /config, і зображення обкладинок в /metadata/items та /metadata/authors.<br /><br />Резервні копії не змінюють жодних файлів у теках бібліотеки. Якщо у налаштуваннях сервера увімкнено збереження обкладинок і метаданих у теках бібліотеки, вони не створюються під час резервного копіювання і не перезаписуються..<br /><br />Всі клієнти, що користуються вашим сервером, будуть автоматично оновлені.",
|
||||||
"MessageScheduleLibraryScanNote": "Для більшості користувачів рекомендується залишити цю функцію вимкненою та залишити параметр перегляду папок увімкненим. Засіб спостереження за папками автоматично виявить зміни в папках вашої бібліотеки. Засіб спостереження за папками не працює для кожної файлової системи (наприклад, NFS), тому замість нього можна використовувати сканування бібліотек за розкладом.",
|
"MessageScheduleLibraryScanNote": "Для більшості користувачів рекомендується залишити цю функцію вимкненою та залишити параметр перегляду папок увімкненим. Засіб спостереження за папками автоматично виявить зміни в папках вашої бібліотеки. Засіб спостереження за папками не працює для кожної файлової системи (наприклад, NFS), тому замість нього можна використовувати сканування бібліотек за розкладом.",
|
||||||
"MessageScheduleRunEveryWeekdayAtTime": "Запуск кожні {0} о {1}",
|
"MessageScheduleRunEveryWeekdayAtTime": "Запуск кожні {0} о {1}",
|
||||||
"MessageSearchResultsFor": "Результати пошуку для",
|
"MessageSearchResultsFor": "Результати пошуку для",
|
||||||
|
|
@ -860,12 +860,12 @@
|
||||||
"MessageServerCouldNotBeReached": "Не вдалося підключитися до сервера",
|
"MessageServerCouldNotBeReached": "Не вдалося підключитися до сервера",
|
||||||
"MessageSetChaptersFromTracksDescription": "Створити глави з аудіодоріжок, встановивши назви файлів за заголовки",
|
"MessageSetChaptersFromTracksDescription": "Створити глави з аудіодоріжок, встановивши назви файлів за заголовки",
|
||||||
"MessageShareExpirationWillBe": "Термін сплине за <strong>{0}</strong>",
|
"MessageShareExpirationWillBe": "Термін сплине за <strong>{0}</strong>",
|
||||||
"MessageShareExpiresIn": "Спливає через {0}",
|
"MessageShareExpiresIn": "Сплине за {0}",
|
||||||
"MessageShareURLWillBe": "URL для спільного доступу — <strong>{0}</strong>",
|
"MessageShareURLWillBe": "Поширюваний URL - <strong>{0}</strong>",
|
||||||
"MessageStartPlaybackAtTime": "Почати відтворення \"{0}\" з {1}?",
|
"MessageStartPlaybackAtTime": "Почати відтворення \"{0}\" з {1}?",
|
||||||
"MessageTaskAudioFileNotWritable": "Аудіофайл \"{0}\" недоступний для запису",
|
"MessageTaskAudioFileNotWritable": "Аудіофайл \"{0}\" недоступний для запису",
|
||||||
"MessageTaskCanceledByUser": "Завдання скасовано користувачем",
|
"MessageTaskCanceledByUser": "Задача скасована користувачем",
|
||||||
"MessageTaskDownloadingEpisodeDescription": "Скачування епізоду \"{0}\"",
|
"MessageTaskDownloadingEpisodeDescription": "Завантаження епізоду \"{0}\"",
|
||||||
"MessageTaskEmbeddingMetadata": "Вбудовування метаданих",
|
"MessageTaskEmbeddingMetadata": "Вбудовування метаданих",
|
||||||
"MessageTaskEmbeddingMetadataDescription": "Вбудовування метаданих у аудіокнигу \"{0}\"",
|
"MessageTaskEmbeddingMetadataDescription": "Вбудовування метаданих у аудіокнигу \"{0}\"",
|
||||||
"MessageTaskEncodingM4b": "Кодування M4B",
|
"MessageTaskEncodingM4b": "Кодування M4B",
|
||||||
|
|
@ -880,19 +880,19 @@
|
||||||
"MessageTaskMatchingBooksInLibrary": "Відповідність книг у бібліотеці \"{0}\"",
|
"MessageTaskMatchingBooksInLibrary": "Відповідність книг у бібліотеці \"{0}\"",
|
||||||
"MessageTaskNoFilesToScan": "Немає файлів для сканування",
|
"MessageTaskNoFilesToScan": "Немає файлів для сканування",
|
||||||
"MessageTaskOpmlImport": "Імпорт OPML",
|
"MessageTaskOpmlImport": "Імпорт OPML",
|
||||||
"MessageTaskOpmlImportDescription": "Створення подкастів з {0} RSS-каналів",
|
"MessageTaskOpmlImportDescription": "Створення подкастів з {0} RSS-стрічок",
|
||||||
"MessageTaskOpmlImportFeed": "Імпорт RSS-каналу OPML",
|
"MessageTaskOpmlImportFeed": "Канал імпорту OPML",
|
||||||
"MessageTaskOpmlImportFeedDescription": "Імпорт RSS-каналу \"{0}\"",
|
"MessageTaskOpmlImportFeedDescription": "Імпорт RSS-каналу \"{0}\"",
|
||||||
"MessageTaskOpmlImportFeedFailed": "Не вдалося отримати подкаст-канал",
|
"MessageTaskOpmlImportFeedFailed": "Не вдалося отримати подкаст-стрічку",
|
||||||
"MessageTaskOpmlImportFeedPodcastDescription": "Створення подкасту \"{0}\"",
|
"MessageTaskOpmlImportFeedPodcastDescription": "Створення подкасту \"{0}\"",
|
||||||
"MessageTaskOpmlImportFeedPodcastExists": "Подкаст вже існує за цим шляхом",
|
"MessageTaskOpmlImportFeedPodcastExists": "Подкаст вже існує за цим шляхом",
|
||||||
"MessageTaskOpmlImportFeedPodcastFailed": "Не вдалося створити подкаст",
|
"MessageTaskOpmlImportFeedPodcastFailed": "Не вдалося створити подкаст",
|
||||||
"MessageTaskOpmlImportFinished": "Додано {0} подкастів",
|
"MessageTaskOpmlImportFinished": "Додано {0} подкастів",
|
||||||
"MessageTaskOpmlParseFailed": "Не вдалося розібрати OPML-файл",
|
"MessageTaskOpmlParseFailed": "Не вдалося розібрати файл OPML",
|
||||||
"MessageTaskOpmlParseFastFail": "Некоректний OPML-файл: не знайдено тег <opml> або <outline>",
|
"MessageTaskOpmlParseFastFail": "Невірний файл OPML: не знайдено тег <opml> або тег <outline>",
|
||||||
"MessageTaskOpmlParseNoneFound": "У OPML-файлі не знайдено жодного каналу",
|
"MessageTaskOpmlParseNoneFound": "У файлі OPML не знайдено жодного канала",
|
||||||
"MessageTaskScanItemsAdded": "{0} додано",
|
"MessageTaskScanItemsAdded": "{0} додано",
|
||||||
"MessageTaskScanItemsMissing": "{0} відсутні",
|
"MessageTaskScanItemsMissing": "{0} відсутній",
|
||||||
"MessageTaskScanItemsUpdated": "{0} оновлено",
|
"MessageTaskScanItemsUpdated": "{0} оновлено",
|
||||||
"MessageTaskScanNoChangesNeeded": "Змін не потрібно",
|
"MessageTaskScanNoChangesNeeded": "Змін не потрібно",
|
||||||
"MessageTaskScanningFileChanges": "Сканування змін файлів у \"{0}\"",
|
"MessageTaskScanningFileChanges": "Сканування змін файлів у \"{0}\"",
|
||||||
|
|
@ -902,24 +902,24 @@
|
||||||
"MessageUploaderItemFailed": "Не вдалося завантажити",
|
"MessageUploaderItemFailed": "Не вдалося завантажити",
|
||||||
"MessageUploaderItemSuccess": "Успішно завантажено!",
|
"MessageUploaderItemSuccess": "Успішно завантажено!",
|
||||||
"MessageUploading": "Завантаження...",
|
"MessageUploading": "Завантаження...",
|
||||||
"MessageValidCronExpression": "Коректний cron-вираз",
|
"MessageValidCronExpression": "Допустима команда cron",
|
||||||
"MessageWatcherIsDisabledGlobally": "Спостерігача вимкнено у глобальних налаштуваннях сервера",
|
"MessageWatcherIsDisabledGlobally": "Спостерігача вимкнено в налаштуваннях сервера",
|
||||||
"MessageXLibraryIsEmpty": "Бібліотека {0} порожня!",
|
"MessageXLibraryIsEmpty": "Бібліотека {0} порожня!",
|
||||||
"MessageYourAudiobookDurationIsLonger": "Тривалість вашої аудіокниги більша за знайдену",
|
"MessageYourAudiobookDurationIsLonger": "Тривалість вашої аудіокниги довша за віднайдену",
|
||||||
"MessageYourAudiobookDurationIsShorter": "Тривалість вашої аудіокниги менша за знайдену",
|
"MessageYourAudiobookDurationIsShorter": "Тривалість вашої аудіокниги коротша за віднайдену",
|
||||||
"NoteChangeRootPassword": "Тільки користувач root може мати порожній пароль",
|
"NoteChangeRootPassword": "Тільки користувач root — єдиний, хто може мати порожній пароль",
|
||||||
"NoteChapterEditorTimes": "Примітка: Перша глава повинна починатися з 0:00, а час початку останньої глави не може перевищувати тривалість цієї аудіокниги.",
|
"NoteChapterEditorTimes": "Примітка: Перша глава мусить починатися з 0:00, а час початку останньої глави не може бути більшим за зазначену тривалість аудіокниги.",
|
||||||
"NoteFolderPicker": "Примітка: вже додані папки не відображаються",
|
"NoteFolderPicker": "Примітка: вже обрані теки не буде показано",
|
||||||
"NoteRSSFeedPodcastAppsHttps": "Попередження: більшість додатків подкастів вимагають використання HTTPS для RSS-каналу",
|
"NoteRSSFeedPodcastAppsHttps": "Попередження: Більшість додатків подкастів вимагатимуть використання протоколу HTTPS від RSS-каналу",
|
||||||
"NoteRSSFeedPodcastAppsPubDate": "Попередження: один або більше ваших епізодів не мають дати публікації. Деякі додатки подкастів цього вимагають.",
|
"NoteRSSFeedPodcastAppsPubDate": "Попередження: 1 або більше ваших епізодів не мають дати публікації. Деякі додатки подкастів вимагають це.",
|
||||||
"NoteUploaderFoldersWithMediaFiles": "Теки з медіафайлами обробляються як окремі елементи бібліотеки.",
|
"NoteUploaderFoldersWithMediaFiles": "Теки з медіафайлами буде оброблено як окремі елементи бібліотеки.",
|
||||||
"NoteUploaderOnlyAudioFiles": "Якщо завантажувати лише аудіофайли, кожен файл буде окремою аудіокнигою.",
|
"NoteUploaderOnlyAudioFiles": "Якщо завантажувати лише аудіофайли, то кожен файл буде оброблено як окрему книгу.",
|
||||||
"NoteUploaderUnsupportedFiles": "Непідтримувані файли ігноруються. При виборі або перетягуванні теки, файли поза теками елементів ігноруються.",
|
"NoteUploaderUnsupportedFiles": "Непідтримувані файли пропущено. Під час вибору або перетягування теки, файли, що знаходяться поза текою, пропускаються.",
|
||||||
"NotificationOnBackupCompletedDescription": "Виконується після завершення резервного копіювання",
|
"NotificationOnBackupCompletedDescription": "Запускається після завершення резервного копіювання",
|
||||||
"NotificationOnBackupFailedDescription": "Виконується при помилці резервного копіювання",
|
"NotificationOnBackupFailedDescription": "Срабатывает при збої резервного копіювання",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "Виконується при автоматичному завантаженні епізоду подкасту",
|
"NotificationOnEpisodeDownloadedDescription": "Запускається при автоматичному завантаженні епізоду подкасту",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "Виконується, коли автоматичне завантаження епізодів вимкнено через забагато невдалих спроб",
|
"NotificationOnRSSFeedDisabledDescription": "Активується, коли автоматичне завантаження епізодів вимкнено через занадто багато невдалих спроб",
|
||||||
"NotificationOnRSSFeedFailedDescription": "Виконується, коли запит RSS-каналу не вдається для автоматичного завантаження епізоду",
|
"NotificationOnRSSFeedFailedDescription": "Активується, коли запит RSS-каналу не вдається виконати для автоматичного завантаження епізоду",
|
||||||
"NotificationOnTestDescription": "Подія для тестування системи сповіщень",
|
"NotificationOnTestDescription": "Подія для тестування системи сповіщень",
|
||||||
"PlaceholderNewCollection": "Нова назва добірки",
|
"PlaceholderNewCollection": "Нова назва добірки",
|
||||||
"PlaceholderNewFolderPath": "Новий шлях до теки",
|
"PlaceholderNewFolderPath": "Новий шлях до теки",
|
||||||
|
|
@ -997,7 +997,7 @@
|
||||||
"ToastEncodeCancelFailed": "Не вдалося скасувати кодування",
|
"ToastEncodeCancelFailed": "Не вдалося скасувати кодування",
|
||||||
"ToastEncodeCancelSucces": "Кодування скасовано",
|
"ToastEncodeCancelSucces": "Кодування скасовано",
|
||||||
"ToastEpisodeDownloadQueueClearFailed": "Не вдалося очистити чергу",
|
"ToastEpisodeDownloadQueueClearFailed": "Не вдалося очистити чергу",
|
||||||
"ToastEpisodeDownloadQueueClearSuccess": "Чергу на скачування епізодів очищено",
|
"ToastEpisodeDownloadQueueClearSuccess": "Чергу на завантаження епізодів очищено",
|
||||||
"ToastEpisodeUpdateSuccess": "{0} епізодів оновлено",
|
"ToastEpisodeUpdateSuccess": "{0} епізодів оновлено",
|
||||||
"ToastErrorCannotShare": "Не можна типово поширити на цей пристрій",
|
"ToastErrorCannotShare": "Не можна типово поширити на цей пристрій",
|
||||||
"ToastFailedToLoadData": "Не вдалося завантажити дані",
|
"ToastFailedToLoadData": "Не вдалося завантажити дані",
|
||||||
|
|
@ -1005,7 +1005,7 @@
|
||||||
"ToastFailedToShare": "Не вдалося поділитися",
|
"ToastFailedToShare": "Не вдалося поділитися",
|
||||||
"ToastFailedToUpdate": "Не вдалося оновити",
|
"ToastFailedToUpdate": "Не вдалося оновити",
|
||||||
"ToastInvalidImageUrl": "Невірний URL зображення",
|
"ToastInvalidImageUrl": "Невірний URL зображення",
|
||||||
"ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для скачування",
|
"ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для завантаження",
|
||||||
"ToastInvalidUrl": "Невірний URL",
|
"ToastInvalidUrl": "Невірний URL",
|
||||||
"ToastItemCoverUpdateSuccess": "Обкладинку елемента оновлено",
|
"ToastItemCoverUpdateSuccess": "Обкладинку елемента оновлено",
|
||||||
"ToastItemDeletedFailed": "Не вдалося видалити елемент",
|
"ToastItemDeletedFailed": "Не вдалося видалити елемент",
|
||||||
|
|
|
||||||
|
|
@ -918,8 +918,6 @@
|
||||||
"NotificationOnBackupCompletedDescription": "备份完成时触发",
|
"NotificationOnBackupCompletedDescription": "备份完成时触发",
|
||||||
"NotificationOnBackupFailedDescription": "备份失败时触发",
|
"NotificationOnBackupFailedDescription": "备份失败时触发",
|
||||||
"NotificationOnEpisodeDownloadedDescription": "当播客节目自动下载时触发",
|
"NotificationOnEpisodeDownloadedDescription": "当播客节目自动下载时触发",
|
||||||
"NotificationOnRSSFeedDisabledDescription": "由于尝试失败次数过多而导致剧集自动下载被禁用时触发",
|
|
||||||
"NotificationOnRSSFeedFailedDescription": "当 RSS 源请求自动下载剧集失败时触发",
|
|
||||||
"NotificationOnTestDescription": "测试通知系统的事件",
|
"NotificationOnTestDescription": "测试通知系统的事件",
|
||||||
"PlaceholderNewCollection": "输入收藏夹名称",
|
"PlaceholderNewCollection": "输入收藏夹名称",
|
||||||
"PlaceholderNewFolderPath": "输入文件夹路径",
|
"PlaceholderNewFolderPath": "输入文件夹路径",
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,6 @@ class Auth {
|
||||||
|
|
||||||
this.RefreshTokenExpiry = parseInt(process.env.REFRESH_TOKEN_EXPIRY) || 7 * 24 * 60 * 60 // 7 days
|
this.RefreshTokenExpiry = parseInt(process.env.REFRESH_TOKEN_EXPIRY) || 7 * 24 * 60 * 60 // 7 days
|
||||||
this.AccessTokenExpiry = parseInt(process.env.ACCESS_TOKEN_EXPIRY) || 12 * 60 * 60 // 12 hours
|
this.AccessTokenExpiry = parseInt(process.env.ACCESS_TOKEN_EXPIRY) || 12 * 60 * 60 // 12 hours
|
||||||
if (parseInt(process.env.REFRESH_TOKEN_EXPIRY) > 0) {
|
|
||||||
Logger.info(`[Auth] Refresh token expiry set from ENV variable to ${this.RefreshTokenExpiry} seconds`)
|
|
||||||
}
|
|
||||||
if (parseInt(process.env.ACCESS_TOKEN_EXPIRY) > 0) {
|
|
||||||
Logger.info(`[Auth] Access token expiry set from ENV variable to ${this.AccessTokenExpiry} seconds`)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1060,8 +1054,6 @@ class Auth {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to validate a jwt token for a given user
|
* Function to validate a jwt token for a given user
|
||||||
* Used to authenticate socket connections
|
|
||||||
* TODO: Support API keys for web socket connections
|
|
||||||
*
|
*
|
||||||
* @param {string} token
|
* @param {string} token
|
||||||
* @returns {Object} tokens data
|
* @returns {Object} tokens data
|
||||||
|
|
|
||||||
|
|
@ -231,9 +231,6 @@ class SocketAuthority {
|
||||||
* When setting up a socket connection the user needs to be associated with a socket id
|
* When setting up a socket connection the user needs to be associated with a socket id
|
||||||
* for this the client will send a 'auth' event that includes the users API token
|
* for this the client will send a 'auth' event that includes the users API token
|
||||||
*
|
*
|
||||||
* Sends event 'init' to the socket. For admins this contains an array of users online.
|
|
||||||
* For failed authentication it sends event 'auth_failed' with a message
|
|
||||||
*
|
|
||||||
* @param {SocketIO.Socket} socket
|
* @param {SocketIO.Socket} socket
|
||||||
* @param {string} token JWT
|
* @param {string} token JWT
|
||||||
*/
|
*/
|
||||||
|
|
@ -245,7 +242,7 @@ class SocketAuthority {
|
||||||
if (!token_data?.userId) {
|
if (!token_data?.userId) {
|
||||||
// Token invalid
|
// Token invalid
|
||||||
Logger.error('Cannot validate socket - invalid token')
|
Logger.error('Cannot validate socket - invalid token')
|
||||||
return socket.emit('auth_failed', { message: 'Invalid token' })
|
return socket.emit('invalid_token')
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the user via the id from the decoded jwt.
|
// get the user via the id from the decoded jwt.
|
||||||
|
|
@ -253,11 +250,7 @@ class SocketAuthority {
|
||||||
if (!user) {
|
if (!user) {
|
||||||
// user not found
|
// user not found
|
||||||
Logger.error('Cannot validate socket - invalid token')
|
Logger.error('Cannot validate socket - invalid token')
|
||||||
return socket.emit('auth_failed', { message: 'Invalid token' })
|
return socket.emit('invalid_token')
|
||||||
}
|
|
||||||
if (!user.isActive) {
|
|
||||||
Logger.error('Cannot validate socket - user is not active')
|
|
||||||
return socket.emit('auth_failed', { message: 'Invalid user' })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const client = this.clients[socket.id]
|
const client = this.clients[socket.id]
|
||||||
|
|
@ -267,18 +260,13 @@ class SocketAuthority {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client.user !== undefined) {
|
if (client.user !== undefined) {
|
||||||
if (client.user.id === user.id) {
|
Logger.debug(`[SocketAuthority] Authenticating socket client already has user`, client.user.username)
|
||||||
// Allow re-authentication of a socket to the same user
|
|
||||||
Logger.info(`[SocketAuthority] Authenticating socket already associated to user "${client.user.username}"`)
|
|
||||||
} else {
|
|
||||||
// Allow re-authentication of a socket to a different user but shouldn't happen
|
|
||||||
Logger.warn(`[SocketAuthority] Authenticating socket to user "${user.username}", but is already associated with a different user "${client.user.username}"`)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Logger.debug(`[SocketAuthority] Authenticating socket to user "${user.username}"`)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
client.user = user
|
client.user = user
|
||||||
|
|
||||||
|
Logger.debug(`[SocketAuthority] User Online ${client.user.username}`)
|
||||||
|
|
||||||
this.adminEmitter('user_online', client.user.toJSONForPublic(this.Server.playbackSessionManager.sessions))
|
this.adminEmitter('user_online', client.user.toJSONForPublic(this.Server.playbackSessionManager.sessions))
|
||||||
|
|
||||||
// Update user lastSeen without firing sequelize bulk update hooks
|
// Update user lastSeen without firing sequelize bulk update hooks
|
||||||
|
|
|
||||||
|
|
@ -87,9 +87,6 @@ class ApiKeyController {
|
||||||
isActive: !!req.body.isActive,
|
isActive: !!req.body.isActive,
|
||||||
createdByUserId: req.user.id
|
createdByUserId: req.user.id
|
||||||
})
|
})
|
||||||
apiKeyInstance.dataValues.user = await apiKeyInstance.getUser({
|
|
||||||
attributes: ['id', 'username', 'type']
|
|
||||||
})
|
|
||||||
|
|
||||||
Logger.info(`[ApiKeyController] Created API key "${apiKeyInstance.name}"`)
|
Logger.info(`[ApiKeyController] Created API key "${apiKeyInstance.name}"`)
|
||||||
return res.json({
|
return res.json({
|
||||||
|
|
@ -155,9 +152,6 @@ class ApiKeyController {
|
||||||
|
|
||||||
if (hasUpdates) {
|
if (hasUpdates) {
|
||||||
await apiKey.save()
|
await apiKey.save()
|
||||||
apiKey.dataValues.user = await apiKey.getUser({
|
|
||||||
attributes: ['id', 'username', 'type']
|
|
||||||
})
|
|
||||||
Logger.info(`[ApiKeyController] Updated API key "${apiKey.name}"`)
|
Logger.info(`[ApiKeyController] Updated API key "${apiKey.name}"`)
|
||||||
} else {
|
} else {
|
||||||
Logger.info(`[ApiKeyController] No updates needed to API key "${apiKey.name}"`)
|
Logger.info(`[ApiKeyController] No updates needed to API key "${apiKey.name}"`)
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,7 @@ class MediaProgress extends Model {
|
||||||
* @param {import('./User').ProgressUpdatePayload} progressPayload
|
* @param {import('./User').ProgressUpdatePayload} progressPayload
|
||||||
* @returns {Promise<MediaProgress>}
|
* @returns {Promise<MediaProgress>}
|
||||||
*/
|
*/
|
||||||
async applyProgressUpdate(progressPayload) {
|
applyProgressUpdate(progressPayload) {
|
||||||
if (!this.extraData) this.extraData = {}
|
if (!this.extraData) this.extraData = {}
|
||||||
if (progressPayload.isFinished !== undefined) {
|
if (progressPayload.isFinished !== undefined) {
|
||||||
if (progressPayload.isFinished && !this.isFinished) {
|
if (progressPayload.isFinished && !this.isFinished) {
|
||||||
|
|
@ -243,23 +243,14 @@ class MediaProgress extends Model {
|
||||||
this.finishedAt = null
|
this.finishedAt = null
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.save()
|
|
||||||
|
|
||||||
// For local sync
|
// For local sync
|
||||||
if (progressPayload.lastUpdate) {
|
if (progressPayload.lastUpdate) {
|
||||||
if (isNaN(new Date(progressPayload.lastUpdate))) {
|
this.updatedAt = progressPayload.lastUpdate
|
||||||
Logger.warn(`[MediaProgress] Invalid date provided for lastUpdate: ${progressPayload.lastUpdate} (media item ${this.mediaItemId})`)
|
Logger.info(`[MediaProgress] Manually setting updatedAt to ${this.updatedAt} (media item ${this.mediaItemId})`)
|
||||||
} else {
|
this.changed('updatedAt', true)
|
||||||
const escapedDate = this.sequelize.escape(new Date(progressPayload.lastUpdate))
|
|
||||||
Logger.info(`[MediaProgress] Manually setting updatedAt to ${escapedDate} (media item ${this.mediaItemId})`)
|
|
||||||
|
|
||||||
await this.sequelize.query(`UPDATE "mediaProgresses" SET "updatedAt" = ${escapedDate} WHERE "id" = '${this.id}'`)
|
|
||||||
|
|
||||||
await this.reload()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this
|
return this.save({ silent: !!progressPayload.lastUpdate })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue