From cae1560344fd14a5c00e02bd1f14db2394a75d8c Mon Sep 17 00:00:00 2001 From: sir-wilhelm Date: Fri, 25 Jul 2025 12:33:46 -0500 Subject: [PATCH 001/217] Use PowerShell to get windows drive paths. wmic has been deprecated on newer versions of Windows 11 and is not installed. resolves #4531 --- server/utils/fileUtils.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/utils/fileUtils.js b/server/utils/fileUtils.js index 2da6b4c9..9a349bd5 100644 --- a/server/utils/fileUtils.js +++ b/server/utils/fileUtils.js @@ -476,7 +476,7 @@ module.exports.getWindowsDrives = async () => { return [] } return new Promise((resolve, reject) => { - exec('wmic logicaldisk get name', async (error, stdout, stderr) => { + exec('powershell -Command "(Get-PSDrive -PSProvider FileSystem).Name"', async (error, stdout, stderr) => { if (error) { reject(error) return @@ -485,10 +485,9 @@ module.exports.getWindowsDrives = async () => { ?.split(/\r?\n/) .map((line) => line.trim()) .filter((line) => line) - .slice(1) const validDrives = [] for (const drive of drives) { - let drivepath = drive + '/' + let drivepath = drive + ':/' if (await fs.pathExists(drivepath)) { validDrives.push(drivepath) } else { From fd4932cdbb6d6939c2ff768b381cccd69233dcdc Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 15 Aug 2025 17:23:20 -0500 Subject: [PATCH 002/217] Add additional debug logs for OIDC login --- server/Auth.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/Auth.js b/server/Auth.js index a01d3a3c..f63e8446 100644 --- a/server/Auth.js +++ b/server/Auth.js @@ -243,6 +243,7 @@ class Auth { } // Store the authentication method for long + Logger.debug(`[Auth] paramsToCookies: setting auth_method cookie to ${authMethod}`) res.cookie('auth_method', authMethod, { maxAge: 1000 * 60 * 60 * 24 * 365 * 10, httpOnly: true }) return null } @@ -258,6 +259,7 @@ class Auth { // Handle token generation and get userResponse object // For API based auth (e.g. mobile), we will return the refresh token in the response const isApiBased = this.isAuthMethodAPIBased(req.cookies.auth_method) + Logger.debug(`[Auth] handleLoginSuccessBasedOnCookie: isApiBased: ${isApiBased}, auth_method: ${req.cookies.auth_method}`) const userResponse = await this.handleLoginSuccess(req, res, isApiBased) if (isApiBased) { @@ -298,6 +300,8 @@ class Auth { userResponse.user.refreshToken = returnTokens ? refreshToken : null userResponse.user.accessToken = accessToken + Logger.debug(`[Auth] handleLoginSuccess: returnTokens: ${returnTokens}, isRefreshTokenInResponse: ${!!userResponse.user.refreshToken}`) + if (!returnTokens) { this.tokenManager.setRefreshTokenCookie(req, res, refreshToken) } From 553ffd1934d16be7a3ba624d1204d9eaf327bd47 Mon Sep 17 00:00:00 2001 From: renesat Date: Sat, 16 Aug 2025 18:22:57 +0200 Subject: [PATCH 003/217] Fix listening url log with ipv6 host --- server/Server.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/Server.js b/server/Server.js index 457aa61a..719d4c29 100644 --- a/server/Server.js +++ b/server/Server.js @@ -11,6 +11,7 @@ const axios = require('axios') const { version } = require('../package.json') // Utils +const is = require('./libs/requestIp/isJs') const fileUtils = require('./utils/fileUtils') const { toNumber } = require('./utils/index') const Logger = require('./Logger') @@ -419,8 +420,13 @@ class Server { }) } else { this.server.listen(this.Port, this.Host, () => { - if (this.Host) Logger.info(`Listening on http://${this.Host}:${this.Port}`) - else Logger.info(`Listening on port :${this.Port}`) + if (this.Host) { + let host = this.Host + if (is.ipv6(host)) { + host = '[' + host + ']' + } + Logger.info(`Listening on http://${host}:${this.Port}`) + } else Logger.info(`Listening on port :${this.Port}`) }) } From 8d1f4606400af8ebb521c39d64e3a4dabc69a00c Mon Sep 17 00:00:00 2001 From: renesat Date: Sat, 16 Aug 2025 18:56:23 +0200 Subject: [PATCH 004/217] Fix freeze on some audio sources --- server/utils/ffmpegHelpers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/utils/ffmpegHelpers.js b/server/utils/ffmpegHelpers.js index 357a2084..0c4da5f9 100644 --- a/server/utils/ffmpegHelpers.js +++ b/server/utils/ffmpegHelpers.js @@ -118,6 +118,7 @@ module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => { method: 'GET', responseType: 'stream', headers: { + 'Accept': '*/*', 'User-Agent': userAgent }, timeout: global.PodcastDownloadTimeout From a968aca30463c0091755d2af6d1e875453b3e064 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 17 Aug 2025 09:05:29 -0500 Subject: [PATCH 005/217] Update podcast episode downloads to always attempt embedding meta tags regardless of format --- server/managers/PodcastManager.js | 31 ++++++++---------------- server/objects/PodcastEpisodeDownload.js | 10 -------- 2 files changed, 10 insertions(+), 31 deletions(-) diff --git a/server/managers/PodcastManager.js b/server/managers/PodcastManager.js index 1b6617ac..a959ba9a 100644 --- a/server/managers/PodcastManager.js +++ b/server/managers/PodcastManager.js @@ -121,28 +121,17 @@ class PodcastManager { await fs.mkdir(this.currentDownload.libraryItem.path) } - let success = false - if (this.currentDownload.isMp3) { - // Download episode and tag it - const ffmpegDownloadResponse = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => { - Logger.error(`[PodcastManager] Podcast Episode download failed`, error) - }) - success = !!ffmpegDownloadResponse?.success + // Download episode and tag it + const ffmpegDownloadResponse = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => { + Logger.error(`[PodcastManager] Podcast Episode download failed`, error) + }) + let success = !!ffmpegDownloadResponse?.success - // If failed due to ffmpeg error, retry without tagging - // e.g. RSS feed may have incorrect file extension and file type - // See https://github.com/advplyr/audiobookshelf/issues/3837 - if (!success && ffmpegDownloadResponse?.isFfmpegError) { - Logger.info(`[PodcastManager] Retrying episode download without tagging`) - // Download episode only - success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath) - .then(() => true) - .catch((error) => { - Logger.error(`[PodcastManager] Podcast Episode download failed`, error) - return false - }) - } - } else { + // If failed due to ffmpeg error, retry without tagging + // e.g. RSS feed may have incorrect file extension and file type + // See https://github.com/advplyr/audiobookshelf/issues/3837 + if (!success && ffmpegDownloadResponse?.isFfmpegError) { + Logger.info(`[PodcastManager] Retrying episode download without tagging`) // Download episode only success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath) .then(() => true) diff --git a/server/objects/PodcastEpisodeDownload.js b/server/objects/PodcastEpisodeDownload.js index 3c1d82ac..cce9f66f 100644 --- a/server/objects/PodcastEpisodeDownload.js +++ b/server/objects/PodcastEpisodeDownload.js @@ -63,16 +63,6 @@ class PodcastEpisodeDownload { const enclosureType = this.rssPodcastEpisode.enclosure.type return typeof enclosureType === 'string' ? enclosureType : null } - /** - * RSS feed may have an episode with file extension of mp3 but the specified enclosure type is not mpeg. - * @see https://github.com/advplyr/audiobookshelf/issues/3711 - * - * @returns {boolean} - */ - get isMp3() { - if (this.enclosureType && !this.enclosureType.includes('mpeg')) return false - return this.fileExtension === 'mp3' - } get episodeTitle() { return this.rssPodcastEpisode.title } From 2cc6e56bd15f0820aa2f2b266ef8dcaf75a93cd2 Mon Sep 17 00:00:00 2001 From: laxandrea Date: Tue, 19 Aug 2025 15:29:49 +0200 Subject: [PATCH 006/217] remove token from hls url - following PR #4263 --- server/objects/Stream.js | 2 +- server/utils/generators/hlsPlaylistGenerator.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/objects/Stream.js b/server/objects/Stream.js index 813ecf14..d9bdd583 100644 --- a/server/objects/Stream.js +++ b/server/objects/Stream.js @@ -146,7 +146,7 @@ class Stream extends EventEmitter { async generatePlaylist() { await fs.ensureDir(this.streamPath) - await hlsPlaylistGenerator(this.playlistPath, 'output', this.totalDuration, this.segmentLength, this.hlsSegmentType, this.userToken) + await hlsPlaylistGenerator(this.playlistPath, 'output', this.totalDuration, this.segmentLength, this.hlsSegmentType) return this.clientPlaylistUri } diff --git a/server/utils/generators/hlsPlaylistGenerator.js b/server/utils/generators/hlsPlaylistGenerator.js index 58c1d69a..369c1456 100644 --- a/server/utils/generators/hlsPlaylistGenerator.js +++ b/server/utils/generators/hlsPlaylistGenerator.js @@ -1,6 +1,6 @@ const fs = require('../../libs/fsExtra') -function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, token) { +function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType) { var ext = hlsSegmentType === 'fmp4' ? 'm4s' : 'ts' var lines = [ @@ -18,18 +18,18 @@ function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, to var lastSegment = duration - (numSegments * segmentLength) for (let i = 0; i < numSegments; i++) { lines.push(`#EXTINF:6,`) - lines.push(`${segmentName}-${i}.${ext}?token=${token}`) + lines.push(`${segmentName}-${i}.${ext}`) } if (lastSegment > 0) { lines.push(`#EXTINF:${lastSegment},`) - lines.push(`${segmentName}-${numSegments}.${ext}?token=${token}`) + lines.push(`${segmentName}-${numSegments}.${ext}`) } lines.push('#EXT-X-ENDLIST') return lines.join('\n') } -function generatePlaylist(outputPath, segmentName, duration, segmentLength, hlsSegmentType, token) { - var playlistStr = getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, token) +function generatePlaylist(outputPath, segmentName, duration, segmentLength, hlsSegmentType) { + var playlistStr = getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType) return fs.writeFile(outputPath, playlistStr) } module.exports = generatePlaylist \ No newline at end of file From 9987d219f85a8b0d96eb2ed237bee9e15023c288 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 19 Aug 2025 16:50:43 -0500 Subject: [PATCH 007/217] Remove success toast on podcast episodes removed #4606 --- client/components/modals/podcast/RemoveEpisode.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/client/components/modals/podcast/RemoveEpisode.vue b/client/components/modals/podcast/RemoveEpisode.vue index b2cebe84..0222528e 100644 --- a/client/components/modals/podcast/RemoveEpisode.vue +++ b/client/components/modals/podcast/RemoveEpisode.vue @@ -94,7 +94,6 @@ export default { } this.processing = false - this.$toast.success(`${this.episodes.length} episode${this.episodes.length > 1 ? 's' : ''} removed`) this.show = false this.$emit('clearSelected') } From e4b9ac5446009ba7d64900879ed4ef5e30e7c3c8 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 19 Aug 2025 16:52:50 -0500 Subject: [PATCH 008/217] Add episode updated translation for podcast match #4606 --- client/components/modals/podcast/tabs/EpisodeMatch.vue | 2 +- client/strings/en-us.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/components/modals/podcast/tabs/EpisodeMatch.vue b/client/components/modals/podcast/tabs/EpisodeMatch.vue index dbea4e70..c7ac60cd 100644 --- a/client/components/modals/podcast/tabs/EpisodeMatch.vue +++ b/client/components/modals/podcast/tabs/EpisodeMatch.vue @@ -114,7 +114,7 @@ export default { .$patch(`/api/podcasts/${this.libraryItem.id}/episode/${this.episodeId}`, updatePayload) .then(() => { this.isProcessing = false - this.$toast.success('Podcast episode updated') + this.$toast.success(this.$strings.ToastPodcastEpisodeUpdated) this.$emit('selectTab', 'details') }) .catch((error) => { diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 5885445b..77e9e07a 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -1096,6 +1096,7 @@ "ToastPlaylistUpdateSuccess": "Playlist updated", "ToastPodcastCreateFailed": "Failed to create podcast", "ToastPodcastCreateSuccess": "Podcast created successfully", + "ToastPodcastEpisodeUpdated": "Episode updated", "ToastPodcastGetFeedFailed": "Failed to get podcast feed", "ToastPodcastNoEpisodesInFeed": "No episodes found in RSS feed", "ToastPodcastNoRssFeed": "Podcast does not have an RSS feed", From 138bb563b882285ddff24e1e70e21ef7561ccb96 Mon Sep 17 00:00:00 2001 From: advplyr Date: Wed, 20 Aug 2025 17:42:22 -0500 Subject: [PATCH 009/217] Update ipv6 server listening log --- server/Server.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/server/Server.js b/server/Server.js index 719d4c29..f59e33cc 100644 --- a/server/Server.js +++ b/server/Server.js @@ -420,13 +420,8 @@ class Server { }) } else { this.server.listen(this.Port, this.Host, () => { - if (this.Host) { - let host = this.Host - if (is.ipv6(host)) { - host = '[' + host + ']' - } - Logger.info(`Listening on http://${host}:${this.Port}`) - } else Logger.info(`Listening on port :${this.Port}`) + if (this.Host) Logger.info(`Listening on http://${is.ipv6(this.Host) ? `[${this.Host}]` : this.Host}:${this.Port}`) + else Logger.info(`Listening on port :${this.Port}`) }) } From 604f17f60b78ea3a6d8a2a06687ef242f0db0e9d Mon Sep 17 00:00:00 2001 From: kuci-JK Date: Mon, 11 Aug 2025 22:53:01 +0200 Subject: [PATCH 010/217] Translated using Weblate (Czech) Currently translated at 98.6% (1123 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/ --- client/strings/cs.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/strings/cs.json b/client/strings/cs.json index 547806d3..cd9208e9 100644 --- a/client/strings/cs.json +++ b/client/strings/cs.json @@ -199,6 +199,7 @@ "HeaderSettingsExperimental": "Experimentální funkce", "HeaderSettingsGeneral": "Obecné", "HeaderSettingsScanner": "Skener", + "HeaderSettingsSecurity": "Zabezpečení", "HeaderSettingsWebClient": "Webový klient", "HeaderSleepTimer": "Časovač vypnutí", "HeaderStatsLargestItems": "Největší položky", @@ -293,6 +294,7 @@ "LabelContinueListening": "Pokračovat v poslechu", "LabelContinueReading": "Pokračovat ve čtení", "LabelContinueSeries": "Pokračovat v sérii", + "LabelCorsAllowed": "Povolené CORS Origins", "LabelCover": "Obálka", "LabelCoverImageURL": "URL obrázku obálky", "LabelCoverProvider": "Poskytovatel obálky", @@ -418,6 +420,7 @@ "LabelLanguages": "Jazyky", "LabelLastBookAdded": "Poslední kniha přidána", "LabelLastBookUpdated": "Poslední kniha aktualizována", + "LabelLastProgressDate": "Poslední pokrok: {0}", "LabelLastSeen": "Naposledy viděno", "LabelLastTime": "Naposledy", "LabelLastUpdate": "Poslední aktualizace", @@ -430,6 +433,7 @@ "LabelLibraryFilterSublistEmpty": "Žádné {0}", "LabelLibraryItem": "Položka knihovny", "LabelLibraryName": "Název knihovny", + "LabelLibrarySortByProgress": "Aktualizace pokroku", "LabelLimit": "Omezit", "LabelLineSpacing": "Řádkování", "LabelListenAgain": "Poslouchat znovu", @@ -438,6 +442,7 @@ "LabelLogLevelWarn": "Varovat", "LabelLookForNewEpisodesAfterDate": "Hledat nové epizody po tomto datu", "LabelLowestPriority": "Nejnižší priorita", + "LabelMatchConfidence": "Jistota", "LabelMatchExistingUsersBy": "Přiřadit stávající uživatele podle", "LabelMatchExistingUsersByDescription": "Slouží k propojení stávajících uživatelů. Po propojení budou uživatelé přiřazeni k jedinečnému ID od poskytovatele SSO", "LabelMaxEpisodesToDownload": "Maximální # epizod pro stažení. Použijte 0 pro bez omezení.", @@ -801,6 +806,8 @@ "MessageFeedURLWillBe": "URL zdroje bude {0}", "MessageFetching": "Načítání...", "MessageForceReScanDescription": "znovu prohledá všechny soubory jako při novém skenování. ID3 tagy zvukových souborů OPF soubory a textové soubory budou skenovány jako nové.", + "MessageHeatmapListeningTimeTooltip": "{0} poslechnuto na {1}", + "MessageHeatmapNoListeningSessions": "Žádné relace poslouchání na {0}", "MessageImportantNotice": "Důležité upozornění!", "MessageInsertChapterBelow": "Vložit kapitolu níže", "MessageInvalidAsin": "Neplatný ASIN", @@ -1028,6 +1035,7 @@ "ToastInvalidImageUrl": "Neplatná URL obrázku", "ToastInvalidMaxEpisodesToDownload": "Neplatný maximální počet epizod ke stažení", "ToastInvalidUrl": "Neplatná URL", + "ToastInvalidUrls": "Alespoň jedna URL je neplatná", "ToastItemCoverUpdateSuccess": "Obálka předmětu byl aktualizována", "ToastItemDeletedFailed": "Smazání položky selhalo", "ToastItemDeletedSuccess": "Položka smazána", From d353cff1ae73eeb68b8ca8ade7eee374bfa222f3 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Mon, 11 Aug 2025 07:17:35 +0200 Subject: [PATCH 011/217] Translated using Weblate (German) Currently translated at 100.0% (1138 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 1 + 1 file changed, 1 insertion(+) diff --git a/client/strings/de.json b/client/strings/de.json index 156667ec..0e8f0995 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -807,6 +807,7 @@ "MessageFeedURLWillBe": "Feed-URL wird {0} sein", "MessageFetching": "Wird abgerufen …", "MessageForceReScanDescription": "Durchsucht alle Dateien erneut, wie bei einem frischen Scan. ID3-Tags von Audiodateien, OPF-Dateien und Textdateien werden neu durchsucht.", + "MessageHeatmapListeningTimeTooltip": "{0} am {1} gehört", "MessageHeatmapNoListeningSessions": "Keine Hörsitzungen am {0}", "MessageImportantNotice": "Wichtiger Hinweis!", "MessageInsertChapterBelow": "Kapitel unten einfügen", From d268516fcb3754296371c426a5612e34ae1f11b4 Mon Sep 17 00:00:00 2001 From: Daniel Schosser Date: Mon, 11 Aug 2025 10:15:52 +0200 Subject: [PATCH 012/217] Translated using Weblate (German) Currently translated at 100.0% (1138 of 1138 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 0e8f0995..017604ec 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -807,7 +807,7 @@ "MessageFeedURLWillBe": "Feed-URL wird {0} sein", "MessageFetching": "Wird abgerufen …", "MessageForceReScanDescription": "Durchsucht alle Dateien erneut, wie bei einem frischen Scan. ID3-Tags von Audiodateien, OPF-Dateien und Textdateien werden neu durchsucht.", - "MessageHeatmapListeningTimeTooltip": "{0} am {1} gehört", + "MessageHeatmapListeningTimeTooltip": "{0} auf {1} gehört", "MessageHeatmapNoListeningSessions": "Keine Hörsitzungen am {0}", "MessageImportantNotice": "Wichtiger Hinweis!", "MessageInsertChapterBelow": "Kapitel unten einfügen", From 9238c388422e6056f6a7ccd5ecb6421d409ac97e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20F=C3=B6rster?= Date: Mon, 11 Aug 2025 16:34:05 +0200 Subject: [PATCH 013/217] Translated using Weblate (German) Currently translated at 100.0% (1138 of 1138 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 017604ec..454e6c86 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -1036,7 +1036,7 @@ "ToastInvalidImageUrl": "Ungültiger Bild URL", "ToastInvalidMaxEpisodesToDownload": "Ungültige Max. Anzahl an Episoden zum Herunterladen", "ToastInvalidUrl": "Ungültiger URL", - "ToastInvalidUrls": "Eine oder mehrere URLs sind in einem falschen Format", + "ToastInvalidUrls": "Eine oder mehrere URLs sind ungültig", "ToastItemCoverUpdateSuccess": "Titelbild aktualisiert", "ToastItemDeletedFailed": "Fehler beim löschen des Artikels", "ToastItemDeletedSuccess": "Artikel gelöscht", From bb477c617e0536ad406b126ab8fbb7bc015bd9ab Mon Sep 17 00:00:00 2001 From: Paolo Ricci Date: Tue, 12 Aug 2025 09:27:05 +0200 Subject: [PATCH 014/217] Translated using Weblate (Italian) Currently translated at 99.7% (1135 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/ --- client/strings/it.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/client/strings/it.json b/client/strings/it.json index 7f4fd7c7..04ef0ce4 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -1,6 +1,6 @@ { "ButtonAdd": "Aggiungi", - "ButtonAddApiKey": "Aggiungi chiave API", + "ButtonAddApiKey": "Aggiungi la chiave API", "ButtonAddChapters": "Aggiungi Capitoli", "ButtonAddDevice": "Aggiungi Dispositivo", "ButtonAddLibrary": "Aggiungi Libreria", @@ -121,6 +121,7 @@ "HeaderAccount": "Account", "HeaderAddCustomMetadataProvider": "Aggiungi fornitori di metadati personalizzati", "HeaderAdvanced": "Avanzate", + "HeaderApiKeys": "Le chiavi API", "HeaderAppriseNotificationSettings": "Apprendi le impostazioni di Notifica", "HeaderAudioTracks": "Tracce audio", "HeaderAudiobookTools": "Strumenti di gestione file audiolibri", @@ -164,6 +165,7 @@ "HeaderMetadataOrderOfPrecedence": "Priorità ordine Metadata", "HeaderMetadataToEmbed": "Metadata da incorporare", "HeaderNewAccount": "Nuovo Account", + "HeaderNewApiKey": "Nuova chiave API", "HeaderNewLibrary": "Nuova Libreria", "HeaderNotificationCreate": "Crea una notifica", "HeaderNotificationUpdate": "Aggiornamento della notifica", @@ -197,6 +199,7 @@ "HeaderSettingsExperimental": "Opzioni Sperimentali", "HeaderSettingsGeneral": "Generale", "HeaderSettingsScanner": "Scanner", + "HeaderSettingsSecurity": "Sicurezza", "HeaderSettingsWebClient": "Web Client", "HeaderSleepTimer": "Sveglia", "HeaderStatsLargestItems": "File pesanti", @@ -208,6 +211,7 @@ "HeaderTableOfContents": "Indice", "HeaderTools": "Strumenti", "HeaderUpdateAccount": "Aggiorna Account", + "HeaderUpdateApiKey": "Aggiornamento API chiave", "HeaderUpdateAuthor": "Aggiorna Autore", "HeaderUpdateDetails": "Aggiorna Dettagli", "HeaderUpdateLibrary": "Aggiorna Libreria", @@ -237,6 +241,10 @@ "LabelAllUsersExcludingGuests": "Tutti gli Utenti Esclusi gli ospiti", "LabelAllUsersIncludingGuests": "Tutti gli Utenti Inclusi gli ospiti", "LabelAlreadyInYourLibrary": "Già esistente nella libreria", + "LabelApiKeyCreated": "API Key \"{0}\" creato con successo.", + "LabelApiKeyCreatedDescription": "Assicurarsi di copiare la chiave API ora come non sarà in grado di rivedere questo.", + "LabelApiKeyUser": "Atto per conto dell'utente", + "LabelApiKeyUserDescription": "Questa chiave API avrà le stesse autorizzazioni dell'utente che agisce per conto di. Questo apparirà lo stesso nei registri come se l'utente stesse facendo la richiesta.", "LabelApiToken": "API Token", "LabelAppend": "Appese", "LabelAudioBitrate": "Audio Bitrate (es. 128k)", @@ -286,6 +294,7 @@ "LabelContinueListening": "Continua l'ascolto", "LabelContinueReading": "Continua la lettura", "LabelContinueSeries": "Continua serie", + "LabelCorsAllowed": "CORS consentiti Origine", "LabelCover": "Copertina", "LabelCoverImageURL": "Indirizzo della cover URL", "LabelCoverProvider": "Cover Sorgente", @@ -348,6 +357,10 @@ "LabelExample": "Esempio", "LabelExpandSeries": "Espandi Serie", "LabelExpandSubSeries": "Espandi Sub Serie", + "LabelExpired": "Scadenza", + "LabelExpiresAt": "Scade a", + "LabelExpiresInSeconds": "Scade in (secondi)", + "LabelExpiresNever": "Mai", "LabelExplicit": "Esplicito", "LabelExplicitChecked": "Esplicito (selezionato)", "LabelExplicitUnchecked": "Non Esplicito (selezionato)", @@ -407,6 +420,7 @@ "LabelLanguages": "Lingua", "LabelLastBookAdded": "Ultimo Libro Aggiunto", "LabelLastBookUpdated": "Ultimo Libro Aggiornato", + "LabelLastProgressDate": "Ultimi progressi: Si'", "LabelLastSeen": "Ultimi Visti", "LabelLastTime": "Ultima Volta", "LabelLastUpdate": "Ultimo Aggiornamento", @@ -419,6 +433,7 @@ "LabelLibraryFilterSublistEmpty": "Nessuno {0}", "LabelLibraryItem": "Elementi della biblioteca", "LabelLibraryName": "Nome della biblioteca", + "LabelLibrarySortByProgress": "Aggiornamento dei progressi", "LabelLimit": "Limiti", "LabelLineSpacing": "Interlinea", "LabelListenAgain": "Ascolta ancora", @@ -457,6 +472,7 @@ "LabelNewestEpisodes": "Nuovi episodi", "LabelNextBackupDate": "Data Prossimo Backup", "LabelNextScheduledRun": "Data prossima esecuzione schedulata", + "LabelNoApiKeys": "Nessuna chiave API", "LabelNoCustomMetadataProviders": "Nessun provider di metadati personalizzato", "LabelNoEpisodesSelected": "Nessun Episodio Selezionato", "LabelNotFinished": "Da completare", @@ -546,6 +562,7 @@ "LabelSelectAll": "Seleziona tutto", "LabelSelectAllEpisodes": "Seleziona tutti gli Episodi", "LabelSelectEpisodesShowing": "Selezionati {0} episodi da visualizzare", + "LabelSelectUser": "Seleziona l'utente", "LabelSelectUsers": "Selezione Utenti", "LabelSendEbookToDevice": "Invia il libro a...", "LabelSequence": "Sequenza", @@ -642,6 +659,7 @@ "LabelTheme": "Tema", "LabelThemeDark": "Scuro", "LabelThemeLight": "Chiaro", + "LabelThemeSepia": "Seppia", "LabelTimeBase": "Tempo base", "LabelTimeDurationXHours": "{0} Ore", "LabelTimeDurationXMinutes": "{0} minuti", @@ -710,7 +728,9 @@ "MessageAddToPlayerQueue": "Aggiungi alla coda di riproduzione", "MessageAppriseDescription": "Per utilizzare questa funzione è necessario disporre di un'istanza di Apprise API in esecuzione o un'API che gestirà quelle stesse richieste.
L'API Url dovrebbe essere il percorso URL completo per inviare la notifica, ad esempio se la tua istanza API è servita cosi .http://192.168.1.1:8337 Allora dovrai mettere http://192.168.1.1:8337/notify.", "MessageAsinCheck": "Assicurati di utilizzare l'ASIN della regione Audible corretta, non di Amazon.", + "MessageAuthenticationLegacyTokenWarning": "I gettoni API legacy verranno rimossi in futuro. Utilizzare API tasti invece.", "MessageAuthenticationOIDCChangesRestart": "Riavvia il tuo server dopo aver salvato per applicare le modifiche OIDC.", + "MessageAuthenticationSecurityMessage": "L'autenticazione è stata migliorata per la sicurezza. Tutti gli utenti sono tenuti a re-login.", "MessageBackupsDescription": "I backup includono utenti, progressi degli utenti, dettagli sugli elementi della libreria, impostazioni del server e immagini archiviate in /metadata/items & /metadata/authors. I backup non includono i file archiviati nelle cartelle della libreria.", "MessageBackupsLocationEditNote": "Nota: l'aggiornamento della posizione di backup non sposterà o modificherà i backup esistenti", "MessageBackupsLocationNoEditNote": "Nota: la posizione del backup viene impostata tramite una variabile di ambiente e non può essere modificata qui.", @@ -732,6 +752,7 @@ "MessageChaptersNotFound": "Capitoli non trovati", "MessageCheckingCron": "Controllo cron...", "MessageConfirmCloseFeed": "Sei sicuro di voler chiudere questo feed?", + "MessageConfirmDeleteApiKey": "Sei sicuro di voler eliminare la chiave API \"{0}\"?", "MessageConfirmDeleteBackup": "Sei sicuro di voler eliminare il backup {0}?", "MessageConfirmDeleteDevice": "Sei sicuro/sicura di voler eliminare il lettore di libri {0}?", "MessageConfirmDeleteFile": "Questo eliminerà il file dal tuo file system. Sei sicuro?", @@ -759,6 +780,7 @@ "MessageConfirmRemoveAuthor": "Sei sicuro di voler rimuovere l'autore? \"{0}\"?", "MessageConfirmRemoveCollection": "Sei sicuro di voler rimuovere la Raccolta \"{0}\"?", "MessageConfirmRemoveEpisode": "Sei sicuro di voler rimuovere l'episodio \"{0}\"?", + "MessageConfirmRemoveEpisodeNote": "Nota: Questo non cancella il file audio a meno che non toggling \"Hard delete file\"", "MessageConfirmRemoveEpisodes": "Sei sicuro di voler rimuovere {0} episodi?", "MessageConfirmRemoveListeningSessions": "Sei sicuro di voler rimuovere {0} sessioni di Ascolto?", "MessageConfirmRemoveMetadataFiles": "Vuoi davvero rimuovere tutti i metadati.{0} file nelle cartelle degli elementi della tua libreria?", @@ -1002,6 +1024,8 @@ "ToastEpisodeDownloadQueueClearSuccess": "Coda di download degli episodi cancellata", "ToastEpisodeUpdateSuccess": "{0} episodi aggiornati", "ToastErrorCannotShare": "Impossibile condividere in modo nativo su questo dispositivo", + "ToastFailedToCreate": "Non creato", + "ToastFailedToDelete": "Non eliminata", "ToastFailedToLoadData": "Impossibile caricare i dati", "ToastFailedToMatch": "Impossibile abbinare", "ToastFailedToShare": "Impossibile condividere", @@ -1009,6 +1033,7 @@ "ToastInvalidImageUrl": "URL dell'immagine non valido", "ToastInvalidMaxEpisodesToDownload": "Numero massimo di episodi non valido da scaricare", "ToastInvalidUrl": "URL non valido", + "ToastInvalidUrls": "Uno o più URL sono invalidi", "ToastItemCoverUpdateSuccess": "Cover aggiornata", "ToastItemDeletedFailed": "Impossibile eliminare l'elemento", "ToastItemDeletedSuccess": "Elemento eliminato", @@ -1033,6 +1058,7 @@ "ToastMustHaveAtLeastOnePath": "Deve avere almeno un percorso", "ToastNameEmailRequired": "Nome ed email sono obbligatori", "ToastNameRequired": "Il nome è obbligatorio", + "ToastNewApiKeyUserError": "Deve selezionare un utente", "ToastNewEpisodesFound": "{0} nuovi episodi trovati", "ToastNewUserCreatedFailed": "Impossibile creare l'account: \"{0}\"", "ToastNewUserCreatedSuccess": "Nuovo account creato", From b290a4ada3451dc9ce8f8a67e5e38f0a89fe8dd2 Mon Sep 17 00:00:00 2001 From: Mathias Franco Date: Mon, 11 Aug 2025 10:36:30 +0200 Subject: [PATCH 015/217] Translated using Weblate (Dutch) Currently translated at 100.0% (1138 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/ --- client/strings/nl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/strings/nl.json b/client/strings/nl.json index d5ba26db..0dcd660e 100644 --- a/client/strings/nl.json +++ b/client/strings/nl.json @@ -199,6 +199,7 @@ "HeaderSettingsExperimental": "Experimentele functies", "HeaderSettingsGeneral": "Algemeen", "HeaderSettingsScanner": "Scanner", + "HeaderSettingsSecurity": "Beveiliging", "HeaderSettingsWebClient": "Web Client", "HeaderSleepTimer": "Slaaptimer", "HeaderStatsLargestItems": "Grootste items", @@ -232,7 +233,7 @@ "LabelAddToPlaylist": "Toevoegen aan afspeellijst", "LabelAddToPlaylistBatch": "{0} onderdelen toevoegen aan afspeellijst", "LabelAddedAt": "Toegevoegd op", - "LabelAddedDate": "Toegevoegd {0}", + "LabelAddedDate": "{0} toegevoegd", "LabelAdminUsersOnly": "Enkel Admin gebruikers", "LabelAll": "Alle", "LabelAllEpisodesDownloaded": "Alle afleveringen gedownload", @@ -293,6 +294,7 @@ "LabelContinueListening": "Verder Luisteren", "LabelContinueReading": "Verder lezen", "LabelContinueSeries": "Doorgaan met Serie", + "LabelCorsAllowed": "CORS bronnen toestaan", "LabelCover": "Omslag", "LabelCoverImageURL": "Omslagafbeelding-URL", "LabelCoverProvider": "Omslag bron", @@ -805,6 +807,8 @@ "MessageFeedURLWillBe": "Feed URL zal {0} zijn", "MessageFetching": "Aan het ophalen...", "MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.", + "MessageHeatmapListeningTimeTooltip": "{0} luistert op {1}", + "MessageHeatmapNoListeningSessions": "Geen luistersessies op {0}", "MessageImportantNotice": "Belangrijke opmerking!", "MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen", "MessageInvalidAsin": "Ongeldige ASIN", @@ -1032,6 +1036,7 @@ "ToastInvalidImageUrl": "Ongeldige afbeeldings-URL", "ToastInvalidMaxEpisodesToDownload": "Ongeldig maximum aantal afleveringen om te downloaden", "ToastInvalidUrl": "Ongeldige URL", + "ToastInvalidUrls": "Een of meerdere URLs zijn ongeldig", "ToastItemCoverUpdateSuccess": "Omslag bijgewerkt", "ToastItemDeletedFailed": "Item verwijderen mislukt", "ToastItemDeletedSuccess": "Verwijderd item", From d1fabba86bebaa96301cd27fcc2cfc2be0c2ee0d Mon Sep 17 00:00:00 2001 From: Ivan Smoliakov Date: Tue, 12 Aug 2025 04:07:20 +0200 Subject: [PATCH 016/217] Translated using Weblate (Russian) Currently translated at 100.0% (1138 of 1138 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 c8eed308..db2a1a52 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -330,7 +330,7 @@ "LabelEmailSettingsFromAddress": "Адрес От", "LabelEmailSettingsRejectUnauthorized": "Отклонение неавторизованных сертификатов", "LabelEmailSettingsRejectUnauthorizedHelp": "Отключение проверки SSL-сертификата может подвергнуть ваше подключение рискам безопасности, таким как атаки типа \"man-in-the-middle\". Отключайте эту опцию только в том случае, если вы понимаете последствия и доверяете почтовому серверу, к которому подключаетесь.", - "LabelEmailSettingsSecure": "Безопасность", + "LabelEmailSettingsSecure": "Безопасно", "LabelEmailSettingsSecureHelp": "Если значение истинно, то соединение будет использовать TLS при подключении к серверу. Если значение ложно, то TLS будет использован, если сервер поддерживает расширение STARTTLS. В большинстве случаев установите это значение в истину, если вы подключаетесь к порту 465. Для порта 587 или 25 оставьте значение ложным. (из nodemailer.com/smtp/#authentication)", "LabelEmailSettingsTestAddress": "Тестовый адрес", "LabelEmbeddedCover": "Встроенная обложка", From 027e1efaca8dfdf40862f78201aaa892d8e0f2dc Mon Sep 17 00:00:00 2001 From: "Troj@" Date: Mon, 11 Aug 2025 10:45:47 +0200 Subject: [PATCH 017/217] Translated using Weblate (Belarusian) Currently translated at 66.5% (757 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/be/ --- client/strings/be.json | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/client/strings/be.json b/client/strings/be.json index 1e58d62b..f812a13c 100644 --- a/client/strings/be.json +++ b/client/strings/be.json @@ -110,7 +110,7 @@ "ButtonUpload": "Загрузіць", "ButtonUploadBackup": "Загрузіць рэзервовую копію", "ButtonUploadCover": "Загрузіць вокладку", - "ButtonUploadOPMLFile": "Загрузіць OPML файл", + "ButtonUploadOPMLFile": "Загрузіць файл OPML", "ButtonUserDelete": "Выдаліць карыстальніка {0}", "ButtonUserEdit": "Рэдагаваць карыстальніка {0}", "ButtonViewAll": "Прагледзець усе", @@ -294,7 +294,7 @@ "LabelContinueReading": "Працягнуць чытанне", "LabelContinueSeries": "Працягнуць серыі", "LabelCover": "Вокладка", - "LabelCoverImageURL": "URL малюнка вокладкі", + "LabelCoverImageURL": "URL выявы вокладкі", "LabelCoverProvider": "Крыніца вокладак", "LabelCreatedAt": "Дата стварэння", "LabelCronExpression": "Запіс Cron", @@ -354,6 +354,7 @@ "LabelExpiresInSeconds": "Тэрмін дзеяння заканчваецца праз (секунд)", "LabelExpiresNever": "Ніколі", "LabelExplicit": "Відверты", + "LabelExportOPML": "Экспарт OPML", "LabelFeedURL": "URL стужкі", "LabelFetchingMetadata": "Атрыманне метададзеных", "LabelFile": "Файл", @@ -370,6 +371,7 @@ "LabelHasSupplementaryEbook": "Мае дадатковую электронную кнігу", "LabelHideSubtitles": "Схаваць падзагалоўкі", "LabelHost": "Хост", + "LabelImageURLFromTheWeb": "URL выявы з інтэрнэту", "LabelInProgress": "У працэсе", "LabelIncomplete": "Незавершана", "LabelIntervalCustomDailyWeekly": "Карыстальніцкі штодзённы/штотыднёвы", @@ -400,6 +402,7 @@ "LabelLibraryFilterSublistEmpty": "Не {0}", "LabelLibraryItem": "Элемент бібліятэкі", "LabelLibraryName": "Імя бібліятэкі", + "LabelLibrarySortByProgress": "Прагрэс абноўлены", "LabelLimit": "Абмежаванне", "LabelLineSpacing": "Міжрадковы інтэрвал", "LabelListenAgain": "Паслухаць зноў", @@ -548,9 +551,9 @@ "LabelTimeToShift": "Час зрушэння ў секундах", "LabelTitle": "Назва", "LabelToolsEmbedMetadata": "Убудаваць метададзеныя", - "LabelToolsEmbedMetadataDescription": "Убудаваць метададзеныя ў аўдыёфайлы, уключаючы вокладку і раздзелы.", - "LabelToolsMakeM4bDescription": "Стварыць аўдыёкнігу ў фармаце .M4B з убудаванымі метададзенымі, вокладкай і раздзеламі.", - "LabelToolsSplitM4bDescription": "Стварэнне MP3 з M4B, падзеленага па раздзелах, з убудаванымі метададзенымі, вокладкай і раздзеламі.", + "LabelToolsEmbedMetadataDescription": "Убудаваць метададзеныя ў аўдыёфайлы, уключаючы выяву вокладкі і раздзелы.", + "LabelToolsMakeM4bDescription": "Стварыць аўдыёкнігу ў фармаце .M4B з убудаванымі метададзенымі, выявай вокладкі і раздзеламі.", + "LabelToolsSplitM4bDescription": "Стварэнне MP3 з M4B, падзеленага па раздзелах, з убудаванымі метададзенымі, выявай вокладкі і раздзеламі.", "LabelTotalDuration": "Агульная працягласць", "LabelTotalTimeListened": "Агульны час праслухоўвання", "LabelTrackFromFilename": "Дарожка з імя файла", @@ -612,6 +615,7 @@ "MessageConfirmEmbedMetadataInAudioFiles": "Ці ўпэўненыя вы, што жадаеце ўбудаваць метададзеныя ў {0} аўдыёфайлаў?", "MessageConfirmPurgeCache": "Ачышчэнне кэша выдаліць увесь каталог па адрасе /metadata/cache.

Ці сапраўды вы жадаеце выдаліць каталог кэша?", "MessageConfirmPurgeItemsCache": "Ачышчэнне кэша элементаў выдаліць увесь каталог па адрасе /metadata/cache/items.
Вы ўпэўнены?", + "MessageConfirmQuickMatchEpisodes": "Хуткае супадзенне эпізодаў перазапіша дэталі, калі супадзенне будзе знойдзена. Будуць абноўлены толькі эпізоды, якія не супадаюць. Вы ўпэўнены?", "MessageConfirmRemoveListeningSessions": "Вы ўпэўнены, што жадаеце выдаліць {0} сеансаў праслухоўвання?", "MessageConfirmRemoveMetadataFiles": "Ці ўпэўненыя вы, што жадаеце выдаліць усе файлы метададзеных{0} у тэчках элементаў вашай бібліятэкі?", "MessageConfirmRemovePlaylist": "Вы ўпэўненыя, што жадаеце выдаліць свой спіс прайгравання \"{0}\"?", @@ -622,6 +626,8 @@ "MessageEreaderDevices": "Каб забяспечыць дастаўку электронных кніг, вам можа спатрэбіцца дадаць вышэйзгаданы адрас электроннай пошты як дазволенага адпраўніка для кожнай прылады, пералічанай ніжэй.", "MessageFeedURLWillBe": "URL стужкі будзе {0}", "MessageFetching": "Атрыманне...", + "MessageInvalidAsin": "Няправільны ASIN", + "MessageItemsUpdated": "{0} элементаў абноўлена", "MessageLoading": "Загрузка...", "MessageLogsDescription": "Журналы захоўваюцца ў каталогу /metadata/logs у фармаце JSON. Журналы памылак захоўваюцца ў файле /metadata/logs/crashlogs.txt.", "MessageMapChapterTitles": "Супаставіць назвы раздзелаў з вашымі існуючымі раздзеламі аўдыякнігі без змянення часовых метак", @@ -641,13 +647,13 @@ "MessageNoUpdatesWereNecessary": "Абнаўленні не патрабаваліся", "MessageNoUserPlaylists": "У вас няма спісаў прайгравання", "MessageNoUserPlaylistsHelp": "Спісы прайгравання прыватныя. Толькі карыстальнік, які іх стварыў, можа іх бачыць.", - "MessageOpmlPreviewNote": "Заўвага: гэта папярэдні прагляд разабранага OPML-файла. Фактычная назва падкаста будзе ўзятая з RSS-стужкі.", + "MessageOpmlPreviewNote": "Заўвага: гэта папярэдні прагляд разабранага файла OPML. Фактычная назва падкаста будзе ўзятая з RSS-стужкі.", "MessagePlaylistCreateFromCollection": "Стварыць спіс прайгравання з калекцыі", "MessagePodcastHasNoRSSFeedForMatching": "У падкаста няма URL RSS-стужкі для супадзення", "MessagePodcastSearchField": "Увядзіце пошукавы запыт або URL RSS-стужкі", "MessageQuickMatchDescription": "Запоўніць пустыя дэталі элемента і вокладку першым вынікам супадзення з '{0}'. Не замяняе дэталі, калі опцыя «Аддаваць перавагу супадаючым метададзеным» на серверы не ўключана.", "MessageReportBugsAndContribute": "Паведамляйце пра памылкі, прапануйце новыя функцыі і ўдзельнічайце на", - "MessageRestoreBackupWarning": "Аднаўленне рэзервовай копіі перазапіша ўсю базу даных, размешчаную ў /config, а таксама вокладкі ў /metadata/items і /metadata/authors.

Рэзервовыя копіі не змяняюць файлы ў вашых тэчках бібліятэкі. Калі вы ўключылі наладкі сервера для захоўвання воклак і метададзеных у тэчках бібліятэкі, гэтыя файлы не будуць захаваныя ў рэзервовых копіях і не зменяцца.

Усе кліенты, якія карыстаюцца вашым серверам, будуць аўтаматычна абноўлены.", + "MessageRestoreBackupWarning": "Аднаўленне рэзервовай копіі перазапіша ўсю базу даных, размешчаную ў /config, а таксама выявы вокладкі ў /metadata/items і /metadata/authors.

Рэзервовыя копіі не змяняюць файлы ў вашых тэчках бібліятэкі. Калі вы ўключылі наладкі сервера для захоўвання воклак і метададзеных у тэчках бібліятэкі, гэтыя файлы не будуць захаваныя ў рэзервовых копіях і не зменяцца.

Усе кліенты, якія карыстаюцца вашым серверам, будуць аўтаматычна абноўлены.", "MessageScheduleRunEveryWeekdayAtTime": "Выконваць кожныя {0} у {1}", "MessageStartPlaybackAtTime": "Пачаць прайграванне для \"{0}\" з {1}?", "MessageTaskAudioFileNotWritable": "Аўдыёфайл \"{0}\" недаступны для запісу", @@ -668,13 +674,22 @@ "MessageTaskNoFilesToScan": "Няма файлаў для сканавання", "MessageTaskOpmlImport": "Імпарт OPML", "MessageTaskOpmlImportDescription": "Стварэнне падкастаў з {0} RSS-стужак", - "MessageTaskOpmlImportFeed": "Імпарт стужкі з OPML", + "MessageTaskOpmlImportFeed": "Імпарт стужкі OPML", "MessageTaskOpmlImportFeedDescription": "Імпартаванне RSS-стужкі \"{0}\"", "MessageTaskOpmlImportFeedFailed": "Не ўдалося атрымаць стужку падкаста", "MessageTaskOpmlImportFeedPodcastDescription": "Стварэнне падкаста \"{0}\"", "MessageTaskOpmlImportFeedPodcastExists": "Падкаст ужо існуе па гэтым шляху", "MessageTaskOpmlImportFeedPodcastFailed": "Не ўдалося стварыць падкаст", - "MessageTaskOpmlParseNoneFound": "У OPML-файле не знойдзена стужак", + "MessageTaskOpmlImportFinished": "Дададзена {0} падкастаў", + "MessageTaskOpmlParseFailed": "Не ўдалося разабраць файл OPML", + "MessageTaskOpmlParseFastFail": "Неправільны файл OPML: тэг не знойдзены АБО тэг не знойдзены", + "MessageTaskOpmlParseNoneFound": "У файле OPML не знойдзена стужак", + "MessageTaskScanItemsAdded": "{0} дададзена", + "MessageTaskScanItemsMissing": "{0} адсутнічае", + "MessageTaskScanItemsUpdated": "{0} абноўлена", + "MessageTaskScanNoChangesNeeded": "Змены не патрабуюцца", + "MessageTaskScanningFileChanges": "Сканіраванне змяненняў у файле \"{0}\"", + "MessageTaskScanningLibrary": "Сканіраванне бібліятэкі \"{0}\"", "MessageTaskTargetDirectoryNotWritable": "Мэтавы каталог недаступны для запісу", "NoteChapterEditorTimes": "Заўвага: Час пачатку першага раздзела павінен заставацца 0:00, а час пачатку апошняга раздзела не можа перавышаць працягласць гэтай аўдыякнігі.", "NoteRSSFeedPodcastAppsHttps": "Папярэджанне: большасць праграм для падкастаў патрабуюць, каб URL RSS-стужкі выкарыстоўваў HTTPS", @@ -687,6 +702,11 @@ "StatsBooksListenedTo": "кнігі, якія былі праслуханы", "StatsCollectionGrewTo": "Ваша калекцыя кніг павялічылася да…", "ToastAccountUpdateSuccess": "Уліковы запіс абноўлены", + "ToastAuthorImageRemoveSuccess": "Выява аўтара выдалена", + "ToastAuthorUpdateSuccess": "Аўтар абноўлены", + "ToastAuthorUpdateSuccessNoImageFound": "Аўтар абноўлены (малюнак не знойдзены)", + "ToastBackupInvalidMaxKeep": "Няправільная колькасць рэзервовых копій для захоўвання", + "ToastBackupInvalidMaxSize": "Няправільны максімальны памер рэзервовай копіі", "ToastBookmarkCreateFailed": "Не ўдалося стварыць закладку", "ToastDateTimeInvalidOrIncomplete": "Дата і час указаны некарэктна або не цалкам", "ToastDeviceTestEmailFailed": "Не ўдалося адправіць тэставае электроннае пісьмо", @@ -694,6 +714,7 @@ "ToastEncodeCancelSucces": "Кадаванне скасавана", "ToastEpisodeDownloadQueueClearFailed": "Не ўдалося ачысціць чаргу", "ToastEpisodeDownloadQueueClearSuccess": "Чарга спампоўкі эпізодаў ачышчана", + "ToastInvalidImageUrl": "Няправільны URL выявы", "ToastInvalidMaxEpisodesToDownload": "Няправільная максімальная колькасць эпізодаў для спампоўкі", "ToastItemMarkedAsFinishedFailed": "Не ўдалося пазначыць як Скончана", "ToastItemMarkedAsFinishedSuccess": "Элемент пазначаны як Завершаны", From 3a16acbba4a6810c729c87de0ec54951cab9b13b Mon Sep 17 00:00:00 2001 From: ugyes Date: Wed, 13 Aug 2025 08:31:47 +0200 Subject: [PATCH 018/217] Translated using Weblate (Hungarian) Currently translated at 99.8% (1136 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/ --- client/strings/hu.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/strings/hu.json b/client/strings/hu.json index 8fdbe52b..bc77c561 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -199,6 +199,7 @@ "HeaderSettingsExperimental": "Kísérleti funkciók", "HeaderSettingsGeneral": "Általános", "HeaderSettingsScanner": "Szkenner", + "HeaderSettingsSecurity": "Biztonság", "HeaderSettingsWebClient": "Webkliens", "HeaderSleepTimer": "Alvásidőzítő", "HeaderStatsLargestItems": "Legnagyobb elemek", @@ -293,6 +294,7 @@ "LabelContinueListening": "Hallgatás folytatása", "LabelContinueReading": "Olvasás folytatása", "LabelContinueSeries": "Sorozat folytatása", + "LabelCorsAllowed": "Megengedett CORS Originek", "LabelCover": "Borító", "LabelCoverImageURL": "Borítókép URL", "LabelCoverProvider": "Borító Szolgáltató", @@ -1032,6 +1034,7 @@ "ToastInvalidImageUrl": "Érvénytelen a kép URL címe", "ToastInvalidMaxEpisodesToDownload": "A letölthető epizódok száma érvénytelen", "ToastInvalidUrl": "Érvénytelen URL", + "ToastInvalidUrls": "Egy vagy több URL érvénytelen", "ToastItemCoverUpdateSuccess": "Elem borítója frissítve", "ToastItemDeletedFailed": "Nem sikerült törölni az elemet", "ToastItemDeletedSuccess": "Elem törölve", From 6d7639853ba972d0c8ee343cd73c438ed95332be Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Wed, 13 Aug 2025 13:26:02 +0200 Subject: [PATCH 019/217] Translated using Weblate (Swedish) Currently translated at 96.6% (1100 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index 20832946..15afc948 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -198,6 +198,7 @@ "HeaderSettingsExperimental": "Experimentella funktioner", "HeaderSettingsGeneral": "Allmänt", "HeaderSettingsScanner": "Skanner", + "HeaderSettingsSecurity": "Säkerhet", "HeaderSettingsWebClient": "Webklient", "HeaderSleepTimer": "Timer för att sova", "HeaderStatsLargestItems": "Största objekten", @@ -241,6 +242,7 @@ "LabelAlreadyInYourLibrary": "Finns redan i samlingen", "LabelApiKeyCreated": "API-nyckel \"{0}\" har adderats.", "LabelApiKeyCreatedDescription": "Se till att kopiera API-nyckeln omedelbart eftersom du inte kommer att kunna se den igen.", + "LabelApiKeyUser": "Agera på uppdrag av användare", "LabelApiKeyUserDescription": "Denna API-nyckel kommer att ha samma behörigheter som användaren den agerar på uppdrag av. Detta kommer att visas på samma sätt i loggarna som om användaren gjorde begäran.", "LabelApiToken": "API-token", "LabelAppend": "Lägg till", @@ -291,6 +293,7 @@ "LabelContinueListening": "Fortsätt att lyssna", "LabelContinueReading": "Fortsätt att läsa", "LabelContinueSeries": "Fortsätt med serien", + "LabelCorsAllowed": "Godkänd CORS Origins", "LabelCover": "Omslag", "LabelCoverImageURL": "URL till omslagsbild", "LabelCoverProvider": "Källa för omslag", @@ -806,7 +809,7 @@ "MessageMarkAllEpisodesNotFinished": "Markera alla avsnitt som ej avslutade", "MessageMarkAsFinished": "Markera som avslutad", "MessageMarkAsNotFinished": "Markera som ej avslutad", - "MessageMatchBooksDescription": "kommer att försöka matcha böcker i biblioteket med en bok från den valda källan och fylla i uppgifter som saknas och omslag. Inga befintliga uppgifter kommer att ersättas.", + "MessageMatchBooksDescription": "kommer att försöka matcha böcker i biblioteket med en bok från den valda källan och fylla i uppgifter som saknas och omslag som saknas. Inga befintliga uppgifter kommer att ersättas.", "MessageNoAudioTracks": "Inga ljudfiler har hittats", "MessageNoAuthors": "Inga författare", "MessageNoBackups": "Inga säkerhetskopior", From b2a5fb46f194ce1af94ed8bd65f74634dd815aec Mon Sep 17 00:00:00 2001 From: Sneaky Date: Thu, 14 Aug 2025 19:50:21 +0200 Subject: [PATCH 020/217] Translated using Weblate (Swedish) Currently translated at 96.6% (1100 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index 15afc948..f9f38919 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -181,6 +181,7 @@ "HeaderPlaylist": "Spellista", "HeaderPlaylistItems": "Böcker i spellistan", "HeaderPodcastsToAdd": "Podcaster att lägga till", + "HeaderPresets": "Förinställningar", "HeaderPreviewCover": "Förhandsgranska omslag", "HeaderRSSFeedGeneral": "RSS-information", "HeaderRSSFeedIsOpen": "RSS-flödet är öppet", @@ -419,6 +420,7 @@ "LabelLanguages": "Språk", "LabelLastBookAdded": "Bok senast adderad", "LabelLastBookUpdated": "Bok senast uppdaterad", + "LabelLastProgressDate": "Senaste framsteg: {0}", "LabelLastSeen": "Senast inloggad", "LabelLastTime": "Senaste tillfället", "LabelLastUpdate": "Senast uppdaterad", @@ -431,6 +433,7 @@ "LabelLibraryFilterSublistEmpty": "Ingen {0}", "LabelLibraryItem": "Objekt", "LabelLibraryName": "Biblioteksnamn", + "LabelLibrarySortByProgress": "Framsteg uppdaterat", "LabelLimit": "Begränsning", "LabelLineSpacing": "Radavstånd", "LabelListenAgain": "Lyssna igen", @@ -520,6 +523,7 @@ "LabelPrimaryEbook": "Primär e-bok", "LabelProgress": "Framsteg", "LabelProvider": "Källa", + "LabelProviderAuthorizationValue": "Värde för auktoriseringsheader", "LabelPubDate": "Publiceringsdatum", "LabelPublishYear": "Utgivningsår", "LabelPublishedDate": "Publicerad {0}", @@ -529,7 +533,7 @@ "LabelPublishers": "Utgivare", "LabelRSSFeedCustomOwnerEmail": "Anpassad ägarens e-post", "LabelRSSFeedCustomOwnerName": "Anpassat ägarnamn", - "LabelRSSFeedOpen": "Öppna RSS-flöde", + "LabelRSSFeedOpen": "RSS-flöde öppet", "LabelRSSFeedPreventIndexing": "Förhindra indexering", "LabelRSSFeedSlug": "RSS-flödesslag", "LabelRSSFeedURL": "URL-adress för RSS-flödet", @@ -612,14 +616,17 @@ "LabelSettingsTimeFormat": "Tidsformat", "LabelShare": "Dela", "LabelShareDownloadableHelp": "Tillåt att användare som fått en delad länk att ladda ner ett komprimerat objekt från biblioteket.", + "LabelShareOpen": "Delning öppet", "LabelShareURL": "Dela URL-länk", "LabelShowAll": "Visa alla", "LabelShowSeconds": "Visa i sekunder", "LabelShowSubtitles": "Visa underrubriker", "LabelSize": "Storlek", "LabelSleepTimer": "Sovtimer", + "LabelSlug": "Kortnamn", "LabelSortAscending": "Stigande", "LabelSortDescending": "Fallande", + "LabelSortPubDate": "Sortera efter publiceringsdatum", "LabelStart": "Start", "LabelStartTime": "Starttid", "LabelStarted": "Startad", @@ -708,6 +715,7 @@ "LabelViewPlayerSettings": "Visa inställningar för uppspelning", "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:", "LabelWeekdaysToRun": "Veckodagar att köra skanning", "LabelXBooks": "{0} böcker", "LabelXItems": "{0} objekt", From 8f310b6bf0a3830e105722d322225f1a1b876257 Mon Sep 17 00:00:00 2001 From: Hang Pham Date: Wed, 13 Aug 2025 16:11:29 +0200 Subject: [PATCH 021/217] Translated using Weblate (Vietnamese) Currently translated at 62.2% (708 of 1138 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/vi/ --- client/strings/vi-vn.json | 55 ++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/client/strings/vi-vn.json b/client/strings/vi-vn.json index 7dd46d4a..b8a25720 100644 --- a/client/strings/vi-vn.json +++ b/client/strings/vi-vn.json @@ -1,5 +1,6 @@ { "ButtonAdd": "Thêm", + "ButtonAddApiKey": "Thêm API Key", "ButtonAddChapters": "Thêm Chương", "ButtonAddDevice": "Thêm Thiết Bị", "ButtonAddLibrary": "Thêm Thư Viện", @@ -9,6 +10,7 @@ "ButtonApply": "Áp Dụng", "ButtonApplyChapters": "Áp Dụng Chương", "ButtonAuthors": "Tác Giả", + "ButtonBack": "Quay lại", "ButtonBrowseForFolder": "Duyệt Thư Mục", "ButtonCancel": "Hủy", "ButtonCancelEncode": "Hủy Mã Hóa", @@ -17,7 +19,9 @@ "ButtonChooseAFolder": "Chọn một thư mục", "ButtonChooseFiles": "Chọn tập tin", "ButtonClearFilter": "Xóa Bộ Lọc", + "ButtonClose": "Đóng", "ButtonCloseFeed": "Đóng Feed", + "ButtonCloseSession": "Đóng phiên hiện tại", "ButtonCollections": "Bộ Sưu Tập", "ButtonConfigureScanner": "Cấu Hình Bộ Quét", "ButtonCreate": "Tạo", @@ -27,6 +31,10 @@ "ButtonEdit": "Chỉnh Sửa", "ButtonEditChapters": "Chỉnh Sửa Chương", "ButtonEditPodcast": "Chỉnh Sửa Podcast", + "ButtonEnable": "Kích hoạt", + "ButtonFireAndFail": "Chạy và báo lỗi", + "ButtonFireOnTest": "Chạy thử", + "ButtonForceReScan": "Quét lại", "ButtonFullPath": "Đường Dẫn Đầy Đủ", "ButtonHide": "Ẩn", "ButtonHome": "Trang Chủ", @@ -44,21 +52,28 @@ "ButtonNevermind": "Không Sao", "ButtonNext": "Tiếp Theo", "ButtonNextChapter": "Chương Tiếp Theo", + "ButtonNextItemInQueue": "Mục tiếp theo trong hàng đợi", + "ButtonOk": "Chấp nhận", "ButtonOpenFeed": "Mở Feed", "ButtonOpenManager": "Mở Quản Lý", "ButtonPause": "Tạm Dừng", "ButtonPlay": "Phát", + "ButtonPlayAll": "Phát tất cả", "ButtonPlaying": "Đang Phát", "ButtonPlaylists": "Danh Sách Phát", "ButtonPrevious": "Trước", "ButtonPreviousChapter": "Chương Trước", + "ButtonProbeAudioFile": "Kiểm tra tệp âm thanh", "ButtonPurgeAllCache": "Xóa Sạch Tất Cả Bộ Nhớ Cache", "ButtonPurgeItemsCache": "Xóa Sạch Bộ Nhớ Cache Các Mục", "ButtonQueueAddItem": "Thêm vào hàng đợi", "ButtonQueueRemoveItem": "Xóa khỏi hàng đợi", + "ButtonQuickEmbed": "Nhúng nhanh", "ButtonQuickMatch": "Khớp Nhanh", "ButtonReScan": "Quét Lại", "ButtonRead": "Đọc", + "ButtonReadLess": "Thu gọn", + "ButtonReadMore": "Đọc thêm", "ButtonRefresh": "Làm Mới", "ButtonRemove": "Xóa", "ButtonRemoveAll": "Xóa Tất Cả", @@ -74,6 +89,8 @@ "ButtonSaveTracklist": "Lưu Danh Sách Track", "ButtonScan": "Quét", "ButtonScanLibrary": "Quét Thư Viện", + "ButtonScrollLeft": "Cuộn trái", + "ButtonScrollRight": "Cuộn phải", "ButtonSearch": "Tìm Kiếm", "ButtonSelectFolderPath": "Chọn Đường Dẫn Thư Mục", "ButtonSetChaptersFromTracks": "Đặt chương từ các track", @@ -82,8 +99,10 @@ "ButtonShow": "Hiện", "ButtonStartM4BEncode": "Bắt đầu Mã Hóa M4B", "ButtonStartMetadataEmbed": "Bắt đầu Nhúng Dữ Liệu", + "ButtonStats": "Dữ liệu", "ButtonSubmit": "Gửi", "ButtonTest": "Kiểm Tra", + "ButtonUnlinkOpenId": "Huỷ liên kết OpenID", "ButtonUpload": "Tải Lên", "ButtonUploadBackup": "Tải Lên Bản Sao Lưu", "ButtonUploadCover": "Tải Lên Bìa", @@ -98,7 +117,7 @@ "HeaderAccount": "Tài Khoản", "HeaderAdvanced": "Nâng Cao", "HeaderAppriseNotificationSettings": "Cài Đặt Thông Báo Apprise", - "HeaderAudioTracks": "Các Track Âm Thanh", + "HeaderAudioTracks": "Danh Sách Âm Thanh", "HeaderAudiobookTools": "Công Cụ Quản Lý Tệp Truyện Nói", "HeaderAuthentication": "Xác Thực", "HeaderBackups": "Bản Sao Lưu", @@ -106,9 +125,10 @@ "HeaderChapters": "Chương", "HeaderChooseAFolder": "Chọn Một Thư Mục", "HeaderCollection": "Bộ Sưu Tập", - "HeaderCollectionItems": "Các Mục Bộ Sưu Tập", + "HeaderCollectionItems": "Danh sách Bộ Sưu Tập", "HeaderCover": "Bìa", "HeaderCurrentDownloads": "Tải Xuống Hiện Tại", + "HeaderCustomMessageOnLogin": "Tin nhắn tuỳ chọn khi đăng nhập", "HeaderCustomMetadataProviders": "Các Nhà Cung Cấp Metadata Tùy Chỉnh", "HeaderDetails": "Chi Tiết", "HeaderDownloadQueue": "Hàng Đợi Tải Xuống", @@ -139,6 +159,8 @@ "HeaderMetadataToEmbed": "Metadata để nhúng", "HeaderNewAccount": "Tài Khoản Mới", "HeaderNewLibrary": "Thư Viện Mới", + "HeaderNotificationCreate": "Tạo thông báo", + "HeaderNotificationUpdate": "Cập nhập thông báo", "HeaderNotifications": "Thông Báo", "HeaderOpenIDConnectAuthentication": "Xác Thực Mở ID Connect", "HeaderOpenRSSFeed": "Mở RSS Feed", @@ -146,6 +168,7 @@ "HeaderPasswordAuthentication": "Xác Thực Mật Khẩu", "HeaderPermissions": "Quyền Hạn", "HeaderPlayerQueue": "Hàng Đợi Người Chơi", + "HeaderPlayerSettings": "Cài đặt trình phát", "HeaderPlaylist": "Danh Sách Phát", "HeaderPlaylistItems": "Các Mục Danh Sách Phát", "HeaderPodcastsToAdd": "Podcasts để Thêm", @@ -156,6 +179,7 @@ "HeaderRemoveEpisodes": "Xóa {0} Tập", "HeaderSavedMediaProgress": "Tiến Trình Phương Tiện Đã Lưu", "HeaderSchedule": "Lịch Trình", + "HeaderScheduleEpisodeDownloads": "Đặt lịch tự động tải tập", "HeaderScheduleLibraryScans": "Lên Lịch Quét Tự Động Thư Viện", "HeaderSession": "Phiên", "HeaderSetBackupSchedule": "Đặt Lịch Sao Lưu", @@ -164,6 +188,7 @@ "HeaderSettingsExperimental": "Tính Năng Thử Nghiệm", "HeaderSettingsGeneral": "Chung", "HeaderSettingsScanner": "Máy Quét", + "HeaderSettingsSecurity": "Bảo mật", "HeaderSleepTimer": "Hẹn Giờ Tắt", "HeaderStatsLargestItems": "Các Mục Lớn Nhất", "HeaderStatsLongestItems": "Các Mục Dài Nhất (giờ)", @@ -174,6 +199,7 @@ "HeaderTableOfContents": "Mục Lục", "HeaderTools": "Công Cụ", "HeaderUpdateAccount": "Cập Nhật Tài Khoản", + "HeaderUpdateApiKey": "Cập nhập API Key", "HeaderUpdateAuthor": "Cập Nhật Tác Giả", "HeaderUpdateDetails": "Cập Nhật Chi Tiết", "HeaderUpdateLibrary": "Cập Nhật Thư Viện", @@ -190,6 +216,8 @@ "LabelAddToCollectionBatch": "Thêm {0} Sách vào Bộ Sưu Tập", "LabelAddToPlaylist": "Thêm vào Danh Sách Phát", "LabelAddedAt": "Đã Thêm Lúc", + "LabelAddedDate": "Đã thêm {0}", + "LabelAutoDownloadEpisodes": "Tự Động Tải Xuống Các Tập", "LabelBackupsMaxBackupSize": "Maximum backup size (in GB)", "LabelBooks": "Sách", "LabelButtonText": "Nút Văn Bản", @@ -231,7 +259,7 @@ "LabelDownloadNEpisodes": "Tải Xuống {0} Tập", "LabelDuration": "Thời Lượng", "LabelDurationFound": "Thời lượng được tìm thấy:", - "LabelEbooks": "Các Ebook", + "LabelEbooks": "", "LabelEdit": "Chỉnh Sửa", "LabelEmailSettingsFromAddress": "Địa chỉ Gửi từ", "LabelEmailSettingsSecure": "Bảo Mật", @@ -257,6 +285,7 @@ "LabelFolder": "Thư Mục", "LabelFolders": "Các Thư Mục", "LabelFontBold": "Đậm", + "LabelFontBoldness": "Chữ đậm", "LabelFontFamily": "Gia đình font", "LabelFontItalic": "Nghiêng", "LabelFontScale": "Tỷ lệ font", @@ -268,7 +297,7 @@ "LabelHasEbook": "Có ebook", "LabelHasSupplementaryEbook": "Có ebook bổ sung", "LabelHighestPriority": "Ưu tiên cao nhất", - "LabelHost": "Máy chủ", + "LabelHost": "Máy Chủ", "LabelHour": "Giờ", "LabelIcon": "Biểu tượng", "LabelImageURLFromTheWeb": "URL hình ảnh từ web", @@ -303,7 +332,7 @@ "LabelLibraryName": "Tên thư viện", "LabelLimit": "Giới hạn", "LabelLineSpacing": "Khoảng cách dòng", - "LabelListenAgain": "Nghe lại", + "LabelListenAgain": "Nghe Lại", "LabelLogLevelDebug": "Gỡ lỗi", "LabelLogLevelInfo": "Thông tin", "LabelLogLevelWarn": "Cảnh báo", @@ -312,13 +341,13 @@ "LabelMatchExistingUsersBy": "Kết hợp người dùng hiện có theo", "LabelMatchExistingUsersByDescription": "Sử dụng để kết nối người dùng hiện có. Khi kết nối, người dùng sẽ được kết hợp bằng một ID duy nhất từ nhà cung cấp SSO của bạn", "LabelMediaPlayer": "Trình phát đa phương tiện", - "LabelMediaType": "Loại phương tiện", + "LabelMediaType": "Loại Phương Tiện", "LabelMetaTag": "Thẻ Meta", "LabelMetaTags": "Các thẻ Meta", "LabelMetadataOrderOfPrecedenceDescription": "Nguồn siêu dữ liệu ưu tiên cao hơn sẽ ghi đè lên các nguồn siêu dữ liệu ưu tiên thấp hơn", "LabelMetadataProvider": "Nhà cung cấp siêu dữ liệu", "LabelMinute": "Phút", - "LabelMissing": "Thiếu", + "LabelMissing": "", "LabelMissingEbook": "Không có ebook", "LabelMissingSupplementaryEbook": "Không có ebook bổ sung", "LabelMobileRedirectURIs": "URI chuyển hướng di động được cho phép", @@ -335,7 +364,7 @@ "LabelNextBackupDate": "Ngày sao lưu tiếp theo", "LabelNextScheduledRun": "Chạy tiếp theo theo lịch trình", "LabelNoEpisodesSelected": "Không có tập nào được chọn", - "LabelNotFinished": "Chưa hoàn thành", + "LabelNotFinished": "Chưa Hoàn Thành", "LabelNotStarted": "Chưa bắt đầu", "LabelNotes": "Ghi chú", "LabelNotificationAppriseURL": "URL(s) thông báo", @@ -348,7 +377,7 @@ "LabelNotificationsMaxQueueSize": "Kích thước hàng đợi tối đa cho sự kiện thông báo", "LabelNotificationsMaxQueueSizeHelp": "Các sự kiện bị giới hạn mỗi giây chỉ gửi 1 lần. Các sự kiện sẽ bị bỏ qua nếu hàng đợi đạt kích thước tối đa. Điều này ngăn chặn spam thông báo.", "LabelNumberOfBooks": "Số lượng Sách", - "LabelNumberOfEpisodes": "# của Tập", + "LabelNumberOfEpisodes": "Số lượng tập", "LabelOpenRSSFeed": "Mở RSS Feed", "LabelOverwrite": "Ghi đè", "LabelPassword": "Mật khẩu", @@ -364,17 +393,19 @@ "LabelPhotoPathURL": "Đường dẫn/URL ảnh", "LabelPlayMethod": "Phương pháp phát", "LabelPlaylists": "Danh sách phát", + "LabelPodcast": "Podcast", "LabelPodcastSearchRegion": "Vùng tìm kiếm podcast", "LabelPodcastType": "Loại Podcast", - "LabelPodcasts": "Các podcast", + "LabelPodcasts": "Podcasts", "LabelPort": "Cổng", "LabelPrefixesToIgnore": "Tiền tố để bỏ qua (không phân biệt chữ hoa/chữ thường)", - "LabelPreventIndexing": "Ngăn chặn feed của bạn được chỉ mục bởi thư mục podcast của iTunes và Google", + "LabelPreventIndexing": "Ngăn Chặn Feed của bạn bị truy xuất bởi thư mục iTunes và Google podcast", "LabelPrimaryEbook": "Ebook chính", "LabelProgress": "Tiến độ", "LabelProvider": "Nhà cung cấp", "LabelPubDate": "Ngày Xuất bản", - "LabelPublishYear": "Năm Xuất bản", + "LabelPublishYear": "Năm Xuất Bản", + "LabelPublishedDate": "Xuất bản vào {0}", "LabelPublisher": "Nhà xuất bản", "LabelRSSFeedCustomOwnerEmail": "Email chủ sở hữu tùy chỉnh", "LabelRSSFeedCustomOwnerName": "Tên chủ sở hữu tùy chỉnh", From 7e2b51e6d292689d500c934a21bd03f516cc7e27 Mon Sep 17 00:00:00 2001 From: biuklija Date: Fri, 15 Aug 2025 12:04:10 +0200 Subject: [PATCH 022/217] Translated using Weblate (Croatian) Currently translated at 100.0% (1156 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/ --- client/strings/hr.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/client/strings/hr.json b/client/strings/hr.json index 7ef3f68e..e1317908 100644 --- a/client/strings/hr.json +++ b/client/strings/hr.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Alati za upravljanje datotekama zvučnih knjiga", "HeaderAuthentication": "Provjera autentičnosti", "HeaderBackups": "Sigurnosne kopije", + "HeaderBulkChapterModal": "Dodaj više poglavlja", "HeaderChangePassword": "Promjena zaporke", "HeaderChapters": "Poglavlja", "HeaderChooseAFolder": "Odaberi mapu", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Izbriši datoteke (uklonite kvačicu ako stavku želite izbrisati samo iz baze podataka)", "LabelDescription": "Opis", "LabelDeselectAll": "Odznači sve", + "LabelDetectedPattern": "Prepoznat obrazac:", "LabelDevice": "Uređaj", "LabelDeviceInfo": "O uređaju", "LabelDeviceIsAvailableTo": "Uređaj je dostupan...", @@ -472,6 +474,7 @@ "LabelNewestAuthors": "Najnoviji autori", "LabelNewestEpisodes": "Najnoviji nastavci", "LabelNextBackupDate": "Sljedeća izrada sigurnosne kopije", + "LabelNextChapters": "Sljedeća poglavlja bit će:", "LabelNextScheduledRun": "Sljedeće zakazano izvođenje", "LabelNoApiKeys": "Nema API ključeva", "LabelNoCustomMetadataProviders": "Nema prilagođenih pružatelja meta-podataka", @@ -489,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Najveći broj događaja za obavijest u redu čekanja", "LabelNotificationsMaxQueueSizeHelp": "Događaji se mogu okinuti samo jednom u sekundi. Događaji će se zanemariti ako je red čekanja pun. Ovo sprečava prekomjerno slanje obavijesti.", "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:", "LabelOpenIDClaims": "Sljedeće opcije ostavite praznima ako želite onemogućiti napredno dodjeljivanje grupa i dozvola, odnosno ako želite automatski dodijeliti grupu 'korisnik'.", @@ -745,6 +749,7 @@ "MessageBookshelfNoResultsForFilter": "Nema rezultata za filter \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Vaš upit nema rezultata", "MessageBookshelfNoSeries": "Nemate niti jedan serijal", + "MessageBulkChapterPattern": "Koliko poglavlja želite dodati s ovim obrascem numeracije?", "MessageChapterEndIsAfter": "Kraj poglavlja je nakon kraja zvučne knjige", "MessageChapterErrorFirstNotZero": "Prvo poglavlje mora započeti u 0", "MessageChapterErrorStartGteDuration": "Netočno vrijeme početka, mora biti manje od trajanja zvučne knjige", @@ -948,6 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "Pokreće se kada su automatska preuzimanja nastavaka onemogućena zbog previše neuspjelih pokušaja", "NotificationOnRSSFeedFailedDescription": "Pokreće se u slučaju pogreške pri pokušaju automatskog preuzimanja nastavka s RSS izvora", "NotificationOnTestDescription": "Događaj za testiranje sustava obavijesti", + "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", @@ -1001,8 +1007,12 @@ "ToastBookmarkCreateFailed": "Izrada knjižne oznake nije uspjela", "ToastBookmarkCreateSuccess": "Knjižna oznaka dodana", "ToastBookmarkRemoveSuccess": "Knjižna oznaka uklonjena", + "ToastBulkChapterInvalidCount": "Upišite broj od 1 i 150", "ToastCachePurgeFailed": "Čišćenje predmemorije nije uspjelo", "ToastCachePurgeSuccess": "Predmemorija uspješno očišćena", + "ToastChapterLocked": "Poglavlje je zaključano.", + "ToastChapterStartTimeAdjusted": "Vrijeme početka poglavlja prilagođeno za {0} sekundi", + "ToastChaptersAllLocked": "Sva su poglavlja zaključana. Otključajte neka poglavlja za pomicanje njihovog vremena.", "ToastChaptersHaveErrors": "Poglavlja imaju pogreške", "ToastChaptersInvalidShiftAmountLast": "Neispravna vrijednost pomaka. Početak zadnjeg poglavlja bio bi nakon duljine trajanja ove zvučne knjige.", "ToastChaptersInvalidShiftAmountStart": "Neispravna vrijednost pomaka. Trajanje prvog poglavlja bilo bi nula ili negativno i drugo poglavlje bi ga prepisalo. Povećajte vrijeme početka drugog poglavlja.", @@ -1136,5 +1146,13 @@ "ToastUserPasswordChangeSuccess": "Zaporka je uspješno promijenjena", "ToastUserPasswordMismatch": "Zaporke se ne podudaraju", "ToastUserPasswordMustChange": "Nova zaporka ne smije biti jednaka staroj", - "ToastUserRootRequireName": "Obavezan je unos korisničkog imena root korisnika" + "ToastUserRootRequireName": "Obavezan je unos korisničkog imena root korisnika", + "TooltipAddChapters": "Dodavanje poglavlja", + "TooltipAddOneSecond": "Dodaj 1 sekundu", + "TooltipAdjustChapterStart": "Kliknite za uređivanje početnog vremena", + "TooltipLockAllChapters": "Zaključaj sva poglavlja", + "TooltipLockChapter": "Zaključaj poglavlje (Shift + klik za raspon)", + "TooltipSubtractOneSecond": "Oduzmi 1 sekundu", + "TooltipUnlockAllChapters": "Otključaj sva poglavlja", + "TooltipUnlockChapter": "Otključaj poglavlje (Shift+klik za raspon)" } From cea991b82f75ef2689ca57f39b46b25a57fa3219 Mon Sep 17 00:00:00 2001 From: vanapro1 Date: Fri, 15 Aug 2025 01:21:28 +0200 Subject: [PATCH 023/217] Translated using Weblate (Russian) Currently translated at 100.0% (1156 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/ --- client/strings/ru.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/client/strings/ru.json b/client/strings/ru.json index db2a1a52..efe38aeb 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Инструменты файлов аудиокниг", "HeaderAuthentication": "Аутентификация", "HeaderBackups": "Бэкапы", + "HeaderBulkChapterModal": "Добавление нескольких глав", "HeaderChangePassword": "Изменить пароль", "HeaderChapters": "Главы", "HeaderChooseAFolder": "Выберите папку", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Удалить из файловой системы (снимите флажок, чтобы удалить только из базы данных)", "LabelDescription": "Описание", "LabelDeselectAll": "Снять выделение", + "LabelDetectedPattern": "Обнаруженный образец:", "LabelDevice": "Устройство", "LabelDeviceInfo": "Информация об устройстве", "LabelDeviceIsAvailableTo": "Устройство доступно для...", @@ -472,6 +474,7 @@ "LabelNewestAuthors": "Новые авторы", "LabelNewestEpisodes": "Новые эпизоды", "LabelNextBackupDate": "Следующая дата бэкапирования", + "LabelNextChapters": "Следующие главы будут:", "LabelNextScheduledRun": "Следущий запланированный запуск", "LabelNoApiKeys": "API ключи отсутствуют", "LabelNoCustomMetadataProviders": "Нет пользовательских поставщиков метаданных", @@ -489,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Макс. размер очереди для событий уведомлений", "LabelNotificationsMaxQueueSizeHelp": "События ограничены 1 в секунду. События будут игнорированы если в очереди максимальное количество. Это предотвращает спам сообщениями.", "LabelNumberOfBooks": "Количество книг", + "LabelNumberOfChapters": "Кол-во глав:", "LabelNumberOfEpisodes": "# из эпизодов", "LabelOpenIDAdvancedPermsClaimDescription": "Имя утверждения OpenID, содержащего расширенные разрешения на действия пользователя в приложении, которые будут применяться к ролям, не являющимся администраторами (если они настроены). Если утверждение отсутствует в ответе, в доступе к ABS будет отказано. Если одна опция отсутствует, она будет рассматриваться как false. Убедитесь, что утверждение поставщика удостоверений соответствует ожидаемой структуре:", "LabelOpenIDClaims": "Оставьте следующие параметры пустыми, чтобы отключить расширенное назначение групп и разрешений, будет автоматически присвоена группа «Пользователь».", @@ -745,6 +749,7 @@ "MessageBookshelfNoResultsForFilter": "Нет Результатов для фильтра \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Нет результатов для запроса", "MessageBookshelfNoSeries": "У вас нет серий", + "MessageBulkChapterPattern": "Сколько глав вы хотели бы добавить, используя эту схему нумерации?", "MessageChapterEndIsAfter": "Конец главы после окончания вашей аудиокниги", "MessageChapterErrorFirstNotZero": "Первая глава должна начинаться с 0", "MessageChapterErrorStartGteDuration": "Неверное время начала, должно быть меньше продолжительности аудиокниги", @@ -948,6 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "Срабатывает, когда автоматическая загрузка эпизодов отключена из-за слишком большого количества неудачных попыток", "NotificationOnRSSFeedFailedDescription": "Срабатывает при сбое запроса RSS-канала на автоматическую загрузку эпизода", "NotificationOnTestDescription": "Событие для тестирования системы оповещения", + "PlaceholderBulkChapterInput": "Введите название главы или используйте нумерацию (например, \"Эпизод 1\", \"Глава 10\", \"1.\")", "PlaceholderNewCollection": "Новое имя коллекции", "PlaceholderNewFolderPath": "Путь к новой папке", "PlaceholderNewPlaylist": "Новое название плейлиста", @@ -1001,8 +1007,12 @@ "ToastBookmarkCreateFailed": "Не удалось создать закладку", "ToastBookmarkCreateSuccess": "Добавлена закладка", "ToastBookmarkRemoveSuccess": "Закладка удалена", + "ToastBulkChapterInvalidCount": "Введите число от 1 до 150", "ToastCachePurgeFailed": "Не удалось очистить кэш", "ToastCachePurgeSuccess": "Кэш успешно очищен", + "ToastChapterLocked": "Глава заблокирована.", + "ToastChapterStartTimeAdjusted": "Время начала главы скорректировано на {0} секунд", + "ToastChaptersAllLocked": "Все главы заблокированы. Разблокируйте некоторые главы, чтобы сдвинуть их время.", "ToastChaptersHaveErrors": "Главы имеют ошибки", "ToastChaptersInvalidShiftAmountLast": "Некорректное значение сдвига. Начало последней главы будет превышать продолжительность этой аудиокниги.", "ToastChaptersInvalidShiftAmountStart": "Некорректное значение сдвига. Первая глава будет иметь нулевую или отрицательную длину и будет перезаписана второй главой. Увеличьте начальную продолжительность второй главы.", @@ -1136,5 +1146,13 @@ "ToastUserPasswordChangeSuccess": "Пароль успешно изменен", "ToastUserPasswordMismatch": "Пароли не совпадают", "ToastUserPasswordMustChange": "Новый пароль не может совпадать со старым паролем", - "ToastUserRootRequireName": "Необходимо ввести имя пользователя root" + "ToastUserRootRequireName": "Необходимо ввести имя пользователя root", + "TooltipAddChapters": "Добавить главу(ы)", + "TooltipAddOneSecond": "Добавить 1 секунду", + "TooltipAdjustChapterStart": "Нажмите, чтобы настроить время начала", + "TooltipLockAllChapters": "Заблокировать все главы", + "TooltipLockChapter": "Заблокировать главу (Shift+клик для диапазона)", + "TooltipSubtractOneSecond": "Вычтите 1 секунду", + "TooltipUnlockAllChapters": "Разблокируйте все главы", + "TooltipUnlockChapter": "Разблокируйте главу (Shift+клик для диапазона)" } From b027f3bda1bf865343ef77d5872cec4e2207f020 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: Fri, 15 Aug 2025 06:32:26 +0200 Subject: [PATCH 024/217] Translated using Weblate (Ukrainian) Currently translated at 100.0% (1156 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/ --- client/strings/uk.json | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/client/strings/uk.json b/client/strings/uk.json index f07c3404..a79849ac 100644 --- a/client/strings/uk.json +++ b/client/strings/uk.json @@ -76,7 +76,7 @@ "ButtonReScan": "Пересканувати", "ButtonRead": "Читати", "ButtonReadLess": "Згорнути", - "ButtonReadMore": "Читати далі", + "ButtonReadMore": "Читати більше", "ButtonRefresh": "Оновити", "ButtonRemove": "Видалити", "ButtonRemoveAll": "Видалити все", @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Інструменти керування файлами книг", "HeaderAuthentication": "Автентифікація", "HeaderBackups": "Резервні копії", + "HeaderBulkChapterModal": "Додати кілька розділів", "HeaderChangePassword": "Змінити пароль", "HeaderChapters": "Глави", "HeaderChooseAFolder": "Обрати теку", @@ -292,7 +293,7 @@ "LabelComplete": "Завершити", "LabelConfirmPassword": "Підтвердити пароль", "LabelContinueListening": "Слухати далі", - "LabelContinueReading": "Читати далі", + "LabelContinueReading": "Продовжити читання", "LabelContinueSeries": "Продовжити серії", "LabelCorsAllowed": "Дозволені джерела CORS", "LabelCover": "Обкладинка", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Видалити з файлової системи (зніміть прапорець, щоб видалити лише з бази даних)", "LabelDescription": "Опис", "LabelDeselectAll": "Скасувати вибір", + "LabelDetectedPattern": "Виявлений візерунок:", "LabelDevice": "Пристрій", "LabelDeviceInfo": "Про пристрій", "LabelDeviceIsAvailableTo": "Пристрій доступний для...", @@ -472,6 +474,7 @@ "LabelNewestAuthors": "Нові автори", "LabelNewestEpisodes": "Нові епізоди", "LabelNextBackupDate": "Дата наступного резервного копіювання", + "LabelNextChapters": "Наступні розділи будуть:", "LabelNextScheduledRun": "Наступний запланований запуск", "LabelNoApiKeys": "Без ключів API", "LabelNoCustomMetadataProviders": "Без постачальників метаданих", @@ -489,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Ліміт розміру черги сповіщень", "LabelNotificationsMaxQueueSizeHelp": "Події обмежені до 1 на секунду. Події буде проігноровано, якщо ліміт черги досягнуто. Це запобігає спаму сповіщеннями.", "LabelNumberOfBooks": "Кількість книг", + "LabelNumberOfChapters": "Кількість розділів:", "LabelNumberOfEpisodes": "Кількість серій", "LabelOpenIDAdvancedPermsClaimDescription": "Назва OpenID claim, що містить розширені дозволи на дії користувачів у додатку, які будуть застосовуватися до ролей, що не є адміністраторами (якщо налаштовано). Якщо у відповіді нема claim, у доступі до Audiobookshelf буде відмовлено. Якщо відсутня хоча б одна опція, відповідь буде вважатися хибною. Переконайтеся, що запит постачальника ідентифікаційних даних відповідає очікуваній структурі:", "LabelOpenIDClaims": "Не змінюйте наступні параметри, аби вимкнути розширене призначення груп і дозволів, автоматично призначаючи групу 'Користувач'.", @@ -745,6 +749,7 @@ "MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Немає результатів за запитом", "MessageBookshelfNoSeries": "У вас немає серій", + "MessageBulkChapterPattern": "Скільки розділів ви хочете додати за допомогою цієї схеми нумерації?", "MessageChapterEndIsAfter": "Кінець глави після завершення аудіокниги", "MessageChapterErrorFirstNotZero": "Перша глава повинна починатися з 0", "MessageChapterErrorStartGteDuration": "Час початку має бути меншим за тривалість аудіокниги", @@ -948,6 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "Виконується, коли автоматичне завантаження епізодів вимкнено через забагато невдалих спроб", "NotificationOnRSSFeedFailedDescription": "Виконується, коли запит RSS-каналу не вдається для автоматичного завантаження епізоду", "NotificationOnTestDescription": "Подія для тестування системи сповіщень", + "PlaceholderBulkChapterInput": "Введіть назву розділу або використовуйте нумерацію (наприклад, «Епізод 1», «Розділ 10», «1.»)", "PlaceholderNewCollection": "Нова назва добірки", "PlaceholderNewFolderPath": "Новий шлях до теки", "PlaceholderNewPlaylist": "Нова назва списку", @@ -1001,8 +1007,12 @@ "ToastBookmarkCreateFailed": "Не вдалося створити закладку", "ToastBookmarkCreateSuccess": "Закладку додано", "ToastBookmarkRemoveSuccess": "Закладку видалено", + "ToastBulkChapterInvalidCount": "Введіть число від 1 до 150", "ToastCachePurgeFailed": "Не вдалося очистити кеш", "ToastCachePurgeSuccess": "Кеш очищено", + "ToastChapterLocked": "Розділ заблоковано.", + "ToastChapterStartTimeAdjusted": "Час початку розділу змінено на {0} секунд", + "ToastChaptersAllLocked": "Усі розділи заблоковано. Розблокуйте деякі розділи, щоб змістити їхній час.", "ToastChaptersHaveErrors": "Глави містять помилки", "ToastChaptersInvalidShiftAmountLast": "Недійсна тривалість зсуву. Час початку останнього розділу перевищує тривалість цієї аудіокниги.", "ToastChaptersInvalidShiftAmountStart": "Недійсна величина зсуву. Перший розділ матиме нульову або від’ємну тривалість і буде перезаписаний другим розділом. Збільште початкову тривалість другого розділу.", @@ -1136,5 +1146,13 @@ "ToastUserPasswordChangeSuccess": "Пароль успішно змінено", "ToastUserPasswordMismatch": "Паролі не збігаються", "ToastUserPasswordMustChange": "Новий пароль не може співпадати з попереднім", - "ToastUserRootRequireName": "Потрібно ввести ім'я користувача root" + "ToastUserRootRequireName": "Потрібно ввести ім'я користувача root", + "TooltipAddChapters": "Додати розділ(и)", + "TooltipAddOneSecond": "Додати 1 секунду", + "TooltipAdjustChapterStart": "Натисніть, щоб налаштувати час початку", + "TooltipLockAllChapters": "Заблокувати всі розділи", + "TooltipLockChapter": "Заблокувати розділ (Shift+клацання для діапазону)", + "TooltipSubtractOneSecond": "Відніміть 1 секунду", + "TooltipUnlockAllChapters": "Розблокувати всі розділи", + "TooltipUnlockChapter": "Розблокувати розділ (Shift+клацання для діапазону)" } From c7a317a87b923552997b4ebc7d018e33f23f94b9 Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Fri, 15 Aug 2025 13:47:23 +0200 Subject: [PATCH 025/217] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1156 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 68994e7a..67d587f0 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "有声读物文件管理工具", "HeaderAuthentication": "身份验证", "HeaderBackups": "备份", + "HeaderBulkChapterModal": "添加多个章节", "HeaderChangePassword": "更改密码", "HeaderChapters": "章节", "HeaderChooseAFolder": "选择文件夹", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "从文件系统删除 (取消选中仅从数据库中删除)", "LabelDescription": "描述", "LabelDeselectAll": "全部取消选择", + "LabelDetectedPattern": "检测到的编号格式:", "LabelDevice": "设备", "LabelDeviceInfo": "设备信息", "LabelDeviceIsAvailableTo": "设备可用于...", @@ -472,6 +474,7 @@ "LabelNewestAuthors": "最新作者", "LabelNewestEpisodes": "最新剧集", "LabelNextBackupDate": "下次备份日期", + "LabelNextChapters": "后续章节示例:", "LabelNextScheduledRun": "下次任务运行", "LabelNoApiKeys": "无 API 密钥", "LabelNoCustomMetadataProviders": "没有自定义元数据提供商", @@ -489,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "通知事件的最大队列大小", "LabelNotificationsMaxQueueSizeHelp": "通知事件被限制为每秒触发 1 个. 如果队列处于最大大小, 则将忽略事件. 这可以防止通知垃圾邮件.", "LabelNumberOfBooks": "图书数量", + "LabelNumberOfChapters": "章节数量:", "LabelNumberOfEpisodes": "# 集数", "LabelOpenIDAdvancedPermsClaimDescription": "OpenID 声明的名称, 该声明包含应用程序内用户操作的高级权限, 该权限将应用于非管理员角色(如果已配置). 如果响应中缺少声明, 获取 ABS 的权限将被拒绝. 如果缺少单个选项, 它将被视为 禁用. 确保身份提供商的声明与预期结构匹配:", "LabelOpenIDClaims": "将以下选项留空以禁用高级组和权限分配, 然后自动分配 'User' 组.", @@ -745,6 +749,7 @@ "MessageBookshelfNoResultsForFilter": "过滤器无结果 \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "没有可查询的结果", "MessageBookshelfNoSeries": "你没有系列", + "MessageBulkChapterPattern": "您想用此编号模式添加多少个章节?", "MessageChapterEndIsAfter": "章节结束是在有声读物结束之后", "MessageChapterErrorFirstNotZero": "第一章节必须从 0 开始", "MessageChapterErrorStartGteDuration": "无效的开始时间, 必须小于有声读物持续时间", @@ -948,6 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "由于尝试失败次数过多而导致剧集自动下载被禁用时触发", "NotificationOnRSSFeedFailedDescription": "当用于自动下载剧集的 RSS 源请求失败时触发", "NotificationOnTestDescription": "测试通知系统的事件", + "PlaceholderBulkChapterInput": "请输入章节标题, 或使用编号格式 (例如: \"Episode 1\", \"Chapter 10\", \"1.\")", "PlaceholderNewCollection": "输入收藏夹名称", "PlaceholderNewFolderPath": "输入文件夹路径", "PlaceholderNewPlaylist": "输入播放列表名称", @@ -1001,8 +1007,12 @@ "ToastBookmarkCreateFailed": "创建书签失败", "ToastBookmarkCreateSuccess": "书签已添加", "ToastBookmarkRemoveSuccess": "书签已删除", + "ToastBulkChapterInvalidCount": "输入一个1到150之间的整数", "ToastCachePurgeFailed": "清除缓存失败", "ToastCachePurgeSuccess": "缓存清除成功", + "ToastChapterLocked": "章节已锁定.", + "ToastChapterStartTimeAdjusted": "章节开始时间已调整 {0} 秒", + "ToastChaptersAllLocked": "所有章节均已锁定. 请解锁要调整时间的章节.", "ToastChaptersHaveErrors": "章节有错误", "ToastChaptersInvalidShiftAmountLast": "偏移量无效. 最后一章的开始时间将超过这本有声读物的持续时间.", "ToastChaptersInvalidShiftAmountStart": "偏移量无效. 第一章的长度将为零或负数, 并会被第二章覆盖. 请增加第二章的起始时长.", @@ -1136,5 +1146,13 @@ "ToastUserPasswordChangeSuccess": "密码修改成功", "ToastUserPasswordMismatch": "密码不匹配", "ToastUserPasswordMustChange": "新密码不能与旧密码相同", - "ToastUserRootRequireName": "必须输入 root 用户名" + "ToastUserRootRequireName": "必须输入 root 用户名", + "TooltipAddChapters": "添加章节", + "TooltipAddOneSecond": "加 1 秒", + "TooltipAdjustChapterStart": "点击调整开始时间", + "TooltipLockAllChapters": "锁定所有章节", + "TooltipLockChapter": "锁定章节 (按住 Shift再点击, 可进行范围选择)", + "TooltipSubtractOneSecond": "减 1 秒", + "TooltipUnlockAllChapters": "解锁所有章节", + "TooltipUnlockChapter": "解锁章节 (按住 Shift再点击, 可进行范围选择)" } From 266db491aafb75e79b08af94ba8ed3046faa9950 Mon Sep 17 00:00:00 2001 From: Zhelyan Radoev Date: Sat, 16 Aug 2025 12:14:19 +0200 Subject: [PATCH 026/217] Translated using Weblate (Bulgarian) Currently translated at 83.9% (971 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bg/ --- client/strings/bg.json | 77 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/client/strings/bg.json b/client/strings/bg.json index 9fc3f7af..5d7e1218 100644 --- a/client/strings/bg.json +++ b/client/strings/bg.json @@ -1,5 +1,6 @@ { "ButtonAdd": "Създай", + "ButtonAddApiKey": "Добави API ключ", "ButtonAddChapters": "Добави Глави", "ButtonAddDevice": "Добави Устройство", "ButtonAddLibrary": "Добави Библиотека", @@ -20,6 +21,7 @@ "ButtonChooseAFolder": "Избери Папка", "ButtonChooseFiles": "Избери Файлове", "ButtonClearFilter": "Изчисти филтър", + "ButtonClose": "Затвори", "ButtonCloseFeed": "Затвори стената", "ButtonCloseSession": "Затвори отворената сесия", "ButtonCollections": "Колекции", @@ -119,11 +121,13 @@ "HeaderAccount": "Профил", "HeaderAddCustomMetadataProvider": "Добави персонализиран доставчик на метаданни", "HeaderAdvanced": "Разширени настройки", + "HeaderApiKeys": "API ключове", "HeaderAppriseNotificationSettings": "Apprise Notification Опции", "HeaderAudioTracks": "Песни", "HeaderAudiobookTools": "Инструмент за Менижиране на Аудиокниги", "HeaderAuthentication": "Аутентикация", "HeaderBackups": "Архив", + "HeaderBulkChapterModal": "Добави няколко глави", "HeaderChangePassword": "Промяна на Парола", "HeaderChapters": "Глави", "HeaderChooseAFolder": "Избети Папка", @@ -162,6 +166,7 @@ "HeaderMetadataOrderOfPrecedence": "Предимство на Метаданни", "HeaderMetadataToEmbed": "Метаданни за Вграждане", "HeaderNewAccount": "Нов Профил", + "HeaderNewApiKey": "Нов API ключ", "HeaderNewLibrary": "Нова Библиотека", "HeaderNotificationCreate": "Създай нотификация", "HeaderNotificationUpdate": "Обнови нотификация", @@ -195,6 +200,7 @@ "HeaderSettingsExperimental": "Експериментални Функции", "HeaderSettingsGeneral": "Общи", "HeaderSettingsScanner": "Скенер", + "HeaderSettingsSecurity": "Сигурност", "HeaderSettingsWebClient": "Уеб клиент", "HeaderSleepTimer": "Таймер за заспиване", "HeaderStatsLargestItems": "Най-Големите Елементи", @@ -206,6 +212,7 @@ "HeaderTableOfContents": "Съдържание", "HeaderTools": "Инструменти", "HeaderUpdateAccount": "Обнови Профил", + "HeaderUpdateApiKey": "Обнови API ключ", "HeaderUpdateAuthor": "Обнови Автор", "HeaderUpdateDetails": "Обнови Детайли", "HeaderUpdateLibrary": "Обнови Библиотека", @@ -230,10 +237,15 @@ "LabelAddedDate": "Добавено", "LabelAdminUsersOnly": "Само за Администратори", "LabelAll": "Всичко", + "LabelAllEpisodesDownloaded": "Всички епизоди са изтеглени", "LabelAllUsers": "Всички Потребители", "LabelAllUsersExcludingGuests": "Всички потребители без гости", "LabelAllUsersIncludingGuests": "Всички потребители включително гости", "LabelAlreadyInYourLibrary": "Вече е в твоята библиотека", + "LabelApiKeyCreated": "API ключ \"{0}\" успешно създатен.", + "LabelApiKeyCreatedDescription": "Погрижете се да копирате API ключът сега, защото повече няма да можете да го виждате онново.", + "LabelApiKeyUser": "Действай от името на потребителя", + "LabelApiKeyUserDescription": "Този API ключ ще има същите права като на потребителя за чието име действа. В логовете ще изглежда все едно потребителя прави заявката.", "LabelApiToken": "АПИ Токен", "LabelAppend": "Добави", "LabelAudioBitrate": "Аудио битрейт (напр. 128k)", @@ -253,7 +265,7 @@ "LabelBackToUser": "Обратно към Потребител", "LabelBackupAudioFiles": "Създай резервно копие на аудио файлове", "LabelBackupLocation": "Местоположение на Архив", - "LabelBackupsEnableAutomaticBackups": "Включи автоматично архивиране", + "LabelBackupsEnableAutomaticBackups": "Автоматично архивиране", "LabelBackupsEnableAutomaticBackupsHelp": "Архиви запазени в /metadata/backups", "LabelBackupsMaxBackupSize": "Максимален размер на архива (в GB) (0 за неограничен)", "LabelBackupsMaxBackupSizeHelp": "За защита срещу грешки в конфигурацията, архивите ще се провалят ако надхвърлят конфигурирания размер.", @@ -272,7 +284,7 @@ "LabelChaptersFound": "намерени глави", "LabelClickForMoreInfo": "Кликни за повече информация", "LabelClickToUseCurrentValue": "Натисни да ползваш сегашната стойност", - "LabelClosePlayer": "Затвори", + "LabelClosePlayer": "Затвори плейъра", "LabelCodec": "Кодек", "LabelCollapseSeries": "Скрий сериите", "LabelCollapseSubSeries": "Свий подсерии", @@ -283,6 +295,7 @@ "LabelContinueListening": "Продължи слушане", "LabelContinueReading": "Продължи четене", "LabelContinueSeries": "Продължи серии", + "LabelCorsAllowed": "Разрешени CORS Origins", "LabelCover": "Корица", "LabelCoverImageURL": "URL на Корица", "LabelCoverProvider": "Източник за обложки", @@ -296,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Изтрий от файловата система (отмени за да бъдат премахни само от базата данни)", "LabelDescription": "Описание", "LabelDeselectAll": "Премахни всички", + "LabelDetectedPattern": "Намерен образец:", "LabelDevice": "Устройство", "LabelDeviceInfo": "Информация за Устройство", "LabelDeviceIsAvailableTo": "Устройството е достъпно за ...", @@ -345,7 +359,11 @@ "LabelExample": "Пример", "LabelExpandSeries": "Покажи сериите", "LabelExpandSubSeries": "Покажи съб сериите", - "LabelExplicit": "С нецензурно съдържание", + "LabelExpired": "Изтекъл", + "LabelExpiresAt": "Изтича на", + "LabelExpiresInSeconds": "Изтича след (секунди)", + "LabelExpiresNever": "Никога", + "LabelExplicit": "Експлицитно", "LabelExplicitChecked": "С нецензурно съдържание (проверено)", "LabelExplicitUnchecked": "Без нецензурно съдържание (непроверено)", "LabelExportOPML": "Експортирай OPML", @@ -404,6 +422,7 @@ "LabelLanguages": "Езици", "LabelLastBookAdded": "Последно Добавена Книга", "LabelLastBookUpdated": "Последно Обновена Книга", + "LabelLastProgressDate": "Последен прогрес: {0}", "LabelLastSeen": "Последно Видян", "LabelLastTime": "Последно Време", "LabelLastUpdate": "Последно Обновяване", @@ -416,6 +435,7 @@ "LabelLibraryFilterSublistEmpty": "Не {0}", "LabelLibraryItem": "Елемент на Библиотека", "LabelLibraryName": "Име на Библиотека", + "LabelLibrarySortByProgress": "Прогресът е обновен", "LabelLimit": "Лимит", "LabelLineSpacing": "Междуредие", "LabelListenAgain": "Слушай отново", @@ -424,6 +444,7 @@ "LabelLogLevelWarn": "Предупреждение", "LabelLookForNewEpisodesAfterDate": "Търси нови епизоди след дата", "LabelLowestPriority": "Най-нисък Приоритет", + "LabelMatchConfidence": "Увереност", "LabelMatchExistingUsersBy": "Съпостави съществуващи потребители по", "LabelMatchExistingUsersByDescription": "Използва се за свързване на съществуващи потребители. След свързване потребителите ще бъдат съпоставени по уникален идентификатор от вашия доставчик на SSO", "LabelMaxEpisodesToDownload": "Максимален брой епизоди за сваляне. Използвай 0 за неограничен.", @@ -453,7 +474,9 @@ "LabelNewestAuthors": "Най-новите автори", "LabelNewestEpisodes": "Най-новите епизоди", "LabelNextBackupDate": "Следваща Дата на Архивиране", + "LabelNextChapters": "Следващите глави ще бъдат:", "LabelNextScheduledRun": "Следващо Планирано Изпълнение", + "LabelNoApiKeys": "Няма API ключове", "LabelNoCustomMetadataProviders": "Няма потребителски доставчици на метаданни", "LabelNoEpisodesSelected": "Няма избрани епизоди", "LabelNotFinished": "Не е приключено", @@ -469,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Максимален размер на опашката за известия", "LabelNotificationsMaxQueueSizeHelp": "Събитията са ограничени до изстрелване на 1 на секунда. Събитията ще бъдат игнорирани ако опашката е на максимален размер. Това предотвратява спамирането на известия.", "LabelNumberOfBooks": "Брой на Книги", + "LabelNumberOfChapters": "Брой глави:", "LabelNumberOfEpisodes": "Брой епизоди", "LabelOpenIDAdvancedPermsClaimDescription": "Име на OpenID твърдението, което съдържа разширени права за достъп до потребителски действия в приложението, които ще се прилагат за роли, различни от администраторските (ако е конфигурирано). Ако твърдението липсва в отговора, достъпът до ABS ще бъде отказан. Ако липсва една опция, тя ще се третира като false. Уверете се, че твърдението на доставчика на идентичност съответства на очакваната структура:", "LabelOpenIDClaims": "Оставете следните опции празни, за да деактивирате разширеното присвояване на групи, като автоматично ще бъде присвоена групата 'Потребител'.", @@ -513,7 +537,7 @@ "LabelPublishers": "Издателство", "LabelRSSFeedCustomOwnerEmail": "Персонализиран имейл на собственика", "LabelRSSFeedCustomOwnerName": "Персонализирано име на собственика", - "LabelRSSFeedOpen": "RSS Feed Оптворен", + "LabelRSSFeedOpen": "RSS Feed е отворен", "LabelRSSFeedPreventIndexing": "Предотвратете индексиране", "LabelRSSFeedSlug": "идентификатор на RSS емисия", "LabelRSSFeedURL": "URL на RSS емисия", @@ -543,6 +567,7 @@ "LabelSelectAll": "Избери всичко", "LabelSelectAllEpisodes": "Избери всички епизоди", "LabelSelectEpisodesShowing": "Избери {0} епизоди показани", + "LabelSelectUser": "Избери потребител", "LabelSelectUsers": "Избери Потребители", "LabelSendEbookToDevice": "Изпрати електронна книга до ...", "LabelSequence": "Последователност", @@ -639,6 +664,7 @@ "LabelTheme": "Тема", "LabelThemeDark": "Тъмна", "LabelThemeLight": "Светла", + "LabelThemeSepia": "Сепия", "LabelTimeBase": "Времева Основа", "LabelTimeDurationXHours": "{0} часа", "LabelTimeDurationXMinutes": "{0} минути", @@ -693,7 +719,11 @@ "LabelViewPlayerSettings": "Виж настройки на плеъра", "LabelViewQueue": "Виж Опашка", "LabelVolume": "Сила на Звука", + "LabelWebRedirectURLsDescription": "Разрешете тези URL-и във вашият OAuth доставчик, за да позволите пренасочването обратно към уеб приложението след вход:", + "LabelWebRedirectURLsSubfolder": "Подпапка за URL адреси за пренасочване", "LabelWeekdaysToRun": "Делници за изпълнение", + "LabelXBooks": "{0} книги", + "LabelXItems": "{0} елемента", "LabelYearReviewHide": "Скрий ревю на годината ти", "LabelYearReviewShow": "Виж ревю на годината ти", "LabelYourAudiobookDuration": "Продължителност на вашата аудиокнига", @@ -702,31 +732,50 @@ "LabelYourProgress": "Твоят прогрес", "MessageAddToPlayerQueue": "Добави към опашката на плейъра", "MessageAppriseDescription": "За да ползвате тази функция трябва да имате активна инстанция на Apprise API или на друго АПИ което да обработва тези заявки.
The Apprise API Url-а трябва дае пълния URL път за изпращане на известията, например, ако вашето АПИ ве подава от 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": "Популирайте активираните полета с данни от всички елементи. Полетата със няколко стоайности ще бъдат обединени", "MessageBatchQuickMatchDescription": "Бързото Съпоставяне ще опита да добави липсващи корици и метаданни за избраните елементи. Активирайте опциите по-долу, за да позволите на Бързото съпоставяне да презапише съществуващите корици и/или метаданни.", "MessageBookshelfNoCollections": "Все още нямате създадени колекции", + "MessageBookshelfNoCollectionsHelp": "Колекциите са публични. Всички потребители с достъп до библиотеката ще могат да ги виждат.", "MessageBookshelfNoRSSFeeds": "Няма отворени RSS feed-ове", "MessageBookshelfNoResultsForFilter": "Няма резултат за филтер \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Няма резултати от заявката", "MessageBookshelfNoSeries": "Нямаш сеЗЙ", + "MessageBulkChapterPattern": "Колко глави искате да добавите, използвайки тази схема за номериране?", "MessageChapterEndIsAfter": "Краят на главата е след края на вашата аудиокнига", "MessageChapterErrorFirstNotZero": "Първата глава трябва да започва от 0", "MessageChapterErrorStartGteDuration": "Началото на главата трябва да бъде по-малко от продължителността на аудиокнигата", "MessageChapterErrorStartLtPrev": "Началото на главата трябва да бъде по-голямо или равно на края на предишната глава", "MessageChapterStartIsAfter": "Началото на главата е след края на вашата аудиокнига", + "MessageChaptersNotFound": "Главите не са намерени", "MessageCheckingCron": "Проверяване на cron...", "MessageConfirmCloseFeed": "Сигурни ли сте, че искате да затворите този feed?", + "MessageConfirmDeleteApiKey": "Сигурни ли сте, че искате да изтриете API ключ \"{0}\"?", "MessageConfirmDeleteBackup": "Сигурни ли сте, че искате да изтриете този архив {0}?", + "MessageConfirmDeleteDevice": "Сигурни ли сте, че искате да изтриете е-четец \"{0}\"?", "MessageConfirmDeleteFile": "Това ще изтрие файла от файловата Ви система. Сигурни ли сте?", "MessageConfirmDeleteLibrary": "Сигурни ли сте, че искате да изтриете за винаги библиотека \"{0}\"?", "MessageConfirmDeleteLibraryItem": "Това ще изтрие елемента от базата данни и файловата Ви система. Сигурни ли сте?", "MessageConfirmDeleteLibraryItems": "Това ще изтрие {0} елемента от базата данни и файловата Ви система. Сигурни ли сте?", + "MessageConfirmDeleteMetadataProvider": "Сигурни ли сте, че искате да изтриете доставчика нa метаданни \"{0}\"?", + "MessageConfirmDeleteNotification": "Сигурни ли сте, че искате да изтриете това уведомление?", "MessageConfirmDeleteSession": "Сигурни ли сте, че искате да изтриете тази сесия?", + "MessageConfirmEmbedMetadataInAudioFiles": "Сигурнли ли сте, че искате да вградите метаданните в {0} аудио файла?", "MessageConfirmForceReScan": "Сигурни ли сте, че искате да принудите повторно сканиране?", "MessageConfirmMarkAllEpisodesFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като завършени?", "MessageConfirmMarkAllEpisodesNotFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като незавършени?", + "MessageConfirmMarkItemFinished": "Сигурни ли сте, че искате да маркирате \"{0}\" като приключено?", + "MessageConfirmMarkItemNotFinished": "Сигурни ли сте, че искате да маркирате \"{0}\" като неприключено?", "MessageConfirmMarkSeriesFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като завършени?", "MessageConfirmMarkSeriesNotFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като незавършени?", + "MessageConfirmNotificationTestTrigger": "Пуснете това уведомление с тестови данни?", "MessageConfirmPurgeCache": "Изчистването на кеша ще изтрие цялата директория в /metadata/cache.

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

Искате ли да продължите?", @@ -745,19 +794,27 @@ "MessageConfirmRenameTag": "Сигурни ли сте, че искате да преименувате таг \"{0}\" на \"{1}\" за всички елементи?", "MessageConfirmRenameTagMergeNote": "Забележка: Този таг вече съществува и ще бъде слято.", "MessageConfirmRenameTagWarning": "Внимание! Вече съществува подобен таг с различно писане \"{0}\".", + "MessageConfirmResetProgress": "Сигурни ли сте, че искате да нулирате прогреса си?", "MessageConfirmSendEbookToDevice": "Сигурни ли сте, че искате да изпратите {0} електронна книга \"{1}\" до устройство \"{2}\"?", + "MessageConfirmUnlinkOpenId": "Сигурни ли сте, че искате да отвържете този потребител от OpenID?", + "MessageDaysListenedInTheLastYear": "{0} дни слушане през последната година", "MessageDownloadingEpisode": "Сваля епизод", "MessageDragFilesIntoTrackOrder": "Плъзнете файлове в правилния ред на каналите", + "MessageEmbedFailed": "Вграждането беше неуспешно!", "MessageEmbedFinished": "Вграждането завърши!", + "MessageEmbedQueue": "Поставено в опашката за вграждане на метаданни ({0} в опашката)", "MessageEpisodesQueuedForDownload": "{0} Епизод(и) са сложени за сваляне", "MessageEreaderDevices": "За да осигурите доставката на е-книги, може да се наложи да добавите горепосочения имейл адрес като валиден подател за всяко устройство, изброено по-долу.", "MessageFeedURLWillBe": "Адресът на емисията ще бъде {0}", "MessageFetching": "Извличане...", "MessageForceReScanDescription": "ще сканира всички файлове отново като прясно сканиране. Аудио файлове ID3 тагове, OPF файлове и текстови файлове ще бъдат сканирани като нови.", + "MessageHeatmapListeningTimeTooltip": "{0} слушане на {1}", + "MessageHeatmapNoListeningSessions": "Няма сесии за слушане на {0}", "MessageImportantNotice": "Важно Съобщение!", "MessageInsertChapterBelow": "Вмъкни глава под", - "MessageItemsSelected": "{0} избрани", - "MessageItemsUpdated": "{0} елемента обновени", + "MessageInvalidAsin": "Невалиден ASIN", + "MessageItemsSelected": "{0} избрани елемента", + "MessageItemsUpdated": "{0} обновени елемента", "MessageJoinUsOn": "Присъединете се към нас", "MessageLoading": "Зарежда...", "MessageLoadingFolders": "Зареждане на Папки...", @@ -778,6 +835,7 @@ "MessageNoCollections": "Няма колекции", "MessageNoCoversFound": "Не са намерени корици", "MessageNoDescription": "Няма описание", + "MessageNoDevices": "Няма устройства", "MessageNoDownloadsInProgress": "Няма изтегляния в прогрес", "MessageNoDownloadsQueued": "Няма изтегляния в опашка", "MessageNoEpisodeMatchesFound": "Няма намерени съвпадения за епизоди", @@ -791,6 +849,7 @@ "MessageNoLogs": "Няма логове", "MessageNoMediaProgress": "Няма прогрес на медията", "MessageNoNotifications": "Няма известия", + "MessageNoPodcastFeed": "Невалиден подкаст: Няма канал", "MessageNoPodcastsFound": "Няма намерени подкасти", "MessageNoResults": "Няма резултати", "MessageNoSearchResultsFor": "Няма резултати за \"{0}\"", @@ -799,13 +858,17 @@ "MessageNoTasksRunning": "Няма вършещи се задачи", "MessageNoUpdatesWereNecessary": "Няма нужда от обновяване", "MessageNoUserPlaylists": "Нямате създадени плейлисти", + "MessageNoUserPlaylistsHelp": "Плейлистите за частни. Само създалият ги потребител ще може да ги вижда.", "MessageNotYetImplemented": "Още не е изпълнено", "MessageOr": "или", "MessagePauseChapter": "Пауза на глава", "MessagePlayChapter": "Пусни налчалото на глава", "MessagePlaylistCreateFromCollection": "Създай плейлист от колекция", + "MessagePleaseWait": "Моля изчакайте...", "MessagePodcastHasNoRSSFeedForMatching": "Подкастът няма URL адрес на RSS feed за използване за съпоставяне", "MessagePodcastSearchField": "Въведи какво да търся или RSS емисия адрес", + "MessageQuickEmbedInProgress": "Бързото вграждане е в процес на изпълнение", + "MessageQuickEmbedQueue": "Поставено в опашката за бързо вграждане ({0} в опашката)", "MessageQuickMatchDescription": "Попълни празните детайли и корици с първия резултат от '{0}'. Не презаписва детайлите, освен ако не е активирана настройката 'Предпочети съвпадащи метаданни' на сървъра.", "MessageRemoveChapter": "Премахни глава", "MessageRemoveEpisodes": "Премахни {0} епизод(и)", @@ -815,10 +878,12 @@ "MessageResetChaptersConfirm": "Сигурни ли сте, че искате да нулирате главите и да отмените промените, които сте направили?", "MessageRestoreBackupConfirm": "Сигурни ли сте, че искате да възстановите архива създаден на", "MessageRestoreBackupWarning": "Възстановяването на архив ще презапише цялата база данни, намираща се в /config и кориците в /metadata/items & /metadata/authors.

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

Всички клиенти, използващи вашия сървър, ще бъдат автоматично обновени.", + "MessageScheduleRunEveryWeekdayAtTime": "Изпълни всеки {0} в {1}", "MessageSearchResultsFor": "Резултати от търсенето за", "MessageSelected": "{0} избрани", "MessageServerCouldNotBeReached": "Сървърът не може да бъде достигнат", "MessageSetChaptersFromTracksDescription": "Задайте глави, като използвате всеки аудио файл като глава и заглавие на главата като име на аудио файла", + "MessageShareExpiresIn": "Изтича след {0}", "MessageStartPlaybackAtTime": "Започни възпроизвеждане на \"{0}\" в {1}?", "MessageThinking": "Мисля...", "MessageUploaderItemFailed": "Неуспешно качване", From 5b9df84ba32307e4932f37ff45ef1eead25819cf Mon Sep 17 00:00:00 2001 From: owlcollector Date: Sat, 16 Aug 2025 15:57:36 +0200 Subject: [PATCH 027/217] Translated using Weblate (Japanese) Currently translated at 8.5% (99 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/ --- client/strings/ja.json | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/client/strings/ja.json b/client/strings/ja.json index 3284d8a1..05f83b4b 100644 --- a/client/strings/ja.json +++ b/client/strings/ja.json @@ -11,13 +11,17 @@ "ButtonApplyChapters": "チャプターを確定する", "ButtonAuthors": "作者", "ButtonBack": "戻る", + "ButtonBrowseForFolder": "フォルダーを選択する", "ButtonCancel": "キャンセル", + "ButtonCancelEncode": "エンコードを取り消す", "ButtonChangeRootPassword": "Rootのパスワードを変更する", "ButtonChooseAFolder": "フォルダーを選ぶ", "ButtonChooseFiles": "ファイルを選ぶ", "ButtonClearFilter": "絞り込みを解除", "ButtonClose": "閉じる", + "ButtonCloseFeed": "フィードを閉じる", "ButtonCollections": "コレクション", + "ButtonConfigureScanner": "スキャナーの設定", "ButtonCreate": "作成", "ButtonCreateBackup": "バックアップを作成する", "ButtonDelete": "削除", @@ -26,20 +30,35 @@ "ButtonEditChapters": "チャプターの編集", "ButtonEditPodcast": "ポッドキャストの編集", "ButtonEnable": "オンにする", + "ButtonForceReScan": "強制的に再スキャンする", + "ButtonFullPath": "絶対パス", "ButtonHide": "非表示", "ButtonHome": "ホーム", "ButtonJumpBackward": "巻き戻し", "ButtonJumpForward": "早送り", + "ButtonLatest": "最新", "ButtonLibrary": "ライブラリー", "ButtonLogout": "ログアウト", + "ButtonManageTracks": "トラックの管理", + "ButtonNevermind": "中止", + "ButtonNext": "次", + "ButtonNextChapter": "次のチャプター", "ButtonOk": "はい", - "ButtonPlay": "プレイ", + "ButtonOpenFeed": "フィードを開く", + "ButtonPause": "一時停止", + "ButtonPlay": "再生", + "ButtonPlayAll": "全て再生", "ButtonPlaying": "プレイ中", + "ButtonPlaylists": "プレイリスト", "ButtonPrevious": "先", + "ButtonPreviousChapter": "前のチャプター", + "ButtonPurgeAllCache": "全てのキャッシュを削除", + "ButtonPurgeItemsCache": "項目のキャッシュを削除", "ButtonQueueAddItem": "次に再生する", "ButtonQueueRemoveItem": "次に再生から削除", + "ButtonQuickEmbed": "クイック埋め込み", "ButtonReScan": "再スキャン", - "ButtonRead": "野村", + "ButtonRead": "読む", "ButtonReadLess": "閉じる", "ButtonReadMore": "もっと見る", "ButtonRefresh": "再読み込み", @@ -56,7 +75,18 @@ "ButtonScrollLeft": "左にスクロール", "ButtonScrollRight": "右にスクロール", "ButtonSearch": "検索", + "ButtonSeries": "シリーズ", "ButtonYes": "はい", + "HeaderAccount": "アカウント", + "HeaderChapters": "チャプター", + "HeaderCollection": "コレクション", + "HeaderCollectionItems": "コレクションの項目", + "HeaderDetails": "詳細", + "HeaderEbookFiles": "電子書籍ファイル", + "HeaderEpisodes": "エピソード", + "HeaderEreaderSettings": "電子書籍リーダーの設定", + "HeaderLatestEpisodes": "最新のエピソード", + "HeaderLibraries": "ライブラリー", "HeaderPlayerSettings": "プレーヤーの設定", "LabelBooks": "ほん", "LabelContinueListening": "続きから聞く", From 09121acbd5417df38d051c13605fe22975d49275 Mon Sep 17 00:00:00 2001 From: Zhelyan Radoev Date: Mon, 18 Aug 2025 18:58:51 +0200 Subject: [PATCH 028/217] Translated using Weblate (Bulgarian) Currently translated at 87.3% (1010 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bg/ --- client/strings/bg.json | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/client/strings/bg.json b/client/strings/bg.json index 5d7e1218..ca14035f 100644 --- a/client/strings/bg.json +++ b/client/strings/bg.json @@ -741,6 +741,7 @@ "MessageBackupsLocationNoEditNote": "Забележка: Местоположението за архивиране се задава с помощта на променлива на средата и не може бъде променена от тук.", "MessageBackupsLocationPathEmpty": "Пътят към местоположението за архивиране не може да бъде празен", "MessageBatchEditPopulateMapDetailsAllHelp": "Популирайте активираните полета с данни от всички елементи. Полетата със няколко стоайности ще бъдат обединени", + "MessageBatchEditPopulateMapDetailsItemHelp": "Попълнете активираните полета с информация за картата с данни от този елемент", "MessageBatchQuickMatchDescription": "Бързото Съпоставяне ще опита да добави липсващи корици и метаданни за избраните елементи. Активирайте опциите по-долу, за да позволите на Бързото съпоставяне да презапише съществуващите корици и/или метаданни.", "MessageBookshelfNoCollections": "Все още нямате създадени колекции", "MessageBookshelfNoCollectionsHelp": "Колекциите са публични. Всички потребители с достъп до библиотеката ще могат да ги виждат.", @@ -784,6 +785,7 @@ "MessageConfirmRemoveAuthor": "Сигурни ли сте, че искате да премахнете автор \"{0}\"?", "MessageConfirmRemoveCollection": "Сигурни ли сте, че искате да премахнете колекция \"{0}\"?", "MessageConfirmRemoveEpisode": "Сигурни ли сте, че искате да премахнете епизод \"{0}\"?", + "MessageConfirmRemoveEpisodeNote": "Забележка: Това няма да доведе до изтриване на аудио файла, освен ако не активирате опцията \"Твърдо изтриване на файла\"", "MessageConfirmRemoveEpisodes": "Сигурни ли сте, че искате да премахнете {0} епизода?", "MessageConfirmRemoveListeningSessions": "Сигурни ли сте, че искате да премахнете {0} слушателски сесии?", "MessageConfirmRemoveNarrator": "Сигурни ли сте, че искате да премахнете разказвач \"{0}\"?", @@ -885,6 +887,36 @@ "MessageSetChaptersFromTracksDescription": "Задайте глави, като използвате всеки аудио файл като глава и заглавие на главата като име на аудио файла", "MessageShareExpiresIn": "Изтича след {0}", "MessageStartPlaybackAtTime": "Започни възпроизвеждане на \"{0}\" в {1}?", + "MessageTaskDownloadingEpisodeDescription": "Изтегляне на епизод \"{0}\"", + "MessageTaskEmbeddingMetadata": "Вграждане на метаданни", + "MessageTaskEmbeddingMetadataDescription": "Вграждане на метаданни в аудиокнига \"{0}\"", + "MessageTaskEncodingM4bDescription": "Кодиране на аудиокнига \"{0}\" в единичен m4b файл", + "MessageTaskFailed": "Неуспешно", + "MessageTaskFailedToBackupAudioFile": "Неуспешно създаване на разервно копие на аудио файл \"{0}\"", + "MessageTaskFailedToCreateCacheDirectory": "Неуспешно създаване на директория за кеширане", + "MessageTaskFailedToEmbedMetadataInFile": "Неуспешно вграждане на метаданни във файл \"{0}\"", + "MessageTaskFailedToMergeAudioFiles": "Неуспешно сливане на аудио файловете", + "MessageTaskFailedToMoveM4bFile": "Неуспешно преместване на m4b файл", + "MessageTaskFailedToWriteMetadataFile": "Неуспешно записване на файла за метаданни", + "MessageTaskMatchingBooksInLibrary": "Съответстващи книги в библиотека \"{0}\"", + "MessageTaskNoFilesToScan": "Няма файлове за сканиране", + "MessageTaskOpmlImport": "OPML импортиране", + "MessageTaskOpmlImportDescription": "Създаване на подкасти от {0} RSS хранилки", + "MessageTaskOpmlImportFeedDescription": "Импортиране на RSS хранилка \"{0}\"", + "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": "Успешно качване!", @@ -902,11 +934,18 @@ "NoteUploaderFoldersWithMediaFiles": "Папките с медийни файлове ще бъдат обработени като отделни елементи на библиотеката.", "NoteUploaderOnlyAudioFiles": "Ако качвате само аудио файлове, то всеки аудио файл ще бъде обработен като отделна аудиокнига.", "NoteUploaderUnsupportedFiles": "Неподдържаните файлове се игнорират. При избор или пускане на папка, други файлове, които не са в папка на елемент, се игнорират.", + "NotificationOnBackupCompletedDescription": "Изпълнява се при завършване на създаване на резервно копие", + "NotificationOnBackupFailedDescription": "Изпълнява се при неуспешено създаване на резервно копие", + "NotificationOnEpisodeDownloadedDescription": "Изпълнява се при автоматично изтегляне на подкаст епизод", + "NotificationOnRSSFeedDisabledDescription": "Изпълнява се, когато автоматичното изтегляне на епизодите е деактивирано, поради твърде много неуспешни опити", "PlaceholderNewCollection": "Ново име на колекцията", "PlaceholderNewFolderPath": "Нов път на папката", "PlaceholderNewPlaylist": "Ново име на плейлиста", "PlaceholderSearch": "Търсене...", "PlaceholderSearchEpisode": "Търсене на Епизоди...", + "StatsAuthorsAdded": "добаврени автори", + "StatsBooksAdded": "добавени книги", + "StatsBooksFinished": "завършени книги", "ToastAccountUpdateSuccess": "Успешно обновяване на акаунта", "ToastAuthorImageRemoveSuccess": "Авторската снимка е премахната", "ToastAuthorUpdateMerged": "Обновяване на автора сливано", From a1e882cbf1adc815811bcfbd87ed5a0c82d70deb Mon Sep 17 00:00:00 2001 From: Daniel Schosser Date: Mon, 18 Aug 2025 09:00:56 +0200 Subject: [PATCH 029/217] Translated using Weblate (German) Currently translated at 100.0% (1156 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/ --- client/strings/de.json | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/client/strings/de.json b/client/strings/de.json index 454e6c86..f0c4443d 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Hörbuch-Dateiverwaltungswerkzeuge", "HeaderAuthentication": "Authentifizierung", "HeaderBackups": "Sicherungen", + "HeaderBulkChapterModal": "Mehrere Kapitel hinzufügen", "HeaderChangePassword": "Passwort ändern", "HeaderChapters": "Kapitel", "HeaderChooseAFolder": "Wähle einen Ordner", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Löschen von der Festplatte + Datenbank (deaktivieren um nur aus der Datenbank zu entfernen)", "LabelDescription": "Beschreibung", "LabelDeselectAll": "Alles abwählen", + "LabelDetectedPattern": "Erkanntes Muster:", "LabelDevice": "Gerät", "LabelDeviceInfo": "Geräteinformationen", "LabelDeviceIsAvailableTo": "Dem Gerät ist es möglich zu ...", @@ -472,6 +474,7 @@ "LabelNewestAuthors": "Neueste Autoren", "LabelNewestEpisodes": "Neueste Episoden", "LabelNextBackupDate": "Nächstes Sicherungsdatum", + "LabelNextChapters": "Das nächste Kapitel ist:", "LabelNextScheduledRun": "Nächster planmäßiger Durchlauf", "LabelNoApiKeys": "Keine API-Schlüssel vorhanden", "LabelNoCustomMetadataProviders": "Keine benutzerdefinierten Metadata Anbieter", @@ -489,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Maximale Größe der Warteschlange für die Benachrichtigungsereignisse", "LabelNotificationsMaxQueueSizeHelp": "Es wird nur 1 Ereignis pro Sekunde ausgelöst. Ereignisse werden ignoriert, wenn die Warteschlange die maximale Größe erreicht hat. Dies verhindert Benachrichtigungsspamming.", "LabelNumberOfBooks": "Anzahl der Hörbücher", + "LabelNumberOfChapters": "Anzahl an Kapiteln:", "LabelNumberOfEpisodes": "Anzahl der Episoden", "LabelOpenIDAdvancedPermsClaimDescription": "Name des OpenID-Claims, der erweiterte Berechtigungen für Benutzeraktionen innerhalb der Anwendung enthält, die auf Nicht-Admin-Rollen angewendet werden (wenn konfiguriert). Wenn der Claim in der Antwort fehlt, wird der Zugang zu ABS verweigert. Fehlt eine einzelne Option, wird sie als false behandelt. Stelle sicher, dass der Claim des Identitätsanbieters der erwarteten Struktur entspricht:", "LabelOpenIDClaims": "Lass die folgenden Optionen leer, um die erweiterte Zuweisung von Gruppen und Berechtigungen zu deaktivieren und automatisch die 'User'-Gruppe zuzuweisen.", @@ -728,7 +732,7 @@ "LabelYourProgress": "Fortschritt", "MessageAddToPlayerQueue": "Zur Abspielwarteliste hinzufügen", "MessageAppriseDescription": "Um diese Funktion nutzen zu können, musst du eine Instanz von Apprise API laufen haben oder eine API verwenden welche dieselbe Anfragen bearbeiten kann.
Die Apprise API Url muss der vollständige URL-Pfad sein, an den die Benachrichtigung gesendet werden soll, z.B. wenn Ihre API-Instanz unter http://192.168.1.1:8337 läuft, würdest du http://192.168.1.1:8337/notify eingeben.", - "MessageAsinCheck": "Stellen Sie sicher, dass Sie die ASIN aus der richtigen Audible Region verwenden, nicht Amazon.", + "MessageAsinCheck": "Stelle sicher, dass die ASIN aus der richtigen Audible Region verwendet wird, nicht Amazon.", "MessageAuthenticationLegacyTokenWarning": "Alte API tokens werden in Zukunft entfernt. Benutze stattdessen API Keys.", "MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muss der Server neugestartet werden um die OIDC Änderungen zu übernehmen.", "MessageAuthenticationSecurityMessage": "Die Anmeldung wurde abgesichert. Benutzersitzungen werden getrennt, alle Benutzer müssen sich erneut anmelden.", @@ -745,6 +749,7 @@ "MessageBookshelfNoResultsForFilter": "Keine Ergebnisse für Filter \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Keine Ergebnisse für die Abfrage", "MessageBookshelfNoSeries": "Keine Serien vorhanden", + "MessageBulkChapterPattern": "Wie viele Kapitel mit diesem Nummerierungs-Muster sollen hinzugefügt werden?", "MessageChapterEndIsAfter": "Ungültige Kapitelendzeit: Kapitelende > Mediumende (Kapitelende liegt nach dem Ende des Mediums)", "MessageChapterErrorFirstNotZero": "Ungültige Kapitelstartzeit: Das erste Kapitel muss bei 0 beginnen", "MessageChapterErrorStartGteDuration": "Ungültige Kapitelstartzeit: Kapitelanfang > Mediumlänge (Kapitelanfang liegt zeitlich nach dem Ende des Mediums -> Lösung: Kapitelanfang < Mediumlänge)", @@ -948,6 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "Wird ausgeführt wenn automatische Downloads von Episoden wegen zu vielen fehlgeschlagenen Versuchen deaktiviert sind", "NotificationOnRSSFeedFailedDescription": "Wird ausgelöst, wenn die RSS-Feed-Anforderung für einen automatischen Episoden-Download fehlschlägt", "NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird", + "PlaceholderBulkChapterInput": "Geben den Titel des Kapitels ein oder verwende eine Nummerierung (z. B. \"Episode 1\", \"Kapitel 10\", \"1.\")", "PlaceholderNewCollection": "Neuer Sammlungsname", "PlaceholderNewFolderPath": "Neuer Ordnerpfad", "PlaceholderNewPlaylist": "Neuer Wiedergabelistenname", @@ -1001,11 +1007,15 @@ "ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden", "ToastBookmarkCreateSuccess": "Lesezeichen hinzugefügt", "ToastBookmarkRemoveSuccess": "Lesezeichen entfernt", + "ToastBulkChapterInvalidCount": "Gebe eine Zahl zwischen 1 und 150 ein", "ToastCachePurgeFailed": "Cache leeren fehlgeschlagen", "ToastCachePurgeSuccess": "Cache geleert", + "ToastChapterLocked": "Kapitel ist freigegeben.", + "ToastChapterStartTimeAdjusted": "Kapitelbeginn um {0} Sekunden angepasst", + "ToastChaptersAllLocked": "Alle Kapitel sind gesperrt. Gebe einige Kapitel frei um die Zeiten anzupassen.", "ToastChaptersHaveErrors": "Kapitel sind fehlerhaft", "ToastChaptersInvalidShiftAmountLast": "Die Verschiebung ist nicht möglich, da die Startzeit des letzten Kapitels über die Gesamtdauer dieses Hörbuchs hinausgehen würde.", - "ToastChaptersInvalidShiftAmountStart": "Ungültige Höhe der Verschiebung. Das erste Kapitel hätte eine Länge von Null oder eine negative Länge und würde vom zweiten Kapitel überschrieben werden. Erhöhen Sie die Startdauer des zweiten Kapitels.", + "ToastChaptersInvalidShiftAmountStart": "Ungültige Höhe der Verschiebung. Das erste Kapitel hätte eine Länge von Null oder eine negative Länge und würde vom zweiten Kapitel überschrieben werden. Erhöhe die Startdauer des zweiten Kapitels.", "ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen", "ToastChaptersRemoved": "Kapitel entfernt", "ToastChaptersUpdated": "Kapitel aktualisiert", @@ -1136,5 +1146,13 @@ "ToastUserPasswordChangeSuccess": "Passwort erfolgreich verändert", "ToastUserPasswordMismatch": "Passwörter stimmen nicht überein", "ToastUserPasswordMustChange": "Neues Passwort muss sich von altem Passwort unterscheiden", - "ToastUserRootRequireName": "Root Benutzername muss angegeben werden" + "ToastUserRootRequireName": "Root Benutzername muss angegeben werden", + "TooltipAddChapters": "Kapitel hinzufügen", + "TooltipAddOneSecond": "1 Sekunde hinzufügen", + "TooltipAdjustChapterStart": "Klicke um die Startzeit anzupassen", + "TooltipLockAllChapters": "Alle Kapitel sperren", + "TooltipLockChapter": "Kapitel sperren (Shift+Klick für mehrere)", + "TooltipSubtractOneSecond": "1 Sekunde abziehen", + "TooltipUnlockAllChapters": "Alle Kapitel freigeben", + "TooltipUnlockChapter": "Kapitel freigeben (Shift+Klick für mehrere)" } From 84e742f2a5c887dc6d212eb41fd2bb3b6b80aaa2 Mon Sep 17 00:00:00 2001 From: B0rax Date: Tue, 19 Aug 2025 11:47:42 +0200 Subject: [PATCH 030/217] Translated using Weblate (German) Currently translated at 100.0% (1156 of 1156 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 f0c4443d..bcd724c9 100644 --- a/client/strings/de.json +++ b/client/strings/de.json @@ -953,7 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "Wird ausgeführt wenn automatische Downloads von Episoden wegen zu vielen fehlgeschlagenen Versuchen deaktiviert sind", "NotificationOnRSSFeedFailedDescription": "Wird ausgelöst, wenn die RSS-Feed-Anforderung für einen automatischen Episoden-Download fehlschlägt", "NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird", - "PlaceholderBulkChapterInput": "Geben den Titel des Kapitels ein oder verwende eine Nummerierung (z. B. \"Episode 1\", \"Kapitel 10\", \"1.\")", + "PlaceholderBulkChapterInput": "Kapitelbezeichnung eingeben oder Nummerierung verwenden (z.B. 'Episode 1', 'Kapitel 10', '1.')", "PlaceholderNewCollection": "Neuer Sammlungsname", "PlaceholderNewFolderPath": "Neuer Ordnerpfad", "PlaceholderNewPlaylist": "Neuer Wiedergabelistenname", From ac7464ce7e464f54986dc82d058de4af0412e751 Mon Sep 17 00:00:00 2001 From: ugyes Date: Mon, 18 Aug 2025 17:22:02 +0200 Subject: [PATCH 031/217] Translated using Weblate (Hungarian) Currently translated at 99.8% (1154 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/ --- client/strings/hu.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/client/strings/hu.json b/client/strings/hu.json index bc77c561..8f8836ad 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Hangoskönyv fájlkezelő eszközök", "HeaderAuthentication": "Hitelesítés", "HeaderBackups": "Biztonsági másolatok", + "HeaderBulkChapterModal": "Több fejezet hozzáadása", "HeaderChangePassword": "Jelszó megváltoztatása", "HeaderChapters": "Fejezetek", "HeaderChooseAFolder": "Válasszon egy mappát", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Törlés a fájlrendszerről (ne jelölje be, ha csak az adatbázisból szeretné eltávolítani)", "LabelDescription": "Leírás", "LabelDeselectAll": "Minden kijelölés megszüntetése", + "LabelDetectedPattern": "Észlelt minta:", "LabelDevice": "Eszköz", "LabelDeviceInfo": "Eszköz információ", "LabelDeviceIsAvailableTo": "Eszköz elérhető a következő számára...", @@ -472,6 +474,7 @@ "LabelNewestAuthors": "A legújabb szerzők", "LabelNewestEpisodes": "Legújabb epizódok", "LabelNextBackupDate": "Következő biztonsági másolat dátuma", + "LabelNextChapters": "A következő fejezetek:", "LabelNextScheduledRun": "Következő ütemezett futtatás", "LabelNoApiKeys": "Nincs API kulcs", "LabelNoCustomMetadataProviders": "Nincsenek egyedi metaadat szolgáltatók", @@ -489,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Maximális értesítési események sorának mérete", "LabelNotificationsMaxQueueSizeHelp": "Az események korlátozva vannak, hogy másodpercenként 1-szer történjenek. Ha a sor maximális méretű, akkor az események figyelmen kívül lesznek hagyva. Ez megakadályozza az értesítések spamelését.", "LabelNumberOfBooks": "Könyvek száma", + "LabelNumberOfChapters": "Fejezetek száma:", "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.", @@ -745,6 +749,7 @@ "MessageBookshelfNoResultsForFilter": "Nincs eredmény a \"{0}: {1}\" szűrőre", "MessageBookshelfNoResultsForQuery": "Nincs eredmény a lekérdezéshez", "MessageBookshelfNoSeries": "Nincsenek sorozatai", + "MessageBulkChapterPattern": "Hány fejezetet szeretne hozzáadni ezzel a számozási mintával?", "MessageChapterEndIsAfter": "A fejezet vége a hangoskönyv végét követi", "MessageChapterErrorFirstNotZero": "Az első fejezetnek 0:00-kor kell kezdődnie", "MessageChapterErrorStartGteDuration": "Érvénytelen kezdési idő, kevesebbnek kell lennie, mint a hangoskönyv időtartama", @@ -946,6 +951,7 @@ "NotificationOnRSSFeedDisabledDescription": "Akkor lép működésbe, ha az automatikus epizódletöltés a túl sok sikertelen próbálkozás miatt letiltásra kerül", "NotificationOnRSSFeedFailedDescription": "Akkor aktiválódik, ha az RSS feed kérés sikertelen az automatikus epizódletöltésnél", "NotificationOnTestDescription": "Esemény az értesítési rendszer teszteléséhez", + "PlaceholderBulkChapterInput": "Írja be a fejezet címét vagy használjon számozást (pl. „1. epizód”, „10. fejezet”, „1.”)", "PlaceholderNewCollection": "Új gyűjtemény neve", "PlaceholderNewFolderPath": "Új mappa útvonala", "PlaceholderNewPlaylist": "Új lejátszási lista neve", @@ -999,8 +1005,12 @@ "ToastBookmarkCreateFailed": "Könyvjelző létrehozása sikertelen", "ToastBookmarkCreateSuccess": "Könyvjelző hozzáadva", "ToastBookmarkRemoveSuccess": "Könyvjelző eltávolítva", + "ToastBulkChapterInvalidCount": "Írjon be egy számot 1 és 150 között", "ToastCachePurgeFailed": "A gyorsítótár törlése sikertelen", "ToastCachePurgeSuccess": "A gyorsítótár sikeresen törölve", + "ToastChapterLocked": "A fejezet zárolt.", + "ToastChapterStartTimeAdjusted": "A fejezet kezdési ideje {0} másodperccel módosítva", + "ToastChaptersAllLocked": "Minden fejezet zárolt. Nyisson meg néhány fejezetet, hogy módosítsa azok idejét.", "ToastChaptersHaveErrors": "A fejezetek hibákat tartalmaznak", "ToastChaptersInvalidShiftAmountLast": "Érvénytelen eltolási érték. Az utolsó fejezet kezdési időpontja túlnyúlna a hangoskönyv időtartamán.", "ToastChaptersInvalidShiftAmountStart": "Érvénytelen eltolási érték. Az első fejezet hossza nulla vagy negatív lenne, és a második fejezet felülírná. Növelje a második fejezet kezdő időtartamát.", @@ -1134,5 +1144,13 @@ "ToastUserPasswordChangeSuccess": "Jelszó sikeresen megváltoztatva", "ToastUserPasswordMismatch": "A jelszavak nem egyeznek", "ToastUserPasswordMustChange": "Az új jelszó nem egyezik a régi jelszóval", - "ToastUserRootRequireName": "Egy root felhasználónevet kell megadnia" + "ToastUserRootRequireName": "Egy root felhasználónevet kell megadnia", + "TooltipAddChapters": "Fejezet(ek) hozzáadása", + "TooltipAddOneSecond": "1 másodperc hozzáadása", + "TooltipAdjustChapterStart": "Kattintson a kezdési idő beállításához", + "TooltipLockAllChapters": "Az összes fejezet zárolása", + "TooltipLockChapter": "Fejezet zárolása (Shift+kattintás a tartományhoz)", + "TooltipSubtractOneSecond": "1 másodperc levonása", + "TooltipUnlockAllChapters": "Az összes fejezet feloldása", + "TooltipUnlockChapter": "Fejezet feloldása (Shift+kattintás a tartományhoz)" } From 73cf22b4995b5d1aa72a722be320fb5a3d0820b6 Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Tue, 19 Aug 2025 16:46:01 +0200 Subject: [PATCH 032/217] Translated using Weblate (Swedish) Currently translated at 96.7% (1118 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index f9f38919..377a88cc 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Hantering av ljudboksfiler", "HeaderAuthentication": "Autentisering", "HeaderBackups": "Säkerhetskopior", + "HeaderBulkChapterModal": "Addera flera kapitel", "HeaderChangePassword": "Ändra lösenord", "HeaderChapters": "Kapitel", "HeaderChooseAFolder": "Välj en mapp", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Ta även bort från filsystem (avmarkera = raderar endast från databasen)", "LabelDescription": "Beskrivning", "LabelDeselectAll": "Avmarkera alla", + "LabelDetectedPattern": "Identifierat mönster:", "LabelDevice": "Enhet", "LabelDeviceInfo": "Enhetsinformation", "LabelDeviceIsAvailableTo": "Enhet är tillgänglig för...", @@ -472,6 +474,7 @@ "LabelNewestAuthors": "Senaste författarna", "LabelNewestEpisodes": "Senaste avsnitten", "LabelNextBackupDate": "Nästa tillfälle för säkerhetskopiering", + "LabelNextChapters": "Nästa kapitel kommer att vara:", "LabelNextScheduledRun": "Nästa schemalagda körning", "LabelNoApiKeys": "Ingen API-nyckel", "LabelNoCustomMetadataProviders": "Ingen egen källa för metadata", @@ -810,8 +813,8 @@ "MessageLoading": "Laddar...", "MessageLoadingFolders": "Laddar mappar...", "MessageLogsDescription": "Filer med loggningsinformation sparas i mappen /metadata/logs som JSON-filer.
Filer med information om krascher sparas i /metadata/logs/crash_logs.txt.", - "MessageM4BFailed": "M4B misslyckades!", - "MessageM4BFinished": "M4B klar!", + "MessageM4BFailed": "Skapandet av en M4B-fil misslyckades!", + "MessageM4BFinished": "Omkodningen till M4B är genomförd!", "MessageMapChapterTitles": "Kartlägg kapitelrubriker till dina befintliga ljudbokskapitel utan att justera tidstämplar", "MessageMarkAllEpisodesFinished": "Markera alla avsnitt som avslutade", "MessageMarkAllEpisodesNotFinished": "Markera alla avsnitt som ej avslutade", @@ -930,6 +933,7 @@ "NotificationOnBackupCompletedDescription": "Aktiveras när en backup är genomförd", "NotificationOnBackupFailedDescription": "Aktiveras när en backup misslyckas", "NotificationOnEpisodeDownloadedDescription": "Aktiveras när avsnitt i en podcast automatiskt har hämtats", + "PlaceholderBulkChapterInput": "Addera kapitlets titel eller numrera kapitlen (t.ex. 'Avsnitt 1', 'Kapitel 10', '1.)", "PlaceholderNewCollection": "Nytt namn på samlingen", "PlaceholderNewFolderPath": "Ny sökväg till mappen", "PlaceholderNewPlaylist": "Nytt namn på spellistan", @@ -980,9 +984,14 @@ "ToastBookmarkCreateFailed": "Det gick inte att skapa bokmärket", "ToastBookmarkCreateSuccess": "Bokmärket har adderats", "ToastBookmarkRemoveSuccess": "Bokmärket har raderats", + "ToastBulkChapterInvalidCount": "Ange ett nummer mellan 1 och 150", "ToastCachePurgeFailed": "Misslyckades med att rensa cachen", "ToastCachePurgeSuccess": "Rensning av cachen har genomförts", + "ToastChapterStartTimeAdjusted": "Kapitlets starttid justerades med {0} sekunder", + "ToastChaptersAllLocked": "Alla kapitel är låsta. Lås upp några av dem för att kunna ändra deras tider.", "ToastChaptersHaveErrors": "Kapitlen har fel", + "ToastChaptersInvalidShiftAmountLast": "Felaktig ändring. Det sista kapitlets starttid kommer att hamna efter den totala längden på ljudboken.", + "ToastChaptersInvalidShiftAmountStart": "Felaktig ändring. Det första kapitlets längd kommer att vara 0 eller ha ett negativt värde. Det kommer därför att skrivas över av det andra kapitlet. Öka starttiden för det andra kapitlet.", "ToastChaptersMustHaveTitles": "Kapitel måste ha titlar", "ToastChaptersRemoved": "Kapitlen har raderats", "ToastChaptersUpdated": "Kapitlen har uppdaterats", @@ -1048,6 +1057,7 @@ "ToastNoUpdatesNecessary": "Inga uppdateringar var nödvändiga", "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", "ToastNotificationSettingsUpdateSuccess": "Inställningarna för meddelanden har ändrats", "ToastNotificationUpdateSuccess": "Meddelandet har uppdaterats", "ToastPlaylistCreateFailed": "Det gick inte att skapa spellistan", @@ -1079,7 +1089,7 @@ "ToastSendEbookToDeviceFailed": "Misslyckades med att skicka e-boken till enheten", "ToastSendEbookToDeviceSuccess": "E-boken skickad till enheten \"{0}\"", "ToastSeriesSubmitFailedSameName": "Det är inte möjligt att addera två serier med samma namn", - "ToastSeriesUpdateFailed": "Uppdateringen av serier misslyckades", + "ToastSeriesUpdateFailed": "Misslyckades med att uppdatera serien", "ToastSeriesUpdateSuccess": "Uppdateringen av serierna lyckades", "ToastServerSettingsUpdateSuccess": "Inställningarna för servern har uppdaterats", "ToastSessionDeleteFailed": "Misslyckades med att ta bort sessionen", @@ -1100,5 +1110,13 @@ "ToastUserPasswordChangeSuccess": "Lösenordet har ändrats", "ToastUserPasswordMismatch": "Lösenorden är inte identiska", "ToastUserPasswordMustChange": "Det nya lösenordet kan inte vara samma som det gamla", - "ToastUserRootRequireName": "Ett användarnamn för 'root' måste anges" + "ToastUserRootRequireName": "Ett användarnamn för 'root' måste anges", + "TooltipAddChapters": "Addera kapitel", + "TooltipAddOneSecond": "Öka med 1 sekund", + "TooltipAdjustChapterStart": "Klicka för att ändra starttiden", + "TooltipLockAllChapters": "Lås alla kapitel", + "TooltipLockChapter": "Lås kapitel (Tryck på Shift + Klick för att markera flera)", + "TooltipSubtractOneSecond": "Minska med 1 sekund", + "TooltipUnlockAllChapters": "Lås upp alla kapitel", + "TooltipUnlockChapter": "Lås upp kapitel (Tryck på Shift + Klick för att markera flera)" } From e196a6e5cac840852c44eee00cdb21429a650cdf Mon Sep 17 00:00:00 2001 From: owlcollector Date: Mon, 18 Aug 2025 18:04:23 +0200 Subject: [PATCH 033/217] Translated using Weblate (Japanese) Currently translated at 9.7% (113 of 1156 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/ --- client/strings/ja.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/client/strings/ja.json b/client/strings/ja.json index 05f83b4b..c78ac044 100644 --- a/client/strings/ja.json +++ b/client/strings/ja.json @@ -88,6 +88,8 @@ "HeaderLatestEpisodes": "最新のエピソード", "HeaderLibraries": "ライブラリー", "HeaderPlayerSettings": "プレーヤーの設定", + "HeaderSettingsGeneral": "一般", + "HeaderSettingsScanner": "スキャナー", "LabelBooks": "ほん", "LabelContinueListening": "続きから聞く", "LabelLanguage": "言語", @@ -97,5 +99,17 @@ "LabelNewPassword": "新しいのパスワード", "LabelPassword": "パスワード", "LabelPlaylists": "プレイリスト", - "LabelPodcast": "ポッドキャスト" + "LabelPodcast": "ポッドキャスト", + "LabelSettingsFindCovers": "表紙を探す", + "LabelSettingsFindCoversHelp": "もしオーディオブックに表紙が埋め込まれていない、もしくは表紙画像がフォルダー内に見つからなければ、スキャナーは表紙を探そうとします。
注記: これによってスキャン時間が長くなります", + "LabelSettingsParseSubtitles": "サブタイトルを抽出する", + "LabelSettingsParseSubtitlesHelp": "オーディオブックのフォルダー名からサブタイトルを抽出します。
サブタイトルは \"-\" で区切ってください
例: \"本のタイトル - ここにサブタイトル\" という名前だと \"ここにサブタイトル\" というサブタイトルになります", + "LabelSettingsPreferMatchedMetadata": "一致したメタデータを優先する", + "LabelSettingsPreferMatchedMetadataHelp": "クイックマッチを使用する時、一致したデータは書籍の詳細を上書きします。デフォルトでは、埋まっていない項目のみ入力されます。", + "LabelSettingsSortingIgnorePrefixes": "並び替えでプレフィックスを無視する", + "LabelSettingsSortingIgnorePrefixesHelp": "例: プレフィックス \"the\" の付いた本のタイトル \"The Book Title\" は \"Book Title, The\" として並び替えられます", + "LabelSettingsStoreCoversWithItem": "表紙を項目と一緒に保存する", + "LabelSettingsStoreCoversWithItemHelp": "デフォルトでは表紙は /metadata/items に保存されますが、この設定をオンにするとライブラリーの項目のフォルダーに保存されます。\"cover\" という名前のファイル一つのみが保持されます", + "LabelSettingsStoreMetadataWithItem": "メタデータを項目と一緒に保存する", + "LabelSettingsStoreMetadataWithItemHelp": "デフォルトではメタデータは/metadata/itemsに保存されますが、この設定をオンにするとライブラリーの項目のフォルダーに保存されます" } From b3d020b89f037a3bc92375d01dc669d6c9240c9e Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Wed, 20 Aug 2025 07:32:24 +0200 Subject: [PATCH 034/217] Translated using Weblate (Swedish) Currently translated at 96.8% (1121 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index 377a88cc..c4ed24ef 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -331,9 +331,9 @@ "LabelEmail": "E-post", "LabelEmailSettingsFromAddress": "Från e-postadress", "LabelEmailSettingsRejectUnauthorized": "Avvisa icke-autentiserade certifikat", - "LabelEmailSettingsRejectUnauthorizedHelp": "Inaktivering av SSL-certifikatsvalidering kan exponera din anslutning för säkerhetsrisker, såsom man-in-the-middle-attacker. Inaktivera bara denna inställning om du förstår implikationerna och litar på den epostserver du ansluter till.", + "LabelEmailSettingsRejectUnauthorizedHelp": "Om valideringen av SSL-certifikat stängs av kan det exponera din anslutning för säkerhetsrisker, som attacker av typen 'man-in-the-middle'. Stäng endast av denna inställning om du förstår konsekvenserna och litar på den epostserver du är ansluten till.", "LabelEmailSettingsSecure": "Säker", - "LabelEmailSettingsSecureHelp": "Om sant kommer anslutningen att använda TLS vid anslutning till servern. Om falskt används TLS om servern stöder STARTTLS-tillägget. I de flesta fall, om du ansluter till port 465, bör du ställa in detta värde till sant. För port 587 eller 25, låt det vara falskt. (från nodemailer.com/smtp/#authentication)", + "LabelEmailSettingsSecureHelp": "Om aktiverad kommer anslutningen att använda TLS vid anslutning till servern. Annars används TLS om servern stöder STARTTLS-tillägget. I de flesta fall, om du ansluter till port 465, bör detta alternativ vara aktiverat. För port 587 eller 25, bör det vara avstängt. (från nodemailer.com/smtp/#authentication)", "LabelEmailSettingsTestAddress": "E-postadress för test", "LabelEmbeddedCover": "Infogat omslag", "LabelEnable": "Aktivera", @@ -482,10 +482,10 @@ "LabelNotFinished": "Ej avslutad", "LabelNotStarted": "Ej påbörjad", "LabelNotes": "Anteckningar", - "LabelNotificationAppriseURL": "Apprise URL(er)", + "LabelNotificationAppriseURL": "Apprise URL-adress(er)", "LabelNotificationAvailableVariables": "Tillgängliga variabler", "LabelNotificationBodyTemplate": "Kroppsmall", - "LabelNotificationEvent": "Aviseringshändelse", + "LabelNotificationEvent": "Händelser som skickar ett meddelande", "LabelNotificationTitleTemplate": "Titelsmall", "LabelNotificationsMaxFailedAttempts": "Max antal misslyckade försök", "LabelNotificationsMaxFailedAttemptsHelp": "Aviseringar inaktiveras när de misslyckas med att skickas så många gånger", @@ -729,7 +729,7 @@ "LabelYourPlaylists": "Dina spellistor", "LabelYourProgress": "Framsteg", "MessageAddToPlayerQueue": "Lägg till i spellistan", - "MessageAppriseDescription": "För att använda den här funktionen behöver du ha en instans av Apprise API igång eller en API som hanterar dessa begäranden.
Apprise API-urlen bör vara hela URL-sökvägen för att skicka meddelandet, t.ex., om din API-instans är tillgänglig på http://192.168.1.1:8337, bör du ange http://192.168.1.1:8337/notify.", + "MessageAppriseDescription": "För att använda den här funktionen behöver du ha en instans av Apprise API startad eller ett API som hanterar dessa förfrågningar.
URL-adressen till Apprise API bör vara hela sökvägen för att skicka meddelandet, t.ex., om din API-instans är tillgänglig på http://192.168.1.1:8337, bör du ange http://192.168.1.1:8337/notify.", "MessageAuthenticationLegacyTokenWarning": "Legacy API-koder kommer att raderas i framtiden. Använd denna istället: API Keys.", "MessageAuthenticationOIDCChangesRestart": "Du måste starta om servern efter att du ändrat eller adderat OIDC (OpenID Connect).", "MessageAuthenticationSecurityMessage": "Identifieringen av användare har förbättrats av säkerhetsskäl. Alla användare måste därför logga in på nytt.", @@ -933,6 +933,9 @@ "NotificationOnBackupCompletedDescription": "Aktiveras när en backup är genomförd", "NotificationOnBackupFailedDescription": "Aktiveras när en backup misslyckas", "NotificationOnEpisodeDownloadedDescription": "Aktiveras när avsnitt i en podcast automatiskt har hämtats", + "NotificationOnRSSFeedDisabledDescription": "Aktiveras när den automatiska nedladdningen av avsnitt i en podcast stängts av pga för många misslyckade försök", + "NotificationOnRSSFeedFailedDescription": "Aktiveras när den automatiska nedladdningen av avsnitt i en podcast misslyckats", + "NotificationOnTestDescription": "Händelse för att testa meddelandesystemet", "PlaceholderBulkChapterInput": "Addera kapitlets titel eller numrera kapitlen (t.ex. 'Avsnitt 1', 'Kapitel 10', '1.)", "PlaceholderNewCollection": "Nytt namn på samlingen", "PlaceholderNewFolderPath": "Ny sökväg till mappen", @@ -958,7 +961,7 @@ "StatsTotalDuration": "Med den totala längden…", "StatsYearInReview": "- SAMMANSTÄLLNING AV ÅRET", "ToastAccountUpdateSuccess": "Kontot har uppdaterats", - "ToastAppriseUrlRequired": "En adress till Apprise måste anges", + "ToastAppriseUrlRequired": "En URL-adress till Apprise API måste anges", "ToastAsinRequired": "En ASIN-kod krävs", "ToastAuthorImageRemoveSuccess": "Författarens bild borttagen", "ToastAuthorNotFound": "Författaren \"{0}\" kunde inte identifieras", From 6aa9ecaabaae67f0bea09924042b284044ed7743 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: Wed, 20 Aug 2025 07:01:55 +0200 Subject: [PATCH 035/217] Translated using Weblate (Ukrainian) Currently translated at 100.0% (1157 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/ --- client/strings/uk.json | 1 + 1 file changed, 1 insertion(+) diff --git a/client/strings/uk.json b/client/strings/uk.json index a79849ac..9e6ac9f4 100644 --- a/client/strings/uk.json +++ b/client/strings/uk.json @@ -1096,6 +1096,7 @@ "ToastPlaylistUpdateSuccess": "Список відтворення оновлено", "ToastPodcastCreateFailed": "Не вдалося створити подкаст", "ToastPodcastCreateSuccess": "Подкаст успішно створено", + "ToastPodcastEpisodeUpdated": "Епізод оновлено", "ToastPodcastGetFeedFailed": "Не вдалося отримати фід подкасту", "ToastPodcastNoEpisodesInFeed": "У RSS-каналі не знайдено епізодів", "ToastPodcastNoRssFeed": "Подкаст не має RSS-каналу", From 6194c485496b7a1f0cb48374c40044ae43c20811 Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Wed, 20 Aug 2025 16:59:26 +0200 Subject: [PATCH 036/217] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1157 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 1 + 1 file changed, 1 insertion(+) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 67d587f0..42eee1ac 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -1096,6 +1096,7 @@ "ToastPlaylistUpdateSuccess": "播放列表已更新", "ToastPodcastCreateFailed": "创建播客失败", "ToastPodcastCreateSuccess": "已成功创建播客", + "ToastPodcastEpisodeUpdated": "剧集已更新", "ToastPodcastGetFeedFailed": "无法获取播客信息", "ToastPodcastNoEpisodesInFeed": "RSS 订阅中未找到任何剧集", "ToastPodcastNoRssFeed": "播客没有 RSS 源", From deb121c52378f8e3178adebd796396658bc7a2db Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 22 Aug 2025 08:20:49 -0500 Subject: [PATCH 037/217] Fix podcast itunesId not set on create or update from match #4614 --- server/models/Podcast.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/models/Podcast.js b/server/models/Podcast.js index d99a66df..a96e1dd0 100644 --- a/server/models/Podcast.js +++ b/server/models/Podcast.js @@ -82,6 +82,13 @@ class Podcast extends Model { const genres = Array.isArray(payload.metadata.genres) && payload.metadata.genres.every((g) => typeof g === 'string' && g.length) ? payload.metadata.genres : [] const tags = Array.isArray(payload.tags) && payload.tags.every((t) => typeof t === 'string' && t.length) ? payload.tags : [] + const stringKeys = ['title', 'author', 'releaseDate', 'feedUrl', 'imageUrl', 'description', 'itunesPageUrl', 'itunesId', 'itunesArtistId', 'language', 'type'] + stringKeys.forEach((key) => { + if (typeof payload.metadata[key] === 'number') { + payload.metadata[key] = String(payload.metadata[key]) + } + }) + return this.create( { title, @@ -205,6 +212,11 @@ class Podcast extends Model { if (payload.metadata) { const stringKeys = ['title', 'author', 'releaseDate', 'feedUrl', 'imageUrl', 'description', 'itunesPageUrl', 'itunesId', 'itunesArtistId', 'language', 'type'] stringKeys.forEach((key) => { + // Convert numbers to strings + if (typeof payload.metadata[key] === 'number') { + payload.metadata[key] = String(payload.metadata[key]) + } + let newKey = key if (key === 'type') { newKey = 'podcastType' From 2f6de71a3a777f3f3e1cb2047300a7cef8e5be6e Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 22 Aug 2025 08:35:11 -0500 Subject: [PATCH 038/217] Fix match tab local storage book provider being updated by podcast matching #4615 --- client/components/modals/item/tabs/Match.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index 41043be7..bf15ffc1 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -400,7 +400,9 @@ export default { this.$toast.warning(this.$strings.ToastTitleRequired) return } - this.persistProvider() + if (!this.isPodcast) { + this.persistProvider() + } this.runSearch() }, async runSearch() { From 9c47f404c97699504873d5e3a2548b386dee6724 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sat, 23 Aug 2025 16:55:32 -0500 Subject: [PATCH 039/217] Fix current author not showing in podcast match #4617 --- client/components/modals/item/tabs/Match.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/modals/item/tabs/Match.vue b/client/components/modals/item/tabs/Match.vue index bf15ffc1..3faa26b2 100644 --- a/client/components/modals/item/tabs/Match.vue +++ b/client/components/modals/item/tabs/Match.vue @@ -77,8 +77,8 @@
-

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

+ {{ $strings.LabelCurrently }} {{ isPodcast ? mediaMetadata.author : mediaMetadata.authorName }}

From e258f122f1ef4fd86620f1a1c6a3d68ccdeafe23 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 24 Aug 2025 08:41:31 -0500 Subject: [PATCH 040/217] Update weblate readme widget to use vertical bar chart --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 3eb4cef7..877ea091 100644 --- a/readme.md +++ b/readme.md @@ -355,7 +355,7 @@ This application is built using [NodeJs](https://nodejs.org/). ### Localization -Thank you to [Weblate](https://hosted.weblate.org/engage/audiobookshelf/) for hosting our localization infrastructure pro-bono. If you want to see Audiobookshelf in your language, please help us localize. Additional information on helping with the translations [here](https://www.audiobookshelf.org/faq#how-do-i-help-with-translations). Translation status +Thank you to [Weblate](https://hosted.weblate.org/engage/audiobookshelf/) for hosting our localization infrastructure pro-bono. If you want to see Audiobookshelf in your language, please help us localize. Additional information on helping with the translations [here](https://www.audiobookshelf.org/faq#how-do-i-help-with-translations). Translation status ### Dev Container Setup From 18ad23d01627cf33bb7636f937ef22841d41e533 Mon Sep 17 00:00:00 2001 From: John Date: Sun, 24 Aug 2025 16:54:38 -0500 Subject: [PATCH 041/217] Issue 4540 New SortBy Options: Started Date & Finished Date (#4575) --------- Co-authored-by: advplyr --- client/components/cards/LazyBookCard.vue | 16 ++++++++++++++++ client/components/controls/LibrarySortSelect.vue | 10 +++++++++- client/strings/en-us.json | 4 ++++ server/utils/queries/libraryItemsBookFilters.js | 12 ++++++++---- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/client/components/cards/LazyBookCard.vue b/client/components/cards/LazyBookCard.vue index 955e18d9..fbb50bb1 100644 --- a/client/components/cards/LazyBookCard.vue +++ b/client/components/cards/LazyBookCard.vue @@ -353,6 +353,14 @@ export default { if (!this.userProgressLastUpdated) return '\u00A0' return this.$getString('LabelLastProgressDate', [this.$formatDatetime(this.userProgressLastUpdated, this.dateFormat, this.timeFormat)]) } + if (this.orderBy === 'progress.createdAt') { + if (!this.userProgressStartedDate) return '\u00A0' + return this.$getString('LabelStartedDate', [this.$formatDatetime(this.userProgressStartedDate, this.dateFormat, this.timeFormat)]) + } + if (this.orderBy === 'progress.finishedAt') { + if (!this.userProgressFinishedDate) return '\u00A0' + return this.$getString('LabelFinishedDate', [this.$formatDatetime(this.userProgressFinishedDate, this.dateFormat, this.timeFormat)]) + } return null }, episodeProgress() { @@ -389,6 +397,14 @@ export default { if (!this.userProgress) return null return this.userProgress.lastUpdate }, + userProgressStartedDate() { + if (!this.userProgress) return null + return this.userProgress.startedAt + }, + userProgressFinishedDate() { + if (!this.userProgress) return null + return this.userProgress.finishedAt + }, itemIsFinished() { if (this.booksInSeries) return this.seriesIsFinished return this.userProgress ? !!this.userProgress.isFinished : false diff --git a/client/components/controls/LibrarySortSelect.vue b/client/components/controls/LibrarySortSelect.vue index 536c93f1..a0734d6a 100644 --- a/client/components/controls/LibrarySortSelect.vue +++ b/client/components/controls/LibrarySortSelect.vue @@ -134,6 +134,14 @@ export default { text: this.$strings.LabelLibrarySortByProgress, value: 'progress' }, + { + text: this.$strings.LabelLibrarySortByProgressStarted, + value: 'progress.createdAt' + }, + { + text: this.$strings.LabelLibrarySortByProgressFinished, + value: 'progress.finishedAt' + }, { text: this.$strings.LabelRandomly, value: 'random' @@ -200,4 +208,4 @@ export default { .librarySortMenu { max-height: calc(100vh - 125px); } - \ No newline at end of file + diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 77e9e07a..6fc55d6f 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -378,6 +378,7 @@ "LabelFilterByUser": "Filter by User", "LabelFindEpisodes": "Find Episodes", "LabelFinished": "Finished", + "LabelFinishedDate": "Finished {0}", "LabelFolder": "Folder", "LabelFolders": "Folders", "LabelFontBold": "Bold", @@ -436,6 +437,8 @@ "LabelLibraryItem": "Library Item", "LabelLibraryName": "Library Name", "LabelLibrarySortByProgress": "Progress Updated", + "LabelLibrarySortByProgressFinished": "Finished Date", + "LabelLibrarySortByProgressStarted": "Started Date", "LabelLimit": "Limit", "LabelLineSpacing": "Line spacing", "LabelListenAgain": "Listen Again", @@ -635,6 +638,7 @@ "LabelStartTime": "Start Time", "LabelStarted": "Started", "LabelStartedAt": "Started At", + "LabelStartedDate": "Started {0}", "LabelStatsAudioTracks": "Audio Tracks", "LabelStatsAuthors": "Authors", "LabelStatsBestDay": "Best Day", diff --git a/server/utils/queries/libraryItemsBookFilters.js b/server/utils/queries/libraryItemsBookFilters.js index 85d7f387..494a9564 100644 --- a/server/utils/queries/libraryItemsBookFilters.js +++ b/server/utils/queries/libraryItemsBookFilters.js @@ -289,7 +289,11 @@ module.exports = { const nullDir = sortDesc ? 'DESC NULLS FIRST' : 'ASC NULLS LAST' return [[Sequelize.literal(`CAST(\`series.bookSeries.sequence\` AS FLOAT) ${nullDir}`)]] } else if (sortBy === 'progress') { - return [[Sequelize.literal('mediaProgresses.updatedAt'), dir]] + return [[Sequelize.literal(`mediaProgresses.updatedAt ${dir} NULLS LAST`)]] + } else if (sortBy === 'progress.createdAt') { + return [[Sequelize.literal(`mediaProgresses.createdAt ${dir} NULLS LAST`)]] + } else if (sortBy === 'progress.finishedAt') { + return [[Sequelize.literal(`mediaProgresses.finishedAt ${dir} NULLS LAST`)]] } else if (sortBy === 'random') { return [Database.sequelize.random()] } @@ -519,7 +523,7 @@ module.exports = { } bookIncludes.push({ model: Database.mediaProgressModel, - attributes: ['id', 'isFinished', 'currentTime', 'ebookProgress', 'updatedAt'], + attributes: ['id', 'isFinished', 'currentTime', 'ebookProgress', 'updatedAt', 'createdAt', 'finishedAt'], where: mediaProgressWhere, required: false }) @@ -530,10 +534,10 @@ module.exports = { } // When sorting by progress but not filtering by progress, include media progresses - if (filterGroup !== 'progress' && sortBy === 'progress') { + if (filterGroup !== 'progress' && ['progress.createdAt', 'progress.finishedAt', 'progress'].includes(sortBy)) { bookIncludes.push({ model: Database.mediaProgressModel, - attributes: ['id', 'isFinished', 'currentTime', 'ebookProgress', 'updatedAt'], + attributes: ['id', 'isFinished', 'currentTime', 'ebookProgress', 'updatedAt', 'createdAt', 'finishedAt'], where: { userId: user.id }, From 95973243a6cf09218723110a332622de81b82853 Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 25 Aug 2025 16:50:10 -0500 Subject: [PATCH 042/217] Update book library progress sort labels as per discord vote --- client/strings/en-us.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 6fc55d6f..42832e37 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -436,9 +436,9 @@ "LabelLibraryFilterSublistEmpty": "No {0}", "LabelLibraryItem": "Library Item", "LabelLibraryName": "Library Name", - "LabelLibrarySortByProgress": "Progress Updated", - "LabelLibrarySortByProgressFinished": "Finished Date", - "LabelLibrarySortByProgressStarted": "Started Date", + "LabelLibrarySortByProgress": "Progress: Last Updated", + "LabelLibrarySortByProgressFinished": "Progress: Finished", + "LabelLibrarySortByProgressStarted": "Progress: Started", "LabelLimit": "Limit", "LabelLineSpacing": "Line spacing", "LabelListenAgain": "Listen Again", From 56dc04228258278d0900948357d402afd0d973d6 Mon Sep 17 00:00:00 2001 From: laxandrea Date: Thu, 21 Aug 2025 21:46:02 +0200 Subject: [PATCH 043/217] Translated using Weblate (Italian) Currently translated at 99.3% (1149 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/ --- client/strings/it.json | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/client/strings/it.json b/client/strings/it.json index 04ef0ce4..f5702bdc 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Strumenti di gestione file audiolibri", "HeaderAuthentication": "Authenticazione", "HeaderBackups": "Backup", + "HeaderBulkChapterModal": "Aggiungere più capitoli", "HeaderChangePassword": "Cambia la password", "HeaderChapters": "Capitoli", "HeaderChooseAFolder": "Seleziona la cartella", @@ -211,7 +212,7 @@ "HeaderTableOfContents": "Indice", "HeaderTools": "Strumenti", "HeaderUpdateAccount": "Aggiorna Account", - "HeaderUpdateApiKey": "Aggiornamento API chiave", + "HeaderUpdateApiKey": "Aggiornamento chiave API", "HeaderUpdateAuthor": "Aggiorna Autore", "HeaderUpdateDetails": "Aggiorna Dettagli", "HeaderUpdateLibrary": "Aggiorna Libreria", @@ -242,9 +243,9 @@ "LabelAllUsersIncludingGuests": "Tutti gli Utenti Inclusi gli ospiti", "LabelAlreadyInYourLibrary": "Già esistente nella libreria", "LabelApiKeyCreated": "API Key \"{0}\" creato con successo.", - "LabelApiKeyCreatedDescription": "Assicurarsi di copiare la chiave API ora come non sarà in grado di rivedere questo.", - "LabelApiKeyUser": "Atto per conto dell'utente", - "LabelApiKeyUserDescription": "Questa chiave API avrà le stesse autorizzazioni dell'utente che agisce per conto di. Questo apparirà lo stesso nei registri come se l'utente stesse facendo la richiesta.", + "LabelApiKeyCreatedDescription": "Assicurarsi di copiare la chiave API ora poiché non si potrà rivederla.", + "LabelApiKeyUser": "Agisce per conto dell'utente", + "LabelApiKeyUserDescription": "Questa chiave API avrà le stesse autorizzazioni dell'utente per conto del quale agisce. Apparirà nei registri come se l'utente stesse facendo la richiesta.", "LabelApiToken": "API Token", "LabelAppend": "Appese", "LabelAudioBitrate": "Audio Bitrate (es. 128k)", @@ -471,6 +472,7 @@ "LabelNewestAuthors": "Nuovi autori", "LabelNewestEpisodes": "Nuovi episodi", "LabelNextBackupDate": "Data Prossimo Backup", + "LabelNextChapters": "I prossimi capitoli saranno:", "LabelNextScheduledRun": "Data prossima esecuzione schedulata", "LabelNoApiKeys": "Nessuna chiave API", "LabelNoCustomMetadataProviders": "Nessun provider di metadati personalizzato", @@ -488,6 +490,7 @@ "LabelNotificationsMaxQueueSize": "Coda Massima di notifiche eventi", "LabelNotificationsMaxQueueSizeHelp": "Le notifiche sono limitate per 1 al secondo, per evitare lo spamming le notifiche verrano ignorare se superano la coda.", "LabelNumberOfBooks": "Numero di libri", + "LabelNumberOfChapters": "Numero di capitoli:", "LabelNumberOfEpisodes": "Numero di episodi", "LabelOpenIDAdvancedPermsClaimDescription": "Nome dell'attestazione OpenID che contiene autorizzazioni avanzate per le azioni dell'utente all'interno dell'applicazione che verranno applicate ai ruoli non amministratori (se configurato). Se il reclamo manca nella risposta, l'accesso ad ABS verrà negato. Se manca una singola opzione, verrà trattata comefalsa. Assicurati che l'attestazione del provider di identità corrisponda alla struttura prevista:", "LabelOpenIDClaims": "Lasciare vuote le seguenti opzioni per disabilitare l'assegnazione avanzata di gruppi e autorizzazioni, assegnando quindi automaticamente il gruppo \"Utente\".", @@ -728,9 +731,9 @@ "MessageAddToPlayerQueue": "Aggiungi alla coda di riproduzione", "MessageAppriseDescription": "Per utilizzare questa funzione è necessario disporre di un'istanza di Apprise API in esecuzione o un'API che gestirà quelle stesse richieste.
L'API Url dovrebbe essere il percorso URL completo per inviare la notifica, ad esempio se la tua istanza API è servita cosi .http://192.168.1.1:8337 Allora dovrai mettere http://192.168.1.1:8337/notify.", "MessageAsinCheck": "Assicurati di utilizzare l'ASIN della regione Audible corretta, non di Amazon.", - "MessageAuthenticationLegacyTokenWarning": "I gettoni API legacy verranno rimossi in futuro. Utilizzare API tasti invece.", + "MessageAuthenticationLegacyTokenWarning": "I token API legacy verranno rimossi in futuro. Utilizzare piuttosto le chiavi API.", "MessageAuthenticationOIDCChangesRestart": "Riavvia il tuo server dopo aver salvato per applicare le modifiche OIDC.", - "MessageAuthenticationSecurityMessage": "L'autenticazione è stata migliorata per la sicurezza. Tutti gli utenti sono tenuti a re-login.", + "MessageAuthenticationSecurityMessage": "L'autenticazione è stata migliorata per incrementare la sicurezza. Tutti gli utenti sono tenuti a rieffettuare il login.", "MessageBackupsDescription": "I backup includono utenti, progressi degli utenti, dettagli sugli elementi della libreria, impostazioni del server e immagini archiviate in /metadata/items & /metadata/authors. I backup non includono i file archiviati nelle cartelle della libreria.", "MessageBackupsLocationEditNote": "Nota: l'aggiornamento della posizione di backup non sposterà o modificherà i backup esistenti", "MessageBackupsLocationNoEditNote": "Nota: la posizione del backup viene impostata tramite una variabile di ambiente e non può essere modificata qui.", @@ -744,6 +747,7 @@ "MessageBookshelfNoResultsForFilter": "Nessun risultato per il filtro \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Nessun risultato per la query", "MessageBookshelfNoSeries": "Non c'è nessuna Serie", + "MessageBulkChapterPattern": "Quanti capitoli vuoi aggiungere con questo motivo di numerazione?", "MessageChapterEndIsAfter": "La fine del capitolo è dopo la fine del tuo audiolibro", "MessageChapterErrorFirstNotZero": "Il primo capitolo deve iniziare da 0", "MessageChapterErrorStartGteDuration": "L'ora di inizio non valida deve essere inferiore alla durata dell'audiolibro", @@ -998,8 +1002,10 @@ "ToastBookmarkCreateFailed": "Creazione segnalibro fallita", "ToastBookmarkCreateSuccess": "Segnalibro creato", "ToastBookmarkRemoveSuccess": "Segnalibro Rimosso", + "ToastBulkChapterInvalidCount": "Inserire un numero tra 1 e 150", "ToastCachePurgeFailed": "Impossibile eliminare la cache", "ToastCachePurgeSuccess": "Cache eliminata correttamente", + "ToastChapterLocked": "Il capitolo è bloccato.", "ToastChaptersHaveErrors": "I capitoli contengono errori", "ToastChaptersInvalidShiftAmountLast": "Quantità di spostamento non valida. L'orario di inizio dell'ultimo capitolo si estenderebbe oltre la durata di questo audiolibro.", "ToastChaptersInvalidShiftAmountStart": "Quantità di spostamento non valida. Il primo capitolo avrebbe una lunghezza pari a zero o negativa e verrebbe sovrascritto dal secondo capitolo. Aumentare la durata iniziale del secondo capitolo.", @@ -1083,6 +1089,7 @@ "ToastPlaylistUpdateSuccess": "Playlist Aggiornata", "ToastPodcastCreateFailed": "Errore creazione podcast", "ToastPodcastCreateSuccess": "Podcast creato correttamente", + "ToastPodcastEpisodeUpdated": "Episodio aggiornato", "ToastPodcastGetFeedFailed": "Impossibile ottenere il feed del podcast", "ToastPodcastNoEpisodesInFeed": "Nessun episodio trovato nel feed RSS", "ToastPodcastNoRssFeed": "Il podcast non ha un feed RSS", @@ -1133,5 +1140,12 @@ "ToastUserPasswordChangeSuccess": "Password modificata con successo", "ToastUserPasswordMismatch": "Le password non corrispondono", "ToastUserPasswordMustChange": "La nuova password non può corrispondere alla vecchia password", - "ToastUserRootRequireName": "È necessario immettere un nome utente root" + "ToastUserRootRequireName": "È necessario immettere un nome utente root", + "TooltipAddChapters": "Aggiungere capitolo/i", + "TooltipAddOneSecond": "Aggiungere 1 secondo", + "TooltipLockAllChapters": "Bloccare tutti i capitoli", + "TooltipLockChapter": "Bloccare capitolo (Shift+click per intervallo)", + "TooltipSubtractOneSecond": "Sottrarre 1 secondo", + "TooltipUnlockAllChapters": "Sbloccare tutti i capitoli", + "TooltipUnlockChapter": "Sbloccare capitolo (Shift+click per intervallo)" } From 05a457779247b123f5a5e0c48cc25ffbfbbbf861 Mon Sep 17 00:00:00 2001 From: Yurt Page Date: Fri, 22 Aug 2025 07:52:13 +0200 Subject: [PATCH 044/217] Translated using Weblate (Russian) Currently translated at 100.0% (1157 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/ --- client/strings/ru.json | 157 +++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 78 deletions(-) diff --git a/client/strings/ru.json b/client/strings/ru.json index efe38aeb..7c7254a5 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -17,12 +17,12 @@ "ButtonCancel": "Отмена", "ButtonCancelEncode": "Отменить кодирование", "ButtonChangeRootPassword": "Поменять мастер пароль", - "ButtonCheckAndDownloadNewEpisodes": "Проверка и Загрузка новых эпизодов", + "ButtonCheckAndDownloadNewEpisodes": "Скачать новые выпуски", "ButtonChooseAFolder": "Выбор папки", "ButtonChooseFiles": "Выбор файлов", "ButtonClearFilter": "Очистить фильтр", "ButtonClose": "Закрыть", - "ButtonCloseFeed": "Закрыть канал", + "ButtonCloseFeed": "Закрыть ленту", "ButtonCloseSession": "Закрыть открытый сеанс", "ButtonCollections": "Коллекции", "ButtonConfigureScanner": "Конфигурация сканера", @@ -56,7 +56,7 @@ "ButtonNextChapter": "Следующая глава", "ButtonNextItemInQueue": "Следующий элемент в очереди", "ButtonOk": "Ок", - "ButtonOpenFeed": "Открыть канал", + "ButtonOpenFeed": "Открыть ленту", "ButtonOpenManager": "Открыть менеджер", "ButtonPause": "Пауза", "ButtonPlay": "Слушать", @@ -142,7 +142,7 @@ "HeaderEbookFiles": "Файлы e-книг", "HeaderEmail": "E-mail", "HeaderEmailSettings": "Настройки Email", - "HeaderEpisodes": "Эпизоды", + "HeaderEpisodes": "Выпуски", "HeaderEreaderDevices": "Устройства E-книга", "HeaderEreaderSettings": "Настройки E-ридера", "HeaderFiles": "Файлы", @@ -151,7 +151,7 @@ "HeaderItemFiles": "Файлы элемента", "HeaderItemMetadataUtils": "Утилиты", "HeaderLastListeningSession": "Последний сеанс прослушивания", - "HeaderLatestEpisodes": "Последние эпизоды", + "HeaderLatestEpisodes": "Последние выпуски", "HeaderLibraries": "Библиотеки", "HeaderLibraryFiles": "Файлы библиотеки", "HeaderLibraryStats": "Статистика библиотеки", @@ -173,7 +173,7 @@ "HeaderNotifications": "Уведомления", "HeaderOpenIDConnectAuthentication": "Аутентификация OpenID Connect", "HeaderOpenListeningSessions": "Открытые сеансы прослушивания", - "HeaderOpenRSSFeed": "Открыть RSS-канал", + "HeaderOpenRSSFeed": "Открыть RSS-ленту", "HeaderOtherFiles": "Другие файлы", "HeaderPasswordAuthentication": "Аутентификация по паролю", "HeaderPermissions": "Разрешения", @@ -185,13 +185,13 @@ "HeaderPresets": "Пресеты", "HeaderPreviewCover": "Предпросмотр обложки", "HeaderRSSFeedGeneral": "Сведения о RSS", - "HeaderRSSFeedIsOpen": "RSS-канал открыт", - "HeaderRSSFeeds": "RSS-каналы", - "HeaderRemoveEpisode": "Удалить эпизод", - "HeaderRemoveEpisodes": "Удалить {0} эпизодов", + "HeaderRSSFeedIsOpen": "RSS-лента открыта", + "HeaderRSSFeeds": "RSS-ленты", + "HeaderRemoveEpisode": "Удалить выпуск", + "HeaderRemoveEpisodes": "Удалить {0} выпусков", "HeaderSavedMediaProgress": "Прогресс медиа сохранен", "HeaderSchedule": "Планировщик", - "HeaderScheduleEpisodeDownloads": "Запланируйте автоматическую загрузку эпизодов", + "HeaderScheduleEpisodeDownloads": "Запланировать автоматическое скачивание выпусков", "HeaderScheduleLibraryScans": "Планировщик автоматического сканирования библиотеки", "HeaderSession": "Сеансы", "HeaderSetBackupSchedule": "Установить планировщик бэкапов", @@ -237,7 +237,7 @@ "LabelAddedDate": "Добавлено {0}", "LabelAdminUsersOnly": "Только для пользователей с правами администратора", "LabelAll": "Все", - "LabelAllEpisodesDownloaded": "Все эпизоды загружены", + "LabelAllEpisodesDownloaded": "Все выпуски скачаны", "LabelAllUsers": "Все пользователи", "LabelAllUsersExcludingGuests": "Все пользователи, кроме гостей", "LabelAllUsersIncludingGuests": "Все пользователи, включая гостей", @@ -255,7 +255,7 @@ "LabelAuthorFirstLast": "Автор (Имя Фамилия)", "LabelAuthorLastFirst": "Автор (Фамилия, Имя)", "LabelAuthors": "Авторы", - "LabelAutoDownloadEpisodes": "Скачивать эпизоды автоматически", + "LabelAutoDownloadEpisodes": "Скачивать выпуски автоматически", "LabelAutoFetchMetadata": "Автоматическое извлечение метаданных", "LabelAutoFetchMetadataHelp": "Извлекает метаданные для названия, автора и серии для упрощения загрузки. После загрузки может потребоваться сопоставление дополнительных метаданных.", "LabelAutoLaunch": "Автозапуск", @@ -277,7 +277,7 @@ "LabelButtonText": "Текст кнопки", "LabelByAuthor": "{0}", "LabelChangePassword": "Изменить пароль", - "LabelChannels": "Каналы", + "LabelChannels": "Ленты", "LabelChapterCount": "{0} Главы", "LabelChapterTitle": "Название главы", "LabelChapters": "Главы", @@ -318,7 +318,7 @@ "LabelDiscFromMetadata": "Диск из Метаданных", "LabelDiscover": "Не начато", "LabelDownload": "Скачать", - "LabelDownloadNEpisodes": "Скачать {0} эпизодов", + "LabelDownloadNEpisodes": "Скачать {0} выпусков", "LabelDownloadable": "Загружаемый", "LabelDuration": "Длительность", "LabelDurationComparisonExactMatch": "(точное совпадение)", @@ -348,13 +348,13 @@ "LabelEncodingWatcherDisabled": "Если у вас отключено наблюдение за папкой, вам нужно будет повторно пересканировать эту аудиокнигу.", "LabelEnd": "Конец", "LabelEndOfChapter": "Конец главы", - "LabelEpisode": "Эпизод", - "LabelEpisodeNotLinkedToRssFeed": "Эпизод, не связанный с RSS-каналом", - "LabelEpisodeNumber": "Эпизод #{0}", - "LabelEpisodeTitle": "Имя эпизода", - "LabelEpisodeType": "Тип эпизода", - "LabelEpisodeUrlFromRssFeed": "URL-адрес эпизода из RSS-ленты", - "LabelEpisodes": "Эпизодов", + "LabelEpisode": "Выпуск", + "LabelEpisodeNotLinkedToRssFeed": "Выпуск, не связанный с RSS-лентой", + "LabelEpisodeNumber": "Выпуск #{0}", + "LabelEpisodeTitle": "Название выпуска", + "LabelEpisodeType": "Тип выпуска", + "LabelEpisodeUrlFromRssFeed": "URL-адрес выпуска из RSS-ленты", + "LabelEpisodes": "Выпуски", "LabelEpisodic": "Эпизодический", "LabelExample": "Пример", "LabelExpandSeries": "Развернуть серию", @@ -367,7 +367,7 @@ "LabelExplicitChecked": "18+ (отмечено)", "LabelExplicitUnchecked": "+18 (не отмечено)", "LabelExportOPML": "Экспорт OPML", - "LabelFeedURL": "URL канала", + "LabelFeedURL": "URL-адрес ленты", "LabelFetchingMetadata": "Извлечение метаданных", "LabelFile": "Файл", "LabelFileBirthtime": "Дата создания", @@ -376,7 +376,7 @@ "LabelFileModifiedDate": "Изменено {0}", "LabelFilename": "Имя файла", "LabelFilterByUser": "Фильтр по пользователю", - "LabelFindEpisodes": "Найти эпизоды", + "LabelFindEpisodes": "Найти выпуски", "LabelFinished": "Закончен", "LabelFolder": "Папка", "LabelFolders": "Папки", @@ -442,15 +442,15 @@ "LabelLogLevelDebug": "Debug", "LabelLogLevelInfo": "Info", "LabelLogLevelWarn": "Предупреждение", - "LabelLookForNewEpisodesAfterDate": "Искать новые эпизоды после этой даты", + "LabelLookForNewEpisodesAfterDate": "Искать новые выпуски после этой даты", "LabelLowestPriority": "Самый низкий приоритет", "LabelMatchConfidence": "Уверенность", "LabelMatchExistingUsersBy": "Сопоставление существующих пользователей по", "LabelMatchExistingUsersByDescription": "Используется для подключения существующих пользователей. После подключения пользователям будет присвоен уникальный идентификатор от поставщика единого входа", - "LabelMaxEpisodesToDownload": "Максимальное количество эпизодов для загрузки. Используйте 0 для неограниченного количества.", - "LabelMaxEpisodesToDownloadPerCheck": "Максимальное количество новых эпизодов для загрузки за одну проверку", - "LabelMaxEpisodesToKeep": "Максимальное количество сохраняемых эпизодов", - "LabelMaxEpisodesToKeepHelp": "Значение 0 не устанавливает максимального ограничения. После автоматической загрузки нового эпизода самый старый эпизод будет удален, если у вас более X эпизодов. При этом будет удален только 1 эпизод за каждую новую загрузку.", + "LabelMaxEpisodesToDownload": "Максимальное количество выпусков для скачивания. Используйте 0 для неограниченного количества.", + "LabelMaxEpisodesToDownloadPerCheck": "Максимальное количество новых выпусков для скачивания за один раз", + "LabelMaxEpisodesToKeep": "Максимальное количество сохраняемых выпусков", + "LabelMaxEpisodesToKeepHelp": "Значение 0 не устанавливает максимального ограничения. После автоматической скачивании нового выпуска самый старый будет удалён, если у вас их уже более X выпусков. При этом будет удалён только 1 выпуск за каждое новое скачивание.", "LabelMediaPlayer": "Медиа проигрыватель", "LabelMediaType": "Тип медиа", "LabelMetaTag": "Мета тег", @@ -472,13 +472,13 @@ "LabelNew": "Новый", "LabelNewPassword": "Новый пароль", "LabelNewestAuthors": "Новые авторы", - "LabelNewestEpisodes": "Новые эпизоды", + "LabelNewestEpisodes": "Новые выпуски", "LabelNextBackupDate": "Следующая дата бэкапирования", "LabelNextChapters": "Следующие главы будут:", "LabelNextScheduledRun": "Следущий запланированный запуск", "LabelNoApiKeys": "API ключи отсутствуют", "LabelNoCustomMetadataProviders": "Нет пользовательских поставщиков метаданных", - "LabelNoEpisodesSelected": "Эпизоды не выбраны", + "LabelNoEpisodesSelected": "Нет выбранных выпусков", "LabelNotFinished": "Не завершено", "LabelNotStarted": "Не запущено", "LabelNotes": "Заметки", @@ -493,11 +493,11 @@ "LabelNotificationsMaxQueueSizeHelp": "События ограничены 1 в секунду. События будут игнорированы если в очереди максимальное количество. Это предотвращает спам сообщениями.", "LabelNumberOfBooks": "Количество книг", "LabelNumberOfChapters": "Кол-во глав:", - "LabelNumberOfEpisodes": "# из эпизодов", + "LabelNumberOfEpisodes": "# из выпусков", "LabelOpenIDAdvancedPermsClaimDescription": "Имя утверждения OpenID, содержащего расширенные разрешения на действия пользователя в приложении, которые будут применяться к ролям, не являющимся администраторами (если они настроены). Если утверждение отсутствует в ответе, в доступе к ABS будет отказано. Если одна опция отсутствует, она будет рассматриваться как false. Убедитесь, что утверждение поставщика удостоверений соответствует ожидаемой структуре:", "LabelOpenIDClaims": "Оставьте следующие параметры пустыми, чтобы отключить расширенное назначение групп и разрешений, будет автоматически присвоена группа «Пользователь».", "LabelOpenIDGroupClaimDescription": "Имя утверждения OpenID, содержащего список групп пользователя. Обычно их называют groups. Если эта настройка настроена, приложение будет автоматически назначать роли на основе членства пользователя в группах при условии, что эти группы названы в утверждении без учета регистра \"admin\", \"user\" или \"guest\". Утверждение должно содержать список, и если пользователь принадлежит к нескольким группам, то приложение назначит роль, соответствующую самому высокому уровню доступа. Если ни одна из групп не совпадает, доступ будет запрещен.", - "LabelOpenRSSFeed": "Открыть RSS-канал", + "LabelOpenRSSFeed": "Открыть RSS-ленту", "LabelOverwrite": "Перезаписать", "LabelPaginationPageXOfY": "Страница {0} из {1}", "LabelPassword": "Пароль", @@ -539,8 +539,8 @@ "LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца", "LabelRSSFeedOpen": "Открыть RSS-ленту", "LabelRSSFeedPreventIndexing": "Запретить индексирование", - "LabelRSSFeedSlug": "Встроить RSS-канал", - "LabelRSSFeedURL": "URL RSS-канала", + "LabelRSSFeedSlug": "Ключевое слово RSS-ленты", + "LabelRSSFeedURL": "URL-адрес RSS-ленты", "LabelRandomly": "Случайно", "LabelReAddSeriesToContinueListening": "Повторно добавить серию в «Продолжить слушать»", "LabelRead": "Читать", @@ -565,8 +565,8 @@ "LabelSeason": "Сезон", "LabelSeasonNumber": "Сезон #{0}", "LabelSelectAll": "Выбрать все", - "LabelSelectAllEpisodes": "Выбрать все эпизоды", - "LabelSelectEpisodesShowing": "Выберите {0} эпизодов для показа", + "LabelSelectAllEpisodes": "Выбрать все выпуски", + "LabelSelectEpisodesShowing": "Выберите {0} выпусков для отображения", "LabelSelectUser": "Выбрать пользователя", "LabelSelectUsers": "Выбор пользователей", "LabelSendEbookToDevice": "Отправить e-книгу в...", @@ -745,7 +745,7 @@ "MessageBatchQuickMatchDescription": "Быстрый Поиск попытается добавить отсутствующие обложки и метаданные для выбранных элементов. Включите параметры ниже, чтобы разрешить Быстрому Поиску перезаписывать существующие обложки и/или метаданные.", "MessageBookshelfNoCollections": "Вы еще не создали ни одной коллекции", "MessageBookshelfNoCollectionsHelp": "Коллекции являются общедоступными. Все пользователи, имеющие доступ к библиотеке, могут их просматривать.", - "MessageBookshelfNoRSSFeeds": "Нет открытых RSS-каналов", + "MessageBookshelfNoRSSFeeds": "Нет открытых RSS-лент", "MessageBookshelfNoResultsForFilter": "Нет Результатов для фильтра \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Нет результатов для запроса", "MessageBookshelfNoSeries": "У вас нет серий", @@ -757,7 +757,7 @@ "MessageChapterStartIsAfter": "Глава начинается после окончания аудиокниги", "MessageChaptersNotFound": "Главы не найденны", "MessageCheckingCron": "Проверка cron...", - "MessageConfirmCloseFeed": "Вы уверены, что хотите закрыть этот канал?", + "MessageConfirmCloseFeed": "Вы уверены, что хотите закрыть эту ленту?", "MessageConfirmDeleteApiKey": "Вы уверены, что хотите удалить API ключ \"{0}\"?", "MessageConfirmDeleteBackup": "Вы уверены, что хотите удалить бэкап для {0}?", "MessageConfirmDeleteDevice": "Вы уверены, что хотите удалить устройство для чтения электронных книг \"{0}\"?", @@ -770,8 +770,8 @@ "MessageConfirmDeleteSession": "Вы уверены, что хотите удалить этот сеанс?", "MessageConfirmEmbedMetadataInAudioFiles": "Вы уверены, что хотите вставить метаданные в {0} аудиофайлов?", "MessageConfirmForceReScan": "Вы уверены, что хотите принудительно выполнить повторное сканирование?", - "MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все эпизоды как завершенные?", - "MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все эпизоды как не завершенные?", + "MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все выпуски как прослушанные?", + "MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все выпуски как непрослушанные?", "MessageConfirmMarkItemFinished": "Вы уверены, что хотите отметить «{0}» как завершенную?", "MessageConfirmMarkItemNotFinished": "Вы уверены, что хотите отметить «{0}» как не завершенную?", "MessageConfirmMarkSeriesFinished": "Вы уверены, что хотите отметить все книги этой серии как завершенные?", @@ -780,14 +780,14 @@ "MessageConfirmPurgeCache": "Очистка кэша удалит весь каталог в /metadata/cache.

Вы уверены, что хотите удалить каталог кэша?", "MessageConfirmPurgeItemsCache": "Очистка кэша элементов удалит весь каталог в /metadata/cache/items.
Вы уверены?", "MessageConfirmQuickEmbed": "Предупреждение! Быстрое встраивание не позволяет создавать резервные копии аудиофайлов. Убедитесь, что у вас есть резервная копия аудиофайлов.

Хотите продолжить?", - "MessageConfirmQuickMatchEpisodes": "При обнаружении совпадений информация о эпизодах быстрого поиска будет перезаписана. Будут обновлены только несопоставимые эпизоды. Вы уверены?", + "MessageConfirmQuickMatchEpisodes": "При обнаружении совпадений информация о выпусках быстрого поиска будет перезаписана. Будут обновлены только несопоставимые выпуски. Вы уверены?", "MessageConfirmReScanLibraryItems": "Вы уверены, что хотите пересканировать {0} элементов?", "MessageConfirmRemoveAllChapters": "Вы уверены, что хотите удалить все главы?", "MessageConfirmRemoveAuthor": "Вы уверены, что хотите удалить автора \"{0}\"?", "MessageConfirmRemoveCollection": "Вы уверены, что хотите удалить коллекцию \"{0}\"?", - "MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить эпизод \"{0}\"?", + "MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить выпуск «{0}»?", "MessageConfirmRemoveEpisodeNote": "Примечание: Это не приведет к удалению аудиофайла, если не включить опцию \"Жесткое удаление файла\"", - "MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} эпизодов?", + "MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} выпусков?", "MessageConfirmRemoveListeningSessions": "Вы уверены, что хотите удалить {0} сеансов прослушивания?", "MessageConfirmRemoveMetadataFiles": "Вы уверены, что хотите удалить все файлы metadata. {0} файлов из папок элементов вашей библиотеки?", "MessageConfirmRemoveNarrator": "Вы уверены, что хотите удалить чтеца \"{0}\"?", @@ -802,14 +802,14 @@ "MessageConfirmSendEbookToDevice": "Вы уверены, что хотите отправить {0} e-книгу \"{1}\" на устройство \"{2}\"?", "MessageConfirmUnlinkOpenId": "Вы уверены, что хотите отвязать этого пользователя от OpenID?", "MessageDaysListenedInTheLastYear": "{0} дней прослушивания за последний год", - "MessageDownloadingEpisode": "Эпизод скачивается", + "MessageDownloadingEpisode": "Скачивание выпуска", "MessageDragFilesIntoTrackOrder": "Перетащите файлы для исправления порядка треков", "MessageEmbedFailed": "Вставка не удалась!", "MessageEmbedFinished": "Встраивание завершено!", "MessageEmbedQueue": "Поставлен в очередь для внедрения метаданных ({0} в очереди)", - "MessageEpisodesQueuedForDownload": "{0} Эпизод(ов) запланировано для закачки", + "MessageEpisodesQueuedForDownload": "{0} выпуск(ов) запланировано для скачивания", "MessageEreaderDevices": "Чтобы обеспечить доставку электронных книг, вам может потребоваться добавить указанный выше адрес электронной почты в качестве действительного отправителя для каждого устройства, перечисленного ниже.", - "MessageFeedURLWillBe": "URL канала будет {0}", + "MessageFeedURLWillBe": "URL-адрес ленты будет {0}", "MessageFetching": "Завершается...", "MessageForceReScanDescription": "будет сканировать все файлы снова, как свежее сканирование. Теги ID3 аудиофайлов, OPF-файлы и текстовые файлы будут сканироваться как новые.", "MessageHeatmapListeningTimeTooltip": "{0} прослушивание на {1}", @@ -826,8 +826,8 @@ "MessageM4BFailed": "M4B Ошибка!", "MessageM4BFinished": "M4B Завершено!", "MessageMapChapterTitles": "Сопоставление названий глав с существующими главами аудиокниги без корректировки временных меток", - "MessageMarkAllEpisodesFinished": "Отметить все эпизоды как завершенные", - "MessageMarkAllEpisodesNotFinished": "Отметить все эпизоды как не завершенные", + "MessageMarkAllEpisodesFinished": "Отметить все выпуски как прослушанные", + "MessageMarkAllEpisodesNotFinished": "Отметить все выпуски как непрослушанные", "MessageMarkAsFinished": "Отметить, как завершенную", "MessageMarkAsNotFinished": "Отметить, как не завершенную", "MessageMatchBooksDescription": "попытается сопоставить книги в библиотеке с книгой из выбранного поставщика поиска и заполнить пустые детали и обложку. Не перезаписывает сведения.", @@ -842,8 +842,8 @@ "MessageNoDevices": "Нет устройств", "MessageNoDownloadsInProgress": "В настоящее время загрузка не выполняется", "MessageNoDownloadsQueued": "Нет загрузок в очереди", - "MessageNoEpisodeMatchesFound": "Совпадения эпизодов не найдены", - "MessageNoEpisodes": "Нет эпизодов", + "MessageNoEpisodeMatchesFound": "Совпадения выпусков не найдены", + "MessageNoEpisodes": "Нету выпусков", "MessageNoFoldersAvailable": "Нет доступных папок", "MessageNoGenres": "Нет жанров", "MessageNoIssues": "Нет проблем", @@ -853,7 +853,7 @@ "MessageNoLogs": "Нет записей", "MessageNoMediaProgress": "Нет прогресса медиа", "MessageNoNotifications": "Нет уведомлений", - "MessageNoPodcastFeed": "Недопустимый подкаст: Нет канала", + "MessageNoPodcastFeed": "Недопустимый подкаст: Нет ленты", "MessageNoPodcastsFound": "Подкасты не найдены", "MessageNoResults": "Нет результатов", "MessageNoSearchResultsFor": "Нет результатов поиска для \"{0}\"", @@ -864,20 +864,20 @@ "MessageNoUserPlaylists": "У вас нет плейлистов", "MessageNoUserPlaylistsHelp": "Списки воспроизведения являются конфиденциальными. Только пользователь, который их создает, может их видеть.", "MessageNotYetImplemented": "Пока не реализовано", - "MessageOpmlPreviewNote": "Примечание: Это предварительный просмотр разобранного файла OPML. Фактическое название подкаста будет взято из RSS-канала.", + "MessageOpmlPreviewNote": "Примечание: Это предварительный просмотр разобранного файла OPML. Фактическое название подкаста будет взято из RSS-ленты.", "MessageOr": "или", "MessagePauseChapter": "Пауза воспроизведения главы", "MessagePlayChapter": "Прослушать начало главы", "MessagePlaylistCreateFromCollection": "Создать плейлист из коллекции", "MessagePleaseWait": "Пожалуйста подождите...", - "MessagePodcastHasNoRSSFeedForMatching": "Подкаст не имеет URL-адреса RSS-канала, который можно использовать для поиска", - "MessagePodcastSearchField": "Введите поисковый запрос или URL-адрес RSS-канала", + "MessagePodcastHasNoRSSFeedForMatching": "Подкаст не имеет URL-адреса RSS-ленты, который можно использовать для поиска", + "MessagePodcastSearchField": "Введите поисковый запрос или URL-адрес RSS-ленты", "MessageQuickEmbedInProgress": "Быстрое внедрение в процессе выполнения", "MessageQuickEmbedQueue": "Поставлен в очередь для быстрого внедрения ({0} в очереди)", - "MessageQuickMatchAllEpisodes": "Быстрое сопоставление всех эпизодов", + "MessageQuickMatchAllEpisodes": "Быстрое сопоставление всех выпусков", "MessageQuickMatchDescription": "Заполняет пустые детали элемента и обложку первым результатом поиска из «{0}». Не перезаписывает сведения, если не включен параметр сервера 'Предпочитать метаданные поиска'.", "MessageRemoveChapter": "Удалить главу", - "MessageRemoveEpisodes": "Удалить {0} эпизод(ов)", + "MessageRemoveEpisodes": "Удалить {0} выпуск(ов)", "MessageRemoveFromPlayerQueue": "Удалить из очереди воспроизведения", "MessageRemoveUserWarning": "Вы уверены, что хотите навсегда удалить пользователя \"{0}\"?", "MessageReportBugsAndContribute": "Сообщайте об ошибках, запрашивайте функции и вносите свой вклад на", @@ -897,7 +897,7 @@ "MessageStartPlaybackAtTime": "Начать воспроизведение для \"{0}\" с {1}?", "MessageTaskAudioFileNotWritable": "Аудиофайл \"{0}\" недоступен для записи", "MessageTaskCanceledByUser": "Задание отменено пользователем", - "MessageTaskDownloadingEpisodeDescription": "Загрузка эпизода \"{0}\"", + "MessageTaskDownloadingEpisodeDescription": "Скачивание выпуска «{0}»", "MessageTaskEmbeddingMetadata": "Внедрение метаданных", "MessageTaskEmbeddingMetadataDescription": "Встраивание метаданных в аудиокнигу \"{0}\"", "MessageTaskEncodingM4b": "Кодировка M4B", @@ -912,9 +912,9 @@ "MessageTaskMatchingBooksInLibrary": "Сопоставление книг в библиотеке \"{0}\"", "MessageTaskNoFilesToScan": "Нет файлов для сканирования", "MessageTaskOpmlImport": "Импорт OPML", - "MessageTaskOpmlImportDescription": "Создание подкастов из {0} RSS-каналов", + "MessageTaskOpmlImportDescription": "Создание подкастов из {0} RSS-ленты", "MessageTaskOpmlImportFeed": "Канал импорта OPML", - "MessageTaskOpmlImportFeedDescription": "Импорт RSS-канала \"{0}\"", + "MessageTaskOpmlImportFeedDescription": "Импорт RSS-ленты «{0}»", "MessageTaskOpmlImportFeedFailed": "Не удалось получить ленту подкаста", "MessageTaskOpmlImportFeedPodcastDescription": "Создание подкаста \"{0}\"", "MessageTaskOpmlImportFeedPodcastExists": "Подкаст уже существует по адресу", @@ -922,7 +922,7 @@ "MessageTaskOpmlImportFinished": "Добавлено {0} подкастов", "MessageTaskOpmlParseFailed": "Не удалось разобрать OPML-файл", "MessageTaskOpmlParseFastFail": "Недопустимый тег файла OPML не найден ИЛИ тег не найден", - "MessageTaskOpmlParseNoneFound": "В OPML-файле не найдено ни одного канала", + "MessageTaskOpmlParseNoneFound": "В OPML-файле не найдено ни одной ленты", "MessageTaskScanItemsAdded": "{0} добавлено", "MessageTaskScanItemsMissing": "{0} отсутствует", "MessageTaskScanItemsUpdated": "{0} обновлено", @@ -942,23 +942,23 @@ "NoteChangeRootPassword": "Пользователь root — единственный пользователь, который может иметь пустой пароль", "NoteChapterEditorTimes": "Примечание: Время начала первой главы должно оставаться в 0:00, а время начала последней главы не может превышать продолжительность этой аудиокниги.", "NoteFolderPicker": "Примечание: папки, уже сопоставленные, не будут отображаться", - "NoteRSSFeedPodcastAppsHttps": "Предупреждение: Большинству приложений подкастов потребуется, чтобы URL-адрес RSS-канала использовал HTTPS", - "NoteRSSFeedPodcastAppsPubDate": "Предупреждение: 1 или более эпизодов не имеют даты публикации. Некоторые приложения для подкастов требуют этого.", + "NoteRSSFeedPodcastAppsHttps": "Предупреждение: Большинству приложений подкастов потребуется, чтобы URL-адрес RSS-ленты использовал HTTPS", + "NoteRSSFeedPodcastAppsPubDate": "Предупреждение: 1 или более выпусков не имеют даты публикации. Некоторые приложения для подкастов требуют этого.", "NoteUploaderFoldersWithMediaFiles": "Папки с медиафайлами будут обрабатываться как отдельные элементы библиотеки.", "NoteUploaderOnlyAudioFiles": "Если загружать только аудиофайлы, то каждый аудиофайл будет обрабатываться как отдельная аудиокнига.", "NoteUploaderUnsupportedFiles": "Неподдерживаемые файлы игнорируются. При выборе или удалении папки другие файлы, не находящиеся в папке элемента, игнорируются.", "NotificationOnBackupCompletedDescription": "Запускается при завершении резервного копирования", "NotificationOnBackupFailedDescription": "Срабатывает при сбое резервного копирования", - "NotificationOnEpisodeDownloadedDescription": "Запускается при автоматической загрузке эпизода подкаста", - "NotificationOnRSSFeedDisabledDescription": "Срабатывает, когда автоматическая загрузка эпизодов отключена из-за слишком большого количества неудачных попыток", - "NotificationOnRSSFeedFailedDescription": "Срабатывает при сбое запроса RSS-канала на автоматическую загрузку эпизода", + "NotificationOnEpisodeDownloadedDescription": "Запускается при автоматической скачивании выпуска подкаста", + "NotificationOnRSSFeedDisabledDescription": "Срабатывает, когда автоматическая скачка выпусков отключена из-за слишком большого количества неудачных попыток", + "NotificationOnRSSFeedFailedDescription": "Срабатывает при сбое запроса RSS-ленты на автоматическую скачивание выпуска", "NotificationOnTestDescription": "Событие для тестирования системы оповещения", - "PlaceholderBulkChapterInput": "Введите название главы или используйте нумерацию (например, \"Эпизод 1\", \"Глава 10\", \"1.\")", + "PlaceholderBulkChapterInput": "Введите название главы или используйте нумерацию (например, «Выпуск 1», «Глава 10», «1.»)", "PlaceholderNewCollection": "Новое имя коллекции", "PlaceholderNewFolderPath": "Путь к новой папке", "PlaceholderNewPlaylist": "Новое название плейлиста", "PlaceholderSearch": "Поиск...", - "PlaceholderSearchEpisode": "Поиск эпизода...", + "PlaceholderSearchEpisode": "Поиск выпуска...", "StatsAuthorsAdded": "авторов добавлено", "StatsBooksAdded": "книг добавлено", "StatsBooksAdditional": "Некоторые дополнения включают в себя…", @@ -1034,8 +1034,8 @@ "ToastEncodeCancelFailed": "Не удалось отменить кодирование", "ToastEncodeCancelSucces": "Кодирование отменено", "ToastEpisodeDownloadQueueClearFailed": "Не удалось очистить очередь", - "ToastEpisodeDownloadQueueClearSuccess": "Очередь загрузки эпизода очищена", - "ToastEpisodeUpdateSuccess": "{0 эпизодов обновлено", + "ToastEpisodeDownloadQueueClearSuccess": "Очищена очередь скачивания выпусков", + "ToastEpisodeUpdateSuccess": "{0} выпусков обновлено", "ToastErrorCannotShare": "Невозможно предоставить общий доступ на этом устройстве", "ToastFailedToCreate": "Не удалось создать", "ToastFailedToDelete": "Не удалось удалить", @@ -1044,7 +1044,7 @@ "ToastFailedToShare": "Не удалось поделиться", "ToastFailedToUpdate": "Не удалось обновить", "ToastInvalidImageUrl": "Неверный URL изображения", - "ToastInvalidMaxEpisodesToDownload": "Недопустимое максимальное количество загружаемых эпизодов", + "ToastInvalidMaxEpisodesToDownload": "Недопустимое максимальное количество скачиваемых выпусков", "ToastInvalidUrl": "Неверный URL", "ToastInvalidUrls": "Один или несколько URL неверны", "ToastItemCoverUpdateSuccess": "Обложка элемента обновлена", @@ -1072,15 +1072,15 @@ "ToastNameEmailRequired": "Имя и адрес электронной почты обязательны", "ToastNameRequired": "Имя обязательно для заполнения", "ToastNewApiKeyUserError": "Необходимо выбрать пользователя", - "ToastNewEpisodesFound": "{0} новых эпизодов найдено", + "ToastNewEpisodesFound": "Найдено {0} новых выпусков", "ToastNewUserCreatedFailed": "Не удалось создать учетную запись: \"{0}\"", "ToastNewUserCreatedSuccess": "Новая учетная запись создана", "ToastNewUserLibraryError": "Необходимо выбрать хотя бы одну библиотеку", "ToastNewUserPasswordError": "Должен иметь пароль, только пользователь root может иметь пустой пароль", "ToastNewUserTagError": "Необходимо выбрать хотя бы один тег", "ToastNewUserUsernameError": "Введите имя пользователя", - "ToastNoNewEpisodesFound": "Новых эпизодов не найдено", - "ToastNoRSSFeed": "У подкаста нет RSS-канала", + "ToastNoNewEpisodesFound": "Новых выпусков нету", + "ToastNoRSSFeed": "У подкаста нет RSS-ленты", "ToastNoUpdatesNecessary": "Обновления не требуются", "ToastNotificationCreateFailed": "Не удалось создать уведомление", "ToastNotificationDeleteFailed": "Не удалось удалить уведомление", @@ -1096,16 +1096,17 @@ "ToastPlaylistUpdateSuccess": "Плейлист обновлен", "ToastPodcastCreateFailed": "Не удалось создать подкаст", "ToastPodcastCreateSuccess": "Подкаст успешно создан", + "ToastPodcastEpisodeUpdated": "Выпуск обновлён", "ToastPodcastGetFeedFailed": "Не удалось получить ленту подкастов", - "ToastPodcastNoEpisodesInFeed": "В RSS-ленте эпизодов не найдено", - "ToastPodcastNoRssFeed": "В подкасте нет RSS-канала", + "ToastPodcastNoEpisodesInFeed": "В RSS-ленте выпусков не найдено", + "ToastPodcastNoRssFeed": "В подкасте нет RSS-ленты", "ToastProgressIsNotBeingSynced": "Прогресс не синхронизируется, перезапустите воспроизведение", "ToastProviderCreatedFailed": "Не удалось добавить провайдера", "ToastProviderCreatedSuccess": "Добавлен новый провайдер", "ToastProviderNameAndUrlRequired": "Имя и URL обязательные", "ToastProviderRemoveSuccess": "Провайдер удален", - "ToastRSSFeedCloseFailed": "Не удалось закрыть RSS-канал", - "ToastRSSFeedCloseSuccess": "RSS-канал закрыт", + "ToastRSSFeedCloseFailed": "Не удалось закрыть RSS-ленту", + "ToastRSSFeedCloseSuccess": "RSS-лента закрыта", "ToastRemoveFailed": "Не удалось удалить", "ToastRemoveItemFromCollectionFailed": "Не удалось удалить элемент из коллекции", "ToastRemoveItemFromCollectionSuccess": "Элемент удален из коллекции", From 7779fd297222d67c0dde547a05ae80f0f7402c25 Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Fri, 22 Aug 2025 07:29:27 +0200 Subject: [PATCH 045/217] Translated using Weblate (Swedish) Currently translated at 96.8% (1121 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index c4ed24ef..a78d8b14 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -301,7 +301,7 @@ "LabelCoverProvider": "Källa för omslag", "LabelCreatedAt": "Skapad", "LabelCronExpression": "Schemaläggning med hjälp av Cron (Cron Expression)", - "LabelCurrent": "Nuvarande plats", + "LabelCurrent": "Nuvarande omslag", "LabelCurrently": "För närvarande:", "LabelCustomCronExpression": "Anpassat Cron-uttryck:", "LabelDatetime": "Datum och klockslag", @@ -469,7 +469,7 @@ "LabelName": "Namn", "LabelNarrator": "Uppläsare", "LabelNarrators": "Uppläsare", - "LabelNew": "Ny plats", + "LabelNew": "Nytt omslag", "LabelNewPassword": "Nytt lösenord", "LabelNewestAuthors": "Senaste författarna", "LabelNewestEpisodes": "Senaste avsnitten", From 86bddba5c35173249bdfefc228a001446f75ede5 Mon Sep 17 00:00:00 2001 From: thehijacker Date: Thu, 21 Aug 2025 18:11:38 +0200 Subject: [PATCH 046/217] Translated using Weblate (Slovenian) Currently translated at 100.0% (1157 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/ --- client/strings/sl.json | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/client/strings/sl.json b/client/strings/sl.json index 42c861bd..0047ac3a 100644 --- a/client/strings/sl.json +++ b/client/strings/sl.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Orodja za upravljanje datotek zvočnih knjig", "HeaderAuthentication": "Avtentikacija", "HeaderBackups": "Varnostne kopije", + "HeaderBulkChapterModal": "Dodaj več poglavij", "HeaderChangePassword": "Zamenjaj geslo", "HeaderChapters": "Poglavja", "HeaderChooseAFolder": "Izberite mapo", @@ -199,6 +200,7 @@ "HeaderSettingsExperimental": "Eksperimentalne funkcije", "HeaderSettingsGeneral": "Splošno", "HeaderSettingsScanner": "Pregledovalnik", + "HeaderSettingsSecurity": "Varnost", "HeaderSettingsWebClient": "Spletni odjemalec", "HeaderSleepTimer": "Časovnik za izklop", "HeaderStatsLargestItems": "Največji elementi", @@ -293,6 +295,7 @@ "LabelContinueListening": "Nadaljuj poslušanje", "LabelContinueReading": "Nadaljuj branje", "LabelContinueSeries": "Nadaljuj s serijo", + "LabelCorsAllowed": "Dovoljeni CORS viri", "LabelCover": "Naslovnica", "LabelCoverImageURL": "URL naslovne slike", "LabelCoverProvider": "Ponudnik naslovnic", @@ -306,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Izbriši iz datotečnega sistema (počisti polje, če želiš odstraniti samo iz zbirke podatkov)", "LabelDescription": "Opis", "LabelDeselectAll": "Odznači vse", + "LabelDetectedPattern": "Zaznan vzorec:", "LabelDevice": "Naprava", "LabelDeviceInfo": "Podatki o napravi", "LabelDeviceIsAvailableTo": "Naprava je na voljo za...", @@ -470,6 +474,7 @@ "LabelNewestAuthors": "Najnovejši avtorji", "LabelNewestEpisodes": "Najnovejše epizode", "LabelNextBackupDate": "Naslednji datum varnostnega kopiranja", + "LabelNextChapters": "Naslednja poglavja bodo:", "LabelNextScheduledRun": "Naslednji načrtovani zagon", "LabelNoApiKeys": "Ni API ključev", "LabelNoCustomMetadataProviders": "Ni ponudnikov metapodatkov po meri", @@ -487,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Največja velikost čakalne vrste za dogodke obvestil", "LabelNotificationsMaxQueueSizeHelp": "Dogodki so omejeni na sprožitev 1 na sekundo. Dogodki bodo prezrti, če je čakalna vrsta najvišja. To preprečuje neželeno pošiljanje obvestil.", "LabelNumberOfBooks": "Število knjig", + "LabelNumberOfChapters": "Število poglavij:", "LabelNumberOfEpisodes": "# epizod", "LabelOpenIDAdvancedPermsClaimDescription": "Ime zahtevka OpenID, ki vsebuje napredna dovoljenja za uporabniška dejanja v aplikaciji, ki bodo veljala za neskrbniške vloge (če je konfigurirano). Če trditev manjka v odgovoru, bo dostop do ABS zavrnjen. Če ena možnost manjka, bo obravnavana kot false. Zagotovite, da se zahtevek ponudnika identitete ujema s pričakovano strukturo:", "LabelOpenIDClaims": "Pustite naslednje možnosti prazne, da onemogočite napredno dodeljevanje skupin in dovoljenj, nato pa samodejno dodelite skupino 'Uporabnik'.", @@ -743,6 +749,7 @@ "MessageBookshelfNoResultsForFilter": "Ni rezultatov za filter \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Ni rezultatov za poizvedbo", "MessageBookshelfNoSeries": "Nimate serij", + "MessageBulkChapterPattern": "Koliko poglavij želite dodati s tem vzorcem oštevilčenja?", "MessageChapterEndIsAfter": "Konec poglavja je po koncu zvočne knjige", "MessageChapterErrorFirstNotZero": "Prvo poglavje se mora začeti pri 0", "MessageChapterErrorStartGteDuration": "Neveljaven začetni čas, mora biti krajši od trajanja zvočne knjige", @@ -805,6 +812,8 @@ "MessageFeedURLWillBe": "URL vira bo {0}", "MessageFetching": "Pridobivam...", "MessageForceReScanDescription": "bo znova pregledal vse datoteke kot pregled od začetka. Oznake ID3 zvočnih datotek, datoteke OPF in besedilne datoteke bodo pregledane kot nove.", + "MessageHeatmapListeningTimeTooltip": "{0} posluša na {1}", + "MessageHeatmapNoListeningSessions": "Ni sej poslušanj na {0}", "MessageImportantNotice": "Pomembno obvestilo!", "MessageInsertChapterBelow": "Spodaj vstavite poglavje", "MessageInvalidAsin": "Neveljaven ASIN", @@ -944,6 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "Sproži se, ko so samodejni prenosi epizod onemogočeni zaradi preveč neuspelih poskusov", "NotificationOnRSSFeedFailedDescription": "Sproži se, ko zahteva za vir RSS za samodejni prenos epizode ne uspe", "NotificationOnTestDescription": "Dogodek za testiranje sistema obveščanja", + "PlaceholderBulkChapterInput": "Vnesite naslov poglavja ali uporabite oštevilčenje (npr. 'Epizoda 1', 'Poglavje 10', '1.')", "PlaceholderNewCollection": "Novo ime zbirke", "PlaceholderNewFolderPath": "Pot nove mape", "PlaceholderNewPlaylist": "Novo ime seznama predvajanja", @@ -997,8 +1007,12 @@ "ToastBookmarkCreateFailed": "Zaznamka ni bilo mogoče ustvariti", "ToastBookmarkCreateSuccess": "Zaznamek dodan", "ToastBookmarkRemoveSuccess": "Zaznamek odstranjen", + "ToastBulkChapterInvalidCount": "Vnesite število med 1 in 150", "ToastCachePurgeFailed": "Čiščenje predpomnilnika ni uspelo", "ToastCachePurgeSuccess": "Predpomnilnik je bil uspešno očiščen", + "ToastChapterLocked": "Poglavje je zaklenjeno.", + "ToastChapterStartTimeAdjusted": "Začetni čas poglavja je bil prilagojen za {0} sekund", + "ToastChaptersAllLocked": "Vsa poglavja so zaklenjena. Odklenite nekatera poglavja, da premaknete njihove čase.", "ToastChaptersHaveErrors": "Poglavja imajo napake", "ToastChaptersInvalidShiftAmountLast": "Neveljavna vrednost zamika. Začetni čas zadnjega poglavja bi presegel trajanje te zvočne knjige.", "ToastChaptersInvalidShiftAmountStart": "Neveljavna vrednost zamika. Prvo poglavje bi imelo ničelno ali negativno dolžino in bi ga prepisalo drugo poglavje. Povečajte začetno trajanje drugega poglavja.", @@ -1032,6 +1046,7 @@ "ToastInvalidImageUrl": "Neveljaven URL slike", "ToastInvalidMaxEpisodesToDownload": "Neveljavno največje število epizod za prenos", "ToastInvalidUrl": "Neveljaven URL", + "ToastInvalidUrls": "Eden ali več URL-jev je neveljavnih", "ToastItemCoverUpdateSuccess": "Naslovnica elementa je bila posodobljena", "ToastItemDeletedFailed": "Elementa ni bilo mogoče izbrisati", "ToastItemDeletedSuccess": "Element je bil izbrisan", @@ -1081,6 +1096,7 @@ "ToastPlaylistUpdateSuccess": "Seznam predvajanja je bil posodobljen", "ToastPodcastCreateFailed": "Podcasta ni bilo mogoče ustvariti", "ToastPodcastCreateSuccess": "Podcast je bil uspešno ustvarjen", + "ToastPodcastEpisodeUpdated": "Epizoda je bila posodobljena", "ToastPodcastGetFeedFailed": "Vira podcasta ni bilo mogoče pridobiti", "ToastPodcastNoEpisodesInFeed": "V viru RSS ni bilo mogoče najti nobene epizode", "ToastPodcastNoRssFeed": "Podcast nima vira RSS", @@ -1131,5 +1147,13 @@ "ToastUserPasswordChangeSuccess": "Geslo je bilo uspešno spremenjeno", "ToastUserPasswordMismatch": "Gesli se ne ujemata", "ToastUserPasswordMustChange": "Novo geslo se ne sme ujemati s starim geslom", - "ToastUserRootRequireName": "Vnesti morate korensko uporabniško ime" + "ToastUserRootRequireName": "Vnesti morate korensko uporabniško ime", + "TooltipAddChapters": "Dodaj poglavje(-a)", + "TooltipAddOneSecond": "Dodaj 1 sekundo", + "TooltipAdjustChapterStart": "Kliknite za prilagoditev začetnega časa", + "TooltipLockAllChapters": "Zakleni vsa poglavja", + "TooltipLockChapter": "Zakleni poglavje (Shift+klik za obseg)", + "TooltipSubtractOneSecond": "Odštej 1 sekundo", + "TooltipUnlockAllChapters": "Odkleni vsa poglavja", + "TooltipUnlockChapter": "Odkleni poglavje (Shift+klik za obseg)" } From c66d652a53ee23ff79d0ebb6385606306322927c Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Sat, 23 Aug 2025 15:05:31 +0200 Subject: [PATCH 047/217] Translated using Weblate (Swedish) Currently translated at 97.3% (1126 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index a78d8b14..be9bbffb 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -459,7 +459,7 @@ "LabelMetadataProvider": "Källa för metadata", "LabelMinute": "Minut", "LabelMinutes": "Minuter", - "LabelMissing": "Saknar", + "LabelMissing": "Saknas", "LabelMissingEbook": "Saknar e-bok", "LabelMissingSupplementaryEbook": "Saknar kompletterande e-bok", "LabelMobileRedirectURIs": "Tillåtna mobila omdirigerings-URI:er", @@ -492,6 +492,7 @@ "LabelNotificationsMaxQueueSize": "Max köstorlek för aviseringsevenemang", "LabelNotificationsMaxQueueSizeHelp": "Evenemang är begränsade till att utlösa ett per sekund. Evenemang kommer att ignoreras om kön är full. Detta förhindrar aviseringsspam.", "LabelNumberOfBooks": "Antal böcker", + "LabelNumberOfChapters": "Antal kapitel:", "LabelNumberOfEpisodes": "# av Avsnitt", "LabelOpenIDAdvancedPermsClaimDescription": "Namn på OpenID-anspråket som innehåller avancerade behörigheter för användaråtgärder i applikationen, vilka gäller för icke-administratörsroller (om konfigurerat). Om anspråket saknas i svaret kommer åtkomst till ABS att nekas. Om ett enskilt alternativ saknas kommer det att behandlas som falskt. Se till att identitetsleverantörens anspråk matchar den förväntade strukturen:", "LabelOpenIDClaims": "Lämna följande alternativ tomma för att inaktivera avancerad grupp- och behörighetstilldelning, och tilldela då automatiskt gruppen 'Användare'.", @@ -915,7 +916,7 @@ "MessageTaskTargetDirectoryNotWritable": "Det är inte tillåtet att skriva i den angivna katalogen", "MessageThinking": "Tänker...", "MessageUploaderItemFailed": "Misslyckades med att ladda upp", - "MessageUploaderItemSuccess": "har blivit uppladdad!", + "MessageUploaderItemSuccess": "har blivit uppladdat!", "MessageUploading": "Laddar upp...", "MessageValidCronExpression": "Giltigt cron-uttryck", "MessageWatcherIsDisabledGlobally": "Automatisk bevakning av förändringar är inaktiverad under rubriken 'Inställningar'", @@ -979,7 +980,7 @@ "ToastBackupInvalidMaxSize": "Felaktig storlek på backup har angivits", "ToastBackupRestoreFailed": "Det gick inte att återställa säkerhetskopian", "ToastBackupUploadFailed": "Det gick inte att ladda upp säkerhetskopian", - "ToastBackupUploadSuccess": "Säkerhetskopian uppladdad", + "ToastBackupUploadSuccess": "Säkerhetskopian har laddats upp", "ToastBatchApplyDetailsToItemsSuccess": "Informationen har adderats till alla objekt", "ToastBatchQuickMatchStarted": "Snabbmatchning av {0} böcker har påbörjats!", "ToastBatchUpdateFailed": "Batchuppdateringen misslyckades", @@ -990,6 +991,7 @@ "ToastBulkChapterInvalidCount": "Ange ett nummer mellan 1 och 150", "ToastCachePurgeFailed": "Misslyckades med att rensa cachen", "ToastCachePurgeSuccess": "Rensning av cachen har genomförts", + "ToastChapterLocked": "Kapitlet är låst.", "ToastChapterStartTimeAdjusted": "Kapitlets starttid justerades med {0} sekunder", "ToastChaptersAllLocked": "Alla kapitel är låsta. Lås upp några av dem för att kunna ändra deras tider.", "ToastChaptersHaveErrors": "Kapitlen har fel", @@ -1022,8 +1024,9 @@ "ToastFailedToShare": "Misslyckades med att dela", "ToastFailedToUpdate": "Misslyckades med att uppdatera", "ToastInvalidImageUrl": "Felaktig URL-adress till omslagsbilden", - "ToastInvalidMaxEpisodesToDownload": "Ogiltigt maximalt antal avsnitt att ladda ner", + "ToastInvalidMaxEpisodesToDownload": "Felaktigt värde angivet för maximalt antal avsnitt att ladda ner", "ToastInvalidUrl": "Felaktig URL-adress", + "ToastInvalidUrls": "En eller flera URL-adresser är felaktig", "ToastItemCoverUpdateSuccess": "Objektets omslag har uppdaterats", "ToastItemDeletedFailed": "Misslyckades med att radera objektet", "ToastItemDeletedSuccess": "Objektet har raderats", @@ -1062,6 +1065,7 @@ "ToastNotificationDeleteFailed": "Misslyckades med att radera meddelandet", "ToastNotificationFailedMaximum": "Maximalt antal misslyckade försök måste vara större än eller lika med 0", "ToastNotificationSettingsUpdateSuccess": "Inställningarna för meddelanden har ändrats", + "ToastNotificationTestTriggerFailed": "Misslyckades med att skicka testmeddelandet", "ToastNotificationUpdateSuccess": "Meddelandet har uppdaterats", "ToastPlaylistCreateFailed": "Det gick inte att skapa spellistan", "ToastPlaylistCreateSuccess": "Spellistan skapad", @@ -1069,6 +1073,7 @@ "ToastPlaylistUpdateSuccess": "Spellistan har uppdaterats", "ToastPodcastCreateFailed": "Misslyckades med att skapa podcasten", "ToastPodcastCreateSuccess": "Podcasten skapades framgångsrikt", + "ToastPodcastEpisodeUpdated": "Avsnittet har uppdaterats", "ToastPodcastNoEpisodesInFeed": "Inga avsnitt finns i RSS-flödet", "ToastPodcastNoRssFeed": "Denna podcast har ingen RSS-flöde", "ToastProviderCreatedFailed": "Misslyckades med att addera en källa", From 77fc6bba1a32b465086dc34dc9c36eadc521b726 Mon Sep 17 00:00:00 2001 From: idojius86 Date: Sun, 24 Aug 2025 14:27:16 +0200 Subject: [PATCH 048/217] Translated using Weblate (Spanish) Currently translated at 97.1% (1124 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/es/ --- client/strings/es.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/strings/es.json b/client/strings/es.json index a7000640..53bfad69 100644 --- a/client/strings/es.json +++ b/client/strings/es.json @@ -1,5 +1,6 @@ { "ButtonAdd": "Añadir", + "ButtonAddApiKey": "Añadir clave API", "ButtonAddChapters": "Añadir capítulos", "ButtonAddDevice": "Añadir dispositivo", "ButtonAddLibrary": "Añadir biblioteca", @@ -20,6 +21,7 @@ "ButtonChooseAFolder": "Elegir una carpeta", "ButtonChooseFiles": "Elegir archivos", "ButtonClearFilter": "Quitar filtros", + "ButtonClose": "Cerrar", "ButtonCloseFeed": "Cerrar suministro", "ButtonCloseSession": "Cerrar la sesión abierta", "ButtonCollections": "Colecciones", @@ -119,6 +121,7 @@ "HeaderAccount": "Cuenta", "HeaderAddCustomMetadataProvider": "Añadir proveedor de metadatos personalizado", "HeaderAdvanced": "Avanzado", + "HeaderApiKeys": "Claves API", "HeaderAppriseNotificationSettings": "Configuración de notificaciones de Apprise", "HeaderAudioTracks": "Pistas de audio", "HeaderAudiobookTools": "Herramientas de Gestión de Archivos de Audiolibro", @@ -163,6 +166,7 @@ "HeaderMetadataOrderOfPrecedence": "Orden de precedencia de metadatos", "HeaderMetadataToEmbed": "Metadatos para Insertar", "HeaderNewAccount": "Cuenta nueva", + "HeaderNewApiKey": "Nueva clave API", "HeaderNewLibrary": "Biblioteca nueva", "HeaderNotificationCreate": "Crear notificación", "HeaderNotificationUpdate": "Notificación de actualización", @@ -196,6 +200,7 @@ "HeaderSettingsExperimental": "Funcionalidades experimentales", "HeaderSettingsGeneral": "Generales", "HeaderSettingsScanner": "Escáner", + "HeaderSettingsSecurity": "Seguridad", "HeaderSettingsWebClient": "Cliente web", "HeaderSleepTimer": "Temporizador de apagado", "HeaderStatsLargestItems": "Elementos más grandes", @@ -207,6 +212,7 @@ "HeaderTableOfContents": "Sumario", "HeaderTools": "Herramientas", "HeaderUpdateAccount": "Actualizar cuenta", + "HeaderUpdateApiKey": "Actualizar clave API", "HeaderUpdateAuthor": "Actualizar autor", "HeaderUpdateDetails": "Actualizar detalles", "HeaderUpdateLibrary": "Actualizar biblioteca", From 817f2f6915175d0cf2318f9eca255e71931513f1 Mon Sep 17 00:00:00 2001 From: Kabika82 Date: Sun, 24 Aug 2025 06:13:46 +0200 Subject: [PATCH 049/217] Translated using Weblate (Hungarian) Currently translated at 100.0% (1157 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/ --- client/strings/hu.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/strings/hu.json b/client/strings/hu.json index 8f8836ad..fc7fa8b7 100644 --- a/client/strings/hu.json +++ b/client/strings/hu.json @@ -812,6 +812,8 @@ "MessageFeedURLWillBe": "A hírcsatorna URL-je {0} lesz", "MessageFetching": "Lekérdezés...", "MessageForceReScanDescription": "minden fájlt újra szkennel, mint egy friss szkennelés. Az audiofájlok ID3 címkéi, OPF fájlok és szövegfájlok újként lesznek szkennelve.", + "MessageHeatmapListeningTimeTooltip": "{0} hallgatja ezen {1}", + "MessageHeatmapNoListeningSessions": "Nincs hallgatás folyamatban ezen: {0}", "MessageImportantNotice": "Fontos közlemény!", "MessageInsertChapterBelow": "Fejezet beszúrása alulra", "MessageInvalidAsin": "Érvénytelen ASIN", @@ -1094,6 +1096,7 @@ "ToastPlaylistUpdateSuccess": "Lejátszási lista frissítve", "ToastPodcastCreateFailed": "Podcast létrehozása sikertelen", "ToastPodcastCreateSuccess": "A podcast sikeresen létrehozva", + "ToastPodcastEpisodeUpdated": "Epizód frissítve", "ToastPodcastGetFeedFailed": "Nem sikerült podcast feedet kapni", "ToastPodcastNoEpisodesInFeed": "Nincsenek epizódok az RSS hírcsatornában", "ToastPodcastNoRssFeed": "A podcastnak nincs RSS-hírcsatornája", From 0dda4b6b274e0d5222266e6f90411ddcc4ca727b Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 24 Aug 2025 15:35:05 +0200 Subject: [PATCH 050/217] Added translation using Weblate (Basque) --- client/strings/eu.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 client/strings/eu.json diff --git a/client/strings/eu.json b/client/strings/eu.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/client/strings/eu.json @@ -0,0 +1 @@ +{} From b8999fbc37ee232455752e364c03b86e3e8d6191 Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Sun, 24 Aug 2025 20:18:40 +0200 Subject: [PATCH 051/217] Translated using Weblate (Swedish) Currently translated at 97.3% (1126 of 1157 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index be9bbffb..e3e373c0 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -370,9 +370,9 @@ "LabelFeedURL": "URL-adress för flödet", "LabelFetchingMetadata": "Hämtar metadata", "LabelFile": "Fil", - "LabelFileBirthtime": "Tidpunkt, fil skapad", + "LabelFileBirthtime": "Tidpunkt, adderad", "LabelFileBornDate": "Skapad {0}", - "LabelFileModified": "Tidpunkt, fil ändrad", + "LabelFileModified": "Tidpunkt, ändrad", "LabelFileModifiedDate": "Ändrad {0}", "LabelFilename": "Filnamn", "LabelFilterByUser": "Välj användare", @@ -687,10 +687,10 @@ "LabelTotalTimeListened": "Total tid lyssnad", "LabelTrackFromFilename": "Plats från filnamnet", "LabelTrackFromMetadata": "Plats från metadata", - "LabelTracks": "Spår", - "LabelTracksMultiTrack": "Flerspårigt", - "LabelTracksNone": "Inga spår", - "LabelTracksSingleTrack": "Enspårigt", + "LabelTracks": "Ljudspår", + "LabelTracksMultiTrack": "Flera ljudspår", + "LabelTracksNone": "Inga ljudspår", + "LabelTracksSingleTrack": "Ett ljudspår", "LabelTrailer": "Trailer", "LabelType": "Typ", "LabelUnabridged": "Oavkortad", @@ -882,7 +882,7 @@ "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}", - "MessageStartPlaybackAtTime": "Starta uppspelning av \"{0}\" vid tidpunkt {1}?", + "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}\"", From 58e43cc6a73a8f0554e43c7cce09d98cf732e18b Mon Sep 17 00:00:00 2001 From: laxandrea Date: Mon, 25 Aug 2025 15:13:12 +0200 Subject: [PATCH 052/217] Translated using Weblate (Italian) Currently translated at 99.6% (1157 of 1161 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, 8 insertions(+) diff --git a/client/strings/it.json b/client/strings/it.json index f5702bdc..a032a3c9 100644 --- a/client/strings/it.json +++ b/client/strings/it.json @@ -435,6 +435,7 @@ "LabelLibraryItem": "Elementi della biblioteca", "LabelLibraryName": "Nome della biblioteca", "LabelLibrarySortByProgress": "Aggiornamento dei progressi", + "LabelLibrarySortByProgressStarted": "Data di inizio", "LabelLimit": "Limiti", "LabelLineSpacing": "Interlinea", "LabelListenAgain": "Ascolta ancora", @@ -443,6 +444,7 @@ "LabelLogLevelWarn": "Allarme", "LabelLookForNewEpisodesAfterDate": "Cerca nuovi episodi dopo questa data", "LabelLowestPriority": "Priorità Minima", + "LabelMatchConfidence": "Fiducia", "LabelMatchExistingUsersBy": "Abbina gli utenti esistenti per", "LabelMatchExistingUsersByDescription": "Utilizzato per connettere gli utenti esistenti. Una volta connessi, gli utenti verranno abbinati a un ID univoco dal tuo provider SSO", "LabelMaxEpisodesToDownload": "Max # di episodi da scaricare. Usa 0 per illimitati.", @@ -810,6 +812,8 @@ "MessageFeedURLWillBe": "l’URL del flusso sarà {0}", "MessageFetching": "Recupero info…", "MessageForceReScanDescription": "eseguirà nuovamente la scansione di tutti i file come una nuova scansione. I tag ID3 dei file audio, i file OPF e i file di testo verranno scansionati come nuovi.", + "MessageHeatmapListeningTimeTooltip": "{0} in ascolto su {1}", + "MessageHeatmapNoListeningSessions": "Nessuna sessione di ascolto su {0}", "MessageImportantNotice": "Avviso Importante!", "MessageInsertChapterBelow": "Inserisci capitolo sotto", "MessageInvalidAsin": "ASIN non Valido", @@ -949,6 +953,7 @@ "NotificationOnRSSFeedDisabledDescription": "Attivato quando i download automatici degli episodi vengono disabilitati a causa di troppi tentativi falliti", "NotificationOnRSSFeedFailedDescription": "Attivato quando la richiesta del feed RSS per il download automatico di un episodio fallisce", "NotificationOnTestDescription": "test il sistema di notifica", + "PlaceholderBulkChapterInput": "Inserire il titolo del capitolo o utilizzate la numerazione (es. 'Episodio 1', 'Capitolo 10', '1.')", "PlaceholderNewCollection": "Nome Nuova Raccolta", "PlaceholderNewFolderPath": "Nuovo Percorso Cartella", "PlaceholderNewPlaylist": "Nome nuova playlist", @@ -1006,6 +1011,8 @@ "ToastCachePurgeFailed": "Impossibile eliminare la cache", "ToastCachePurgeSuccess": "Cache eliminata correttamente", "ToastChapterLocked": "Il capitolo è bloccato.", + "ToastChapterStartTimeAdjusted": "Tempo di inizio del capitolo modificato di {0} secondi", + "ToastChaptersAllLocked": "Tutti i capitoli sono bloccati. Sblocca alcuni capitoli per modificarne i tempi.", "ToastChaptersHaveErrors": "I capitoli contengono errori", "ToastChaptersInvalidShiftAmountLast": "Quantità di spostamento non valida. L'orario di inizio dell'ultimo capitolo si estenderebbe oltre la durata di questo audiolibro.", "ToastChaptersInvalidShiftAmountStart": "Quantità di spostamento non valida. Il primo capitolo avrebbe una lunghezza pari a zero o negativa e verrebbe sovrascritto dal secondo capitolo. Aumentare la durata iniziale del secondo capitolo.", @@ -1143,6 +1150,7 @@ "ToastUserRootRequireName": "È necessario immettere un nome utente root", "TooltipAddChapters": "Aggiungere capitolo/i", "TooltipAddOneSecond": "Aggiungere 1 secondo", + "TooltipAdjustChapterStart": "Clicca per modificare il tempo di inizio", "TooltipLockAllChapters": "Bloccare tutti i capitoli", "TooltipLockChapter": "Bloccare capitolo (Shift+click per intervallo)", "TooltipSubtractOneSecond": "Sottrarre 1 secondo", From 8dee1ec942ddf204588100f1f82938daf3e2178b Mon Sep 17 00:00:00 2001 From: Mathias Franco Date: Mon, 25 Aug 2025 09:33:53 +0200 Subject: [PATCH 053/217] Translated using Weblate (Dutch) Currently translated at 100.0% (1161 of 1161 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/ --- client/strings/nl.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/client/strings/nl.json b/client/strings/nl.json index 0dcd660e..708ea7a9 100644 --- a/client/strings/nl.json +++ b/client/strings/nl.json @@ -127,6 +127,7 @@ "HeaderAudiobookTools": "Audioboekbestandbeheer tools", "HeaderAuthentication": "Authenticatie", "HeaderBackups": "Back-ups", + "HeaderBulkChapterModal": "Meerdere hoofdstukken toevoegen", "HeaderChangePassword": "Wachtwoord wijzigen", "HeaderChapters": "Hoofdstukken", "HeaderChooseAFolder": "Map kiezen", @@ -308,6 +309,7 @@ "LabelDeleteFromFileSystemCheckbox": "Verwijderen uit bestandssysteem (uncheck om alleen uit database te verwijderen)", "LabelDescription": "Beschrijving", "LabelDeselectAll": "Deselecteer alle", + "LabelDetectedPattern": "Gedetecteerd patroon:", "LabelDevice": "Apparaat", "LabelDeviceInfo": "Apparaat info", "LabelDeviceIsAvailableTo": "Apparaat is beschikbaar voor...", @@ -376,6 +378,7 @@ "LabelFilterByUser": "Filter op gebruiker", "LabelFindEpisodes": "Zoek afleveringen", "LabelFinished": "Voltooid", + "LabelFinishedDate": "Voltooid {0}", "LabelFolder": "Map", "LabelFolders": "Mappen", "LabelFontBold": "Vetgedrukt", @@ -434,6 +437,8 @@ "LabelLibraryItem": "Bibliotheekonderdeel", "LabelLibraryName": "Bibliotheeknaam", "LabelLibrarySortByProgress": "Voortuigang geüpdatet", + "LabelLibrarySortByProgressFinished": "Datum voltooid", + "LabelLibrarySortByProgressStarted": "Datum gestart", "LabelLimit": "Limiet", "LabelLineSpacing": "Regelruimte", "LabelListenAgain": "Opnieuw Beluisteren", @@ -472,6 +477,7 @@ "LabelNewestAuthors": "Nieuwste Auteurs", "LabelNewestEpisodes": "Nieuwste Afleveringen", "LabelNextBackupDate": "Volgende back-up datum", + "LabelNextChapters": "Volgende hoofdstukken zijn:", "LabelNextScheduledRun": "Volgende geplande run", "LabelNoApiKeys": "Geen API keys", "LabelNoCustomMetadataProviders": "Geen custom metadata bronnen", @@ -489,6 +495,7 @@ "LabelNotificationsMaxQueueSize": "Max rijgrootte voor notificatie gebeurtenissen", "LabelNotificationsMaxQueueSizeHelp": "Gebeurtenissen zijn beperkt tot 1 aftrap per seconde. Gebeurtenissen zullen genegeerd worden als de rij aan de maximale grootte zit. Dit voorkomt notificatie-spamming.", "LabelNumberOfBooks": "Aantal Boeken", + "LabelNumberOfChapters": "Aantal hoofdstukken:", "LabelNumberOfEpisodes": "# Afleveringen", "LabelOpenIDAdvancedPermsClaimDescription": "Naam van de OpenID-claim die geavanceerde machtigingen bevat voor gebruikersacties binnen de applicatie die van toepassing zijn op niet-beheerdersrollen (indien geconfigureerd). Als de claim ontbreekt in het antwoord, wordt toegang tot ABS geweigerd. Als er één optie ontbreekt, wordt deze behandeld als false. Zorg ervoor dat de claim van de identiteitsprovider overeenkomt met de verwachte structuur:", "LabelOpenIDClaims": "Laat de volgende opties leeg om geavanceerde groeps- en machtigingstoewijzing uit te schakelen en de groep 'Gebruiker' automatisch toe te wijzen.", @@ -631,6 +638,7 @@ "LabelStartTime": "Starttijd", "LabelStarted": "Gestart", "LabelStartedAt": "Gestart op", + "LabelStartedDate": "Gestart {0}", "LabelStatsAudioTracks": "Audiotracks", "LabelStatsAuthors": "Auteurs", "LabelStatsBestDay": "Beste dag", @@ -745,6 +753,7 @@ "MessageBookshelfNoResultsForFilter": "Geen resultaten voor filter \"{0}: {1}\"", "MessageBookshelfNoResultsForQuery": "Geen resultaten voor query", "MessageBookshelfNoSeries": "Je hebt geen series", + "MessageBulkChapterPattern": "Hoeveel hoofdstukken wilt u met dit nummeringspatroon toevoegen?", "MessageChapterEndIsAfter": "Hoofdstukeinde is na het einde van je audioboek", "MessageChapterErrorFirstNotZero": "Eerste hoofdstuk moet starten op 0", "MessageChapterErrorStartGteDuration": "Ongeldig: starttijd moet kleiner zijn dan duur van audioboek", @@ -948,6 +957,7 @@ "NotificationOnRSSFeedDisabledDescription": "Wordt geactiveerd wanneer automatische afleveringsdownloads zijn uitgeschakeld vanwege te veel mislukte pogingen", "NotificationOnRSSFeedFailedDescription": "Getriggerd wanneer de RSS feed aanvraag faalt voor een automatische aflevering download", "NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem", + "PlaceholderBulkChapterInput": "Voer een hoofdstuktitel in of gebruik nummering (bijv. 'Aflevering 1', 'Hoofdstuk 10', '1.')", "PlaceholderNewCollection": "Nieuwe naam collectie", "PlaceholderNewFolderPath": "Nieuwe locatie map", "PlaceholderNewPlaylist": "Nieuwe naam afspeellijst", @@ -1001,8 +1011,12 @@ "ToastBookmarkCreateFailed": "Aanmaken boekwijzer mislukt", "ToastBookmarkCreateSuccess": "boekwijzer toegevoegd", "ToastBookmarkRemoveSuccess": "Boekwijzer verwijderd", + "ToastBulkChapterInvalidCount": "Voer een nummer in tussen 1 en 150", "ToastCachePurgeFailed": "Cache wissen is mislukt", "ToastCachePurgeSuccess": "Cache succesvol verwijderd", + "ToastChapterLocked": "Hoofdstuk is vergrendeld.", + "ToastChapterStartTimeAdjusted": "Hoofdstukstarttijd aangepast met {0} seconden", + "ToastChaptersAllLocked": "Alle hoofdstukken zijn vergrendeld. Ontgrendel sommige hoofdstukken om hun tijd te verschuiven.", "ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten", "ToastChaptersInvalidShiftAmountLast": "Ongeldige shift-tijd. De starttijd van het laatste hoofdstuk zou langer zijn dan de duur van dit audioboek.", "ToastChaptersInvalidShiftAmountStart": "Ongeldige shift-lengte. Het eerste hoofdstuk zou nul of een negatieve lengte hebben en zou worden overschreven door het tweede hoofdstuk. Verleng de startduur van het tweede hoofdstuk.", @@ -1086,6 +1100,7 @@ "ToastPlaylistUpdateSuccess": "Afspeellijst bijgewerkt", "ToastPodcastCreateFailed": "Podcast aanmaken mislukt", "ToastPodcastCreateSuccess": "Podcast aangemaakt", + "ToastPodcastEpisodeUpdated": "Aflevering bijgewerkt", "ToastPodcastGetFeedFailed": "Podcast feed ophalen mislukt", "ToastPodcastNoEpisodesInFeed": "Geen afleveringen gevonden in RSS feed", "ToastPodcastNoRssFeed": "Podcast heeft geen RSS feed", @@ -1136,5 +1151,13 @@ "ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd", "ToastUserPasswordMismatch": "Wachtwoorden komen niet overeen", "ToastUserPasswordMustChange": "Het nieuwe wachtwoord kan niet overeenkomen met het oude wachtwoord", - "ToastUserRootRequireName": "U moet een root-gebruikersnaam invoeren" + "ToastUserRootRequireName": "U moet een root-gebruikersnaam invoeren", + "TooltipAddChapters": "Hoofdstuk(ken) toevoegen", + "TooltipAddOneSecond": "1 seconde toevoegen", + "TooltipAdjustChapterStart": "Klik om de starttijd aan te passen", + "TooltipLockAllChapters": "Alle hoofdstukken vergrendelen", + "TooltipLockChapter": "Hoofdstuk vergrendelen (Shift+klikken voor bereik)", + "TooltipSubtractOneSecond": "Trek 1 seconde af", + "TooltipUnlockAllChapters": "Alle hoofdstukken ontgrendelen", + "TooltipUnlockChapter": "Hoofdstuk ontgrendelen (Shift+klikken voor bereik)" } From f9a623904913459249371997f856f0a1572d6b7b Mon Sep 17 00:00:00 2001 From: Yurt Page Date: Mon, 25 Aug 2025 22:22:35 +0200 Subject: [PATCH 054/217] Translated using Weblate (Russian) Currently translated at 100.0% (1161 of 1161 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/ --- client/strings/ru.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/strings/ru.json b/client/strings/ru.json index 7c7254a5..4dd99fd4 100644 --- a/client/strings/ru.json +++ b/client/strings/ru.json @@ -378,6 +378,7 @@ "LabelFilterByUser": "Фильтр по пользователю", "LabelFindEpisodes": "Найти выпуски", "LabelFinished": "Закончен", + "LabelFinishedDate": "Завершено {0}", "LabelFolder": "Папка", "LabelFolders": "Папки", "LabelFontBold": "Жирный", @@ -436,6 +437,8 @@ "LabelLibraryItem": "Элемент библиотеки", "LabelLibraryName": "Имя библиотеки", "LabelLibrarySortByProgress": "Прогресс обновлён", + "LabelLibrarySortByProgressFinished": "Дата завершения", + "LabelLibrarySortByProgressStarted": "Дата начала", "LabelLimit": "Лимит", "LabelLineSpacing": "Межстрочный интервал", "LabelListenAgain": "Послушать снова", @@ -635,6 +638,7 @@ "LabelStartTime": "Время начала", "LabelStarted": "Начат", "LabelStartedAt": "Начато В", + "LabelStartedDate": "Начато {0}", "LabelStatsAudioTracks": "Аудио треки", "LabelStatsAuthors": "Авторы", "LabelStatsBestDay": "Лучший День", From 32adb1bafdf7edef5ba0f3ed002447776c43b9d9 Mon Sep 17 00:00:00 2001 From: Jan-Eric Myhrgren Date: Mon, 25 Aug 2025 07:15:31 +0200 Subject: [PATCH 055/217] Translated using Weblate (Swedish) Currently translated at 97.5% (1132 of 1161 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/ --- client/strings/sv.json | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/client/strings/sv.json b/client/strings/sv.json index e3e373c0..45917401 100644 --- a/client/strings/sv.json +++ b/client/strings/sv.json @@ -106,7 +106,7 @@ "ButtonStats": "Statistik", "ButtonSubmit": "Skicka", "ButtonTest": "Testa", - "ButtonUnlinkOpenId": "Koppla från OpenID", + "ButtonUnlinkOpenId": "Koppla ifrån OpenID", "ButtonUpload": "Ladda upp", "ButtonUploadBackup": "Läs in säkerhetskopia", "ButtonUploadCover": "Ladda upp omslag", @@ -244,7 +244,7 @@ "LabelAlreadyInYourLibrary": "Finns redan i samlingen", "LabelApiKeyCreated": "API-nyckel \"{0}\" har adderats.", "LabelApiKeyCreatedDescription": "Se till att kopiera API-nyckeln omedelbart eftersom du inte kommer att kunna se den igen.", - "LabelApiKeyUser": "Agera på uppdrag av användare", + "LabelApiKeyUser": "Utför på uppdrag av användare", "LabelApiKeyUserDescription": "Denna API-nyckel kommer att ha samma behörigheter som användaren den agerar på uppdrag av. Detta kommer att visas på samma sätt i loggarna som om användaren gjorde begäran.", "LabelApiToken": "API-token", "LabelAppend": "Lägg till", @@ -378,6 +378,7 @@ "LabelFilterByUser": "Välj användare", "LabelFindEpisodes": "Sök avsnitt", "LabelFinished": "Avslutad", + "LabelFinishedDate": "Avslutad {0}", "LabelFolder": "Mapp", "LabelFolders": "Mappar", "LabelFontBold": "Fetstil", @@ -436,6 +437,8 @@ "LabelLibraryItem": "Objekt", "LabelLibraryName": "Biblioteksnamn", "LabelLibrarySortByProgress": "Framsteg uppdaterat", + "LabelLibrarySortByProgressFinished": "Avslutsdag", + "LabelLibrarySortByProgressStarted": "Startdag", "LabelLimit": "Begränsning", "LabelLineSpacing": "Radavstånd", "LabelListenAgain": "Lyssna igen", @@ -446,7 +449,7 @@ "LabelLowestPriority": "Lägst prioritet", "LabelMatchConfidence": "Förtroende", "LabelMatchExistingUsersBy": "Matcha befintliga användare med", - "LabelMatchExistingUsersByDescription": "Används för att koppla existerande användare. När kopplingen sker kommer användaren att matchas med ett unikt ID från SSO-leverantören.", + "LabelMatchExistingUsersByDescription": "Används för att ansluta befintlig användare. När anslutningen sker kommer användaren att matchas med ett unikt ID från SSO-leverantören.", "LabelMaxEpisodesToDownload": "Maximalt antal avsnitt att ladda ner (0 = obegränsat).", "LabelMaxEpisodesToDownloadPerCheck": "Maximalt antal nya avsnitt att ladda ner per tillfälle", "LabelMaxEpisodesToKeep": "Maximalt antal avsnitt att behålla", @@ -635,6 +638,7 @@ "LabelStartTime": "Starttid", "LabelStarted": "Startad", "LabelStartedAt": "Startades", + "LabelStartedDate": "Påbörjad {0}", "LabelStatsAudioTracks": "Ljudfiler", "LabelStatsAuthors": "Författare", "LabelStatsBestDay": "Bästa dag", @@ -731,6 +735,7 @@ "LabelYourProgress": "Framsteg", "MessageAddToPlayerQueue": "Lägg till i spellistan", "MessageAppriseDescription": "För att använda den här funktionen behöver du ha en instans av Apprise API startad eller ett API som hanterar dessa förfrågningar.
URL-adressen till Apprise API bör vara hela sökvägen för att skicka meddelandet, t.ex., om din API-instans är tillgänglig på http://192.168.1.1:8337, bör du ange http://192.168.1.1:8337/notify.", + "MessageAsinCheck": "Säkerställ att du använder ASIN-kod för rätt region/område.", "MessageAuthenticationLegacyTokenWarning": "Legacy API-koder kommer att raderas i framtiden. Använd denna istället: API Keys.", "MessageAuthenticationOIDCChangesRestart": "Du måste starta om servern efter att du ändrat eller adderat OIDC (OpenID Connect).", "MessageAuthenticationSecurityMessage": "Identifieringen av användare har förbättrats av säkerhetsskäl. Alla användare måste därför logga in på nytt.", @@ -774,7 +779,7 @@ "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?", "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 föremål kommer katalogen /metadata/cache/items 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?", "MessageConfirmQuickMatchEpisodes": "Snabbmatchning av avsnitt kommer att ersätta befintlig information vid en träff. Endast omatchade avsnitt kommer att uppdateras. Vill du fortsätta?", "MessageConfirmReScanLibraryItems": "Är du säker på att du vill göra en ny skanning för {0} objekt?", @@ -809,7 +814,7 @@ "MessageInsertChapterBelow": "Infoga kapitel nedanför", "MessageInvalidAsin": "Felaktig ASIN-kod", "MessageItemsSelected": "{0} objekt markerade", - "MessageItemsUpdated": "{0} Objekt uppdaterade", + "MessageItemsUpdated": "{0} objekt uppdaterade", "MessageJoinUsOn": "Anslut dig till oss på", "MessageLoading": "Laddar...", "MessageLoadingFolders": "Laddar mappar...", @@ -1055,7 +1060,7 @@ "ToastNewUserCreatedFailed": "Misslyckades med att skapa kontot \"{0}\"", "ToastNewUserCreatedSuccess": "Ett nytt konto har skapats", "ToastNewUserLibraryError": "Minst ett bibliotek måste anges", - "ToastNewUserPasswordError": "Ett lösenord måste anges. Endast användaren 'root' kan vara utan lösenord.", + "ToastNewUserPasswordError": "Ett lösenord måste anges. Endast användaren 'root' tillåts sakna lösenord.", "ToastNewUserTagError": "Minst en tagg måste läggas till", "ToastNewUserUsernameError": "Ange ett användarnamn", "ToastNoNewEpisodesFound": "Inga nya avsnitt kunde hittas", From 7a94f014eaeefc26ecd205bd6b8d9b15670eec1a 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: Mon, 25 Aug 2025 05:12:15 +0200 Subject: [PATCH 056/217] Translated using Weblate (Ukrainian) Currently translated at 100.0% (1161 of 1161 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/ --- client/strings/uk.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/strings/uk.json b/client/strings/uk.json index 9e6ac9f4..6f2ed293 100644 --- a/client/strings/uk.json +++ b/client/strings/uk.json @@ -378,6 +378,7 @@ "LabelFilterByUser": "Фільтрувати за користувачем", "LabelFindEpisodes": "Знайти епізоди", "LabelFinished": "Завершено", + "LabelFinishedDate": "Завершено {0}", "LabelFolder": "Тека", "LabelFolders": "Теки", "LabelFontBold": "Жирний", @@ -436,6 +437,8 @@ "LabelLibraryItem": "Елемент бібліотеки", "LabelLibraryName": "Назва бібліотеки", "LabelLibrarySortByProgress": "Прогрес оновлено", + "LabelLibrarySortByProgressFinished": "Дата завершення", + "LabelLibrarySortByProgressStarted": "Дата початку", "LabelLimit": "Обмеження", "LabelLineSpacing": "Відстань між рядками", "LabelListenAgain": "Слухати знову", @@ -635,6 +638,7 @@ "LabelStartTime": "Час початку", "LabelStarted": "Стартував", "LabelStartedAt": "Почато з", + "LabelStartedDate": "Розпочато {0}", "LabelStatsAudioTracks": "Аудіодоріжки", "LabelStatsAuthors": "Автори", "LabelStatsBestDay": "Найкращий день", From 40babc9650cdc96e3e5c58d0ae8aadf2dbd60619 Mon Sep 17 00:00:00 2001 From: FiendFEARing Date: Mon, 25 Aug 2025 13:15:48 +0200 Subject: [PATCH 057/217] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1161 of 1161 strings) Translation: Audiobookshelf/Abs Web Client Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/ --- client/strings/zh-cn.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/strings/zh-cn.json b/client/strings/zh-cn.json index 42eee1ac..0cfc63d0 100644 --- a/client/strings/zh-cn.json +++ b/client/strings/zh-cn.json @@ -378,6 +378,7 @@ "LabelFilterByUser": "按用户筛选", "LabelFindEpisodes": "查找剧集", "LabelFinished": "已听完", + "LabelFinishedDate": "完成于 {0}", "LabelFolder": "文件夹", "LabelFolders": "文件夹", "LabelFontBold": "加粗", @@ -436,6 +437,8 @@ "LabelLibraryItem": "媒体库项目", "LabelLibraryName": "媒体库名称", "LabelLibrarySortByProgress": "进度更新时间", + "LabelLibrarySortByProgressFinished": "完成日期", + "LabelLibrarySortByProgressStarted": "开始日期", "LabelLimit": "限制", "LabelLineSpacing": "行间距", "LabelListenAgain": "再次收听", @@ -635,6 +638,7 @@ "LabelStartTime": "开始时间", "LabelStarted": "开始于", "LabelStartedAt": "收听始于", + "LabelStartedDate": "开始于 {0}", "LabelStatsAudioTracks": "音轨", "LabelStatsAuthors": "作者", "LabelStatsBestDay": "单日最高", From c7c21cc137e7d1b63c304270df4be4c53d2c4753 Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 25 Aug 2025 17:10:29 -0500 Subject: [PATCH 058/217] Version bump v2.29.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 bbcb5471..efc8e443 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf-client", - "version": "2.28.0", + "version": "2.29.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf-client", - "version": "2.28.0", + "version": "2.29.0", "license": "ISC", "dependencies": { "@nuxtjs/axios": "^5.13.6", diff --git a/client/package.json b/client/package.json index 2002252c..da046a67 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf-client", - "version": "2.28.0", + "version": "2.29.0", "buildNumber": 1, "description": "Self-hosted audiobook and podcast client", "main": "index.js", diff --git a/package-lock.json b/package-lock.json index 4c957682..99415bd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "audiobookshelf", - "version": "2.28.0", + "version": "2.29.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "audiobookshelf", - "version": "2.28.0", + "version": "2.29.0", "license": "GPL-3.0", "dependencies": { "axios": "^0.27.2", diff --git a/package.json b/package.json index 0d7ede59..34abc60e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audiobookshelf", - "version": "2.28.0", + "version": "2.29.0", "buildNumber": 1, "description": "Self-hosted audiobook and podcast server", "main": "index.js", From 50e2fe7fd22d03915a2c17ff5248b7ca1e245944 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sat, 30 Aug 2025 17:46:26 +0200 Subject: [PATCH 059/217] Fix http/https error --- server/auth/OidcAuthStrategy.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/auth/OidcAuthStrategy.js b/server/auth/OidcAuthStrategy.js index 0780b761..64ab8244 100644 --- a/server/auth/OidcAuthStrategy.js +++ b/server/auth/OidcAuthStrategy.js @@ -527,7 +527,16 @@ class OidcAuthStrategy { // For absolute URLs, ensure they point to the same origin const callbackUrlObj = new URL(callbackUrl) - const currentProtocol = req.secure || req.get('x-forwarded-proto') === 'https' ? 'https' : 'http' + // NPM appends both http and https in x-forwarded-proto sometimes, so we need to check for both + const xfp = (req.get('x-forwarded-proto') || '').toLowerCase() + const currentProtocol = + req.secure || + xfp + .split(',') + .map((s) => s.trim()) + .includes('https') + ? 'https' + : 'http' const currentHost = req.get('host') // Check if protocol and host match exactly From afab429c753f30c1fad394eb5e1c250cfb100372 Mon Sep 17 00:00:00 2001 From: Nicholas Wallace Date: Sat, 30 Aug 2025 10:01:25 -0700 Subject: [PATCH 060/217] Fix: ensure all keys are unique in MultiSelect --- client/components/ui/MultiSelect.vue | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/components/ui/MultiSelect.vue b/client/components/ui/MultiSelect.vue index bf0d1ec9..e33e74a4 100644 --- a/client/components/ui/MultiSelect.vue +++ b/client/components/ui/MultiSelect.vue @@ -4,10 +4,11 @@
-
+ +
- +
{{ item }}
@@ -259,8 +260,9 @@ export default { } this.focus() }, - removeItem(item) { - var remaining = this.selected.filter((i) => i !== item) + removeItem(item, idx) { + var remaining = this.selected.slice() + remaining.splice(idx, 1) this.$emit('input', remaining) this.$emit('removedItem', item) this.$nextTick(() => { From ba7160c30587cfd7da82a8dfdb9e026a0a785a2c Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 2 Sep 2025 17:31:48 -0500 Subject: [PATCH 061/217] Add index to removeItem on multiselect keydown --- client/components/ui/MultiSelect.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/components/ui/MultiSelect.vue b/client/components/ui/MultiSelect.vue index e33e74a4..c7572ba5 100644 --- a/client/components/ui/MultiSelect.vue +++ b/client/components/ui/MultiSelect.vue @@ -8,7 +8,7 @@
- +
{{ item }}
From 856cf180a583fb789235620bfdb3d03a51009ef2 Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 5 Sep 2025 17:21:55 -0500 Subject: [PATCH 062/217] Fix chapter editor overflow, set custom wrap breakpoint #4652 --- client/pages/audiobook/_id/chapters.vue | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client/pages/audiobook/_id/chapters.vue b/client/pages/audiobook/_id/chapters.vue index a2fe42ff..a62c5f7a 100644 --- a/client/pages/audiobook/_id/chapters.vue +++ b/client/pages/audiobook/_id/chapters.vue @@ -12,24 +12,24 @@
-
+
-