From fbe9971a8b4fa3606ef8dbd8262a40ba03d40f3c Mon Sep 17 00:00:00 2001 From: votex001 Date: Wed, 3 Sep 2025 18:19:52 +0300 Subject: [PATCH 001/117] [fix] prevent duplicates in multi-selects --- client/components/ui/MultiSelect.vue | 2 +- client/components/ui/MultiSelectQueryInput.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/ui/MultiSelect.vue b/client/components/ui/MultiSelect.vue index c7572ba50..3dcfb0495 100644 --- a/client/components/ui/MultiSelect.vue +++ b/client/components/ui/MultiSelect.vue @@ -278,7 +278,7 @@ export default { }) }, insertNewItem(item) { - this.selected.push(item) + if (!this.selected.includes(item)) this.selected.push(item) this.$emit('input', this.selected) this.$emit('newItem', item) this.textInput = null diff --git a/client/components/ui/MultiSelectQueryInput.vue b/client/components/ui/MultiSelectQueryInput.vue index 18abc66e7..4bc434cbd 100644 --- a/client/components/ui/MultiSelectQueryInput.vue +++ b/client/components/ui/MultiSelectQueryInput.vue @@ -287,7 +287,7 @@ export default { }) }, insertNewItem(item) { - this.selected.push(item) + if (!this.selected.find((i) => i.name === item.name)) this.selected.push(item) this.$emit('input', this.selected) this.$emit('newItem', item) this.textInput = null From 9ce6de3100bb2e0db1354f08c00c45085bcbb9d0 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sat, 27 Sep 2025 17:00:57 +0200 Subject: [PATCH 002/117] Added progress to upload --- client/components/cards/ItemUploadCard.vue | 56 +++++++++++++++++++++- client/components/ui/LoadingIndicator.vue | 9 +++- client/pages/upload/index.vue | 23 ++++++++- 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/client/components/cards/ItemUploadCard.vue b/client/components/cards/ItemUploadCard.vue index 40836b8e4..cb9dd5589 100644 --- a/client/components/cards/ItemUploadCard.vue +++ b/client/components/cards/ItemUploadCard.vue @@ -62,7 +62,24 @@
- + +
+ + {{ nonInteractionLabel }} + +
+ +
+
+ + {{ uploadProgressText }} + +
+
+
+
+
+
@@ -91,7 +108,11 @@ export default { isUploading: false, uploadFailed: false, uploadSuccess: false, - isFetchingMetadata: false + isFetchingMetadata: false, + uploadProgress: { + loaded: 0, + total: 0 + } } }, computed: { @@ -116,13 +137,44 @@ export default { } else if (this.isFetchingMetadata) { return this.$strings.LabelFetchingMetadata } + }, + uploadProgressPercent() { + if (this.uploadProgress.total === 0) return 0 + return Math.min(100, Math.round((this.uploadProgress.loaded / this.uploadProgress.total) * 100)) + }, + uploadProgressText() { + const loaded = this.formatBytes(this.uploadProgress.loaded) + const total = this.formatBytes(this.uploadProgress.total) + return `${this.uploadProgressPercent}% (${loaded} / ${total})` } }, methods: { + formatBytes(bytes) { + if (bytes === 0) return '0 Bytes' + const k = 1024 + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] + }, setUploadStatus(status) { this.isUploading = status === 'uploading' this.uploadFailed = status === 'failed' this.uploadSuccess = status === 'success' + + if (status !== 'uploading') { + this.uploadProgress = { + loaded: 0, + total: 0 + } + } + }, + setUploadProgress(progress) { + if (this.isUploading && progress) { + this.uploadProgress = { + loaded: progress.loaded || 0, + total: progress.total || 0 + } + } }, titleUpdated() { this.error = '' diff --git a/client/components/ui/LoadingIndicator.vue b/client/components/ui/LoadingIndicator.vue index d984bf35e..3b4b6e049 100644 --- a/client/components/ui/LoadingIndicator.vue +++ b/client/components/ui/LoadingIndicator.vue @@ -1,5 +1,5 @@ @@ -23,6 +25,9 @@ export default { computed: { message() { return this.text || this.$strings.MessagePleaseWait + }, + hasSlotContent() { + return this.$slots.default && this.$slots.default.length > 0 } } } diff --git a/client/pages/upload/index.vue b/client/pages/upload/index.vue index eef05b608..63e133137 100644 --- a/client/pages/upload/index.vue +++ b/client/pages/upload/index.vue @@ -297,6 +297,15 @@ export default { ref.setUploadStatus(status) } }, + updateItemCardProgress(index, progress) { + var ref = this.$refs[`itemCard-${index}`] + if (ref && ref.length) ref = ref[0] + if (!ref) { + console.error('Book card ref not found', index, this.$refs) + } else { + ref.setUploadProgress(progress) + } + }, async uploadItem(item) { var form = new FormData() form.set('title', item.title) @@ -312,8 +321,20 @@ export default { form.set(`${index++}`, file) }) + const config = { + onUploadProgress: (progressEvent) => { + if (progressEvent.lengthComputable) { + const progress = { + loaded: progressEvent.loaded, + total: progressEvent.total + } + this.updateItemCardProgress(item.index, progress) + } + } + } + return this.$axios - .$post('/api/upload', form) + .$post('/api/upload', form, config) .then(() => true) .catch((error) => { console.error('Failed to upload item', error) From 4224f44259da03000a924c3ed382fa358909ecb1 Mon Sep 17 00:00:00 2001 From: Finn Dittmar Date: Thu, 9 Oct 2025 08:49:13 +0200 Subject: [PATCH 003/117] Remove duplicate (and also wrong byte conversion) --- client/components/cards/ItemUploadCard.vue | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/client/components/cards/ItemUploadCard.vue b/client/components/cards/ItemUploadCard.vue index cb9dd5589..adbf3adbe 100644 --- a/client/components/cards/ItemUploadCard.vue +++ b/client/components/cards/ItemUploadCard.vue @@ -143,19 +143,12 @@ export default { return Math.min(100, Math.round((this.uploadProgress.loaded / this.uploadProgress.total) * 100)) }, uploadProgressText() { - const loaded = this.formatBytes(this.uploadProgress.loaded) - const total = this.formatBytes(this.uploadProgress.total) + const loaded = this.$bytesPretty(this.uploadProgress.loaded) + const total = this.$bytesPretty(this.uploadProgress.total) return `${this.uploadProgressPercent}% (${loaded} / ${total})` } }, methods: { - formatBytes(bytes) { - if (bytes === 0) return '0 Bytes' - const k = 1024 - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'] - const i = Math.floor(Math.log(bytes) / Math.log(k)) - return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] - }, setUploadStatus(status) { this.isUploading = status === 'uploading' this.uploadFailed = status === 'failed' From 797dba244892b3455a9506a44298446844a0f814 Mon Sep 17 00:00:00 2001 From: Frank de Lange Date: Fri, 10 Oct 2025 22:30:38 +0200 Subject: [PATCH 004/117] fix #1617 (useradd: user 'audiobookshelf' already exists) This change fixes the problem of failing upgrades on dpkg-based systems by reworking the check for whether the `audiobookshelf` user/group already exists. --- build/debian/DEBIAN/preinst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/debian/DEBIAN/preinst b/build/debian/DEBIAN/preinst index e30bc490c..241a47010 100644 --- a/build/debian/DEBIAN/preinst +++ b/build/debian/DEBIAN/preinst @@ -22,7 +22,7 @@ add_user() { declare -r descr="${4:-No description}" declare -r shell="${5:-/bin/false}" - if ! getent passwd | grep -q "^$user:"; then + if ! getent passwd "$user" 2>&1 >/dev/null; then echo "Creating system user: $user in $group with $descr and shell $shell" useradd $uid_flags --gid $group --no-create-home --system --shell $shell -c "$descr" $user fi @@ -39,7 +39,7 @@ add_group() { declare -r gid_flags="--gid $gid" fi - if ! getent group | grep -q "^$group:" ; then + if ! getent group "$group" 2>&1 >/dev/null; then echo "Creating system group: $group" groupadd $gid_flags --system $group fi From a5750deaaf824e99fec54848640c21d5395dd626 Mon Sep 17 00:00:00 2001 From: "Tomasz N." Date: Wed, 22 Oct 2025 23:02:49 +0200 Subject: [PATCH 005/117] The key change: Move the Database.bookAuthorModel.create() block outside the if (!author) check, so it runs whether the author was just created OR already existed in the database. This bug was visible when using "Match Books" for a library and the outcome was books had no author(s) assigned despite the custom providers correctly providing those values. --- server/scanner/Scanner.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/scanner/Scanner.js b/server/scanner/Scanner.js index 206068cc4..cf5c87b78 100644 --- a/server/scanner/Scanner.js +++ b/server/scanner/Scanner.js @@ -259,7 +259,7 @@ class Scanner { SocketAuthority.emitter('author_added', author.toOldJSON()) // Update filter data Database.addAuthorToFilterData(libraryItem.libraryId, author.name, author.id) - + } await Database.bookAuthorModel .create({ authorId: author.id, @@ -270,7 +270,6 @@ class Scanner { libraryItem.media.authors.push(author) hasAuthorUpdates = true }) - } } const authorsRemoved = libraryItem.media.authors.filter((a) => !matchData.author.find((ma) => ma.toLowerCase() === a.name.toLowerCase())) if (authorsRemoved.length) { From f77de1743e2f764ba2d9b5b7fa8c3472d04624c4 Mon Sep 17 00:00:00 2001 From: James Tattersall <10601770+jamerst@users.noreply.github.com> Date: Thu, 23 Oct 2025 21:31:37 +0100 Subject: [PATCH 006/117] Don't require listening today for 'Days in a row' stat --- client/components/stats/DailyListeningChart.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/components/stats/DailyListeningChart.vue b/client/components/stats/DailyListeningChart.vue index c0f3acb32..1c92e675d 100644 --- a/client/components/stats/DailyListeningChart.vue +++ b/client/components/stats/DailyListeningChart.vue @@ -186,10 +186,16 @@ export default { daysInARow() { var count = 0 while (true) { - var _date = this.$addDaysToToday(count * -1) + var _date = this.$addDaysToToday((count * -1) - 1) var datestr = this.$formatJsDate(_date, 'yyyy-MM-dd') if (!this.listeningStatsDays[datestr] || this.listeningStatsDays[datestr] === 0) { + // don't require listening today to count towards days in a row, but do count it if already listened today + var today = this.$formatJsDate(new Date(), 'yyyy-MM-dd'); + if (this.listeningStatsDays[today]) { + count++; + } + return count } count++ From 372c9a5322bca988f66c4d714067bfa5a9922ac8 Mon Sep 17 00:00:00 2001 From: "Tomasz N." Date: Fri, 31 Oct 2025 15:36:47 +0100 Subject: [PATCH 007/117] Increasing the timeout for bookfinder - some metadata providers heavily throttle the requests, original 10s is not enough. --- server/finders/BookFinder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/finders/BookFinder.js b/server/finders/BookFinder.js index fe1a61027..c25afe075 100644 --- a/server/finders/BookFinder.js +++ b/server/finders/BookFinder.js @@ -11,7 +11,7 @@ const { levenshteinDistance, levenshteinSimilarity, escapeRegExp, isValidASIN } const htmlSanitizer = require('../utils/htmlSanitizer') class BookFinder { - #providerResponseTimeout = 10000 + #providerResponseTimeout = 120000 constructor() { this.openLibrary = new OpenLibrary() From 961d066bdd5d18efa2d8774362b2b236a8ca2d82 Mon Sep 17 00:00:00 2001 From: "Tomasz N." Date: Fri, 31 Oct 2025 15:39:12 +0100 Subject: [PATCH 008/117] Wrong branch. --- server/finders/BookFinder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/finders/BookFinder.js b/server/finders/BookFinder.js index c25afe075..fe1a61027 100644 --- a/server/finders/BookFinder.js +++ b/server/finders/BookFinder.js @@ -11,7 +11,7 @@ const { levenshteinDistance, levenshteinSimilarity, escapeRegExp, isValidASIN } const htmlSanitizer = require('../utils/htmlSanitizer') class BookFinder { - #providerResponseTimeout = 120000 + #providerResponseTimeout = 10000 constructor() { this.openLibrary = new OpenLibrary() From 01a833ea59e2bdc8174c02fac5ed8f6a9b01d4f1 Mon Sep 17 00:00:00 2001 From: Aleksandr Zakirov Date: Wed, 22 Oct 2025 00:36:30 +0200 Subject: [PATCH 009/117] Translated using Weblate (Estonian) Currently translated at 64.2% (747 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/et/ --- client/strings/et.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/strings/et.json b/client/strings/et.json index d34e0b7ba..d3ab4e760 100644 --- a/client/strings/et.json +++ b/client/strings/et.json @@ -490,13 +490,13 @@ "LabelStatsDaysListened": "Kuulatud päevad", "LabelStatsHours": "Tunnid", "LabelStatsInARow": "järjest", - "LabelStatsItemsFinished": "Lõpetatud üksused", + "LabelStatsItemsFinished": "Lõpetatud raamatud", "LabelStatsItemsInLibrary": "Üksused raamatukogus", "LabelStatsMinutes": "minuteid", "LabelStatsMinutesListening": "Kuulamise minutid", "LabelStatsOverallDays": "Kokku päevad", "LabelStatsOverallHours": "Kokku tunnid", - "LabelStatsWeekListening": "Nädala kuulamine", + "LabelStatsWeekListening": "Nädala keskmine", "LabelSubtitle": "Alapealkiri", "LabelSupportedFileTypes": "Toetatud failitüübid", "LabelTag": "Silt", @@ -561,7 +561,8 @@ "MessageAppriseDescription": "Selle funktsiooni kasutamiseks peate käivitama Apprise API eksemplari või API, mis töötleb samu päringuid.
Apprise API URL peaks olema täielik URL-rada teatise saatmiseks, näiteks kui teie API eksemplar töötab aadressil http://192.168.1.1:8337, siis peaksite sisestama http://192.168.1.1:8337/notify.", "MessageBackupsDescription": "Varukoopiad hõlmavad kasutajaid, kasutajate edenemist, raamatukogu üksikasju, serveri seadeid ja kaustades /metadata/items ja /metadata/authors salvestatud pilte. Varukoopiad ei hõlma ühtegi teie raamatukogu kaustades olevat faili.", "MessageBatchQuickMatchDescription": "Kiire sobitamine üritab lisada valitud üksustele puuduvad kaaned ja metaandmed. Luba allpool olevad valikud, et lubada Kiire sobitamine'il üle kirjutada olemasolevaid kaasi ja/või metaandmeid.", - "MessageBookshelfNoCollections": "Te pole veel ühtegi kogumit teinud", + "MessageBookshelfNoCollections": "Te pole veel ühtegi kollektsiooni teinud", + "MessageBookshelfNoCollectionsHelp": "Kollektsioonid on avalikud. Kõik kasutajad kellel on olemas ligipääs raamatukogule saavad neid näha.", "MessageBookshelfNoRSSFeeds": "Ühtegi RSS-i voogu pole avatud", "MessageBookshelfNoResultsForFilter": "Filtrile \"{0}: {1}\" pole tulemusi", "MessageBookshelfNoSeries": "Teil pole ühtegi seeriat", @@ -600,6 +601,7 @@ "MessageConfirmRenameTagMergeNote": "Märkus: See silt on juba olemas, nii et need ühendatakse.", "MessageConfirmRenameTagWarning": "Hoiatus! Sarnane silt erineva puhvriga on juba olemas \"{0}\".", "MessageConfirmSendEbookToDevice": "Olete kindel, et soovite saata {0} e-raamatu \"{1}\" seadmesse \"{2}\"?", + "MessageDaysListenedInTheLastYear": "{0} päeva kuuldud viimase aasta jooksul", "MessageDownloadingEpisode": "Episoodi allalaadimine", "MessageDragFilesIntoTrackOrder": "Lohistage failid õigesse järjekorda", "MessageEmbedFinished": "Manustamine lõpetatud!", From 82f512d4057fc45e4e3b0e6e01dfaab671f9c4de Mon Sep 17 00:00:00 2001 From: pryszczoskor Date: Mon, 27 Oct 2025 19:16:34 +0100 Subject: [PATCH 010/117] Translated using Weblate (Polish) Currently translated at 88.3% (1027 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index 0b92dc89c..6f83720de 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -233,8 +233,8 @@ "LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji", "LabelAddToPlaylist": "Dodaj do playlisty", "LabelAddToPlaylistBatch": "Dodaj {0} pozycji do playlisty", - "LabelAddedAt": "Dodano", - "LabelAddedDate": "Dodano {0}", + "LabelAddedAt": "Dodano w", + "LabelAddedDate": "Dodano", "LabelAdminUsersOnly": "Tylko użytkownicy administracyjni", "LabelAll": "Wszystkie", "LabelAllEpisodesDownloaded": "Wszystkie odcinki pobrane", @@ -295,6 +295,7 @@ "LabelContinueListening": "Kontynuuj słuchanie", "LabelContinueReading": "Kontynuuj czytanie", "LabelContinueSeries": "Kontynuuj serię", + "LabelCorsAllowed": "Dozwolone źródła CORS", "LabelCover": "Okładka", "LabelCoverImageURL": "URL okładki", "LabelCoverProvider": "Dostawca okładki", From b42c7421b05af0c8e2e79aa358e10e7e486a7352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Sun, 26 Oct 2025 13:13:25 +0100 Subject: [PATCH 011/117] Translated using Weblate (Finnish) Currently translated at 95.5% (1111 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/ --- client/strings/fi.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/strings/fi.json b/client/strings/fi.json index 8d224d81c..6e2999bd5 100644 --- a/client/strings/fi.json +++ b/client/strings/fi.json @@ -182,6 +182,7 @@ "HeaderPlaylist": "Soittolista", "HeaderPlaylistItems": "Soittolistan kohteet", "HeaderPodcastsToAdd": "Lisättävät podcastit", + "HeaderPresets": "Esivalinnat", "HeaderPreviewCover": "Esikatsele kansikuvaa", "HeaderRSSFeedGeneral": "RSS yksityiskohdat", "HeaderRSSFeedIsOpen": "RSS syöte on avoinna", @@ -221,7 +222,7 @@ "LabelAbridged": "Lyhennetty", "LabelAbridgedChecked": "Lyhennetty (tarkistettu)", "LabelAbridgedUnchecked": "Lyhentämätön (tarkistamaton)", - "LabelAccessibleBy": "Saavutettavissa:", + "LabelAccessibleBy": "Saavutettavissa", "LabelAccountType": "Tilin tyyppi", "LabelAccountTypeAdmin": "Järjestelmänvalvoja", "LabelAccountTypeGuest": "Vieras", @@ -243,6 +244,7 @@ "LabelAlreadyInYourLibrary": "Jo kirjastossasi", "LabelApiKeyCreated": "API avain \"{0}\" luotu onnistuneesti.", "LabelApiKeyCreatedDescription": "Varmista, että kopioit API avaimen. Sitä ei näytetä enää tämän jälkeen.", + "LabelApiKeyUser": "Toimi käyttäjän puolesta", "LabelApiToken": "Sovellusliittymätunnus", "LabelAppend": "Lisää loppuun", "LabelAudioBitrate": "Äänen bittinopeus (esim. 128k)", @@ -523,7 +525,7 @@ "LabelPublishers": "Julkaisijat", "LabelRSSFeedCustomOwnerEmail": "Mukautettu omistajan sähköposti", "LabelRSSFeedCustomOwnerName": "Mukautettu omistajan nimi", - "LabelRSSFeedOpen": "RSS-syöte avoin", + "LabelRSSFeedOpen": "RSS Syöte Avoin", "LabelRSSFeedPreventIndexing": "Estä indeksointi", "LabelRSSFeedSlug": "RSS-syöte Slug", "LabelRSSFeedURL": "RSS-syötteen URL-osoite", From c1f4e4120ee95003ff76664f5aed3763742fa997 Mon Sep 17 00:00:00 2001 From: dapitch666 Date: Thu, 30 Oct 2025 14:22:17 +0100 Subject: [PATCH 012/117] Translated using Weblate (French) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/ --- client/strings/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index e744b15ef..e90cd73a2 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -172,7 +172,7 @@ "HeaderNotificationUpdate": "Mise à jour de la notification", "HeaderNotifications": "Notifications", "HeaderOpenIDConnectAuthentication": "Authentification via OpenID Connect", - "HeaderOpenListeningSessions": "Ouvrir les sessions d'écoutes", + "HeaderOpenListeningSessions": "Sessions d'écoute ouvertes", "HeaderOpenRSSFeed": "Ouvrir le flux RSS", "HeaderOtherFiles": "Autres fichiers", "HeaderPasswordAuthentication": "Authentification par mot de passe", @@ -1026,6 +1026,8 @@ "ToastCollectionItemsAddFailed": "Échec de l’ajout de(s) élément(s) à la collection", "ToastCollectionRemoveSuccess": "Collection supprimée", "ToastCollectionUpdateSuccess": "Collection mise à jour", + "ToastConnectionNotAvailable": "Connexion indisponible. Essayez plus tard", + "ToastCoverSearchFailed": "La recherche de la couverture a échoué", "ToastCoverUpdateFailed": "Échec de la mise à jour de la couverture", "ToastDateTimeInvalidOrIncomplete": "La date et l'heure sont invalides ou incomplètes", "ToastDeleteFileFailed": "Échec de la suppression du fichier", From f91be185272b2a00bc8a8c7cc772f7f15894d555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Gon=C3=A7alves=20Jaksys?= Date: Fri, 31 Oct 2025 22:21:01 +0100 Subject: [PATCH 013/117] Translated using Weblate (Portuguese (Brazil)) Currently translated at 93.1% (1083 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pt_BR/ --- client/strings/pt-br.json | 195 +++++++++++++++++++++++++++++++++++++- 1 file changed, 193 insertions(+), 2 deletions(-) diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index 53b9199e2..5f207154e 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -143,8 +143,8 @@ "HeaderEmail": "Email", "HeaderEmailSettings": "Configurações de Email", "HeaderEpisodes": "Episódios", - "HeaderEreaderDevices": "Dispositivos Ereader", - "HeaderEreaderSettings": "Configurações Ereader", + "HeaderEreaderDevices": "Dispositivos leitores de ebook", + "HeaderEreaderSettings": "Configurações do leitor de ebook", "HeaderFiles": "Arquivos", "HeaderFindChapters": "Localizar Capítulos", "HeaderIgnoredFiles": "Arquivos Ignorados", @@ -349,24 +349,36 @@ "LabelEnd": "Fim", "LabelEndOfChapter": "Fim do Capítulo", "LabelEpisode": "Episódio", + "LabelEpisodeNotLinkedToRssFeed": "Episódio não vinculado ao feed RSS", + "LabelEpisodeNumber": "Episódio #{0}", "LabelEpisodeTitle": "Título do Episódio", "LabelEpisodeType": "Tipo do Episódio", + "LabelEpisodeUrlFromRssFeed": "URL do episódio a partir do feed RSS", "LabelEpisodes": "Episódios", + "LabelEpisodic": "Episódico", "LabelExample": "Exemplo", + "LabelExpandSeries": "Expandir Série", + "LabelExpandSubSeries": "Expandir Subséries", "LabelExpired": "Expirado", + "LabelExpiresAt": "Expira às", + "LabelExpiresInSeconds": "Expira em (segundos)", "LabelExpiresNever": "Nunca", "LabelExplicit": "Explícito", "LabelExplicitChecked": "Explícito (verificado)", "LabelExplicitUnchecked": "Não explícito (não verificado)", + "LabelExportOPML": "Exportar OPML", "LabelFeedURL": "URL do Feed", "LabelFetchingMetadata": "Buscando Metadados", "LabelFile": "Arquivo", "LabelFileBirthtime": "Criação do Arquivo", + "LabelFileBornDate": "Criado {0}", "LabelFileModified": "Modificação do Arquivo", + "LabelFileModifiedDate": "Modificado {0}", "LabelFilename": "Nome do Arquivo", "LabelFilterByUser": "Filtrar por Usuário", "LabelFindEpisodes": "Localizar Episódios", "LabelFinished": "Concluído", + "LabelFinishedDate": "Concluído {0}", "LabelFolder": "Pasta", "LabelFolders": "Pastas", "LabelFontBold": "Negrito", @@ -376,6 +388,7 @@ "LabelFontScale": "Escala de fonte", "LabelFontStrikethrough": "Tachado", "LabelFormat": "Formato", + "LabelFull": "Cheio", "LabelGenre": "Gênero", "LabelGenres": "Gêneros", "LabelHardDeleteFile": "Apagar definitivamente", @@ -403,11 +416,14 @@ "LabelIntervalEveryMinute": "A cada minuto", "LabelInvert": "Inverter", "LabelItem": "Item", + "LabelJumpBackwardAmount": "Tempo de retrocesso", + "LabelJumpForwardAmount": "Tempo de avanço", "LabelLanguage": "Idioma", "LabelLanguageDefaultServer": "Idioma Padrão do Servidor", "LabelLanguages": "Idiomas", "LabelLastBookAdded": "Último Livro Acrescentado", "LabelLastBookUpdated": "Último Livro Atualizado", + "LabelLastProgressDate": "Último progresso: {0}", "LabelLastSeen": "Visto pela Última Vez", "LabelLastTime": "Progresso", "LabelLastUpdate": "Última Atualização", @@ -422,6 +438,7 @@ "LabelLibraryName": "Nome da Biblioteca", "LabelLibrarySortByProgress": "Última Atualização", "LabelLibrarySortByProgressFinished": "Concluído", + "LabelLibrarySortByProgressStarted": "Progresso: Iniciado", "LabelLimit": "Limite", "LabelLineSpacing": "Espaçamento entre linhas", "LabelListenAgain": "Escutar novamente", @@ -430,8 +447,13 @@ "LabelLogLevelWarn": "Atenção", "LabelLookForNewEpisodesAfterDate": "Procurar por novos Episódios após essa data", "LabelLowestPriority": "Prioridade mais baixa", + "LabelMatchConfidence": "Confiabilidade", "LabelMatchExistingUsersBy": "Consultar usuários existentes usando", "LabelMatchExistingUsersByDescription": "Utilizado para conectar usuários já existentes. Uma vez conectados, usuários serão consultados utilizando uma identificação única do seu provedor de SSO", + "LabelMaxEpisodesToDownload": "Número máximo de episódios para baixar. Use 0 para download ilimitado.", + "LabelMaxEpisodesToDownloadPerCheck": "Número máximo de novos episódios para baixar por verificação", + "LabelMaxEpisodesToKeep": "Número máximo de episódios para manter", + "LabelMaxEpisodesToKeepHelp": "O valor 0 define que não há limite máximo. Após um novo episódio ser baixado automaticamente, o episódio mais antigo será excluído caso você tenha mais de X episódios. Apenas um episódio será excluído a cada novo download.", "LabelMediaPlayer": "Reprodutor de mídia", "LabelMediaType": "Tipo de Mídia", "LabelMetaTag": "Etiqueta Meta", @@ -457,6 +479,7 @@ "LabelNextBackupDate": "Data do próximo backup", "LabelNextChapters": "Próximo capítulo será:", "LabelNextScheduledRun": "Próxima execução programada", + "LabelNoApiKeys": "Sem chaves de API", "LabelNoCustomMetadataProviders": "Não existem fontes de metadados customizados", "LabelNoEpisodesSelected": "Nenhum episódio selecionado", "LabelNotFinished": "Não concluído", @@ -472,6 +495,7 @@ "LabelNotificationsMaxQueueSize": "Tamanho máximo da fila de eventos de notificação", "LabelNotificationsMaxQueueSizeHelp": "Eventos estão limitados a um disparo por segundo. Eventos serão ignorados se a fila estiver no tamanho máximo. Isso evita o excesso de notificações.", "LabelNumberOfBooks": "Número de Livros", + "LabelNumberOfChapters": "Número de capítulos:", "LabelNumberOfEpisodes": "# de Episódios", "LabelOpenIDAdvancedPermsClaimDescription": "Nome do claim OpenID contendo as permissões avançadas para ações do usuário na aplicação para serem aplicadas aos perfis não-administradores (se configurados). Se o claim não estiver presente na resposta, acesso ao ABS será negado. Se apenas uma opção estiver ausente, ela será tratada como false. Garanta que o claim do provedor de identidade segue a estrutura esperada:", "LabelOpenIDClaims": "Deixe as opções a seguir em branco para desativar a atribuição de grupos e permissões avançadas; nesse caso, o grupo 'Usuário' será atribuído automaticamente.", @@ -485,6 +509,7 @@ "LabelPermissionsAccessAllLibraries": "Pode Acessar Todas Bibliotecas", "LabelPermissionsAccessAllTags": "Pode Acessar Todas as Etiquetas", "LabelPermissionsAccessExplicitContent": "Pode Acessar Conteúdos Explícitos", + "LabelPermissionsCreateEreader": "Pode criar leitor de ebooks", "LabelPermissionsDelete": "Pode Apagar", "LabelPermissionsDownload": "Pode Fazer Download", "LabelPermissionsUpdate": "Pode Atualizar", @@ -492,6 +517,7 @@ "LabelPersonalYearReview": "Sua Retrospectiva Anual ({0})", "LabelPhotoPathURL": "Caminho/URL para Foto", "LabelPlayMethod": "Método de Reprodução", + "LabelPlaybackRateIncrementDecrement": "Valor de incremento/decremento da taxa de reprodução", "LabelPlayerChapterNumberMarker": "{0} de {1}", "LabelPlaylists": "Listas de Reprodução", "LabelPodcast": "Podcast", @@ -504,9 +530,12 @@ "LabelPrimaryEbook": "Ebook principal", "LabelProgress": "Progresso", "LabelProvider": "Fonte", + "LabelProviderAuthorizationValue": "Valor do Cabeçalho de Autorização", "LabelPubDate": "Data de Publicação", "LabelPublishYear": "Ano de Publicação", "LabelPublishedDate": "Publicado {0}", + "LabelPublishedDecade": "Década de Publicação", + "LabelPublishedDecades": "Décadas de Publicação", "LabelPublisher": "Editora", "LabelPublishers": "Editoras", "LabelRSSFeedCustomOwnerEmail": "E-mail do dono personalizado", @@ -516,6 +545,7 @@ "LabelRSSFeedSlug": "Slug do Feed RSS", "LabelRSSFeedURL": "URL do Feed RSS", "LabelRandomly": "Aleatoriamente", + "LabelReAddSeriesToContinueListening": "Adicionar novamente a série à \"Continuar ouvindo\"", "LabelRead": "Lido", "LabelReadAgain": "Ler novamente", "LabelReadEbookWithoutProgress": "Ler ebook sem armazenar progresso", @@ -525,24 +555,34 @@ "LabelRedo": "Refazer", "LabelRegion": "Região", "LabelReleaseDate": "Data de Lançamento", + "LabelRemoveAllMetadataAbs": "Remover todos os arquivos metadata.abs", + "LabelRemoveAllMetadataJson": "Remover todos os arquivos metadata.json", + "LabelRemoveAudibleBranding": "Remover introdução e encerramento da Audible dos capítulos", "LabelRemoveCover": "Remover capa", + "LabelRemoveMetadataFile": "Remover arquivos de metadados nas pastas da biblioteca", + "LabelRemoveMetadataFileHelp": "Remover todos os arquivos metadata.json e metadata.abs em suas {0} pastas.", "LabelRowsPerPage": "Linhas por Página", "LabelSearchTerm": "Busca por Termo", "LabelSearchTitle": "Busca por Título", "LabelSearchTitleOrASIN": "Busca por Título ou ASIN", "LabelSeason": "Temporada", + "LabelSeasonNumber": "Temporada #{0}", "LabelSelectAll": "Selecionar todos", "LabelSelectAllEpisodes": "Selecionar todos os Episódios", "LabelSelectEpisodesShowing": "Selecionar os {0} Episódios Visíveis", + "LabelSelectUser": "Selecionar usuário", "LabelSelectUsers": "Selecionar usuários", "LabelSendEbookToDevice": "Enviar Ebook para...", "LabelSequence": "Sequência", + "LabelSerial": "Serial", "LabelSeries": "Série", "LabelSeriesName": "Nome da Série", "LabelSeriesProgress": "Progresso da Série", + "LabelServerLogLevel": "Nível de Logs do Servidor", "LabelServerYearReview": "Retrospectiva Anual do Servidor ({0})", "LabelSetEbookAsPrimary": "Definir como principal", "LabelSetEbookAsSupplementary": "Definir como complementar", + "LabelSettingsAllowIframe": "Permitir incorporação em iframe", "LabelSettingsAudiobooksOnly": "Apenas Audiobooks", "LabelSettingsAudiobooksOnlyHelp": "Ao ativar essa configuração os arquivos de ebooks serão ignorados a não ser que estejam dentro de uma pasta com um audiobook. Nesse caso eles serão definidos como ebooks complementares", "LabelSettingsBookshelfViewHelp": "Aparência esqueomorfa com prateleiras de madeira", @@ -561,6 +601,9 @@ "LabelSettingsHideSingleBookSeriesHelp": "Séries com um só livro serão ocultadas na página de séries e na prateleira de séries na página principal.", "LabelSettingsHomePageBookshelfView": "Usar visão estante na página principal", "LabelSettingsLibraryBookshelfView": "Usar visão estante na página da biblioteca", + "LabelSettingsLibraryMarkAsFinishedPercentComplete": "O percentual de conclusão é maior que", + "LabelSettingsLibraryMarkAsFinishedTimeRemaining": "O tempo restante é inferior a (segundos)", + "LabelSettingsLibraryMarkAsFinishedWhen": "Marcar o item de mídia como concluído quando", "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Pular livros anteriores em Continuar Série", "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "A prateleira Continuar Série na página principal de exibe o primeiro livro não iniciado em uma série que tem pelo menos um livro concluído e nenhum livro em andamento. Ativar essa configuração irá continuar a série a partir do livro mais recentemente concluído ao invés do primeiro livro não iniciado.", "LabelSettingsParseSubtitles": "Analisar subtítulos", @@ -579,6 +622,8 @@ "LabelSettingsStoreMetadataWithItemHelp": "Por padrão os arquivos de metadados são armazenados em /metadata/items. Ao ativar essa configuração os arquivos de metadados serão armazenadas nas pastas dos itens na sua biblioteca", "LabelSettingsTimeFormat": "Formato da Tempo", "LabelShare": "Compartilhar", + "LabelShareDownloadableHelp": "Permitir que os usuários com o link de compartilhamento baixem um arquivo zip do item da biblioteca.", + "LabelShareOpen": "Abrir compartilhamento", "LabelShareURL": "Compartilhar URL", "LabelShowAll": "Exibir Todos", "LabelShowSeconds": "Exibir segundos", @@ -586,10 +631,14 @@ "LabelSize": "Tamanho", "LabelSleepTimer": "Timer", "LabelSlug": "Slug", + "LabelSortAscending": "Crescente", + "LabelSortDescending": "Decrescente", + "LabelSortPubDate": "Ordenar por data de publicação", "LabelStart": "Iniciar", "LabelStartTime": "Horário do Início", "LabelStarted": "Iniciado", "LabelStartedAt": "Iniciado Em", + "LabelStartedDate": "Iniciado {0}", "LabelStatsAudioTracks": "Trilhas de Áudio", "LabelStatsAuthors": "Autores", "LabelStatsBestDay": "Melhor Dia", @@ -624,6 +673,8 @@ "LabelTimeDurationXHours": "{0} horas", "LabelTimeDurationXMinutes": "{0} minutos", "LabelTimeDurationXSeconds": "{0} segundos", + "LabelTimeInMinutes": "Tempo em minutos", + "LabelTimeLeft": "{0} restante", "LabelTimeListened": "Tempo de escuta", "LabelTimeListenedToday": "Tempo de escuta hoje", "LabelTimeRemaining": "{0} restantes", @@ -631,6 +682,7 @@ "LabelTitle": "Título", "LabelToolsEmbedMetadata": "Incluir Metadados", "LabelToolsEmbedMetadataDescription": "Incluir metadados no arquivo de áudio, com imagem da capa e capítulos.", + "LabelToolsM4bEncoder": "Codificador M4B", "LabelToolsMakeM4b": "Gerar audiobook no formato M4B", "LabelToolsMakeM4bDescription": "Gerar um arquivo de audiobook no formato .M4B com metadados, imagem da capa e capítulos.", "LabelToolsSplitM4b": "Dividir um M4B em MP3s", @@ -648,24 +700,31 @@ "LabelUnabridged": "Não Abreviada", "LabelUndo": "Desfazer", "LabelUnknown": "Desconhecido", + "LabelUnknownPublishDate": "Data de publicação desconhecida", "LabelUpdateCover": "Atualizar Capa", "LabelUpdateCoverHelp": "Permite sobrescrever capas existentes para os livros selecionados quando uma consulta for localizada", "LabelUpdateDetails": "Atualizar Detalhes", "LabelUpdateDetailsHelp": "Permite sobrescrever detalhes existentes para os livros selecionados quando uma consulta for localizada", "LabelUpdatedAt": "Atualizado em", "LabelUploaderDragAndDrop": "Arraste e solte arquivos ou pastas", + "LabelUploaderDragAndDropFilesOnly": "Arraste e solte arquivos", "LabelUploaderDropFiles": "Solte os arquivos", "LabelUploaderItemFetchMetadataHelp": "Busca título, autor e série automaticamente", + "LabelUseAdvancedOptions": "Usar Opções Avançadas", "LabelUseChapterTrack": "Usar a trilha do capítulo", "LabelUseFullTrack": "Usar a trilha toda", + "LabelUseZeroForUnlimited": "Use 0 para ilimitado", "LabelUser": "Usuário", "LabelUsername": "Nome do usuário", "LabelValue": "Valor", "LabelVersion": "Versão", "LabelViewBookmarks": "Ver marcadores", "LabelViewChapters": "Ver capítulos", + "LabelViewPlayerSettings": "Ver configurações do reprodutor", "LabelViewQueue": "Ver fila do reprodutor", "LabelVolume": "Volume", + "LabelWebRedirectURLsDescription": "Autorize esses URLs em seu provedor OAuth para permitir o redirecionamento de volta ao aplicativo web após o login:", + "LabelWebRedirectURLsSubfolder": "Subpasta de URLs de redirecionamento", "LabelWeekdaysToRun": "Dias da semana para executar", "LabelXBooks": "{0} livros", "LabelXItems": "{0} itens", @@ -677,41 +736,64 @@ "LabelYourProgress": "Seu Progresso", "MessageAddToPlayerQueue": "Adicionar à lista do reprodutor", "MessageAppriseDescription": "Para utilizar essa funcionalidade é preciso ter uma instância da API do Apprise em execução ou uma API que possa tratar esses mesmos chamados.
A URL da API do Apprise deve conter o caminho completo da URL para enviar as notificações. Ex: se a sua instância da API estiver em http://192.168.1.1:8337 você deve utilizar http://192.168.1.1:8337/notify.", + "MessageAsinCheck": "Certifique-se de estar usando o ASIN da região correta da Audible, e não da Amazon.", + "MessageAuthenticationLegacyTokenWarning": "Os tokens de API legados serão removidos no futuro. Use Chaves de API em vez disso.", + "MessageAuthenticationOIDCChangesRestart": "Reinicie o servidor após salvar para aplicar as alterações do OIDC.", + "MessageAuthenticationSecurityMessage": "A autenticação foi aprimorada para maior segurança. Todos os usuários precisam fazer login novamente.", "MessageBackupsDescription": "Backups incluem usuários, progresso dos usuários, detalhes dos itens da biblioteca, configurações do servidor e imagens armazenadas em /metadata/items & /metadata/authors. Backups não incluem quaisquer arquivos armazenados nas pastas da sua biblioteca.", + "MessageBackupsLocationEditNote": "Observação: Atualizar o local de backup não moverá nem modificará os backups existentes.", + "MessageBackupsLocationNoEditNote": "Observação: o local de backup é definido por meio de uma variável de ambiente e não pode ser alterado aqui.", + "MessageBackupsLocationPathEmpty": "O caminho do local de backup não pode ser vazio.", + "MessageBatchEditPopulateMapDetailsAllHelp": "Preencha os campos habilitados com dados de todos os itens. Os campos com múltiplos valores serão mesclados.", + "MessageBatchEditPopulateMapDetailsItemHelp": "Preencha os campos de detalhes do mapa habilitados com dados deste item.", "MessageBatchQuickMatchDescription": "Consulta Rápida tentará adicionar capas e metadados ausentes para os itens selecionados. Ative as opções abaixo para permitir que a Consulta Rápida sobrescreva capas e/ou metadados existentes.", "MessageBookshelfNoCollections": "Você ainda não criou coleções", + "MessageBookshelfNoCollectionsHelp": "As coleções são públicas. Todos os usuários com acesso à biblioteca podem vê-las.", "MessageBookshelfNoRSSFeeds": "Não existem feeds RSS abertos", "MessageBookshelfNoResultsForFilter": "Sem Resultados para o filtro \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Sem resultados para a consulta", "MessageBookshelfNoSeries": "Você não tem séries", + "MessageBulkChapterPattern": "Quantos capítulos você gostaria de adicionar seguindo esse padrão de numeração?", "MessageChapterEndIsAfter": "O final do capítulo está além do final do seu audiobook", "MessageChapterErrorFirstNotZero": "O primeiro capítulo precisa começar no 0", "MessageChapterErrorStartGteDuration": "Tempo de início não é válido pois precisa ser menor do que a duração do audioboook", "MessageChapterErrorStartLtPrev": "Tempo de início não é válido pois precisa ser igual ou maior que o tempo de início do capítulo anterior", "MessageChapterStartIsAfter": "Início do capítulo está além do final do seu audiobook", + "MessageChaptersNotFound": "Capítulos não encontrados", "MessageCheckingCron": "Verificando o cron...", "MessageConfirmCloseFeed": "Tem certeza de que deseja fechar esse feed?", + "MessageConfirmDeleteApiKey": "Tem certeza de que deseja excluir a chave de API \"{0}\"?", "MessageConfirmDeleteBackup": "Tem certeza de que deseja apagar o backup {0}?", + "MessageConfirmDeleteDevice": "Tem certeza de que deseja excluir o leitor de ebook \"{0}\"?", "MessageConfirmDeleteFile": "Essa ação apagará o arquivo do seu sistema de arquivos. Tem certeza?", "MessageConfirmDeleteLibrary": "Tem certeza de que deseja apagar a biblioteca \"{0}\" definitivamente?", "MessageConfirmDeleteLibraryItem": "Essa ação apagará o item da biblioteca do banco de dados e do seu sistema de arquivos. Tem certeza?", "MessageConfirmDeleteLibraryItems": "Essa ação apagará {0} itens da biblioteca do banco de dados e do seu sistema de arquivos. Tem certeza?", + "MessageConfirmDeleteMetadataProvider": "Tem certeza de que deseja excluir o provedor de metadados personalizado \"{0}\"?", + "MessageConfirmDeleteNotification": "Tem certeza de que deseja excluir esta notificação?", "MessageConfirmDeleteSession": "Tem certeza de que deseja apagar essa sessão?", + "MessageConfirmEmbedMetadataInAudioFiles": "Tem certeza de que deseja incorporar metadados em arquivos de áudio {0}?", "MessageConfirmForceReScan": "Tem certeza de que deseja forçar a nova verificação?", "MessageConfirmMarkAllEpisodesFinished": "Tem certeza de que deseja marcar todos os episódios como concluídos?", "MessageConfirmMarkAllEpisodesNotFinished": "Tem certeza de que deseja marcar todos os episódios como não concluídos?", + "MessageConfirmMarkItemFinished": "Tem certeza de que deseja marcar \"{0}\" como concluído?", + "MessageConfirmMarkItemNotFinished": "Tem certeza de que deseja marcar \"{0}\" como não concluído?", "MessageConfirmMarkSeriesFinished": "Tem certeza de que deseja marcar todos os livros nesta série como concluídos?", "MessageConfirmMarkSeriesNotFinished": "Tem certeza de que deseja marcar todos os livros nesta série como não concluídos?", + "MessageConfirmNotificationTestTrigger": "Acionar esta notificação com dados de teste?", "MessageConfirmPurgeCache": "Apagar o cache irá apagar o diretório todo localizado em /metadata/cache.

Tem certeza que deseja apagar o diretório de cache?", "MessageConfirmPurgeItemsCache": "Apagar o cache de itens irá apagar todo conteúdo da pasta /metadata/cache/items.
Tem certeza?", "MessageConfirmQuickEmbed": "Aviso! Inclusão rápida não fará backup dos seus arquivos de áudio. Verifique se tem um backup dos seus arquivos de áudio.

Quer continuar?", + "MessageConfirmQuickMatchEpisodes": "A correspondência rápida de episódios sobrescreverá os detalhes se uma correspondência for encontrada. Somente os episódios sem correspondência serão atualizados. Tem certeza?", "MessageConfirmReScanLibraryItems": "Tem certeza de que deseja uma nova verificação de {0} itens?", "MessageConfirmRemoveAllChapters": "Tem certeza de que deseja remover todos os capítulos?", "MessageConfirmRemoveAuthor": "Tem certeza de que deseja remover o autor \"{0}\"?", "MessageConfirmRemoveCollection": "Tem certeza de que deseja remover a coleção \"{0}\"?", "MessageConfirmRemoveEpisode": "Tem certeza de que deseja remover o episódio \"{0}\"?", + "MessageConfirmRemoveEpisodeNote": "Observação: Isso não exclui o arquivo de áudio, a menos que você ative a opção \"Excluir arquivo permanentemente\"", "MessageConfirmRemoveEpisodes": "Tem certeza de que deseja remover os {0} episódios?", "MessageConfirmRemoveListeningSessions": "Tem certeza de que deseja remover as {0} sessões de escuta?", + "MessageConfirmRemoveMetadataFiles": "Tem certeza de que deseja remover todos os arquivos metadata.{0} nas pastas dos itens da sua biblioteca?", "MessageConfirmRemoveNarrator": "Tem certeza de que deseja remover o narrador \"{0}\"?", "MessageConfirmRemovePlaylist": "Tem certeza de que deseja remover a sua lista de reprodução \"{0}\"?", "MessageConfirmRenameGenre": "Tem certeza de que deseja renomear o gênero \"{0}\" para \"{1}\" em todos os itens?", @@ -720,17 +802,25 @@ "MessageConfirmRenameTag": "Tem certeza de que deseja renomear a etiqueta \"{0}\" para \"{1}\" em todos os itens?", "MessageConfirmRenameTagMergeNote": "Aviso: Esta etiqueta já existe então elas serão combinadas.", "MessageConfirmRenameTagWarning": "Atenção! Uma etiqueta com um nome semelhante já existe \"{0}\".", + "MessageConfirmResetProgress": "Tem certeza de que deseja redefinir seu progresso?", "MessageConfirmSendEbookToDevice": "Tem certeza de que deseja enviar {0} ebook(s) \"{1}\" para o dispositivo \"{2}\"?", + "MessageConfirmUnlinkOpenId": "Tem certeza de que deseja desvincular este usuário do OpenID?", + "MessageDaysListenedInTheLastYear": "{0} dias ouvidos no último ano", "MessageDownloadingEpisode": "Realizando o download do episódio", "MessageDragFilesIntoTrackOrder": "Arraste os arquivos para ordenar as trilhas corretamente", + "MessageEmbedFailed": "Falha ao incorporar!", "MessageEmbedFinished": "Inclusão Concluída!", + "MessageEmbedQueue": "Enfileirado para incorporação de metadados ({0} na fila)", "MessageEpisodesQueuedForDownload": "{0} Episódio(s) na fila de download", "MessageEreaderDevices": "Para garantir a entrega dos ebooks, você pode precisar adicionar o endereço de email acima como um remetente válido para cada um dos dispositivos listados abaixo.", "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.", + "MessageHeatmapListeningTimeTooltip": "{0} ouvindo em {1}", + "MessageHeatmapNoListeningSessions": "Nenhuma sessão de reprodução em {0}", "MessageImportantNotice": "Aviso Importante!", "MessageInsertChapterBelow": "Inserir capítulo abaixo", + "MessageInvalidAsin": "ASIN inválido", "MessageItemsSelected": "{0} itens selecionados", "MessageItemsUpdated": "{0} itens atualizados", "MessageJoinUsOn": "Junte-se a nós", @@ -753,6 +843,7 @@ "MessageNoCollections": "Sem Coleções", "MessageNoCoversFound": "Nenhuma Capa Encontrada", "MessageNoDescription": "Sem Descrições", + "MessageNoDevices": "Nenhum dispositivo", "MessageNoDownloadsInProgress": "Não existem downloads em andamento", "MessageNoDownloadsQueued": "Não existem itens na fila de download", "MessageNoEpisodeMatchesFound": "Não existem episódios correspondentes", @@ -766,6 +857,7 @@ "MessageNoLogs": "Sem Logs", "MessageNoMediaProgress": "Sem Progresso de Mídia", "MessageNoNotifications": "Sem Notificações", + "MessageNoPodcastFeed": "Podcast inválido: Sem feed", "MessageNoPodcastsFound": "Nenhum podcast encontrado", "MessageNoResults": "Sem resultados", "MessageNoSearchResultsFor": "Sem resultados para \"{0}\"", @@ -774,13 +866,19 @@ "MessageNoTasksRunning": "Sem Tarefas em Execução", "MessageNoUpdatesWereNecessary": "Nenhuma atualização é necessária", "MessageNoUserPlaylists": "Você não tem listas de reprodução", + "MessageNoUserPlaylistsHelp": "As listas de reprodução são privadas. Somente o usuário que as criou pode vê-las.", "MessageNotYetImplemented": "Ainda não implementado", + "MessageOpmlPreviewNote": "Nota: esta é uma visualização do arquivo OPML processado. O título verdadeiro do podcast será recuperado do feed RSS.", "MessageOr": "ou", "MessagePauseChapter": "Pausar reprodução do capítulo", "MessagePlayChapter": "Escutar o início do capítulo", "MessagePlaylistCreateFromCollection": "Criar uma lista de reprodução a partir da coleção", + "MessagePleaseWait": "Por favor, aguarde...", "MessagePodcastHasNoRSSFeedForMatching": "Podcast não tem uma URL do feed RSS para ser usada na consulta", "MessagePodcastSearchField": "Digite um termo para a busca ou a URL de um feed RSS", + "MessageQuickEmbedInProgress": "Incorporação rápida em andamento", + "MessageQuickEmbedQueue": "Enfileirado para incorporação rápida ({0} na fila)", + "MessageQuickMatchAllEpisodes": "Correspondência Rápida de Todos os Episódios", "MessageQuickMatchDescription": "Preenche detalhes vazios do item & capa com o primeiro resultado de '{0}'. Não sobrescreve detalhes a não ser que a configuração 'Preferir metadados consultados' do servidor esteja ativa.", "MessageRemoveChapter": "Remover capítulo", "MessageRemoveEpisodes": "Remover {0} episódio(s)", @@ -790,12 +888,52 @@ "MessageResetChaptersConfirm": "Tem certeza de que deseja resetar os capítulos e desfazer as alterações realizadas?", "MessageRestoreBackupConfirm": "Tem certeza de que deseja restaurar o backup criado em", "MessageRestoreBackupWarning": "Restaurar um backup sobrescreverá totalmente o banco de dados localizado em /config e as imagens de capa em /metadata/items & /metadata/authors.

Backups não alteram quaisquer arquivos nas pastas da sua biblioteca. Se a configuração do servidor de armazenar a arte da capa e os metadados nas pastas da sua biblioteca estiver ativa, esses itens não estão no backup e não serão sobrescritos.

Todos os clientes usando o seu servidor serão atualizados automaticamente.", + "MessageScheduleLibraryScanNote": "Para a maioria dos usuários, é recomendável deixar este recurso desativado e manter a configuração de monitoramento de pastas ativada. O monitor de pastas detectará automaticamente as alterações nas pastas da sua biblioteca. O monitor de pastas não funciona em todos os sistemas de arquivos (como o NFS), portanto, podem ser usadas verificações agendadas da biblioteca como alternativa.", + "MessageScheduleRunEveryWeekdayAtTime": "Executar a cada {0} às {1}", "MessageSearchResultsFor": "Resultado da busca por", "MessageSelected": "{0} selecionado(s)", + "MessageSeriesSequenceCannotContainSpaces": "O identificador da série não pode conter espaços", "MessageServerCouldNotBeReached": "Não foi possível estabelecer conexão com o servidor", "MessageSetChaptersFromTracksDescription": "Definir os capítulos usando cada arquivo de áudio como um capítulo e o nome do arquivo como o título do capítulo", + "MessageShareExpirationWillBe": "Válido até {0}", + "MessageShareExpiresIn": "Expira em {0}", + "MessageShareURLWillBe": "A URL de compartilhamento será {0}", "MessageStartPlaybackAtTime": "Iniciar a reprodução de \"{0}\" em {1}?", + "MessageTaskAudioFileNotWritable": "O arquivo de áudio \"{0}\" não pode ser gravado", + "MessageTaskCanceledByUser": "Tarefa cancelada pelo usuário", + "MessageTaskDownloadingEpisodeDescription": "Baixando episódio \"{0}\"", + "MessageTaskEmbeddingMetadata": "Incorporação de metadados", + "MessageTaskEmbeddingMetadataDescription": "Incorporando metadados no audiolivro \"{0}\"", + "MessageTaskEncodingM4b": "Codificação M4B", + "MessageTaskEncodingM4bDescription": "Codificação do audiolivro \"{0}\" em um único arquivo m4b", "MessageTaskFailed": "Falhou", + "MessageTaskFailedToBackupAudioFile": "Falha ao fazer backup do arquivo de áudio \"{0}\"", + "MessageTaskFailedToCreateCacheDirectory": "Falha ao criar o diretório de cache", + "MessageTaskFailedToEmbedMetadataInFile": "Falha ao incorporar metadados no arquivo \"{0}\"", + "MessageTaskFailedToMergeAudioFiles": "Falha ao mesclar arquivos de áudio", + "MessageTaskFailedToMoveM4bFile": "Falha ao mover o arquivo m4b", + "MessageTaskFailedToWriteMetadataFile": "Falha ao gravar o arquivo de metadados", + "MessageTaskMatchingBooksInLibrary": "Livros correspondentes na biblioteca \"{0}\"", + "MessageTaskNoFilesToScan": "Não há arquivos para verificar", + "MessageTaskOpmlImport": "Importação OPML", + "MessageTaskOpmlImportDescription": "Criando podcasts a partir de feeds RSS {0}", + "MessageTaskOpmlImportFeed": "Feed de importação OPML", + "MessageTaskOpmlImportFeedDescription": "Importando o feed RSS \"{0}\"", + "MessageTaskOpmlImportFeedFailed": "Não foi possível obter o feed do podcast", + "MessageTaskOpmlImportFeedPodcastDescription": "Criando podcast \"{0}\"", + "MessageTaskOpmlImportFeedPodcastExists": "O podcast já existe no caminho", + "MessageTaskOpmlImportFeedPodcastFailed": "Falha ao criar o podcast", + "MessageTaskOpmlImportFinished": "Adicionados {0} podcasts", + "MessageTaskOpmlParseFailed": "Falha ao analisar o arquivo OPML", + "MessageTaskOpmlParseFastFail": "Arquivo OPML inválido. Tag não encontrada OU tag não encontrada.", + "MessageTaskOpmlParseNoneFound": "Nenhum feed encontrado no arquivo OPML", + "MessageTaskScanItemsAdded": "{0} adicionado", + "MessageTaskScanItemsMissing": "{0} não encontrado", + "MessageTaskScanItemsUpdated": "{0} atualizado", + "MessageTaskScanNoChangesNeeded": "Nenhuma alteração necessária", + "MessageTaskScanningFileChanges": "Verificando alterações de arquivo em \"{0}\"", + "MessageTaskScanningLibrary": "Analisando a biblioteca \"{0}\"", + "MessageTaskTargetDirectoryNotWritable": "Diretório de destino sem permissão de escrita", "MessageThinking": "Pensando...", "MessageUploaderItemFailed": "Falha no upload", "MessageUploaderItemSuccess": "Upload realizado!", @@ -813,6 +951,12 @@ "NoteUploaderFoldersWithMediaFiles": "Pastas com arquivos de mídia serão tratadas como itens de biblioteca distintos.", "NoteUploaderOnlyAudioFiles": "Ao subir apenas arquivos de áudio, cada arquivo será tratado como um audiobook distinto.", "NoteUploaderUnsupportedFiles": "Arquivos não suportados serão ignorados. Ao escolher ou arrastar uma pasta, outros arquivos que não estão em uma pasta dentro do item serão ignorados.", + "NotificationOnBackupCompletedDescription": "Acionado quando um backup é concluído", + "NotificationOnBackupFailedDescription": "Acionado quando um backup falha", + "NotificationOnEpisodeDownloadedDescription": "Acionado quando um episódio de podcast é baixado automaticamente", + "NotificationOnRSSFeedDisabledDescription": "Acionado quando os downloads automáticos de episódios são desativados devido a muitas tentativas falhas", + "NotificationOnRSSFeedFailedDescription": "Acionado quando a solicitação do feed RSS falha durante o download automático de um episódio", + "NotificationOnTestDescription": "Evento para testar o sistema de notificação", "PlaceholderBulkChapterInput": "Digite o título de um capítulo ou use uma numeração (por exemplo, 'Episódio 1', 'Capítulo 10', '1.')", "PlaceholderNewCollection": "Novo nome da coleção", "PlaceholderNewFolderPath": "Novo caminho para a pasta", @@ -821,22 +965,47 @@ "PlaceholderSearchEpisode": "Buscar Episódio..", "StatsAuthorsAdded": "autores adicionados", "StatsBooksAdded": "livros adicionados", + "StatsBooksAdditional": "Algumas adições incluem…", "StatsBooksFinished": "livros concluídos", + "StatsBooksFinishedThisYear": "Alguns livros foram finalizados este ano…", + "StatsBooksListenedTo": "livros ouvidos", + "StatsCollectionGrewTo": "Sua coleção de livros cresceu para…", + "StatsSessions": "sessões", + "StatsSpentListening": "tempo gasto ouvindo", "StatsTopAuthor": "TOP AUTOR", "StatsTopAuthors": "TOP AUTORES", + "StatsTopGenre": "PRINCIPAL GÊNERO", + "StatsTopGenres": "PRINCIPAL GÊNEROS", + "StatsTopMonth": "PRINCIPAL MÊS", + "StatsTopNarrator": "PRINCIPAL NARRADOR", + "StatsTopNarrators": "PRINCIPAIS NARRADORES", + "StatsTotalDuration": "Com duração total de…", + "StatsYearInReview": "RESUMO DO ANO", "ToastAccountUpdateSuccess": "Conta atualizada", "ToastAppriseUrlRequired": "É preciso digitar uma URL Apprise", + "ToastAsinRequired": "É necessário o ASIN", "ToastAuthorImageRemoveSuccess": "Imagem do autor removida", + "ToastAuthorNotFound": "Autor \"{0}\" não encontrado", + "ToastAuthorRemoveSuccess": "Autor removido", + "ToastAuthorSearchNotFound": "Autor não encontrado", "ToastAuthorUpdateMerged": "Autor combinado", "ToastAuthorUpdateSuccess": "Autor atualizado", "ToastAuthorUpdateSuccessNoImageFound": "Autor atualizado (nenhuma imagem encontrada)", + "ToastBackupAppliedSuccess": "Backup aplicado", "ToastBackupCreateFailed": "Falha ao criar backup", "ToastBackupCreateSuccess": "Backup criado", "ToastBackupDeleteFailed": "Falha ao apagar backup", "ToastBackupDeleteSuccess": "Backup apagado", + "ToastBackupInvalidMaxKeep": "Número inválido de backups a serem mantidos", + "ToastBackupInvalidMaxSize": "Tamanho máximo de backup inválido", "ToastBackupRestoreFailed": "Falha ao restaurar backup", "ToastBackupUploadFailed": "Falha no upload do backup", "ToastBackupUploadSuccess": "Upload do backup realizado", + "ToastBatchApplyDetailsToItemsSuccess": "Detalhes aplicados aos itens", + "ToastBatchDeleteFailed": "A exclusão em lote falhou", + "ToastBatchDeleteSuccess": "Exclusão em lote concluída com sucesso", + "ToastBatchQuickMatchFailed": "A correspondência rápida em lote falhou!", + "ToastBatchQuickMatchStarted": "Correspondência rápida em lote de {0} livros iniciada!", "ToastBatchUpdateFailed": "Falha na atualização em lote", "ToastBatchUpdateSuccess": "Atualização em lote realizada", "ToastBookmarkCreateFailed": "Falha ao criar marcador", @@ -845,12 +1014,34 @@ "ToastBulkChapterInvalidCount": "Digite um número entre 1 e 150", "ToastCachePurgeFailed": "Falha ao apagar o cache", "ToastCachePurgeSuccess": "Cache apagado com sucesso", + "ToastChapterLocked": "Capítulo bloqueado.", + "ToastChapterStartTimeAdjusted": "O horário de início do capítulo foi ajustado em {0} segundos", + "ToastChaptersAllLocked": "Todos os capítulos estão bloqueados. Desbloqueie alguns capítulos para alterar seus horários.", "ToastChaptersHaveErrors": "Capítulos com erro", + "ToastChaptersInvalidShiftAmountLast": "Quantidade de deslocamento inválida. O horário de início do último capítulo ultrapassaria a duração deste audiolivro.", + "ToastChaptersInvalidShiftAmountStart": "Valor de deslocamento inválido. O primeiro capítulo teria duração zero ou negativa e seria sobrescrito pelo segundo capítulo. Aumente a duração inicial do segundo capítulo.", "ToastChaptersMustHaveTitles": "Capítulos precisam ter títulos", + "ToastChaptersRemoved": "Capítulos removidos", + "ToastChaptersUpdated": "Capítulos atualizados", + "ToastCollectionItemsAddFailed": "Falha ao adicionar itens à coleção", "ToastCollectionRemoveSuccess": "Coleção removida", "ToastCollectionUpdateSuccess": "Coleção atualizada", + "ToastConnectionNotAvailable": "Conexão indisponível. Tente novamente mais tarde", + "ToastCoverSearchFailed": "A busca pela capa falhou", + "ToastCoverUpdateFailed": "Falha na atualização da capa", + "ToastDateTimeInvalidOrIncomplete": "A data e a hora são inválidas ou estão incompletas", "ToastDeleteFileFailed": "Falha ao apagar arquivo", "ToastDeleteFileSuccess": "Arquivo apagado", + "ToastDeviceAddFailed": "Falha ao adicionar dispositivo", + "ToastDeviceNameAlreadyExists": "Já existe um leitor de ebook com esse nome.", + "ToastDeviceTestEmailFailed": "Falha ao enviar o e-mail de teste", + "ToastDeviceTestEmailSuccess": "E-mail de teste enviado", + "ToastEmailSettingsUpdateSuccess": "Configurações de e-mail atualizadas", + "ToastEncodeCancelFailed": "Falha ao cancelar a codificação", + "ToastEncodeCancelSucces": "Codificação cancelada", + "ToastEpisodeDownloadQueueClearFailed": "Falha ao limpar a fila", + "ToastEpisodeDownloadQueueClearSuccess": "Fila de downloads de episódios limpa", + "ToastEpisodeUpdateSuccess": "{0} episódios atualizados", "ToastFailedToLoadData": "Falha ao carregar dados", "ToastItemCoverUpdateSuccess": "Capa do item atualizada", "ToastItemDetailsUpdateSuccess": "Detalhes do item atualizados", From b83e2836f605d41712aa1ff4bf3bc969ca9accc5 Mon Sep 17 00:00:00 2001 From: Sami Tauseef Date: Sun, 2 Nov 2025 09:48:23 +0100 Subject: [PATCH 014/117] Translated using Weblate (Bengali) Currently translated at 92.6% (1078 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bn/ --- client/strings/bn.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/client/strings/bn.json b/client/strings/bn.json index 5ccab2711..75cf98ee5 100644 --- a/client/strings/bn.json +++ b/client/strings/bn.json @@ -1,5 +1,6 @@ { "ButtonAdd": "যোগ করুন", + "ButtonAddApiKey": "এপিআই কী যোগ করুন", "ButtonAddChapters": "অধ্যায় যোগ করুন", "ButtonAddDevice": "ডিভাইস যোগ করুন", "ButtonAddLibrary": "লাইব্রেরি যোগ করুন", @@ -10,6 +11,8 @@ "ButtonApplyChapters": "অধ্যায় প্রয়োগ করুন", "ButtonAuthors": "লেখকগণ", "ButtonBack": "পেছনে যান", + "ButtonBatchEditPopulateFromExisting": "বিদ্যমান থেকে পূরণ করুন", + "ButtonBatchEditPopulateMapDetails": "ম্যাপ থেকে পূরণ করুন", "ButtonBrowseForFolder": "ফোল্ডারের জন্য ব্রাউজ করুন", "ButtonCancel": "বাতিল করুন", "ButtonCancelEncode": "এনকোড বাতিল করুন", @@ -18,6 +21,7 @@ "ButtonChooseAFolder": "একটি ফোল্ডার চয়ন করুন", "ButtonChooseFiles": "ফাইল চয়ন করুন", "ButtonClearFilter": "ফিল্টার পরিষ্কার করুন", + "ButtonClose": "বন্ধ করুন", "ButtonCloseFeed": "ফিড বন্ধ করুন", "ButtonCloseSession": "খোলা সেশন বন্ধ করুন", "ButtonCollections": "সংগ্রহ", @@ -117,11 +121,13 @@ "HeaderAccount": "অ্যাকাউন্ট", "HeaderAddCustomMetadataProvider": "কাস্টম মেটাডেটা সরবরাহকারী যোগ করুন", "HeaderAdvanced": "অ্যাডভান্সড", + "HeaderApiKeys": "এপিআই কী সমূহ", "HeaderAppriseNotificationSettings": "বিজ্ঞপ্তি সেটিংস অবহিত করুন", "HeaderAudioTracks": "অডিও ট্র্যাকসগুলো", "HeaderAudiobookTools": "অডিওবই ফাইল ম্যানেজমেন্ট টুলস", "HeaderAuthentication": "প্রমাণীকরণ", "HeaderBackups": "ব্যাকআপ", + "HeaderBulkChapterModal": "একাধিক অধ্যায় যোগ করুন", "HeaderChangePassword": "পাসওয়ার্ড পরিবর্তন করুন", "HeaderChapters": "অধ্যায়", "HeaderChooseAFolder": "একটি ফোল্ডার চয়ন করুন", @@ -160,6 +166,7 @@ "HeaderMetadataOrderOfPrecedence": "মেটাডেটা অগ্রাধিকারের ক্রম", "HeaderMetadataToEmbed": "এম্বেড করার জন্য মেটাডেটা", "HeaderNewAccount": "নতুন অ্যাকাউন্ট", + "HeaderNewApiKey": "নতুন API কী", "HeaderNewLibrary": "নতুন লাইব্রেরি", "HeaderNotificationCreate": "বিজ্ঞপ্তি তৈরি করুন", "HeaderNotificationUpdate": "বিজ্ঞপ্তি আপডেট করুন", @@ -175,6 +182,7 @@ "HeaderPlaylist": "প্লেলিস্ট", "HeaderPlaylistItems": "প্লেলিস্ট আইটেম", "HeaderPodcastsToAdd": "যোগ করার জন্য পডকাস্ট", + "HeaderPresets": "প্রিসেট", "HeaderPreviewCover": "কভার ্দেখুন", "HeaderRSSFeedGeneral": "আরএসএস বিবরণ", "HeaderRSSFeedIsOpen": "আরএসএস ফিড খোলা আছে", @@ -192,6 +200,7 @@ "HeaderSettingsExperimental": "পরীক্ষামূলক ফিচার", "HeaderSettingsGeneral": "সাধারণ", "HeaderSettingsScanner": "স্ক্যানার", + "HeaderSettingsSecurity": "নিরাপত্তা", "HeaderSettingsWebClient": "ওয়েব ক্লায়েন্ট", "HeaderSleepTimer": "স্লিপ টাইমার", "HeaderStatsLargestItems": "সবচেয়ে বড় আইটেম", From b0c073dd7ee0f0516c511785a0eb4b20b1d48851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Gon=C3=A7alves=20Jaksys?= Date: Mon, 3 Nov 2025 06:16:47 +0100 Subject: [PATCH 015/117] Translated using Weblate (Hungarian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/ --- client/strings/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/hu.json b/client/strings/hu.json index 61e9316d9..e6d45231f 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -286,7 +286,7 @@ "LabelClickToUseCurrentValue": "Kattintson az aktuális érték használatához", "LabelClosePlayer": "Lejátszó bezárása", "LabelCodec": "Kodek", - "LabelCollapseSeries": "Sorozat összecsukása", + "LabelCollapseSeries": "Sorozatok összecsukása", "LabelCollapseSubSeries": "Alszéria összecsukása", "LabelCollection": "Gyűjtemény", "LabelCollections": "Gyűjtemények", From 9fdda6be628b48f996df3c8d8dfbf42b81f2d18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Gon=C3=A7alves=20Jaksys?= Date: Mon, 3 Nov 2025 06:15:22 +0100 Subject: [PATCH 016/117] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pt_BR/ --- client/strings/pt-br.json | 94 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index 5f207154e..48ce8b9e0 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -741,11 +741,11 @@ "MessageAuthenticationOIDCChangesRestart": "Reinicie o servidor após salvar para aplicar as alterações do OIDC.", "MessageAuthenticationSecurityMessage": "A autenticação foi aprimorada para maior segurança. Todos os usuários precisam fazer login novamente.", "MessageBackupsDescription": "Backups incluem usuários, progresso dos usuários, detalhes dos itens da biblioteca, configurações do servidor e imagens armazenadas em /metadata/items & /metadata/authors. Backups não incluem quaisquer arquivos armazenados nas pastas da sua biblioteca.", - "MessageBackupsLocationEditNote": "Observação: Atualizar o local de backup não moverá nem modificará os backups existentes.", + "MessageBackupsLocationEditNote": "Observação: Atualizar o local de backup não moverá nem modificará os backups existentes", "MessageBackupsLocationNoEditNote": "Observação: o local de backup é definido por meio de uma variável de ambiente e não pode ser alterado aqui.", - "MessageBackupsLocationPathEmpty": "O caminho do local de backup não pode ser vazio.", - "MessageBatchEditPopulateMapDetailsAllHelp": "Preencha os campos habilitados com dados de todos os itens. Os campos com múltiplos valores serão mesclados.", - "MessageBatchEditPopulateMapDetailsItemHelp": "Preencha os campos de detalhes do mapa habilitados com dados deste item.", + "MessageBackupsLocationPathEmpty": "O caminho do local de backup não pode ser vazio", + "MessageBatchEditPopulateMapDetailsAllHelp": "Preencha os campos habilitados com dados de todos os itens. Os campos com múltiplos valores serão mesclados", + "MessageBatchEditPopulateMapDetailsItemHelp": "Preencha os campos de detalhes do mapa habilitados com dados deste item", "MessageBatchQuickMatchDescription": "Consulta Rápida tentará adicionar capas e metadados ausentes para os itens selecionados. Ative as opções abaixo para permitir que a Consulta Rápida sobrescreva capas e/ou metadados existentes.", "MessageBookshelfNoCollections": "Você ainda não criou coleções", "MessageBookshelfNoCollectionsHelp": "As coleções são públicas. Todos os usuários com acesso à biblioteca podem vê-las.", @@ -925,7 +925,7 @@ "MessageTaskOpmlImportFeedPodcastFailed": "Falha ao criar o podcast", "MessageTaskOpmlImportFinished": "Adicionados {0} podcasts", "MessageTaskOpmlParseFailed": "Falha ao analisar o arquivo OPML", - "MessageTaskOpmlParseFastFail": "Arquivo OPML inválido. Tag não encontrada OU tag não encontrada.", + "MessageTaskOpmlParseFastFail": "Arquivo OPML inválido. Tag não encontrada OU tag não encontrada", "MessageTaskOpmlParseNoneFound": "Nenhum feed encontrado no arquivo OPML", "MessageTaskScanItemsAdded": "{0} adicionado", "MessageTaskScanItemsMissing": "{0} não encontrado", @@ -1033,7 +1033,7 @@ "ToastDeleteFileFailed": "Falha ao apagar arquivo", "ToastDeleteFileSuccess": "Arquivo apagado", "ToastDeviceAddFailed": "Falha ao adicionar dispositivo", - "ToastDeviceNameAlreadyExists": "Já existe um leitor de ebook com esse nome.", + "ToastDeviceNameAlreadyExists": "Já existe um leitor de ebook com esse nome", "ToastDeviceTestEmailFailed": "Falha ao enviar o e-mail de teste", "ToastDeviceTestEmailSuccess": "E-mail de teste enviado", "ToastEmailSettingsUpdateSuccess": "Configurações de e-mail atualizadas", @@ -1042,13 +1042,26 @@ "ToastEpisodeDownloadQueueClearFailed": "Falha ao limpar a fila", "ToastEpisodeDownloadQueueClearSuccess": "Fila de downloads de episódios limpa", "ToastEpisodeUpdateSuccess": "{0} episódios atualizados", + "ToastErrorCannotShare": "Não é possível compartilhar nativamente neste dispositivo", + "ToastFailedToCreate": "Falha ao criar", + "ToastFailedToDelete": "Falha ao excluir", "ToastFailedToLoadData": "Falha ao carregar dados", + "ToastFailedToMatch": "Não foi possível encontrar correspondência", + "ToastFailedToShare": "Não foi possível compartilhar", + "ToastFailedToUpdate": "Falha ao atualizar", + "ToastInvalidImageUrl": "URL de imagem inválida", + "ToastInvalidMaxEpisodesToDownload": "Número máximo de episódios para baixar inválido", + "ToastInvalidUrl": "URL inválida", + "ToastInvalidUrls": "Um ou mais URLs são inválidos", "ToastItemCoverUpdateSuccess": "Capa do item atualizada", + "ToastItemDeletedFailed": "Falha ao excluir o item", + "ToastItemDeletedSuccess": "Item excluído", "ToastItemDetailsUpdateSuccess": "Detalhes do item atualizados", "ToastItemMarkedAsFinishedFailed": "Falha ao marcar como Concluído", "ToastItemMarkedAsFinishedSuccess": "Item marcado como Concluído", "ToastItemMarkedAsNotFinishedFailed": "Falha ao marcar como Não Concluído", "ToastItemMarkedAsNotFinishedSuccess": "Item marcado como Não Concluído", + "ToastItemUpdateSuccess": "Item atualizado", "ToastLibraryCreateFailed": "Falha ao criar biblioteca", "ToastLibraryCreateSuccess": "Biblioteca \"{0}\" criada", "ToastLibraryDeleteFailed": "Falha ao apagar biblioteca", @@ -1056,30 +1069,97 @@ "ToastLibraryScanFailedToStart": "Falha ao iniciar verificação", "ToastLibraryScanStarted": "Verificação da biblioteca iniciada", "ToastLibraryUpdateSuccess": "Biblioteca \"{0}\" atualizada", + "ToastMatchAllAuthorsFailed": "Não foi possível encontrar correspondência para todos os autores", + "ToastMetadataFilesRemovedError": "Erro ao remover arquivos de metadados.{0}", + "ToastMetadataFilesRemovedNoneFound": "Nenhum arquivo metadados.{0} encontrado na biblioteca", + "ToastMetadataFilesRemovedNoneRemoved": "Nenhum arquivo metadados.{0} removido", + "ToastMetadataFilesRemovedSuccess": "{0} arquivos metadados.{1} removidos", + "ToastMustHaveAtLeastOnePath": "Deve ter pelo menos um caminho", + "ToastNameEmailRequired": "Nome e e-mail são obrigatórios", + "ToastNameRequired": "O nome é obrigatório", + "ToastNewApiKeyUserError": "É necessário selecionar um usuário", + "ToastNewEpisodesFound": "{0} novos episódios encontrados", + "ToastNewUserCreatedFailed": "Falha ao criar a conta: \"{0}\"", + "ToastNewUserCreatedSuccess": "Nova conta criada", + "ToastNewUserLibraryError": "É necessário selecionar pelo menos uma biblioteca", + "ToastNewUserPasswordError": "É obrigatória a criação de uma senha; somente o usuário root pode ter uma senha vazia", + "ToastNewUserTagError": "É necessário selecionar pelo menos uma etiqueta", "ToastNewUserUsernameError": "Digite um nome de usuário", + "ToastNoNewEpisodesFound": "Nenhum episódio novo encontrado", + "ToastNoRSSFeed": "O Podcast não possui um feed RSS", + "ToastNoUpdatesNecessary": "Nenhuma atualização necessária", + "ToastNotificationCreateFailed": "Falha ao criar notificação", + "ToastNotificationDeleteFailed": "Falha ao excluir a notificação", + "ToastNotificationFailedMaximum": "O número máximo de tentativas falhas deve ser >= 0", + "ToastNotificationQueueMaximum": "A fila máxima de notificações deve ser >= 0", + "ToastNotificationSettingsUpdateSuccess": "Configurações de notificação atualizadas", + "ToastNotificationTestTriggerFailed": "Falha ao acionar a notificação de teste", + "ToastNotificationTestTriggerSuccess": "Notificação de teste acionada", + "ToastNotificationUpdateSuccess": "Notificação atualizada", "ToastPlaylistCreateFailed": "Falha ao criar lista de reprodução", "ToastPlaylistCreateSuccess": "Lista de reprodução criada", "ToastPlaylistRemoveSuccess": "Lista de reprodução removida", "ToastPlaylistUpdateSuccess": "Lista de reprodução atualizada", "ToastPodcastCreateFailed": "Falha ao criar podcast", "ToastPodcastCreateSuccess": "Podcast criado", + "ToastPodcastEpisodeUpdated": "Episódio atualizado", + "ToastPodcastGetFeedFailed": "Não foi possível obter o feed do podcast", + "ToastPodcastNoEpisodesInFeed": "Nenhum episódio encontrado no feed RSS", + "ToastPodcastNoRssFeed": "O podcast não possui um feed RSS", + "ToastProgressIsNotBeingSynced": "O progresso não está sendo sincronizado, reinicie a reprodução", + "ToastProviderCreatedFailed": "Falha ao adicionar o provedor", + "ToastProviderCreatedSuccess": "Novo provedor adicionado", + "ToastProviderNameAndUrlRequired": "Nome e URL obrigatórios", + "ToastProviderRemoveSuccess": "Fornecedor removido", "ToastRSSFeedCloseFailed": "Falha ao fechar feed RSS", "ToastRSSFeedCloseSuccess": "Feed RSS fechado", + "ToastRemoveFailed": "Falha ao remover", "ToastRemoveItemFromCollectionFailed": "Falha ao remover item da coleção", "ToastRemoveItemFromCollectionSuccess": "Item removido da coleção", + "ToastRemoveItemsWithIssuesFailed": "Falha ao remover itens da biblioteca com problemas", + "ToastRemoveItemsWithIssuesSuccess": "Itens da biblioteca com problemas foram removidos", + "ToastRenameFailed": "Falha ao renomear", + "ToastRescanFailed": "Falha na nova verificação para {0}", + "ToastRescanRemoved": "O item foi removido após a digitalização ser concluída", + "ToastRescanUpToDate": "A nova verificação completou o item, que estava atualizado", + "ToastRescanUpdated": "O item foi atualizado após a digitalização", + "ToastScanFailed": "Falha ao digitalizar o item da biblioteca", + "ToastSelectAtLeastOneUser": "Selecione pelo menos um usuário", "ToastSendEbookToDeviceFailed": "Falha ao enviar ebook para dispositivo", "ToastSendEbookToDeviceSuccess": "Ebook enviado para o dispositivo \"{0}\"", + "ToastSeriesSubmitFailedSameName": "Não é possível adicionar duas séries com o mesmo nome", "ToastSeriesUpdateFailed": "Falha ao atualizar série", "ToastSeriesUpdateSuccess": "Série atualizada", "ToastServerSettingsUpdateSuccess": "Configurações do servidor atualizadas", + "ToastSessionCloseFailed": "Falha ao encerrar a sessão", "ToastSessionDeleteFailed": "Falha ao apagar sessão", "ToastSessionDeleteSuccess": "Sessão apagada", + "ToastSleepTimerDone": "Temporizador de sono concluído... zZzzZz", + "ToastSlugMustChange": "O slug possui caracteres inválidos", + "ToastSlugRequired": "Slug é necessário", "ToastSocketConnected": "Socket conectado", "ToastSocketDisconnected": "Socket desconectado", "ToastSocketFailedToConnect": "Falha na conexão do socket", "ToastSortingPrefixesEmptyError": "É preciso ter pelo menos um prefixo de ordenação", "ToastSortingPrefixesUpdateSuccess": "Prefixos de ordenação atualizados ({0} item(ns))", + "ToastTitleRequired": "É necessário ter um título", + "ToastUnknownError": "Erro desconhecido", + "ToastUnlinkOpenIdFailed": "Falha ao desvincular o usuário do OpenID", + "ToastUnlinkOpenIdSuccess": "Usuário desvinculado do OpenID", + "ToastUploaderFilepathExistsError": "O caminho de arquivo \"{0}\" já existe no servidor", + "ToastUploaderItemExistsInSubdirectoryError": "O item \"{0}\" está usando um subdiretório do caminho de upload.", "ToastUserDeleteFailed": "Falha ao apagar usuário", "ToastUserDeleteSuccess": "Usuário apagado", - "ToastUserRootRequireName": "É preciso entrar com um nome de usuário root" + "ToastUserPasswordChangeSuccess": "Senha alterada com sucesso", + "ToastUserPasswordMismatch": "As senhas não coincidem", + "ToastUserPasswordMustChange": "A nova senha não pode ser igual à senha antiga", + "ToastUserRootRequireName": "É preciso entrar com um nome de usuário root", + "TooltipAddChapters": "Adicionar capítulo(s)", + "TooltipAddOneSecond": "Adicionar 1 segundo", + "TooltipAdjustChapterStart": "Clique para ajustar a hora de início", + "TooltipLockAllChapters": "Bloquear todos os capítulos", + "TooltipLockChapter": "Bloquear capítulo (Shift+clique para selecionar o intervalo)", + "TooltipSubtractOneSecond": "Subtrair 1 segundo", + "TooltipUnlockAllChapters": "Desbloqueie todos os capítulos", + "TooltipUnlockChapter": "Desbloquear capítulo (Shift + clique para selecionar o intervalo)" } From a0137fcb428b285fd1ea1c3b81a24fdca2f5d386 Mon Sep 17 00:00:00 2001 From: phewi Date: Mon, 3 Nov 2025 20:43:04 +0100 Subject: [PATCH 017/117] Translated using Weblate (Finnish) Currently translated at 95.5% (1111 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/ --- client/strings/fi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/fi.json b/client/strings/fi.json index 6e2999bd5..4b43c9ec4 100644 --- a/client/strings/fi.json +++ b/client/strings/fi.json @@ -535,7 +535,7 @@ "LabelReadAgain": "Lue uudelleen", "LabelReadEbookWithoutProgress": "Lue s-kirja tallentamatta edistymistietoja", "LabelRecentSeries": "Viimeisimmät sarjat", - "LabelRecentlyAdded": "Viimeeksi lisätyt", + "LabelRecentlyAdded": "Viimeksi lisätyt", "LabelRecommended": "Suositeltu", "LabelRedo": "Tee uudelleen", "LabelRegion": "Alue", From 40783c8644e3a60c91c8de86e04946d962d4e34f Mon Sep 17 00:00:00 2001 From: Charlie Date: Thu, 6 Nov 2025 03:47:22 +0100 Subject: [PATCH 018/117] Translated using Weblate (French) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/ --- client/strings/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index e90cd73a2..b560bfc06 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -744,7 +744,7 @@ "MessageBackupsLocationEditNote": "Remarque : Mettre à jour l'emplacement de sauvegarde ne déplacera pas ou ne modifiera pas les sauvegardes existantes", "MessageBackupsLocationNoEditNote": "Remarque : l’emplacement de sauvegarde est défini via une variable d’environnement et ne peut pas être modifié ici.", "MessageBackupsLocationPathEmpty": "L'emplacement de secours ne peut pas être vide", - "MessageBatchEditPopulateMapDetailsAllHelp": "Remplir les champs disponibles avec les données de tous les éléments. Les champs avec des valeurs multiples seront fusionnés.", + "MessageBatchEditPopulateMapDetailsAllHelp": "Renseignez les champs activés avec les données de tous les éléments. Les champs comportant plusieurs valeurs seront fusionnés.", "MessageBatchEditPopulateMapDetailsItemHelp": "Renseigner les champs de la carte active avec les informations de cet élément", "MessageBatchQuickMatchDescription": "La recherche par correspondance rapide tentera d’ajouter les couvertures et métadonnées manquantes pour les éléments sélectionnés. Activez les options ci-dessous pour permettre la Recherche par correspondance d’écraser les couvertures et/ou métadonnées existantes.", "MessageBookshelfNoCollections": "Vous n’avez pas encore de collections", @@ -1026,7 +1026,7 @@ "ToastCollectionItemsAddFailed": "Échec de l’ajout de(s) élément(s) à la collection", "ToastCollectionRemoveSuccess": "Collection supprimée", "ToastCollectionUpdateSuccess": "Collection mise à jour", - "ToastConnectionNotAvailable": "Connexion indisponible. Essayez plus tard", + "ToastConnectionNotAvailable": "Connexion indisponible. Veuillez réessayer plus tard.", "ToastCoverSearchFailed": "La recherche de la couverture a échoué", "ToastCoverUpdateFailed": "Échec de la mise à jour de la couverture", "ToastDateTimeInvalidOrIncomplete": "La date et l'heure sont invalides ou incomplètes", From ab9b798bfa7191a4457d09d50b7f36b1b8aa935d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Sat, 8 Nov 2025 08:22:15 +0100 Subject: [PATCH 019/117] Translated using Weblate (Finnish) Currently translated at 97.2% (1131 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/ --- client/strings/fi.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/client/strings/fi.json b/client/strings/fi.json index 4b43c9ec4..421d5df43 100644 --- a/client/strings/fi.json +++ b/client/strings/fi.json @@ -245,6 +245,7 @@ "LabelApiKeyCreated": "API avain \"{0}\" luotu onnistuneesti.", "LabelApiKeyCreatedDescription": "Varmista, että kopioit API avaimen. Sitä ei näytetä enää tämän jälkeen.", "LabelApiKeyUser": "Toimi käyttäjän puolesta", + "LabelApiKeyUserDescription": "Tällä API-avaimella on samat käyttöoikeudet kuin käyttäjällä, jonka puolesta se toimii. Tämä näkyy lokeissa samalla tavalla kuin jos käyttäjä itse tekisi pyynnön.", "LabelApiToken": "Sovellusliittymätunnus", "LabelAppend": "Lisää loppuun", "LabelAudioBitrate": "Äänen bittinopeus (esim. 128k)", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Poista tiedostojärjestelmästä (poista merkintä, jos haluat poistaa vain tietokannasta)", "LabelDescription": "Kuvaus", "LabelDeselectAll": "Poista valinta kaikista", + "LabelDetectedPattern": "Tunnista malli:", "LabelDevice": "Laite", "LabelDeviceInfo": "Laitteen tiedot", "LabelDeviceIsAvailableTo": "Laite on saatavilla...", @@ -357,6 +359,10 @@ "LabelExample": "Esimerkki", "LabelExpandSeries": "Laajenna sarja", "LabelExpandSubSeries": "Laajenna alisarja", + "LabelExpired": "Vanhentunut", + "LabelExpiresAt": "Vanhentuu", + "LabelExpiresInSeconds": "Vanhentuu (sekunnissa)", + "LabelExpiresNever": "Ei koskaan", "LabelExplicit": "Sopimaton", "LabelExplicitChecked": "Yksiselitteinen (valittu)", "LabelExplicitUnchecked": "Ei yksiselitteinen (ei valittu)", @@ -372,6 +378,7 @@ "LabelFilterByUser": "Suodata käyttäjien perusteella", "LabelFindEpisodes": "Etsi jaksoja", "LabelFinished": "Valmis", + "LabelFinishedDate": "Valmis {0}", "LabelFolder": "Kansio", "LabelFolders": "Kansiot", "LabelFontBold": "Lihavoitu", @@ -416,6 +423,7 @@ "LabelLanguages": "Kielet", "LabelLastBookAdded": "Viimeisin lisätty kirja", "LabelLastBookUpdated": "Viimeisin päivitetty kirja", + "LabelLastProgressDate": "Viimeisin edistyminen {0}", "LabelLastSeen": "Nähty viimeksi", "LabelLastTime": "Viimeinen kerta", "LabelLastUpdate": "Viimeisin päivitys", @@ -428,6 +436,9 @@ "LabelLibraryFilterSublistEmpty": "Ei {0}", "LabelLibraryItem": "Kirjaston kohde", "LabelLibraryName": "Kirjaston nimi", + "LabelLibrarySortByProgress": "Edistyminen: Viimeksi päivitetty", + "LabelLibrarySortByProgressFinished": "Edistyminen: Valmis", + "LabelLibrarySortByProgressStarted": "Edistyminen: Aloitettu", "LabelLimit": "Raja", "LabelLineSpacing": "Riviväli", "LabelListenAgain": "Kuuntele uudelleen", @@ -436,6 +447,7 @@ "LabelLogLevelWarn": "Varoitus", "LabelLookForNewEpisodesAfterDate": "Etsi uusia jaksoja tämän päivämäärän jälkeen", "LabelLowestPriority": "Vähiten tärkeä", + "LabelMatchConfidence": "Varmuus", "LabelMatchExistingUsersBy": "Vastaa olemassa olevia käyttäjiä mukaan", "LabelMatchExistingUsersByDescription": "Käytetään olemassa olevien käyttäjien yhdistämiseen. Kun yhteys on muodostettu, käyttäjät saavat yksilöllisen tunnuksen SSO-palveluntarjoajaltasi", "LabelMaxEpisodesToDownload": "Jaksojen maksimilatausmäärä. 0 poistaa rajoituksen.", @@ -465,7 +477,9 @@ "LabelNewestAuthors": "Uusimmat tekijät", "LabelNewestEpisodes": "Uusimmat jaksot", "LabelNextBackupDate": "Seuraava varmuuskopiointipäivämäärä", + "LabelNextChapters": "Seuraavat luvut:", "LabelNextScheduledRun": "Seuraava ajastettu suorittaminen", + "LabelNoApiKeys": "Ei API-avaimia", "LabelNoCustomMetadataProviders": "Ei mukautettuja kuvailutietojen toimittajia", "LabelNoEpisodesSelected": "Jaksoja ei ole valittu", "LabelNotFinished": "Ei valmis", @@ -481,6 +495,7 @@ "LabelNotificationsMaxQueueSize": "Ilmoitustapahtumajonon enimmäispituus", "LabelNotificationsMaxQueueSizeHelp": "Tapahtumat on rajoitettu ampumaan yksi sekunnissa. Tapahtumat ohitetaan, jos jono on enimmäiskoko. Tämä estää ilmoitusten roskapostin.", "LabelNumberOfBooks": "Kirjojen määrä", + "LabelNumberOfChapters": "Lukujen lukumäärä:", "LabelNumberOfEpisodes": "# jaksoja", "LabelOpenIDAdvancedPermsClaimDescription": "OpenID-vaatimuksen nimi, joka sisältää lisäoikeudet sovelluksen käyttäjän toimiin, joita sovelletaan muihin kuin järjestelmänvalvojan rooleihin (jos määritetty). Jos vaatimus puuttuu vastauksesta, pääsy ABS:iin evätään. Jos yksittäinen vaihtoehto puuttuu, sitä käsitellään false-arvona. Varmista, että identiteetin tarjoajan vaatimus vastaa odotettua rakennetta:", "LabelOpenIDClaims": "Jätä seuraavat vaihtoehdot tyhjiksi, jos haluat poistaa edistyneen ryhmän ja lupien määrityksen käytöstä ja määrittää sitten automaattisesti käyttäjäryhmän.", @@ -555,6 +570,7 @@ "LabelSelectAll": "Valitse kaikki", "LabelSelectAllEpisodes": "Valitse kaikki jaksot", "LabelSelectEpisodesShowing": "Valitse {0} näytettävää jaksoa", + "LabelSelectUser": "Valitse käyttäjä", "LabelSelectUsers": "Valitse käyttäjät", "LabelSendEbookToDevice": "Lähetä s-kirja kohteeseen...", "LabelSequence": "Sekvenssi", @@ -622,6 +638,7 @@ "LabelStartTime": "Aloitusaika", "LabelStarted": "Aloitettu", "LabelStartedAt": "Aloitettu", + "LabelStartedDate": "Aloitettu {0}", "LabelStatsAudioTracks": "Ääniraidat", "LabelStatsAuthors": "Tekijät", "LabelStatsBestDay": "Paras päivä", @@ -651,6 +668,7 @@ "LabelTheme": "Teema", "LabelThemeDark": "Tumma", "LabelThemeLight": "Kirkas", + "LabelThemeSepia": "Seepia", "LabelTimeBase": "Aika-alusta", "LabelTimeDurationXHours": "{0} tuntia", "LabelTimeDurationXMinutes": "{0} minuuttia", @@ -718,6 +736,8 @@ "LabelYourProgress": "Edistymisesi", "MessageAddToPlayerQueue": "Lisää soittimen jonoon", "MessageAppriseDescription": "Käyttääksesi tätä toimintoa tarvitset Apprise API -instanssin tai rajapinnan joka käsittelee samoja pyyntöjä.
Apprise rajapinnan osoite tulee olla täysi URL polku ilmoituksen lähetykseen, esim. jos rajapinta on osoitteessa http://192.168.1.1:8337,niin arvoksi tulee antaa http://192.168.1.1:8337/notify.", + "MessageAsinCheck": "Varmista, että käytät ASIN-tunnusta oikealta Audible-alueelta, ei Amazonista.", + "MessageAuthenticationLegacyTokenWarning": "Vanhat API-tunnukset poistetaan tulevaisuudessa. Käytä sen sijaan API-avaimia.", "MessageBackupsDescription": "Varmuuskopiot sisältävät käyttäjät, käyttäjien edistymisen, kirjastokohteiden tiedot, palvelinasetukset ja /metadata/items- ja /metadata/authors -kansioihin tallennetut kuvat. Varmuuskopiot eivät sisällä kirjastosi kansioihin tallennettuja tiedostoja.", "MessageBackupsLocationEditNote": "Huomautus: Varmuuskopion sijainnin päivittäminen ei siirrä tai muokkaa olemassa olevia varmuuskopioita", "MessageBackupsLocationNoEditNote": "Huomautus: Varmuuskopion sijainti asetetaan ympäristömuuttujan kautta, eikä sitä voi muuttaa tässä.", From c75d976320df532129ef19efa7ce0a581dee822a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dinu=20B=C4=83lan?= Date: Fri, 7 Nov 2025 17:33:11 +0100 Subject: [PATCH 020/117] Translated using Weblate (Romanian) Currently translated at 17.3% (202 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ro/ --- client/strings/ro.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/strings/ro.json b/client/strings/ro.json index c6628bd7d..f6e8977ef 100644 --- a/client/strings/ro.json +++ b/client/strings/ro.json @@ -4,7 +4,11 @@ "ButtonAddChapters": "Adaugă Capitole", "ButtonAddDevice": "Adaugă Dispozitiv", "ButtonAddLibrary": "Adaugă Librărie", + "ButtonAddPodcasts": "Adaugă Podcasturi", "ButtonAddUser": "Adaugă Utilizator", + "ButtonAddYourFirstLibrary": "Adaugă prima librărie", + "ButtonApply": "Aplică", + "ButtonApplyChapters": "Aplică Capitole", "ButtonAuthors": "Autori", "ButtonBack": "Înapoi", "ButtonCancel": "Anulează", From a05cb170a2bc13fa65d8916dbf88f4b9c7d4abcc Mon Sep 17 00:00:00 2001 From: biuklija Date: Tue, 11 Nov 2025 06:46:16 +0100 Subject: [PATCH 021/117] Translated using Weblate (Croatian) Currently translated at 99.9% (1162 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/ --- client/strings/hr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/hr.json b/client/strings/hr.json index c5cbf66e1..42987527c 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Skeumorfni dizajn sa drvenim policama", "LabelSettingsChromecastSupport": "Podrška za Chromecast", "LabelSettingsDateFormat": "Format datuma", - "LabelSettingsEnableWatcher": "Automatski pretražuj ima li promjena u knjižnicama", - "LabelSettingsEnableWatcherForLibrary": "Automatski traži promjene u knjižnicama", + "LabelSettingsEnableWatcher": "Automatski prati ima li promjena u knjižnicama", + "LabelSettingsEnableWatcherForLibrary": "Automatski prati promjene u knjižnicama", "LabelSettingsEnableWatcherHelp": "Omogućuje automatsko dodavanje/ažuriranje stavki kada se uoče izmjene datoteka. *Potrebno je ponovno pokretanje poslužitelja", "LabelSettingsEpubsAllowScriptedContent": "Omogući skripte u epub datotekama", "LabelSettingsEpubsAllowScriptedContentHelp": "Omogućuje epub datotekama izvođenje skripti. Preporučamo isključiti ovu mogućnost ukoliko nemate povjerenja u izvore epub datoteka.", From 9eda4e36fa3b699e5ae594674729ff23b752b2c1 Mon Sep 17 00:00:00 2001 From: Lucas Jaksys Date: Tue, 11 Nov 2025 23:51:52 +0100 Subject: [PATCH 022/117] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pt_BR/ --- client/strings/pt-br.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index 48ce8b9e0..9c8754c44 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Tem certeza de que deseja resetar os capítulos e desfazer as alterações realizadas?", "MessageRestoreBackupConfirm": "Tem certeza de que deseja restaurar o backup criado em", "MessageRestoreBackupWarning": "Restaurar um backup sobrescreverá totalmente o banco de dados localizado em /config e as imagens de capa em /metadata/items & /metadata/authors.

Backups não alteram quaisquer arquivos nas pastas da sua biblioteca. Se a configuração do servidor de armazenar a arte da capa e os metadados nas pastas da sua biblioteca estiver ativa, esses itens não estão no backup e não serão sobrescritos.

Todos os clientes usando o seu servidor serão atualizados automaticamente.", - "MessageScheduleLibraryScanNote": "Para a maioria dos usuários, é recomendável deixar este recurso desativado e manter a configuração de monitoramento de pastas ativada. O monitor de pastas detectará automaticamente as alterações nas pastas da sua biblioteca. O monitor de pastas não funciona em todos os sistemas de arquivos (como o NFS), portanto, podem ser usadas verificações agendadas da biblioteca como alternativa.", + "MessageScheduleLibraryScanNote": "Para a maioria dos usuários, é recomendável deixar este recurso desativado e manter a configuração \"Monitorar automaticamente alterações na biblioteca\" ativada. Dessa forma alterações nas pastas da sua biblioteca serão automáticamente detectadas. Habilite essa opção se \"Monitorar automaticamente alterações na biblioteca\" não fucnionara para o seu sistema de arquivos (Como NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Executar a cada {0} às {1}", "MessageSearchResultsFor": "Resultado da busca por", "MessageSelected": "{0} selecionado(s)", From 61b72aff9d73d9c8a22228cbb05177e4060b1a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Tue, 11 Nov 2025 20:23:03 +0100 Subject: [PATCH 023/117] Translated using Weblate (Ukrainian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/ --- client/strings/uk.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/strings/uk.json b/client/strings/uk.json index fbb736f6d..32546fe03 100644 --- a/client/strings/uk.json +++ b/client/strings/uk.json @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Імітує вигляд дерев'яних полиць", "LabelSettingsChromecastSupport": "Підтримка Chromecast", "LabelSettingsDateFormat": "Формат дати", - "LabelSettingsEnableWatcher": "Автоматично сканувати бібліотеки на наявність змін", - "LabelSettingsEnableWatcherForLibrary": "Автоматично сканувати бібліотеку на наявність змін", + "LabelSettingsEnableWatcher": "Автоматично відстежувати зміни в бібліотеках", + "LabelSettingsEnableWatcherForLibrary": "Автоматично відстежувати зміни в бібліотеці", "LabelSettingsEnableWatcherHelp": "Вмикає автоматичне додавання/оновлення елементів, коли спостерігаються зміни файлів. *Потребує перезавантаження сервера", "LabelSettingsEpubsAllowScriptedContent": "Дозволити JavaScript-вміст у epub", "LabelSettingsEpubsAllowScriptedContentHelp": "Дозволяти epub-файлам виконувати код. Вмикайте цей параметр лише якщо ви довіряєте джерелу epub-файлів.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Ви впевнені, що хочете скинути глави та скасувати внесені зміни?", "MessageRestoreBackupConfirm": "Ви впевнені, що хочете відновити резервну копію, створену", "MessageRestoreBackupWarning": "Відновлення резервної копії перезапише всю базу даних у /config і зображення обкладинок у /metadata/items та /metadata/authors.

Резервні копії не змінюють файли у теках бібліотеки. Якщо у налаштуваннях сервера увімкнено збереження обкладинок і метаданих у теках бібліотеки, вони не створюються під час резервного копіювання і не перезаписуються.

Всі клієнти, що користуються вашим сервером, будуть автоматично оновлені.", - "MessageScheduleLibraryScanNote": "Для більшості користувачів рекомендується залишити цю функцію вимкненою та залишити параметр перегляду папок увімкненим. Засіб спостереження за папками автоматично виявить зміни в папках вашої бібліотеки. Засіб спостереження за папками не працює для кожної файлової системи (наприклад, NFS), тому замість нього можна використовувати сканування бібліотек за розкладом.", + "MessageScheduleLibraryScanNote": "Для більшості користувачів рекомендується відключити цю функцію та підтримувати налаштування \"Автоматично переглядати бібліотеку для змін\" - вона автоматично виявить зміни в ваших папках бібліотеки. Звісніть цю функцію, якщо для вашої файлової системи (наприклад, NFS) не працює \"Автоматично переглядати бібліотеку.", "MessageScheduleRunEveryWeekdayAtTime": "Запуск кожні {0} о {1}", "MessageSearchResultsFor": "Результати пошуку для", "MessageSelected": "Вибрано: {0}", From 38dd1beff7298b7933101db945279a972f7025f4 Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Tue, 11 Nov 2025 02:44:46 +0100 Subject: [PATCH 024/117] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 361a74613..b7e4eac30 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "带有木架子的拟物化设计", "LabelSettingsChromecastSupport": "Chromecast 支持", "LabelSettingsDateFormat": "日期格式", - "LabelSettingsEnableWatcher": "自动扫描库以查找更改", - "LabelSettingsEnableWatcherForLibrary": "自动扫描库以查找更改", + "LabelSettingsEnableWatcher": "自动检测媒体库变化", + "LabelSettingsEnableWatcherForLibrary": "自动检测媒体库变化", "LabelSettingsEnableWatcherHelp": "当检测到文件更改时, 启用项目的自动添加/更新. *需要重新启动服务器", "LabelSettingsEpubsAllowScriptedContent": "允许 epubs 中包含脚本内容", "LabelSettingsEpubsAllowScriptedContentHelp": "允许 epub 文件执行脚本. 建议将此设置保持禁用, 除非你信任 epub 文件的来源.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "你确定要重置章节并撤消你所做的更改吗?", "MessageRestoreBackupConfirm": "你确定要恢复创建的这个备份", "MessageRestoreBackupWarning": "恢复备份将覆盖位于 /config 的整个数据库并覆盖 /metadata/items & /metadata/authors 中的图像.

备份不会修改媒体库文件夹中的任何文件. 如果你已启用服务器设置将封面和元数据存储在库文件夹中,则不会备份或覆盖这些内容.

将自动刷新使用服务器的所有客户端.", - "MessageScheduleLibraryScanNote": "对于大多数用户, 建议禁用此功能并保持文件夹监视程序设置启用. 文件夹监视程序将自动检测库文件夹中的更改. 文件夹监视程序不适用于每个文件系统 (如 NFS), 因此可以使用计划库扫描.", + "MessageScheduleLibraryScanNote": "对于大多数用户, 建议保持此功能关闭并启用 \"自动检测媒体库变化\" 选项, 它会自动检测媒体库文件夹中的更改. 如果 \"自动检测媒体库变化\" 在你的文件系统 (例如 NFS) 上无法正常工作, 请启用此功能.", "MessageScheduleRunEveryWeekdayAtTime": "每 {0} 的 {1} 执行", "MessageSearchResultsFor": "搜索结果", "MessageSelected": "{0} 已选择", From cd295c03cafe02b5f959a0d09512d63fe2ecd9c4 Mon Sep 17 00:00:00 2001 From: thehijacker Date: Tue, 11 Nov 2025 06:08:49 +0100 Subject: [PATCH 025/117] Translated using Weblate (Slovenian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/ --- client/strings/sl.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/strings/sl.json b/client/strings/sl.json index adcccb80c..962ccaa80 100644 --- a/client/strings/sl.json +++ b/client/strings/sl.json @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Skeuomorfna oblika z lesenimi policami", "LabelSettingsChromecastSupport": "Podpora za Chromecast", "LabelSettingsDateFormat": "Oblika datuma", - "LabelSettingsEnableWatcher": "Samodejno preglej knjižnice za spremembe", - "LabelSettingsEnableWatcherForLibrary": "Samodejno preglej knjižnico za spremembe", + "LabelSettingsEnableWatcher": "Samodejno preišči knjižnice za spremembe", + "LabelSettingsEnableWatcherForLibrary": "Samodejno preišči knjižnico za spremembe", "LabelSettingsEnableWatcherHelp": "Omogoča samodejno dodajanje/posodabljanje elementov, ko so zaznane spremembe datoteke. *Potreben je ponovni zagon strežnika", "LabelSettingsEpubsAllowScriptedContent": "Dovoli skriptirano vsebino v epubih", "LabelSettingsEpubsAllowScriptedContentHelp": "Dovoli datotekam epub izvajanje skript. Priporočljivo je, da to nastavitev pustite onemogočeno, razen če zaupate viru datotek epub.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Ali ste prepričani, da želite ponastaviti poglavja in razveljaviti spremembe, ki ste jih naredili?", "MessageRestoreBackupConfirm": "Ali ste prepričani, da želite obnoviti varnostno kopijo, ustvarjeno ob", "MessageRestoreBackupWarning": "Obnovitev varnostne kopije bo prepisala celotno zbirko podatkov, ki se nahaja v /config, in zajema slike v /metadata/items in /metadata/authors.

Varnostne kopije ne spreminjajo nobenih datotek v mapah vaše knjižnice. Če ste omogočili nastavitve strežnika za shranjevanje naslovnic in metapodatkov v mapah vaše knjižnice, potem ti niso varnostno kopirani ali prepisani.

Vsi odjemalci, ki uporabljajo vaš strežnik, bodo samodejno osveženi.", - "MessageScheduleLibraryScanNote": "Za večino uporabnikov je priporočljivo, da to funkcijo pustite onemogočeno in ohranite nastavitev pregledovalnika map omogočeno. Pregledovalnik map bo samodejno zaznal spremembe v mapah vaše knjižnice. Pregledovalnik map ne deluje za vse datotečne sisteme (na primer NFS), zato lahko namesto tega uporabite načrtovane preglede knjižnic.", + "MessageScheduleLibraryScanNote": "Za večino uporabnikov je priporočljivo, da to funkcijo pustijo onemogočeno in ohranijo nastavitev »Samodejno spremljaj knjižnico za spremembe« omogočeno – samodejno bo zaznala spremembe v mapah vaše knjižnice. Omogočite to funkcijo, če »Samodejno spremljaj knjižnico za spremembe« ne deluje za vaš datotečni sistem (kot je NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Zaženi vsakih {0} ob {1}", "MessageSearchResultsFor": "Rezultati iskanja za", "MessageSelected": "{0} izbrano", @@ -1026,6 +1026,8 @@ "ToastCollectionItemsAddFailed": "Dodajanje elementov v zbirko ni uspelo", "ToastCollectionRemoveSuccess": "Zbirka je bila odstranjena", "ToastCollectionUpdateSuccess": "Zbirka je bila posodobljena", + "ToastConnectionNotAvailable": "Povezava ni na voljo. Poskusite znova pozneje", + "ToastCoverSearchFailed": "Iskanje naslovnice ni uspelo", "ToastCoverUpdateFailed": "Posodobitev naslovnice ni uspela", "ToastDateTimeInvalidOrIncomplete": "Datum in čas sta neveljavna ali nepopolna", "ToastDeleteFileFailed": "Brisanje datoteke ni uspelo", From d460757df42b006d4b608848ec854ea09c63bd4a Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Thu, 13 Nov 2025 16:45:10 +0100 Subject: [PATCH 026/117] Translated using Weblate (Croatian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/ --- client/strings/hr.json | 230 ++++++++++++++++++++--------------------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/client/strings/hr.json b/client/strings/hr.json index 42987527c..f22feb656 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -11,8 +11,8 @@ "ButtonApplyChapters": "Primijeni poglavlja", "ButtonAuthors": "Autori", "ButtonBack": "Natrag", - "ButtonBatchEditPopulateFromExisting": "Popuni iz postojećeg", - "ButtonBatchEditPopulateMapDetails": "Popuni mapirane pojedinosti", + "ButtonBatchEditPopulateFromExisting": "Popuni iz postojećih", + "ButtonBatchEditPopulateMapDetails": "Popuni detalje karte", "ButtonBrowseForFolder": "Pronađi mapu", "ButtonCancel": "Odustani", "ButtonCancelEncode": "Otkaži kodiranje", @@ -83,7 +83,7 @@ "ButtonRemoveAllLibraryItems": "Ukloni sve stavke iz knjižnice", "ButtonRemoveFromContinueListening": "Ukloni iz Nastavi slušati", "ButtonRemoveFromContinueReading": "Ukloni iz Nastavi čitati", - "ButtonRemoveSeriesFromContinueSeries": "Ukloni seriju iz Nastavi seriju", + "ButtonRemoveSeriesFromContinueSeries": "Ukloni serijal iz popisa „Nastavi serijal”", "ButtonReset": "Poništi", "ButtonResetToDefault": "Vrati na početne postavke", "ButtonRestore": "Vraćanje", @@ -107,17 +107,17 @@ "ButtonSubmit": "Pošalji", "ButtonTest": "Test", "ButtonUnlinkOpenId": "Prekini vezu s OpenID-jem", - "ButtonUpload": "Učitaj", - "ButtonUploadBackup": "Učitaj sigurnosnu kopiju", - "ButtonUploadCover": "Učitaj naslovnicu", - "ButtonUploadOPMLFile": "Učitaj OPML datoteku", + "ButtonUpload": "Prenesi", + "ButtonUploadBackup": "Prenesi sigurnosnu kopiju", + "ButtonUploadCover": "Prenesi naslovnicu", + "ButtonUploadOPMLFile": "Prenesi OPML datoteku", "ButtonUserDelete": "Izbriši korisnika {0}", "ButtonUserEdit": "Uredi korisnika {0}", "ButtonViewAll": "Prikaži sve", "ButtonYes": "Da", - "ErrorUploadFetchMetadataAPI": "Pogreška pri dohvatu meta-podataka", - "ErrorUploadFetchMetadataNoResults": "Dohvat meta-podataka nije uspio - pokušajte ispraviti naslov i/ili autora", - "ErrorUploadLacksTitle": "Naslov je obavezan", + "ErrorUploadFetchMetadataAPI": "Pogreška pri dohvaćanju meta-podataka", + "ErrorUploadFetchMetadataNoResults": "Nije bilo moguće dohvatiti meta-podatake – pokušajte aktualizirati naslov i/ili autora", + "ErrorUploadLacksTitle": "Mora imati naslov", "HeaderAccount": "Korisnički račun", "HeaderAddCustomMetadataProvider": "Dodaj prilagođenog pružatelja meta-podataka", "HeaderAdvanced": "Napredno", @@ -134,7 +134,7 @@ "HeaderCollection": "Zbirka", "HeaderCollectionItems": "Stavke u zbirci", "HeaderCover": "Naslovnica", - "HeaderCurrentDownloads": "Preuzimanja u tijeku", + "HeaderCurrentDownloads": "Trenutačna preuzimanja", "HeaderCustomMessageOnLogin": "Prilagođena poruka prilikom prijave", "HeaderCustomMetadataProviders": "Prilagođeni pružatelji meta-podataka", "HeaderDetails": "Pojedinosti", @@ -197,7 +197,7 @@ "HeaderSetBackupSchedule": "Zakazivanje sigurnosne pohrane", "HeaderSettings": "Postavke", "HeaderSettingsDisplay": "Prikaz", - "HeaderSettingsExperimental": "Eksperimentalne značajke", + "HeaderSettingsExperimental": "Eksperimentalne funkcije", "HeaderSettingsGeneral": "Općenito", "HeaderSettingsScanner": "Skener", "HeaderSettingsSecurity": "Sigurnost", @@ -257,7 +257,7 @@ "LabelAuthors": "Autori", "LabelAutoDownloadEpisodes": "Automatski preuzmi nastavke", "LabelAutoFetchMetadata": "Automatski dohvati meta-podatke", - "LabelAutoFetchMetadataHelp": "Dohvaća meta-podatke o naslovu, autoru i serijalu kako bi pojednostavnio učitavanje. Dodatni meta-podatci će se možda morati dohvatiti nakon učitavanja.", + "LabelAutoFetchMetadataHelp": "Dohvaća meta-podatke o naslovu, autoru i serijalu kako bi pojednostavnio prijenos. Dodatni meta-podatci će se možda morati usporediti nakon prijenosa.", "LabelAutoLaunch": "Automatsko pokretanje", "LabelAutoLaunchDescription": "Automatski preusmjeri na pružatelja autentifikacijskih usluga prilikom otvaranja stranice za prijavu (putanja za ručno zaobilaženje opcije /login?autoLaunch=0)", "LabelAutoRegister": "Automatska registracija", @@ -286,8 +286,8 @@ "LabelClickToUseCurrentValue": "Kliknite za trenutnu vrijednost", "LabelClosePlayer": "Zatvori reproduktor", "LabelCodec": "Kodek", - "LabelCollapseSeries": "Serijale prikaži sažeto", - "LabelCollapseSubSeries": "Podserijale prikaži sažeto", + "LabelCollapseSeries": "Sažmi serijal", + "LabelCollapseSubSeries": "Sažmi podserijale", "LabelCollection": "Zbirka", "LabelCollections": "Zbirke", "LabelComplete": "Potpuno", @@ -303,7 +303,7 @@ "LabelCronExpression": "Cron izraz", "LabelCurrent": "Trenutan", "LabelCurrently": "Trenutno:", - "LabelCustomCronExpression": "Prilagođeni CRON izraz:", + "LabelCustomCronExpression": "Prilagođeni cron izraz:", "LabelDatetime": "Datum i vrijeme", "LabelDays": "Dani", "LabelDeleteFromFileSystemCheckbox": "Izbriši datoteke (uklonite kvačicu ako stavku želite izbrisati samo iz baze podataka)", @@ -312,7 +312,7 @@ "LabelDetectedPattern": "Prepoznat obrazac:", "LabelDevice": "Uređaj", "LabelDeviceInfo": "O uređaju", - "LabelDeviceIsAvailableTo": "Uređaj je dostupan...", + "LabelDeviceIsAvailableTo": "Uređaj je dostupan za...", "LabelDirectory": "Direktorij", "LabelDiscFromFilename": "Disk iz imena datoteke", "LabelDiscFromMetadata": "Disk iz metapodataka", @@ -340,7 +340,7 @@ "LabelEncodingBackupLocation": "Sigurnosna kopija vaših izvornih zvučnih datoteka čuvat će se u mapi:", "LabelEncodingChaptersNotEmbedded": "Poglavlja se ne ugrađuju u zvučne knjige koje se sastoje od više zvučnih zapisa.", "LabelEncodingClearItemCache": "Svakako redovito praznite predmemoriju stavki.", - "LabelEncodingFinishedM4B": "Stvorene M4B datoteke spremit će se u vašu mapu sa zvučnim knjigama:", + "LabelEncodingFinishedM4B": "Gotove M4B datoteke spremit će se u vašu mapu sa zvučnim knjigama:", "LabelEncodingInfoEmbedded": "Meta-podatci će se ugraditi u zvučne zapise u vašoj mapi sa zvučnim knjigama.", "LabelEncodingStartedNavigation": "Nakon pokretanja zadatka možete napustiti ovu stranicu.", "LabelEncodingTimeWarning": "Kodiranje može potrajati do 30 minuta.", @@ -357,8 +357,8 @@ "LabelEpisodes": "Nastavci", "LabelEpisodic": "U nastavcima", "LabelExample": "Primjer", - "LabelExpandSeries": "Serijal prikaži prošireno", - "LabelExpandSubSeries": "Podserijal prikaži prošireno", + "LabelExpandSeries": "Proširi serijal", + "LabelExpandSubSeries": "Proširi podserijal", "LabelExpired": "Istekao", "LabelExpiresAt": "Istječe", "LabelExpiresInSeconds": "Istječe za (sekundi)", @@ -374,7 +374,7 @@ "LabelFileBornDate": "Stvoreno {0}", "LabelFileModified": "Datoteka izmijenjena", "LabelFileModifiedDate": "Izmijenjeno {0}", - "LabelFilename": "Naziv datoteke", + "LabelFilename": "Ime datoteke", "LabelFilterByUser": "Filtriraj po korisniku", "LabelFindEpisodes": "Pronađi nastavke", "LabelFinished": "Završeno", @@ -394,7 +394,7 @@ "LabelHardDeleteFile": "Izbriši datoteku zauvijek", "LabelHasEbook": "Ima e-knjigu", "LabelHasSupplementaryEbook": "Ima dopunsku e-knjigu", - "LabelHideSubtitles": "Skrij podnaslove", + "LabelHideSubtitles": "Sakrij podnaslove", "LabelHighestPriority": "Najviši prioritet", "LabelHost": "Poslužitelj", "LabelHour": "Sat", @@ -402,7 +402,7 @@ "LabelIcon": "Ikona", "LabelImageURLFromTheWeb": "URL slike s weba", "LabelInProgress": "U tijeku", - "LabelIncludeInTracklist": "Uključi u popisu zvučnih zapisa", + "LabelIncludeInTracklist": "Uključi u popis zvučnih zapisa", "LabelIncomplete": "Nepotpuno", "LabelInterval": "Interval", "LabelIntervalCustomDailyWeekly": "Prilagođeno dnevno/tjedno", @@ -437,7 +437,7 @@ "LabelLibraryItem": "Stavka knjižnice", "LabelLibraryName": "Ime knjižnice", "LabelLibrarySortByProgress": "Napredak: zadnje ažurirano", - "LabelLibrarySortByProgressFinished": "Napredak: dovršeno", + "LabelLibrarySortByProgressFinished": "Napredak: završeno", "LabelLibrarySortByProgressStarted": "Napredak: započeto", "LabelLimit": "Ograničenje", "LabelLineSpacing": "Razmak između redaka", @@ -451,8 +451,8 @@ "LabelMatchExistingUsersBy": "Prepoznaj postojeće korisnike pomoću", "LabelMatchExistingUsersByDescription": "Rabi se za povezivanje postojećih korisnika. Nakon što se spoje, korisnike se prepoznaje temeljem jedinstvene oznake vašeg pružatelja SSO usluga", "LabelMaxEpisodesToDownload": "Najveći broj nastavaka za preuzimanje. 0 za neograničeno.", - "LabelMaxEpisodesToDownloadPerCheck": "Najviše novih nastavaka za preuzimanje po provjeri", - "LabelMaxEpisodesToKeep": "Najviše nastavaka za čuvanje", + "LabelMaxEpisodesToDownloadPerCheck": "Najveći broj novih nastavaka za preuzimanje po provjeri", + "LabelMaxEpisodesToKeep": "Najveći broj nastavaka za čuvanje", "LabelMaxEpisodesToKeepHelp": "Ako je vrijednost 0, nema ograničenja broja. Nakon automatskog preuzimanja novog nastavka ova funkcija briše najstariji nastavak ako ih ima više od zadanog broja. Ovo briše samo jedan nastavak po novom preuzetom nastavku.", "LabelMediaPlayer": "Reproduktor medijskih sadržaja", "LabelMediaType": "Vrsta medija", @@ -482,7 +482,7 @@ "LabelNoApiKeys": "Nema API ključeva", "LabelNoCustomMetadataProviders": "Nema prilagođenih pružatelja meta-podataka", "LabelNoEpisodesSelected": "Nema odabranih nastavaka", - "LabelNotFinished": "Nije dovršeno", + "LabelNotFinished": "Nezavršeno", "LabelNotStarted": "Nije započeto", "LabelNotes": "Bilješke", "LabelNotificationAppriseURL": "Apprise URL(ovi)", @@ -497,9 +497,9 @@ "LabelNumberOfBooks": "Broj knjiga", "LabelNumberOfChapters": "Broj poglavljâ:", "LabelNumberOfEpisodes": "broj nastavaka", - "LabelOpenIDAdvancedPermsClaimDescription": "Naziv OpenID zahtjeva koji sadrži napredna dopuštenja za korisničke radnje u aplikaciji koje će se primijeniti na ne-administratorske uloge (ako su konfigurirane). Ako zahtjev nedostaje u odgovoru, pristup ABS-u neće se odobriti. Ako i jedna opcija nedostaje, smatrat će se da je false. Pripazite da zahtjev pružatelja identiteta uvijek odgovara očekivanoj strukturi:", + "LabelOpenIDAdvancedPermsClaimDescription": "Ime OpenID zahtjeva koji sadrži napredna dopuštenja za korisničke radnje u aplikaciji koje će se primijeniti na ne-administratorske uloge (ako su konfigurirane). Ako zahtjev nedostaje u odgovoru, pristup ABS-u će se odbiti. Ako jedna opcija nedostaje, smatrat će se da je false. Pripazite da zahtjev pružatelja identiteta uvijek odgovara očekivanoj strukturi:", "LabelOpenIDClaims": "Sljedeće opcije ostavite praznima ako želite onemogućiti napredno dodjeljivanje grupa i dozvola, odnosno ako želite automatski dodijeliti grupu 'korisnik'.", - "LabelOpenIDGroupClaimDescription": "Naziv OpenID zahtjeva koji sadrži popis korisnikovih grupa. Često se naziva groups. Ako se konfigurira, aplikacija će automatski dodijeliti uloge temeljem korisnikovih članstava u grupama, pod uvjetom da se iste zovu 'admin', 'user' ili 'guest' u zahtjevu (ne razlikuju se velika i mala slova). Zahtjev treba sadržavati popis i ako je korisnik član više grupa, aplikacija će dodijeliti ulogu koja odgovara najvišoj razini pristupa. Ukoliko se niti jedna grupa ne podudara, pristup će biti onemogućen.", + "LabelOpenIDGroupClaimDescription": "Ime OpenID zahtjeva koji sadrži popis grupa korisnika. Često se zove groups. Ako se konfigurira, aplikacija će automatski dodijeliti uloge temeljem korisničkih članstava u grupama, pod uvjetom da se iste zovu 'admin', 'user' ili 'guest' u zahtjevu (ne razlikuju se velika i mala slova). Zahtjev treba sadržavati popis i ako je korisnik član više grupa, aplikacija će dodijeliti ulogu koja odgovara najvišoj razini pristupa. Ukoliko se niti jedna grupa ne podudara, pristup će se odbiti.", "LabelOpenRSSFeed": "Otvori RSS Feed", "LabelOverwrite": "Prepiši", "LabelPaginationPageXOfY": "Stranica {0} od {1}", @@ -513,7 +513,7 @@ "LabelPermissionsDelete": "Smije brisati", "LabelPermissionsDownload": "Smije preuzimati", "LabelPermissionsUpdate": "Smije ažurirati", - "LabelPermissionsUpload": "Smije učitavati", + "LabelPermissionsUpload": "Smije prenositi", "LabelPersonalYearReview": "Vaš godišnji pregled ({0})", "LabelPhotoPathURL": "Putanja ili URL fotografije", "LabelPlayMethod": "Način reprodukcije", @@ -545,11 +545,11 @@ "LabelRSSFeedSlug": "Slug RSS izvora", "LabelRSSFeedURL": "URL RSS izvora", "LabelRandomly": "Nasumično", - "LabelReAddSeriesToContinueListening": "Ponovno dodaj serijal u Nastavi slušati", + "LabelReAddSeriesToContinueListening": "Ponovo dodaj serijal u „Nastavi slušati”", "LabelRead": "Čitaj", "LabelReadAgain": "Ponovno čitaj", "LabelReadEbookWithoutProgress": "Čitaj e-knjige bez praćenja napretka", - "LabelRecentSeries": "Najnoviji serijali", + "LabelRecentSeries": "Nedavni serijali", "LabelRecentlyAdded": "Nedavno dodano", "LabelRecommended": "Preporučeno", "LabelRedo": "Ponovi", @@ -572,7 +572,7 @@ "LabelSelectEpisodesShowing": "Prikazujem {0} odabranih nastavaka", "LabelSelectUser": "Odaberite korisnika", "LabelSelectUsers": "Označi korisnike", - "LabelSendEbookToDevice": "Pošalji e-knjigu …", + "LabelSendEbookToDevice": "Pošalji e-knjigu na…", "LabelSequence": "Slijed", "LabelSerial": "Serijal", "LabelSeries": "Serijal", @@ -588,36 +588,36 @@ "LabelSettingsBookshelfViewHelp": "Skeumorfni dizajn sa drvenim policama", "LabelSettingsChromecastSupport": "Podrška za Chromecast", "LabelSettingsDateFormat": "Format datuma", - "LabelSettingsEnableWatcher": "Automatski prati ima li promjena u knjižnicama", - "LabelSettingsEnableWatcherForLibrary": "Automatski prati promjene u knjižnicama", + "LabelSettingsEnableWatcher": "Automatski prati promjene u knjižnicama", + "LabelSettingsEnableWatcherForLibrary": "Automatski prati promjene u knjižnici", "LabelSettingsEnableWatcherHelp": "Omogućuje automatsko dodavanje/ažuriranje stavki kada se uoče izmjene datoteka. *Potrebno je ponovno pokretanje poslužitelja", "LabelSettingsEpubsAllowScriptedContent": "Omogući skripte u epub datotekama", "LabelSettingsEpubsAllowScriptedContentHelp": "Omogućuje epub datotekama izvođenje skripti. Preporučamo isključiti ovu mogućnost ukoliko nemate povjerenja u izvore epub datoteka.", - "LabelSettingsExperimentalFeatures": "Eksperimentalne značajke", - "LabelSettingsExperimentalFeaturesHelp": "Značajke u razvoju za koje trebamo vaše povratne informacije i pomoć u testiranju. Kliknite za otvaranje rasprave na githubu.", + "LabelSettingsExperimentalFeatures": "Eksperimentalne funkcije", + "LabelSettingsExperimentalFeaturesHelp": "Funkcije u razvoju za koje trebamo vaše povratne informacije i pomoć u testiranju. Kliknite za otvaranje rasprave na githubu.", "LabelSettingsFindCovers": "Pronađi naslovnice", "LabelSettingsFindCoversHelp": "Ako vaša zvučna knjiga nema ugrađenu naslovnicu ili sliku naslovnice u mapi, skener će pokušati pronaći naslovnicu.
Napomena: ovo će produžiti trajanje skeniranja", - "LabelSettingsHideSingleBookSeries": "Skrij serijale sa samo jednom knjigom", + "LabelSettingsHideSingleBookSeries": "Sakrij serijale sa samo jednom knjigom", "LabelSettingsHideSingleBookSeriesHelp": "Serijali koji se sastoje od samo jedne knjige neće se prikazivati na stranici serijala i na policama početne stranice.", "LabelSettingsHomePageBookshelfView": "Prikaži početnu stranicu kao policu s knjigama", "LabelSettingsLibraryBookshelfView": "Prikaži knjižnicu kao policu s knjigama", - "LabelSettingsLibraryMarkAsFinishedPercentComplete": "Postotak dovršenosti veći od", - "LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Preostalo vrijeme je manje od (sekundi)", - "LabelSettingsLibraryMarkAsFinishedWhen": "Označi medij dovršenim kada", + "LabelSettingsLibraryMarkAsFinishedPercentComplete": "Postotak završenosti je veći od", + "LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Preostalo vrijeme je manje od (sekunde)", + "LabelSettingsLibraryMarkAsFinishedWhen": "Označi medij kao završen kada", "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Preskoči ranije knjige u funkciji Nastavi serijal", - "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Na polici početne stranice Nastavi serijal prikazuje se prva nezapočeta knjiga serijala koji imaju barem jednu dovršenu knjigu i nijednu započetu knjigu. Ako se ova opcija uključi serijal će nastaviti od zadnje dovršene knjige umjesto od prve nezapočete knjige.", + "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Na polici početne stranice Nastavi serijal prikazuje se prva nezapočeta knjiga serijala koji imaju barem jednu završenu knjigu i nijednu započetu knjigu. Ako se ova opcija uključi serijal će nastaviti od zadnje završene knjige umjesto od prve nezapočete knjige.", "LabelSettingsParseSubtitles": "Raščlani podnaslove", - "LabelSettingsParseSubtitlesHelp": "Iz naziva mape zvučne knjige raščlanjuje podnaslov.
Podnaslov mora biti odvojen s \" - \"
npr. \"Naslov knjige - Ovo je podnaslov\" imat će podnaslov \"Ovo je podnaslov\"", + "LabelSettingsParseSubtitlesHelp": "Raščlani podnaslove iz imena mape zvučne knjige.
Podnaslov mora biti odvojen sa \" - \"
npr. \"Naslov knjige - Ovo je podnaslov\" imat će podnaslov \"Ovo je podnaslov\"", "LabelSettingsPreferMatchedMetadata": "Daj prednost meta-podatcima prepoznatih stavki", - "LabelSettingsPreferMatchedMetadataHelp": "Podatci prepoznatog naslova nadjačat će postojeće informacije kod korištenja funkcije Brzog prepoznavanja. Zadana funkcionalnost je da Brzo prepoznavanje samo dopuni podatke koji nedostaju.", + "LabelSettingsPreferMatchedMetadataHelp": "Podatci prepoznatog naslova će nadjačati postojeće informacije pri korištenju funkcije „Brzo prepoznavanje”. Zadana funkcionalnost je da „Brzo prepoznavanje” samo doda nedostajuće podatke.", "LabelSettingsSkipMatchingBooksWithASIN": "Preskoči prepoznavanje knjiga koje već imaju ASIN", "LabelSettingsSkipMatchingBooksWithISBN": "Preskoči prepoznavanje knjiga koje već imaju ISBN", "LabelSettingsSortingIgnorePrefixes": "Zanemari prefikse kod sortiranja", "LabelSettingsSortingIgnorePrefixesHelp": "npr. za prefiks \"the\" naslov knjige \"The Book Title\" sortirat će se \"Book Title, The\"", "LabelSettingsSquareBookCovers": "Koristi pravokutne naslovnice knjiga", "LabelSettingsSquareBookCoversHelp": "Koristi pravokutne naslovnice umjesto uobičajenih naslovnica omjera 1,6:1", - "LabelSettingsStoreCoversWithItem": "Spremi naslovnice uz stavke", - "LabelSettingsStoreCoversWithItemHelp": "Naslovnice se obično spremaju u /metadata/items, ako uključite ovu opciju naslovnice će se spremati u mapu knjižničke stavke. Čuva se samo jedna datoteka naziva \"cover\"", + "LabelSettingsStoreCoversWithItem": "Spremi naslovnice sa stavkom", + "LabelSettingsStoreCoversWithItemHelp": "Naslovnice se obično spremaju u /metadata/items. Uključivanjem ove opcije naslovnice će se spremati u mapu stavki vaše knjižnice. Čuva se samo jedna datoteka s imenom \"cover\"", "LabelSettingsStoreMetadataWithItem": "Spremi metapodatke uz stavku", "LabelSettingsStoreMetadataWithItemHelp": "Meta-podatci se obično spremaju u /metadata/items; ako uključite ovu postavku meta-podatci će se čuvati u mapama knjižničkih stavki", "LabelSettingsTimeFormat": "Format vremena", @@ -647,7 +647,7 @@ "LabelStatsDaysListened": "Dana slušano", "LabelStatsHours": "Sati", "LabelStatsInARow": "uzastopno", - "LabelStatsItemsFinished": "Dovršenih stavki", + "LabelStatsItemsFinished": "Završene stavke", "LabelStatsItemsInLibrary": "Stavke u knjižnici", "LabelStatsMinutes": "minute", "LabelStatsMinutesListening": "Minuta odslušano", @@ -706,12 +706,12 @@ "LabelUpdateDetails": "Ažuriraj pojedinosti", "LabelUpdateDetailsHelp": "Dopusti prepisivanje postojećih podataka za odabrane knjige kada se prepoznaju", "LabelUpdatedAt": "Ažurirano", - "LabelUploaderDragAndDrop": "Pritisni i prevuci datoteke ili mape", - "LabelUploaderDragAndDropFilesOnly": "Pritisni i prevuci datoteke", + "LabelUploaderDragAndDrop": "Povuci i ispusti datoteke ili mape", + "LabelUploaderDragAndDropFilesOnly": "Povuci i ispusti datoteke", "LabelUploaderDropFiles": "Ispusti datoteke", "LabelUploaderItemFetchMetadataHelp": "Automatski dohvati naslov, autora i serijal", - "LabelUseAdvancedOptions": "Koristi se naprednim opcijama", - "LabelUseChapterTrack": "Upravljaj trakom poglavlja", + "LabelUseAdvancedOptions": "Koristi napredne opcije", + "LabelUseChapterTrack": "Koristi zvučni zapis poglavlja", "LabelUseFullTrack": "Koristi cijeli zvučni zapis", "LabelUseZeroForUnlimited": "0 za neograničeno", "LabelUser": "Korisnik", @@ -735,12 +735,12 @@ "LabelYourPlaylists": "Vaši popisi za izvođenje", "LabelYourProgress": "Vaš napredak", "MessageAddToPlayerQueue": "Dodaj u redoslijed izvođenja", - "MessageAppriseDescription": "Da biste se koristili ovom značajkom, treba vam instanca Apprise API-ja ili API koji može rukovati istom vrstom zahtjeva.
The Adresa Apprise API-ja treba biti puna URL putanja za slanje obavijesti, npr. ako vam se API instanca poslužuje na adresi http://192.168.1.1:8337 trebate upisati http://192.168.1.1:8337/notify.", + "MessageAppriseDescription": "Za korištnje ove funkcije, treba vam instanca Apprise API-ja ili API koji može rukovati istom vrstom zahtjeva.
URL Apprise API-ja mora biti potpuna URL putanja za slanje obavijesti, npr. ako vam se API instanca poslužuje na adresi http://192.168.1.1:8337 morate upisati http://192.168.1.1:8337/notify.", "MessageAsinCheck": "Upišite ASIN iz odgovarajuće Audibleove regije, ne s Amazonov.", "MessageAuthenticationLegacyTokenWarning": "Starije API tokene ćemo ukloniti. Umjesto njih, koristite se API ključevima .", "MessageAuthenticationOIDCChangesRestart": "Ponovno pokrenite poslužitelj da biste primijenili OIDC promjene.", "MessageAuthenticationSecurityMessage": "Provjera autentičnosti poboljšana je radi sigurnosti. Svi se korisnici moraju ponovno prijaviti.", - "MessageBackupsDescription": "Sigurnosne kopije sadrže korisnike, korisnikov napredak medija, pojedinosti knjižničke građe, postavke poslužitelja i slike koje se spremaju u /metadata/items & /metadata/authors. Sigurnosne kopije ne sadrže niti jednu datoteku iz mapa knjižnice.", + "MessageBackupsDescription": "Sigurnosne kopije sadrže korisnike, napredak korisnika, pojedinosti knjižničke građe, postavke poslužitelja i slike koje se spremaju u /metadata/items i /metadata/authors. Sigurnosne kopije ne sadrže niti jednu datoteku iz mapa knjižnice.", "MessageBackupsLocationEditNote": "Napomena: Uređivanje lokacije za sigurnosne kopije ne premješta ili mijenja postojeće sigurnosne kopije", "MessageBackupsLocationNoEditNote": "Napomena: Lokacija za sigurnosne kopije zadana je kroz varijablu okoline i ovdje se ne može izmijeniti.", "MessageBackupsLocationPathEmpty": "Putanja do lokacije za sigurnosne kopije ne može ostati prazna", @@ -760,7 +760,7 @@ "MessageChapterErrorStartLtPrev": "Netočno vrijeme početka, mora biti veće ili jednako vremenu početka prethodnog poglavlja", "MessageChapterStartIsAfter": "Početak poglavlja je nakon kraja zvučne knjige", "MessageChaptersNotFound": "Poglavlja nisu pronađena", - "MessageCheckingCron": "Provjeravam cron...", + "MessageCheckingCron": "Provjeravanje cron izraza...", "MessageConfirmCloseFeed": "Sigurno želite zatvoriti ovaj izvor?", "MessageConfirmDeleteApiKey": "Sigurno želite izbrisati API ključ \"{0}\"?", "MessageConfirmDeleteBackup": "Sigurno želite izbrisati sigurnosnu kopiju za {0}?", @@ -774,12 +774,12 @@ "MessageConfirmDeleteSession": "Sigurno želite izbrisati ovu sesiju?", "MessageConfirmEmbedMetadataInAudioFiles": "Sigurno želite ugraditi meta-podatke u {0} zvučnih datoteka?", "MessageConfirmForceReScan": "Sigurno želite ponovno pokrenuti skeniranje?", - "MessageConfirmMarkAllEpisodesFinished": "Sigurno želite označiti sve nastavke dovršenima?", - "MessageConfirmMarkAllEpisodesNotFinished": "Sigurno želite označiti sve nastavke nedovršenima?", - "MessageConfirmMarkItemFinished": "Sigurno želite označiti \"{0}\" dovršenim?", - "MessageConfirmMarkItemNotFinished": "Sigurno želite označiti \"{0}\" nedovršenim?", - "MessageConfirmMarkSeriesFinished": "Sigurno želite označiti sve knjige u ovom serijalu dovršenima?", - "MessageConfirmMarkSeriesNotFinished": "Sigurno želite označiti sve knjige u ovom serijalu nedovršenima?", + "MessageConfirmMarkAllEpisodesFinished": "Sigurno želite označiti sve nastavke kao završene?", + "MessageConfirmMarkAllEpisodesNotFinished": "Sigurno želite označiti sve nastavke kao nezavršene?", + "MessageConfirmMarkItemFinished": "Sigurno želite označiti stavku \"{0}\" kao završenu?", + "MessageConfirmMarkItemNotFinished": "Sigurno želite označiti stavku \"{0}\" kao nezavršenu?", + "MessageConfirmMarkSeriesFinished": "Sigurno želite označiti sve knjige u ovom serijalu kao završene?", + "MessageConfirmMarkSeriesNotFinished": "Sigurno želite označiti sve knjige u ovom serijalu kao nezavršene?", "MessageConfirmNotificationTestTrigger": "Želite li okinuti ovu obavijest s probnim podatcima?", "MessageConfirmPurgeCache": "Brisanje predmemorije izbrisat će cijelu mapu /metadata/cache.

Sigurno želite izbrisati mapu predmemorije?", "MessageConfirmPurgeItemsCache": "Brisanje predmemorije stavki izbrisat će cijelu mapu /metadata/cache/items.
Jeste li sigurni?", @@ -807,14 +807,14 @@ "MessageConfirmUnlinkOpenId": "Sigurno želite odspojiti ovog korisnika s OpenID-ja?", "MessageDaysListenedInTheLastYear": "{0} dana slušanja u posljednjih godinu dana", "MessageDownloadingEpisode": "Preuzimam nastavak", - "MessageDragFilesIntoTrackOrder": "Prevlačenjem datoteka složite pravilan redoslijed", + "MessageDragFilesIntoTrackOrder": "Povlači datoteke u ispravan redoslijed", "MessageEmbedFailed": "Ugrađivanje nije uspjelo!", - "MessageEmbedFinished": "Ugrađivanje je dovršeno!", + "MessageEmbedFinished": "Ugrađivanje je završeno!", "MessageEmbedQueue": "Ugrađivanje meta-podataka dodano u red obrade ({0} u redu)", "MessageEpisodesQueuedForDownload": "{0} nastavak(a) u redu za preuzimanje", "MessageEreaderDevices": "Da biste osigurali isporuku e-knjiga, možda ćete morati gornju adresu e-pošte dodati kao dopuštenog pošiljatelja za svaki od donjih uređaja.", "MessageFeedURLWillBe": "URL izvora bit će {0}", - "MessageFetching": "Dohvaćam...", + "MessageFetching": "Dohvaćanje...", "MessageForceReScanDescription": "će ponovno skenirati sve datoteke kao nove datoteke. ID3 tagovi zvučnih datoteka, OPF datoteke i tekstualne datoteke skenirat će se kao da su nove.", "MessageHeatmapListeningTimeTooltip": "{0} sluša na {1}", "MessageHeatmapNoListeningSessions": "Nema sesija slušanja na {0}", @@ -824,27 +824,27 @@ "MessageItemsSelected": "{0} odabranih stavki", "MessageItemsUpdated": "{0} stavki ažurirano", "MessageJoinUsOn": "Pridruži nam se na", - "MessageLoading": "Učitavam...", - "MessageLoadingFolders": "Učitavam mape...", + "MessageLoading": "Učitavanje...", + "MessageLoadingFolders": "Učitavanje mape...", "MessageLogsDescription": "Zapisnici se čuvaju u /metadata/logs u obliku JSON datoteka. Zapisnici pada sustava čuvaju se u datoteci /metadata/logs/crash_logs.txt.", - "MessageM4BFailed": "M4B neuspješan!", - "MessageM4BFinished": "M4B završio!", - "MessageMapChapterTitles": "Mapiraj nazive poglavlja postojećim poglavljima zvučne knjige bez uređivanja vremenskih identifikatora", - "MessageMarkAllEpisodesFinished": "Označi sve nastavke dovršenima", - "MessageMarkAllEpisodesNotFinished": "Označi sve nastavke nedovršenima", - "MessageMarkAsFinished": "Označi kao dovršeno", - "MessageMarkAsNotFinished": "Označi kao nedovršeno", - "MessageMatchBooksDescription": "će pokušati prepoznati knjige iz knjižnice u katalogu odabranog pružatelja podatka te nadopuniti podatke koji nedostaju i naslovnice. Ne prepisuje preko postojećih podataka.", + "MessageM4BFailed": "M4B datoteka neuspjela!", + "MessageM4BFinished": "M4B datoteka je završena!", + "MessageMapChapterTitles": "Mapiraj imana poglavlja s vašim postojećim poglavljima zvučne knjige bez podešavanja vremenskih identifikatora", + "MessageMarkAllEpisodesFinished": "Označi sve nastavke kao završene", + "MessageMarkAllEpisodesNotFinished": "Označi sve nastavke kao nezavršene", + "MessageMarkAsFinished": "Označi kao završeno", + "MessageMarkAsNotFinished": "Označi kao nezavršeno", + "MessageMatchBooksDescription": "će pokušati prepoznati knjige iz knjižnice u katalogu odabranog pružatelja podatka te nadopuniti podatke koji nedostaju i naslovnice. Ne prepisuje postojeće podatke.", "MessageNoAudioTracks": "Nema zvučnih zapisa", "MessageNoAuthors": "Nema autora", "MessageNoBackups": "Nema sigurnosnih kopija", "MessageNoBookmarks": "Nema knjižnih oznaka", "MessageNoChapters": "Nema poglavlja", "MessageNoCollections": "Nema zbirki", - "MessageNoCoversFound": "Naslovnice nisu pronađene", + "MessageNoCoversFound": "Nije pronađena nijedna naslovnica", "MessageNoDescription": "Nema opisa", "MessageNoDevices": "Nema uređaja", - "MessageNoDownloadsInProgress": "Nema preuzimanja u tijeku", + "MessageNoDownloadsInProgress": "Trenutačno nema preuzimanja u tijeku", "MessageNoDownloadsQueued": "Nema preuzimanja u redu", "MessageNoEpisodeMatchesFound": "Nije pronađen ni jedan odgovarajući nastavak", "MessageNoEpisodes": "Nema nastavaka", @@ -873,28 +873,28 @@ "MessagePauseChapter": "Pauziraj reprodukciju poglavlja", "MessagePlayChapter": "Slušaj početak poglavlja", "MessagePlaylistCreateFromCollection": "Stvori popis za izvođenje od zbirke", - "MessagePleaseWait": "Molimo pričekajte...", + "MessagePleaseWait": "Pričekajte...", "MessagePodcastHasNoRSSFeedForMatching": "Podcast nema adresu RSS izvora za prepoznavanje", "MessagePodcastSearchField": "Upišite izraz za pretraživanje ili URL RSS izvora", "MessageQuickEmbedInProgress": "Brzo ugrađivanje u tijeku", "MessageQuickEmbedQueue": "Dodano u red za brzo ugrađivanje ({0} u redu izvođenja)", "MessageQuickMatchAllEpisodes": "Brzo prepoznavanje svih nastavaka", - "MessageQuickMatchDescription": "Popuni pojedinosti i naslovnice koji nedostaju prvim pronađenim rezultatom za '{0}'. Ne prepisuje podatke osim ako ne uključite mogućnost 'Daj prednost meta-podatcima prepoznatih stavki'.", + "MessageQuickMatchDescription": "Popuni pojedinosti i naslovnice koji nedostaju prvim pronađenim rezultatom za '{0}'. Ne prepisuje podatke osim ako je postavka poslužitelja „Daj prednost meta-podatcima prepoznatih stavki” uključena.", "MessageRemoveChapter": "Ukloni poglavlje", "MessageRemoveEpisodes": "Ukloni {0} nastavaka", "MessageRemoveFromPlayerQueue": "Ukloni iz redoslijeda izvođenja", "MessageRemoveUserWarning": "Sigurno želite trajno izbrisati korisnika \"{0}\"?", - "MessageReportBugsAndContribute": "Prijavite pogreške, zatražite značajke i doprinesite na", + "MessageReportBugsAndContribute": "Prijavite pogreške, zatražite funkcije i doprinesite na", "MessageResetChaptersConfirm": "Sigurno želite vratiti poglavlja na prethodno stanje i poništiti učinjene promjene?", "MessageRestoreBackupConfirm": "Sigurno želite vratiti sigurnosnu kopiju izrađenu", "MessageRestoreBackupWarning": "Vraćanjem sigurnosne kopije prepisat ćete cijelu bazu podataka koja se nalazi u /config i slike naslovnice u /metadata/items i /metadata/authors.

Sigurnosne kopije ne mijenjaju datoteke koje se nalaze u mapama vaših knjižnica. Ako ste u postavkama poslužitelja uključili mogućnost spremanja naslovnica i meta-podataka u mape knjižnice, te se datoteke neće niti sigurnosno pohraniti niti prepisati.

Svi klijenti koji se spajaju na vaš poslužitelj automatski će se osvježiti.", - "MessageScheduleLibraryScanNote": "Za većinu korisnika se preporučuje ostaviti ovu funkciju deaktiviranom i ostaviti postavku promatrača mape aktiviranom. Promatrač mapa će automatski otkriti promjene u mapama vaše knjižnice. Promatrač mapa ne radi na svakom datotečnom sustavu (kao što je NFS) pa se umjesto njega mogu koristiti planirana pretraživanja knjižnice.", + "MessageScheduleLibraryScanNote": "Za većinu korisnika se preporučuje ostaviti ovu funkciju deaktiviranom kao i fukciju „Automatski prati promjene u knjižnici” koja automatski otkriva promjene u mapama vaše knjižnice. Fukcija „Automatski prati promjene u knjižnici” ne radi na svakom datotečnom sustavu (kao što je NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Pokreni svaki {0} u {1}", "MessageSearchResultsFor": "Rezultati pretrage za", "MessageSelected": "{0} odabrano", "MessageSeriesSequenceCannotContainSpaces": "Slijed serijala ne može sadržavati praznine", - "MessageServerCouldNotBeReached": "Nije moguće pristupiti poslužitelju", - "MessageSetChaptersFromTracksDescription": "Postavi poglavlja koristeći se zvučnom datotekom kao poglavljem i nazivom datoteke kao naslovom poglavlja", + "MessageServerCouldNotBeReached": "Nije bilo moguće pristupiti poslužitelju", + "MessageSetChaptersFromTracksDescription": "Postavi poglavlja koristeći svaku zvučnu datoteku kao poglavlje, a naslov poglavlja kao ime datoteke", "MessageShareExpirationWillBe": "Vrijeme isteka će biti {0}", "MessageShareExpiresIn": "Istječe za {0}", "MessageShareURLWillBe": "URL za dijeljenje bit će {0}", @@ -923,7 +923,7 @@ "MessageTaskOpmlImportFeedPodcastDescription": "Stvaranje podcasta \"{0}\"", "MessageTaskOpmlImportFeedPodcastExists": "Podcast već postoji u putanji", "MessageTaskOpmlImportFeedPodcastFailed": "Stvaranje podcasta nije uspjelo", - "MessageTaskOpmlImportFinished": "Dodano {0} podcasta", + "MessageTaskOpmlImportFinished": "Broj dodanih podcasta: {0}", "MessageTaskOpmlParseFailed": "Raščlanjivanje OPML datoteke nije uspjelo", "MessageTaskOpmlParseFastFail": "Neispravna OPML datoteka, oznaka nije pronađena ILI oznaka nije pronađena", "MessageTaskOpmlParseNoneFound": "U OPML datoteci nisu pronađeni izvori", @@ -934,10 +934,10 @@ "MessageTaskScanningFileChanges": "Skeniranje izmijenjenih datoteka u \"{0}\"", "MessageTaskScanningLibrary": "Skeniranje knjižnice \"{0}\"", "MessageTaskTargetDirectoryNotWritable": "U odredišnu mapu nije moguće pisati", - "MessageThinking": "Razmišljam...", - "MessageUploaderItemFailed": "Učitavanje nije uspjelo", - "MessageUploaderItemSuccess": "Uspješno učitano!", - "MessageUploading": "Učitavam...", + "MessageThinking": "Razmišljanje...", + "MessageUploaderItemFailed": "Prijenos nije uspio", + "MessageUploaderItemSuccess": "Uspješno preneseno!", + "MessageUploading": "Prijenos...", "MessageValidCronExpression": "Ispravan cron izraz", "MessageWatcherIsDisabledGlobally": "Praćenje datotečnog sustava globalno je isključen u postavkama poslužitelja", "MessageXLibraryIsEmpty": "{0} Knjižnica je prazna!", @@ -949,8 +949,8 @@ "NoteRSSFeedPodcastAppsHttps": "Pripazite: Većina aplikacija za podcaste iziskuje URL RSS izvora koji se koristi HTTPS protokolom", "NoteRSSFeedPodcastAppsPubDate": "Upozorenje: jedan ili više vaših nastavaka nemaju datum objavljivanja. To je obavezno kod nekih aplikacija za podcaste.", "NoteUploaderFoldersWithMediaFiles": "Mape s medijskim datotekama smatrat će se zasebnim stavkama knjižnice.", - "NoteUploaderOnlyAudioFiles": "Ako učitavate samo zvučne datoteke svaka će se zvučna datoteka uvesti kao zasebna zvučna knjiga.", - "NoteUploaderUnsupportedFiles": "Nepodržane vrste datoteka zanemaruju se. Kada odabirete datoteke ili ispuštate mapu, sve datoteke koje nisu u mapi stavke zanemarit će se.", + "NoteUploaderOnlyAudioFiles": "Ako prenosite samo zvučne datoteke svaka će se zvučna datoteka uvesti kao zasebna zvučna knjiga.", + "NoteUploaderUnsupportedFiles": "Nepodržane vrste datoteka se zanemaruju. Kada birate datoteke ili ispuštate mapu, sve datoteke koje nisu u mapi stavke će se zanemariti.", "NotificationOnBackupCompletedDescription": "Pokreće se po završetku sigurnosnog kopiranja", "NotificationOnBackupFailedDescription": "Pokreće se kada sigurnosno kopiranje ne uspije", "NotificationOnEpisodeDownloadedDescription": "Pokreće se kada se nastavak podcasta automatski preuzme", @@ -960,14 +960,14 @@ "PlaceholderBulkChapterInput": "Upišite naslov poglavlja ili ga numerirajte (npr. '1. nastavak', 'Poglavlje 10', '1.')", "PlaceholderNewCollection": "Ime nove zbirke", "PlaceholderNewFolderPath": "Nova putanja mape", - "PlaceholderNewPlaylist": "Naziv novog popisa za izvođenje", + "PlaceholderNewPlaylist": "Ime novog popisa za izvođenje", "PlaceholderSearch": "Traži...", "PlaceholderSearchEpisode": "Traži nastavak...", "StatsAuthorsAdded": "autora dodano", "StatsBooksAdded": "knjiga dodano", "StatsBooksAdditional": "Novi naslovi uključuju…", - "StatsBooksFinished": "knjiga dovršeno", - "StatsBooksFinishedThisYear": "Neke knjige dovršene ove godine…", + "StatsBooksFinished": "završene knjige", + "StatsBooksFinishedThisYear": "Neke završene knjige ove godine…", "StatsBooksListenedTo": "knjiga slušano", "StatsCollectionGrewTo": "Vaša je zbirka knjiga narasla na…", "StatsSessions": "sesija", @@ -999,8 +999,8 @@ "ToastBackupInvalidMaxKeep": "Neispravan broj sigurnosnih kopija za čuvanje", "ToastBackupInvalidMaxSize": "Neispravna najveća veličina sigurnosne kopije", "ToastBackupRestoreFailed": "Vraćanje sigurnosne kopije nije uspjelo", - "ToastBackupUploadFailed": "Učitavanje sigurnosne kopije nije uspjelo", - "ToastBackupUploadSuccess": "Sigurnosna kopija učitana", + "ToastBackupUploadFailed": "Prijenos sigurnosne kopije nije uspio", + "ToastBackupUploadSuccess": "Sigurnosna kopija je prenesea", "ToastBatchApplyDetailsToItemsSuccess": "Pojedinosti primijenjene stavkama", "ToastBatchDeleteFailed": "Grupno brisanje nije uspjelo", "ToastBatchDeleteSuccess": "Grupno brisanje je uspjelo", @@ -1023,7 +1023,7 @@ "ToastChaptersMustHaveTitles": "Poglavlja moraju imati naslove", "ToastChaptersRemoved": "Poglavlja uklonjena", "ToastChaptersUpdated": "Poglavlja su ažurirana", - "ToastCollectionItemsAddFailed": "Neuspješno dodavanje stavki u zbirku", + "ToastCollectionItemsAddFailed": "Neuspjelo dodavanje stavki u zbirku", "ToastCollectionRemoveSuccess": "Zbirka izbrisana", "ToastCollectionUpdateSuccess": "Zbirka ažurirana", "ToastConnectionNotAvailable": "Veza nije dostupna. Pokušaj ponovo kasnije", @@ -1033,13 +1033,13 @@ "ToastDeleteFileFailed": "Brisanje datoteke nije uspjelo", "ToastDeleteFileSuccess": "Datoteka izbrisana", "ToastDeviceAddFailed": "Dodavanje uređaja nije uspjelo", - "ToastDeviceNameAlreadyExists": "E-čitač s tim nazivom već postoji", + "ToastDeviceNameAlreadyExists": "E-čitač s tim imenom već postoji", "ToastDeviceTestEmailFailed": "Slanje probne poruke e-pošte nije uspjelo", "ToastDeviceTestEmailSuccess": "Probna poruka e-pošte poslana", "ToastEmailSettingsUpdateSuccess": "Postavke e-pošte ažurirane", - "ToastEncodeCancelFailed": "Kodiranje nije uspješno otkazano", + "ToastEncodeCancelFailed": "Prekidanje kodiranja nije uspjelo", "ToastEncodeCancelSucces": "Kodiranje otkazano", - "ToastEpisodeDownloadQueueClearFailed": "Redoslijed izvođenja nije uspješno očišćen", + "ToastEpisodeDownloadQueueClearFailed": "Brisanje redoslijeda izvođenja nije uspjelo", "ToastEpisodeDownloadQueueClearSuccess": "Redoslijed preuzimanja nastavaka očišćen", "ToastEpisodeUpdateSuccess": "{0} nastavak/a ažurirano", "ToastErrorCannotShare": "Dijeljenje na ovaj uređaj nije moguće", @@ -1057,10 +1057,10 @@ "ToastItemDeletedFailed": "Brisanje stavke nije uspjelo", "ToastItemDeletedSuccess": "Stavka je izbrisana", "ToastItemDetailsUpdateSuccess": "Pojedinosti stavke su ažurirane", - "ToastItemMarkedAsFinishedFailed": "Označavanje kao Dovršeno nije uspjelo", - "ToastItemMarkedAsFinishedSuccess": "Stavka označena kao dovršena", - "ToastItemMarkedAsNotFinishedFailed": "Označavanje kao Nije dovršeno nije uspjelo", - "ToastItemMarkedAsNotFinishedSuccess": "Stavka označena kao nedovršena", + "ToastItemMarkedAsFinishedFailed": "Označavanje kao „Završeno” nije uspjelo", + "ToastItemMarkedAsFinishedSuccess": "Stavka je označena kao završena", + "ToastItemMarkedAsNotFinishedFailed": "Označavanje kao „Nezavršeno” nije uspjelo", + "ToastItemMarkedAsNotFinishedSuccess": "Stavka je označena kao nezavršena", "ToastItemUpdateSuccess": "Stavka ažurirana", "ToastLibraryCreateFailed": "Stvaranje knjižnice nije uspjelo", "ToastLibraryCreateSuccess": "Knjižnica \"{0}\" stvorena", @@ -1069,17 +1069,17 @@ "ToastLibraryScanFailedToStart": "Skeniranje nije uspjelo", "ToastLibraryScanStarted": "Skeniranje knjižnice započelo", "ToastLibraryUpdateSuccess": "Knjižnica \"{0}\" ažurirana", - "ToastMatchAllAuthorsFailed": "Nisu prepoznati svi autori", + "ToastMatchAllAuthorsFailed": "Prepoznavanje svih autora nije uspjelo", "ToastMetadataFilesRemovedError": "Pogreška kod uklanjanja datoteka metadata.{0}", "ToastMetadataFilesRemovedNoneFound": "U knjižnici nisu pronađene datoteke metadata.{0}", - "ToastMetadataFilesRemovedNoneRemoved": "Datoteke metadata.{0} nisu uklonjenje", - "ToastMetadataFilesRemovedSuccess": "uklonjeno {0} datoteka metadata.{1}", - "ToastMustHaveAtLeastOnePath": "Mora postojati barem jedna putanja", + "ToastMetadataFilesRemovedNoneRemoved": "Nijedna datoteka metadata.{0} nije uklonjenja", + "ToastMetadataFilesRemovedSuccess": "Broj uklonjenih datoteka metadata.{1}: {0}", + "ToastMustHaveAtLeastOnePath": "Mora imati barem jednu putanju", "ToastNameEmailRequired": "Ime i adresa e-pošte su obavezni", "ToastNameRequired": "Ime je obavezno", "ToastNewApiKeyUserError": "Morate odabrati korisnika", "ToastNewEpisodesFound": "pronađeno {0} novih nastavaka", - "ToastNewUserCreatedFailed": "Račun \"{0}\" nije uspješno izrađen", + "ToastNewUserCreatedFailed": "Stvaranje računa nije uspjelo: \"{0}\"", "ToastNewUserCreatedSuccess": "Novi račun izrađen", "ToastNewUserLibraryError": "Treba odabrati barem jednu knjižnicu", "ToastNewUserPasswordError": "Mora imati zaporku, samo korisnik root može imati praznu zaporku", @@ -1090,20 +1090,20 @@ "ToastNoUpdatesNecessary": "Ažuriranja nisu potrebna", "ToastNotificationCreateFailed": "Stvaranje obavijesti nije uspjelo", "ToastNotificationDeleteFailed": "Brisanje obavijesti nije uspjelo", - "ToastNotificationFailedMaximum": "Najveći broj neuspješnih pokušaja mora biti >= 0", + "ToastNotificationFailedMaximum": "Najveći broj neuspjelih pokušaja mora biti >= 0", "ToastNotificationQueueMaximum": "Najveći broj obavijesti u redu mora biti >= 0", "ToastNotificationSettingsUpdateSuccess": "Postavke obavijesti ažurirane", "ToastNotificationTestTriggerFailed": "Okidanje probne obavijesti nije uspjelo", "ToastNotificationTestTriggerSuccess": "Okinuta je probna obavijest", "ToastNotificationUpdateSuccess": "Obavijest ažurirana", - "ToastPlaylistCreateFailed": "Popis za izvođenje nije izrađen", + "ToastPlaylistCreateFailed": "Izrada popisa za izvođenje nije uspjela", "ToastPlaylistCreateSuccess": "Popis za izvođenje izrađen", "ToastPlaylistRemoveSuccess": "Popis za izvođenje uklonjen", "ToastPlaylistUpdateSuccess": "Popis za izvođenje ažuriran", - "ToastPodcastCreateFailed": "Podcast nije izrađen", + "ToastPodcastCreateFailed": "Stvaranje podcasta nije uspjelo", "ToastPodcastCreateSuccess": "Podcast uspješno izrađen", "ToastPodcastEpisodeUpdated": "Nastavak ažuriran", - "ToastPodcastGetFeedFailed": "Dohvat izvora podcasta nije uspio", + "ToastPodcastGetFeedFailed": "Dohvaćanje izvora podcasta nije uspjelo", "ToastPodcastNoEpisodesInFeed": "U RSS izvoru nisu pronađeni nastavci", "ToastPodcastNoRssFeed": "Podcast nema RSS izvor", "ToastProgressIsNotBeingSynced": "Napredak se ne sinkronizira, ponovno pokrenite reprodukciju", @@ -1111,7 +1111,7 @@ "ToastProviderCreatedSuccess": "Novi pružatelj dodan", "ToastProviderNameAndUrlRequired": "Ime i URL su obavezni", "ToastProviderRemoveSuccess": "Pružatelj uklonjen", - "ToastRSSFeedCloseFailed": "RSS izvor nije uspješno zatvoren", + "ToastRSSFeedCloseFailed": "Zatvaranje RSS izvora nije uspjelo", "ToastRSSFeedCloseSuccess": "RSS izvor zatvoren", "ToastRemoveFailed": "Uklanjanje nije uspjelo", "ToastRemoveItemFromCollectionFailed": "Uklanjanje stavke iz zbirke nije uspjelo", @@ -1119,7 +1119,7 @@ "ToastRemoveItemsWithIssuesFailed": "Uklanjanje knjižničkih stavki s problemima nije uspjelo", "ToastRemoveItemsWithIssuesSuccess": "Uspješno uklonjene knjižničke stavke s problemima", "ToastRenameFailed": "Preimenovanje nije uspjelo", - "ToastRescanFailed": "Ponovno skeniranje {0} nije uspjelo", + "ToastRescanFailed": "Ponovno skeniranje nije uspjelo za {0}", "ToastRescanRemoved": "Ponovno skeniranje dovršene stavke je uklonjeno", "ToastRescanUpToDate": "Ponovno skeniranje dovršene stavke bilo je ažurno", "ToastRescanUpdated": "Ponovno skeniranje dovršene stavke je ažurirano", @@ -1134,7 +1134,7 @@ "ToastSessionCloseFailed": "Zatvaranje sesije nije uspjelo", "ToastSessionDeleteFailed": "Brisanje sesije nije uspjelo", "ToastSessionDeleteSuccess": "Sesija izbrisana", - "ToastSleepTimerDone": "Timer za spavanje istječe... zZzzZz", + "ToastSleepTimerDone": "Timer za spavanje gotov... zZzzZz", "ToastSlugMustChange": "Slug sadrži nedozvoljene znakove", "ToastSlugRequired": "Slug je obavezan", "ToastSocketConnected": "Socket priključen", @@ -1146,8 +1146,8 @@ "ToastUnknownError": "Nepoznata pogreška", "ToastUnlinkOpenIdFailed": "Uklanjanje OpenID veze korisnika nije uspjelo", "ToastUnlinkOpenIdSuccess": "Korisnik odspojen od OpenID-ja", - "ToastUploaderFilepathExistsError": "Putanja \"{0}\" već postoji na poslužitelju", - "ToastUploaderItemExistsInSubdirectoryError": "Stavka \"{0}\" koristi se podmapom u putanje za učitavanje.", + "ToastUploaderFilepathExistsError": "Datotečna putanja \"{0}\" već postoji na poslužitelju", + "ToastUploaderItemExistsInSubdirectoryError": "Stavka \"{0}\" koristi podmapu putanje za prijenos.", "ToastUserDeleteFailed": "Brisanje korisnika nije uspjelo", "ToastUserDeleteSuccess": "Korisnik izbrisan", "ToastUserPasswordChangeSuccess": "Zaporka je uspješno promijenjena", From e51c7b2be1edf27589585b91a566e674a3ae130a Mon Sep 17 00:00:00 2001 From: Jan Schoenfeld Date: Mon, 17 Nov 2025 09:26:28 +0100 Subject: [PATCH 027/117] Translated using Weblate (German) Currently translated at 99.9% (1162 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/de.json b/client/strings/de.json index 5acae6d9b..403272dcc 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -589,7 +589,7 @@ "LabelSettingsChromecastSupport": "Chromecastunterstützung", "LabelSettingsDateFormat": "Datumsformat", "LabelSettingsEnableWatcher": "Bibliotheken automatisch nach Änderungen durchsuchen", - "LabelSettingsEnableWatcherForLibrary": "Bibliothek automatisch nach Änderungen durchsuchen", + "LabelSettingsEnableWatcherForLibrary": "Bibliothek automatisch auf Änderungen überwachen", "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.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Bist du dir sicher?", "MessageRestoreBackupConfirm": "Bist du dir sicher, dass du die Sicherung wiederherstellen willst, welche am", "MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.

Bei der Sicherung werden keine Dateien in deinen Bibliotheksordnern verändert. Wenn du die Servereinstellungen aktiviert hast, um Cover und Metadaten in deinen Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.

Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.", - "MessageScheduleLibraryScanNote": "Für die meisten Anwender wird empfohlen, diese Funktion deaktiviert und die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung wird Änderungen in den Bibliotheksordnern automatisch erkennen. Die Ordnerüberwachung funktioniert nicht mit allen Dateisystemen (wie NFS), hier kann stattdessen die automatischen Bibliothekssuchen verwendet werden.", + "MessageScheduleLibraryScanNote": "Für die meisten Benutzer wird empfohlen, diese Funktion deaktiviert und die Einstellung „Bibliothek automatisch auf Änderungen überwachen“ aktiviert zu lassen – dadurch werden Änderungen in Ihren Bibliotheksordnern automatisch erkannt. Aktivieren Sie diese Funktion, wenn „Bibliothek automatisch auf Änderungen überwachen“ für Ihr Dateisystem (wie NFS) nicht funktioniert.", "MessageScheduleRunEveryWeekdayAtTime": "Immer {0} um {1} ausführen", "MessageSearchResultsFor": "Suchergebnisse für", "MessageSelected": "{0} ausgewählt", From 8c5678b5730a257527846bada29482048523fa6d Mon Sep 17 00:00:00 2001 From: dapitch666 Date: Mon, 17 Nov 2025 11:15:14 +0100 Subject: [PATCH 028/117] Translated using Weblate (French) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/ --- client/strings/fr.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index b560bfc06..f2c795980 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Interface skeumorphique avec étagères en bois", "LabelSettingsChromecastSupport": "Support du Chromecast", "LabelSettingsDateFormat": "Format de date", - "LabelSettingsEnableWatcher": "Analyser automatiquement les bibliothèques pour détecter les modifications", - "LabelSettingsEnableWatcherForLibrary": "Analyser automatiquement la bibliothèque pour détecter les modifications", + "LabelSettingsEnableWatcher": "Surveiller automatiquement les bibliothèques pour détecter les modifications", + "LabelSettingsEnableWatcherForLibrary": "Surveiller automatiquement la bibliothèque pour détecter les modifications", "LabelSettingsEnableWatcherHelp": "Active la mise à jour automatique d'éléments lorsque des modifications de fichiers sont détectées. * Nécessite le redémarrage du serveur", "LabelSettingsEpubsAllowScriptedContent": "Autoriser le contenu scénarisé pour les fichiers EPUB", "LabelSettingsEpubsAllowScriptedContentHelp": "Autoriser les fichiers EPUB à exécuter des scripts. Il est recommandé de laisser ce paramètre désactivé, sauf si vous faites confiance à la source des fichiers EPUB.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Êtes-vous sûr·e de vouloir réinitialiser les chapitres et annuler les changements effectués ?", "MessageRestoreBackupConfirm": "Êtes-vous sûr·e de vouloir restaurer la sauvegarde créée le", "MessageRestoreBackupWarning": "Restaurer la sauvegarde écrasera la base de donnée située dans le dossier /config ainsi que les images sur /metadata/items et /metadata/authors.

Les sauvegardes ne touchent pas aux fichiers de la bibliothèque. Si vous avez activé le paramètre pour sauvegarder les métadonnées et les images de couverture dans le même dossier que les fichiers, ceux-ci ne ni sauvegardés, ni écrasés lors de la restauration.

Tous les clients utilisant votre serveur seront automatiquement mis à jour.", - "MessageScheduleLibraryScanNote": "Pour la plupart des utilisateurs, il est recommandé de laisser cette fonctionnalité désactivée et de maintenir le réglage du moniteur de dossier activé. Le moniteur de dossier détectera automatiquement les changements dans vos dossiers de bibliothèque. Le moniteur de dossier ne fonctionne pas pour chaque système de fichiers (comme NFS) afin que les scans de bibliothèques programmés puissent être utilisés à la place.", + "MessageScheduleLibraryScanNote": "Pour la plupart des utilisateurs, il est recommandé de laisser cette fonctionnalité désactivée et de maintenir le paramètre « Surveiller automatiquement la bibliothèque pour détecter les modifications » activé – il détectera automatiquement les modifications dans les dossiers de votre bibliothèque. Activez cette fonctionnalité si l'option « Surveiller automatiquement la bibliothèque pour détecter les modifications » ne fonctionne pas pour votre système de fichiers (comme NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Exécuté tous les {0} à {1}", "MessageSearchResultsFor": "Résultats de recherche pour", "MessageSelected": "{0} sélectionnés", From 568b154e8a759558bcd8e6a221253e078a4f9659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20Engstr=C3=B6m?= Date: Sun, 16 Nov 2025 09:38:09 +0100 Subject: [PATCH 029/117] Translated using Weblate (Swedish) Currently translated at 99.8% (1161 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index e41dd8e2b..b1fa8f229 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -436,9 +436,9 @@ "LabelLibraryFilterSublistEmpty": "Ingen {0}", "LabelLibraryItem": "Objekt", "LabelLibraryName": "Biblioteksnamn", - "LabelLibrarySortByProgress": "Framsteg uppdaterat", - "LabelLibrarySortByProgressFinished": "Avslutsdag", - "LabelLibrarySortByProgressStarted": "Startdag", + "LabelLibrarySortByProgress": "Framsteg: senast uppdaterat", + "LabelLibrarySortByProgressFinished": "Framsteg: avslutad", + "LabelLibrarySortByProgressStarted": "Framsteg: påbörjad", "LabelLimit": "Begränsning", "LabelLineSpacing": "Radavstånd", "LabelListenAgain": "Lyssna igen", @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Bakgrund med ett utseende liknande en bokhylla i trä", "LabelSettingsChromecastSupport": "Stöd för Chromecast", "LabelSettingsDateFormat": "Datumformat", - "LabelSettingsEnableWatcher": "Upptäck automatiskt förändringar i biblioteket", - "LabelSettingsEnableWatcherForLibrary": "Upptäck automatiskt förändringar i biblioteket", + "LabelSettingsEnableWatcher": "Bevaka biblioteken automatiskt efter ändringar", + "LabelSettingsEnableWatcherForLibrary": "Bevaka biblioteket automatiskt efter ändringar", "LabelSettingsEnableWatcherHelp": "Aktiverar automatik att upptäcka när objekt
adderas, uppdateras eller raderas.
OBS: Kräver en omstart av servern", "LabelSettingsEpubsAllowScriptedContent": "Tillåt e-böcker i epubs-format som innehåller script", "LabelSettingsEpubsAllowScriptedContentHelp": "Tillåt att epub-filer får innehålla script.
Det rekommenderas att denna inställning är
avstängd när du inte litar på källan för epub-filerna.", @@ -724,6 +724,7 @@ "LabelViewQueue": "Visa spellista", "LabelVolume": "Volym", "LabelWebRedirectURLsDescription": "Auktorisera dessa URLer i din OAuth-leverantör för att tillåta omdirigering tillbaka till webbappen efter inloggning:", + "LabelWebRedirectURLsSubfolder": "Undermappar för omdirigeringslänkar", "LabelWeekdaysToRun": "Veckodagar att köra skanning", "LabelXBooks": "{0} böcker", "LabelXItems": "{0} objekt", @@ -752,6 +753,7 @@ "MessageBookshelfNoResultsForFilter": "Inga resultat för filter \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Sökningen gav inget resultat", "MessageBookshelfNoSeries": "Du har inga serier", + "MessageBulkChapterPattern": "Hur många kapitel vill du lägga till med detta numreringsmönster?", "MessageChapterEndIsAfter": "Kapitelns slut är efter din ljudboks slut", "MessageChapterErrorFirstNotZero": "Första kapitlet måste börja vid 0", "MessageChapterErrorStartGteDuration": "Ogiltig starttid, måste vara mindre än ljudbokens längd", @@ -778,6 +780,7 @@ "MessageConfirmMarkItemNotFinished": "Är du säker på att du vill markera \"{0}\" som ej avslutad?", "MessageConfirmMarkSeriesFinished": "Är du säker på att du vill markera alla böcker i denna serie som avslutade?", "MessageConfirmMarkSeriesNotFinished": "Är du säker på att du vill markera alla böcker i denna serie som ej avslutade?", + "MessageConfirmNotificationTestTrigger": "Trigga denna avisering med testdata?", "MessageConfirmPurgeCache": "När du rensar cashen kommer katalogen /metadata/cache att raderas.

Är du säker på att du vill radera katalogen?", "MessageConfirmPurgeItemsCache": "När du rensar cashen för objekten kommer katalogen /metadata/cache/items att raderas.

Är du säker på att du vill radera katalogen?", "MessageConfirmQuickEmbed": "VARNING! När du infogar metadata i dina ljudfiler kommer INGEN SÄKERHETSKOPIA av filerna att göras. Se därför till att först säkerhetskopiera ljudfilerna.

Vill du fortsätta?", @@ -787,6 +790,7 @@ "MessageConfirmRemoveAuthor": "Är du säker på att du vill ta bort författaren \"{0}\"?", "MessageConfirmRemoveCollection": "Är du säker på att du vill ta bort samlingen \"{0}\"?", "MessageConfirmRemoveEpisode": "Är du säker på att du vill radera avsnittet \"{0}\"?", + "MessageConfirmRemoveEpisodeNote": "Anmärkning: Detta tar inte bort ljudfilen om inte \"Hard delete file\" är aktivt", "MessageConfirmRemoveEpisodes": "Är du säker på att du vill radera {0} avsnitt?", "MessageConfirmRemoveListeningSessions": "Är du säker på att du vill radera {0} lyssningstillfällen?", "MessageConfirmRemoveMetadataFiles": "Är du säker på att du vill radera filerna 'metadata.{0}' i alla mappar i ditt bibliotek?", @@ -804,12 +808,16 @@ "MessageDaysListenedInTheLastYear": "{0} dagars lyssnande det senaste året", "MessageDownloadingEpisode": "Laddar ner avsnitt", "MessageDragFilesIntoTrackOrder": "Ändra ordningen genom att klicka och dra filerna till rätt plats", + "MessageEmbedFailed": "Inbäddning misslyckades!", "MessageEmbedFinished": "Inbäddning genomförd!", + "MessageEmbedQueue": "Köad för inbäddning av metadata plats ({0} i kön)", "MessageEpisodesQueuedForDownload": "{0} avsnitt i kö för nedladdning", "MessageEreaderDevices": "För att säkerställa överföring av e-böcker kan du bli tvungen
att addera ovanstående e-postadress som godkänd avsändare
för varje enhet angiven nedan.", "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.", + "MessageHeatmapListeningTimeTooltip": "{0} lyssnar på {1}", + "MessageHeatmapNoListeningSessions": "Inga lyssningssessioner på {0}", "MessageImportantNotice": "Viktig meddelande!", "MessageInsertChapterBelow": "Infoga kapitel nedanför", "MessageInvalidAsin": "Felaktig ASIN-kod", @@ -849,6 +857,7 @@ "MessageNoLogs": "Inga loggningsinformation finns", "MessageNoMediaProgress": "Ingen medieförlopp", "MessageNoNotifications": "Inga aviseringar", + "MessageNoPodcastFeed": "Felaktig podcast: ingen ström", "MessageNoPodcastsFound": "Inga podcasts hittade", "MessageNoResults": "Inga resultat", "MessageNoSearchResultsFor": "Inga sökresultat för \"{0}\"", @@ -859,6 +868,7 @@ "MessageNoUserPlaylists": "Du har inga spellistor", "MessageNoUserPlaylistsHelp": "Spellistor är privata. Endast den användare som skapat listan kan se den.", "MessageNotYetImplemented": "Ännu inte implementerad", + "MessageOpmlPreviewNote": "Obs: Detta är en förhandsvisning av den analyserade OPML-filen. Den faktiska podcasttiteln kommer att hämtas från RSS-flödet.", "MessageOr": "eller", "MessagePauseChapter": "Pausa kapiteluppspelning", "MessagePlayChapter": "Lyssna på kapitlets början", @@ -878,7 +888,7 @@ "MessageResetChaptersConfirm": "Är du säker på att du vill återställa alla kapitel och ångra de ändringarna du gjort?", "MessageRestoreBackupConfirm": "Är du säker på att du vill läsa in säkerhetskopian som skapades den", "MessageRestoreBackupWarning": "Att återställa en säkerhetskopia kommer att skriva över hela databasen som finns i /config och omslagsbilder i /metadata/items & /metadata/authors.

Säkerhetskopior ändrar inte några filer i dina biblioteksmappar. Om du har aktiverat serverinställningar för att lagra omslagskonst och metadata i dina biblioteksmappar säkerhetskopieras eller skrivs de inte över.

Alla klienter som använder din server kommer att uppdateras automatiskt.", - "MessageScheduleLibraryScanNote": "För de flesta användare rekommenderas att denna funktion ej aktiveras. Istället bör funktionen som automatisk upptäcker ändringar i biblioteket vara aktiverad. För vissa filsystem (som t.ex. NFS) fungerar inte denna funktion. Då kan schemalagda skanningar av biblioteken användas istället.", + "MessageScheduleLibraryScanNote": "För de flesta användare rekommenderas det att låta den här funktionen vara inaktiverad och att inställningen \"Bevaka biblioteket automatiskt efter ändringar\" är aktiverad – den kommer automatiskt att upptäcka ändringar i dina biblioteksmappar. Aktivera den här funktionen om \"Bevaka biblioteket automatiskt efter ändringar\" inte fungerar för ditt filsystem (som NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Startar varje {0} klockan {1}", "MessageSearchResultsFor": "Sökresultat för", "MessageSelected": "{0} valda", @@ -887,12 +897,14 @@ "MessageSetChaptersFromTracksDescription": "Använd varje ljudfil som ett kapitel och ljudfilens namn som kapitlets rubrik", "MessageShareExpirationWillBe": "Giltig till kommer att bli {0}", "MessageShareExpiresIn": "Upphör om {0}", + "MessageShareURLWillBe": "Delningslänken kommer att vara {0}", "MessageStartPlaybackAtTime": "Starta uppspelning av \"{0}\" från tidpunkt {1}?", "MessageTaskAudioFileNotWritable": "Det går inte att skriva till ljudfilen \"{0}\"", "MessageTaskCanceledByUser": "Uppgiften avslutades av användaren", "MessageTaskDownloadingEpisodeDescription": "Laddar ner avsnitt \"{0}\"", "MessageTaskEmbeddingMetadata": "Infogar metadata", "MessageTaskEmbeddingMetadataDescription": "Infogar metadata i ljudboken \"{0}\"", + "MessageTaskEncodingM4b": "Kodar M4B", "MessageTaskEncodingM4bDescription": "Omkodning av ljudbok \"{0}\" till en M4B-fil", "MessageTaskFailed": "Misslyckades", "MessageTaskFailedToBackupAudioFile": "Misslyckades med att göra backup på ljudfil \"{0}\"", @@ -903,8 +915,11 @@ "MessageTaskFailedToWriteMetadataFile": "Misslyckades med att skapa filen med metadata", "MessageTaskMatchingBooksInLibrary": "Matchar böcker i biblioteket \"{0}\"", "MessageTaskNoFilesToScan": "Inga filer finns tillgängliga för skanning", + "MessageTaskOpmlImport": "OPML import", "MessageTaskOpmlImportDescription": "Skapar podcasts från {0} RSS-flöden", + "MessageTaskOpmlImportFeed": "OPML importflöde", "MessageTaskOpmlImportFeedDescription": "Importerar RSS-flödet \"{0}\"", + "MessageTaskOpmlImportFeedFailed": "Det gick inte att hämta poddflödet", "MessageTaskOpmlImportFeedPodcastDescription": "Skapar podcast \"{0}\"", "MessageTaskOpmlImportFeedPodcastExists": "En podcast finns redan med den adressen", "MessageTaskOpmlImportFeedPodcastFailed": "Misslyckades med att skapa podcast", @@ -987,6 +1002,9 @@ "ToastBackupUploadFailed": "Det gick inte att ladda upp säkerhetskopian", "ToastBackupUploadSuccess": "Säkerhetskopian har laddats upp", "ToastBatchApplyDetailsToItemsSuccess": "Informationen har adderats till alla objekt", + "ToastBatchDeleteFailed": "Det gick inte att radera batch", + "ToastBatchDeleteSuccess": "Batch borttagning lyckades", + "ToastBatchQuickMatchFailed": "Snabbmatchning av batch misslyckades!", "ToastBatchQuickMatchStarted": "Snabbmatchning av {0} böcker har påbörjats!", "ToastBatchUpdateFailed": "Batchuppdateringen misslyckades", "ToastBatchUpdateSuccess": "Batchuppdateringen lyckades", @@ -1024,6 +1042,7 @@ "ToastEpisodeDownloadQueueClearFailed": "Misslyckades med att tömma kön", "ToastEpisodeDownloadQueueClearSuccess": "Kö för nedladdning av avsnitt har tömts", "ToastEpisodeUpdateSuccess": "{0} avsnitt uppdaterades", + "ToastErrorCannotShare": "Kan inte dela direkt på den här enheten", "ToastFailedToCreate": "Misslyckades med att addera", "ToastFailedToDelete": "Misslyckades med att radera", "ToastFailedToLoadData": "Misslyckades med att ladda data", @@ -1055,6 +1074,7 @@ "ToastMetadataFilesRemovedNoneFound": "Inga 'metadata.{0}' filer hittades i biblioteket", "ToastMetadataFilesRemovedNoneRemoved": "Inga 'metadata.{0}' filer raderades", "ToastMetadataFilesRemovedSuccess": "{0} 'metadata.{1}' raderades", + "ToastMustHaveAtLeastOnePath": "Måste ha minst en sökväg", "ToastNameEmailRequired": "Ett namn och en e-postadress måste anges", "ToastNameRequired": "Ett namn måste anges", "ToastNewApiKeyUserError": "En användare måste väljas", @@ -1071,8 +1091,10 @@ "ToastNotificationCreateFailed": "Misslyckades med att skapa meddelandet", "ToastNotificationDeleteFailed": "Misslyckades med att radera meddelandet", "ToastNotificationFailedMaximum": "Maximalt antal misslyckade försök måste vara större än eller lika med 0", + "ToastNotificationQueueMaximum": "Maximala antalet aviseringsköer måste vara >= 0", "ToastNotificationSettingsUpdateSuccess": "Inställningarna för meddelanden har ändrats", "ToastNotificationTestTriggerFailed": "Misslyckades med att skicka testmeddelandet", + "ToastNotificationTestTriggerSuccess": "Triggade testavisering", "ToastNotificationUpdateSuccess": "Meddelandet har uppdaterats", "ToastPlaylistCreateFailed": "Det gick inte att skapa spellistan", "ToastPlaylistCreateSuccess": "Spellistan skapad", @@ -1081,8 +1103,10 @@ "ToastPodcastCreateFailed": "Misslyckades med att skapa podcasten", "ToastPodcastCreateSuccess": "Podcasten skapades framgångsrikt", "ToastPodcastEpisodeUpdated": "Avsnittet har uppdaterats", + "ToastPodcastGetFeedFailed": "Det gick inte att hämta poddflödet", "ToastPodcastNoEpisodesInFeed": "Inga avsnitt finns i RSS-flödet", "ToastPodcastNoRssFeed": "Denna podcast har ingen RSS-flöde", + "ToastProgressIsNotBeingSynced": "Förloppet synkroniseras inte, starta om uppspelningen", "ToastProviderCreatedFailed": "Misslyckades med att addera en källa", "ToastProviderCreatedSuccess": "En ny källa har adderats", "ToastProviderNameAndUrlRequired": "Ett namn och en URL-adress krävs", @@ -1107,9 +1131,12 @@ "ToastSeriesUpdateFailed": "Misslyckades med att uppdatera serien", "ToastSeriesUpdateSuccess": "Uppdateringen av serierna lyckades", "ToastServerSettingsUpdateSuccess": "Inställningarna för servern har uppdaterats", + "ToastSessionCloseFailed": "Misslyckades med att avsluta sessionen", "ToastSessionDeleteFailed": "Misslyckades med att ta bort sessionen", "ToastSessionDeleteSuccess": "Sessionen borttagen", "ToastSleepTimerDone": "Timer har stängt av lyssning. Sov gott... zZzzZz", + "ToastSlugMustChange": "Slug innehåller ogiltiga tecken", + "ToastSlugRequired": "Slug krävs", "ToastSocketConnected": "Socket ansluten", "ToastSocketDisconnected": "Socket frånkopplad", "ToastSocketFailedToConnect": "Socket misslyckades med att ansluta", @@ -1120,6 +1147,7 @@ "ToastUnlinkOpenIdFailed": "Misslyckades med att koppla bort användaren från OpenID", "ToastUnlinkOpenIdSuccess": "Användaren har kopplats bort från OpenID", "ToastUploaderFilepathExistsError": "En fil med namnet \"{0}\" finns redan på servern", + "ToastUploaderItemExistsInSubdirectoryError": "Objektet \"{0}\" använder en underkatalog till uppladdningssökvägen.", "ToastUserDeleteFailed": "Misslyckades med att ta bort användaren", "ToastUserDeleteSuccess": "Användaren borttagen", "ToastUserPasswordChangeSuccess": "Lösenordet har ändrats", From f178841e575e3492e87d61f19d4dff12b0cc1943 Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Tue, 18 Nov 2025 08:43:28 +0100 Subject: [PATCH 030/117] Translated using Weblate (Swedish) Currently translated at 99.8% (1161 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index b1fa8f229..2b8a9de3e 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -915,7 +915,7 @@ "MessageTaskFailedToWriteMetadataFile": "Misslyckades med att skapa filen med metadata", "MessageTaskMatchingBooksInLibrary": "Matchar böcker i biblioteket \"{0}\"", "MessageTaskNoFilesToScan": "Inga filer finns tillgängliga för skanning", - "MessageTaskOpmlImport": "OPML import", + "MessageTaskOpmlImport": "OPML-import", "MessageTaskOpmlImportDescription": "Skapar podcasts från {0} RSS-flöden", "MessageTaskOpmlImportFeed": "OPML importflöde", "MessageTaskOpmlImportFeedDescription": "Importerar RSS-flödet \"{0}\"", From ae0ccb1b47b61f49123a5512ae054ecbe9a34761 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 19 Nov 2025 15:03:59 +0100 Subject: [PATCH 031/117] Added translation using Weblate (Korean) --- client/strings/ko.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 client/strings/ko.json diff --git a/client/strings/ko.json b/client/strings/ko.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/client/strings/ko.json @@ -0,0 +1 @@ +{} From 39b8b9df4f977e8b75814ac9e982e990659e2953 Mon Sep 17 00:00:00 2001 From: advplyr Date: Thu, 20 Nov 2025 16:58:43 -0600 Subject: [PATCH 032/117] Auto formatting --- client/components/stats/DailyListeningChart.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/components/stats/DailyListeningChart.vue b/client/components/stats/DailyListeningChart.vue index 1c92e675d..f3a50d11c 100644 --- a/client/components/stats/DailyListeningChart.vue +++ b/client/components/stats/DailyListeningChart.vue @@ -186,14 +186,14 @@ export default { daysInARow() { var count = 0 while (true) { - var _date = this.$addDaysToToday((count * -1) - 1) - var datestr = this.$formatJsDate(_date, 'yyyy-MM-dd') + const _date = this.$addDaysToToday(count * -1 - 1) + const datestr = this.$formatJsDate(_date, 'yyyy-MM-dd') if (!this.listeningStatsDays[datestr] || this.listeningStatsDays[datestr] === 0) { // don't require listening today to count towards days in a row, but do count it if already listened today - var today = this.$formatJsDate(new Date(), 'yyyy-MM-dd'); + const today = this.$formatJsDate(new Date(), 'yyyy-MM-dd') if (this.listeningStatsDays[today]) { - count++; + count++ } return count From 3e9ca51088918b76d5474960570415a3043e4ee2 Mon Sep 17 00:00:00 2001 From: Finn Dittmar Date: Thu, 27 Nov 2025 21:40:29 +0100 Subject: [PATCH 033/117] Fix region parameter extraction in findChapters --- server/controllers/SearchController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/controllers/SearchController.js b/server/controllers/SearchController.js index f6f0ba475..86558846d 100644 --- a/server/controllers/SearchController.js +++ b/server/controllers/SearchController.js @@ -187,7 +187,7 @@ class SearchController { try { const query = req.query const asin = getQueryParamAsString(query, 'asin', '', true) - const region = getQueryParamAsString(req.query.region, 'us').toLowerCase() + const region = getQueryParamAsString(query, 'region', 'us').toLowerCase() if (!isValidASIN(asin.toUpperCase())) throw new ValidationError('asin', 'is invalid') From a5d2c1bd64df6ed1c0f2a51f6b1605e85065934f Mon Sep 17 00:00:00 2001 From: Finn Dittmar Date: Sat, 29 Nov 2025 11:02:42 +0100 Subject: [PATCH 034/117] Fix Upload Lookup --- server/controllers/SearchController.js | 4 ++-- server/finders/BookFinder.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/controllers/SearchController.js b/server/controllers/SearchController.js index 86558846d..ecd9a41c0 100644 --- a/server/controllers/SearchController.js +++ b/server/controllers/SearchController.js @@ -88,10 +88,10 @@ class SearchController { const provider = getQueryParamAsString(query, 'provider', 'google') const title = getQueryParamAsString(query, 'title', '') const author = getQueryParamAsString(query, 'author', '') - const id = getQueryParamAsString(query, 'id', '', true) + const id = getQueryParamAsString(query, 'id', undefined) // Fetch library item - const libraryItem = await SearchController.fetchLibraryItem(id) + const libraryItem = id ? await SearchController.fetchLibraryItem(id) : null const results = await BookFinder.search(libraryItem, provider, title, author) res.json(results) diff --git a/server/finders/BookFinder.js b/server/finders/BookFinder.js index fe1a61027..6d31b2ab9 100644 --- a/server/finders/BookFinder.js +++ b/server/finders/BookFinder.js @@ -428,7 +428,7 @@ class BookFinder { } } - if (books.length) { + if (books.length && libraryItem) { const isAudibleProvider = provider.startsWith('audible') const libraryItemDurationMinutes = libraryItem?.media?.duration ? libraryItem.media.duration / 60 : null From 552ed43243e5d4001142bb52eea0b0f3d0ba24e3 Mon Sep 17 00:00:00 2001 From: ugyes Date: Wed, 19 Nov 2025 20:18:38 +0100 Subject: [PATCH 035/117] Translated using Weblate (Hungarian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/ --- client/strings/hu.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/strings/hu.json b/client/strings/hu.json index e6d45231f..6c1f9abc9 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Skeuomorfikus dizájn fa polcokkal", "LabelSettingsChromecastSupport": "Chromecast támogatás", "LabelSettingsDateFormat": "Dátumformátum", - "LabelSettingsEnableWatcher": "Változások automatikus vizsgálata a könyvtárakban", - "LabelSettingsEnableWatcherForLibrary": "Változások automatikus vizsgálata a könyvtárban", + "LabelSettingsEnableWatcher": "Változások automatikus figyelése a könyvtárakban", + "LabelSettingsEnableWatcherForLibrary": "Változások automatikus figyelé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": "Szkriptelt tartalmak engedélyezése epub-okban", "LabelSettingsEpubsAllowScriptedContentHelp": "Megengedi, hogy az epub fájlok szkripteket hajtsanak végre. Ezt a beállítást kikapcsolva ajánlott tartani, kivéve, ha megbízik az epub fájlok forrásában.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Biztosan alaphelyzetbe szeretné állítani a fejezeteket és visszavonni a módosításokat?", "MessageRestoreBackupConfirm": "Biztosan vissza szeretné állítani a biztonsági másolatot, amely ekkor készült:", "MessageRestoreBackupWarning": "A biztonsági mentés visszaállítása felülírja az egész adatbázist, amely a /config mappában található, valamint a borítóképeket a /metadata/items és /metadata/authors mappákban.

A biztonsági mentések nem módosítják a könyvtár mappáiban található fájlokat. Ha engedélyezte a szerverbeállításokat a borítóképek és a metaadatok könyvtármappákban való tárolására, akkor ezek nem kerülnek biztonsági mentésre vagy felülírásra.

A szerver használó összes kliens automatikusan frissül.", - "MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. A mappafigyelő nem működik minden fájlrendszernél (mint például az NFS), ezért helyette ütemezett könyvtárellenőrzéseket lehet használni.", + "MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. Kapcsolja be ezt a funkciót, ha az „Automatikus könyvtárfigyelés” nem működik a fájlrendszerén (például NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Futás minden {1} óra {0}-kor", "MessageSearchResultsFor": "Keresési eredmények", "MessageSelected": "{0} kiválasztva", From 0ec2ced0116292baa0eb6f6269fc7ccbf9dd0f38 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:50:06 +0100 Subject: [PATCH 036/117] Translated using Weblate (German) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/de.json b/client/strings/de.json index 403272dcc..8398a7211 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -588,7 +588,7 @@ "LabelSettingsBookshelfViewHelp": "Skeumorphes Design mit Holzeinlegeböden", "LabelSettingsChromecastSupport": "Chromecastunterstützung", "LabelSettingsDateFormat": "Datumsformat", - "LabelSettingsEnableWatcher": "Bibliotheken automatisch nach Änderungen durchsuchen", + "LabelSettingsEnableWatcher": "Bibliotheken automatisch nach Änderungen überwachen", "LabelSettingsEnableWatcherForLibrary": "Bibliothek automatisch auf Änderungen überwachen", "LabelSettingsEnableWatcherHelp": "Aktiviert das automatische Hinzufügen/Aktualisieren von Elementen, wenn Dateiänderungen erkannt werden. *Erfordert einen Server-Neustart", "LabelSettingsEpubsAllowScriptedContent": "Skriptinhalte in Epubs zulassen", From 27843c3f9b85dfa1bfdf36b044100df6a27951ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=93=D0=BE=D1=80?= =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D1=96=D1=87?= Date: Sat, 22 Nov 2025 16:55:53 +0100 Subject: [PATCH 037/117] Translated using Weblate (Ukrainian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/ --- client/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/uk.json b/client/strings/uk.json index 32546fe03..1db23322f 100644 --- a/client/strings/uk.json +++ b/client/strings/uk.json @@ -383,7 +383,7 @@ "LabelFolders": "Теки", "LabelFontBold": "Жирний", "LabelFontBoldness": "Товщина шрифту", - "LabelFontFamily": "Гарнітура", + "LabelFontFamily": "Сімейство шрифтів", "LabelFontItalic": "Курсив", "LabelFontScale": "Розмір шрифту", "LabelFontStrikethrough": "Закреслений", From c2fd87d55cb0fab3b57ef3bac3534bdba52c6d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A8lia=20Garriga?= Date: Mon, 24 Nov 2025 12:16:23 +0100 Subject: [PATCH 038/117] Translated using Weblate (Catalan) Currently translated at 91.8% (1068 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ca/ --- client/strings/ca.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/strings/ca.json b/client/strings/ca.json index d882385dc..dbda8b8e4 100644 --- a/client/strings/ca.json +++ b/client/strings/ca.json @@ -1,5 +1,6 @@ { "ButtonAdd": "Afegeix", + "ButtonAddApiKey": "Afegeix clau API", "ButtonAddChapters": "Afegeix capítols", "ButtonAddDevice": "Afegeix un aparell", "ButtonAddLibrary": "Afegeix una biblioteca", @@ -20,6 +21,7 @@ "ButtonChooseAFolder": "Trieu una carpeta", "ButtonChooseFiles": "Trieu fitxers", "ButtonClearFilter": "Neteja el filtre", + "ButtonClose": "Tanca", "ButtonCloseFeed": "Tanca el canal", "ButtonCloseSession": "Tanca la sessió oberta", "ButtonCollections": "Col·leccions", @@ -119,11 +121,13 @@ "HeaderAccount": "Compte", "HeaderAddCustomMetadataProvider": "Afegeix un proveïdor de metadades personalitzat", "HeaderAdvanced": "Avançat", + "HeaderApiKeys": "Claus API", "HeaderAppriseNotificationSettings": "Paràmetres de notificacions Apprise", "HeaderAudioTracks": "Pistes d'àudio", "HeaderAudiobookTools": "Eines de gestió de fitxers de l'audiollibre", "HeaderAuthentication": "Autenticació", "HeaderBackups": "Còpies de Seguretat", + "HeaderBulkChapterModal": "Afegeix capítols múltiples", "HeaderChangePassword": "Canvia Contrasenya", "HeaderChapters": "Capítols", "HeaderChooseAFolder": "Tria una Carpeta", From ff9e87c4d57a3871d7850acd125bd9a179638225 Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Mon, 24 Nov 2025 07:38:43 +0100 Subject: [PATCH 039/117] Translated using Weblate (Swedish) Currently translated at 99.9% (1162 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index 2b8a9de3e..7bd9753b8 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -385,13 +385,13 @@ "LabelFontBoldness": "Fetstil", "LabelFontFamily": "Typsnittsfamilj", "LabelFontItalic": "Kursiv", - "LabelFontScale": "Skala på typsnitt", + "LabelFontScale": "Storlek på typsnitt", "LabelFontStrikethrough": "Genomstruken", "LabelFormat": "Format", "LabelFull": "Komplett", "LabelGenre": "Kategori", "LabelGenres": "Kategorier", - "LabelHardDeleteFile": "Hård radering av fil", + "LabelHardDeleteFile": "Permanent radering av fil", "LabelHasEbook": "Har e-bok", "LabelHasSupplementaryEbook": "Har kompletterande e-bok", "LabelHideSubtitles": "Dölj underrubriker", @@ -588,7 +588,7 @@ "LabelSettingsBookshelfViewHelp": "Bakgrund med ett utseende liknande en bokhylla i trä", "LabelSettingsChromecastSupport": "Stöd för Chromecast", "LabelSettingsDateFormat": "Datumformat", - "LabelSettingsEnableWatcher": "Bevaka biblioteken automatiskt efter ändringar", + "LabelSettingsEnableWatcher": "Bevaka automatiskt förändringar i biblioteken", "LabelSettingsEnableWatcherForLibrary": "Bevaka biblioteket automatiskt efter ändringar", "LabelSettingsEnableWatcherHelp": "Aktiverar automatik att upptäcka när objekt
adderas, uppdateras eller raderas.
OBS: Kräver en omstart av servern", "LabelSettingsEpubsAllowScriptedContent": "Tillåt e-böcker i epubs-format som innehåller script", @@ -790,7 +790,7 @@ "MessageConfirmRemoveAuthor": "Är du säker på att du vill ta bort författaren \"{0}\"?", "MessageConfirmRemoveCollection": "Är du säker på att du vill ta bort samlingen \"{0}\"?", "MessageConfirmRemoveEpisode": "Är du säker på att du vill radera avsnittet \"{0}\"?", - "MessageConfirmRemoveEpisodeNote": "Anmärkning: Detta tar inte bort ljudfilen om inte \"Hard delete file\" är aktivt", + "MessageConfirmRemoveEpisodeNote": "OBSERERA: Detta tar inte bort ljudfilen om inte \"Permanent radering av fil\" är aktiverad", "MessageConfirmRemoveEpisodes": "Är du säker på att du vill radera {0} avsnitt?", "MessageConfirmRemoveListeningSessions": "Är du säker på att du vill radera {0} lyssningstillfällen?", "MessageConfirmRemoveMetadataFiles": "Är du säker på att du vill radera filerna 'metadata.{0}' i alla mappar i ditt bibliotek?", From 44d7deae99c44b90da0d965f2b954d01bdc1f16d Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Sun, 23 Nov 2025 09:39:59 +0100 Subject: [PATCH 040/117] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index b7e4eac30..1a95256ab 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -383,7 +383,7 @@ "LabelFolders": "文件夹", "LabelFontBold": "加粗", "LabelFontBoldness": "字体粗细", - "LabelFontFamily": "字体系列", + "LabelFontFamily": "字体", "LabelFontItalic": "斜体", "LabelFontScale": "字体比例", "LabelFontStrikethrough": "删除线", From 594589da3d015f3b54d88955e722e11faa6187de Mon Sep 17 00:00:00 2001 From: ugyes Date: Mon, 24 Nov 2025 12:23:31 +0100 Subject: [PATCH 041/117] Translated using Weblate (Hungarian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/ --- client/strings/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/hu.json b/client/strings/hu.json index 6c1f9abc9..574fd1c9b 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -383,7 +383,7 @@ "LabelFolders": "Mappák", "LabelFontBold": "Félkövér", "LabelFontBoldness": "Betű vastagság", - "LabelFontFamily": "Betűtípus család", + "LabelFontFamily": "Betűcsalád", "LabelFontItalic": "Dőlt", "LabelFontScale": "Betűméret skála", "LabelFontStrikethrough": "Áthúzott", From 7393c03218be9595b6fb498c63238a6c450f9eca Mon Sep 17 00:00:00 2001 From: B0rax Date: Mon, 24 Nov 2025 07:47:31 +0100 Subject: [PATCH 042/117] Translated using Weblate (German) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/de.json b/client/strings/de.json index 8398a7211..5f7f81cc4 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -383,7 +383,7 @@ "LabelFolders": "Verzeichnisse", "LabelFontBold": "Fett", "LabelFontBoldness": "Schriftstärke", - "LabelFontFamily": "Schriftfamilie", + "LabelFontFamily": "Schrift Familie", "LabelFontItalic": "Kursiv", "LabelFontScale": "Schriftgröße", "LabelFontStrikethrough": "Durchgestrichen", From 53a416fd285f173c1c36bc2987d26cf64dfb99bc Mon Sep 17 00:00:00 2001 From: Artur Date: Mon, 24 Nov 2025 23:06:39 +0100 Subject: [PATCH 043/117] Translated using Weblate (Polish) Currently translated at 88.9% (1035 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index 6f83720de..4ad7fe64f 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -76,7 +76,7 @@ "ButtonReScan": "Ponowne skanowanie", "ButtonRead": "Czytaj", "ButtonReadLess": "Pokaż mniej", - "ButtonReadMore": "Pokaż więcej", + "ButtonReadMore": "Czytaj więcej", "ButtonRefresh": "Odśwież", "ButtonRemove": "Usuń", "ButtonRemoveAll": "Usuń wszystko", @@ -96,7 +96,7 @@ "ButtonScrollRight": "Przewiń w prawo", "ButtonSearch": "Szukaj", "ButtonSelectFolderPath": "Wybierz ścieżkę folderu", - "ButtonSeries": "Seria", + "ButtonSeries": "Serial", "ButtonSetChaptersFromTracks": "Ustawiaj rozdziały na podstawie utworów", "ButtonShare": "Udostępnij", "ButtonShiftTimes": "Przesunięcie czasowe", @@ -363,7 +363,7 @@ "LabelExpiresAt": "Wygasa w", "LabelExpiresInSeconds": "Wygasa za (sekund)", "LabelExpiresNever": "Nigdy", - "LabelExplicit": "Nieprzyzwoite", + "LabelExplicit": "18+", "LabelExplicitChecked": "Nieprzyzwoite (sprawdzone)", "LabelExplicitUnchecked": "Przyzwoite (niesprawdzone)", "LabelExportOPML": "Wyeksportuj OPML", @@ -383,7 +383,7 @@ "LabelFolders": "Foldery", "LabelFontBold": "Pogrubiony", "LabelFontBoldness": "Grubość czcionki", - "LabelFontFamily": "Rodzina czcionek", + "LabelFontFamily": "Krój pisma", "LabelFontItalic": "Kursywa", "LabelFontScale": "Rozmiar czcionki", "LabelFontStrikethrough": "Przekreślony", @@ -587,7 +587,7 @@ "LabelSettingsBookshelfViewHelp": "Widok półki z książkami", "LabelSettingsChromecastSupport": "Wsparcie Chromecast", "LabelSettingsDateFormat": "Format daty", - "LabelSettingsEnableWatcher": "Automatyczne skanowanie bibliotek w poszukiwaniu zmian", + "LabelSettingsEnableWatcher": "Automatyczne monitorowanie bibliotek w poszukiwaniu zmian", "LabelSettingsEnableWatcherForLibrary": "Automatyczne skanowanie biblioteki w poszukiwaniu zmian", "LabelSettingsEnableWatcherHelp": "Włącza automatyczne dodawanie/aktualizację pozycji gdy wykryte zostaną zmiany w plikach. Wymaga restartu serwera", "LabelSettingsEpubsAllowScriptedContent": "Zezwalanie na skrypty w plikach epub", @@ -629,6 +629,7 @@ "LabelShowSubtitles": "Pokaż Napisy", "LabelSize": "Rozmiar", "LabelSleepTimer": "Wyłącznik czasowy", + "LabelSlug": "slug (części URL która identyfikuje konkretny zasób)", "LabelSortAscending": "Rosnąco", "LabelSortDescending": "Malejąco", "LabelSortPubDate": "Sortuj według daty publikacji", @@ -720,6 +721,7 @@ "LabelViewPlayerSettings": "Zobacz ustawienia odtwarzacza", "LabelViewQueue": "Wyświetlaj kolejkę odtwarzania", "LabelVolume": "Głośność", + "LabelWebRedirectURLsDescription": "Zezwól na te adresy URL w swoim dostawcy OAuth, aby umożliwić przekierowanie z powrotem do aplikacji internetowej po zalogowaniu:", "LabelWeekdaysToRun": "Dni tygodnia", "LabelXBooks": "{0} książek", "LabelXItems": "{0} elementów", @@ -740,6 +742,7 @@ "MessageBackupsLocationNoEditNote": "Uwaga: Lokalizacja kopii zapasowej jest ustawiona poprzez zmienną środowiskową i nie może być tutaj zmieniona.", "MessageBackupsLocationPathEmpty": "Ścieżka do kopii zapasowej nie może być pusta", "MessageBatchEditPopulateMapDetailsAllHelp": "Wypełnij włączone pola danymi ze wszystkich elementów. Pola z wieloma wartościami zostaną scalone.", + "MessageBatchEditPopulateMapDetailsItemHelp": "Wypełnij pola szczegółów mapy włączonej danymi z tego elementu", "MessageBatchQuickMatchDescription": "Quick Match będzie próbował dodać brakujące okładki i metadane dla wybranych elementów. Włącz poniższe opcje, aby umożliwić Quick Match nadpisanie istniejących okładek i/lub metadanych.", "MessageBookshelfNoCollections": "Nie posiadasz jeszcze żadnych kolekcji", "MessageBookshelfNoCollectionsHelp": "Kolekcje są publiczne. Wszyscy użytkownicy mający dostęp do biblioteki mogą je zobaczyć.", @@ -885,6 +888,7 @@ "MessageScheduleRunEveryWeekdayAtTime": "Uruchom w każdy {0} o {1}", "MessageSearchResultsFor": "Wyniki wyszukiwania dla", "MessageSelected": "{0} wybranych", + "MessageSeriesSequenceCannotContainSpaces": "Sekwencja serii nie może zawierać spacji", "MessageServerCouldNotBeReached": "Nie udało się uzyskać połączenia z serwerem", "MessageSetChaptersFromTracksDescription": "Ustaw rozdziały, używając każdego pliku audio jako rozdziału, a tytuł rozdziału jako nazwy pliku audio.", "MessageShareExpirationWillBe": "Czas udostępniania {0}", @@ -902,8 +906,11 @@ "MessageTaskFailedToBackupAudioFile": "Nieudana próba wykonania kopii zapasowego pliku audio \"{0}\"", "MessageTaskFailedToCreateCacheDirectory": "Nie udało się utworzyć katalogu cache", "MessageTaskFailedToEmbedMetadataInFile": "Nie udało się wbudować metadanych do pliku \"{0}\"", + "MessageTaskFailedToMergeAudioFiles": "Nie udało się połączyć plików audio", + "MessageTaskFailedToMoveM4bFile": "Nie udało się przenieść pliku m4b", "MessageTaskFailedToWriteMetadataFile": "Niepowodzenie zapisania pliku metadanych", "MessageTaskNoFilesToScan": "Brak plików do skanowania", + "MessageTaskOpmlImport": "Importuj OPML", "MessageTaskScanItemsAdded": "Dodano {0}", "MessageTaskScanItemsMissing": "Brakuje {0}", "MessageTaskScanItemsUpdated": "Zaktualizowano {0}", From 7a39d581a1f0dad2a3f4d38b0caedf0fdcbfcb03 Mon Sep 17 00:00:00 2001 From: Grzegorz Orlowski Date: Mon, 24 Nov 2025 23:02:45 +0100 Subject: [PATCH 044/117] Translated using Weblate (Polish) Currently translated at 88.9% (1035 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/strings/pl.json b/client/strings/pl.json index 4ad7fe64f..944492681 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -668,6 +668,7 @@ "LabelThemeDark": "Ciemny", "LabelThemeLight": "Jasny", "LabelThemeSepia": "Sepia", + "LabelTimeBase": "Podstawa czasu", "LabelTimeDurationXHours": "{0} godzin", "LabelTimeDurationXMinutes": "{0} minuty", "LabelTimeDurationXSeconds": "{0} sekundy", @@ -814,6 +815,7 @@ "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.", "MessageHeatmapListeningTimeTooltip": "{0} słucha na {1}", + "MessageHeatmapNoListeningSessions": "Brak sesji słuchania na {0}", "MessageImportantNotice": "Ważna informacja!", "MessageInsertChapterBelow": "Wstaw rozdział poniżej", "MessageInvalidAsin": "Nieprawidłowy ASIN", From be27908d44d56e470bc89fe28a5e69871b1fa3e5 Mon Sep 17 00:00:00 2001 From: Plazec Date: Mon, 24 Nov 2025 23:28:12 +0100 Subject: [PATCH 045/117] Translated using Weblate (Czech) Currently translated at 99.5% (1158 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/ --- client/strings/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/cs.json b/client/strings/cs.json index 2d07ce4ef..4b20c2a59 100644 --- a/client/strings/cs.json +++ b/client/strings/cs.json @@ -392,7 +392,7 @@ "LabelGenre": "Žánr", "LabelGenres": "Žánry", "LabelHardDeleteFile": "Trvale smazat soubor", - "LabelHasEbook": "Obsahuje elektronickou knihu", + "LabelHasEbook": "Má e-knihu", "LabelHasSupplementaryEbook": "Obsahuje doplňkovou e-knihu", "LabelHideSubtitles": "Skrýt titulky", "LabelHighestPriority": "Nejvyšší priorita", From 623c2fba1248935df7d2b3a62e2816fc1679e0e5 Mon Sep 17 00:00:00 2001 From: zard Kim Date: Wed, 26 Nov 2025 09:28:52 +0100 Subject: [PATCH 046/117] Translated using Weblate (Korean) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ko/ --- client/strings/ko.json | 1166 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 1165 insertions(+), 1 deletion(-) diff --git a/client/strings/ko.json b/client/strings/ko.json index 0967ef424..a4dea5de4 100644 --- a/client/strings/ko.json +++ b/client/strings/ko.json @@ -1 +1,1165 @@ -{} +{ + "ButtonAdd": "추가", + "ButtonAddApiKey": "API Key 추가", + "ButtonAddChapters": "챕터 추가", + "ButtonAddDevice": "기기 추가", + "ButtonAddLibrary": "라이브러리 추가", + "ButtonAddPodcasts": "팟케스트 추가", + "ButtonAddUser": "사용자 추가", + "ButtonAddYourFirstLibrary": "첫 라이브러리 추가", + "ButtonApply": "적용", + "ButtonApplyChapters": "챕터 적용", + "ButtonAuthors": "작가", + "ButtonBack": "뒤로", + "ButtonBatchEditPopulateFromExisting": "기존에서 채우기", + "ButtonBatchEditPopulateMapDetails": "지도 세부 정보 채우기", + "ButtonBrowseForFolder": "폴더 찾아보기", + "ButtonCancel": "취소", + "ButtonCancelEncode": "인코딩 취소", + "ButtonChangeRootPassword": "루트 비밀번호 변경", + "ButtonCheckAndDownloadNewEpisodes": "새로운 에피소드 확인 및 다운로드", + "ButtonChooseAFolder": "폴더를 선택", + "ButtonChooseFiles": "파일 선택", + "ButtonClearFilter": "필터 지우기", + "ButtonClose": "닫기", + "ButtonCloseFeed": "피드 닫기", + "ButtonCloseSession": "열린 세션 닫기", + "ButtonCollections": "컬렉션", + "ButtonConfigureScanner": "스캐너 구성", + "ButtonCreate": "만들기", + "ButtonCreateBackup": "백업 만들기", + "ButtonDelete": "삭제", + "ButtonDownloadQueue": "대기줄", + "ButtonEdit": "편집", + "ButtonEditChapters": "챕터 편집", + "ButtonEditPodcast": "팟캐스트 편집", + "ButtonEnable": "활성화", + "ButtonFireAndFail": "Fire and Fail", + "ButtonFireOnTest": "Fire onTest 이벤트", + "ButtonForceReScan": "강제 재스캔", + "ButtonFullPath": "전체 경로", + "ButtonHide": "숨기기", + "ButtonHome": "홈", + "ButtonIssues": "이슈", + "ButtonJumpBackward": "뒤로 점프", + "ButtonJumpForward": "앞으로 점프", + "ButtonLatest": "최신", + "ButtonLibrary": "라이브러리", + "ButtonLogout": "로그아웃", + "ButtonLookup": "Lookup", + "ButtonManageTracks": "트랙 관리", + "ButtonMapChapterTitles": "지도 장 제목", + "ButtonMatchAllAuthors": "모든 저자와 일치", + "ButtonMatchBooks": "일치한 책", + "ButtonNevermind": "괜찮아요", + "ButtonNext": "다음", + "ButtonNextChapter": "다음 장", + "ButtonNextItemInQueue": "대기열의 다음 항목", + "ButtonOk": "확인", + "ButtonOpenFeed": "피드 열기", + "ButtonOpenManager": "오픈 매니저", + "ButtonPause": "일시정지", + "ButtonPlay": "재생", + "ButtonPlayAll": "모두 재생", + "ButtonPlaying": "재생중", + "ButtonPlaylists": "재생목록", + "ButtonPrevious": "이전", + "ButtonPreviousChapter": "이전 챕터", + "ButtonProbeAudioFile": "Probe 오디오 파일", + "ButtonPurgeAllCache": "모든 캐시 삭제", + "ButtonPurgeItemsCache": "항목 캐시 삭제", + "ButtonQueueAddItem": "대기열에 추가", + "ButtonQueueRemoveItem": "대기열에서 제거", + "ButtonQuickEmbed": "빠른 임베드", + "ButtonQuickEmbedMetadata": "빠른 임베드 메타데이터", + "ButtonQuickMatch": "퀵 매치", + "ButtonReScan": "재스캔", + "ButtonRead": "읽기", + "ButtonReadLess": "덜 읽기", + "ButtonReadMore": "더 읽기", + "ButtonRefresh": "새로고침", + "ButtonRemove": "제거", + "ButtonRemoveAll": "모두 제거", + "ButtonRemoveAllLibraryItems": "모든 라이브러리 항목 제거", + "ButtonRemoveFromContinueListening": "계속 듣기에서 제거", + "ButtonRemoveFromContinueReading": "계속 읽기에서 제거", + "ButtonRemoveSeriesFromContinueSeries": "계속 시리즈에서 시리즈 제거", + "ButtonReset": "리셋", + "ButtonResetToDefault": "기본값으로 재설정", + "ButtonRestore": "복구", + "ButtonSave": "저장", + "ButtonSaveAndClose": "저장 후 닫기", + "ButtonSaveTracklist": "트랙리스트 저장", + "ButtonScan": "스캔", + "ButtonScanLibrary": "라이브러리 스캔", + "ButtonScrollLeft": "왼쪽 스크롤", + "ButtonScrollRight": "오른쪽 스크롤", + "ButtonSearch": "검색", + "ButtonSelectFolderPath": "폴더 경로 선택", + "ButtonSeries": "시리즈", + "ButtonSetChaptersFromTracks": "트랙에서 챕터 설정", + "ButtonShare": "공유", + "ButtonShiftTimes": "시간 이동", + "ButtonShow": "보기", + "ButtonStartM4BEncode": "M4B 인코딩 시작", + "ButtonStartMetadataEmbed": "메타데이터 삽입 시작", + "ButtonStats": "통계", + "ButtonSubmit": "제출", + "ButtonTest": "테스트", + "ButtonUnlinkOpenId": "OpenID 연결 해제", + "ButtonUpload": "업로드", + "ButtonUploadBackup": "백업 업로드", + "ButtonUploadCover": "커버 업로드", + "ButtonUploadOPMLFile": "OPML 파일 업로드", + "ButtonUserDelete": "사용자 {0} 삭제", + "ButtonUserEdit": "사용자 {0} 편집", + "ButtonViewAll": "모두 보기", + "ButtonYes": "예", + "ErrorUploadFetchMetadataAPI": "메타데이터를 가져오는 중 오류가 발생했습니다.", + "ErrorUploadFetchMetadataNoResults": "메타데이터를 가져올 수 없습니다. 제목 및/또는 작성자를 업데이트해 보세요.", + "ErrorUploadLacksTitle": "제목이 있어야 합니다", + "HeaderAccount": "계정", + "HeaderAddCustomMetadataProvider": "사용자 정의 메타데이터 공급자 추가", + "HeaderAdvanced": "고급", + "HeaderApiKeys": "API 키", + "HeaderAppriseNotificationSettings": "Apprise 알림 설정", + "HeaderAudioTracks": "오디오 트랙", + "HeaderAudiobookTools": "오디오북 파일 관리 도구", + "HeaderAuthentication": "인증", + "HeaderBackups": "백업", + "HeaderBulkChapterModal": "여러 챕터 추가", + "HeaderChangePassword": "비밀번호 변경", + "HeaderChapters": "챕터", + "HeaderChooseAFolder": "폴더 선택", + "HeaderCollection": "컬렉션", + "HeaderCollectionItems": "컬렉션 항목", + "HeaderCover": "커버", + "HeaderCurrentDownloads": "현재 다운로드", + "HeaderCustomMessageOnLogin": "로그인시 사용자 정의 메시지", + "HeaderCustomMetadataProviders": "사용자 정의 메타데이터 공급자", + "HeaderDetails": "세부사항", + "HeaderDownloadQueue": "다운로드 대기열", + "HeaderEbookFiles": "전자책 파일", + "HeaderEmail": "이메일", + "HeaderEmailSettings": "이메일 설정", + "HeaderEpisodes": "에피소드", + "HeaderEreaderDevices": "전자책 리더기", + "HeaderEreaderSettings": "전자책 리더 설정", + "HeaderFiles": "파일", + "HeaderFindChapters": "챕터 찾기", + "HeaderIgnoredFiles": "무시된 파일", + "HeaderItemFiles": "항목 파일", + "HeaderItemMetadataUtils": "항목 메타데이터 유틸리티", + "HeaderLastListeningSession": "마지막 청취 세션", + "HeaderLatestEpisodes": "최신 에피소드", + "HeaderLibraries": "라이브러리", + "HeaderLibraryFiles": "라이브러리 파일", + "HeaderLibraryStats": "라이브러리 통계", + "HeaderListeningSessions": "청취 세션", + "HeaderListeningStats": "청취 통계", + "HeaderLogin": "로그인", + "HeaderLogs": "로그", + "HeaderManageGenres": "장르 관리", + "HeaderManageTags": "태그 관리", + "HeaderMapDetails": "지도 세부 정보", + "HeaderMatch": "일치", + "HeaderMetadataOrderOfPrecedence": "메타데이터 우선 순위", + "HeaderMetadataToEmbed": "포함할 메타데이터", + "HeaderNewAccount": "새 계정", + "HeaderNewApiKey": "새로운 API 키", + "HeaderNewLibrary": "새 라이브러리", + "HeaderNotificationCreate": "알림 생성", + "HeaderNotificationUpdate": "업데이트 알림", + "HeaderNotifications": "알림", + "HeaderOpenIDConnectAuthentication": "OpenID Connect 인증", + "HeaderOpenListeningSessions": "청취 세션 열기", + "HeaderOpenRSSFeed": "RSS 피드 열기", + "HeaderOtherFiles": "기타 파일", + "HeaderPasswordAuthentication": "비밀번호 인증", + "HeaderPermissions": "권한", + "HeaderPlayerQueue": "플레이어 대기열", + "HeaderPlayerSettings": "플레이어 설정", + "HeaderPlaylist": "재생목록", + "HeaderPlaylistItems": "재생 목록 항목", + "HeaderPodcastsToAdd": "추가할 팟캐스트", + "HeaderPresets": "사전 설정", + "HeaderPreviewCover": "커버 미리보기", + "HeaderRSSFeedGeneral": "RSS 자세히", + "HeaderRSSFeedIsOpen": "RSS 피드가 열려 있습니다", + "HeaderRSSFeeds": "RSS 피드", + "HeaderRemoveEpisode": "에피소드 제거", + "HeaderRemoveEpisodes": "{0}개 에피소드 제거", + "HeaderSavedMediaProgress": "저장된 미디어 진행 상황", + "HeaderSchedule": "일정", + "HeaderScheduleEpisodeDownloads": "에피소드 자동 다운로드 일정 설정", + "HeaderScheduleLibraryScans": "라이브러리 자동 스캔 일정", + "HeaderSession": "세션", + "HeaderSetBackupSchedule": "백업 일정 설정", + "HeaderSettings": "설정", + "HeaderSettingsDisplay": "디스플레이", + "HeaderSettingsExperimental": "실험적 특징", + "HeaderSettingsGeneral": "일반", + "HeaderSettingsScanner": "스캐너", + "HeaderSettingsSecurity": "보안", + "HeaderSettingsWebClient": "웹 클라이언트", + "HeaderSleepTimer": "슬립 타이머", + "HeaderStatsLargestItems": "가장 큰 항목", + "HeaderStatsLongestItems": "가장 긴 항목(시간)", + "HeaderStatsMinutesListeningChart": "청취 시간(지난 7일)", + "HeaderStatsRecentSessions": "최근 세션", + "HeaderStatsTop10Authors": "상위 10명의 작가", + "HeaderStatsTop5Genres": "상위 5개 장르", + "HeaderTableOfContents": "목차", + "HeaderTools": "도구", + "HeaderUpdateAccount": "계정 업데이트", + "HeaderUpdateApiKey": "API 키 업데이트", + "HeaderUpdateAuthor": "작가 업데이트", + "HeaderUpdateDetails": "업데이트 세부 정보", + "HeaderUpdateLibrary": "라이브러리 업데이트y", + "HeaderUsers": "사용자", + "HeaderYearReview": "{0}년안의 리뷰", + "HeaderYourStats": "내 통계", + "LabelAbridged": "요약", + "LabelAbridgedChecked": "요약(확인됨)", + "LabelAbridgedUnchecked": "요약되지 않음(검토되지 않음)", + "LabelAccessibleBy": "접근 가능한", + "LabelAccountType": "계정 유형", + "LabelAccountTypeAdmin": "관리자", + "LabelAccountTypeGuest": "손님", + "LabelAccountTypeUser": "사용자", + "LabelActivities": "활동", + "LabelActivity": "활동적인", + "LabelAddToCollection": "컬렉션에 추가", + "LabelAddToCollectionBatch": "컬렉션에 {0}권의 책 추가", + "LabelAddToPlaylist": "재생목록에 추가", + "LabelAddToPlaylistBatch": "재생 목록에 {0}개 항목 추가", + "LabelAddedAt": "추가됨", + "LabelAddedDate": "{0} 추가됨", + "LabelAdminUsersOnly": "관리자 사용자만", + "LabelAll": "모두", + "LabelAllEpisodesDownloaded": "모든 에피소드 다운로드됨", + "LabelAllUsers": "모든 사용자", + "LabelAllUsersExcludingGuests": "게스트를 제외한 모든 사용자", + "LabelAllUsersIncludingGuests": "게스트를 포함한 모든 사용자", + "LabelAlreadyInYourLibrary": "이미 내 라이브러리에 있습니다", + "LabelApiKeyCreated": "API 키 \"{0}\"이(가) 성공적으로 생성되었습니다.", + "LabelApiKeyCreatedDescription": "API 키를 지금 복사해 두세요. 다시 볼 수 없게 됩니다.", + "LabelApiKeyUser": "사용자를 대신하여 행동", + "LabelApiKeyUserDescription": "이 API 키는 해당 API 키를 대신하는 사용자와 동일한 권한을 갖습니다. 이는 사용자가 요청을 하는 것과 동일하게 로그에 기록됩니다.", + "LabelApiToken": "API 토큰", + "LabelAppend": "첨부", + "LabelAudioBitrate": "오디오 비트레이트(예: 128k)", + "LabelAudioChannels": "오디오 채널(1 또는 2)", + "LabelAudioCodec": "오디오 코덱", + "LabelAuthor": "작가", + "LabelAuthorFirstLast": "작가 (이름 성)", + "LabelAuthorLastFirst": "작가 (성, 이름)", + "LabelAuthors": "작가", + "LabelAutoDownloadEpisodes": "에피소드 자동 다운로드", + "LabelAutoFetchMetadata": "메타데이터 자동 가져오기", + "LabelAutoFetchMetadataHelp": "업로드를 간소화하기 위해 제목, 저자, 시리즈에 대한 메타데이터를 가져옵니다. 업로드 후 추가 메타데이터를 일치시켜야 할 수도 있습니다.", + "LabelAutoLaunch": "자동 실행", + "LabelAutoLaunchDescription": "로그인 페이지로 이동할 때 자동으로 인증 공급자로 리디렉션합니다(수동 재정의 경로 /login?autoLaunch=0)", + "LabelAutoRegister": "자동 등록", + "LabelAutoRegisterDescription": "로그인 후 자동으로 새 사용자를 생성합니다.", + "LabelBackToUser": "사용자에게 돌아가기", + "LabelBackupAudioFiles": "오디오 파일 백업", + "LabelBackupLocation": "백업 위치", + "LabelBackupsEnableAutomaticBackups": "자동 백업", + "LabelBackupsEnableAutomaticBackupsHelp": "/metadata/backups에 저장된 백업", + "LabelBackupsMaxBackupSize": "최대 백업 크기(GB) (무제한의 경우 0)", + "LabelBackupsMaxBackupSizeHelp": "잘못된 구성에 대한 보호 조치로, 구성된 크기를 초과하면 백업이 실패합니다.", + "LabelBackupsNumberToKeep": "보관할 백업 수", + "LabelBackupsNumberToKeepHelp": "한 번에 1개의 백업만 제거되므로 이미 이보다 많은 백업이 있는 경우 수동으로 제거해야 합니다.", + "LabelBitrate": "비트레이트", + "LabelBonus": "보너스", + "LabelBooks": "전자책", + "LabelButtonText": "버튼 텍스트", + "LabelByAuthor": "by {0}", + "LabelChangePassword": "비밀번호 변경", + "LabelChannels": "채널", + "LabelChapterCount": "{0} 챕터", + "LabelChapterTitle": "챕터 제목", + "LabelChapters": "챕터", + "LabelChaptersFound": "챕터 발견됨", + "LabelClickForMoreInfo": "자세한 내용을 보려면 클릭", + "LabelClickToUseCurrentValue": "현재 값을 사용하려면 클릭", + "LabelClosePlayer": "플레이어 닫기", + "LabelCodec": "코덱", + "LabelCollapseSeries": "시리즈 펴기", + "LabelCollapseSubSeries": "하위 시리즈 축소", + "LabelCollection": "컬렉션", + "LabelCollections": "컬렉션", + "LabelComplete": "완료", + "LabelConfirmPassword": "비밀번호 확인", + "LabelContinueListening": "계속 듣기", + "LabelContinueReading": "계속 읽기", + "LabelContinueSeries": "시리즈 계속하기", + "LabelCorsAllowed": "허용된 CORS Origins", + "LabelCover": "커버", + "LabelCoverImageURL": "커버 이미지 URL", + "LabelCoverProvider": "커버 제공자", + "LabelCreatedAt": "생성일", + "LabelCronExpression": "Cron Expression", + "LabelCurrent": "현재재", + "LabelCurrently": "현재:", + "LabelCustomCronExpression": "사용자 정의 Cron 표현식:", + "LabelDatetime": "일시", + "LabelDays": "일", + "LabelDeleteFromFileSystemCheckbox": "파일 시스템에서 삭제(데이터베이스에서만 제거하려면 선택 취소)", + "LabelDescription": "설명", + "LabelDeselectAll": "모두 선택 해제", + "LabelDetectedPattern": "감지된 패턴:", + "LabelDevice": "장치", + "LabelDeviceInfo": "장치 정보", + "LabelDeviceIsAvailableTo": "사용할 수 있는 장치...", + "LabelDirectory": "디렉토리", + "LabelDiscFromFilename": "파일 이름의 디스크", + "LabelDiscFromMetadata": "메타데이터의 디스크", + "LabelDiscover": "발견", + "LabelDownload": "다운로드", + "LabelDownloadNEpisodes": "{0}개 에피소드 다운로드", + "LabelDownloadable": "다운로드 가능", + "LabelDuration": "Duration", + "LabelDurationComparisonExactMatch": "(정확히 일치)", + "LabelDurationComparisonLonger": "({0} 더 길음)", + "LabelDurationComparisonShorter": "({0} 더 짧음)", + "LabelDurationFound": "찾은 기간:", + "LabelEbook": "전자책", + "LabelEbooks": "전자책", + "LabelEdit": "편집", + "LabelEmail": "이메일", + "LabelEmailSettingsFromAddress": "보낸 사람 주소", + "LabelEmailSettingsRejectUnauthorized": "승인되지 않은 인증서 거부", + "LabelEmailSettingsRejectUnauthorizedHelp": "SSL 인증서 유효성 검사를 비활성화하면 중간자 공격과 같은 보안 위험에 노출될 수 있습니다. 이 옵션의 의미를 이해하고 연결하려는 메일 서버를 신뢰할 수 있는 경우에만 비활성화하세요.", + "LabelEmailSettingsSecure": "보안", + "LabelEmailSettingsSecureHelp": "true이면 서버에 연결할 때 TLS를 사용합니다. false이면 서버가 STARTTLS 확장을 지원하는 경우 TLS가 사용됩니다. 대부분의 경우 포트 465에 연결하는 경우 이 값을 true로 설정하고, 포트 587 또는 25를 사용하는 경우 false로 설정합니다. (nodemailer.com/smtp/#authentication에서 발췌)", + "LabelEmailSettingsTestAddress": "테스트 주소", + "LabelEmbeddedCover": "내장형 커버", + "LabelEnable": "활성화", + "LabelEncodingBackupLocation": "원본 오디오 파일의 백업이 저장되는 위치 :", + "LabelEncodingChaptersNotEmbedded": "다중 트랙 오디오북에는 챕터가 포함되지 않습니다..", + "LabelEncodingClearItemCache": "주기적으로 항목 캐시를 삭제하세요.", + "LabelEncodingFinishedM4B": "완성된 M4B는 오디오북 저장 폴더 위치:", + "LabelEncodingInfoEmbedded": "메타데이터는 오디오북 폴더 내의 오디오 트랙에 포함됩니다.", + "LabelEncodingStartedNavigation": "작업이 시작되면 이 페이지에서 벗어날 수 있습니다.", + "LabelEncodingTimeWarning": "인코딩은 최대 30분이 걸릴 수 있습니다.", + "LabelEncodingWarningAdvancedSettings": "경고: ffmpeg 인코딩 옵션에 익숙하지 않은 경우 이러한 설정을 업데이트하지 마세요.", + "LabelEncodingWatcherDisabled": "시청 기능을 비활성화한 경우 나중에 오디오북을 다시 스캔해야 합니다.", + "LabelEnd": "마지막", + "LabelEndOfChapter": "챕터의 마지작", + "LabelEpisode": "에피소드", + "LabelEpisodeNotLinkedToRssFeed": "에피소드가 RSS 피드에 연결되지 않았습니다.", + "LabelEpisodeNumber": "에피소드 #{0}", + "LabelEpisodeTitle": "에피소드 제목", + "LabelEpisodeType": "에피소드 유형", + "LabelEpisodeUrlFromRssFeed": "RSS 피드의 에피소드 URL", + "LabelEpisodes": "에피소드", + "LabelEpisodic": "에피소드식", + "LabelExample": "예제", + "LabelExpandSeries": "시리즈 확장", + "LabelExpandSubSeries": "하위 시리즈 확장", + "LabelExpired": "만료됨", + "LabelExpiresAt": "만료일", + "LabelExpiresInSeconds": "(초) 후에 만료됩니다", + "LabelExpiresNever": "Never", + "LabelExplicit": "명백한", + "LabelExplicitChecked": "명시적(확인됨)", + "LabelExplicitUnchecked": "명시적이지 않음(체크되지 않음)", + "LabelExportOPML": "OPML 내보내기", + "LabelFeedURL": "피드 URL", + "LabelFetchingMetadata": "메타데이터 가져오는중", + "LabelFile": "파일", + "LabelFileBirthtime": "파일 생년월일", + "LabelFileBornDate": "생성된 {0}", + "LabelFileModified": "파일 수정됨", + "LabelFileModifiedDate": "수정된 {0}", + "LabelFilename": "파일 이름", + "LabelFilterByUser": "사용자별 필터링", + "LabelFindEpisodes": "에피소드 찾기", + "LabelFinished": "완료됨", + "LabelFinishedDate": "완료 {0}", + "LabelFolder": "폴더", + "LabelFolders": "폴더", + "LabelFontBold": "진하게", + "LabelFontBoldness": "글꼴 굵기", + "LabelFontFamily": "글꼴 모양", + "LabelFontItalic": "이탤릭체", + "LabelFontScale": "글꼴 크기", + "LabelFontStrikethrough": "취소선", + "LabelFormat": "형식", + "LabelFull": "전체", + "LabelGenre": "장르", + "LabelGenres": "장르", + "LabelHardDeleteFile": "파일 하드 삭제", + "LabelHasEbook": "보유한 전자책", + "LabelHasSupplementaryEbook": "보유한 보충 전자책", + "LabelHideSubtitles": "자막 숨기기", + "LabelHighestPriority": "가장 높은 우선순위", + "LabelHost": "호스트", + "LabelHour": "시간", + "LabelHours": "시간", + "LabelIcon": "아이콘", + "LabelImageURLFromTheWeb": "웹의 이미지 URL", + "LabelInProgress": "진행 중", + "LabelIncludeInTracklist": "트랙리스트에 포함", + "LabelIncomplete": "불완전한", + "LabelInterval": "간격", + "LabelIntervalCustomDailyWeekly": "사용자 정의 일일/주간", + "LabelIntervalEvery12Hours": "12시간마다", + "LabelIntervalEvery15Minutes": "15분마다", + "LabelIntervalEvery2Hours": "2시간마다", + "LabelIntervalEvery30Minutes": "30분마다", + "LabelIntervalEvery6Hours": "6시간마다", + "LabelIntervalEveryDay": "매일", + "LabelIntervalEveryHour": "매 시간마다", + "LabelIntervalEveryMinute": "매 분마다", + "LabelInvert": "반전", + "LabelItem": "항목", + "LabelJumpBackwardAmount": "뒤로 점프", + "LabelJumpForwardAmount": "앞으로 점프", + "LabelLanguage": "언어", + "LabelLanguageDefaultServer": "기본 서버 언어", + "LabelLanguages": "언어", + "LabelLastBookAdded": "마지막으로 추가된 책", + "LabelLastBookUpdated": "마지막 책 업데이트됨", + "LabelLastProgressDate": "마지막 진행 상황: {0}", + "LabelLastSeen": "마지막으로 본", + "LabelLastTime": "지난번", + "LabelLastUpdate": "마지막 업데이트", + "LabelLayout": "레이아웃", + "LabelLayoutSinglePage": "단일 페이지", + "LabelLayoutSplitPage": "분할 페이지", + "LabelLess": "Less", + "LabelLibrariesAccessibleToUser": "사용자가 접근 가능한 라이브러리", + "LabelLibrary": "라이브러리", + "LabelLibraryFilterSublistEmpty": "{0} 없음", + "LabelLibraryItem": "라이브러리 항목", + "LabelLibraryName": "라이브러리 이름", + "LabelLibrarySortByProgress": "Progress: 마지막 업데이트", + "LabelLibrarySortByProgressFinished": "진행 상황: 완료", + "LabelLibrarySortByProgressStarted": "진행 상황: 시작됨", + "LabelLimit": "한계", + "LabelLineSpacing": "줄 간격", + "LabelListenAgain": "다시 듣기", + "LabelLogLevelDebug": "디버그", + "LabelLogLevelInfo": "정보", + "LabelLogLevelWarn": "경고", + "LabelLookForNewEpisodesAfterDate": "이 날짜 이후의 새로운 에피소드를 찾아보세요", + "LabelLowestPriority": "가장 낮은 우선순위", + "LabelMatchConfidence": "신뢰", + "LabelMatchExistingUsersBy": "기존 사용자와 일치시키기", + "LabelMatchExistingUsersByDescription": "기존 사용자 연결에 사용됩니다. 연결되면 사용자는 SSO 제공업체의 고유 ID와 매칭됩니다.", + "LabelMaxEpisodesToDownload": "다운로드 가능한 최대 # 에피소드 수. 무제한을 원하시면 0을 사용하세요.", + "LabelMaxEpisodesToDownloadPerCheck": "체크당 다운로드 가능한 최대 신규 # 에피소드 수", + "LabelMaxEpisodesToKeep": "보관할 최대 # 에피소드 수", + "LabelMaxEpisodesToKeepHelp": "값이 0이면 최대 제한이 없습니다. 새 에피소드가 자동으로 다운로드된 후, 에피소드가 X개 이상인 경우 가장 오래된 에피소드부터 삭제됩니다. 새로 다운로드할 때마다 에피소드 1개만 삭제됩니다.", + "LabelMediaPlayer": "미디어 플레이어", + "LabelMediaType": "미디어 유형", + "LabelMetaTag": "메타 태그", + "LabelMetaTags": "메타 태그", + "LabelMetadataOrderOfPrecedenceDescription": "우선순위가 높은 메타데이터 소스는 우선순위가 낮은 메타데이터 소스를 재정의합니다.", + "LabelMetadataProvider": "메타데이터 공급자", + "LabelMinute": "분", + "LabelMinutes": "분", + "LabelMissing": "누락", + "LabelMissingEbook": "전자책이 없습니다", + "LabelMissingSupplementaryEbook": "보충 전자책이 없습니다", + "LabelMobileRedirectURIs": "허용된 모바일 리디렉션 URI", + "LabelMobileRedirectURIsDescription": "모바일 앱에 유효한 리디렉션 URI 허용 목록입니다. 기본 허용 목록은 audiobookshelf://oauth이며, 타사 앱 통합을 위해 추가 URI로 보완하거나 삭제할 수 있습니다. 별표(*)만 사용하면 모든 URI가 허용됩니다.", + "LabelMore": "더보기", + "LabelMoreInfo": "정보 더 보기", + "LabelName": "이름", + "LabelNarrator": "내레이터", + "LabelNarrators": "내레이터", + "LabelNew": "신규", + "LabelNewPassword": "새 비밀번호", + "LabelNewestAuthors": "최신 작가", + "LabelNewestEpisodes": "최신 에피소드", + "LabelNextBackupDate": "다음 백업 날짜", + "LabelNextChapters": "다음장은 다음과 같음:", + "LabelNextScheduledRun": "다음 예정된 실행", + "LabelNoApiKeys": "API 키 없음", + "LabelNoCustomMetadataProviders": "사용자 정의 메타데이터 공급자 없음", + "LabelNoEpisodesSelected": "선택된 에피소드가 없습니다", + "LabelNotFinished": "완료되지 않음", + "LabelNotStarted": "시작되지 않음", + "LabelNotes": "노트", + "LabelNotificationAppriseURL": "Apprise URL(s)", + "LabelNotificationAvailableVariables": "사용 가능한 변수", + "LabelNotificationBodyTemplate": "본문 템플릿", + "LabelNotificationEvent": "알림 이벤트", + "LabelNotificationTitleTemplate": "제목 템플릿", + "LabelNotificationsMaxFailedAttempts": "최대 실패 시도 횟수", + "LabelNotificationsMaxFailedAttemptsHelp": "이 횟수만큼 알림을 보내지 못하면 알림이 비활성화됩니다.", + "LabelNotificationsMaxQueueSize": "알림 이벤트에 대한 최대 대기열 크기", + "LabelNotificationsMaxQueueSizeHelp": "이벤트는 초당 1회로 제한됩니다. 대기열 크기가 최대치에 도달하면 이벤트가 무시됩니다. 이를 통해 알림 스팸을 방지할 수 있습니다.", + "LabelNumberOfBooks": "전자책의 수", + "LabelNumberOfChapters": "챕터의 수:", + "LabelNumberOfEpisodes": "# 의 에피소드", + "LabelOpenIDAdvancedPermsClaimDescription": "애플리케이션 내 사용자 작업에 대한 고급 권한을 포함하는 OpenID 클레임의 이름입니다. 이 권한은 관리자가 아닌 역할(구성된 경우)에 적용됩니다. 응답에서 클레임이 누락되면 ABS에 대한 액세스가 거부됩니다. 단일 옵션이 누락되면 false로 처리됩니다. ID 공급자의 클레임이 예상 구조와 일치하는지 확인하세요.", + "LabelOpenIDClaims": "고급 그룹 및 권한 할당을 비활성화하고 자동으로 '사용자' 그룹을 할당하려면 다음 옵션을 비워 두세요.", + "LabelOpenIDGroupClaimDescription": "사용자 그룹 목록이 포함된 OpenID 클레임의 이름입니다. 일반적으로 그룹이라고 합니다. 구성된 경우, 애플리케이션은 사용자의 그룹 멤버십을 기반으로 역할을 자동으로 할당합니다. 단, 클레임에서 그룹 이름이 대소문자를 구분하지 않고 'admin', 'user' 또는 'guest'로 지정되어야 합니다. 클레임에는 목록이 포함되어야 하며, 사용자가 여러 그룹에 속하는 경우 애플리케이션은 가장 높은 수준의 액세스 권한에 해당하는 역할을 할당합니다. 일치하는 그룹이 없으면 액세스가 거부됩니다.", + "LabelOpenRSSFeed": "RSS 피드 열기", + "LabelOverwrite": "덮어쓰기", + "LabelPaginationPageXOfY": "{1} 중 {0}페이지", + "LabelPassword": "비밀번호", + "LabelPath": "경로", + "LabelPermanent": "영구적인", + "LabelPermissionsAccessAllLibraries": "모든 라이브러리에 접속 가능", + "LabelPermissionsAccessAllTags": "모든 태그에 액세스 가능", + "LabelPermissionsAccessExplicitContent": "명시적 콘텐츠에 액세스할 수 있음", + "LabelPermissionsCreateEreader": "전자책 리더기를 만들기 가능", + "LabelPermissionsDelete": "삭제 가능", + "LabelPermissionsDownload": "다운로드 가능", + "LabelPermissionsUpdate": "엡데이트 가능", + "LabelPermissionsUpload": "업로드 가능", + "LabelPersonalYearReview": "올해의 리뷰 ({0})", + "LabelPhotoPathURL": "사진 경로/URL", + "LabelPlayMethod": "플레이 방법", + "LabelPlaybackRateIncrementDecrement": "재생 속도 증가/감소량", + "LabelPlayerChapterNumberMarker": "{0} of {1}", + "LabelPlaylists": "재생목록", + "LabelPodcast": "팟케스트", + "LabelPodcastSearchRegion": "팟캐스트 검색 영역", + "LabelPodcastType": "팟캐스트 유형", + "LabelPodcasts": "팟케스트", + "LabelPort": "포트", + "LabelPrefixesToIgnore": "무시할 접두사(대소문자 구분 없음)", + "LabelPreventIndexing": "iTunes 및 Google Podcast 디렉토리에서 피드가 인덱싱되는 것을 방지합니다.", + "LabelPrimaryEbook": "기본 전자책", + "LabelProgress": "진행", + "LabelProvider": "공급자", + "LabelProviderAuthorizationValue": "권한 헤더 값", + "LabelPubDate": "출판 날짜", + "LabelPublishYear": "출판 연도", + "LabelPublishedDate": "출판됨 {0}", + "LabelPublishedDecade": "출판된지 10년", + "LabelPublishedDecades": "출판된지 10년이상", + "LabelPublisher": "출판사", + "LabelPublishers": "출판사", + "LabelRSSFeedCustomOwnerEmail": "사용자 정의 이메일", + "LabelRSSFeedCustomOwnerName": "사용자 정의 이름", + "LabelRSSFeedOpen": "RSS 피드 열기", + "LabelRSSFeedPreventIndexing": "인덱싱 방지", + "LabelRSSFeedSlug": "RSS 피드 슬러그", + "LabelRSSFeedURL": "RSS 피드 URL", + "LabelRandomly": "무작위로", + "LabelReAddSeriesToContinueListening": "계속 듣기 위해 시리즈를 다시 추가하세요", + "LabelRead": "읽기", + "LabelReadAgain": "다시 읽기", + "LabelReadEbookWithoutProgress": "진행 상황을 유지하지 않고 전자책을 읽으세요", + "LabelRecentSeries": "최근 시리즈", + "LabelRecentlyAdded": "최근 추가됨", + "LabelRecommended": "추천", + "LabelRedo": "되돌리기", + "LabelRegion": "지역", + "LabelReleaseDate": "출시일", + "LabelRemoveAllMetadataAbs": "모든 metadata.abs 파일을 제거합니다.", + "LabelRemoveAllMetadataJson": "모든 metadata.json 파일을 제거합니다.", + "LabelRemoveAudibleBranding": "챕터에서 Audible 인트로와 아웃트로 제거", + "LabelRemoveCover": "커버 제거", + "LabelRemoveMetadataFile": "라이브러리 항목 폴더에서 메타데이터 파일 제거", + "LabelRemoveMetadataFileHelp": "{0} 폴더에서 모든 metadata.json 및 metadata.abs 파일을 제거합니다.", + "LabelRowsPerPage": "페이지당 행 수", + "LabelSearchTerm": "검색어", + "LabelSearchTitle": "제목 검색", + "LabelSearchTitleOrASIN": "제목 또는 ASIN 검색", + "LabelSeason": "시즌", + "LabelSeasonNumber": "시즌 #{0}", + "LabelSelectAll": "모두 선택", + "LabelSelectAllEpisodes": "모든 에피소드 선택", + "LabelSelectEpisodesShowing": "{0}개의 에피소드를 선택", + "LabelSelectUser": "사용자 선택", + "LabelSelectUsers": "사용자 선택", + "LabelSendEbookToDevice": "...에 전자책을 보내기", + "LabelSequence": "순서", + "LabelSerial": "일련번호", + "LabelSeries": "시리즈", + "LabelSeriesName": "시리즈 이름", + "LabelSeriesProgress": "시리즈 진행 상황", + "LabelServerLogLevel": "서버 로그 수준", + "LabelServerYearReview": "서버 연간 리뷰 ({0})", + "LabelSetEbookAsPrimary": "기본으로 설정", + "LabelSetEbookAsSupplementary": "보충으로 설정", + "LabelSettingsAllowIframe": "iframe에 포함 허용", + "LabelSettingsAudiobooksOnly": "오디오북만", + "LabelSettingsAudiobooksOnlyHelp": "이 설정을 활성화하면 오디오북 폴더 내부에 있는 경우를 제외하고 전자책 파일이 무시되며, 오디오북 폴더 내부에 있는 경우 해당 파일은 보충 전자책으로 설정됩니다.", + "LabelSettingsBookshelfViewHelp": "나무 선반을 활용한 스큐어모픽 디자인", + "LabelSettingsChromecastSupport": "Chromecast 지원", + "LabelSettingsDateFormat": "날짜 형식", + "LabelSettingsEnableWatcher": "라이브러리의 변경 사항을 자동으로 감시", + "LabelSettingsEnableWatcherForLibrary": "라이브러리의 변경 사항을 자동으로 감시", + "LabelSettingsEnableWatcherHelp": "파일 변경 사항이 감지되면 항목을 자동으로 추가/업데이트합니다. *서버 재시작이 필요합니다.", + "LabelSettingsEpubsAllowScriptedContent": "epub에서 스크립트 콘텐츠 허용", + "LabelSettingsEpubsAllowScriptedContentHelp": "epub 파일에서 스크립트를 실행하도록 허용합니다. epub 파일 출처를 신뢰하지 않는 한 이 설정을 비활성화하는 것이 좋습니다.", + "LabelSettingsExperimentalFeatures": "실험적 특징", + "LabelSettingsExperimentalFeaturesHelp": "여러분의 피드백과 테스트에 도움이 될 만한 개발 중인 기능입니다. 클릭하여 Github 토론을 시작하세요.", + "LabelSettingsFindCovers": "커버 찾기", + "LabelSettingsFindCoversHelp": "오디오북에 내장된 표지나 폴더 내에 표지 이미지가 없는 경우 스캐너는 표지를 찾으려고 시도합니다.
참고: 이렇게 하면 스캔 시간이 길어집니다.", + "LabelSettingsHideSingleBookSeries": "단일 책 시리즈 숨기기", + "LabelSettingsHideSingleBookSeriesHelp": "단일 책으로 구성된 시리즈는 시리즈 페이지와 홈페이지 선반에서 숨겨집니다.", + "LabelSettingsHomePageBookshelfView": "홈페이지 책꽂이 보기 사용", + "LabelSettingsLibraryBookshelfView": "라이브러리에 bookshelf view 사용", + "LabelSettingsLibraryMarkAsFinishedPercentComplete": "완료율이 다음보다 큼", + "LabelSettingsLibraryMarkAsFinishedTimeRemaining": "남은 시간은 (초) 미만입니다.", + "LabelSettingsLibraryMarkAsFinishedWhen": "미디어 항목을 완료된 것으로 표시", + "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Continue Series의 이전 책 건너뛰기", + "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "시리즈 계속하기 홈페이지 선반에는 시리즈 중 아직 시작하지 않은 첫 번째 책이 표시됩니다. 시리즈 중 최소 한 권은 완료되었고 진행 중인 책은 없습니다. 이 설정을 활성화하면 시작하지 않은 첫 번째 책 대신 가장 늦게 완료된 책부터 시리즈가 이어집니다.", + "LabelSettingsParseSubtitles": "Parse subtitles", + "LabelSettingsParseSubtitlesHelp": "오디오북 폴더 이름에서 자막을 추출합니다.
자막은 \" - \"로 구분해야 합니다.
즉, \"책 제목 - 여기에 자막이 있습니다\"에는 \"여기에 자막이 있습니다\"라는 자막이 있습니다.", + "LabelSettingsPreferMatchedMetadata": "일치하는 메타데이터를 선호", + "LabelSettingsPreferMatchedMetadataHelp": "빠른 매칭을 사용하면 매칭된 데이터가 항목 세부 정보보다 우선합니다. 기본적으로 빠른 매칭은 누락된 세부 정보만 채웁니다.", + "LabelSettingsSkipMatchingBooksWithASIN": "이미 ASIN이 있는 일치하는 책을 건너뜁니다.", + "LabelSettingsSkipMatchingBooksWithISBN": "이미 ISBN이 있는 일치하는 책을 건너뜁니다.", + "LabelSettingsSortingIgnorePrefixes": "정렬 시 접두사 무시", + "LabelSettingsSortingIgnorePrefixesHelp": "즉, 접두사 \"the\"의 경우 책 제목 \"The Book Title\"은 \"Book Title, The\"로 정렬됩니다.", + "LabelSettingsSquareBookCovers": "정사각형 책 표지를 사용", + "LabelSettingsSquareBookCoversHelp": "표준 1.6:1 책 표지보다 정사각형 표지를 사용하는 것을 선호합니다.", + "LabelSettingsStoreCoversWithItem": "품목과 함께 매장 커버", + "LabelSettingsStoreCoversWithItemHelp": "기본적으로 표지는 /metadata/items에 저장됩니다. 이 설정을 활성화하면 표지가 라이브러리 항목 폴더에 저장됩니다. \"cover\"라는 이름의 파일 하나만 저장됩니다.", + "LabelSettingsStoreMetadataWithItem": "항목과 함께 메타데이터 저장", + "LabelSettingsStoreMetadataWithItemHelp": "기본적으로 메타데이터 파일은 /metadata/items에 저장되며 이 설정을 활성화하면 라이브러리 항목 폴더에 메타데이터 파일이 저장됩니다.", + "LabelSettingsTimeFormat": "시간 형식", + "LabelShare": "공유", + "LabelShareDownloadableHelp": "공유 링크가 있는 사용자는 라이브러리 항목의 zip 파일을 다운로드할 수 있습니다.", + "LabelShareOpen": "공유 열기", + "LabelShareURL": "URL 공유", + "LabelShowAll": "모두 표시", + "LabelShowSeconds": "초 표시", + "LabelShowSubtitles": "자막 표시", + "LabelSize": "크기", + "LabelSleepTimer": "슬립 타이머", + "LabelSlug": "Slug", + "LabelSortAscending": "오름차순", + "LabelSortDescending": "내림차순", + "LabelSortPubDate": "게시 날짜 정렬", + "LabelStart": "시작", + "LabelStartTime": "시작 시간", + "LabelStarted": "시작됨", + "LabelStartedAt": "시작일", + "LabelStartedDate": "{0} 시작됨", + "LabelStatsAudioTracks": "오디오 트랙", + "LabelStatsAuthors": "작가", + "LabelStatsBestDay": "최고의 날", + "LabelStatsDailyAverage": "일일 평균", + "LabelStatsDays": "일", + "LabelStatsDaysListened": "청취 일수", + "LabelStatsHours": "시간", + "LabelStatsInARow": "in a row", + "LabelStatsItemsFinished": "완료된 항목", + "LabelStatsItemsInLibrary": "라이브러리의 항목", + "LabelStatsMinutes": "분", + "LabelStatsMinutesListening": "청취 분수", + "LabelStatsOverallDays": "전체 일수", + "LabelStatsOverallHours": "전체 시간", + "LabelStatsWeekListening": "주간 청취", + "LabelSubtitle": "자막", + "LabelSupportedFileTypes": "지원되는 파일 유형", + "LabelTag": "태그", + "LabelTags": "태그", + "LabelTagsAccessibleToUser": "사용자가 접근 가능한 태그", + "LabelTagsNotAccessibleToUser": "사용자가 액세스할 수 없는 태그", + "LabelTasks": "실행 중인 작업", + "LabelTextEditorBulletedList": "글머리 기호 목록", + "LabelTextEditorLink": "링크", + "LabelTextEditorNumberedList": "번호가 매겨진 목록", + "LabelTextEditorUnlink": "언링크", + "LabelTheme": "테마", + "LabelThemeDark": "Dark", + "LabelThemeLight": "Light", + "LabelThemeSepia": "Sepia", + "LabelTimeBase": "시간 기준", + "LabelTimeDurationXHours": "{0}시간", + "LabelTimeDurationXMinutes": "{0}분", + "LabelTimeDurationXSeconds": "{0}초", + "LabelTimeInMinutes": "시간(분)", + "LabelTimeLeft": "{0}개 남음", + "LabelTimeListened": "들은 시간", + "LabelTimeListenedToday": "오늘 청취 시간", + "LabelTimeRemaining": "{0} 남음", + "LabelTimeToShift": "이동 시간(초)", + "LabelTitle": "제목", + "LabelToolsEmbedMetadata": "메타데이터 삽입", + "LabelToolsEmbedMetadataDescription": "오디오 파일에 커버 이미지와 챕터를 포함한 메타데이터를 포함합니다.", + "LabelToolsM4bEncoder": "M4B 인코더", + "LabelToolsMakeM4b": "M4B 오디오북 파일 만들기", + "LabelToolsMakeM4bDescription": "내장된 메타데이터, 표지 이미지, 챕터가 포함된 .M4B 오디오북 파일을 생성합니다.", + "LabelToolsSplitM4b": "M4B를 MP3로 분할", + "LabelToolsSplitM4bDescription": "챕터별로 분할된 M4B에서 내장된 메타데이터, 표지 이미지, 챕터를 사용하여 MP3를 만듭니다.", + "LabelTotalDuration": "총 기간", + "LabelTotalTimeListened": "총 청취 시간", + "LabelTrackFromFilename": "파일 이름에서 추적", + "LabelTrackFromMetadata": "메타데이터에서 추적", + "LabelTracks": "트랙", + "LabelTracksMultiTrack": "멀티트랙", + "LabelTracksNone": "트랙 없음", + "LabelTracksSingleTrack": "싱글트랙", + "LabelTrailer": "트레일러", + "LabelType": "유형", + "LabelUnabridged": "완본", + "LabelUndo": "실행 취소", + "LabelUnknown": "미상", + "LabelUnknownPublishDate": "알 수 없는 게시 날짜", + "LabelUpdateCover": "커버 업데이트", + "LabelUpdateCoverHelp": "일치하는 항목이 발견되면 선택한 책의 기존 표지를 덮어쓸 수 있습니다.", + "LabelUpdateDetails": "세부 정보 업데이트", + "LabelUpdateDetailsHelp": "일치하는 항목이 발견되면 선택한 책에 대한 기존 세부 정보를 덮어쓸 수 있습니다.", + "LabelUpdatedAt": "업데이트됨", + "LabelUploaderDragAndDrop": "파일 또는 폴더 드래그 앤 드롭", + "LabelUploaderDragAndDropFilesOnly": "드래그 앤 드롭 파일", + "LabelUploaderDropFiles": "파일 드롭", + "LabelUploaderItemFetchMetadataHelp": "제목, 저자 및 시리즈를 자동으로 가져옵니다.", + "LabelUseAdvancedOptions": "고급 옵션 사용", + "LabelUseChapterTrack": "챕터 트랙 사용", + "LabelUseFullTrack": "전체 트랙 사용", + "LabelUseZeroForUnlimited": "무제한을 원하시면 0을 사용", + "LabelUser": "사용자", + "LabelUsername": "사용자 이름", + "LabelValue": "값", + "LabelVersion": "버전", + "LabelViewBookmarks": "북마크 보기", + "LabelViewChapters": "챕터 보기", + "LabelViewPlayerSettings": "플레이어 설정 보기", + "LabelViewQueue": "플레이어 대기열 보기", + "LabelVolume": "볼륨", + "LabelWebRedirectURLsDescription": "로그인 후 웹 앱으로 다시 리디렉션할 수 있도록 OAuth 공급자에서 다음 URL을 승인하세요.", + "LabelWebRedirectURLsSubfolder": "리디렉션 URL의 하위 폴더", + "LabelWeekdaysToRun": "주중에 실행", + "LabelXBooks": "{0}권의 책", + "LabelXItems": "{0}개 항목", + "LabelYearReviewHide": "연간 리뷰 숨기기", + "LabelYearReviewShow": "올해의 리뷰 보기", + "LabelYourAudiobookDuration": "오디오북 길이", + "LabelYourBookmarks": "내 북마크", + "LabelYourPlaylists": "내 재생목록", + "LabelYourProgress": "내 진행 상황", + "MessageAddToPlayerQueue": "플레이어 대기열에 추가", + "MessageAppriseDescription": "이 기능을 사용하려면 Apprise API 인스턴스를 실행 중이거나 동일한 요청을 처리할 API가 필요합니다.
Apprise API URL은 알림을 보낼 전체 URL 경로여야 합니다. 예를 들어, API 인스턴스가 http://192.168.1.1:8337에서 제공되는 경우 http://192.168.1.1:8337/notify를 입력합니다.", + "MessageAsinCheck": "Amazon이 아닌 올바른 Audible 지역의 ASIN을 사용하고 있는지 확인하세요.", + "MessageAuthenticationLegacyTokenWarning": "기존 API 토큰은 향후 제거될 예정입니다. 대신 API 키를 사용하세요.", + "MessageAuthenticationOIDCChangesRestart": "OIDC 변경 사항을 적용하려면 저장한 후 서버를 다시 시작하세요.", + "MessageAuthenticationSecurityMessage": "보안을 위해 인증 방식이 개선되었습니다. 모든 사용자는 다시 로그인해야 합니다.", + "MessageBackupsDescription": "백업에는 사용자, 사용자 진행 상황, 라이브러리 항목 세부 정보, 서버 설정, 그리고 /metadata/items/metadata/authors에 저장된 이미지가 포함됩니다. 라이브러리 폴더에 저장된 파일은 백업에 포함되지 않습니다.", + "MessageBackupsLocationEditNote": "참고: 백업 위치를 업데이트해도 기존 백업은 이동되거나 수정되지 않습니다.", + "MessageBackupsLocationNoEditNote": "참고: 백업 위치는 환경 변수를 통해 설정되며 여기서는 변경할 수 없습니다.", + "MessageBackupsLocationPathEmpty": "백업 위치 경로는 비워둘 수 없습니다.", + "MessageBatchEditPopulateMapDetailsAllHelp": "활성화된 필드에 모든 항목의 데이터를 채웁니다. 여러 값이 있는 필드는 병합됩니다.", + "MessageBatchEditPopulateMapDetailsItemHelp": "이 항목의 데이터로 활성화된 지도 세부 정보 필드를 채웁니다.", + "MessageBatchQuickMatchDescription": "빠른 매칭은 선택한 항목에 대해 누락된 표지와 메타데이터를 추가하려고 시도합니다. 빠른 매칭이 기존 표지 및/또는 메타데이터를 덮어쓰도록 허용하려면 아래 옵션을 활성화하세요.", + "MessageBookshelfNoCollections": "아직 컬렉션을 만들지 않았습니다.", + "MessageBookshelfNoCollectionsHelp": "소장 자료는 공개되어 있습니다. 라이브러리에 접속할 수 있는 모든 이용자가 열람할 수 있습니다.", + "MessageBookshelfNoRSSFeeds": "RSS 피드가 열려 있지 않습니다", + "MessageBookshelfNoResultsForFilter": "필터 \"{0}: {1}\"에 대한 결과가 없습니다.", + "MessageBookshelfNoResultsForQuery": "쿼리에 대한 결과가 없습니다", + "MessageBookshelfNoSeries": "시리즈가 없습니다", + "MessageBulkChapterPattern": "이 번호 매기기 패턴을 사용하여 몇 개의 챕터를 추가하시겠습니까?", + "MessageChapterEndIsAfter": "오디오북이 끝난 후 챕터가 끝납니다.", + "MessageChapterErrorFirstNotZero": "첫 번째 챕터는 0에서 시작해야 합니다.", + "MessageChapterErrorStartGteDuration": "잘못된 시작 시간은 오디오북 길이보다 짧아야 합니다.", + "MessageChapterErrorStartLtPrev": "잘못된 시작 시간은 이전 챕터 시작 시간보다 크거나 같아야 합니다.", + "MessageChapterStartIsAfter": "챕터 시작은 오디오북이 끝난 후입니다.", + "MessageChaptersNotFound": "챕터를 찾을 수 없습니다", + "MessageCheckingCron": "cron을 확인 중입니다...", + "MessageConfirmCloseFeed": "이 피드를 닫으시겠습니까?", + "MessageConfirmDeleteApiKey": "API 키 \"{0}\"을 삭제하시겠습니까?", + "MessageConfirmDeleteBackup": "{0}에 대한 백업을 삭제하시겠습니까?", + "MessageConfirmDeleteDevice": "e-reader 장치 \"{0}\"을(를) 삭제하시겠습니까?", + "MessageConfirmDeleteFile": "이렇게 하면 파일 시스템에서 파일이 삭제됩니다. 정말 삭제하시겠습니까?", + "MessageConfirmDeleteLibrary": "라이브러리 \"{0}\"을 영구적으로 삭제하시겠습니까?", + "MessageConfirmDeleteLibraryItem": "이렇게 하면 라이브러리 항목이 데이터베이스와 파일 시스템에서 삭제됩니다. 정말 삭제하시겠습니까?", + "MessageConfirmDeleteLibraryItems": "이렇게 하면 데이터베이스와 파일 시스템에서 {0}개의 라이브러리 항목이 삭제됩니다. 정말 삭제하시겠습니까?", + "MessageConfirmDeleteMetadataProvider": "사용자 지정 메타데이터 공급자 \"{0}\"을(를) 삭제하시겠습니까?", + "MessageConfirmDeleteNotification": "이 알림을 삭제하시겠습니까?", + "MessageConfirmDeleteSession": "이 세션을 삭제하시겠습니까?", + "MessageConfirmEmbedMetadataInAudioFiles": "{0} 오디오 파일에 메타데이터를 포함하시겠습니까?", + "MessageConfirmForceReScan": "강제로 다시 스캔하시겠습니까?", + "MessageConfirmMarkAllEpisodesFinished": "모든 에피소드를 완료로 표시하시겠습니까?", + "MessageConfirmMarkAllEpisodesNotFinished": "모든 에피소드를 완료되지 않은 것으로 표시하시겠습니까?", + "MessageConfirmMarkItemFinished": "\"{0}\"을(를) 완료로 표시하시겠습니까?", + "MessageConfirmMarkItemNotFinished": "\"{0}\"을(를) 완료되지 않은 것으로 표시하시겠습니까?", + "MessageConfirmMarkSeriesFinished": "이 시리즈의 모든 책을 완료로 표시하시겠습니까?", + "MessageConfirmMarkSeriesNotFinished": "이 시리즈의 모든 책을 미완료로 표시하시겠습니까?", + "MessageConfirmNotificationTestTrigger": "테스트 데이터로 이 알림을 트리거할까요?", + "MessageConfirmPurgeCache": "캐시를 제거하면 /metadata/cache에 있는 전체 디렉토리가 삭제됩니다.

캐시 디렉토리를 제거하시겠습니까?", + "MessageConfirmPurgeItemsCache": "항목 캐시를 삭제하면 /metadata/cache/items에 있는 전체 디렉터리가 삭제됩니다.
정말입니까?", + "MessageConfirmQuickEmbed": "경고! 빠른 삽입 기능은 오디오 파일을 백업하지 않습니다. 오디오 파일을 백업해 두세요.

계속하시겠습니까?", + "MessageConfirmQuickMatchEpisodes": "빠른 매칭 에피소드는 일치하는 에피소드가 발견되면 세부 정보를 덮어씁니다. 매칭되지 않은 에피소드만 업데이트됩니다. 계속하시겠습니까?", + "MessageConfirmReScanLibraryItems": "{0}개 항목을 다시 스캔하시겠습니까?", + "MessageConfirmRemoveAllChapters": "모든 챕터를 제거하시겠습니까?", + "MessageConfirmRemoveAuthor": "작가 \"{0}\"을(를) 삭제하시겠습니까?", + "MessageConfirmRemoveCollection": "컬렉션 \"{0}\"을 제거하시겠습니까?", + "MessageConfirmRemoveEpisode": "에피소드 \"{0}\"을(를) 삭제하시겠습니까?", + "MessageConfirmRemoveEpisodeNote": "참고: \"Hard delete file\"를 전환하지 않는 한 오디오 파일은 삭제되지 않습니다.", + "MessageConfirmRemoveEpisodes": "{0}개의 에피소드를 삭제하시겠습니까?", + "MessageConfirmRemoveListeningSessions": "{0}개의 청취 세션을 제거하시겠습니까?", + "MessageConfirmRemoveMetadataFiles": "라이브러리 항목 폴더에서 모든 metadata.{0} 파일을 제거하시겠습니까?", + "MessageConfirmRemoveNarrator": "내레이터 \"{0}\"을(를) 제거하시겠습니까?", + "MessageConfirmRemovePlaylist": "재생목록 \"{0}\"을(를) 제거하시겠습니까?", + "MessageConfirmRenameGenre": "모든 항목의 장르 이름을 \"{0}\"에서 \"{1}\"로 바꾸시겠습니까?", + "MessageConfirmRenameGenreMergeNote": "참고: 이 장르는 이미 존재하므로 병합됩니다.", + "MessageConfirmRenameGenreWarning": "경고! 대소문자가 다른 유사한 장르 \"{0}\"이 이미 존재합니다.", + "MessageConfirmRenameTag": "모든 항목에 대해 태그 \"{0}\"의 이름을 \"{1}\"로 바꾸시겠습니까?", + "MessageConfirmRenameTagMergeNote": "참고: 이 태그는 이미 존재하므로 병합됩니다.", + "MessageConfirmRenameTagWarning": "경고! 대소문자가 다른 유사한 태그 \"{0}\"이 이미 존재합니다.", + "MessageConfirmResetProgress": "진행 상황을 재설정하시겠습니까?", + "MessageConfirmSendEbookToDevice": "{0}개의 전자책 \"{1}\"을 장치 \"{2}\"로 보내시겠습니까?", + "MessageConfirmUnlinkOpenId": "이 사용자를 OpenID에서 연결 해제하시겠습니까?", + "MessageDaysListenedInTheLastYear": "지난 1년 동안 {0}일 동안 청취됨", + "MessageDownloadingEpisode": "에피소드 다운로드 중", + "MessageDragFilesIntoTrackOrder": "파일을 올바른 트랙 순서로 끌어다 놓으세요", + "MessageEmbedFailed": "Embed 실패했습니다!", + "MessageEmbedFinished": "Embed 완료!", + "MessageEmbedQueue": "메타데이터 임베드 대기 중(대기열에 {0} 있음)", + "MessageEpisodesQueuedForDownload": "{0}개의 에피소드가 다운로드 대기 중입니다.", + "MessageEreaderDevices": "전자책을 안전하게 전달하려면 아래 나열된 각 기기에 대해 위의 이메일 주소를 유효한 발신자로 추가해야 할 수도 있습니다.", + "MessageFeedURLWillBe": "피드 URL은 {0}입니다.", + "MessageFetching": "가져오는 중...", + "MessageForceReScanDescription": "모든 파일을 새로 스캔하는 것처럼 다시 스캔합니다. 오디오 파일 ID3 태그, OPF 파일, 텍스트 파일은 새 파일처럼 스캔됩니다.", + "MessageHeatmapListeningTimeTooltip": "{0} {1}에서 청취 중", + "MessageHeatmapNoListeningSessions": "{0}에 대한 청취 세션이 없습니다.", + "MessageImportantNotice": "중요 공지!", + "MessageInsertChapterBelow": "아래에 챕터를 삽입하세요", + "MessageInvalidAsin": "잘못된 ASIN", + "MessageItemsSelected": "{0}개 항목이 선택됨", + "MessageItemsUpdated": "{0}개 항목이 업데이트됨.", + "MessageJoinUsOn": "가입하기", + "MessageLoading": "로딩중...", + "MessageLoadingFolders": "폴더를 로딩 중...", + "MessageLogsDescription": "로그는 /metadata/logs에 JSON 파일로 저장됩니다. 충돌 로그는 /metadata/logs/crash_logs.txt에 저장됩니다.", + "MessageM4BFailed": "M4B 실패!", + "MessageM4BFinished": "M4B 완료!", + "MessageMapChapterTitles": "타임스탬프를 조정하지 않고 기존 오디오북 장에 챕터 제목을 매핑합니다.", + "MessageMarkAllEpisodesFinished": "모든 에피소드를 완료로 표시", + "MessageMarkAllEpisodesNotFinished": "모든 에피소드를 완료되지 않은 것으로 표시", + "MessageMarkAsFinished": "완료로 표시", + "MessageMarkAsNotFinished": "완료되지 않음으로 표시", + "MessageMatchBooksDescription": "라이브러리에 있는 책과 선택한 검색 제공업체의 책을 비교하고, 빈 세부 정보와 표지 그림을 채웁니다. 세부 정보를 덮어쓰지 않습니다.", + "MessageNoAudioTracks": "오디오 트랙 없음", + "MessageNoAuthors": "작가 없음", + "MessageNoBackups": "백업 없음", + "MessageNoBookmarks": "북마크 없음", + "MessageNoChapters": "챕터 없음", + "MessageNoCollections": "컬렉션 없음", + "MessageNoCoversFound": "커버를 찾을 수 없음", + "MessageNoDescription": "설명 없음", + "MessageNoDevices": "장치가 없음", + "MessageNoDownloadsInProgress": "현재 진행 중인 다운로드가 없습니다.", + "MessageNoDownloadsQueued": "대기 중인 다운로드가 없습니다", + "MessageNoEpisodeMatchesFound": "일치하는 에피소드가 없습니다.", + "MessageNoEpisodes": "에피소드 없음", + "MessageNoFoldersAvailable": "사용 가능한 폴더가 없습니다", + "MessageNoGenres": "장르 없음", + "MessageNoIssues": "이슈 없음", + "MessageNoItems": "항목 없음", + "MessageNoItemsFound": "항목을 찾을 수 없음", + "MessageNoListeningSessions": "청취 세션 없음", + "MessageNoLogs": "로그 없음", + "MessageNoMediaProgress": "진행중인 미디어 없음", + "MessageNoNotifications": "알림 없음", + "MessageNoPodcastFeed": "잘못된 팟캐스트: 피드 없음", + "MessageNoPodcastsFound": "팟캐스트를 찾을 수 없음", + "MessageNoResults": "결과 없음", + "MessageNoSearchResultsFor": "\"{0}\"에 대한 검색 결과가 없습니다.", + "MessageNoSeries": "시리즈 없음", + "MessageNoTags": "태그 없음", + "MessageNoTasksRunning": "실행 중인 작업이 없음", + "MessageNoUpdatesWereNecessary": "업데이트가 필요하지 않음", + "MessageNoUserPlaylists": "재생목록이 없음", + "MessageNoUserPlaylistsHelp": "재생목록은 비공개입니다. 재생목록을 만든 사용자만 볼 수 있습니다.", + "MessageNotYetImplemented": "아직 구현되지 않음", + "MessageOpmlPreviewNote": "참고: 이는 파싱된 OPML 파일의 미리보기입니다. 실제 팟캐스트 제목은 RSS 피드에서 가져옵니다.", + "MessageOr": "또는", + "MessagePauseChapter": "챕터 재생 일시 정지", + "MessagePlayChapter": "챕터의 시작 부분을 들어보세요", + "MessagePlaylistCreateFromCollection": "컬렉션에서 재생 목록 만들기", + "MessagePleaseWait": "기다리세요...", + "MessagePodcastHasNoRSSFeedForMatching": "팟캐스트에 매칭에 사용할 RSS 피드 URL이 없습니다.", + "MessagePodcastSearchField": "검색어 또는 RSS 피드 URL을 입력하세요", + "MessageQuickEmbedInProgress": "빠른 임베드 진행 중", + "MessageQuickEmbedQueue": "빠른 임베드 대기 중(대기 중인 {0}개)", + "MessageQuickMatchAllEpisodes": "모든 에피소드 퀵 매치", + "MessageQuickMatchDescription": "빈 항목 세부 정보를 채우고 '{0}'의 첫 번째 일치 결과로 덮습니다. '일치하는 메타데이터 선호' 서버 설정이 활성화되어 있지 않으면 세부 정보를 덮어쓰지 않습니다.", + "MessageRemoveChapter": "챕터 제거", + "MessageRemoveEpisodes": "{0}개의 에피소드를 제거합니다.", + "MessageRemoveFromPlayerQueue": "플레이어 대기열에서 제거", + "MessageRemoveUserWarning": "사용자 \"{0}\"을 영구적으로 삭제하시겠습니까?", + "MessageReportBugsAndContribute": "버그 보고, 기능 요청 및 기여", + "MessageResetChaptersConfirm": "챕터를 재설정하고 변경 사항을 취소하시겠습니까?", + "MessageRestoreBackupConfirm": "생성된 백업을 복원하시겠습니까?", + "MessageRestoreBackupWarning": "백업을 복원하면 /config에 있는 전체 데이터베이스와 /metadata/items 및 /metadata/authors에 있는 표지 이미지가 덮어씌워집니다.

백업은 라이브러리 폴더의 어떤 파일도 수정하지 않습니다. 라이브러리 폴더에 표지 그림과 메타데이터를 저장하도록 서버 설정을 활성화한 경우, 해당 내용은 백업되거나 덮어씌워지지 않습니다.

서버를 사용하는 모든 클라이언트는 자동으로 새로 고쳐집니다.", + "MessageScheduleLibraryScanNote": "대부분의 사용자는 이 기능을 비활성화하고 라이브러리 변경 사항 자동 감시 설정을 활성화하는 것이 좋습니다. 라이브러리 폴더의 변경 사항을 자동으로 감지합니다. 파일 시스템(예: NFS)에서 라이브러리 변경 사항 자동 감시 기능이 작동하지 않는 경우 이 기능을 활성화하세요.", + "MessageScheduleRunEveryWeekdayAtTime": "{1}에서 {0}마다 실행", + "MessageSearchResultsFor": "검색 결과", + "MessageSelected": "{0}개 선택됨", + "MessageSeriesSequenceCannotContainSpaces": "시리즈 시퀀스에는 공백을 포함할 수 없습니다.", + "MessageServerCouldNotBeReached": "서버에 접속할 수 없습니다", + "MessageSetChaptersFromTracksDescription": "각 오디오 파일을 장으로 사용하고 챕터 제목을 오디오 파일 이름으로 사용하여 챕터를 설정합니다.", + "MessageShareExpirationWillBe": "만료일은 {0}입니다.", + "MessageShareExpiresIn": "{0}에 만료됨", + "MessageShareURLWillBe": "공유 URL은 {0}입니다.", + "MessageStartPlaybackAtTime": "{1}에서 \"{0}\"의 재생을 시작하시겠습니까?", + "MessageTaskAudioFileNotWritable": "오디오 파일 \"{0}\"은 쓸 수 없습니다.", + "MessageTaskCanceledByUser": "사용자가 작업을 취소했습니다.", + "MessageTaskDownloadingEpisodeDescription": "에피소드 \"{0}\" 다운로드 중", + "MessageTaskEmbeddingMetadata": "메타데이터 임베딩", + "MessageTaskEmbeddingMetadataDescription": "오디오북 \"{0}\"에 메타데이터 삽입", + "MessageTaskEncodingM4b": "M4B 인코딩", + "MessageTaskEncodingM4bDescription": "오디오북 \"{0}\"을 단일 m4b 파일로 인코딩", + "MessageTaskFailed": "실패함", + "MessageTaskFailedToBackupAudioFile": "오디오 파일 \"{0}\"을 백업하지 못했습니다.", + "MessageTaskFailedToCreateCacheDirectory": "캐시 디렉토리를 생성하지 못했습니다.", + "MessageTaskFailedToEmbedMetadataInFile": "파일 \"{0}\"에 메타데이터를 삽입하는 데 실패했습니다.", + "MessageTaskFailedToMergeAudioFiles": "오디오 파일을 병합하지 못했습니다.", + "MessageTaskFailedToMoveM4bFile": "m4b 파일을 이동하지 못했습니다.", + "MessageTaskFailedToWriteMetadataFile": "메타데이터 파일을 쓰지 못했습니다.", + "MessageTaskMatchingBooksInLibrary": "라이브러리 \"{0}\"에서 일치하는 책", + "MessageTaskNoFilesToScan": "검사할 파일이 없음", + "MessageTaskOpmlImport": "OPML 가져오기", + "MessageTaskOpmlImportDescription": "{0} RSS 피드에서 팟캐스트 만들기", + "MessageTaskOpmlImportFeed": "OPML 가져오기 피드", + "MessageTaskOpmlImportFeedDescription": "RSS 피드 \"{0}\"을(를) 가져오는 중", + "MessageTaskOpmlImportFeedFailed": "팟캐스트 피드를 가져오지 못했습니다.", + "MessageTaskOpmlImportFeedPodcastDescription": "팟캐스트 \"{0}\" 생성 중", + "MessageTaskOpmlImportFeedPodcastExists": "팟캐스트가 이미 경로에 존재합니다.", + "MessageTaskOpmlImportFeedPodcastFailed": "팟캐스트를 만들지 못했습니다", + "MessageTaskOpmlImportFinished": "{0}개의 팟캐스트가 추가되었습니다.", + "MessageTaskOpmlParseFailed": "OPML 파일을 구문 분석하지 못했습니다.", + "MessageTaskOpmlParseFastFail": "잘못된 OPML 파일 태그를 찾을 수 없거나 태그를 찾을 수 없습니다.", + "MessageTaskOpmlParseNoneFound": "OPML 파일에서 피드를 찾을 수 없습니다.", + "MessageTaskScanItemsAdded": "{0} 추가됨", + "MessageTaskScanItemsMissing": "{0} 누락됨", + "MessageTaskScanItemsUpdated": "{0} 업데이트됨", + "MessageTaskScanNoChangesNeeded": "변경이 필요하지 않습니다", + "MessageTaskScanningFileChanges": "\"{0}\"의 파일 변경 사항 스캔 중", + "MessageTaskScanningLibrary": "\"{0}\" 라이브러리 스캔 중", + "MessageTaskTargetDirectoryNotWritable": "대상 디렉토리에 쓸 수 없습니다", + "MessageThinking": "생각중...", + "MessageUploaderItemFailed": "업로드에 실패했습니다", + "MessageUploaderItemSuccess": "성공적으로 업로드되었습니다!", + "MessageUploading": "업로드 중...", + "MessageValidCronExpression": "유효한 cron 표현식", + "MessageWatcherIsDisabledGlobally": "서버 설정에서 Watcher가 전역적으로 비활성화되었습니다.", + "MessageXLibraryIsEmpty": "{0} 라이브러리가 비어 있습니다!", + "MessageYourAudiobookDurationIsLonger": "오디오북 길이가 검색된 길이보다 깁니다.", + "MessageYourAudiobookDurationIsShorter": "오디오북 길이가 검색된 길이보다 짧습니다.", + "NoteChangeRootPassword": "루트 사용자는 빈 비밀번호를 가질 수 있는 유일한 사용자입니다.", + "NoteChapterEditorTimes": "참고: 첫 번째 장의 시작 시간은 0:00으로 유지되어야 하며 마지막 장의 시작 시간은 이 오디오북 길이를 초과할 수 없습니다.", + "NoteFolderPicker": "참고: 이미 매핑된 폴더는 표시되지 않습니다.", + "NoteRSSFeedPodcastAppsHttps": "경고: 대부분의 팟캐스트 앱에서는 RSS 피드 URL이 HTTPS를 사용해야 합니다.", + "NoteRSSFeedPodcastAppsPubDate": "경고: 1개 이상의 에피소드에 게시 날짜가 없습니다. 일부 팟캐스트 앱에서는 게시 날짜가 필요합니다.", + "NoteUploaderFoldersWithMediaFiles": "미디어 파일이 있는 폴더는 별도의 라이브러리 항목으로 처리됩니다.", + "NoteUploaderOnlyAudioFiles": "오디오 파일만 업로드하는 경우 각 오디오 파일은 별도의 오디오북으로 처리됩니다.", + "NoteUploaderUnsupportedFiles": "지원되지 않는 파일은 무시됩니다. 폴더를 선택하거나 삭제할 때 항목 폴더에 없는 다른 파일은 무시됩니다.", + "NotificationOnBackupCompletedDescription": "백업이 완료되면 트리거됩니다.", + "NotificationOnBackupFailedDescription": "백업이 실패하면 트리거됨", + "NotificationOnEpisodeDownloadedDescription": "팟캐스트 에피소드가 자동으로 다운로드될 때 트리거됩니다.", + "NotificationOnRSSFeedDisabledDescription": "실패한 시도가 너무 많아 자동 에피소드 다운로드가 비활성화되면 트리거됩니다.", + "NotificationOnRSSFeedFailedDescription": "자동 에피소드 다운로드에 대한 RSS 피드 요청이 실패하면 트리거됩니다.", + "NotificationOnTestDescription": "알림 시스템 테스트를 위한 이벤트", + "PlaceholderBulkChapterInput": "챕터 제목을 입력하거나 번호를 사용하세요(예: '에피소드 1', '챕터 10', '1.')", + "PlaceholderNewCollection": "새로운 컬렉션 이름", + "PlaceholderNewFolderPath": "새 폴더 경로", + "PlaceholderNewPlaylist": "새로운 재생 목록 이름", + "PlaceholderSearch": "검색..", + "PlaceholderSearchEpisode": "에피소드 검색..", + "StatsAuthorsAdded": "작가가 추가되었습니다", + "StatsBooksAdded": "추가된 책", + "StatsBooksAdditional": "추가된 내용은 다음과 같습니다…", + "StatsBooksFinished": "책 완성", + "StatsBooksFinishedThisYear": "올해 읽은 책이 몇 권 있어요…", + "StatsBooksListenedTo": "듣는 책", + "StatsCollectionGrewTo": "너의 책 컬렉션이 다음과 같이 늘어났습니다…", + "StatsSessions": "세션", + "StatsSpentListening": "보낸 청취시간", + "StatsTopAuthor": "인기 작가", + "StatsTopAuthors": "인기 작가들", + "StatsTopGenre": "인기 장르", + "StatsTopGenres": "인기 장르", + "StatsTopMonth": "월간 인기", + "StatsTopNarrator": "인기 내레이터", + "StatsTopNarrators": "인기 내레이터들", + "StatsTotalDuration": "총 기간은…", + "StatsYearInReview": "올해 리뷰", + "ToastAccountUpdateSuccess": "계정이 업데이트되었습니다", + "ToastAppriseUrlRequired": "Apprise URL을 입력해야 합니다.", + "ToastAsinRequired": "ASIN이 필요합니다", + "ToastAuthorImageRemoveSuccess": "작가 이미지가 삭제되었습니다.", + "ToastAuthorNotFound": "작가 \"{0}\"을(를) 찾을 수 없습니다.", + "ToastAuthorRemoveSuccess": "작가 삭제됨", + "ToastAuthorSearchNotFound": "작가를 찾을 수 없습니다", + "ToastAuthorUpdateMerged": "작가 병합됨", + "ToastAuthorUpdateSuccess": "작가 업데이트됨", + "ToastAuthorUpdateSuccessNoImageFound": "작가 업데이트됨(이미지 없음)", + "ToastBackupAppliedSuccess": "백업이 적용되었음", + "ToastBackupCreateFailed": "백업을 생성하지 못했습니다", + "ToastBackupCreateSuccess": "백업이 생성되었습니다", + "ToastBackupDeleteFailed": "백업을 삭제하지 못했습니다.", + "ToastBackupDeleteSuccess": "백업이 삭제되었습니다", + "ToastBackupInvalidMaxKeep": "보관할 백업 수가 올바르지 않습니다.", + "ToastBackupInvalidMaxSize": "잘못된 최대 백업 크기", + "ToastBackupRestoreFailed": "백업을 복원하지 못했습니다", + "ToastBackupUploadFailed": "백업 업로드에 실패했습니다", + "ToastBackupUploadSuccess": "백업 업로드됨", + "ToastBatchApplyDetailsToItemsSuccess": "항목에 적용된 세부 정보", + "ToastBatchDeleteFailed": "일괄 삭제에 실패했습니다", + "ToastBatchDeleteSuccess": "일괄 삭제 성공", + "ToastBatchQuickMatchFailed": "일괄 퀵 매치에 실패했습니다!", + "ToastBatchQuickMatchStarted": "{0}권의 책에 대한 일괄 퀵 매치가 시작되었습니다!", + "ToastBatchUpdateFailed": "일괄 업데이트에 실패했습니다", + "ToastBatchUpdateSuccess": "일괄 업데이트 성공", + "ToastBookmarkCreateFailed": "북마크를 생성하지 못했습니다.", + "ToastBookmarkCreateSuccess": "북마크 추가됨", + "ToastBookmarkRemoveSuccess": "북마크가 삭제되었습니다", + "ToastBulkChapterInvalidCount": "1~150 사이의 숫자를 입력하세요", + "ToastCachePurgeFailed": "캐시를 정리하지 못했습니다.", + "ToastCachePurgeSuccess": "캐시가 성공적으로 삭제되었습니다.", + "ToastChapterLocked": "챕터가 잠겼습니다.", + "ToastChapterStartTimeAdjusted": "챕터 시작 시간이 {0}초로 조정되었습니다.", + "ToastChaptersAllLocked": "모든 챕터는 잠겨 있습니다. 일부 챕터를 잠금 해제하여 시간을 이동하세요.", + "ToastChaptersHaveErrors": "챕터에 오류가 있습니다", + "ToastChaptersInvalidShiftAmountLast": "잘못된 이동량입니다. 마지막 장의 시작 시간이 이 오디오북의 길이를 초과합니다.", + "ToastChaptersInvalidShiftAmountStart": "잘못된 이동량입니다. 첫 번째 챕터의 길이는 0 또는 음수이며 두 번째 챕터로 덮어쓰여집니다. 두 번째 챕터의 시작 길이를 늘리세요.", + "ToastChaptersMustHaveTitles": "챕터에는 제목이 있어야 합니다.", + "ToastChaptersRemoved": "챕터가 삭제되었습니다", + "ToastChaptersUpdated": "챕터 업데이트됨", + "ToastCollectionItemsAddFailed": "컬렉션에 항목을 추가하는 데 실패했습니다.", + "ToastCollectionRemoveSuccess": "컬렉션이 제거되었습니다", + "ToastCollectionUpdateSuccess": "컬렉션이 업데이트되었습니다", + "ToastConnectionNotAvailable": "연결할 수 없습니다. 나중에 다시 시도해 주세요.", + "ToastCoverSearchFailed": "커버 검색에 실패했습니다", + "ToastCoverUpdateFailed": "커버 업데이트에 실패했습니다", + "ToastDateTimeInvalidOrIncomplete": "날짜와 시간이 잘못되었거나 불완전합니다.", + "ToastDeleteFileFailed": "파일을 삭제하지 못했습니다", + "ToastDeleteFileSuccess": "파일이 삭제되었습니다", + "ToastDeviceAddFailed": "장치를 추가하지 못했습니다", + "ToastDeviceNameAlreadyExists": "해당 이름의 전자책 단말기가 이미 존재합니다.", + "ToastDeviceTestEmailFailed": "테스트 이메일을 보내지 못했습니다.", + "ToastDeviceTestEmailSuccess": "테스트 이메일이 전송되었습니다.", + "ToastEmailSettingsUpdateSuccess": "이메일 설정이 업데이트되었습니다.", + "ToastEncodeCancelFailed": "인코딩 취소에 실패했습니다", + "ToastEncodeCancelSucces": "인코딩 취소됨", + "ToastEpisodeDownloadQueueClearFailed": "대기열을 지우는 데 실패했습니다.", + "ToastEpisodeDownloadQueueClearSuccess": "에피소드 다운로드 대기열이 지워졌습니다.", + "ToastEpisodeUpdateSuccess": "{0}개 에피소드 업데이트됨", + "ToastErrorCannotShare": "이 기기에서는 기본적으로 공유할 수 없습니다.", + "ToastFailedToCreate": "생성에 실패했습니다", + "ToastFailedToDelete": "삭제에 실패했습니다", + "ToastFailedToLoadData": "데이터를 로드하는 데 실패했습니다", + "ToastFailedToMatch": "매칭에 실패했습니다", + "ToastFailedToShare": "공유에 실패했습니다", + "ToastFailedToUpdate": "업데이트에 실패했습니다", + "ToastInvalidImageUrl": "잘못된 이미지 URL", + "ToastInvalidMaxEpisodesToDownload": "다운로드할 수 있는 최대 에피소드 수가 올바르지 않습니다.", + "ToastInvalidUrl": "잘못된 URL", + "ToastInvalidUrls": "하나 이상의 URL이 잘못되었습니다.", + "ToastItemCoverUpdateSuccess": "아이템 커버 업데이트됨", + "ToastItemDeletedFailed": "항목을 삭제하지 못했습니다.", + "ToastItemDeletedSuccess": "삭제된 항목", + "ToastItemDetailsUpdateSuccess": "항목 상세정보 업데이트됨", + "ToastItemMarkedAsFinishedFailed": "완료로 표시하지 못했습니다.", + "ToastItemMarkedAsFinishedSuccess": "완료로 표시된 항목", + "ToastItemMarkedAsNotFinishedFailed": "완료되지 않음으로 표시하는 데 실패했습니다.", + "ToastItemMarkedAsNotFinishedSuccess": "완료되지 않음으로 표시된 항목", + "ToastItemUpdateSuccess": "항목이 업데이트되었습니다", + "ToastLibraryCreateFailed": "라이브러리를 생성하지 못했습니다.", + "ToastLibraryCreateSuccess": "라이브러리 \"{0}\"이 생성되었습니다.", + "ToastLibraryDeleteFailed": "라이브러리 삭제에 실패했습니다", + "ToastLibraryDeleteSuccess": "라이브러리 삭제됨", + "ToastLibraryScanFailedToStart": "스캔을 시작하지 못했습니다", + "ToastLibraryScanStarted": "라이브러리 스캔이 시작되었습니다", + "ToastLibraryUpdateSuccess": "라이브러리 \"{0}\"이(가) 업데이트되었습니다.", + "ToastMatchAllAuthorsFailed": "모든 작가를 일치시키지 못했습니다.", + "ToastMetadataFilesRemovedError": "메타데이터를 제거하는 중 오류가 발생했습니다.{0} 파일", + "ToastMetadataFilesRemovedNoneFound": "메타데이터가 없습니다.{0} 라이브러리에서 파일을 찾았습니다.", + "ToastMetadataFilesRemovedNoneRemoved": "메타데이터가 없습니다.{0} 파일이 제거되었습니다.", + "ToastMetadataFilesRemovedSuccess": "{0} 메타데이터.{1} 파일 제거됨", + "ToastMustHaveAtLeastOnePath": "최소한 하나의 경로가 있어야 합니다", + "ToastNameEmailRequired": "이름과 이메일이 필요합니다", + "ToastNameRequired": "이름이 필요합니다", + "ToastNewApiKeyUserError": "사용자를 선택해야 합니다", + "ToastNewEpisodesFound": "{0}개의 새로운 에피소드가 발견되었습니다.", + "ToastNewUserCreatedFailed": "계정 생성에 실패했습니다: \"{0}\"", + "ToastNewUserCreatedSuccess": "새로운 계정이 생성되었습니다", + "ToastNewUserLibraryError": "최소한 하나의 라이브러리를 선택해야 합니다.", + "ToastNewUserPasswordError": "비밀번호가 있어야 합니다. 루트 사용자만 빈 비밀번호를 가질 수 있습니다.", + "ToastNewUserTagError": "최소한 하나의 태그를 선택해야 합니다.", + "ToastNewUserUsernameError": "사용자 이름을 입력하세요", + "ToastNoNewEpisodesFound": "새로운 에피소드가 없습니다", + "ToastNoRSSFeed": "팟캐스트에 RSS 피드가 없습니다", + "ToastNoUpdatesNecessary": "업데이트가 필요하지 않습니다", + "ToastNotificationCreateFailed": "알림을 생성하지 못했습니다.", + "ToastNotificationDeleteFailed": "알림 삭제에 실패했습니다", + "ToastNotificationFailedMaximum": "실패한 최대 시도 횟수는 0 이상이어야 합니다.", + "ToastNotificationQueueMaximum": "최대 알림 대기열은 0 이상이어야 합니다.", + "ToastNotificationSettingsUpdateSuccess": "알림 설정이 업데이트되었습니다.", + "ToastNotificationTestTriggerFailed": "테스트 알림을 트리거하지 못했습니다.", + "ToastNotificationTestTriggerSuccess": "테스트 알림이 트리거되었습니다.", + "ToastNotificationUpdateSuccess": "알림이 업데이트되었습니다", + "ToastPlaylistCreateFailed": "플레이리스트를 생성하지 못했습니다", + "ToastPlaylistCreateSuccess": "플레이리스트가 생성되었습니다", + "ToastPlaylistRemoveSuccess": "재생목록이 삭제되었습니다", + "ToastPlaylistUpdateSuccess": "플레이리스트가 업데이트되었습니다", + "ToastPodcastCreateFailed": "팟캐스트를 만들지 못했습니다", + "ToastPodcastCreateSuccess": "팟캐스트가 성공적으로 생성되었습니다.", + "ToastPodcastEpisodeUpdated": "에피소드 업데이트됨", + "ToastPodcastGetFeedFailed": "팟캐스트 피드를 가져오지 못했습니다.", + "ToastPodcastNoEpisodesInFeed": "RSS 피드에서 에피소드를 찾을 수 없습니다.", + "ToastPodcastNoRssFeed": "팟캐스트에 RSS 피드가 없습니다", + "ToastProgressIsNotBeingSynced": "진행 상황이 동기화되지 않습니다. 재생을 다시 시작하세요.", + "ToastProviderCreatedFailed": "공급자를 추가하지 못했습니다", + "ToastProviderCreatedSuccess": "새로운 공급자가 추가되었습니다", + "ToastProviderNameAndUrlRequired": "이름과 URL이 필요합니다", + "ToastProviderRemoveSuccess": "제공자 제거됨", + "ToastRSSFeedCloseFailed": "RSS 피드를 닫지 못했습니다.", + "ToastRSSFeedCloseSuccess": "RSS 피드가 닫혔습니다", + "ToastRemoveFailed": "제거에 실패했습니다", + "ToastRemoveItemFromCollectionFailed": "컬렉션에서 항목을 제거하지 못했습니다.", + "ToastRemoveItemFromCollectionSuccess": "컬렉션에서 항목이 제거되었습니다.", + "ToastRemoveItemsWithIssuesFailed": "이슈가 있는 라이브러리 항목을 제거하지 못했습니다.", + "ToastRemoveItemsWithIssuesSuccess": "이슈가 있는 라이브러리 항목을 제거했습니다.", + "ToastRenameFailed": "이름 바꾸기에 실패했습니다", + "ToastRescanFailed": "{0}에 대한 재스캔에 실패했습니다.", + "ToastRescanRemoved": "재스캔 완료 항목이 제거되었습니다.", + "ToastRescanUpToDate": "재스캔 완료 항목이 최신 상태였습니다.", + "ToastRescanUpdated": "재스캔 완료 항목이 업데이트되었습니다.", + "ToastScanFailed": "라이브러리 항목 스캔에 실패했습니다.", + "ToastSelectAtLeastOneUser": "최소한 한 명의 사용자를 선택하세요", + "ToastSendEbookToDeviceFailed": "기기로 전자책을 보내지 못했습니다.", + "ToastSendEbookToDeviceSuccess": "전자책이 기기 \"{0}\"로 전송되었습니다.", + "ToastSeriesSubmitFailedSameName": "같은 이름의 두 시리즈를 추가할 수 없습니다.", + "ToastSeriesUpdateFailed": "시리즈 업데이트에 실패했습니다", + "ToastSeriesUpdateSuccess": "시리즈 업데이트 성공", + "ToastServerSettingsUpdateSuccess": "서버 설정이 업데이트되었습니다.", + "ToastSessionCloseFailed": "세션을 닫지 못했습니다", + "ToastSessionDeleteFailed": "세션 삭제에 실패했습니다", + "ToastSessionDeleteSuccess": "세션이 삭제되었습니다", + "ToastSleepTimerDone": "슬립 타이머 완료... zZzzZz", + "ToastSlugMustChange": "슬러그에 잘못된 문자가 포함되어 있습니다.", + "ToastSlugRequired": "슬러그가 필요합니다", + "ToastSocketConnected": "소켓 연결됨", + "ToastSocketDisconnected": "소켓이 연결해제", + "ToastSocketFailedToConnect": "소켓 연결에 실패했습니다", + "ToastSortingPrefixesEmptyError": "최소 1개의 정렬 접두사가 있어야 합니다.", + "ToastSortingPrefixesUpdateSuccess": "정렬 접두사가 업데이트되었습니다({0}개 항목)", + "ToastTitleRequired": "제목은 필수입니다", + "ToastUnknownError": "알 수 없는 오류", + "ToastUnlinkOpenIdFailed": "OpenID에서 사용자 연결을 해제하지 못했습니다.", + "ToastUnlinkOpenIdSuccess": "OpenID에서 사용자 연결이 해제되었습니다.", + "ToastUploaderFilepathExistsError": "파일 경로 \"{0}\"이(가) 서버에 이미 있습니다.", + "ToastUploaderItemExistsInSubdirectoryError": "항목 \"{0}\"이(가) 업로드 경로의 하위 디렉토리를 사용하고 있습니다.", + "ToastUserDeleteFailed": "사용자 삭제에 실패했습니다", + "ToastUserDeleteSuccess": "사용자가 삭제되었습니다", + "ToastUserPasswordChangeSuccess": "비밀번호가 성공적으로 변경되었습니다", + "ToastUserPasswordMismatch": "비밀번호가 일치하지 않습니다", + "ToastUserPasswordMustChange": "새 비밀번호는 이전 비밀번호와 일치할 수 없습니다.", + "ToastUserRootRequireName": "루트 사용자 이름을 입력해야 합니다", + "TooltipAddChapters": "챕터 추가", + "TooltipAddOneSecond": "1초 추가", + "TooltipAdjustChapterStart": "시작 시간을 조정하려면 클릭하세요", + "TooltipLockAllChapters": "모든 챕터 잠금", + "TooltipLockChapter": "장 잠금(범위를 위해 Shift+클릭)", + "TooltipSubtractOneSecond": "1초 빼기", + "TooltipUnlockAllChapters": "모든 챕터 잠금 해제", + "TooltipUnlockChapter": "챕터 잠금 해제(범위를 보려면 Shift+클릭)" +} From 1552c250df07066c7def2da30b11d37b7c324e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Renaldas=20Repe=C4=8Dka?= Date: Tue, 25 Nov 2025 17:01:30 +0100 Subject: [PATCH 047/117] Translated using Weblate (Lithuanian) Currently translated at 59.8% (696 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/lt/ --- client/strings/lt.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/strings/lt.json b/client/strings/lt.json index 9ebec5190..b5ca66630 100644 --- a/client/strings/lt.json +++ b/client/strings/lt.json @@ -18,6 +18,7 @@ "ButtonChooseAFolder": "Pasirinkite aplanką", "ButtonChooseFiles": "Pasirinkite failus", "ButtonClearFilter": "Valyti filtrą", + "ButtonClose": "Uždaryti", "ButtonCloseFeed": "Uždaryti srautą", "ButtonCloseSession": "Uždaryti Atidarytą sesiją", "ButtonCollections": "Kolekcijos", @@ -251,7 +252,7 @@ "LabelDuration": "Trukmė", "LabelDurationFound": "Rasta trukmė:", "LabelEbook": "Elektroninė knyga", - "LabelEbooks": "Elektroninės knygos", + "LabelEbooks": "El. knygos", "LabelEdit": "Redaguoti", "LabelEmail": "El. paštas", "LabelEmailSettingsFromAddress": "Siuntėjo adresas", @@ -261,6 +262,7 @@ "LabelEmbeddedCover": "Įterptas viršelis", "LabelEnable": "Įjungti", "LabelEnd": "Pabaiga", + "LabelEndOfChapter": "Skyriaus pabaiga", "LabelEpisode": "Epizodas", "LabelEpisodeTitle": "Epizodo pavadinimas", "LabelEpisodeType": "Epizodo tipas", @@ -282,8 +284,8 @@ "LabelGenre": "Žanras", "LabelGenres": "Žanrai", "LabelHardDeleteFile": "Galutinai ištrinti failą", - "LabelHasEbook": "Turi e-knygą", - "LabelHasSupplementaryEbook": "Turi papildomą e-knygą", + "LabelHasEbook": "Turi el. knygą", + "LabelHasSupplementaryEbook": "Turi papildomą el. knygą", "LabelHost": "Serveris", "LabelHour": "Valanda", "LabelIcon": "Piktograma", From d12f7276036db0f7d0b8422c7fb85f1405872254 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 25 Nov 2025 13:04:29 +0100 Subject: [PATCH 048/117] Translated using Weblate (Polish) Currently translated at 89.2% (1038 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index 944492681..316e84234 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -588,7 +588,7 @@ "LabelSettingsChromecastSupport": "Wsparcie Chromecast", "LabelSettingsDateFormat": "Format daty", "LabelSettingsEnableWatcher": "Automatyczne monitorowanie bibliotek w poszukiwaniu zmian", - "LabelSettingsEnableWatcherForLibrary": "Automatyczne skanowanie biblioteki w poszukiwaniu zmian", + "LabelSettingsEnableWatcherForLibrary": "Automatyczne monitorowanie biblioteki w poszukiwaniu zmian", "LabelSettingsEnableWatcherHelp": "Włącza automatyczne dodawanie/aktualizację pozycji gdy wykryte zostaną zmiany w plikach. Wymaga restartu serwera", "LabelSettingsEpubsAllowScriptedContent": "Zezwalanie na skrypty w plikach epub", "LabelSettingsEpubsAllowScriptedContentHelp": "Zezwala plikom epub na wykonywanie skryptów. Zaleca się mieć to ustawienie wyłączone, chyba że ma się zaufanie do źródła plików epub.", @@ -911,8 +911,10 @@ "MessageTaskFailedToMergeAudioFiles": "Nie udało się połączyć plików audio", "MessageTaskFailedToMoveM4bFile": "Nie udało się przenieść pliku m4b", "MessageTaskFailedToWriteMetadataFile": "Niepowodzenie zapisania pliku metadanych", + "MessageTaskMatchingBooksInLibrary": "Pasujące książki w bibliotece \"{0}\"", "MessageTaskNoFilesToScan": "Brak plików do skanowania", "MessageTaskOpmlImport": "Importuj OPML", + "MessageTaskOpmlImportDescription": "Tworzenie {0} podcastów z kanałów RSS", "MessageTaskScanItemsAdded": "Dodano {0}", "MessageTaskScanItemsMissing": "Brakuje {0}", "MessageTaskScanItemsUpdated": "Zaktualizowano {0}", From 6b8464c27003ea983e18cf3752462f23c14bce1d Mon Sep 17 00:00:00 2001 From: Ivan Smoliakov Date: Sat, 29 Nov 2025 01:02:19 +0100 Subject: [PATCH 049/117] Translated using Weblate (Russian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/ --- client/strings/ru.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/strings/ru.json b/client/strings/ru.json index 8bebb2835..e0b048642 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -383,7 +383,7 @@ "LabelFolders": "Папки", "LabelFontBold": "Жирный", "LabelFontBoldness": "Жирность шрифта", - "LabelFontFamily": "Семейство шрифтов", + "LabelFontFamily": "Семейство шрифта", "LabelFontItalic": "Курсив", "LabelFontScale": "Масштаб шрифта", "LabelFontStrikethrough": "Зачеркнутый", @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Конструкция с деревянными полками", "LabelSettingsChromecastSupport": "Поддержка Chromecast", "LabelSettingsDateFormat": "Формат даты", - "LabelSettingsEnableWatcher": "Автоматическое сканирование библиотек на изменение", - "LabelSettingsEnableWatcherForLibrary": "Автоматическое сканирование библиотеки на изменение", + "LabelSettingsEnableWatcher": "Автоматически отслеживать изменения в библиотеках", + "LabelSettingsEnableWatcherForLibrary": "Автоматический просмотр библиотеки на изменение", "LabelSettingsEnableWatcherHelp": "Включает автоматическое добавление/обновление элементов при обнаружении изменений файлов. *Требуется перезапуск сервера", "LabelSettingsEpubsAllowScriptedContent": "Разрешение содержимого epub с скриптами", "LabelSettingsEpubsAllowScriptedContentHelp": "Разрешить файлам epub выполнять скрипты. Рекомендуется отключать этот параметр, если вы не доверяете источнику файлов epub.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Вы уверены, что хотите сбросить главы и отменить внесенные изменения?", "MessageRestoreBackupConfirm": "Вы уверены, что хотите восстановить резервную копию, созданную", "MessageRestoreBackupWarning": "Восстановление резервной копии перезапишет всю базу данных, расположенную в /config, и обложки изображений в /metadata/items и /metadata/authors.

Бэкапы не изменяют файлы в папках библиотеки. Если вы включили параметры сервера для хранения обложек и метаданных в папках библиотеки, то они не резервируются и не перезаписываются.

Все клиенты, использующие ваш сервер, будут автоматически обновлены.", - "MessageScheduleLibraryScanNote": "Большинству пользователей рекомендуется отключить эту функцию и включить функцию просмотра папок. Программа просмотра папок автоматически обнаружит изменения в папках вашей библиотеки. Программа просмотра папок работает не для каждой файловой системы (например, NFS), поэтому вместо этого можно использовать запланированные проверки библиотеки.", + "MessageScheduleLibraryScanNote": "Большинству пользователей рекомендуется отключить эту функцию и оставить включённой функцию \"Автоматически отслеживать изменения в библиотеках\" - она будет автоматически обнаруживать изменения в папках вашей библиотеки. Включите эту функцию если \"Автоматически отслеживать изменения в библиотеках\" не работает для вашей файловой системы (например, NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Запуск каждые {0} по {1}", "MessageSearchResultsFor": "Результаты поиска для", "MessageSelected": "{0} выбрано", From 9441346b0ae5311954d7604c3d0b73251224c190 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 29 Nov 2025 16:32:16 +0100 Subject: [PATCH 050/117] Added translation using Weblate (Icelandic) --- client/strings/is.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 client/strings/is.json diff --git a/client/strings/is.json b/client/strings/is.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/client/strings/is.json @@ -0,0 +1 @@ +{} From cee9b9d8e34df5256cefb3233b77df97bd68f326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Sat, 29 Nov 2025 17:17:47 +0100 Subject: [PATCH 051/117] Translated using Weblate (Finnish) Currently translated at 97.5% (1134 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/ --- client/strings/fi.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/client/strings/fi.json b/client/strings/fi.json index 421d5df43..bf2659ba1 100644 --- a/client/strings/fi.json +++ b/client/strings/fi.json @@ -383,7 +383,7 @@ "LabelFolders": "Kansiot", "LabelFontBold": "Lihavoitu", "LabelFontBoldness": "Kirjasintyyppien lihavointi", - "LabelFontFamily": "Kirjasinperhe", + "LabelFontFamily": "Fonttiperhe", "LabelFontItalic": "Kursiivi", "LabelFontScale": "Kirjasintyyppien skaalautuminen", "LabelFontStrikethrough": "Yliviivattu", @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Skeuomorfinen muotoilu puisilla hyllyillä", "LabelSettingsChromecastSupport": "Chromecast-tuki", "LabelSettingsDateFormat": "Päivämäärän muoto", - "LabelSettingsEnableWatcher": "Skannaa kirjastot automaattisesti muutoksien varalta", - "LabelSettingsEnableWatcherForLibrary": "Skannaa kirjastot automaattisesti muutoksien varalta", + "LabelSettingsEnableWatcher": "Vahdi kirjastoja automaattisesti muutoksien varalta", + "LabelSettingsEnableWatcherForLibrary": "Vahdi kirjastoja automaattisesti muutoksien varalta", "LabelSettingsEnableWatcherHelp": "Ottaa käyttöön kohteiden automaattisen lisäämisen ja päivityksen kun tiedostomuutoksia havaitaan. *Tarvitsee palvelimen uudelleenkäynnistyksen", "LabelSettingsEpubsAllowScriptedContent": "Salli komentosarjamuotoinen sisältö epubissa", "LabelSettingsEpubsAllowScriptedContentHelp": "Salli epub-tiedostojen suorittaa komentosarjoja. On suositeltavaa pitää tämä asetus pois käytöstä, ellet luota epub-tiedostojen lähteeseen.", @@ -738,6 +738,8 @@ "MessageAppriseDescription": "Käyttääksesi tätä toimintoa tarvitset Apprise API -instanssin tai rajapinnan joka käsittelee samoja pyyntöjä.
Apprise rajapinnan osoite tulee olla täysi URL polku ilmoituksen lähetykseen, esim. jos rajapinta on osoitteessa http://192.168.1.1:8337,niin arvoksi tulee antaa http://192.168.1.1:8337/notify.", "MessageAsinCheck": "Varmista, että käytät ASIN-tunnusta oikealta Audible-alueelta, ei Amazonista.", "MessageAuthenticationLegacyTokenWarning": "Vanhat API-tunnukset poistetaan tulevaisuudessa. Käytä sen sijaan API-avaimia.", + "MessageAuthenticationOIDCChangesRestart": "Käynnistä palvelin uudelleen tallennuksen jälkeen ottaaksesi OIDC-muutokset käyttöön.", + "MessageAuthenticationSecurityMessage": "Tunnistautumisen tietoturvaa on parannettu. Kaikkien käyttäjien tulee kirjautua sisään uudelleen.", "MessageBackupsDescription": "Varmuuskopiot sisältävät käyttäjät, käyttäjien edistymisen, kirjastokohteiden tiedot, palvelinasetukset ja /metadata/items- ja /metadata/authors -kansioihin tallennetut kuvat. Varmuuskopiot eivät sisällä kirjastosi kansioihin tallennettuja tiedostoja.", "MessageBackupsLocationEditNote": "Huomautus: Varmuuskopion sijainnin päivittäminen ei siirrä tai muokkaa olemassa olevia varmuuskopioita", "MessageBackupsLocationNoEditNote": "Huomautus: Varmuuskopion sijainti asetetaan ympäristömuuttujan kautta, eikä sitä voi muuttaa tässä.", @@ -751,6 +753,7 @@ "MessageBookshelfNoResultsForFilter": "Ei tuloksia suodattimelle \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Ei tuloksia kyselylle", "MessageBookshelfNoSeries": "Sinulla ei ole sarjoja", + "MessageBulkChapterPattern": "Kuinka monta lukua haluaisit lisätä tällä numerointimallilla?", "MessageChapterEndIsAfter": "Luvun loppu sijaitsee äänikirjan lopun jälkeen", "MessageChapterErrorFirstNotZero": "Ensimmäisen luvun tulee alkaa nollasta", "MessageChapterErrorStartGteDuration": "Epäkelvollinen aloitusaika; on oltava lyhyempi kuin äänikirjan kesto", @@ -759,6 +762,7 @@ "MessageChaptersNotFound": "Kappaleita ei löydy", "MessageCheckingCron": "Tarkistetaan cronia...", "MessageConfirmCloseFeed": "Oletko varma, että haluat sulkea tämän syötteen?", + "MessageConfirmDeleteApiKey": "Haluatko varmasti poistaa API-avaimen \"{0}\"?", "MessageConfirmDeleteBackup": "Oletko varma, että haluat poistaa varmuuskopion {0}:lle?", "MessageConfirmDeleteDevice": "Oletko varma, että haluat poistaa s-lukulaitteen \"{0}\"?", "MessageConfirmDeleteFile": "Tämä poistaa tiedoston tiedostojärjestelmästäsi. Oletko varma?", From d4fdb47c7fe6ebb4e4cc7d3525c10196dc3afa59 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Sat, 29 Nov 2025 22:02:08 +0100 Subject: [PATCH 052/117] Translated using Weblate (German) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/de.json b/client/strings/de.json index 5f7f81cc4..8398a7211 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -383,7 +383,7 @@ "LabelFolders": "Verzeichnisse", "LabelFontBold": "Fett", "LabelFontBoldness": "Schriftstärke", - "LabelFontFamily": "Schrift Familie", + "LabelFontFamily": "Schriftfamilie", "LabelFontItalic": "Kursiv", "LabelFontScale": "Schriftgröße", "LabelFontStrikethrough": "Durchgestrichen", From 3b6419bc1b3d2819a9dc02a738ea38fa92ebdb16 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Sat, 29 Nov 2025 22:02:47 +0100 Subject: [PATCH 053/117] Translated using Weblate (French) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/ --- client/strings/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index f2c795980..4841ec9f6 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -383,9 +383,9 @@ "LabelFolders": "Dossiers", "LabelFontBold": "Gras", "LabelFontBoldness": "Graisse de la police", - "LabelFontFamily": "Polices de caractères", + "LabelFontFamily": "Famille de caractères", "LabelFontItalic": "Italique", - "LabelFontScale": "Taille de la police de caractère", + "LabelFontScale": "Taille de la police", "LabelFontStrikethrough": "Barrer", "LabelFormat": "Format", "LabelFull": "Complet", From 329e3c71795398d93a5e12fe7045f7ca4d0c098e Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 29 Nov 2025 16:32:57 -0600 Subject: [PATCH 054/117] Add Korean language option --- client/plugins/i18n.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/plugins/i18n.js b/client/plugins/i18n.js index e4c179016..83e748f25 100644 --- a/client/plugins/i18n.js +++ b/client/plugins/i18n.js @@ -22,6 +22,7 @@ const languageCodeMap = { it: { label: 'Italiano', dateFnsLocale: 'it' }, lt: { label: 'Lietuvių', dateFnsLocale: 'lt' }, hu: { label: 'Magyar', dateFnsLocale: 'hu' }, + ko: { label: '한국어', dateFnsLocale: 'ko' }, nl: { label: 'Nederlands', dateFnsLocale: 'nl' }, no: { label: 'Norsk', dateFnsLocale: 'no' }, pl: { label: 'Polski', dateFnsLocale: 'pl' }, From 5f1edcb60969cbede473c5b5a6c88316d86ab935 Mon Sep 17 00:00:00 2001 From: mikiher Date: Mon, 1 Dec 2025 18:00:34 +0200 Subject: [PATCH 055/117] Wrap ensureDir in try-catch blocks --- server/managers/BackupManager.js | 31 ++++++++++++++++++++--- server/managers/CacheManager.js | 13 +++++++--- server/managers/LogManager.js | 31 +++++++++++++---------- server/managers/MigrationManager.js | 7 ++++- server/managers/PlaybackSessionManager.js | 7 ++++- 5 files changed, 67 insertions(+), 22 deletions(-) diff --git a/server/managers/BackupManager.js b/server/managers/BackupManager.js index 102521b71..562748c36 100644 --- a/server/managers/BackupManager.js +++ b/server/managers/BackupManager.js @@ -48,9 +48,34 @@ class BackupManager { } async init() { - const backupsDirExists = await fs.pathExists(this.backupPath) - if (!backupsDirExists) { - await fs.ensureDir(this.backupPath) + // Validate backupPath before attempting to create it + if (!this.backupPath || typeof this.backupPath !== 'string' || this.backupPath.length < 2) { + Logger.error(`[BackupManager] Invalid backup path configured: "${this.backupPath}". Falling back to default.`) + // Reset to default backup path + global.ServerSettings.backupPath = Path.join(global.MetadataPath, 'backups') + } + + try { + const backupsDirExists = await fs.pathExists(this.backupPath) + if (!backupsDirExists) { + await fs.ensureDir(this.backupPath) + } + } catch (error) { + Logger.error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}": ${error.message}`) + // Attempt to fall back to default path + const defaultBackupPath = Path.join(global.MetadataPath, 'backups') + if (this.backupPath !== defaultBackupPath) { + Logger.info(`[BackupManager] Attempting to use default backup path: "${defaultBackupPath}"`) + global.ServerSettings.backupPath = defaultBackupPath + try { + await fs.ensureDir(defaultBackupPath) + } catch (fallbackError) { + Logger.error(`[BackupManager] Failed to create default backup directory: ${fallbackError.message}`) + throw new Error(`[BackupManager] Failed to create default backup directory at "${defaultBackupPath}"`, { cause: fallbackError }) + } + } else { + throw new Error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}"`, { cause: error }) + } } await this.loadBackups() diff --git a/server/managers/CacheManager.js b/server/managers/CacheManager.js index b44b65de3..38c0415e9 100644 --- a/server/managers/CacheManager.js +++ b/server/managers/CacheManager.js @@ -24,10 +24,15 @@ class CacheManager { this.ImageCachePath = Path.join(this.CachePath, 'images') this.ItemCachePath = Path.join(this.CachePath, 'items') - await fs.ensureDir(this.CachePath) - await fs.ensureDir(this.CoverCachePath) - await fs.ensureDir(this.ImageCachePath) - await fs.ensureDir(this.ItemCachePath) + try { + await fs.ensureDir(this.CachePath) + await fs.ensureDir(this.CoverCachePath) + await fs.ensureDir(this.ImageCachePath) + await fs.ensureDir(this.ItemCachePath) + } catch (error) { + Logger.error(`[CacheManager] Failed to create cache directories at "${this.CachePath}": ${error.message}`) + throw new Error(`[CacheManager] Failed to create cache directories at "${this.CachePath}"`, { cause: error }) + } } async handleCoverCache(res, libraryItemId, options = {}) { diff --git a/server/managers/LogManager.js b/server/managers/LogManager.js index 731dfe70a..07bb7d401 100644 --- a/server/managers/LogManager.js +++ b/server/managers/LogManager.js @@ -37,8 +37,13 @@ class LogManager { } async ensureLogDirs() { - await fs.ensureDir(this.DailyLogPath) - await fs.ensureDir(this.ScanLogPath) + try { + await fs.ensureDir(this.DailyLogPath) + await fs.ensureDir(this.ScanLogPath) + } catch (error) { + console.error(`[LogManager] Failed to create log directories at "${this.DailyLogPath}": ${error.message}`) + throw new Error(`[LogManager] Failed to create log directories at "${this.DailyLogPath}"`, { cause: error }) + } } /** @@ -102,20 +107,20 @@ class LogManager { } /** - * - * @param {string} filename + * + * @param {string} filename */ async removeLogFile(filename) { const fullPath = Path.join(this.DailyLogPath, filename) const exists = await fs.pathExists(fullPath) if (!exists) { Logger.error(TAG, 'Invalid log dne ' + fullPath) - this.dailyLogFiles = this.dailyLogFiles.filter(dlf => dlf !== filename) + this.dailyLogFiles = this.dailyLogFiles.filter((dlf) => dlf !== filename) } else { try { await fs.unlink(fullPath) Logger.info(TAG, 'Removed daily log: ' + filename) - this.dailyLogFiles = this.dailyLogFiles.filter(dlf => dlf !== filename) + this.dailyLogFiles = this.dailyLogFiles.filter((dlf) => dlf !== filename) } catch (error) { Logger.error(TAG, 'Failed to unlink log file ' + fullPath) } @@ -123,8 +128,8 @@ class LogManager { } /** - * - * @param {LogObject} logObj + * + * @param {LogObject} logObj */ async logToFile(logObj) { // Fatal crashes get logged to a separate file @@ -152,8 +157,8 @@ class LogManager { } /** - * - * @param {LogObject} logObj + * + * @param {LogObject} logObj */ async logCrashToFile(logObj) { const line = JSON.stringify(logObj) + '\n' @@ -161,18 +166,18 @@ class LogManager { const logsDir = Path.join(global.MetadataPath, 'logs') await fs.ensureDir(logsDir) const crashLogPath = Path.join(logsDir, 'crash_logs.txt') - return fs.writeFile(crashLogPath, line, { flag: "a+" }).catch((error) => { + return fs.writeFile(crashLogPath, line, { flag: 'a+' }).catch((error) => { console.log('[LogManager] Appended crash log', error) }) } /** * Most recent 5000 daily logs - * + * * @returns {string} */ getMostRecentCurrentDailyLogs() { return this.currentDailyLog?.logs.slice(-5000) || '' } } -module.exports = LogManager \ No newline at end of file +module.exports = LogManager diff --git a/server/managers/MigrationManager.js b/server/managers/MigrationManager.js index 8635def10..e302038ff 100644 --- a/server/managers/MigrationManager.js +++ b/server/managers/MigrationManager.js @@ -38,7 +38,12 @@ class MigrationManager { if (!(await fs.pathExists(this.configPath))) throw new Error(`Config path does not exist: ${this.configPath}`) this.migrationsDir = path.join(this.configPath, 'migrations') - await fs.ensureDir(this.migrationsDir) + try { + await fs.ensureDir(this.migrationsDir) + } catch (error) { + Logger.error(`[MigrationManager] Failed to create migrations directory at "${this.migrationsDir}": ${error.message}`) + throw new Error(`[MigrationManager] Failed to create migrations directory at "${this.migrationsDir}"`, { cause: error }) + } this.serverVersion = this.extractVersionFromTag(serverVersion) if (!this.serverVersion) throw new Error(`Invalid server version: ${serverVersion}. Expected a version tag like v1.2.3.`) diff --git a/server/managers/PlaybackSessionManager.js b/server/managers/PlaybackSessionManager.js index fb12fedaa..1e95727f1 100644 --- a/server/managers/PlaybackSessionManager.js +++ b/server/managers/PlaybackSessionManager.js @@ -459,7 +459,12 @@ class PlaybackSessionManager { * Remove all stream folders in `/metadata/streams` */ async removeOrphanStreams() { - await fs.ensureDir(this.StreamsPath) + try { + await fs.ensureDir(this.StreamsPath) + } catch (error) { + Logger.error(`[PlaybackSessionManager] Failed to create streams directory at "${this.StreamsPath}": ${error.message}`) + throw new Error(`[PlaybackSessionManager] Failed to create streams directory at "${this.StreamsPath}"`, { cause: error }) + } try { const streamsInPath = await fs.readdir(this.StreamsPath) for (const streamId of streamsInPath) { From d7bfccdc4a43a3f682849062b1effafb00812fee Mon Sep 17 00:00:00 2001 From: mikiher Date: Mon, 1 Dec 2025 18:54:43 +0200 Subject: [PATCH 056/117] BackupManager: Remove backup fallback logic --- server/managers/BackupManager.js | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/server/managers/BackupManager.js b/server/managers/BackupManager.js index 562748c36..2697f94ea 100644 --- a/server/managers/BackupManager.js +++ b/server/managers/BackupManager.js @@ -48,13 +48,6 @@ class BackupManager { } async init() { - // Validate backupPath before attempting to create it - if (!this.backupPath || typeof this.backupPath !== 'string' || this.backupPath.length < 2) { - Logger.error(`[BackupManager] Invalid backup path configured: "${this.backupPath}". Falling back to default.`) - // Reset to default backup path - global.ServerSettings.backupPath = Path.join(global.MetadataPath, 'backups') - } - try { const backupsDirExists = await fs.pathExists(this.backupPath) if (!backupsDirExists) { @@ -62,20 +55,7 @@ class BackupManager { } } catch (error) { Logger.error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}": ${error.message}`) - // Attempt to fall back to default path - const defaultBackupPath = Path.join(global.MetadataPath, 'backups') - if (this.backupPath !== defaultBackupPath) { - Logger.info(`[BackupManager] Attempting to use default backup path: "${defaultBackupPath}"`) - global.ServerSettings.backupPath = defaultBackupPath - try { - await fs.ensureDir(defaultBackupPath) - } catch (fallbackError) { - Logger.error(`[BackupManager] Failed to create default backup directory: ${fallbackError.message}`) - throw new Error(`[BackupManager] Failed to create default backup directory at "${defaultBackupPath}"`, { cause: fallbackError }) - } - } else { - throw new Error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}"`, { cause: error }) - } + throw new Error(`[BackupManager] Failed to ensure backup directory at "${this.backupPath}"`, { cause: error }) } await this.loadBackups() From 219a9fc6d54be0a73e9cc199a55a671572c95011 Mon Sep 17 00:00:00 2001 From: Netleak Date: Sun, 30 Nov 2025 00:09:07 +0100 Subject: [PATCH 057/117] Translated using Weblate (Czech) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/ --- client/strings/cs.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/strings/cs.json b/client/strings/cs.json index 4b20c2a59..f70d6693c 100644 --- a/client/strings/cs.json +++ b/client/strings/cs.json @@ -589,7 +589,7 @@ "LabelSettingsChromecastSupport": "Podpora Chromecastu", "LabelSettingsDateFormat": "Formát data", "LabelSettingsEnableWatcher": "Automaticky skenovat změny v knihovnách", - "LabelSettingsEnableWatcherForLibrary": "Automaticky skenovat změny v knihovně", + "LabelSettingsEnableWatcherForLibrary": "Automaticky sledovat změny v knihovně", "LabelSettingsEnableWatcherHelp": "Povoluje automatické přidávání/aktualizaci položek, když jsou zjištěny změny souborů. *Vyžaduje restart serveru", "LabelSettingsEpubsAllowScriptedContent": "Povolení skriptovaného obsahu v epubu", "LabelSettingsEpubsAllowScriptedContentHelp": "Povolení spouštění skriptů v souborech epub. Doporučujeme toto nastavení vypnout, pokud nedůvěřujete zdroji souborů epub.", @@ -1026,6 +1026,8 @@ "ToastCollectionItemsAddFailed": "Přidávání položek do kolekce selhalo", "ToastCollectionRemoveSuccess": "Kolekce odstraněna", "ToastCollectionUpdateSuccess": "Kolekce aktualizována", + "ToastConnectionNotAvailable": "Připojení není k dispozici. Zkuste to prosím znovu později", + "ToastCoverSearchFailed": "Hledání obálky se nezdařilo", "ToastCoverUpdateFailed": "Aktualizace obálky selhala", "ToastDateTimeInvalidOrIncomplete": "Datum a čas jsou chybné nebo nekompletní", "ToastDeleteFileFailed": "Nepodařilo se smazat soubor", From 991d25f6284eea320aa8247080ca72e37bed0419 Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 1 Dec 2025 17:13:15 -0600 Subject: [PATCH 058/117] Version bump v2.31.0 --- client/package-lock.json | 4 ++-- client/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 0d2699ed1..2d41d39ef 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf-client", - "version": "2.30.0", + "version": "2.31.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf-client", - "version": "2.30.0", + "version": "2.31.0", "license": "ISC", "dependencies": { "@nuxtjs/axios": "^5.13.6", diff --git a/client/package.json b/client/package.json index 50fd0b713..33d66c276 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-client", - "version": "2.30.0", + "version": "2.31.0", "buildNumber": 1, "description": "Self-hosted audiobook and podcast client", "main": "index.js", diff --git a/package-lock.json b/package-lock.json index 8eea3abbd..d703a8edc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf", - "version": "2.30.0", + "version": "2.31.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf", - "version": "2.30.0", + "version": "2.31.0", "license": "GPL-3.0", "dependencies": { "axios": "^0.27.2", diff --git a/package.json b/package.json index 0b4ee4137..0aaf4f5af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf", - "version": "2.30.0", + "version": "2.31.0", "buildNumber": 1, "description": "Self-hosted audiobook and podcast server", "main": "index.js", From 648983708ed2c461a286f153917615d60788cffe Mon Sep 17 00:00:00 2001 From: sir-wilhelm Date: Fri, 12 Dec 2025 04:02:20 +0000 Subject: [PATCH 059/117] Sort the playlist sections alphabetically. --- client/components/modals/playlists/AddCreateModal.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/components/modals/playlists/AddCreateModal.vue b/client/components/modals/playlists/AddCreateModal.vue index e695ccb0c..f8543f1de 100644 --- a/client/components/modals/playlists/AddCreateModal.vue +++ b/client/components/modals/playlists/AddCreateModal.vue @@ -97,7 +97,10 @@ export default { ...playlist } }) - .sort((a, b) => (a.isItemIncluded ? -1 : 1)) + .sort((a, b) => { + if (a.isItemIncluded !== b.isItemIncluded) return a.isItemIncluded ? -1 : 1 + return a.name.localeCompare(b.name) + }) }, isBatch() { return this.selectedPlaylistItems.length > 1 From 503f4611b221a5bde19024e657021670df204478 Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 12 Dec 2025 17:24:01 -0600 Subject: [PATCH 060/117] Update tooltip with plaintext prop --- client/components/cards/LazyBookCard.vue | 6 +++--- client/components/stats/DailyListeningChart.vue | 2 +- client/components/ui/Tooltip.vue | 15 ++++++++++++--- client/pages/audiobook/_id/chapters.vue | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/client/components/cards/LazyBookCard.vue b/client/components/cards/LazyBookCard.vue index d06f083ba..51f657dbc 100644 --- a/client/components/cards/LazyBookCard.vue +++ b/client/components/cards/LazyBookCard.vue @@ -78,7 +78,7 @@ - +
priority_high
@@ -121,12 +121,12 @@
- +

{{ displayTitle }}

- +

{{ displaySubtitle }}

{{ displayLineTwo || ' ' }}

diff --git a/client/components/stats/DailyListeningChart.vue b/client/components/stats/DailyListeningChart.vue index f3a50d11c..55752fc5d 100644 --- a/client/components/stats/DailyListeningChart.vue +++ b/client/components/stats/DailyListeningChart.vue @@ -14,7 +14,7 @@
- +
diff --git a/client/components/ui/Tooltip.vue b/client/components/ui/Tooltip.vue index e6ab0117b..c858cbfec 100644 --- a/client/components/ui/Tooltip.vue +++ b/client/components/ui/Tooltip.vue @@ -22,7 +22,8 @@ export default { type: Number, default: 0 }, - disabled: Boolean + disabled: Boolean, + plaintext: Boolean }, data() { return { @@ -46,7 +47,11 @@ export default { methods: { updateText() { if (this.tooltip) { - this.tooltip.innerHTML = this.text + if (this.plaintext) { + this.tooltip.textContent = this.text + } else { + this.tooltip.innerHTML = this.text + } this.setTooltipPosition(this.tooltip) } }, @@ -58,7 +63,11 @@ export default { tooltip.className = 'tooltip-wrapper absolute px-2 py-1 text-white text-xs rounded-sm shadow-lg max-w-xs text-center hidden sm:block' tooltip.style.zIndex = 100 tooltip.style.backgroundColor = 'rgba(0,0,0,0.85)' - tooltip.innerHTML = this.text + if (this.plaintext) { + tooltip.textContent = this.text + } else { + tooltip.innerHTML = this.text + } tooltip.addEventListener('mouseover', this.cancelHide) tooltip.addEventListener('mouseleave', this.hideTooltip) diff --git a/client/pages/audiobook/_id/chapters.vue b/client/pages/audiobook/_id/chapters.vue index 4d6c0e41d..e91a8846d 100644 --- a/client/pages/audiobook/_id/chapters.vue +++ b/client/pages/audiobook/_id/chapters.vue @@ -126,7 +126,7 @@
{{ elapsedTime }}s
- + From bcfe1e96478a977b74a3b4267852d707496b8995 Mon Sep 17 00:00:00 2001 From: thehijacker Date: Tue, 2 Dec 2025 12:57:43 +0100 Subject: [PATCH 061/117] Translated using Weblate (Slovenian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/ --- client/strings/sl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/sl.json b/client/strings/sl.json index 962ccaa80..3b7ce53a2 100644 --- a/client/strings/sl.json +++ b/client/strings/sl.json @@ -383,7 +383,7 @@ "LabelFolders": "Mape", "LabelFontBold": "Krepko", "LabelFontBoldness": "Krepkost pisave", - "LabelFontFamily": "Družina pisave", + "LabelFontFamily": "Družina pisav", "LabelFontItalic": "Ležeče", "LabelFontScale": "Merilo pisave", "LabelFontStrikethrough": "Prečrtano", From 5de942aefbf915297e91e87f6ed44bec906126c6 Mon Sep 17 00:00:00 2001 From: Napitauki Date: Mon, 1 Dec 2025 23:09:52 +0100 Subject: [PATCH 062/117] Translated using Weblate (Finnish) Currently translated at 97.6% (1136 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/ --- client/strings/fi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/fi.json b/client/strings/fi.json index bf2659ba1..db152c9f3 100644 --- a/client/strings/fi.json +++ b/client/strings/fi.json @@ -930,7 +930,7 @@ "MessageTaskScanningFileChanges": "Tarkastetaan tiedoston muutoksia \"{0}\":sta", "MessageTaskScanningLibrary": "Tarkastetaan kirjastoa \"{0}\"", "MessageTaskTargetDirectoryNotWritable": "Kohdehakemisto ei ole kirjoitettava", - "MessageThinking": "Ajattellaan...", + "MessageThinking": "Ajatellaan...", "MessageUploaderItemFailed": "Lataaminen ulospäin epäonnistui", "MessageUploaderItemSuccess": "Onnistuneesti ladattu! ulospäin!", "MessageUploading": "Ladataan! ulospäin...", From a33e87db9965f2aabc370699c66de520a1488ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Tue, 2 Dec 2025 17:39:45 +0100 Subject: [PATCH 063/117] Translated using Weblate (Finnish) Currently translated at 97.6% (1136 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/ --- client/strings/fi.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/strings/fi.json b/client/strings/fi.json index db152c9f3..600db265a 100644 --- a/client/strings/fi.json +++ b/client/strings/fi.json @@ -815,6 +815,7 @@ "MessageFeedURLWillBe": "Syötteen URL tulee olemaan {0}", "MessageFetching": "Haetaan...", "MessageForceReScanDescription": "skannaa kaikki tiedostot uudelleen kuten uusi tarkistus. Äänitiedoston ID3-tunnisteet, OPF-tiedostot ja tekstitiedostot skannataan uusina.", + "MessageHeatmapListeningTimeTooltip": "{0} kuunnellaan on {1}", "MessageImportantNotice": "Tärkeä huomautus!", "MessageInsertChapterBelow": "Syötä luku alle", "MessageInvalidAsin": "Virheellinen ASIN", @@ -885,7 +886,7 @@ "MessageResetChaptersConfirm": "Oletko varma, että haluat nollata luvut ja kumota tekemäsi muutokset?", "MessageRestoreBackupConfirm": "Oletko varma, että haluat palauttaa varmuuskopion, joka on luotu", "MessageRestoreBackupWarning": "Varmuuskopion palauttaminen korvaa koko /config:ssa sijaitsevan tietokannan, ja kansikuvat /metadata/items & /metadata/authors:ssa.

Varmuuskopiot eivät muuta kirjastokansioissasi olevia tiedostoja. Jos olet ottanut käyttöön palvelinasetuksissa kansikuvien ja metatietojen tallentamisen kirjaston kansioihin, niitä ei varmuuskopioida tai korvata.

Kaikki palvelintasi käyttävät asiakkaat virkistetään automaattisesti.", - "MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja säilyttää kansiotarkkailu päällä. Kansiotarkkailu havaitsee automaattisesti tiedostomuutokset kirjaston kansioissa. Kansiotarkkailu ei toimi kaikille tiedostojärjestelmille (kuten NFS), jolloin voidaan käyttää ajastettuja kirjastoskannauksia.", + "MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja \"Tarkkaile kirjaston muutoksia automaattisesti\" -asetus pidetään käytössä - se havaitsee muutokset kirjastokansioissasi automaattisesti. Ota tämä ominaisuus käyttöön, jos \"Tarkkaile kirjaston muutoksia automaattisesti\" ei toimi tiedostojärjestelmässäsi (kuten NFS).\"", "MessageScheduleRunEveryWeekdayAtTime": "Suorita joka {0} klo {1}", "MessageSearchResultsFor": "Hakutulokset haulle", "MessageSelected": "{0} valittuna", From ed5766b4ab13f8b11cfce088c3fb7ada0c64dd0c Mon Sep 17 00:00:00 2001 From: Alessandro Burzio Date: Mon, 1 Dec 2025 23:05:14 +0100 Subject: [PATCH 064/117] Translated using Weblate (Italian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/ --- client/strings/it.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/strings/it.json b/client/strings/it.json index 2354bc0ae..46ecb0f53 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -383,7 +383,7 @@ "LabelFolders": "Cartelle", "LabelFontBold": "Grassetto", "LabelFontBoldness": "Grassetto", - "LabelFontFamily": "Famiglia di caratteri", + "LabelFontFamily": "Famiglia caratteri", "LabelFontItalic": "Corsivo", "LabelFontScale": "Dimensione font", "LabelFontStrikethrough": "Barrato", @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Design con scaffali in legno", "LabelSettingsChromecastSupport": "Supporto a Chromecast", "LabelSettingsDateFormat": "Formato Data", - "LabelSettingsEnableWatcher": "Scansiona le librerie Automaticamente per trovare modifiche", - "LabelSettingsEnableWatcherForLibrary": "Scansiona la libreria Automaticamente per trovare modifiche", + "LabelSettingsEnableWatcher": "Controlla automaticamente le modifiche alle librerie", + "LabelSettingsEnableWatcherForLibrary": "Controlla automaticamente le modifiche alle librerie", "LabelSettingsEnableWatcherHelp": "Abilita l'aggiunta/aggiornamento automatico degli elementi quando vengono rilevate modifiche ai file. *Richiede il riavvio del Server", "LabelSettingsEpubsAllowScriptedContent": "Consenti contenuti con script negli epub", "LabelSettingsEpubsAllowScriptedContentHelp": "Consenti ai file epub di eseguire script. Si consiglia di mantenere questa impostazione disabilitata a meno che non si ritenga attendibile l'origine dei file epub.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Sei sicuro di voler reimpostare i capitoli e annullare le modifiche ?", "MessageRestoreBackupConfirm": "Sei sicuro di voler ripristinare il backup creato su", "MessageRestoreBackupWarning": "Il ripristino di un backup sovrascriverà l'intero database situato in /config e sovrascrive le immagini in /metadata/items & /metadata/authors.

I backup non modificano alcun file nelle cartelle della libreria. Se hai abilitato le impostazioni del server per archiviare copertine e metadati nelle cartelle della libreria, questi non vengono sottoposti a backup o sovrascritti.

Tutti i client che utilizzano il tuo server verranno aggiornati automaticamente.", - "MessageScheduleLibraryScanNote": "Per la maggior parte degli utenti, si consiglia di lasciare questa funzionalità disabilitata e di mantenere abilitata l'impostazione di folder watcher. Il folder watcher rileverà automaticamente le modifiche nelle cartelle della libreria. Il folder watcher non funziona per ogni file system (come NFS), quindi è possibile utilizzare le scansioni pianificate della libreria.", + "MessageScheduleLibraryScanNote": "Per la maggior parte degli utenti, si consiglia di lasciare questa funzione disabilitata e mantenere abilitata l'impostazione “Controlla automaticamente le modifiche nella libreria”: in questo modo verranno rilevate automaticamente le modifiche nelle cartelle della libreria. Abilita questa funzione se “Controlla automaticamente le modifiche nella libreria” non funziona con il tuo file system (come NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Esegui ogni {0} alle {1}", "MessageSearchResultsFor": "cerca risultati per", "MessageSelected": "{0} selezionati", From 2e2d857ce0508852e3d3cf4858c23c3499a8e36b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Dobra=C4=8Da?= Date: Sat, 6 Dec 2025 08:16:28 +0100 Subject: [PATCH 065/117] Translated using Weblate (Croatian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/ --- client/strings/hr.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/strings/hr.json b/client/strings/hr.json index f22feb656..eccd12563 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -197,7 +197,7 @@ "HeaderSetBackupSchedule": "Zakazivanje sigurnosne pohrane", "HeaderSettings": "Postavke", "HeaderSettingsDisplay": "Prikaz", - "HeaderSettingsExperimental": "Eksperimentalne funkcije", + "HeaderSettingsExperimental": "Eksperimentalne značajke", "HeaderSettingsGeneral": "Općenito", "HeaderSettingsScanner": "Skener", "HeaderSettingsSecurity": "Sigurnost", @@ -383,7 +383,7 @@ "LabelFolders": "Mape", "LabelFontBold": "Podebljano", "LabelFontBoldness": "Debljina slova", - "LabelFontFamily": "Skupina fontova", + "LabelFontFamily": "Skup pisma", "LabelFontItalic": "Kurziv", "LabelFontScale": "Veličina slova", "LabelFontStrikethrough": "Precrtano", @@ -444,7 +444,7 @@ "LabelListenAgain": "Ponovno poslušaj", "LabelLogLevelDebug": "Debug", "LabelLogLevelInfo": "Info", - "LabelLogLevelWarn": "Warn", + "LabelLogLevelWarn": "Upozorenje", "LabelLookForNewEpisodesAfterDate": "Traži nove nastavke nakon ovog datuma", "LabelLowestPriority": "Najniži prioritet", "LabelMatchConfidence": "Pouzdanost", @@ -452,7 +452,7 @@ "LabelMatchExistingUsersByDescription": "Rabi se za povezivanje postojećih korisnika. Nakon što se spoje, korisnike se prepoznaje temeljem jedinstvene oznake vašeg pružatelja SSO usluga", "LabelMaxEpisodesToDownload": "Najveći broj nastavaka za preuzimanje. 0 za neograničeno.", "LabelMaxEpisodesToDownloadPerCheck": "Najveći broj novih nastavaka za preuzimanje po provjeri", - "LabelMaxEpisodesToKeep": "Najveći broj nastavaka za čuvanje", + "LabelMaxEpisodesToKeep": "Najveći # nastavaka za čuvanje", "LabelMaxEpisodesToKeepHelp": "Ako je vrijednost 0, nema ograničenja broja. Nakon automatskog preuzimanja novog nastavka ova funkcija briše najstariji nastavak ako ih ima više od zadanog broja. Ovo briše samo jedan nastavak po novom preuzetom nastavku.", "LabelMediaPlayer": "Reproduktor medijskih sadržaja", "LabelMediaType": "Vrsta medija", From afb4108c308f6be11fde15fd2a2203434b3c9a73 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 6 Dec 2025 22:31:14 +0100 Subject: [PATCH 066/117] Added translation using Weblate (Greek) --- client/strings/el.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 client/strings/el.json diff --git a/client/strings/el.json b/client/strings/el.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/client/strings/el.json @@ -0,0 +1 @@ +{} From ee6016999560023c1c802a8e2f5194677d25ad41 Mon Sep 17 00:00:00 2001 From: zard Kim Date: Mon, 8 Dec 2025 05:44:44 +0100 Subject: [PATCH 067/117] Translated using Weblate (Korean) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ko/ --- client/strings/ko.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/client/strings/ko.json b/client/strings/ko.json index a4dea5de4..a2a4dc92a 100644 --- a/client/strings/ko.json +++ b/client/strings/ko.json @@ -57,7 +57,7 @@ "ButtonNextItemInQueue": "대기열의 다음 항목", "ButtonOk": "확인", "ButtonOpenFeed": "피드 열기", - "ButtonOpenManager": "오픈 매니저", + "ButtonOpenManager": "매니저 열기", "ButtonPause": "일시정지", "ButtonPlay": "재생", "ButtonPlayAll": "모두 재생", @@ -301,7 +301,7 @@ "LabelCoverProvider": "커버 제공자", "LabelCreatedAt": "생성일", "LabelCronExpression": "Cron Expression", - "LabelCurrent": "현재재", + "LabelCurrent": "현재", "LabelCurrently": "현재:", "LabelCustomCronExpression": "사용자 정의 Cron 표현식:", "LabelDatetime": "일시", @@ -320,7 +320,7 @@ "LabelDownload": "다운로드", "LabelDownloadNEpisodes": "{0}개 에피소드 다운로드", "LabelDownloadable": "다운로드 가능", - "LabelDuration": "Duration", + "LabelDuration": "기간", "LabelDurationComparisonExactMatch": "(정확히 일치)", "LabelDurationComparisonLonger": "({0} 더 길음)", "LabelDurationComparisonShorter": "({0} 더 짧음)", @@ -436,7 +436,7 @@ "LabelLibraryFilterSublistEmpty": "{0} 없음", "LabelLibraryItem": "라이브러리 항목", "LabelLibraryName": "라이브러리 이름", - "LabelLibrarySortByProgress": "Progress: 마지막 업데이트", + "LabelLibrarySortByProgress": "진행상황: 마지막 업데이트", "LabelLibrarySortByProgressFinished": "진행 상황: 완료", "LabelLibrarySortByProgressStarted": "진행 상황: 시작됨", "LabelLimit": "한계", @@ -606,7 +606,7 @@ "LabelSettingsLibraryMarkAsFinishedWhen": "미디어 항목을 완료된 것으로 표시", "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Continue Series의 이전 책 건너뛰기", "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "시리즈 계속하기 홈페이지 선반에는 시리즈 중 아직 시작하지 않은 첫 번째 책이 표시됩니다. 시리즈 중 최소 한 권은 완료되었고 진행 중인 책은 없습니다. 이 설정을 활성화하면 시작하지 않은 첫 번째 책 대신 가장 늦게 완료된 책부터 시리즈가 이어집니다.", - "LabelSettingsParseSubtitles": "Parse subtitles", + "LabelSettingsParseSubtitles": "자막 파싱", "LabelSettingsParseSubtitlesHelp": "오디오북 폴더 이름에서 자막을 추출합니다.
자막은 \" - \"로 구분해야 합니다.
즉, \"책 제목 - 여기에 자막이 있습니다\"에는 \"여기에 자막이 있습니다\"라는 자막이 있습니다.", "LabelSettingsPreferMatchedMetadata": "일치하는 메타데이터를 선호", "LabelSettingsPreferMatchedMetadataHelp": "빠른 매칭을 사용하면 매칭된 데이터가 항목 세부 정보보다 우선합니다. 기본적으로 빠른 매칭은 누락된 세부 정보만 채웁니다.", @@ -616,7 +616,7 @@ "LabelSettingsSortingIgnorePrefixesHelp": "즉, 접두사 \"the\"의 경우 책 제목 \"The Book Title\"은 \"Book Title, The\"로 정렬됩니다.", "LabelSettingsSquareBookCovers": "정사각형 책 표지를 사용", "LabelSettingsSquareBookCoversHelp": "표준 1.6:1 책 표지보다 정사각형 표지를 사용하는 것을 선호합니다.", - "LabelSettingsStoreCoversWithItem": "품목과 함께 매장 커버", + "LabelSettingsStoreCoversWithItem": "항목에 있는 커버로 저장", "LabelSettingsStoreCoversWithItemHelp": "기본적으로 표지는 /metadata/items에 저장됩니다. 이 설정을 활성화하면 표지가 라이브러리 항목 폴더에 저장됩니다. \"cover\"라는 이름의 파일 하나만 저장됩니다.", "LabelSettingsStoreMetadataWithItem": "항목과 함께 메타데이터 저장", "LabelSettingsStoreMetadataWithItemHelp": "기본적으로 메타데이터 파일은 /metadata/items에 저장되며 이 설정을 활성화하면 라이브러리 항목 폴더에 메타데이터 파일이 저장됩니다.", @@ -965,11 +965,11 @@ "PlaceholderSearchEpisode": "에피소드 검색..", "StatsAuthorsAdded": "작가가 추가되었습니다", "StatsBooksAdded": "추가된 책", - "StatsBooksAdditional": "추가된 내용은 다음과 같습니다…", + "StatsBooksAdditional": "추가된 내용은 포함…", "StatsBooksFinished": "책 완성", "StatsBooksFinishedThisYear": "올해 읽은 책이 몇 권 있어요…", "StatsBooksListenedTo": "듣는 책", - "StatsCollectionGrewTo": "너의 책 컬렉션이 다음과 같이 늘어났습니다…", + "StatsCollectionGrewTo": "나의 책 컬렉션이 늘어난…", "StatsSessions": "세션", "StatsSpentListening": "보낸 청취시간", "StatsTopAuthor": "인기 작가", From 646c861bcc0e11adf9c0abccc69f76c490885463 Mon Sep 17 00:00:00 2001 From: kfctatertot Date: Mon, 8 Dec 2025 00:33:20 +0100 Subject: [PATCH 068/117] Translated using Weblate (Arabic) Currently translated at 95.9% (1116 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/ --- client/strings/ar.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/strings/ar.json b/client/strings/ar.json index e3e13a859..a176b9d8b 100644 --- a/client/strings/ar.json +++ b/client/strings/ar.json @@ -355,7 +355,7 @@ "LabelExample": "مثال", "LabelExpandSeries": "توسيع السلاسل", "LabelExpandSubSeries": "توسيع السلاسل الفرعية", - "LabelExplicit": "صريح", + "LabelExplicit": "محتوى صريح", "LabelExplicitChecked": "صريح (محدد)", "LabelExplicitUnchecked": "غير صريح (غير محدد)", "LabelExportOPML": "تصدير OPML", @@ -374,7 +374,7 @@ "LabelFolders": "مجلدات", "LabelFontBold": "عريض", "LabelFontBoldness": "تعريض الخط", - "LabelFontFamily": "عائلة الخط", + "LabelFontFamily": "عائلة الخطوط", "LabelFontItalic": "مائل", "LabelFontScale": "نطاق الخط", "LabelFontStrikethrough": "يتوسطه خط", @@ -570,7 +570,7 @@ "LabelSettingsBookshelfViewHelp": "تصميم يحاكي الواقع مع رفوف خشبية", "LabelSettingsChromecastSupport": "دعم Chromecast", "LabelSettingsDateFormat": "تنسيق التاريخ", - "LabelSettingsEnableWatcher": "فحص المكتبات تلقائيًا بحثًا عن تغييرات", + "LabelSettingsEnableWatcher": "مراقبة المكتبات تلقائياً بحثاً عن تغييرات", "LabelSettingsEnableWatcherForLibrary": "فحص المكتبة تلقائيًا بحثًا عن تغييرات", "LabelSettingsEnableWatcherHelp": "يمكّن الإضافة/التحديث التلقائي للعناصر عند اكتشاف تغييرات في الملفات. *يتطلب إعادة تشغيل الخادم", "LabelSettingsEpubsAllowScriptedContent": "السماح بالمحتوى النصي في ملفات epub", @@ -861,7 +861,7 @@ "MessageResetChaptersConfirm": "هل أنت متأكد أنك تريد إعادة تعيين الفصول والتراجع عن التغييرات التي أجريتها؟", "MessageRestoreBackupConfirm": "هل أنت متأكد أنك تريد استعادة النسخ الاحتياطي الذي تم إنشاؤه في", "MessageRestoreBackupWarning": "ستؤدي استعادة النسخ الاحتياطي إلى الكتابة فوق قاعدة البيانات بأكملها الموجودة في /config وصور الأغلفة في /metadata/items و /metadata/authors.

لا تعدل النسخ الاحتياطية أي ملفات في مجلدات مكتبتك. إذا قمت بتمكين إعدادات الخادم لتخزين صور الأغلفة والبيانات الوصفية في مجلدات مكتبتك، فلن يتم نسخها احتياطيًا أو الكتابة فوقها.

سيتم تحديث جميع العملاء الذين يستخدمون الخادم الخاص بك تلقائيًا.", - "MessageScheduleLibraryScanNote": "بالنسبة لمعظم المستخدمين، يوصى بترك هذه الميزة معطلة وإبقاء إعداد مراقب المجلدات ممكّنًا. سيكتشف مراقب المجلدات تلقائيًا التغييرات في مجلدات مكتبتك. لا يعمل مراقب المجلدات مع كل نظام ملفات (مثل NFS)، لذا يمكن استخدام عمليات فحص المكتبة المجدولة بدلاً من ذلك.", + "MessageScheduleLibraryScanNote": "لمعظم المستخدمين، موصى بترك هذه الميزة معطلة وإبقاء ممكّنة الأعداد، ”قم بمراقبة المكتبة تلقائاً للتغييرات“. سوف يقم بالكشف التلقائي عن تغييرات في مجلدات مكتبتك. لو لم يعمل الإعداد، \"قم بمراقبة المكتبة تلقائاً للتغييرات،“مع نظمة ملفاتك المستخدمة (مثل NFS على سبيل المثال)، فأمكِن هذه الميزة.", "MessageScheduleRunEveryWeekdayAtTime": "تشغيل كل {0} في الساعة {1}", "MessageSearchResultsFor": "نتائج البحث عن", "MessageSelected": "تم تحديد {0}", From 8bdcabf9731550c242c4d1f5fd1444b099b81a47 Mon Sep 17 00:00:00 2001 From: kfctatertot Date: Mon, 8 Dec 2025 01:27:29 +0100 Subject: [PATCH 069/117] Translated using Weblate (Spanish) Currently translated at 96.8% (1126 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/es/ --- client/strings/es.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/strings/es.json b/client/strings/es.json index 53bfad693..3f0ff806b 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -242,6 +242,10 @@ "LabelAllUsersExcludingGuests": "Todos los usuarios excepto invitados", "LabelAllUsersIncludingGuests": "Todos los usuarios e invitados", "LabelAlreadyInYourLibrary": "Ya existe en la Biblioteca", + "LabelApiKeyCreated": "La clave de API “{0}” se ha creado con éxito.", + "LabelApiKeyCreatedDescription": "Asegúrate de copiar la clave de API ahora, no la volverás a ver otra vez.", + "LabelApiKeyUser": "Actuar en nombre del usuario", + "LabelApiKeyUserDescription": "Esta clave de API tendrá los mismos permisos que el usuario al que representa. En los registros se verá como si la solicitud la hubiera hecho el usuario directamente.", "LabelApiToken": "Token de la API", "LabelAppend": "Adjuntar", "LabelAudioBitrate": "Tasa de bits del audio (por ejemplo, 128k)", @@ -291,6 +295,7 @@ "LabelContinueListening": "Seguir escuchando", "LabelContinueReading": "Continuar leyendo", "LabelContinueSeries": "Continuar series", + "LabelCorsAllowed": "Orígenes CORS Permitidos", "LabelCover": "Cubierta", "LabelCoverImageURL": "URL de imagen de cubierta", "LabelCoverProvider": "Proveedor de cubiertas", @@ -524,7 +529,7 @@ "LabelPublishers": "Editores", "LabelRSSFeedCustomOwnerEmail": "Correo electrónico de dueño personalizado", "LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado", - "LabelRSSFeedOpen": "Suministro RSS abierto", + "LabelRSSFeedOpen": "Fuente RSS Abierta", "LabelRSSFeedPreventIndexing": "Evitar indización", "LabelRSSFeedSlug": "«Slug» de suministro RSS", "LabelRSSFeedURL": "URL de suministro RSS", From f7d7c9a4f571fd69afab05db3a55f60ccb85ce26 Mon Sep 17 00:00:00 2001 From: A L Date: Mon, 8 Dec 2025 13:03:30 +0100 Subject: [PATCH 070/117] Translated using Weblate (Bulgarian) Currently translated at 88.2% (1026 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bg/ --- client/strings/bg.json | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/client/strings/bg.json b/client/strings/bg.json index ca14035f8..dacd62087 100644 --- a/client/strings/bg.json +++ b/client/strings/bg.json @@ -378,6 +378,7 @@ "LabelFilterByUser": "Филтриране по Потребител", "LabelFindEpisodes": "Намери Епизоди", "LabelFinished": "Дата на приключване", + "LabelFinishedDate": "Приключено на {0}", "LabelFolder": "Папка", "LabelFolders": "Папки", "LabelFontBold": "Получерно", @@ -435,7 +436,9 @@ "LabelLibraryFilterSublistEmpty": "Не {0}", "LabelLibraryItem": "Елемент на Библиотека", "LabelLibraryName": "Име на Библиотека", - "LabelLibrarySortByProgress": "Прогресът е обновен", + "LabelLibrarySortByProgress": "Прогрес: Последно Обновен", + "LabelLibrarySortByProgressFinished": "Прогрес: Приключено", + "LabelLibrarySortByProgressStarted": "Прогрес: Започнато", "LabelLimit": "Лимит", "LabelLineSpacing": "Междуредие", "LabelListenAgain": "Слушай отново", @@ -585,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Скеуморфен дизайн с дървени рафтове", "LabelSettingsChromecastSupport": "Chromecast поддръжка", "LabelSettingsDateFormat": "Формат на Дата", - "LabelSettingsEnableWatcher": "Автоматично сканиране на библиотеките за промени", - "LabelSettingsEnableWatcherForLibrary": "Автоматично сканиране на библиотеката за промени", + "LabelSettingsEnableWatcher": "Автоматично преглеждане на библиотеките за промени", + "LabelSettingsEnableWatcherForLibrary": "Автоматично преглеждане на библиотеката за промени", "LabelSettingsEnableWatcherHelp": "Включва автоматичното добавяне/обновяване на елементи, когато се открият промени във файловете. *Изисква рестарт на сървъра", "LabelSettingsEpubsAllowScriptedContent": "Позволи скриптово съдържание в epub-и", "LabelSettingsEpubsAllowScriptedContentHelp": "Позволи epub файловете да изпълняват скриптове. Препоръчително е да бъде изключено освен ако не се доверявате на източника на epub файловете.", @@ -635,6 +638,7 @@ "LabelStartTime": "Начално Време", "LabelStarted": "Стартирано", "LabelStartedAt": "Стартирано на", + "LabelStartedDate": "Започнато {0}", "LabelStatsAudioTracks": "Аудио Канали", "LabelStatsAuthors": "Автори", "LabelStatsBestDay": "Най-добър ден", @@ -780,6 +784,7 @@ "MessageConfirmPurgeCache": "Изчистването на кеша ще изтрие цялата директория в /metadata/cache.

Сигурни ли сте, че искате да премахнете директорията на кеша?", "MessageConfirmPurgeItemsCache": "Изчистването на кеша на елементите ще изтрие цялата директория в /metadata/cache/items.
Сигурни ли сте?", "MessageConfirmQuickEmbed": "Внимание! Бързото вграждане няма да архивира вашите аудио файлове. Уверете се, че имате резервно копие на вашите аудио файлове.

Искате ли да продължите?", + "MessageConfirmQuickMatchEpisodes": "Бързото сравняване на епизоди ще презапише детайлите, ако се намери съвпадение. Само не съвпаднали епизоди ще бъдат обновени. Сигурни ли сте?", "MessageConfirmReScanLibraryItems": "Сигурни ли сте, че искате да сканирате отново {0} елемента?", "MessageConfirmRemoveAllChapters": "Сигурни ли сте, че искате да премахнете всички глави?", "MessageConfirmRemoveAuthor": "Сигурни ли сте, че искате да премахнете автор \"{0}\"?", @@ -788,6 +793,7 @@ "MessageConfirmRemoveEpisodeNote": "Забележка: Това няма да доведе до изтриване на аудио файла, освен ако не активирате опцията \"Твърдо изтриване на файла\"", "MessageConfirmRemoveEpisodes": "Сигурни ли сте, че искате да премахнете {0} епизода?", "MessageConfirmRemoveListeningSessions": "Сигурни ли сте, че искате да премахнете {0} слушателски сесии?", + "MessageConfirmRemoveMetadataFiles": "Сигурни ли сте, че искате да премахнете всичките метаданни. {0} файлове във папките на Вашата библиотека?", "MessageConfirmRemoveNarrator": "Сигурни ли сте, че искате да премахнете разказвач \"{0}\"?", "MessageConfirmRemovePlaylist": "Сигурни ли сте, че искате да премахнете плейлиста \"{0}\"?", "MessageConfirmRenameGenre": "Сигурни ли сте, че искате да преименувате жанра \"{0}\" на \"{1}\" за всички елементи?", @@ -862,6 +868,7 @@ "MessageNoUserPlaylists": "Нямате създадени плейлисти", "MessageNoUserPlaylistsHelp": "Плейлистите за частни. Само създалият ги потребител ще може да ги вижда.", "MessageNotYetImplemented": "Още не е изпълнено", + "MessageOpmlPreviewNote": "Забележка: Това е преглед на анализирания OPML файл. Действителното заглавие на подкаста ще бъде взето от RSS фийда.", "MessageOr": "или", "MessagePauseChapter": "Пауза на глава", "MessagePlayChapter": "Пусни налчалото на глава", @@ -871,6 +878,7 @@ "MessagePodcastSearchField": "Въведи какво да търся или RSS емисия адрес", "MessageQuickEmbedInProgress": "Бързото вграждане е в процес на изпълнение", "MessageQuickEmbedQueue": "Поставено в опашката за бързо вграждане ({0} в опашката)", + "MessageQuickMatchAllEpisodes": "Бързо Сравняване на Всички Епизоди", "MessageQuickMatchDescription": "Попълни празните детайли и корици с първия резултат от '{0}'. Не презаписва детайлите, освен ако не е активирана настройката 'Предпочети съвпадащи метаданни' на сървъра.", "MessageRemoveChapter": "Премахни глава", "MessageRemoveEpisodes": "Премахни {0} епизод(и)", @@ -880,16 +888,23 @@ "MessageResetChaptersConfirm": "Сигурни ли сте, че искате да нулирате главите и да отмените промените, които сте направили?", "MessageRestoreBackupConfirm": "Сигурни ли сте, че искате да възстановите архива създаден на", "MessageRestoreBackupWarning": "Възстановяването на архив ще презапише цялата база данни, намираща се в /config и кориците в /metadata/items & /metadata/authors.

Архивите не променят файловете в папките на вашата библиотека. Ако сте активирали настройките на сървъра за съхранение на корици и метаданни в папките на вашата библиотека, те няма да бъдат архивирани или презаписани.

Всички клиенти, използващи вашия сървър, ще бъдат автоматично обновени.", + "MessageScheduleLibraryScanNote": "За повече потребители се препоръчва да оставят този фийчър изключен и да оставят настройката \"Автоматично преглеждане за промени в библиотеката\" включена - тя автоматично ще засече промени в папките на вашата библиотека. Включете тази настройка ако \"Автоматично преглеждане за промени в библиотеката\" не рабови на вашата файлова система (например NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Изпълни всеки {0} в {1}", "MessageSearchResultsFor": "Резултати от търсенето за", "MessageSelected": "{0} избрани", + "MessageSeriesSequenceCannotContainSpaces": "Подредбата в серия не може да съдържа шпации.", "MessageServerCouldNotBeReached": "Сървърът не може да бъде достигнат", "MessageSetChaptersFromTracksDescription": "Задайте глави, като използвате всеки аудио файл като глава и заглавие на главата като име на аудио файла", + "MessageShareExpirationWillBe": "Изтичането ще бъде на {0}", "MessageShareExpiresIn": "Изтича след {0}", + "MessageShareURLWillBe": "URL за споделяне ще бъде {0}", "MessageStartPlaybackAtTime": "Започни възпроизвеждане на \"{0}\" в {1}?", + "MessageTaskAudioFileNotWritable": "На Аудио файл \"{0}\" не може да се записва", + "MessageTaskCanceledByUser": "Задачата е отказана от потребител", "MessageTaskDownloadingEpisodeDescription": "Изтегляне на епизод \"{0}\"", "MessageTaskEmbeddingMetadata": "Вграждане на метаданни", "MessageTaskEmbeddingMetadataDescription": "Вграждане на метаданни в аудиокнига \"{0}\"", + "MessageTaskEncodingM4b": "Кодиране M4B", "MessageTaskEncodingM4bDescription": "Кодиране на аудиокнига \"{0}\" в единичен m4b файл", "MessageTaskFailed": "Неуспешно", "MessageTaskFailedToBackupAudioFile": "Неуспешно създаване на разервно копие на аудио файл \"{0}\"", @@ -902,7 +917,9 @@ "MessageTaskNoFilesToScan": "Няма файлове за сканиране", "MessageTaskOpmlImport": "OPML импортиране", "MessageTaskOpmlImportDescription": "Създаване на подкасти от {0} RSS хранилки", + "MessageTaskOpmlImportFeed": "OPML импортиран фийд", "MessageTaskOpmlImportFeedDescription": "Импортиране на RSS хранилка \"{0}\"", + "MessageTaskOpmlImportFeedFailed": "Неуспешно взимане на подкаст фийд", "MessageTaskOpmlImportFeedPodcastDescription": "Създаване на подкаст \"{0}\"", "MessageTaskOpmlImportFeedPodcastExists": "На този път вече съществува подкаст", "MessageTaskOpmlImportFeedPodcastFailed": "Неуспешно създаване на подкаст", @@ -938,6 +955,7 @@ "NotificationOnBackupFailedDescription": "Изпълнява се при неуспешено създаване на резервно копие", "NotificationOnEpisodeDownloadedDescription": "Изпълнява се при автоматично изтегляне на подкаст епизод", "NotificationOnRSSFeedDisabledDescription": "Изпълнява се, когато автоматичното изтегляне на епизодите е деактивирано, поради твърде много неуспешни опити", + "NotificationOnRSSFeedFailedDescription": "Пуска се когато заявката за RSS фийд е неуспешна за автоматично сваляне на епизод", "PlaceholderNewCollection": "Ново име на колекцията", "PlaceholderNewFolderPath": "Нов път на папката", "PlaceholderNewPlaylist": "Ново име на плейлиста", From 092c504eb1db754eed758f48ad3a6c85d484fba1 Mon Sep 17 00:00:00 2001 From: Alberto Coronado Date: Thu, 11 Dec 2025 05:30:19 +0100 Subject: [PATCH 071/117] Translated using Weblate (Spanish) Currently translated at 97.5% (1134 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/es/ --- client/strings/es.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/strings/es.json b/client/strings/es.json index 3f0ff806b..4a611b3de 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -359,6 +359,10 @@ "LabelExample": "Ejemplo", "LabelExpandSeries": "Ampliar serie", "LabelExpandSubSeries": "Expandir la subserie", + "LabelExpired": "Expirado", + "LabelExpiresAt": "Expira El", + "LabelExpiresInSeconds": "Expira en (segundos)", + "LabelExpiresNever": "Nunca", "LabelExplicit": "Explícito", "LabelExplicitChecked": "Explícito (marcado)", "LabelExplicitUnchecked": "No Explícito (sin marcar)", @@ -773,6 +777,7 @@ "MessageConfirmRemoveAuthor": "¿Confirma que quiere quitar el autor «{0}»?", "MessageConfirmRemoveCollection": "¿Confirma que quiere quitar la colección «{0}»?", "MessageConfirmRemoveEpisode": "¿Confirma que quiere quitar el episodio «{0}»?", + "MessageConfirmRemoveEpisodeNote": "Nota: Esto no borra el archivo de audio a menos que se active la opción \"Borrado definitivo del archivo\"", "MessageConfirmRemoveEpisodes": "¿Confirma que quiere quitar {0} episodios?", "MessageConfirmRemoveListeningSessions": "¿Confirma que quiere quitar {0} sesiones de escucha?", "MessageConfirmRemoveMetadataFiles": "¿Confirma que quiere quitar todos los archivos metadata.{0} en las carpetas de elementos de su biblioteca?", @@ -934,6 +939,8 @@ "NotificationOnBackupCompletedDescription": "Se activa cuando se completa una copia de seguridad", "NotificationOnBackupFailedDescription": "Se activa cuando falla una copia de seguridad", "NotificationOnEpisodeDownloadedDescription": "Se activa cuando se descarga automáticamente un episodio de un podcast", + "NotificationOnRSSFeedDisabledDescription": "Se activa cuando las descargas automáticas de episodios se desactivan debido a varios intentos fallidos", + "NotificationOnRSSFeedFailedDescription": "Se activa cuando la solicitud a la fuente RSS falla durante una descarga automática de episodio", "NotificationOnTestDescription": "Evento para probar el sistema de notificaciones", "PlaceholderBulkChapterInput": "Ingrese título de capítulo o use numeración (ej. 'Episodio 1', 'Capítulo 10', '1.')", "PlaceholderNewCollection": "Nuevo nombre de la colección", @@ -1072,6 +1079,7 @@ "ToastPlaylistUpdateSuccess": "Lista de reproducción actualizada", "ToastPodcastCreateFailed": "No se pudo crear el pódcast", "ToastPodcastCreateSuccess": "Se creó el pódcast correctamente", + "ToastPodcastEpisodeUpdated": "Episodio actualizado", "ToastPodcastGetFeedFailed": "No se puede obtener el podcast", "ToastPodcastNoEpisodesInFeed": "No se han encontrado episodios en el feed del RSS", "ToastPodcastNoRssFeed": "El pódcast no tiene suministro RSS", From 70e6efc3d0b6babd2f6086347a0ea6b1724b4c4b Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 10 Dec 2025 12:21:51 +0100 Subject: [PATCH 072/117] Translated using Weblate (German) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/de.json b/client/strings/de.json index 8398a7211..970c94233 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -13,7 +13,7 @@ "ButtonBack": "Zurück", "ButtonBatchEditPopulateFromExisting": "Auffüllen aus vorhandenem", "ButtonBatchEditPopulateMapDetails": "Kartendetails auffüllen", - "ButtonBrowseForFolder": "Ordnersuche", + "ButtonBrowseForFolder": "Ordner auswählen", "ButtonCancel": "Abbrechen", "ButtonCancelEncode": "Konvertierung abbrechen", "ButtonChangeRootPassword": "Hauptpasswort ändern", From c1e21d31ee0c99414b4173b3d6a8fd817668247a Mon Sep 17 00:00:00 2001 From: lambolighting Date: Thu, 11 Dec 2025 14:19:06 +0100 Subject: [PATCH 073/117] Translated using Weblate (Greek) Currently translated at 1.1% (13 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/el/ --- client/strings/el.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/client/strings/el.json b/client/strings/el.json index 0967ef424..2527e1988 100644 --- a/client/strings/el.json +++ b/client/strings/el.json @@ -1 +1,15 @@ -{} +{ + "ButtonAdd": "Προσθήκη", + "ButtonAuthors": "Συγγραφείς", + "ButtonBack": "Πίσω", + "ButtonCancel": "Ακύρωση", + "ButtonClearFilter": "Διαγραφή Φίλτρου", + "ButtonCloseFeed": "Κλείσιμο Τροφοδοσίας", + "ButtonCollections": "Συλλογές", + "ButtonCreate": "Δημιουργία", + "ButtonDelete": "Διαγραφή", + "ButtonHome": "Αρχική", + "ButtonIssues": "Θέματα", + "ButtonLatest": "Τελευταία", + "ButtonLibrary": "Βιβλιοθήκη" +} From dc2398a07284c3e075764ceac58eecc4c85d391b Mon Sep 17 00:00:00 2001 From: Lucas Jaksys Date: Fri, 12 Dec 2025 17:53:33 +0100 Subject: [PATCH 074/117] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pt_BR/ --- client/strings/pt-br.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/pt-br.json b/client/strings/pt-br.json index 9c8754c44..c6c9781cf 100644 --- a/client/strings/pt-br.json +++ b/client/strings/pt-br.json @@ -383,7 +383,7 @@ "LabelFolders": "Pastas", "LabelFontBold": "Negrito", "LabelFontBoldness": "Intensidade do negrito", - "LabelFontFamily": "Família de fonte", + "LabelFontFamily": "Família de fontes", "LabelFontItalic": "Itálico", "LabelFontScale": "Escala de fonte", "LabelFontStrikethrough": "Tachado", From 0ecbb1c3f448748a5c63cd4bc917f284abfc6d25 Mon Sep 17 00:00:00 2001 From: MODI NAVON Date: Fri, 12 Dec 2025 10:09:19 +0100 Subject: [PATCH 075/117] Translated using Weblate (Hebrew) Currently translated at 73.0% (850 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/he/ --- client/strings/he.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/strings/he.json b/client/strings/he.json index 9525ca6cd..0efc1ec9c 100644 --- a/client/strings/he.json +++ b/client/strings/he.json @@ -126,6 +126,7 @@ "HeaderAudiobookTools": "כלים לניהול קבצי ספרים קוליים", "HeaderAuthentication": "אימות", "HeaderBackups": "גיבויים", + "HeaderBulkChapterModal": "הוסף מספר פרקים", "HeaderChangePassword": "שנה סיסמה", "HeaderChapters": "פרקים", "HeaderChooseAFolder": "בחר תיקייה", @@ -197,6 +198,7 @@ "HeaderSettingsExperimental": "תכונות ניסיוניות", "HeaderSettingsGeneral": "כללי", "HeaderSettingsScanner": "סורק", + "HeaderSettingsSecurity": "אבטחה", "HeaderSettingsWebClient": "מערך", "HeaderSleepTimer": "טיימר שינה", "HeaderStatsLargestItems": "הפריטים הגדולים ביותר", @@ -237,6 +239,7 @@ "LabelAllUsersExcludingGuests": "כל המשתמשים, ללא אורחים", "LabelAllUsersIncludingGuests": "כל המשתמשים כולל אורחים", "LabelAlreadyInYourLibrary": "כבר קיים בספרייה שלך", + "LabelApiKeyUser": "פעל בשם המשתמש", "LabelApiToken": "טוקן API", "LabelAppend": "הוסף לסוף", "LabelAudioBitrate": "קצב סיביות (לדוגמא 128k)", From 10a4777ddf4e51945a425a5f57a3c0cfc362512a Mon Sep 17 00:00:00 2001 From: lambolighting Date: Sat, 13 Dec 2025 11:01:47 +0100 Subject: [PATCH 076/117] Translated using Weblate (Greek) Currently translated at 9.0% (105 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/el/ --- client/strings/el.json | 94 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/client/strings/el.json b/client/strings/el.json index 2527e1988..9d12d3096 100644 --- a/client/strings/el.json +++ b/client/strings/el.json @@ -1,15 +1,107 @@ { "ButtonAdd": "Προσθήκη", + "ButtonAddApiKey": "Προσθήκη Κλειδιού API", + "ButtonAddChapters": "Προσθήκη Κεφαλαίων", + "ButtonAddDevice": "Προσθήκη Συσκευής", + "ButtonAddLibrary": "Προσθήκη Βιβλιοθήκης", + "ButtonAddPodcasts": "Προσθήκη Podcasts", + "ButtonAddUser": "Προσθήκη Χρήστη", + "ButtonAddYourFirstLibrary": "Πρόσθεσε την πρώτη σου βιβλιοθήκη", + "ButtonApply": "Εφαρμογή", + "ButtonApplyChapters": "Εφαρμογή Κεφαλαίων", "ButtonAuthors": "Συγγραφείς", "ButtonBack": "Πίσω", + "ButtonBatchEditPopulateFromExisting": "Συμπλήρωση από υπάρχοντα", + "ButtonBatchEditPopulateMapDetails": "Συμπλήρωση λεπτομερειών χάρτη", + "ButtonBrowseForFolder": "Περιήγηση για Φάκελο", "ButtonCancel": "Ακύρωση", + "ButtonCancelEncode": "Ακύρωση Κωδικοποίησης", + "ButtonChangeRootPassword": "Αλλαγή Κωδικού Πρόσβασης Root", + "ButtonCheckAndDownloadNewEpisodes": "Έλεγχος και Κατέβασμα Νέων Επεισοδίων", + "ButtonChooseAFolder": "Επιλογή φακέλου", + "ButtonChooseFiles": "Επιλογή αρχείων", "ButtonClearFilter": "Διαγραφή Φίλτρου", + "ButtonClose": "Κλείσιμο", "ButtonCloseFeed": "Κλείσιμο Τροφοδοσίας", + "ButtonCloseSession": "Κλείσιμο Ανοιχτής Συνεδρίας", "ButtonCollections": "Συλλογές", + "ButtonConfigureScanner": "Ρύθμιση Παραμέτρων Σαρωτή", "ButtonCreate": "Δημιουργία", + "ButtonCreateBackup": "Δημιουργία Αντιγράφου Ασφαλείας", "ButtonDelete": "Διαγραφή", + "ButtonDownloadQueue": "Ουρά", + "ButtonEdit": "Επεξεργασία", + "ButtonEditChapters": "Επεξεργασία Κεφαλαίων", + "ButtonEditPodcast": "Επεξεργασία Podcast", + "ButtonEnable": "Ενεργοποίηση", + "ButtonForceReScan": "Αναγκαστική Επανάληψη Σάρωσης", + "ButtonFullPath": "Πλήρης Διαδρομή", + "ButtonHide": "Απόκρυψη", "ButtonHome": "Αρχική", "ButtonIssues": "Θέματα", + "ButtonJumpBackward": "Μεταπήδηση Πίσω", + "ButtonJumpForward": "Μεταπήδηση Μπροστά", "ButtonLatest": "Τελευταία", - "ButtonLibrary": "Βιβλιοθήκη" + "ButtonLibrary": "Βιβλιοθήκη", + "ButtonLogout": "Αποσύνδεση", + "ButtonLookup": "Εύρεση", + "ButtonManageTracks": "Διαχείριση Κομματιών", + "ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων", + "ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων", + "ButtonMatchBooks": "Αντιστοίχιση Βιβλίων", + "ButtonNext": "Επόμενο", + "ButtonNextChapter": "Επόμενο Κεφάλαιο", + "ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά", + "ButtonOk": "Εντάξει", + "ButtonOpenFeed": "Άνοιγμα Τροφοδοσίας", + "ButtonOpenManager": "Άνοιγμα Διαχειριστή", + "ButtonPause": "Παύση", + "ButtonPlay": "Αναπαραγωγή", + "ButtonPlayAll": "Αναπαραγωγή Όλων", + "ButtonPlaying": "Αναπαράγεται", + "ButtonPlaylists": "Λίστες Αναπαραγωγής", + "ButtonPrevious": "Προηγούμενο", + "ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο", + "ButtonQueueAddItem": "Προσθήκη στην ουρά", + "ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά", + "ButtonQuickMatch": "Γρήγορη Αντιστοίχηση", + "ButtonReScan": "Επανασάρωση", + "ButtonRead": "Ανάγνωση", + "ButtonReadLess": "Ανάγνωση λιγότερων", + "ButtonReadMore": "Διάβασε περισσότερα", + "ButtonRefresh": "Ανανέωση", + "ButtonRemove": "Αφαίρεση", + "ButtonRemoveAll": "Αφαίρεση Όλων", + "ButtonRemoveAllLibraryItems": "Αφαίρεση Όλων των Αντικειμέων Βιβλιοθήκης", + "ButtonReset": "Επαναφορά", + "ButtonResetToDefault": "Επαναφορά στις προεπιλογές", + "ButtonRestore": "Επαναφορά", + "ButtonSave": "Αποθήκευση", + "ButtonSaveAndClose": "Αποθήκευση και Κλείσιμο", + "ButtonScan": "Σάρψση", + "ButtonSearch": "Αναζήτηση", + "ButtonSeries": "Σειρά", + "ButtonSubmit": "Υποβολή", + "ButtonYes": "Ναι", + "HeaderAccount": "Λογαριασμός", + "HeaderAdvanced": "Για Προχωρημένους", + "HeaderAudioTracks": "Κομμάτια Ήχου", + "HeaderChapters": "Κεφάλαια", + "HeaderCollection": "Συλλογή", + "HeaderCollectionItems": "Αντικείμενα Συλλογής", + "HeaderDetails": "Λεπτομέρειες", + "HeaderEbookFiles": "Αρχεία Ebook", + "HeaderEpisodes": "Επεισόδια", + "HeaderEreaderSettings": "Ρυθμίσεις Ereader", + "HeaderLatestEpisodes": "Τελευταία Επεισόδια", + "HeaderLibraries": "Βιβλιοθήκες", + "HeaderOpenRSSFeed": "Άνοιγμα Τροφοδοσίας RSS", + "HeaderPlaylist": "Λίστα Αναπαραγωγής", + "HeaderPlaylistItems": "Αντικείμενα Λίστας Αναπαραγωγής", + "HeaderRSSFeedGeneral": "Λεπτομέρειες RSS", + "HeaderRSSFeedIsOpen": "Η Τροφοδοσία RSS είναι Ανοιχτή", + "HeaderSettings": "Ρυθμίσεις", + "HeaderStatsMinutesListeningChart": "Λεπτά Ακρόασης (τελευταίες 7 ημέρες)", + "HeaderStatsRecentSessions": "Πρόσφατες Συνεδρίες", + "HeaderTableOfContents": "Πίνακας Περιεχομένων" } From 076ece6fe748fa4b0b44ea3c8e89cb940333781f Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 21 Dec 2025 14:45:04 -0600 Subject: [PATCH 077/117] Auto-formatting --- server/scanner/Scanner.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/server/scanner/Scanner.js b/server/scanner/Scanner.js index cf5c87b78..af4405987 100644 --- a/server/scanner/Scanner.js +++ b/server/scanner/Scanner.js @@ -260,16 +260,16 @@ class Scanner { // Update filter data Database.addAuthorToFilterData(libraryItem.libraryId, author.name, author.id) } - await Database.bookAuthorModel - .create({ - authorId: author.id, - bookId: libraryItem.media.id - }) - .then(() => { - Logger.info(`[Scanner] quickMatchBookBuildUpdatePayload: Added author "${author.name}" to "${libraryItem.media.title}"`) - libraryItem.media.authors.push(author) - hasAuthorUpdates = true - }) + await Database.bookAuthorModel + .create({ + authorId: author.id, + bookId: libraryItem.media.id + }) + .then(() => { + Logger.info(`[Scanner] quickMatchBookBuildUpdatePayload: Added author "${author.name}" to "${libraryItem.media.title}"`) + libraryItem.media.authors.push(author) + hasAuthorUpdates = true + }) } const authorsRemoved = libraryItem.media.authors.filter((a) => !matchData.author.find((ma) => ma.toLowerCase() === a.name.toLowerCase())) if (authorsRemoved.length) { From 7b37c98e88309f67b467fea5fcf71e4736984a0d Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 21 Dec 2025 15:38:34 -0600 Subject: [PATCH 078/117] Book tags genres dedupe (#4927) * Update Audible provider dedupe genres/tags and return tags as array * Update custom metadata provider to dedupe tags/genres and return tags as array --- server/providers/Audible.js | 13 ++++++++---- server/providers/CustomProviderAdapter.js | 25 +++++++++++++++++++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/server/providers/Audible.js b/server/providers/Audible.js index 2c12ffc1a..6ba01aa83 100644 --- a/server/providers/Audible.js +++ b/server/providers/Audible.js @@ -57,8 +57,13 @@ class Audible { }) } - const genresFiltered = genres ? genres.filter((g) => g.type == 'genre').map((g) => g.name) : [] - const tagsFiltered = genres ? genres.filter((g) => g.type == 'tag').map((g) => g.name) : [] + let genresCleaned = null + let tagsCleaned = null + + if (genres && Array.isArray(genres)) { + genresCleaned = [...new Set(genres.filter((g) => g.type == 'genre').map((g) => g.name))] + tagsCleaned = [...new Set(genres.filter((g) => g.type == 'tag').map((g) => g.name))] + } return { title, @@ -71,8 +76,8 @@ class Audible { cover: image, asin, isbn, - genres: genresFiltered.length ? genresFiltered : null, - tags: tagsFiltered.length ? tagsFiltered.join(', ') : null, + genres: genresCleaned.length ? genresCleaned : null, + tags: tagsCleaned.length ? tagsCleaned : null, series: series.length ? series : null, language: language ? language.charAt(0).toUpperCase() + language.slice(1) : null, duration: runtimeLengthMin && !isNaN(runtimeLengthMin) ? Number(runtimeLengthMin) : 0, diff --git a/server/providers/CustomProviderAdapter.js b/server/providers/CustomProviderAdapter.js index c079a1280..5c8cad75a 100644 --- a/server/providers/CustomProviderAdapter.js +++ b/server/providers/CustomProviderAdapter.js @@ -89,6 +89,27 @@ class CustomProviderAdapter { }) .filter((s) => s !== undefined) } + /** + * Validates and dedupes tags/genres array + * Can be comma separated string or array of strings + * @param {string|string[]} tagsGenres + * @returns {string[]} + */ + const validateTagsGenresArray = (tagsGenres) => { + if (!tagsGenres || (typeof tagsGenres !== 'string' && !Array.isArray(tagsGenres))) return undefined + + // If string, split by comma and trim each item + if (typeof tagsGenres === 'string') tagsGenres = tagsGenres.split(',') + // If array, ensure all items are strings + else if (!tagsGenres.every((t) => typeof t === 'string')) return undefined + + // Trim and filter out empty strings + tagsGenres = tagsGenres.map((t) => t.trim()).filter(Boolean) + if (!tagsGenres.length) return undefined + + // Dedup + return [...new Set(tagsGenres)] + } // re-map keys to throw out return matches.map((match) => { @@ -105,8 +126,8 @@ class CustomProviderAdapter { cover: toStringOrUndefined(cover), isbn: toStringOrUndefined(isbn), asin: toStringOrUndefined(asin), - genres: Array.isArray(genres) && genres.every((g) => typeof g === 'string') ? genres : undefined, - tags: toStringOrUndefined(tags), + genres: validateTagsGenresArray(genres), + tags: validateTagsGenresArray(tags), series: validateSeriesArray(series), language: toStringOrUndefined(language), duration: !isNaN(duration) && duration !== null ? Number(duration) : undefined From 3c2eec8279d82185cd858bd0a856b865160e2099 Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Wed, 17 Dec 2025 01:55:49 +0100 Subject: [PATCH 079/117] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 1a95256ab..64c41619e 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -275,7 +275,7 @@ "LabelBonus": "额外", "LabelBooks": "图书", "LabelButtonText": "按钮文本", - "LabelByAuthor": "由 {0}", + "LabelByAuthor": "作者: {0}", "LabelChangePassword": "修改密码", "LabelChannels": "声道", "LabelChapterCount": "{0} 章节", From ac08e897ee93cd2457d13716d10be94e5d0b0535 Mon Sep 17 00:00:00 2001 From: Ahetek Date: Mon, 15 Dec 2025 21:54:40 +0100 Subject: [PATCH 080/117] Translated using Weblate (Polish) Currently translated at 89.2% (1038 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index 316e84234..32c9766ca 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -233,8 +233,8 @@ "LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji", "LabelAddToPlaylist": "Dodaj do playlisty", "LabelAddToPlaylistBatch": "Dodaj {0} pozycji do playlisty", - "LabelAddedAt": "Dodano w", - "LabelAddedDate": "Dodano", + "LabelAddedAt": "Dodano", + "LabelAddedDate": "Dodano {0}", "LabelAdminUsersOnly": "Tylko użytkownicy administracyjni", "LabelAll": "Wszystkie", "LabelAllEpisodesDownloaded": "Wszystkie odcinki pobrane", From cc48d9f26dc3dc0c2b096b9ba892c501609bfbd9 Mon Sep 17 00:00:00 2001 From: lambolighting Date: Fri, 19 Dec 2025 11:21:03 +0100 Subject: [PATCH 081/117] Translated using Weblate (Greek) Currently translated at 26.9% (313 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/el/ --- client/strings/el.json | 210 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 209 insertions(+), 1 deletion(-) diff --git a/client/strings/el.json b/client/strings/el.json index 9d12d3096..881bd971b 100644 --- a/client/strings/el.json +++ b/client/strings/el.json @@ -49,6 +49,7 @@ "ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων", "ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων", "ButtonMatchBooks": "Αντιστοίχιση Βιβλίων", + "ButtonNevermind": "Άστο", "ButtonNext": "Επόμενο", "ButtonNextChapter": "Επόμενο Κεφάλαιο", "ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά", @@ -62,8 +63,13 @@ "ButtonPlaylists": "Λίστες Αναπαραγωγής", "ButtonPrevious": "Προηγούμενο", "ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο", + "ButtonProbeAudioFile": "Ανάλυση Αρχείου Ήχου", + "ButtonPurgeAllCache": "Εκκαθάριση Όλης της Προσωρινής Μνήμης", + "ButtonPurgeItemsCache": "Εκκαθάριση της Μνήμης Αντικειμένων", "ButtonQueueAddItem": "Προσθήκη στην ουρά", "ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά", + "ButtonQuickEmbed": "Γρήγορη Ενσωμάτωση", + "ButtonQuickEmbedMetadata": "Γρήγορη Ενσωμάτωση Μεταδεδομένων", "ButtonQuickMatch": "Γρήγορη Αντιστοίχηση", "ButtonReScan": "Επανασάρωση", "ButtonRead": "Ανάγνωση", @@ -73,35 +79,237 @@ "ButtonRemove": "Αφαίρεση", "ButtonRemoveAll": "Αφαίρεση Όλων", "ButtonRemoveAllLibraryItems": "Αφαίρεση Όλων των Αντικειμέων Βιβλιοθήκης", + "ButtonRemoveFromContinueListening": "Αφαίρεση από τη Συνέχεια Ακρόασης", + "ButtonRemoveFromContinueReading": "Αφαίρεση από τη Συνέχεια Ανάγνωσης", + "ButtonRemoveSeriesFromContinueSeries": "Αφαίρεση Σειράς από τη Συνέχεια Σειράς", "ButtonReset": "Επαναφορά", "ButtonResetToDefault": "Επαναφορά στις προεπιλογές", "ButtonRestore": "Επαναφορά", "ButtonSave": "Αποθήκευση", "ButtonSaveAndClose": "Αποθήκευση και Κλείσιμο", + "ButtonSaveTracklist": "Αποθήκευση Λίστας Κομματιών", "ButtonScan": "Σάρψση", + "ButtonScanLibrary": "Σάρωση Βιβλιοθήκης", + "ButtonScrollLeft": "Κύλιση Αριστερά", + "ButtonScrollRight": "Κύλιση Δεξιά", "ButtonSearch": "Αναζήτηση", + "ButtonSelectFolderPath": "Επιλογή Διαδρομής Φακέλου", "ButtonSeries": "Σειρά", + "ButtonSetChaptersFromTracks": "Ορισμός κεφαλαίων από τα κομμάτια", + "ButtonShare": "Κοινοποίηση", + "ButtonShiftTimes": "Χρόνοι Μετακίνησης", + "ButtonShow": "Εμφάνιση", + "ButtonStartM4BEncode": "Έναρξη Κωδικοποίησης M4B", + "ButtonStats": "Στατιστικά", "ButtonSubmit": "Υποβολή", + "ButtonTest": "Δοκιμή", + "ButtonUpload": "Μεταφόρτωση", + "ButtonUploadBackup": "Μεταφόρτωση Αντιγράφου Ασφαλείας", + "ButtonUploadCover": "Μεταφόρτωση Εξωφύλλου", + "ButtonUploadOPMLFile": "Μεταφόρτωση Αρχείου OPML", + "ButtonUserDelete": "Διαγραφή Χρήστη {0}", + "ButtonUserEdit": "Επεξεργασίας χρήστη {0}", + "ButtonViewAll": "Εμφάνιση Όλων", "ButtonYes": "Ναι", + "ErrorUploadLacksTitle": "Πρέπει να έχει τίτλο", "HeaderAccount": "Λογαριασμός", "HeaderAdvanced": "Για Προχωρημένους", + "HeaderApiKeys": "Κλειδιά API", "HeaderAudioTracks": "Κομμάτια Ήχου", + "HeaderBackups": "Αντίγραφα Ασφαλείας", + "HeaderBulkChapterModal": "Προσθήκη Πολλαπλών Κεφαλαίων", + "HeaderChangePassword": "Αλλαγή Κωδικού Πρόσβασης", "HeaderChapters": "Κεφάλαια", + "HeaderChooseAFolder": "Επιλογή Φακέλου", "HeaderCollection": "Συλλογή", "HeaderCollectionItems": "Αντικείμενα Συλλογής", + "HeaderCover": "Εξώφυλλο", + "HeaderCurrentDownloads": "Τρέχουσες Λήψεις", "HeaderDetails": "Λεπτομέρειες", + "HeaderDownloadQueue": "Ουρά Λήψης", "HeaderEbookFiles": "Αρχεία Ebook", + "HeaderEmail": "Ηλεκτρονικό Ταχυδρομίο", + "HeaderEmailSettings": "Ρυθμίσεις Ηλεκτρονικού Ταχυδρομίου", "HeaderEpisodes": "Επεισόδια", "HeaderEreaderSettings": "Ρυθμίσεις Ereader", + "HeaderFiles": "Αρχεία", + "HeaderFindChapters": "Εύρεση Κεφαλαίων", + "HeaderItemFiles": "Αρχεία Αντικειμένων", + "HeaderLastListeningSession": "Τελευταία Συνεδρία Ακρόασης", "HeaderLatestEpisodes": "Τελευταία Επεισόδια", "HeaderLibraries": "Βιβλιοθήκες", + "HeaderLibraryFiles": "Αρχεία Βιβλιοθήκης", + "HeaderLibraryStats": "Στατιστικά Βιβλιοθήκης", + "HeaderListeningSessions": "Συνεδρίες Ακρόασης", + "HeaderListeningStats": "Στατιστικά Ακρόασης", + "HeaderMatch": "Ταύτιση", + "HeaderNewAccount": "Νέος Λογαριασμός", + "HeaderNewApiKey": "Νέο Κλειδί API", + "HeaderNewLibrary": "Νέα Βιβλιοθήκη", + "HeaderNotificationCreate": "Δημιουργία Ειδοποίησης", + "HeaderNotificationUpdate": "Ενημέρωση Ειδοποίησης", + "HeaderNotifications": "Ειδοποιήσεις", "HeaderOpenRSSFeed": "Άνοιγμα Τροφοδοσίας RSS", + "HeaderOtherFiles": "Άλλα Αρχεία", + "HeaderPermissions": "Δικαιώματα", + "HeaderPlayerSettings": "Ρυθμίσεις Αναπαραγωγής", "HeaderPlaylist": "Λίστα Αναπαραγωγής", "HeaderPlaylistItems": "Αντικείμενα Λίστας Αναπαραγωγής", + "HeaderPresets": "Προεπιλογές", "HeaderRSSFeedGeneral": "Λεπτομέρειες RSS", "HeaderRSSFeedIsOpen": "Η Τροφοδοσία RSS είναι Ανοιχτή", + "HeaderRemoveEpisode": "Αφαίρεση Επεισοδίου", + "HeaderSession": "Συνεδρία", + "HeaderSetBackupSchedule": "Ορισμός Προγράμματος Αντιγράφων Ασφαλείας", "HeaderSettings": "Ρυθμίσεις", + "HeaderSettingsDisplay": "Προβολή", + "HeaderSettingsGeneral": "Γενικά", + "HeaderSettingsSecurity": "Ασφάλεια", + "HeaderSleepTimer": "Χρονοδιακόπτης Ύπνου", + "HeaderStatsLargestItems": "Μεγαλύτερα Αντικείμενα", + "HeaderStatsLongestItems": "Μεγαλύτερα Αντικείμενα (ώρες)", "HeaderStatsMinutesListeningChart": "Λεπτά Ακρόασης (τελευταίες 7 ημέρες)", "HeaderStatsRecentSessions": "Πρόσφατες Συνεδρίες", - "HeaderTableOfContents": "Πίνακας Περιεχομένων" + "HeaderStatsTop10Authors": "10 Κορυφαίου Συγγραφείς", + "HeaderStatsTop5Genres": "5 Κορυφαία Είδη", + "HeaderTableOfContents": "Πίνακας Περιεχομένων", + "HeaderTools": "Εργαλεία", + "HeaderUpdateAccount": "Ενημέρωση Λογαριασμού", + "HeaderUpdateApiKey": "Ενημέρωση Κλειδιού API", + "HeaderUpdateAuthor": "Ενημέρωση Συγγραφέα", + "HeaderUpdateDetails": "Ενημέρωση Λεπτομερειεών", + "HeaderUpdateLibrary": "Ενημέρωση Βιβλιοθήκης", + "HeaderUsers": "Χρήστες", + "HeaderYourStats": "Τα Στατιστικά Σας", + "LabelAbridged": "Συνοπτικό", + "LabelAccessibleBy": "Προσβάσιμο από", + "LabelAccountType": "Τύπος Λογαριασμού", + "LabelAccountTypeAdmin": "Διαχειριστής", + "LabelAccountTypeGuest": "Επισκέπτης", + "LabelAccountTypeUser": "Χρήστης", + "LabelAddToCollection": "Προσθήκη σε Συλλογή", + "LabelAddToCollectionBatch": "Προσθήκη {0} Βιβλίων στην Συλλογή", + "LabelAddToPlaylist": "Προσθήκη στην Λίστα Αναπαραγωγής", + "LabelAddedAt": "Προστέθηκε Στις", + "LabelAddedDate": "Προστέθηκε {0}", + "LabelAll": "Όλα", + "LabelAllEpisodesDownloaded": "Όλα τα επεισόδια λήφθηκαν", + "LabelAllUsers": "Όλοι οι Χρήστες", + "LabelAlreadyInYourLibrary": "Υπάρχει ήδη στην βιβλιοθήκη", + "LabelAudioChannels": "Κανάλια Ήχου (1 ή 2)", + "LabelAuthor": "Συγγραφέας", + "LabelAuthorFirstLast": "Συγγραφέας (Όνομα Επώνυμο)", + "LabelAuthorLastFirst": "Συγγραφέας (Επώνυμο, Όνομα)", + "LabelAuthors": "Συγγραφείς", + "LabelAutoDownloadEpisodes": "Αυτόματο Κατέβασμα Επεισοδίων", + "LabelAutoLaunch": "Αυτόματη Εκκίνηση", + "LabelBackupLocation": "Τοποθεσία Αντιγράφου Ασφαλείας", + "LabelBackupsEnableAutomaticBackups": "Αυτόματα αντίγραφα ασφαλείας", + "LabelBackupsNumberToKeep": "Αριθμός αντιγράφων ασφαλείας προς διατήρηση", + "LabelBooks": "Βιβλία", + "LabelButtonText": "Κείμενο Κουμπιού", + "LabelByAuthor": "κατά {0}", + "LabelChangePassword": "Αλλαγή Κωδικού Πρόσβασης", + "LabelChannels": "Κανάλια", + "LabelChapterCount": "{0} Κεφάλαια", + "LabelChapterTitle": "Τίτλος Κεφαλαίου", + "LabelChapters": "Κεφάλαια", + "LabelChaptersFound": "κεφάλαια βρέθηκαν", + "LabelClosePlayer": "Κλείσιμο αναπαραγωγής", + "LabelCollection": "Συλλογή", + "LabelCollections": "Συλλογές", + "LabelComplete": "Ολοκλήρωση", + "LabelConfirmPassword": "Επιβεβαίωση Κωδικού Πρόσβασης", + "LabelContinueListening": "Συνέχεια Ακρόασης", + "LabelContinueReading": "Συνέχεια Ανάγνωσης", + "LabelContinueSeries": "Συνέχεια Σειράς", + "LabelCover": "Εξώφυλλο", + "LabelCoverImageURL": "URL Εικόνας Εξωφύλλου", + "LabelCoverProvider": "Πάροχος Εξωφύλλου", + "LabelCreatedAt": "Δημιουρήθηκε Στις", + "LabelCurrent": "Τρέχων", + "LabelCurrently": "Τρέχων:", + "LabelDays": "Ημέρες", + "LabelDescription": "Περιγραφή", + "LabelDevice": "Συσκευή", + "LabelDeviceInfo": "Πληροφορίες Συσκευής", + "LabelDownload": "Λήψη", + "LabelDownloadNEpisodes": "Λήψη {0} επεισοδίων", + "LabelDuration": "Διάρκεια", + "LabelDurationComparisonExactMatch": "(ακριβής ταύτιση)", + "LabelEbook": "Ebook", + "LabelEbooks": "Ebooks", + "LabelEdit": "Επεξεργασία", + "LabelEmail": "Ηλεκτρονικό Ταχυδρομίο", + "LabelEmailSettingsFromAddress": "Από Διεύθυνση", + "LabelEmailSettingsSecure": "Ασφαλές", + "LabelEmailSettingsTestAddress": "Δοκιμή Διεύθυνσης", + "LabelEmbeddedCover": "Ενσωματωμένο Εξώφυλλο", + "LabelEnable": "Ενεργοποίηση", + "LabelEnd": "Τέλος", + "LabelEndOfChapter": "Τέλος Κεφαλαίου", + "LabelEpisode": "Επεισόδιο", + "LabelFile": "Αρχείο", + "LabelFilename": "Όνομα Αρχείου", + "LabelFinished": "Ολοκληρώθηκε", + "LabelFolder": "Φάκελος", + "LabelFontFamily": "Οικογένεια Γραμματοσειράς", + "LabelGenre": "Είδος", + "LabelGenres": "Είδη", + "LabelHost": "Διακομιστής", + "LabelInProgress": "Σε Εξέλιξη", + "LabelLanguage": "Γλώσσα", + "LabelLayoutSinglePage": "Μονή Σελίδα", + "LabelListenAgain": "Επανάληψη Ακρόασης", + "LabelMediaType": "Τύπος Πολυμέσων", + "LabelMore": "Περισσότερα", + "LabelMoreInfo": "Περισσότερες Πληροφορίες", + "LabelName": "Όνομα", + "LabelNarrator": "Αφηγητής", + "LabelNarrators": "Αφηγητές", + "LabelNewestAuthors": "Πρόσφατοι Συγγραφείς", + "LabelNewestEpisodes": "Πρόσφατα Επεισόδια", + "LabelNotStarted": "Δεν Έχει Ξεκινήσει", + "LabelNumberOfEpisodes": "# Επεισοδίων", + "LabelPassword": "Κωδικός Πρόσβασης", + "LabelPath": "Διαδρομή", + "LabelProgress": "Πρόοδος", + "LabelPublishYear": "Χρονολογία Έκδοσης", + "LabelPublishedDate": "Εκδόθηκε {0}", + "LabelRandomly": "Τυχαία", + "LabelRead": "Ανάγνωση", + "LabelReadAgain": "Ανάγνωση Ξανά", + "LabelRecentSeries": "Πρόσφατη Σειρά", + "LabelRecentlyAdded": "Προστέθηκαν Πρόσφατα", + "LabelSeries": "Σειρά", + "LabelSetEbookAsPrimary": "Ορισμός ως πρωτεύων", + "LabelShowAll": "Εμφάνιση Όλων", + "LabelSize": "Μέγεθος", + "LabelSleepTimer": "Χρονοδιακόπτης Ύπνου", + "LabelStart": "Έναρξη", + "LabelStatsBestDay": "Καλύτερη Ημέρα", + "LabelStatsDailyAverage": "Ημερήσιος Μέσος Όρος", + "LabelStatsDays": "Ημέρες", + "LabelStatsDaysListened": "Ημέρες Ακρόασης", + "LabelStatsInARow": "Σε σειρά", + "LabelStatsItemsFinished": "Ολοκληρωμένα Αντικείμενα", + "LabelStatsMinutes": "λεπτά", + "LabelStatsMinutesListening": "Λεπτά Ακρόασης", + "LabelStatsWeekListening": "Εβδομαδιαία Ακρόαση", + "LabelTheme": "Θέμα", + "LabelThemeDark": "Σκοτεινό", + "LabelThemeLight": "Φωτεινό", + "LabelTimeRemaining": "{0} απομένουν", + "LabelTitle": "Τίτλος", + "LabelTracks": "Κομμάτια", + "LabelType": "Τύπος", + "LabelUnknown": "Άγνωστο", + "LabelUser": "Χρήστης", + "LabelUsername": "Όνομα Χρήστη", + "LabelYourProgress": "Η Πρόοδος Σας", + "MessageDownloadingEpisode": "Λήψη επεισοδίου", + "MessageLoading": "Φόρτωση...", + "MessageMarkAsFinished": "Σήμανση ως Ολοκληρωμένο", + "MessageNoItemsFound": "Δεν βρέθηκαν αντικείμενα", + "MessageNoUserPlaylists": "Δεν έχετε λίστες αναπαραγωγής" } From 81e96df9c5f8db502e3d9740ee8cb6b718c5a074 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 21 Dec 2025 15:54:07 -0600 Subject: [PATCH 082/117] Version bump v2.32.0 --- client/package-lock.json | 4 ++-- client/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 2d41d39ef..568274c80 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf-client", - "version": "2.31.0", + "version": "2.32.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf-client", - "version": "2.31.0", + "version": "2.32.0", "license": "ISC", "dependencies": { "@nuxtjs/axios": "^5.13.6", diff --git a/client/package.json b/client/package.json index 33d66c276..df71f6256 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-client", - "version": "2.31.0", + "version": "2.32.0", "buildNumber": 1, "description": "Self-hosted audiobook and podcast client", "main": "index.js", diff --git a/package-lock.json b/package-lock.json index d703a8edc..4c9e9b9ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf", - "version": "2.31.0", + "version": "2.32.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf", - "version": "2.31.0", + "version": "2.32.0", "license": "GPL-3.0", "dependencies": { "axios": "^0.27.2", diff --git a/package.json b/package.json index 0aaf4f5af..2b0d0b6cc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf", - "version": "2.31.0", + "version": "2.32.0", "buildNumber": 1, "description": "Self-hosted audiobook and podcast server", "main": "index.js", From 04eb3bc43733533516566fb3cd9ca5c32e034d4d Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 23 Dec 2025 16:44:29 -0600 Subject: [PATCH 083/117] Fix server crash on audible match #4931 --- server/providers/Audible.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/providers/Audible.js b/server/providers/Audible.js index 6ba01aa83..133d3c0d8 100644 --- a/server/providers/Audible.js +++ b/server/providers/Audible.js @@ -57,8 +57,8 @@ class Audible { }) } - let genresCleaned = null - let tagsCleaned = null + let genresCleaned = [] + let tagsCleaned = [] if (genres && Array.isArray(genres)) { genresCleaned = [...new Set(genres.filter((g) => g.type == 'genre').map((g) => g.name))] From 4bf15bbffd395f6257a4718d784b301fb710679f Mon Sep 17 00:00:00 2001 From: Ivan Smoliakov Date: Mon, 22 Dec 2025 11:56:18 +0100 Subject: [PATCH 084/117] Translated using Weblate (Russian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/ --- client/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/ru.json b/client/strings/ru.json index e0b048642..c84fe9dcf 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -275,7 +275,7 @@ "LabelBonus": "Бонус", "LabelBooks": "Книги", "LabelButtonText": "Текст кнопки", - "LabelByAuthor": "{0}", + "LabelByAuthor": "от {0}", "LabelChangePassword": "Изменить пароль", "LabelChannels": "Ленты", "LabelChapterCount": "{0} Главы", From f3e90bd4206710a2e7f2e6d06edebcc6a1e474d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Mon, 22 Dec 2025 07:13:02 +0100 Subject: [PATCH 085/117] Translated using Weblate (Finnish) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/ --- client/strings/fi.json | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/client/strings/fi.json b/client/strings/fi.json index 600db265a..dde7009ea 100644 --- a/client/strings/fi.json +++ b/client/strings/fi.json @@ -275,7 +275,7 @@ "LabelBonus": "Bonus", "LabelBooks": "Kirjat", "LabelButtonText": "Painikkeen teksti", - "LabelByAuthor": "tekijältä {0}", + "LabelByAuthor": "Tekijältä: {0}", "LabelChangePassword": "Vaihda salasana", "LabelChannels": "Kanavat", "LabelChapterCount": "{0} lukua", @@ -790,6 +790,7 @@ "MessageConfirmRemoveAuthor": "Oletko varma, että haluat poistaa tekijän \"{0}\"?", "MessageConfirmRemoveCollection": "Oletko varma, että haluat poistaa kokoelman \"{0}\"?", "MessageConfirmRemoveEpisode": "Oletko varma, että haluat poistaa jakson \"{0}\"?", + "MessageConfirmRemoveEpisodeNote": "Huomioi: Tämä ei poista äänitiedostoa, ellei \"Poista tiedosto pysyvästi\" -asetusta ole valittuna", "MessageConfirmRemoveEpisodes": "Oletko varma, että haluat poistaa {0} jaksoa?", "MessageConfirmRemoveListeningSessions": "Oletko varma, että haluat poistaa {0} kuuntelukertaa?", "MessageConfirmRemoveMetadataFiles": "Oletko varma, että haluat poistaa kaikki metadata.{0}-tiedostot kirjaston kohdekansioista?", @@ -816,6 +817,7 @@ "MessageFetching": "Haetaan...", "MessageForceReScanDescription": "skannaa kaikki tiedostot uudelleen kuten uusi tarkistus. Äänitiedoston ID3-tunnisteet, OPF-tiedostot ja tekstitiedostot skannataan uusina.", "MessageHeatmapListeningTimeTooltip": "{0} kuunnellaan on {1}", + "MessageHeatmapNoListeningSessions": "Ei kuuntelujaksoja {0}", "MessageImportantNotice": "Tärkeä huomautus!", "MessageInsertChapterBelow": "Syötä luku alle", "MessageInvalidAsin": "Virheellinen ASIN", @@ -886,10 +888,11 @@ "MessageResetChaptersConfirm": "Oletko varma, että haluat nollata luvut ja kumota tekemäsi muutokset?", "MessageRestoreBackupConfirm": "Oletko varma, että haluat palauttaa varmuuskopion, joka on luotu", "MessageRestoreBackupWarning": "Varmuuskopion palauttaminen korvaa koko /config:ssa sijaitsevan tietokannan, ja kansikuvat /metadata/items & /metadata/authors:ssa.

Varmuuskopiot eivät muuta kirjastokansioissasi olevia tiedostoja. Jos olet ottanut käyttöön palvelinasetuksissa kansikuvien ja metatietojen tallentamisen kirjaston kansioihin, niitä ei varmuuskopioida tai korvata.

Kaikki palvelintasi käyttävät asiakkaat virkistetään automaattisesti.", - "MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja \"Tarkkaile kirjaston muutoksia automaattisesti\" -asetus pidetään käytössä - se havaitsee muutokset kirjastokansioissasi automaattisesti. Ota tämä ominaisuus käyttöön, jos \"Tarkkaile kirjaston muutoksia automaattisesti\" ei toimi tiedostojärjestelmässäsi (kuten NFS).\"", + "MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja \"Tarkkaile kirjaston muutoksia automaattisesti\" -asetus pidetään käytössä - se havaitsee muutokset kirjastokansioissasi automaattisesti. Ota tämä ominaisuus käyttöön, jos \"Tarkkaile kirjaston muutoksia automaattisesti\" ei toimi tiedostojärjestelmässäsi (kuten NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Suorita joka {0} klo {1}", "MessageSearchResultsFor": "Hakutulokset haulle", "MessageSelected": "{0} valittuna", + "MessageSeriesSequenceCannotContainSpaces": "Sarjan sekvenssi ei voi sisältää välilyöntejä", "MessageServerCouldNotBeReached": "Palvelimelle ei saatu yhteyttä", "MessageSetChaptersFromTracksDescription": "Aseta luvut käyttämällä kutakin äänitiedostoa lukuna ja luvun otsikkoa äänitiedoston nimenä", "MessageShareExpirationWillBe": "Umpeutuminen on {0}", @@ -951,7 +954,10 @@ "NotificationOnBackupCompletedDescription": "Laukaistu, kun varmuuskopiointi on valmis", "NotificationOnBackupFailedDescription": "Laukaistu, kun varmuuskopiointi epäonnistuu", "NotificationOnEpisodeDownloadedDescription": "Laukaistu, kun podcast-jakso ladataan automaattisesti", + "NotificationOnRSSFeedDisabledDescription": "Laukaistaan, kun automaattiset jaksolataukset poistetaan käytöstä liian monen epäonnistuneen yrityksen vuoksi", + "NotificationOnRSSFeedFailedDescription": "Laukaistaan, kun RRS-syötteen pyyntö epäonnistuu automaattisessa jaksolatauksessa", "NotificationOnTestDescription": "Tapahtuma ilmoitusjärjestelmän testaamista varten", + "PlaceholderBulkChapterInput": "Syötä luvun otsikko tai käytä numerointia (esim. 'Episodi 1', 'Luku 10', '1.')", "PlaceholderNewCollection": "Uusi kokoelman nimi", "PlaceholderNewFolderPath": "Uusi kansion polku", "PlaceholderNewPlaylist": "Uusi soittolistan nimi", @@ -1005,15 +1011,23 @@ "ToastBookmarkCreateFailed": "Kirjanmerkin luominen epäonnistui", "ToastBookmarkCreateSuccess": "Kirjanmerkki lisätty", "ToastBookmarkRemoveSuccess": "Kirjanmerkki poistettu", + "ToastBulkChapterInvalidCount": "Syötä numero 1 ja 150 välillä", "ToastCachePurgeFailed": "Välimuistin tyhjentäminen epäonnistui", "ToastCachePurgeSuccess": "Välimuisti tyhjennetty onnistuneesti", + "ToastChapterLocked": "Luku on lukittu.", + "ToastChapterStartTimeAdjusted": "Luvun aloitusaikaa on säädetty {0} sekunnilla", + "ToastChaptersAllLocked": "Kaikki luvut ovat lukittuina. Avaa lukuja vaihtaaksesi niiden aikoja.", "ToastChaptersHaveErrors": "Luvuissa on virheitä", + "ToastChaptersInvalidShiftAmountLast": "Virheellinen siirtomäärä. Viimeisen luvun aloitusaika ylittäisi tämän äänikirjan keston.", + "ToastChaptersInvalidShiftAmountStart": "Virheellinen siirtomäärä. Ensimmäisen luvun pituudeksi tulisi nolla tai negatiivinen arvo, ja toinen luku kirjoittaisi sen päälle. Kasvata toisen luvun aloitusaikaa.", "ToastChaptersMustHaveTitles": "Lukuilla on oltava otsikot", "ToastChaptersRemoved": "Luvut poistettu", "ToastChaptersUpdated": "Luvut päivitetty", "ToastCollectionItemsAddFailed": "Kohteen/kohteiden lisääminen kokoelmaan epäonnistui", "ToastCollectionRemoveSuccess": "Kokoelma poistettu", "ToastCollectionUpdateSuccess": "Kokoelma päivitetty", + "ToastConnectionNotAvailable": "Verkkoyhteyttä ei saatavilla. Yritä hetken päästä uudelleen", + "ToastCoverSearchFailed": "Kansikuvan haku epäonnistui", "ToastCoverUpdateFailed": "Kansikuvan päivitys epäonnistui", "ToastDateTimeInvalidOrIncomplete": "Päivämäärä ja aika ovat epäkelvolliset tai puutteelliset", "ToastDeleteFileFailed": "Tiedoston poistaminen epäonnistui", @@ -1029,6 +1043,8 @@ "ToastEpisodeDownloadQueueClearSuccess": "Jakson latausjono tyhjennetty", "ToastEpisodeUpdateSuccess": "{0} jaksoa päivitetty", "ToastErrorCannotShare": "Ei voi jakaa alkuperäisesti tällä laitteella", + "ToastFailedToCreate": "Luonti epäonnistui", + "ToastFailedToDelete": "Poisto epäonnistui", "ToastFailedToLoadData": "Tietojen lataaminen epäonnistui", "ToastFailedToMatch": "Vastaaminen epäonnistui", "ToastFailedToShare": "Jakaminen epäonnistui", @@ -1036,6 +1052,7 @@ "ToastInvalidImageUrl": "Epäkelvollinen kuvan URL-osoite", "ToastInvalidMaxEpisodesToDownload": "Ladattavien jaksojen enimmäismäärä on epäkelvollinen", "ToastInvalidUrl": "Epäkelvollinen URL-osoite", + "ToastInvalidUrls": "Yksi tai useampi URL on virheellinen", "ToastItemCoverUpdateSuccess": "Kohteen kansikuva päivitetty", "ToastItemDeletedFailed": "Kohteen poistaminen epäonnistui", "ToastItemDeletedSuccess": "Poistettu kohde", @@ -1060,6 +1077,7 @@ "ToastMustHaveAtLeastOnePath": "On oltava vähintään yksi polku", "ToastNameEmailRequired": "Nimi ja sähköpostiosoite vaaditaan", "ToastNameRequired": "Nimi vaaditaan", + "ToastNewApiKeyUserError": "Täytyy valita käyttäjä", "ToastNewEpisodesFound": "{0} uutta jaksoa löydetty", "ToastNewUserCreatedFailed": "Tilin \"{0}\" luominen epäonnistui", "ToastNewUserCreatedSuccess": "Uusi tili luotu", @@ -1084,6 +1102,7 @@ "ToastPlaylistUpdateSuccess": "Soittolista päivitetty", "ToastPodcastCreateFailed": "Podcastin luominen epäonnistui", "ToastPodcastCreateSuccess": "Podcastin luominen onnistui", + "ToastPodcastEpisodeUpdated": "Episodi päivitetty", "ToastPodcastGetFeedFailed": "Podcast-syötteen saaminen epäonnistui", "ToastPodcastNoEpisodesInFeed": "RSS-syötteestä ei löytynyt jaksoja", "ToastPodcastNoRssFeed": "Podcastilla ei ole RSS-syötettä", @@ -1134,5 +1153,13 @@ "ToastUserPasswordChangeSuccess": "Salasana vaihdettu onnistuneesti", "ToastUserPasswordMismatch": "Salasanat eivät täsmää", "ToastUserPasswordMustChange": "Uusi salasana ei voi olla sama kuin vanha salasana", - "ToastUserRootRequireName": "Pääkäyttäjän nimi on pakollinen" + "ToastUserRootRequireName": "Pääkäyttäjän nimi on pakollinen", + "TooltipAddChapters": "Lisää luku tai lukuja", + "TooltipAddOneSecond": "Lisää 1 sekunti", + "TooltipAdjustChapterStart": "Napauta säätääksesi aloitusaikaa", + "TooltipLockAllChapters": "Lukitse kaikki luvut", + "TooltipLockChapter": "Lukitse luku (Shift+napauta valitaksesi alueen)", + "TooltipSubtractOneSecond": "Vähennä 1 sekunti", + "TooltipUnlockAllChapters": "Avaa kaikki luvut", + "TooltipUnlockChapter": "Avaa luku (Shift+napauta valitaksesi alueen)" } From e8668d9f224ef4f3bd97ff7f1af82bfb3127a2b0 Mon Sep 17 00:00:00 2001 From: bittin1ddc447d824349b2 Date: Mon, 22 Dec 2025 12:58:36 +0100 Subject: [PATCH 086/117] Translated using Weblate (Swedish) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index 7bd9753b8..d2fb254ed 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -821,7 +821,7 @@ "MessageImportantNotice": "Viktig meddelande!", "MessageInsertChapterBelow": "Infoga kapitel nedanför", "MessageInvalidAsin": "Felaktig ASIN-kod", - "MessageItemsSelected": "{0} objekt markerade", + "MessageItemsSelected": "{0} objekt valda", "MessageItemsUpdated": "{0} objekt uppdaterade", "MessageJoinUsOn": "Anslut dig till oss på", "MessageLoading": "Laddar...", From b387d9484a564bdaf347af93ba46e50c6181256d Mon Sep 17 00:00:00 2001 From: Marcin Date: Tue, 23 Dec 2025 05:54:25 +0100 Subject: [PATCH 087/117] Translated using Weblate (Polish) Currently translated at 89.2% (1038 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index 32c9766ca..8b70a1341 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -96,7 +96,7 @@ "ButtonScrollRight": "Przewiń w prawo", "ButtonSearch": "Szukaj", "ButtonSelectFolderPath": "Wybierz ścieżkę folderu", - "ButtonSeries": "Serial", + "ButtonSeries": "Serie", "ButtonSetChaptersFromTracks": "Ustawiaj rozdziały na podstawie utworów", "ButtonShare": "Udostępnij", "ButtonShiftTimes": "Przesunięcie czasowe", From e5c0a9d22c5148a4c1d6c2fee20c9669578eb1e3 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 23 Dec 2025 16:51:54 -0600 Subject: [PATCH 088/117] Version bump v2.32.1 --- client/package-lock.json | 4 ++-- client/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 568274c80..1e2d52c11 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf-client", - "version": "2.32.0", + "version": "2.32.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf-client", - "version": "2.32.0", + "version": "2.32.1", "license": "ISC", "dependencies": { "@nuxtjs/axios": "^5.13.6", diff --git a/client/package.json b/client/package.json index df71f6256..0eaffb106 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-client", - "version": "2.32.0", + "version": "2.32.1", "buildNumber": 1, "description": "Self-hosted audiobook and podcast client", "main": "index.js", diff --git a/package-lock.json b/package-lock.json index 4c9e9b9ea..08707893d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf", - "version": "2.32.0", + "version": "2.32.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf", - "version": "2.32.0", + "version": "2.32.1", "license": "GPL-3.0", "dependencies": { "axios": "^0.27.2", diff --git a/package.json b/package.json index 2b0d0b6cc..3ee3fb391 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf", - "version": "2.32.0", + "version": "2.32.1", "buildNumber": 1, "description": "Self-hosted audiobook and podcast server", "main": "index.js", From 122fc34a75a6730f99736c3ae01186871b3d90ef Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 24 Dec 2025 17:07:05 -0600 Subject: [PATCH 089/117] Fix server crash filtering by decade with collapsed series --- server/utils/queries/libraryItemsBookFilters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/utils/queries/libraryItemsBookFilters.js b/server/utils/queries/libraryItemsBookFilters.js index 494a9564f..7ae1dc866 100644 --- a/server/utils/queries/libraryItemsBookFilters.js +++ b/server/utils/queries/libraryItemsBookFilters.js @@ -236,7 +236,7 @@ module.exports = { } else if (group === 'publishedDecades') { const startYear = parseInt(value) const endYear = parseInt(value, 10) + 9 - mediaWhere = Sequelize.where(Sequelize.literal('CAST(`book`.`publishedYear` AS INTEGER)'), { + mediaWhere = Sequelize.where(Sequelize.literal('CAST(publishedYear AS INTEGER)'), { [Sequelize.Op.between]: [startYear, endYear] }) } From e6d99d07f0e5c649d873d7ba6df40be2e0b9a727 Mon Sep 17 00:00:00 2001 From: sir-wilhelm Date: Sun, 28 Dec 2025 11:28:36 -0600 Subject: [PATCH 090/117] Display localized/styled text for selected filter. The selected filter was using the id before. --- client/components/controls/LibraryFilterSelect.vue | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue index 62a9b8037..4834a1a25 100644 --- a/client/components/controls/LibraryFilterSelect.vue +++ b/client/components/controls/LibraryFilterSelect.vue @@ -338,6 +338,18 @@ export default { const series = this.series.find((se) => se.id == decoded) if (series) filterValue = series.name } + } else if (parts[0] === 'progress') { + const item = this.progress.find((p) => p.id == decoded) + if (item) filterValue = item.name + } else if (parts[0] === 'tracks') { + const item = this.tracks.find((t) => t.id == decoded) + if (item) filterValue = item.name + } else if (parts[0] === 'ebooks') { + const item = this.ebooks.find((e) => e.id == decoded) + if (item) filterValue = item.name + } else if (parts[0] === 'missing') { + const item = this.missing.find((m) => m.id == decoded) + if (item) filterValue = item.name } else { filterValue = decoded } From 3e4225bced841944b24ffde05ce6a8933a17e131 Mon Sep 17 00:00:00 2001 From: KiwiHour Date: Fri, 9 Jan 2026 14:26:56 +0000 Subject: [PATCH 091/117] Fix aria-label for jumpBackward button --- client/components/player/PlayerPlaybackControls.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/player/PlayerPlaybackControls.vue b/client/components/player/PlayerPlaybackControls.vue index 368e3f35b..c7cbba63c 100644 --- a/client/components/player/PlayerPlaybackControls.vue +++ b/client/components/player/PlayerPlaybackControls.vue @@ -8,7 +8,7 @@
- From 5107b0307c7a39c3344c3e380d41271631fcfca5 Mon Sep 17 00:00:00 2001 From: Charlie Date: Wed, 24 Dec 2025 20:22:40 +0100 Subject: [PATCH 092/117] Translated using Weblate (French) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/ --- client/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index 4841ec9f6..4ab98d805 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -962,7 +962,7 @@ "PlaceholderNewFolderPath": "Nouveau chemin de dossier", "PlaceholderNewPlaylist": "Nouveau nom de liste de lecture", "PlaceholderSearch": "Recherche…", - "PlaceholderSearchEpisode": "Rechercher un épisode..", + "PlaceholderSearchEpisode": "Rechercher un épisode…", "StatsAuthorsAdded": "auteurs ajoutés", "StatsBooksAdded": "livres ajoutés", "StatsBooksAdditional": "Les ajouts comprennent…", From c089336e416857e5d04030a9b423f45fb412ac22 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 1 Jan 2026 23:00:03 +0100 Subject: [PATCH 093/117] Translated using Weblate (Italian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/ --- client/strings/it.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/it.json b/client/strings/it.json index 46ecb0f53..d2178cbf6 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -275,7 +275,7 @@ "LabelBonus": "Bonus", "LabelBooks": "Libri", "LabelButtonText": "Buttone Testo", - "LabelByAuthor": "da {0}", + "LabelByAuthor": "di {0}", "LabelChangePassword": "Cambia Password", "LabelChannels": "Canali", "LabelChapterCount": "{0} Capitoli", From b921a08809b23bd7e591fef7cdef37e5ef1714c0 Mon Sep 17 00:00:00 2001 From: "J. Lavoie" Date: Thu, 1 Jan 2026 22:59:35 +0100 Subject: [PATCH 094/117] Translated using Weblate (French) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/ --- client/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index 4ab98d805..6ff72c7ef 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -275,7 +275,7 @@ "LabelBonus": "Bonus", "LabelBooks": "Livres", "LabelButtonText": "Texte du bouton", - "LabelByAuthor": "par {0}", + "LabelByAuthor": "de {0}", "LabelChangePassword": "Modifier le mot de passe", "LabelChannels": "Canaux", "LabelChapterCount": "{0} Chapitres", From 32276aacd94b207ecb116c6145e10b91e3a218a3 Mon Sep 17 00:00:00 2001 From: xxzp3 Date: Wed, 7 Jan 2026 18:48:31 +0100 Subject: [PATCH 095/117] Translated using Weblate (Danish) Currently translated at 99.8% (1161 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/da/ --- client/strings/da.json | 45 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/client/strings/da.json b/client/strings/da.json index ab1444970..0f4c24ec9 100644 --- a/client/strings/da.json +++ b/client/strings/da.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Audiobog Filhåndteringsværktøjer", "HeaderAuthentication": "Autentificering", "HeaderBackups": "Sikkerhedskopier", + "HeaderBulkChapterModal": "Tilføj flere kapitler", "HeaderChangePassword": "Skift Adgangskode", "HeaderChapters": "Kapitler", "HeaderChooseAFolder": "Vælg en Mappe", @@ -199,6 +200,7 @@ "HeaderSettingsExperimental": "Eksperimentelle Funktioner", "HeaderSettingsGeneral": "Generelt", "HeaderSettingsScanner": "Scanner", + "HeaderSettingsSecurity": "Sikkerhed", "HeaderSettingsWebClient": "Webklient", "HeaderSleepTimer": "Søvntimer", "HeaderStatsLargestItems": "Største Elementer", @@ -293,6 +295,7 @@ "LabelContinueListening": "Fortsæt med at lytte", "LabelContinueReading": "Fortsæt med at læse", "LabelContinueSeries": "Fortsæt Serien", + "LabelCorsAllowed": "Tilladte CORS-oprindelser", "LabelCover": "Omslag", "LabelCoverImageURL": "Omslagsbillede URL", "LabelCoverProvider": "Cover billede udbyder", @@ -306,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Slet fra filsystem (afmarker kun for at fjerne fra databasen)", "LabelDescription": "Beskrivelse", "LabelDeselectAll": "Fravælg Alle", + "LabelDetectedPattern": "Identificeret mønster:", "LabelDevice": "Enheds", "LabelDeviceInfo": "Enhedsinformation", "LabelDeviceIsAvailableTo": "Enhed er tilgængelig for...", @@ -374,11 +378,12 @@ "LabelFilterByUser": "Filtrér efter bruger", "LabelFindEpisodes": "Find episoder", "LabelFinished": "Færdig", + "LabelFinishedDate": "Færdig {0}", "LabelFolder": "Mappe", "LabelFolders": "Mapper", "LabelFontBold": "Fed", "LabelFontBoldness": "Skrift tykkelse", - "LabelFontFamily": "Fontfamilie", + "LabelFontFamily": "Skrifttypefamilie", "LabelFontItalic": "Kursiv", "LabelFontScale": "Skriftstørrelse", "LabelFontStrikethrough": "Gennemstreget", @@ -418,6 +423,7 @@ "LabelLanguages": "Sprog", "LabelLastBookAdded": "Senest tilføjede bog", "LabelLastBookUpdated": "Senest opdaterede bog", + "LabelLastProgressDate": "Sidste fremgang: {0}", "LabelLastSeen": "Sidst set", "LabelLastTime": "Sidste gang", "LabelLastUpdate": "Seneste opdatering", @@ -430,6 +436,9 @@ "LabelLibraryFilterSublistEmpty": "Nej {0}", "LabelLibraryItem": "Bibliotekselement", "LabelLibraryName": "Biblioteksnavn", + "LabelLibrarySortByProgress": "Fremgang: Sidst opdateret", + "LabelLibrarySortByProgressFinished": "Fremgang: Afsluttet", + "LabelLibrarySortByProgressStarted": "Fremgang: Startet", "LabelLimit": "Grænse", "LabelLineSpacing": "Linjeafstand", "LabelListenAgain": "Lyt igen", @@ -467,6 +476,7 @@ "LabelNewestAuthors": "Nyeste forfattere", "LabelNewestEpisodes": "Nyeste episoder", "LabelNextBackupDate": "Næste sikkerhedskopi dato", + "LabelNextChapters": "Næste kapitler vil være:", "LabelNextScheduledRun": "Næste planlagte kørsel", "LabelNoApiKeys": "Ingen API-nøgler", "LabelNoCustomMetadataProviders": "Ingen brugerdefinerede metadata udbydere", @@ -484,6 +494,7 @@ "LabelNotificationsMaxQueueSize": "Maksimal køstørrelse for meddelelseshændelser", "LabelNotificationsMaxQueueSizeHelp": "Hændelser begrænses til at udløse en gang pr. sekund. Hændelser ignoreres, hvis køen er fyldt. Dette forhindrer meddelelsesspam.", "LabelNumberOfBooks": "Antal bøger", + "LabelNumberOfChapters": "Antal kapitler:", "LabelNumberOfEpisodes": "# afsnit", "LabelOpenIDAdvancedPermsClaimDescription": "Navnet af OpenID claimet som indeholder avancerede brugerhandlinger inden i applikationen som vil gælde for ikke administrative roller (hvis konfigureret). Hvis et claim mangler fra svaret vil adgang til ABS blive nægtet. Hvis en enkelt indstilling/option mangler, vil det bliver behandlet som false. Sørg for at identity provider's claim matcher den forventede struktur:", "LabelOpenIDClaims": "Efterlad de følgende indstillinger tomme for at deaktivere avanceret gruppe og adgangsindstilling, ved automatisk at assigne 'Bruger' grupper.", @@ -576,8 +587,8 @@ "LabelSettingsBookshelfViewHelp": "Skeumorfisk design med træhylder", "LabelSettingsChromecastSupport": "Chromecast-understøttelse", "LabelSettingsDateFormat": "Datoformat", - "LabelSettingsEnableWatcher": "Scan automatisk bibliotek for ændringer", - "LabelSettingsEnableWatcherForLibrary": "Scan automatisk bibliotek for ændringer", + "LabelSettingsEnableWatcher": "Automatisk biblioteksovervåger", + "LabelSettingsEnableWatcherForLibrary": "Automatisk biblioteksovervåger", "LabelSettingsEnableWatcherHelp": "Aktiverer automatisk tilføjelse/opdatering af elementer, når filændringer registreres. *Kræver servergenstart", "LabelSettingsEpubsAllowScriptedContent": "Tillad scriptet indhold i epub", "LabelSettingsEpubsAllowScriptedContentHelp": "Tillad epub filer at køre scripts. Det anbefales at holde denne indstilling deaktiveret med mindre du stoler på kilderne af epub filerne.", @@ -626,6 +637,7 @@ "LabelStartTime": "Starttid", "LabelStarted": "Startet", "LabelStartedAt": "Startet klokken", + "LabelStartedDate": "Startet {0}", "LabelStatsAudioTracks": "Lydspor", "LabelStatsAuthors": "Forfattere", "LabelStatsBestDay": "Bedste dag", @@ -655,6 +667,7 @@ "LabelTheme": "Tema", "LabelThemeDark": "Mørk", "LabelThemeLight": "Lys", + "LabelThemeSepia": "Sepia", "LabelTimeBase": "Tidsbase", "LabelTimeDurationXHours": "{0} timer", "LabelTimeDurationXMinutes": "{0} minutter", @@ -739,6 +752,7 @@ "MessageBookshelfNoResultsForFilter": "Ingen resultater for filter \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Intet resultat for query", "MessageBookshelfNoSeries": "Du har ingen serier", + "MessageBulkChapterPattern": "Hvor mange kapitler vil du tilføje med dette nummereringsmønster?", "MessageChapterEndIsAfter": "Kapitelslutningen er efter slutningen af din lydbog", "MessageChapterErrorFirstNotZero": "Første kapitel skal starte ved 0", "MessageChapterErrorStartGteDuration": "Ugyldig starttid skal være mindre end lydbogens varighed", @@ -775,6 +789,7 @@ "MessageConfirmRemoveAuthor": "Er du sikker på, at du vil fjerne forfatteren \"{0}\"?", "MessageConfirmRemoveCollection": "Er du sikker på, at du vil fjerne samlingen \"{0}\"?", "MessageConfirmRemoveEpisode": "Er du sikker på, at du vil fjerne episoden \"{0}\"?", + "MessageConfirmRemoveEpisodeNote": "Obs: Dette sletter ikke lydfilen medmindre \"Permanent sletning af fil\" er aktiveret", "MessageConfirmRemoveEpisodes": "Er du sikker på, at du vil fjerne {0} episoder?", "MessageConfirmRemoveListeningSessions": "Er du sikker på at du vil fjerne {0} lytte sessioner?", "MessageConfirmRemoveMetadataFiles": "Er du sikker på at du vil fjerne alle metadata.{0} filer i dine biblioteksfoldere?", @@ -800,6 +815,8 @@ "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.", + "MessageHeatmapListeningTimeTooltip": "{0} lytter på {1}", + "MessageHeatmapNoListeningSessions": "Ingen lyttesessioner på {0}", "MessageImportantNotice": "Vigtig besked!", "MessageInsertChapterBelow": "Indsæt kapitel nedenfor", "MessageInvalidAsin": "Ugyldig ASIN", @@ -870,7 +887,7 @@ "MessageResetChaptersConfirm": "Er du sikker på, at du vil nulstille kapitler og annullere ændringerne, du har foretaget?", "MessageRestoreBackupConfirm": "Er du sikker på, at du vil gendanne sikkerhedskopien oprettet den", "MessageRestoreBackupWarning": "Gendannelse af en sikkerhedskopi vil overskrive hele databasen, som er placeret på /config, og omslagsbilleder i /metadata/items & /metadata/authors.

Sikkerhedskopier ændrer ikke nogen filer i dine biblioteksmapper. Hvis du har aktiveret serverindstillinger for at gemme omslagskunst og metadata i dine biblioteksmapper, sikkerhedskopieres eller overskrives disse ikke.

Alle klienter, der bruger din server, opdateres automatisk.", - "MessageScheduleLibraryScanNote": "For de fleste brugere, er det anbefalet at efterlade denne funktion deaktiveret for at holde mappe lurer indstilling aktiveret. Mappe lureren vil automatisk opdage ændringer i biblioteksmapper. Mappe lureren virker ikke for alle filsystemer (så som NFS) så schedulerede biblioteksscans vil blive anvendt.", + "MessageScheduleLibraryScanNote": "For de fleste brugere er det anbefalet, at efterlade denne funktion deaktiveret, og lade biblioteksovervågeren være aktiveret - den vil automatisk opdage ændringer i dine biblioteksmapper. Aktiver denne funktion, hvis biblioteksovervågeren ikke virker med dit filsystem (f. eks. NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Kør hvert {0} af {1}", "MessageSearchResultsFor": "Søgeresultater for", "MessageSelected": "{0} valgt", @@ -939,6 +956,7 @@ "NotificationOnRSSFeedDisabledDescription": "Aktiveret når automatiske episode-downloads er slået fra, på grund af for mange forsøg", "NotificationOnRSSFeedFailedDescription": "Aktiveret når anmodning om RSS-feedet fejler for en automatisk episode-download", "NotificationOnTestDescription": "Event for test af notifikationssystemet", + "PlaceholderBulkChapterInput": "Indtast kapiteltitel eller brug nummerering (f.eks. 'Episode 1', 'Kapitel 10', '1.')", "PlaceholderNewCollection": "Nyt samlingnavn", "PlaceholderNewFolderPath": "Ny mappes sti", "PlaceholderNewPlaylist": "Nyt afspilningslistnavn", @@ -992,9 +1010,15 @@ "ToastBookmarkCreateFailed": "Mislykkedes oprettelse af bogmærke", "ToastBookmarkCreateSuccess": "Bogmærke tilføjet", "ToastBookmarkRemoveSuccess": "Bogmærke fjernet", + "ToastBulkChapterInvalidCount": "Indtast et tal mellem 1 og 150", "ToastCachePurgeFailed": "Fejlede at opryde cache", "ToastCachePurgeSuccess": "Cache ryddet op i succesfuldt", + "ToastChapterLocked": "Kapitel er låst.", + "ToastChapterStartTimeAdjusted": "Kapitelstarttid justeret med {0} sekunder", + "ToastChaptersAllLocked": "Alle kapitler er låst. Lås op for nogle kapitler for at ændre deres tider.", "ToastChaptersHaveErrors": "Kapitler har fejl", + "ToastChaptersInvalidShiftAmountLast": "Ugyldig ændring. Det sidste kapitels starttid ville fortsætte længere end varigheden på denne lydbog.", + "ToastChaptersInvalidShiftAmountStart": "Ugyldig ændring. Første kapitel ville have en længde på nul eller negativt og ville blive overskrevet af andet kapitel. Udvid startvarigheden på andet kapitel.", "ToastChaptersMustHaveTitles": "Kapitler skal have titler", "ToastChaptersRemoved": "Kapitler fjernet", "ToastChaptersUpdated": "Kapitler opdateret", @@ -1002,6 +1026,7 @@ "ToastCollectionRemoveSuccess": "Samling fjernet", "ToastCollectionUpdateSuccess": "Samling opdateret", "ToastConnectionNotAvailable": "Forbindelse mislykkedes. Prøv igen senere", + "ToastCoverSearchFailed": "Cover-søgning mislykkedes", "ToastCoverUpdateFailed": "Cover opdatering fejlede", "ToastDateTimeInvalidOrIncomplete": "Dato og tid er ugyldig eller ufærdig", "ToastDeleteFileFailed": "Sletning af fil fejlede", @@ -1051,6 +1076,7 @@ "ToastMustHaveAtLeastOnePath": "Skal have mindst en sti", "ToastNameEmailRequired": "Navn og email påkrævet", "ToastNameRequired": "Navn påkrævet", + "ToastNewApiKeyUserError": "En bruger skal vælges", "ToastNewEpisodesFound": "{0} nye afsnit fundet", "ToastNewUserCreatedFailed": "Fejlede at oprette konto: \"{0}\"", "ToastNewUserCreatedSuccess": "Ny konto oprettet", @@ -1075,6 +1101,7 @@ "ToastPlaylistUpdateSuccess": "Afspilningsliste opdateret", "ToastPodcastCreateFailed": "Mislykkedes oprettelse af podcast", "ToastPodcastCreateSuccess": "Podcast oprettet med succes", + "ToastPodcastEpisodeUpdated": "Episode opdateret", "ToastPodcastGetFeedFailed": "Fejlede at hente podcast feed", "ToastPodcastNoEpisodesInFeed": "Ingen nye afsnit fundet i RSS feed", "ToastPodcastNoRssFeed": "Podcast har ingen RSS feed", @@ -1125,5 +1152,13 @@ "ToastUserPasswordChangeSuccess": "Password ændret", "ToastUserPasswordMismatch": "Passwords passer ikke sammen", "ToastUserPasswordMustChange": "Nyt password må ikke være det gamle", - "ToastUserRootRequireName": "Skal indholde et root brugernavn" + "ToastUserRootRequireName": "Skal indholde et root brugernavn", + "TooltipAddChapters": "Tilføj kapitler", + "TooltipAddOneSecond": "Tilføj 1 sekund", + "TooltipAdjustChapterStart": "Klik for at ændre starttiden", + "TooltipLockAllChapters": "Lås alle kapitler", + "TooltipLockChapter": "Lås kapitel (Shift+click for at markere flere)", + "TooltipSubtractOneSecond": "Fratag 1 sekund", + "TooltipUnlockAllChapters": "Lås alle kapitaler op", + "TooltipUnlockChapter": "Lås kapitel op (Shift+click for at markere flere)" } From dcbeecff7a14282f35a109ed156ef2620cf76c52 Mon Sep 17 00:00:00 2001 From: herny ucet Date: Sun, 11 Jan 2026 15:25:45 +0100 Subject: [PATCH 096/117] Translated using Weblate (Slovak) Currently translated at 99.7% (1160 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sk/ --- client/strings/sk.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/client/strings/sk.json b/client/strings/sk.json index e0d02898c..e9d1d4c60 100644 --- a/client/strings/sk.json +++ b/client/strings/sk.json @@ -275,7 +275,7 @@ "LabelBonus": "Bonus", "LabelBooks": "Knihy", "LabelButtonText": "Text tlačidla", - "LabelByAuthor": "od {0}", + "LabelByAuthor": "od", "LabelChangePassword": "Zmeniť heslo", "LabelChannels": "Kanály", "LabelChapterCount": "{0} kapitol", @@ -383,7 +383,7 @@ "LabelFolders": "Priečinky", "LabelFontBold": "Tučné", "LabelFontBoldness": "Hrúbka písma", - "LabelFontFamily": "Rodina písiem", + "LabelFontFamily": "Písmo", "LabelFontItalic": "Kurzíva", "LabelFontScale": "Veľkosť písma", "LabelFontStrikethrough": "Preškrtnuté", @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Skeuomorfný dizajn s drevenými poličkami", "LabelSettingsChromecastSupport": "Podpora chromecastu", "LabelSettingsDateFormat": "Formát dátumu", - "LabelSettingsEnableWatcher": "Automatické skenovanie knižníc pre zmeny", - "LabelSettingsEnableWatcherForLibrary": "Automaticky skenovať knižnicu pre zmeny", + "LabelSettingsEnableWatcher": "Automatické sledovanie zmien v knižniciach", + "LabelSettingsEnableWatcherForLibrary": "Automatické sledovanie zmien v knižnici", "LabelSettingsEnableWatcherHelp": "Povoliť automatické pridávanie/aktualizácie položiek pri zmene súborov. *Vyžaduje reštart servera", "LabelSettingsEpubsAllowScriptedContent": "Povoliť v e-knihách skriptovaný obsah", "LabelSettingsEpubsAllowScriptedContentHelp": "Povoliť e-knihám spúšťanie skriptov. Odporúča sa túto voľbu nepovolovať, pokiaľ plne nedôverujete zdrojom súborov e-kníh.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Ste si istý, že chcete resetnúť kapitoly a zahodiť zmeny, ktoré ste vykonali?", "MessageRestoreBackupConfirm": "Ste si istí, že chcete obnoviť zálohu vytvorenú", "MessageRestoreBackupWarning": "Obnovenie zálohy spôsobí kompletný prepis databázy umiestnenej v /config a obrázkov prebalov a autorov v /metadata/items a /metadata/authors.

Zálohy nemenia žiadne súbory v priečinkoch vašej knižnice. Ak ste povolili v nastaveniach servera ukladanie obrázkov prebalov a metadát v priečinkoch knižnice, tieto nie sú zálohované a teda ani prepisované.

Všetky klienti používajúci váš server budú automaticky obnovené.", - "MessageScheduleLibraryScanNote": "Pre väčšinu používateľov sa odporúča ponechať túto funkciu vypnutú a povoliť nastavenia funkcie sledovania obsahu priečinku. Funkcia sledovania priečinku bude automaticky detekovať zmeny v priečinkoch knižnice. Táto funkcia však nefunguje pre všetky súborové systémy (ako napr. NFS), v tom prípade využite funkciu plánovaného skenovania knižnice.", + "MessageScheduleLibraryScanNote": "Pre väčšinu používateľov sa odporúča nechať túto funkciu vypnutú a ponechať zapnuté nastavenie „Automatické sledovanie zmien v knižnici“ – táto funkcia automaticky zistí zmeny vo vašich priečinkoch knižnice. Túto funkciu zapnite, ak „Automatické sledovanie zmien v knižnici“ nefunguje vo vašom súborovom systéme (napr. NFS).", "MessageScheduleRunEveryWeekdayAtTime": "Spustiť každú {0} o {1}", "MessageSearchResultsFor": "Výsledky vyhľadávania pre", "MessageSelected": "{0} vybrané", @@ -1026,6 +1026,8 @@ "ToastCollectionItemsAddFailed": "Pridanie položky/-iek do zbierky zlyhalo", "ToastCollectionRemoveSuccess": "Zbierka odstránená", "ToastCollectionUpdateSuccess": "Zbierka aktualizovaná", + "ToastConnectionNotAvailable": "Pripojenie je nedostupné. Skúste to neskôr.", + "ToastCoverSearchFailed": "Vyhľadanie obalu sa nepodarilo", "ToastCoverUpdateFailed": "Aktualizácia prebalu zlyhala", "ToastDateTimeInvalidOrIncomplete": "Dátum a čas sú neplatné alebo neúplné", "ToastDeleteFileFailed": "Odstránenie súboru zlyhalo", From e55fed4a33f42d9c91043fcb4ac1510789a2d8d8 Mon Sep 17 00:00:00 2001 From: Henrik Lynge Date: Sun, 11 Jan 2026 05:32:43 +0100 Subject: [PATCH 097/117] Translated using Weblate (Danish) Currently translated at 99.9% (1162 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/da/ --- client/strings/da.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/strings/da.json b/client/strings/da.json index 0f4c24ec9..6cf517fa3 100644 --- a/client/strings/da.json +++ b/client/strings/da.json @@ -275,7 +275,7 @@ "LabelBonus": "Bonus", "LabelBooks": "Bøger", "LabelButtonText": "Knap tekst", - "LabelByAuthor": "af {0}", + "LabelByAuthor": "Efter Forfatter", "LabelChangePassword": "Ændre Adgangskode", "LabelChannels": "Kanaler", "LabelChapterCount": "{0} Kapitler", @@ -447,6 +447,7 @@ "LabelLogLevelWarn": "Advarsel", "LabelLookForNewEpisodesAfterDate": "Søg efter nye episoder efter denne dato", "LabelLowestPriority": "Laveste prioritet", + "LabelMatchConfidence": "Confidens", "LabelMatchExistingUsersBy": "Match eksisterende brugere ved", "LabelMatchExistingUsersByDescription": "Anvendt for at forbinde brugere. Når forbundet, brugere vil blive matchet ved unikt id fra din SSO udbyder", "LabelMaxEpisodesToDownload": "Max # afsnit for at downloade. Anvend 0 for ubegrænset.", From 4f8fbbc9793124c9d9e9a23a42ab00683934be5d Mon Sep 17 00:00:00 2001 From: N Visi Date: Thu, 15 Jan 2026 12:43:53 +0100 Subject: [PATCH 098/117] Translated using Weblate (Japanese) Currently translated at 22.8% (266 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/ --- client/strings/ja.json | 87 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/client/strings/ja.json b/client/strings/ja.json index 7c2acb889..28f6de6a6 100644 --- a/client/strings/ja.json +++ b/client/strings/ja.json @@ -72,6 +72,7 @@ "ButtonQueueRemoveItem": "次に再生から削除", "ButtonQuickEmbed": "クイック埋め込み", "ButtonQuickEmbedMetadata": "メタデータの埋め込み", + "ButtonQuickMatch": "クイックマッチ", "ButtonReScan": "再スキャン", "ButtonRead": "読む", "ButtonReadLess": "閉じる", @@ -80,71 +81,157 @@ "ButtonRemove": "削除", "ButtonRemoveAll": "全て削除", "ButtonRemoveAllLibraryItems": "ライブラリーの項目を全て削除", + "ButtonRemoveFromContinueListening": "「続きを聴く」から削除", + "ButtonRemoveFromContinueReading": "「続きを読む」から削除", + "ButtonRemoveSeriesFromContinueSeries": "「シリーズを続く」からシリーズを削除", "ButtonReset": "元に戻す", "ButtonResetToDefault": "デフォルトに戻す", "ButtonRestore": "復元", "ButtonSave": "保存", "ButtonSaveAndClose": "保存して閉じる", + "ButtonSaveTracklist": "トラックリストを保存", "ButtonScan": "スキャン", "ButtonScanLibrary": "ライブラリーをスキャン", "ButtonScrollLeft": "左にスクロール", "ButtonScrollRight": "右にスクロール", "ButtonSearch": "検索", + "ButtonSelectFolderPath": "保存先フォルダを選択", "ButtonSeries": "シリーズ", + "ButtonSetChaptersFromTracks": "トラックからチャプターを設定する", + "ButtonShare": "共有", + "ButtonShiftTimes": "再生時間の移動", + "ButtonShow": "表示", + "ButtonStartM4BEncode": "M4Bエンコード開始", + "ButtonStartMetadataEmbed": "メタデータ埋め込み開始", + "ButtonStats": "統計", "ButtonSubmit": "送信", + "ButtonTest": "テスト", + "ButtonUnlinkOpenId": "OpenID 連携解除", + "ButtonUpload": "アップロード", + "ButtonUploadBackup": "バックアップのアップロード", + "ButtonUploadCover": "カバー画像をアップロード", + "ButtonUploadOPMLFile": "OPMLファイルをアップロード", + "ButtonUserDelete": "ユーザーを削除 {0}", + "ButtonUserEdit": "ユーザを編集 {0}", + "ButtonViewAll": "すべて表示", "ButtonYes": "はい", + "ErrorUploadFetchMetadataAPI": "メタデータの取得中にエラーが発生しました", + "ErrorUploadFetchMetadataNoResults": "メタデータ取得に失敗しました。タイトルや著者名を更新してください", + "ErrorUploadLacksTitle": "タイトルは必須です", "HeaderAccount": "アカウント", + "HeaderAddCustomMetadataProvider": "カスタムメタデータプロバイダーを追加", "HeaderAdvanced": "上級者向け", + "HeaderApiKeys": "APIキー", + "HeaderAppriseNotificationSettings": "Apprise 通知設定", "HeaderAudioTracks": "オーディオトラック", + "HeaderAudiobookTools": "オーディオブックのファイル管理ツール", + "HeaderAuthentication": "認証", + "HeaderBackups": "バックアップ", + "HeaderBulkChapterModal": "チャプターをまとめて追加", + "HeaderChangePassword": "パスワードを変更", "HeaderChapters": "チャプター", + "HeaderChooseAFolder": "フォルダを選択", "HeaderCollection": "コレクション", "HeaderCollectionItems": "コレクションの項目", + "HeaderCover": "カバー", + "HeaderCurrentDownloads": "現在のダウンロード", + "HeaderCustomMessageOnLogin": "ログイン時のカスタムメッセージ", + "HeaderCustomMetadataProviders": "カスタムメタデータプロバイダー", "HeaderDetails": "詳細", + "HeaderDownloadQueue": "ダウンロード待ち", "HeaderEbookFiles": "電子書籍ファイル", + "HeaderEmail": "メール", + "HeaderEmailSettings": "メール設定", "HeaderEpisodes": "エピソード", + "HeaderEreaderDevices": "電子書籍リーダー端末", "HeaderEreaderSettings": "電子書籍リーダーの設定", + "HeaderFiles": "ファイル", + "HeaderFindChapters": "チャプターを検索", + "HeaderIgnoredFiles": "無視されたファイル", + "HeaderItemFiles": "アイテムファイル", + "HeaderItemMetadataUtils": "アイテムメタデータユーティリティ", + "HeaderLastListeningSession": "直近の再生セッション", "HeaderLatestEpisodes": "最新のエピソード", "HeaderLibraries": "ライブラリー", + "HeaderLibraryFiles": "ライブラリファイル", + "HeaderLibraryStats": "ライブラリ統計", + "HeaderListeningSessions": "再生セッション", + "HeaderListeningStats": "再生統計", + "HeaderLogin": "ログイン", + "HeaderLogs": "ログ", + "HeaderManageGenres": "ジャンルを管理", + "HeaderManageTags": "タグを管理", + "HeaderMapDetails": "マップの詳細", + "HeaderMatch": "マッチ", + "HeaderMetadataOrderOfPrecedence": "メタデータの優先順", + "HeaderMetadataToEmbed": "埋め込むメタデータ", + "HeaderNewAccount": "新規アカウント", + "HeaderNewApiKey": "新規APIキー", + "HeaderNewLibrary": "新規ライブラリー", + "HeaderNotificationCreate": "通知を作成", + "HeaderNotificationUpdate": "通知を更新", + "HeaderNotifications": "通知", + "HeaderOpenIDConnectAuthentication": "OpenID Connect 認証", "HeaderOpenRSSFeed": "RSS Feedを開く", "HeaderPlayerSettings": "プレーヤーの設定", "HeaderPlaylist": "プレイリスト", "HeaderPlaylistItems": "プレイリストアイテム", "HeaderRSSFeedGeneral": "RSS 詳細", + "HeaderRSSFeedIsOpen": "RSSフィードが開いています", "HeaderSettings": "設定", "HeaderSettingsGeneral": "一般", "HeaderSettingsScanner": "スキャナー", "HeaderSleepTimer": "スリープタイマー", "HeaderStatsMinutesListeningChart": "過去7日間の視聴時間(分)", + "HeaderStatsRecentSessions": "最近の再生履歴", + "HeaderTableOfContents": "目次", + "HeaderYourStats": "再生統計", "LabelAddToPlaylist": "プレイリストの追加", + "LabelAddedAt": "追加日時", + "LabelAddedDate": "追加日時 ­­{0}", + "LabelAll": "すべて", "LabelAuthor": "著者", "LabelAuthorFirstLast": "著者(名 氏)", "LabelAuthorLastFirst": "著者(氏 名)", "LabelAuthors": "著者", "LabelAutoDownloadEpisodes": "エピソードの自動ダウンロード", "LabelBooks": "ほん", + "LabelByAuthor": "著 {0}", "LabelChapters": "チャプター", "LabelClosePlayer": "プレイヤーを閉じる", + "LabelCollapseSeries": "シリーズを折りたたむ", "LabelComplete": "完了", "LabelContinueListening": "続きから聞く", + "LabelContinueReading": "続きを読む", + "LabelContinueSeries": "シリーズを続く", "LabelDescription": "説明", + "LabelDiscover": "おすすめ", "LabelDownload": "ダウンロード", "LabelDuration": "長さ", "LabelEbook": "Eブック", "LabelEbooks": "Eブック", "LabelEnable": "有効", + "LabelEnd": "終了", "LabelEndOfChapter": "チャプターの最後", "LabelEpisode": "エピソード", + "LabelExplicit": "", "LabelFeedURL": "Feed URL", "LabelFile": "ファイル", + "LabelFileBirthtime": "ファイル作成日時", + "LabelFileModified": "ファイル更新日時", "LabelFilename": "ファイル名", "LabelFinished": "完了", "LabelFolder": "フォルダ", "LabelFontBoldness": "フォントの太さ", + "LabelFontFamily": "フォントファミリー", "LabelFontScale": "フォントサイズ", "LabelGenre": "ジャンル", "LabelGenres": "ジャンル", + "LabelHasEbook": "eBookあり", + "LabelHasSupplementaryEbook": "付属eBookあり", "LabelHost": "ホスト", "LabelInProgress": "進行中", + "LabelIncomplete": "未完了", "LabelLanguage": "言語", "LabelLanguages": "言語", "LabelLayout": "レイアウト", From 7201cced4287e07dc595d01fe4176f397f7cb755 Mon Sep 17 00:00:00 2001 From: Kabika82 Date: Mon, 19 Jan 2026 13:42:10 +0100 Subject: [PATCH 099/117] Translated using Weblate (Hungarian) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/ --- client/strings/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/hu.json b/client/strings/hu.json index 574fd1c9b..1c177a09c 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -499,7 +499,7 @@ "LabelNumberOfEpisodes": "Epizódok száma", "LabelOpenIDAdvancedPermsClaimDescription": "Az OpenID-igény neve, amely a felhasználói műveletekre vonatkozó haladó jogosultságokat tartalmazza az alkalmazáson belül, és amely a nem adminisztrátori szerepkörökre vonatkozik (ha konfigurálva van). Ha az igény hiányzik a válaszból, az ABS-hez való hozzáférés megtagadásra kerül. Ha egyetlen opció hiányzik, azt false-ként fogja kezelni. Győződj meg arról, hogy az identitásszolgáltató igénye megfelel a várt struktúrának:", "LabelOpenIDClaims": "Hagyd üresen a következő opciókat, hogy letiltsd a haladó csoport- és jogosultság-hozzárendelést, ekkor automatikusan a ‘Felhasználó’ csoport kerül hozzárendelésre.", - "LabelOpenIDGroupClaimDescription": "Az OpenID-igény neve, amely a felhasználó csoportjainak listáját tartalmazza. Általában groups néven hivatkoznak rá. Ha konfigurálva van, az alkalmazás automatikusan hozzárendeli a szerepköröket a felhasználó csoporttagságai alapján, feltéve, hogy ezek a csoportok az igényben kis- és nagybetűkre érzéketlenül ‘admin’, ‘user’ vagy ‘guest’ néven szerepelnek. Az igénynek egy listát kell tartalmaznia, és ha egy felhasználó több csoport tagja, az alkalmazás a legmagasabb szintű hozzáféréssel rendelkező szerepkört rendeli hozzá. Ha egyetlen csoport sem felel meg, a hozzáférés megtagadásra kerül.", + "LabelOpenIDGroupClaimDescription": "Az OpenID-igény neve, amely a felhasználó csoportjainak listáját tartalmazza. Általában groups néven hivatkoznak rá. Ha konfigurálva van, az alkalmazás automatikusan hozzárendeli a szerepköröket a felhasználó csoporttagságai alapján, feltéve, hogy ezek a csoportok az igényben kis- és nagybetűkre érzéketlenül ‘admin’, ‘user’ vagy ‘guest’ néven szerepelnek. Az igénynek egy listát kell tartalmaznia, és ha egy felhasználó több csoport tagja, az alkalmazás a legmagasabb szintű hozzáféréssel rendelkező szerepkört rendeli hozzá. Ha egyetlen csoport sem felel meg, a hozzáférés megtagadásra kerül.", "LabelOpenRSSFeed": "RSS hírcsatorna megnyitása", "LabelOverwrite": "Felülírás", "LabelPaginationPageXOfY": "{0} oldal {1}-ból/ből", From d08cef11edd448fe60212b975599a0fe6184c9a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej?= <20731216+Jarsey45@users.noreply.github.com> Date: Mon, 26 Jan 2026 15:30:11 +0100 Subject: [PATCH 100/117] Translated using Weblate (Polish) Currently translated at 94.5% (1100 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 68 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index 8b70a1341..c50ebe85e 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -915,10 +915,16 @@ "MessageTaskNoFilesToScan": "Brak plików do skanowania", "MessageTaskOpmlImport": "Importuj OPML", "MessageTaskOpmlImportDescription": "Tworzenie {0} podcastów z kanałów RSS", + "MessageTaskOpmlImportFeedPodcastDescription": "Tworzenie podcastu \"{0}\"", + "MessageTaskOpmlImportFeedPodcastExists": "Podcast już istnieje pod podaną ścieżką", + "MessageTaskOpmlImportFeedPodcastFailed": "Nie udało się utworzyć podcastu", + "MessageTaskOpmlImportFinished": "Dodano {0} podcastów", + "MessageTaskOpmlParseFailed": "Błąd parsowania pliku OPML", "MessageTaskScanItemsAdded": "Dodano {0}", "MessageTaskScanItemsMissing": "Brakuje {0}", "MessageTaskScanItemsUpdated": "Zaktualizowano {0}", "MessageTaskScanNoChangesNeeded": "Brak zmian", + "MessageTaskScanningLibrary": "Skanowanie biblioteki \"{0}\"", "MessageTaskTargetDirectoryNotWritable": "Brak prawa zapisu do folderu docelowego", "MessageThinking": "Myślę...", "MessageUploaderItemFailed": "Nie udało się przesłać", @@ -937,6 +943,7 @@ "NoteUploaderFoldersWithMediaFiles": "Foldery z plikami multimedialnymi będą traktowane jako osobne elementy w bibliotece.", "NoteUploaderOnlyAudioFiles": "Jeśli przesyłasz tylko pliki audio, każdy plik audio będzie traktowany jako osobny audiobook.", "NoteUploaderUnsupportedFiles": "Nieobsługiwane pliki są ignorowane. Podczas dodawania folderu, inne pliki, które nie znajdują się w folderze elementu, są ignorowane.", + "NotificationOnTestDescription": "Zdarzenie używane do testowania systemu powiadomień", "PlaceholderNewCollection": "Nowa nazwa kolekcji", "PlaceholderNewFolderPath": "Nowa ścieżka folderu", "PlaceholderNewPlaylist": "Nowa nazwa playlisty", @@ -957,26 +964,50 @@ "StatsTopMonth": "TOPOWY MIESIĄC", "StatsTopNarrator": "TOPOWY NARRATOR", "StatsTopNarrators": "TOPOWI NARRATORZY", + "StatsTotalDuration": "O sumarycznej długości…", "StatsYearInReview": "PRZEGLĄD ROKU", "ToastAccountUpdateSuccess": "Zaktualizowano konto", + "ToastAsinRequired": "ASIN jest wymagany", "ToastAuthorImageRemoveSuccess": "Zdjęcie autora usunięte", + "ToastAuthorNotFound": "Autor \"{0}\" nie został znaleziony", + "ToastAuthorRemoveSuccess": "Autor usunięty", + "ToastAuthorSearchNotFound": "Autor nie odnaleziony", "ToastAuthorUpdateMerged": "Autor scalony", "ToastAuthorUpdateSuccess": "Autor zaktualizowany", "ToastAuthorUpdateSuccessNoImageFound": "Autor zaktualizowany (nie znaleziono obrazu)", + "ToastBackupAppliedSuccess": "Kopia zapasowa została przywrócona", "ToastBackupCreateFailed": "Nie udało się utworzyć kopii zapasowej", "ToastBackupCreateSuccess": "Utworzono kopię zapasową", "ToastBackupDeleteFailed": "Nie udało się usunąć kopii zapasowej", "ToastBackupDeleteSuccess": "Udało się usunąć kopie zapasowej", + "ToastBackupInvalidMaxKeep": "Nieprawidłowa ilość kopii zapasowych do przechowania", + "ToastBackupInvalidMaxSize": "Nieprawidłowy rozmiar maksymalny kopii zapasowej", "ToastBackupRestoreFailed": "Nie udało się przywrócić kopii zapasowej", "ToastBackupUploadFailed": "Nie udało się przesłać kopii zapasowej", "ToastBackupUploadSuccess": "Kopia zapasowa została przesłana", - "ToastBatchUpdateFailed": "Aktualizacja wsadowa nie powiodła się", - "ToastBatchUpdateSuccess": "Aktualizacja wsadowa powiodła się", + "ToastBatchDeleteFailed": "Usuwanie zbiorcze nie powiodło się", + "ToastBatchDeleteSuccess": "Usuwanie zbiorcze powiodło się", + "ToastBatchUpdateFailed": "Aktualizacja zbiorcza nie powiodła się", + "ToastBatchUpdateSuccess": "Aktualizacja zbiorcza powiodła się", "ToastBookmarkCreateFailed": "Nie udało się utworzyć zakładki", "ToastBookmarkCreateSuccess": "Dodano zakładkę", "ToastBookmarkRemoveSuccess": "Zakładka została usunięta", + "ToastBulkChapterInvalidCount": "Wprowadź liczbę z przedziału od 1 do 150", + "ToastCachePurgeFailed": "Nie udało się wyczyścić pamięci cache", + "ToastCachePurgeSuccess": "Wyczyszczono pamięć cache", + "ToastChapterLocked": "Rozdział jest zablokowany.", + "ToastChapterStartTimeAdjusted": "Czas rozpoczęcia rozdziału przesunięty o \"{0}\" sekund", + "ToastChaptersAllLocked": "Wszystkie rozdziały są zablokowane. Odblokuj edycję, aby użyć przesunięcia czasowego.", + "ToastChaptersHaveErrors": "Rozdziały posiadają błędy", + "ToastChaptersInvalidShiftAmountLast": "Niepoprawna wartość przesunięcia. Czas rozpoczęcia ostatniego rozdziału wykroczyłby poza długość tego audiobooka.", + "ToastChaptersInvalidShiftAmountStart": "Niepoprawna wartość przesunięcia. Pierwszy rozdział miałby długość mniejszą lub równą zeru oraz on zostałby nadpisany przez rozdział drugi. Ustaw późniejszy czas rozpoczęcia drugiego rozdziału.", + "ToastChaptersMustHaveTitles": "Rozdziały muszą posiadać tytuł", + "ToastChaptersRemoved": "Rozdziały usunięte", + "ToastChaptersUpdated": "Rozdziały zaktualizowane", + "ToastCollectionItemsAddFailed": "Dodanie elementów do kolekcji nie powiodło się", "ToastCollectionRemoveSuccess": "Kolekcja usunięta", "ToastCollectionUpdateSuccess": "Zaktualizowano kolekcję", + "ToastConnectionNotAvailable": "Brak połączenia. Spróbuj ponownie później", "ToastCoverSearchFailed": "Nieudane wyszukiwanie okładki", "ToastCoverUpdateFailed": "Nieudana aktualizacja okładki", "ToastDateTimeInvalidOrIncomplete": "Niepoprawna data i czas", @@ -993,6 +1024,8 @@ "ToastInvalidUrl": "Nieprawidłowy URL", "ToastInvalidUrls": "Jeden lub więcej URL-i są nieprawidłowe", "ToastItemCoverUpdateSuccess": "Zaktualizowano okładkę", + "ToastItemDeletedFailed": "Nie udało się usunąć elementu", + "ToastItemDeletedSuccess": "Element usunięty", "ToastItemDetailsUpdateSuccess": "Zaktualizowano szczegóły", "ToastItemMarkedAsFinishedFailed": "Nie udało się oznaczyć jako ukończone", "ToastItemMarkedAsFinishedSuccess": "Pozycja oznaczona jako ukończona", @@ -1031,12 +1064,41 @@ "ToastRSSFeedCloseSuccess": "Zamknięcie kanału RSS powiodło się", "ToastRemoveItemFromCollectionFailed": "Nie udało się usunąć elementu z kolekcji", "ToastRemoveItemFromCollectionSuccess": "Pozycja usunięta z kolekcji", + "ToastRemoveItemsWithIssuesFailed": "Nie udało się usunąć wadliwych elementów z biblioteki", + "ToastRemoveItemsWithIssuesSuccess": "Usunięto wadliwe elementy z biblioteki", + "ToastRenameFailed": "Nie udało się zmienić nazwy", + "ToastRescanFailed": "Ponowne skanowanie nie powiodło się dla {0}", + "ToastRescanRemoved": "Ponowne skanowanie powiodło się – element został usunięty", + "ToastRescanUpToDate": "Ponowne skanowanie powiodło się – element był aktualny", + "ToastRescanUpdated": "Ponowne skanowanie powiodło się – element został zaktualizowany", + "ToastScanFailed": "Nie powiódł się skan elementu biblioteki", + "ToastSelectAtLeastOneUser": "Zaznacz co najmniej jednego użytkownika", "ToastSendEbookToDeviceFailed": "Failed to Send Ebook to device", + "ToastSendEbookToDeviceSuccess": "Ebook wysłany na urządzenie \"{0}\"", + "ToastSeriesSubmitFailedSameName": "Nie można dodać dwóch serii pod tą samą nazwą", + "ToastSeriesUpdateFailed": "Aktualizacja serii nie powiodła się", + "ToastSeriesUpdateSuccess": "Aktualizacja serii powiodła się", + "ToastServerSettingsUpdateSuccess": "Zaktualizowano ustawienia serwera", + "ToastSessionCloseFailed": "Nie udało się zamknąć sesji", "ToastSessionDeleteFailed": "Nie udało się usunąć sesji", "ToastSessionDeleteSuccess": "Sesja usunięta", + "ToastSleepTimerDone": "Słodkich snów... zZzzZz", "ToastSocketConnected": "Nawiązano połączenie z serwerem", "ToastSocketDisconnected": "Połączenie z serwerem zostało zamknięte", "ToastSocketFailedToConnect": "Poączenie z serwerem nie powiodło się", + "ToastTitleRequired": "Tytuł jest wymagany", + "ToastUnknownError": "Nieznany błąd", + "ToastUnlinkOpenIdFailed": "Nie udało się odpiąć użytkownika z OpenID", + "ToastUnlinkOpenIdSuccess": "Użytkownik odpięty z OpenID", + "ToastUploaderFilepathExistsError": "Ścieżka \"{0}\" już istnieje na serwerze", "ToastUserDeleteFailed": "Nie udało się usunąć użytkownika", - "ToastUserDeleteSuccess": "Użytkownik usunięty" + "ToastUserDeleteSuccess": "Użytkownik usunięty", + "TooltipAddChapters": "Dodaj rozdział(y)", + "TooltipAddOneSecond": "Dodaj sekundę", + "TooltipAdjustChapterStart": "Kliknij, aby skorygować czas początkowy", + "TooltipLockAllChapters": "Zablokuj wszystkie rozdziały", + "TooltipLockChapter": "Zablokuj rozdział (przytrzymaj Shift i kliknij, aby zaznaczyć zakres)", + "TooltipSubtractOneSecond": "Odejmij sekundę", + "TooltipUnlockAllChapters": "Odblokuj wszystkie rozdziały", + "TooltipUnlockChapter": "Odblokuj rozdział (przytrzymaj Shift i kliknij, aby zaznaczyć zakres)" } From 87f376629927b381620bf8eeb484c8592fea1ce2 Mon Sep 17 00:00:00 2001 From: Mantas Date: Fri, 30 Jan 2026 00:08:32 +0100 Subject: [PATCH 101/117] Translated using Weblate (Lithuanian) Currently translated at 59.9% (697 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/lt/ --- client/strings/lt.json | 1 + 1 file changed, 1 insertion(+) diff --git a/client/strings/lt.json b/client/strings/lt.json index b5ca66630..2480cdf35 100644 --- a/client/strings/lt.json +++ b/client/strings/lt.json @@ -1,5 +1,6 @@ { "ButtonAdd": "Pridėti", + "ButtonAddApiKey": "Pridėti API raktą", "ButtonAddChapters": "Pridėti skyrius", "ButtonAddDevice": "Pridėti įrenginį", "ButtonAddLibrary": "Pridėti Biblioteką", From 1f3fa80ddd78a929958cf8714288b92b88d38e30 Mon Sep 17 00:00:00 2001 From: Samuel Guerrero Date: Fri, 30 Jan 2026 22:56:07 +0100 Subject: [PATCH 102/117] Translated using Weblate (Spanish) Currently translated at 97.5% (1134 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/es/ --- client/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/es.json b/client/strings/es.json index 4a611b3de..73ec1cd2d 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -275,7 +275,7 @@ "LabelBonus": "Bonus", "LabelBooks": "Libros", "LabelButtonText": "Texto del botón", - "LabelByAuthor": "por {0}", + "LabelByAuthor": "por", "LabelChangePassword": "Cambiar contraseña", "LabelChannels": "Canales", "LabelChapterCount": "{0} capítulos", From 6c7221d37d781a44d67ba8044e11993e82dfce01 Mon Sep 17 00:00:00 2001 From: dv4yGY2U Date: Fri, 30 Jan 2026 23:31:49 +0100 Subject: [PATCH 103/117] Translated using Weblate (Turkish) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/tr/ --- client/strings/tr.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/strings/tr.json b/client/strings/tr.json index af64a618d..770521cb8 100644 --- a/client/strings/tr.json +++ b/client/strings/tr.json @@ -275,7 +275,7 @@ "LabelBonus": "Bonus", "LabelBooks": "Kitaplar", "LabelButtonText": "Buton Metni", - "LabelByAuthor": "Yazar: {0}", + "LabelByAuthor": "{0} tarafından", "LabelChangePassword": "Şifreyi Değiştir", "LabelChannels": "Kanallar", "LabelChapterCount": "{0} Bölüm", @@ -383,7 +383,7 @@ "LabelFolders": "Klasörler", "LabelFontBold": "Kalın", "LabelFontBoldness": "Yazı Tipi Kalınlığı", - "LabelFontFamily": "Yazı Tipi Ailesi", + "LabelFontFamily": "Yazı tipi ailesi", "LabelFontItalic": "İtalik", "LabelFontScale": "Yazı Tipi Ölçeği", "LabelFontStrikethrough": "Üstü Çizili", @@ -588,8 +588,8 @@ "LabelSettingsBookshelfViewHelp": "Ahşap raflı skeuomorfik tasarım", "LabelSettingsChromecastSupport": "Chromecast desteği", "LabelSettingsDateFormat": "Tarih Formatı", - "LabelSettingsEnableWatcher": "Değişiklikler için kütüphaneleri otomatik olarak tara", - "LabelSettingsEnableWatcherForLibrary": "Değişiklikler için kütüphaneyi otomatik olarak tara", + "LabelSettingsEnableWatcher": "Kütüphanelerdeki değişiklikleri otomatik olarak izle", + "LabelSettingsEnableWatcherForLibrary": "Kütüphanedeki değişiklikleri otomatik olarak izle", "LabelSettingsEnableWatcherHelp": "Dosya değişiklikleri algılandığında öğelerin otomatik olarak eklenmesini/güncellenmesini sağlar. *Sunucunun yeniden başlatılmasını gerektirir", "LabelSettingsEpubsAllowScriptedContent": "Epub'larda betiklenmiş içeriğe izin ver", "LabelSettingsEpubsAllowScriptedContentHelp": "Epub dosyalarının betik çalıştırmasına izin verin. Epub dosyalarının kaynağına güvenmiyorsanız bu ayarı devre dışı bırakmanız önerilir.", @@ -888,7 +888,7 @@ "MessageResetChaptersConfirm": "Bölümleri sıfırlamak ve yaptığınız değişiklikleri geri almak istediğinizden emin misiniz?", "MessageRestoreBackupConfirm": "Şu tarihte oluşturulan yedeği geri yüklemek istediğinizden emin misiniz", "MessageRestoreBackupWarning": "Bir yedeği geri yüklemek, /config konumundaki tüm veritabanının ve /metadata/items & /metadata/authors içindeki kapak resimlerinin üzerine yazacaktır.

Yedekler, kütüphane klasörlerinizdeki hiçbir dosyayı değiştirmez. Sunucu ayarlarını kütüphane klasörlerinizde kapak resmi ve üst veri saklamak için etkinleştirdiyseniz, bunlar yedeklenmez veya üzerine yazılmaz.

Sunucunuzu kullanan tüm istemciler otomatik olarak yenilenecektir.", - "MessageScheduleLibraryScanNote": "Çoğu kullanıcı için, bu özelliği devre dışı bırakıp klasör izleyici ayarını etkin tutmaları önerilir. Klasör izleyici, kütüphane klasörlerinizdeki değişiklikleri otomatik olarak algılayacaktır. Klasör izleyici her dosya sistemi için (NFS gibi) çalışmaz, bu nedenle bunun yerine zamanlanmış kütüphane taramaları kullanılabilir.", + "MessageScheduleLibraryScanNote": "Çoğu kullanıcı için bu ayarı pasif bırakması ve \"Kütüphanedeki değişiklikleri otomatik olarak izle\" seçeneğini aktif etmesi önerilir. O seçenek kütüphane dizinlerindeki herhangi bir değişikliği otomatik olarak tespit edecektir. Eğer dosya sisteminiz \"Kütüphanedeki değişiklikleri otomatik olarak izle\" yöntemini desteklemiyorsa (örn; NFS dosya sistemi) bu özelliği aktif edebilirsiniz.", "MessageScheduleRunEveryWeekdayAtTime": "Her {0} günü saat {1}'de çalıştır", "MessageSearchResultsFor": "Arama sonuçları", "MessageSelected": "{0} seçildi", From e7cb0466e6678f81ccddd6396623a19251607292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ku=C5=BAnicki?= Date: Mon, 2 Feb 2026 07:04:06 +0100 Subject: [PATCH 104/117] Translated using Weblate (Polish) Currently translated at 94.5% (1100 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/ --- client/strings/pl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index c50ebe85e..3a9593db0 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -437,8 +437,8 @@ "LabelLibraryItem": "Element biblioteki", "LabelLibraryName": "Nazwa biblioteki", "LabelLibrarySortByProgress": "Postęp: Ostatnio zaktualizowane", - "LabelLibrarySortByProgressFinished": "Postęp: Ukończone", - "LabelLibrarySortByProgressStarted": "Postęp: Rozpoczęte", + "LabelLibrarySortByProgressFinished": "Postęp: Ukończony", + "LabelLibrarySortByProgressStarted": "Postęp: Rozpoczęty", "LabelLimit": "Limit", "LabelLineSpacing": "Odstęp między wierszami", "LabelListenAgain": "Słuchaj ponownie", From 6e5feee78ad43a709f93b45d43acdcaf930abd76 Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Sun, 1 Feb 2026 08:13:41 +0100 Subject: [PATCH 105/117] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 64c41619e..14c70cb10 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -436,9 +436,9 @@ "LabelLibraryFilterSublistEmpty": "没有 {0}", "LabelLibraryItem": "媒体库项目", "LabelLibraryName": "媒体库名称", - "LabelLibrarySortByProgress": "收听进度: 上次收听时间", - "LabelLibrarySortByProgressFinished": "收听进度: 已完成的", - "LabelLibrarySortByProgressStarted": "收听进度: 已开始的", + "LabelLibrarySortByProgress": "进度: 上次更新", + "LabelLibrarySortByProgressFinished": "进度: 已完成", + "LabelLibrarySortByProgressStarted": "进度: 已开始", "LabelLimit": "限制", "LabelLineSpacing": "行间距", "LabelListenAgain": "再次收听", From b8942c59319911a5edffdba1d46464b9e80e636a Mon Sep 17 00:00:00 2001 From: enosh Date: Sun, 1 Feb 2026 15:02:25 +0100 Subject: [PATCH 106/117] Translated using Weblate (Hebrew) Currently translated at 81.4% (947 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/he/ --- client/strings/he.json | 102 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-) diff --git a/client/strings/he.json b/client/strings/he.json index 0efc1ec9c..786683a5d 100644 --- a/client/strings/he.json +++ b/client/strings/he.json @@ -81,7 +81,7 @@ "ButtonRemove": "הסר", "ButtonRemoveAll": "הסר הכל", "ButtonRemoveAllLibraryItems": "הסר את כל פריטי הספרייה", - "ButtonRemoveFromContinueListening": "הסר מ- המשך האזנה", + "ButtonRemoveFromContinueListening": "הסר מ״המשך האזנה״", "ButtonRemoveFromContinueReading": "הסר מ- המשך קריאה", "ButtonRemoveSeriesFromContinueSeries": "הסר סדרה מ- המשך סדרה", "ButtonReset": "איפוס", @@ -121,6 +121,7 @@ "HeaderAccount": "חשבון", "HeaderAddCustomMetadataProvider": "הוסף ספק מטא-נתונים מותאם אישית", "HeaderAdvanced": "מתקדם", + "HeaderApiKeys": "מפתחות API", "HeaderAppriseNotificationSettings": "הגדרות התראות של Apprise", "HeaderAudioTracks": "רצועות קול", "HeaderAudiobookTools": "כלים לניהול קבצי ספרים קוליים", @@ -165,6 +166,7 @@ "HeaderMetadataOrderOfPrecedence": "סדר העדפת מטא-נתונים", "HeaderMetadataToEmbed": "מטא-נתונים להטמעה", "HeaderNewAccount": "חשבון חדש", + "HeaderNewApiKey": "מפתח API חדש", "HeaderNewLibrary": "ספרייה חדשה", "HeaderNotificationCreate": "צור התראה", "HeaderNotificationUpdate": "עדכון התראה", @@ -210,6 +212,7 @@ "HeaderTableOfContents": "תוכן עניינים", "HeaderTools": "כלים", "HeaderUpdateAccount": "עדכן חשבון", + "HeaderUpdateApiKey": "עדכן מפתח API", "HeaderUpdateAuthor": "עדכן יוצר", "HeaderUpdateDetails": "עדכן פרטים", "HeaderUpdateLibrary": "עדכן ספרייה", @@ -239,7 +242,10 @@ "LabelAllUsersExcludingGuests": "כל המשתמשים, ללא אורחים", "LabelAllUsersIncludingGuests": "כל המשתמשים כולל אורחים", "LabelAlreadyInYourLibrary": "כבר קיים בספרייה שלך", + "LabelApiKeyCreated": "מפתח API ״{0}״ נוצר בהצלחה.", + "LabelApiKeyCreatedDescription": "אנא העתק את מפתח ה־API כעת, לא ניתן יהיה להציגו שוב.", "LabelApiKeyUser": "פעל בשם המשתמש", + "LabelApiKeyUserDescription": "למפתח ה־API יהיו הרשאות זהות למשתמש שעל שמו הוא פועל. ביומני הרישום (logs), הפעולות יופיעו כאילו בוצעו על ידי המשתמש עצמו.", "LabelApiToken": "טוקן API", "LabelAppend": "הוסף לסוף", "LabelAudioBitrate": "קצב סיביות (לדוגמא 128k)", @@ -289,6 +295,7 @@ "LabelContinueListening": "המשך האזנה", "LabelContinueReading": "המשך קריאה", "LabelContinueSeries": "המשך סדרה", + "LabelCorsAllowed": "מקורות CORS מורשים", "LabelCover": "כריכה", "LabelCoverImageURL": "כתובת התמונה ברשת", "LabelCoverProvider": "ספק כריכה", @@ -302,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "מחיקה מהמערכת הקבצים (הסר סימון למחיקה רק ממסד הנתונים)", "LabelDescription": "תיאור", "LabelDeselectAll": "הסר בחירת כל הפריטים", + "LabelDetectedPattern": "תבנית שזוהתה:", "LabelDevice": "התקן", "LabelDeviceInfo": "מידע על התקן", "LabelDeviceIsAvailableTo": "התקן זמין ל...", @@ -351,6 +359,10 @@ "LabelExample": "דוגמה", "LabelExpandSeries": "הרחב סדרה", "LabelExpandSubSeries": "הרחב תת סדרה", + "LabelExpired": "פג תוקף", + "LabelExpiresAt": "יפוג בתאריך", + "LabelExpiresInSeconds": "יפוג בעוד (שניות)", + "LabelExpiresNever": "ללא הגבלת זמן", "LabelExplicit": "מפורש", "LabelExplicitChecked": "בוטה (מסומן)", "LabelExplicitUnchecked": "לא בוטה (לא מסומן)", @@ -366,6 +378,7 @@ "LabelFilterByUser": "סינון לפי משתמש", "LabelFindEpisodes": "מצא פרקים", "LabelFinished": "הושלם", + "LabelFinishedDate": "הושלם {0}", "LabelFolder": "תיקייה", "LabelFolders": "תיקיות", "LabelFontBold": "מודגש", @@ -410,6 +423,7 @@ "LabelLanguages": "שפות", "LabelLastBookAdded": "הספר האחרון שנוסף", "LabelLastBookUpdated": "הספר האחרון שעודכן", + "LabelLastProgressDate": "התקדמות אחרונה: {0}", "LabelLastSeen": "נראה לאחרונה", "LabelLastTime": "הזמן האחרון", "LabelLastUpdate": "עדכון אחרון", @@ -422,6 +436,9 @@ "LabelLibraryFilterSublistEmpty": "לא {0}", "LabelLibraryItem": "פריט ספרייה", "LabelLibraryName": "שם הספרייה", + "LabelLibrarySortByProgress": "התקדמות: עודכן לאחרונה", + "LabelLibrarySortByProgressFinished": "התקדמות: הושלם", + "LabelLibrarySortByProgressStarted": "התקדמות: הותחל", "LabelLimit": "מגבלה", "LabelLineSpacing": "מרווח שורה", "LabelListenAgain": "האזן שוב", @@ -430,6 +447,7 @@ "LabelLogLevelWarn": "אזהרה", "LabelLookForNewEpisodesAfterDate": "חפש פרקים חדשים לאחר תאריך זה", "LabelLowestPriority": "העדיפות הנמוכה ביותר", + "LabelMatchConfidence": "רמת ודאות", "LabelMatchExistingUsersBy": "התאם משתמשים קיימים לפי", "LabelMatchExistingUsersByDescription": "משמש לחיבור משתמשים קיימים. לאחר החיבור, המשתמשים יותאמו לפי זיהוי ייחודי מספק ה-SSO שלך", "LabelMaxEpisodesToDownload": "מספר פרקים מקסימלי להורדה. 0 - ללא הגבלה.", @@ -459,7 +477,9 @@ "LabelNewestAuthors": "הסופרים האחרונים", "LabelNewestEpisodes": "הפרקים החדשים ביותר", "LabelNextBackupDate": "תאריך הגיבוי הבא", + "LabelNextChapters": "הפרקים הבא יהיו:", "LabelNextScheduledRun": "הרצה מתוזמנת הבאה", + "LabelNoApiKeys": "אין מפתחות API", "LabelNoCustomMetadataProviders": "אין ספקי מטא-נתונים מותאמים אישית", "LabelNoEpisodesSelected": "לא נבחרו פרקים", "LabelNotFinished": "לא הושלם", @@ -475,16 +495,21 @@ "LabelNotificationsMaxQueueSize": "גודל התור המרבי לאירועי התראה", "LabelNotificationsMaxQueueSizeHelp": "האירועים מוגבלים לשליחה אחת לשנייה. האירועים יתעלמו אם התור מלא. הגדרה זו נועדה למנוע ספאם התראות.", "LabelNumberOfBooks": "מספר הספרים", + "LabelNumberOfChapters": "מספר הפרקים:", "LabelNumberOfEpisodes": "# פרקים", "LabelOpenIDAdvancedPermsClaimDescription": "שם OpenID claim המכילה הרשאות מתקדמות לפעולות משתמש בתוך האפליקציה, אשר יחולו על תפקידים שאינם מנהלי מערכת (אם הוגדרה). אם התביעה חסרה בתגובה, הגישה ל-ABS תידחה. אם אפשרות אחת חסרה, היא תטופל כ-false יש לוודא שטענת ספק הזהויות תואמת את המבנה הצפוי:", "LabelOpenIDClaims": "השאר את האפשרויות הבאות ריקות כדי להשבית הקצאת קבוצות והרשאות מתקדמת, ולאחר מכן להקצות אוטומטית את קבוצת 'משתמש'.", + "LabelOpenIDGroupClaimDescription": "שם ה־OpenID claim המכיל את רשימת הקבוצות של המשתמש. בדרך כלל נקרא groups. אם הוגדרה, האפליקציה תקצה תפקידים באופן אוטומטי על סמך השיוך לקבוצות, בתנאי ששמות הקבוצות ב־claim הם 'admin', 'user' או 'guest' (ללא רגישות לרישיות - Case-insensitive). ה־claim צריך להכיל רשימה; אם המשתמש משויך למספר קבוצות, האפליקציה תקצה את התפקיד בעל רמת הגישה הגבוהה ביותר. במידה ולא נמצאה קבוצה תואמת, הגישה תיחסם.", "LabelOpenRSSFeed": "פתח ערוץ RSS", "LabelOverwrite": "לשכפל", + "LabelPaginationPageXOfY": "עמוד {0} מתוך {1}", "LabelPassword": "סיסמה", "LabelPath": "נתיב", + "LabelPermanent": "קבוע", "LabelPermissionsAccessAllLibraries": "ניתן לגשת לכל הספריות", "LabelPermissionsAccessAllTags": "ניתן לגשת לכל התגיות", "LabelPermissionsAccessExplicitContent": "ניתן לגשת לתוכן בוטה", + "LabelPermissionsCreateEreader": "ניתן ליצור קורא ספרים דיגיטלי", "LabelPermissionsDelete": "מותר למחוק", "LabelPermissionsDownload": "מותר להוריד", "LabelPermissionsUpdate": "מותר לעדכן", @@ -492,6 +517,8 @@ "LabelPersonalYearReview": "השנה שלך בסקירה ({0})", "LabelPhotoPathURL": "נתיב/URL לתמונה", "LabelPlayMethod": "שיטת הפעלה", + "LabelPlaybackRateIncrementDecrement": "שיעור הגדלה/הפחתה של מהירות ההשמעה", + "LabelPlayerChapterNumberMarker": "{0} מתוך {1}", "LabelPlaylists": "רשימות השמעה", "LabelPodcast": "פודקאסט", "LabelPodcastSearchRegion": "אזור חיפוש פודקאסט", @@ -503,10 +530,14 @@ "LabelPrimaryEbook": "ספר אלקטרוני ראשי", "LabelProgress": "התקדמות", "LabelProvider": "ספק", + "LabelProviderAuthorizationValue": "ערך כותרת האימות (Authorization Header)", "LabelPubDate": "תאריך פרסום", "LabelPublishYear": "שנת הפרסום", "LabelPublishedDate": "פורסם {0}", + "LabelPublishedDecade": "עשור פרסום", + "LabelPublishedDecades": "עשורי פרסום", "LabelPublisher": "מוציא לאור", + "LabelPublishers": "מוצאים לאור", "LabelRSSFeedCustomOwnerEmail": "אימייל בעלים מותאם אישית", "LabelRSSFeedCustomOwnerName": "שם בעלים מותאם אישית", "LabelRSSFeedOpen": "ערוץ RSS פתוח", @@ -514,6 +545,7 @@ "LabelRSSFeedSlug": "Slug של ערוץ ה-RSS", "LabelRSSFeedURL": "כתובת ערוץ ה-RSS", "LabelRandomly": "באופן אקראי", + "LabelReAddSeriesToContinueListening": "הוסף סדרה בחזרה אל ״המשך האזנה״", "LabelRead": "קריאה", "LabelReadAgain": "קרא שוב", "LabelReadEbookWithoutProgress": "קרא/י ספר אלקטרוני ללא שמירת התקדמות", @@ -523,29 +555,44 @@ "LabelRedo": "עשה שוב", "LabelRegion": "אזור", "LabelReleaseDate": "תאריך הוצאה לאור", + "LabelRemoveAllMetadataAbs": "הסר את כל קבצי metadata.abs", + "LabelRemoveAllMetadataJson": "הסר את כל קבצי metadata.json", + "LabelRemoveAudibleBranding": "הסר פתיח וסיום של Audible מהפרקים", "LabelRemoveCover": "הסר כריכה", + "LabelRemoveMetadataFile": "הסר קבצי מטא־נתונים מתיקיות הפריטים בספרייה", + "LabelRemoveMetadataFileHelp": "הסר את כל קבצי metadata.json ו־metadata.abs מתיקיות {0}.", "LabelRowsPerPage": "שורות לעמוד", "LabelSearchTerm": "מונח חיפוש", "LabelSearchTitle": "כותרת חיפוש", "LabelSearchTitleOrASIN": "כותרת חיפוש או ASIN", "LabelSeason": "עונה", + "LabelSeasonNumber": "עונה #{0}", + "LabelSelectAll": "בחר הכל", "LabelSelectAllEpisodes": "בחר את כל הפרקים", "LabelSelectEpisodesShowing": "בחר {0} פרקים המוצגים", + "LabelSelectUser": "בחר משתמש", "LabelSelectUsers": "בחר משתמשים", "LabelSendEbookToDevice": "שלח ספר אלקטרוני ל...", "LabelSequence": "רצף", + "LabelSerial": "מספר סידורי", "LabelSeries": "סדרה", "LabelSeriesName": "שם הסדרה", "LabelSeriesProgress": "התקדמות בסדרה", + "LabelServerLogLevel": "רמת פירוט יומני הרישום", "LabelServerYearReview": "השנה בסקירה של השרת ({0})", "LabelSetEbookAsPrimary": "קבע כראשי", "LabelSetEbookAsSupplementary": "קבע כמשלים", + "LabelSettingsAllowIframe": "אפשר הטמעה בתוך iframe", "LabelSettingsAudiobooksOnly": "רק ספרי קול", "LabelSettingsAudiobooksOnlyHelp": "הפעלת ההגדרה הזו תתעלם מקבצי ספרים אלקטרוניים אלא אם כן הם נמצאים בתיקיית ספרי קול, שבמקרה זה יקבעו כספרים אלקטרוניים נלווים", "LabelSettingsBookshelfViewHelp": "עיצוב סקאומורפי עם מדפי עץ", "LabelSettingsChromecastSupport": "תמיכה ב-Chromecast", "LabelSettingsDateFormat": "פורמט תאריך", + "LabelSettingsEnableWatcher": "הפעל מעקב שינויים בספריות", + "LabelSettingsEnableWatcherForLibrary": "הפעל מעקב שינויים בספרייה", "LabelSettingsEnableWatcherHelp": "מאפשר הוספת/עדכון אוטומטי של פריטים כאשר שינויי קבצים זוהים. *דורש איתחול שרת", + "LabelSettingsEpubsAllowScriptedContent": "אפשור תוכן הכולל סקריפטים ב־ePubs", + "LabelSettingsEpubsAllowScriptedContentHelp": "אפשר לקובצי EPUB להריץ סקריפטים. מומלץ להשאיר את ההגדרה כבויה, אלא אם כן מקור קובצי ה־ePub מהימן.", "LabelSettingsExperimentalFeatures": "תכונות ניסיוניות", "LabelSettingsExperimentalFeaturesHelp": "תכונות בפיתוח שדורשות משובך ובדיקה. לחץ לפתיחת דיון ב-GitHub.", "LabelSettingsFindCovers": "מצא כריכות", @@ -554,7 +601,8 @@ "LabelSettingsHideSingleBookSeriesHelp": "סדרות הכוללות ספר אחד יוסתרו מדף הסדרות ומדף הבית.", "LabelSettingsHomePageBookshelfView": "השתמש בתצוגת מדף בדף הבית", "LabelSettingsLibraryBookshelfView": "השתמש בתצוגת מדף בספרייה", - "LabelSettingsOnlyShowLaterBooksInContinueSeries": "דלג על ספרים קודמים ב-המשך סדרה", + "LabelSettingsLibraryMarkAsFinishedWhen": "סמן פריט מדיה כהושלם כאשר", + "LabelSettingsOnlyShowLaterBooksInContinueSeries": "דלג על ספרים קודמים ב״המשך סדרה״", "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "מדף המשך סדרות מציג את הספר הראשון שלא הושמע בסדרה שיש בה לפחות ספר אחד שהושלם ואין ספרים שכבר באמצע שמיעה. הפעלת הגדרה זו תמשיך סדרות מהספר שהושלם הכי מתקדם בסדרה במקום מהספר הראשון שלא הושמע.", "LabelSettingsParseSubtitles": "פענח כתוביות", "LabelSettingsParseSubtitlesHelp": "העתק כותרת משנה משם תיקיית הספר.
כותרת המשנה חייבת להיות מופרדת עם התו ״-״
לדוגמא, כותרת המשנה לספר ״שם הספר - כותרת משנה״, היא ״כותרת משנה״", @@ -571,13 +619,22 @@ "LabelSettingsStoreMetadataWithItem": "אחסן מטה-נתונים עם הפריט", "LabelSettingsStoreMetadataWithItemHelp": "כברירת מחדל, קבצי מטה-נתונים מאוחסנים ב- /metadata/items, הפעלת ההגדרה תאחסן קבצי מטה-נתונים בתיקיית פריט שלך בספרייה", "LabelSettingsTimeFormat": "פורמט זמן", + "LabelShare": "שתף", + "LabelShareDownloadableHelp": "אפשר למי שיש ברשותו קישור שיתוף להוריד קובץ ZIP של פריט הספרייה.", + "LabelShareURL": "שתף קישור", "LabelShowAll": "הצג הכל", + "LabelShowSeconds": "הצג שניות", + "LabelShowSubtitles": "הצג כתוביות", "LabelSize": "גודל", "LabelSleepTimer": "טיימר שינה", + "LabelSortAscending": "סדר עולה", + "LabelSortDescending": "סדר יורד", + "LabelSortPubDate": "מיין לפי תאריך פרסום", "LabelStart": "התחל", "LabelStartTime": "זמן התחלה", "LabelStarted": "התחיל", "LabelStartedAt": "התחיל ב", + "LabelStartedDate": "הותחל {0}", "LabelStatsAudioTracks": "רצועות שמע", "LabelStatsAuthors": "מחברים", "LabelStatsBestDay": "היום הטוב ביותר", @@ -607,7 +664,13 @@ "LabelTheme": "ערכת נושא", "LabelThemeDark": "כהה", "LabelThemeLight": "בהיר", + "LabelThemeSepia": "ספיה", "LabelTimeBase": "בסיס זמן", + "LabelTimeDurationXHours": "{0} שעות", + "LabelTimeDurationXMinutes": "{0} דקות", + "LabelTimeDurationXSeconds": "{0} שניות", + "LabelTimeInMinutes": "זמן בשניות", + "LabelTimeLeft": "נותרו {0}", "LabelTimeListened": "זמן האזנה", "LabelTimeListenedToday": "זמן האזנה היום", "LabelTimeRemaining": "{0} נותרו", @@ -615,6 +678,7 @@ "LabelTitle": "כותרת", "LabelToolsEmbedMetadata": "הטמעת מטה-נתונים", "LabelToolsEmbedMetadataDescription": "הטמעת מטה-נתונים לקבצי שמע כולל תמונות כריכה ופרקים.", + "LabelToolsM4bEncoder": "מקודד M4B", "LabelToolsMakeM4b": "יצירת קובץ אודיו M4B", "LabelToolsMakeM4bDescription": "יצירת קובץ אודיו .M4B עם מטה-נתונים מוטמעים, תמונת שער ופרקים.", "LabelToolsSplitM4b": "פיצול M4B ל-MP3", @@ -627,29 +691,39 @@ "LabelTracksMultiTrack": "רב-ערוצי", "LabelTracksNone": "אין ערוצים", "LabelTracksSingleTrack": "רצועה יחידה", + "LabelTrailer": "קדימון", "LabelType": "סוג", "LabelUnabridged": "לא מקוצר", "LabelUndo": "בטל", "LabelUnknown": "לא ידוע", + "LabelUnknownPublishDate": "תאריך הוצאה לאור לא ידוע", "LabelUpdateCover": "עדכן כריכה", "LabelUpdateCoverHelp": "אפשר החלפה של כריכות קיימות עבור הספרים הנבחרים כאשר נמצאה התאמה", "LabelUpdateDetails": "עדכון פרטים", "LabelUpdateDetailsHelp": "אפשר החלפה של פרטים קיימים עבור הספרים הנבחרים כאשר נמצאה התאמה", "LabelUpdatedAt": "עודכן ב-", "LabelUploaderDragAndDrop": "גרור ושחרר קבצים או תיקיות", + "LabelUploaderDragAndDropFilesOnly": "גרור ושחרר קבצים", "LabelUploaderDropFiles": "שחרר קבצים", "LabelUploaderItemFetchMetadataHelp": "משיכת כותרת, סופר וסדרה באופן אוטומטי", + "LabelUseAdvancedOptions": "השתמש באפשרויות מתקדמות", "LabelUseChapterTrack": "השתמש ברצועות הפרקים", "LabelUseFullTrack": "השתמש ברצועה המלאה", + "LabelUseZeroForUnlimited": "השתמש ב־0 מתוך אין־סוף", "LabelUser": "משתמש", "LabelUsername": "שם משתמש", "LabelValue": "ערך", "LabelVersion": "גרסה", "LabelViewBookmarks": "הצג סימניות", "LabelViewChapters": "הצג פרקים", + "LabelViewPlayerSettings": "הצג הגדרות נגן", "LabelViewQueue": "הצג תור נגן", "LabelVolume": "עוצמת קול", + "LabelWebRedirectURLsDescription": "יש לאשר את הכתובות הבאות אצל ספק ה־OAuth כדי לאפשר הפניה חזרה לאפליקציית הדפדפן לאחר ההתחברות:", + "LabelWebRedirectURLsSubfolder": "תיקיית משנה לכתובות הפניה", "LabelWeekdaysToRun": "ימי השבוע להרצה", + "LabelXBooks": "{0} ספרים", + "LabelXItems": "{0} פריטים", "LabelYearReviewHide": "הסתר סקירת שנה", "LabelYearReviewShow": "הצג סקירת שנה", "LabelYourAudiobookDuration": "משך הספר הקולי שלך", @@ -658,31 +732,55 @@ "LabelYourProgress": "ההתקדמות שלך", "MessageAddToPlayerQueue": "הוסף לתור הנגן", "MessageAppriseDescription": "כדי להשתמש בתכונה זו יש לך להריץ מופע של ממשק התכנית האפליקציה או API שיטפל בבקשות אלו.
כתובת URL של ממשק ה-Apprise API צריכה להיות הנתיב המלא לשליחת ההתראה, לדוגמה, אם המופע של ה-API שלך מוצע ב-http://192.168.1.1:8337 אז עליך לשים http://192.168.1.1:8337/notify.", + "MessageAsinCheck": "יש לוודא שימוש ב־ASIN מאזור ה־Audible הנכון, ולא מ־Amazon.", + "MessageAuthenticationLegacyTokenWarning": "אסימוני API ישנים יוסרו בעתיד. יש להשתמש ב מפתחות API במקום.", + "MessageAuthenticationOIDCChangesRestart": "יש להפעיל מחדש את השרת לאחר השמירה כדי להחיל את שינויי ה־OIDC.", + "MessageAuthenticationSecurityMessage": "האימות שופר מטעמי אבטחה. כל המשתמשים נדרשים להתחבר מחדש.", "MessageBackupsDescription": "גיבויים כוללים משתמשים, התקדמות משתמש, פרטי פריטי ספרייה, הגדרות שרת ותמונות השמורות ב-/metadata/items & /metadata/authors. גיבויים לא כוללים קבצים שמורים בתיקיות הספרייה שלך.", + "MessageBackupsLocationEditNote": "הערה: שינוי מיקום הגיבוי לא יגרום להעברה או לשינוי של גיבויים קיימים", + "MessageBackupsLocationNoEditNote": "הערה: מיקום הגיבוי מוגדר באמצעות משתנה סביבה ולא ניתן לשנותו כאן.", + "MessageBackupsLocationPathEmpty": "נתיב מיקום הגיבוי אינו יכול להיות ריק", + "MessageBatchEditPopulateMapDetailsAllHelp": "מלא את השדות הפעילים בנתונים מכל הפריטים. שדות בעלי ערכים מרובים ימוזגו", + "MessageBatchEditPopulateMapDetailsItemHelp": "מלא את שדות פרטי המיפוי הפעילים בנתונים מפריט זה", "MessageBatchQuickMatchDescription": "התאמה מהירה תנסה להוסיף כריכות ומטה-נתונים חסרים עבור הפריטים הנבחרים. הפעל את האפשרויות למטה כדי לאפשר להתאמה מהירה להחליף כריכות קיימות ו/או מטה-נתונים.", "MessageBookshelfNoCollections": "עדיין לא יצרת אוספים", + "MessageBookshelfNoCollectionsHelp": "האוספים ציבוריים. כל המשתמשים בעלי גישה לספרייה יכולים לראות אותם.", "MessageBookshelfNoRSSFeeds": "אין ערוצי RSS פתוחים", "MessageBookshelfNoResultsForFilter": "אין תוצאות עבור סינון \"{0}: {1}\"", + "MessageBookshelfNoResultsForQuery": "אין תוצאות עבור השאילתה", "MessageBookshelfNoSeries": "אין לך סדרות", + "MessageBulkChapterPattern": "כמה פרקים להוסיף לפי תבנית מספור זו?", "MessageChapterEndIsAfter": "זמן סיום הפרק אחרי סיום הספר הקולי שלך", "MessageChapterErrorFirstNotZero": "הפרק הראשון חייב להתחיל ב-0", "MessageChapterErrorStartGteDuration": "זמן התחלה לא תקין, חייב להיות פחות ממשך הספר הקולי", "MessageChapterErrorStartLtPrev": "זמן התחלה לא תקין, חייב להיות גדול או שווה לזמן ההתחלה של הפרק הקודם", "MessageChapterStartIsAfter": "התחלת הפרק אחרי סיום הספר הקולי שלך", + "MessageChaptersNotFound": "לא נמצאו פרקים", "MessageCheckingCron": "בודק את תזמון העבודה...", "MessageConfirmCloseFeed": "האם אתה בטוח שאתה רוצה לסגור את הערוץ הזה?", + "MessageConfirmDeleteApiKey": "האם למחוק את מפתח ה־API \"{0}\"?", "MessageConfirmDeleteBackup": "האם אתה בטוח שברצונך למחוק גיבוי עבור {0}?", + "MessageConfirmDeleteDevice": "האם למחוק את הקורא האלקטרוני \"{0}\"?", "MessageConfirmDeleteFile": "הקובץ ימחק לצמיתות מהמערכת שלך. האם אתה בטוח?", "MessageConfirmDeleteLibrary": "האם אתה בטוח שברצונך למחוק לצמיתות את הספרייה \"{0}\"?", "MessageConfirmDeleteLibraryItem": "פריט הספרייה יימחק לצמיתות ממסד הנתונים ומהמערכת שלך. האם אתה בטוח?", "MessageConfirmDeleteLibraryItems": "פריטי הספרייה {0} יימחקו ממסד הנתונים ומהמערכת שלך. האם אתה בטוח?", + "MessageConfirmDeleteMetadataProvider": "האם למחוק את ספק המטא־נתונים המותאם \"{0}\"?", + "MessageConfirmDeleteNotification": "האם למחוק התראה זו?", "MessageConfirmDeleteSession": "האם אתה בטוח שאתה רוצה למחוק את ההפעלה הזו?", + "MessageConfirmEmbedMetadataInAudioFiles": "האם להטמיע מטא־נתונים ב־{0} קובצי שמע?", "MessageConfirmForceReScan": "האם אתה בטוח שאתה רוצה להכריח סריקה מחדש?", "MessageConfirmMarkAllEpisodesFinished": "האם אתה בטוח שברצונך לסמן את כל הפרקים כהסתיימו?", "MessageConfirmMarkAllEpisodesNotFinished": "האם אתה בטוח שברצונך לסמן את כל הפרקים כלא הסתיימו?", + "MessageConfirmMarkItemFinished": "האם לסמן את \"{0}\" כהושלם?", + "MessageConfirmMarkItemNotFinished": "האם לסמן את \"{0}\" כלא הושלם?", "MessageConfirmMarkSeriesFinished": "האם אתה בטוח שברצונך לסמן את כל הספרים בסדרה זו כהסתיימו?", "MessageConfirmMarkSeriesNotFinished": "האם אתה בטוח שברצונך לסמן את כל הספרים בסדרה זו כלא הסתיימו?", + "MessageConfirmNotificationTestTrigger": "האם להפעיל התראה זו עם נתוני בדיקה?", + "MessageConfirmPurgeCache": "ניקוי המטמון ימחק את כל התיקייה ב־/metadata/cache.

האם למחוק את תיקיית המטמון?", + "MessageConfirmPurgeItemsCache": "ניקוי מטמון הפריטים ימחק את כל התיקייה ב־metadata/cache/items/.
האם למחוק?", "MessageConfirmQuickEmbed": "אזהרה! הטמעה מהירה לא תגבה גיבוי של קבצי האודיו שלך. וודא שיש לך גיבוי של קבצי האודיו שלך.

האם ברצונך להמשיך?", + "MessageConfirmQuickMatchEpisodes": "התאמה מהירה תדרוס פרטים עבור פרקים תואמים. רק פרקים ללא התאמה יעודכנו. האם להמשיך?", "MessageConfirmReScanLibraryItems": "האם אתה בטוח שברצונך לסרוק מחדש {0} פריטים?", "MessageConfirmRemoveAllChapters": "האם אתה בטוח שברצונך להסיר את כל הפרקים?", "MessageConfirmRemoveAuthor": "האם אתה בטוח שברצונך להסיר את המחבר \"{0}\"?", From cc5244c5966ce1a3041148eea466fe16bda1be7e Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Mon, 2 Feb 2026 08:50:32 +0100 Subject: [PATCH 107/117] Translated using Weblate (Swedish) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index d2fb254ed..e1c08efa5 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -436,9 +436,9 @@ "LabelLibraryFilterSublistEmpty": "Ingen {0}", "LabelLibraryItem": "Objekt", "LabelLibraryName": "Biblioteksnamn", - "LabelLibrarySortByProgress": "Framsteg: senast uppdaterat", - "LabelLibrarySortByProgressFinished": "Framsteg: avslutad", - "LabelLibrarySortByProgressStarted": "Framsteg: påbörjad", + "LabelLibrarySortByProgress": "Status: Senast uppdaterad", + "LabelLibrarySortByProgressFinished": "Status: Avslutad", + "LabelLibrarySortByProgressStarted": "Status: Startad", "LabelLimit": "Begränsning", "LabelLineSpacing": "Radavstånd", "LabelListenAgain": "Lyssna igen", From edfce4605856f34e68400f072a3dee73f3b10622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Delta=20Umh=C3=B6fer?= Date: Sat, 31 Jan 2026 20:09:59 +0100 Subject: [PATCH 108/117] Translated using Weblate (German) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/strings/de.json b/client/strings/de.json index 970c94233..cf36b07fd 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -436,7 +436,7 @@ "LabelLibraryFilterSublistEmpty": "Keine {0}", "LabelLibraryItem": "Bibliothekseintrag", "LabelLibraryName": "Bibliotheksname", - "LabelLibrarySortByProgress": "Fortschritt: Zuletzt aktualisiert", + "LabelLibrarySortByProgress": "Fortschritt: Letzte Aktualisierung", "LabelLibrarySortByProgressFinished": "Fortschritt: Beendet", "LabelLibrarySortByProgressStarted": "Fortschritt: Gestartet", "LabelLimit": "Begrenzung", From 31630f50a59d598478db6692aaba6bf3089435be Mon Sep 17 00:00:00 2001 From: dapitch666 Date: Mon, 2 Feb 2026 12:17:14 +0100 Subject: [PATCH 109/117] Translated using Weblate (French) Currently translated at 100.0% (1163 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/ --- client/strings/fr.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/strings/fr.json b/client/strings/fr.json index 6ff72c7ef..497426d37 100644 --- a/client/strings/fr.json +++ b/client/strings/fr.json @@ -436,11 +436,11 @@ "LabelLibraryFilterSublistEmpty": "Aucun {0}", "LabelLibraryItem": "Élément de bibliothèque", "LabelLibraryName": "Nom de la bibliothèque", - "LabelLibrarySortByProgress": "Progression : dernière mise à jour", + "LabelLibrarySortByProgress": "Progression : Mise à jour", "LabelLibrarySortByProgressFinished": "Progression : Terminé", - "LabelLibrarySortByProgressStarted": "Progression : Commencé", + "LabelLibrarySortByProgressStarted": "Progression : En cours", "LabelLimit": "Limite", - "LabelLineSpacing": "Espacement des lignes", + "LabelLineSpacing": "Interligne", "LabelListenAgain": "Écouter à nouveau", "LabelLogLevelDebug": "Débogage", "LabelLogLevelInfo": "Info", @@ -961,7 +961,7 @@ "PlaceholderNewCollection": "Nom de la nouvelle collection", "PlaceholderNewFolderPath": "Nouveau chemin de dossier", "PlaceholderNewPlaylist": "Nouveau nom de liste de lecture", - "PlaceholderSearch": "Recherche…", + "PlaceholderSearch": "Recherche...", "PlaceholderSearchEpisode": "Rechercher un épisode…", "StatsAuthorsAdded": "auteurs ajoutés", "StatsBooksAdded": "livres ajoutés", From 2ee893062f1eb829107f7a358ec9ff128949e6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Llu=C3=ADs=20Forns?= Date: Tue, 3 Feb 2026 11:37:12 +0100 Subject: [PATCH 110/117] Translated using Weblate (Catalan) Currently translated at 92.2% (1073 of 1163 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ca/ --- client/strings/ca.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/strings/ca.json b/client/strings/ca.json index dbda8b8e4..4180b2518 100644 --- a/client/strings/ca.json +++ b/client/strings/ca.json @@ -166,6 +166,7 @@ "HeaderMetadataOrderOfPrecedence": "Ordre de Precedència de Metadades", "HeaderMetadataToEmbed": "Metadades a Inserir", "HeaderNewAccount": "Nou Compte", + "HeaderNewApiKey": "Nova clau API", "HeaderNewLibrary": "Nova Biblioteca", "HeaderNotificationCreate": "Crea Notificació", "HeaderNotificationUpdate": "Actualització de Notificació", @@ -199,6 +200,7 @@ "HeaderSettingsExperimental": "Funcionalitats experimentals", "HeaderSettingsGeneral": "Generals", "HeaderSettingsScanner": "Escàner", + "HeaderSettingsSecurity": "Seguretat", "HeaderSettingsWebClient": "Client web", "HeaderSleepTimer": "Temporitzador de son", "HeaderStatsLargestItems": "Elements més grans", @@ -421,6 +423,9 @@ "LabelLibraryFilterSublistEmpty": "Sense {0}", "LabelLibraryItem": "Element de Biblioteca", "LabelLibraryName": "Nom de Biblioteca", + "LabelLibrarySortByProgress": "Progrés: Última actualització", + "LabelLibrarySortByProgressFinished": "Progrés: Finalitzat", + "LabelLibrarySortByProgressStarted": "Progrés: Començat", "LabelLimit": "Límits", "LabelLineSpacing": "Interlineat", "LabelListenAgain": "Escoltar de nou", @@ -443,7 +448,7 @@ "LabelMetadataProvider": "Proveïdor de metadades", "LabelMinute": "Minut", "LabelMinutes": "Minuts", - "LabelMissing": "Absent", + "LabelMissing": "Falta", "LabelMissingEbook": "No té llibre electrònic", "LabelMissingSupplementaryEbook": "No té ebook complementari", "LabelMobileRedirectURIs": "URI de redirecció mòbil permeses", From dd4fc09909a0a2862756292b11fd684b2f427c1f Mon Sep 17 00:00:00 2001 From: Michael Tuttle Date: Sun, 8 Feb 2026 00:19:23 -0700 Subject: [PATCH 111/117] Fix OpenAPI spec description --- custom-metadata-provider-specification.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom-metadata-provider-specification.yaml b/custom-metadata-provider-specification.yaml index 71cbba23a..a0ec172ae 100644 --- a/custom-metadata-provider-specification.yaml +++ b/custom-metadata-provider-specification.yaml @@ -127,7 +127,7 @@ components: duration: type: integer format: int64 - description: Duration in seconds + description: Duration in minutes SeriesMetadata: type: object From fa5fa7b7884adad3d020745aa97f5a52ca6e6156 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 14 Feb 2026 17:17:12 -0600 Subject: [PATCH 112/117] Fix server crash on /me/progress/:libraryItemId/:episodeId? when episodeId is not passed in for a podcast library item #5058 --- server/models/User.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/models/User.js b/server/models/User.js index 36b2eca98..936efde13 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -782,7 +782,14 @@ class User extends Model { error: 'Library item not found', statusCode: 404 } + } else if (libraryItem.mediaType !== 'book') { + Logger.error(`[User] createUpdateMediaProgress: library item ${progressPayload.libraryItemId} is not a book`) + return { + error: 'Library item is not a book', + statusCode: 400 + } } + mediaItemId = libraryItem.media.id mediaProgress = libraryItem.media.mediaProgresses?.[0] } From 75eed9d09a2ff2255bf9a06667d3c1656765fa0a Mon Sep 17 00:00:00 2001 From: pavel-miniutka Date: Thu, 19 Feb 2026 10:36:28 +0300 Subject: [PATCH 113/117] Add Belarusian language option & Belarus podcast region --- client/plugins/i18n.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/plugins/i18n.js b/client/plugins/i18n.js index 83e748f25..1ab0379c7 100644 --- a/client/plugins/i18n.js +++ b/client/plugins/i18n.js @@ -6,6 +6,7 @@ const defaultCode = 'en-us' const languageCodeMap = { ar: { label: 'عربي', dateFnsLocale: 'ar' }, + be: { label: 'Беларуская', dateFnsLocale: 'be' }, bg: { label: 'Български', dateFnsLocale: 'bg' }, bn: { label: 'বাংলা', dateFnsLocale: 'bn' }, ca: { label: 'Català', dateFnsLocale: 'ca' }, @@ -48,6 +49,7 @@ const podcastSearchRegionMap = { au: { label: 'Australia' }, br: { label: 'Brasil' }, be: { label: 'België / Belgique / Belgien' }, + by: { label: 'Беларусь' }, cz: { label: 'Česko' }, dk: { label: 'Danmark' }, de: { label: 'Deutschland' }, From ee6016f70e33cd4f7782c1966aca906aaa4b47ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Bel=C3=A1k?= Date: Sat, 21 Feb 2026 09:11:50 +0100 Subject: [PATCH 114/117] Add Slovak (sk) language to the language selector The Slovak translation file (client/strings/sk.json) already exists with a complete translation but was missing from the languageCodeMap in i18n.js, making it inaccessible from the language dropdown. Also adds Slovakia to the podcast search region map. Co-Authored-By: Claude Opus 4.6 --- client/plugins/i18n.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/plugins/i18n.js b/client/plugins/i18n.js index 83e748f25..5a672ba06 100644 --- a/client/plugins/i18n.js +++ b/client/plugins/i18n.js @@ -28,6 +28,7 @@ const languageCodeMap = { pl: { label: 'Polski', dateFnsLocale: 'pl' }, 'pt-br': { label: 'Português (Brasil)', dateFnsLocale: 'ptBR' }, ru: { label: 'Русский', dateFnsLocale: 'ru' }, + sk: { label: 'Slovenčina', dateFnsLocale: 'sk' }, sl: { label: 'Slovenščina', dateFnsLocale: 'sl' }, sv: { label: 'Svenska', dateFnsLocale: 'sv' }, tr: { label: 'Türkçe', dateFnsLocale: 'tr' }, @@ -67,6 +68,7 @@ const podcastSearchRegionMap = { pt: { label: 'Portugal' }, ru: { label: 'Россия' }, ch: { label: 'Schweiz / Suisse / Svizzera' }, + sk: { label: 'Slovensko' }, se: { label: 'Sverige' }, vn: { label: 'Việt Nam' }, ua: { label: 'Україна' }, From 6e0da3bf7a7b81893dbcca542519cf594d7d3232 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 21 Feb 2026 16:00:38 -0600 Subject: [PATCH 115/117] Fix updating author name merging with same name authors in a different library #4628 --- server/controllers/AuthorController.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/controllers/AuthorController.js b/server/controllers/AuthorController.js index 50eeda31a..82ed3e50a 100644 --- a/server/controllers/AuthorController.js +++ b/server/controllers/AuthorController.js @@ -113,7 +113,7 @@ class AuthorController { payload.lastFirst = Database.authorModel.getLastFirst(payload.name) } - // Check if author name matches another author and merge the authors + // Check if author name matches another author in the same library and merge the authors let existingAuthor = null if (authorNameUpdate) { existingAuthor = await Database.authorModel.findOne({ @@ -121,7 +121,8 @@ class AuthorController { id: { [sequelize.Op.not]: req.author.id }, - name: payload.name + name: payload.name, + libraryId: req.author.libraryId } }) } From 6d3404272c2308464bd00aa9668afdc529ac296e Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 28 Feb 2026 11:32:28 -0600 Subject: [PATCH 116/117] Fix Match click to use current label string --- client/components/modals/item/tabs/Match.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index 4b92f6cd8..a1fc41091 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -78,7 +78,7 @@
@@ -87,7 +87,7 @@

- {{ $strings.LabelCurrently }} {{ mediaMetadata.narratorName }} + {{ $strings.LabelCurrently }} {{ mediaMetadata.narratorName }}

@@ -96,7 +96,7 @@
@@ -105,7 +105,7 @@

- {{ $strings.LabelCurrently }} {{ mediaMetadata.publisher }} + {{ $strings.LabelCurrently }} {{ mediaMetadata.publisher }}

@@ -114,7 +114,7 @@

- {{ $strings.LabelCurrently }} {{ mediaMetadata.publishedYear }} + {{ $strings.LabelCurrently }} {{ mediaMetadata.publishedYear }}

From e6d49a2d53c90350a31cd418302a5c22d279f9b5 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 4 Mar 2026 16:50:36 -0600 Subject: [PATCH 117/117] Fix home page check current user for hide from continue listening --- client/components/app/BookShelfCategorized.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/components/app/BookShelfCategorized.vue b/client/components/app/BookShelfCategorized.vue index 4bf8cfbbf..a8e8ae469 100644 --- a/client/components/app/BookShelfCategorized.vue +++ b/client/components/app/BookShelfCategorized.vue @@ -300,6 +300,8 @@ export default { }) }, userUpdated(user) { + if (user.id !== this.$store.state.user.user.id) return + if (user.seriesHideFromContinueListening && user.seriesHideFromContinueListening.length) { this.removeAllSeriesFromContinueSeries(user.seriesHideFromContinueListening) }