diff --git a/client/store/libraries.js b/client/store/libraries.js
index 1d13d6322..f56bdad67 100644
--- a/client/store/libraries.js
+++ b/client/store/libraries.js
@@ -16,8 +16,8 @@ export const state = () => ({
})
export const getters = {
- getCurrentLibrary: state => {
- return state.libraries.find(lib => lib.id === state.currentLibraryId)
+ getCurrentLibrary: (state) => {
+ return state.libraries.find((lib) => lib.id === state.currentLibraryId)
},
getCurrentLibraryName: (state, getters) => {
var currentLibrary = getters.getCurrentLibrary
@@ -28,11 +28,11 @@ export const getters = {
if (!getters.getCurrentLibrary) return null
return getters.getCurrentLibrary.mediaType
},
- getSortedLibraries: state => () => {
- return state.libraries.map(lib => ({ ...lib })).sort((a, b) => a.displayOrder - b.displayOrder)
+ getSortedLibraries: (state) => () => {
+ return state.libraries.map((lib) => ({ ...lib })).sort((a, b) => a.displayOrder - b.displayOrder)
},
- getLibraryProvider: state => libraryId => {
- var library = state.libraries.find(l => l.id === libraryId)
+ getLibraryProvider: (state) => (libraryId) => {
+ var library = state.libraries.find((l) => l.id === libraryId)
if (!library) return null
return library.provider
},
@@ -60,11 +60,14 @@ export const getters = {
getLibraryIsAudiobooksOnly: (state, getters) => {
return !!getters.getCurrentLibrarySettings?.audiobooksOnly
},
- getCollection: state => id => {
- return state.collections.find(c => c.id === id)
+ getLibraryEpubsAllowScriptedContent: (state, getters) => {
+ return !!getters.getCurrentLibrarySettings?.epubsAllowScriptedContent
},
- getPlaylist: state => id => {
- return state.userPlaylists.find(p => p.id === id)
+ getCollection: (state) => (id) => {
+ return state.collections.find((c) => c.id === id)
+ },
+ getPlaylist: (state) => (id) => {
+ return state.userPlaylists.find((p) => p.id === id)
}
}
@@ -75,7 +78,8 @@ export const actions = {
loadFolders({ state, commit }) {
if (state.folders.length) {
const lastCheck = Date.now() - state.folderLastUpdate
- if (lastCheck < 1000 * 5) { // 5 seconds
+ if (lastCheck < 1000 * 5) {
+ // 5 seconds
// Folders up to date
return state.folders
}
@@ -204,7 +208,7 @@ export const mutations = {
})
},
addUpdate(state, library) {
- var index = state.libraries.findIndex(a => a.id === library.id)
+ var index = state.libraries.findIndex((a) => a.id === library.id)
if (index >= 0) {
state.libraries.splice(index, 1, library)
} else {
@@ -216,19 +220,19 @@ export const mutations = {
})
},
remove(state, library) {
- state.libraries = state.libraries.filter(a => a.id !== library.id)
+ state.libraries = state.libraries.filter((a) => a.id !== library.id)
state.listeners.forEach((listener) => {
listener.meth()
})
},
addListener(state, listener) {
- var index = state.listeners.findIndex(l => l.id === listener.id)
+ var index = state.listeners.findIndex((l) => l.id === listener.id)
if (index >= 0) state.listeners.splice(index, 1, listener)
else state.listeners.push(listener)
},
removeListener(state, listenerId) {
- state.listeners = state.listeners.filter(l => l.id !== listenerId)
+ state.listeners = state.listeners.filter((l) => l.id !== listenerId)
},
setLibraryFilterData(state, filterData) {
state.filterData = filterData
@@ -238,7 +242,7 @@ export const mutations = {
},
removeSeriesFromFilterData(state, seriesId) {
if (!seriesId || !state.filterData) return
- state.filterData.series = state.filterData.series.filter(se => se.id !== seriesId)
+ state.filterData.series = state.filterData.series.filter((se) => se.id !== seriesId)
},
updateFilterDataWithItem(state, libraryItem) {
if (!libraryItem || !state.filterData) return
@@ -260,12 +264,12 @@ export const mutations = {
// Add/update book authors
if (mediaMetadata.authors?.length) {
mediaMetadata.authors.forEach((author) => {
- const indexOf = state.filterData.authors.findIndex(au => au.id === author.id)
+ const indexOf = state.filterData.authors.findIndex((au) => au.id === author.id)
if (indexOf >= 0) {
state.filterData.authors.splice(indexOf, 1, author)
} else {
state.filterData.authors.push(author)
- state.filterData.authors.sort((a, b) => (a.name || '').localeCompare((b.name || '')))
+ state.filterData.authors.sort((a, b) => (a.name || '').localeCompare(b.name || ''))
}
})
}
@@ -273,12 +277,12 @@ export const mutations = {
// Add/update series
if (mediaMetadata.series?.length) {
mediaMetadata.series.forEach((series) => {
- const indexOf = state.filterData.series.findIndex(se => se.id === series.id)
+ const indexOf = state.filterData.series.findIndex((se) => se.id === series.id)
if (indexOf >= 0) {
state.filterData.series.splice(indexOf, 1, { id: series.id, name: series.name })
} else {
state.filterData.series.push({ id: series.id, name: series.name })
- state.filterData.series.sort((a, b) => (a.name || '').localeCompare((b.name || '')))
+ state.filterData.series.sort((a, b) => (a.name || '').localeCompare(b.name || ''))
}
})
}
@@ -329,7 +333,7 @@ export const mutations = {
state.collections = collections
},
addUpdateCollection(state, collection) {
- var index = state.collections.findIndex(c => c.id === collection.id)
+ var index = state.collections.findIndex((c) => c.id === collection.id)
if (index >= 0) {
state.collections.splice(index, 1, collection)
} else {
@@ -337,14 +341,14 @@ export const mutations = {
}
},
removeCollection(state, collection) {
- state.collections = state.collections.filter(c => c.id !== collection.id)
+ state.collections = state.collections.filter((c) => c.id !== collection.id)
},
setUserPlaylists(state, playlists) {
state.userPlaylists = playlists
state.numUserPlaylists = playlists.length
},
addUpdateUserPlaylist(state, playlist) {
- const index = state.userPlaylists.findIndex(p => p.id === playlist.id)
+ const index = state.userPlaylists.findIndex((p) => p.id === playlist.id)
if (index >= 0) {
state.userPlaylists.splice(index, 1, playlist)
} else {
@@ -353,10 +357,10 @@ export const mutations = {
}
},
removeUserPlaylist(state, playlist) {
- state.userPlaylists = state.userPlaylists.filter(p => p.id !== playlist.id)
+ state.userPlaylists = state.userPlaylists.filter((p) => p.id !== playlist.id)
state.numUserPlaylists = state.userPlaylists.length
},
setEReaderDevices(state, ereaderDevices) {
state.ereaderDevices = ereaderDevices
}
-}
\ No newline at end of file
+}
diff --git a/client/strings/bg.json b/client/strings/bg.json
index e50cedf66..0858856e4 100644
--- a/client/strings/bg.json
+++ b/client/strings/bg.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Съкратен",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Тип на Профила",
"LabelAccountTypeAdmin": "Администратор",
"LabelAccountTypeGuest": "Гост",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Включи наблюдателя",
"LabelSettingsEnableWatcherForLibrary": "Включи наблюдателя за библиотека",
"LabelSettingsEnableWatcherHelp": "Включва автоматичното добавяне/обновяване на елементи, когато се открият промени във файловете. *Изисква рестарт на сървъра",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Експериментални Функции",
"LabelSettingsExperimentalFeaturesHelp": "Функции в разработка, които могат да изискват вашето мнение и помощ за тестване. Кликнете за да отворите дискусия в github.",
"LabelSettingsFindCovers": "Намери Корици",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Плъзнете файлове в правилния ред на каналите",
"MessageEmbedFinished": "Вграждането завърши!",
"MessageEpisodesQueuedForDownload": "{0} епизод(и) в опашка за изтегляне",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL-a ще бъде {0}",
"MessageFetching": "Взимане...",
"MessageForceReScanDescription": "ще сканира всички файлове отново като прясно сканиране. Аудио файлове ID3 тагове, OPF файлове и текстови файлове ще бъдат сканирани като нови.",
diff --git a/client/strings/bn.json b/client/strings/bn.json
index 3f25792b6..89fe78fef 100644
--- a/client/strings/bn.json
+++ b/client/strings/bn.json
@@ -191,6 +191,7 @@
"LabelAbridged": "সংক্ষিপ্ত",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "অ্যাকাউন্টের প্রকার",
"LabelAccountTypeAdmin": "প্রশাসন",
"LabelAccountTypeGuest": "অতিথি",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "প্রহরী সক্ষম করুন",
"LabelSettingsEnableWatcherForLibrary": "লাইব্রেরির জন্য ফোল্ডার প্রহরী সক্ষম করুন",
"LabelSettingsEnableWatcherHelp": "ফাইলের পরিবর্তন শনাক্ত হলে আইটেমগুলির স্বয়ংক্রিয় যোগ/আপডেট সক্ষম করবে। *সার্ভার পুনরায় চালু করতে হবে",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "পরীক্ষামূলক বৈশিষ্ট্য",
"LabelSettingsExperimentalFeaturesHelp": "ফিচারের বৈশিষ্ট্য যা আপনার প্রতিক্রিয়া ব্যবহার করতে পারে এবং পরীক্ষায় সহায়তা করতে পারে। গিটহাব আলোচনা খুলতে ক্লিক করুন।",
"LabelSettingsFindCovers": "কভার খুঁজুন",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "সঠিক ট্র্যাক অর্ডারে ফাইল টেনে আনুন",
"MessageEmbedFinished": "এম্বেড করা শেষ!",
"MessageEpisodesQueuedForDownload": "{0} পর্ব(গুলি) ডাউনলোডের জন্য সারিবদ্ধ",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "ফিড URL হবে {0}",
"MessageFetching": "আনয় হচ্ছে...",
"MessageForceReScanDescription": "সকল ফাইল আবার নতুন স্ক্যানের মত স্ক্যান করবে। অডিও ফাইল ID3 ট্যাগ, OPF ফাইল, এবং টেক্সট ফাইলগুলি নতুন হিসাবে স্ক্যান করা হবে।",
diff --git a/client/strings/cs.json b/client/strings/cs.json
index 9f6000c56..b326996d1 100644
--- a/client/strings/cs.json
+++ b/client/strings/cs.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Zkráceno",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Typ účtu",
"LabelAccountTypeAdmin": "Správce",
"LabelAccountTypeGuest": "Host",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"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",
@@ -630,6 +633,7 @@
"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í",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"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é.",
diff --git a/client/strings/da.json b/client/strings/da.json
index 12f6dc80a..96a0d04b2 100644
--- a/client/strings/da.json
+++ b/client/strings/da.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Abridged",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Kontotype",
"LabelAccountTypeAdmin": "Administrator",
"LabelAccountTypeGuest": "Gæst",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"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",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Træk filer ind i korrekt spororden",
"MessageEmbedFinished": "Indlejring færdig!",
"MessageEpisodesQueuedForDownload": "{0} episoder er sat i kø til download",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"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.",
diff --git a/client/strings/de.json b/client/strings/de.json
index 30a0d9ea3..50bb4c3b3 100644
--- a/client/strings/de.json
+++ b/client/strings/de.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Gekürzt",
"LabelAbridgedChecked": "Gekürzt (angehakt)",
"LabelAbridgedUnchecked": "Ungekürzt (nicht angehakt)",
+ "LabelAccessibleBy": "Zugänglich für",
"LabelAccountType": "Kontoart",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Gast",
@@ -270,7 +271,7 @@
"LabelDownloadNEpisodes": "Download {0} Episoden",
"LabelDuration": "Laufzeit",
"LabelDurationComparisonExactMatch": "(genauer Treffer)",
- "LabelDurationComparisonLonger": "({0} änger)",
+ "LabelDurationComparisonLonger": "({0} länger)",
"LabelDurationComparisonShorter": "({0} kürzer)",
"LabelDurationFound": "Gefundene Laufzeit:",
"LabelEbook": "E-Book",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Überwachung aktivieren",
"LabelSettingsEnableWatcherForLibrary": "Ordnerüberwachung für die Bibliothek aktivieren",
"LabelSettingsEnableWatcherHelp": "Aktiviert das automatische Hinzufügen/Aktualisieren von Elementen, wenn Dateiänderungen erkannt werden. *Erfordert einen Server-Neustart",
+ "LabelSettingsEpubsAllowScriptedContent": "Skriptinhalte in Epubs zulassen",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Erlaube Epub-Dateien, Skripte auszuführen. Es wird empfohlen, diese Einstellung deaktiviert zu lassen, es sei denn, du vertraust der Quelle der Epub-Dateien.",
"LabelSettingsExperimentalFeatures": "Experimentelle Funktionen",
"LabelSettingsExperimentalFeaturesHelp": "Funktionen welche sich in der Entwicklung befinden, benötigen dein Feedback und deine Hilfe beim Testen. Klicke hier, um die Github-Diskussion zu öffnen.",
"LabelSettingsFindCovers": "Suche Titelbilder",
@@ -498,7 +501,7 @@
"LabelShowAll": "Alles anzeigen",
"LabelShowSeconds": "Zeige Sekunden",
"LabelSize": "Größe",
- "LabelSleepTimer": "Sleep-Timer",
+ "LabelSleepTimer": "Schlummerfunktion",
"LabelSlug": "URL Teil",
"LabelStart": "Start",
"LabelStarted": "Gestartet",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Verschiebe die Dateien in die richtige Reihenfolge",
"MessageEmbedFinished": "Einbettung abgeschlossen!",
"MessageEpisodesQueuedForDownload": "{0} Episode(n) in der Warteschlange zum Herunterladen",
+ "MessageEreaderDevices": "Um die Zustellung von E-Books sicherzustellen, musst du eventuell die oben genannte E-Mail-Adresse als gültigen Absender für jedes unten aufgeführte Gerät hinzufügen.",
"MessageFeedURLWillBe": "Feed-URL wird {0} sein",
"MessageFetching": "Abrufen...",
"MessageForceReScanDescription": "Durchsucht alle Dateien erneut, wie bei einem frischen Scan. ID3-Tags von Audiodateien, OPF-Dateien und Textdateien werden neu durchsucht.",
@@ -803,4 +807,4 @@
"ToastSortingPrefixesUpdateSuccess": "Die Sortier-Prefixe wirden geupdated ({0} Einträge)",
"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 7bce0cad4..dad359ccd 100644
--- a/client/strings/en-us.json
+++ b/client/strings/en-us.json
@@ -195,6 +195,7 @@
"LabelAbridged": "Abridged",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Account Type",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Guest",
@@ -483,6 +484,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Experimental features",
"LabelSettingsExperimentalFeaturesHelp": "Features in development that could use your feedback and help testing. Click to open github discussion.",
"LabelSettingsFindCovers": "Find covers",
@@ -643,6 +646,7 @@
"MessageDragFilesIntoTrackOrder": "Drag files into correct track order",
"MessageEmbedFinished": "Embed Finished!",
"MessageEpisodesQueuedForDownload": "{0} Episode(s) queued for download",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL will be {0}",
"MessageFetching": "Fetching...",
"MessageForceReScanDescription": "will scan all files again like a fresh scan. Audio file ID3 tags, OPF files, and text files will be scanned as new.",
diff --git a/client/strings/es.json b/client/strings/es.json
index 59ed6c471..cead84e25 100644
--- a/client/strings/es.json
+++ b/client/strings/es.json
@@ -61,9 +61,9 @@
"ButtonQueueRemoveItem": "Remover de la Fila",
"ButtonQuickMatch": "Encontrar Rápido",
"ButtonRead": "Leer",
- "ButtonReadLess": "Read less",
- "ButtonReadMore": "Read more",
- "ButtonRefresh": "Refresh",
+ "ButtonReadLess": "Lea menos",
+ "ButtonReadMore": "Lea mas",
+ "ButtonRefresh": "Refrecar",
"ButtonRemove": "Remover",
"ButtonRemoveAll": "Remover Todos",
"ButtonRemoveAllLibraryItems": "Remover Todos los Elementos de la Biblioteca",
@@ -72,7 +72,7 @@
"ButtonRemoveSeriesFromContinueSeries": "Remover Serie de Continuar Series",
"ButtonReScan": "Re-Escanear",
"ButtonReset": "Reiniciar",
- "ButtonResetToDefault": "Reset to default",
+ "ButtonResetToDefault": "Restaurar valores por defecto",
"ButtonRestore": "Restaurar",
"ButtonSave": "Guardar",
"ButtonSaveAndClose": "Guardar y Cerrar",
@@ -83,7 +83,7 @@
"ButtonSelectFolderPath": "Seleccionar Ruta de Carpeta",
"ButtonSeries": "Series",
"ButtonSetChaptersFromTracks": "Seleccionar Capítulos Según las Pistas",
- "ButtonShare": "Share",
+ "ButtonShare": "Compartir",
"ButtonShiftTimes": "Desplazar Tiempos",
"ButtonShow": "Mostrar",
"ButtonStartM4BEncode": "Iniciar Codificación M4B",
@@ -161,11 +161,11 @@
"HeaderRemoveEpisodes": "Remover {0} Episodios",
"HeaderRSSFeedGeneral": "Detalles RSS",
"HeaderRSSFeedIsOpen": "Fuente RSS esta abierta",
- "HeaderRSSFeeds": "RSS Feeds",
+ "HeaderRSSFeeds": "Fuentes RSS",
"HeaderSavedMediaProgress": "Guardar Progreso de Multimedia",
"HeaderSchedule": "Horario",
"HeaderScheduleLibraryScans": "Programar Escaneo Automático de Biblioteca",
- "HeaderSession": "Session",
+ "HeaderSession": "Sesión",
"HeaderSetBackupSchedule": "Programar Respaldo",
"HeaderSettings": "Configuraciones",
"HeaderSettingsDisplay": "Interfaz",
@@ -191,6 +191,7 @@
"LabelAbridged": "Abreviado",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Tipo de Cuenta",
"LabelAccountTypeAdmin": "Administrador",
"LabelAccountTypeGuest": "Invitado",
@@ -207,7 +208,7 @@
"LabelAllUsers": "Todos los Usuarios",
"LabelAllUsersExcludingGuests": "Todos los usuarios excepto invitados",
"LabelAllUsersIncludingGuests": "Todos los usuarios e invitados",
- "LabelAlreadyInYourLibrary": "Ya en la Biblioteca",
+ "LabelAlreadyInYourLibrary": "Ya existe en la Biblioteca",
"LabelAppend": "Adjuntar",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Nombre Apellido)",
@@ -269,9 +270,9 @@
"LabelDownload": "Descargar",
"LabelDownloadNEpisodes": "Descargar {0} episodios",
"LabelDuration": "Duración",
- "LabelDurationComparisonExactMatch": "(exact match)",
- "LabelDurationComparisonLonger": "({0} longer)",
- "LabelDurationComparisonShorter": "({0} shorter)",
+ "LabelDurationComparisonExactMatch": "(coincidencia exacta)",
+ "LabelDurationComparisonLonger": "({0} más largo)",
+ "LabelDurationComparisonShorter": "({0} más corto)",
"LabelDurationFound": "Duración Comprobada:",
"LabelEbook": "Ebook",
"LabelEbooks": "Ebooks",
@@ -289,8 +290,8 @@
"LabelEpisodeType": "Tipo de Episodio",
"LabelExample": "Ejemplo",
"LabelExplicit": "Explicito",
- "LabelExplicitChecked": "Explicit (checked)",
- "LabelExplicitUnchecked": "Not Explicit (unchecked)",
+ "LabelExplicitChecked": "Explícito (marcado)",
+ "LabelExplicitUnchecked": "No Explícito (sin marcar)",
"LabelFeedURL": "Fuente de URL",
"LabelFetchingMetadata": "Obteniendo metadatos",
"LabelFile": "Archivo",
@@ -365,8 +366,8 @@
"LabelMetaTags": "Metaetiquetas",
"LabelMinute": "Minuto",
"LabelMissing": "Ausente",
- "LabelMissingEbook": "Has no ebook",
- "LabelMissingSupplementaryEbook": "Has no supplementary ebook",
+ "LabelMissingEbook": "No tiene ebook",
+ "LabelMissingSupplementaryEbook": "No tiene ebook suplementario",
"LabelMobileRedirectURIs": "URIs de redirección a móviles permitidos",
"LabelMobileRedirectURIsDescription": "Esta es una lista de URIs válidos para redireccionamiento de apps móviles. La URI por defecto es audiobookshelf://oauth, la cual puedes remover or corroborar con URIs adicionales para la integración con apps de terceros. Utilizando un asterisco (*) como el único punto de entrada permite cualquier URI.",
"LabelMore": "Más",
@@ -469,7 +470,9 @@
"LabelSettingsDisableWatcherHelp": "Deshabilitar la función de agregar/actualizar elementos automáticamente cuando se detectan cambios en los archivos. *Require Reiniciar el Servidor",
"LabelSettingsEnableWatcher": "Habilitar Watcher",
"LabelSettingsEnableWatcherForLibrary": "Habilitar Watcher para la carpeta de esta biblioteca",
- "LabelSettingsEnableWatcherHelp": "Permite agregar/actualizar elementos automáticamente cuando se detectan cambios en los archivos. *Requires server restart",
+ "LabelSettingsEnableWatcherHelp": "Permite agregar/actualizar elementos automáticamente cuando se detectan cambios en los archivos. *Requiere reiniciar el servidor",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Funciones Experimentales",
"LabelSettingsExperimentalFeaturesHelp": "Funciones en desarrollo que se beneficiarían de sus comentarios y experiencias de prueba. Haga click aquí para abrir una conversación en Github.",
"LabelSettingsFindCovers": "Buscar Portadas",
@@ -479,7 +482,7 @@
"LabelSettingsHomePageBookshelfView": "Usar la vista de librero en la página principal",
"LabelSettingsLibraryBookshelfView": "Usar la vista de librero en la biblioteca",
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Skip earlier books in Continue Series",
- "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "The Continue Series home page shelf shows the first book not started in series that have at least one book finished and no books in progress. Enabling this setting will continue series from the furthest completed book instead of the first book not started.",
+ "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "El estante de la página de inicio de Continuar Serie muestra el primer libro no iniciado de una serie que tenga por lo menos un libro finalizado y no tenga libros en progreso. Habilitar esta opción le permitirá continuar series desde el último libro que ha completado en vez del primer libro que no ha empezado.",
"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í\"",
"LabelSettingsPreferMatchedMetadata": "Preferir metadatos encontrados",
@@ -496,7 +499,7 @@
"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",
- "LabelShowSeconds": "Show seconds",
+ "LabelShowSeconds": "Mostrar segundos",
"LabelSize": "Tamaño",
"LabelSleepTimer": "Temporizador para Dormir",
"LabelSlug": "Slug",
@@ -576,8 +579,8 @@
"LabelViewQueue": "Ver Fila del Reproductor",
"LabelVolume": "Volumen",
"LabelWeekdaysToRun": "Correr en Días de la Semana",
- "LabelYearReviewHide": "Hide Year in Review",
- "LabelYearReviewShow": "See Year in Review",
+ "LabelYearReviewHide": "Ocultar Year in Review",
+ "LabelYearReviewShow": "Ver Year in Review",
"LabelYourAudiobookDuration": "Duración de tu Audiolibro",
"LabelYourBookmarks": "Tus Marcadores",
"LabelYourPlaylists": "Tus Listas",
@@ -608,14 +611,14 @@
"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?",
- "MessageConfirmPurgeCache": "Purge cache will delete the entire directory at /metadata/cache.
Are you sure you want to remove the cache directory?",
+ "MessageConfirmPurgeCache": "Purgar el caché eliminará el directorio completo ubicado en /metadata/cache.
¿Está seguro que desea eliminar el directorio del caché?",
"MessageConfirmQuickEmbed": "¡Advertencia! La integración rápida no realiza copias de seguridad a ninguno de tus archivos de audio. Asegúrate de haber realizado una copia de los mismos previamente.
¿Deseas continuar?",
"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?",
+ "MessageConfirmRemoveListeningSessions": "¿Está seguro que desea remover {0} sesiones de escuchar?",
"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?",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Arrastra los archivos al orden correcto de las pistas.",
"MessageEmbedFinished": "Incrustación Terminada!",
"MessageEpisodesQueuedForDownload": "{0} Episodio(s) en cola para descargar",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "URL de la fuente será {0}",
"MessageFetching": "Buscando...",
"MessageForceReScanDescription": "Escaneará todos los archivos como un nuevo escaneo. Archivos de audio con etiquetas ID3, archivos OPF y archivos de texto serán escaneados como nuevos.",
@@ -641,7 +645,7 @@
"MessageListeningSessionsInTheLastYear": "{0} sesiones de escucha en el último año",
"MessageLoading": "Cargando...",
"MessageLoadingFolders": "Cargando archivos...",
- "MessageLogsDescription": "Logs are stored in /metadata/logs as JSON files. Crash logs are stored in /metadata/logs/crash_logs.txt.",
+ "MessageLogsDescription": "Logs son almacenados en /metadata/logs en archivos bajo formato JSON. Logs de fallos son almacenados en /metadata/logs/crash_logs.txt.",
"MessageM4BFailed": "¡Fallo de M4B!",
"MessageM4BFinished": "¡M4B Terminado!",
"MessageMapChapterTitles": "Asignar los nombres de capítulos a los capítulos existentes en tu audiolibro sin ajustar sus tiempos",
@@ -689,7 +693,7 @@
"MessageQuickMatchDescription": "Rellenar detalles de elementos vacíos y portada con los primeros resultados de '{0}'. No sobrescribe los detalles a menos que la opción \"Preferir Metadatos Encontrados\" del servidor esté habilitada.",
"MessageRemoveChapter": "Remover capítulos",
"MessageRemoveEpisodes": "Remover {0} episodio(s)",
- "MessageRemoveFromPlayerQueue": "Romover la cola de reproducción",
+ "MessageRemoveFromPlayerQueue": "Remover la cola de reproducción",
"MessageRemoveUserWarning": "¿Está seguro de que desea eliminar el usuario \"{0}\"?",
"MessageReportBugsAndContribute": "Reporte erres, solicite funciones y contribuya en",
"MessageResetChaptersConfirm": "¿Está seguro de que desea deshacer los cambios y revertir los capítulos a su estado original?",
@@ -704,9 +708,9 @@
"MessageUploaderItemFailed": "Error al Subir",
"MessageUploaderItemSuccess": "¡Éxito al Subir!",
"MessageUploading": "Subiendo...",
- "MessageValidCronExpression": "Expresión de Cron bálida",
+ "MessageValidCronExpression": "Expresión de Cron válida",
"MessageWatcherIsDisabledGlobally": "El watcher está desactivado globalmente en la configuración del servidor",
- "MessageXLibraryIsEmpty": "La biblioteca {0} está vacía!",
+ "MessageXLibraryIsEmpty": "¡La biblioteca {0} está vacía!",
"MessageYourAudiobookDurationIsLonger": "La duración de su audiolibro es más larga que la duración encontrada",
"MessageYourAudiobookDurationIsShorter": "La duración de su audiolibro es más corta que la duración encontrada",
"NoteChangeRootPassword": "El usuario Root es el único usuario que puede no tener una contraseña",
@@ -745,8 +749,8 @@
"ToastBookmarkRemoveSuccess": "Marcador eliminado",
"ToastBookmarkUpdateFailed": "Error al actualizar el marcador",
"ToastBookmarkUpdateSuccess": "Marcador actualizado",
- "ToastCachePurgeFailed": "Failed to purge cache",
- "ToastCachePurgeSuccess": "Cache purged successfully",
+ "ToastCachePurgeFailed": "Error al purgar el caché",
+ "ToastCachePurgeSuccess": "Caché purgado de manera exitosa",
"ToastChaptersHaveErrors": "Los capítulos tienen errores",
"ToastChaptersMustHaveTitles": "Los capítulos tienen que tener un título",
"ToastCollectionItemsRemoveFailed": "Error al remover elemento(s) de la colección",
@@ -755,9 +759,9 @@
"ToastCollectionRemoveSuccess": "Colección removida",
"ToastCollectionUpdateFailed": "Error al actualizar la colección",
"ToastCollectionUpdateSuccess": "Colección actualizada",
- "ToastDeleteFileFailed": "Failed to delete file",
- "ToastDeleteFileSuccess": "File deleted",
- "ToastFailedToLoadData": "Failed to load data",
+ "ToastDeleteFileFailed": "Error el eliminar archivo",
+ "ToastDeleteFileSuccess": "Archivo eliminado",
+ "ToastFailedToLoadData": "Error al cargar data",
"ToastItemCoverUpdateFailed": "Error al actualizar la portada del elemento",
"ToastItemCoverUpdateSuccess": "Portada del elemento actualizada",
"ToastItemDetailsUpdateFailed": "Error al actualizar los detalles del elemento",
@@ -791,16 +795,16 @@
"ToastSendEbookToDeviceSuccess": "Ebook enviado al dispositivo \"{0}\"",
"ToastSeriesUpdateFailed": "Error al actualizar la serie",
"ToastSeriesUpdateSuccess": "Serie actualizada",
- "ToastServerSettingsUpdateFailed": "Failed to update server settings",
- "ToastServerSettingsUpdateSuccess": "Server settings updated",
+ "ToastServerSettingsUpdateFailed": "Error al actualizar configuración del servidor",
+ "ToastServerSettingsUpdateSuccess": "Configuración del servidor actualizada",
"ToastSessionDeleteFailed": "Error al eliminar sesión",
"ToastSessionDeleteSuccess": "Sesión eliminada",
"ToastSocketConnected": "Socket conectado",
"ToastSocketDisconnected": "Socket desconectado",
"ToastSocketFailedToConnect": "Error al conectar al Socket",
- "ToastSortingPrefixesEmptyError": "Must have at least 1 sorting prefix",
- "ToastSortingPrefixesUpdateFailed": "Failed to update sorting prefixes",
- "ToastSortingPrefixesUpdateSuccess": "Sorting prefixes updated ({0} items)",
+ "ToastSortingPrefixesEmptyError": "Debe tener por lo menos 1 prefijo para ordenar",
+ "ToastSortingPrefixesUpdateFailed": "Error al actualizar los prefijos de ordenar",
+ "ToastSortingPrefixesUpdateSuccess": "Prefijos de ordenar actualizaron ({0} items)",
"ToastUserDeleteFailed": "Error al eliminar el usuario",
"ToastUserDeleteSuccess": "Usuario eliminado"
}
\ No newline at end of file
diff --git a/client/strings/et.json b/client/strings/et.json
index 3d124094a..fcf7c4ce2 100644
--- a/client/strings/et.json
+++ b/client/strings/et.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Kärbitud",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Konto tüüp",
"LabelAccountTypeAdmin": "Administraator",
"LabelAccountTypeGuest": "Külaline",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Luba vaatamine",
"LabelSettingsEnableWatcherForLibrary": "Luba kaustavaatamine raamatukogu jaoks",
"LabelSettingsEnableWatcherHelp": "Lubab automaatset lisamist/uuendamist, kui tuvastatakse failimuudatused. *Nõuab serveri taaskäivitamist",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Eksperimentaalsed funktsioonid",
"LabelSettingsExperimentalFeaturesHelp": "Arengus olevad funktsioonid, mis vajavad teie tagasisidet ja abi testimisel. Klõpsake GitHubi arutelu avamiseks.",
"LabelSettingsFindCovers": "Leia ümbrised",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Lohistage failid õigesse järjekorda",
"MessageEmbedFinished": "Manustamine lõpetatud!",
"MessageEpisodesQueuedForDownload": "{0} Episood(i) on allalaadimiseks järjekorras",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Toite URL saab olema {0}",
"MessageFetching": "Hangitakse...",
"MessageForceReScanDescription": "skaneerib kõik failid uuesti nagu värsket skannimist. Heli faili ID3 silte, OPF faile ja tekstifaile skaneeritakse uuesti.",
diff --git a/client/strings/fr.json b/client/strings/fr.json
index ce910b52f..ae7f60f3b 100644
--- a/client/strings/fr.json
+++ b/client/strings/fr.json
@@ -61,8 +61,8 @@
"ButtonQueueRemoveItem": "Supprimer de la liste de lecture",
"ButtonQuickMatch": "Recherche rapide",
"ButtonRead": "Lire",
- "ButtonReadLess": "Read less",
- "ButtonReadMore": "Read more",
+ "ButtonReadLess": "Lire moins",
+ "ButtonReadMore": "Lire la suite",
"ButtonRefresh": "Rafraîchir",
"ButtonRemove": "Supprimer",
"ButtonRemoveAll": "Supprimer tout",
@@ -186,11 +186,12 @@
"HeaderUpdateDetails": "Mettre à jour les détails",
"HeaderUpdateLibrary": "Mettre à jour la bibliothèque",
"HeaderUsers": "Utilisateurs",
- "HeaderYearReview": "Year {0} in Review",
+ "HeaderYearReview": "Bilan de l’année {0}",
"HeaderYourStats": "Vos statistiques",
"LabelAbridged": "Version courte",
- "LabelAbridgedChecked": "Abridged (checked)",
- "LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAbridgedChecked": "Abrégé (vérifié)",
+ "LabelAbridgedUnchecked": "Intégral (non vérifié)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Type de compte",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Invité",
@@ -217,7 +218,7 @@
"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)",
+ "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",
@@ -231,7 +232,7 @@
"LabelBitrate": "Bitrate",
"LabelBooks": "Livres",
"LabelButtonText": "Texte du bouton",
- "LabelByAuthor": "by {0}",
+ "LabelByAuthor": "par {0}",
"LabelChangePassword": "Modifier le mot de passe",
"LabelChannels": "Canaux",
"LabelChapters": "Chapitres",
@@ -269,9 +270,9 @@
"LabelDownload": "Téléchargement",
"LabelDownloadNEpisodes": "Télécharger {0} épisode(s)",
"LabelDuration": "Durée",
- "LabelDurationComparisonExactMatch": "(exact match)",
- "LabelDurationComparisonLonger": "({0} longer)",
- "LabelDurationComparisonShorter": "({0} shorter)",
+ "LabelDurationComparisonExactMatch": "(correspondance exacte)",
+ "LabelDurationComparisonLonger": "({0} plus long)",
+ "LabelDurationComparisonShorter": "({0} plus court)",
"LabelDurationFound": "Durée trouvée :",
"LabelEbook": "Livre numérique",
"LabelEbooks": "Livres numériques",
@@ -289,8 +290,8 @@
"LabelEpisodeType": "Type de l’épisode",
"LabelExample": "Exemple",
"LabelExplicit": "Restriction",
- "LabelExplicitChecked": "Explicit (checked)",
- "LabelExplicitUnchecked": "Not Explicit (unchecked)",
+ "LabelExplicitChecked": "Explicite (vérifié)",
+ "LabelExplicitUnchecked": "Non explicite (non vérifié)",
"LabelFeedURL": "URL du flux",
"LabelFetchingMetadata": "Récupération des métadonnées",
"LabelFile": "Fichier",
@@ -365,10 +366,10 @@
"LabelMetaTags": "Balises de métadonnée",
"LabelMinute": "Minute",
"LabelMissing": "Manquant",
- "LabelMissingEbook": "Has no ebook",
- "LabelMissingSupplementaryEbook": "Has no supplementary ebook",
+ "LabelMissingEbook": "Ne possède pas de livre numérique",
+ "LabelMissingSupplementaryEbook": "Ne possède pas de livre numérique supplémentaire",
"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.",
+ "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’informations",
"LabelName": "Nom",
@@ -395,9 +396,9 @@
"LabelNotStarted": "Pas commencé",
"LabelNumberOfBooks": "Nombre de livres",
"LabelNumberOfEpisodes": "Nombre d’épisodes",
- "LabelOpenIDAdvancedPermsClaimDescription": "Name of the OpenID claim that contains advanced permissions for user actions within the application which will apply to non-admin roles (if configured). If the claim is missing from the response, access to ABS will be denied. If a single option is missing, it will be treated as false. Ensure the identity provider's claim matches the expected structure:",
- "LabelOpenIDClaims": "Leave the following options empty to disable advanced group and permissions assignment, automatically assigning 'User' group then.",
- "LabelOpenIDGroupClaimDescription": "Name of the OpenID claim that contains a list of the user's groups. Commonly referred to as groups. If configured, the application will automatically assign roles based on the user's group memberships, provided that these groups are named case-insensitively 'admin', 'user', or 'guest' in the claim. The claim should contain a list, and if a user belongs to multiple groups, the application will assign the role corresponding to the highest level of access. If no group matches, access will be denied.",
+ "LabelOpenIDAdvancedPermsClaimDescription": "Nom de la demande OpenID qui contient des autorisations avancées pour les actions de l’utilisateur dans l’application, qui s’appliqueront à des rôles autres que celui d’administrateur (s’il est configuré). Si la demande est absente de la réponse, l’accès à ABS sera refusé. Si une seule option est manquante, elle sera considérée comme false. Assurez-vous que la demande du fournisseur d’identité correspond à la structure attendue :",
+ "LabelOpenIDClaims": "Laissez les options suivantes vides pour désactiver l’attribution avancée de groupes et d’autorisations, en attribuant alors automatiquement le groupe « Utilisateur ».",
+ "LabelOpenIDGroupClaimDescription": "Nom de la demande OpenID qui contient une liste des groupes de l’utilisateur. Communément appelé groups. Si elle est configurée, l’application attribuera automatiquement des rôles en fonction de l’appartenance de l’utilisateur à un groupe, à condition que ces groupes soient nommés -sensible à la casse- tel que « admin », « user » ou « guest » dans la demande. Elle doit contenir une liste, et si un utilisateur appartient à plusieurs groupes, l’application attribuera le rôle correspondant au niveau d’accès le plus élevé. Si aucun groupe ne correspond, l’accès sera refusé.",
"LabelOpenRSSFeed": "Ouvrir le flux RSS",
"LabelOverwrite": "Écraser",
"LabelPassword": "Mot de passe",
@@ -447,7 +448,7 @@
"LabelSearchTitle": "Titre de recherche",
"LabelSearchTitleOrASIN": "Recherche du titre ou ASIN",
"LabelSeason": "Saison",
- "LabelSelectAll": "Select all",
+ "LabelSelectAll": "Tout sélectionner",
"LabelSelectAllEpisodes": "Sélectionner tous les épisodes",
"LabelSelectEpisodesShowing": "Sélectionner {0} episode(s) en cours",
"LabelSelectUsers": "Sélectionner les utilisateurs",
@@ -460,7 +461,7 @@
"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 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.",
+ "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",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"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.",
"LabelSettingsFindCovers": "Chercher des couvertures de livre",
@@ -478,10 +481,10 @@
"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",
- "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Skip earlier books in Continue Series",
- "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "The Continue Series home page shelf shows the first book not started in series that have at least one book finished and no books in progress. Enabling this setting will continue series from the furthest completed book instead of the first book not started.",
+ "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Sauter les livres précédents dans « Continuer la série »",
+ "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "L’étagère de la page d’accueil « Continuer la série » affiche le premier livre non commencé dans les séries dont au moins un livre est terminé et aucun livre n’est en cours. L’activation de ce paramètre permet de poursuivre la série à partir du dernier livre terminé au lieu du premier livre non commencé.",
"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 « - » c’est-à-dire : « Titre du livre - Ceci est un sous-titre » aura le sous-titre « Ceci est un sous-titre »",
+ "LabelSettingsParseSubtitlesHelp": "Extrait les sous-titres depuis le dossier du livre audio. Les sous-titres doivent être séparés par des « - » 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.",
"LabelSettingsSkipMatchingBooksWithASIN": "Ignorer la recherche par correspondance sur les livres ayant déjà un ASIN",
@@ -496,7 +499,7 @@
"LabelSettingsStoreMetadataWithItemHelp": "Par défaut, les métadonnées sont enregistrées dans /metadata/items",
"LabelSettingsTimeFormat": "Format d’heure",
"LabelShowAll": "Tout afficher",
- "LabelShowSeconds": "Show seconds",
+ "LabelShowSeconds": "Afficher le seondes",
"LabelSize": "Taille",
"LabelSleepTimer": "Minuterie",
"LabelSlug": "Balise",
@@ -517,7 +520,7 @@
"LabelStatsMinutes": "minutes",
"LabelStatsMinutesListening": "Minutes d’écoute",
"LabelStatsOverallDays": "Nombre total de jours",
- "LabelStatsOverallHours": "Nombre total d'heures",
+ "LabelStatsOverallHours": "Nombre total d’heures",
"LabelStatsWeekListening": "Écoute de la semaine",
"LabelSubtitle": "Sous-titre",
"LabelSupportedFileTypes": "Types de fichiers supportés",
@@ -604,12 +607,12 @@
"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 ?",
+ "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 ?",
- "MessageConfirmPurgeCache": "Purge cache will delete the entire directory at /metadata/cache.
Are you sure you want to remove the cache directory?",
- "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 ?",
+ "MessageConfirmPurgeCache": "La purge du cache supprimera l’intégralité du répertoire à /metadata/cache.
Êtes-vous sûr de vouloir supprimer le répertoire de cache ?",
+ "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} » ?",
@@ -630,6 +633,7 @@
"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",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "L’URL du flux sera {0}",
"MessageFetching": "Récupération…",
"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.",
@@ -641,7 +645,7 @@
"MessageListeningSessionsInTheLastYear": "{0} sessions d’écoute l’an dernier",
"MessageLoading": "Chargement…",
"MessageLoadingFolders": "Chargement des dossiers…",
- "MessageLogsDescription": "Logs are stored in /metadata/logs as JSON files. Crash logs are stored in /metadata/logs/crash_logs.txt.",
+ "MessageLogsDescription": "Les journaux sont stockés dans /metadata/logs sous forme de fichiers JSON. Les journaux d’incidents sont stockés dans /metadata/logs/crash_logs.txt.",
"MessageM4BFailed": "M4B échec",
"MessageM4BFinished": "M4B terminé",
"MessageMapChapterTitles": "Faire correspondre les titres des chapitres aux chapitres existants de votre livre audio sans ajuster l’horodatage.",
@@ -745,8 +749,8 @@
"ToastBookmarkRemoveSuccess": "Signet supprimé",
"ToastBookmarkUpdateFailed": "Échec de la mise à jour de signet",
"ToastBookmarkUpdateSuccess": "Signet mis à jour",
- "ToastCachePurgeFailed": "Failed to purge cache",
- "ToastCachePurgeSuccess": "Cache purged successfully",
+ "ToastCachePurgeFailed": "Échec de la purge du cache",
+ "ToastCachePurgeSuccess": "Cache purgé avec succès",
"ToastChaptersHaveErrors": "Les chapitres contiennent des erreurs",
"ToastChaptersMustHaveTitles": "Les chapitre doivent avoir un titre",
"ToastCollectionItemsRemoveFailed": "Échec de la suppression de(s) article(s) de la collection",
@@ -755,9 +759,9 @@
"ToastCollectionRemoveSuccess": "Collection supprimée",
"ToastCollectionUpdateFailed": "Échec de la mise à jour de la collection",
"ToastCollectionUpdateSuccess": "Collection mise à jour",
- "ToastDeleteFileFailed": "Failed to delete file",
- "ToastDeleteFileSuccess": "File deleted",
- "ToastFailedToLoadData": "Failed to load data",
+ "ToastDeleteFileFailed": "Échec de la suppression du fichier",
+ "ToastDeleteFileSuccess": "Fichier supprimé",
+ "ToastFailedToLoadData": "Échec du chargement des données",
"ToastItemCoverUpdateFailed": "Échec de la mise à jour de la couverture de l’article",
"ToastItemCoverUpdateSuccess": "Couverture de l’article mise à jour",
"ToastItemDetailsUpdateFailed": "Échec de la mise à jour des détails de l’article",
@@ -791,16 +795,16 @@
"ToastSendEbookToDeviceSuccess": "Livre numérique envoyé à l’appareil : {0}",
"ToastSeriesUpdateFailed": "Échec de la mise à jour de la série",
"ToastSeriesUpdateSuccess": "Mise à jour de la série réussie",
- "ToastServerSettingsUpdateFailed": "Failed to update server settings",
- "ToastServerSettingsUpdateSuccess": "Server settings updated",
+ "ToastServerSettingsUpdateFailed": "Échec de la mise à jour des paramètres du serveur",
+ "ToastServerSettingsUpdateSuccess": "Mise à jour des paramètres du serveur",
"ToastSessionDeleteFailed": "Échec de la suppression de session",
"ToastSessionDeleteSuccess": "Session supprimée",
"ToastSocketConnected": "WebSocket connecté",
"ToastSocketDisconnected": "WebSocket déconnecté",
"ToastSocketFailedToConnect": "Échec de la connexion WebSocket",
- "ToastSortingPrefixesEmptyError": "Must have at least 1 sorting prefix",
- "ToastSortingPrefixesUpdateFailed": "Failed to update sorting prefixes",
- "ToastSortingPrefixesUpdateSuccess": "Sorting prefixes updated ({0} items)",
+ "ToastSortingPrefixesEmptyError": "Doit avoir au moins 1 préfixe de tri",
+ "ToastSortingPrefixesUpdateFailed": "Échec de la mise à jour des préfixes de tri",
+ "ToastSortingPrefixesUpdateSuccess": "Mise à jour des préfixes de tri ({0} élément)",
"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 9caec47f6..11c475043 100644
--- a/client/strings/gu.json
+++ b/client/strings/gu.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Abridged",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Account Type",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Guest",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Experimental features",
"LabelSettingsExperimentalFeaturesHelp": "Features in development that could use your feedback and help testing. Click to open github discussion.",
"LabelSettingsFindCovers": "Find covers",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Drag files into correct track order",
"MessageEmbedFinished": "Embed Finished!",
"MessageEpisodesQueuedForDownload": "{0} Episode(s) queued for download",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL will be {0}",
"MessageFetching": "Fetching...",
"MessageForceReScanDescription": "will scan all files again like a fresh scan. Audio file ID3 tags, OPF files, and text files will be scanned as new.",
diff --git a/client/strings/he.json b/client/strings/he.json
index 51939b967..7d17a2a88 100644
--- a/client/strings/he.json
+++ b/client/strings/he.json
@@ -191,6 +191,7 @@
"LabelAbridged": "מקוצר",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "סוג חשבון",
"LabelAccountTypeAdmin": "מנהל",
"LabelAccountTypeGuest": "אורח",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "הפעל עוקב",
"LabelSettingsEnableWatcherForLibrary": "הפעל עוקב תיקייה עבור ספרייה",
"LabelSettingsEnableWatcherHelp": "מאפשר הוספת/עדכון אוטומטי של פריטים כאשר שינויי קבצים זוהים. *דורש איתחול שרת",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "תכונות ניסיוניות",
"LabelSettingsExperimentalFeaturesHelp": "תכונות בפיתוח שדורשות משובך ובדיקה. לחץ לפתיחת דיון ב-GitHub.",
"LabelSettingsFindCovers": "מצא כריכות",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "גרור קבצים לסדר ההשמעה נכון",
"MessageEmbedFinished": "ההטמעה הושלמה!",
"MessageEpisodesQueuedForDownload": "{0} פרקים בתור להורדה",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "כתובת URL של העדכון תהיה {0}",
"MessageFetching": "מושך...",
"MessageForceReScanDescription": "תבוצע סריקה מחדש כמו סריקה חדש מאפס, תגי ID3 של קבצי קול, קבצי OPF, וקבצי טקסט ייסרקו כחדשים.",
diff --git a/client/strings/hi.json b/client/strings/hi.json
index bd118e0f9..83b7f011a 100644
--- a/client/strings/hi.json
+++ b/client/strings/hi.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Abridged",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Account Type",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Guest",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Experimental features",
"LabelSettingsExperimentalFeaturesHelp": "Features in development that could use your feedback and help testing. Click to open github discussion.",
"LabelSettingsFindCovers": "Find covers",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Drag files into correct track order",
"MessageEmbedFinished": "Embed Finished!",
"MessageEpisodesQueuedForDownload": "{0} Episode(s) queued for download",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL will be {0}",
"MessageFetching": "Fetching...",
"MessageForceReScanDescription": "will scan all files again like a fresh scan. Audio file ID3 tags, OPF files, and text files will be scanned as new.",
diff --git a/client/strings/hr.json b/client/strings/hr.json
index 99016e162..a3a88e9ce 100644
--- a/client/strings/hr.json
+++ b/client/strings/hr.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Abridged",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Vrsta korisničkog računa",
"LabelAccountTypeAdmin": "Administrator",
"LabelAccountTypeGuest": "Gost",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Eksperimentalni features",
"LabelSettingsExperimentalFeaturesHelp": "Features u razvoju trebaju vaš feedback i pomoć pri testiranju. Klikni da odeš to Github discussionsa.",
"LabelSettingsFindCovers": "Pronađi covers",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Povuci datoteke u pravilan redoslijed tracka.",
"MessageEmbedFinished": "Embed završen!",
"MessageEpisodesQueuedForDownload": "{0} Epizoda/-e u redu za preuzimanje",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL će biti {0}",
"MessageFetching": "Dobavljam...",
"MessageForceReScanDescription": "će skenirati sve datoteke ponovno kao svježi sken. ID3 tagovi od audio datoteka, OPF datoteke i tekst datoteke će biti skenirane kao da su nove.",
diff --git a/client/strings/hu.json b/client/strings/hu.json
index 12774f82e..971c45fc8 100644
--- a/client/strings/hu.json
+++ b/client/strings/hu.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Tömörített",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Fióktípus",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Vendég",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Figyelő engedélyezése",
"LabelSettingsEnableWatcherForLibrary": "Mappafigyelő engedélyezése a könyvtárban",
"LabelSettingsEnableWatcherHelp": "Engedélyezi az automatikus elem hozzáadás/frissítés funkciót, amikor fájlváltozásokat észlel. *Szerver újraindítása szükséges",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Kísérleti funkciók",
"LabelSettingsExperimentalFeaturesHelp": "Fejlesztés alatt álló funkciók, amelyek visszajelzésre és tesztelésre szorulnak. Kattintson a github megbeszélés megnyitásához.",
"LabelSettingsFindCovers": "Borítók keresése",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Húzza a fájlokat a helyes sávrendbe",
"MessageEmbedFinished": "Beágyazás befejeződött!",
"MessageEpisodesQueuedForDownload": "{0} Epizód letöltésre várakozik",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "A hírcsatorna URL-je {0} lesz",
"MessageFetching": "Lekérés...",
"MessageForceReScanDescription": "minden fájlt újra szkennel, mint egy friss szkennelés. Az audiofájlok ID3 címkéi, OPF fájlok és szövegfájlok újként lesznek szkennelve.",
diff --git a/client/strings/it.json b/client/strings/it.json
index f4740cea1..549ea94d4 100644
--- a/client/strings/it.json
+++ b/client/strings/it.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Abbreviato",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Tipo di Account",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Ospite",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"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",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Trascina i file nell'ordine di traccia corretto",
"MessageEmbedFinished": "Incorporamento finito!",
"MessageEpisodesQueuedForDownload": "{0} Episodio(i) in coda per il Download",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL Saranno {0}",
"MessageFetching": "Recupero Info...",
"MessageForceReScanDescription": "eseguirà nuovamente la scansione di tutti i file come una nuova scansione. I tag ID3 dei file audio, i file OPF e i file di testo verranno scansionati come nuovi.",
diff --git a/client/strings/lt.json b/client/strings/lt.json
index 1684c2c07..5bd42bdf2 100644
--- a/client/strings/lt.json
+++ b/client/strings/lt.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Santrauka",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Paskyros tipas",
"LabelAccountTypeAdmin": "Administratorius",
"LabelAccountTypeGuest": "Svečias",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Eksperimentiniai funkcionalumai",
"LabelSettingsExperimentalFeaturesHelp": "Funkcijos, kurios yra kuriamos ir laukiami jūsų komentarai. Spustelėkite, kad atidarytumėte „GitHub“ diskusiją.",
"LabelSettingsFindCovers": "Rasti viršelius",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Surikiuokite takelius vilkdami failus",
"MessageEmbedFinished": "Įterpimas baigtas!",
"MessageEpisodesQueuedForDownload": "{0} epizodai laukia atsisiuntimo",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Srauto URL bus {0}",
"MessageFetching": "Surenkama...",
"MessageForceReScanDescription": "skenuos visus failus lyg iš naujo. Garsinių failų ID3 žymos, OPF failai ir tekstiniai failai bus nuskenuoti kaip nauji.",
diff --git a/client/strings/nl.json b/client/strings/nl.json
index 271f34bf0..28c3ada1c 100644
--- a/client/strings/nl.json
+++ b/client/strings/nl.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Verkort",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Accounttype",
"LabelAccountTypeAdmin": "Beheerder",
"LabelAccountTypeGuest": "Gast",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Watcher inschakelen",
"LabelSettingsEnableWatcherForLibrary": "Map-watcher voor bibliotheek inschakelen",
"LabelSettingsEnableWatcherHelp": "Zorgt voor het automatisch toevoegen/bijwerken van onderdelen als bestandswijzigingen worden gedetecteerd. *Vereist herstarten van server",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Experimentele functies",
"LabelSettingsExperimentalFeaturesHelp": "Functies in ontwikkeling die je feedback en testing kunnen gebruiken. Klik om de Github-discussie te openen.",
"LabelSettingsFindCovers": "Zoek covers",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Sleep bestanden in de juiste trackvolgorde",
"MessageEmbedFinished": "Insluiting voltooid!",
"MessageEpisodesQueuedForDownload": "{0} aflevering(en) in de rij om te downloaden",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL zal {0} zijn",
"MessageFetching": "Aan het ophalen...",
"MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.",
diff --git a/client/strings/no.json b/client/strings/no.json
index b7a7e7978..4c4be82fa 100644
--- a/client/strings/no.json
+++ b/client/strings/no.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Forkortet",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Kontotype",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Gjest",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Aktiver overvåker",
"LabelSettingsEnableWatcherForLibrary": "Aktiver mappe overvåker for bibliotek",
"LabelSettingsEnableWatcherHelp": "Aktiverer automatisk opprettelse/oppdatering av enheter når filendringer er oppdaget. *Krever restart av server*",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Eksperimentelle funksjoner",
"LabelSettingsExperimentalFeaturesHelp": "Funksjoner under utvikling som kan trenge din tilbakemelding og hjelp med testing. Klikk for å åpne GitHub diskusjon.",
"LabelSettingsFindCovers": "Finn omslag",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Dra filene i rett spor rekkefølge",
"MessageEmbedFinished": "Bak inn Fullført!",
"MessageEpisodesQueuedForDownload": "{0} Episode(r) lagt til i kø for nedlasting",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "Feed URL vil bli {0}",
"MessageFetching": "Henter...",
"MessageForceReScanDescription": "vil skanne alle filene igjen som en ny skann. Lyd fil ID3 tagger, OPF filer og tekstfiler vil bli skannet som nye.",
diff --git a/client/strings/pl.json b/client/strings/pl.json
index dea5a5679..ce0109d9e 100644
--- a/client/strings/pl.json
+++ b/client/strings/pl.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Abridged",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Typ konta",
"LabelAccountTypeAdmin": "Administrator",
"LabelAccountTypeGuest": "Gość",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Funkcje eksperymentalne",
"LabelSettingsExperimentalFeaturesHelp": "Funkcje w trakcie rozwoju, które mogą zyskanć na Twojej opinii i pomocy w testowaniu. Kliknij, aby otworzyć dyskusję na githubie.",
"LabelSettingsFindCovers": "Szukanie okładek",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "przeciągnij pliki aby ustawić właściwą kolejność utworów",
"MessageEmbedFinished": "Osadzanie zakończone!",
"MessageEpisodesQueuedForDownload": "{0} odcinki w kolejce do pobrania",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "URL kanału: {0}",
"MessageFetching": "Pobieranie...",
"MessageForceReScanDescription": "przeskanuje wszystkie pliki ponownie, jak przy świeżym skanowaniu. Tagi ID3 plików audio, pliki OPF i pliki tekstowe będą skanowane jak nowe.",
diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json
index a7db6d96b..f88f6a5e7 100644
--- a/client/strings/pt-br.json
+++ b/client/strings/pt-br.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Versão Abreviada",
"LabelAbridgedChecked": "Abreviada (verificada)",
"LabelAbridgedUnchecked": "Não Abreviada (não verificada)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Tipo de Conta",
"LabelAccountTypeAdmin": "Administrador",
"LabelAccountTypeGuest": "Convidado",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Ativar Monitoramento",
"LabelSettingsEnableWatcherForLibrary": "Ativa o monitoramento de pastas para a biblioteca",
"LabelSettingsEnableWatcherHelp": "Ativa o acréscimo/atualização de itens quando forem detectadas mudanças no arquivo. *Requer reiniciar o servidor",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Funcionalidade experimentais",
"LabelSettingsExperimentalFeaturesHelp": "Funcionalidade em desenvolvimento que se beneficiairam dos seus comentários e da sua ajuda para testar. Clique para abrir a discussão no github.",
"LabelSettingsFindCovers": "Localizar capas",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Arraste os arquivos para ordenar as trilhas corretamente",
"MessageEmbedFinished": "Inclusão Concluída!",
"MessageEpisodesQueuedForDownload": "{0} Episódio(s) na fila de download",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "URL do Feed será {0}",
"MessageFetching": "Buscando...",
"MessageForceReScanDescription": "verificará todos os arquivos, como uma verificação nova. Etiquetas ID3 de arquivos de áudio, arquivos OPF e arquivos de texto serão tratados como novos.",
@@ -803,4 +807,4 @@
"ToastSortingPrefixesUpdateSuccess": "Prefixos de ordenação atualizados ({0} item(ns))",
"ToastUserDeleteFailed": "Falha ao apagar usuário",
"ToastUserDeleteSuccess": "Usuário apagado"
-}
+}
\ No newline at end of file
diff --git a/client/strings/ru.json b/client/strings/ru.json
index a5ace5c28..7b6e9c7c1 100644
--- a/client/strings/ru.json
+++ b/client/strings/ru.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Сокращенное издание",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Тип учетной записи",
"LabelAccountTypeAdmin": "Администратор",
"LabelAccountTypeGuest": "Гость",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Включить отслеживание",
"LabelSettingsEnableWatcherForLibrary": "Включить отслеживание за папками библиотеки",
"LabelSettingsEnableWatcherHelp": "Включает автоматическое добавление/обновление элементов при обнаружении изменений файлов. *Требуется перезапуск сервера",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Экспериментальные функции",
"LabelSettingsExperimentalFeaturesHelp": "Функционал в разработке на который Вы могли бы дать отзыв или помочь в тестировании. Нажмите для открытия обсуждения на github.",
"LabelSettingsFindCovers": "Найти обложки",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Перетащите файлы для исправления порядка треков",
"MessageEmbedFinished": "Встраивание завершено!",
"MessageEpisodesQueuedForDownload": "{0} Эпизод(ов) запланировано для закачки",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "URL канала будет {0}",
"MessageFetching": "Завершается...",
"MessageForceReScanDescription": "будет сканировать все файлы снова, как свежее сканирование. Теги ID3 аудиофайлов, OPF-файлы и текстовые файлы будут сканироваться как новые.",
diff --git a/client/strings/sv.json b/client/strings/sv.json
index 1dcac6ee4..fd8c6e692 100644
--- a/client/strings/sv.json
+++ b/client/strings/sv.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Förkortad",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Kontotyp",
"LabelAccountTypeAdmin": "Admin",
"LabelAccountTypeGuest": "Gäst",
@@ -470,6 +471,8 @@
"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",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"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",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Dra filer till rätt spårordning",
"MessageEmbedFinished": "Inbäddning klar!",
"MessageEpisodesQueuedForDownload": "{0} avsnitt i kö för nedladdning",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"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.",
diff --git a/client/strings/uk.json b/client/strings/uk.json
index e59d118a9..6d8c311ca 100644
--- a/client/strings/uk.json
+++ b/client/strings/uk.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Скорочена",
"LabelAbridgedChecked": "Скорочена (з прапорцем)",
"LabelAbridgedUnchecked": "Нескорочена (без прапорця)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Тип профілю",
"LabelAccountTypeAdmin": "Адміністратор",
"LabelAccountTypeGuest": "Гість",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Увімкнути спостерігача",
"LabelSettingsEnableWatcherForLibrary": "Увімкнути спостерігання тек бібліотеки",
"LabelSettingsEnableWatcherHelp": "Вмикає автоматичне додавання/оновлення елементів, коли спостерігаються зміни файлів. *Потребує перезавантаження сервера",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Експериментальні функції",
"LabelSettingsExperimentalFeaturesHelp": "Функції в розробці, які потребують вашого відгуку та допомоги в тестуванні. Натисніть, щоб відкрити обговорення на Github.",
"LabelSettingsFindCovers": "Пошук обкладинок",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Перетягніть файли до правильного порядку",
"MessageEmbedFinished": "Вбудовано!",
"MessageEpisodesQueuedForDownload": "Епізодів у черзі завантаження: {0}",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "URL-адреса каналу буде {0}",
"MessageFetching": "Отримання...",
"MessageForceReScanDescription": "Просканує усі файли заново, неначе вперше. ID3-мітки, файли OPF та текстові файли будуть проскановані як нові.",
@@ -803,4 +807,4 @@
"ToastSortingPrefixesUpdateSuccess": "Префікси сортування оновлено ({0})",
"ToastUserDeleteFailed": "Не вдалося видалити користувача",
"ToastUserDeleteSuccess": "Користувача видалено"
-}
+}
\ No newline at end of file
diff --git a/client/strings/vi-vn.json b/client/strings/vi-vn.json
index fd8639191..7c6d09b05 100644
--- a/client/strings/vi-vn.json
+++ b/client/strings/vi-vn.json
@@ -191,6 +191,7 @@
"LabelAbridged": "Rút Gọn",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "Loại Tài Khoản",
"LabelAccountTypeAdmin": "Quản Trị Viên",
"LabelAccountTypeGuest": "Khách",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "Bật Watcher",
"LabelSettingsEnableWatcherForLibrary": "Bật watcher thư mục cho thư viện",
"LabelSettingsEnableWatcherHelp": "Bật chức năng tự động thêm/cập nhật các mục khi phát hiện thay đổi tập tin. *Yêu cầu khởi động lại máy chủ",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "Tính năng thử nghiệm",
"LabelSettingsExperimentalFeaturesHelp": "Các tính năng đang phát triển có thể cần phản hồi của bạn và sự giúp đỡ trong thử nghiệm. Nhấp để mở thảo luận trên github.",
"LabelSettingsFindCovers": "Tìm ảnh bìa",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "Kéo tệp vào thứ tự track đúng",
"MessageEmbedFinished": "Nhúng Hoàn thành!",
"MessageEpisodesQueuedForDownload": "{0} Tập(s) đã được thêm vào hàng đợi để tải xuống",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "URL nguồn cấp sẽ là {0}",
"MessageFetching": "Đang tìm...",
"MessageForceReScanDescription": "sẽ quét lại tất cả các tệp như một quét mới. Các thẻ ID3 của tệp âm thanh, tệp OPF và tệp văn bản sẽ được quét làm mới.",
diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json
index ffa491361..fb375aec1 100644
--- a/client/strings/zh-cn.json
+++ b/client/strings/zh-cn.json
@@ -191,6 +191,7 @@
"LabelAbridged": "概要",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "帐户类型",
"LabelAccountTypeAdmin": "管理员",
"LabelAccountTypeGuest": "来宾",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "启用监视程序",
"LabelSettingsEnableWatcherForLibrary": "为库启用文件夹监视程序",
"LabelSettingsEnableWatcherHelp": "当检测到文件更改时, 启用项目的自动添加/更新. *需要重新启动服务器",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "实验功能",
"LabelSettingsExperimentalFeaturesHelp": "开发中的功能需要你的反馈并帮助测试. 点击打开 github 讨论.",
"LabelSettingsFindCovers": "查找封面",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "将文件拖动到正确的音轨顺序",
"MessageEmbedFinished": "嵌入完成!",
"MessageEpisodesQueuedForDownload": "{0} 个剧集排队等待下载",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "源 URL 将改为 {0}",
"MessageFetching": "正在获取...",
"MessageForceReScanDescription": "将像重新扫描一样再次扫描所有文件. 音频文件 ID3 标签, OPF 文件和文本文件将被扫描为新文件.",
diff --git a/client/strings/zh-tw.json b/client/strings/zh-tw.json
index 54fb89f04..54e7849b4 100644
--- a/client/strings/zh-tw.json
+++ b/client/strings/zh-tw.json
@@ -191,6 +191,7 @@
"LabelAbridged": "概要",
"LabelAbridgedChecked": "Abridged (checked)",
"LabelAbridgedUnchecked": "Unabridged (unchecked)",
+ "LabelAccessibleBy": "Accessible by",
"LabelAccountType": "帳號類型",
"LabelAccountTypeAdmin": "管理員",
"LabelAccountTypeGuest": "來賓",
@@ -470,6 +471,8 @@
"LabelSettingsEnableWatcher": "啟用監視程序",
"LabelSettingsEnableWatcherForLibrary": "為庫啟用資料夾監視程序",
"LabelSettingsEnableWatcherHelp": "當檢測到檔案更改時, 啟用項目的自動新增/更新. *需要重新啟動伺服器",
+ "LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
+ "LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
"LabelSettingsExperimentalFeatures": "實驗功能",
"LabelSettingsExperimentalFeaturesHelp": "開發中的功能需要你的反饋並幫助測試. 點擊打開 github 討論.",
"LabelSettingsFindCovers": "查找封面",
@@ -630,6 +633,7 @@
"MessageDragFilesIntoTrackOrder": "將檔案拖動到正確的音軌順序",
"MessageEmbedFinished": "嵌入完成!",
"MessageEpisodesQueuedForDownload": "{0} 個劇集排隊等待下載",
+ "MessageEreaderDevices": "To ensure delivery of ebooks, you may need to add the above email address as a valid sender for each device listed below.",
"MessageFeedURLWillBe": "源 URL 將改為 {0}",
"MessageFetching": "正在獲取...",
"MessageForceReScanDescription": "將像重新掃描一樣再次掃描所有檔案. 音頻檔 ID3 標籤, OPF 檔和文本檔將被掃描為新檔案.",
diff --git a/index.js b/index.js
index c4488f1b0..a8686b310 100644
--- a/index.js
+++ b/index.js
@@ -4,7 +4,6 @@ global.appRoot = __dirname
const isDev = process.env.NODE_ENV !== 'production'
if (isDev) {
const devEnv = require('./dev').config
- process.env.NODE_ENV = 'development'
if (devEnv.Port) process.env.PORT = devEnv.Port
if (devEnv.ConfigPath) process.env.CONFIG_PATH = devEnv.ConfigPath
if (devEnv.MetadataPath) process.env.METADATA_PATH = devEnv.MetadataPath
diff --git a/package-lock.json b/package-lock.json
index c03f617c3..41bbdf54b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "audiobookshelf",
- "version": "2.9.0",
+ "version": "2.10.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "audiobookshelf",
- "version": "2.9.0",
+ "version": "2.10.1",
"license": "GPL-3.0",
"dependencies": {
"axios": "^0.27.2",
@@ -5554,4 +5554,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/package.json b/package.json
index 09bb4e6ed..e31a28fc1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf",
- "version": "2.9.0",
+ "version": "2.10.1",
"buildNumber": 1,
"description": "Self-hosted audiobook and podcast server",
"main": "index.js",
@@ -60,4 +60,4 @@
"nyc": "^15.1.0",
"sinon": "^17.0.1"
}
-}
\ No newline at end of file
+}
diff --git a/server/Logger.js b/server/Logger.js
index 8283e1f0a..6b5894005 100644
--- a/server/Logger.js
+++ b/server/Logger.js
@@ -7,6 +7,7 @@ class Logger {
this.logManager = null
this.isDev = process.env.NODE_ENV !== 'production'
+
this.logLevel = !this.isDev ? LogLevel.INFO : LogLevel.TRACE
this.socketListeners = []
}
@@ -49,7 +50,7 @@ class Logger {
}
addSocketListener(socket, level) {
- var index = this.socketListeners.findIndex(s => s.id === socket.id)
+ var index = this.socketListeners.findIndex((s) => s.id === socket.id)
if (index >= 0) {
this.socketListeners.splice(index, 1, {
id: socket.id,
@@ -66,7 +67,7 @@ class Logger {
}
removeSocketListener(socketId) {
- this.socketListeners = this.socketListeners.filter(s => s.id !== socketId)
+ this.socketListeners = this.socketListeners.filter((s) => s.id !== socketId)
}
/**
@@ -135,8 +136,8 @@ class Logger {
/**
* Fatal errors are ones that exit the process
* Fatal logs are saved to crash_logs.txt
- *
- * @param {...any} args
+ *
+ * @param {...any} args
*/
fatal(...args) {
console.error(`[${this.timestamp}] FATAL:`, ...args, `(${this.source})`)
@@ -148,4 +149,4 @@ class Logger {
this.handleLog(LogLevel.NOTE, args, this.source)
}
}
-module.exports = new Logger()
\ No newline at end of file
+module.exports = new Logger()
diff --git a/server/Server.js b/server/Server.js
index 9de2f3f63..2d393a8d7 100644
--- a/server/Server.js
+++ b/server/Server.js
@@ -50,6 +50,7 @@ class Server {
global.MetadataPath = fileUtils.filePathToPOSIX(Path.normalize(METADATA_PATH))
global.RouterBasePath = ROUTER_BASE_PATH
global.XAccel = process.env.USE_X_ACCEL
+ global.AllowCors = process.env.ALLOW_CORS === '1'
if (!fs.pathExistsSync(global.ConfigPath)) {
fs.mkdirSync(global.ConfigPath)
@@ -182,11 +183,12 @@ class Server {
* @see https://ionicframework.com/docs/troubleshooting/cors
*
* Running in development allows cors to allow testing the mobile apps in the browser
+ * or env variable ALLOW_CORS = '1'
*/
app.use((req, res, next) => {
if (Logger.isDev || req.path.match(/\/api\/items\/([a-z0-9-]{36})\/(ebook|cover)(\/[0-9]+)?/)) {
const allowedOrigins = ['capacitor://localhost', 'http://localhost']
- if (Logger.isDev || allowedOrigins.some((o) => o === req.get('origin'))) {
+ if (global.AllowCors || Logger.isDev || allowedOrigins.some((o) => o === req.get('origin'))) {
res.header('Access-Control-Allow-Origin', req.get('origin'))
res.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS')
res.header('Access-Control-Allow-Headers', '*')
diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js
index 8451de155..0f30c410d 100644
--- a/server/controllers/LibraryController.js
+++ b/server/controllers/LibraryController.js
@@ -512,8 +512,7 @@ class LibraryController {
* @param {*} res
*/
async getUserPlaylistsForLibrary(req, res) {
- let playlistsForUser = await Database.playlistModel.getPlaylistsForUserAndLibrary(req.user.id, req.library.id)
- playlistsForUser = await Promise.all(playlistsForUser.map(async (p) => p.getOldJsonExpanded()))
+ let playlistsForUser = await Database.playlistModel.getOldPlaylistsForUserAndLibrary(req.user.id, req.library.id)
const payload = {
results: [],
diff --git a/server/controllers/MeController.js b/server/controllers/MeController.js
index b5147fb7d..7126d45b2 100644
--- a/server/controllers/MeController.js
+++ b/server/controllers/MeController.js
@@ -6,7 +6,7 @@ const { toNumber } = require('../utils/index')
const userStats = require('../utils/queries/userStats')
class MeController {
- constructor() { }
+ constructor() {}
getCurrentUser(req, res) {
res.json(req.user.toJSONForBrowser())
@@ -33,6 +33,43 @@ class MeController {
res.json(payload)
}
+ /**
+ * GET: /api/me/item/listening-sessions/:libraryItemId/:episodeId
+ *
+ * @this import('../routers/ApiRouter')
+ *
+ * @param {import('express').Request} req
+ * @param {import('express').Response} res
+ */
+ async getItemListeningSessions(req, res) {
+ const libraryItem = await Database.libraryItemModel.findByPk(req.params.libraryItemId)
+ const episode = await Database.podcastEpisodeModel.findByPk(req.params.episodeId)
+
+ if (!libraryItem || (libraryItem.mediaType === 'podcast' && !episode)) {
+ Logger.error(`[MeController] Media item not found for library item id "${req.params.libraryItemId}"`)
+ return res.sendStatus(404)
+ }
+
+ const mediaItemId = episode?.id || libraryItem.mediaId
+ let listeningSessions = await this.getUserItemListeningSessionsHelper(req.user.id, mediaItemId)
+
+ const itemsPerPage = toNumber(req.query.itemsPerPage, 10) || 10
+ const page = toNumber(req.query.page, 0)
+
+ const start = page * itemsPerPage
+ const sessions = listeningSessions.slice(start, start + itemsPerPage)
+
+ const payload = {
+ total: listeningSessions.length,
+ numPages: Math.ceil(listeningSessions.length / itemsPerPage),
+ page,
+ itemsPerPage,
+ sessions
+ }
+
+ res.json(payload)
+ }
+
// GET: api/me/listening-stats
async getListeningStats(req, res) {
const listeningStats = await this.getUserListeningStatsHelpers(req.user.id)
@@ -80,7 +117,7 @@ class MeController {
if (!libraryItem) {
return res.status(404).send('Item not found')
}
- if (!libraryItem.media.episodes.find(ep => ep.id === episodeId)) {
+ if (!libraryItem.media.episodes.find((ep) => ep.id === episodeId)) {
Logger.error(`[MeController] removeEpisode episode ${episodeId} not found for item ${libraryItem.id}`)
return res.status(404).send('Episode not found')
}
@@ -123,7 +160,7 @@ class MeController {
// POST: api/me/item/:id/bookmark
async createBookmark(req, res) {
- if (!await Database.libraryItemModel.checkExistsById(req.params.id)) return res.sendStatus(404)
+ if (!(await Database.libraryItemModel.checkExistsById(req.params.id))) return res.sendStatus(404)
const { time, title } = req.body
const bookmark = req.user.createBookmark(req.params.id, time, title)
@@ -134,7 +171,7 @@ class MeController {
// PATCH: api/me/item/:id/bookmark
async updateBookmark(req, res) {
- if (!await Database.libraryItemModel.checkExistsById(req.params.id)) return res.sendStatus(404)
+ if (!(await Database.libraryItemModel.checkExistsById(req.params.id))) return res.sendStatus(404)
const { time, title } = req.body
if (!req.user.findBookmark(req.params.id, time)) {
@@ -152,7 +189,7 @@ class MeController {
// DELETE: api/me/item/:id/bookmark/:time
async removeBookmark(req, res) {
- if (!await Database.libraryItemModel.checkExistsById(req.params.id)) return res.sendStatus(404)
+ if (!(await Database.libraryItemModel.checkExistsById(req.params.id))) return res.sendStatus(404)
const time = Number(req.params.time)
if (isNaN(time)) return res.sendStatus(500)
@@ -254,11 +291,10 @@ class MeController {
// TODO: More efficient to do this in a single query
for (const mediaProgress of req.user.mediaProgress) {
if (!mediaProgress.isFinished && (mediaProgress.progress > 0 || mediaProgress.ebookProgress > 0)) {
-
const libraryItem = await Database.libraryItemModel.getOldById(mediaProgress.libraryItemId)
if (libraryItem) {
if (mediaProgress.episodeId && libraryItem.mediaType === 'podcast') {
- const episode = libraryItem.media.episodes.find(ep => ep.id === mediaProgress.episodeId)
+ const episode = libraryItem.media.episodes.find((ep) => ep.id === mediaProgress.episodeId)
if (episode) {
const libraryItemWithEpisode = {
...libraryItem.toJSONMinified(),
@@ -277,7 +313,9 @@ class MeController {
}
}
- itemsInProgress = sort(itemsInProgress).desc(li => li.progressLastUpdate).slice(0, limit)
+ itemsInProgress = sort(itemsInProgress)
+ .desc((li) => li.progressLastUpdate)
+ .slice(0, limit)
res.json({
libraryItems: itemsInProgress
})
@@ -317,19 +355,22 @@ class MeController {
// GET: api/me/progress/:id/remove-from-continue-listening
async removeItemFromContinueListening(req, res) {
- const mediaProgress = req.user.mediaProgress.find(mp => mp.id === req.params.id)
+ const mediaProgress = req.user.mediaProgress.find((mp) => mp.id === req.params.id)
if (!mediaProgress) {
return res.sendStatus(404)
}
const hasUpdated = req.user.removeProgressFromContinueListening(req.params.id)
if (hasUpdated) {
- await Database.mediaProgressModel.update({
- hideFromContinueListening: true
- }, {
- where: {
- id: mediaProgress.id
+ await Database.mediaProgressModel.update(
+ {
+ hideFromContinueListening: true
+ },
+ {
+ where: {
+ id: mediaProgress.id
+ }
}
- })
+ )
SocketAuthority.clientEmitter(req.user.id, 'user_updated', req.user.toJSONForBrowser())
}
res.json(req.user.toJSONForBrowser())
@@ -337,9 +378,9 @@ class MeController {
/**
* GET: /api/me/stats/year/:year
- *
- * @param {import('express').Request} req
- * @param {import('express').Response} res
+ *
+ * @param {import('express').Request} req
+ * @param {import('express').Response} res
*/
async getStatsForYear(req, res) {
const year = Number(req.params.year)
@@ -351,4 +392,4 @@ class MeController {
res.json(data)
}
}
-module.exports = new MeController()
\ No newline at end of file
+module.exports = new MeController()
diff --git a/server/finders/BookFinder.js b/server/finders/BookFinder.js
index 9aa0a1824..8aef4d111 100644
--- a/server/finders/BookFinder.js
+++ b/server/finders/BookFinder.js
@@ -10,6 +10,8 @@ const Logger = require('../Logger')
const { levenshteinDistance, escapeRegExp } = require('../utils/index')
class BookFinder {
+ #providerResponseTimeout = 30000
+
constructor() {
this.openLibrary = new OpenLibrary()
this.googleBooks = new GoogleBooks()
@@ -36,63 +38,75 @@ class BookFinder {
filterSearchResults(books, title, author, maxTitleDistance, maxAuthorDistance) {
var searchTitle = cleanTitleForCompares(title)
var searchAuthor = cleanAuthorForCompares(author)
- return books.map(b => {
- b.cleanedTitle = cleanTitleForCompares(b.title)
- b.titleDistance = levenshteinDistance(b.cleanedTitle, title)
+ return books
+ .map((b) => {
+ b.cleanedTitle = cleanTitleForCompares(b.title)
+ b.titleDistance = levenshteinDistance(b.cleanedTitle, title)
- // Total length of search (title or both title & author)
- b.totalPossibleDistance = b.title.length
+ // Total length of search (title or both title & author)
+ b.totalPossibleDistance = b.title.length
- if (author) {
- if (!b.author) {
- b.authorDistance = author.length
- } else {
- b.totalPossibleDistance += b.author.length
- b.cleanedAuthor = cleanAuthorForCompares(b.author)
+ if (author) {
+ if (!b.author) {
+ b.authorDistance = author.length
+ } else {
+ b.totalPossibleDistance += b.author.length
+ b.cleanedAuthor = cleanAuthorForCompares(b.author)
- var cleanedAuthorDistance = levenshteinDistance(b.cleanedAuthor, searchAuthor)
- var authorDistance = levenshteinDistance(b.author || '', author)
+ var cleanedAuthorDistance = levenshteinDistance(b.cleanedAuthor, searchAuthor)
+ var authorDistance = levenshteinDistance(b.author || '', author)
- // Use best distance
- b.authorDistance = Math.min(cleanedAuthorDistance, authorDistance)
+ // Use best distance
+ b.authorDistance = Math.min(cleanedAuthorDistance, authorDistance)
- // Check book author contains searchAuthor
- if (searchAuthor.length > 4 && b.cleanedAuthor.includes(searchAuthor)) b.includesAuthor = searchAuthor
- else if (author.length > 4 && b.author.includes(author)) b.includesAuthor = author
+ // Check book author contains searchAuthor
+ if (searchAuthor.length > 4 && b.cleanedAuthor.includes(searchAuthor)) b.includesAuthor = searchAuthor
+ else if (author.length > 4 && b.author.includes(author)) b.includesAuthor = author
+ }
}
- }
- b.totalDistance = b.titleDistance + (b.authorDistance || 0)
+ b.totalDistance = b.titleDistance + (b.authorDistance || 0)
- // Check book title contains the searchTitle
- if (searchTitle.length > 4 && b.cleanedTitle.includes(searchTitle)) b.includesTitle = searchTitle
- else if (title.length > 4 && b.title.includes(title)) b.includesTitle = title
+ // Check book title contains the searchTitle
+ if (searchTitle.length > 4 && b.cleanedTitle.includes(searchTitle)) b.includesTitle = searchTitle
+ else if (title.length > 4 && b.title.includes(title)) b.includesTitle = title
- return b
- }).filter(b => {
- if (b.includesTitle) { // If search title was found in result title then skip over leven distance check
- if (this.verbose) Logger.debug(`Exact title was included in "${b.title}", Search: "${b.includesTitle}"`)
- } else if (b.titleDistance > maxTitleDistance) {
- if (this.verbose) Logger.debug(`Filtering out search result title distance = ${b.titleDistance}: "${b.cleanedTitle}"/"${searchTitle}"`)
- return false
- }
-
- if (author) {
- if (b.includesAuthor) { // If search author was found in result author then skip over leven distance check
- if (this.verbose) Logger.debug(`Exact author was included in "${b.author}", Search: "${b.includesAuthor}"`)
- } else if (b.authorDistance > maxAuthorDistance) {
- if (this.verbose) Logger.debug(`Filtering out search result "${b.author}", author distance = ${b.authorDistance}: "${b.author}"/"${author}"`)
+ return b
+ })
+ .filter((b) => {
+ if (b.includesTitle) {
+ // If search title was found in result title then skip over leven distance check
+ if (this.verbose) Logger.debug(`Exact title was included in "${b.title}", Search: "${b.includesTitle}"`)
+ } else if (b.titleDistance > maxTitleDistance) {
+ if (this.verbose) Logger.debug(`Filtering out search result title distance = ${b.titleDistance}: "${b.cleanedTitle}"/"${searchTitle}"`)
return false
}
- }
- // If book total search length < 5 and was not exact match, then filter out
- if (b.totalPossibleDistance < 5 && b.totalDistance > 0) return false
- return true
- })
+ if (author) {
+ if (b.includesAuthor) {
+ // If search author was found in result author then skip over leven distance check
+ if (this.verbose) Logger.debug(`Exact author was included in "${b.author}", Search: "${b.includesAuthor}"`)
+ } else if (b.authorDistance > maxAuthorDistance) {
+ if (this.verbose) Logger.debug(`Filtering out search result "${b.author}", author distance = ${b.authorDistance}: "${b.author}"/"${author}"`)
+ return false
+ }
+ }
+
+ // If book total search length < 5 and was not exact match, then filter out
+ if (b.totalPossibleDistance < 5 && b.totalDistance > 0) return false
+ return true
+ })
}
+ /**
+ *
+ * @param {string} title
+ * @param {string} author
+ * @param {number} maxTitleDistance
+ * @param {number} maxAuthorDistance
+ * @returns {Promise