-
-
+
@@ -42,7 +42,7 @@
{{ artist }},
- by {{ author.name }},
+ by {{ author.name }},
by Unknown
@@ -124,7 +124,7 @@
-
+
@@ -136,7 +136,7 @@
-
+
@@ -682,13 +682,15 @@ export default {
},
deleteLibraryItem() {
const payload = {
- message: 'This will delete the library item from the database and your file system. Are you sure?',
- checkboxLabel: 'Delete from file system. Uncheck to only remove from database.',
+ message: this.$strings.MessageConfirmDeleteLibraryItem,
+ checkboxLabel: this.$strings.LabelDeleteFromFileSystemCheckbox,
yesButtonText: this.$strings.ButtonDelete,
yesButtonColor: 'error',
- checkboxDefaultValue: true,
+ checkboxDefaultValue: !Number(localStorage.getItem('softDeleteDefault') || 0),
callback: (confirmed, hardDelete) => {
if (confirmed) {
+ localStorage.setItem('softDeleteDefault', hardDelete ? 0 : 1)
+
this.$axios
.$delete(`/api/items/${this.libraryItemId}?hard=${hardDelete ? 1 : 0}`)
.then(() => {
diff --git a/client/pages/library/_library/podcast/latest.vue b/client/pages/library/_library/podcast/latest.vue
index d0565816..8d95203f 100644
--- a/client/pages/library/_library/podcast/latest.vue
+++ b/client/pages/library/_library/podcast/latest.vue
@@ -54,9 +54,16 @@
{{ getButtonText(episode) }}
-
+
+
+
+
+
+
+
+
@@ -136,6 +143,15 @@ export default {
}
},
methods: {
+ clickAddToPlaylist(episode) {
+ // Makeshift libraryItem
+ const libraryItem = {
+ id: episode.libraryItemId,
+ media: episode.podcast
+ }
+ this.$store.commit('globals/setSelectedPlaylistItems', [{ libraryItem: libraryItem, episode }])
+ this.$store.commit('globals/setShowPlaylistsModal', true)
+ },
async clickEpisode(episode) {
if (this.openingItem) return
this.openingItem = true
@@ -155,7 +171,9 @@ export default {
if (this.episodeIdStreaming === episode.id) return this.streamIsPlaying ? 'Streaming' : 'Play'
if (!episode.progress) return this.$elapsedPretty(episode.duration)
if (episode.progress.isFinished) return 'Finished'
- var remaining = Math.floor(episode.progress.duration - episode.progress.currentTime)
+
+ const duration = episode.progress.duration || episode.duration
+ const remaining = Math.floor(duration - episode.progress.currentTime)
return `${this.$elapsedPretty(remaining)} left`
},
playClick(episodeToPlay) {
diff --git a/client/pages/library/_library/podcast/search.vue b/client/pages/library/_library/podcast/search.vue
index cde84468..3be851ce 100644
--- a/client/pages/library/_library/podcast/search.vue
+++ b/client/pages/library/_library/podcast/search.vue
@@ -45,6 +45,11 @@
\ No newline at end of file
+
diff --git a/client/plugins/i18n.js b/client/plugins/i18n.js
index 5f193d7b..ea6a06db 100644
--- a/client/plugins/i18n.js
+++ b/client/plugins/i18n.js
@@ -5,6 +5,8 @@ import { supplant } from './utils'
const defaultCode = 'en-us'
const languageCodeMap = {
+ 'cs': { label: 'Čeština', dateFnsLocale: 'cs' },
+ 'da': { label: 'Dansk', dateFnsLocale: 'da' },
'de': { label: 'Deutsch', dateFnsLocale: 'de' },
'en-us': { label: 'English', dateFnsLocale: 'enUS' },
'es': { label: 'Español', dateFnsLocale: 'es' },
@@ -16,6 +18,7 @@ const languageCodeMap = {
'no': { label: 'Norsk', dateFnsLocale: 'no' },
'pl': { label: 'Polski', dateFnsLocale: 'pl' },
'ru': { label: 'Русский', dateFnsLocale: 'ru' },
+ 'sv': { label: 'Svenska', dateFnsLocale: 'sv' },
'zh-cn': { label: '简体中文 (Simplified Chinese)', dateFnsLocale: 'zhCN' },
}
Vue.prototype.$languageCodeOptions = Object.keys(languageCodeMap).map(code => {
diff --git a/client/plugins/init.client.js b/client/plugins/init.client.js
index 711c526a..a16e6fa1 100644
--- a/client/plugins/init.client.js
+++ b/client/plugins/init.client.js
@@ -77,6 +77,7 @@ Vue.prototype.$sanitizeFilename = (filename, colonReplacement = ' - ') => {
.replace(lineBreaks, replacement)
.replace(windowsReservedRe, replacement)
.replace(windowsTrailingRe, replacement)
+ .replace(/\s+/g, ' ') // Replace consecutive spaces with a single space
// Check if basename is too many bytes
const ext = Path.extname(sanitized) // separate out file extension
diff --git a/client/store/globals.js b/client/store/globals.js
index a202d685..961dd52e 100644
--- a/client/store/globals.js
+++ b/client/store/globals.js
@@ -11,6 +11,7 @@ export const state = () => ({
showViewPodcastEpisodeModal: false,
showRSSFeedOpenCloseModal: false,
showConfirmPrompt: false,
+ showRawCoverPreviewModal: false,
confirmPromptOptions: null,
showEditAuthorModal: false,
rssFeedEntity: null,
@@ -20,6 +21,7 @@ export const state = () => ({
selectedCollection: null,
selectedAuthor: null,
selectedMediaItems: [],
+ selectedLibraryItemId: null,
isCasting: false, // Actively casting
isChromecastInitialized: false, // Script loadeds
showBatchQuickMatchModal: false,
@@ -80,7 +82,7 @@ export const state = () => ({
})
export const getters = {
- getLibraryItemCoverSrc: (state, getters, rootState, rootGetters) => (libraryItem, placeholder = null) => {
+ getLibraryItemCoverSrc: (state, getters, rootState, rootGetters) => (libraryItem, placeholder = null, raw = false) => {
if (!placeholder) placeholder = `${rootState.routerBasePath}/book_placeholder.jpg`
if (!libraryItem) return placeholder
const media = libraryItem.media
@@ -94,7 +96,7 @@ export const getters = {
const libraryItemId = libraryItem.libraryItemId || libraryItem.id // Workaround for /users/:id page showing media progress covers
if (process.env.NODE_ENV !== 'production') { // Testing
- return `http://localhost:3333${rootState.routerBasePath}/api/items/${libraryItemId}/cover?token=${userToken}&ts=${lastUpdate}`
+ return `http://localhost:3333${rootState.routerBasePath}/api/items/${libraryItemId}/cover?token=${userToken}&ts=${lastUpdate}${raw ? '&raw=1' : ''}`
}
return `${rootState.routerBasePath}/api/items/${libraryItemId}/cover?token=${userToken}&ts=${lastUpdate}`
@@ -156,6 +158,13 @@ export const mutations = {
state.confirmPromptOptions = options
state.showConfirmPrompt = true
},
+ setShowRawCoverPreviewModal(state, val) {
+ state.showRawCoverPreviewModal = val
+ },
+ setRawCoverPreviewModal(state, libraryItemId) {
+ state.selectedLibraryItemId = libraryItemId
+ state.showRawCoverPreviewModal = true
+ },
setEditCollection(state, collection) {
state.selectedCollection = collection
state.showEditCollectionModal = true
diff --git a/client/store/index.js b/client/store/index.js
index 2f8201c1..ed7c35b6 100644
--- a/client/store/index.js
+++ b/client/store/index.js
@@ -66,7 +66,7 @@ export const getters = {
export const actions = {
updateServerSettings({ commit }, payload) {
- var updatePayload = {
+ const updatePayload = {
...payload
}
return this.$axios.$patch('/api/settings', updatePayload).then((result) => {
diff --git a/client/store/libraries.js b/client/store/libraries.js
index fd8af4ae..8771ebcf 100644
--- a/client/store/libraries.js
+++ b/client/store/libraries.js
@@ -80,13 +80,11 @@ export const actions = {
return state.folders
}
}
- console.log('Loading folders')
commit('setFoldersLastUpdate')
return this.$axios
.$get('/api/filesystem')
.then((res) => {
- console.log('Settings folders', res)
commit('setFolders', res.directories)
return res.directories
})
@@ -119,15 +117,16 @@ export const actions = {
dispatch('user/checkUpdateLibrarySortFilter', library.mediaType, { root: true })
+ if (libraryChanging) {
+ commit('setCollections', [])
+ commit('setUserPlaylists', [])
+ }
+
commit('addUpdate', library)
commit('setLibraryIssues', issues)
commit('setLibraryFilterData', filterData)
commit('setNumUserPlaylists', numUserPlaylists)
commit('setCurrentLibrary', libraryId)
- if (libraryChanging) {
- commit('setCollections', [])
- commit('setUserPlaylists', [])
- }
return data
})
.catch((error) => {
diff --git a/client/store/scanners.js b/client/store/scanners.js
index 9a330f4f..ccdc1791 100644
--- a/client/store/scanners.js
+++ b/client/store/scanners.js
@@ -1,5 +1,4 @@
export const state = () => ({
- libraryScans: [],
providers: [
{
text: 'Google Books',
@@ -72,26 +71,8 @@ export const state = () => ({
]
})
-export const getters = {
- getLibraryScan: state => id => {
- return state.libraryScans.find(ls => ls.id === id)
- }
-}
+export const getters = {}
-export const actions = {
+export const actions = {}
-}
-
-export const mutations = {
- addUpdate(state, data) {
- var index = state.libraryScans.findIndex(lib => lib.id === data.id)
- if (index >= 0) {
- state.libraryScans.splice(index, 1, data)
- } else {
- state.libraryScans.push(data)
- }
- },
- remove(state, data) {
- state.libraryScans = state.libraryScans.filter(scan => scan.id !== data.id)
- }
-}
\ No newline at end of file
+export const mutations = {}
\ No newline at end of file
diff --git a/client/store/tasks.js b/client/store/tasks.js
index e8422c77..96e7e5b8 100644
--- a/client/store/tasks.js
+++ b/client/store/tasks.js
@@ -6,7 +6,11 @@ export const state = () => ({
export const getters = {
getTasksByLibraryItemId: (state) => (libraryItemId) => {
- return state.tasks.filter(t => t.data && t.data.libraryItemId === libraryItemId)
+ return state.tasks.filter(t => t.data?.libraryItemId === libraryItemId)
+ },
+ getRunningLibraryScanTask: (state) => (libraryId) => {
+ const libraryScanActions = ['library-scan', 'library-match-all']
+ return state.tasks.find(t => libraryScanActions.includes(t.action) && t.data?.libraryId === libraryId && !t.isFinished)
}
}
diff --git a/client/strings/cs.json b/client/strings/cs.json
new file mode 100644
index 00000000..bac376d8
--- /dev/null
+++ b/client/strings/cs.json
@@ -0,0 +1,753 @@
+{
+ "ButtonAdd": "Přidat",
+ "ButtonAddChapters": "Přidat kapitoly",
+ "ButtonAddDevice": "Přidat zařízení",
+ "ButtonAddLibrary": "Přidat knihovnu",
+ "ButtonAddPodcasts": "Přidat podcasty",
+ "ButtonAddUser": "Přidat uživatele",
+ "ButtonAddYourFirstLibrary": "Vytvořte svou první knihovnu",
+ "ButtonApply": "Aplikovat",
+ "ButtonApplyChapters": "Aplikovat kapitoly",
+ "ButtonAuthors": "Autoři",
+ "ButtonBrowseForFolder": "Vyhledat složku",
+ "ButtonCancel": "Zrušit",
+ "ButtonCancelEncode": "Zrušit kódování",
+ "ButtonChangeRootPassword": "Změnit 'Root' heslo",
+ "ButtonCheckAndDownloadNewEpisodes": "Zkontrolovat & stáhnout nové epizody",
+ "ButtonChooseAFolder": "Vybrat složku",
+ "ButtonChooseFiles": "Vybrat soubory",
+ "ButtonClearFilter": "Vymazat filtr",
+ "ButtonCloseFeed": "Zavřít kanál",
+ "ButtonCollections": "Kolekce",
+ "ButtonConfigureScanner": "Konfigurovat Prohledávání",
+ "ButtonCreate": "Vytvořit",
+ "ButtonCreateBackup": "Vytvořit zálohu",
+ "ButtonDelete": "Smazat",
+ "ButtonDownloadQueue": "Fronta",
+ "ButtonEdit": "Upravit",
+ "ButtonEditChapters": "Upravit kapitoly",
+ "ButtonEditPodcast": "Upravit podcast",
+ "ButtonForceReScan": "Vynutit opětovné prohledání",
+ "ButtonFullPath": "Úplná cesta",
+ "ButtonHide": "Skrýt",
+ "ButtonHome": "Domů",
+ "ButtonIssues": "Problémy",
+ "ButtonLatest": "Nejnovější",
+ "ButtonLibrary": "Knihovna",
+ "ButtonLogout": "Odhlásit",
+ "ButtonLookup": "Vyhledat",
+ "ButtonManageTracks": "Správa stop",
+ "ButtonMapChapterTitles": "Mapovat názvy kapitol",
+ "ButtonMatchAllAuthors": "Spárovat všechny autory",
+ "ButtonMatchBooks": "Spárovat Knihy",
+ "ButtonNevermind": "Nevadí",
+ "ButtonOk": "Ok",
+ "ButtonOpenFeed": "Otevřít kanál",
+ "ButtonOpenManager": "Otevřít správce",
+ "ButtonPlay": "Přehrát",
+ "ButtonPlaying": "Hraje",
+ "ButtonPlaylists": "Seznamy skladeb",
+ "ButtonPurgeAllCache": "Vyčistit veškerou mezipaměť",
+ "ButtonPurgeItemsCache": "Vyčistit mezipaměť položek",
+ "ButtonPurgeMediaProgress": "Vyčistit průběh médií",
+ "ButtonQueueAddItem": "Přidat do fronty",
+ "ButtonQueueRemoveItem": "Odstranit z fronty",
+ "ButtonQuickMatch": "Rychlé přiřazení",
+ "ButtonRead": "Číst",
+ "ButtonRemove": "Odstranit",
+ "ButtonRemoveAll": "Odstranit vše",
+ "ButtonRemoveAllLibraryItems": "Odstranit všechny položky knihovny",
+ "ButtonRemoveFromContinueListening": "Odstranit z Pokračovat v poslechu",
+ "ButtonRemoveFromContinueReading": "Odstranit z Pokračovat ve čtení",
+ "ButtonRemoveSeriesFromContinueSeries": "Odstranit sérii z Pokračovat v sérii",
+ "ButtonReScan": "Znovu prohledat",
+ "ButtonReset": "Resetovat",
+ "ButtonResetToDefault": "Obnovit výchozí",
+ "ButtonRestore": "Obnovit",
+ "ButtonSave": "Uložit",
+ "ButtonSaveAndClose": "Uložit a zavřít",
+ "ButtonSaveTracklist": "Uložit seznam skladeb",
+ "ButtonScan": "Prohledat",
+ "ButtonScanLibrary": "Prohledat Knihovnu",
+ "ButtonSearch": "Hledat",
+ "ButtonSelectFolderPath": "Vybrat cestu ke složce",
+ "ButtonSeries": "Série",
+ "ButtonSetChaptersFromTracks": "Nastavit kapitoly ze stop",
+ "ButtonShiftTimes": "Časy posunu",
+ "ButtonShow": "Zobrazit",
+ "ButtonStartM4BEncode": "Spustit kódování M4B",
+ "ButtonStartMetadataEmbed": "Spustit vkládání metadat",
+ "ButtonSubmit": "Odeslat",
+ "ButtonTest": "Test",
+ "ButtonUpload": "Nahrát",
+ "ButtonUploadBackup": "Nahrát zálohu",
+ "ButtonUploadCover": "Nahrát obálku",
+ "ButtonUploadOPMLFile": "Nahrát soubor OPML",
+ "ButtonUserDelete": "Smazat uživatelský {0}",
+ "ButtonUserEdit": "Upravit uživatelské {0}",
+ "ButtonViewAll": "Zobrazit vše",
+ "ButtonYes": "Ano",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
+ "HeaderAccount": "Účet",
+ "HeaderAdvanced": "Pokročilé",
+ "HeaderAppriseNotificationSettings": "Nastavení oznámení Apprise",
+ "HeaderAudiobookTools": "Nástroje pro správu souborů audioknih",
+ "HeaderAudioTracks": "Zvukové stopy",
+ "HeaderAuthentication": "Authentication",
+ "HeaderBackups": "Zálohy",
+ "HeaderChangePassword": "Změnit heslo",
+ "HeaderChapters": "Kapitoly",
+ "HeaderChooseAFolder": "Zvolte složku",
+ "HeaderCollection": "Kolekce",
+ "HeaderCollectionItems": "Položky kolekce",
+ "HeaderCover": "Obálka",
+ "HeaderCurrentDownloads": "Aktuální stahování",
+ "HeaderDetails": "Podrobnosti",
+ "HeaderDownloadQueue": "Fronta stahování",
+ "HeaderEbookFiles": "Soubory elektronických knih",
+ "HeaderEmail": "E-mail",
+ "HeaderEmailSettings": "Nastavení e-mailu",
+ "HeaderEpisodes": "Epizody",
+ "HeaderEreaderDevices": "Čtečky elektronických knih",
+ "HeaderEreaderSettings": "Nastavení čtečky elektronických knih",
+ "HeaderFiles": "Soubory",
+ "HeaderFindChapters": "Najít kapitoly",
+ "HeaderIgnoredFiles": "Ignorované soubory",
+ "HeaderItemFiles": "Soubory položek",
+ "HeaderItemMetadataUtils": "Nástroje metadat položek",
+ "HeaderLastListeningSession": "Poslední poslechová relace",
+ "HeaderLatestEpisodes": "Poslední epizody",
+ "HeaderLibraries": "Knihovny",
+ "HeaderLibraryFiles": "Soubory knihovny",
+ "HeaderLibraryStats": "Statistiky knihovny",
+ "HeaderListeningSessions": "Poslechové relace",
+ "HeaderListeningStats": "Statistiky poslechu",
+ "HeaderLogin": "Přihlásit",
+ "HeaderLogs": "Záznamy",
+ "HeaderManageGenres": "Spravovat žánry",
+ "HeaderManageTags": "Spravovat štítky",
+ "HeaderMapDetails": "Podrobnosti mapování",
+ "HeaderMatch": "Shoda",
+ "HeaderMetadataOrderOfPrecedence": "Pořadí priorit metadat",
+ "HeaderMetadataToEmbed": "Metadata k vložení",
+ "HeaderNewAccount": "Nový účet",
+ "HeaderNewLibrary": "Nová knihovna",
+ "HeaderNotifications": "Oznámení",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
+ "HeaderOpenRSSFeed": "Otevřít RSS kanál",
+ "HeaderOtherFiles": "Ostatní soubory",
+ "HeaderPasswordAuthentication": "Password Authentication",
+ "HeaderPermissions": "Oprávnění",
+ "HeaderPlayerQueue": "Fronta přehrávače",
+ "HeaderPlaylist": "Seznam skladeb",
+ "HeaderPlaylistItems": "Položky seznamu přehrávání",
+ "HeaderPodcastsToAdd": "Podcasty k přidání",
+ "HeaderPreviewCover": "Náhled obálky",
+ "HeaderRemoveEpisode": "Odstranit epizodu",
+ "HeaderRemoveEpisodes": "Odstranit {0} epizody",
+ "HeaderRSSFeedGeneral": "Podrobnosti o RSS",
+ "HeaderRSSFeedIsOpen": "Informační kanál RSS je otevřený",
+ "HeaderRSSFeeds": "RSS kanály",
+ "HeaderSavedMediaProgress": "Průběh uložených médií",
+ "HeaderSchedule": "Plán",
+ "HeaderScheduleLibraryScans": "Naplánovat automatické prohledávání knihoven",
+ "HeaderSession": "Relace",
+ "HeaderSetBackupSchedule": "Nastavit plán zálohování",
+ "HeaderSettings": "Nastavení",
+ "HeaderSettingsDisplay": "Zobrazit",
+ "HeaderSettingsExperimental": "Experimentální funkce",
+ "HeaderSettingsGeneral": "Obecné",
+ "HeaderSettingsScanner": "Skener",
+ "HeaderSleepTimer": "Časovač vypnutí",
+ "HeaderStatsLargestItems": "Největší položky",
+ "HeaderStatsLongestItems": "Nejdelší položky (hod.)",
+ "HeaderStatsMinutesListeningChart": "Počet minut poslechu (posledních 7 dní)",
+ "HeaderStatsRecentSessions": "Poslední relace",
+ "HeaderStatsTop10Authors": "Top 10 autorů",
+ "HeaderStatsTop5Genres": "Top 5 žánrů",
+ "HeaderTableOfContents": "Obsah",
+ "HeaderTools": "Nástroje",
+ "HeaderUpdateAccount": "Aktualizovat účet",
+ "HeaderUpdateAuthor": "Aktualizovat autora",
+ "HeaderUpdateDetails": "Aktualizovat podrobnosti",
+ "HeaderUpdateLibrary": "Aktualizovat knihovnu",
+ "HeaderUsers": "Uživatelé",
+ "HeaderYourStats": "Vaše statistiky",
+ "LabelAbridged": "Zkráceno",
+ "LabelAccountType": "Typ účtu",
+ "LabelAccountTypeAdmin": "Správce",
+ "LabelAccountTypeGuest": "Host",
+ "LabelAccountTypeUser": "Uživatel",
+ "LabelActivity": "Aktivita",
+ "LabelAdded": "Přidáno",
+ "LabelAddedAt": "Přidáno v",
+ "LabelAddToCollection": "Přidat do kolekce",
+ "LabelAddToCollectionBatch": "Přidat {0} knihy do kolekce",
+ "LabelAddToPlaylist": "Přidat do seznamu přehrávání",
+ "LabelAddToPlaylistBatch": "Přidat {0} položky do seznamu přehrávání",
+ "LabelAdminUsersOnly": "Pouze administrátoři",
+ "LabelAll": "Vše",
+ "LabelAllUsers": "Všichni uživatelé",
+ "LabelAllUsersExcludingGuests": "Všichni uživatelé kromě hostů",
+ "LabelAllUsersIncludingGuests": "Všichni uživatelé včetně hostů",
+ "LabelAlreadyInYourLibrary": "Již ve vaší knihovně",
+ "LabelAppend": "Připojit",
+ "LabelAuthor": "Autor",
+ "LabelAuthorFirstLast": "Autor (jméno a příjmení)",
+ "LabelAuthorLastFirst": "Autor (příjmení a jméno)",
+ "LabelAuthors": "Autoři",
+ "LabelAutoDownloadEpisodes": "Automaticky stahovat epizody",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
+ "LabelBackToUser": "Zpět k uživateli",
+ "LabelBackupLocation": "Umístění zálohy",
+ "LabelBackupsEnableAutomaticBackups": "Povolit automatické zálohování",
+ "LabelBackupsEnableAutomaticBackupsHelp": "Zálohy uložené v /metadata/backups",
+ "LabelBackupsMaxBackupSize": "Maximální velikost zálohy (v GB)",
+ "LabelBackupsMaxBackupSizeHelp": "Ochrana proti chybné konfiguraci: Zálohování se nezdaří, pokud překročí nastavenou velikost.",
+ "LabelBackupsNumberToKeep": "Počet záloh, které se mají uchovat",
+ "LabelBackupsNumberToKeepHelp": "Najednou bude odstraněna pouze 1 záloha, takže pokud již máte více záloh, měli byste je odstranit ručně.",
+ "LabelBitrate": "Datový tok",
+ "LabelBooks": "Knihy",
+ "LabelButtonText": "Button Text",
+ "LabelChangePassword": "Změnit heslo",
+ "LabelChannels": "Kanály",
+ "LabelChapters": "Kapitoly",
+ "LabelChaptersFound": "Kapitoly nalezeny",
+ "LabelChapterTitle": "Název kapitoly",
+ "LabelClickForMoreInfo": "Klikněte pro více informací",
+ "LabelClosePlayer": "Zavřít přehrávač",
+ "LabelCodec": "Kodek",
+ "LabelCollapseSeries": "Sbalit sérii",
+ "LabelCollection": "Kolekce",
+ "LabelCollections": "Kolekce",
+ "LabelComplete": "Dokončeno",
+ "LabelConfirmPassword": "Potvrdit heslo",
+ "LabelContinueListening": "Pokračovat v poslechu",
+ "LabelContinueReading": "Pokračovat ve čtení",
+ "LabelContinueSeries": "Pokračovat v sérii",
+ "LabelCover": "Obálka",
+ "LabelCoverImageURL": "URL obrázku obálky",
+ "LabelCreatedAt": "Vytvořeno v",
+ "LabelCronExpression": "Výraz Cronu",
+ "LabelCurrent": "Aktuální",
+ "LabelCurrently": "Aktuálně:",
+ "LabelCustomCronExpression": "Vlastní výraz cronu:",
+ "LabelDatetime": "Datum a čas",
+ "LabelDeleteFromFileSystemCheckbox": "Smazat ze souborového systému (zrušte zaškrtnutí pro odstranění pouze z databáze)",
+ "LabelDescription": "Popis",
+ "LabelDeselectAll": "Odznačit vše",
+ "LabelDevice": "Zařízení",
+ "LabelDeviceInfo": "Informace o zařízení",
+ "LabelDeviceIsAvailableTo": "Zařízení je dostupné pro...",
+ "LabelDirectory": "Adresář",
+ "LabelDiscFromFilename": "Disk z názvu souboru",
+ "LabelDiscFromMetadata": "Disk z metadat",
+ "LabelDiscover": "Objevit",
+ "LabelDownload": "Stáhnout",
+ "LabelDownloadNEpisodes": "Stáhnout {0} epizody",
+ "LabelDuration": "Doba trvání",
+ "LabelDurationFound": "Doba trvání nalezena:",
+ "LabelEbook": "Elektronická kniha",
+ "LabelEbooks": "Elektronické knihy",
+ "LabelEdit": "Upravit",
+ "LabelEmail": "E-mail",
+ "LabelEmailSettingsFromAddress": "Z adresy",
+ "LabelEmailSettingsSecure": "Zabezpečené",
+ "LabelEmailSettingsSecureHelp": "Pokud je true, připojení bude při připojování k serveru používat TLS. Pokud je false, použije se protokol TLS, pokud server podporuje rozšíření STARTTLS. Ve většině případů nastavte tuto hodnotu na true, pokud se připojujete k portu 465. Pro port 587 nebo 25 ponechte hodnotu false. (z nodemailer.com/smtp/#authentication)",
+ "LabelEmailSettingsTestAddress": "Testovací adresa",
+ "LabelEmbeddedCover": "Vložená obálka",
+ "LabelEnable": "Povolit",
+ "LabelEnd": "Konec",
+ "LabelEpisode": "Epizoda",
+ "LabelEpisodeTitle": "Název epizody",
+ "LabelEpisodeType": "Typ epizody",
+ "LabelExample": "Příklad",
+ "LabelExplicit": "Explicitní",
+ "LabelFeedURL": "URL zdroje",
+ "LabelFetchingMetadata": "Fetching Metadata",
+ "LabelFile": "Soubor",
+ "LabelFileBirthtime": "Čas vzniku souboru",
+ "LabelFileModified": "Soubor změněn",
+ "LabelFilename": "Název souboru",
+ "LabelFilterByUser": "Filtrovat podle uživatele",
+ "LabelFindEpisodes": "Najít epizody",
+ "LabelFinished": "Dokončeno",
+ "LabelFolder": "Složka",
+ "LabelFolders": "Složky",
+ "LabelFontFamily": "Rodina písem",
+ "LabelFontScale": "Měřítko písma",
+ "LabelFormat": "Formát",
+ "LabelGenre": "Žánr",
+ "LabelGenres": "Žánry",
+ "LabelHardDeleteFile": "Trvale smazat soubor",
+ "LabelHasEbook": "Obsahuje elektronickou knihu",
+ "LabelHasSupplementaryEbook": "Obsahuje doplňkovou elektronickou knihu",
+ "LabelHighestPriority": "Highest priority",
+ "LabelHost": "Hostitel",
+ "LabelHour": "Hodina",
+ "LabelIcon": "Ikona",
+ "LabelImageURLFromTheWeb": "URL obrázku z webu",
+ "LabelIncludeInTracklist": "Zahrnout do seznamu stop",
+ "LabelIncomplete": "Neúplné",
+ "LabelInProgress": "Probíhá",
+ "LabelInterval": "Interval",
+ "LabelIntervalCustomDailyWeekly": "Vlastní denně/týdně",
+ "LabelIntervalEvery12Hours": "Každých 12 hodin",
+ "LabelIntervalEvery15Minutes": "Každých 15 minut",
+ "LabelIntervalEvery2Hours": "Každé 2 hodiny",
+ "LabelIntervalEvery30Minutes": "Každých 30 minut",
+ "LabelIntervalEvery6Hours": "Každých 6 hodin",
+ "LabelIntervalEveryDay": "Každý den",
+ "LabelIntervalEveryHour": "Každou hodinu",
+ "LabelInvalidParts": "Neplatné části",
+ "LabelInvert": "Invertovat",
+ "LabelItem": "Položka",
+ "LabelLanguage": "Jazyk",
+ "LabelLanguageDefaultServer": "Výchozí jazyk serveru",
+ "LabelLastBookAdded": "Poslední kniha přidána",
+ "LabelLastBookUpdated": "Poslední kniha aktualizována",
+ "LabelLastSeen": "Naposledy viděno",
+ "LabelLastTime": "Naposledy",
+ "LabelLastUpdate": "Poslední aktualizace",
+ "LabelLayout": "Rozvržení",
+ "LabelLayoutSinglePage": "Jedna stránka",
+ "LabelLayoutSplitPage": "Rozdělit stránku",
+ "LabelLess": "Méně",
+ "LabelLibrariesAccessibleToUser": "Knihovny přístupné uživateli",
+ "LabelLibrary": "Knihovna",
+ "LabelLibraryItem": "Položka knihovny",
+ "LabelLibraryName": "Název knihovny",
+ "LabelLimit": "Omezit",
+ "LabelLineSpacing": "Řádkování",
+ "LabelListenAgain": "Poslouchat znovu",
+ "LabelLogLevelDebug": "Ladit",
+ "LabelLogLevelInfo": "Informace",
+ "LabelLogLevelWarn": "Varovat",
+ "LabelLookForNewEpisodesAfterDate": "Hledat nové epizody po tomto datu",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
+ "LabelMediaPlayer": "Přehrávač médií",
+ "LabelMediaType": "Typ média",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
+ "LabelMetadataProvider": "Poskytovatel metadat",
+ "LabelMetaTag": "Metaznačka",
+ "LabelMetaTags": "Metaznačky",
+ "LabelMinute": "Minuta",
+ "LabelMissing": "Chybějící",
+ "LabelMissingParts": "Chybějící díly",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
+ "LabelMore": "Více",
+ "LabelMoreInfo": "Více informací",
+ "LabelName": "Jméno",
+ "LabelNarrator": "Interpret",
+ "LabelNarrators": "Interpreti",
+ "LabelNew": "Nový",
+ "LabelNewestAuthors": "Nejnovější autoři",
+ "LabelNewestEpisodes": "Nejnovější epizody",
+ "LabelNewPassword": "Nové heslo",
+ "LabelNextBackupDate": "Datum příští zálohy",
+ "LabelNextScheduledRun": "Další naplánované spuštění",
+ "LabelNoEpisodesSelected": "Nebyly vybrány žádné epizody",
+ "LabelNotes": "Poznámky",
+ "LabelNotFinished": "Nedokončeno",
+ "LabelNotificationAppriseURL": "URL adresy Apprise",
+ "LabelNotificationAvailableVariables": "Dostupné proměnné",
+ "LabelNotificationBodyTemplate": "Šablona těla",
+ "LabelNotificationEvent": "Událost oznámení",
+ "LabelNotificationsMaxFailedAttempts": "Maximální počet neúspěšných pokusů",
+ "LabelNotificationsMaxFailedAttemptsHelp": "Oznámení jsou vypnuta, pokud se jim to nepodaří odeslat",
+ "LabelNotificationsMaxQueueSize": "Maximální velikost fronty pro oznamovací události",
+ "LabelNotificationsMaxQueueSizeHelp": "Události jsou omezeny na 1 za sekundu. Události budou ignorovány, pokud je fronta v maximální velikosti. Tím se zabrání spamování oznámení.",
+ "LabelNotificationTitleTemplate": "Šablona názvu",
+ "LabelNotStarted": "Nezahájeno",
+ "LabelNumberOfBooks": "Počet knih",
+ "LabelNumberOfEpisodes": "Počet epizod",
+ "LabelOpenRSSFeed": "Otevřít RSS kanál",
+ "LabelOverwrite": "Přepsat",
+ "LabelPassword": "Heslo",
+ "LabelPath": "Cesta",
+ "LabelPermissionsAccessAllLibraries": "Má přístup ke všem knihovnám",
+ "LabelPermissionsAccessAllTags": "Má přístup ke všem značkám",
+ "LabelPermissionsAccessExplicitContent": "Má přístup k explicitnímu obsahu",
+ "LabelPermissionsDelete": "Může mazat",
+ "LabelPermissionsDownload": "Může stahovat",
+ "LabelPermissionsUpdate": "Může aktualizovat",
+ "LabelPermissionsUpload": "Může nahrávat",
+ "LabelPhotoPathURL": "Cesta k fotografii/URL",
+ "LabelPlaylists": "Seznamy skladeb",
+ "LabelPlayMethod": "Metoda přehrávání",
+ "LabelPodcast": "Podcast",
+ "LabelPodcasts": "Podcasty",
+ "LabelPodcastType": "Typ podcastu",
+ "LabelPort": "Port",
+ "LabelPrefixesToIgnore": "Předpony, které se mají ignorovat (nerozlišují se malá a velká písmena)",
+ "LabelPreventIndexing": "Zabránit indexování vašeho kanálu v adresářích podcastů iTunes a Google",
+ "LabelPrimaryEbook": "Hlavní e-kniha",
+ "LabelProgress": "Průběh",
+ "LabelProvider": "Poskytovatel",
+ "LabelPubDate": "Datum vydání",
+ "LabelPublisher": "Vydavatel",
+ "LabelPublishYear": "Rok vydání",
+ "LabelRead": "Číst",
+ "LabelReadAgain": "Číst znovu",
+ "LabelReadEbookWithoutProgress": "Číst e-knihu bez zachování průběhu",
+ "LabelRecentlyAdded": "Nedávno přidané",
+ "LabelRecentSeries": "Nedávné série",
+ "LabelRecommended": "Doporučeno",
+ "LabelRegion": "Region",
+ "LabelReleaseDate": "Datum vydání",
+ "LabelRemoveCover": "Odstranit obálku",
+ "LabelRowsPerPage": "Rows per page",
+ "LabelRSSFeedCustomOwnerEmail": "Vlastní e-mail vlastníka",
+ "LabelRSSFeedCustomOwnerName": "Vlastní jméno vlastníka",
+ "LabelRSSFeedOpen": "Otevření RSS kanálu",
+ "LabelRSSFeedPreventIndexing": "Zabránit indexování",
+ "LabelRSSFeedSlug": "RSS kanál Slug",
+ "LabelRSSFeedURL": "URL RSS kanálu",
+ "LabelSearchTerm": "Vyhledat termín",
+ "LabelSearchTitle": "Vyhledat název",
+ "LabelSearchTitleOrASIN": "Vyhledat název nebo ASIN",
+ "LabelSeason": "Sezóna",
+ "LabelSelectAllEpisodes": "Vybrat všechny epizody",
+ "LabelSelectEpisodesShowing": "Vyberte {0} epizody, které se zobrazují",
+ "LabelSelectUsers": "Vybrat uživatele",
+ "LabelSendEbookToDevice": "Odeslat e-knihu do...",
+ "LabelSequence": "Sekvence",
+ "LabelSeries": "Série",
+ "LabelSeriesName": "Název série",
+ "LabelSeriesProgress": "Průběh série",
+ "LabelSetEbookAsPrimary": "Nastavit jako primární",
+ "LabelSetEbookAsSupplementary": "Nastavit jako doplňkové",
+ "LabelSettingsAudiobooksOnly": "Pouze audioknihy",
+ "LabelSettingsAudiobooksOnlyHelp": "Povolením tohoto nastavení budou soubory e-knih ignorovány, pokud nejsou ve složce audioknih, v takovém případě budou nastaveny jako doplňkové e-knihy",
+ "LabelSettingsBookshelfViewHelp": "Skeumorfní design s dřevěnými policemi",
+ "LabelSettingsChromecastSupport": "Podpora Chromecastu",
+ "LabelSettingsDateFormat": "Formát data",
+ "LabelSettingsDisableWatcher": "Zakázat sledování",
+ "LabelSettingsDisableWatcherForLibrary": "Zakázat sledování složky pro knihovnu",
+ "LabelSettingsDisableWatcherHelp": "Zakáže automatické přidávání/aktualizaci položek při zjištění změn v souboru. *Vyžaduje restart serveru",
+ "LabelSettingsEnableWatcher": "Povolit sledování",
+ "LabelSettingsEnableWatcherForLibrary": "Povolit sledování složky pro knihovnu",
+ "LabelSettingsEnableWatcherHelp": "Povoluje automatické přidávání/aktualizaci položek, když jsou zjištěny změny souborů. *Vyžaduje restart serveru",
+ "LabelSettingsExperimentalFeatures": "Experimentální funkce",
+ "LabelSettingsExperimentalFeaturesHelp": "Funkce ve vývoji, které by mohly využít vaši zpětnou vazbu a pomoc s testováním. Kliknutím otevřete diskuzi na githubu.",
+ "LabelSettingsFindCovers": "Najít obálky",
+ "LabelSettingsFindCoversHelp": "Pokud vaše audiokniha nemá vloženou obálku nebo obrázek obálky uvnitř složky, skener se pokusí obálku najít.
Poznámka: Tím se prodlouží doba prohledávání",
+ "LabelSettingsHideSingleBookSeries": "Skrýt sérii s jedinou knihou",
+ "LabelSettingsHideSingleBookSeriesHelp": "Série, které mají jedinou knihu, budou skryty na stránce série a na domovské stránce.",
+ "LabelSettingsHomePageBookshelfView": "Domovská stránka používá zobrazení police s knihami",
+ "LabelSettingsLibraryBookshelfView": "Knihovna používá zobrazení police s knihami",
+ "LabelSettingsParseSubtitles": "Analzyovat podtitul",
+ "LabelSettingsParseSubtitlesHelp": "Rozparsovat podtitul z názvů složek audioknih.
Podtiul musí být oddělen znakem \" - \"
tj. \"Název knihy - Zde Podtitul\" má podtitul \"Zde podtitul\"",
+ "LabelSettingsPreferMatchedMetadata": "Preferovat spárovaná metadata",
+ "LabelSettingsPreferMatchedMetadataHelp": "Spárovaná data budou mít při použití funkce Rychlé párování přednost před údaji o položce. Ve výchozím nastavení funkce Rychlé párování pouze doplní chybějící údaje.",
+ "LabelSettingsSkipMatchingBooksWithASIN": "Přeskočit párování knih, které již mají ASIN",
+ "LabelSettingsSkipMatchingBooksWithISBN": "Přeskočit párování knih, které již mají ISBN",
+ "LabelSettingsSortingIgnorePrefixes": "Ignorovat předpony při třídění",
+ "LabelSettingsSortingIgnorePrefixesHelp": "tj. pro předponu \"the\" název knihy \"Název knihy\" by se třídil jako \"Název knihy, The\"",
+ "LabelSettingsSquareBookCovers": "Použít čtvercové obálky knih",
+ "LabelSettingsSquareBookCoversHelp": "Preferovat použití čtvercových obálek před standardními obálkami 1.6:1",
+ "LabelSettingsStoreCoversWithItem": "Uložit obálky s položkou",
+ "LabelSettingsStoreCoversWithItemHelp": "Ve výchozím nastavení jsou obálky uloženy v adresáři /metadata/items, povolením tohoto nastavení se obálky uloží do složky položek knihovny. Zůstane zachován pouze jeden soubor s názvem \"cover\"",
+ "LabelSettingsStoreMetadataWithItem": "Uložit metadata s položkou",
+ "LabelSettingsStoreMetadataWithItemHelp": "Ve výchozím nastavení jsou soubory metadat uloženy v adresáři /metadata/items, povolením tohoto nastavení budou soubory metadat uloženy ve složkách položek knihovny",
+ "LabelSettingsTimeFormat": "Formát času",
+ "LabelShowAll": "Zobrazit vše",
+ "LabelSize": "Velikost",
+ "LabelSleepTimer": "Časovač vypnutí",
+ "LabelSlug": "Slug",
+ "LabelStart": "Spustit",
+ "LabelStarted": "Spuštěno",
+ "LabelStartedAt": "Spuštěno v",
+ "LabelStartTime": "Čas Spuštění",
+ "LabelStatsAudioTracks": "Zvukové stopy",
+ "LabelStatsAuthors": "Autoři",
+ "LabelStatsBestDay": "Nejlepší den",
+ "LabelStatsDailyAverage": "Denní průměr",
+ "LabelStatsDays": "Dny",
+ "LabelStatsDaysListened": "Dny poslechu",
+ "LabelStatsHours": "Hodiny",
+ "LabelStatsInARow": "v řadě",
+ "LabelStatsItemsFinished": "Dokončené Položky",
+ "LabelStatsItemsInLibrary": "Položky v knihovně",
+ "LabelStatsMinutes": "minut",
+ "LabelStatsMinutesListening": "Minuty poslechu",
+ "LabelStatsOverallDays": "Celkový počet dní",
+ "LabelStatsOverallHours": "Celkový počet hodin",
+ "LabelStatsWeekListening": "Týdenní poslech",
+ "LabelSubtitle": "Podtitul",
+ "LabelSupportedFileTypes": "Podporované typy souborů",
+ "LabelTag": "Značka",
+ "LabelTags": "Značky",
+ "LabelTagsAccessibleToUser": "Značky přístupné uživateli",
+ "LabelTagsNotAccessibleToUser": "Značky nepřístupné uživateli",
+ "LabelTasks": "Spuštěné Úlohy",
+ "LabelTheme": "Téma",
+ "LabelThemeDark": "Tmavé",
+ "LabelThemeLight": "Světlé",
+ "LabelTimeBase": "Časová základna",
+ "LabelTimeListened": "Čas poslechu",
+ "LabelTimeListenedToday": "Čas poslechu dnes",
+ "LabelTimeRemaining": "{0} zbývá",
+ "LabelTimeToShift": "Čas posunu v sekundách",
+ "LabelTitle": "Název",
+ "LabelToolsEmbedMetadata": "Vložit metadata",
+ "LabelToolsEmbedMetadataDescription": "Vložit metadata do zvukových souborů včetně obálky a kapitol.",
+ "LabelToolsMakeM4b": "Vytvořit soubor audioknihy M4B",
+ "LabelToolsMakeM4bDescription": "Vygenerovat soubor audioknihy M4B s vloženými metadaty, obálkou a kapitolami.",
+ "LabelToolsSplitM4b": "Rozdělit M4B na MP3",
+ "LabelToolsSplitM4bDescription": "Vytvořit soubory MP3 z M4B rozděleného podle kapitol s vloženými metadaty, obrázku obálky a kapitol.",
+ "LabelTotalDuration": "Celková doba trvání",
+ "LabelTotalTimeListened": "Celkový čas poslechu",
+ "LabelTrackFromFilename": "Stopa z názvu souboru",
+ "LabelTrackFromMetadata": "Stopa z metadat",
+ "LabelTracks": "Stopy",
+ "LabelTracksMultiTrack": "Více stop",
+ "LabelTracksNone": "Žádné stopy",
+ "LabelTracksSingleTrack": "Jedna stopa",
+ "LabelType": "Typ",
+ "LabelUnabridged": "Nezkráceno",
+ "LabelUnknown": "Neznámý",
+ "LabelUpdateCover": "Aktualizovat obálku",
+ "LabelUpdateCoverHelp": "Povolit přepsání existujících obálek pro vybrané knihy, pokud je nalezena shoda",
+ "LabelUpdatedAt": "Aktualizováno v",
+ "LabelUpdateDetails": "Aktualizovat podrobnosti",
+ "LabelUpdateDetailsHelp": "Povolit přepsání existujících údajů o vybraných knihách, když je nalezena shoda",
+ "LabelUploaderDragAndDrop": "Přetáhnout soubory nebo složky",
+ "LabelUploaderDropFiles": "Odstranit soubory",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
+ "LabelUseChapterTrack": "Použít stopu kapitoly",
+ "LabelUseFullTrack": "Použít celou stopu",
+ "LabelUser": "Uživatel",
+ "LabelUsername": "Uživatelské jméno",
+ "LabelValue": "Hodnota",
+ "LabelVersion": "Verze",
+ "LabelViewBookmarks": "Zobrazit záložky",
+ "LabelViewChapters": "Zobrazit kapitoly",
+ "LabelViewQueue": "Zobrazit frontu přehrávače",
+ "LabelVolume": "Hlasitost",
+ "LabelWeekdaysToRun": "Dny v týdnu ke spuštění",
+ "LabelYourAudiobookDuration": "Doba trvání vaší audioknihy",
+ "LabelYourBookmarks": "Vaše záložky",
+ "LabelYourPlaylists": "Vaše seznamy přehrávání",
+ "LabelYourProgress": "Váš pokrok",
+ "MessageAddToPlayerQueue": "Přidat do fronty přehrávače",
+ "MessageAppriseDescription": "Abyste mohli používat tuto funkci, musíte mít spuštěnou instanci
Apprise API nebo API, které bude zpracovávat stejné požadavky.
Adresa URL API Apprise by měla být úplná URL cesta pro odeslání oznámení, např. pokud je vaše instance API obsluhována na adrese
http://192.168.1.1:8337
pak byste měli zadat
http://192.168.1.1:8337/notify
.",
+ "MessageBackupsDescription": "Zálohy zahrnují uživatele, průběh uživatele, podrobnosti o položkách knihovny, nastavení serveru a obrázky uložené v
/metadata/items
a
/metadata/authors
. Zálohy
ne zahrnují všechny soubory uložené ve složkách knihovny.",
+ "MessageBatchQuickMatchDescription": "Rychlá párování se pokusí přidat chybějící obálky a metadata pro vybrané položky. Povolením níže uvedených možností umožníte funkci Rychlé párování přepsat stávající obálky a/nebo metadata.",
+ "MessageBookshelfNoCollections": "Ještě jste nevytvořili žádnou sbírku",
+ "MessageBookshelfNoResultsForFilter": "Filtr \"{0}: {1}\"",
+ "MessageBookshelfNoRSSFeeds": "Nejsou otevřeny žádné RSS kanály",
+ "MessageBookshelfNoSeries": "Nemáte žádnou sérii",
+ "MessageChapterEndIsAfter": "Konec kapitoly přesahuje konec audioknihy",
+ "MessageChapterErrorFirstNotZero": "První kapitola musí začínat na 0",
+ "MessageChapterErrorStartGteDuration": "Neplatný čas začátku, musí být kratší než doba trvání audioknihy",
+ "MessageChapterErrorStartLtPrev": "Neplatný čas začátku, musí být větší nebo roven času začátku předchozí kapitoly",
+ "MessageChapterStartIsAfter": "Začátek kapitoly přesahuje konec audioknihy",
+ "MessageCheckingCron": "Kontrola cronu...",
+ "MessageConfirmCloseFeed": "Opravdu chcete zavřít tento kanál?",
+ "MessageConfirmDeleteBackup": "Opravdu chcete smazat zálohu pro {0}?",
+ "MessageConfirmDeleteFile": "Tento krok smaže soubor ze souborového systému. Jsi si jisti?",
+ "MessageConfirmDeleteLibrary": "Opravdu chcete trvale smazat knihovnu \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "Tento krok odstraní položku knihovny z databáze a vašeho souborového systému. Jste si jisti?",
+ "MessageConfirmDeleteLibraryItems": "Tímto smažete {0} položkek knihovny z databáze a vašeho souborového systému. Jsi si jisti?",
+ "MessageConfirmDeleteSession": "Opravdu chcete smazat tuto relaci?",
+ "MessageConfirmForceReScan": "Opravdu chcete vynutit opětovné prohledání?",
+ "MessageConfirmMarkAllEpisodesFinished": "Opravdu chcete označit všechny epizody jako dokončené?",
+ "MessageConfirmMarkAllEpisodesNotFinished": "Opravdu chcete označit všechny epizody jako nedokončené?",
+ "MessageConfirmMarkSeriesFinished": "Opravdu chcete označit všechny knihy z této série jako dokončené?",
+ "MessageConfirmMarkSeriesNotFinished": "Opravdu chcete označit všechny knihy z této série jako nedokončené?",
+ "MessageConfirmQuickEmbed": "Varování! Rychlé vložení nezálohuje vaše zvukové soubory. Ujistěte se, že máte zálohu zvukových souborů.
Chcete pokračovat?",
+ "MessageConfirmRemoveAllChapters": "Opravdu chcete odstranit všechny kapitoly?",
+ "MessageConfirmRemoveAuthor": "Opravdu chcete odstranit autora \"{0}\"?",
+ "MessageConfirmRemoveCollection": "Opravdu chcete odstranit kolekci \"{0}\"?",
+ "MessageConfirmRemoveEpisode": "Opravdu chcete odstranit epizodu \"{0}\"?",
+ "MessageConfirmRemoveEpisodes": "Opravdu chcete odstranit {0} epizody?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
+ "MessageConfirmRemoveNarrator": "Opravdu chcete odebrat předčítání \"{0}\"?",
+ "MessageConfirmRemovePlaylist": "Opravdu chcete odstranit svůj playlist \"{0}\"?",
+ "MessageConfirmRenameGenre": "Opravdu chcete přejmenovat žánr \"{0}\" na \"{1}\" pro všechny položky?",
+ "MessageConfirmRenameGenreMergeNote": "Poznámka: Tento žánr již existuje, takže budou sloučeny.",
+ "MessageConfirmRenameGenreWarning": "Varování! Podobný žánr s jiným obalem již existuje \"{0}\".",
+ "MessageConfirmRenameTag": "Opravdu chcete přejmenovat tag \"{0}\" na \"{1}\" pro všechny položky?",
+ "MessageConfirmRenameTagMergeNote": "Poznámka: Tato značka již existuje, takže budou sloučeny.",
+ "MessageConfirmRenameTagWarning": "Varování! Podobná značka s jinými velkými a malými písmeny již existuje \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Opravdu chcete znovu prohledat {0} položky?",
+ "MessageConfirmSendEbookToDevice": "Opravdu chcete odeslat e-knihu {0} {1}\" do zařízení \"{2}\"?",
+ "MessageDownloadingEpisode": "Stahuji epizodu",
+ "MessageDragFilesIntoTrackOrder": "Přetáhněte soubory do správného pořadí stop",
+ "MessageEmbedFinished": "Vložení dokončeno!",
+ "MessageEpisodesQueuedForDownload": "{0} epizody zařazené do fronty ke stažení",
+ "MessageFeedURLWillBe": "URL zdroje bude {0}",
+ "MessageFetching": "Stahování...",
+ "MessageForceReScanDescription": "znovu prohledá všechny soubory jako při novém skenování. ID3 tagy zvukových souborů OPF soubory a textové soubory budou skenovány jako nové.",
+ "MessageImportantNotice": "Důležité upozornění!",
+ "MessageInsertChapterBelow": "Vložit kapitolu níže",
+ "MessageItemsSelected": "{0} vybraných položek",
+ "MessageItemsUpdated": "{0} položky byly aktualizovány",
+ "MessageJoinUsOn": "Přidejte se k nám",
+ "MessageListeningSessionsInTheLastYear": "{0} poslechových relací za poslední rok",
+ "MessageLoading": "Načítá se...",
+ "MessageLoadingFolders": "Načítám složky...",
+ "MessageM4BFailed": "M4B se nezdařil!",
+ "MessageM4BFinished": "M4B dokončen!",
+ "MessageMapChapterTitles": "Mapování názvů kapitol ke stávajícím kapitolám audioknihy bez úpravy časových razítek",
+ "MessageMarkAllEpisodesFinished": "Označit všechny epizody za dokončené",
+ "MessageMarkAllEpisodesNotFinished": "Označit všechny epizody jako nedokončené",
+ "MessageMarkAsFinished": "Označit jako dokončené",
+ "MessageMarkAsNotFinished": "Označit jako nedokončené",
+ "MessageMatchBooksDescription": "pokusí se spárovat knihy v knihovně s knihou od vybraného vyhledávače a vyplnit prázdné údaje a obálku. Nepřepisuje detaily.",
+ "MessageNoAudioTracks": "Žádné zvukové stopy",
+ "MessageNoAuthors": "Žádní autoři",
+ "MessageNoBackups": "Žádné zálohy",
+ "MessageNoBookmarks": "Žádné záložky",
+ "MessageNoChapters": "Žádné kapitoly",
+ "MessageNoCollections": "Žádné kolekce",
+ "MessageNoCoversFound": "Nebyly nalezeny žádné obálky",
+ "MessageNoDescription": "Bez popisu",
+ "MessageNoDownloadsInProgress": "Momentálně neprobíhá žádné stahování",
+ "MessageNoDownloadsQueued": "Žádné stahování ve frontě",
+ "MessageNoEpisodeMatchesFound": "Nebyly nalezeny žádné odpovídající epizody",
+ "MessageNoEpisodes": "Žádné epizody",
+ "MessageNoFoldersAvailable": "Nejsou k dispozici žádné složky",
+ "MessageNoGenres": "Žádné žánry",
+ "MessageNoIssues": "Žádné výtisk",
+ "MessageNoItems": "Žádné položky",
+ "MessageNoItemsFound": "Nebyly nalezeny žádné položky",
+ "MessageNoListeningSessions": "Žádné poslechové relace",
+ "MessageNoLogs": "Žádné protokoly",
+ "MessageNoMediaProgress": "Žádný průběh médií",
+ "MessageNoNotifications": "Žádná oznámení",
+ "MessageNoPodcastsFound": "Nebyly nalezeny žádné podcasty",
+ "MessageNoResults": "Žádné výsledky",
+ "MessageNoSearchResultsFor": "Nebyly nalezeny žádné výsledky hledání pro \"{0}\"",
+ "MessageNoSeries": "Žádné série",
+ "MessageNoTags": "Žádné značky",
+ "MessageNoTasksRunning": "Nejsou spuštěny žádné úlohy",
+ "MessageNotYetImplemented": "Ještě není implementováno",
+ "MessageNoUpdateNecessary": "Není nutná žádná aktualizace",
+ "MessageNoUpdatesWereNecessary": "Nebyly nutné žádné aktualizace",
+ "MessageNoUserPlaylists": "Nemáte žádné seznamy skladeb",
+ "MessageOr": "nebo",
+ "MessagePauseChapter": "Pozastavit přehrávání kapitoly",
+ "MessagePlayChapter": "Poslechnout si začátek kapitoly",
+ "MessagePlaylistCreateFromCollection": "Vytvořit seznam skladeb z kolekce",
+ "MessagePodcastHasNoRSSFeedForMatching": "Podcast nemá žádnou adresu URL kanálu RSS, kterou by mohl použít pro porovnávání",
+ "MessageQuickMatchDescription": "Vyplňte prázdné detaily položky a obálku prvním výsledkem shody z '{0}'. Nepřepisuje podrobnosti, pokud není povoleno nastavení serveru \"Preferovat párování metadata\".",
+ "MessageRemoveChapter": "Odstranit kapitolu",
+ "MessageRemoveEpisodes": "Odstranit {0} epizodu",
+ "MessageRemoveFromPlayerQueue": "Odstranit z fronty přehrávače",
+ "MessageRemoveUserWarning": "Opravdu chcete trvale smazat uživatele \"{0}\"?",
+ "MessageReportBugsAndContribute": "Hlásit chyby, žádat o funkce a přispívat",
+ "MessageResetChaptersConfirm": "Opravdu chcete resetovat kapitoly a vrátit zpět provedené změny?",
+ "MessageRestoreBackupConfirm": "Opravdu chcete obnovit zálohu vytvořenou dne?",
+ "MessageRestoreBackupWarning": "Obnovení zálohy přepíše celou databázi umístěnou v /config a obálku obrázků v /metadata/items & /metadata/authors.
Backups nezmění žádné soubory ve složkách knihovny. Pokud jste povolili nastavení serveru pro ukládání obrázků obalu a metadat do složek knihovny, nebudou zálohovány ani přepsány.
Všichni klienti používající váš server budou automaticky obnoveni.",
+ "MessageSearchResultsFor": "Výsledky hledání pro",
+ "MessageSelected": "{0} selected",
+ "MessageServerCouldNotBeReached": "Server je nedostupný",
+ "MessageSetChaptersFromTracksDescription": "Nastavit kapitoly jako kapitolu a název kapitoly jako název zvukového souboru",
+ "MessageStartPlaybackAtTime": "Spustit přehrávání pro \"{0}\" v {1}?",
+ "MessageThinking": "Přemýšlení...",
+ "MessageUploaderItemFailed": "Nahrávání se nezdařilo",
+ "MessageUploaderItemSuccess": "Nahráno bylo úspěšně!",
+ "MessageUploading": "Odesílám...",
+ "MessageValidCronExpression": "Platný výraz cronu",
+ "MessageWatcherIsDisabledGlobally": "Hlídač je globálně zakázán v nastavení serveru",
+ "MessageXLibraryIsEmpty": "{0} knihovna je prázdná!",
+ "MessageYourAudiobookDurationIsLonger": "Doba trvání audioknihy je delší než nalezená délka",
+ "MessageYourAudiobookDurationIsShorter": "Délka audioknihy je kratší, než byla nalezena.",
+ "NoteChangeRootPassword": "Uživatel root je jediný uživatel, který může mít prázdné heslo",
+ "NoteChapterEditorTimes": "Poznámka: Čas začátku první kapitoly musí zůstat v 0:00 a čas začátku poslední kapitoly nesmí překročit tuto dobu trvání audioknihy.",
+ "NoteFolderPicker": "Poznámka: složky, které jsou již namapovány, nebudou zobrazeny",
+ "NoteFolderPickerDebian": "Poznámka: Výběr složek pro instalaci debianu není plně implementován. Cestu ke své knihovně byste měli zadat přímo.",
+ "NoteRSSFeedPodcastAppsHttps": "Upozornění: Většina aplikací pro podcasty bude vyžadovat, aby adresa URL kanálu RSS používala protokol HTTPS",
+ "NoteRSSFeedPodcastAppsPubDate": "Upozornění: 1 nebo více epizod nemá datum vydání. Některé podcastové aplikace to vyžadují.",
+ "NoteUploaderFoldersWithMediaFiles": "Se složkami s multimediálními soubory bude zacházeno jako se samostatnými položkami knihovny.",
+ "NoteUploaderOnlyAudioFiles": "Pokud nahráváte pouze zvukové soubory, bude s každým zvukovým souborem zacházeno jako se samostatnou audioknihou.",
+ "NoteUploaderUnsupportedFiles": "Nepodporované soubory jsou ignorovány. Při výběru nebo přetažení složky jsou ostatní soubory, které nejsou ve složce položek, ignorovány.",
+ "PlaceholderNewCollection": "Nový název kolekce",
+ "PlaceholderNewFolderPath": "Nová cesta ke složce",
+ "PlaceholderNewPlaylist": "Nový název seznamu přehrávání",
+ "PlaceholderSearch": "Hledat..",
+ "PlaceholderSearchEpisode": "Hledat epizodu..",
+ "ToastAccountUpdateFailed": "Aktualizace účtu se nezdařila",
+ "ToastAccountUpdateSuccess": "Účet aktualizován",
+ "ToastAuthorImageRemoveFailed": "Nepodařilo se odstranit obrázek",
+ "ToastAuthorImageRemoveSuccess": "Obrázek autora odstraněn",
+ "ToastAuthorUpdateFailed": "Aktualizace autora se nezdařila",
+ "ToastAuthorUpdateMerged": "Autor sloučen",
+ "ToastAuthorUpdateSuccess": "Autor aktualizován",
+ "ToastAuthorUpdateSuccessNoImageFound": "Autor aktualizován (nebyl nalezen žádný obrázek)",
+ "ToastBackupCreateFailed": "Vytvoření zálohy se nezdařilo",
+ "ToastBackupCreateSuccess": "Záloha vytvořena",
+ "ToastBackupDeleteFailed": "Nepodařilo se smazat zálohu",
+ "ToastBackupDeleteSuccess": "Záloha smazána",
+ "ToastBackupRestoreFailed": "Nepodařilo se obnovit zálohu",
+ "ToastBackupUploadFailed": "Nepodařilo se nahrát zálohu",
+ "ToastBackupUploadSuccess": "Záloha nahrána",
+ "ToastBatchUpdateFailed": "Dávková aktualizace se nezdařila",
+ "ToastBatchUpdateSuccess": "Dávková aktualizace proběhla úspěšně",
+ "ToastBookmarkCreateFailed": "Vytvoření záložky se nezdařilo",
+ "ToastBookmarkCreateSuccess": "Přidána záložka",
+ "ToastBookmarkRemoveFailed": "Nepodařilo se odstranit záložku",
+ "ToastBookmarkRemoveSuccess": "Záložka odstraněna",
+ "ToastBookmarkUpdateFailed": "Aktualizace záložky se nezdařila",
+ "ToastBookmarkUpdateSuccess": "Záložka aktualizována",
+ "ToastChaptersHaveErrors": "Kapitoly obsahují chyby",
+ "ToastChaptersMustHaveTitles": "Kapitoly musí mít názvy",
+ "ToastCollectionItemsRemoveFailed": "Nepodařilo se odstranit položky z kolekce",
+ "ToastCollectionItemsRemoveSuccess": "Položky odstraněny z kolekce",
+ "ToastCollectionRemoveFailed": "Nepodařilo se odstranit kolekci",
+ "ToastCollectionRemoveSuccess": "Kolekce odstraněna",
+ "ToastCollectionUpdateFailed": "Aktualizace kolekce se nezdařila",
+ "ToastCollectionUpdateSuccess": "Kolekce aktualizována",
+ "ToastItemCoverUpdateFailed": "Aktualizace obálky se nezdařila",
+ "ToastItemCoverUpdateSuccess": "Obálka předmětu byl aktualizována",
+ "ToastItemDetailsUpdateFailed": "Nepodařilo se aktualizovat podrobnosti o položce",
+ "ToastItemDetailsUpdateSuccess": "Podrobnosti o položce byly aktualizovány",
+ "ToastItemDetailsUpdateUnneeded": "Podrobnosti o položce nejsou potřeba aktualizovat",
+ "ToastItemMarkedAsFinishedFailed": "Nepodařilo se označit jako dokončené",
+ "ToastItemMarkedAsFinishedSuccess": "Položka označena jako dokončená",
+ "ToastItemMarkedAsNotFinishedFailed": "Nepodařilo se označit jako nedokončené",
+ "ToastItemMarkedAsNotFinishedSuccess": "Položka označena jako nedokončená",
+ "ToastLibraryCreateFailed": "Vytvoření knihovny se nezdařilo",
+ "ToastLibraryCreateSuccess": "Knihovna \"{0}\" vytvořena",
+ "ToastLibraryDeleteFailed": "Nepodařilo se smazat knihovnu",
+ "ToastLibraryDeleteSuccess": "Knihovna smazána",
+ "ToastLibraryScanFailedToStart": "Nepodařilo se spustit kontrolu",
+ "ToastLibraryScanStarted": "Kontrola knihovny spuštěna",
+ "ToastLibraryUpdateFailed": "Aktualizace knihovny se nezdařila",
+ "ToastLibraryUpdateSuccess": "Knihovna \"{0}\" aktualizována",
+ "ToastPlaylistCreateFailed": "Vytvoření seznamu přehrávání se nezdařilo",
+ "ToastPlaylistCreateSuccess": "Seznam přehrávání vytvořen",
+ "ToastPlaylistRemoveFailed": "Nepodařilo se odstranit seznamu přehrávání",
+ "ToastPlaylistRemoveSuccess": "Seznam přehrávání odstraněn",
+ "ToastPlaylistUpdateFailed": "Aktualizace seznamu přehrávání se nezdařila",
+ "ToastPlaylistUpdateSuccess": "Seznam přehrávání aktualizován",
+ "ToastPodcastCreateFailed": "Vytvoření podcastu se nezdařilo",
+ "ToastPodcastCreateSuccess": "Podcast byl úspěšně vytvořen",
+ "ToastRemoveItemFromCollectionFailed": "Nepodařilo se odebrat položku z kolekce",
+ "ToastRemoveItemFromCollectionSuccess": "Položka odstraněna z kolekce",
+ "ToastRSSFeedCloseFailed": "Nepodařilo se zavřít RSS kanál",
+ "ToastRSSFeedCloseSuccess": "RSS kanál uzavřen",
+ "ToastSendEbookToDeviceFailed": "Odeslání e-knihy do zařízení se nezdařilo",
+ "ToastSendEbookToDeviceSuccess": "E-kniha odeslána do zařízení \"{0}\"",
+ "ToastSeriesUpdateFailed": "Aktualizace série se nezdařila",
+ "ToastSeriesUpdateSuccess": "Aktualizace série byla úspěšná",
+ "ToastSessionDeleteFailed": "Nepodařilo se smazat relaci",
+ "ToastSessionDeleteSuccess": "Relace smazána",
+ "ToastSocketConnected": "Socket připojen",
+ "ToastSocketDisconnected": "Socket odpojen",
+ "ToastSocketFailedToConnect": "Socket se nepodařilo připojit",
+ "ToastUserDeleteFailed": "Nepodařilo se smazat uživatele",
+ "ToastUserDeleteSuccess": "Uživatel smazán"
+}
\ No newline at end of file
diff --git a/client/strings/da.json b/client/strings/da.json
new file mode 100644
index 00000000..3dd611d9
--- /dev/null
+++ b/client/strings/da.json
@@ -0,0 +1,753 @@
+{
+ "ButtonAdd": "Tilføj",
+ "ButtonAddChapters": "Tilføj kapitler",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
+ "ButtonAddPodcasts": "Tilføj podcasts",
+ "ButtonAddUser": "Add User",
+ "ButtonAddYourFirstLibrary": "Tilføj din første bibliotek",
+ "ButtonApply": "Anvend",
+ "ButtonApplyChapters": "Anvend kapitler",
+ "ButtonAuthors": "Forfattere",
+ "ButtonBrowseForFolder": "Gennemse mappe",
+ "ButtonCancel": "Annuller",
+ "ButtonCancelEncode": "Annuller kodning",
+ "ButtonChangeRootPassword": "Ændr rodadgangskode",
+ "ButtonCheckAndDownloadNewEpisodes": "Tjek og download nye episoder",
+ "ButtonChooseAFolder": "Vælg en mappe",
+ "ButtonChooseFiles": "Vælg filer",
+ "ButtonClearFilter": "Ryd filter",
+ "ButtonCloseFeed": "Luk feed",
+ "ButtonCollections": "Samlinger",
+ "ButtonConfigureScanner": "Konfigurer scanner",
+ "ButtonCreate": "Opret",
+ "ButtonCreateBackup": "Opret sikkerhedskopi",
+ "ButtonDelete": "Slet",
+ "ButtonDownloadQueue": "Kø",
+ "ButtonEdit": "Rediger",
+ "ButtonEditChapters": "Rediger kapitler",
+ "ButtonEditPodcast": "Rediger podcast",
+ "ButtonForceReScan": "Tvungen genindlæsning",
+ "ButtonFullPath": "Fuld sti",
+ "ButtonHide": "Skjul",
+ "ButtonHome": "Hjem",
+ "ButtonIssues": "Problemer",
+ "ButtonLatest": "Seneste",
+ "ButtonLibrary": "Bibliotek",
+ "ButtonLogout": "Log ud",
+ "ButtonLookup": "Slå op",
+ "ButtonManageTracks": "Administrer spor",
+ "ButtonMapChapterTitles": "Kortlæg kapiteloverskrifter",
+ "ButtonMatchAllAuthors": "Match alle forfattere",
+ "ButtonMatchBooks": "Match bøger",
+ "ButtonNevermind": "Glem det",
+ "ButtonOk": "OK",
+ "ButtonOpenFeed": "Åbn feed",
+ "ButtonOpenManager": "Åbn manager",
+ "ButtonPlay": "Afspil",
+ "ButtonPlaying": "Afspiller",
+ "ButtonPlaylists": "Afspilningslister",
+ "ButtonPurgeAllCache": "Ryd al cache",
+ "ButtonPurgeItemsCache": "Ryd elementcache",
+ "ButtonPurgeMediaProgress": "Ryd Medieforløb",
+ "ButtonQueueAddItem": "Tilføj til kø",
+ "ButtonQueueRemoveItem": "Fjern fra kø",
+ "ButtonQuickMatch": "Hurtig Match",
+ "ButtonRead": "Læs",
+ "ButtonRemove": "Fjern",
+ "ButtonRemoveAll": "Fjern Alle",
+ "ButtonRemoveAllLibraryItems": "Fjern Alle Bibliotekselementer",
+ "ButtonRemoveFromContinueListening": "Fjern fra Fortsæt Lytning",
+ "ButtonRemoveFromContinueReading": "Fjern fra Fortsæt Læsning",
+ "ButtonRemoveSeriesFromContinueSeries": "Fjern Serie fra Fortsæt Serie",
+ "ButtonReScan": "Gen-scan",
+ "ButtonReset": "Nulstil",
+ "ButtonResetToDefault": "Reset to default",
+ "ButtonRestore": "Gendan",
+ "ButtonSave": "Gem",
+ "ButtonSaveAndClose": "Gem & Luk",
+ "ButtonSaveTracklist": "Gem Sporliste",
+ "ButtonScan": "Scan",
+ "ButtonScanLibrary": "Scan Bibliotek",
+ "ButtonSearch": "Søg",
+ "ButtonSelectFolderPath": "Vælg Mappen Sti",
+ "ButtonSeries": "Serie",
+ "ButtonSetChaptersFromTracks": "Sæt kapitler fra spor",
+ "ButtonShiftTimes": "Skift Tider",
+ "ButtonShow": "Vis",
+ "ButtonStartM4BEncode": "Start M4B Kode",
+ "ButtonStartMetadataEmbed": "Start Metadata Indlejring",
+ "ButtonSubmit": "Send",
+ "ButtonTest": "Test",
+ "ButtonUpload": "Upload",
+ "ButtonUploadBackup": "Upload Backup",
+ "ButtonUploadCover": "Upload Omslag",
+ "ButtonUploadOPMLFile": "Upload OPML Fil",
+ "ButtonUserDelete": "Slet bruger {0}",
+ "ButtonUserEdit": "Rediger bruger {0}",
+ "ButtonViewAll": "Vis Alle",
+ "ButtonYes": "Ja",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
+ "HeaderAccount": "Konto",
+ "HeaderAdvanced": "Avanceret",
+ "HeaderAppriseNotificationSettings": "Apprise Notifikationsindstillinger",
+ "HeaderAudiobookTools": "Audiobog Filhåndteringsværktøjer",
+ "HeaderAudioTracks": "Lydspor",
+ "HeaderAuthentication": "Authentication",
+ "HeaderBackups": "Sikkerhedskopier",
+ "HeaderChangePassword": "Skift Adgangskode",
+ "HeaderChapters": "Kapitler",
+ "HeaderChooseAFolder": "Vælg en Mappe",
+ "HeaderCollection": "Samling",
+ "HeaderCollectionItems": "Samlingselementer",
+ "HeaderCover": "Omslag",
+ "HeaderCurrentDownloads": "Nuværende Downloads",
+ "HeaderDetails": "Detaljer",
+ "HeaderDownloadQueue": "Download Kø",
+ "HeaderEbookFiles": "E-bogsfiler",
+ "HeaderEmail": "Email",
+ "HeaderEmailSettings": "Email Indstillinger",
+ "HeaderEpisodes": "Episoder",
+ "HeaderEreaderDevices": "E-læser Enheder",
+ "HeaderEreaderSettings": "E-læser Indstillinger",
+ "HeaderFiles": "Filer",
+ "HeaderFindChapters": "Find Kapitler",
+ "HeaderIgnoredFiles": "Ignorerede Filer",
+ "HeaderItemFiles": "Emnefiler",
+ "HeaderItemMetadataUtils": "Emne Metadata Værktøjer",
+ "HeaderLastListeningSession": "Seneste Lyttesession",
+ "HeaderLatestEpisodes": "Seneste episoder",
+ "HeaderLibraries": "Biblioteker",
+ "HeaderLibraryFiles": "Biblioteksfiler",
+ "HeaderLibraryStats": "Biblioteksstatistik",
+ "HeaderListeningSessions": "Lyttesessioner",
+ "HeaderListeningStats": "Lyttestatistik",
+ "HeaderLogin": "Log ind",
+ "HeaderLogs": "Logs",
+ "HeaderManageGenres": "Administrer Genrer",
+ "HeaderManageTags": "Administrer Tags",
+ "HeaderMapDetails": "Kort Detaljer",
+ "HeaderMatch": "Match",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
+ "HeaderMetadataToEmbed": "Metadata til indlejring",
+ "HeaderNewAccount": "Ny Konto",
+ "HeaderNewLibrary": "Nyt Bibliotek",
+ "HeaderNotifications": "Meddelelser",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
+ "HeaderOpenRSSFeed": "Åbn RSS Feed",
+ "HeaderOtherFiles": "Andre Filer",
+ "HeaderPasswordAuthentication": "Password Authentication",
+ "HeaderPermissions": "Tilladelser",
+ "HeaderPlayerQueue": "Afspilningskø",
+ "HeaderPlaylist": "Afspilningsliste",
+ "HeaderPlaylistItems": "Afspilningsliste Elementer",
+ "HeaderPodcastsToAdd": "Podcasts til Tilføjelse",
+ "HeaderPreviewCover": "Forhåndsvis Omslag",
+ "HeaderRemoveEpisode": "Fjern Episode",
+ "HeaderRemoveEpisodes": "Fjern {0} Episoder",
+ "HeaderRSSFeedGeneral": "RSS Detaljer",
+ "HeaderRSSFeedIsOpen": "RSS Feed er Åben",
+ "HeaderRSSFeeds": "RSS Feeds",
+ "HeaderSavedMediaProgress": "Gemt Medieforløb",
+ "HeaderSchedule": "Planlæg",
+ "HeaderScheduleLibraryScans": "Planlæg Automatiske Biblioteksscanninger",
+ "HeaderSession": "Session",
+ "HeaderSetBackupSchedule": "Indstil Sikkerhedskopieringsplan",
+ "HeaderSettings": "Indstillinger",
+ "HeaderSettingsDisplay": "Skærm",
+ "HeaderSettingsExperimental": "Eksperimentelle Funktioner",
+ "HeaderSettingsGeneral": "Generelt",
+ "HeaderSettingsScanner": "Scanner",
+ "HeaderSleepTimer": "Søvntimer",
+ "HeaderStatsLargestItems": "Største Elementer",
+ "HeaderStatsLongestItems": "Længste Elementer (timer)",
+ "HeaderStatsMinutesListeningChart": "Minutter Lyttet (sidste 7 dage)",
+ "HeaderStatsRecentSessions": "Seneste Sessions",
+ "HeaderStatsTop10Authors": "Top 10 Forfattere",
+ "HeaderStatsTop5Genres": "Top 5 Genrer",
+ "HeaderTableOfContents": "Indholdsfortegnelse",
+ "HeaderTools": "Værktøjer",
+ "HeaderUpdateAccount": "Opdater Konto",
+ "HeaderUpdateAuthor": "Opdater Forfatter",
+ "HeaderUpdateDetails": "Opdater Detaljer",
+ "HeaderUpdateLibrary": "Opdater Bibliotek",
+ "HeaderUsers": "Brugere",
+ "HeaderYourStats": "Dine Statistikker",
+ "LabelAbridged": "Abridged",
+ "LabelAccountType": "Kontotype",
+ "LabelAccountTypeAdmin": "Administrator",
+ "LabelAccountTypeGuest": "Gæst",
+ "LabelAccountTypeUser": "Bruger",
+ "LabelActivity": "Aktivitet",
+ "LabelAdded": "Tilføjet",
+ "LabelAddedAt": "Tilføjet Kl.",
+ "LabelAddToCollection": "Tilføj til Samling",
+ "LabelAddToCollectionBatch": "Tilføj {0} Bøger til Samling",
+ "LabelAddToPlaylist": "Tilføj til Afspilningsliste",
+ "LabelAddToPlaylistBatch": "Tilføj {0} Elementer til Afspilningsliste",
+ "LabelAdminUsersOnly": "Admin users only",
+ "LabelAll": "Alle",
+ "LabelAllUsers": "Alle Brugere",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
+ "LabelAlreadyInYourLibrary": "Allerede i dit bibliotek",
+ "LabelAppend": "Tilføj",
+ "LabelAuthor": "Forfatter",
+ "LabelAuthorFirstLast": "Forfatter (Fornavn Efternavn)",
+ "LabelAuthorLastFirst": "Forfatter (Efternavn, Fornavn)",
+ "LabelAuthors": "Forfattere",
+ "LabelAutoDownloadEpisodes": "Auto Download Episoder",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
+ "LabelBackToUser": "Tilbage til Bruger",
+ "LabelBackupLocation": "Backup Placering",
+ "LabelBackupsEnableAutomaticBackups": "Aktivér automatisk sikkerhedskopiering",
+ "LabelBackupsEnableAutomaticBackupsHelp": "Sikkerhedskopier gemt i /metadata/backups",
+ "LabelBackupsMaxBackupSize": "Maksimal sikkerhedskopistørrelse (i GB)",
+ "LabelBackupsMaxBackupSizeHelp": "Som en beskyttelse mod fejlkonfiguration fejler sikkerhedskopier, hvis de overstiger den konfigurerede størrelse.",
+ "LabelBackupsNumberToKeep": "Antal sikkerhedskopier at beholde",
+ "LabelBackupsNumberToKeepHelp": "Kun 1 sikkerhedskopi fjernes ad gangen, så hvis du allerede har flere sikkerhedskopier end dette, skal du fjerne dem manuelt.",
+ "LabelBitrate": "Bitrate",
+ "LabelBooks": "Bøger",
+ "LabelButtonText": "Button Text",
+ "LabelChangePassword": "Ændre Adgangskode",
+ "LabelChannels": "Kanaler",
+ "LabelChapters": "Kapitler",
+ "LabelChaptersFound": "fundne kapitler",
+ "LabelChapterTitle": "Kapitel Titel",
+ "LabelClickForMoreInfo": "Click for more info",
+ "LabelClosePlayer": "Luk afspiller",
+ "LabelCodec": "Codec",
+ "LabelCollapseSeries": "Fold Serie Sammen",
+ "LabelCollection": "Samling",
+ "LabelCollections": "Samlinger",
+ "LabelComplete": "Fuldfør",
+ "LabelConfirmPassword": "Bekræft Adgangskode",
+ "LabelContinueListening": "Fortsæt Lytning",
+ "LabelContinueReading": "Fortsæt Læsning",
+ "LabelContinueSeries": "Fortsæt Serie",
+ "LabelCover": "Omslag",
+ "LabelCoverImageURL": "Omslagsbillede URL",
+ "LabelCreatedAt": "Oprettet Kl.",
+ "LabelCronExpression": "Cron Udtryk",
+ "LabelCurrent": "Aktuel",
+ "LabelCurrently": "Aktuelt:",
+ "LabelCustomCronExpression": "Brugerdefineret Cron Udtryk:",
+ "LabelDatetime": "Dato og Tid",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
+ "LabelDescription": "Beskrivelse",
+ "LabelDeselectAll": "Fravælg Alle",
+ "LabelDevice": "Enheds",
+ "LabelDeviceInfo": "Enhedsinformation",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
+ "LabelDirectory": "Mappe",
+ "LabelDiscFromFilename": "Disk fra Filnavn",
+ "LabelDiscFromMetadata": "Disk fra Metadata",
+ "LabelDiscover": "Opdag",
+ "LabelDownload": "Download",
+ "LabelDownloadNEpisodes": "Download {0} episoder",
+ "LabelDuration": "Varighed",
+ "LabelDurationFound": "Fundet varighed:",
+ "LabelEbook": "E-bog",
+ "LabelEbooks": "E-bøger",
+ "LabelEdit": "Rediger",
+ "LabelEmail": "Email",
+ "LabelEmailSettingsFromAddress": "Fra Adresse",
+ "LabelEmailSettingsSecure": "Sikker",
+ "LabelEmailSettingsSecureHelp": "Hvis sandt, vil forbindelsen bruge TLS ved tilslutning til serveren. Hvis falsk, bruges TLS, hvis serveren understøtter STARTTLS-udvidelsen. I de fleste tilfælde skal denne værdi sættes til sandt, hvis du tilslutter til port 465. Til port 587 eller 25 skal du holde det falsk. (fra nodemailer.com/smtp/#authentication)",
+ "LabelEmailSettingsTestAddress": "Test Adresse",
+ "LabelEmbeddedCover": "Indlejret Omslag",
+ "LabelEnable": "Aktivér",
+ "LabelEnd": "Slut",
+ "LabelEpisode": "Episode",
+ "LabelEpisodeTitle": "Episodetitel",
+ "LabelEpisodeType": "Episodetype",
+ "LabelExample": "Eksempel",
+ "LabelExplicit": "Eksplisit",
+ "LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
+ "LabelFile": "Fil",
+ "LabelFileBirthtime": "Fødselstidspunkt for fil",
+ "LabelFileModified": "Fil ændret",
+ "LabelFilename": "Filnavn",
+ "LabelFilterByUser": "Filtrér efter bruger",
+ "LabelFindEpisodes": "Find episoder",
+ "LabelFinished": "Færdig",
+ "LabelFolder": "Mappe",
+ "LabelFolders": "Mapper",
+ "LabelFontFamily": "Fontfamilie",
+ "LabelFontScale": "Skriftstørrelse",
+ "LabelFormat": "Format",
+ "LabelGenre": "Genre",
+ "LabelGenres": "Genrer",
+ "LabelHardDeleteFile": "Permanent slet fil",
+ "LabelHasEbook": "Har e-bog",
+ "LabelHasSupplementaryEbook": "Har supplerende e-bog",
+ "LabelHighestPriority": "Highest priority",
+ "LabelHost": "Vært",
+ "LabelHour": "Time",
+ "LabelIcon": "Ikon",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
+ "LabelIncludeInTracklist": "Inkluder i afspilningsliste",
+ "LabelIncomplete": "Ufuldstændig",
+ "LabelInProgress": "I gang",
+ "LabelInterval": "Interval",
+ "LabelIntervalCustomDailyWeekly": "Tilpasset dagligt/ugentligt",
+ "LabelIntervalEvery12Hours": "Hver 12. time",
+ "LabelIntervalEvery15Minutes": "Hver 15. minut",
+ "LabelIntervalEvery2Hours": "Hver 2. time",
+ "LabelIntervalEvery30Minutes": "Hver 30. minut",
+ "LabelIntervalEvery6Hours": "Hver 6. time",
+ "LabelIntervalEveryDay": "Hver dag",
+ "LabelIntervalEveryHour": "Hver time",
+ "LabelInvalidParts": "Ugyldige dele",
+ "LabelInvert": "Inverter",
+ "LabelItem": "Element",
+ "LabelLanguage": "Sprog",
+ "LabelLanguageDefaultServer": "Standard server sprog",
+ "LabelLastBookAdded": "Senest tilføjede bog",
+ "LabelLastBookUpdated": "Senest opdaterede bog",
+ "LabelLastSeen": "Sidst set",
+ "LabelLastTime": "Sidste gang",
+ "LabelLastUpdate": "Seneste opdatering",
+ "LabelLayout": "Layout",
+ "LabelLayoutSinglePage": "Enkeltside",
+ "LabelLayoutSplitPage": "Opdelt side",
+ "LabelLess": "Mindre",
+ "LabelLibrariesAccessibleToUser": "Biblioteker tilgængelige for bruger",
+ "LabelLibrary": "Bibliotek",
+ "LabelLibraryItem": "Bibliotekselement",
+ "LabelLibraryName": "Biblioteksnavn",
+ "LabelLimit": "Grænse",
+ "LabelLineSpacing": "Linjeafstand",
+ "LabelListenAgain": "Lyt igen",
+ "LabelLogLevelDebug": "Fejlsøgning",
+ "LabelLogLevelInfo": "Information",
+ "LabelLogLevelWarn": "Advarsel",
+ "LabelLookForNewEpisodesAfterDate": "Søg efter nye episoder efter denne dato",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
+ "LabelMediaPlayer": "Medieafspiller",
+ "LabelMediaType": "Medietype",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
+ "LabelMetadataProvider": "Metadataudbyder",
+ "LabelMetaTag": "Meta-tag",
+ "LabelMetaTags": "Meta-tags",
+ "LabelMinute": "Minut",
+ "LabelMissing": "Mangler",
+ "LabelMissingParts": "Manglende dele",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
+ "LabelMore": "Mere",
+ "LabelMoreInfo": "Mere info",
+ "LabelName": "Navn",
+ "LabelNarrator": "Fortæller",
+ "LabelNarrators": "Fortællere",
+ "LabelNew": "Ny",
+ "LabelNewestAuthors": "Nyeste forfattere",
+ "LabelNewestEpisodes": "Nyeste episoder",
+ "LabelNewPassword": "Nyt kodeord",
+ "LabelNextBackupDate": "Næste sikkerhedskopi dato",
+ "LabelNextScheduledRun": "Næste planlagte kørsel",
+ "LabelNoEpisodesSelected": "Ingen episoder valgt",
+ "LabelNotes": "Noter",
+ "LabelNotFinished": "Ikke færdig",
+ "LabelNotificationAppriseURL": "Apprise URL'er",
+ "LabelNotificationAvailableVariables": "Tilgængelige variabler",
+ "LabelNotificationBodyTemplate": "Kropsskabelon",
+ "LabelNotificationEvent": "Meddelelseshændelse",
+ "LabelNotificationsMaxFailedAttempts": "Maksimalt antal mislykkede forsøg",
+ "LabelNotificationsMaxFailedAttemptsHelp": "Meddelelser deaktiveres, når de mislykkes med at sende så mange gange",
+ "LabelNotificationsMaxQueueSize": "Maksimal køstørrelse for meddelelseshændelser",
+ "LabelNotificationsMaxQueueSizeHelp": "Hændelser begrænses til at udløse en gang pr. sekund. Hændelser ignoreres, hvis køen er fyldt. Dette forhindrer meddelelsesspam.",
+ "LabelNotificationTitleTemplate": "Titelskabelon",
+ "LabelNotStarted": "Ikke påbegyndt",
+ "LabelNumberOfBooks": "Antal bøger",
+ "LabelNumberOfEpisodes": "Antal episoder",
+ "LabelOpenRSSFeed": "Åbn RSS-feed",
+ "LabelOverwrite": "Overskriv",
+ "LabelPassword": "Kodeord",
+ "LabelPath": "Sti",
+ "LabelPermissionsAccessAllLibraries": "Kan få adgang til alle biblioteker",
+ "LabelPermissionsAccessAllTags": "Kan få adgang til alle tags",
+ "LabelPermissionsAccessExplicitContent": "Kan få adgang til eksplicit indhold",
+ "LabelPermissionsDelete": "Kan slette",
+ "LabelPermissionsDownload": "Kan downloade",
+ "LabelPermissionsUpdate": "Kan opdatere",
+ "LabelPermissionsUpload": "Kan uploade",
+ "LabelPhotoPathURL": "Foto sti/URL",
+ "LabelPlaylists": "Afspilningslister",
+ "LabelPlayMethod": "Afspilningsmetode",
+ "LabelPodcast": "Podcast",
+ "LabelPodcasts": "Podcasts",
+ "LabelPodcastType": "Podcast type",
+ "LabelPort": "Port",
+ "LabelPrefixesToIgnore": "Præfikser der skal ignoreres (skal ikke skelne mellem store og små bogstaver)",
+ "LabelPreventIndexing": "Forhindrer, at dit feed bliver indekseret af iTunes og Google podcastkataloger",
+ "LabelPrimaryEbook": "Primær e-bog",
+ "LabelProgress": "Fremskridt",
+ "LabelProvider": "Udbyder",
+ "LabelPubDate": "Udgivelsesdato",
+ "LabelPublisher": "Forlag",
+ "LabelPublishYear": "Udgivelsesår",
+ "LabelRead": "Læst",
+ "LabelReadAgain": "Læs igen",
+ "LabelReadEbookWithoutProgress": "Læs e-bog uden at følge fremskridt",
+ "LabelRecentlyAdded": "Senest tilføjet",
+ "LabelRecentSeries": "Seneste serie",
+ "LabelRecommended": "Anbefalet",
+ "LabelRegion": "Region",
+ "LabelReleaseDate": "Udgivelsesdato",
+ "LabelRemoveCover": "Fjern omslag",
+ "LabelRowsPerPage": "Rows per page",
+ "LabelRSSFeedCustomOwnerEmail": "Brugerdefineret ejerens e-mail",
+ "LabelRSSFeedCustomOwnerName": "Brugerdefineret ejerens navn",
+ "LabelRSSFeedOpen": "Åben RSS-feed",
+ "LabelRSSFeedPreventIndexing": "Forhindrer indeksering",
+ "LabelRSSFeedSlug": "RSS-feed-slug",
+ "LabelRSSFeedURL": "RSS-feed-URL",
+ "LabelSearchTerm": "Søgeterm",
+ "LabelSearchTitle": "Søg efter titel",
+ "LabelSearchTitleOrASIN": "Søg efter titel eller ASIN",
+ "LabelSeason": "Sæson",
+ "LabelSelectAllEpisodes": "Vælg alle episoder",
+ "LabelSelectEpisodesShowing": "Vælg {0} episoder vist",
+ "LabelSelectUsers": "Select users",
+ "LabelSendEbookToDevice": "Send e-bog til...",
+ "LabelSequence": "Sekvens",
+ "LabelSeries": "Serie",
+ "LabelSeriesName": "Serienavn",
+ "LabelSeriesProgress": "Seriefremskridt",
+ "LabelSetEbookAsPrimary": "Indstil som primær",
+ "LabelSetEbookAsSupplementary": "Indstil som supplerende",
+ "LabelSettingsAudiobooksOnly": "Kun lydbøger",
+ "LabelSettingsAudiobooksOnlyHelp": "Aktivering af denne indstilling vil ignorere e-bogsfiler, medmindre de er inde i en lydbogmappe, hvor de vil blive indstillet som supplerende e-bøger",
+ "LabelSettingsBookshelfViewHelp": "Skeumorfisk design med træhylder",
+ "LabelSettingsChromecastSupport": "Chromecast-understøttelse",
+ "LabelSettingsDateFormat": "Datoformat",
+ "LabelSettingsDisableWatcher": "Deaktiver overvågning",
+ "LabelSettingsDisableWatcherForLibrary": "Deaktiver mappeovervågning for bibliotek",
+ "LabelSettingsDisableWatcherHelp": "Deaktiverer automatisk tilføjelse/opdatering af elementer, når der registreres filændringer. *Kræver servergenstart",
+ "LabelSettingsEnableWatcher": "Aktiver overvågning",
+ "LabelSettingsEnableWatcherForLibrary": "Aktiver mappeovervågning for bibliotek",
+ "LabelSettingsEnableWatcherHelp": "Aktiverer automatisk tilføjelse/opdatering af elementer, når filændringer registreres. *Kræver servergenstart",
+ "LabelSettingsExperimentalFeatures": "Eksperimentelle funktioner",
+ "LabelSettingsExperimentalFeaturesHelp": "Funktioner under udvikling, der kunne bruge din feedback og hjælp til test. Klik for at åbne Github-diskussionen.",
+ "LabelSettingsFindCovers": "Find omslag",
+ "LabelSettingsFindCoversHelp": "Hvis din lydbog ikke har et indlejret omslag eller et omslagsbillede i mappen, vil skanneren forsøge at finde et omslag.
Bemærk: Dette vil forlænge scanntiden",
+ "LabelSettingsHideSingleBookSeries": "Skjul enkeltbogsserier",
+ "LabelSettingsHideSingleBookSeriesHelp": "Serier med en enkelt bog vil blive skjult fra serie-siden og hjemmesidehylder.",
+ "LabelSettingsHomePageBookshelfView": "Brug bogreolvisning på startside",
+ "LabelSettingsLibraryBookshelfView": "Brug bogreolvisning i biblioteket",
+ "LabelSettingsParseSubtitles": "Fortolk undertekster",
+ "LabelSettingsParseSubtitlesHelp": "Udtræk undertekster fra lydbogsmappenavne.
Undertitler skal adskilles af \" - \"
f.eks. \"Bogtitel - En undertitel her\" har undertitlen \"En undertitel her\"",
+ "LabelSettingsPreferMatchedMetadata": "Foretræk matchede metadata",
+ "LabelSettingsPreferMatchedMetadataHelp": "Matchede data vil tilsidesætte elementdetaljer ved brug af Hurtig Match. Som standard udfylder Hurtig Match kun manglende detaljer.",
+ "LabelSettingsSkipMatchingBooksWithASIN": "Spring over matchende bøger, der allerede har en ASIN",
+ "LabelSettingsSkipMatchingBooksWithISBN": "Spring over matchende bøger, der allerede har en ISBN",
+ "LabelSettingsSortingIgnorePrefixes": "Ignorer præfikser ved sortering",
+ "LabelSettingsSortingIgnorePrefixesHelp": "f.eks. for præfikset \"the\" vil bogtitlen \"The Book Title\" blive sorteret som \"Book Title, The\"",
+ "LabelSettingsSquareBookCovers": "Brug kvadratiske bogomslag",
+ "LabelSettingsSquareBookCoversHelp": "Foretræk at bruge kvadratiske omslag frem for standard 1,6:1 bogomslag",
+ "LabelSettingsStoreCoversWithItem": "Gem omslag med element",
+ "LabelSettingsStoreCoversWithItemHelp": "Som standard gemmes omslag i /metadata/items, aktivering af denne indstilling vil gemme omslag i mappen for dit bibliotekselement. Kun én fil med navnet \"cover\" vil blive bevaret",
+ "LabelSettingsStoreMetadataWithItem": "Gem metadata med element",
+ "LabelSettingsStoreMetadataWithItemHelp": "Som standard gemmes metadatafiler i /metadata/items, aktivering af denne indstilling vil gemme metadatafiler i dine bibliotekselementmapper",
+ "LabelSettingsTimeFormat": "Tidsformat",
+ "LabelShowAll": "Vis alle",
+ "LabelSize": "Størrelse",
+ "LabelSleepTimer": "Søvntimer",
+ "LabelSlug": "Slug",
+ "LabelStart": "Start",
+ "LabelStarted": "Startet",
+ "LabelStartedAt": "Startet klokken",
+ "LabelStartTime": "Starttid",
+ "LabelStatsAudioTracks": "Lydspor",
+ "LabelStatsAuthors": "Forfattere",
+ "LabelStatsBestDay": "Bedste dag",
+ "LabelStatsDailyAverage": "Daglig gennemsnit",
+ "LabelStatsDays": "Dage",
+ "LabelStatsDaysListened": "Dage hørt",
+ "LabelStatsHours": "Timer",
+ "LabelStatsInARow": "i træk",
+ "LabelStatsItemsFinished": "Elementer færdige",
+ "LabelStatsItemsInLibrary": "Elementer i biblioteket",
+ "LabelStatsMinutes": "minutter",
+ "LabelStatsMinutesListening": "Minutter hørt",
+ "LabelStatsOverallDays": "Samlede dage",
+ "LabelStatsOverallHours": "Samlede timer",
+ "LabelStatsWeekListening": "Ugens lytning",
+ "LabelSubtitle": "Undertekst",
+ "LabelSupportedFileTypes": "Understøttede filtyper",
+ "LabelTag": "Mærke",
+ "LabelTags": "Mærker",
+ "LabelTagsAccessibleToUser": "Mærker tilgængelige for bruger",
+ "LabelTagsNotAccessibleToUser": "Mærker ikke tilgængelige for bruger",
+ "LabelTasks": "Kører opgaver",
+ "LabelTheme": "Tema",
+ "LabelThemeDark": "Mørk",
+ "LabelThemeLight": "Lys",
+ "LabelTimeBase": "Tidsbase",
+ "LabelTimeListened": "Tid hørt",
+ "LabelTimeListenedToday": "Tid hørt i dag",
+ "LabelTimeRemaining": "{0} tilbage",
+ "LabelTimeToShift": "Tid til skift i sekunder",
+ "LabelTitle": "Titel",
+ "LabelToolsEmbedMetadata": "Indlejre metadata",
+ "LabelToolsEmbedMetadataDescription": "Indlejr metadata i lydfiler, inklusive omslag og kapitler.",
+ "LabelToolsMakeM4b": "Lav M4B lydbogsfil",
+ "LabelToolsMakeM4bDescription": "Generer en .M4B lydbogsfil med indlejret metadata, omslag og kapitler.",
+ "LabelToolsSplitM4b": "Opdel M4B til MP3'er",
+ "LabelToolsSplitM4bDescription": "Opret MP3'er fra en M4B opdelt efter kapitler med indlejret metadata, omslag og kapitler.",
+ "LabelTotalDuration": "Samlet varighed",
+ "LabelTotalTimeListened": "Samlet lyttetid",
+ "LabelTrackFromFilename": "Spor fra filnavn",
+ "LabelTrackFromMetadata": "Spor fra metadata",
+ "LabelTracks": "Spor",
+ "LabelTracksMultiTrack": "Flerspors",
+ "LabelTracksNone": "Ingen spor",
+ "LabelTracksSingleTrack": "Enkeltspors",
+ "LabelType": "Type",
+ "LabelUnabridged": "Uforkortet",
+ "LabelUnknown": "Ukendt",
+ "LabelUpdateCover": "Opdater omslag",
+ "LabelUpdateCoverHelp": "Tillad overskrivning af eksisterende omslag for de valgte bøger, når der findes en match",
+ "LabelUpdatedAt": "Opdateret ved",
+ "LabelUpdateDetails": "Opdater detaljer",
+ "LabelUpdateDetailsHelp": "Tillad overskrivning af eksisterende detaljer for de valgte bøger, når der findes en match",
+ "LabelUploaderDragAndDrop": "Træk og slip filer eller mapper",
+ "LabelUploaderDropFiles": "Smid filer",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
+ "LabelUseChapterTrack": "Brug kapitel-spor",
+ "LabelUseFullTrack": "Brug fuldt spor",
+ "LabelUser": "Bruger",
+ "LabelUsername": "Brugernavn",
+ "LabelValue": "Værdi",
+ "LabelVersion": "Version",
+ "LabelViewBookmarks": "Se bogmærker",
+ "LabelViewChapters": "Se kapitler",
+ "LabelViewQueue": "Se afspilningskø",
+ "LabelVolume": "Volumen",
+ "LabelWeekdaysToRun": "Ugedage til kørsel",
+ "LabelYourAudiobookDuration": "Din lydbogsvarighed",
+ "LabelYourBookmarks": "Dine bogmærker",
+ "LabelYourPlaylists": "Dine spillelister",
+ "LabelYourProgress": "Din fremgang",
+ "MessageAddToPlayerQueue": "Tilføj til afspilningskø",
+ "MessageAppriseDescription": "For at bruge denne funktion skal du have en instans af
Apprise API kørende eller en API, der håndterer de samme anmodninger.
Apprise API-webadressen skal være den fulde URL-sti for at sende underretningen, f.eks. hvis din API-instans er tilgængelig på
http://192.168.1.1:8337
, så skal du bruge
http://192.168.1.1:8337/notify
.",
+ "MessageBackupsDescription": "Backups inkluderer brugere, brugerfremskridt, biblioteksvareoplysninger, serverindstillinger og billeder gemt i
/metadata/items
og
/metadata/authors
. Backups inkluderer
ikke nogen filer gemt i dine biblioteksmapper.",
+ "MessageBatchQuickMatchDescription": "Quick Match vil forsøge at tilføje manglende omslag og metadata til de valgte elementer. Aktivér indstillingerne nedenfor for at tillade Quick Match at overskrive eksisterende omslag og/eller metadata.",
+ "MessageBookshelfNoCollections": "Du har ikke oprettet nogen samlinger endnu",
+ "MessageBookshelfNoResultsForFilter": "Ingen resultater for filter \"{0}: {1}\"",
+ "MessageBookshelfNoRSSFeeds": "Ingen RSS-feeds er åbne",
+ "MessageBookshelfNoSeries": "Du har ingen serier",
+ "MessageChapterEndIsAfter": "Kapitelslutningen er efter slutningen af din lydbog",
+ "MessageChapterErrorFirstNotZero": "Første kapitel skal starte ved 0",
+ "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",
+ "MessageChapterStartIsAfter": "Kapitelstarten er efter slutningen af din lydbog",
+ "MessageCheckingCron": "Tjekker cron...",
+ "MessageConfirmCloseFeed": "Er du sikker på, at du vil lukke dette feed?",
+ "MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?",
+ "MessageConfirmDeleteFile": "Dette vil slette filen fra dit filsystem. Er du sikker?",
+ "MessageConfirmDeleteLibrary": "Er du sikker på, at du vil slette biblioteket permanent \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteSession": "Er du sikker på, at du vil slette denne session?",
+ "MessageConfirmForceReScan": "Er du sikker på, at du vil tvinge en genindlæsning?",
+ "MessageConfirmMarkAllEpisodesFinished": "Er du sikker på, at du vil markere alle episoder som afsluttet?",
+ "MessageConfirmMarkAllEpisodesNotFinished": "Er du sikker på, at du vil markere alle episoder som ikke afsluttet?",
+ "MessageConfirmMarkSeriesFinished": "Er du sikker på, at du vil markere alle bøger i denne serie som afsluttet?",
+ "MessageConfirmMarkSeriesNotFinished": "Er du sikker på, at du vil markere alle bøger i denne serie som ikke afsluttet?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
+ "MessageConfirmRemoveAllChapters": "Er du sikker på, at du vil fjerne alle kapitler?",
+ "MessageConfirmRemoveAuthor": "Er du sikker på, at du vil fjerne forfatteren \"{0}\"?",
+ "MessageConfirmRemoveCollection": "Er du sikker på, at du vil fjerne samlingen \"{0}\"?",
+ "MessageConfirmRemoveEpisode": "Er du sikker på, at du vil fjerne episoden \"{0}\"?",
+ "MessageConfirmRemoveEpisodes": "Er du sikker på, at du vil fjerne {0} episoder?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
+ "MessageConfirmRemoveNarrator": "Er du sikker på, at du vil fjerne fortælleren \"{0}\"?",
+ "MessageConfirmRemovePlaylist": "Er du sikker på, at du vil fjerne din spilleliste \"{0}\"?",
+ "MessageConfirmRenameGenre": "Er du sikker på, at du vil omdøbe genre \"{0}\" til \"{1}\" for alle elementer?",
+ "MessageConfirmRenameGenreMergeNote": "Bemærk: Denne genre findes allerede, så de vil blive fusioneret.",
+ "MessageConfirmRenameGenreWarning": "Advarsel! En lignende genre med en anden skrivemåde eksisterer allerede \"{0}\".",
+ "MessageConfirmRenameTag": "Er du sikker på, at du vil omdøbe tag \"{0}\" til \"{1}\" for alle elementer?",
+ "MessageConfirmRenameTagMergeNote": "Bemærk: Dette tag findes allerede, så de vil blive fusioneret.",
+ "MessageConfirmRenameTagWarning": "Advarsel! Et lignende tag med en anden skrivemåde eksisterer allerede \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
+ "MessageConfirmSendEbookToDevice": "Er du sikker på, at du vil sende {0} e-bog \"{1}\" til enhed \"{2}\"?",
+ "MessageDownloadingEpisode": "Downloader episode",
+ "MessageDragFilesIntoTrackOrder": "Træk filer ind i korrekt spororden",
+ "MessageEmbedFinished": "Indlejring færdig!",
+ "MessageEpisodesQueuedForDownload": "{0} episoder er sat i kø til download",
+ "MessageFeedURLWillBe": "Feed-URL vil være {0}",
+ "MessageFetching": "Henter...",
+ "MessageForceReScanDescription": "vil scanne alle filer igen som en frisk scanning. Lydfilens ID3-tags, OPF-filer og tekstfiler scannes som nye.",
+ "MessageImportantNotice": "Vigtig besked!",
+ "MessageInsertChapterBelow": "Indsæt kapitel nedenfor",
+ "MessageItemsSelected": "{0} elementer valgt",
+ "MessageItemsUpdated": "{0} elementer opdateret",
+ "MessageJoinUsOn": "Deltag i os på",
+ "MessageListeningSessionsInTheLastYear": "{0} lyttesessioner i det sidste år",
+ "MessageLoading": "Indlæser...",
+ "MessageLoadingFolders": "Indlæser mapper...",
+ "MessageM4BFailed": "M4B mislykkedes!",
+ "MessageM4BFinished": "M4B afsluttet!",
+ "MessageMapChapterTitles": "Tilknyt kapiteloverskrifter til dine eksisterende lydbogskapitler uden at justere tidsstempler",
+ "MessageMarkAllEpisodesFinished": "Markér alle episoder som afsluttet",
+ "MessageMarkAllEpisodesNotFinished": "Markér alle episoder som ikke afsluttet",
+ "MessageMarkAsFinished": "Markér som afsluttet",
+ "MessageMarkAsNotFinished": "Markér som ikke afsluttet",
+ "MessageMatchBooksDescription": "vil forsøge at matche bøger i biblioteket med en bog fra den valgte søgeudbyder og udfylde tomme detaljer og omslag. Overskriver ikke detaljer.",
+ "MessageNoAudioTracks": "Ingen lydspor",
+ "MessageNoAuthors": "Ingen forfattere",
+ "MessageNoBackups": "Ingen sikkerhedskopier",
+ "MessageNoBookmarks": "Ingen bogmærker",
+ "MessageNoChapters": "Ingen kapitler",
+ "MessageNoCollections": "Ingen samlinger",
+ "MessageNoCoversFound": "Ingen omslag fundet",
+ "MessageNoDescription": "Ingen beskrivelse",
+ "MessageNoDownloadsInProgress": "Ingen downloads i gang lige nu",
+ "MessageNoDownloadsQueued": "Ingen downloads i kø",
+ "MessageNoEpisodeMatchesFound": "Ingen episode-matcher fundet",
+ "MessageNoEpisodes": "Ingen episoder",
+ "MessageNoFoldersAvailable": "Ingen mapper tilgængelige",
+ "MessageNoGenres": "Ingen genrer",
+ "MessageNoIssues": "Ingen problemer",
+ "MessageNoItems": "Ingen elementer",
+ "MessageNoItemsFound": "Ingen elementer fundet",
+ "MessageNoListeningSessions": "Ingen lyttesessioner",
+ "MessageNoLogs": "Ingen logfiler",
+ "MessageNoMediaProgress": "Ingen medieforløb",
+ "MessageNoNotifications": "Ingen meddelelser",
+ "MessageNoPodcastsFound": "Ingen podcasts fundet",
+ "MessageNoResults": "Ingen resultater",
+ "MessageNoSearchResultsFor": "Ingen søgeresultater for \"{0}\"",
+ "MessageNoSeries": "Ingen serier",
+ "MessageNoTags": "Ingen tags",
+ "MessageNoTasksRunning": "Ingen opgaver kører",
+ "MessageNotYetImplemented": "Endnu ikke implementeret",
+ "MessageNoUpdateNecessary": "Ingen opdatering nødvendig",
+ "MessageNoUpdatesWereNecessary": "Ingen opdateringer var nødvendige",
+ "MessageNoUserPlaylists": "Du har ingen afspilningslister",
+ "MessageOr": "eller",
+ "MessagePauseChapter": "Pause kapitelafspilning",
+ "MessagePlayChapter": "Lyt til begyndelsen af kapitlet",
+ "MessagePlaylistCreateFromCollection": "Opret afspilningsliste fra samling",
+ "MessagePodcastHasNoRSSFeedForMatching": "Podcast har ingen RSS-feed-URL at bruge til matchning",
+ "MessageQuickMatchDescription": "Udfyld tomme elementoplysninger og omslag med første matchresultat fra '{0}'. Overskriver ikke oplysninger, medmindre serverindstillingen 'Foretræk matchet metadata' er aktiveret.",
+ "MessageRemoveChapter": "Fjern kapitel",
+ "MessageRemoveEpisodes": "Fjern {0} episode(r)",
+ "MessageRemoveFromPlayerQueue": "Fjern fra afspillingskøen",
+ "MessageRemoveUserWarning": "Er du sikker på, at du vil slette brugeren permanent \"{0}\"?",
+ "MessageReportBugsAndContribute": "Rapporter fejl, anmod om funktioner og bidrag på",
+ "MessageResetChaptersConfirm": "Er du sikker på, at du vil nulstille kapitler og annullere ændringerne, du har foretaget?",
+ "MessageRestoreBackupConfirm": "Er du sikker på, at du vil gendanne sikkerhedskopien oprettet den",
+ "MessageRestoreBackupWarning": "Gendannelse af en sikkerhedskopi vil overskrive hele databasen, som er placeret på /config, og omslagsbilleder i /metadata/items & /metadata/authors.
Sikkerhedskopier ændrer ikke nogen filer i dine biblioteksmapper. Hvis du har aktiveret serverindstillinger for at gemme omslagskunst og metadata i dine biblioteksmapper, sikkerhedskopieres eller overskrives disse ikke.
Alle klienter, der bruger din server, opdateres automatisk.",
+ "MessageSearchResultsFor": "Søgeresultater for",
+ "MessageSelected": "{0} selected",
+ "MessageServerCouldNotBeReached": "Serveren kunne ikke nås",
+ "MessageSetChaptersFromTracksDescription": "Indstil kapitler ved at bruge hver lydfil som et kapitel og kapiteloverskrift som lydfilnavn",
+ "MessageStartPlaybackAtTime": "Start afspilning for \"{0}\" kl. {1}?",
+ "MessageThinking": "Tænker...",
+ "MessageUploaderItemFailed": "Fejl ved upload",
+ "MessageUploaderItemSuccess": "Uploadet med succes!",
+ "MessageUploading": "Uploader...",
+ "MessageValidCronExpression": "Gyldigt cron-udtryk",
+ "MessageWatcherIsDisabledGlobally": "Watcher er deaktiveret globalt i serverindstillinger",
+ "MessageXLibraryIsEmpty": "{0} bibliotek er tomt!",
+ "MessageYourAudiobookDurationIsLonger": "Din lydbogsvarighed er længere end den fundne varighed",
+ "MessageYourAudiobookDurationIsShorter": "Din lydbogsvarighed er kortere end den fundne varighed",
+ "NoteChangeRootPassword": "Root-brugeren er den eneste bruger, der kan have en tom adgangskode",
+ "NoteChapterEditorTimes": "Bemærk: Første kapitel starttidspunkt skal forblive kl. 0:00, og det sidste kapitel starttidspunkt må ikke overstige denne lydbogs varighed.",
+ "NoteFolderPicker": "Bemærk: Mapper, der allerede er mappet, vises ikke",
+ "NoteFolderPickerDebian": "Bemærk: Mappicker for Debian-installationen er ikke fuldt implementeret. Du bør indtaste stien til dit bibliotek direkte.",
+ "NoteRSSFeedPodcastAppsHttps": "Advarsel: De fleste podcast-apps kræver, at RSS-feedets URL bruger HTTPS",
+ "NoteRSSFeedPodcastAppsPubDate": "Advarsel: En eller flere af dine episoder har ikke en Pub Date. Nogle podcast-apps kræver dette.",
+ "NoteUploaderFoldersWithMediaFiles": "Mapper med mediefiler håndteres som separate bibliotekselementer.",
+ "NoteUploaderOnlyAudioFiles": "Hvis du kun uploader lydfiler, håndteres hver lydfil som en separat lydbog.",
+ "NoteUploaderUnsupportedFiles": "Ikke-understøttede filer ignoreres. Når du vælger eller slipper en mappe, ignoreres andre filer, der ikke er i en emnemappe.",
+ "PlaceholderNewCollection": "Nyt samlingnavn",
+ "PlaceholderNewFolderPath": "Ny mappes sti",
+ "PlaceholderNewPlaylist": "Nyt afspilningslistnavn",
+ "PlaceholderSearch": "Søg..",
+ "PlaceholderSearchEpisode": "Søg efter episode..",
+ "ToastAccountUpdateFailed": "Mislykkedes opdatering af konto",
+ "ToastAccountUpdateSuccess": "Konto opdateret",
+ "ToastAuthorImageRemoveFailed": "Mislykkedes fjernelse af forfatterbillede",
+ "ToastAuthorImageRemoveSuccess": "Forfatterbillede fjernet",
+ "ToastAuthorUpdateFailed": "Mislykkedes opdatering af forfatter",
+ "ToastAuthorUpdateMerged": "Forfatter fusioneret",
+ "ToastAuthorUpdateSuccess": "Forfatter opdateret",
+ "ToastAuthorUpdateSuccessNoImageFound": "Forfatter opdateret (ingen billede fundet)",
+ "ToastBackupCreateFailed": "Mislykkedes oprettelse af sikkerhedskopi",
+ "ToastBackupCreateSuccess": "Sikkerhedskopi oprettet",
+ "ToastBackupDeleteFailed": "Mislykkedes sletning af sikkerhedskopi",
+ "ToastBackupDeleteSuccess": "Sikkerhedskopi slettet",
+ "ToastBackupRestoreFailed": "Mislykkedes gendannelse af sikkerhedskopi",
+ "ToastBackupUploadFailed": "Mislykkedes upload af sikkerhedskopi",
+ "ToastBackupUploadSuccess": "Sikkerhedskopi uploadet",
+ "ToastBatchUpdateFailed": "Mislykkedes batchopdatering",
+ "ToastBatchUpdateSuccess": "Batchopdatering lykkedes",
+ "ToastBookmarkCreateFailed": "Mislykkedes oprettelse af bogmærke",
+ "ToastBookmarkCreateSuccess": "Bogmærke tilføjet",
+ "ToastBookmarkRemoveFailed": "Mislykkedes fjernelse af bogmærke",
+ "ToastBookmarkRemoveSuccess": "Bogmærke fjernet",
+ "ToastBookmarkUpdateFailed": "Mislykkedes opdatering af bogmærke",
+ "ToastBookmarkUpdateSuccess": "Bogmærke opdateret",
+ "ToastChaptersHaveErrors": "Kapitler har fejl",
+ "ToastChaptersMustHaveTitles": "Kapitler skal have titler",
+ "ToastCollectionItemsRemoveFailed": "Mislykkedes fjernelse af element(er) fra samlingen",
+ "ToastCollectionItemsRemoveSuccess": "Element(er) fjernet fra samlingen",
+ "ToastCollectionRemoveFailed": "Mislykkedes fjernelse af samling",
+ "ToastCollectionRemoveSuccess": "Samling fjernet",
+ "ToastCollectionUpdateFailed": "Mislykkedes opdatering af samling",
+ "ToastCollectionUpdateSuccess": "Samling opdateret",
+ "ToastItemCoverUpdateFailed": "Mislykkedes opdatering af varens omslag",
+ "ToastItemCoverUpdateSuccess": "Varens omslag opdateret",
+ "ToastItemDetailsUpdateFailed": "Mislykkedes opdatering af varedetaljer",
+ "ToastItemDetailsUpdateSuccess": "Varedetaljer opdateret",
+ "ToastItemDetailsUpdateUnneeded": "Ingen opdateringer er nødvendige for varedetaljer",
+ "ToastItemMarkedAsFinishedFailed": "Mislykkedes markering som afsluttet",
+ "ToastItemMarkedAsFinishedSuccess": "Vare markeret som afsluttet",
+ "ToastItemMarkedAsNotFinishedFailed": "Mislykkedes markering som ikke afsluttet",
+ "ToastItemMarkedAsNotFinishedSuccess": "Vare markeret som ikke afsluttet",
+ "ToastLibraryCreateFailed": "Mislykkedes oprettelse af bibliotek",
+ "ToastLibraryCreateSuccess": "Bibliotek \"{0}\" oprettet",
+ "ToastLibraryDeleteFailed": "Mislykkedes sletning af bibliotek",
+ "ToastLibraryDeleteSuccess": "Bibliotek slettet",
+ "ToastLibraryScanFailedToStart": "Mislykkedes start af skanning",
+ "ToastLibraryScanStarted": "Biblioteksskanning startet",
+ "ToastLibraryUpdateFailed": "Mislykkedes opdatering af bibliotek",
+ "ToastLibraryUpdateSuccess": "Bibliotek \"{0}\" opdateret",
+ "ToastPlaylistCreateFailed": "Mislykkedes oprettelse af afspilningsliste",
+ "ToastPlaylistCreateSuccess": "Afspilningsliste oprettet",
+ "ToastPlaylistRemoveFailed": "Mislykkedes fjernelse af afspilningsliste",
+ "ToastPlaylistRemoveSuccess": "Afspilningsliste fjernet",
+ "ToastPlaylistUpdateFailed": "Mislykkedes opdatering af afspilningsliste",
+ "ToastPlaylistUpdateSuccess": "Afspilningsliste opdateret",
+ "ToastPodcastCreateFailed": "Mislykkedes oprettelse af podcast",
+ "ToastPodcastCreateSuccess": "Podcast oprettet med succes",
+ "ToastRemoveItemFromCollectionFailed": "Mislykkedes fjernelse af element fra samling",
+ "ToastRemoveItemFromCollectionSuccess": "Element fjernet fra samling",
+ "ToastRSSFeedCloseFailed": "Mislykkedes lukning af RSS-feed",
+ "ToastRSSFeedCloseSuccess": "RSS-feed lukket",
+ "ToastSendEbookToDeviceFailed": "Mislykkedes afsendelse af e-bog til enhed",
+ "ToastSendEbookToDeviceSuccess": "E-bog afsendt til enhed \"{0}\"",
+ "ToastSeriesUpdateFailed": "Mislykkedes opdatering af serie",
+ "ToastSeriesUpdateSuccess": "Serieopdatering lykkedes",
+ "ToastSessionDeleteFailed": "Mislykkedes sletning af session",
+ "ToastSessionDeleteSuccess": "Session slettet",
+ "ToastSocketConnected": "Socket forbundet",
+ "ToastSocketDisconnected": "Socket afbrudt",
+ "ToastSocketFailedToConnect": "Socket kunne ikke oprettes",
+ "ToastUserDeleteFailed": "Mislykkedes sletning af bruger",
+ "ToastUserDeleteSuccess": "Bruger slettet"
+}
\ No newline at end of file
diff --git a/client/strings/de.json b/client/strings/de.json
index a9a45cb8..20da77c1 100644
--- a/client/strings/de.json
+++ b/client/strings/de.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Hinzufügen",
"ButtonAddChapters": "Kapitel hinzufügen",
+ "ButtonAddDevice": "Gerät hinzufügen",
+ "ButtonAddLibrary": "Bibliothek hinzufügen",
"ButtonAddPodcasts": "Podcasts hinzufügen",
+ "ButtonAddUser": "Benutzer hinzufügen",
"ButtonAddYourFirstLibrary": "Erstelle deine erste Bibliothek",
"ButtonApply": "Übernehmen",
"ButtonApplyChapters": "Kapitel anwenden",
@@ -55,10 +58,11 @@
"ButtonRemoveAll": "Alles löschen",
"ButtonRemoveAllLibraryItems": "Lösche alle Bibliothekseinträge",
"ButtonRemoveFromContinueListening": "Lösche den Eintrag aus der Fortsetzungsliste",
- "ButtonRemoveFromContinueReading": "Remove from Continue Reading",
+ "ButtonRemoveFromContinueReading": "Lösche die Serie aus der Lesefortsetzungsliste",
"ButtonRemoveSeriesFromContinueSeries": "Lösche die Serie aus der Serienfortsetzungsliste",
"ButtonReScan": "Neu scannen",
"ButtonReset": "Zurücksetzen",
+ "ButtonResetToDefault": "Zurücksetzen auf Standard",
"ButtonRestore": "Wiederherstellen",
"ButtonSave": "Speichern",
"ButtonSaveAndClose": "Speichern & Schließen",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Benutzer {0} bearbeiten",
"ButtonViewAll": "Alles anzeigen",
"ButtonYes": "Ja",
+ "ErrorUploadFetchMetadataAPI": "Fehler beim Abrufen der Metadaten",
+ "ErrorUploadFetchMetadataNoResults": "Metadaten konnten nicht abgerufen werden. Versuchen Sie den Titel und oder den Autor zu updaten",
+ "ErrorUploadLacksTitle": "Es muss ein Titel eingegeben werden",
"HeaderAccount": "Konto",
"HeaderAdvanced": "Erweitert",
"HeaderAppriseNotificationSettings": "Apprise Benachrichtigungseinstellungen",
"HeaderAudiobookTools": "Hörbuch-Dateiverwaltungstools",
"HeaderAudioTracks": "Audiodateien",
+ "HeaderAuthentication": "Authentifizierung",
"HeaderBackups": "Sicherungen",
"HeaderChangePassword": "Passwort ändern",
"HeaderChapters": "Kapitel",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Tags verwalten",
"HeaderMapDetails": "Stapelverarbeitung",
"HeaderMatch": "Metadaten",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Einzubettende Metadaten",
"HeaderNewAccount": "Neues Konto",
"HeaderNewLibrary": "Neue Bibliothek",
"HeaderNotifications": "Benachrichtigungen",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentifizierung",
"HeaderOpenRSSFeed": "RSS-Feed öffnen",
"HeaderOtherFiles": "Sonstige Dateien",
+ "HeaderPasswordAuthentication": "Password Authentifizierung",
"HeaderPermissions": "Berechtigungen",
"HeaderPlayerQueue": "Spieler Warteschlange",
"HeaderPlaylist": "Wiedergabeliste",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Füge {0} Hörbüch(er)/Podcast(s) der Sammlung hinzu",
"LabelAddToPlaylist": "Zur Wiedergabeliste hinzufügen",
"LabelAddToPlaylistBatch": "Füge {0} Hörbüch(er)/Podcast(s) der Wiedergabeliste hinzu",
+ "LabelAdminUsersOnly": "Nur Admin Benutzer",
"LabelAll": "Alle",
"LabelAllUsers": "Alle Benutzer",
+ "LabelAllUsersExcludingGuests": "Alle Benutzer außer Gästen",
+ "LabelAllUsersIncludingGuests": "All Benutzer und Gäste",
"LabelAlreadyInYourLibrary": "In der Bibliothek vorhanden",
"LabelAppend": "Anhängen",
"LabelAuthor": "Autor",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Autor (Nachname, Vorname)",
"LabelAuthors": "Autoren",
"LabelAutoDownloadEpisodes": "Episoden automatisch herunterladen",
+ "LabelAutoFetchMetadata": "Automatisches Abholen der Metadaten",
+ "LabelAutoFetchMetadataHelp": "Abholen der Metadaten von Titel, Autor und Serien, um das Hochladen zu optimieren. Möglicherweise müssen zusätzliche Metadaten nach dem Hochladen abgeglichen werden.",
+ "LabelAutoLaunch": "Automatischer Start",
+ "LabelAutoLaunchDescription": "Automatische Weiterleitung zum Authentifizierungsanbieter beim Navigieren zur Anmeldeseite (manueller Überschreibungspfad
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Automatische Registrierung",
+ "LabelAutoRegisterDescription": "Automatische neue Neutzer anlegen nach dem Einloggen",
"LabelBackToUser": "Zurück zum Benutzer",
"LabelBackupLocation": "Backup-Ort",
"LabelBackupsEnableAutomaticBackups": "Automatische Sicherung aktivieren",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Es wird immer nur 1 Sicherung auf einmal entfernt. Wenn Sie bereits mehrere Sicherungen als die definierte max. Anzahl haben, sollten Sie diese manuell entfernen.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Bücher",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Passwort ändern",
"LabelChannels": "Kanäle",
"LabelChapters": "Kapitel",
"LabelChaptersFound": "gefundene Kapitel",
"LabelChapterTitle": "Kapitelüberschrift",
+ "LabelClickForMoreInfo": "Klicken für mehr Informationen",
"LabelClosePlayer": "Player schließen",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Serien zusammenfassen",
@@ -218,16 +240,18 @@
"LabelCurrently": "Aktuell:",
"LabelCustomCronExpression": "Benutzerdefinierter Cron-Ausdruck",
"LabelDatetime": "Datum & Uhrzeit",
+ "LabelDeleteFromFileSystemCheckbox": "Löschen von der Festplatte + Datenbank (deaktivieren um nur aus der Datenbank zu löschen)",
"LabelDescription": "Beschreibung",
"LabelDeselectAll": "Alles abwählen",
"LabelDevice": "Gerät",
"LabelDeviceInfo": "Geräteinformationen",
+ "LabelDeviceIsAvailableTo": "Dem Geärt ist es möglich zu ...",
"LabelDirectory": "Verzeichnis",
"LabelDiscFromFilename": "CD aus dem Dateinamen",
"LabelDiscFromMetadata": "CD aus den Metadaten",
"LabelDiscover": "Entdecken",
"LabelDownload": "Herunterladen",
- "LabelDownloadNEpisodes": "Download {0} episodes",
+ "LabelDownloadNEpisodes": "Download {0} Episoden",
"LabelDuration": "Laufzeit",
"LabelDurationFound": "Gefundene Laufzeit:",
"LabelEbook": "E-Book",
@@ -247,6 +271,7 @@
"LabelExample": "Beispiel",
"LabelExplicit": "Explizit (Altersbeschränkung)",
"LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Abholen der Metadaten",
"LabelFile": "Datei",
"LabelFileBirthtime": "Datei erstellt",
"LabelFileModified": "Datei geändert",
@@ -256,6 +281,7 @@
"LabelFinished": "beendet",
"LabelFolder": "Ordner",
"LabelFolders": "Verzeichnisse",
+ "LabelFontFamily": "Schriftfamilie",
"LabelFontScale": "Schriftgröße",
"LabelFormat": "Format",
"LabelGenre": "Kategorie",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Datei dauerhaft löschen",
"LabelHasEbook": "mit E-Book",
"LabelHasSupplementaryEbook": "mit zusätlichem E-Book",
+ "LabelHighestPriority": "Höchste Priorität",
"LabelHost": "Host",
"LabelHour": "Stunde",
"LabelIcon": "Symbol",
+ "LabelImageURLFromTheWeb": "Bild-URL vom Internet",
"LabelIncludeInTracklist": "In die Titelliste aufnehmen",
"LabelIncomplete": "Unvollständig",
"LabelInProgress": "In Bearbeitung",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Informationen",
"LabelLogLevelWarn": "Warnungen",
"LabelLookForNewEpisodesAfterDate": "Suchen nach neuen Episoden nach diesem Datum",
+ "LabelLowestPriority": "Niedrigste Priorität",
+ "LabelMatchExistingUsersBy": "Zuordnen existierender Benutzer mit",
+ "LabelMatchExistingUsersByDescription": "Wird zum Verbinden vorhandener Benutzer verwendet. Sobald die Verbindung hergestellt ist, wird den Benutzern eine eindeutige ID von Ihrem SSO-Anbieter zugeordnet",
"LabelMediaPlayer": "Mediaplayer",
"LabelMediaType": "Medientyp",
+ "LabelMetadataOrderOfPrecedenceDescription": "Eine Höhere Priorität Quelle für Metadaten wird die Metadaten aus eine Quelle mit niedrigerer Priorität überschreiben.",
"LabelMetadataProvider": "Metadatenanbieter",
"LabelMetaTag": "Meta Schlagwort",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minute",
"LabelMissing": "Fehlend",
"LabelMissingParts": "Fehlende Teile",
+ "LabelMobileRedirectURIs": "Erlaubte Weiterleitungs-URIs für die mobile App",
+ "LabelMobileRedirectURIsDescription": "Dies ist eine Whitelist gültiger Umleitungs-URIs für mobile Apps. Der Standardwert ist
audiobookshelf://oauth
, den Sie entfernen oder durch zusätzliche URIs für die Integration von Drittanbieter-Apps ergänzen können. Die Verwendung eines Sternchens (
*
) als alleiniger Eintrag erlaubt jede URI.",
"LabelMore": "Mehr",
"LabelMoreInfo": "Mehr Info",
"LabelName": "Name",
@@ -372,6 +406,7 @@
"LabelRegion": "Region",
"LabelReleaseDate": "Veröffentlichungsdatum",
"LabelRemoveCover": "Lösche Titelbild",
+ "LabelRowsPerPage": "Zeilen pro Seite",
"LabelRSSFeedCustomOwnerEmail": "Benutzerdefinierte Eigentümer-E-Mail",
"LabelRSSFeedCustomOwnerName": "Benutzerdefinierter Name des Eigentümers",
"LabelRSSFeedOpen": "RSS Feed Offen",
@@ -384,6 +419,7 @@
"LabelSeason": "Staffel",
"LabelSelectAllEpisodes": "Alle Episoden auswählen",
"LabelSelectEpisodesShowing": "{0} ausgewählte Episoden werden angezeigt",
+ "LabelSelectUsers": "Benutzer auswählen",
"LabelSendEbookToDevice": "E-Book senden an...",
"LabelSequence": "Reihenfolge",
"LabelSeries": "Serien",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Serien, die ein einzelnes Buch enthalten, werden in den Regalen der Serienseite und der Startseite ausgeblendet.",
"LabelSettingsHomePageBookshelfView": "Startseite verwendet die Bücherregalansicht",
"LabelSettingsLibraryBookshelfView": "Bibliothek verwendet die Bücherregalansicht",
- "LabelSettingsOverdriveMediaMarkers": "Verwende Overdrive Media Marker für Kapitel",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3-Dateien von Overdrive werden mit eingebetteten Kapitel-Timings als benutzerdefinierte Metadaten geliefert. Wenn Sie dies aktivieren, werden diese Markierungen automatisch für die Kapiteltaktung verwendet",
"LabelSettingsParseSubtitles": "Analysiere Untertitel",
"LabelSettingsParseSubtitlesHelp": "Extrahiere den Untertitel von Medium-Ordnernamen.
Untertitel müssen vom eigentlichem Titel durch ein \" - \" getrennt sein.
Beispiel: \"Titel - Untertitel\"",
- "LabelSettingsPreferAudioMetadata": "Bevorzuge lokale ID3-Audiometadaten",
- "LabelSettingsPreferAudioMetadataHelp": "In den Audiodateien eingebettete ID3 Tags werden anstelle der Ordnernamen für die Bereitstellung der Metadaten verwendet. Wenn keine ID3 Tags zur Verfügung stehen, werden die Ordnernamen verwendet.",
"LabelSettingsPreferMatchedMetadata": "Bevorzuge online abgestimmte Metadaten",
"LabelSettingsPreferMatchedMetadataHelp": "Bei einem Schnellabgleich überschreiben online neu abgestimmte Metadaten alle schon vorhandenen Metadaten eines Mediums. Standardmäßig werden bei einem Schnellabgleich nur fehlende Metadaten ersetzt.",
- "LabelSettingsPreferOPFMetadata": "Bevorzuge OPF-Metadaten",
- "LabelSettingsPreferOPFMetadataHelp": "In OPF-Dateien gespeicherte Metadaten werden anstelle der Ordnernamen für die Bereitstellung der Metadaten verwendet. OPF-Datein sind seperate \"Textdateien\" mit der Endung \".abs\" welche in dem gleichen Ordner liegen wie das Medium selber. In dieser sind verschiedene Metadaten (z.B. Titel, Autor, Jahr, Erzähler, Handlung, ISBN, ...) gespeichert. Wenn keine OPF Datei zur Verfügung steht, wird der Ordnername verwendet.",
"LabelSettingsSkipMatchingBooksWithASIN": "Überspringe beim Online-Abgleich alle Bücher die bereits eine ASIN haben",
"LabelSettingsSkipMatchingBooksWithISBN": "Überspringe beim Online-Abgleich alle Bücher die bereits eine ISBN haben",
"LabelSettingsSortingIgnorePrefixes": "Vorwort/Artikel beim Sortieren ignorieren",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Titelbilder im Medienordner speichern",
"LabelSettingsStoreCoversWithItemHelp": "Standardmäßig werden die Titelbilder in /metadata/items gespeichert. Wenn diese Option aktiviert ist, werden die Titelbilder als jpg Datei in dem gleichen Ordner gespeichert in welchem sich auch das Medium befindet. Es wird immer nur eine Datei mit dem Namen \"cover.jpg\" gespeichert.",
"LabelSettingsStoreMetadataWithItem": "Metadaten als OPF-Datei im Medienordner speichern",
- "LabelSettingsStoreMetadataWithItemHelp": "Standardmäßig werden die Metadaten in /metadata/items gespeichert. Wenn diese Option aktiviert ist, werden die Metadaten als OPF-Datei (Textdatei) in dem gleichen Ordner gespeichert in welchem sich auch das Medium befindet. Es wird immer nur eine Datei mit dem Namen \"matadata.abs\" gespeichert.",
+ "LabelSettingsStoreMetadataWithItemHelp": "Standardmäßig werden die Metadaten in /metadata/items gespeichert. Wenn diese Option aktiviert ist, werden die Metadaten als OPF-Datei (Textdatei) in dem gleichen Ordner gespeichert in welchem sich auch das Medium befindet",
"LabelSettingsTimeFormat": "Zeitformat",
"LabelShowAll": "Alles anzeigen",
"LabelSize": "Größe",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Erlaube das Überschreiben bestehender Details für die ausgewählten Hörbücher wenn eine Übereinstimmung gefunden wird",
"LabelUploaderDragAndDrop": "Ziehen und Ablegen von Dateien oder Ordnern",
"LabelUploaderDropFiles": "Dateien löschen",
+ "LabelUploaderItemFetchMetadataHelp": "Automatisches Abholden von Titel, Author und Serien",
"LabelUseChapterTrack": "Kapiteldatei verwenden",
"LabelUseFullTrack": "Gesamte Datei verwenden",
"LabelUser": "Benutzer",
@@ -523,30 +554,35 @@
"MessageChapterErrorStartLtPrev": "Ungültige Kapitelstartzeit: Kapitelanfang < Kapitelanfang vorheriges Kapitel (Kapitelanfang liegt zeitlich vor dem Beginn des vorherigen Kapitels -> Lösung: Kapitelanfang >= Startzeit des vorherigen Kapitels)",
"MessageChapterStartIsAfter": "Ungültige Kapitelstartzeit: Kapitelanfang > Mediumende (Kapitelanfang liegt nach dem Ende des Mediums)",
"MessageCheckingCron": "Überprüfe Cron...",
- "MessageConfirmCloseFeed": "Sind Sie sicher, dass Sie diesen Feed schließen wollen?",
- "MessageConfirmDeleteBackup": "Sind Sie sicher, dass Sie die Sicherung für {0} löschen wollen?",
- "MessageConfirmDeleteFile": "Es wird die Datei vom System löschen. Sind Sie sicher?",
- "MessageConfirmDeleteLibrary": "Sind Sie sicher, dass Sie die Bibliothek \"{0}\" dauerhaft löschen wollen?",
- "MessageConfirmDeleteSession": "Sind Sie sicher, dass Sie diese Sitzung löschen möchten?",
- "MessageConfirmForceReScan": "Sind Sie sicher, dass Sie einen erneuten Scanvorgang erzwingen wollen?",
- "MessageConfirmMarkAllEpisodesFinished": "Sind Sie sicher, dass Sie alle Episoden als abgeschlossen markieren möchten?",
- "MessageConfirmMarkAllEpisodesNotFinished": "Sind Sie sicher, dass Sie alle Episoden als nicht abgeschlossen markieren möchten?",
- "MessageConfirmMarkSeriesFinished": "Sind Sie sicher, dass Sie alle Medien dieser Reihe als abgeschlossen markieren wollen?",
- "MessageConfirmMarkSeriesNotFinished": "Sind Sie sicher, dass Sie alle Medien dieser Reihe als nicht abgeschlossen markieren wollen?",
- "MessageConfirmRemoveAllChapters": "Sind Sie sicher, dass Sie alle Kapitel entfernen möchten?",
- "MessageConfirmRemoveAuthor": "Sind Sie sicher, dass Sie den Autor \"{0}\" enfernen möchten?",
- "MessageConfirmRemoveCollection": "Sind Sie sicher, dass Sie die Sammlung \"{0}\" löschen wollen?",
- "MessageConfirmRemoveEpisode": "Sind Sie sicher, dass Sie die Episode \"{0}\" löschen möchten?",
- "MessageConfirmRemoveEpisodes": "Sind Sie sicher, dass Sie {0} Episoden löschen wollen?",
- "MessageConfirmRemoveNarrator": "Sind Sie sicher, dass Sie den Erzähler \"{0}\" löschen möchten?",
- "MessageConfirmRemovePlaylist": "Sind Sie sicher, dass Sie die Wiedergabeliste \"{0}\" entfernen möchten?",
- "MessageConfirmRenameGenre": "Sind Sie sicher, dass Sie die Kategorie \"{0}\" in \"{1}\" für alle Hörbücher/Podcasts umbenennen wollen?",
+ "MessageConfirmCloseFeed": "Feed wird geschlossen! Sind Sie sicher?",
+ "MessageConfirmDeleteBackup": "Sicherung für {0} wird gelöscht! Sind Sie sicher?",
+ "MessageConfirmDeleteFile": "Datei wird vom System gelöscht! Sind Sie sicher?",
+ "MessageConfirmDeleteLibrary": "Bibliothek \"{0}\" wird dauerhaft gelöscht! Sind Sie sicher?",
+ "MessageConfirmDeleteLibraryItem": "Bibliothekselement wird aus der Datenbank + Festplatte gelöscht? Sind Sie sicher?",
+ "MessageConfirmDeleteLibraryItems": "{0} Bibliothekselemente werden aus der Datenbank + Festplatte gelöscht? Sind Sie sicher?",
+ "MessageConfirmDeleteSession": "Sitzung wird gelöscht! Sind Sie sicher?",
+ "MessageConfirmForceReScan": "Scanvorgang erzwingen! Sind Sie sicher?",
+ "MessageConfirmMarkAllEpisodesFinished": "Alle Episoden werden als abgeschlossen markiert! Sind Sie sicher?",
+ "MessageConfirmMarkAllEpisodesNotFinished": "Alle Episoden werden als nicht abgeschlossen markiert! Sind Sie sicher?",
+ "MessageConfirmMarkSeriesFinished": "Alle Medien dieser Reihe werden als abgeschlossen markiert! Sind Sie sicher?",
+ "MessageConfirmMarkSeriesNotFinished": "Alle Medien dieser Reihe werden als nicht abgeschlossen markiert! Sind Sie sicher?",
+ "MessageConfirmQuickEmbed": "Warnung! Audiodateien werden bei der Schnelleinbettung nicht gesichert! Achten Sie darauf, dass Sie eine Sicherungskopie der Audiodateien besitzen.
Möchten Sie fortfahren?",
+ "MessageConfirmRemoveAllChapters": "Alle Kapitel werden entfernt! Sind Sie sicher?",
+ "MessageConfirmRemoveAuthor": "Autor \"{0}\" wird enfernt! Sind Sie sicher?",
+ "MessageConfirmRemoveCollection": "Sammlung \"{0}\" wird gelöscht! Sind Sie sicher?",
+ "MessageConfirmRemoveEpisode": "Episode \"{0}\" wird geloscht! Sind Sie sicher?",
+ "MessageConfirmRemoveEpisodes": "{0} Episoden werden gelöscht! Sind Sie sicher?",
+ "MessageConfirmRemoveListeningSessions": "Sind Sie sicher, dass sie {0} Hörsitzungen enfernen möchten?",
+ "MessageConfirmRemoveNarrator": "Erzähler \"{0}\" wird gelöscht! Sind Sie sicher?",
+ "MessageConfirmRemovePlaylist": "Wiedergabeliste \"{0}\" wird entfernt! Sind Sie sicher?",
+ "MessageConfirmRenameGenre": "Kategorie \"{0}\" in \"{1}\" für alle Hörbücher/Podcasts werden umbenannt! Sind Sie sicher?",
"MessageConfirmRenameGenreMergeNote": "Hinweis: Kategorie existiert bereits -> Kategorien werden zusammengelegt.",
"MessageConfirmRenameGenreWarning": "Warnung! Ein ähnliche Kategorie mit einem anderen Wortlaut existiert bereits: \"{0}\".",
- "MessageConfirmRenameTag": "Sind Sie sicher, dass Sie den Tag \"{0}\" in \"{1}\" für alle Hörbücher/Podcasts umbenennen wollen?",
+ "MessageConfirmRenameTag": "Tag \"{0}\" in \"{1}\" für alle Hörbücher/Podcasts werden umbenannt! Sind Sie sicher?",
"MessageConfirmRenameTagMergeNote": "Hinweis: Tag existiert bereits -> Tags werden zusammengelegt.",
"MessageConfirmRenameTagWarning": "Warnung! Ein ähnlicher Tag mit einem anderen Wortlaut existiert bereits: \"{0}\".",
- "MessageConfirmSendEbookToDevice": "Sind Sie sicher, dass sie {0} ebook \"{1}\" auf das Gerät \"{2}\" senden wollen?",
+ "MessageConfirmReScanLibraryItems": "{0} Elemente werden erneut gescannt! Sind Sie sicher?",
+ "MessageConfirmSendEbookToDevice": "{0} E-Book \"{1}\" werden auf das Gerät \"{2}\" gesendet! Sind Sie sicher?",
"MessageDownloadingEpisode": "Episode herunterladen",
"MessageDragFilesIntoTrackOrder": "Verschieben Sie die Dateien in die richtige Reihenfolge",
"MessageEmbedFinished": "Einbettung abgeschlossen!",
@@ -610,12 +646,13 @@
"MessageRemoveChapter": "Kapitel löschen",
"MessageRemoveEpisodes": "Entferne {0} Episode(n)",
"MessageRemoveFromPlayerQueue": "Aus der Abspielwarteliste löschen",
- "MessageRemoveUserWarning": "Sind Sie sicher, dass Sie den Benutzer \"{0}\" dauerhaft löschen wollen?",
+ "MessageRemoveUserWarning": "Benutzer \"{0}\" wird dauerhaft gelöscht! Sind Sie sicher?",
"MessageReportBugsAndContribute": "Fehler melden, Funktionen anfordern und Beiträge leisten auf",
- "MessageResetChaptersConfirm": "Sind Sie sicher, dass Sie die Kapitel zurücksetzen und die vorgenommenen Änderungen rückgängig machen wollen?",
+ "MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Sind Sie sicher?",
"MessageRestoreBackupConfirm": "Sind Sie sicher, dass Sie die Sicherung wiederherstellen wollen, welche am",
"MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.
Bei der Sicherung werden keine Dateien in Ihren Bibliotheksordnern verändert. Wenn Sie die Servereinstellungen aktiviert haben, um Cover und Metadaten in Ihren Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.
Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.",
"MessageSearchResultsFor": "Suchergebnisse für",
+ "MessageSelected": "{0} ausgewählt",
"MessageServerCouldNotBeReached": "Server kann nicht erreicht werden",
"MessageSetChaptersFromTracksDescription": "Kaitelerstellung basiert auf den existierenden einzelnen Audiodateien. Pro existierende Audiodatei wird 1 Kapitel erstellt, wobei deren Kapitelname aus dem Audiodateinamen extrahiert wird",
"MessageStartPlaybackAtTime": "Start der Wiedergabe für \"{0}\" bei {1}?",
@@ -713,4 +750,4 @@
"ToastSocketFailedToConnect": "Verbindung zum WebSocket fehlgeschlagen",
"ToastUserDeleteFailed": "Benutzer konnte nicht gelöscht werden",
"ToastUserDeleteSuccess": "Benutzer gelöscht"
-}
\ No newline at end of file
+}
diff --git a/client/strings/en-us.json b/client/strings/en-us.json
index 15812766..f69175fd 100644
--- a/client/strings/en-us.json
+++ b/client/strings/en-us.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Add",
"ButtonAddChapters": "Add Chapters",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "Add Podcasts",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "Add your first library",
"ButtonApply": "Apply",
"ButtonApplyChapters": "Apply Chapters",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Remove Series from Continue Series",
"ButtonReScan": "Re-Scan",
"ButtonReset": "Reset",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "Restore",
"ButtonSave": "Save",
"ButtonSaveAndClose": "Save & Close",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Edit user {0}",
"ButtonViewAll": "View All",
"ButtonYes": "Yes",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Account",
"HeaderAdvanced": "Advanced",
"HeaderAppriseNotificationSettings": "Apprise Notification Settings",
"HeaderAudiobookTools": "Audiobook File Management Tools",
"HeaderAudioTracks": "Audio Tracks",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Backups",
"HeaderChangePassword": "Change Password",
"HeaderChapters": "Chapters",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Manage Tags",
"HeaderMapDetails": "Map details",
"HeaderMatch": "Match",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Metadata to embed",
"HeaderNewAccount": "New Account",
"HeaderNewLibrary": "New Library",
"HeaderNotifications": "Notifications",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Open RSS Feed",
"HeaderOtherFiles": "Other Files",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Permissions",
"HeaderPlayerQueue": "Player Queue",
"HeaderPlaylist": "Playlist",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Add {0} Books to Collection",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAddToPlaylistBatch": "Add {0} Items to Playlist",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "All",
"LabelAllUsers": "All Users",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Already in your library",
"LabelAppend": "Append",
"LabelAuthor": "Author",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Author (Last, First)",
"LabelAuthors": "Authors",
"LabelAutoDownloadEpisodes": "Auto Download Episodes",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Back to User",
"LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Enable automatic backups",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Only 1 backup will be removed at a time so if you already have more backups than this you should manually remove them.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Books",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Change Password",
"LabelChannels": "Channels",
"LabelChapters": "Chapters",
"LabelChaptersFound": "chapters found",
"LabelChapterTitle": "Chapter Title",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Close player",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Collapse Series",
@@ -218,10 +240,12 @@
"LabelCurrently": "Currently:",
"LabelCustomCronExpression": "Custom Cron Expression:",
"LabelDatetime": "Datetime",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Description",
"LabelDeselectAll": "Deselect All",
"LabelDevice": "Device",
"LabelDeviceInfo": "Device Info",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Directory",
"LabelDiscFromFilename": "Disc from Filename",
"LabelDiscFromMetadata": "Disc from Metadata",
@@ -247,6 +271,7 @@
"LabelExample": "Example",
"LabelExplicit": "Explicit",
"LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "File",
"LabelFileBirthtime": "File Birthtime",
"LabelFileModified": "File Modified",
@@ -256,6 +281,7 @@
"LabelFinished": "Finished",
"LabelFolder": "Folder",
"LabelFolders": "Folders",
+ "LabelFontFamily": "Font family",
"LabelFontScale": "Font scale",
"LabelFormat": "Format",
"LabelGenre": "Genre",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Hard delete file",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Hour",
"LabelIcon": "Icon",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Include in Tracklist",
"LabelIncomplete": "Incomplete",
"LabelInProgress": "In Progress",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Look for new episodes after this date",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Media Player",
"LabelMediaType": "Media Type",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Metadata Provider",
"LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minute",
"LabelMissing": "Missing",
"LabelMissingParts": "Missing Parts",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "More",
"LabelMoreInfo": "More Info",
"LabelName": "Name",
@@ -372,6 +406,7 @@
"LabelRegion": "Region",
"LabelReleaseDate": "Release Date",
"LabelRemoveCover": "Remove cover",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedOpen": "RSS Feed Open",
@@ -384,6 +419,7 @@
"LabelSeason": "Season",
"LabelSelectAllEpisodes": "Select all episodes",
"LabelSelectEpisodesShowing": "Select {0} episodes showing",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Send Ebook to...",
"LabelSequence": "Sequence",
"LabelSeries": "Series",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
"LabelSettingsHomePageBookshelfView": "Home page use bookshelf view",
"LabelSettingsLibraryBookshelfView": "Library use bookshelf view",
- "LabelSettingsOverdriveMediaMarkers": "Use Overdrive Media Markers for chapters",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3 files from Overdrive come with chapter timings embedded as custom metadata. Enabling this will use these tags for chapter timings automatically",
"LabelSettingsParseSubtitles": "Parse subtitles",
"LabelSettingsParseSubtitlesHelp": "Extract subtitles from audiobook folder names.
Subtitle must be seperated by \" - \"
i.e. \"Book Title - A Subtitle Here\" has the subtitle \"A Subtitle Here\"",
- "LabelSettingsPreferAudioMetadata": "Prefer audio metadata",
- "LabelSettingsPreferAudioMetadataHelp": "Audio file ID3 meta tags will be used for book details over folder names",
"LabelSettingsPreferMatchedMetadata": "Prefer matched metadata",
"LabelSettingsPreferMatchedMetadataHelp": "Matched data will override item details when using Quick Match. By default Quick Match will only fill in missing details.",
- "LabelSettingsPreferOPFMetadata": "Prefer OPF metadata",
- "LabelSettingsPreferOPFMetadataHelp": "OPF file metadata will be used for book details over folder names",
"LabelSettingsSkipMatchingBooksWithASIN": "Skip matching books that already have an ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Skip matching books that already have an ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignore prefixes when sorting",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Store covers with item",
"LabelSettingsStoreCoversWithItemHelp": "By default covers are stored in /metadata/items, enabling this setting will store covers in your library item folder. Only one file named \"cover\" will be kept",
"LabelSettingsStoreMetadataWithItem": "Store metadata with item",
- "LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders. Uses .abs file extension",
+ "LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders",
"LabelSettingsTimeFormat": "Time Format",
"LabelShowAll": "Show All",
"LabelSize": "Size",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Allow overwriting of existing details for the selected books when a match is located",
"LabelUploaderDragAndDrop": "Drag & drop files or folders",
"LabelUploaderDropFiles": "Drop files",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Use chapter track",
"LabelUseFullTrack": "Use full track",
"LabelUser": "User",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?",
"MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?",
"MessageConfirmDeleteLibrary": "Are you sure you want to permanently delete library \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Are you sure you want to delete this session?",
"MessageConfirmForceReScan": "Are you sure you want to force re-scan?",
"MessageConfirmMarkAllEpisodesFinished": "Are you sure you want to mark all episodes as finished?",
"MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?",
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Are you sure you want to remove narrator \"{0}\"?",
"MessageConfirmRemovePlaylist": "Are you sure you want to remove your playlist \"{0}\"?",
"MessageConfirmRenameGenre": "Are you sure you want to rename genre \"{0}\" to \"{1}\" for all items?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Are you sure you want to rename tag \"{0}\" to \"{1}\" for all items?",
"MessageConfirmRenameTagMergeNote": "Note: This tag already exists so they will be merged.",
"MessageConfirmRenameTagWarning": "Warning! A similar tag with a different casing already exists \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Are you sure you want to send {0} ebook \"{1}\" to device \"{2}\"?",
"MessageDownloadingEpisode": "Downloading episode",
"MessageDragFilesIntoTrackOrder": "Drag files into correct track order",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Are you sure you want to restore the backup created on",
"MessageRestoreBackupWarning": "Restoring a backup will overwrite the entire database located at /config and cover images in /metadata/items & /metadata/authors.
Backups do not modify any files in your library folders. If you have enabled server settings to store cover art and metadata in your library folders then those are not backed up or overwritten.
All clients using your server will be automatically refreshed.",
"MessageSearchResultsFor": "Search results for",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Server could not be reached",
"MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name",
"MessageStartPlaybackAtTime": "Start playback for \"{0}\" at {1}?",
@@ -713,4 +750,4 @@
"ToastSocketFailedToConnect": "Socket failed to connect",
"ToastUserDeleteFailed": "Failed to delete user",
"ToastUserDeleteSuccess": "User deleted"
-}
+}
\ No newline at end of file
diff --git a/client/strings/es.json b/client/strings/es.json
index d2ea30c7..cefeb8f8 100644
--- a/client/strings/es.json
+++ b/client/strings/es.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Agregar",
"ButtonAddChapters": "Agregar Capitulo",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "Agregar Podcasts",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "Agrega tu Primera Biblioteca",
"ButtonApply": "Aplicar",
"ButtonApplyChapters": "Aplicar Capítulos",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Remover Serie de Continuar Series",
"ButtonReScan": "Re-Escanear",
"ButtonReset": "Reiniciar",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "Restaurar",
"ButtonSave": "Guardar",
"ButtonSaveAndClose": "Guardar y Cerrar",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Editar Usuario {0}",
"ButtonViewAll": "Ver Todos",
"ButtonYes": "Aceptar",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Cuenta",
"HeaderAdvanced": "Avanzado",
"HeaderAppriseNotificationSettings": "Ajustes de Notificaciones de Apprise",
"HeaderAudiobookTools": "Herramientas de Gestión de Archivos de Audiolibro",
"HeaderAudioTracks": "Pistas de Audio",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Respaldos",
"HeaderChangePassword": "Cambiar Contraseña",
"HeaderChapters": "Capítulos",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Administrar Etiquetas",
"HeaderMapDetails": "Asignar Detalles",
"HeaderMatch": "Encontrar",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Metadatos para Insertar",
"HeaderNewAccount": "Nueva Cuenta",
"HeaderNewLibrary": "Nueva Biblioteca",
"HeaderNotifications": "Notificaciones",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Abrir fuente RSS",
"HeaderOtherFiles": "Otros Archivos",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Permisos",
"HeaderPlayerQueue": "Fila del Reproductor",
"HeaderPlaylist": "Lista de Reproducción",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Se Añadieron {0} Libros a la Colección",
"LabelAddToPlaylist": "Añadido a la Lista de Reproducción",
"LabelAddToPlaylistBatch": "Se Añadieron {0} Artículos a la Lista de Reproducción",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "Todos",
"LabelAllUsers": "Todos los Usuarios",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Ya en la Biblioteca",
"LabelAppend": "Adjuntar",
"LabelAuthor": "Autor",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Autor (Apellido, Nombre)",
"LabelAuthors": "Autores",
"LabelAutoDownloadEpisodes": "Descargar Episodios Automáticamente",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Regresar a Usuario",
"LabelBackupLocation": "Ubicación del Respaldo",
"LabelBackupsEnableAutomaticBackups": "Habilitar Respaldo Automático",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Solamente 1 respaldo se removerá a la vez. Si tiene mas respaldos guardados, debe removerlos manualmente.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Libros",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Cambiar Contraseña",
"LabelChannels": "Canales",
"LabelChapters": "Capítulos",
"LabelChaptersFound": "Capítulo Encontrado",
"LabelChapterTitle": "Titulo del Capítulo",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Cerrar Reproductor",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Colapsar Serie",
@@ -218,10 +240,12 @@
"LabelCurrently": "En este momento:",
"LabelCustomCronExpression": "Expresión de Cron Personalizada:",
"LabelDatetime": "Hora y Fecha",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Descripción",
"LabelDeselectAll": "Deseleccionar Todos",
"LabelDevice": "Dispositivo",
"LabelDeviceInfo": "Información de Dispositivo",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Directorio",
"LabelDiscFromFilename": "Disco a partir del Nombre del Archivo",
"LabelDiscFromMetadata": "Disco a partir de Metadata",
@@ -247,6 +271,7 @@
"LabelExample": "Ejemplo",
"LabelExplicit": "Explicito",
"LabelFeedURL": "Fuente de URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "Archivo",
"LabelFileBirthtime": "Archivo Creado en",
"LabelFileModified": "Archivo modificado",
@@ -256,6 +281,7 @@
"LabelFinished": "Terminado",
"LabelFolder": "Carpeta",
"LabelFolders": "Carpetas",
+ "LabelFontFamily": "Familia tipográfica",
"LabelFontScale": "Tamaño de Fuente",
"LabelFormat": "Formato",
"LabelGenre": "Genero",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Eliminar Definitivamente",
"LabelHasEbook": "Tiene Ebook",
"LabelHasSupplementaryEbook": "Tiene Ebook Suplementario",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Hora",
"LabelIcon": "Icono",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Incluir en Tracklist",
"LabelIncomplete": "Incompleto",
"LabelInProgress": "En Proceso",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Información",
"LabelLogLevelWarn": "Advertencia",
"LabelLookForNewEpisodesAfterDate": "Buscar Nuevos Episodios a partir de esta Fecha",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Reproductor de Medios",
"LabelMediaType": "Tipo de Multimedia",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Proveedor de Metadata",
"LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minuto",
"LabelMissing": "Ausente",
"LabelMissingParts": "Partes Ausentes",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "Más",
"LabelMoreInfo": "Más Información",
"LabelName": "Nombre",
@@ -372,6 +406,7 @@
"LabelRegion": "Región",
"LabelReleaseDate": "Fecha de Estreno",
"LabelRemoveCover": "Remover Portada",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Email de dueño personalizado",
"LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado",
"LabelRSSFeedOpen": "Fuente RSS Abierta",
@@ -384,6 +419,7 @@
"LabelSeason": "Temporada",
"LabelSelectAllEpisodes": "Seleccionar todos los episodios",
"LabelSelectEpisodesShowing": "Seleccionar los {0} episodios visibles",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Enviar Ebook a...",
"LabelSequence": "Secuencia",
"LabelSeries": "Series",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Las series con un solo libro no aparecerán en la página de series ni la repisa para series de la página principal.",
"LabelSettingsHomePageBookshelfView": "Usar la vista de librero en la página principal",
"LabelSettingsLibraryBookshelfView": "Usar la vista de librero en la biblioteca",
- "LabelSettingsOverdriveMediaMarkers": "Usar Overdrive Media Markers para estos capítulos",
- "LabelSettingsOverdriveMediaMarkersHelp": "Los archivos MP3 de Overdrive vienen con capítulos con tiempos incrustados como metadatos personalizados. Habilitar esta opción utilizará automáticamente estas etiquetas para los tiempos de los capítulos.",
"LabelSettingsParseSubtitles": "Extraer Subtítulos",
"LabelSettingsParseSubtitlesHelp": "Extraer subtítulos de los nombres de las carpetas de los audiolibros.
Los subtítulos deben estar separados por \" - \"
Por ejemplo: \"Ejemplo de Título - Subtítulo Aquí\" tiene el subtítulo \"Subtítulo Aquí\"",
- "LabelSettingsPreferAudioMetadata": "Preferir metadatos del archivo de audio",
- "LabelSettingsPreferAudioMetadataHelp": "Preferir los metadatos ID3 del archivo de audio en vez de los nombres de carpetas para los detalles de libros",
"LabelSettingsPreferMatchedMetadata": "Preferir metadatos encontrados",
"LabelSettingsPreferMatchedMetadataHelp": "Los datos encontrados sobreescribirán los detalles del elemento cuando se use \"Encontrar Rápido\". Por defecto, \"Encontrar Rápido\" sólo completará los detalles faltantes.",
- "LabelSettingsPreferOPFMetadata": "Preferir Metadatos OPF",
- "LabelSettingsPreferOPFMetadataHelp": "Preferir los archivos de metadatos OPF en vez de los nombres de carpetas para los detalles de los libros.",
"LabelSettingsSkipMatchingBooksWithASIN": "Omitir libros coincidentes que ya tengan un ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Omitir libros coincidentes que ya tengan un ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignorar prefijos al ordenar",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Guardar portadas con elementos",
"LabelSettingsStoreCoversWithItemHelp": "Por defecto, las portadas se almacenan en /metadata/items. Si habilita esta opción, las portadas se almacenarán en la carpeta de elementos de su biblioteca. Se guardará un solo archivo llamado \"cover\".",
"LabelSettingsStoreMetadataWithItem": "Guardar metadatos con elementos",
- "LabelSettingsStoreMetadataWithItemHelp": "Por defecto, los archivos de metadatos se almacenan en /metadata/items. Si habilita esta opción, los archivos de metadatos se guardarán en la carpeta de elementos de su biblioteca. Usa la extensión .abs",
+ "LabelSettingsStoreMetadataWithItemHelp": "Por defecto, los archivos de metadatos se almacenan en /metadata/items. Si habilita esta opción, los archivos de metadatos se guardarán en la carpeta de elementos de su biblioteca",
"LabelSettingsTimeFormat": "Formato de Tiempo",
"LabelShowAll": "Mostrar Todos",
"LabelSize": "Tamaño",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Permitir sobrescribir detalles existentes de los libros seleccionados cuando sean encontrados",
"LabelUploaderDragAndDrop": "Arrastre y suelte archivos o carpetas",
"LabelUploaderDropFiles": "Suelte los Archivos",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Usar pista por capitulo",
"LabelUseFullTrack": "Usar pista completa",
"LabelUser": "Usuario",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "¿Está seguro de que desea eliminar el respaldo {0}?",
"MessageConfirmDeleteFile": "Esto eliminará el archivo de su sistema de archivos. ¿Está seguro?",
"MessageConfirmDeleteLibrary": "¿Está seguro de que desea eliminar permanentemente la biblioteca \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "¿Está seguro de que desea eliminar esta sesión?",
"MessageConfirmForceReScan": "¿Está seguro de que desea forzar un re-escaneo?",
"MessageConfirmMarkAllEpisodesFinished": "¿Está seguro de que desea marcar todos los episodios como terminados?",
"MessageConfirmMarkAllEpisodesNotFinished": "¿Está seguro de que desea marcar todos los episodios como no terminados?",
"MessageConfirmMarkSeriesFinished": "¿Está seguro de que desea marcar todos los libros en esta serie como terminados?",
"MessageConfirmMarkSeriesNotFinished": "¿Está seguro de que desea marcar todos los libros en esta serie como no terminados?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "¿Está seguro de que desea remover todos los capitulos?",
"MessageConfirmRemoveAuthor": "¿Está seguro de que desea remover el autor \"{0}\"?",
"MessageConfirmRemoveCollection": "¿Está seguro de que desea remover la colección \"{0}\"?",
"MessageConfirmRemoveEpisode": "¿Está seguro de que desea remover el episodio \"{0}\"?",
"MessageConfirmRemoveEpisodes": "¿Está seguro de que desea remover {0} episodios?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "¿Está seguro de que desea remover el narrador \"{0}\"?",
"MessageConfirmRemovePlaylist": "¿Está seguro de que desea remover la lista de reproducción \"{0}\"?",
"MessageConfirmRenameGenre": "¿Está seguro de que desea renombrar el genero \"{0}\" a \"{1}\" de todos los elementos?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "¿Está seguro de que desea renombrar la etiqueta \"{0}\" a \"{1}\" de todos los elementos?",
"MessageConfirmRenameTagMergeNote": "Nota: Esta etiqueta ya existe, por lo que se fusionarán.",
"MessageConfirmRenameTagWarning": "Advertencia! Una etiqueta similar ya existe \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "¿Está seguro de que enviar {0} ebook(s) \"{1}\" al dispositivo \"{2}\"?",
"MessageDownloadingEpisode": "Descargando Capitulo",
"MessageDragFilesIntoTrackOrder": "Arrastra los archivos al orden correcto de las pistas.",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "¿Está seguro de que desea para restaurar del respaldo creado en",
"MessageRestoreBackupWarning": "Restaurar sobrescribirá toda la base de datos localizada en /config y las imágenes de portadas en /metadata/items y /metadata/authors.
El respaldo no modifica ningún archivo en las carpetas de su biblioteca. Si ha habilitado la opción del servidor para almacenar portadas y metadata en las carpetas de su biblioteca, esos archivos no se respaldan o sobrescriben.
Todos los clientes que usen su servidor se actualizarán automáticamente.",
"MessageSearchResultsFor": "Resultados de la búsqueda de",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "No se pudo establecer la conexión con el servidor",
"MessageSetChaptersFromTracksDescription": "Establecer capítulos usando cada archivo de audio como un capítulo y el título del capítulo como el nombre del archivo de audio",
"MessageStartPlaybackAtTime": "Iniciar reproducción para \"{0}\" en {1}?",
@@ -713,4 +750,4 @@
"ToastSocketFailedToConnect": "Error al conectar al Socket",
"ToastUserDeleteFailed": "Error al eliminar el usuario",
"ToastUserDeleteSuccess": "Usuario eliminado"
-}
+}
\ No newline at end of file
diff --git a/client/strings/fr.json b/client/strings/fr.json
index bcc4efd7..d894412c 100644
--- a/client/strings/fr.json
+++ b/client/strings/fr.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Ajouter",
"ButtonAddChapters": "Ajouter le chapitre",
+ "ButtonAddDevice": "Ajouter un appareil",
+ "ButtonAddLibrary": "Ajouter une bibliothèque",
"ButtonAddPodcasts": "Ajouter des podcasts",
+ "ButtonAddUser": "Ajouter un utilisateur",
"ButtonAddYourFirstLibrary": "Ajouter votre première bibliothèque",
"ButtonApply": "Appliquer",
"ButtonApplyChapters": "Appliquer les chapitres",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Ne plus continuer à écouter la série",
"ButtonReScan": "Nouvelle analyse",
"ButtonReset": "Réinitialiser",
+ "ButtonResetToDefault": "Réinitialiser aux valeurs par défaut",
"ButtonRestore": "Rétablir",
"ButtonSave": "Sauvegarder",
"ButtonSaveAndClose": "Sauvegarder et Fermer",
@@ -83,17 +87,21 @@
"ButtonUserEdit": "Modifier l’utilisateur {0}",
"ButtonViewAll": "Afficher tout",
"ButtonYes": "Oui",
+ "ErrorUploadFetchMetadataAPI": "Erreur lors de la récupération des métadonnées",
+ "ErrorUploadFetchMetadataNoResults": "Impossible de récupérer les métadonnées - essayez de mettre à jour le titre et/ou l’auteur.",
+ "ErrorUploadLacksTitle": "Doit avoir un titre",
"HeaderAccount": "Compte",
"HeaderAdvanced": "Avancé",
"HeaderAppriseNotificationSettings": "Configuration des Notifications Apprise",
"HeaderAudiobookTools": "Outils de Gestion de Fichier Audiobook",
"HeaderAudioTracks": "Pistes audio",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Sauvegardes",
"HeaderChangePassword": "Modifier le mot de passe",
"HeaderChapters": "Chapitres",
"HeaderChooseAFolder": "Choisir un dossier",
"HeaderCollection": "Collection",
- "HeaderCollectionItems": "Entrées de la Collection",
+ "HeaderCollectionItems": "Entrées de la collection",
"HeaderCover": "Couverture",
"HeaderCurrentDownloads": "Téléchargements en cours",
"HeaderDetails": "Détails",
@@ -106,10 +114,10 @@
"HeaderEreaderSettings": "Options Ereader",
"HeaderFiles": "Fichiers",
"HeaderFindChapters": "Trouver les chapitres",
- "HeaderIgnoredFiles": "Fichiers Ignorés",
- "HeaderItemFiles": "Fichiers des Articles",
+ "HeaderIgnoredFiles": "Fichiers ignorés",
+ "HeaderItemFiles": "Fichiers des articles",
"HeaderItemMetadataUtils": "Outils de gestion des métadonnées",
- "HeaderLastListeningSession": "Dernière Session d’écoute",
+ "HeaderLastListeningSession": "Dernière session d’écoute",
"HeaderLatestEpisodes": "Dernier épisodes",
"HeaderLibraries": "Bibliothèque",
"HeaderLibraryFiles": "Fichier de bibliothèque",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Gérer les étiquettes",
"HeaderMapDetails": "Édition en masse",
"HeaderMatch": "Chercher",
- "HeaderMetadataToEmbed": "Métadonnée à intégrer",
+ "HeaderMetadataOrderOfPrecedence": "Ordre de priorité des métadonnées",
+ "HeaderMetadataToEmbed": "Métadonnées à intégrer",
"HeaderNewAccount": "Nouveau compte",
"HeaderNewLibrary": "Nouvelle bibliothèque",
"HeaderNotifications": "Notifications",
- "HeaderOpenRSSFeed": "Ouvrir Flux RSS",
+ "HeaderOpenIDConnectAuthentication": "Authentification via OpenID Connect",
+ "HeaderOpenRSSFeed": "Ouvrir un flux RSS",
"HeaderOtherFiles": "Autres fichiers",
+ "HeaderPasswordAuthentication": "Authentification par mot de passe",
"HeaderPermissions": "Permissions",
"HeaderPlayerQueue": "Liste d’écoute",
"HeaderPlaylist": "Liste de lecture",
@@ -143,7 +154,7 @@
"HeaderSchedule": "Programmation",
"HeaderScheduleLibraryScans": "Analyse automatique de la bibliothèque",
"HeaderSession": "Session",
- "HeaderSetBackupSchedule": "Activer la Sauvegarde Automatique",
+ "HeaderSetBackupSchedule": "Activer la sauvegarde automatique",
"HeaderSettings": "Paramètres",
"HeaderSettingsDisplay": "Affichage",
"HeaderSettingsExperimental": "Fonctionnalités expérimentales",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Ajout de {0} livres à la lollection",
"LabelAddToPlaylist": "Ajouter à la liste de lecture",
"LabelAddToPlaylistBatch": "{0} éléments ajoutés à la liste de lecture",
+ "LabelAdminUsersOnly": "Administrateurs uniquement",
"LabelAll": "Tout",
"LabelAllUsers": "Tous les utilisateurs",
+ "LabelAllUsersExcludingGuests": "Tous les utilisateurs à l’exception des invités",
+ "LabelAllUsersIncludingGuests": "Tous les utilisateurs, y compris les invités",
"LabelAlreadyInYourLibrary": "Déjà dans la bibliothèque",
"LabelAppend": "Ajouter",
"LabelAuthor": "Auteur",
@@ -185,21 +199,29 @@
"LabelAuthorLastFirst": "Auteur (Nom, Prénom)",
"LabelAuthors": "Auteurs",
"LabelAutoDownloadEpisodes": "Téléchargement automatique d’épisode",
- "LabelBackToUser": "Revenir à l’Utilisateur",
- "LabelBackupLocation": "Backup Location",
+ "LabelAutoFetchMetadata": "Recherche automatique de métadonnées",
+ "LabelAutoFetchMetadataHelp": "Récupère les métadonnées du titre, de l’auteur et de la série pour simplifier le téléchargement. Il se peut que des métadonnées supplémentaires doivent être ajoutées après le téléchargement.",
+ "LabelAutoLaunch": "Lancement automatique",
+ "LabelAutoLaunchDescription": "Redirection automatique vers le fournisseur d'authentification lors de la navigation vers la page de connexion (chemin de remplacement manuel
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Enregistrement automatique",
+ "LabelAutoRegisterDescription": "Créer automatiquement de nouveaux utilisateurs après la connexion",
+ "LabelBackToUser": "Retour à l’utilisateur",
+ "LabelBackupLocation": "Emplacement de la sauvegarde",
"LabelBackupsEnableAutomaticBackups": "Activer les sauvegardes automatiques",
- "LabelBackupsEnableAutomaticBackupsHelp": "Sauvegardes Enregistrées dans /metadata/backups",
+ "LabelBackupsEnableAutomaticBackupsHelp": "Sauvegardes enregistrées dans /metadata/backups",
"LabelBackupsMaxBackupSize": "Taille maximale de la sauvegarde (en Go)",
"LabelBackupsMaxBackupSizeHelp": "Afin de prévenir les mauvaises configuration, la sauvegarde échouera si elle excède la taille limite.",
- "LabelBackupsNumberToKeep": "Nombre de sauvegardes à maintenir",
- "LabelBackupsNumberToKeepHelp": "Une seule sauvegarde sera effacée à la fois. Si vous avez plus de sauvegardes à effacer, vous devrez le faire manuellement.",
+ "LabelBackupsNumberToKeep": "Nombre de sauvegardes à conserver",
+ "LabelBackupsNumberToKeepHelp": "Seule une sauvegarde sera supprimée à la fois. Si vous avez déjà plus de sauvegardes à effacer, vous devez les supprimer manuellement.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Livres",
+ "LabelButtonText": "Texte du bouton",
"LabelChangePassword": "Modifier le mot de passe",
"LabelChannels": "Canaux",
"LabelChapters": "Chapitres",
- "LabelChaptersFound": "Chapitres trouvés",
- "LabelChapterTitle": "Titres du chapitre",
+ "LabelChaptersFound": "chapitres trouvés",
+ "LabelChapterTitle": "Titre du chapitre",
+ "LabelClickForMoreInfo": "Cliquez ici pour plus d’informations",
"LabelClosePlayer": "Fermer le lecteur",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Réduire les séries",
@@ -213,18 +235,20 @@
"LabelCover": "Couverture",
"LabelCoverImageURL": "URL vers l’image de couverture",
"LabelCreatedAt": "Créé le",
- "LabelCronExpression": "Expression Cron",
- "LabelCurrent": "Courrant",
- "LabelCurrently": "En ce moment :",
- "LabelCustomCronExpression": "Expression cron personnalisée:",
- "LabelDatetime": "Datetime",
+ "LabelCronExpression": "Expression cron",
+ "LabelCurrent": "Actuel",
+ "LabelCurrently": "Actuellement :",
+ "LabelCustomCronExpression": "Expression cron personnalisée :",
+ "LabelDatetime": "Date",
+ "LabelDeleteFromFileSystemCheckbox": "Supprimer du système de fichiers (décocher pour ne supprimer que de la base de données)",
"LabelDescription": "Description",
"LabelDeselectAll": "Tout déselectionner",
"LabelDevice": "Appareil",
"LabelDeviceInfo": "Détail de l’appareil",
+ "LabelDeviceIsAvailableTo": "L’appareil est disponible pour…",
"LabelDirectory": "Répertoire",
- "LabelDiscFromFilename": "Disque depuis le fichier",
- "LabelDiscFromMetadata": "Disque depuis les métadonnées",
+ "LabelDiscFromFilename": "Depuis le fichier",
+ "LabelDiscFromMetadata": "Depuis les métadonnées",
"LabelDiscover": "Découvrir",
"LabelDownload": "Téléchargement",
"LabelDownloadNEpisodes": "Télécharger {0} épisode(s)",
@@ -247,15 +271,17 @@
"LabelExample": "Exemple",
"LabelExplicit": "Restriction",
"LabelFeedURL": "URL du flux",
+ "LabelFetchingMetadata": "Récupération des métadonnées",
"LabelFile": "Fichier",
"LabelFileBirthtime": "Création du fichier",
"LabelFileModified": "Modification du fichier",
"LabelFilename": "Nom de fichier",
- "LabelFilterByUser": "Filtrer par l’utilisateur",
+ "LabelFilterByUser": "Filtrer par utilisateur",
"LabelFindEpisodes": "Trouver des épisodes",
- "LabelFinished": "Fini(e)",
+ "LabelFinished": "Terminé le",
"LabelFolder": "Dossier",
"LabelFolders": "Dossiers",
+ "LabelFontFamily": "Polices de caractères",
"LabelFontScale": "Taille de la police de caractère",
"LabelFormat": "Format",
"LabelGenre": "Genre",
@@ -263,14 +289,16 @@
"LabelHardDeleteFile": "Suppression du fichier",
"LabelHasEbook": "Dispose d’un livre numérique",
"LabelHasSupplementaryEbook": "Dispose d’un livre numérique supplémentaire",
+ "LabelHighestPriority": "Priorité la plus élevée",
"LabelHost": "Hôte",
"LabelHour": "Heure",
- "LabelIcon": "Icone",
- "LabelIncludeInTracklist": "Inclure dans la liste des pistes",
+ "LabelIcon": "Icône",
+ "LabelImageURLFromTheWeb": "URL de l’image à partir du web",
+ "LabelIncludeInTracklist": "Inclure dans la liste de lecture",
"LabelIncomplete": "Incomplet",
"LabelInProgress": "En cours",
"LabelInterval": "Intervalle",
- "LabelIntervalCustomDailyWeekly": "Journalier / Hebdomadaire personnalisé",
+ "LabelIntervalCustomDailyWeekly": "Personnaliser quotidiennement / hebdomadairement",
"LabelIntervalEvery12Hours": "Toutes les 12 heures",
"LabelIntervalEvery15Minutes": "Toutes les 15 minutes",
"LabelIntervalEvery2Hours": "Toutes les 2 heures",
@@ -303,16 +331,22 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Chercher de nouveaux épisode après cette date",
+ "LabelLowestPriority": "Priorité la plus basse",
+ "LabelMatchExistingUsersBy": "Faire correspondre les utilisateurs existants par",
+ "LabelMatchExistingUsersByDescription": "Utilisé pour connecter les utilisateurs existants. Une fois connectés, les utilisateurs seront associés à un identifiant unique provenant de votre fournisseur SSO.",
"LabelMediaPlayer": "Lecteur multimédia",
"LabelMediaType": "Type de média",
+ "LabelMetadataOrderOfPrecedenceDescription": "Les sources de métadonnées ayant une priorité plus élevée auront la priorité sur celles ayant une priorité moins élevée.",
"LabelMetadataProvider": "Fournisseur de métadonnées",
- "LabelMetaTag": "Etiquette de métadonnée",
- "LabelMetaTags": "Etiquettes de métadonnée",
+ "LabelMetaTag": "Balise de métadonnée",
+ "LabelMetaTags": "Balises de métadonnée",
"LabelMinute": "Minute",
"LabelMissing": "Manquant",
"LabelMissingParts": "Parties manquantes",
+ "LabelMobileRedirectURIs": "URI de redirection mobile autorisés",
+ "LabelMobileRedirectURIsDescription": "Il s'agit d'une liste blanche d’URI de redirection valides pour les applications mobiles. Celui par défaut est
audiobookshelf://oauth
, que vous pouvez supprimer ou compléter avec des URIs supplémentaires pour l'intégration d'applications tierces. L’utilisation d’un astérisque (
*
) comme seule entrée autorise n’importe quel URI.",
"LabelMore": "Plus",
- "LabelMoreInfo": "Plus d’info",
+ "LabelMoreInfo": "Plus d’informations",
"LabelName": "Nom",
"LabelNarrator": "Narrateur",
"LabelNarrators": "Narrateurs",
@@ -324,7 +358,7 @@
"LabelNextScheduledRun": "Prochain lancement prévu",
"LabelNoEpisodesSelected": "Aucun épisode sélectionné",
"LabelNotes": "Notes",
- "LabelNotFinished": "Non terminé(e)",
+ "LabelNotFinished": "Non terminé",
"LabelNotificationAppriseURL": "URL(s) d’Apprise",
"LabelNotificationAvailableVariables": "Variables disponibles",
"LabelNotificationBodyTemplate": "Modèle de Message",
@@ -333,10 +367,10 @@
"LabelNotificationsMaxFailedAttemptsHelp": "La notification est abandonnée une fois ce seuil atteint",
"LabelNotificationsMaxQueueSize": "Nombres de notifications maximum à mettre en attente",
"LabelNotificationsMaxQueueSizeHelp": "La limite de notification est de un évènement par seconde. Les notifications seront ignorées si la file d’attente est à son maximum. Cela empêche un flot trop important.",
- "LabelNotificationTitleTemplate": "Modèle de Titre",
- "LabelNotStarted": "Non Démarré(e)",
- "LabelNumberOfBooks": "Nombre de Livres",
- "LabelNumberOfEpisodes": "Nombre d’Episodes",
+ "LabelNotificationTitleTemplate": "Modèle de titre",
+ "LabelNotStarted": "Pas commencé",
+ "LabelNumberOfBooks": "Nombre de livres",
+ "LabelNumberOfEpisodes": "Nombre d’épisodes",
"LabelOpenRSSFeed": "Ouvrir le flux RSS",
"LabelOverwrite": "Écraser",
"LabelPassword": "Mot de passe",
@@ -372,11 +406,12 @@
"LabelRegion": "Région",
"LabelReleaseDate": "Date de parution",
"LabelRemoveCover": "Supprimer la couverture",
+ "LabelRowsPerPage": "Lignes par page",
"LabelRSSFeedCustomOwnerEmail": "Courriel du propriétaire personnalisé",
"LabelRSSFeedCustomOwnerName": "Nom propriétaire personnalisé",
"LabelRSSFeedOpen": "Flux RSS ouvert",
"LabelRSSFeedPreventIndexing": "Empêcher l’indexation",
- "LabelRSSFeedSlug": "Identificateur d’adresse du Flux RSS ",
+ "LabelRSSFeedSlug": "Balise URL du flux RSS",
"LabelRSSFeedURL": "Adresse du flux RSS",
"LabelSearchTerm": "Terme de recherche",
"LabelSearchTitle": "Titre de recherche",
@@ -384,7 +419,8 @@
"LabelSeason": "Saison",
"LabelSelectAllEpisodes": "Sélectionner tous les épisodes",
"LabelSelectEpisodesShowing": "Sélectionner {0} episode(s) en cours",
- "LabelSendEbookToDevice": "Envoyer le livre numérique à...",
+ "LabelSelectUsers": "Sélectionner les utilisateurs",
+ "LabelSendEbookToDevice": "Envoyer le livre numérique à…",
"LabelSequence": "Séquence",
"LabelSeries": "Séries",
"LabelSeriesName": "Nom de la série",
@@ -392,69 +428,63 @@
"LabelSetEbookAsPrimary": "Définir comme principale",
"LabelSetEbookAsSupplementary": "Définir comme supplémentaire",
"LabelSettingsAudiobooksOnly": "Livres audios seulement",
- "LabelSettingsAudiobooksOnlyHelp": "L’activation de ce paramètre ignorera les fichiers “ ebook ”, à moins qu’ils ne se trouvent dans un dossier de livres audio, auquel cas ils seront définis comme des livres numériques supplémentaires.",
+ "LabelSettingsAudiobooksOnlyHelp": "L'activation de ce paramètre ignorera les fichiers de type « livre numériques », sauf s'ils se trouvent dans un dossier spécifique , auquel cas ils seront définis comme des livres numériques supplémentaires.",
"LabelSettingsBookshelfViewHelp": "Interface skeuomorphique avec une étagère en bois",
"LabelSettingsChromecastSupport": "Support du Chromecast",
"LabelSettingsDateFormat": "Format de date",
"LabelSettingsDisableWatcher": "Désactiver la surveillance",
"LabelSettingsDisableWatcherForLibrary": "Désactiver la surveillance des dossiers pour la bibliothèque",
- "LabelSettingsDisableWatcherHelp": "Désactive la mise à jour automatique lorsque des modifications de fichiers sont détectées. *Nécessite le redémarrage du serveur",
+ "LabelSettingsDisableWatcherHelp": "Désactive la mise à jour automatique lorsque des modifications de fichiers sont détectées. * nécessite le redémarrage du serveur",
"LabelSettingsEnableWatcher": "Activer la veille",
"LabelSettingsEnableWatcherForLibrary": "Activer la surveillance des dossiers pour la bibliothèque",
- "LabelSettingsEnableWatcherHelp": "Active la mise à jour automatique automatique lorsque des modifications de fichiers sont détectées. *Nécessite le redémarrage du serveur",
+ "LabelSettingsEnableWatcherHelp": "Active la mise à jour automatique automatique lorsque des modifications de fichiers sont détectées. * nécessite le redémarrage du serveur",
"LabelSettingsExperimentalFeatures": "Fonctionnalités expérimentales",
- "LabelSettingsExperimentalFeaturesHelp": "Fonctionnalités en cours de développement sur lesquelles nous attendons votre retour et expérience. Cliquez pour ouvrir la discussion Github.",
+ "LabelSettingsExperimentalFeaturesHelp": "Fonctionnalités en cours de développement sur lesquelles nous attendons votre retour et expérience. Cliquez pour ouvrir la discussion GitHub.",
"LabelSettingsFindCovers": "Chercher des couvertures de livre",
"LabelSettingsFindCoversHelp": "Si votre livre audio ne possède pas de couverture intégrée ou une image de couverture dans le dossier, l’analyseur tentera de récupérer une couverture.
Attention, cela peut augmenter le temps d’analyse.",
"LabelSettingsHideSingleBookSeries": "Masquer les séries de livres uniques",
"LabelSettingsHideSingleBookSeriesHelp": "Les séries qui ne comportent qu’un seul livre seront masquées sur la page de la série et sur les étagères de la page d’accueil.",
"LabelSettingsHomePageBookshelfView": "La page d’accueil utilise la vue étagère",
"LabelSettingsLibraryBookshelfView": "La bibliothèque utilise la vue étagère",
- "LabelSettingsOverdriveMediaMarkers": "Utiliser Overdrive Media Marker pour les chapitres",
- "LabelSettingsOverdriveMediaMarkersHelp": "Les fichiers MP3 d’Overdrive viennent avec les minutages des chapitres intégrés en métadonnées. Activer ce paramètre utilisera ces minutages pour les chapitres automatiquement.",
"LabelSettingsParseSubtitles": "Analyser les sous-titres",
- "LabelSettingsParseSubtitlesHelp": "Extrait les sous-titres depuis le dossier du Livre Audio.
Les sous-titres doivent être séparés par « - »
i.e. « Titre du Livre - Ceci est un sous-titre » aura le sous-titre « Ceci est un sous-titre »",
- "LabelSettingsPreferAudioMetadata": "Préférer les métadonnées audio",
- "LabelSettingsPreferAudioMetadataHelp": "Les méta étiquettes ID3 des fichiers audios seront utilisés à la place des noms de dossier pour les détails du livre audio",
+ "LabelSettingsParseSubtitlesHelp": "Extrait les sous-titres depuis le dossier du livre audio.
Les sous-titres doivent être séparés par « - »
c’est-à-dire : « Titre du livre - Ceci est un sous-titre » aura le sous-titre « Ceci est un sous-titre »",
"LabelSettingsPreferMatchedMetadata": "Préférer les métadonnées par correspondance",
"LabelSettingsPreferMatchedMetadataHelp": "Les métadonnées par correspondance écrase les détails de l’article lors d’une recherche par correspondance rapide. Par défaut, la recherche par correspondance rapide ne comblera que les éléments manquant.",
- "LabelSettingsPreferOPFMetadata": "Préférer les métadonnées OPF",
- "LabelSettingsPreferOPFMetadataHelp": "Les fichiers de métadonnées OPF seront utilisés à la place des noms de dossier pour les détails du Livre Audio",
"LabelSettingsSkipMatchingBooksWithASIN": "Ignorer la recherche par correspondance sur les livres ayant déjà un ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Ignorer la recherche par correspondance sur les livres ayant déjà un ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignorer les préfixes lors du tri",
- "LabelSettingsSortingIgnorePrefixesHelp": "i.e. pour le préfixe « le », le livre avec pour titre « Le Titre du Livre » sera trié en tant que « Titre du Livre, Le »",
+ "LabelSettingsSortingIgnorePrefixesHelp": "c’est-à-dire : pour le préfixe « le », le livre avec pour titre « Le Titre du Livre » sera trié en tant que « Titre du Livre, Le »",
"LabelSettingsSquareBookCovers": "Utiliser des couvertures carrées",
"LabelSettingsSquareBookCoversHelp": "Préférer les couvertures carrées par rapport aux couvertures standards de ratio 1.6:1.",
"LabelSettingsStoreCoversWithItem": "Enregistrer la couverture avec les articles",
"LabelSettingsStoreCoversWithItemHelp": "Par défaut, les couvertures sont enregistrées dans /metadata/items. Activer ce paramètre enregistrera les couvertures dans le dossier avec les fichiers de l’article. Seul un fichier nommé « cover » sera conservé.",
"LabelSettingsStoreMetadataWithItem": "Enregistrer les Métadonnées avec les articles",
- "LabelSettingsStoreMetadataWithItemHelp": "Par défaut, les métadonnées sont enregistrées dans /metadata/items. Activer ce paramètre enregistrera les métadonnées dans le dossier de l’article avec une extension « .abs ».",
+ "LabelSettingsStoreMetadataWithItemHelp": "Par défaut, les métadonnées sont enregistrées dans /metadata/items",
"LabelSettingsTimeFormat": "Format d’heure",
- "LabelShowAll": "Afficher Tout",
+ "LabelShowAll": "Tout afficher",
"LabelSize": "Taille",
"LabelSleepTimer": "Minuterie",
- "LabelSlug": "Slug",
+ "LabelSlug": "Balise",
"LabelStart": "Démarrer",
"LabelStarted": "Démarré",
"LabelStartedAt": "Démarré à",
- "LabelStartTime": "Heure de Démarrage",
+ "LabelStartTime": "Heure de démarrage",
"LabelStatsAudioTracks": "Pistes Audios",
"LabelStatsAuthors": "Auteurs",
- "LabelStatsBestDay": "Meilleur Jour",
- "LabelStatsDailyAverage": "Moyenne Journalière",
+ "LabelStatsBestDay": "Meilleur jour",
+ "LabelStatsDailyAverage": "Moyenne journalière",
"LabelStatsDays": "Jours",
"LabelStatsDaysListened": "Jours d’écoute",
"LabelStatsHours": "Heures",
- "LabelStatsInARow": "d’affilé(s)",
+ "LabelStatsInARow": "d’affilée(s)",
"LabelStatsItemsFinished": "Articles terminés",
- "LabelStatsItemsInLibrary": "Articles dans la Bibliothèque",
+ "LabelStatsItemsInLibrary": "Articles dans la bibliothèque",
"LabelStatsMinutes": "minutes",
"LabelStatsMinutesListening": "Minutes d’écoute",
- "LabelStatsOverallDays": "Jours au total",
- "LabelStatsOverallHours": "Heures au total",
+ "LabelStatsOverallDays": "Nombre total de jours",
+ "LabelStatsOverallHours": "Nombre total d'heures",
"LabelStatsWeekListening": "Écoute de la semaine",
- "LabelSubtitle": "Sous-Titre",
+ "LabelSubtitle": "Sous-titre",
"LabelSupportedFileTypes": "Types de fichiers supportés",
"LabelTag": "Étiquette",
"LabelTags": "Étiquettes",
@@ -466,23 +496,23 @@
"LabelThemeLight": "Clair",
"LabelTimeBase": "Base de temps",
"LabelTimeListened": "Temps d’écoute",
- "LabelTimeListenedToday": "Nombres d’écoutes Aujourd’hui",
+ "LabelTimeListenedToday": "Nombres d’écoutes aujourd’hui",
"LabelTimeRemaining": "{0} restantes",
"LabelTimeToShift": "Temps de décalage en secondes",
"LabelTitle": "Titre",
- "LabelToolsEmbedMetadata": "Métadonnées Intégrées",
+ "LabelToolsEmbedMetadata": "Métadonnées intégrées",
"LabelToolsEmbedMetadataDescription": "Intègre les métadonnées au fichier audio avec la couverture et les chapitres.",
- "LabelToolsMakeM4b": "Créer un fichier Livre Audio M4B",
- "LabelToolsMakeM4bDescription": "Génère un fichier Livre Audio .M4B avec intégration des métadonnées, image de couverture et les chapitres.",
+ "LabelToolsMakeM4b": "Créer un fichier livre audio M4B",
+ "LabelToolsMakeM4bDescription": "Générer un fichier de livre audio .M4B avec des métadonnées intégrées, une image de couverture et des chapitres.",
"LabelToolsSplitM4b": "Scinde le fichier M4B en fichiers MP3",
"LabelToolsSplitM4bDescription": "Créer plusieurs fichier MP3 à partir du découpage par chapitre, en incluant les métadonnées, l’image de couverture et les chapitres.",
- "LabelTotalDuration": "Durée Totale",
+ "LabelTotalDuration": "Durée totale",
"LabelTotalTimeListened": "Temps d’écoute total",
"LabelTrackFromFilename": "Piste depuis le fichier",
"LabelTrackFromMetadata": "Piste depuis les métadonnées",
"LabelTracks": "Pistes",
"LabelTracksMultiTrack": "Piste multiple",
- "LabelTracksNone": "No tracks",
+ "LabelTracksNone": "Aucune piste",
"LabelTracksSingleTrack": "Piste simple",
"LabelType": "Type",
"LabelUnabridged": "Version intégrale",
@@ -494,8 +524,9 @@
"LabelUpdateDetailsHelp": "Autoriser la mise à jour des détails existants lorsqu’une correspondance est trouvée",
"LabelUploaderDragAndDrop": "Glisser et déposer des fichiers ou dossiers",
"LabelUploaderDropFiles": "Déposer des fichiers",
+ "LabelUploaderItemFetchMetadataHelp": "Récupérer automatiquement le titre, l’auteur et la série",
"LabelUseChapterTrack": "Utiliser la piste du chapitre",
- "LabelUseFullTrack": "Utiliser la piste Complète",
+ "LabelUseFullTrack": "Utiliser la piste complète",
"LabelUser": "Utilisateur",
"LabelUsername": "Nom d’utilisateur",
"LabelValue": "Valeur",
@@ -510,14 +541,14 @@
"LabelYourPlaylists": "Vos listes de lecture",
"LabelYourProgress": "Votre progression",
"MessageAddToPlayerQueue": "Ajouter en file d’attente",
- "MessageAppriseDescription": "Nécessite une instance d’
API Apprise pour utiliser cette fonctionnalité ou une api qui prend en charge les mêmes requêtes.
l’URL de l’API Apprise doit comprendre le chemin complet pour envoyer la notification. Par exemple, si votre instance écoute sur
http://192.168.1.1:8337
alors vous devez mettre
http://192.168.1.1:8337/notify
.",
+ "MessageAppriseDescription": "Nécessite une instance d’
API Apprise pour utiliser cette fonctionnalité ou une api qui prend en charge les mêmes requêtes.
L’URL de l’API Apprise doit comprendre le chemin complet pour envoyer la notification. Par exemple, si votre instance écoute sur
http://192.168.1.1:8337
alors vous devez mettre
http://192.168.1.1:8337/notify
.",
"MessageBackupsDescription": "Les sauvegardes incluent les utilisateurs, la progression de lecture par utilisateur, les détails des articles des bibliothèques, les paramètres du serveur et les images sauvegardées. Les sauvegardes n’incluent pas les fichiers de votre bibliothèque.",
"MessageBatchQuickMatchDescription": "La recherche par correspondance rapide tentera d’ajouter les couvertures et les métadonnées manquantes pour les articles sélectionnés. Activer l’option suivante pour autoriser la recherche par correspondance à écraser les données existantes.",
"MessageBookshelfNoCollections": "Vous n’avez pas encore de collections",
- "MessageBookshelfNoResultsForFilter": "Aucun résultat pour le filtre « {0}: {1} »",
+ "MessageBookshelfNoResultsForFilter": "Aucun résultat pour le filtre « {0} : {1} »",
"MessageBookshelfNoRSSFeeds": "Aucun flux RSS n’est ouvert",
"MessageBookshelfNoSeries": "Vous n’avez aucune série",
- "MessageChapterEndIsAfter": "Le Chapitre Fin est situé à la fin de votre Livre Audio",
+ "MessageChapterEndIsAfter": "La fin du chapitre se situe après la fin de votre livre audio.",
"MessageChapterErrorFirstNotZero": "Le premier capitre doit débuter à 0",
"MessageChapterErrorStartGteDuration": "Horodatage invalide car il doit débuter avant la fin du livre",
"MessageChapterErrorStartLtPrev": "Horodatage invalide car il doit débuter au moins après le précédent chapitre",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Êtes-vous sûr de vouloir supprimer la sauvegarde de « {0} » ?",
"MessageConfirmDeleteFile": "Cela supprimera le fichier de votre système de fichiers. Êtes-vous sûr ?",
"MessageConfirmDeleteLibrary": "Êtes-vous sûr de vouloir supprimer définitivement la bibliothèque « {0} » ?",
+ "MessageConfirmDeleteLibraryItem": "Cette opération supprimera l’élément de la base de données et de votre système de fichiers. Êtes-vous sûr ?",
+ "MessageConfirmDeleteLibraryItems": "Cette opération supprimera {0} éléments de la base de données et de votre système de fichiers. Êtes-vous sûr ?",
"MessageConfirmDeleteSession": "Êtes-vous sûr de vouloir supprimer cette session ?",
"MessageConfirmForceReScan": "Êtes-vous sûr de vouloir lancer une analyse forcée ?",
"MessageConfirmMarkAllEpisodesFinished": "Êtes-vous sûr de marquer tous les épisodes comme terminés ?",
"MessageConfirmMarkAllEpisodesNotFinished": "Êtes-vous sûr de vouloir marquer tous les épisodes comme non terminés ?",
"MessageConfirmMarkSeriesFinished": "Êtes-vous sûr de vouloir marquer tous les livres de cette série comme terminées ?",
"MessageConfirmMarkSeriesNotFinished": "Êtes-vous sûr de vouloir marquer tous les livres de cette série comme comme non terminés ?",
+ "MessageConfirmQuickEmbed": "Attention ! L’intégration rapide ne sauvegardera pas vos fichiers audio. Assurez-vous d’avoir effectuer une sauvegarde de vos fichiers audio.
Souhaitez-vous continuer ?",
"MessageConfirmRemoveAllChapters": "Êtes-vous sûr de vouloir supprimer tous les chapitres ?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Êtes-vous sûr de vouloir supprimer la collection « {0} » ?",
"MessageConfirmRemoveEpisode": "Êtes-vous sûr de vouloir supprimer l’épisode « {0} » ?",
"MessageConfirmRemoveEpisodes": "Êtes-vous sûr de vouloir supprimer {0} épisodes ?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Êtes-vous sûr de vouloir supprimer le narrateur « {0} » ?",
"MessageConfirmRemovePlaylist": "Êtes-vous sûr de vouloir supprimer la liste de lecture « {0} » ?",
"MessageConfirmRenameGenre": "Êtes-vous sûr de vouloir renommer le genre « {0} » en « {1} » pour tous les articles ?",
@@ -546,15 +581,16 @@
"MessageConfirmRenameTag": "Êtes-vous sûr de vouloir renommer l’étiquette « {0} » en « {1} » pour tous les articles ?",
"MessageConfirmRenameTagMergeNote": "Information: Cette étiquette existe déjà et sera fusionnée.",
"MessageConfirmRenameTagWarning": "Attention ! Une étiquette similaire avec une casse différente existe déjà « {0} ».",
+ "MessageConfirmReScanLibraryItems": "Êtes-vous sûr de vouloir re-analyser {0} éléments ?",
"MessageConfirmSendEbookToDevice": "Êtes-vous sûr de vouloir envoyer le livre numérique {0} « {1} » à l’appareil « {2} »?",
"MessageDownloadingEpisode": "Téléchargement de l’épisode",
- "MessageDragFilesIntoTrackOrder": "Faire glisser les fichiers dans l’ordre correct",
+ "MessageDragFilesIntoTrackOrder": "Faites glisser les fichiers dans l’ordre correct des pistes",
"MessageEmbedFinished": "Intégration terminée !",
"MessageEpisodesQueuedForDownload": "{0} épisode(s) mis en file pour téléchargement",
- "MessageFeedURLWillBe": "l’URL du flux sera {0}",
+ "MessageFeedURLWillBe": "L’URL du flux sera {0}",
"MessageFetching": "Récupération…",
- "MessageForceReScanDescription": "Analysera tous les fichiers de nouveau. Les étiquettes ID3 des fichiers audios, fichiers OPF, et les fichiers textes seront analysés comme s’ils étaient nouveaux.",
- "MessageImportantNotice": "Information Importante !",
+ "MessageForceReScanDescription": "analysera de nouveau tous les fichiers. Les étiquettes ID3 des fichiers audio, les fichiers OPF et les fichiers texte seront analysés comme s’ils étaient nouveaux.",
+ "MessageImportantNotice": "Information importante !",
"MessageInsertChapterBelow": "Insérer le chapitre ci-dessous",
"MessageItemsSelected": "{0} articles sélectionnés",
"MessageItemsUpdated": "{0} articles mis à jour",
@@ -610,12 +646,13 @@
"MessageRemoveChapter": "Supprimer le chapitre",
"MessageRemoveEpisodes": "Suppression de {0} épisode(s)",
"MessageRemoveFromPlayerQueue": "Supprimer de la liste d’écoute",
- "MessageRemoveUserWarning": "Êtes-vous certain de vouloir supprimer définitivement l’utilisateur « {0} » ?",
+ "MessageRemoveUserWarning": "Êtes-vous sûr de vouloir supprimer définitivement l’utilisateur « {0} » ?",
"MessageReportBugsAndContribute": "Remonter des anomalies, demander des fonctionnalités et contribuer sur",
- "MessageResetChaptersConfirm": "Êtes-vous certain de vouloir réinitialiser les chapitres et annuler les changements effectués ?",
- "MessageRestoreBackupConfirm": "Êtes-vous certain de vouloir restaurer la sauvegarde créée le",
- "MessageRestoreBackupWarning": "Restaurer la sauvegarde écrasera la base de donnée située dans le dossier /config ainsi que les images sur /metadata/items et /metadata/authors.
Les sauvegardes ne touchent pas aux fichiers de la bibliothèque. Si vous avez activé le paramètre pour sauvegarder les métadonnées et les images de couverture dans le même dossier que les fichiers, ceux-ci ne ni sauvegardés, ni écrasés lors de la restauration.
Tous les clients utilisant votre serveur seront automatiquement mis à jour.",
+ "MessageResetChaptersConfirm": "Êtes-vous sûr de vouloir réinitialiser les chapitres et annuler les changements effectués ?",
+ "MessageRestoreBackupConfirm": "Êtes-vous sûr de vouloir restaurer la sauvegarde créée le",
+ "MessageRestoreBackupWarning": "Restaurer la sauvegarde écrasera la base de donnée située dans le dossier /config ainsi que les images sur /metadata/items et /metadata/authors.
Les sauvegardes ne touchent pas aux fichiers de la bibliothèque. Si vous avez activé le paramètre pour sauvegarder les métadonnées et les images de couverture dans le même dossier que les fichiers, ceux-ci ne ni sauvegardés, ni écrasés lors de la restauration.
Tous les clients utilisant votre serveur seront automatiquement mis à jour.",
"MessageSearchResultsFor": "Résultats de recherche pour",
+ "MessageSelected": "{0} sélectionnés",
"MessageServerCouldNotBeReached": "Serveur inaccessible",
"MessageSetChaptersFromTracksDescription": "Positionne un chapitre par fichier audio, avec le titre du fichier comme titre de chapitre",
"MessageStartPlaybackAtTime": "Démarrer la lecture pour « {0} » à {1} ?",
@@ -626,10 +663,10 @@
"MessageValidCronExpression": "Expression cron valide",
"MessageWatcherIsDisabledGlobally": "La surveillance est désactivée par un paramètre global du serveur",
"MessageXLibraryIsEmpty": "La bibliothèque {0} est vide !",
- "MessageYourAudiobookDurationIsLonger": "La durée de votre Livre Audio est plus longue que la durée trouvée",
- "MessageYourAudiobookDurationIsShorter": "La durée de votre Livre Audio est plus courte que la durée trouvée",
+ "MessageYourAudiobookDurationIsLonger": "La durée de votre livre audio est plus longue que la durée trouvée",
+ "MessageYourAudiobookDurationIsShorter": "La durée de votre livre audio est plus courte que la durée trouvée",
"NoteChangeRootPassword": "seul l’utilisateur « root » peut utiliser un mot de passe vide",
- "NoteChapterEditorTimes": "Information : l’horodatage du premier chapitre doit être à 0:00 et celui du dernier chapitre ne peut se situer au-delà de la durée du Livre Audio.",
+ "NoteChapterEditorTimes": "Information : l’horodatage du premier chapitre doit être à 0:00 et celui du dernier chapitre ne peut se situer au-delà de la durée du livre audio.",
"NoteFolderPicker": "Information : Les dossiers déjà surveillés ne sont pas affichés",
"NoteFolderPickerDebian": "Information : La sélection de dossier sur une installation debian n’est pas finalisée. Merci de renseigner le chemin complet vers votre bibliothèque manuellement.",
"NoteRSSFeedPodcastAppsHttps": "Attention : la majorité des application de podcast nécessite une adresse de flux en HTTPS.",
@@ -640,8 +677,8 @@
"PlaceholderNewCollection": "Nom de la nouvelle collection",
"PlaceholderNewFolderPath": "Nouveau chemin de dossier",
"PlaceholderNewPlaylist": "Nouveau nom de liste de lecture",
- "PlaceholderSearch": "Recherche...",
- "PlaceholderSearchEpisode": "Recherche d’épisode...",
+ "PlaceholderSearch": "Recherche…",
+ "PlaceholderSearchEpisode": "Recherche d’épisode…",
"ToastAccountUpdateFailed": "Échec de la mise à jour du compte",
"ToastAccountUpdateSuccess": "Compte mis à jour",
"ToastAuthorImageRemoveFailed": "Échec de la suppression de l’image",
@@ -713,4 +750,4 @@
"ToastSocketFailedToConnect": "Échec de la connexion WebSocket",
"ToastUserDeleteFailed": "Échec de la suppression de l’utilisateur",
"ToastUserDeleteSuccess": "Utilisateur supprimé"
-}
\ No newline at end of file
+}
diff --git a/client/strings/gu.json b/client/strings/gu.json
index 6b63c96a..24c874eb 100644
--- a/client/strings/gu.json
+++ b/client/strings/gu.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "ઉમેરો",
"ButtonAddChapters": "પ્રકરણો ઉમેરો",
+ "ButtonAddDevice": "ઉપકરણ ઉમેરો",
+ "ButtonAddLibrary": "પુસ્તકાલય ઉમેરો",
"ButtonAddPodcasts": "પોડકાસ્ટ ઉમેરો",
+ "ButtonAddUser": "વપરાશકર્તા ઉમેરો",
"ButtonAddYourFirstLibrary": "તમારી પ્રથમ પુસ્તકાલય ઉમેરો",
"ButtonApply": "લાગુ કરો",
"ButtonApplyChapters": "પ્રકરણો લાગુ કરો",
@@ -55,10 +58,11 @@
"ButtonRemoveAll": "બધું કાઢી નાખો",
"ButtonRemoveAllLibraryItems": "બધું પુસ્તકાલય વસ્તુઓ કાઢી નાખો",
"ButtonRemoveFromContinueListening": "સાંભળતી પુસ્તકો માંથી કાઢી નાખો",
- "ButtonRemoveFromContinueReading": "Remove from Continue Reading",
+ "ButtonRemoveFromContinueReading": "સાંભળતી પુસ્તકો માંથી કાઢી નાખો",
"ButtonRemoveSeriesFromContinueSeries": "સાંભળતી સિરીઝ માંથી કાઢી નાખો",
"ButtonReScan": "ફરીથી સ્કેન કરો",
"ButtonReset": "રીસેટ કરો",
+ "ButtonResetToDefault": "ડિફોલ્ટ પર રીસેટ કરો",
"ButtonRestore": "પુનઃસ્થાપિત કરો",
"ButtonSave": "સાચવો",
"ButtonSaveAndClose": "સાચવો અને બંધ કરો",
@@ -74,7 +78,7 @@
"ButtonStartM4BEncode": "M4B એન્કોડ શરૂ કરો",
"ButtonStartMetadataEmbed": "મેટાડેટા એમ્બેડ શરૂ કરો",
"ButtonSubmit": "સબમિટ કરો",
- "ButtonTest": "Test",
+ "ButtonTest": "પરખ કરો",
"ButtonUpload": "અપલોડ કરો",
"ButtonUploadBackup": "બેકઅપ અપલોડ કરો",
"ButtonUploadCover": "કવર અપલોડ કરો",
@@ -83,77 +87,84 @@
"ButtonUserEdit": "વપરાશકર્તા {0} સંપાદિત કરો",
"ButtonViewAll": "બધું જુઓ",
"ButtonYes": "હા",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "એકાઉન્ટ",
"HeaderAdvanced": "અડ્વાન્સડ",
"HeaderAppriseNotificationSettings": "Apprise સૂચના સેટિંગ્સ",
- "HeaderAudiobookTools": "Audiobook File Management Tools",
- "HeaderAudioTracks": "Audio Tracks",
- "HeaderBackups": "Backups",
- "HeaderChangePassword": "Change Password",
- "HeaderChapters": "Chapters",
- "HeaderChooseAFolder": "Choose a Folder",
- "HeaderCollection": "Collection",
- "HeaderCollectionItems": "Collection Items",
- "HeaderCover": "Cover",
- "HeaderCurrentDownloads": "Current Downloads",
- "HeaderDetails": "Details",
- "HeaderDownloadQueue": "Download Queue",
- "HeaderEbookFiles": "Ebook Files",
- "HeaderEmail": "Email",
- "HeaderEmailSettings": "Email Settings",
- "HeaderEpisodes": "Episodes",
- "HeaderEreaderDevices": "Ereader Devices",
- "HeaderEreaderSettings": "Ereader Settings",
- "HeaderFiles": "Files",
- "HeaderFindChapters": "Find Chapters",
- "HeaderIgnoredFiles": "Ignored Files",
- "HeaderItemFiles": "Item Files",
- "HeaderItemMetadataUtils": "Item Metadata Utils",
- "HeaderLastListeningSession": "Last Listening Session",
- "HeaderLatestEpisodes": "Latest episodes",
- "HeaderLibraries": "Libraries",
- "HeaderLibraryFiles": "Library Files",
- "HeaderLibraryStats": "Library Stats",
- "HeaderListeningSessions": "Listening Sessions",
- "HeaderListeningStats": "Listening Stats",
- "HeaderLogin": "Login",
- "HeaderLogs": "Logs",
- "HeaderManageGenres": "Manage Genres",
- "HeaderManageTags": "Manage Tags",
- "HeaderMapDetails": "Map details",
- "HeaderMatch": "Match",
- "HeaderMetadataToEmbed": "Metadata to embed",
- "HeaderNewAccount": "New Account",
- "HeaderNewLibrary": "New Library",
- "HeaderNotifications": "Notifications",
- "HeaderOpenRSSFeed": "Open RSS Feed",
- "HeaderOtherFiles": "Other Files",
- "HeaderPermissions": "Permissions",
- "HeaderPlayerQueue": "Player Queue",
- "HeaderPlaylist": "Playlist",
- "HeaderPlaylistItems": "Playlist Items",
- "HeaderPodcastsToAdd": "Podcasts to Add",
- "HeaderPreviewCover": "Preview Cover",
- "HeaderRemoveEpisode": "Remove Episode",
- "HeaderRemoveEpisodes": "Remove {0} Episodes",
- "HeaderRSSFeedGeneral": "RSS Details",
- "HeaderRSSFeedIsOpen": "RSS Feed is Open",
- "HeaderRSSFeeds": "RSS Feeds",
- "HeaderSavedMediaProgress": "Saved Media Progress",
- "HeaderSchedule": "Schedule",
- "HeaderScheduleLibraryScans": "Schedule Automatic Library Scans",
- "HeaderSession": "Session",
- "HeaderSetBackupSchedule": "Set Backup Schedule",
- "HeaderSettings": "Settings",
- "HeaderSettingsDisplay": "Display",
- "HeaderSettingsExperimental": "Experimental Features",
- "HeaderSettingsGeneral": "General",
- "HeaderSettingsScanner": "Scanner",
- "HeaderSleepTimer": "Sleep Timer",
- "HeaderStatsLargestItems": "Largest Items",
- "HeaderStatsLongestItems": "Longest Items (hrs)",
- "HeaderStatsMinutesListeningChart": "Minutes Listening (last 7 days)",
- "HeaderStatsRecentSessions": "Recent Sessions",
+ "HeaderAudiobookTools": "ઓડિયોબુક ફાઇલ વ્યવસ્થાપન ટૂલ્સ",
+ "HeaderAudioTracks": "ઓડિયો ટ્રેક્સ",
+ "HeaderAuthentication": "Authentication",
+ "HeaderBackups": "બેકઅપ્સ",
+ "HeaderChangePassword": "પાસવર્ડ બદલો",
+ "HeaderChapters": "પ્રકરણો",
+ "HeaderChooseAFolder": "ફોલ્ડર પસંદ કરો",
+ "HeaderCollection": "સંગ્રહ",
+ "HeaderCollectionItems": "સંગ્રહ વસ્તુઓ",
+ "HeaderCover": "આવરણ",
+ "HeaderCurrentDownloads": "વર્તમાન ડાઉનલોડ્સ",
+ "HeaderDetails": "વિગતો",
+ "HeaderDownloadQueue": "ડાઉનલોડ કતાર",
+ "HeaderEbookFiles": "ઇબુક ફાઇલો",
+ "HeaderEmail": "ઈમેલ",
+ "HeaderEmailSettings": "ઈમેલ સેટિંગ્સ",
+ "HeaderEpisodes": "એપિસોડ્સ",
+ "HeaderEreaderDevices": "ઇરીડર ઉપકરણો",
+ "HeaderEreaderSettings": "ઇરીડર સેટિંગ્સ",
+ "HeaderFiles": "ફાઇલો",
+ "HeaderFindChapters": "પ્રકરણો શોધો",
+ "HeaderIgnoredFiles": "અવગણેલી ફાઇલો",
+ "HeaderItemFiles": "વાસ્તુ ની ફાઈલો",
+ "HeaderItemMetadataUtils": "વસ્તુ મેટાડેટા સાધનો",
+ "HeaderLastListeningSession": "છેલ્લી સાંભળતી સેશન",
+ "HeaderLatestEpisodes": "નવીનતમ એપિસોડ્સ",
+ "HeaderLibraries": "પુસ્તકાલયો",
+ "HeaderLibraryFiles": "પુસ્તકાલય ફાઇલો",
+ "HeaderLibraryStats": "પુસ્તકાલય આંકડા",
+ "HeaderListeningSessions": "સાંભળતી સેશન્સ",
+ "HeaderListeningStats": "સાંભળતી આંકડા",
+ "HeaderLogin": "લોગિન",
+ "HeaderLogs": "લોગ્સ",
+ "HeaderManageGenres": "જાતિઓ મેનેજ કરો",
+ "HeaderManageTags": "ટેગ્સ મેનેજ કરો",
+ "HeaderMapDetails": "વિગતો મેપ કરો",
+ "HeaderMatch": "મેળ ખાતી શોધો",
+ "HeaderMetadataOrderOfPrecedence": "મેટાડેટા પ્રાધાન્યતાનો ક્રમ",
+ "HeaderMetadataToEmbed": "એમ્બેડ કરવા માટે મેટાડેટા",
+ "HeaderNewAccount": "નવું એકાઉન્ટ",
+ "HeaderNewLibrary": "નવી પુસ્તકાલય",
+ "HeaderNotifications": "સૂચનાઓ",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
+ "HeaderOpenRSSFeed": "RSS ફીડ ખોલો",
+ "HeaderOtherFiles": "અન્ય ફાઇલો",
+ "HeaderPasswordAuthentication": "Password Authentication",
+ "HeaderPermissions": "પરવાનગીઓ",
+ "HeaderPlayerQueue": "પ્લેયર કતાર",
+ "HeaderPlaylist": "પ્લેલિસ્ટ",
+ "HeaderPlaylistItems": "પ્લેલિસ્ટ ની વસ્તુઓ",
+ "HeaderPodcastsToAdd": "ઉમેરવા માટે પોડકાસ્ટ્સ",
+ "HeaderPreviewCover": "પૂર્વાવલોકન કવર",
+ "HeaderRemoveEpisode": "એપિસોડ કાઢી નાખો",
+ "HeaderRemoveEpisodes": "{0} એપિસોડ્સ કાઢી નાખો",
+ "HeaderRSSFeedGeneral": "સામાન્ય RSS ફીડ",
+ "HeaderRSSFeedIsOpen": "RSS ફીડ ખોલેલી છે",
+ "HeaderRSSFeeds": "RSS ફીડ્સ",
+ "HeaderSavedMediaProgress": "સાચવેલ મીડિયા પ્રગતિ",
+ "HeaderSchedule": "સમયપત્રક",
+ "HeaderScheduleLibraryScans": "પુસ્તકાલય સ્કેન સમયપત્રક",
+ "HeaderSession": "સેશન",
+ "HeaderSetBackupSchedule": "બેકઅપ સમયપત્રક સેટ કરો",
+ "HeaderSettings": "સેટિંગ્સ",
+ "HeaderSettingsDisplay": "ડિસ્પ્લે સેટિંગ્સ",
+ "HeaderSettingsExperimental": "પ્રયોગશીલ સેટિંગ્સ",
+ "HeaderSettingsGeneral": "સામાન્ય સેટિંગ્સ",
+ "HeaderSettingsScanner": "સ્કેનર સેટિંગ્સ",
+ "HeaderSleepTimer": "સ્લીપ ટાઈમર",
+ "HeaderStatsLargestItems": "સૌથી મોટી વસ્તુઓ",
+ "HeaderStatsLongestItems": "સૌથી લાંબી વસ્તુઓ (કલાક)",
+ "HeaderStatsMinutesListeningChart": "સાંભળવાની મિનિટ (છેલ્લા ૭ દિવસ)",
+ "HeaderStatsRecentSessions": "છેલ્લી સાંભળતી સેશન્સ",
"HeaderStatsTop10Authors": "Top 10 Authors",
"HeaderStatsTop5Genres": "Top 5 Genres",
"HeaderTableOfContents": "Table of Contents",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Add {0} Books to Collection",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAddToPlaylistBatch": "Add {0} Items to Playlist",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "All",
"LabelAllUsers": "All Users",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Already in your library",
"LabelAppend": "Append",
"LabelAuthor": "Author",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Author (Last, First)",
"LabelAuthors": "Authors",
"LabelAutoDownloadEpisodes": "Auto Download Episodes",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Back to User",
"LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Enable automatic backups",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Only 1 backup will be removed at a time so if you already have more backups than this you should manually remove them.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Books",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Change Password",
"LabelChannels": "Channels",
"LabelChapters": "Chapters",
"LabelChaptersFound": "chapters found",
"LabelChapterTitle": "Chapter Title",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Close player",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Collapse Series",
@@ -218,10 +240,12 @@
"LabelCurrently": "Currently:",
"LabelCustomCronExpression": "Custom Cron Expression:",
"LabelDatetime": "Datetime",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Description",
"LabelDeselectAll": "Deselect All",
"LabelDevice": "Device",
"LabelDeviceInfo": "Device Info",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Directory",
"LabelDiscFromFilename": "Disc from Filename",
"LabelDiscFromMetadata": "Disc from Metadata",
@@ -247,6 +271,7 @@
"LabelExample": "Example",
"LabelExplicit": "Explicit",
"LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "File",
"LabelFileBirthtime": "File Birthtime",
"LabelFileModified": "File Modified",
@@ -256,6 +281,7 @@
"LabelFinished": "Finished",
"LabelFolder": "Folder",
"LabelFolders": "Folders",
+ "LabelFontFamily": "ફોન્ટ કુટુંબ",
"LabelFontScale": "Font scale",
"LabelFormat": "Format",
"LabelGenre": "Genre",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Hard delete file",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Hour",
"LabelIcon": "Icon",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Include in Tracklist",
"LabelIncomplete": "Incomplete",
"LabelInProgress": "In Progress",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Look for new episodes after this date",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Media Player",
"LabelMediaType": "Media Type",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Metadata Provider",
"LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minute",
"LabelMissing": "Missing",
"LabelMissingParts": "Missing Parts",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "More",
"LabelMoreInfo": "More Info",
"LabelName": "Name",
@@ -372,6 +406,7 @@
"LabelRegion": "Region",
"LabelReleaseDate": "Release Date",
"LabelRemoveCover": "Remove cover",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedOpen": "RSS Feed Open",
@@ -384,6 +419,7 @@
"LabelSeason": "Season",
"LabelSelectAllEpisodes": "Select all episodes",
"LabelSelectEpisodesShowing": "Select {0} episodes showing",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Send Ebook to...",
"LabelSequence": "Sequence",
"LabelSeries": "Series",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
"LabelSettingsHomePageBookshelfView": "Home page use bookshelf view",
"LabelSettingsLibraryBookshelfView": "Library use bookshelf view",
- "LabelSettingsOverdriveMediaMarkers": "Use Overdrive Media Markers for chapters",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3 files from Overdrive come with chapter timings embedded as custom metadata. Enabling this will use these tags for chapter timings automatically",
"LabelSettingsParseSubtitles": "Parse subtitles",
"LabelSettingsParseSubtitlesHelp": "Extract subtitles from audiobook folder names.
Subtitle must be seperated by \" - \"
i.e. \"Book Title - A Subtitle Here\" has the subtitle \"A Subtitle Here\"",
- "LabelSettingsPreferAudioMetadata": "Prefer audio metadata",
- "LabelSettingsPreferAudioMetadataHelp": "Audio file ID3 meta tags will be used for book details over folder names",
"LabelSettingsPreferMatchedMetadata": "Prefer matched metadata",
"LabelSettingsPreferMatchedMetadataHelp": "Matched data will overide item details when using Quick Match. By default Quick Match will only fill in missing details.",
- "LabelSettingsPreferOPFMetadata": "Prefer OPF metadata",
- "LabelSettingsPreferOPFMetadataHelp": "OPF file metadata will be used for book details over folder names",
"LabelSettingsSkipMatchingBooksWithASIN": "Skip matching books that already have an ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Skip matching books that already have an ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignore prefixes when sorting",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Store covers with item",
"LabelSettingsStoreCoversWithItemHelp": "By default covers are stored in /metadata/items, enabling this setting will store covers in your library item folder. Only one file named \"cover\" will be kept",
"LabelSettingsStoreMetadataWithItem": "Store metadata with item",
- "LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders. Uses .abs file extension",
+ "LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders",
"LabelSettingsTimeFormat": "Time Format",
"LabelShowAll": "Show All",
"LabelSize": "Size",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Allow overwriting of existing details for the selected books when a match is located",
"LabelUploaderDragAndDrop": "Drag & drop files or folders",
"LabelUploaderDropFiles": "Drop files",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Use chapter track",
"LabelUseFullTrack": "Use full track",
"LabelUser": "User",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?",
"MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?",
"MessageConfirmDeleteLibrary": "Are you sure you want to permanently delete library \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Are you sure you want to delete this session?",
"MessageConfirmForceReScan": "Are you sure you want to force re-scan?",
"MessageConfirmMarkAllEpisodesFinished": "Are you sure you want to mark all episodes as finished?",
"MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?",
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Are you sure you want to remove narrator \"{0}\"?",
"MessageConfirmRemovePlaylist": "Are you sure you want to remove your playlist \"{0}\"?",
"MessageConfirmRenameGenre": "Are you sure you want to rename genre \"{0}\" to \"{1}\" for all items?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Are you sure you want to rename tag \"{0}\" to \"{1}\" for all items?",
"MessageConfirmRenameTagMergeNote": "Note: This tag already exists so they will be merged.",
"MessageConfirmRenameTagWarning": "Warning! A similar tag with a different casing already exists \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Are you sure you want to send {0} ebook \"{1}\" to device \"{2}\"?",
"MessageDownloadingEpisode": "Downloading episode",
"MessageDragFilesIntoTrackOrder": "Drag files into correct track order",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Are you sure you want to restore the backup created on",
"MessageRestoreBackupWarning": "Restoring a backup will overwrite the entire database located at /config and cover images in /metadata/items & /metadata/authors.
Backups do not modify any files in your library folders. If you have enabled server settings to store cover art and metadata in your library folders then those are not backed up or overwritten.
All clients using your server will be automatically refreshed.",
"MessageSearchResultsFor": "Search results for",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Server could not be reached",
"MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name",
"MessageStartPlaybackAtTime": "Start playback for \"{0}\" at {1}?",
diff --git a/client/strings/hi.json b/client/strings/hi.json
index 20120e9a..e7ec6155 100644
--- a/client/strings/hi.json
+++ b/client/strings/hi.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "जोड़ें",
"ButtonAddChapters": "अध्याय जोड़ें",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "पॉडकास्ट जोड़ें",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "अपनी पहली पुस्तकालय जोड़ें",
"ButtonApply": "लागू करें",
"ButtonApplyChapters": "अध्यायों में परिवर्तन लागू करें",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "इस सीरीज को कंटिन्यू सीरीज से हटा दें",
"ButtonReScan": "पुन: स्कैन करें",
"ButtonReset": "रीसेट करें",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "पुनर्स्थापित करें",
"ButtonSave": "सहेजें",
"ButtonSaveAndClose": "सहेजें और बंद करें",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "उपयोगकर्ता {0} को संपादित करें",
"ButtonViewAll": "सभी को देखें",
"ButtonYes": "हाँ",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "खाता",
"HeaderAdvanced": "विकसित",
"HeaderAppriseNotificationSettings": "Apprise अधिसूचना सेटिंग्स",
"HeaderAudiobookTools": "Audiobook File Management Tools",
"HeaderAudioTracks": "Audio Tracks",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Backups",
"HeaderChangePassword": "Change Password",
"HeaderChapters": "Chapters",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Manage Tags",
"HeaderMapDetails": "Map details",
"HeaderMatch": "Match",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Metadata to embed",
"HeaderNewAccount": "New Account",
"HeaderNewLibrary": "New Library",
"HeaderNotifications": "Notifications",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Open RSS Feed",
"HeaderOtherFiles": "Other Files",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Permissions",
"HeaderPlayerQueue": "Player Queue",
"HeaderPlaylist": "Playlist",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Add {0} Books to Collection",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAddToPlaylistBatch": "Add {0} Items to Playlist",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "All",
"LabelAllUsers": "All Users",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Already in your library",
"LabelAppend": "Append",
"LabelAuthor": "Author",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Author (Last, First)",
"LabelAuthors": "Authors",
"LabelAutoDownloadEpisodes": "Auto Download Episodes",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Back to User",
"LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Enable automatic backups",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Only 1 backup will be removed at a time so if you already have more backups than this you should manually remove them.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Books",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Change Password",
"LabelChannels": "Channels",
"LabelChapters": "Chapters",
"LabelChaptersFound": "chapters found",
"LabelChapterTitle": "Chapter Title",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Close player",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Collapse Series",
@@ -218,10 +240,12 @@
"LabelCurrently": "Currently:",
"LabelCustomCronExpression": "Custom Cron Expression:",
"LabelDatetime": "Datetime",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Description",
"LabelDeselectAll": "Deselect All",
"LabelDevice": "Device",
"LabelDeviceInfo": "Device Info",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Directory",
"LabelDiscFromFilename": "Disc from Filename",
"LabelDiscFromMetadata": "Disc from Metadata",
@@ -247,6 +271,7 @@
"LabelExample": "Example",
"LabelExplicit": "Explicit",
"LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "File",
"LabelFileBirthtime": "File Birthtime",
"LabelFileModified": "File Modified",
@@ -256,6 +281,7 @@
"LabelFinished": "Finished",
"LabelFolder": "Folder",
"LabelFolders": "Folders",
+ "LabelFontFamily": "फुहारा परिवार",
"LabelFontScale": "Font scale",
"LabelFormat": "Format",
"LabelGenre": "Genre",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Hard delete file",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Hour",
"LabelIcon": "Icon",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Include in Tracklist",
"LabelIncomplete": "Incomplete",
"LabelInProgress": "In Progress",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Look for new episodes after this date",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Media Player",
"LabelMediaType": "Media Type",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Metadata Provider",
"LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minute",
"LabelMissing": "Missing",
"LabelMissingParts": "Missing Parts",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "More",
"LabelMoreInfo": "More Info",
"LabelName": "Name",
@@ -372,6 +406,7 @@
"LabelRegion": "Region",
"LabelReleaseDate": "Release Date",
"LabelRemoveCover": "Remove cover",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedOpen": "RSS Feed Open",
@@ -384,6 +419,7 @@
"LabelSeason": "Season",
"LabelSelectAllEpisodes": "Select all episodes",
"LabelSelectEpisodesShowing": "Select {0} episodes showing",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Send Ebook to...",
"LabelSequence": "Sequence",
"LabelSeries": "Series",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
"LabelSettingsHomePageBookshelfView": "Home page use bookshelf view",
"LabelSettingsLibraryBookshelfView": "Library use bookshelf view",
- "LabelSettingsOverdriveMediaMarkers": "Use Overdrive Media Markers for chapters",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3 files from Overdrive come with chapter timings embedded as custom metadata. Enabling this will use these tags for chapter timings automatically",
"LabelSettingsParseSubtitles": "Parse subtitles",
"LabelSettingsParseSubtitlesHelp": "Extract subtitles from audiobook folder names.
Subtitle must be seperated by \" - \"
i.e. \"Book Title - A Subtitle Here\" has the subtitle \"A Subtitle Here\"",
- "LabelSettingsPreferAudioMetadata": "Prefer audio metadata",
- "LabelSettingsPreferAudioMetadataHelp": "Audio file ID3 meta tags will be used for book details over folder names",
"LabelSettingsPreferMatchedMetadata": "Prefer matched metadata",
"LabelSettingsPreferMatchedMetadataHelp": "Matched data will overide item details when using Quick Match. By default Quick Match will only fill in missing details.",
- "LabelSettingsPreferOPFMetadata": "Prefer OPF metadata",
- "LabelSettingsPreferOPFMetadataHelp": "OPF file metadata will be used for book details over folder names",
"LabelSettingsSkipMatchingBooksWithASIN": "Skip matching books that already have an ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Skip matching books that already have an ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignore prefixes when sorting",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Store covers with item",
"LabelSettingsStoreCoversWithItemHelp": "By default covers are stored in /metadata/items, enabling this setting will store covers in your library item folder. Only one file named \"cover\" will be kept",
"LabelSettingsStoreMetadataWithItem": "Store metadata with item",
- "LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders. Uses .abs file extension",
+ "LabelSettingsStoreMetadataWithItemHelp": "By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders",
"LabelSettingsTimeFormat": "Time Format",
"LabelShowAll": "Show All",
"LabelSize": "Size",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Allow overwriting of existing details for the selected books when a match is located",
"LabelUploaderDragAndDrop": "Drag & drop files or folders",
"LabelUploaderDropFiles": "Drop files",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Use chapter track",
"LabelUseFullTrack": "Use full track",
"LabelUser": "User",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?",
"MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?",
"MessageConfirmDeleteLibrary": "Are you sure you want to permanently delete library \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Are you sure you want to delete this session?",
"MessageConfirmForceReScan": "Are you sure you want to force re-scan?",
"MessageConfirmMarkAllEpisodesFinished": "Are you sure you want to mark all episodes as finished?",
"MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?",
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Are you sure you want to remove narrator \"{0}\"?",
"MessageConfirmRemovePlaylist": "Are you sure you want to remove your playlist \"{0}\"?",
"MessageConfirmRenameGenre": "Are you sure you want to rename genre \"{0}\" to \"{1}\" for all items?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Are you sure you want to rename tag \"{0}\" to \"{1}\" for all items?",
"MessageConfirmRenameTagMergeNote": "Note: This tag already exists so they will be merged.",
"MessageConfirmRenameTagWarning": "Warning! A similar tag with a different casing already exists \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Are you sure you want to send {0} ebook \"{1}\" to device \"{2}\"?",
"MessageDownloadingEpisode": "Downloading episode",
"MessageDragFilesIntoTrackOrder": "Drag files into correct track order",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Are you sure you want to restore the backup created on",
"MessageRestoreBackupWarning": "Restoring a backup will overwrite the entire database located at /config and cover images in /metadata/items & /metadata/authors.
Backups do not modify any files in your library folders. If you have enabled server settings to store cover art and metadata in your library folders then those are not backed up or overwritten.
All clients using your server will be automatically refreshed.",
"MessageSearchResultsFor": "Search results for",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Server could not be reached",
"MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name",
"MessageStartPlaybackAtTime": "Start playback for \"{0}\" at {1}?",
diff --git a/client/strings/hr.json b/client/strings/hr.json
index 3d217a2c..edefcf53 100644
--- a/client/strings/hr.json
+++ b/client/strings/hr.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Dodaj",
"ButtonAddChapters": "Dodaj poglavlja",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "Dodaj podcaste",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "Dodaj svoju prvu biblioteku",
"ButtonApply": "Primijeni",
"ButtonApplyChapters": "Primijeni poglavlja",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Ukloni seriju iz Nastavi seriju",
"ButtonReScan": "Skeniraj ponovno",
"ButtonReset": "Poništi",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "Povrati",
"ButtonSave": "Spremi",
"ButtonSaveAndClose": "Spremi i zatvori",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Edit user {0}",
"ButtonViewAll": "Prikaži sve",
"ButtonYes": "Da",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Korisnički račun",
"HeaderAdvanced": "Napredno",
"HeaderAppriseNotificationSettings": "Apprise Notification Settings",
"HeaderAudiobookTools": "Audiobook File Management alati",
"HeaderAudioTracks": "Audio Tracks",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Backups",
"HeaderChangePassword": "Promijeni lozinku",
"HeaderChapters": "Poglavlja",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Manage Tags",
"HeaderMapDetails": "Map details",
"HeaderMatch": "Match",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Metapodatci za ugradnju",
"HeaderNewAccount": "Novi korisnički račun",
"HeaderNewLibrary": "Nova biblioteka",
"HeaderNotifications": "Obavijesti",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Otvori RSS Feed",
"HeaderOtherFiles": "Druge datoteke",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Dozvole",
"HeaderPlayerQueue": "Player Queue",
"HeaderPlaylist": "Playlist",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Add {0} Books to Collection",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAddToPlaylistBatch": "Add {0} Items to Playlist",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "All",
"LabelAllUsers": "Svi korisnici",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Already in your library",
"LabelAppend": "Append",
"LabelAuthor": "Autor",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Author (Last, First)",
"LabelAuthors": "Autori",
"LabelAutoDownloadEpisodes": "Automatski preuzmi epizode",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Nazad k korisniku",
"LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Uključi automatski backup",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Samo 1 backup će biti odjednom obrisan. Ako koristite više njih, morati ćete ih ručno ukloniti.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Knjige",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Promijeni lozinku",
"LabelChannels": "Channels",
"LabelChapters": "Chapters",
"LabelChaptersFound": "poglavlja pronađena",
"LabelChapterTitle": "Ime poglavlja",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Close player",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Collapse Series",
@@ -218,10 +240,12 @@
"LabelCurrently": "Trenutno:",
"LabelCustomCronExpression": "Custom Cron Expression:",
"LabelDatetime": "Datetime",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Opis",
"LabelDeselectAll": "Odznači sve",
"LabelDevice": "Uređaj",
"LabelDeviceInfo": "O uređaju",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Direktorij",
"LabelDiscFromFilename": "CD iz imena datoteke",
"LabelDiscFromMetadata": "CD iz metapodataka",
@@ -247,6 +271,7 @@
"LabelExample": "Example",
"LabelExplicit": "Explicit",
"LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "Datoteka",
"LabelFileBirthtime": "File Birthtime",
"LabelFileModified": "File Modified",
@@ -256,6 +281,7 @@
"LabelFinished": "Finished",
"LabelFolder": "Folder",
"LabelFolders": "Folderi",
+ "LabelFontFamily": "Font family",
"LabelFontScale": "Font scale",
"LabelFormat": "Format",
"LabelGenre": "Genre",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Obriši datoteku zauvijek",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Sat",
"LabelIcon": "Ikona",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Dodaj u Tracklist",
"LabelIncomplete": "Nepotpuno",
"LabelInProgress": "U tijeku",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Traži nove epizode nakon ovog datuma",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Media Player",
"LabelMediaType": "Media Type",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Poslužitelj metapodataka ",
"LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minuta",
"LabelMissing": "Nedostaje",
"LabelMissingParts": "Nedostajali dijelovi",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "Više",
"LabelMoreInfo": "More Info",
"LabelName": "Ime",
@@ -372,6 +406,7 @@
"LabelRegion": "Regija",
"LabelReleaseDate": "Datum izlaska",
"LabelRemoveCover": "Remove cover",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedOpen": "RSS Feed Open",
@@ -384,6 +419,7 @@
"LabelSeason": "Sezona",
"LabelSelectAllEpisodes": "Select all episodes",
"LabelSelectEpisodesShowing": "Select {0} episodes showing",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Send Ebook to...",
"LabelSequence": "Sekvenca",
"LabelSeries": "Serije",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
"LabelSettingsHomePageBookshelfView": "Koristi bookshelf pogled za početnu stranicu",
"LabelSettingsLibraryBookshelfView": "Koristi bookshelf pogled za biblioteku",
- "LabelSettingsOverdriveMediaMarkers": "Koristi Overdrive Media Markers za poglavlja",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3 datoteke iz Overdriva dolaze sa vremenima od poglavlja embedani kao posebni metapodatci. Ova postavka će koristiti tagove za vremena od poglavlja automatski.",
"LabelSettingsParseSubtitles": "Parsaj podnapise",
"LabelSettingsParseSubtitlesHelp": "Izvadi podnapise iz imena od audiobook foldera.
Podnapis mora biti odvojen sa \" - \"
npr. \"Ime knjige - Podnapis ovdje\" ima podnapis \"Podnapis ovdje\"",
- "LabelSettingsPreferAudioMetadata": "Preferiraj audio metapodatke",
- "LabelSettingsPreferAudioMetadataHelp": "Audio file ID3 meta tagovi u audio datoteci će biti korišteni za detalje knjige.",
"LabelSettingsPreferMatchedMetadata": "Preferiraj matchane metapodatke",
"LabelSettingsPreferMatchedMetadataHelp": "Matchani podatci će biti korišteni kada se koristi Quick Match. Po defaultu Quick Match će ispuniti samo prazne detalje.",
- "LabelSettingsPreferOPFMetadata": "Preferiraj OPF metapodatke",
- "LabelSettingsPreferOPFMetadataHelp": "OPF metapodatci datoteke će biti korišteni za detalje knjige.",
"LabelSettingsSkipMatchingBooksWithASIN": "Preskoči matchanje knjiga koje već imaju ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "SPreskoči matchanje knjiga koje već imaju ISBN",
"LabelSettingsSortingIgnorePrefixes": "Zanemari prefikse tokom sortiranja",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Spremi cover uz stakvu",
"LabelSettingsStoreCoversWithItemHelp": "By default covers are stored in /metadata/items, enabling this setting will store covers in your library item folder. Only one file named \"cover\" will be kept",
"LabelSettingsStoreMetadataWithItem": "Spremi metapodatke uz stavku",
- "LabelSettingsStoreMetadataWithItemHelp": "Po defaultu metapodatci su spremljeni u /metadata/items, uključujućite li ovu postavku, metapodatci će biti spremljeni u folderima od biblioteke. Koristi .abs ekstenziju.",
+ "LabelSettingsStoreMetadataWithItemHelp": "Po defaultu metapodatci su spremljeni u /metadata/items, uključujućite li ovu postavku, metapodatci će biti spremljeni u folderima od biblioteke",
"LabelSettingsTimeFormat": "Time Format",
"LabelShowAll": "Prikaži sve",
"LabelSize": "Veličina",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Dozvoli postavljanje novih detalja za odabrane knjige nakon što je match pronađen",
"LabelUploaderDragAndDrop": "Drag & Drop datoteke ili foldere",
"LabelUploaderDropFiles": "Ubaci datoteke",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Koristi poglavlja track",
"LabelUseFullTrack": "Koristi cijeli track",
"LabelUser": "Korisnik",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Jeste li sigurni da želite obrisati backup za {0}?",
"MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?",
"MessageConfirmDeleteLibrary": "Jeste li sigurni da želite trajno obrisati biblioteku \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Jeste li sigurni da želite obrisati ovu sesiju?",
"MessageConfirmForceReScan": "Jeste li sigurni da želite ponovno skenirati?",
"MessageConfirmMarkAllEpisodesFinished": "Are you sure you want to mark all episodes as finished?",
"MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?",
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "AJeste li sigurni da želite obrisati kolekciju \"{0}\"?",
"MessageConfirmRemoveEpisode": "Jeste li sigurni da želite obrisati epizodu \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Jeste li sigurni da želite obrisati {0} epizoda/-u?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Are you sure you want to remove narrator \"{0}\"?",
"MessageConfirmRemovePlaylist": "Are you sure you want to remove your playlist \"{0}\"?",
"MessageConfirmRenameGenre": "Are you sure you want to rename genre \"{0}\" to \"{1}\" for all items?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Are you sure you want to rename tag \"{0}\" to \"{1}\" for all items?",
"MessageConfirmRenameTagMergeNote": "Note: This tag already exists so they will be merged.",
"MessageConfirmRenameTagWarning": "Warning! A similar tag with a different casing already exists \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Are you sure you want to send {0} ebook \"{1}\" to device \"{2}\"?",
"MessageDownloadingEpisode": "Preuzimam epizodu",
"MessageDragFilesIntoTrackOrder": "Povuci datoteke u pravilan redoslijed tracka.",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Jeste li sigurni da želite povratiti backup kreiran",
"MessageRestoreBackupWarning": "Povračanje backupa će zamijeniti postoječu bazu podataka u /config i slike covera u /metadata/items i /metadata/authors.
Backups ne modificiraju nikakve datoteke u folderu od biblioteke. Ako imate uključene server postavke da spremate cover i metapodtake u folderu od biblioteke, onda oni neće biti backupani ili overwritten.
Svi klijenti koji koriste tvoj server će biti automatski osvježeni.",
"MessageSearchResultsFor": "Traži rezultate za",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Server ne može biti kontaktiran",
"MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name",
"MessageStartPlaybackAtTime": "Pokreni reprodukciju za \"{0}\" na {1}?",
diff --git a/client/strings/it.json b/client/strings/it.json
index cb418bfb..0860e83f 100644
--- a/client/strings/it.json
+++ b/client/strings/it.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Aggiungi",
"ButtonAddChapters": "Aggiungi Capitoli",
+ "ButtonAddDevice": "Aggiungi Dispositivo",
+ "ButtonAddLibrary": "Aggiungi Libreria",
"ButtonAddPodcasts": "Aggiungi Podcast",
+ "ButtonAddUser": "Aggiungi User",
"ButtonAddYourFirstLibrary": "Aggiungi la tua prima libreria",
"ButtonApply": "Applica",
"ButtonApplyChapters": "Applica",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Rimuovi la Serie per Continuarla",
"ButtonReScan": "Ri-scansiona",
"ButtonReset": "Reset",
+ "ButtonResetToDefault": "Ripristino di default",
"ButtonRestore": "Ripristina",
"ButtonSave": "Salva",
"ButtonSaveAndClose": "Salva & Chiudi",
@@ -71,7 +75,7 @@
"ButtonSetChaptersFromTracks": "Impostare i capitoli dalle tracce",
"ButtonShiftTimes": "Ricerca veloce",
"ButtonShow": "Mostra",
- "ButtonStartM4BEncode": "Inizia L'Encoda del M4B",
+ "ButtonStartM4BEncode": "Inizia L'Encode del M4B",
"ButtonStartMetadataEmbed": "Inizia Incorporo Metadata",
"ButtonSubmit": "Invia",
"ButtonTest": "Test",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Modifica Utente {0}",
"ButtonViewAll": "Mostra Tutto",
"ButtonYes": "Si",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Account",
"HeaderAdvanced": "Avanzate",
"HeaderAppriseNotificationSettings": "Apprendi le impostazioni di Notifica",
"HeaderAudiobookTools": "Utilità Audiobook File Management",
"HeaderAudioTracks": "Tracce Audio",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Backup",
"HeaderChangePassword": "Cambia Password",
"HeaderChapters": "Capitoli",
@@ -98,7 +106,7 @@
"HeaderCurrentDownloads": "Download Correnti",
"HeaderDetails": "Dettagli",
"HeaderDownloadQueue": "Download Queue",
- "HeaderEbookFiles": "Ebook Files",
+ "HeaderEbookFiles": "Ebook File",
"HeaderEmail": "Email",
"HeaderEmailSettings": "Email Settings",
"HeaderEpisodes": "Episodi",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Gestisci Tags",
"HeaderMapDetails": "Mappa Dettagli",
"HeaderMatch": "Trova Corrispondenza",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Metadata da incorporare",
"HeaderNewAccount": "Nuovo Account",
"HeaderNewLibrary": "Nuova Libreria",
"HeaderNotifications": "Notifiche",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Apri RSS Feed",
"HeaderOtherFiles": "Altri File",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Permessi",
"HeaderPlayerQueue": "Coda Riproduzione",
"HeaderPlaylist": "Playlist",
@@ -156,7 +167,7 @@
"HeaderStatsRecentSessions": "Sessioni Recenti",
"HeaderStatsTop10Authors": "Top 10 Autori",
"HeaderStatsTop5Genres": "Top 5 Generi",
- "HeaderTableOfContents": "Tabellla dei Contenuti",
+ "HeaderTableOfContents": "Tabella dei Contenuti",
"HeaderTools": "Strumenti",
"HeaderUpdateAccount": "Aggiorna Account",
"HeaderUpdateAuthor": "Aggiorna Autore",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Aggiungi {0} Libri alla Raccolta",
"LabelAddToPlaylist": "aggiungi alla Playlist",
"LabelAddToPlaylistBatch": "Aggiungi {0} file alla Playlist",
+ "LabelAdminUsersOnly": "Solo utenti Amministratori",
"LabelAll": "Tutti",
"LabelAllUsers": "Tutti gli Utenti",
+ "LabelAllUsersExcludingGuests": "Tutti gli Utenti Esclusi gli ospiti",
+ "LabelAllUsersIncludingGuests": "Tutti gli Utenti Inclusi gli ospiti",
"LabelAlreadyInYourLibrary": "Già esistente nella libreria",
"LabelAppend": "Appese",
"LabelAuthor": "Autore",
@@ -185,8 +199,14 @@
"LabelAuthorLastFirst": "Autori (Per Cognome)",
"LabelAuthors": "Autori",
"LabelAutoDownloadEpisodes": "Auto Download Episodi",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Torna a Utenti",
- "LabelBackupLocation": "Backup Location",
+ "LabelBackupLocation": "Percorso del Backup",
"LabelBackupsEnableAutomaticBackups": "Abilita backup Automatico",
"LabelBackupsEnableAutomaticBackupsHelp": "I Backup saranno salvati in /metadata/backups",
"LabelBackupsMaxBackupSize": "Dimensione massima backup (in GB)",
@@ -195,15 +215,17 @@
"LabelBackupsNumberToKeepHelp": "Verrà rimosso solo 1 backup alla volta, quindi se hai più backup, dovrai rimuoverli manualmente.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Libri",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Cambia Password",
"LabelChannels": "Canali",
"LabelChapters": "Capitoli",
"LabelChaptersFound": "Capitoli Trovati",
"LabelChapterTitle": "Titoli dei Capitoli",
+ "LabelClickForMoreInfo": "Click per altre Info",
"LabelClosePlayer": "Chiudi player",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Comprimi Serie",
- "LabelCollection": "Collection",
+ "LabelCollection": "Raccolta",
"LabelCollections": "Raccolte",
"LabelComplete": "Completo",
"LabelConfirmPassword": "Conferma Password",
@@ -211,21 +233,23 @@
"LabelContinueReading": "Continua la Lettura",
"LabelContinueSeries": "Continua Serie",
"LabelCover": "Cover",
- "LabelCoverImageURL": "Cover Image URL",
+ "LabelCoverImageURL": "Indirizzo della cover URL",
"LabelCreatedAt": "Creato A",
"LabelCronExpression": "Espressione Cron",
"LabelCurrent": "Attuale",
"LabelCurrently": "Attualmente:",
- "LabelCustomCronExpression": "Custom Cron Expression:",
+ "LabelCustomCronExpression": "Espressione Cron personalizzata:",
"LabelDatetime": "Data & Ora",
+ "LabelDeleteFromFileSystemCheckbox": "Elimina dal file system (togli la spunta per eliminarla solo dal DB)",
"LabelDescription": "Descrizione",
"LabelDeselectAll": "Deseleziona Tutto",
"LabelDevice": "Dispositivo",
"LabelDeviceInfo": "Info Dispositivo",
+ "LabelDeviceIsAvailableTo": "Il dispositivo e disponibile su...",
"LabelDirectory": "Elenco",
"LabelDiscFromFilename": "Disco dal nome file",
"LabelDiscFromMetadata": "Disco dal Metadata",
- "LabelDiscover": "Discover",
+ "LabelDiscover": "Scopri",
"LabelDownload": "Download",
"LabelDownloadNEpisodes": "Download {0} episodes",
"LabelDuration": "Durata",
@@ -247,6 +271,7 @@
"LabelExample": "Esempio",
"LabelExplicit": "Esplicito",
"LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "File",
"LabelFileBirthtime": "Data Creazione",
"LabelFileModified": "Ultima modifica",
@@ -256,6 +281,7 @@
"LabelFinished": "Finita",
"LabelFolder": "Cartella",
"LabelFolders": "Cartelle",
+ "LabelFontFamily": "Font family",
"LabelFontScale": "Dimensione Font",
"LabelFormat": "Formato",
"LabelGenre": "Genere",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Elimina Definitivamente",
"LabelHasEbook": "Un ebook",
"LabelHasSupplementaryEbook": "Un ebook Supplementare",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Ora",
"LabelIcon": "Icona",
+ "LabelImageURLFromTheWeb": "Immagine URL da internet",
"LabelIncludeInTracklist": "Includi nella Tracklist",
"LabelIncomplete": "Incompleta",
"LabelInProgress": "In Corso",
@@ -290,27 +318,33 @@
"LabelLastUpdate": "Ultimo Aggiornamento",
"LabelLayout": "Layout",
"LabelLayoutSinglePage": "Pagina Singola",
- "LabelLayoutSplitPage": "DIvidi Pagina",
+ "LabelLayoutSplitPage": "Dividi Pagina",
"LabelLess": "Poco",
"LabelLibrariesAccessibleToUser": "Librerie Accessibili agli Utenti",
"LabelLibrary": "Libreria",
"LabelLibraryItem": "Elementi della Library",
"LabelLibraryName": "Nome Libreria",
"LabelLimit": "Limiti",
- "LabelLineSpacing": "Line spacing",
+ "LabelLineSpacing": "Interlinea",
"LabelListenAgain": "Ri-ascolta",
"LabelLogLevelDebug": "Debug",
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Allarme",
"LabelLookForNewEpisodesAfterDate": "Cerca nuovi episodi dopo questa data",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Media Player",
"LabelMediaType": "Tipo Media",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Metadata Provider",
"LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minuto",
"LabelMissing": "Altro",
"LabelMissingParts": "Parti rimantenti",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "Molto",
"LabelMoreInfo": "Più Info",
"LabelName": "Nome",
@@ -372,6 +406,7 @@
"LabelRegion": "Regione",
"LabelReleaseDate": "Data Release",
"LabelRemoveCover": "Rimuovi cover",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Email del proprietario personalizzato",
"LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato",
"LabelRSSFeedOpen": "RSS Feed Aperto",
@@ -384,6 +419,7 @@
"LabelSeason": "Stagione",
"LabelSelectAllEpisodes": "Seleziona tutti gli Episodi",
"LabelSelectEpisodesShowing": "Episodi {0} selezionati ",
+ "LabelSelectUsers": "Selezione Utenti",
"LabelSendEbookToDevice": "Invia ebook a...",
"LabelSequence": "Sequenza",
"LabelSeries": "Serie",
@@ -399,9 +435,9 @@
"LabelSettingsDisableWatcher": "Disattiva Watcher",
"LabelSettingsDisableWatcherForLibrary": "Disattiva Watcher per le librerie",
"LabelSettingsDisableWatcherHelp": "Disattiva il controllo automatico libri nelle cartelle delle librerie. *Richiede il Riavvio del Server",
- "LabelSettingsEnableWatcher": "Enable Watcher",
- "LabelSettingsEnableWatcherForLibrary": "Enable folder watcher for library",
- "LabelSettingsEnableWatcherHelp": "Enables the automatic adding/updating of items when file changes are detected. *Requires server restart",
+ "LabelSettingsEnableWatcher": "Abilita Watcher",
+ "LabelSettingsEnableWatcherForLibrary": "Abilita il controllo cartelle per la libreria",
+ "LabelSettingsEnableWatcherHelp": "Abilita l'aggiunta/aggiornamento automatico degli elementi quando vengono rilevate modifiche ai file. *Richiede il riavvio del Server",
"LabelSettingsExperimentalFeatures": "Opzioni Sperimentali",
"LabelSettingsExperimentalFeaturesHelp": "Funzionalità in fase di sviluppo che potrebbero utilizzare i tuoi feedback e aiutare i test. Fare clic per aprire la discussione github.",
"LabelSettingsFindCovers": "Trova covers",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Le serie che hanno un solo libro saranno nascoste dalla pagina della serie e dagli scaffali della home page.",
"LabelSettingsHomePageBookshelfView": "Home page con sfondo legno",
"LabelSettingsLibraryBookshelfView": "Libreria con sfondo legno",
- "LabelSettingsOverdriveMediaMarkers": "Usa Overdrive Media Markers per i capitoli",
- "LabelSettingsOverdriveMediaMarkersHelp": "I file MP3 di Overdrive vengono forniti con i tempi dei capitoli incorporati come metadati personalizzati. Abilitando questa funzione verranno utilizzati automaticamente questi tag per i tempi dei capitoli",
"LabelSettingsParseSubtitles": "Analizza sottotitoli",
"LabelSettingsParseSubtitlesHelp": "Estrai i sottotitoli dai nomi delle cartelle degli audiolibri.
I sottotitoli devono essere separati da \" - \"
Per esempio \"Il signore degli anelli - Le due Torri \" avrà il sottotitolo \"Le due Torri\"",
- "LabelSettingsPreferAudioMetadata": "Preferisci i metadati audio",
- "LabelSettingsPreferAudioMetadataHelp": "I meta tag ID3 del file audio verrano preferiti rispetto al nome della cartella",
"LabelSettingsPreferMatchedMetadata": "Preferisci i metadata trovati",
"LabelSettingsPreferMatchedMetadataHelp": "I dati trovati in internet sovrascriveranno i dettagli del libro quando si utilizza quick Match. Per impostazione predefinita, Quick Match riempirà solo i dettagli mancanti.",
- "LabelSettingsPreferOPFMetadata": "Preferisci OPF metadata",
- "LabelSettingsPreferOPFMetadataHelp": "I metadati del file OPF verranno utilizzati per i dettagli del libro e non il nome della cartella",
"LabelSettingsSkipMatchingBooksWithASIN": "Salta la ricerca dati in internet se è già presente un codice ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Salta la ricerca dati in internet se è già presente un codice ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignora i prefissi nei titoli durante l'aggiunta",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Archivia le copertine con il file",
"LabelSettingsStoreCoversWithItemHelp": "Di default, le immagini di copertina sono salvate dentro /metadata/items, abilitando questa opzione le copertine saranno archiviate nella cartella della libreria corrispondente. Verrà conservato solo un file denominato \"cover\"",
"LabelSettingsStoreMetadataWithItem": "Archivia i metadata con il file",
- "LabelSettingsStoreMetadataWithItemHelp": "Di default, i metadati sono salvati dentro /metadata/items, abilitando questa opzione si memorizzeranno i metadata nella cartella della libreria. I file avranno estensione .abs",
+ "LabelSettingsStoreMetadataWithItemHelp": "Di default, i metadati sono salvati dentro /metadata/items, abilitando questa opzione si memorizzeranno i metadata nella cartella della libreria",
"LabelSettingsTimeFormat": "Formato Ora",
"LabelShowAll": "Mostra Tutto",
"LabelSize": "Dimensione",
@@ -462,8 +492,8 @@
"LabelTagsNotAccessibleToUser": "Tags non accessibile agli Utenti",
"LabelTasks": "Processi in esecuzione",
"LabelTheme": "Tema",
- "LabelThemeDark": "Dark",
- "LabelThemeLight": "Light",
+ "LabelThemeDark": "Scuro",
+ "LabelThemeLight": "Chiaro",
"LabelTimeBase": "Time Base",
"LabelTimeListened": "Tempo di Ascolto",
"LabelTimeListenedToday": "Tempo di Ascolto Oggi",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Consenti la sovrascrittura dei dettagli esistenti per i libri selezionati quando viene individuata una corrispondenza",
"LabelUploaderDragAndDrop": "Drag & drop file o Cartelle",
"LabelUploaderDropFiles": "Elimina file",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Usa il Capitolo della Traccia",
"LabelUseFullTrack": "Usa la traccia totale",
"LabelUser": "Utente",
@@ -523,21 +554,25 @@
"MessageChapterErrorStartLtPrev": "L'ora di inizio non valida deve essere maggiore o uguale all'ora di inizio del capitolo precedente",
"MessageChapterStartIsAfter": "L'inizio del capitolo è dopo la fine del tuo audiolibro",
"MessageCheckingCron": "Controllo cron...",
- "MessageConfirmCloseFeed": "Are you sure you want to close this feed?",
+ "MessageConfirmCloseFeed": "Sei sicuro di voler chiudere questo feed?",
"MessageConfirmDeleteBackup": "Sei sicuro di voler eliminare il backup {0}?",
"MessageConfirmDeleteFile": "Questo eliminerà il file dal tuo file system. Sei sicuro?",
"MessageConfirmDeleteLibrary": "Sei sicuro di voler eliminare definitivamente la libreria \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": " l'elemento della libreria dal database e dal file system. Sei sicuro?",
+ "MessageConfirmDeleteLibraryItems": "Ciò eliminerà {0} elementi della libreria dal database e dal file system. Sei sicuro?",
"MessageConfirmDeleteSession": "Sei sicuro di voler eliminare questa sessione?",
"MessageConfirmForceReScan": "Sei sicuro di voler forzare una nuova scansione?",
"MessageConfirmMarkAllEpisodesFinished": "Sei sicuro di voler contrassegnare tutti gli episodi come finiti?",
- "MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?",
+ "MessageConfirmMarkAllEpisodesNotFinished": "Sei sicuro di voler contrassegnare tutti gli episodi come non completati?",
"MessageConfirmMarkSeriesFinished": "Sei sicuro di voler contrassegnare tutti i libri di questa serie come completati?",
"MessageConfirmMarkSeriesNotFinished": "Sei sicuro di voler contrassegnare tutti i libri di questa serie come non completati?",
+ "MessageConfirmQuickEmbed": "Attenzione! L'incorporamento rapido non eseguirà il backup dei file audio. Assicurati di avere un backup dei tuoi file audio.
Vuoi Continuare?",
"MessageConfirmRemoveAllChapters": "Sei sicuro di voler rimuovere tutti i capitoli?",
- "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
+ "MessageConfirmRemoveAuthor": "Sei sicuro di voler rimuovere l'autore? \"{0}\"?",
"MessageConfirmRemoveCollection": "Sei sicuro di voler rimuovere la Raccolta \"{0}\"?",
"MessageConfirmRemoveEpisode": "Sei sicuro di voler rimuovere l'episodio \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Sei sicuro di voler rimuovere {0} episodi?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Sei sicuro di voler rimuovere il narratore \"{0}\"?",
"MessageConfirmRemovePlaylist": "Sei sicuro di voler rimuovere la tua playlist \"{0}\"?",
"MessageConfirmRenameGenre": "Sei sicuro di voler rinominare il genere \"{0}\" in \"{1}\" per tutti gli oggetti?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Sei sicuro di voler rinominare il tag \"{0}\" in \"{1}\" per tutti gli oggetti?",
"MessageConfirmRenameTagMergeNote": "Nota: Questo tag esiste già e verrà unito nel vecchio.",
"MessageConfirmRenameTagWarning": "Avvertimento! Esiste già un tag simile con un nome simile \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Sei sicuro di voler ripetere la scansione? {0} oggetti?",
"MessageConfirmSendEbookToDevice": "Sei sicuro di voler inviare {0} ebook \"{1}\" al Device \"{2}\"?",
"MessageDownloadingEpisode": "Download episodio in corso",
"MessageDragFilesIntoTrackOrder": "Trascina i file nell'ordine di traccia corretto",
@@ -595,7 +631,7 @@
"MessageNoResults": "Nessun Risultato",
"MessageNoSearchResultsFor": "Nessun risultato per \"{0}\"",
"MessageNoSeries": "Nessuna Serie",
- "MessageNoTags": "No Tags",
+ "MessageNoTags": "Nessun Tags",
"MessageNoTasksRunning": "Nessun processo in esecuzione",
"MessageNotYetImplemented": "Non Ancora Implementato",
"MessageNoUpdateNecessary": "Nessun aggiornamento necessario",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Sei sicuro di voler ripristinare il backup creato su",
"MessageRestoreBackupWarning": "Il ripristino di un backup sovrascriverà l'intero database situato in /config e sovrascrive le immagini in /metadata/items & /metadata/authors.
I backup non modificano alcun file nelle cartelle della libreria. Se hai abilitato le impostazioni del server per archiviare copertine e metadati nelle cartelle della libreria, questi non vengono sottoposti a backup o sovrascritti.
Tutti i client che utilizzano il tuo server verranno aggiornati automaticamente.",
"MessageSearchResultsFor": "cerca risultati per",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Impossibile raggiungere il server",
"MessageSetChaptersFromTracksDescription": "Impostare i capitoli utilizzando ciascun file audio come capitolo e il titolo del capitolo come nome del file audio",
"MessageStartPlaybackAtTime": "Avvia la riproduzione per \"{0}\" a {1}?",
@@ -624,7 +661,7 @@
"MessageUploaderItemSuccess": "Caricato con successo!",
"MessageUploading": "Caricamento...",
"MessageValidCronExpression": "Espressione Cron Valida",
- "MessageWatcherIsDisabledGlobally": "Watcher è disabilitato a livello globale nelle impostazioni del server",
+ "MessageWatcherIsDisabledGlobally": "Controllo file automatico è disabilitato a livello globale nelle impostazioni del server",
"MessageXLibraryIsEmpty": "{0} libreria vuota!",
"MessageYourAudiobookDurationIsLonger": "La durata dell'audiolibro è più lunga della durata trovata",
"MessageYourAudiobookDurationIsShorter": "La durata dell'audiolibro è inferiore alla durata trovata",
@@ -638,7 +675,7 @@
"NoteUploaderOnlyAudioFiles": "Se carichi solo file audio, ogni file audio verrà gestito come un audiolibro separato.",
"NoteUploaderUnsupportedFiles": "I file non supportati vengono ignorati. Quando si sceglie o si elimina una cartella, gli altri file che non si trovano in una cartella di elementi vengono ignorati.",
"PlaceholderNewCollection": "Nome Nuova Raccolta",
- "PlaceholderNewFolderPath": "Nuovo percorso Cartella",
+ "PlaceholderNewFolderPath": "Nuovo Percorso Cartella",
"PlaceholderNewPlaylist": "Nome nuova playlist",
"PlaceholderSearch": "Cerca..",
"PlaceholderSearchEpisode": "Cerca Episodio..",
@@ -704,7 +741,7 @@
"ToastRSSFeedCloseSuccess": "RSS feed chiuso",
"ToastSendEbookToDeviceFailed": "Impossibile inviare l'ebook al dispositivo",
"ToastSendEbookToDeviceSuccess": "Ebook inviato al dispositivo \"{0}\"",
- "ToastSeriesUpdateFailed": "Aggiornaento Serie Fallito",
+ "ToastSeriesUpdateFailed": "Aggiornamento Serie Fallito",
"ToastSeriesUpdateSuccess": "Serie Aggornate",
"ToastSessionDeleteFailed": "Errore eliminazione sessione",
"ToastSessionDeleteSuccess": "Sessione cancellata",
diff --git a/client/strings/lt.json b/client/strings/lt.json
index 625ca66b..94067198 100644
--- a/client/strings/lt.json
+++ b/client/strings/lt.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Pridėti",
"ButtonAddChapters": "Pridėti skyrius",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "Pridėti tinklalaides",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "Pridėkite savo pirmąją biblioteką",
"ButtonApply": "Taikyti",
"ButtonApplyChapters": "Taikyti skyrius",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Pašalinti seriją iš Tęsti Seriją",
"ButtonReScan": "Iš naujo nuskaityti",
"ButtonReset": "Atstatyti",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "Atkurti",
"ButtonSave": "Išsaugoti",
"ButtonSaveAndClose": "Išsaugoti ir uždaryti",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Redaguoti naudotoją {0}",
"ButtonViewAll": "Peržiūrėti visus",
"ButtonYes": "Taip",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Paskyra",
"HeaderAdvanced": "Papildomi",
"HeaderAppriseNotificationSettings": "Apprise pranešimo nustatymai",
"HeaderAudiobookTools": "Audioknygų failų valdymo įrankiai",
"HeaderAudioTracks": "Garso takeliai",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Atsarginės kopijos",
"HeaderChangePassword": "Pakeisti slaptažodį",
"HeaderChapters": "Skyriai",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Tvarkyti žymas",
"HeaderMapDetails": "Susieti detales",
"HeaderMatch": "Atitaikyti",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Metaduomenys įterpimui",
"HeaderNewAccount": "Nauja paskyra",
"HeaderNewLibrary": "Nauja biblioteka",
"HeaderNotifications": "Pranešimai",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Atidaryti RSS srautą",
"HeaderOtherFiles": "Kiti failai",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Leidimai",
"HeaderPlayerQueue": "Grotuvo eilė",
"HeaderPlaylist": "Grojaraštis",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Pridėti {0} knygas į kolekciją",
"LabelAddToPlaylist": "Pridėti į grojaraštį",
"LabelAddToPlaylistBatch": "Pridėti {0} elementus į grojaraštį",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "Visi",
"LabelAllUsers": "Visi naudotojai",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Jau yra jūsų bibliotekoje",
"LabelAppend": "Pridėti",
"LabelAuthor": "Autorius",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Autorius (Pavardė, Vardas)",
"LabelAuthors": "Autoriai",
"LabelAutoDownloadEpisodes": "Automatiškai atsisiųsti epizodus",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Grįžti į naudotoją",
"LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Įjungti automatinį atsarginių kopijų kūrimą",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Tik viena atsarginė kopija bus pašalinta vienu metu, todėl jei jau turite daugiau atsarginių kopijų nei nurodyta, turite jas pašalinti rankiniu būdu.",
"LabelBitrate": "Bitų sparta",
"LabelBooks": "Knygos",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Pakeisti slaptažodį",
"LabelChannels": "Kanalai",
"LabelChapters": "Skyriai",
"LabelChaptersFound": "rasti skyriai",
"LabelChapterTitle": "Skyriaus pavadinimas",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Uždaryti grotuvą",
"LabelCodec": "Kodekas",
"LabelCollapseSeries": "Suskleisti seriją",
@@ -218,10 +240,12 @@
"LabelCurrently": "Šiuo metu:",
"LabelCustomCronExpression": "Nestandartinė Cron išraiška:",
"LabelDatetime": "Data ir laikas",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Aprašymas",
"LabelDeselectAll": "Išvalyti pasirinktus",
"LabelDevice": "Įrenginys",
"LabelDeviceInfo": "Įrenginio informacija",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Katalogas",
"LabelDiscFromFilename": "Diskas pagal failo pavadinimą",
"LabelDiscFromMetadata": "Diskas pagal metaduomenis",
@@ -247,6 +271,7 @@
"LabelExample": "Pavyzdys",
"LabelExplicit": "Suaugusiems",
"LabelFeedURL": "Srauto URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "Failas",
"LabelFileBirthtime": "Failo kūrimo laikas",
"LabelFileModified": "Failo keitimo laikas",
@@ -256,6 +281,7 @@
"LabelFinished": "Baigta",
"LabelFolder": "Aplankas",
"LabelFolders": "Aplankai",
+ "LabelFontFamily": "Famiglia di font",
"LabelFontScale": "Šrifto mastelis",
"LabelFormat": "Formatas",
"LabelGenre": "Žanras",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Galutinai ištrinti failą",
"LabelHasEbook": "Turi e-knygą",
"LabelHasSupplementaryEbook": "Turi papildomą e-knygą",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Serveris",
"LabelHour": "Valanda",
"LabelIcon": "Piktograma",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Įtraukti į takelių sąrašą",
"LabelIncomplete": "Nebaigta",
"LabelInProgress": "Vyksta",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Ieškoti naujų epizodų po šios datos",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Grotuvas",
"LabelMediaType": "Medijos tipas",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Metaduomenų tiekėjas",
"LabelMetaTag": "Meta žymė",
"LabelMetaTags": "Meta žymos",
"LabelMinute": "Minutė",
"LabelMissing": "Trūksta",
"LabelMissingParts": "Trūkstamos dalys",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "Daugiau",
"LabelMoreInfo": "Daugiau informacijos",
"LabelName": "Pavadinimas",
@@ -372,6 +406,7 @@
"LabelRegion": "Regionas",
"LabelReleaseDate": "Išleidimo data",
"LabelRemoveCover": "Pašalinti viršelį",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Pasirinktinis savininko el. paštas",
"LabelRSSFeedCustomOwnerName": "Pasirinktinis savininko vardas",
"LabelRSSFeedOpen": "Atidarytas RSS srautas",
@@ -384,6 +419,7 @@
"LabelSeason": "Sezonas",
"LabelSelectAllEpisodes": "Pažymėti visus epizodus",
"LabelSelectEpisodesShowing": "Pažymėti {0} rodomus epizodus",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Siųsti e-knygą į...",
"LabelSequence": "Seka",
"LabelSeries": "Serija",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Serijos, turinčios tik vieną knygą, bus paslėptos nuo serijų puslapio ir pagrindinio puslapio lentynų.",
"LabelSettingsHomePageBookshelfView": "Naudoti pagrindinio puslapio knygų lentynų vaizdą",
"LabelSettingsLibraryBookshelfView": "Naudoti bibliotekos knygų lentynų vaizdą",
- "LabelSettingsOverdriveMediaMarkers": "Naudoti Overdrive žymeklius skyriams",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3 failai iš Overdrive turi įterptus skyrių laikus kaip papildomą metaduomenį. Įjungus šią funkciją, skyrių laikai bus automatiškai naudojami.",
"LabelSettingsParseSubtitles": "Analizuoti subtitrus",
"LabelSettingsParseSubtitlesHelp": "Išskleisti subtitrus iš audioknygos aplanko pavadinimų.
Subtitrai turi būti atskirti brūkšniu \"-\"
pavyzdžiui, \"Knygos pavadinimas - Čia yra subtitrai\" turi subtitrą \"Čia yra subtitrai\"",
- "LabelSettingsPreferAudioMetadata": "Pirmenybė failo metaduomenis",
- "LabelSettingsPreferAudioMetadataHelp": "Garso failo ID3 metaduomenys bus naudojami knygos informacijai (vietoj aplankų pavadinimų)",
"LabelSettingsPreferMatchedMetadata": "Pirmenybė atitaikytiems metaduomenis",
"LabelSettingsPreferMatchedMetadataHelp": "Atitaikyti duomenys pakeis elementų informaciją naudojant Greitą atitikimą. Pagal nutylėjimą Greitas atitaikymas užpildys tik trūkstamas detales.",
- "LabelSettingsPreferOPFMetadata": "Pirmenybė OPF metaduomenis",
- "LabelSettingsPreferOPFMetadataHelp": "OPF failo metaduomenys bus naudojami knygos informacijai (vietoj aplankų pavadinimų)",
"LabelSettingsSkipMatchingBooksWithASIN": "Praleisti knygas, kurios jau turi ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Praleisti knygas, kurios jau turi ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignoruoti priešdėlius rūšiuojant",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Saugoti viršelius su elementu",
"LabelSettingsStoreCoversWithItemHelp": "Pagal nutylėjimą viršeliai saugomi /metadata/items aplanke, įjungus šią parinktį viršeliai bus saugomi jūsų bibliotekos elemento aplanke. Bus išsaugotas tik vienas „cover“ pavadinimo failas.",
"LabelSettingsStoreMetadataWithItem": "Saugoti metaduomenis su elementu",
- "LabelSettingsStoreMetadataWithItemHelp": "Pagal nutylėjimą metaduomenų failai saugomi /metadata/items aplanke, įjungus šią parinktį metaduomenų failai bus saugomi jūsų bibliotekos elemento aplanke. Naudojamas .abs plėtinys.",
+ "LabelSettingsStoreMetadataWithItemHelp": "Pagal nutylėjimą metaduomenų failai saugomi /metadata/items aplanke, įjungus šią parinktį metaduomenų failai bus saugomi jūsų bibliotekos elemento aplanke",
"LabelSettingsTimeFormat": "Laiko formatas",
"LabelShowAll": "Rodyti viską",
"LabelSize": "Dydis",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Leisti perrašyti esamus duomenis pasirinktoms knygoms, kai yra rasta atitikmenų",
"LabelUploaderDragAndDrop": "Tempkite ir paleiskite failus ar aplankus",
"LabelUploaderDropFiles": "Nutempti failus",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Naudoti skyrių takelį",
"LabelUseFullTrack": "Naudoti visą takelį",
"LabelUser": "Vartotojas",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Ar tikrai norite ištrinti atsarginę kopiją, skirtą {0}?",
"MessageConfirmDeleteFile": "Tai ištrins failą iš jūsų failų sistemos. Ar tikrai?",
"MessageConfirmDeleteLibrary": "Ar tikrai norite visam laikui ištrinti biblioteką \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Ar tikrai norite ištrinti šią sesiją?",
"MessageConfirmForceReScan": "Ar tikrai norite priversti perskenavimą?",
"MessageConfirmMarkAllEpisodesFinished": "Ar tikrai norite pažymėti visus epizodus kaip užbaigtus?",
"MessageConfirmMarkAllEpisodesNotFinished": "Ar tikrai norite pažymėti visus epizodus kaip nebaigtus?",
"MessageConfirmMarkSeriesFinished": "Ar tikrai norite pažymėti visas knygas šioje serijoje kaip užbaigtas?",
"MessageConfirmMarkSeriesNotFinished": "Ar tikrai norite pažymėti visas knygas šioje serijoje kaip nebaigtas?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Ar tikrai norite pašalinti visus skyrius?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Ar tikrai norite pašalinti kolekciją \"{0}\"?",
"MessageConfirmRemoveEpisode": "Ar tikrai norite pašalinti epizodą \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Ar tikrai norite pašalinti {0} epizodus?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Ar tikrai norite pašalinti skaitytoją \"{0}\"?",
"MessageConfirmRemovePlaylist": "Ar tikrai norite pašalinti savo grojaraštį \"{0}\"?",
"MessageConfirmRenameGenre": "Ar tikrai norite pervadinti žanrą \"{0}\" į \"{1}\" visiems elementams?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Ar tikrai norite pervadinti žymą \"{0}\" į \"{1}\" visiems elementams?",
"MessageConfirmRenameTagMergeNote": "Pastaba: ši žyma jau egzistuoja, todėl jos bus sujungtos.",
"MessageConfirmRenameTagWarning": "Įspėjimas! Panaši žyma jau egzistuoja \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Ar tikrai norite nusiųsti {0} el. knygą \"{1}\" į įrenginį \"{2}\"?",
"MessageDownloadingEpisode": "Epizodas atsisiunčiamas",
"MessageDragFilesIntoTrackOrder": "Surikiuokite takelius vilkdami failus",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Ar tikrai norite atkurti atsarginę kopiją, sukurtą",
"MessageRestoreBackupWarning": "Atkurdami atsarginę kopiją perrašysite visą duomenų bazę, esančią /config ir viršelių vaizdus /metadata/items ir /metadata/authors.
Atsarginės kopijos nekeičia jokių failų jūsų bibliotekos aplankuose. Jei esate įgalinę serverio nustatymus, kad viršelio meną ir metaduomenis saugotumėte savo bibliotekos aplankuose, šie neperrašomi ar atkuriami.
Visi klientai, naudojantys jūsų serverį, bus automatiškai atnaujinti.",
"MessageSearchResultsFor": "Paieškos rezultatai „{0}“",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Nepavyko pasiekti serverio",
"MessageSetChaptersFromTracksDescription": "Nustatyti skyrius, naudojant kiekvieną garso failą kaip skyrių ir skyriaus pavadinimą kaip garso failo pavadinimą",
"MessageStartPlaybackAtTime": "Paleisti klausymą „{0}“ nuo {1}?",
diff --git a/client/strings/nl.json b/client/strings/nl.json
index e0b4ecd4..19a5c35a 100644
--- a/client/strings/nl.json
+++ b/client/strings/nl.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Toevoegen",
"ButtonAddChapters": "Hoofdstukken toevoegen",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "Podcasts toevoegen",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "Voeg je eerste bibliotheek toe",
"ButtonApply": "Pas toe",
"ButtonApplyChapters": "Hoofdstukken toepassen",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Verwijder serie uit Serie vervolgen",
"ButtonReScan": "Nieuwe scan",
"ButtonReset": "Reset",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "Herstel",
"ButtonSave": "Opslaan",
"ButtonSaveAndClose": "Opslaan & sluiten",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Wijzig gebruiker {0}",
"ButtonViewAll": "Toon alle",
"ButtonYes": "Ja",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Account",
"HeaderAdvanced": "Geavanceerd",
"HeaderAppriseNotificationSettings": "Apprise-notificatie instellingen",
"HeaderAudiobookTools": "Audioboekbestandbeheer tools",
"HeaderAudioTracks": "Audiotracks",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Back-ups",
"HeaderChangePassword": "Wachtwoord wijzigen",
"HeaderChapters": "Hoofdstukken",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Tags beheren",
"HeaderMapDetails": "Map details",
"HeaderMatch": "Match",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "In te sluiten metadata",
"HeaderNewAccount": "Nieuwe account",
"HeaderNewLibrary": "Nieuwe bibliotheek",
"HeaderNotifications": "Notificaties",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Open RSS-feed",
"HeaderOtherFiles": "Andere bestanden",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Toestemmingen",
"HeaderPlayerQueue": "Afspeelwachtrij",
"HeaderPlaylist": "Afspeellijst",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "{0} boeken toevoegen aan collectie",
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
"LabelAddToPlaylistBatch": "{0} onderdelen toevoegen aan afspeellijst",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "Alle",
"LabelAllUsers": "Alle gebruikers",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Reeds in je bibliotheek",
"LabelAppend": "Achteraan toevoegen",
"LabelAuthor": "Auteur",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Auteur (Achternaam, Voornaam)",
"LabelAuthors": "Auteurs",
"LabelAutoDownloadEpisodes": "Afleveringen automatisch downloaden",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Terug naar gebruiker",
"LabelBackupLocation": "Back-up locatie",
"LabelBackupsEnableAutomaticBackups": "Automatische back-ups inschakelen",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Er wordt slechts 1 back-up per keer verwijderd, dus als je reeds meer back-ups dan dit hebt moet je ze handmatig verwijderen.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Boeken",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Wachtwoord wijzigen",
"LabelChannels": "Kanalen",
"LabelChapters": "Hoofdstukken",
"LabelChaptersFound": "Hoofdstukken gevonden",
"LabelChapterTitle": "Hoofdstuktitel",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Sluit speler",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Series inklappen",
@@ -218,10 +240,12 @@
"LabelCurrently": "Op dit moment:",
"LabelCustomCronExpression": "Aangepaste Cron-uitdrukking:",
"LabelDatetime": "Datum-tijd",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Beschrijving",
"LabelDeselectAll": "Deselecteer alle",
"LabelDevice": "Apparaat",
"LabelDeviceInfo": "Apparaat info",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Map",
"LabelDiscFromFilename": "Schijf uit bestandsnaam",
"LabelDiscFromMetadata": "Schijf uit metadata",
@@ -247,6 +271,7 @@
"LabelExample": "Voorbeeld",
"LabelExplicit": "Expliciet",
"LabelFeedURL": "Feed URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "Bestand",
"LabelFileBirthtime": "Aanmaaktijd bestand",
"LabelFileModified": "Bestand gewijzigd",
@@ -256,6 +281,7 @@
"LabelFinished": "Voltooid",
"LabelFolder": "Map",
"LabelFolders": "Mappen",
+ "LabelFontFamily": "Lettertypefamilie",
"LabelFontScale": "Lettertype schaal",
"LabelFormat": "Formaat",
"LabelGenre": "Genre",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Hard-delete bestand",
"LabelHasEbook": "Heeft ebook",
"LabelHasSupplementaryEbook": "Heeft supplementair ebook",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Uur",
"LabelIcon": "Icoon",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Includeer in tracklijst",
"LabelIncomplete": "Incompleet",
"LabelInProgress": "Bezig",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Waarschuwing",
"LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Mediaspeler",
"LabelMediaType": "Mediatype",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Metadatabron",
"LabelMetaTag": "Meta-tag",
"LabelMetaTags": "Meta-tags",
"LabelMinute": "Minuut",
"LabelMissing": "Ontbrekend",
"LabelMissingParts": "Ontbrekende delen",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "Meer",
"LabelMoreInfo": "Meer info",
"LabelName": "Naam",
@@ -372,6 +406,7 @@
"LabelRegion": "Regio",
"LabelReleaseDate": "Verschijningsdatum",
"LabelRemoveCover": "Verwijder cover",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
"LabelRSSFeedOpen": "RSS-feed open",
@@ -384,6 +419,7 @@
"LabelSeason": "Seizoen",
"LabelSelectAllEpisodes": "Selecteer alle afleveringen",
"LabelSelectEpisodesShowing": "Selecteer {0} afleveringen laten zien",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Stuur ebook naar...",
"LabelSequence": "Sequentie",
"LabelSeries": "Serie",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Series die slechts een enkel boek bevatten worden verborgen op de seriespagina en de homepagina-planken.",
"LabelSettingsHomePageBookshelfView": "Boekenplank-view voor homepagina",
"LabelSettingsLibraryBookshelfView": "Boekenplank-view voor bibliotheek",
- "LabelSettingsOverdriveMediaMarkers": "Gebruik Overdrive media markers voor hoofdstukken",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3-bestanden van Overdrive hebben hoofdstuktiming ingesloten als custom ingesloten metadata. Door dit in te schakelen worden deze tags voor hoofdstuktiming automatisch gebruikt.",
"LabelSettingsParseSubtitles": "Parseer subtitel",
"LabelSettingsParseSubtitlesHelp": "Haal subtitels uit mapnaam van audioboek.
Subtitel moet gescheiden zijn met \" - \"
b.v. \"Boektitel - Een Subtitel Hier\" heeft als subtitel \"Een Subtitel Hier\"",
- "LabelSettingsPreferAudioMetadata": "Prefereer audio-metadata",
- "LabelSettingsPreferAudioMetadataHelp": "Audiobestand ID3 metatags zullen worden gebruikt voor boekdetails in plaats van mapnamen",
"LabelSettingsPreferMatchedMetadata": "Prefereer gematchte metadata",
"LabelSettingsPreferMatchedMetadataHelp": "Gematchte data zal onderdeeldetails overschrijven bij gebruik van Quick Match. Standaard vult Quick Match uitsluitend ontbrekende details aan.",
- "LabelSettingsPreferOPFMetadata": "Prefereer OPF-metadata",
- "LabelSettingsPreferOPFMetadataHelp": "OPF-bestand metadata zal worden gebruik in plaats van mapnamen",
"LabelSettingsSkipMatchingBooksWithASIN": "Sla matchen van boeken over die al over een ASIN beschikken",
"LabelSettingsSkipMatchingBooksWithISBN": "Sla matchen van boeken over die al over een ISBN beschikken",
"LabelSettingsSortingIgnorePrefixes": "Negeer voorvoegsels bij sorteren",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Bewaar covers bij onderdeel",
"LabelSettingsStoreCoversWithItemHelp": "Standaard worden covers bewaard in /metadata/items, door deze instelling in te schakelen zullen covers in de map van je bibliotheekonderdeel bewaard worden. Slechts een bestand genaamd \"cover\" zal worden bewaard",
"LabelSettingsStoreMetadataWithItem": "Bewaar metadata bij onderdeel",
- "LabelSettingsStoreMetadataWithItemHelp": "Standaard worden metadata-bestanden bewaard in /metadata/items, door deze instelling in te schakelen zullen metadata bestanden in de map van je bibliotheekonderdeel bewaard worden. Gebruikt .abs-extensie",
+ "LabelSettingsStoreMetadataWithItemHelp": "Standaard worden metadata-bestanden bewaard in /metadata/items, door deze instelling in te schakelen zullen metadata bestanden in de map van je bibliotheekonderdeel bewaard worden",
"LabelSettingsTimeFormat": "Tijdformat",
"LabelShowAll": "Toon alle",
"LabelSize": "Grootte",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Sta overschrijven van bestaande details toe voor de geselecteerde boeken wanneer een match is gevonden",
"LabelUploaderDragAndDrop": "Slepen & neerzeten van bestanden of mappen",
"LabelUploaderDropFiles": "Bestanden neerzetten",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Gebruik hoofdstuktrack",
"LabelUseFullTrack": "Gebruik volledige track",
"LabelUser": "Gebruiker",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?",
"MessageConfirmDeleteFile": "Dit verwijdert het bestand uit het bestandssysteem. Weet je het zeker?",
"MessageConfirmDeleteLibrary": "Weet je zeker dat je de bibliotheek \"{0}\" permanent wil verwijderen?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Weet je zeker dat je deze sessie wil verwijderen?",
"MessageConfirmForceReScan": "Weet je zeker dat je geforceerd opnieuw wil scannen?",
"MessageConfirmMarkAllEpisodesFinished": "Weet je zeker dat je alle afleveringen als voltooid wil markeren?",
"MessageConfirmMarkAllEpisodesNotFinished": "Weet je zeker dat je alle afleveringen als niet-voltooid wil markeren?",
"MessageConfirmMarkSeriesFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als voltooid?",
"MessageConfirmMarkSeriesNotFinished": "Weet je zeker dat je alle boeken in deze serie wil markeren als niet voltooid?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Weet je zeker dat je alle hoofdstukken wil verwijderen?",
"MessageConfirmRemoveAuthor": "Weet je zeker dat je auteur \"{0}\" wil verwijderen?",
"MessageConfirmRemoveCollection": "Weet je zeker dat je de collectie \"{0}\" wil verwijderen?",
"MessageConfirmRemoveEpisode": "Weet je zeker dat je de aflevering \"{0}\" wil verwijderen?",
"MessageConfirmRemoveEpisodes": "Weet je zeker dat je {0} afleveringen wil verwijderen?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Weet je zeker dat je verteller \"{0}\" wil verwijderen?",
"MessageConfirmRemovePlaylist": "Weet je zeker dat je je afspeellijst \"{0}\" wil verwijderen?",
"MessageConfirmRenameGenre": "Weet je zeker dat je genre \"{0}\" wil hernoemen naar \"{1}\" voor alle onderdelen?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Weet je zeker dat je tag \"{0}\" wil hernoemen naar\"{1}\" voor alle onderdelen?",
"MessageConfirmRenameTagMergeNote": "Opmerking: Deze tag bestaat al, dus zullen ze worden samengevoegd.",
"MessageConfirmRenameTagWarning": "Waarschuwing! Een gelijknamige tag met ander hoofdlettergebruik bestaat al: \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Weet je zeker dat je {0} ebook \"{1}\" naar apparaat \"{2}\" wil sturen?",
"MessageDownloadingEpisode": "Aflevering aan het dowloaden",
"MessageDragFilesIntoTrackOrder": "Sleep bestanden in de juiste trackvolgorde",
@@ -616,6 +652,7 @@
"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.
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.
Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
"MessageSearchResultsFor": "Zoekresultaten voor",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Server niet bereikbaar",
"MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel",
"MessageStartPlaybackAtTime": "Afspelen van \"{0}\" beginnen op {1}?",
@@ -713,4 +750,4 @@
"ToastSocketFailedToConnect": "Verbinding Socket mislukt",
"ToastUserDeleteFailed": "Verwijderen gebruiker mislukt",
"ToastUserDeleteSuccess": "Gebruiker verwijderd"
-}
+}
\ No newline at end of file
diff --git a/client/strings/no.json b/client/strings/no.json
index a2ba3d90..37cbc7a8 100644
--- a/client/strings/no.json
+++ b/client/strings/no.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Legg til",
"ButtonAddChapters": "Legg til kapittel",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "Legg til podcast",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "Legg til ditt første bibliotek",
"ButtonApply": "Bruk",
"ButtonApplyChapters": "Bruk kapittel",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Fjern serie fra Fortsett serie",
"ButtonReScan": "Skann på nytt",
"ButtonReset": "Nullstill",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "Gjenopprett",
"ButtonSave": "Lagre",
"ButtonSaveAndClose": "Lagre og lukk",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Rediger bruker {0}",
"ButtonViewAll": "Vis alt",
"ButtonYes": "Ja",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Konto",
"HeaderAdvanced": "Avansert",
"HeaderAppriseNotificationSettings": "Apprise notifikasjonsinstillinger",
"HeaderAudiobookTools": "Lydbok Filbehandlingsverktøy",
"HeaderAudioTracks": "Lydspor",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Sikkerhetskopier",
"HeaderChangePassword": "Bytt passord",
"HeaderChapters": "Kapittel",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Behandle tags",
"HeaderMapDetails": "Kartleggingsdetaljer",
"HeaderMatch": "Tilpasse",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Metadata å bake inn",
"HeaderNewAccount": "Ny konto",
"HeaderNewLibrary": "Ny bibliotek",
"HeaderNotifications": "Notifikasjoner",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Åpne RSS Feed",
"HeaderOtherFiles": "Andre filer",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Rettigheter",
"HeaderPlayerQueue": "Spiller kø",
"HeaderPlaylist": "Spilleliste",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Legg {0} bøker til samling",
"LabelAddToPlaylist": "Legg til i spilleliste",
"LabelAddToPlaylistBatch": "Legg {0} enheter til i spilleliste",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "Alle",
"LabelAllUsers": "Alle brukere",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Allerede i biblioteket",
"LabelAppend": "Legge til",
"LabelAuthor": "Forfatter",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Forfatter (Etternavn Fornavn)",
"LabelAuthors": "Forfattere",
"LabelAutoDownloadEpisodes": "Last ned episoder automatisk",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Tilbake til bruker",
"LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Aktiver automatisk sikkerhetskopi",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Kun 1 sikkerhetskopi vil bli fjernet om gangen, hvis du allerede har flere sikkerhetskopier enn dette bør du fjerne de manuelt.",
"LabelBitrate": "Bithastighet",
"LabelBooks": "Bøker",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Endre passord",
"LabelChannels": "Kanaler",
"LabelChapters": "Kapitler",
"LabelChaptersFound": "kapitler funnet",
"LabelChapterTitle": "Kapittel tittel",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Lukk spiller",
"LabelCodec": "Kodek",
"LabelCollapseSeries": "Minimer serier",
@@ -218,10 +240,12 @@
"LabelCurrently": "Nåværende:",
"LabelCustomCronExpression": "Tilpasset Cron utrykk:",
"LabelDatetime": "Dato tid",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Beskrivelse",
"LabelDeselectAll": "Fjern valg",
"LabelDevice": "Enhet",
"LabelDeviceInfo": "Enhetsinformasjon",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Mappe",
"LabelDiscFromFilename": "Disk fra filnavn",
"LabelDiscFromMetadata": "Disk fra metadata",
@@ -247,6 +271,7 @@
"LabelExample": "Eksempel",
"LabelExplicit": "Eksplisitt",
"LabelFeedURL": "Feed Adresse",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "Fil",
"LabelFileBirthtime": "Fil Opprettelsesdato",
"LabelFileModified": "Fil Endret",
@@ -256,6 +281,7 @@
"LabelFinished": "Fullført",
"LabelFolder": "Mappe",
"LabelFolders": "Mapper",
+ "LabelFontFamily": "Fontfamilie",
"LabelFontScale": "Font størrelse",
"LabelFormat": "Format",
"LabelGenre": "Sjanger",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Tving sletting av fil",
"LabelHasEbook": "Har ebok",
"LabelHasSupplementaryEbook": "Har supplerende ebok",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Tjener",
"LabelHour": "Time",
"LabelIcon": "Ikon",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Inkluder i sporliste",
"LabelIncomplete": "Ufullstendig",
"LabelInProgress": "I gang",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Se etter nye episoder etter denne datoen",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Mediespiller",
"LabelMediaType": "Medie type",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Metadata Leverandør",
"LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minutt",
"LabelMissing": "Mangler",
"LabelMissingParts": "Manglende deler",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "Mer",
"LabelMoreInfo": "Mer info",
"LabelName": "Navn",
@@ -372,6 +406,7 @@
"LabelRegion": "Region",
"LabelReleaseDate": "Utgivelsesdato",
"LabelRemoveCover": "Fjern omslag",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Tilpasset eier Epost",
"LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn",
"LabelRSSFeedOpen": "RSS Feed åpne",
@@ -384,6 +419,7 @@
"LabelSeason": "Sesong",
"LabelSelectAllEpisodes": "Velg alle episoder",
"LabelSelectEpisodesShowing": "Velg {0} episoder vist",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Send Ebok til...",
"LabelSequence": "Sekvens",
"LabelSeries": "Serier",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Serier som har kun en bok vil bli gjemt på serie- og hjemmeside hyllen.",
"LabelSettingsHomePageBookshelfView": "Hjemmeside bruk bokhyllevisning",
"LabelSettingsLibraryBookshelfView": "Bibliotek bruk bokhyllevisning",
- "LabelSettingsOverdriveMediaMarkers": "Bruk Overdrive mediemerker for kapittel",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3 filer fra Overdrive kommer med kapittel tider bakt inn so egendefinert metadata. Aktiveres dette vil disse taggene bli brukt som kapittel tider automatisk",
"LabelSettingsParseSubtitles": "Analyser undertekster",
"LabelSettingsParseSubtitlesHelp": "Trekk ut undertekster fra lydbok mappenavn.
undertekster må være separert med \" - \"
f.eks. \"Boktittel - Undertekst her\" har Undertekst \"Undertekst her\"",
- "LabelSettingsPreferAudioMetadata": "Foretrekk lyd metadata",
- "LabelSettingsPreferAudioMetadataHelp": "Lydfil ID3 meta tagger vil bli brukt som bokdetaljer i stedet fro mappenavn",
"LabelSettingsPreferMatchedMetadata": "Foretrekk funnet metadata",
"LabelSettingsPreferMatchedMetadataHelp": "Funnet data vil overskrive enhetens detaljene når man bruker Kjapt søk. Som standard vil Kjapt søk kun fylle inn manglende detaljer.",
- "LabelSettingsPreferOPFMetadata": "Foretrekk OPF metadata",
- "LabelSettingsPreferOPFMetadataHelp": "OPF fil metadata vil bli brukt som bokdetaljer i stedet fro mappenavn",
"LabelSettingsSkipMatchingBooksWithASIN": "Hopp over bøker som allerede har ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Hopp over bøker som allerede har ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignorer prefiks når under sortering",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Lagre bokomslag med gjenstand",
"LabelSettingsStoreCoversWithItemHelp": "Som standard vil bokomslag bli lagret under /metadata/items, aktiveres dette valget vil bokomslag bli lagret i samme mappe som gjenstanden. Kun en fil med navn \"cover\" vil bli beholdt",
"LabelSettingsStoreMetadataWithItem": "Lagre metadata med gjenstand",
- "LabelSettingsStoreMetadataWithItemHelp": "Som standard vil metadata bli lagret under /metadata/items, aktiveres dette valget vil metadata bli lagret i samme mappe som gjenstanden. Bruker .abs filetternavn",
+ "LabelSettingsStoreMetadataWithItemHelp": "Som standard vil metadata bli lagret under /metadata/items, aktiveres dette valget vil metadata bli lagret i samme mappe som gjenstanden",
"LabelSettingsTimeFormat": "Tid format",
"LabelShowAll": "Vis alt",
"LabelSize": "Størrelse",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Tillat overskriving av eksisterende detaljer for de valgte bøkene når en lik bok er funnet",
"LabelUploaderDragAndDrop": "Dra og slipp filer eller mapper",
"LabelUploaderDropFiles": "Slipp filer",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Bruk kapittelspor",
"LabelUseFullTrack": "Bruke hele sporet",
"LabelUser": "Bruker",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Er du sikker på at du vil slette sikkerhetskopi for {0}?",
"MessageConfirmDeleteFile": "Dette vil slette filen fra filsystemet. Er du sikker?",
"MessageConfirmDeleteLibrary": "Er du sikker på at du vil slette biblioteket \"{0}\" for godt?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Er du sikker på at du vil slette denne sesjonen?",
"MessageConfirmForceReScan": "Er du sikker på at du vil tvinge en ny skann?",
"MessageConfirmMarkAllEpisodesFinished": "Er du sikker på at du vil markere alle episodene som fullført?",
"MessageConfirmMarkAllEpisodesNotFinished": "Er du sikker på at du vil markere alle episodene som ikke fullført?",
"MessageConfirmMarkSeriesFinished": "Er du sikker på at du vil markere alle bøkene i serien som fullført?",
"MessageConfirmMarkSeriesNotFinished": "Er du sikker på at du vil markere alle bøkene i serien som ikke fullført?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Er du sikker på at du vil fjerne alle kapitler?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Er du sikker på at du vil fjerne samling\"{0}\"?",
"MessageConfirmRemoveEpisode": "Er du sikker på at du vil fjerne episode \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Er du sikker på at du vil fjerne {0} episoder?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Er du sikker på at du vil fjerne forteller \"{0}\"?",
"MessageConfirmRemovePlaylist": "Er du sikker på at du vil fjerne spillelisten \"{0}\"?",
"MessageConfirmRenameGenre": "Er du sikker på at du vil endre sjanger \"{0}\" til \"{1}\" for alle gjenstandene?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Er du sikker på at du vil endre tag \"{0}\" til \"{1}\" for alle gjenstandene?",
"MessageConfirmRenameTagMergeNote": "Notis: Denne taggen finnes allerede så de vil bli slått sammen.",
"MessageConfirmRenameTagWarning": "Advarsel! En lignende tag eksisterer allerede (med forsjellige store / små bokstaver) \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Er du sikker på at du vil sende {0} ebok \"{1}\" til enhet \"{2}\"?",
"MessageDownloadingEpisode": "Laster ned episode",
"MessageDragFilesIntoTrackOrder": "Dra filene i rett spor rekkefølge",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Er du sikker på at du vil gjenopprette sikkerhetskopien som var laget",
"MessageRestoreBackupWarning": "gjenoppretting av sikkerhetskopi vil overskrive hele databasen under /config og omslagsbilde under /metadata/items og /metadata/authors.
Sikkerhetskopier endrer ikke noen filer under dine bibliotekmapper. Hvis du har aktivert tjenerinstillingen for å lagre omslagsbilder og metadata i bibliotekmapper så vil ikke de filene bli tatt sikkerhetskopi eller overskrevet.
Alle klientene som bruker din tjener vil bli fornyet automatisk.",
"MessageSearchResultsFor": "Søk resultat for",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Tjener kunne ikke bli nådd",
"MessageSetChaptersFromTracksDescription": "Sett kapitler ved å bruke hver lydfil som kapittel og kapitteltittel som lydfilnavnet",
"MessageStartPlaybackAtTime": "Start avspilling av \"{0}\" ved {1}?",
diff --git a/client/strings/pl.json b/client/strings/pl.json
index 5804dd8a..86e29274 100644
--- a/client/strings/pl.json
+++ b/client/strings/pl.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Dodaj",
"ButtonAddChapters": "Dodaj rozdziały",
+ "ButtonAddDevice": "Add Device",
+ "ButtonAddLibrary": "Add Library",
"ButtonAddPodcasts": "Dodaj podcasty",
+ "ButtonAddUser": "Add User",
"ButtonAddYourFirstLibrary": "Dodaj swoją pierwszą bibliotekę",
"ButtonApply": "Zatwierdź",
"ButtonApplyChapters": "Zatwierdź rozdziały",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Usuń serię z listy odtwarzania",
"ButtonReScan": "Ponowne skanowanie",
"ButtonReset": "Resetowanie",
+ "ButtonResetToDefault": "Reset to default",
"ButtonRestore": "Przywróć",
"ButtonSave": "Zapisz",
"ButtonSaveAndClose": "Zapisz i zamknij",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Edit user {0}",
"ButtonViewAll": "Zobacz wszystko",
"ButtonYes": "Tak",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
"HeaderAccount": "Konto",
"HeaderAdvanced": "Zaawansowane",
"HeaderAppriseNotificationSettings": "Ustawienia powiadomień Apprise",
"HeaderAudiobookTools": "Narzędzia do zarządzania audiobookami",
"HeaderAudioTracks": "Ścieżki audio",
+ "HeaderAuthentication": "Authentication",
"HeaderBackups": "Kopie zapasowe",
"HeaderChangePassword": "Zmień hasło",
"HeaderChapters": "Rozdziały",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Manage Tags",
"HeaderMapDetails": "Map details",
"HeaderMatch": "Dopasuj",
+ "HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
"HeaderMetadataToEmbed": "Osadź metadane",
"HeaderNewAccount": "Nowe konto",
"HeaderNewLibrary": "Nowa biblioteka",
"HeaderNotifications": "Powiadomienia",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
"HeaderOpenRSSFeed": "Utwórz kanał RSS",
"HeaderOtherFiles": "Inne pliki",
+ "HeaderPasswordAuthentication": "Password Authentication",
"HeaderPermissions": "Uprawnienia",
"HeaderPlayerQueue": "Player Queue",
"HeaderPlaylist": "Playlist",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji",
"LabelAddToPlaylist": "Add to Playlist",
"LabelAddToPlaylistBatch": "Add {0} Items to Playlist",
+ "LabelAdminUsersOnly": "Admin users only",
"LabelAll": "All",
"LabelAllUsers": "Wszyscy użytkownicy",
+ "LabelAllUsersExcludingGuests": "All users excluding guests",
+ "LabelAllUsersIncludingGuests": "All users including guests",
"LabelAlreadyInYourLibrary": "Already in your library",
"LabelAppend": "Append",
"LabelAuthor": "Autor",
@@ -185,6 +199,12 @@
"LabelAuthorLastFirst": "Author (Malejąco)",
"LabelAuthors": "Autorzy",
"LabelAutoDownloadEpisodes": "Automatyczne pobieranie odcinków",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
"LabelBackToUser": "Powrót",
"LabelBackupLocation": "Backup Location",
"LabelBackupsEnableAutomaticBackups": "Włącz automatyczne kopie zapasowe",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "Tylko 1 kopia zapasowa zostanie usunięta, więc jeśli masz już więcej kopii zapasowych, powinieneś je ręcznie usunąć.",
"LabelBitrate": "Bitrate",
"LabelBooks": "Książki",
+ "LabelButtonText": "Button Text",
"LabelChangePassword": "Zmień hasło",
"LabelChannels": "Channels",
"LabelChapters": "Chapters",
"LabelChaptersFound": "Znalezione rozdziały",
"LabelChapterTitle": "Tytuł rozdziału",
+ "LabelClickForMoreInfo": "Click for more info",
"LabelClosePlayer": "Zamknij odtwarzacz",
"LabelCodec": "Codec",
"LabelCollapseSeries": "Podsumuj serię",
@@ -218,10 +240,12 @@
"LabelCurrently": "Obecnie:",
"LabelCustomCronExpression": "Custom Cron Expression:",
"LabelDatetime": "Data i godzina",
+ "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Opis",
"LabelDeselectAll": "Odznacz wszystko",
"LabelDevice": "Urządzenie",
"LabelDeviceInfo": "Informacja o urządzeniu",
+ "LabelDeviceIsAvailableTo": "Device is available to...",
"LabelDirectory": "Katalog",
"LabelDiscFromFilename": "Oznaczenie dysku z nazwy pliku",
"LabelDiscFromMetadata": "Oznaczenie dysku z metadanych",
@@ -247,6 +271,7 @@
"LabelExample": "Example",
"LabelExplicit": "Nieprzyzwoite",
"LabelFeedURL": "URL kanału",
+ "LabelFetchingMetadata": "Fetching Metadata",
"LabelFile": "Plik",
"LabelFileBirthtime": "Data utworzenia pliku",
"LabelFileModified": "Data modyfikacji pliku",
@@ -256,6 +281,7 @@
"LabelFinished": "Zakończone",
"LabelFolder": "Folder",
"LabelFolders": "Foldery",
+ "LabelFontFamily": "Rodzina czcionek",
"LabelFontScale": "Font scale",
"LabelFormat": "Format",
"LabelGenre": "Gatunek",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Usuń trwale plik",
"LabelHasEbook": "Has ebook",
"LabelHasSupplementaryEbook": "Has supplementary ebook",
+ "LabelHighestPriority": "Highest priority",
"LabelHost": "Host",
"LabelHour": "Godzina",
"LabelIcon": "Ikona",
+ "LabelImageURLFromTheWeb": "Image URL from the web",
"LabelIncludeInTracklist": "Dołącz do listy odtwarzania",
"LabelIncomplete": "Nieukończone",
"LabelInProgress": "W trakcie",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Informacja",
"LabelLogLevelWarn": "Ostrzeżenie",
"LabelLookForNewEpisodesAfterDate": "Szukaj nowych odcinków po dacie",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
"LabelMediaPlayer": "Odtwarzacz",
"LabelMediaType": "Typ mediów",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
"LabelMetadataProvider": "Dostawca metadanych",
"LabelMetaTag": "Tag",
"LabelMetaTags": "Meta Tags",
"LabelMinute": "Minuta",
"LabelMissing": "Brakujący",
"LabelMissingParts": "Brakujące cześci",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
"LabelMore": "Więcej",
"LabelMoreInfo": "More Info",
"LabelName": "Nazwa",
@@ -372,6 +406,7 @@
"LabelRegion": "Region",
"LabelReleaseDate": "Data wydania",
"LabelRemoveCover": "Remove cover",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Custom owner Email",
"LabelRSSFeedCustomOwnerName": "Custom owner Name",
"LabelRSSFeedOpen": "RSS Feed otwarty",
@@ -384,6 +419,7 @@
"LabelSeason": "Sezon",
"LabelSelectAllEpisodes": "Select all episodes",
"LabelSelectEpisodesShowing": "Select {0} episodes showing",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Send Ebook to...",
"LabelSequence": "Kolejność",
"LabelSeries": "Serie",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
"LabelSettingsHomePageBookshelfView": "Widok półki z książkami na stronie głównej",
"LabelSettingsLibraryBookshelfView": "Widok półki z książkami na stronie biblioteki",
- "LabelSettingsOverdriveMediaMarkers": "Użyj markerów Overdrive Media Markers dla rozdziałów",
- "LabelSettingsOverdriveMediaMarkersHelp": "Pliki MP3 z serwisu Overdrive mają wbudowane znaczniki czasu rozdziałów jako niestandardowe metadane. Włączenie tej funkcji spowoduje automatyczne użycie tych znaczników do oznaczania czasu rozdziałów.",
"LabelSettingsParseSubtitles": "Przetwarzaj podtytuły",
"LabelSettingsParseSubtitlesHelp": "Opcja pozwala na pobranie podtytułu z nazwy folderu z audiobookiem.
Podtytuł musi być rozdzielony za pomocą separatora \" - \"
Przykład: \"Book Title - A Subtitle Here\" podtytuł \"A Subtitle Here\"",
- "LabelSettingsPreferAudioMetadata": "Preferuj metadane audio",
- "LabelSettingsPreferAudioMetadataHelp": "Znaczniki meta ID3 plików audio będą używane dla szczegółów książki zamiast nazw folderów",
"LabelSettingsPreferMatchedMetadata": "Preferowanie dopasowanych metadanych",
"LabelSettingsPreferMatchedMetadataHelp": "Dopasowane dane będą miały pierwszeństwo nad szczegółami pozycji podczas używania Szybkiego dopasowania. Domyślnie Szybkie dopasowanie uzupełnia tylko brakujące szczegóły.",
- "LabelSettingsPreferOPFMetadata": "Preferowanie metadanych OPF",
- "LabelSettingsPreferOPFMetadataHelp": "Metadane pliku OPF będą używane dla szczegółów książki zamiast nazw folderów",
"LabelSettingsSkipMatchingBooksWithASIN": "Pomiń dopasowanie książek, które już mają ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Pomiń dopasowanie książek, które już mają ISBN",
"LabelSettingsSortingIgnorePrefixes": "Ignoruj prefiksy podczas sortowania",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Przechowuj okładkę w folderze książki",
"LabelSettingsStoreCoversWithItemHelp": "Domyślnie okładki są przechowywane w folderze /metadata/items, włączenie tej opcji spowoduje, że okładka będzie przechowywana w folderze ksiązki. Tylko jedna okładka o nazwie pliku \"cover\" będzie przechowywana.",
"LabelSettingsStoreMetadataWithItem": "Przechowuj metadane w folderze książki",
- "LabelSettingsStoreMetadataWithItemHelp": "Domyślnie metadane są przechowywane w folderze /metadata/items, włączenie tej opcji spowoduje, że okładka będzie przechowywana w folderze ksiązki. Tylko jedna okładka o nazwie pliku \"cover\" będzie przechowywana. Rozszerzenie pliku metadanych: .abs",
+ "LabelSettingsStoreMetadataWithItemHelp": "Domyślnie metadane są przechowywane w folderze /metadata/items, włączenie tej opcji spowoduje, że okładka będzie przechowywana w folderze ksiązki. Tylko jedna okładka o nazwie pliku \"cover\" będzie przechowywana",
"LabelSettingsTimeFormat": "Time Format",
"LabelShowAll": "Pokaż wszystko",
"LabelSize": "Rozmiar",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Umożliwienie nadpisania istniejących szczegółów dla wybranych książek w przypadku znalezienia dopasowania",
"LabelUploaderDragAndDrop": "Przeciągnij i puść foldery lub pliki",
"LabelUploaderDropFiles": "Puść pliki",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
"LabelUseChapterTrack": "Użyj ścieżki rozdziału",
"LabelUseFullTrack": "Użycie ścieżki rozdziału",
"LabelUser": "Użytkownik",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Czy na pewno chcesz usunąć kopię zapasową dla {0}?",
"MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?",
"MessageConfirmDeleteLibrary": "Czy na pewno chcesz trwale usunąć bibliotekę \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "This will delete the library item from the database and your file system. Are you sure?",
+ "MessageConfirmDeleteLibraryItems": "This will delete {0} library items from the database and your file system. Are you sure?",
"MessageConfirmDeleteSession": "Czy na pewno chcesz usunąć tę sesję?",
"MessageConfirmForceReScan": "Czy na pewno chcesz wymusić ponowne skanowanie?",
"MessageConfirmMarkAllEpisodesFinished": "Are you sure you want to mark all episodes as finished?",
"MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?",
"MessageConfirmMarkSeriesFinished": "Are you sure you want to mark all books in this series as finished?",
"MessageConfirmMarkSeriesNotFinished": "Are you sure you want to mark all books in this series as not finished?",
+ "MessageConfirmQuickEmbed": "Warning! Quick embed will not backup your audio files. Make sure that you have a backup of your audio files.
Would you like to continue?",
"MessageConfirmRemoveAllChapters": "Are you sure you want to remove all chapters?",
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Czy na pewno chcesz usunąć kolekcję \"{0}\"?",
"MessageConfirmRemoveEpisode": "Czy na pewno chcesz usunąć odcinek \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Czy na pewno chcesz usunąć {0} odcinki?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Are you sure you want to remove narrator \"{0}\"?",
"MessageConfirmRemovePlaylist": "Are you sure you want to remove your playlist \"{0}\"?",
"MessageConfirmRenameGenre": "Are you sure you want to rename genre \"{0}\" to \"{1}\" for all items?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Are you sure you want to rename tag \"{0}\" to \"{1}\" for all items?",
"MessageConfirmRenameTagMergeNote": "Note: This tag already exists so they will be merged.",
"MessageConfirmRenameTagWarning": "Warning! A similar tag with a different casing already exists \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Are you sure you want to re-scan {0} items?",
"MessageConfirmSendEbookToDevice": "Are you sure you want to send {0} ebook \"{1}\" to device \"{2}\"?",
"MessageDownloadingEpisode": "Pobieranie odcinka",
"MessageDragFilesIntoTrackOrder": "przeciągnij pliki aby ustawić właściwą kolejność utworów",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Czy na pewno chcesz przywrócić kopię zapasową utworzoną w dniu",
"MessageRestoreBackupWarning": "Przywrócenie kopii zapasowej spowoduje nadpisane bazy danych w folderze /config oraz okładke w folderze /metadata/items & /metadata/authors.
Kopie zapasowe nie modyfikują żadnego pliku w folderach z plikami audio. Jeśli włączyłeś ustawienia serwera, aby przechowywać okładki i metadane w folderach biblioteki, to nie są one zapisywane w kopii zapasowej lub nadpisywane
Wszyscy klienci korzystający z Twojego serwera będą automatycznie odświeżani",
"MessageSearchResultsFor": "Wyniki wyszukiwania dla",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Nie udało się uzyskać połączenia z serwerem",
"MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name",
"MessageStartPlaybackAtTime": "Rozpoczęcie odtwarzania \"{0}\" od {1}?",
diff --git a/client/strings/ru.json b/client/strings/ru.json
index 50b93cc9..4d26c4aa 100644
--- a/client/strings/ru.json
+++ b/client/strings/ru.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "Добавить",
"ButtonAddChapters": "Добавить главы",
+ "ButtonAddDevice": "Добавить устройство",
+ "ButtonAddLibrary": "Добавить библиотеку",
"ButtonAddPodcasts": "Добавить подкасты",
+ "ButtonAddUser": "Добавить пользователя",
"ButtonAddYourFirstLibrary": "Добавьте Вашу первую библиотеку",
"ButtonApply": "Применить",
"ButtonApplyChapters": "Применить главы",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Удалить серию из Продолжить серию",
"ButtonReScan": "Пересканировать",
"ButtonReset": "Сбросить",
+ "ButtonResetToDefault": "Сборосить по умолчанию",
"ButtonRestore": "Восстановить",
"ButtonSave": "Сохранить",
"ButtonSaveAndClose": "Сохранить и закрыть",
@@ -74,7 +78,7 @@
"ButtonStartM4BEncode": "Начать кодирование M4B",
"ButtonStartMetadataEmbed": "Начать встраивание метаданных",
"ButtonSubmit": "Применить",
- "ButtonTest": "Test",
+ "ButtonTest": "Тест",
"ButtonUpload": "Загрузить",
"ButtonUploadBackup": "Загрузить бэкап",
"ButtonUploadCover": "Загрузить обложку",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "Редактировать пользователя {0}",
"ButtonViewAll": "Посмотреть все",
"ButtonYes": "Да",
+ "ErrorUploadFetchMetadataAPI": "Ошибка при получении метаданных",
+ "ErrorUploadFetchMetadataNoResults": "Не удалось получить метаданные - попробуйте обновить название и/или автора",
+ "ErrorUploadLacksTitle": "Название должно быть заполнено",
"HeaderAccount": "Учетная запись",
"HeaderAdvanced": "Дополнительно",
"HeaderAppriseNotificationSettings": "Настройки оповещений",
"HeaderAudiobookTools": "Инструменты файлов аудиокниг",
"HeaderAudioTracks": "Аудио треки",
+ "HeaderAuthentication": "Аутентификация",
"HeaderBackups": "Бэкапы",
"HeaderChangePassword": "Изменить пароль",
"HeaderChapters": "Главы",
@@ -122,12 +130,15 @@
"HeaderManageTags": "Редактировать теги",
"HeaderMapDetails": "Найти подробности",
"HeaderMatch": "Поиск",
+ "HeaderMetadataOrderOfPrecedence": "Порядок приоритета метаданных",
"HeaderMetadataToEmbed": "Метаинформация для встраивания",
"HeaderNewAccount": "Новая учетная запись",
"HeaderNewLibrary": "Новая библиотека",
"HeaderNotifications": "Уведомления",
+ "HeaderOpenIDConnectAuthentication": "Аутентификация OpenID Connect",
"HeaderOpenRSSFeed": "Открыть RSS-канал",
"HeaderOtherFiles": "Другие файлы",
+ "HeaderPasswordAuthentication": "Аутентификация по паролю",
"HeaderPermissions": "Разрешения",
"HeaderPlayerQueue": "Очередь воспроизведения",
"HeaderPlaylist": "Плейлист",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "Добавить {0} книг в коллекцию",
"LabelAddToPlaylist": "Добавить в плейлист",
"LabelAddToPlaylistBatch": "Добавить {0} элементов в плейлист",
+ "LabelAdminUsersOnly": "Только для пользователей с правами администратора",
"LabelAll": "Все",
"LabelAllUsers": "Все пользователи",
+ "LabelAllUsersExcludingGuests": "Все пользователи, кроме гостей",
+ "LabelAllUsersIncludingGuests": "Все пользователи, включая гостей",
"LabelAlreadyInYourLibrary": "Уже в Вашей библиотеке",
"LabelAppend": "Добавить",
"LabelAuthor": "Автор",
@@ -185,8 +199,14 @@
"LabelAuthorLastFirst": "Автор (Фамилия, Имя)",
"LabelAuthors": "Авторы",
"LabelAutoDownloadEpisodes": "Скачивать эпизоды автоматически",
+ "LabelAutoFetchMetadata": "Автоматическое извлечение метаданных",
+ "LabelAutoFetchMetadataHelp": "Извлекает метаданные для названия, автора и серии для упрощения загрузки. После загрузки может потребоваться сопоставление дополнительных метаданных.",
+ "LabelAutoLaunch": "Автозапуск",
+ "LabelAutoLaunchDescription": "Редирект на провайдера аутентификации автоматически при переходе на страницу входа (путь ручного переопределения
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Автоматическая регистрация",
+ "LabelAutoRegisterDescription": "Автоматическое создание новых пользователей после входа в систему",
"LabelBackToUser": "Назад к пользователю",
- "LabelBackupLocation": "Backup Location",
+ "LabelBackupLocation": "Путь для бэкапов",
"LabelBackupsEnableAutomaticBackups": "Включить автоматическое бэкапирование",
"LabelBackupsEnableAutomaticBackupsHelp": "Бэкапы сохраняются в /metadata/backups",
"LabelBackupsMaxBackupSize": "Максимальный размер бэкапа (в GB)",
@@ -195,11 +215,13 @@
"LabelBackupsNumberToKeepHelp": "За один раз только 1 бэкап будет удален, так что если у вас будет больше бэкапов, то их нужно удалить вручную.",
"LabelBitrate": "Битрейт",
"LabelBooks": "Книги",
+ "LabelButtonText": "Текст кнопки",
"LabelChangePassword": "Изменить пароль",
"LabelChannels": "Каналы",
"LabelChapters": "Главы",
"LabelChaptersFound": "глав найдено",
"LabelChapterTitle": "Название главы",
+ "LabelClickForMoreInfo": "Нажмите, чтобы узнать больше",
"LabelClosePlayer": "Закрыть проигрыватель",
"LabelCodec": "Кодек",
"LabelCollapseSeries": "Свернуть серии",
@@ -218,10 +240,12 @@
"LabelCurrently": "Текущее:",
"LabelCustomCronExpression": "Пользовательское выражение Cron:",
"LabelDatetime": "Дата и время",
+ "LabelDeleteFromFileSystemCheckbox": "Удалить из файловой системы (снимите флажок, чтобы удалить только из базы данных)",
"LabelDescription": "Описание",
"LabelDeselectAll": "Снять выделение",
"LabelDevice": "Устройство",
"LabelDeviceInfo": "Информация об устройстве",
+ "LabelDeviceIsAvailableTo": "Устройство доступно для...",
"LabelDirectory": "Каталог",
"LabelDiscFromFilename": "Диск из Имени файла",
"LabelDiscFromMetadata": "Диск из Метаданных",
@@ -247,6 +271,7 @@
"LabelExample": "Пример",
"LabelExplicit": "Явный",
"LabelFeedURL": "URL канала",
+ "LabelFetchingMetadata": "Извлечение метаданных",
"LabelFile": "Файл",
"LabelFileBirthtime": "Дата создания",
"LabelFileModified": "Дата модификации",
@@ -256,6 +281,7 @@
"LabelFinished": "Закончен",
"LabelFolder": "Папка",
"LabelFolders": "Папки",
+ "LabelFontFamily": "Семейство шрифтов",
"LabelFontScale": "Масштаб шрифта",
"LabelFormat": "Формат",
"LabelGenre": "Жанр",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "Жесткое удаление файла",
"LabelHasEbook": "Есть e-книга",
"LabelHasSupplementaryEbook": "Есть дополнительная e-книга",
+ "LabelHighestPriority": "Наивысший приоритет",
"LabelHost": "Хост",
"LabelHour": "Часы",
"LabelIcon": "Иконка",
+ "LabelImageURLFromTheWeb": "URL-адрес изображения из Интернета",
"LabelIncludeInTracklist": "Включать в список воспроизведения",
"LabelIncomplete": "Не завершен",
"LabelInProgress": "В процессе",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Искать новые эпизоды после этой даты",
+ "LabelLowestPriority": "Самый низкий приоритет",
+ "LabelMatchExistingUsersBy": "Сопоставление существующих пользователей по",
+ "LabelMatchExistingUsersByDescription": "Используется для подключения существующих пользователей. После подключения пользователям будет присвоен уникальный идентификатор от поставщика единого входа",
"LabelMediaPlayer": "Медиа проигрыватель",
"LabelMediaType": "Тип медиа",
+ "LabelMetadataOrderOfPrecedenceDescription": "Источники метаданных с более высоким приоритетом будут переопределять источники метаданных с более низким приоритетом",
"LabelMetadataProvider": "Провайдер",
"LabelMetaTag": "Мета тег",
"LabelMetaTags": "Мета теги",
"LabelMinute": "Минуты",
"LabelMissing": "Потеряно",
"LabelMissingParts": "Потерянные части",
+ "LabelMobileRedirectURIs": "Разрешенные URI перенаправления с мобильных устройств",
+ "LabelMobileRedirectURIsDescription": "Это белый список допустимых URI перенаправления для мобильных приложений. По умолчанию используется
audiobookshelf://oauth
, который можно удалить или дополнить дополнительными URI для интеграции со сторонними приложениями. Использование звездочки (
*
) в качестве единственной записи разрешает любой URI.",
"LabelMore": "Еще",
"LabelMoreInfo": "Больше информации",
"LabelName": "Имя",
@@ -372,6 +406,7 @@
"LabelRegion": "Регион",
"LabelReleaseDate": "Дата выхода",
"LabelRemoveCover": "Удалить обложку",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "Пользовательский Email владельца",
"LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца",
"LabelRSSFeedOpen": "Открыть RSS-канал",
@@ -384,6 +419,7 @@
"LabelSeason": "Сезон",
"LabelSelectAllEpisodes": "Выбрать все эпизоды",
"LabelSelectEpisodesShowing": "Выберите {0} эпизодов для показа",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "Отправить e-книгу в...",
"LabelSequence": "Последовательность",
"LabelSeries": "Серия",
@@ -410,16 +446,10 @@
"LabelSettingsHideSingleBookSeriesHelp": "Серии, в которых всего одна книга, будут скрыты со страницы серий и полок домашней страницы.",
"LabelSettingsHomePageBookshelfView": "Вид книжной полки на Домашней странице",
"LabelSettingsLibraryBookshelfView": "Вид книжной полки в Библиотеке",
- "LabelSettingsOverdriveMediaMarkers": "Overdrive Media Markers для глав",
- "LabelSettingsOverdriveMediaMarkersHelp": "MP3 файлы из Overdrive поставляется с таймингами глав, встроенными в виде пользовательских метаданных. При включении этого параметра эти теги будут автоматически использоваться для таймингов глав",
"LabelSettingsParseSubtitles": "Разбор подзаголовков",
"LabelSettingsParseSubtitlesHelp": "Извлечение подзаголовков из имен папок аудиокниг.
Подзаголовок должны быть отделен \" - \"
например \"Название Книги - Тут Подзаголовок\" подзаголовок будет \"Тут Подзаголовок\"",
- "LabelSettingsPreferAudioMetadata": "Предпочитать аудио метаданные",
- "LabelSettingsPreferAudioMetadataHelp": "ID3 мета теги будут использоваться для данных книг вместо имен папок",
"LabelSettingsPreferMatchedMetadata": "Предпочитать метаданные поиска",
"LabelSettingsPreferMatchedMetadataHelp": "Данные поиска будут перезаписывать данные книг при использовании Быстрого Поиска. По умолчанию Быстрый Поиск будет использоваться только при отсутствии данных",
- "LabelSettingsPreferOPFMetadata": "Предпочитать OPF метаданные",
- "LabelSettingsPreferOPFMetadataHelp": "Метаданные из файла OPF будут использованы для данных книги вместо имен папок",
"LabelSettingsSkipMatchingBooksWithASIN": "Пропускать Поиск книг у которых уже заполнен ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Пропускать Поиск книг у которых уже заполнен ISBN",
"LabelSettingsSortingIgnorePrefixes": "Игнорировать префиксы при сортировке",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "Хранить обложки с элементом",
"LabelSettingsStoreCoversWithItemHelp": "По умолчанию обложки сохраняются в папке /metadata/items, при включении этой настройки обложка будет храниться в папке элемента. Будет сохраняться только один файл с именем \"cover\"",
"LabelSettingsStoreMetadataWithItem": "Хранить метаинформацию с элементом",
- "LabelSettingsStoreMetadataWithItemHelp": "По умолчанию метаинформация сохраняется в папке /metadata/items, при включении этой настройки метаинформация будет храниться в папке элемента. Используется расширение файла .abs",
+ "LabelSettingsStoreMetadataWithItemHelp": "По умолчанию метаинформация сохраняется в папке /metadata/items, при включении этой настройки метаинформация будет храниться в папке элемента",
"LabelSettingsTimeFormat": "Формат времени",
"LabelShowAll": "Показать все",
"LabelSize": "Размер",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "Позволяет перезаписывать текущие подробности для выбранных книг если будут найдены",
"LabelUploaderDragAndDrop": "Перетащите файлы или каталоги",
"LabelUploaderDropFiles": "Перетащите файлы",
+ "LabelUploaderItemFetchMetadataHelp": "Автоматическое извлечение названия, автора и серии",
"LabelUseChapterTrack": "Показывать время главы",
"LabelUseFullTrack": "Показывать время книги",
"LabelUser": "Пользователь",
@@ -527,17 +558,21 @@
"MessageConfirmDeleteBackup": "Вы уверены, что хотите удалить бэкап для {0}?",
"MessageConfirmDeleteFile": "Это удалит файл из Вашей файловой системы. Вы уверены?",
"MessageConfirmDeleteLibrary": "Вы уверены, что хотите навсегда удалить библиотеку \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "Это приведет к удалению элемента библиотеки из базы данных и файловой системы. Вы уверены?",
+ "MessageConfirmDeleteLibraryItems": "Это приведет к удалению {0} элементов библиотеки из базы данных и файловой системы. Вы уверены?",
"MessageConfirmDeleteSession": "Вы уверены, что хотите удалить этот сеанс?",
"MessageConfirmForceReScan": "Вы уверены, что хотите принудительно выполнить повторное сканирование?",
"MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все эпизоды как завершенные?",
"MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все эпизоды как не завершенные?",
"MessageConfirmMarkSeriesFinished": "Вы уверены, что хотите отметить все книги этой серии как завершенные?",
"MessageConfirmMarkSeriesNotFinished": "Вы уверены, что хотите отметить все книги этой серии как не завершенные?",
+ "MessageConfirmQuickEmbed": "Предупреждение! Быстрое встраивание не позволяет создавать резервные копии аудиофайлов. Убедитесь, что у вас есть резервная копия аудиофайлов.
Хотите продолжить?",
"MessageConfirmRemoveAllChapters": "Вы уверены, что хотите удалить все главы?",
- "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
+ "MessageConfirmRemoveAuthor": "Вы уверены, что хотите удалить автора \"{0}\"?",
"MessageConfirmRemoveCollection": "Вы уверены, что хотите удалить коллекцию \"{0}\"?",
"MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить эпизод \"{0}\"?",
"MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} эпизодов?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "Вы уверены, что хотите удалить чтеца \"{0}\"?",
"MessageConfirmRemovePlaylist": "Вы уверены, что хотите удалить плейлист \"{0}\"?",
"MessageConfirmRenameGenre": "Вы уверены, что хотите переименовать жанр \"{0}\" в \"{1}\" для всех элементов?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "Вы уверены, что хотите переименовать тег \"{0}\" в \"{1}\" для всех элементов?",
"MessageConfirmRenameTagMergeNote": "Примечание: Этот тег уже существует, поэтому они будут объединены.",
"MessageConfirmRenameTagWarning": "Предупреждение! Похожий тег с другими начальными буквами уже существует \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Вы уверены, что хотите пересканировать {0} элементов?",
"MessageConfirmSendEbookToDevice": "Вы уверены, что хотите отправить {0} e-книгу \"{1}\" на устройство \"{2}\"?",
"MessageDownloadingEpisode": "Эпизод скачивается",
"MessageDragFilesIntoTrackOrder": "Перетащите файлы для исправления порядка треков",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "Вы уверены, что хотите восстановить резервную копию, созданную",
"MessageRestoreBackupWarning": "Восстановление резервной копии перезапишет всю базу данных, расположенную в /config, и обложки изображений в /metadata/items и /metadata/authors.
Бэкапы не изменяют файлы в папках библиотеки. Если вы включили параметры сервера для хранения обложек и метаданных в папках библиотеки, то они не резервируются и не перезаписываются.
Все клиенты, использующие ваш сервер, будут автоматически обновлены.",
"MessageSearchResultsFor": "Результаты поиска для",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "Не удалось связаться с сервером",
"MessageSetChaptersFromTracksDescription": "Установка глав с использованием каждого аудиофайла в качестве главы и заголовка главы в качестве имени аудиофайла",
"MessageStartPlaybackAtTime": "Начать воспроизведение для \"{0}\" с {1}?",
diff --git a/client/strings/sv.json b/client/strings/sv.json
new file mode 100644
index 00000000..1d71fce5
--- /dev/null
+++ b/client/strings/sv.json
@@ -0,0 +1,753 @@
+{
+ "ButtonAdd": "Lägg till",
+ "ButtonAddChapters": "Lägg till kapitel",
+ "ButtonAddDevice": "Lägg till enhet",
+ "ButtonAddLibrary": "Lägg till bibliotek",
+ "ButtonAddPodcasts": "Lägg till podcasts",
+ "ButtonAddUser": "Lägg till användare",
+ "ButtonAddYourFirstLibrary": "Lägg till ditt första bibliotek",
+ "ButtonApply": "Tillämpa",
+ "ButtonApplyChapters": "Tillämpa kapitel",
+ "ButtonAuthors": "Författare",
+ "ButtonBrowseForFolder": "Bläddra efter mapp",
+ "ButtonCancel": "Avbryt",
+ "ButtonCancelEncode": "Avbryt kodning",
+ "ButtonChangeRootPassword": "Ändra rootlösenord",
+ "ButtonCheckAndDownloadNewEpisodes": "Kontrollera och ladda ner nya avsnitt",
+ "ButtonChooseAFolder": "Välj en mapp",
+ "ButtonChooseFiles": "Välj filer",
+ "ButtonClearFilter": "Rensa filter",
+ "ButtonCloseFeed": "Stäng flöde",
+ "ButtonCollections": "Samlingar",
+ "ButtonConfigureScanner": "Konfigurera skanner",
+ "ButtonCreate": "Skapa",
+ "ButtonCreateBackup": "Skapa säkerhetskopia",
+ "ButtonDelete": "Radera",
+ "ButtonDownloadQueue": "Kö",
+ "ButtonEdit": "Redigera",
+ "ButtonEditChapters": "Redigera kapitel",
+ "ButtonEditPodcast": "Redigera podcast",
+ "ButtonForceReScan": "Tvinga omstart",
+ "ButtonFullPath": "Full sökväg",
+ "ButtonHide": "Dölj",
+ "ButtonHome": "Hem",
+ "ButtonIssues": "Problem",
+ "ButtonLatest": "Senaste",
+ "ButtonLibrary": "Bibliotek",
+ "ButtonLogout": "Logga ut",
+ "ButtonLookup": "Sök",
+ "ButtonManageTracks": "Hantera spår",
+ "ButtonMapChapterTitles": "Karta kapitelrubriker",
+ "ButtonMatchAllAuthors": "Matcha alla författare",
+ "ButtonMatchBooks": "Matcha böcker",
+ "ButtonNevermind": "Glöm det",
+ "ButtonOk": "Okej",
+ "ButtonOpenFeed": "Öppna flöde",
+ "ButtonOpenManager": "Öppna Manager",
+ "ButtonPlay": "Spela",
+ "ButtonPlaying": "Spelar",
+ "ButtonPlaylists": "Spellistor",
+ "ButtonPurgeAllCache": "Rensa all cache",
+ "ButtonPurgeItemsCache": "Rensa föremåls-cache",
+ "ButtonPurgeMediaProgress": "Rensa medieförlopp",
+ "ButtonQueueAddItem": "Lägg till i kön",
+ "ButtonQueueRemoveItem": "Ta bort från kön",
+ "ButtonQuickMatch": "Snabb matchning",
+ "ButtonRead": "Läs",
+ "ButtonRemove": "Ta bort",
+ "ButtonRemoveAll": "Ta bort alla",
+ "ButtonRemoveAllLibraryItems": "Ta bort alla biblioteksobjekt",
+ "ButtonRemoveFromContinueListening": "Ta bort från Fortsätt lyssna",
+ "ButtonRemoveFromContinueReading": "Ta bort från Fortsätt läsa",
+ "ButtonRemoveSeriesFromContinueSeries": "Ta bort serie från Fortsätt serie",
+ "ButtonReScan": "Omstart",
+ "ButtonReset": "Återställ",
+ "ButtonResetToDefault": "Återställ till standard",
+ "ButtonRestore": "Återställ",
+ "ButtonSave": "Spara",
+ "ButtonSaveAndClose": "Spara och stäng",
+ "ButtonSaveTracklist": "Spara spårlista",
+ "ButtonScan": "Skanna",
+ "ButtonScanLibrary": "Skanna bibliotek",
+ "ButtonSearch": "Sök",
+ "ButtonSelectFolderPath": "Välj mappens sökväg",
+ "ButtonSeries": "Serie",
+ "ButtonSetChaptersFromTracks": "Ställ in kapitel från spår",
+ "ButtonShiftTimes": "Förskjut tider",
+ "ButtonShow": "Visa",
+ "ButtonStartM4BEncode": "Starta M4B-kodning",
+ "ButtonStartMetadataEmbed": "Starta inbäddning av metadata",
+ "ButtonSubmit": "Skicka",
+ "ButtonTest": "Testa",
+ "ButtonUpload": "Ladda upp",
+ "ButtonUploadBackup": "Ladda upp säkerhetskopia",
+ "ButtonUploadCover": "Ladda upp omslag",
+ "ButtonUploadOPMLFile": "Ladda upp OPML-fil",
+ "ButtonUserDelete": "Radera användare {0}",
+ "ButtonUserEdit": "Redigera användare {0}",
+ "ButtonViewAll": "Visa alla",
+ "ButtonYes": "Ja",
+ "ErrorUploadFetchMetadataAPI": "Error fetching metadata",
+ "ErrorUploadFetchMetadataNoResults": "Could not fetch metadata - try updating title and/or author",
+ "ErrorUploadLacksTitle": "Must have a title",
+ "HeaderAccount": "Konto",
+ "HeaderAdvanced": "Avancerad",
+ "HeaderAppriseNotificationSettings": "Apprise Meddelandeinställningar",
+ "HeaderAudiobookTools": "Ljudbokshantering",
+ "HeaderAudioTracks": "Ljudspår",
+ "HeaderAuthentication": "Authentication",
+ "HeaderBackups": "Säkerhetskopior",
+ "HeaderChangePassword": "Ändra lösenord",
+ "HeaderChapters": "Kapitel",
+ "HeaderChooseAFolder": "Välj en mapp",
+ "HeaderCollection": "Samling",
+ "HeaderCollectionItems": "Samlingselement",
+ "HeaderCover": "Omslag",
+ "HeaderCurrentDownloads": "Aktuella nedladdningar",
+ "HeaderDetails": "Detaljer",
+ "HeaderDownloadQueue": "Nedladdningskö",
+ "HeaderEbookFiles": "E-boksfiler",
+ "HeaderEmail": "E-post",
+ "HeaderEmailSettings": "E-postinställningar",
+ "HeaderEpisodes": "Avsnitt",
+ "HeaderEreaderDevices": "E-boksläsarenheter",
+ "HeaderEreaderSettings": "E-boksinställningar",
+ "HeaderFiles": "Filer",
+ "HeaderFindChapters": "Hitta kapitel",
+ "HeaderIgnoredFiles": "Ignorerade filer",
+ "HeaderItemFiles": "Föremålsfiler",
+ "HeaderItemMetadataUtils": "Metadataverktyg för föremål",
+ "HeaderLastListeningSession": "Senaste lyssningssession",
+ "HeaderLatestEpisodes": "Senaste avsnitt",
+ "HeaderLibraries": "Bibliotek",
+ "HeaderLibraryFiles": "Biblioteksfiler",
+ "HeaderLibraryStats": "Biblioteksstatistik",
+ "HeaderListeningSessions": "Lyssningssessioner",
+ "HeaderListeningStats": "Lyssningsstatistik",
+ "HeaderLogin": "Logga in",
+ "HeaderLogs": "Loggar",
+ "HeaderManageGenres": "Hantera genrer",
+ "HeaderManageTags": "Hantera taggar",
+ "HeaderMapDetails": "Karta detaljer",
+ "HeaderMatch": "Matcha",
+ "HeaderMetadataOrderOfPrecedence": "Metadataordning av företräde",
+ "HeaderMetadataToEmbed": "Metadata att bädda in",
+ "HeaderNewAccount": "Nytt konto",
+ "HeaderNewLibrary": "Nytt bibliotek",
+ "HeaderNotifications": "Meddelanden",
+ "HeaderOpenIDConnectAuthentication": "OpenID Connect Authentication",
+ "HeaderOpenRSSFeed": "Öppna RSS-flöde",
+ "HeaderOtherFiles": "Andra filer",
+ "HeaderPasswordAuthentication": "Password Authentication",
+ "HeaderPermissions": "Behörigheter",
+ "HeaderPlayerQueue": "Spelarkö",
+ "HeaderPlaylist": "Spellista",
+ "HeaderPlaylistItems": "Spellistobjekt",
+ "HeaderPodcastsToAdd": "Podcaster att lägga till",
+ "HeaderPreviewCover": "Förhandsgranska omslag",
+ "HeaderRemoveEpisode": "Ta bort avsnitt",
+ "HeaderRemoveEpisodes": "Ta bort {0} avsnitt",
+ "HeaderRSSFeedGeneral": "RSS-information",
+ "HeaderRSSFeedIsOpen": "RSS-flödet är öppet",
+ "HeaderRSSFeeds": "RSS-flöden",
+ "HeaderSavedMediaProgress": "Sparad medieförlopp",
+ "HeaderSchedule": "Schema",
+ "HeaderScheduleLibraryScans": "Schemalagda biblioteksskanningar",
+ "HeaderSession": "Session",
+ "HeaderSetBackupSchedule": "Ange schemaläggning för säkerhetskopia",
+ "HeaderSettings": "Inställningar",
+ "HeaderSettingsDisplay": "Visning",
+ "HeaderSettingsExperimental": "Experimentella funktioner",
+ "HeaderSettingsGeneral": "Allmänt",
+ "HeaderSettingsScanner": "Skanner",
+ "HeaderSleepTimer": "Sovtidtagare",
+ "HeaderStatsLargestItems": "Största föremål",
+ "HeaderStatsLongestItems": "Längsta föremål (tim)",
+ "HeaderStatsMinutesListeningChart": "Minuters lyssning (senaste 7 dagar)",
+ "HeaderStatsRecentSessions": "Senaste sessioner",
+ "HeaderStatsTop10Authors": "Topp 10 författare",
+ "HeaderStatsTop5Genres": "Topp 5 genrer",
+ "HeaderTableOfContents": "Innehållsförteckning",
+ "HeaderTools": "Verktyg",
+ "HeaderUpdateAccount": "Uppdatera konto",
+ "HeaderUpdateAuthor": "Uppdatera författare",
+ "HeaderUpdateDetails": "Uppdatera detaljer",
+ "HeaderUpdateLibrary": "Uppdatera bibliotek",
+ "HeaderUsers": "Användare",
+ "HeaderYourStats": "Dina statistik",
+ "LabelAbridged": "Förkortad",
+ "LabelAccountType": "Kontotyp",
+ "LabelAccountTypeAdmin": "Admin",
+ "LabelAccountTypeGuest": "Gäst",
+ "LabelAccountTypeUser": "Användare",
+ "LabelActivity": "Aktivitet",
+ "LabelAdded": "Tillagd",
+ "LabelAddedAt": "Tillagd vid",
+ "LabelAddToCollection": "Lägg till i Samling",
+ "LabelAddToCollectionBatch": "Lägg till {0} böcker i Samlingen",
+ "LabelAddToPlaylist": "Lägg till i Spellista",
+ "LabelAddToPlaylistBatch": "Lägg till {0} objekt i Spellistan",
+ "LabelAdminUsersOnly": "Endast administratörer",
+ "LabelAll": "Alla",
+ "LabelAllUsers": "Alla användare",
+ "LabelAllUsersExcludingGuests": "Alla användare utom gäster",
+ "LabelAllUsersIncludingGuests": "Alla användare inklusive gäster",
+ "LabelAlreadyInYourLibrary": "Redan i din samling",
+ "LabelAppend": "Lägg till",
+ "LabelAuthor": "Författare",
+ "LabelAuthorFirstLast": "Författare (Förnamn Efternamn)",
+ "LabelAuthorLastFirst": "Författare (Efternamn, Förnamn)",
+ "LabelAuthors": "Författare",
+ "LabelAutoDownloadEpisodes": "Automatisk nedladdning av avsnitt",
+ "LabelAutoFetchMetadata": "Auto Fetch Metadata",
+ "LabelAutoFetchMetadataHelp": "Fetches metadata for title, author, and series to streamline uploading. Additional metadata may have to be matched after upload.",
+ "LabelAutoLaunch": "Auto Launch",
+ "LabelAutoLaunchDescription": "Redirect to the auth provider automatically when navigating to the login page (manual override path
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "Auto Register",
+ "LabelAutoRegisterDescription": "Automatically create new users after logging in",
+ "LabelBackToUser": "Tillbaka till användaren",
+ "LabelBackupLocation": "Säkerhetskopia Plats",
+ "LabelBackupsEnableAutomaticBackups": "Aktivera automatiska säkerhetskopior",
+ "LabelBackupsEnableAutomaticBackupsHelp": "Säkerhetskopior sparas i /metadata/säkerhetskopior",
+ "LabelBackupsMaxBackupSize": "Maximal säkerhetskopiostorlek (i GB)",
+ "LabelBackupsMaxBackupSizeHelp": "Som ett skydd mot felkonfiguration kommer säkerhetskopior att misslyckas om de överskrider den konfigurerade storleken.",
+ "LabelBackupsNumberToKeep": "Antal säkerhetskopior att behålla",
+ "LabelBackupsNumberToKeepHelp": "Endast en säkerhetskopia tas bort åt gången, så om du redan har fler säkerhetskopior än detta bör du ta bort dem manuellt.",
+ "LabelBitrate": "Bitfrekvens",
+ "LabelBooks": "Böcker",
+ "LabelButtonText": "Button Text",
+ "LabelChangePassword": "Ändra lösenord",
+ "LabelChannels": "Kanaler",
+ "LabelChapters": "Kapitel",
+ "LabelChaptersFound": "hittade kapitel",
+ "LabelChapterTitle": "Kapitelrubrik",
+ "LabelClickForMoreInfo": "Klicka för mer information",
+ "LabelClosePlayer": "Stäng spelaren",
+ "LabelCodec": "Codec",
+ "LabelCollapseSeries": "Fäll ihop serie",
+ "LabelCollection": "Samling",
+ "LabelCollections": "Samlingar",
+ "LabelComplete": "Komplett",
+ "LabelConfirmPassword": "Bekräfta lösenord",
+ "LabelContinueListening": "Fortsätt lyssna",
+ "LabelContinueReading": "Fortsätt läsa",
+ "LabelContinueSeries": "Fortsätt serie",
+ "LabelCover": "Omslag",
+ "LabelCoverImageURL": "URL till omslagsbild",
+ "LabelCreatedAt": "Skapad vid",
+ "LabelCronExpression": "Cron-uttryck",
+ "LabelCurrent": "Nuvarande",
+ "LabelCurrently": "För närvarande:",
+ "LabelCustomCronExpression": "Anpassat Cron-uttryck:",
+ "LabelDatetime": "Datum och tid",
+ "LabelDeleteFromFileSystemCheckbox": "Ta bort från filsystem (avmarkera för att endast ta bort från databasen)",
+ "LabelDescription": "Beskrivning",
+ "LabelDeselectAll": "Avmarkera alla",
+ "LabelDevice": "Enhet",
+ "LabelDeviceInfo": "Enhetsinformation",
+ "LabelDeviceIsAvailableTo": "Enhet är tillgänglig för...",
+ "LabelDirectory": "Katalog",
+ "LabelDiscFromFilename": "Skiva från filnamn",
+ "LabelDiscFromMetadata": "Skiva från metadata",
+ "LabelDiscover": "Upptäck",
+ "LabelDownload": "Ladda ner",
+ "LabelDownloadNEpisodes": "Ladda ner {0} avsnitt",
+ "LabelDuration": "Varaktighet",
+ "LabelDurationFound": "Varaktighet hittad:",
+ "LabelEbook": "E-bok",
+ "LabelEbooks": "E-böcker",
+ "LabelEdit": "Redigera",
+ "LabelEmail": "E-post",
+ "LabelEmailSettingsFromAddress": "Från adress",
+ "LabelEmailSettingsSecure": "Säker",
+ "LabelEmailSettingsSecureHelp": "Om sant kommer anslutningen att använda TLS vid anslutning till servern. Om falskt används TLS om servern stöder STARTTLS-tillägget. I de flesta fall, om du ansluter till port 465, bör du ställa in detta värde till sant. För port 587 eller 25, låt det vara falskt. (från nodemailer.com/smtp/#authentication)",
+ "LabelEmailSettingsTestAddress": "Testadress",
+ "LabelEmbeddedCover": "Inbäddat omslag",
+ "LabelEnable": "Aktivera",
+ "LabelEnd": "Slut",
+ "LabelEpisode": "Avsnitt",
+ "LabelEpisodeTitle": "Avsnittsrubrik",
+ "LabelEpisodeType": "Avsnittstyp",
+ "LabelExample": "Exempel",
+ "LabelExplicit": "Explicit",
+ "LabelFeedURL": "Flödes-URL",
+ "LabelFetchingMetadata": "Fetching Metadata",
+ "LabelFile": "Fil",
+ "LabelFileBirthtime": "Födelse-tidpunkt för fil",
+ "LabelFileModified": "Fil ändrad",
+ "LabelFilename": "Filnamn",
+ "LabelFilterByUser": "Filtrera efter användare",
+ "LabelFindEpisodes": "Hitta avsnitt",
+ "LabelFinished": "Avslutad",
+ "LabelFolder": "Mapp",
+ "LabelFolders": "Mappar",
+ "LabelFontFamily": "Teckensnittsfamilj",
+ "LabelFontScale": "Teckensnittsskala",
+ "LabelFormat": "Format",
+ "LabelGenre": "Genre",
+ "LabelGenres": "Genrer",
+ "LabelHardDeleteFile": "Hård radering av fil",
+ "LabelHasEbook": "Har e-bok",
+ "LabelHasSupplementaryEbook": "Har kompletterande e-bok",
+ "LabelHighestPriority": "Highest priority",
+ "LabelHost": "Värd",
+ "LabelHour": "Timme",
+ "LabelIcon": "Ikon",
+ "LabelImageURLFromTheWeb": "Bild-URL från webben",
+ "LabelIncludeInTracklist": "Inkludera i spårlista",
+ "LabelIncomplete": "Ofullständig",
+ "LabelInProgress": "Pågående",
+ "LabelInterval": "Intervall",
+ "LabelIntervalCustomDailyWeekly": "Anpassat dagligt/veckovis",
+ "LabelIntervalEvery12Hours": "Var 12:e timme",
+ "LabelIntervalEvery15Minutes": "Var 15:e minut",
+ "LabelIntervalEvery2Hours": "Var 2:e timme",
+ "LabelIntervalEvery30Minutes": "Var 30:e minut",
+ "LabelIntervalEvery6Hours": "Var 6:e timme",
+ "LabelIntervalEveryDay": "Varje dag",
+ "LabelIntervalEveryHour": "Varje timme",
+ "LabelInvalidParts": "Ogiltiga delar",
+ "LabelInvert": "Invertera",
+ "LabelItem": "Objekt",
+ "LabelLanguage": "Språk",
+ "LabelLanguageDefaultServer": "Standardspråk för server",
+ "LabelLastBookAdded": "Senaste bok tillagd",
+ "LabelLastBookUpdated": "Senaste bok uppdaterad",
+ "LabelLastSeen": "Senast sedd",
+ "LabelLastTime": "Senaste gången",
+ "LabelLastUpdate": "Senaste uppdatering",
+ "LabelLayout": "Layout",
+ "LabelLayoutSinglePage": "En sida",
+ "LabelLayoutSplitPage": "Dela sida",
+ "LabelLess": "Mindre",
+ "LabelLibrariesAccessibleToUser": "Åtkomliga bibliotek för användare",
+ "LabelLibrary": "Bibliotek",
+ "LabelLibraryItem": "Biblioteksobjekt",
+ "LabelLibraryName": "Biblioteksnamn",
+ "LabelLimit": "Begränsning",
+ "LabelLineSpacing": "Radavstånd",
+ "LabelListenAgain": "Lyssna igen",
+ "LabelLogLevelDebug": "Felsökningsnivå: Felsökning",
+ "LabelLogLevelInfo": "Felsökningsnivå: Information",
+ "LabelLogLevelWarn": "Felsökningsnivå: Varning",
+ "LabelLookForNewEpisodesAfterDate": "Sök efter nya avsnitt efter detta datum",
+ "LabelLowestPriority": "Lowest Priority",
+ "LabelMatchExistingUsersBy": "Match existing users by",
+ "LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
+ "LabelMediaPlayer": "Mediaspelare",
+ "LabelMediaType": "Mediatyp",
+ "LabelMetadataOrderOfPrecedenceDescription": "Higher priority metadata sources will override lower priority metadata sources",
+ "LabelMetadataProvider": "Metadataleverantör",
+ "LabelMetaTag": "Metamärke",
+ "LabelMetaTags": "Metamärken",
+ "LabelMinute": "Minut",
+ "LabelMissing": "Saknad",
+ "LabelMissingParts": "Saknade delar",
+ "LabelMobileRedirectURIs": "Allowed Mobile Redirect URIs",
+ "LabelMobileRedirectURIsDescription": "This is a whitelist of valid redirect URIs for mobile apps. The default one is
audiobookshelf://oauth
, which you can remove or supplement with additional URIs for third-party app integration. Using an asterisk (
*
) as the sole entry permits any URI.",
+ "LabelMore": "Mer",
+ "LabelMoreInfo": "Mer information",
+ "LabelName": "Namn",
+ "LabelNarrator": "Berättare",
+ "LabelNarrators": "Berättare",
+ "LabelNew": "Ny",
+ "LabelNewestAuthors": "Nyaste författare",
+ "LabelNewestEpisodes": "Nyaste avsnitt",
+ "LabelNewPassword": "Nytt lösenord",
+ "LabelNextBackupDate": "Nästa säkerhetskopia datum",
+ "LabelNextScheduledRun": "Nästa schemalagda körning",
+ "LabelNoEpisodesSelected": "Inga avsnitt valda",
+ "LabelNotes": "Anteckningar",
+ "LabelNotFinished": "Ej avslutad",
+ "LabelNotificationAppriseURL": "Apprise URL(er)",
+ "LabelNotificationAvailableVariables": "Tillgängliga variabler",
+ "LabelNotificationBodyTemplate": "Kroppsmall",
+ "LabelNotificationEvent": "Aviseringshändelse",
+ "LabelNotificationsMaxFailedAttempts": "Max antal misslyckade försök",
+ "LabelNotificationsMaxFailedAttemptsHelp": "Aviseringar inaktiveras när de misslyckas med att skickas så många gånger",
+ "LabelNotificationsMaxQueueSize": "Max köstorlek för aviseringsevenemang",
+ "LabelNotificationsMaxQueueSizeHelp": "Evenemang är begränsade till att utlösa ett per sekund. Evenemang kommer att ignoreras om kön är full. Detta förhindrar aviseringsspam.",
+ "LabelNotificationTitleTemplate": "Titelsmall",
+ "LabelNotStarted": "Inte påbörjad",
+ "LabelNumberOfBooks": "Antal böcker",
+ "LabelNumberOfEpisodes": "Antal avsnitt",
+ "LabelOpenRSSFeed": "Öppna RSS-flöde",
+ "LabelOverwrite": "Skriv över",
+ "LabelPassword": "Lösenord",
+ "LabelPath": "Sökväg",
+ "LabelPermissionsAccessAllLibraries": "Kan komma åt alla bibliotek",
+ "LabelPermissionsAccessAllTags": "Kan komma åt alla taggar",
+ "LabelPermissionsAccessExplicitContent": "Kan komma åt explicit innehåll",
+ "LabelPermissionsDelete": "Kan radera",
+ "LabelPermissionsDownload": "Kan ladda ner",
+ "LabelPermissionsUpdate": "Kan uppdatera",
+ "LabelPermissionsUpload": "Kan ladda upp",
+ "LabelPhotoPathURL": "Bildsökväg/URL",
+ "LabelPlaylists": "Spellistor",
+ "LabelPlayMethod": "Spelläge",
+ "LabelPodcast": "Podcast",
+ "LabelPodcasts": "Podcasts",
+ "LabelPodcastType": "Podcasttyp",
+ "LabelPort": "Port",
+ "LabelPrefixesToIgnore": "Prefix att ignorera (skiftlägesokänsligt)",
+ "LabelPreventIndexing": "Förhindra att ditt flöde indexeras av iTunes och Google-podcastsökmotorer",
+ "LabelPrimaryEbook": "Primär e-bok",
+ "LabelProgress": "Framsteg",
+ "LabelProvider": "Leverantör",
+ "LabelPubDate": "Publiceringsdatum",
+ "LabelPublisher": "Utgivare",
+ "LabelPublishYear": "Publiceringsår",
+ "LabelRead": "Läst",
+ "LabelReadAgain": "Läs igen",
+ "LabelReadEbookWithoutProgress": "Läs e-bok utan att behålla framsteg",
+ "LabelRecentlyAdded": "Nyligen tillagd",
+ "LabelRecentSeries": "Senaste serier",
+ "LabelRecommended": "Rekommenderad",
+ "LabelRegion": "Region",
+ "LabelReleaseDate": "Utgivningsdatum",
+ "LabelRemoveCover": "Ta bort omslag",
+ "LabelRowsPerPage": "Rows per page",
+ "LabelRSSFeedCustomOwnerEmail": "Anpassad ägarens e-post",
+ "LabelRSSFeedCustomOwnerName": "Anpassat ägarnamn",
+ "LabelRSSFeedOpen": "Öppna RSS-flöde",
+ "LabelRSSFeedPreventIndexing": "Förhindra indexering",
+ "LabelRSSFeedSlug": "RSS-flödesslag",
+ "LabelRSSFeedURL": "RSS-flöde URL",
+ "LabelSearchTerm": "Sökterm",
+ "LabelSearchTitle": "Sök titel",
+ "LabelSearchTitleOrASIN": "Sök titel eller ASIN",
+ "LabelSeason": "Säsong",
+ "LabelSelectAllEpisodes": "Välj alla avsnitt",
+ "LabelSelectEpisodesShowing": "Välj {0} avsnitt som visas",
+ "LabelSelectUsers": "Välj användare",
+ "LabelSendEbookToDevice": "Skicka e-bok till...",
+ "LabelSequence": "Sekvens",
+ "LabelSeries": "Serie",
+ "LabelSeriesName": "Serienamn",
+ "LabelSeriesProgress": "Serieframsteg",
+ "LabelSetEbookAsPrimary": "Ange som primär",
+ "LabelSetEbookAsSupplementary": "Ange som kompletterande",
+ "LabelSettingsAudiobooksOnly": "Endast ljudböcker",
+ "LabelSettingsAudiobooksOnlyHelp": "Aktivera detta alternativ kommer att ignorera e-boksfiler om de inte finns inom en ljudboksmapp, i vilket fall de kommer att anges som kompletterande e-böcker",
+ "LabelSettingsBookshelfViewHelp": "Skeumorfisk design med trähyllor",
+ "LabelSettingsChromecastSupport": "Chromecast-stöd",
+ "LabelSettingsDateFormat": "Datumformat",
+ "LabelSettingsDisableWatcher": "Inaktivera Watcher",
+ "LabelSettingsDisableWatcherForLibrary": "Inaktivera mappbevakning för bibliotek",
+ "LabelSettingsDisableWatcherHelp": "Inaktiverar automatiskt lägga till/uppdatera objekt när filändringar upptäcks. *Kräver omstart av servern",
+ "LabelSettingsEnableWatcher": "Aktivera Watcher",
+ "LabelSettingsEnableWatcherForLibrary": "Aktivera mappbevakning för bibliotek",
+ "LabelSettingsEnableWatcherHelp": "Aktiverar automatiskt lägga till/uppdatera objekt när filändringar upptäcks. *Kräver omstart av servern",
+ "LabelSettingsExperimentalFeatures": "Experimentella funktioner",
+ "LabelSettingsExperimentalFeaturesHelp": "Funktioner under utveckling som behöver din feedback och hjälp med testning. Klicka för att öppna diskussionen på GitHub.",
+ "LabelSettingsFindCovers": "Hitta omslag",
+ "LabelSettingsFindCoversHelp": "Om din ljudbok inte har ett inbäddat omslag eller en omslagsbild i mappen kommer skannern att försöka hitta ett omslag.
Observera: Detta kommer att förlänga skannningstiden",
+ "LabelSettingsHideSingleBookSeries": "Dölj enboksserier",
+ "LabelSettingsHideSingleBookSeriesHelp": "Serier som har en enda bok kommer att döljas från seriesidan och hyllsidan på startsidan.",
+ "LabelSettingsHomePageBookshelfView": "Startsida använd bokhyllvy",
+ "LabelSettingsLibraryBookshelfView": "Bibliotek använd bokhyllvy",
+ "LabelSettingsParseSubtitles": "Analysera undertexter",
+ "LabelSettingsParseSubtitlesHelp": "Extrahera undertexter från mappnamn för ljudböcker.
Undertext måste vara åtskilda av \" - \"
t.ex. \"Boktitel - En undertitel här\" har undertiteln \"En undertitel här\"",
+ "LabelSettingsPreferMatchedMetadata": "Föredra matchad metadata",
+ "LabelSettingsPreferMatchedMetadataHelp": "Matchad data kommer att åsidosätta objektdetaljer vid snabbmatchning. Som standard kommer snabbmatchning endast att fylla i saknade detaljer.",
+ "LabelSettingsSkipMatchingBooksWithASIN": "Hoppa över matchande böcker med ASIN",
+ "LabelSettingsSkipMatchingBooksWithISBN": "Hoppa över matchande böcker med ISBN",
+ "LabelSettingsSortingIgnorePrefixes": "Ignorera prefix vid sortering",
+ "LabelSettingsSortingIgnorePrefixesHelp": "t.ex. för prefixet \"the\" kommer boktiteln \"The Book Title\" att sorteras som \"Book Title, The\"",
+ "LabelSettingsSquareBookCovers": "Använd fyrkantiga bokomslag",
+ "LabelSettingsSquareBookCoversHelp": "Föredrar att använda fyrkantiga omslag över standard 1.6:1 bokomslag",
+ "LabelSettingsStoreCoversWithItem": "Lagra omslag med objekt",
+ "LabelSettingsStoreCoversWithItemHelp": "Som standard lagras omslag i /metadata/items, att aktivera detta alternativ kommer att lagra omslag i din biblioteksmapp. Endast en fil med namnet \"cover\" kommer att behållas",
+ "LabelSettingsStoreMetadataWithItem": "Lagra metadata med objekt",
+ "LabelSettingsStoreMetadataWithItemHelp": "Som standard lagras metadatafiler i /metadata/items, att aktivera detta alternativ kommer att lagra metadatafiler i dina biblioteksmappar",
+ "LabelSettingsTimeFormat": "Tidsformat",
+ "LabelShowAll": "Visa alla",
+ "LabelSize": "Storlek",
+ "LabelSleepTimer": "Sleeptimer",
+ "LabelSlug": "Slug",
+ "LabelStart": "Start",
+ "LabelStarted": "Startad",
+ "LabelStartedAt": "Startad vid",
+ "LabelStartTime": "Starttid",
+ "LabelStatsAudioTracks": "Ljudspår",
+ "LabelStatsAuthors": "Författare",
+ "LabelStatsBestDay": "Bästa dag",
+ "LabelStatsDailyAverage": "Dagligt genomsnitt",
+ "LabelStatsDays": "Dagar",
+ "LabelStatsDaysListened": "Dagar lyssnade",
+ "LabelStatsHours": "Timmar",
+ "LabelStatsInARow": "i rad",
+ "LabelStatsItemsFinished": "Objekt avslutade",
+ "LabelStatsItemsInLibrary": "Objekt i biblioteket",
+ "LabelStatsMinutes": "minuter",
+ "LabelStatsMinutesListening": "Minuter av lyssnande",
+ "LabelStatsOverallDays": "Totalt antal dagar",
+ "LabelStatsOverallHours": "Totalt antal timmar",
+ "LabelStatsWeekListening": "Veckans lyssnande",
+ "LabelSubtitle": "Underrubrik",
+ "LabelSupportedFileTypes": "Stödda filtyper",
+ "LabelTag": "Tagg",
+ "LabelTags": "Taggar",
+ "LabelTagsAccessibleToUser": "Taggar tillgängliga för användaren",
+ "LabelTagsNotAccessibleToUser": "Taggar inte tillgängliga för användaren",
+ "LabelTasks": "Körande uppgifter",
+ "LabelTheme": "Tema",
+ "LabelThemeDark": "Mörkt",
+ "LabelThemeLight": "Ljust",
+ "LabelTimeBase": "Tidsbas",
+ "LabelTimeListened": "Tid lyssnad",
+ "LabelTimeListenedToday": "Tid lyssnad idag",
+ "LabelTimeRemaining": "{0} kvar",
+ "LabelTimeToShift": "Tid att skifta i sekunder",
+ "LabelTitle": "Titel",
+ "LabelToolsEmbedMetadata": "Bädda in metadata",
+ "LabelToolsEmbedMetadataDescription": "Bädda in metadata i ljudfiler, inklusive omslagsbild och kapitel.",
+ "LabelToolsMakeM4b": "Skapa M4B ljudbok",
+ "LabelToolsMakeM4bDescription": "Skapa en .M4B ljudboksfil med inbäddad metadata, omslagsbild och kapitel.",
+ "LabelToolsSplitM4b": "Dela M4B till MP3-filer",
+ "LabelToolsSplitM4bDescription": "Skapa MP3-filer från en M4B fil uppdelad i kapitel med inbäddad metadata, omslagsbild och kapitel.",
+ "LabelTotalDuration": "Total varaktighet",
+ "LabelTotalTimeListened": "Total tid lyssnad",
+ "LabelTrackFromFilename": "Spår från filnamn",
+ "LabelTrackFromMetadata": "Spår från metadata",
+ "LabelTracks": "Spår",
+ "LabelTracksMultiTrack": "Flerspårigt",
+ "LabelTracksNone": "Inga spår",
+ "LabelTracksSingleTrack": "Enspårigt",
+ "LabelType": "Typ",
+ "LabelUnabridged": "Oavkortad",
+ "LabelUnknown": "Okänd",
+ "LabelUpdateCover": "Uppdatera omslag",
+ "LabelUpdateCoverHelp": "Tillåt överskrivning av befintliga omslag för de valda böckerna när en matchning hittas",
+ "LabelUpdatedAt": "Uppdaterad vid",
+ "LabelUpdateDetails": "Uppdatera detaljer",
+ "LabelUpdateDetailsHelp": "Tillåt överskrivning av befintliga detaljer för de valda böckerna när en matchning hittas",
+ "LabelUploaderDragAndDrop": "Dra och släpp filer eller mappar",
+ "LabelUploaderDropFiles": "Släpp filer",
+ "LabelUploaderItemFetchMetadataHelp": "Automatically fetch title, author, and series",
+ "LabelUseChapterTrack": "Använd kapitelspår",
+ "LabelUseFullTrack": "Använd hela spåret",
+ "LabelUser": "Användare",
+ "LabelUsername": "Användarnamn",
+ "LabelValue": "Värde",
+ "LabelVersion": "Version",
+ "LabelViewBookmarks": "Visa bokmärken",
+ "LabelViewChapters": "Visa kapitel",
+ "LabelViewQueue": "Visa spellista",
+ "LabelVolume": "Volym",
+ "LabelWeekdaysToRun": "Vardagar att köra",
+ "LabelYourAudiobookDuration": "Din ljudboks varaktighet",
+ "LabelYourBookmarks": "Dina bokmärken",
+ "LabelYourPlaylists": "Dina spellistor",
+ "LabelYourProgress": "Din framsteg",
+ "MessageAddToPlayerQueue": "Lägg till i spellistan",
+ "MessageAppriseDescription": "För att använda den här funktionen behöver du ha en instans av
Apprise API igång eller en API som hanterar dessa begäranden.
Apprise API-urlen bör vara hela URL-sökvägen för att skicka meddelandet, t.ex., om din API-instans är tillgänglig på
http://192.168.1.1:8337
, bör du ange
http://192.168.1.1:8337/notify
.",
+ "MessageBackupsDescription": "Säkerhetskopieringar inkluderar användare, användares framsteg, biblioteksföremål, serverinställningar och bilder lagrade i
/metadata/items
&
/metadata/authors
. Säkerhetskopieringar inkluderar
inte några filer lagrade i dina biblioteksmappar.",
+ "MessageBatchQuickMatchDescription": "Quick Match kommer försöka lägga till saknade omslag och metadata för de valda föremålen. Aktivera alternativen nedan för att tillåta Quick Match att överskriva befintliga omslag och/eller metadata.",
+ "MessageBookshelfNoCollections": "Du har ännu inte skapat några samlingar",
+ "MessageBookshelfNoResultsForFilter": "Inga resultat för filter \"{0}: {1}\"",
+ "MessageBookshelfNoRSSFeeds": "Inga RSS-flöden är öppna",
+ "MessageBookshelfNoSeries": "Du har inga serier",
+ "MessageChapterEndIsAfter": "Kapitelns slut är efter din ljudboks slut",
+ "MessageChapterErrorFirstNotZero": "Första kapitlet måste börja vid 0",
+ "MessageChapterErrorStartGteDuration": "Ogiltig starttid måste vara mindre än ljudbokens varaktighet",
+ "MessageChapterErrorStartLtPrev": "Ogiltig starttid måste vara större än eller lika med tidigare kapitels starttid",
+ "MessageChapterStartIsAfter": "Kapitlets start är efter din ljudboks slut",
+ "MessageCheckingCron": "Kontrollerar cron...",
+ "MessageConfirmCloseFeed": "Är du säker på att du vill stänga detta flöde?",
+ "MessageConfirmDeleteBackup": "Är du säker på att du vill radera säkerhetskopian för {0}?",
+ "MessageConfirmDeleteFile": "Detta kommer att radera filen från ditt filsystem. Är du säker?",
+ "MessageConfirmDeleteLibrary": "Är du säker på att du vill radera biblioteket \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "Detta kommer att radera biblioteksföremålet från databasen och ditt filsystem. Är du säker?",
+ "MessageConfirmDeleteLibraryItems": "Detta kommer att radera {0} biblioteksföremål från databasen och ditt filsystem. Är du säker?",
+ "MessageConfirmDeleteSession": "Är du säker på att du vill radera denna session?",
+ "MessageConfirmForceReScan": "Är du säker på att du vill tvinga omgenomsökning?",
+ "MessageConfirmMarkAllEpisodesFinished": "Är du säker på att du vill markera alla avsnitt som avslutade?",
+ "MessageConfirmMarkAllEpisodesNotFinished": "Är du säker på att du vill markera alla avsnitt som inte avslutade?",
+ "MessageConfirmMarkSeriesFinished": "Är du säker på att du vill markera alla böcker i denna serie som avslutade?",
+ "MessageConfirmMarkSeriesNotFinished": "Är du säker på att du vill markera alla böcker i denna serie som inte avslutade?",
+ "MessageConfirmQuickEmbed": "Varning! Quick embed kommer inte att säkerhetskopiera dina ljudfiler. Se till att du har en säkerhetskopia av dina ljudfiler.
Vill du fortsätta?",
+ "MessageConfirmRemoveAllChapters": "Är du säker på att du vill ta bort alla kapitel?",
+ "MessageConfirmRemoveAuthor": "Är du säker på att du vill ta bort författaren \"{0}\"?",
+ "MessageConfirmRemoveCollection": "Är du säker på att du vill ta bort samlingen \"{0}\"?",
+ "MessageConfirmRemoveEpisode": "Är du säker på att du vill ta bort avsnittet \"{0}\"?",
+ "MessageConfirmRemoveEpisodes": "Är du säker på att du vill ta bort {0} avsnitt?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
+ "MessageConfirmRemoveNarrator": "Är du säker på att du vill ta bort berättaren \"{0}\"?",
+ "MessageConfirmRemovePlaylist": "Är du säker på att du vill ta bort din spellista \"{0}\"?",
+ "MessageConfirmRenameGenre": "Är du säker på att du vill byta namn på genren \"{0}\" till \"{1}\" för alla objekt?",
+ "MessageConfirmRenameGenreMergeNote": "Observera: Den här genren finns redan, så de kommer att slås samman.",
+ "MessageConfirmRenameGenreWarning": "Varning! En liknande genre med annat skrivsätt finns redan \"{0}\".",
+ "MessageConfirmRenameTag": "Är du säker på att du vill byta namn på taggen \"{0}\" till \"{1}\" för alla objekt?",
+ "MessageConfirmRenameTagMergeNote": "Observera: Den här taggen finns redan, så de kommer att slås samman.",
+ "MessageConfirmRenameTagWarning": "Varning! En liknande tagg med annat skrivsätt finns redan \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "Är du säker på att du vill göra omgenomsökning för {0} objekt?",
+ "MessageConfirmSendEbookToDevice": "Är du säker på att du vill skicka {0} e-bok \"{1}\" till enheten \"{2}\"?",
+ "MessageDownloadingEpisode": "Laddar ner avsnitt",
+ "MessageDragFilesIntoTrackOrder": "Dra filer till rätt spårordning",
+ "MessageEmbedFinished": "Inbäddning klar!",
+ "MessageEpisodesQueuedForDownload": "{0} avsnitt i kö för nedladdning",
+ "MessageFeedURLWillBe": "Flödes-URL kommer att vara {0}",
+ "MessageFetching": "Hämtar...",
+ "MessageForceReScanDescription": "kommer att göra en omgångssökning av alla filer som en färsk sökning. ID3-taggar för ljudfiler, OPF-filer och textfiler kommer att sökas som nya.",
+ "MessageImportantNotice": "Viktig meddelande!",
+ "MessageInsertChapterBelow": "Infoga kapitel nedanför",
+ "MessageItemsSelected": "{0} Objekt markerade",
+ "MessageItemsUpdated": "{0} Objekt uppdaterade",
+ "MessageJoinUsOn": "Anslut dig till oss på",
+ "MessageListeningSessionsInTheLastYear": "{0} lyssningssessioner det senaste året",
+ "MessageLoading": "Laddar...",
+ "MessageLoadingFolders": "Laddar mappar...",
+ "MessageM4BFailed": "M4B misslyckades!",
+ "MessageM4BFinished": "M4B klar!",
+ "MessageMapChapterTitles": "Kartlägg kapitelrubriker till dina befintliga ljudbokskapitel utan att justera tidstämplar",
+ "MessageMarkAllEpisodesFinished": "Markera alla avsnitt som avslutade",
+ "MessageMarkAllEpisodesNotFinished": "Markera alla avsnitt som inte avslutade",
+ "MessageMarkAsFinished": "Markera som avslutad",
+ "MessageMarkAsNotFinished": "Markera som inte avslutad",
+ "MessageMatchBooksDescription": "kommer att försöka matcha böcker i biblioteket med en bok från den valda sökleverantören och fylla i tomma detaljer och omslagskonst. Överskriver inte detaljer.",
+ "MessageNoAudioTracks": "Inga ljudspår",
+ "MessageNoAuthors": "Inga författare",
+ "MessageNoBackups": "Inga säkerhetskopior",
+ "MessageNoBookmarks": "Inga bokmärken",
+ "MessageNoChapters": "Inga kapitel",
+ "MessageNoCollections": "Inga samlingar",
+ "MessageNoCoversFound": "Inga omslag hittade",
+ "MessageNoDescription": "Ingen beskrivning",
+ "MessageNoDownloadsInProgress": "Inga nedladdningar pågår för närvarande",
+ "MessageNoDownloadsQueued": "Inga nedladdningar i kö",
+ "MessageNoEpisodeMatchesFound": "Inga matchande avsnitt hittades",
+ "MessageNoEpisodes": "Inga avsnitt",
+ "MessageNoFoldersAvailable": "Inga mappar tillgängliga",
+ "MessageNoGenres": "Inga genrer",
+ "MessageNoIssues": "Inga problem",
+ "MessageNoItems": "Inga objekt",
+ "MessageNoItemsFound": "Inga objekt hittades",
+ "MessageNoListeningSessions": "Inga lyssningssessioner",
+ "MessageNoLogs": "Inga loggar",
+ "MessageNoMediaProgress": "Ingen medieförlopp",
+ "MessageNoNotifications": "Inga aviseringar",
+ "MessageNoPodcastsFound": "Inga podcasts hittade",
+ "MessageNoResults": "Inga resultat",
+ "MessageNoSearchResultsFor": "Inga sökresultat för \"{0}\"",
+ "MessageNoSeries": "Inga serier",
+ "MessageNoTags": "Inga taggar",
+ "MessageNoTasksRunning": "Inga pågående uppgifter",
+ "MessageNotYetImplemented": "Ännu inte implementerad",
+ "MessageNoUpdateNecessary": "Ingen uppdatering krävs",
+ "MessageNoUpdatesWereNecessary": "Inga uppdateringar var nödvändiga",
+ "MessageNoUserPlaylists": "Du har inga spellistor",
+ "MessageOr": "eller",
+ "MessagePauseChapter": "Pausa kapiteluppspelning",
+ "MessagePlayChapter": "Lyssna på kapitlets början",
+ "MessagePlaylistCreateFromCollection": "Skapa spellista från samling",
+ "MessagePodcastHasNoRSSFeedForMatching": "Podcasten har ingen RSS-flödes-URL att använda för matchning",
+ "MessageQuickMatchDescription": "Fyll tomma objektdetaljer och omslag med första matchningsresultat från '{0}'. Överskriver inte detaljer om inte serverinställningen 'Föredra matchad metadata' är aktiverad.",
+ "MessageRemoveChapter": "Ta bort kapitel",
+ "MessageRemoveEpisodes": "Ta bort {0} avsnitt",
+ "MessageRemoveFromPlayerQueue": "Ta bort från spellistan",
+ "MessageRemoveUserWarning": "Är du säker på att du vill radera användaren \"{0}\" permanent?",
+ "MessageReportBugsAndContribute": "Rapportera buggar, begär funktioner och bidra på",
+ "MessageResetChaptersConfirm": "Är du säker på att du vill återställa kapitel och ångra ändringarna du gjort?",
+ "MessageRestoreBackupConfirm": "Är du säker på att du vill återställa säkerhetskopian som skapades den",
+ "MessageRestoreBackupWarning": "Att återställa en säkerhetskopia kommer att skriva över hela databasen som finns i /config och omslagsbilder i /metadata/items & /metadata/authors.
Säkerhetskopior ändrar inte några filer i dina biblioteksmappar. Om du har aktiverat serverinställningar för att lagra omslagskonst och metadata i dina biblioteksmappar säkerhetskopieras eller skrivs de inte över.
Alla klienter som använder din server kommer att uppdateras automatiskt.",
+ "MessageSearchResultsFor": "Sökresultat för",
+ "MessageSelected": "{0} selected",
+ "MessageServerCouldNotBeReached": "Servern kunde inte nås",
+ "MessageSetChaptersFromTracksDescription": "Ställ in kapitel med varje ljudfil som ett kapitel och kapitelrubrik som ljudfilens namn",
+ "MessageStartPlaybackAtTime": "Starta uppspelning för \"{0}\" kl. {1}?",
+ "MessageThinking": "Tänker...",
+ "MessageUploaderItemFailed": "Misslyckades med att ladda upp",
+ "MessageUploaderItemSuccess": "Uppladdning lyckades!",
+ "MessageUploading": "Laddar upp...",
+ "MessageValidCronExpression": "Giltigt cron-uttryck",
+ "MessageWatcherIsDisabledGlobally": "Vakten är inaktiverad globalt i serverinställningarna",
+ "MessageXLibraryIsEmpty": "{0} biblioteket är tomt!",
+ "MessageYourAudiobookDurationIsLonger": "Varaktigheten på din ljudbok är längre än den hittade varaktigheten",
+ "MessageYourAudiobookDurationIsShorter": "Varaktigheten på din ljudbok är kortare än den hittade varaktigheten",
+ "NoteChangeRootPassword": "Rotanvändaren är den enda användaren som kan ha ett tomt lösenord",
+ "NoteChapterEditorTimes": "Obs: Starttiden för första kapitlet måste förbli 0:00 och starttiden för det sista kapitlet får inte överstiga ljudbokens varaktighet.",
+ "NoteFolderPicker": "Obs: Mappar som redan är kartlagda kommer inte att visas",
+ "NoteFolderPickerDebian": "Obs: Mappväljaren för Debian-installationen är inte fullständigt implementerad. Du bör ange sökvägen till ditt bibliotek direkt.",
+ "NoteRSSFeedPodcastAppsHttps": "Varning: De flesta podcastappar kräver att RSS-flödets URL används med HTTPS",
+ "NoteRSSFeedPodcastAppsPubDate": "Varning: 1 eller flera av dina avsnitt har inte ett publiceringsdatum. Vissa podcastappar kräver detta.",
+ "NoteUploaderFoldersWithMediaFiles": "Mappar med mediefiler hanteras som separata biblioteksobjekt.",
+ "NoteUploaderOnlyAudioFiles": "Om du bara laddar upp ljudfiler kommer varje ljudfil att hanteras som en separat ljudbok.",
+ "NoteUploaderUnsupportedFiles": "Oaccepterade filer ignoreras. När du väljer eller släpper en mapp ignoreras andra filer som inte finns i ett objektmapp.",
+ "PlaceholderNewCollection": "Nytt samlingsnamn",
+ "PlaceholderNewFolderPath": "Nytt mappväg",
+ "PlaceholderNewPlaylist": "Nytt spellistanamn",
+ "PlaceholderSearch": "Sök...",
+ "PlaceholderSearchEpisode": "Sök avsnitt...",
+ "ToastAccountUpdateFailed": "Det gick inte att uppdatera kontot",
+ "ToastAccountUpdateSuccess": "Kontot uppdaterat",
+ "ToastAuthorImageRemoveFailed": "Det gick inte att ta bort författarens bild",
+ "ToastAuthorImageRemoveSuccess": "Författarens bild borttagen",
+ "ToastAuthorUpdateFailed": "Det gick inte att uppdatera författaren",
+ "ToastAuthorUpdateMerged": "Författaren sammanslagen",
+ "ToastAuthorUpdateSuccess": "Författaren uppdaterad",
+ "ToastAuthorUpdateSuccessNoImageFound": "Författaren uppdaterad (ingen bild hittad)",
+ "ToastBackupCreateFailed": "Det gick inte att skapa en säkerhetskopia",
+ "ToastBackupCreateSuccess": "Säkerhetskopia skapad",
+ "ToastBackupDeleteFailed": "Det gick inte att ta bort säkerhetskopian",
+ "ToastBackupDeleteSuccess": "Säkerhetskopan borttagen",
+ "ToastBackupRestoreFailed": "Det gick inte att återställa säkerhetskopan",
+ "ToastBackupUploadFailed": "Det gick inte att ladda upp säkerhetskopan",
+ "ToastBackupUploadSuccess": "Säkerhetskopan uppladdad",
+ "ToastBatchUpdateFailed": "Batchuppdateringen misslyckades",
+ "ToastBatchUpdateSuccess": "Batchuppdateringen lyckades",
+ "ToastBookmarkCreateFailed": "Det gick inte att skapa bokmärket",
+ "ToastBookmarkCreateSuccess": "Bokmärket tillagt",
+ "ToastBookmarkRemoveFailed": "Det gick inte att ta bort bokmärket",
+ "ToastBookmarkRemoveSuccess": "Bokmärket borttaget",
+ "ToastBookmarkUpdateFailed": "Det gick inte att uppdatera bokmärket",
+ "ToastBookmarkUpdateSuccess": "Bokmärket uppdaterat",
+ "ToastChaptersHaveErrors": "Kapitlen har fel",
+ "ToastChaptersMustHaveTitles": "Kapitel måste ha titlar",
+ "ToastCollectionItemsRemoveFailed": "Det gick inte att ta bort objekt från samlingen",
+ "ToastCollectionItemsRemoveSuccess": "Objekt borttagna från samlingen",
+ "ToastCollectionRemoveFailed": "Det gick inte att ta bort samlingen",
+ "ToastCollectionRemoveSuccess": "Samlingen borttagen",
+ "ToastCollectionUpdateFailed": "Det gick inte att uppdatera samlingen",
+ "ToastCollectionUpdateSuccess": "Samlingen uppdaterad",
+ "ToastItemCoverUpdateFailed": "Det gick inte att uppdatera objektets omslag",
+ "ToastItemCoverUpdateSuccess": "Objektets omslag uppdaterat",
+ "ToastItemDetailsUpdateFailed": "Det gick inte att uppdatera objektdetaljerna",
+ "ToastItemDetailsUpdateSuccess": "Objektdetaljer uppdaterade",
+ "ToastItemDetailsUpdateUnneeded": "Inga uppdateringar behövs för objektdetaljerna",
+ "ToastItemMarkedAsFinishedFailed": "Misslyckades med att markera som färdig",
+ "ToastItemMarkedAsFinishedSuccess": "Objekt markerat som färdig",
+ "ToastItemMarkedAsNotFinishedFailed": "Misslyckades med att markera som ej färdig",
+ "ToastItemMarkedAsNotFinishedSuccess": "Objekt markerat som ej färdig",
+ "ToastLibraryCreateFailed": "Det gick inte att skapa biblioteket",
+ "ToastLibraryCreateSuccess": "Biblioteket \"{0}\" skapat",
+ "ToastLibraryDeleteFailed": "Det gick inte att ta bort biblioteket",
+ "ToastLibraryDeleteSuccess": "Biblioteket borttaget",
+ "ToastLibraryScanFailedToStart": "Misslyckades med att starta skanningen",
+ "ToastLibraryScanStarted": "Skanning av biblioteket påbörjad",
+ "ToastLibraryUpdateFailed": "Det gick inte att uppdatera biblioteket",
+ "ToastLibraryUpdateSuccess": "Biblioteket \"{0}\" uppdaterat",
+ "ToastPlaylistCreateFailed": "Det gick inte att skapa spellistan",
+ "ToastPlaylistCreateSuccess": "Spellistan skapad",
+ "ToastPlaylistRemoveFailed": "Det gick inte att ta bort spellistan",
+ "ToastPlaylistRemoveSuccess": "Spellistan borttagen",
+ "ToastPlaylistUpdateFailed": "Det gick inte att uppdatera spellistan",
+ "ToastPlaylistUpdateSuccess": "Spellistan uppdaterad",
+ "ToastPodcastCreateFailed": "Misslyckades med att skapa podcasten",
+ "ToastPodcastCreateSuccess": "Podcasten skapad framgångsrikt",
+ "ToastRemoveItemFromCollectionFailed": "Misslyckades med att ta bort objektet från samlingen",
+ "ToastRemoveItemFromCollectionSuccess": "Objektet borttaget från samlingen",
+ "ToastRSSFeedCloseFailed": "Misslyckades med att stänga RSS-flödet",
+ "ToastRSSFeedCloseSuccess": "RSS-flödet stängt",
+ "ToastSendEbookToDeviceFailed": "Misslyckades med att skicka e-boken till enheten",
+ "ToastSendEbookToDeviceSuccess": "E-boken skickad till enheten \"{0}\"",
+ "ToastSeriesUpdateFailed": "Serieuppdateringen misslyckades",
+ "ToastSeriesUpdateSuccess": "Serieuppdateringen lyckades",
+ "ToastSessionDeleteFailed": "Misslyckades med att ta bort sessionen",
+ "ToastSessionDeleteSuccess": "Sessionen borttagen",
+ "ToastSocketConnected": "Socket ansluten",
+ "ToastSocketDisconnected": "Socket frånkopplad",
+ "ToastSocketFailedToConnect": "Socket misslyckades med att ansluta",
+ "ToastUserDeleteFailed": "Misslyckades med att ta bort användaren",
+ "ToastUserDeleteSuccess": "Användaren borttagen"
+}
\ No newline at end of file
diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json
index 3d408590..05553c08 100644
--- a/client/strings/zh-cn.json
+++ b/client/strings/zh-cn.json
@@ -1,7 +1,10 @@
{
"ButtonAdd": "增加",
"ButtonAddChapters": "添加章节",
+ "ButtonAddDevice": "添加设备",
+ "ButtonAddLibrary": "添加库",
"ButtonAddPodcasts": "添加播客",
+ "ButtonAddUser": "添加用户",
"ButtonAddYourFirstLibrary": "添加第一个媒体库",
"ButtonApply": "应用",
"ButtonApplyChapters": "应用到章节",
@@ -59,6 +62,7 @@
"ButtonRemoveSeriesFromContinueSeries": "从继续收听系列中删除",
"ButtonReScan": "重新扫描",
"ButtonReset": "重置",
+ "ButtonResetToDefault": "重置为默认",
"ButtonRestore": "恢复",
"ButtonSave": "保存",
"ButtonSaveAndClose": "保存并关闭",
@@ -83,11 +87,15 @@
"ButtonUserEdit": "编辑用户 {0}",
"ButtonViewAll": "查看全部",
"ButtonYes": "确定",
+ "ErrorUploadFetchMetadataAPI": "获取元数据时出错",
+ "ErrorUploadFetchMetadataNoResults": "无法获取元数据 - 尝试更新标题和/或作者",
+ "ErrorUploadLacksTitle": "必须有标题",
"HeaderAccount": "帐户",
"HeaderAdvanced": "高级",
"HeaderAppriseNotificationSettings": "测试通知设置",
"HeaderAudiobookTools": "有声读物文件管理工具",
"HeaderAudioTracks": "音轨",
+ "HeaderAuthentication": "身份验证",
"HeaderBackups": "备份",
"HeaderChangePassword": "更改密码",
"HeaderChapters": "章节",
@@ -122,12 +130,15 @@
"HeaderManageTags": "管理标签",
"HeaderMapDetails": "编辑详情",
"HeaderMatch": "匹配",
+ "HeaderMetadataOrderOfPrecedence": "元数据优先级",
"HeaderMetadataToEmbed": "嵌入元数据",
"HeaderNewAccount": "新建帐户",
"HeaderNewLibrary": "新建媒体库",
"HeaderNotifications": "通知",
+ "HeaderOpenIDConnectAuthentication": "OpenID 连接身份验证",
"HeaderOpenRSSFeed": "打开 RSS 源",
"HeaderOtherFiles": "其他文件",
+ "HeaderPasswordAuthentication": "密码认证",
"HeaderPermissions": "权限",
"HeaderPlayerQueue": "播放队列",
"HeaderPlaylist": "播放列表",
@@ -138,7 +149,7 @@
"HeaderRemoveEpisodes": "移除 {0} 剧集",
"HeaderRSSFeedGeneral": "RSS 详细信息",
"HeaderRSSFeedIsOpen": "RSS 源已打开",
- "HeaderRSSFeeds": "RSS Feeds",
+ "HeaderRSSFeeds": "RSS 订阅",
"HeaderSavedMediaProgress": "保存媒体进度",
"HeaderSchedule": "计划任务",
"HeaderScheduleLibraryScans": "自动扫描媒体库",
@@ -176,8 +187,11 @@
"LabelAddToCollectionBatch": "批量添加 {0} 个媒体到收藏",
"LabelAddToPlaylist": "添加到播放列表",
"LabelAddToPlaylistBatch": "添加 {0} 个项目到播放列表",
+ "LabelAdminUsersOnly": "仅限管理员用户",
"LabelAll": "全部",
"LabelAllUsers": "所有用户",
+ "LabelAllUsersExcludingGuests": "除访客外的所有用户",
+ "LabelAllUsersIncludingGuests": "包括访客的所有用户",
"LabelAlreadyInYourLibrary": "已存在你的库中",
"LabelAppend": "附加",
"LabelAuthor": "作者",
@@ -185,8 +199,14 @@
"LabelAuthorLastFirst": "作者 (名, 姓)",
"LabelAuthors": "作者",
"LabelAutoDownloadEpisodes": "自动下载剧集",
+ "LabelAutoFetchMetadata": "自动获取元数据",
+ "LabelAutoFetchMetadataHelp": "获取标题, 作者和系列的元数据以简化上传. 上传后可能需要匹配其他元数据.",
+ "LabelAutoLaunch": "自动启动",
+ "LabelAutoLaunchDescription": "导航到登录页面时自动重定向到身份验证提供程序 (手动覆盖路径
/login?autoLaunch=0
)",
+ "LabelAutoRegister": "自动注册",
+ "LabelAutoRegisterDescription": "登录后自动创建新用户",
"LabelBackToUser": "返回到用户",
- "LabelBackupLocation": "Backup Location",
+ "LabelBackupLocation": "备份位置",
"LabelBackupsEnableAutomaticBackups": "启用自动备份",
"LabelBackupsEnableAutomaticBackupsHelp": "备份保存到 /metadata/backups",
"LabelBackupsMaxBackupSize": "最大备份大小 (GB)",
@@ -195,15 +215,17 @@
"LabelBackupsNumberToKeepHelp": "一次只能删除一个备份, 因此如果你已经有超过此数量的备份, 则应手动删除它们.",
"LabelBitrate": "比特率",
"LabelBooks": "图书",
+ "LabelButtonText": "按钮文本",
"LabelChangePassword": "修改密码",
"LabelChannels": "声道",
"LabelChapters": "章节",
"LabelChaptersFound": "找到的章节",
"LabelChapterTitle": "章节标题",
+ "LabelClickForMoreInfo": "点击了解更多信息",
"LabelClosePlayer": "关闭播放器",
"LabelCodec": "编解码",
"LabelCollapseSeries": "折叠系列",
- "LabelCollection": "Collection",
+ "LabelCollection": "收藏",
"LabelCollections": "收藏",
"LabelComplete": "已完成",
"LabelConfirmPassword": "确认密码",
@@ -218,16 +240,18 @@
"LabelCurrently": "当前:",
"LabelCustomCronExpression": "自定义计划任务表达式:",
"LabelDatetime": "日期时间",
+ "LabelDeleteFromFileSystemCheckbox": "从文件系统删除 (取消选中仅从数据库中删除)",
"LabelDescription": "描述",
"LabelDeselectAll": "全部取消选择",
"LabelDevice": "设备",
"LabelDeviceInfo": "设备信息",
+ "LabelDeviceIsAvailableTo": "设备可用于...",
"LabelDirectory": "目录",
"LabelDiscFromFilename": "从文件名获取光盘",
"LabelDiscFromMetadata": "从元数据获取光盘",
- "LabelDiscover": "Discover",
+ "LabelDiscover": "发现",
"LabelDownload": "下载",
- "LabelDownloadNEpisodes": "Download {0} episodes",
+ "LabelDownloadNEpisodes": "下载 {0} 集",
"LabelDuration": "持续时间",
"LabelDurationFound": "找到持续时间:",
"LabelEbook": "电子书",
@@ -247,6 +271,7 @@
"LabelExample": "示例",
"LabelExplicit": "信息准确",
"LabelFeedURL": "源 URL",
+ "LabelFetchingMetadata": "正在获取元数据",
"LabelFile": "文件",
"LabelFileBirthtime": "文件创建时间",
"LabelFileModified": "文件修改时间",
@@ -256,6 +281,7 @@
"LabelFinished": "已听完",
"LabelFolder": "文件夹",
"LabelFolders": "文件夹",
+ "LabelFontFamily": "字体系列",
"LabelFontScale": "字体比例",
"LabelFormat": "编码格式",
"LabelGenre": "流派",
@@ -263,9 +289,11 @@
"LabelHardDeleteFile": "完全删除文件",
"LabelHasEbook": "有电子书",
"LabelHasSupplementaryEbook": "有补充电子书",
+ "LabelHighestPriority": "最高优先级",
"LabelHost": "主机",
"LabelHour": "小时",
"LabelIcon": "图标",
+ "LabelImageURLFromTheWeb": "来自 Web 图像的 URL",
"LabelIncludeInTracklist": "包含在音轨列表中",
"LabelIncomplete": "未听完",
"LabelInProgress": "正在听",
@@ -303,14 +331,20 @@
"LabelLogLevelInfo": "信息",
"LabelLogLevelWarn": "警告",
"LabelLookForNewEpisodesAfterDate": "在此日期后查找新剧集",
+ "LabelLowestPriority": "最低优先级",
+ "LabelMatchExistingUsersBy": "匹配现有用户",
+ "LabelMatchExistingUsersByDescription": "用于连接现有用户. 连接后, 用户将通过SSO提供商提供的唯一 id 进行匹配",
"LabelMediaPlayer": "媒体播放器",
"LabelMediaType": "媒体类型",
+ "LabelMetadataOrderOfPrecedenceDescription": "较高优先级的元数据源将覆盖较低优先级的元数据源",
"LabelMetadataProvider": "元数据提供者",
"LabelMetaTag": "元数据标签",
"LabelMetaTags": "元标签",
"LabelMinute": "分钟",
"LabelMissing": "丢失",
"LabelMissingParts": "丢失的部分",
+ "LabelMobileRedirectURIs": "允许移动应用重定向 URI",
+ "LabelMobileRedirectURIsDescription": "这是移动应用程序的有效重定向 URI 白名单. 默认值为
audiobookshelf://oauth
,您可以删除它或添加其他 URI 以进行第三方应用集成. 使用星号 (
*
) 作为唯一条目允许任何 URI.",
"LabelMore": "更多",
"LabelMoreInfo": "更多..",
"LabelName": "名称",
@@ -322,7 +356,7 @@
"LabelNewPassword": "新密码",
"LabelNextBackupDate": "下次备份日期",
"LabelNextScheduledRun": "下次任务运行",
- "LabelNoEpisodesSelected": "No episodes selected",
+ "LabelNoEpisodesSelected": "未选择任何剧集",
"LabelNotes": "注释",
"LabelNotFinished": "未听完",
"LabelNotificationAppriseURL": "通知 URL(s)",
@@ -372,6 +406,7 @@
"LabelRegion": "区域",
"LabelReleaseDate": "发布日期",
"LabelRemoveCover": "移除封面",
+ "LabelRowsPerPage": "Rows per page",
"LabelRSSFeedCustomOwnerEmail": "自定义所有者电子邮件",
"LabelRSSFeedCustomOwnerName": "自定义所有者名称",
"LabelRSSFeedOpen": "打开 RSS 源",
@@ -382,8 +417,9 @@
"LabelSearchTitle": "搜索标题",
"LabelSearchTitleOrASIN": "搜索标题或 ASIN",
"LabelSeason": "季",
- "LabelSelectAllEpisodes": "Select all episodes",
- "LabelSelectEpisodesShowing": "Select {0} episodes showing",
+ "LabelSelectAllEpisodes": "选择所有剧集",
+ "LabelSelectEpisodesShowing": "选择正在播放的 {0} 剧集",
+ "LabelSelectUsers": "Select users",
"LabelSendEbookToDevice": "发送电子书到...",
"LabelSequence": "序列",
"LabelSeries": "系列",
@@ -399,27 +435,21 @@
"LabelSettingsDisableWatcher": "禁用监视程序",
"LabelSettingsDisableWatcherForLibrary": "禁用媒体库的文件夹监视程序",
"LabelSettingsDisableWatcherHelp": "检测到文件更改时禁用自动添加和更新项目. *需要重启服务器",
- "LabelSettingsEnableWatcher": "Enable Watcher",
- "LabelSettingsEnableWatcherForLibrary": "Enable folder watcher for library",
- "LabelSettingsEnableWatcherHelp": "Enables the automatic adding/updating of items when file changes are detected. *Requires server restart",
+ "LabelSettingsEnableWatcher": "启用监视程序",
+ "LabelSettingsEnableWatcherForLibrary": "为库启用文件夹监视程序",
+ "LabelSettingsEnableWatcherHelp": "当检测到文件更改时, 启用项目的自动添加/更新. *需要重新启动服务器",
"LabelSettingsExperimentalFeatures": "实验功能",
"LabelSettingsExperimentalFeaturesHelp": "开发中的功能需要你的反馈并帮助测试. 点击打开 github 讨论.",
"LabelSettingsFindCovers": "查找封面",
"LabelSettingsFindCoversHelp": "如果你的有声读物在文件夹中没有嵌入封面或封面图像, 扫描将尝试查找封面.
注意: 这将延长扫描时间",
- "LabelSettingsHideSingleBookSeries": "Hide single book series",
- "LabelSettingsHideSingleBookSeriesHelp": "Series that have a single book will be hidden from the series page and home page shelves.",
+ "LabelSettingsHideSingleBookSeries": "隐藏单书系列",
+ "LabelSettingsHideSingleBookSeriesHelp": "只有一本书的系列将从系列页面和主页书架中隐藏.",
"LabelSettingsHomePageBookshelfView": "首页使用书架视图",
"LabelSettingsLibraryBookshelfView": "媒体库使用书架视图",
- "LabelSettingsOverdriveMediaMarkers": "对章节使用 Overdrive 媒体标记",
- "LabelSettingsOverdriveMediaMarkersHelp": "Overdrive 的 MP3 文件带有作为自定义元数据嵌入的章节时间. 启用此功能将自动将这些标签用于章节计时",
"LabelSettingsParseSubtitles": "解析副标题",
"LabelSettingsParseSubtitlesHelp": "从有声读物文件夹中提取副标题.
副标题必须用 \" - \" 分隔.
例: \"书名 - 这里是副标题\" 则显示副标题 \"这里是副标题\"",
- "LabelSettingsPreferAudioMetadata": "首选音频元数据",
- "LabelSettingsPreferAudioMetadataHelp": "音频文件 ID3 元标记将用于文件夹名称上媒体的详细信息",
"LabelSettingsPreferMatchedMetadata": "首选匹配的元数据",
"LabelSettingsPreferMatchedMetadataHelp": "使用快速匹配时, 匹配的数据将覆盖项目详细信息. 默认情况下, 快速匹配将只填充缺少的详细信息.",
- "LabelSettingsPreferOPFMetadata": "首选 OPF 元数据",
- "LabelSettingsPreferOPFMetadataHelp": "OPF 文件元数据将用于文件夹名称上媒体的详细信息",
"LabelSettingsSkipMatchingBooksWithASIN": "跳过匹配已有 ASIN 的图书",
"LabelSettingsSkipMatchingBooksWithISBN": "跳过匹配已有 ISBN 的图书",
"LabelSettingsSortingIgnorePrefixes": "排序时忽略前缀",
@@ -429,7 +459,7 @@
"LabelSettingsStoreCoversWithItem": "存储项目封面",
"LabelSettingsStoreCoversWithItemHelp": "默认情况下封面存储在/metadata/items文件夹中, 启用此设置将存储封面在你媒体项目文件夹中. 只保留一个名为 \"cover\" 的文件",
"LabelSettingsStoreMetadataWithItem": "存储项目元数据",
- "LabelSettingsStoreMetadataWithItemHelp": "默认情况下元数据文件存储在/metadata/items文件夹中, 启用此设置将存储元数据在你媒体项目文件夹中. 使 .abs 文件护展名",
+ "LabelSettingsStoreMetadataWithItemHelp": "默认情况下元数据文件存储在/metadata/items文件夹中, 启用此设置将存储元数据在你媒体项目文件夹中",
"LabelSettingsTimeFormat": "时间格式",
"LabelShowAll": "全部显示",
"LabelSize": "文件大小",
@@ -482,7 +512,7 @@
"LabelTrackFromMetadata": "从源数据获取音轨",
"LabelTracks": "音轨",
"LabelTracksMultiTrack": "多轨",
- "LabelTracksNone": "No tracks",
+ "LabelTracksNone": "没有音轨",
"LabelTracksSingleTrack": "单轨",
"LabelType": "类型",
"LabelUnabridged": "未删节",
@@ -494,6 +524,7 @@
"LabelUpdateDetailsHelp": "找到匹配项时允许覆盖所选书籍存在的详细信息",
"LabelUploaderDragAndDrop": "拖放文件或文件夹",
"LabelUploaderDropFiles": "删除文件",
+ "LabelUploaderItemFetchMetadataHelp": "自动获取标题, 作者和系列",
"LabelUseChapterTrack": "使用章节音轨",
"LabelUseFullTrack": "使用完整音轨",
"LabelUser": "用户",
@@ -523,21 +554,25 @@
"MessageChapterErrorStartLtPrev": "无效的开始时间, 必须大于或等于上一章节的开始时间",
"MessageChapterStartIsAfter": "章节开始是在有声读物结束之后",
"MessageCheckingCron": "检查计划任务...",
- "MessageConfirmCloseFeed": "Are you sure you want to close this feed?",
+ "MessageConfirmCloseFeed": "你确定要关闭此订阅源吗?",
"MessageConfirmDeleteBackup": "你确定要删除备份 {0}?",
"MessageConfirmDeleteFile": "这将从文件系统中删除该文件. 你确定吗?",
"MessageConfirmDeleteLibrary": "你确定要永久删除媒体库 \"{0}\"?",
+ "MessageConfirmDeleteLibraryItem": "这将从数据库和文件系统中删除库项目. 你确定吗?",
+ "MessageConfirmDeleteLibraryItems": "这将从数据库和文件系统中删除 {0} 个库项目. 你确定吗?",
"MessageConfirmDeleteSession": "你确定要删除此会话吗?",
"MessageConfirmForceReScan": "你确定要强制重新扫描吗?",
- "MessageConfirmMarkAllEpisodesFinished": "Are you sure you want to mark all episodes as finished?",
- "MessageConfirmMarkAllEpisodesNotFinished": "Are you sure you want to mark all episodes as not finished?",
+ "MessageConfirmMarkAllEpisodesFinished": "你确定要将所有剧集都标记为已完成吗?",
+ "MessageConfirmMarkAllEpisodesNotFinished": "你确定要将所有剧集都标记为未完成吗?",
"MessageConfirmMarkSeriesFinished": "你确定要将此系列中的所有书籍都标记为已听完吗?",
"MessageConfirmMarkSeriesNotFinished": "你确定要将此系列中的所有书籍都标记为未听完吗?",
+ "MessageConfirmQuickEmbed": "警告! 快速嵌入不会备份你的音频文件. 确保你有音频文件的备份.
你是否想继续吗?",
"MessageConfirmRemoveAllChapters": "你确定要移除所有章节吗?",
- "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
- "MessageConfirmRemoveCollection": "您确定要移除收藏 \"{0}\"?",
- "MessageConfirmRemoveEpisode": "您确定要移除剧集 \"{0}\"?",
+ "MessageConfirmRemoveAuthor": "你确定要删除作者 \"{0}\"?",
+ "MessageConfirmRemoveCollection": "你确定要移除收藏 \"{0}\"?",
+ "MessageConfirmRemoveEpisode": "你确定要移除剧集 \"{0}\"?",
"MessageConfirmRemoveEpisodes": "你确定要移除 {0} 剧集?",
+ "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveNarrator": "你确定要删除演播者 \"{0}\"?",
"MessageConfirmRemovePlaylist": "你确定要移除播放列表 \"{0}\"?",
"MessageConfirmRenameGenre": "你确定要将所有项目流派 \"{0}\" 重命名到 \"{1}\"?",
@@ -546,6 +581,7 @@
"MessageConfirmRenameTag": "你确定要将所有项目标签 \"{0}\" 重命名到 \"{1}\"?",
"MessageConfirmRenameTagMergeNote": "注意: 该标签已经存在, 因此它们将被合并.",
"MessageConfirmRenameTagWarning": "警告! 已经存在有大小写不同的类似标签 \"{0}\".",
+ "MessageConfirmReScanLibraryItems": "你确定要重新扫描 {0} 个项目吗?",
"MessageConfirmSendEbookToDevice": "你确定要发送 {0} 电子书 \"{1}\" 到设备 \"{2}\"?",
"MessageDownloadingEpisode": "正在下载剧集",
"MessageDragFilesIntoTrackOrder": "将文件拖动到正确的音轨顺序",
@@ -565,8 +601,8 @@
"MessageM4BFailed": "M4B 失败!",
"MessageM4BFinished": "M4B 完成!",
"MessageMapChapterTitles": "将章节标题映射到现有的有声读物章节, 无需调整时间戳",
- "MessageMarkAllEpisodesFinished": "Mark all episodes finished",
- "MessageMarkAllEpisodesNotFinished": "Mark all episodes not finished",
+ "MessageMarkAllEpisodesFinished": "标记所有剧集为已完成",
+ "MessageMarkAllEpisodesNotFinished": "标记所有剧集为未完成",
"MessageMarkAsFinished": "标记为已听完",
"MessageMarkAsNotFinished": "标记为未听完",
"MessageMatchBooksDescription": "尝试将媒体库中的图书与所选搜索提供商的图书进行匹配, 并填写空白的详细信息和封面. 不覆盖详细信息.",
@@ -616,6 +652,7 @@
"MessageRestoreBackupConfirm": "你确定要恢复创建的这个备份",
"MessageRestoreBackupWarning": "恢复备份将覆盖位于 /config 的整个数据库并覆盖 /metadata/items & /metadata/authors 中的图像.
备份不会修改媒体库文件夹中的任何文件. 如果您已启用服务器设置将封面和元数据存储在库文件夹中,则不会备份或覆盖这些内容.
将自动刷新使用服务器的所有客户端.",
"MessageSearchResultsFor": "搜索结果",
+ "MessageSelected": "{0} selected",
"MessageServerCouldNotBeReached": "无法访问服务器",
"MessageSetChaptersFromTracksDescription": "把每个音频文件设置为章节并将章节标题设置为音频文件名",
"MessageStartPlaybackAtTime": "开始播放 \"{0}\" 在 {1}?",
diff --git a/client/tailwind.config.js b/client/tailwind.config.js
index 1c39cb8f..9eb81923 100644
--- a/client/tailwind.config.js
+++ b/client/tailwind.config.js
@@ -56,6 +56,7 @@ module.exports = {
'16': '4rem',
'20': '5rem',
'24': '6rem',
+ '26': '6.5rem',
'32': '8rem',
'48': '12rem',
'64': '16rem',
diff --git a/docker-compose.yml b/docker-compose.yml
index da3fa1f2..68e012fb 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -3,12 +3,28 @@ version: "3.7"
services:
audiobookshelf:
- image: ghcr.io/advplyr/audiobookshelf
+ image: ghcr.io/advplyr/audiobookshelf:latest
+ # ABS runs on port 13378 by default. If you want to change
+ # the port, only change the external port, not the internal port
ports:
- 13378:80
volumes:
+ # These volumes are needed to keep your library persistent
+ # and allow media to be accessed by the ABS server.
+ # The path to the left of the colon is the path on your computer,
+ # and the path to the right of the colon is where the data is
+ # available to ABS in Docker.
+ # You can change these media directories or add as many as you want
- ./audiobooks:/audiobooks
- ./podcasts:/podcasts
+ # The metadata directory can be stored anywhere on your computer
- ./metadata:/metadata
+ # The config directory needs to be on the same physical machine
+ # you are running ABS on
- ./config:/config
restart: unless-stopped
+ # You can use the following environment variable to run the ABS
+ # docker container as a specific user. You will need to change
+ # the UID and GID to the correct values for your user.
+ #environment:
+ # - user=1000:1000
diff --git a/package-lock.json b/package-lock.json
index a1e7ccd6..25aef593 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,31 +1,528 @@
{
"name": "audiobookshelf",
- "version": "2.4.4",
- "lockfileVersion": 2,
+ "version": "2.7.1",
+ "lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "audiobookshelf",
- "version": "2.4.4",
+ "version": "2.7.1",
"license": "GPL-3.0",
"dependencies": {
"axios": "^0.27.2",
+ "cookie-parser": "^1.4.6",
"express": "^4.17.1",
+ "express-session": "^1.17.3",
"graceful-fs": "^4.2.10",
"htmlparser2": "^8.0.1",
"limiter": "^2.1.0",
+ "lru-cache": "^10.0.3",
"node-tone": "^1.0.1",
"nodemailer": "^6.9.2",
+ "openid-client": "^5.6.1",
+ "passport": "^0.6.0",
+ "passport-jwt": "^4.0.1",
"sequelize": "^6.32.1",
"socket.io": "^4.5.4",
"sqlite3": "^5.1.6",
+ "ssrf-req-filter": "^1.1.0",
"xml2js": "^0.5.0"
},
"bin": {
"audiobookshelf": "prod.js"
},
"devDependencies": {
- "nodemon": "^2.0.20"
+ "chai": "^4.3.10",
+ "mocha": "^10.2.0",
+ "nodemon": "^2.0.20",
+ "nyc": "^15.1.0",
+ "sinon": "^17.0.1"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
+ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz",
+ "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helpers": "^7.23.7",
+ "@babel/parser": "^7.23.6",
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.7",
+ "@babel/types": "^7.23.6",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/@babel/core/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@babel/core/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.23.6",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
+ "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "browserslist": "^4.22.2",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
+ "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.23.8",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz",
+ "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.7",
+ "@babel/types": "^7.23.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+ "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
+ "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.6",
+ "@babel/types": "^7.23.6",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
+ "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@gar/promisify": {
@@ -34,6 +531,153 @@
"integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
"optional": true
},
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.21",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz",
+ "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
"node_modules/@mapbox/node-pre-gyp": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
@@ -53,6 +697,17 @@
"node-pre-gyp": "bin/node-pre-gyp"
}
},
+ "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@mapbox/node-pre-gyp/node_modules/nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@@ -91,6 +746,18 @@
"semver": "^7.3.5"
}
},
+ "node_modules/@npmcli/fs/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "optional": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@npmcli/fs/node_modules/semver": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
@@ -120,6 +787,50 @@
"node": ">=10"
}
},
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz",
+ "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@sinonjs/samsam": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz",
+ "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "lodash.get": "^4.4.2",
+ "type-detect": "^4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
+ "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/text-encoding": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
+ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
+ "dev": true
+ },
"node_modules/@socket.io/component-emitter": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
@@ -260,7 +971,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "optional": true,
+ "devOptional": true,
"dependencies": {
"clean-stack": "^2.0.0",
"indent-string": "^4.0.0"
@@ -269,6 +980,15 @@
"node": ">=8"
}
},
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -277,6 +997,21 @@
"node": ">=8"
}
},
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -290,11 +1025,29 @@
"node": ">= 8"
}
},
+ "node_modules/append-transform": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
+ "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
+ "dev": true,
+ "dependencies": {
+ "default-require-extensions": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/aproba": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
},
+ "node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "dev": true
+ },
"node_modules/are-we-there-yet": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
@@ -307,11 +1060,26 @@
"node": ">=10"
}
},
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
},
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -392,6 +1160,49 @@
"node": ">=8"
}
},
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+ "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001565",
+ "electron-to-chromium": "^1.4.601",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -429,6 +1240,33 @@
"node": ">= 10"
}
},
+ "node_modules/cacache/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "optional": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/caching-transform": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
+ "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
+ "dev": true,
+ "dependencies": {
+ "hasha": "^5.0.0",
+ "make-dir": "^3.0.0",
+ "package-hash": "^4.0.0",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -441,6 +1279,102 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001576",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz",
+ "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chai": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
+ "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -480,11 +1414,40 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "optional": true,
+ "devOptional": true,
"engines": {
"node": ">=6"
}
},
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
"node_modules/color-support": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
@@ -504,6 +1467,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -533,6 +1502,12 @@
"node": ">= 0.6"
}
},
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
"node_modules/cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
@@ -541,6 +1516,26 @@
"node": ">= 0.6"
}
},
+ "node_modules/cookie-parser": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
+ "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
+ "dependencies": {
+ "cookie": "0.4.1",
+ "cookie-signature": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/cookie-parser/node_modules/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
@@ -558,6 +1553,20 @@
"node": ">= 0.10"
}
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -566,6 +1575,42 @@
"ms": "2.0.0"
}
},
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/default-require-extensions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
+ "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
+ "dev": true,
+ "dependencies": {
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -604,6 +1649,15 @@
"node": ">=8"
}
},
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
"node_modules/dom-serializer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@@ -660,11 +1714,25 @@
"resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
"integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
},
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
},
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.630",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.630.tgz",
+ "integrity": "sha512-osHqhtjojpCsACVnuD11xO5g9xaCyw7Qqn/C2KParkMv42i8jrJJgx3g7mkHfpxwhy9MnOJr8+pKOdZ7qzgizg==",
+ "dev": true
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -782,11 +1850,51 @@
"integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
"optional": true
},
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -836,6 +1944,32 @@
"node": ">= 0.10.0"
}
},
+ "node_modules/express-session": {
+ "version": "1.17.3",
+ "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
+ "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
+ "dependencies": {
+ "cookie": "0.4.2",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~2.0.0",
+ "on-headers": "~1.0.2",
+ "parseurl": "~1.3.3",
+ "safe-buffer": "5.2.1",
+ "uid-safe": "~2.1.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/express-session/node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -865,6 +1999,48 @@
"node": ">= 0.8"
}
},
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
"node_modules/follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
@@ -884,6 +2060,19 @@
}
}
},
+ "node_modules/foreground-child": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
+ "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -913,6 +2102,26 @@
"node": ">= 0.6"
}
},
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
"node_modules/fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
@@ -967,6 +2176,33 @@
"node": ">=10"
}
},
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
@@ -980,6 +2216,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -1011,6 +2256,15 @@
"node": ">= 6"
}
},
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -1052,6 +2306,37 @@
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
},
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
+ "dev": true,
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
"node_modules/htmlparser2": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
@@ -1191,7 +2476,7 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "optional": true,
+ "devOptional": true,
"engines": {
"node": ">=0.8.19"
}
@@ -1200,7 +2485,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "optional": true,
+ "devOptional": true,
"engines": {
"node": ">=8"
}
@@ -1303,17 +2588,392 @@
"node": ">=0.12.0"
}
},
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "optional": true
+ "devOptional": true
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-hook": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
+ "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
+ "dev": true,
+ "dependencies": {
+ "append-transform": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
+ "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
+ "dev": true,
+ "dependencies": {
+ "archy": "^1.0.0",
+ "cross-spawn": "^7.0.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-processinfo/node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
+ "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jose": {
+ "version": "4.15.4",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz",
+ "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/just-extend": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz",
+ "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==",
+ "dev": true
},
"node_modules/just-performance": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/just-performance/-/just-performance-4.3.0.tgz",
"integrity": "sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q=="
},
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/limiter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/limiter/-/limiter-2.1.0.tgz",
@@ -1322,20 +2982,104 @@
"just-performance": "4.3.0"
}
},
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+ "dev": true
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
"dependencies": {
- "yallist": "^4.0.0"
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
},
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.1"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+ "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+ "engines": {
+ "node": "14 || >=16.14"
}
},
"node_modules/make-dir": {
@@ -1387,6 +3131,18 @@
"node": ">= 10"
}
},
+ "node_modules/make-fetch-happen/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "optional": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -1548,6 +3304,152 @@
"node": ">=10"
}
},
+ "node_modules/mocha": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
+ "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/mocha/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mocha/node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mocha/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
"node_modules/moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
@@ -1572,6 +3474,18 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
+ "node_modules/nanoid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -1580,6 +3494,25 @@
"node": ">= 0.6"
}
},
+ "node_modules/nise": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.7.tgz",
+ "integrity": "sha512-wWtNUhkT7k58uvWTB/Gy26eA/EJKtPZFVAhEilN5UYVmmGRYOURbejRUyKm0Uu9XVEW7K5nBOZfR8VMB4QR2RQ==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0",
+ "@sinonjs/fake-timers": "^11.2.2",
+ "@sinonjs/text-encoding": "^0.7.2",
+ "just-extend": "^6.2.0",
+ "path-to-regexp": "^6.2.1"
+ }
+ },
+ "node_modules/nise/node_modules/path-to-regexp": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
+ "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==",
+ "dev": true
+ },
"node_modules/node-addon-api": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
@@ -1660,6 +3593,18 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/node-gyp/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "optional": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/node-gyp/node_modules/nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@@ -1705,6 +3650,24 @@
"node": ">=10"
}
},
+ "node_modules/node-preload": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
+ "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
+ "dev": true,
+ "dependencies": {
+ "process-on-spawn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dev": true
+ },
"node_modules/node-tone": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/node-tone/-/node-tone-1.0.1.tgz",
@@ -1796,6 +3759,177 @@
"set-blocking": "^2.0.0"
}
},
+ "node_modules/nyc": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
+ "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "caching-transform": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "decamelize": "^1.2.0",
+ "find-cache-dir": "^3.2.0",
+ "find-up": "^4.1.0",
+ "foreground-child": "^2.0.0",
+ "get-package-type": "^0.1.0",
+ "glob": "^7.1.6",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-hook": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-processinfo": "^2.0.2",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "make-dir": "^3.0.0",
+ "node-preload": "^0.2.1",
+ "p-map": "^3.0.0",
+ "process-on-spawn": "^1.0.0",
+ "resolve-from": "^5.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "spawn-wrap": "^2.0.0",
+ "test-exclude": "^6.0.0",
+ "yargs": "^15.0.2"
+ },
+ "bin": {
+ "nyc": "bin/nyc.js"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/nyc/node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "node_modules/nyc/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nyc/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
+ },
+ "node_modules/nyc/node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nyc/node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -1804,6 +3938,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
@@ -1812,6 +3954,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/oidc-token-hash": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz",
+ "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==",
+ "engines": {
+ "node": "^10.13.0 || >=12.0.0"
+ }
+ },
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -1823,6 +3973,14 @@
"node": ">= 0.8"
}
},
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1831,6 +3989,61 @@
"wrappy": "1"
}
},
+ "node_modules/openid-client": {
+ "version": "5.6.4",
+ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz",
+ "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==",
+ "dependencies": {
+ "jose": "^4.15.4",
+ "lru-cache": "^6.0.0",
+ "object-hash": "^2.2.0",
+ "oidc-token-hash": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/openid-client/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/p-map": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
@@ -1846,6 +4059,30 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-hash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
+ "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "hasha": "^5.0.0",
+ "lodash.flattendeep": "^4.4.0",
+ "release-zalgo": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -1854,6 +4091,49 @@
"node": ">= 0.8"
}
},
+ "node_modules/passport": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
+ "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
+ "dependencies": {
+ "passport-strategy": "1.x.x",
+ "pause": "0.0.1",
+ "utils-merge": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jaredhanson"
+ }
+ },
+ "node_modules/passport-jwt": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz",
+ "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==",
+ "dependencies": {
+ "jsonwebtoken": "^9.0.0",
+ "passport-strategy": "^1.0.0"
+ }
+ },
+ "node_modules/passport-strategy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
+ "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -1862,16 +4142,45 @@
"node": ">=0.10.0"
}
},
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pause": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
+ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
+ },
"node_modules/pg-connection-string": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz",
"integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg=="
},
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
@@ -1884,6 +4193,82 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/process-on-spawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
+ "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
+ "dev": true,
+ "dependencies": {
+ "fromentries": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/promise-inflight": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
@@ -1935,6 +4320,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/random-bytes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
+ "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -1982,6 +4384,42 @@
"node": ">=8.10.0"
}
},
+ "node_modules/release-zalgo": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
+ "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
+ "dev": true,
+ "dependencies": {
+ "es6-error": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
@@ -2161,6 +4599,17 @@
}
}
},
+ "node_modules/sequelize/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/sequelize/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -2180,6 +4629,15 @@
"node": ">=10"
}
},
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
@@ -2204,6 +4662,27 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
@@ -2243,6 +4722,54 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/sinon": {
+ "version": "17.0.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz",
+ "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0",
+ "@sinonjs/fake-timers": "^11.2.2",
+ "@sinonjs/samsam": "^8.0.0",
+ "diff": "^5.1.0",
+ "nise": "^5.1.5",
+ "supports-color": "^7.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/sinon"
+ }
+ },
+ "node_modules/sinon/node_modules/diff": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+ "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/sinon/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sinon/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@@ -2379,6 +4906,38 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"optional": true
},
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spawn-wrap": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
+ "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^2.0.0",
+ "is-windows": "^1.0.2",
+ "make-dir": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "signal-exit": "^3.0.2",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
"node_modules/sqlite3": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz",
@@ -2401,6 +4960,22 @@
}
}
},
+ "node_modules/ssrf-req-filter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ssrf-req-filter/-/ssrf-req-filter-1.1.0.tgz",
+ "integrity": "sha512-YUyTinAEm52NsoDvkTFN9BQIa5nURNr2aN0BwOiJxHK3tlyGUczHa+2LjcibKNugAk/losB6kXOfcRzy0LQ4uA==",
+ "dependencies": {
+ "ipaddr.js": "^2.1.0"
+ }
+ },
+ "node_modules/ssrf-req-filter/node_modules/ipaddr.js": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
+ "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/ssri": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
@@ -2453,6 +5028,27 @@
"node": ">=8"
}
},
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -2489,6 +5085,29 @@
"node": ">=8"
}
},
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2531,6 +5150,24 @@
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -2543,6 +5180,26 @@
"node": ">= 0.6"
}
},
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/uid-safe": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
+ "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
+ "dependencies": {
+ "random-bytes": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
@@ -2575,6 +5232,36 @@
"node": ">= 0.8"
}
},
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -2630,7 +5317,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "optional": true,
+ "devOptional": true,
"dependencies": {
"isexe": "^2.0.0"
},
@@ -2641,6 +5328,12 @@
"node": ">= 8"
}
},
+ "node_modules/which-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
+ "dev": true
+ },
"node_modules/wide-align": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
@@ -2657,11 +5350,46 @@
"@types/node": "*"
}
},
+ "node_modules/workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
"node_modules/ws": {
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
@@ -2702,2001 +5430,97 @@
"node": ">=4.0"
}
},
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- },
- "dependencies": {
- "@gar/promisify": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
- "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
- "optional": true
},
- "@mapbox/node-pre-gyp": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
- "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
- "requires": {
- "detect-libc": "^2.0.0",
- "https-proxy-agent": "^5.0.0",
- "make-dir": "^3.1.0",
- "node-fetch": "^2.6.7",
- "nopt": "^5.0.0",
- "npmlog": "^5.0.1",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.11"
- },
- "dependencies": {
- "nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "requires": {
- "abbrev": "1"
- }
- },
- "semver": {
- "version": "7.5.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
- "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "@npmcli/fs": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
- "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
- "optional": true,
- "requires": {
- "@gar/promisify": "^1.0.1",
- "semver": "^7.3.5"
- },
- "dependencies": {
- "semver": {
- "version": "7.5.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
- "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
- "optional": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "@npmcli/move-file": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
- "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
- "optional": true,
- "requires": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- }
- },
- "@socket.io/component-emitter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
- "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
- },
- "@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
- "optional": true
- },
- "@types/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
- },
- "@types/cors": {
- "version": "2.8.13",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
- "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/debug": {
- "version": "4.1.8",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz",
- "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==",
- "requires": {
- "@types/ms": "*"
- }
- },
- "@types/ms": {
- "version": "0.7.31",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
- "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
- },
- "@types/node": {
- "version": "18.11.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
- "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
- },
- "@types/validator": {
- "version": "13.7.17",
- "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz",
- "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ=="
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "requires": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- }
- },
- "agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "requires": {
- "debug": "4"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "agentkeepalive": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
- "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
- "optional": true,
- "requires": {
- "debug": "^4.1.0",
- "depd": "^2.0.0",
- "humanize-ms": "^1.2.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "optional": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "optional": true
- }
- }
- },
- "aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "optional": true,
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
- },
- "anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "aproba": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
- "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
- },
- "are-we-there-yet": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
- "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
- }
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "axios": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
- "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
- "requires": {
- "follow-redirects": "^1.14.9",
- "form-data": "^4.0.0"
- }
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "base64id": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
- "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "requires": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
- },
- "cacache": {
- "version": "15.3.0",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
- "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
- "optional": true,
- "requires": {
- "@npmcli/fs": "^1.0.0",
- "@npmcli/move-file": "^1.0.1",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "glob": "^7.1.4",
- "infer-owner": "^1.0.4",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.1",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.2",
- "mkdirp": "^1.0.3",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^8.0.1",
- "tar": "^6.0.2",
- "unique-filename": "^1.1.1"
- }
- },
- "call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- }
- },
- "chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- }
- },
- "chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
- },
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "optional": true
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
- },
- "content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "requires": {
- "safe-buffer": "5.2.1"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
- },
- "cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- },
- "cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "requires": {
- "object-assign": "^4",
- "vary": "^1"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
- },
- "detect-libc": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
- "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w=="
- },
- "dom-serializer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
- "requires": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
- }
- },
- "domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
- },
- "domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
- "requires": {
- "domelementtype": "^2.3.0"
- }
- },
- "domutils": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
- "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
- "requires": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.1"
- }
- },
- "dottie": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
- "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
- },
- "encoding": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
- "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
- "optional": true,
- "requires": {
- "iconv-lite": "^0.6.2"
- },
"dependencies": {
- "iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "optional": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- }
- }
- }
- },
- "engine.io": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
- "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
- "requires": {
- "@types/cookie": "^0.4.1",
- "@types/cors": "^2.8.12",
- "@types/node": ">=10.0.0",
- "accepts": "~1.3.4",
- "base64id": "2.0.0",
- "cookie": "~0.4.1",
- "cors": "~2.8.5",
- "debug": "~4.3.1",
- "engine.io-parser": "~5.0.3",
- "ws": "~8.2.3"
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
},
- "dependencies": {
- "cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
+ "engines": {
+ "node": ">=10"
}
},
- "engine.io-parser": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
- "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
- },
- "entities": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
- "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
- },
- "env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "optional": true
- },
- "err-code": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
- "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
- "optional": true
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
- },
- "express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "requires": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
+ "engines": {
+ "node": ">=10"
}
},
- "finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+ "node_modules/yargs-unparser/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "form-data": {
+ "node_modules/yargs-unparser/node_modules/decamelize": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
- },
- "fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
"dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "gauge": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
- "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
- "requires": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.2",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.1",
- "object-assign": "^4.1.1",
- "signal-exit": "^3.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.2"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
- "requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
- }
- },
- "glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
- },
- "htmlparser2": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
- "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
- "requires": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "domutils": "^3.0.1",
- "entities": "^4.3.0"
- }
- },
- "http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
- "optional": true
- },
- "http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "requires": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- }
- },
- "http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
- "optional": true,
- "requires": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
+ "engines": {
+ "node": ">=10"
},
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "optional": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
- },
- "https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "requires": {
- "agent-base": "6",
- "debug": "4"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "humanize-ms": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
- "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
- "optional": true,
- "requires": {
- "ms": "^2.0.0"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-by-default": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
- "dev": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "optional": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "optional": true
- },
- "infer-owner": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
- "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
- "optional": true
- },
- "inflection": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
- "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw=="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ip": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
- "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
- "optional": true
- },
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-lambda": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
- "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
- "optional": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "optional": true
- },
- "just-performance": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/just-performance/-/just-performance-4.3.0.tgz",
- "integrity": "sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q=="
- },
- "limiter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/limiter/-/limiter-2.1.0.tgz",
- "integrity": "sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw==",
- "requires": {
- "just-performance": "4.3.0"
- }
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "requires": {
- "semver": "^6.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "make-fetch-happen": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
- "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
- "optional": true,
- "requires": {
- "agentkeepalive": "^4.1.3",
- "cacache": "^15.2.0",
- "http-cache-semantics": "^4.1.0",
- "http-proxy-agent": "^4.0.1",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.3",
- "minipass-collect": "^1.0.2",
- "minipass-fetch": "^1.3.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.2",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^6.0.0",
- "ssri": "^8.0.0"
- }
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
- },
- "mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "requires": {
- "mime-db": "1.52.0"
- }
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "minipass-collect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
- "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
- "optional": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-fetch": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
- "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
- "optional": true,
- "requires": {
- "encoding": "^0.1.12",
- "minipass": "^3.1.0",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.0.0"
- }
- },
- "minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
- "optional": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-pipeline": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
- "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
- "optional": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minipass-sized": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
- "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
- "optional": true,
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "requires": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
- },
- "moment": {
- "version": "2.29.4",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
- "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
- },
- "moment-timezone": {
- "version": "0.5.43",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz",
- "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==",
- "requires": {
- "moment": "^2.29.4"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
- },
- "node-addon-api": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
- "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
- },
- "node-fetch": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
- "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
- "requires": {
- "whatwg-url": "^5.0.0"
- }
- },
- "node-gyp": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
- "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
- "optional": true,
- "requires": {
- "env-paths": "^2.2.0",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.6",
- "make-fetch-happen": "^9.1.0",
- "nopt": "^5.0.0",
- "npmlog": "^6.0.0",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.2",
- "which": "^2.0.2"
- },
- "dependencies": {
- "are-we-there-yet": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
- "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
- "optional": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
- }
- },
- "gauge": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
- "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
- "optional": true,
- "requires": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.3",
- "console-control-strings": "^1.1.0",
- "has-unicode": "^2.0.1",
- "signal-exit": "^3.0.7",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.5"
- }
- },
- "nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "optional": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "npmlog": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
- "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
- "optional": true,
- "requires": {
- "are-we-there-yet": "^3.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^4.0.3",
- "set-blocking": "^2.0.0"
- }
- },
- "semver": {
- "version": "7.5.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
- "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
- "optional": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "node-tone": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/node-tone/-/node-tone-1.0.1.tgz",
- "integrity": "sha512-wi7L0taDZMN6tM5l85TDKHsYzdhqJTtPNgvgpk2zHeZzPt6ZIUZ9vBLTJRRDpm0xzCvbsvFHjAaudeQjLHTE4w=="
- },
- "nodemailer": {
- "version": "6.9.2",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz",
- "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg=="
- },
- "nodemon": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
- "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==",
- "dev": true,
- "requires": {
- "chokidar": "^3.5.2",
- "debug": "^3.2.7",
- "ignore-by-default": "^1.0.1",
- "minimatch": "^3.1.2",
- "pstree.remy": "^1.1.8",
- "semver": "^5.7.1",
- "simple-update-notifier": "^1.0.7",
- "supports-color": "^5.5.0",
- "touch": "^3.1.0",
- "undefsafe": "^2.0.5"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- }
- }
- },
- "nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "npmlog": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
- "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
- "requires": {
- "are-we-there-yet": "^2.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^3.0.0",
- "set-blocking": "^2.0.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
- },
- "object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "requires": {
- "wrappy": "1"
- }
- },
- "p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "optional": true,
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
- },
- "pg-connection-string": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz",
- "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg=="
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
- "optional": true
- },
- "promise-retry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
- "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
- "optional": true,
- "requires": {
- "err-code": "^2.0.2",
- "retry": "^0.12.0"
- }
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- }
- },
- "pstree.remy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
- },
- "qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "requires": {
- "side-channel": "^1.0.4"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
- "readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
- "optional": true
- },
- "retry-as-promised": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
- "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- },
- "send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "requires": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- }
- }
- },
- "sequelize": {
- "version": "6.32.1",
- "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.32.1.tgz",
- "integrity": "sha512-3Iv0jruv57Y0YvcxQW7BE56O7DC1BojcfIrqh6my+IQwde+9u/YnuYHzK+8kmZLhLvaziRT1eWu38nh9yVwn/g==",
- "requires": {
- "@types/debug": "^4.1.8",
- "@types/validator": "^13.7.17",
- "debug": "^4.3.4",
- "dottie": "^2.0.4",
- "inflection": "^1.13.4",
- "lodash": "^4.17.21",
- "moment": "^2.29.4",
- "moment-timezone": "^0.5.43",
- "pg-connection-string": "^2.6.0",
- "retry-as-promised": "^7.0.4",
- "semver": "^7.5.1",
- "sequelize-pool": "^7.1.0",
- "toposort-class": "^1.0.1",
- "uuid": "^8.3.2",
- "validator": "^13.9.0",
- "wkx": "^0.5.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "semver": {
- "version": "7.5.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
- "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "sequelize-pool": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
- "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg=="
- },
- "serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- }
- },
- "signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
- },
- "simple-update-notifier": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
- "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
- "dev": true,
- "requires": {
- "semver": "~7.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
- "dev": true
- }
- }
- },
- "smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
- "optional": true
- },
- "socket.io": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
- "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
- "requires": {
- "accepts": "~1.3.4",
- "base64id": "~2.0.0",
- "debug": "~4.3.2",
- "engine.io": "~6.2.1",
- "socket.io-adapter": "~2.4.0",
- "socket.io-parser": "~4.2.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "socket.io-adapter": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
- "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
- },
- "socket.io-parser": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
- "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
- "requires": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.3.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "socks": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
- "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
- "optional": true,
- "requires": {
- "ip": "^2.0.0",
- "smart-buffer": "^4.2.0"
- }
- },
- "socks-proxy-agent": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
- "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
- "optional": true,
- "requires": {
- "agent-base": "^6.0.2",
- "debug": "^4.3.3",
- "socks": "^2.6.2"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "optional": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "optional": true
- }
- }
- },
- "sqlite3": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz",
- "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==",
- "requires": {
- "@mapbox/node-pre-gyp": "^1.0.0",
- "node-addon-api": "^4.2.0",
- "node-gyp": "8.x",
- "tar": "^6.1.11"
- }
- },
- "ssri": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
- "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
- "optional": true,
- "requires": {
- "minipass": "^3.1.1"
- }
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "requires": {
- "safe-buffer": "~5.2.0"
- }
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "tar": {
- "version": "6.1.15",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
- "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
- "requires": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="
- }
- }
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
- },
- "toposort-class": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
- "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg=="
- },
- "touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
- "dev": true,
- "requires": {
- "nopt": "~1.0.10"
- }
- },
- "tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "undefsafe": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
- "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true
- },
- "unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "optional": true,
- "requires": {
- "unique-slug": "^2.0.0"
- }
- },
- "unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "optional": true,
- "requires": {
- "imurmurhash": "^0.1.4"
- }
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
- "validator": {
- "version": "13.9.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz",
- "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA=="
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
- },
- "webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- },
- "whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "requires": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "optional": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "wide-align": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
- "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
- "requires": {
- "string-width": "^1.0.2 || 2 || 3 || 4"
- }
- },
- "wkx": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
- "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- },
- "ws": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
- "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
- "requires": {}
- },
- "xml2js": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
- "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- }
- },
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
}
diff --git a/package.json b/package.json
index 082006e8..80e2e0ee 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,7 @@
{
"name": "audiobookshelf",
- "version": "2.4.4",
+ "version": "2.7.1",
+ "buildNumber": 1,
"description": "Self-hosted audiobook and podcast server",
"main": "index.js",
"scripts": {
@@ -14,7 +15,9 @@
"docker-amd64-local": "docker buildx build --platform linux/amd64 --load . -t advplyr/audiobookshelf-amd64-local",
"docker-arm64-local": "docker buildx build --platform linux/arm64 --load . -t advplyr/audiobookshelf-arm64-local",
"docker-armv7-local": "docker buildx build --platform linux/arm/v7 --load . -t advplyr/audiobookshelf-armv7-local",
- "deploy-linux": "node deploy/linux"
+ "deploy-linux": "node deploy/linux",
+ "test": "mocha",
+ "coverage": "nyc mocha"
},
"bin": "prod.js",
"pkg": {
@@ -27,22 +30,36 @@
"server/**/*.js"
]
},
+ "mocha": {
+ "recursive": true
+ },
"author": "advplyr",
"license": "GPL-3.0",
"dependencies": {
"axios": "^0.27.2",
+ "cookie-parser": "^1.4.6",
"express": "^4.17.1",
+ "express-session": "^1.17.3",
"graceful-fs": "^4.2.10",
"htmlparser2": "^8.0.1",
"limiter": "^2.1.0",
+ "lru-cache": "^10.0.3",
"node-tone": "^1.0.1",
"nodemailer": "^6.9.2",
+ "openid-client": "^5.6.1",
+ "passport": "^0.6.0",
+ "passport-jwt": "^4.0.1",
"sequelize": "^6.32.1",
"socket.io": "^4.5.4",
"sqlite3": "^5.1.6",
+ "ssrf-req-filter": "^1.1.0",
"xml2js": "^0.5.0"
},
"devDependencies": {
- "nodemon": "^2.0.20"
+ "chai": "^4.3.10",
+ "mocha": "^10.2.0",
+ "nodemon": "^2.0.20",
+ "nyc": "^15.1.0",
+ "sinon": "^17.0.1"
}
}
diff --git a/readme.md b/readme.md
index ad00dd66..a3b84f00 100644
--- a/readme.md
+++ b/readme.md
@@ -39,13 +39,15 @@ Audiobookshelf is a self-hosted audiobook and podcast server.
Is there a feature you are looking for? [Suggest it](https://github.com/advplyr/audiobookshelf/issues/new/choose)
-Join us on [Discord](https://discord.gg/pJsjuNCKRq) or [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
+Join us on [Discord](https://discord.gg/HQgCbd6E75) or [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
### Android App (beta)
Try it out on the [Google Play Store](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)
### iOS App (beta)
-Available using Test Flight: https://testflight.apple.com/join/wiic7QIW - [Join the discussion](https://github.com/advplyr/audiobookshelf-app/discussions/60)
+**Beta is currently full. Apple has a hard limit of 10k beta testers. Updates will be posted in Discord/Matrix.**
+
+Using Test Flight: https://testflight.apple.com/join/wiic7QIW ***(beta is full)***
### Build your own tools & clients
Check out the [API documentation](https://api.audiobookshelf.org/)
@@ -174,16 +176,49 @@ serve that directly:
[See LinuxServer.io config sample](https://github.com/linuxserver/reverse-proxy-confs/blob/master/audiobookshelf.subdomain.conf.sample)
-### Synology Reverse Proxy
+### Synology NAS Reverse Proxy Setup (DSM 7+/Quickconnect)
-1. Open Control Panel > Application Portal
-2. Change to the Reverse Proxy tab
-3. Select the proxy rule for which you want to enable Websockets and click on Edit
-4. Change to the "Custom Header" tab
-5. Click Create > WebSocket
-6. Click Save
+1. **Open Control Panel**
+ - Navigate to `Login Portal > Advanced`.
+
+2. **General Tab**
+ - Click `Reverse Proxy` > `Create`.
+
+ | Setting | Value |
+ |---------|----------------|
+ | Reverse Proxy Name | audiobookshelf |
+
+3. **Source Configuration**
+
+ | Setting | Value |
+ |-------------------------|-------------------------------------|
+ | Protocol | HTTPS |
+ | Hostname | `
..synology.me` |
+ | Port | 443 |
+ | Access Control Profile | Leave as is |
+
+ - Example Hostname: `audiobookshelf.mydomain.synology.me`
+
+4. **Destination Configuration**
+
+ | Setting | Value |
+ |-----------|------------------|
+ | Protocol | HTTP |
+ | Hostname | Your NAS IP |
+ | Port | 13378 |
+
+5. **Custom Header Tab**
+ - Go to `Create > Websocket`.
+ - Configure Headers (leave as is):
+
+ | Header Name | Value |
+ |-------------|------------------|
+ | Upgrade | `$http_upgrade` |
+ | Connection | `$connection_upgrade` |
+
+6. **Advanced Settings Tab**
+ - Leave as is.
-[from @silentArtifact](https://github.com/advplyr/audiobookshelf/issues/241#issuecomment-1036732329)
### [Traefik Reverse Proxy](https://doc.traefik.io/traefik/)
diff --git a/server/Auth.js b/server/Auth.js
index 6c7b9891..d2334de2 100644
--- a/server/Auth.js
+++ b/server/Auth.js
@@ -1,32 +1,581 @@
+const axios = require('axios')
+const passport = require('passport')
const bcrypt = require('./libs/bcryptjs')
const jwt = require('./libs/jsonwebtoken')
-const requestIp = require('./libs/requestIp')
-const Logger = require('./Logger')
+const LocalStrategy = require('./libs/passportLocal')
+const JwtStrategy = require('passport-jwt').Strategy
+const ExtractJwt = require('passport-jwt').ExtractJwt
+const OpenIDClient = require('openid-client')
const Database = require('./Database')
+const Logger = require('./Logger')
+const e = require('express')
+/**
+ * @class Class for handling all the authentication related functionality.
+ */
class Auth {
- constructor() { }
- cors(req, res, next) {
- res.header('Access-Control-Allow-Origin', '*')
- res.header("Access-Control-Allow-Methods", 'GET, POST, PATCH, PUT, DELETE, OPTIONS')
- res.header('Access-Control-Allow-Headers', '*')
- // TODO: Make sure allowing all headers is not a security concern. It is required for adding custom headers for SSO
- // res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Range, Authorization")
- res.header('Access-Control-Allow-Credentials', true)
- if (req.method === 'OPTIONS') {
- res.sendStatus(200)
+ constructor() {
+ // Map of openId sessions indexed by oauth2 state-variable
+ this.openIdAuthSession = new Map()
+ }
+
+ /**
+ * Inializes all passportjs strategies and other passportjs ralated initialization.
+ */
+ async initPassportJs() {
+ // Check if we should load the local strategy (username + password login)
+ if (global.ServerSettings.authActiveAuthMethods.includes("local")) {
+ this.initAuthStrategyPassword()
+ }
+
+ // Check if we should load the openid strategy
+ if (global.ServerSettings.authActiveAuthMethods.includes("openid")) {
+ this.initAuthStrategyOpenID()
+ }
+
+ // Load the JwtStrategy (always) -> for bearer token auth
+ passport.use(new JwtStrategy({
+ jwtFromRequest: ExtractJwt.fromExtractors([ExtractJwt.fromAuthHeaderAsBearerToken(), ExtractJwt.fromUrlQueryParameter('token')]),
+ secretOrKey: Database.serverSettings.tokenSecret
+ }, this.jwtAuthCheck.bind(this)))
+
+ // define how to seralize a user (to be put into the session)
+ passport.serializeUser(function (user, cb) {
+ process.nextTick(function () {
+ // only store id to session
+ return cb(null, JSON.stringify({
+ id: user.id,
+ }))
+ })
+ })
+
+ // define how to deseralize a user (use the ID to get it from the database)
+ passport.deserializeUser((function (user, cb) {
+ process.nextTick((async function () {
+ const parsedUserInfo = JSON.parse(user)
+ // load the user by ID that is stored in the session
+ const dbUser = await Database.userModel.getUserById(parsedUserInfo.id)
+ return cb(null, dbUser)
+ }).bind(this))
+ }).bind(this))
+ }
+
+ /**
+ * Passport use LocalStrategy
+ */
+ initAuthStrategyPassword() {
+ passport.use(new LocalStrategy(this.localAuthCheckUserPw.bind(this)))
+ }
+
+ /**
+ * Passport use OpenIDClient.Strategy
+ */
+ initAuthStrategyOpenID() {
+ if (!Database.serverSettings.isOpenIDAuthSettingsValid) {
+ Logger.error(`[Auth] Cannot init openid auth strategy - invalid settings`)
+ return
+ }
+
+ const openIdIssuerClient = new OpenIDClient.Issuer({
+ issuer: global.ServerSettings.authOpenIDIssuerURL,
+ authorization_endpoint: global.ServerSettings.authOpenIDAuthorizationURL,
+ token_endpoint: global.ServerSettings.authOpenIDTokenURL,
+ userinfo_endpoint: global.ServerSettings.authOpenIDUserInfoURL,
+ jwks_uri: global.ServerSettings.authOpenIDJwksURL
+ }).Client
+ const openIdClient = new openIdIssuerClient({
+ client_id: global.ServerSettings.authOpenIDClientID,
+ client_secret: global.ServerSettings.authOpenIDClientSecret
+ })
+ passport.use('openid-client', new OpenIDClient.Strategy({
+ client: openIdClient,
+ params: {
+ redirect_uri: '/auth/openid/callback',
+ scope: 'openid profile email'
+ }
+ }, async (tokenset, userinfo, done) => {
+ Logger.debug(`[Auth] openid callback userinfo=`, userinfo)
+
+ let failureMessage = 'Unauthorized'
+ if (!userinfo.sub) {
+ Logger.error(`[Auth] openid callback invalid userinfo, no sub`)
+ return done(null, null, failureMessage)
+ }
+
+ // First check for matching user by sub
+ let user = await Database.userModel.getUserByOpenIDSub(userinfo.sub)
+ if (!user) {
+ // Optionally match existing by email or username based on server setting "authOpenIDMatchExistingBy"
+ if (Database.serverSettings.authOpenIDMatchExistingBy === 'email' && userinfo.email && userinfo.email_verified) {
+ Logger.info(`[Auth] openid: User not found, checking existing with email "${userinfo.email}"`)
+ user = await Database.userModel.getUserByEmail(userinfo.email)
+ // Check that user is not already matched
+ if (user?.authOpenIDSub) {
+ Logger.warn(`[Auth] openid: User found with email "${userinfo.email}" but is already matched with sub "${user.authOpenIDSub}"`)
+ // TODO: Message isn't actually returned to the user yet. Need to override the passport authenticated callback
+ failureMessage = 'A matching user was found but is already matched with another user from your auth provider'
+ user = null
+ }
+ } else if (Database.serverSettings.authOpenIDMatchExistingBy === 'username' && userinfo.preferred_username) {
+ Logger.info(`[Auth] openid: User not found, checking existing with username "${userinfo.preferred_username}"`)
+ user = await Database.userModel.getUserByUsername(userinfo.preferred_username)
+ // Check that user is not already matched
+ if (user?.authOpenIDSub) {
+ Logger.warn(`[Auth] openid: User found with username "${userinfo.preferred_username}" but is already matched with sub "${user.authOpenIDSub}"`)
+ // TODO: Message isn't actually returned to the user yet. Need to override the passport authenticated callback
+ failureMessage = 'A matching user was found but is already matched with another user from your auth provider'
+ user = null
+ }
+ }
+
+ // If existing user was matched and isActive then save sub to user
+ if (user?.isActive) {
+ Logger.info(`[Auth] openid: New user found matching existing user "${user.username}"`)
+ user.authOpenIDSub = userinfo.sub
+ await Database.userModel.updateFromOld(user)
+ } else if (user && !user.isActive) {
+ Logger.warn(`[Auth] openid: New user found matching existing user "${user.username}" but that user is deactivated`)
+ }
+
+ // Optionally auto register the user
+ if (!user && Database.serverSettings.authOpenIDAutoRegister) {
+ Logger.info(`[Auth] openid: Auto-registering user with sub "${userinfo.sub}"`, userinfo)
+ user = await Database.userModel.createUserFromOpenIdUserInfo(userinfo, this)
+ }
+ }
+
+ if (!user?.isActive) {
+ if (user && !user.isActive) {
+ failureMessage = 'Unauthorized'
+ }
+ // deny login
+ done(null, null, failureMessage)
+ return
+ }
+
+ // permit login
+ return done(null, user)
+ }))
+ }
+
+ /**
+ * Unuse strategy
+ *
+ * @param {string} name
+ */
+ unuseAuthStrategy(name) {
+ passport.unuse(name)
+ }
+
+ /**
+ * Use strategy
+ *
+ * @param {string} name
+ */
+ useAuthStrategy(name) {
+ if (name === 'openid') {
+ this.initAuthStrategyOpenID()
+ } else if (name === 'local') {
+ this.initAuthStrategyPassword()
} else {
- next()
+ Logger.error('[Auth] Invalid auth strategy ' + name)
}
}
+ /**
+ * Stores the client's choice how the login callback should happen in temp cookies
+ *
+ * @param {import('express').Request} req
+ * @param {import('express').Response} res
+ */
+ paramsToCookies(req, res) {
+ // Set if isRest flag is set or if mobile oauth flow is used
+ if (req.query.isRest?.toLowerCase() == 'true' || req.query.redirect_uri) {
+ // store the isRest flag to the is_rest cookie
+ res.cookie('is_rest', 'true', {
+ maxAge: 120000, // 2 min
+ httpOnly: true
+ })
+ } else {
+ // no isRest-flag set -> set is_rest cookie to false
+ res.cookie('is_rest', 'false', {
+ maxAge: 120000, // 2 min
+ httpOnly: true
+ })
+
+ // persist state if passed in
+ if (req.query.state) {
+ res.cookie('auth_state', req.query.state, {
+ maxAge: 120000, // 2 min
+ httpOnly: true
+ })
+ }
+
+ const callback = req.query.redirect_uri || req.query.callback
+
+ // check if we are missing a callback parameter - we need one if isRest=false
+ if (!callback) {
+ res.status(400).send({
+ message: 'No callback parameter'
+ })
+ return
+ }
+ // store the callback url to the auth_cb cookie
+ res.cookie('auth_cb', callback, {
+ maxAge: 120000, // 2 min
+ httpOnly: true
+ })
+ }
+ }
+
+ /**
+ * Informs the client in the right mode about a successfull login and the token
+ * (clients choise is restored from cookies).
+ *
+ * @param {import('express').Request} req
+ * @param {import('express').Response} res
+ */
+ async handleLoginSuccessBasedOnCookie(req, res) {
+ // get userLogin json (information about the user, server and the session)
+ const data_json = await this.getUserLoginResponsePayload(req.user)
+
+ if (req.cookies.is_rest === 'true') {
+ // REST request - send data
+ res.json(data_json)
+ } else {
+ // UI request -> check if we have a callback url
+ // TODO: do we want to somehow limit the values for auth_cb?
+ if (req.cookies.auth_cb) {
+ let stateQuery = req.cookies.auth_state ? `&state=${req.cookies.auth_state}` : ''
+ // UI request -> redirect to auth_cb url and send the jwt token as parameter
+ res.redirect(302, `${req.cookies.auth_cb}?setToken=${data_json.user.token}${stateQuery}`)
+ } else {
+ res.status(400).send('No callback or already expired')
+ }
+ }
+ }
+
+ /**
+ * Creates all (express) routes required for authentication.
+ *
+ * @param {import('express').Router} router
+ */
+ async initAuthRoutes(router) {
+ // Local strategy login route (takes username and password)
+ router.post('/login', passport.authenticate('local'), async (req, res) => {
+ // return the user login response json if the login was successfull
+ res.json(await this.getUserLoginResponsePayload(req.user))
+ })
+
+ // openid strategy login route (this redirects to the configured openid login provider)
+ router.get('/auth/openid', (req, res, next) => {
+ try {
+ // helper function from openid-client
+ function pick(object, ...paths) {
+ const obj = {}
+ for (const path of paths) {
+ if (object[path] !== undefined) {
+ obj[path] = object[path]
+ }
+ }
+ return obj
+ }
+
+ // Get the OIDC client from the strategy
+ // We need to call the client manually, because the strategy does not support forwarding the code challenge
+ // for API or mobile clients
+ const oidcStrategy = passport._strategy('openid-client')
+ const protocol = (req.secure || req.get('x-forwarded-proto') === 'https') ? 'https' : 'http'
+
+ let mobile_redirect_uri = null
+
+ // The client wishes a different redirect_uri
+ // We will allow if it is in the whitelist, by saving it into this.openIdAuthSession and setting the redirect uri to /auth/openid/mobile-redirect
+ // where we will handle the redirect to it
+ if (req.query.redirect_uri) {
+ // Check if the redirect_uri is in the whitelist
+ if (Database.serverSettings.authOpenIDMobileRedirectURIs.includes(req.query.redirect_uri) ||
+ (Database.serverSettings.authOpenIDMobileRedirectURIs.length === 1 && Database.serverSettings.authOpenIDMobileRedirectURIs[0] === '*')) {
+ oidcStrategy._params.redirect_uri = new URL(`${protocol}://${req.get('host')}/auth/openid/mobile-redirect`).toString()
+ mobile_redirect_uri = req.query.redirect_uri
+ } else {
+ Logger.debug(`[Auth] Invalid redirect_uri=${req.query.redirect_uri} - not in whitelist`)
+ return res.status(400).send('Invalid redirect_uri')
+ }
+ } else {
+ oidcStrategy._params.redirect_uri = new URL(`${protocol}://${req.get('host')}/auth/openid/callback`).toString()
+ }
+
+ Logger.debug(`[Auth] Oidc redirect_uri=${oidcStrategy._params.redirect_uri}`)
+ const client = oidcStrategy._client
+ const sessionKey = oidcStrategy._key
+
+ let code_challenge
+ let code_challenge_method
+
+ // If code_challenge is provided, expect that code_verifier will be handled by the client (mobile app)
+ // The web frontend of ABS does not need to do a PKCE itself, because it never handles the "code" of the oauth flow
+ // and as such will not send a code challenge, we will generate then one
+ if (req.query.code_challenge) {
+ code_challenge = req.query.code_challenge
+ code_challenge_method = req.query.code_challenge_method || 'S256'
+
+ if (!['S256', 'plain'].includes(code_challenge_method)) {
+ return res.status(400).send('Invalid code_challenge_method')
+ }
+ } else {
+ // If no code_challenge is provided, assume a web application flow and generate one
+ const code_verifier = OpenIDClient.generators.codeVerifier()
+ code_challenge = OpenIDClient.generators.codeChallenge(code_verifier)
+ code_challenge_method = 'S256'
+
+ // Store the code_verifier in the session for later use in the token exchange
+ req.session[sessionKey] = { ...req.session[sessionKey], code_verifier }
+ }
+
+ const params = {
+ state: OpenIDClient.generators.random(),
+ // Other params by the passport strategy
+ ...oidcStrategy._params
+ }
+
+ if (!params.nonce && params.response_type.includes('id_token')) {
+ params.nonce = OpenIDClient.generators.random()
+ }
+
+ req.session[sessionKey] = {
+ ...req.session[sessionKey],
+ ...pick(params, 'nonce', 'state', 'max_age', 'response_type'),
+ mobile: req.query.redirect_uri, // Used in the abs callback later, set mobile if redirect_uri is filled out
+ sso_redirect_uri: oidcStrategy._params.redirect_uri // Save the redirect_uri (for the SSO Provider) for the callback
+ }
+
+ // We cannot save redirect_uri in the session, because it the mobile client uses browser instead of the API
+ // for the request to mobile-redirect and as such the session is not shared
+ this.openIdAuthSession.set(params.state, { mobile_redirect_uri: mobile_redirect_uri })
+
+ // Now get the URL to direct to
+ const authorizationUrl = client.authorizationUrl({
+ ...params,
+ scope: 'openid profile email',
+ response_type: 'code',
+ code_challenge,
+ code_challenge_method
+ })
+
+ // params (isRest, callback) to a cookie that will be send to the client
+ this.paramsToCookies(req, res)
+
+ // Redirect the user agent (browser) to the authorization URL
+ res.redirect(authorizationUrl)
+ } catch (error) {
+ Logger.error(`[Auth] Error in /auth/openid route: ${error}`)
+ res.status(500).send('Internal Server Error')
+ }
+ })
+
+ // This will be the oauth2 callback route for mobile clients
+ // It will redirect to an app-link like audiobookshelf://oauth
+ router.get('/auth/openid/mobile-redirect', (req, res) => {
+ try {
+ // Extract the state parameter from the request
+ const { state, code } = req.query
+
+ // Check if the state provided is in our list
+ if (!state || !this.openIdAuthSession.has(state)) {
+ Logger.error('[Auth] /auth/openid/mobile-redirect route: State parameter mismatch')
+ return res.status(400).send('State parameter mismatch')
+ }
+
+ let mobile_redirect_uri = this.openIdAuthSession.get(state).mobile_redirect_uri
+
+ if (!mobile_redirect_uri) {
+ Logger.error('[Auth] No redirect URI')
+ return res.status(400).send('No redirect URI')
+ }
+
+ this.openIdAuthSession.delete(state)
+
+ const redirectUri = `${mobile_redirect_uri}?code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`
+ // Redirect to the overwrite URI saved in the map
+ res.redirect(redirectUri)
+ } catch (error) {
+ Logger.error(`[Auth] Error in /auth/openid/mobile-redirect route: ${error}`)
+ res.status(500).send('Internal Server Error')
+ }
+ })
+
+ // openid strategy callback route (this receives the token from the configured openid login provider)
+ router.get('/auth/openid/callback', (req, res, next) => {
+ const oidcStrategy = passport._strategy('openid-client')
+ const sessionKey = oidcStrategy._key
+
+ if (!req.session[sessionKey]) {
+ return res.status(400).send('No session')
+ }
+
+ // If the client sends us a code_verifier, we will tell passport to use this to send this in the token request
+ // The code_verifier will be validated by the oauth2 provider by comparing it to the code_challenge in the first request
+ // Crucial for API/Mobile clients
+ if (req.query.code_verifier) {
+ req.session[sessionKey].code_verifier = req.query.code_verifier
+ }
+
+ function handleAuthError(isMobile, errorCode, errorMessage, logMessage, response) {
+ Logger.error(logMessage)
+ if (response) {
+ // Depending on the error, it can also have a body
+ // We also log the request header the passport plugin sents for the URL
+ const header = response.req?._header.replace(/Authorization: [^\r\n]*/i, 'Authorization: REDACTED')
+ Logger.debug(header + '\n' + response.body?.toString())
+ }
+
+ if (isMobile) {
+ return res.status(errorCode).send(errorMessage)
+ } else {
+ return res.redirect(`/login?error=${encodeURIComponent(errorMessage)}&autoLaunch=0`)
+ }
+ }
+
+ function passportCallback(req, res, next) {
+ return (err, user, info) => {
+ const isMobile = req.session[sessionKey]?.mobile === true
+ if (err) {
+ return handleAuthError(isMobile, 500, 'Error in callback', `[Auth] Error in openid callback - ${err}`, err?.response)
+ }
+
+ if (!user) {
+ // Info usually contains the error message from the SSO provider
+ return handleAuthError(isMobile, 401, 'Unauthorized', `[Auth] No data in openid callback - ${info}`, info?.response)
+ }
+
+ req.logIn(user, (loginError) => {
+ if (loginError) {
+ return handleAuthError(isMobile, 500, 'Error during login', `[Auth] Error in openid callback: ${loginError}`)
+ }
+ next()
+ })
+ }
+ }
+
+
+ // While not required by the standard, the passport plugin re-sends the original redirect_uri in the token request
+ // We need to set it correctly, as some SSO providers (e.g. keycloak) check that parameter when it is provided
+ // We set it here again because the passport param can change between requests
+ return passport.authenticate('openid-client', { redirect_uri: req.session[sessionKey].sso_redirect_uri }, passportCallback(req, res, next))(req, res, next)
+ },
+ // on a successfull login: read the cookies and react like the client requested (callback or json)
+ this.handleLoginSuccessBasedOnCookie.bind(this))
+
+ /**
+ * Helper route used to auto-populate the openid URLs in config/authentication
+ * Takes an issuer URL as a query param and requests the config data at "/.well-known/openid-configuration"
+ *
+ * @example /auth/openid/config?issuer=http://192.168.1.66:9000/application/o/audiobookshelf/
+ */
+ router.get('/auth/openid/config', this.isAuthenticated, async (req, res) => {
+ if (!req.user.isAdminOrUp) {
+ Logger.error(`[Auth] Non-admin user "${req.user.username}" attempted to get issuer config`)
+ return res.sendStatus(403)
+ }
+
+ if (!req.query.issuer) {
+ return res.status(400).send('Invalid request. Query param \'issuer\' is required')
+ }
+
+ // Strip trailing slash
+ let issuerUrl = req.query.issuer
+ if (issuerUrl.endsWith('/')) issuerUrl = issuerUrl.slice(0, -1)
+
+ // Append config pathname and validate URL
+ let configUrl = null
+ try {
+ configUrl = new URL(`${issuerUrl}/.well-known/openid-configuration`)
+ if (!configUrl.pathname.endsWith('/.well-known/openid-configuration')) {
+ throw new Error('Invalid pathname')
+ }
+ } catch (error) {
+ Logger.error(`[Auth] Failed to get openid configuration. Invalid URL "${configUrl}"`, error)
+ return res.status(400).send('Invalid request. Query param \'issuer\' is invalid')
+ }
+
+ axios.get(configUrl.toString()).then(({ data }) => {
+ res.json({
+ issuer: data.issuer,
+ authorization_endpoint: data.authorization_endpoint,
+ token_endpoint: data.token_endpoint,
+ userinfo_endpoint: data.userinfo_endpoint,
+ end_session_endpoint: data.end_session_endpoint,
+ jwks_uri: data.jwks_uri
+ })
+ }).catch((error) => {
+ Logger.error(`[Auth] Failed to get openid configuration at "${configUrl}"`, error)
+ res.status(error.statusCode || 400).send(`${error.code || 'UNKNOWN'}: Failed to get openid configuration`)
+ })
+ })
+
+ // Logout route
+ router.post('/logout', (req, res) => {
+ // TODO: invalidate possible JWTs
+ req.logout((err) => {
+ if (err) {
+ res.sendStatus(500)
+ } else {
+ res.sendStatus(200)
+ }
+ })
+ })
+ }
+
+ /**
+ * middleware to use in express to only allow authenticated users.
+ * @param {import('express').Request} req
+ * @param {import('express').Response} res
+ * @param {import('express').NextFunction} next
+ */
+ isAuthenticated(req, res, next) {
+ // check if session cookie says that we are authenticated
+ if (req.isAuthenticated()) {
+ next()
+ } else {
+ // try JWT to authenticate
+ passport.authenticate("jwt")(req, res, next)
+ }
+ }
+
+ /**
+ * Function to generate a jwt token for a given user
+ *
+ * @param {{ id:string, username:string }} user
+ * @returns {string} token
+ */
+ generateAccessToken(user) {
+ return jwt.sign({ userId: user.id, username: user.username }, global.ServerSettings.tokenSecret)
+ }
+
+ /**
+ * Function to validate a jwt token for a given user
+ *
+ * @param {string} token
+ * @returns {Object} tokens data
+ */
+ static validateAccessToken(token) {
+ try {
+ return jwt.verify(token, global.ServerSettings.tokenSecret)
+ }
+ catch (err) {
+ return null
+ }
+ }
+
+ /**
+ * Generate a token which is used to encrpt/protect the jwts.
+ */
async initTokenSecret() {
if (process.env.TOKEN_SECRET) { // User can supply their own token secret
- Logger.debug(`[Auth] Setting token secret - using user passed in TOKEN_SECRET env var`)
Database.serverSettings.tokenSecret = process.env.TOKEN_SECRET
} else {
- Logger.debug(`[Auth] Setting token secret - using random bytes`)
Database.serverSettings.tokenSecret = require('crypto').randomBytes(256).toString('base64')
}
await Database.updateServerSettings()
@@ -35,47 +584,83 @@ class Auth {
const users = await Database.userModel.getOldUsers()
if (users.length) {
for (const user of users) {
- user.token = await this.generateAccessToken({ userId: user.id, username: user.username })
- Logger.warn(`[Auth] User ${user.username} api token has been updated using new token secret`)
+ user.token = await this.generateAccessToken(user)
}
await Database.updateBulkUsers(users)
}
}
- async authMiddleware(req, res, next) {
- var token = null
+ /**
+ * Checks if the user in the validated jwt_payload really exists and is active.
+ * @param {Object} jwt_payload
+ * @param {function} done
+ */
+ async jwtAuthCheck(jwt_payload, done) {
+ // load user by id from the jwt token
+ const user = await Database.userModel.getUserByIdOrOldId(jwt_payload.userId)
- // If using a get request, the token can be passed as a query string
- if (req.method === 'GET' && req.query && req.query.token) {
- token = req.query.token
- } else {
- const authHeader = req.headers['authorization']
- token = authHeader && authHeader.split(' ')[1]
+ if (!user?.isActive) {
+ // deny login
+ done(null, null)
+ return
}
-
- if (token == null) {
- Logger.error('Api called without a token', req.path)
- return res.sendStatus(401)
- }
-
- const user = await this.verifyToken(token)
- if (!user) {
- Logger.error('Verify Token User Not Found', token)
- return res.sendStatus(404)
- }
- if (!user.isActive) {
- Logger.error('Verify Token User is disabled', token, user.username)
- return res.sendStatus(403)
- }
- req.user = user
- next()
+ // approve login
+ done(null, user)
+ return
}
+ /**
+ * Checks if a username and password tuple is valid and the user active.
+ * @param {string} username
+ * @param {string} password
+ * @param {function} done
+ */
+ async localAuthCheckUserPw(username, password, done) {
+ // Load the user given it's username
+ const user = await Database.userModel.getUserByUsername(username.toLowerCase())
+
+ if (!user?.isActive) {
+ done(null, null)
+ return
+ }
+
+ // Check passwordless root user
+ if (user.type === 'root' && !user.pash) {
+ if (password) {
+ // deny login
+ done(null, null)
+ return
+ }
+ // approve login
+ done(null, user)
+ return
+ } else if (!user.pash) {
+ Logger.error(`[Auth] User "${user.username}"/"${user.type}" attempted to login without a password set`)
+ done(null, null)
+ return
+ }
+
+ // Check password match
+ const compare = await bcrypt.compare(password, user.pash)
+ if (compare) {
+ // approve login
+ done(null, user)
+ return
+ }
+ // deny login
+ done(null, null)
+ return
+ }
+
+ /**
+ * Hashes a password with bcrypt.
+ * @param {string} password
+ * @returns {string} hash
+ */
hashPass(password) {
return new Promise((resolve) => {
bcrypt.hash(password, 8, (err, hash) => {
if (err) {
- Logger.error('Hash failed', err)
resolve(null)
} else {
resolve(hash)
@@ -84,36 +669,11 @@ class Auth {
})
}
- generateAccessToken(payload) {
- return jwt.sign(payload, Database.serverSettings.tokenSecret)
- }
-
- authenticateUser(token) {
- return this.verifyToken(token)
- }
-
- verifyToken(token) {
- return new Promise((resolve) => {
- jwt.verify(token, Database.serverSettings.tokenSecret, async (err, payload) => {
- if (!payload || err) {
- Logger.error('JWT Verify Token Failed', err)
- return resolve(null)
- }
-
- const user = await Database.userModel.getUserByIdOrOldId(payload.userId)
- if (user && user.username === payload.username) {
- resolve(user)
- } else {
- resolve(null)
- }
- })
- })
- }
-
/**
- * Payload returned to a user after successful login
- * @param {oldUser} user
- * @returns {object}
+ * Return the login info payload for a user
+ *
+ * @param {Object} user
+ * @returns {Promise