Compare commits

...
60 Commits
Author SHA1 Message Date
advplyrandGitHub 185cba16eb Merge pull request #1868 from pavel-miniutka/master
Belarusian language option
2026-05-13 16:32:34 -05:00
pavel-miniutka 547d086228 Belarusian language option 2026-05-13 09:11:27 +03:00
advplyr 3a2d5647d4 Merge branch 'master' of https://github.com/advplyr/audiobookshelf-app 2026-05-12 08:22:20 -05:00
advplyr 0a67c9b802 Update gh issue templates for 0.13.0 2026-05-12 08:22:15 -05:00
advplyr 0254afd5d8 iOS version bump 0.13.0 2026-05-10 15:18:30 -05:00
advplyr 853546f3d2 Fix cover image sampling not working when webview strips origin header, instead fetch image from server with CapacitorHttp 2026-05-10 15:15:13 -05:00
advplyr b8ac073247 Version bump 0.13.0-beta 2026-05-10 14:29:52 -05:00
advplyr 56cb4df31a Cleanup unnecessary logs 2026-05-10 14:23:17 -05:00
advplyr 7285b0bf26 iOS update RealmSwift to 10.54.6 2026-05-10 14:12:58 -05:00
advplyrandGitHub 3fdc2e6dcf Merge pull request #1864 from advplyr/fix_open_session_progress_sync
Fix external progress sync for open sessions
2026-05-10 11:24:38 -05:00
advplyr ed2f9d2e45 Prevent focus and socket reconnect from both fetching server media progress 2026-05-10 11:12:17 -05:00
advplyr 68dafbba75 Sync local media open in player when socket reconnects after 30s+ 2026-05-10 11:05:17 -05:00
advplyr 8be08702c1 Fix regain focus check server progress for local media items open in player & sync more recent 2026-05-09 16:48:55 -05:00
advplyrandGitHub 2c2e77f6cd Merge pull request #1824 from weblate/weblate-audiobookshelf-abs-mobile-app
Translations update from Hosted Weblate
2026-05-05 15:55:32 -05:00
LvanAlphenandHosted Weblate 12d02645fd Translated using Weblate (Dutch)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/nl/
2026-05-04 22:12:49 +00:00
PimandHosted Weblate 4578339594 Translated using Weblate (Dutch)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/nl/
2026-05-04 22:12:48 +00:00
LvanAlphenandHosted Weblate b81f78755d Translated using Weblate (Dutch)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/nl/
2026-05-04 22:12:47 +00:00
Naoto IshikawaandHosted Weblate 82664d6c81 Translated using Weblate (Japanese)
Currently translated at 76.4% (286 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/ja/
2026-05-04 22:12:47 +00:00
Pavel MiniutkaandHosted Weblate 9e06db58d2 Translated using Weblate (Belarusian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-05-04 22:12:46 +00:00
ugyesandHosted Weblate de3461af52 Translated using Weblate (Hungarian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/hu/
2026-05-04 22:12:46 +00:00
Serhiy BobrovandHosted Weblate 61f676d106 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/uk/
2026-05-04 22:12:45 +00:00
Владимир МакеевandHosted Weblate 82627b85a5 Translated using Weblate (Russian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/ru/
2026-05-04 22:12:45 +00:00
Pavel MiniutkaandHosted Weblate 21bc6cc8b6 Translated using Weblate (Belarusian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-05-04 22:12:44 +00:00
PlazecandHosted Weblate 2295b1071e Translated using Weblate (Czech)
Currently translated at 98.6% (369 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/cs/
2026-05-04 22:12:43 +00:00
Vadzim KurdzesauandHosted Weblate c75e376533 Translated using Weblate (Russian)
Currently translated at 97.5% (365 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/ru/
2026-05-04 22:12:43 +00:00
A LandHosted Weblate 3a5e2af9e4 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/bg/
2026-05-04 22:12:42 +00:00
AlexandHosted Weblate 30f1414ea5 Translated using Weblate (Slovak)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/sk/
2026-05-04 22:12:42 +00:00
tfr tintandHosted Weblate 737364aa3a Translated using Weblate (Italian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/it/
2026-05-04 22:12:41 +00:00
xxzp3andHosted Weblate fd988afad1 Translated using Weblate (Danish)
Currently translated at 98.9% (370 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/da/
2026-05-04 22:12:41 +00:00
kuci-JKandHosted Weblate 56dc7f856c Translated using Weblate (Czech)
Currently translated at 98.1% (367 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/cs/
2026-05-04 22:12:40 +00:00
Paolo RicciandHosted Weblate 5e4a41b0b5 Translated using Weblate (Italian)
Currently translated at 97.5% (365 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/it/
2026-05-04 22:12:40 +00:00
Pavel MiniutkaandHosted Weblate 66f426f6bb Translated using Weblate (Belarusian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-05-04 22:12:39 +00:00
Francisco SerradorandHosted Weblate 03efa352f5 Translated using Weblate (Spanish)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/es/
2026-05-04 22:12:39 +00:00
Francisco SerradorandHosted Weblate 5c147955b7 Translated using Weblate (Spanish)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/es/
2026-05-04 22:12:38 +00:00
Pavel MiniutkaandHosted Weblate 0a55573bd0 Translated using Weblate (Belarusian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-05-04 22:12:37 +00:00
Pavel MiniutkaandHosted Weblate de3812ac33 Translated using Weblate (Belarusian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-05-04 22:12:37 +00:00
Abdellatif AhammadandHosted Weblate b6de52eb91 Translated using Weblate (Arabic)
Currently translated at 96.5% (361 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/ar/
2026-05-04 22:12:36 +00:00
advplyr 65ec1ec5d4 Update search to include podcast episodes #1793 2026-05-04 17:12:29 -05:00
advplyrandGitHub 614118d1d3 Merge pull request #1856 from EndToEndDisciple/patch-1
Update i18n.js to add Bulgarian language
2026-05-04 16:23:39 -05:00
advplyr e3999360f0 Update github template app versions 2026-04-24 05:18:19 -05:00
Radoslav MandevandGitHub 50d1b62b95 Update i18n.js to add Bulgarian language 2026-04-24 12:03:37 +02:00
advplyrandGitHub 1571bcd9f3 Merge pull request #1806 from weblate/weblate-audiobookshelf-abs-mobile-app
Translations update from Hosted Weblate
2026-03-08 17:31:40 -05:00
Felix GrollandHosted Weblate 5531ced129 Translated using Weblate (German)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/de/
2026-03-04 05:09:49 +00:00
Grzegorz OrlowskiandHosted Weblate 2b258de5b8 Translated using Weblate (Polish)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/pl/
2026-03-04 05:09:48 +00:00
ArturandHosted Weblate 4e3d3f7752 Translated using Weblate (Polish)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/pl/
2026-03-04 05:09:47 +00:00
Torstein EideandHosted Weblate 63863a8800 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/nb_NO/
2026-03-02 09:09:49 +01:00
thehijackerandHosted Weblate d594fcb08b Translated using Weblate (Slovenian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/sl/
2026-03-02 09:09:47 +01:00
Pavel MiniutkaandHosted Weblate 85aab8df06 Translated using Weblate (Belarusian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-02-26 10:09:46 +01:00
Pavel MiniutkaandHosted Weblate ec1585f7c1 Translated using Weblate (Belarusian)
Currently translated at 99.1% (371 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-02-24 19:09:50 +00:00
Pavel MiniutkaandHosted Weblate 3b3bda117c Translated using Weblate (Belarusian)
Currently translated at 96.5% (361 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/be/
2026-02-20 19:09:51 +01:00
lambolightingandHosted Weblate c37f2b71d4 Translated using Weblate (Greek)
Currently translated at 61.7% (231 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/el/
2026-02-20 19:09:50 +01:00
PlazecandHosted Weblate 04de5960f1 Translated using Weblate (Czech)
Currently translated at 97.0% (363 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/cs/
2026-02-19 03:09:52 +01:00
GnebandHosted Weblate dad7ac4efd Translated using Weblate (Czech)
Currently translated at 97.0% (363 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/cs/
2026-02-19 03:09:51 +01:00
Silviu BajenaruandHosted Weblate d2830c1603 Translated using Weblate (Romanian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/ro/
2026-02-19 03:09:50 +01:00
peter cernyandHosted Weblate 6091fd6f79 Translated using Weblate (Slovak)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/sk/
2026-02-19 03:09:48 +01:00
herny ucetandHosted Weblate c9935eca2b Translated using Weblate (Slovak)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/sk/
2026-02-19 03:09:47 +01:00
GnebandHosted Weblate 38eacdd7b4 Translated using Weblate (Slovak)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/sk/
2026-02-19 03:09:46 +01:00
Igor DobračaandHosted Weblate 1bde917b09 Translated using Weblate (Croatian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/hr/
2026-02-16 06:11:22 +01:00
ugyesandHosted Weblate 0859e219fa Translated using Weblate (Hungarian)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/hu/
2026-02-16 06:11:22 +01:00
Karl BernstålandHosted Weblate dac9279320 Translated using Weblate (Swedish)
Currently translated at 100.0% (374 of 374 strings)

Translation: Audiobookshelf/Abs Mobile App
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-mobile-app/sv/
2026-02-16 06:11:21 +01:00
45 changed files with 964 additions and 364 deletions
+4 -4
View File
@@ -72,10 +72,10 @@ body:
description: Please ensure your app is up to date. *If you are using a 3rd-party app, please reach out to them directly.*
multiple: true
options:
- 'Android App - 0.11.0'
- 'iOS App - 0.11.0'
- 'Android App - 0.10.1'
- 'iOS App - 0.10.1'
- 'Android App - 0.13.0'
- 'iOS App - 0.13.0'
- 'Android App - 0.12.0'
- 'iOS App - 0.12.0'
validations:
required: true
- type: dropdown
+4 -4
View File
@@ -43,10 +43,10 @@ body:
description: Please ensure your app is up to date. *If you are using a 3rd-party app, please reach out to them directly.*
multiple: true
options:
- 'Android App - 0.11.0'
- 'iOS App - 0.11.0'
- 'Android App - 0.10.1'
- 'iOS App - 0.10.1'
- 'Android App - 0.13.0'
- 'iOS App - 0.13.0'
- 'Android App - 0.12.0'
- 'iOS App - 0.12.0'
validations:
required: true
- type: textarea
+2 -2
View File
@@ -36,8 +36,8 @@ android {
applicationId "com.audiobookshelf.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 116
versionName "0.12.0-beta"
versionCode 117
versionName "0.13.0-beta"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [
"appAuthRedirectScheme": "com.audiobookshelf.app"
@@ -47,7 +47,7 @@ data class DownloadItemPart(
}
val downloadUri = Uri.parse(downloadUrl)
Log.d("DownloadItemPart", "Audio File Destination Uri: $destinationUri | Final Destination Uri: $finalDestinationUri | Download URI $downloadUri")
Log.d("DownloadItemPart", "Audio File Destination Uri: $destinationUri | Final Destination Uri: $finalDestinationUri | Server Path $serverPath")
return DownloadItemPart(
id = DeviceManager.getBase64Id(finalDestinationFile.absolutePath),
downloadItemId,
@@ -119,7 +119,7 @@ class AbsDatabase : Plugin() {
@PluginMethod
fun setCurrentServerConnectionConfig(call:PluginCall) {
Log.d(tag, "setCurrentServerConnectionConfig ${call.data}")
Log.d(tag, "setCurrentServerConnectionConfig called")
val serverConfigPayload = jacksonMapper.readValue<ServerConnConfigPayload>(call.data.toString())
var serverConnectionConfig = DeviceManager.deviceData.serverConnectionConfigs.find { it.id == serverConfigPayload.id }
@@ -558,7 +558,7 @@ class AbsDatabase : Plugin() {
@PluginMethod
fun updateDeviceSettings(call:PluginCall) { // Returns device data
Log.d(tag, "updateDeviceSettings ${call.data}")
Log.d(tag, "updateDeviceSettings called")
val newDeviceSettings = jacksonMapper.readValue<DeviceSettings>(call.data.toString())
Handler(Looper.getMainLooper()).post {
@@ -576,7 +576,7 @@ class AbsDatabase : Plugin() {
@PluginMethod
fun getMediaItemHistory(call:PluginCall) { // Returns device data
Log.d(tag, "getMediaItemHistory ${call.data}")
Log.d(tag, "getMediaItemHistory called")
val mediaId = call.getString("mediaId") ?: ""
GlobalScope.launch(Dispatchers.IO) {
+28 -24
View File
@@ -69,22 +69,22 @@
<div id="playerControls" class="absolute right-0 bottom-0 mx-auto" style="max-width: 414px">
<div class="flex items-center max-w-full" :class="playerSettings.lockUi ? 'justify-center' : 'justify-between'">
<span v-show="showFullscreen && !playerSettings.lockUi" class="material-symbols next-icon text-fg cursor-pointer" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpChapterStart">first_page</span>
<div v-show="!playerSettings.lockUi" class="jump-icon text-fg cursor-pointer flex flex-col items-center" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpBackwards">
<span v-show="showFullscreen && !playerSettings.lockUi" class="material-symbols next-icon text-fg cursor-pointer" :class="showLoadingState ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpChapterStart">first_page</span>
<div v-show="!playerSettings.lockUi" class="jump-icon text-fg cursor-pointer flex flex-col items-center" :class="showLoadingState ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpBackwards">
<span class="material-symbols text-3xl leading-none">replay</span>
<span v-if="showFullscreen" class="jump-label text-[10px] font-semibold leading-tight">{{ jumpBackwardsLabel }}</span>
</div>
<div class="play-btn cursor-pointer shadow-sm flex items-center justify-center rounded-full text-primary mx-4 relative overflow-hidden" :style="{ backgroundColor: coverRgb }" :class="{ 'animate-spin': seekLoading }" @mousedown.prevent @mouseup.prevent @click.stop="playPauseClick">
<div v-if="!coverBgIsLight" class="absolute top-0 left-0 w-full h-full bg-white bg-opacity-20 pointer-events-none" />
<span v-if="!isLoading" class="material-symbols fill" :class="{ 'text-white': coverRgb && !coverBgIsLight }">{{ seekLoading ? 'autorenew' : !isPlaying ? 'play_arrow' : 'pause' }}</span>
<span v-if="!showLoadingState" class="material-symbols fill" :class="{ 'text-white': coverRgb && !coverBgIsLight }">{{ seekLoading ? 'autorenew' : !isPlaying ? 'play_arrow' : 'pause' }}</span>
<widgets-spinner-icon v-else class="h-8 w-8" />
</div>
<div v-show="!playerSettings.lockUi" class="jump-icon text-fg cursor-pointer flex flex-col items-center" :class="isLoading ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpForward">
<div v-show="!playerSettings.lockUi" class="jump-icon text-fg cursor-pointer flex flex-col items-center" :class="showLoadingState ? 'text-opacity-10' : 'text-opacity-75'" @click.stop="jumpForward">
<span class="material-symbols text-3xl leading-none">forward_media</span>
<span v-if="showFullscreen" class="jump-label text-[10px] font-semibold leading-tight">{{ jumpForwardLabel }}</span>
</div>
<span v-show="showFullscreen && !playerSettings.lockUi" class="material-symbols next-icon text-fg cursor-pointer" :class="nextChapter && !isLoading ? 'text-opacity-75' : 'text-opacity-10'" @click.stop="jumpNextChapter">last_page</span>
<span v-show="showFullscreen && !playerSettings.lockUi" class="material-symbols next-icon text-fg cursor-pointer" :class="nextChapter && !showLoadingState ? 'text-opacity-75' : 'text-opacity-10'" @click.stop="jumpNextChapter">last_page</span>
</div>
</div>
@@ -94,7 +94,7 @@
<div class="flex-grow" />
<p class="font-mono text-fg" style="font-size: 0.8rem">{{ timeRemainingPretty }}</p>
</div>
<div ref="track" class="h-1.5 w-full bg-track/50 relative rounded-full" :class="{ 'animate-pulse': isLoading }" @click.stop>
<div ref="track" class="h-1.5 w-full bg-track/50 relative rounded-full" :class="{ 'animate-pulse': showLoadingState }" @click.stop>
<div ref="readyTrack" class="h-full bg-track-buffered absolute top-0 left-0 rounded-full pointer-events-none" />
<div ref="bufferedTrack" class="h-full bg-track absolute top-0 left-0 rounded-full pointer-events-none" />
<div ref="playedTrack" class="h-full bg-track-cursor absolute top-0 left-0 rounded-full pointer-events-none" />
@@ -114,7 +114,7 @@
import { Capacitor } from '@capacitor/core'
import { AbsAudioPlayer } from '@/plugins/capacitor'
import { Dialog } from '@capacitor/dialog'
import { FastAverageColor } from 'fast-average-color'
import { getAverageColorFromCoverUrl } from '@/utils/coverAverageColor'
import WrappingMarquee from '@/assets/WrappingMarquee.js'
import jumpLabelMixin from '@/mixins/jumpLabel'
@@ -157,6 +157,7 @@ export default {
lockUi: false
},
isLoading: false,
isCheckingServerProgress: false,
isDraggingCursor: false,
draggingTouchStartX: 0,
draggingTouchStartTime: 0,
@@ -270,6 +271,9 @@ export default {
return 190 * heightScale
}
},
showLoadingState() {
return this.isLoading || this.isCheckingServerProgress
},
showCastBtn() {
return this.$store.state.isCastAvailable
},
@@ -408,17 +412,14 @@ export default {
},
async coverImageLoaded(fullCoverUrl) {
if (!fullCoverUrl) return
const fac = new FastAverageColor()
fac
.getColorAsync(fullCoverUrl)
.then((color) => {
this.coverRgb = color.rgba
this.coverBgIsLight = color.isLight
})
.catch((e) => {
console.log(e)
})
const avg = await getAverageColorFromCoverUrl(this, fullCoverUrl)
if (!avg) {
this.coverRgb = 'rgb(55, 56, 56)'
this.coverBgIsLight = false
} else {
this.coverRgb = avg.rgba
this.coverBgIsLight = avg.isLight
}
},
clickTitleAndAuthor() {
if (!this.showFullscreen) return
@@ -461,13 +462,13 @@ export default {
},
async jumpNextChapter() {
await this.$hapticsImpact()
if (this.isLoading) return
if (this.showLoadingState) return
if (!this.nextChapter) return
this.seek(this.nextChapter.start)
},
async jumpChapterStart() {
await this.$hapticsImpact()
if (this.isLoading) return
if (this.showLoadingState) return
if (!this.currentChapter) {
return this.restart()
}
@@ -497,12 +498,12 @@ export default {
},
async jumpBackwards() {
await this.$hapticsImpact()
if (this.isLoading) return
if (this.showLoadingState) return
AbsAudioPlayer.seekBackward({ value: this.jumpBackwardsTime })
},
async jumpForward() {
await this.$hapticsImpact()
if (this.isLoading) return
if (this.showLoadingState) return
AbsAudioPlayer.seekForward({ value: this.jumpForwardTime })
},
setStreamReady() {
@@ -606,7 +607,7 @@ export default {
}
},
seek(time) {
if (this.isLoading) return
if (this.showLoadingState) return
if (this.seekLoading) {
console.error('Already seek loading', this.seekedTime)
return
@@ -638,11 +639,14 @@ export default {
},
async playPauseClick() {
await this.$hapticsImpact()
if (this.isLoading) return
if (this.showLoadingState) return
this.isPlaying = !!((await AbsAudioPlayer.playPause()) || {}).playing
this.isEnded = false
},
setIsCheckingServerProgress(value) {
this.isCheckingServerProgress = !!value
},
play() {
AbsAudioPlayer.playPlayer()
this.startPlayInterval()
+125 -39
View File
@@ -48,6 +48,9 @@ export default {
},
isIos() {
return this.$platform === 'ios'
},
currentPlaybackSession() {
return this.$store.state.currentPlaybackSession
}
},
methods: {
@@ -304,48 +307,129 @@ export default {
this.$refs.audioPlayer?.seek(currentTime)
},
/**
* When device gains focus then refresh the timestamps in the audio player
* Fetch the current user's media progress from the server for a given library item / episode.
* Returns the server media progress object, or null if the request fails, times out, or the
* response doesn't match the requested library item.
*
* The audio player's loading state is shown while the request is in flight so the user
* doesn't tap play before we have a chance to update the timestamps. The request timeout
* is 7 seconds so a slow/unresponsive server doesn't block the user for long.
*/
deviceFocused(hasFocus) {
if (!this.$store.state.currentPlaybackSession) return
async getServerMediaProgressForCurrentSession() {
if (!this.$store.state.user.user || !this.$store.state.networkConnected) return null
const libraryItemId = this.currentPlaybackSession?.libraryItemId
const episodeId = this.currentPlaybackSession?.episodeId
if (!libraryItemId) return null
if (hasFocus) {
if (this.$refs.audioPlayer?.isCheckingServerProgress) {
console.log('[AudioPlayerContainer] getServerMediaProgressForCurrentSession: already checking server progress')
return null
}
const url = episodeId ? `/api/me/progress/${libraryItemId}/${episodeId}` : `/api/me/progress/${libraryItemId}`
this.$refs.audioPlayer?.setIsCheckingServerProgress(true)
try {
const data = await this.$nativeHttp.get(url, { connectTimeout: 7000, readTimeout: 7000 })
if (!data || data.libraryItemId !== libraryItemId) return null
return data
} catch (error) {
console.error('[AudioPlayerContainer] Failed to get server media progress', error)
return null
} finally {
this.$refs.audioPlayer?.setIsCheckingServerProgress(false)
}
},
getLocalMediaProgressForCurrentSession() {
if (!this.currentPlaybackSession) return null
return this.$store.getters['globals/getLocalMediaProgressById'](this.currentPlaybackSession.localLibraryItem?.id, this.currentPlaybackSession.localEpisodeId)
},
/**
* Sync the server media progress with the local media progress
*/
async syncServerMediaProgressWithLocalMediaProgress(localMediaProgressId, serverMediaProgress) {
try {
const newLocalMediaProgress = await this.$db.syncServerMediaProgressWithLocalMediaProgress({
localMediaProgressId,
mediaProgress: serverMediaProgress
})
if (newLocalMediaProgress?.id) {
this.$store.commit('globals/updateLocalMediaProgress', newLocalMediaProgress)
}
} catch (error) {
console.error('[AudioPlayerContainer] Failed to sync server progress with local media progress', error)
}
},
/**
* Check if the server media progress is more recent than the local media progress and sync if so
*/
async checkSyncServerProgressWithLocalProgress(localMediaProgress) {
if (!localMediaProgress) return
console.log('[AudioPlayerContainer] checkSyncServerProgressWithLocalProgress: checking server media progress for local media item open in player')
const serverMediaProgress = await this.getServerMediaProgressForCurrentSession()
if (!serverMediaProgress?.lastUpdate || serverMediaProgress.lastUpdate <= localMediaProgress.lastUpdate) return
console.log('[AudioPlayerContainer] checkSyncServerProgressWithLocalProgress: server progress is more recent than local progress. Server current time:', serverMediaProgress.currentTime, 'vs local', localMediaProgress.currentTime, `(server lastUpdate=${serverMediaProgress.lastUpdate} > local lastUpdate=${localMediaProgress.lastUpdate})`)
if (!this.$refs.audioPlayer?.isPlaying && serverMediaProgress.currentTime !== localMediaProgress.currentTime) {
// Use seek() so the native audio player's current session is updated
this.$refs.audioPlayer.seek(serverMediaProgress.currentTime)
}
await this.syncServerMediaProgressWithLocalMediaProgress(localMediaProgress.id, serverMediaProgress)
},
/**
* When socket is reconnected after a delay, if a local media item is open in the player (paused)
* we fetch the server media progress and sync it if it is more recent than the local progress
*
* If there is no socket connection we may have missed external progress updates
*/
async socketReconnected() {
if (!this.currentPlaybackSession) return
// dont update timestamps if player is playing
if (this.$refs.audioPlayer?.isPlaying) return
if (this.$refs.audioPlayer.isLocalPlayMethod) {
const localMediaProgress = this.getLocalMediaProgressForCurrentSession()
if (!localMediaProgress) {
console.error('[AudioPlayerContainer] socket reconnected: Local media progress not found')
return
}
await this.checkSyncServerProgressWithLocalProgress(localMediaProgress)
}
},
/**
* When device re-gains focus then refresh the timestamps in the audio player
* if local item is open then fetch the server media progress and update if more recent
*/
async deviceFocused(hasFocus) {
if (!this.currentPlaybackSession || !hasFocus) return
// dont update timestamps if player is playing
if (this.$refs.audioPlayer?.isPlaying) return
if (this.$refs.audioPlayer.isLocalPlayMethod) {
const localMediaProgress = this.getLocalMediaProgressForCurrentSession()
if (!localMediaProgress) {
console.error('[AudioPlayerContainer] device visibility: Local media progress not found')
return
}
console.log('[AudioPlayerContainer] device visibility: found local media progress', localMediaProgress.currentTime, 'last time in player is', this.currentTime)
this.$refs.audioPlayer.currentTime = localMediaProgress.currentTime
this.$refs.audioPlayer.timeupdate()
await this.checkSyncServerProgressWithLocalProgress(localMediaProgress)
} else {
// server item so fetch server media progress and update player time
console.log('[AudioPlayerContainer] device visibility: checking server media progress for server media item open in player')
const data = await this.getServerMediaProgressForCurrentSession()
if (!data) return
if (!this.$refs.audioPlayer?.isPlaying) {
const playbackSession = this.$store.state.currentPlaybackSession
if (this.$refs.audioPlayer.isLocalPlayMethod) {
const localLibraryItemId = playbackSession.localLibraryItem?.id
const localEpisodeId = playbackSession.localEpisodeId
if (!localLibraryItemId) {
console.error('[AudioPlayerContainer] device visibility: no local library item for session', JSON.stringify(playbackSession))
return
}
const localMediaProgress = this.$store.state.globals.localMediaProgress.find((mp) => {
if (localEpisodeId) return mp.localEpisodeId === localEpisodeId
return mp.localLibraryItemId === localLibraryItemId
})
if (localMediaProgress) {
console.log('[AudioPlayerContainer] device visibility: found local media progress', localMediaProgress.currentTime, 'last time in player is', this.currentTime)
this.$refs.audioPlayer.currentTime = localMediaProgress.currentTime
this.$refs.audioPlayer.timeupdate()
} else {
console.error('[AudioPlayerContainer] device visibility: Local media progress not found')
}
} else {
const libraryItemId = playbackSession.libraryItemId
const episodeId = playbackSession.episodeId
const url = episodeId ? `/api/me/progress/${libraryItemId}/${episodeId}` : `/api/me/progress/${libraryItemId}`
this.$nativeHttp
.get(url)
.then((data) => {
if (!this.$refs.audioPlayer?.isPlaying && data.libraryItemId === libraryItemId) {
console.log('[AudioPlayerContainer] device visibility: got server media progress', data.currentTime, 'last time in player is', this.currentTime)
this.$refs.audioPlayer.currentTime = data.currentTime
this.$refs.audioPlayer.timeupdate()
}
})
.catch((error) => {
console.error('[AudioPlayerContainer] device visibility: Failed to get progress', error)
})
console.log('[AudioPlayerContainer] device visibility: got server media progress', data.currentTime, 'last time in player is', this.currentTime)
// Only seek if the difference is greater than 1 second
if (Math.abs(data.currentTime - this.currentTime) > 1) {
// Use seek() so the native audio player's current session is updated
this.$refs.audioPlayer.seek(data.currentTime)
}
}
}
@@ -368,6 +452,7 @@ export default {
this.$eventBus.$on('user-settings', this.settingsUpdated)
this.$eventBus.$on('playback-time-update', this.playbackTimeUpdate)
this.$eventBus.$on('device-focus-update', this.deviceFocused)
this.$eventBus.$on('socket-reconnected', this.socketReconnected)
},
beforeDestroy() {
this.onLocalMediaProgressUpdateListener?.remove()
@@ -383,6 +468,7 @@ export default {
this.$eventBus.$off('user-settings', this.settingsUpdated)
this.$eventBus.$off('playback-time-update', this.playbackTimeUpdate)
this.$eventBus.$off('device-focus-update', this.deviceFocused)
this.$eventBus.$off('socket-reconnected', this.socketReconnected)
}
}
</script>
+69
View File
@@ -0,0 +1,69 @@
<template>
<div class="flex h-full px-1 overflow-hidden">
<covers-book-cover :library-item="libraryItem" :width="coverWidth" :book-cover-aspect-ratio="bookCoverAspectRatio" />
<div class="grow px-2 audiobookSearchCardContent">
<p class="truncate text-sm">{{ title }}</p>
<p v-if="subtitle" class="truncate text-xs text-gray-300">{{ subtitle }}</p>
<p class="text-xs text-gray-200 truncate">{{ $getString('LabelByAuthor', [authorName]) }}</p>
</div>
</div>
</template>
<script>
export default {
props: {
episode: {
type: Object,
default: () => {}
},
libraryItem: {
type: Object,
default: () => {}
}
},
data() {
return {}
},
computed: {
bookCoverAspectRatio() {
return this.$store.getters['libraries/getBookCoverAspectRatio']
},
coverWidth() {
if (this.bookCoverAspectRatio === 1) return 50 * 1.2
return 50
},
media() {
return this.libraryItem ? this.libraryItem.media || {} : {}
},
mediaMetadata() {
return this.media.metadata || {}
},
mediaType() {
return this.libraryItem ? this.libraryItem.mediaType : null
},
isPodcast() {
return this.mediaType === 'podcast'
},
title() {
return this.episode?.title || 'No Title'
},
subtitle() {
return this.mediaMetadata.title
},
authorName() {
return this.mediaMetadata.author
}
},
methods: {},
mounted() {}
}
</script>
<style>
.audiobookSearchCardContent {
width: calc(100% - 80px);
display: flex;
flex-direction: column;
justify-content: center;
}
</style>
+2 -2
View File
@@ -484,7 +484,7 @@ export default {
const { value } = await Dialog.confirm({
title: this.$strings.HeaderConfirm,
message: this.$strings.MessageConfirmDeleteServerConfig,
message: this.$strings.MessageConfirmDeleteServerConfig
})
if (value) {
this.processing = true
@@ -843,7 +843,7 @@ export default {
async setUserAndConnection({ user, userDefaultLibraryId, serverSettings, ereaderDevices }) {
if (!user) return
console.log('Successfully logged in', JSON.stringify(user))
console.log('Successfully logged in: ' + user.username)
this.$store.commit('setServerSettings', serverSettings)
this.$store.commit('libraries/setEReaderDevices', ereaderDevices)
+4 -4
View File
@@ -740,12 +740,12 @@
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 41;
CURRENT_PROJECT_VERSION = 43;
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 0.11.0;
MARKETING_VERSION = 0.13.0;
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -764,12 +764,12 @@
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 41;
CURRENT_PROJECT_VERSION = 43;
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 0.11.0;
MARKETING_VERSION = 0.13.0;
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
+20 -20
View File
@@ -25,11 +25,11 @@ PODS:
- Capacitor
- CordovaPlugins (6.2.1):
- CapacitorCordova
- Realm (10.54.4):
- Realm/Headers (= 10.54.4)
- Realm/Headers (10.54.4)
- RealmSwift (10.54.4):
- Realm (= 10.54.4)
- Realm (10.54.6):
- Realm/Headers (= 10.54.6)
- Realm/Headers (10.54.6)
- RealmSwift (10.54.6):
- Realm (= 10.54.6)
- WebnativellcCapacitorFilesharer (7.0.4):
- Capacitor
@@ -89,22 +89,22 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496
Capacitor: 106e7a4205f4618d582b886a975657c61179138d
CapacitorApp: d63334c052278caf5d81585d80b21905c6f93f39
CapacitorBrowser: 081852cf532acf77b9d2953f3a88fe5b9711fb06
CapacitorClipboard: b98aead5dc7ec595547fc2c5d75bacd2ae3338bc
CapacitorCommunityKeepAwake: 00dfd8fa3cca0df003c9a3e2cd7bee678aeec68b
CapacitorCommunityVolumeButtons: 8a0443a202ed659688d85f4d44d66f42f62f2b56
Capacitor: 03bc7cbdde6a629a8b910a9d7d78c3cc7ed09ea7
CapacitorApp: febecbb9582cb353aed037e18ec765141f880fe9
CapacitorBrowser: 6299776d496e968505464884d565992faa20444a
CapacitorClipboard: 70bfdb42b877b320a6e511ab94fa7a6a55d57ecb
CapacitorCommunityKeepAwake: ae762ce29b53147d28cfcaae5273cd1db0c38fc4
CapacitorCommunityVolumeButtons: 1b84f7abf29cd9476cef9e8979b2854a64d2eed5
CapacitorCordova: 5967b9ba03915ef1d585469d6e31f31dc49be96f
CapacitorDialog: 9b934329026b2b0ffa56939bb06df3c67541a2ab
CapacitorHaptics: 70e47470fa1a6bd6338cd102552e3846b7f9a1b3
CapacitorNetwork: 07ec4c69c1bb696f41c23e00d31bda1bbb221bba
CapacitorPreferences: cbf154e5e5519b7f5ab33817a334dda1e98387f9
CapacitorStatusBar: 275cbf2f4dfc00388f519ef80c7ec22edda342c9
CordovaPlugins: 5a72a85b45469e68556bb172409f1b6d57b27236
Realm: 8b5cda39a41f17a1734da2f39c6004eb8745587a
RealmSwift: 0b4f808fed6898f1f6c26f501f740efd80dff0b4
WebnativellcCapacitorFilesharer: 10b111373d4dc49608935600dcbcc14605258c73
CapacitorDialog: 0e09f242f6c3f5e82e4dc76b20f2a056be57a579
CapacitorHaptics: 1f1e17041f435d8ead9ff2a34edd592c6aa6a8d6
CapacitorNetwork: 15cb4385f0913a8ceb5e9a4d7af1ec554bdb8de8
CapacitorPreferences: 6c98117d4d7508034a4af9db64d6b26fc75d7b94
CapacitorStatusBar: 6e7af040d8fc4dd655999819625cae9c2d74c36f
CordovaPlugins: 2ecbba09775516c41764dbf78ade612427311b7e
Realm: b1b3bc68162fa242132eb7eefbf91d7c40f36a85
RealmSwift: 456cfd82a4f23dff8e3456980999331ab69bbf3e
WebnativellcCapacitorFilesharer: e3a5930240633db3335040251d66aac6762ff111
PODFILE CHECKSUM: 498821c0cfa2508609567fa95d7244c01cbef538
+27 -1
View File
@@ -24,6 +24,7 @@ export default {
inittingLibraries: false,
hasMounted: false,
disconnectTime: 0,
socketDisconnectedTime: 0,
timeLostFocus: 0,
currentLang: null
}
@@ -44,7 +45,7 @@ export default {
} else {
var timeSinceDisconnect = Date.now() - this.disconnectTime
if (timeSinceDisconnect > 5000) {
console.log('Time since disconnect was', timeSinceDisconnect, 'sync with server')
console.log('[default] Time since disconnect was', timeSinceDisconnect, 'sync with server')
setTimeout(() => {
this.syncLocalSessions(false)
}, 4000)
@@ -55,6 +56,28 @@ export default {
this.disconnectTime = Date.now()
}
}
},
socketConnected: {
handler(newVal, oldVal) {
if (!this.hasMounted) {
// watcher runs before mount, handling libraries/connection should be handled in mount
return
}
if (newVal) {
// if we havent been receiving socket events then external progress updates may have been missed
const timeSinceDisconnect = Date.now() - this.socketDisconnectedTime
if (timeSinceDisconnect > 30000 && this.isPlayerOpen) {
console.log('[default] socket reconnected after ' + timeSinceDisconnect + 'ms and player is open, triggering server media progress sync')
// used for triggering a server media progress sync if local media item is open in player
this.$eventBus.$emit('socket-reconnected')
} else {
console.log('[default] socket reconnected after ' + timeSinceDisconnect + 'ms')
}
} else {
console.log('[default] socket disconnected')
this.socketDisconnectedTime = Date.now()
}
}
}
},
computed: {
@@ -67,6 +90,9 @@ export default {
networkConnected() {
return this.$store.state.networkConnected
},
socketConnected() {
return this.$store.state.socketConnected
},
user() {
return this.$store.state.user.user
},
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "audiobookshelf-app",
"version": "0.12.0-beta",
"version": "0.13.0-beta",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "audiobookshelf-app",
"version": "0.12.0-beta",
"version": "0.13.0-beta",
"dependencies": {
"@capacitor-community/keep-awake": "^7.0.0",
"@capacitor-community/volume-buttons": "^7.0.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf-app",
"version": "0.12.0-beta",
"version": "0.13.0-beta",
"author": "advplyr",
"scripts": {
"dev": "nuxt --hostname 0.0.0.0 --port 1337",
+6 -13
View File
@@ -13,7 +13,7 @@
</div>
</div>
<div class="relative" @click="showFullscreenCover = true">
<covers-book-cover :library-item="libraryItem" :width="coverWidth" :book-cover-aspect-ratio="bookCoverAspectRatio" no-bg raw @imageLoaded="coverImageLoaded" />
<covers-book-cover :library-item="libraryItem" :width="coverWidth" :book-cover-aspect-ratio="bookCoverAspectRatio" no-bg raw />
<div v-if="!isPodcast" class="absolute bottom-0 left-0 h-1 z-10 box-shadow-progressbar" :class="userIsFinished ? 'bg-success' : 'bg-yellow-400'" :style="{ width: coverWidth * progressPercent + 'px' }"></div>
</div>
</div>
@@ -172,7 +172,7 @@
<script>
import { Dialog } from '@capacitor/dialog'
import { AbsFileSystem, AbsDownloader } from '@/plugins/capacitor'
import { FastAverageColor } from 'fast-average-color'
import { getAverageColorFromCoverUrl } from '@/utils/coverAverageColor'
import cellularPermissionHelpers from '@/mixins/cellularPermissionHelpers'
export default {
@@ -496,17 +496,10 @@ export default {
},
async coverImageLoaded(fullCoverUrl) {
if (!fullCoverUrl) return
const fac = new FastAverageColor()
fac
.getColorAsync(fullCoverUrl)
.then((color) => {
this.coverRgb = color.rgba
this.coverBgIsLight = color.isLight
})
.catch((e) => {
console.log(e)
})
const avg = await getAverageColorFromCoverUrl(this, fullCoverUrl)
if (!avg) return
this.coverRgb = avg.rgba
this.coverBgIsLight = avg.isLight
},
moreButtonPress() {
this.showMoreMenu = true
+14 -2
View File
@@ -19,7 +19,7 @@
</div>
</template>
<p v-if="podcastResults.length" class="uppercase text-xs text-fg-muted my-1 px-1 font-semibold">{{ $strings.LabelPodcasts }}</p>
<p v-if="podcastResults.length" class="font-semibold text-sm mb-1 mt-2">{{ $strings.LabelPodcasts }}</p>
<template v-for="item in podcastResults">
<div :key="item.libraryItem.id" class="text-fg select-none relative py-1">
<nuxt-link :to="`/item/${item.libraryItem.id}`">
@@ -28,6 +28,15 @@
</div>
</template>
<p v-if="episodeResults.length" class="font-semibold text-sm mb-1 mt-2">{{ $strings.HeaderEpisodes }}</p>
<template v-for="item in episodeResults">
<div :key="item.libraryItem.recentEpisode.id" class="text-fg select-none relative py-1">
<nuxt-link :to="`/item/${item.libraryItem.id}/${item.libraryItem.recentEpisode.id}`">
<cards-episode-search-card :episode="item.libraryItem.recentEpisode" :library-item="item.libraryItem" />
</nuxt-link>
</div>
</template>
<p v-if="seriesResults.length" class="font-semibold text-sm mb-1 mt-2">{{ $strings.LabelSeries }}</p>
<template v-for="seriesResult in seriesResults">
<div :key="seriesResult.series.id" class="w-full h-16 py-1">
@@ -77,6 +86,7 @@ export default {
isFetching: false,
bookResults: [],
podcastResults: [],
episodeResults: [],
seriesResults: [],
authorResults: [],
narratorResults: [],
@@ -91,7 +101,7 @@ export default {
return this.$store.getters['libraries/getBookCoverAspectRatio']
},
totalResults() {
return this.bookResults.length + this.seriesResults.length + this.authorResults.length + this.podcastResults.length + this.narratorResults.length + this.tagResults.length
return this.bookResults.length + this.seriesResults.length + this.authorResults.length + this.podcastResults.length + this.narratorResults.length + this.tagResults.length + this.episodeResults.length
}
},
methods: {
@@ -104,6 +114,7 @@ export default {
if (!this.lastSearch) {
this.bookResults = []
this.podcastResults = []
this.episodeResults = []
this.seriesResults = []
this.authorResults = []
this.narratorResults = []
@@ -125,6 +136,7 @@ export default {
this.bookResults = results?.book || []
this.podcastResults = results?.podcast || []
this.episodeResults = results?.episodes || []
this.seriesResults = results?.series || []
this.authorResults = results?.authors || []
this.narratorResults = results?.narrators || []
+2 -2
View File
@@ -51,7 +51,7 @@ class AbsDatabaseWeb extends WebPlugin {
ssc.customHeaders = serverConnectionConfig.customHeaders || {}
if (serverConnectionConfig.refreshToken) {
console.log('[AbsDatabase] Updating refresh token...', serverConnectionConfig.refreshToken)
console.log('[AbsDatabase] Updating refresh token...')
// Only using local storage for web version that is only used for testing
localStorage.setItem(`refresh_token_${ssc.id}`, serverConnectionConfig.refreshToken)
}
@@ -71,7 +71,7 @@ class AbsDatabaseWeb extends WebPlugin {
}
if (serverConnectionConfig.refreshToken) {
console.log('[AbsDatabase] Setting refresh token...', serverConnectionConfig.refreshToken)
console.log('[AbsDatabase] Setting refresh token...')
// Only using local storage for web version that is only used for testing
localStorage.setItem(`refresh_token_${ssc.id}`, serverConnectionConfig.refreshToken)
}
+1 -2
View File
@@ -128,13 +128,12 @@ export default ({ app, store }, inject) => {
// Listen for token refresh events from native app
AbsDatabase.addListener('onTokenRefresh', (data) => {
console.log('[db] onTokenRefresh', data)
store.commit('user/setAccessToken', data.accessToken)
})
// Listen for token refresh failure events from native app
AbsDatabase.addListener('onTokenRefreshFailure', async (data) => {
console.log('[db] onTokenRefreshFailure', data)
console.log('[db] onTokenRefreshFailure')
// Clear store and redirect to login page
await store.dispatch('user/logout')
if (window.location.pathname !== '/connect') {
+2
View File
@@ -5,7 +5,9 @@ const defaultCode = 'en-us'
let $localStore = null
const languageCodeMap = {
be: { label: 'Беларуская', dateFnsLocale: 'be' },
bn: { label: 'বাংলা', dateFnsLocale: 'bn' },
bg: { label: 'Български', dateFnsLocale: 'bg' },
ca: { label: 'Català', dateFnsLocale: 'ca' },
cs: { label: 'Čeština', dateFnsLocale: 'cs' },
da: { label: 'Dansk', dateFnsLocale: 'da' },
+4 -2
View File
@@ -43,7 +43,8 @@ export default function ({ store, $db, $socket }, inject) {
}
if (res.status >= 400) {
console.error(`[nativeHttp] ${res.status} status for url "${url}"`)
throw new Error(res.data)
const message = typeof res.data === 'string' ? res.data : `HTTP ${res.status}`
throw new Error(message)
}
return res.data
})
@@ -100,7 +101,8 @@ export default function ({ store, $db, $socket }, inject) {
if (retryResponse.status >= 400) {
console.error(`[nativeHttp] Retry request failed with status ${retryResponse.status}`)
throw new Error(retryResponse.data)
const message = typeof retryResponse.data === 'string' ? retryResponse.data : `HTTP ${retryResponse.status}`
throw new Error(message)
}
return retryResponse.data
+1 -1
View File
@@ -110,7 +110,7 @@ class ServerSocket extends EventEmitter {
}
onAuthFailed(data) {
console.log('[SOCKET] Auth failed', data)
console.log('[SOCKET] Auth failed: ' + (data?.message || 'Unknown reason'))
this.isAuthenticated = false
}
-1
View File
@@ -231,7 +231,6 @@ export const mutations = {
state.user = user
},
setAccessToken(state, accessToken) {
console.log('[user] setAccessToken', accessToken)
state.accessToken = accessToken
},
removeMediaProgress(state, id) {
+2
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "الفصول",
"HeaderCollection": "مجموعة",
"HeaderCollectionItems": "عناصر المجموعة",
"HeaderConfirm": "تأكيد",
"HeaderConnectionStatus": "حالة الاتصال",
"HeaderDataSettings": "إعدادات البيانات",
"HeaderDetails": "التفاصيل",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "الجلسات الأخيرة",
"HeaderTableOfContents": "جدول المحتويات",
"HeaderUserInterfaceSettings": "إعدادات واجهة المستخدم",
"HeaderWelcome": "مرحبا, <strong>{0}</strong>",
"HeaderYourStats": "إحصائياتك",
"LabelAddToPlaylist": "أضف إلى قائمة التشغيل",
"LabelAddedAt": "أضيفت على",
+94 -77
View File
@@ -11,11 +11,11 @@
"ButtonCollections": "Калекцыі",
"ButtonConnect": "Падлучыцца",
"ButtonConnectToServer": "Падлучыцца да сервера",
"ButtonCreate": "Ствараць",
"ButtonCreate": "Стварыць",
"ButtonCreateBookmark": "Стварыць закладку",
"ButtonCreateNewPlaylist": "Стварыць новы спіс прайгравання",
"ButtonCreateNewPlaylist": "Стварыць новы плэй-ліст",
"ButtonDelete": "Выдаліць",
"ButtonDeleteLocalEpisode": "Выдаліць лакальны эпізод",
"ButtonDeleteLocalEpisode": "Выдаліць лакальны выпуск",
"ButtonDeleteLocalFile": "Выдаліць лакальны файл",
"ButtonDeleteLocalItem": "Выдаліць лакальны элемент",
"ButtonDisableAutoTimer": "Адключыць аўтаматычны таймер",
@@ -30,15 +30,15 @@
"ButtonLogs": "Журналы",
"ButtonManageLocalFiles": "Кіраванне лакальнымі файламі",
"ButtonMaskServerAddress": "Схаваць адрас сервера",
"ButtonNewFolder": "Новая тэчка",
"ButtonNextEpisode": "Наступны эпізод",
"ButtonOk": "Добра",
"ButtonNewFolder": "Новая папка",
"ButtonNextEpisode": "Наступны выпуск",
"ButtonOk": "ОК",
"ButtonOpenFeed": "Адкрыць стужку",
"ButtonOverride": "Пераазначыць",
"ButtonPause": аўза",
"ButtonPause": рыпыніць",
"ButtonPlay": "Прайграць",
"ButtonPlayEpisode": "Прайграць эпізод",
"ButtonPlaylists": "Спісы прайгравання",
"ButtonPlayEpisode": "Прайграць выпуск",
"ButtonPlaylists": "Плэй-лісты",
"ButtonRead": "Чытаць",
"ButtonReadLess": "Чытаць менш",
"ButtonReadMore": "Чытаць больш",
@@ -59,31 +59,32 @@
"HeaderAccount": "Уліковы запіс",
"HeaderAdvanced": "Дадаткова",
"HeaderAndroidAutoSettings": "Налады Android Auto",
"HeaderAudioTracks": "Аўдыядарожкі",
"HeaderAudioTracks": "Аўдыятрэкі",
"HeaderChapters": "Раздзелы",
"HeaderCollection": "Калекцыя",
"HeaderCollectionItems": "Элементы калекцыі",
"HeaderConfirm": "Пацвердзіць",
"HeaderConnectionStatus": "Стан злучэння",
"HeaderDataSettings": "Налады дадзеных",
"HeaderDataSettings": "Налады даных",
"HeaderDetails": "Падрабязнасці",
"HeaderDownloads": "Спампоўкі",
"HeaderEbookFiles": "Файлы электронных кніг",
"HeaderEpisodes": "Эпізоды",
"HeaderEpisodes": "Выпускі",
"HeaderEreaderSettings": "Налады прылады для чытання",
"HeaderLatestEpisodes": "Апошнія эпізоды",
"HeaderLatestEpisodes": "Апошнія выпускі",
"HeaderLibraries": "Бібліятэкі",
"HeaderLocalFolders": "Лакальныя тэчкі",
"HeaderLocalFolders": "Лакальныя папкі",
"HeaderLocalLibraryItems": "Элементы лакальнай бібліятэкі",
"HeaderNewPlaylist": "Новы спіс прайгравання",
"HeaderNewPlaylist": "Новы плэй-ліст",
"HeaderOpenRSSFeed": "Адкрыць RSS-стужку",
"HeaderPlaybackSettings": "Налады прайгравання",
"HeaderPlaylist": "Спіс прайгравання",
"HeaderPlaylistItems": "Элементы спіса прайгравання",
"HeaderPlaylist": "Плэй-ліст",
"HeaderPlaylistItems": "Элементы плэй-ліста",
"HeaderProgressSyncFailed": "Не ўдалося сінхранізаваць прагрэс",
"HeaderRSSFeed": "RSS-стужка",
"HeaderRSSFeedGeneral": "Падрабязнасці RSS",
"HeaderRSSFeedIsOpen": "RSS-стужка адкрытая",
"HeaderSelectDownloadLocation": "Абраць месцазнаходжання для спампоўкі",
"HeaderSelectDownloadLocation": "Выберыце размяшчэнне для спампоўкі",
"HeaderSettings": "Налады",
"HeaderSleepTimer": "Таймер сну",
"HeaderSleepTimerSettings": "Налады таймера сну",
@@ -91,8 +92,9 @@
"HeaderStatsRecentSessions": "Апошнія сеансы",
"HeaderTableOfContents": "Змест",
"HeaderUserInterfaceSettings": "Налады інтэрфейсу карыстальніка",
"HeaderWelcome": "Вітаем, <strong>{0}</strong>",
"HeaderYourStats": "Ваша статыстыка",
"LabelAddToPlaylist": "Дадаць у спіс прайгравання",
"LabelAddToPlaylist": "Дадаць у плэй-ліст",
"LabelAddedAt": "Дата дабаўлення",
"LabelAddedDate": "Дададзена {0}",
"LabelAll": "Усе",
@@ -103,58 +105,62 @@
"LabelAndroidAutoBrowseSeriesSequenceOrder": "Парадак кніг у серыі",
"LabelAskConfirmation": "Запытваць пацверджанне",
"LabelAuthor": "Аўтар",
"LabelAuthorFirstLast": "Аўтар (Імя Прозвішча)",
"LabelAuthorLastFirst": "Аўтар (Прозвішча, Імя)",
"LabelAuthorFirstLast": "Аўтар (імя, прозвішча)",
"LabelAuthorLastFirst": "Аўтар (прозвішча, імя)",
"LabelAuthors": "Аўтары",
"LabelAutoDownloadEpisodes": "Аўтаматычнае спампаванне эпізодаў",
"LabelAutoDownloadEpisodes": "Аўтаматычна спампоўваць выпускі",
"LabelAutoRewindTime": "Час аўтаматычнай перамоткі назад",
"LabelAutoSleepTimer": "Аўтаматычны таймер сну",
"LabelAutoSleepTimerAutoRewind": "Аўтаматычная перамотка таймера сну",
"LabelAutoSleepTimerAutoRewindHelp": "Калі таймер аўтаматычнага сну скончыцца, паўторнае прайграванне элемента аўтаматычна перамотвае вашу пазіцыю.",
"LabelAutoSleepTimerAutoRewindHelp": "Пасля заканчэння аўтаматычнага таймера сну паўторнае прайграванне элемента аўтаматычна перамотвае вашу пазіцыю.",
"LabelAutoSleepTimerHelp": "Калі медыя прайграецца ў вызначаны час паміж пачаткам і канцом, таймер сну будзе запушчаны аўтаматычна.",
"LabelBooks": "Кнігі",
"LabelChapterTrack": "Дарожка раздзела",
"LabelByAuthor": " {0}",
"LabelChapterTrack": "Трэк раздзела",
"LabelChapters": "Раздзелы",
"LabelClosePlayer": "Зачыніць прайгравальнік",
"LabelCollapseSeries": "Згарнуць серыі",
"LabelComplete": "Завершана",
"LabelComplete": "Завяршыць",
"LabelContinueBooks": "Працягнуць кнігі",
"LabelContinueEpisodes": "Працягнуць эпізоды",
"LabelContinueListening": "Працягваць слухаць",
"LabelContinueEpisodes": "Працягнуць выпускі",
"LabelContinueListening": "Працяг праслухоўвання",
"LabelContinueReading": "Працягнуць чытанне",
"LabelContinueSeries": "Працягнуць серыі",
"LabelCustomTime": "Свой час",
"LabelDescription": "Апісанне",
"LabelDisableAudioFadeOut": "Адключыць змяншэнне гучнасці",
"LabelDisableAudioFadeOutHelp": "Гучнасць аўдыё пачне змяншацца, калі на таймеры сну застанецца менш за 1 хвіліну. Уключыце гэтую наладу, каб пазбегнуць змяншэння гучнасці.",
"LabelDisableAudioFadeOutHelp": "Гучнасць гуку пачне змяншацца, калі на таймеры сну застанецца менш за 1 хвіліну. Уключыце гэтую наладу, каб пазбегнуць змяншэння гучнасці.",
"LabelDisableAutoRewind": "Адключыць аўтаматычную перамотку назад",
"LabelDisableShakeToReset": "Адключыць скід страсеннем",
"LabelDisableShakeToResetHelp": "Калі патрасці прыладу падчас працы таймера АБО на працягу 2 хвілін пасля заканчэння таймера, таймер сну скідваецца. Уключыце гэтую наладу, каб адключыць скід страсеннем.",
"LabelDisableVibrateOnReset": "Адключыць вібрацыю пры скідзе",
"LabelDisableVibrateOnResetHelp": "Калі таймер сну скідваецца, ваша прылада будзе вібраваць. Уключыце гэтую наладу, каб адключыць вібрацыю пры скідзе таймера сну.",
"LabelDiscover": "Знайсці",
"LabelDiscover": "Знаходкі",
"LabelDownload": "Спампаваць",
"LabelDownloadUsingCellular": "Спампоўка праз мабільны інтэрнэт",
"LabelDownloadUsingCellular": "Спампоўваць праз мабільны інтэрнэт",
"LabelDownloaded": "Спампавана",
"LabelDuration": "Працягласць",
"LabelEbook": "Электронная кніга",
"LabelEbooks": "Электронныя кнігі",
"LabelEnable": "Уключыць",
"LabelEnableMp3IndexSeeking": "Уключыць індэксаванне для перамоткі MP3",
"LabelEnableMp3IndexSeeking": "Уключыць пошук па індэксе mp3",
"LabelEnableMp3IndexSeekingHelp": "Гэтую наладу варта ўключаць толькі, калі ў вас ёсць MP3-файлы, якія няправільна перамотваюцца. Хутчэй за ўсё, гэта выклікана файламі з зменным бітрэйтам (VBR). Гэтая налада прымусова ўключае індэксаванне для перамоткі, пры якім падчас чытання файла ствараецца адпаведнасць паміж часам і байтамі. У некаторых выпадках з вялікімі MP3-файламі можа быць затрымка пры перемотцы да канца файла.",
"LabelEnd": "Канец",
"LabelEndOfChapter": "Канец раздзела",
"LabelEndTime": "Час заканчэння",
"LabelEpisode": "Эпізод",
"LabelExplicit": "Відверты",
"LabelEpisode": "Выпуск",
"LabelExplicit": "Непрыстойнае",
"LabelFeedURL": "URL стужкі",
"LabelFile": "Файл",
"LabelFileBirthtime": "Час стварэння файла",
"LabelFileModified": "Час змянення файла",
"LabelFilename": "Імя файла",
"LabelFinished": "Скончана",
"LabelFolder": "Тэчка",
"LabelFilename": "Назва файла",
"LabelFinished": "Завершана",
"LabelFolder": "Папка",
"LabelFontBoldness": "Таўшчыня шрыфта",
"LabelFontFamily": "Сямейства шрыфтоў",
"LabelFontFamilySans": "Sans",
"LabelFontFamilySerif": "Serif",
"LabelFontScale": "Памер шрыфту",
"LabelGenre": "Жанр",
"LabelGenres": "Жанры",
@@ -166,7 +172,7 @@
"LabelHost": "Хост",
"LabelInProgress": "У працэсе",
"LabelIncomplete": "Незавершана",
"LabelInternalAppStorage": "Унутраная памяць прыкладання",
"LabelInternalAppStorage": "Унутраная памяць праграмы",
"LabelJumpBackwardsTime": "Час пераходу назад",
"LabelJumpForwardsTime": "Час пераходу наперад",
"LabelKeepScreenAwake": "Трымаць экран уключаным",
@@ -174,6 +180,9 @@
"LabelLayout": "Знешні выгляд",
"LabelLayoutAuto": "Аўто",
"LabelLayoutSinglePage": "Аднабаковы",
"LabelLibrarySortByProgress": "Прагрэс: апошняе абнаўленне",
"LabelLibrarySortByProgressFinished": "Прагрэс: завершана",
"LabelLibrarySortByProgressStarted": "Прагрэс: пачата",
"LabelLight": "Святло",
"LabelLineSpacing": "Міжрадковы інтэрвал",
"LabelListenAgain": "Паслухаць зноў",
@@ -187,9 +196,9 @@
"LabelMissing": "Адсутнічае",
"LabelMore": "Больш",
"LabelMoreInfo": "Больш інфармацыі",
"LabelName": "Імя",
"LabelNarrator": "Чытальнік",
"LabelNarrators": "Чытальнікі",
"LabelName": "Назва",
"LabelNarrator": "Дыктар",
"LabelNarrators": "Дыктары",
"LabelNavigateWithVolume": "Навігацыя з дапамогай клавіш гучнасці",
"LabelNavigateWithVolumeMirrored": "Люстраваны",
"LabelNavigateWithVolumeWhilePlaying": "Дазволіць клавішам гучнасці кіраваць навігацыяй падчас прайгравання",
@@ -197,13 +206,13 @@
"LabelNavigateWithVolumeWhilePlayingEnabled": "Уключана",
"LabelNever": "Ніколі",
"LabelNewestAuthors": "Новыя аўтары",
"LabelNewestEpisodes": "Новыя эпізоды",
"LabelNewestEpisodes": "Найноўшыя выпускі",
"LabelNo": "Не",
"LabelNotFinished": "Не скончана",
"LabelNotFinished": "Незавершана",
"LabelNotStarted": "Не пачата",
"LabelNumEpisodes": "{0} эпізодаў",
"LabelNumEpisodesIncomplete": "{0} эпізодаў, {1} незавершаных",
"LabelNumberOfEpisodes": "# з эпізодаў",
"LabelNumEpisodes": "{0} выпускаў",
"LabelNumEpisodesIncomplete": "{0} выпускаў, {1} незавершаных",
"LabelNumberOfEpisodes": "Колькасць выпускаў",
"LabelOff": "Выключына",
"LabelOn": "Уключана",
"LabelPassword": "Пароль",
@@ -229,10 +238,11 @@
"LabelReadAgain": "Чытаць зноў",
"LabelRecentSeries": "Апошнія серыі",
"LabelRecentlyAdded": "Нядаўна дададзеныя",
"LabelRemoveFromPlaylist": "Выдаліць з спіса прайгравання",
"LabelRemoveFromPlaylist": "Выдаліць з плэй-ліста",
"LabelScaleElapsedTimeBySpeed": "Прыстасаваць мінулы час да хуткасці",
"LabelSeason": "Сезон",
"LabelSelectADevice": "Выбраць прыладу",
"LabelSelectMediaType": "Выберыце тып медыя",
"LabelSequenceAscending": "Паслядоўнасць па ўзрастанні",
"LabelSequenceDescending": "Паслядоўнасць па змяншэнні",
"LabelSeries": "Серыі",
@@ -243,16 +253,16 @@
"LabelShowAll": "Паказаць усё",
"LabelSize": "Памер",
"LabelSleepTimer": "Таймер сну",
"LabelSleepTimerAlmostDoneChime": "Праіграйце звонак, калі амаль скончана",
"LabelSleepTimerAlmostDoneChime": "Гукавы сігнал, калі амаль звершаны",
"LabelSleepTimerAlmostDoneChimeHelp": "Памякчыць звонак, калі на таймеры сну застанецца 30 секунд",
"LabelStart": "Пачаць",
"LabelStart": "Пачатак",
"LabelStartTime": "Час пачатку",
"LabelStatsBestDay": "Лепшы дзень",
"LabelStatsBestDay": "Найлепшы дзень",
"LabelStatsDailyAverage": "У сярэднім за дзень",
"LabelStatsDays": "Дзён",
"LabelStatsDaysListened": "Дзён праслухана",
"LabelStatsInARow": "без перапынку",
"LabelStatsItemsFinished": "Скончаныя элементы",
"LabelStatsItemsFinished": "Элементаў завершана",
"LabelStatsMinutes": "хвілін",
"LabelStatsMinutesListening": "Хвілін праслухоўвання",
"LabelStatsWeekListening": "Праслухана за тыдзень",
@@ -264,14 +274,14 @@
"LabelThemeDark": "Цёмная",
"LabelThemeLight": "Светлая",
"LabelTimeRemaining": "Засталося {0}",
"LabelTitle": "Назва",
"LabelTitle": "Загаловак",
"LabelTotalSize": "Агульны памер",
"LabelTotalTrack": "Агульная колькасць дарожак",
"LabelTracks": "Дарожкі",
"LabelTotalTrack": "Усяго трэкаў",
"LabelTracks": "Трэкі",
"LabelType": "Тып",
"LabelUnknown": "Невядома",
"LabelUnlockPlayer": "Разблакаваць прайгравальнік",
"LabelUseBookshelfView": "Выкарыстоўваць выгляд кніжнай паліцы",
"LabelUseBookshelfView": "Паказваць кніжныя паліцы",
"LabelUser": "Карыстальнік",
"LabelUsername": "Імя карыстальніка",
"LabelVeryHigh": "Вельмі высокі",
@@ -280,24 +290,29 @@
"LabelYearReviewShow": "Азнаёміцца з вынікамі года",
"LabelYourBookmarks": "Вашы закладкі",
"LabelYourProgress": "Ваш прагрэс",
"MessageAndroid10Downloads": "На Android 10 і ніжэй для спампоўкі будзе выкарыстоўвацца ўнутраная памяць прыкладання.",
"MessageAndroid10Downloads": "На Android 10 і ніжэй для спамповак будзе выкарыстоўвацца ўнутраная памяць праграмы.",
"MessageAttemptingServerConnection": "Спроба злучэння з серверам...",
"MessageAudiobookshelfServerNotConnected": "Сервер Audiobookshelf не падлучаны",
"MessageAudiobookshelfServerRequired": "<strong>Важна!</strong> Гэта праграма прызначана для працы з серверам Audiobookshelf, які вы ці хтосьці іншы абслугоўваеце. Праграма не змяшчае ўласнага кантэнту.",
"MessageBookshelfEmpty": "Кніжная паліца пустая",
"MessageConfirmDeleteLocalEpisode": "Выдаліць лакальны эпізод \"{0}\" з вашай прылады? Файл на серверы застанецца нязменным.",
"MessageConfirmDeleteLocalFiles": "Выдаліць лакальныя файлы гэтага элемента з вашай прылады? Файлы на серверы і ваш прагрэс застануцца нязменнымі.",
"MessageConfirmDisableAutoTimer": "Вы ўпэўнены, што жадаеце адключыць аўтаматычны таймер на сённяшні дзень? Таймер будзе зноў уключаны па заканчэнні гэтага перыяду аўтаматычнага таймера сну або пры перазапуску праграмы.",
"MessageConfirmDiscardProgress": "Вы ўпэўнены, што жадаеце скінуць свой прагрэс?",
"MessageConfirmDownloadUsingCellular": "Вы збіраецеся спампаваць, выкарыстоўваючы мабільны інтэрнэт. Гэта можа прывесці да дадатковых плат ад аператара. Вы жадаеце працягнуць?",
"MessageConfirmMarkAsFinished": "Вы ўпэўнены, што жадаеце пазначыць гэты элемент як скончаны?",
"MessageConfirmRemoveBookmark": "Вы ўпэўнены, што жадаеце выдаліць закладку?",
"MessageConfirmStreamingUsingCellular": "Вы збіраецеся трансляваць кантэнт праз мабільны інтэрнэт. Гэта можа прывесці да дадатковых платаў ад вашага аператара. Вы жадаеце працягнуць?",
"MessageConfirmAppExit": "Вы хацелі выйсці з праграмы?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Вы ўпэўнены, што хочаце ачысціць чаргу спампоўвання выпускаў?",
"MessageConfirmDeleteLocalEpisode": "Выдаліць лакальны выпуск \"{0}\" з вашай прылады? Файл на серверы застанецца нязменным.",
"MessageConfirmDeleteLocalFiles": "Выдаліць лакальныя файлы гэтага элемента з вашай прылады? Файлы на серверы і прагрэс застануцца нязменнымі.",
"MessageConfirmDeleteServerConfig": "Выдаліць гэту канфігурацыю сервера?",
"MessageConfirmDeleteServerEpisode": "Вы ўпэўнены, што хочаце выдаліць выпуск \"{0}\" з сервера?\nУвага: будзе выдалены аўдыяфайл.",
"MessageConfirmDisableAutoTimer": "Вы ўпэўнены, што хочаце адключыць аўтаматычны таймер на сённяшні дзень? Таймер будзе зноў уключаны па заканчэнні перыяду гэтага аўтаматычнага таймера сну або пры перазапуску праграмы.",
"MessageConfirmDiscardProgress": "Вы ўпэўнены, што хочаце скінуць прагрэс?",
"MessageConfirmDownloadUsingCellular": "Вы збіраецеся спампаваць праз мабільны інтэрнэт. Гэта можа прывесці да дадатковых плат ад аператара. Хочаце працягнуць?",
"MessageConfirmMarkAsFinished": "Вы ўпэўнены, што хочаце пазначыць гэты элемент як завершаны?",
"MessageConfirmPlaybackTime": "Пачаць прайграванне \"{0}\" у {1}?",
"MessageConfirmRemoveBookmark": "Вы ўпэўнены, што хочаце выдаліць закладку?",
"MessageConfirmStreamingUsingCellular": "Вы збіраецеся трансляваць кантэнт праз мабільны інтэрнэт. Гэта можа прывесці да дадатковых плат ад аператара. Хочаце працягнуць?",
"MessageDiscardProgress": "Скінуць прагрэс",
"MessageDownloadCompleteProcessing": "Спампоўка завершана. Апрацоўка...",
"MessageDownloadCompleteProcessing": "Спампоўванне завершана. Апрацоўка...",
"MessageDownloading": "Спампоўванне...",
"MessageDownloadingEpisode": "Спампоўка эпізоду",
"MessageEpisodesQueuedForDownload": "{0} эпізод(аў) у чарзе для спампоўкі",
"MessageDownloadingEpisode": "Спампоўванне выпуску",
"MessageEpisodesQueuedForDownload": "{0} выпуск(-аў) у чарзе спампоўвання",
"MessageFailedToRefreshToken": "Не ўдалося абнавіць токен, патрабуецца паўторны ўваход",
"MessageFeedURLWillBe": "URL стужкі будзе {0}",
"MessageFetching": "Атрыманне...",
@@ -306,8 +321,8 @@
"MessageItemMissing": "Элемент адсутнічае і патрабуе выпраўлення на серверы. Звычайна элемент пазначаецца як адсутны, таму што файлавыя шляхі недаступныя.",
"MessageLoading": "Загрузка...",
"MessageLoadingServerData": "Загрузка даных з сервера...",
"MessageLocalFolderDescription": "\"Унутраная памяць прыкладання\" даступная толькі для гэтага прыкладання. Гэта прыкладанне працуе толькі з медыя, якія былі спампаваныя непасрэдна праз яго. Каб іншыя прыкладанні маглі атрымаць доступ да медыя, спампаванага гэтым прыкладаннем, можна выкарыстоўваць агульныя тэчкі.",
"MessageMarkAsFinished": "Пазначыць як скончана",
"MessageLocalFolderDescription": "\"Унутраная памяць праграмы\" даступная толькі для гэтай праграмы. Гэта праграма працуе толькі з медыя, якія былі спампаваныя непасрэдна праз яго. Каб іншыя праграмы маглі атрымаць доступ да медыя, спампаванага гэтай праграмай, можна выкарыстоўваць абагуленыя папкі.",
"MessageMarkAsFinished": "Пазначыць як завершаную",
"MessageMediaLinkedToADifferentServer": "Медыя звязаны з серверам Audiobookshelf па іншым адрасе ({0}). Сінхранізацыя прагрэсу адбудзецца пры падключэнні да гэтага адрасу сервера.",
"MessageMediaLinkedToADifferentUser": "Медыя звязаны з гэтым серверам, але быў спампаваны іншым карыстальнікам. Прагрэс будзе сінхранізавацца толькі для карыстальніка, які яго спампаваў.",
"MessageMediaLinkedToServer": "Звязана з серверам {0}",
@@ -320,12 +335,12 @@
"MessageNoItemsFound": "Элементы не знойдзены",
"MessageNoListeningSessions": "Няма сеансаў праслухоўвання",
"MessageNoLogs": "Няма журналаў",
"MessageNoMediaFolders": "Няма тэчак з медыя",
"MessageNoMediaFolders": "Няма папак з медыя",
"MessageNoNetworkConnection": "Няма падлучэння да сеткі",
"MessageNoPodcastsFound": "Падкасты не знойдзены",
"MessageNoSeries": "Няма серый",
"MessageNoUpdatesWereNecessary": "Абнаўленні не патрабаваліся",
"MessageNoUserPlaylists": "У вас няма спісаў прайгравання",
"MessageNoUserPlaylists": "У вас няма плэй-лістоў",
"MessageOldServerAuthReLoginRequired": "Аўтэнтыфікацыя была палепшана для бяспекі ў серверы v2.26.0. Усім карыстальнікам патрабуецца паўторна ўвайсці ў сістэму.",
"MessageOldServerAuthWarning": "Сервер выкарыстоўвае састарэлую аўтэнтыфікацыю",
"MessageOldServerAuthWarningHelp": "Гэты сервер працуе пад версіяй, старэйшай за 2.26.0. У версіі 2.26.0 была дададзена больш бяспечная сістэма аўтэнтыфікацыі. Настойліва рэкамендуецца абнавіць сервер да апошняй версіі. Калі вы ўжо абнавілі сервер, увайдзіце зноў, каб выкарыстоўваць новую аўтэнтыфікацыю.",
@@ -333,9 +348,9 @@
"MessageOldServerConnectionWarningHelp": "Вы першапачаткова наладзілі падключэнне да гэтага сервера да міграцыі базы даных у версіі 2.3.0, якая выйшла ў чэрвені 2023 года. У будучым абнаўленні сервера магчымасць уваходу праз гэтае старое падключэнне будзе выдалена. Калі ласка, выдаліце існуючае падключэнне да сервера і падключыцеся зноў (выкарыстоўваючы той жа адрас сервера і ўліковыя даныя). Калі на гэтай прыладзе ёсць спампаваныя медыяфайлы, іх трэба будзе спампаваць зноў для сінхранізацыі з серверам.",
"MessagePodcastSearchField": "Увядзіце пошукавы запыт або URL RSS-стужкі",
"MessageProgressSyncFailed": "Апошняя спроба адправіць ваш прагрэс праслухоўвання на сервер не ўдалася. Спробы сінхранізаваць прагрэс будуць працягвацца кожныя 15 секунд на працягу 1 хвіліны падчас прайгравання медыяфайла.",
"MessageReportBugsAndContribute": "Паведамляйце пра памылкі, прапануйце новыя функцыі і ўдзельнічайце на",
"MessageReportBugsAndContribute": "Паведамляйце пра памылкі, прапануйце функцыі і ўносьце свой уклад на",
"MessageSeriesAlreadyDownloaded": "Вы ўжо спампавалі ўсе кнігі з гэтай серыі.",
"MessageSeriesDownloadConfirm": "Спампаваць адсутныя {0} кніг(і) з {1} файл(амі), агульным памерам {2}, у тэчку {3}?",
"MessageSeriesDownloadConfirm": "Спампаваць адсутныя {0} кніг(і) з {1} файлам(-і), агульным памерам {2}, у папку {3}?",
"MessageSeriesDownloadConfirmIos": "Спампаваць адсутныя {0} кніг(і) з {1} файл(амі), агульным памерам {2}?",
"MessageSocketConnectedOverMeteredCellular": "Сокет падлучаны праз мабільны інтэрнэт з абмежаваным трафікам",
"MessageSocketConnectedOverMeteredWifi": "Сокет падлучаны праз Wi-Fi з абмежаваным трафікам",
@@ -343,17 +358,19 @@
"MessageSocketConnectedOverUnmeteredWifi": "Сокет падлучаны праз Wi-Fi без абмежавання трафіку",
"MessageSocketNotConnected": "Сокет не падлучаны",
"NoteRSSFeedPodcastAppsHttps": "Папярэджанне: большасць праграм для падкастаў патрабуюць, каб URL RSS-стужкі выкарыстоўваў HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Папярэджанне: адзін ці больш вашых эпізодаў не маюць даты публікацыі. Некаторыя праграмы для падкастаў патрабуюць гэтага.",
"NoteRSSFeedPodcastAppsPubDate": "Папярэджанне: адзін ці больш выпускаў не маюць даты публікацыі. Некаторыя праграмы для падкастаў патрабуюць гэтага.",
"ToastBookmarkCreateFailed": "Не ўдалося стварыць закладку",
"ToastBookmarkRemoveFailed": "Не ўдалося выдаліць закладку",
"ToastBookmarkUpdateFailed": "Не ўдалося абнавіць закладку",
"ToastDownloadNotAllowedOnCellular": "Спампоўванне забаронена праз мабільны інтэрнэт",
"ToastItemMarkedAsFinishedFailed": "Не ўдалося пазначыць як Скончана",
"ToastItemMarkedAsNotFinishedFailed": "Не ўдалося пазначыць як Незавершанае",
"ToastPlaylistCreateFailed": "Не ўдалося стварыць спіс прайгравання",
"ToastItemMarkedAsFinishedFailed": "Не ўдалося пазначыць як завершаны",
"ToastItemMarkedAsNotFinishedFailed": "Не ўдалося пазначыць як незавершаны",
"ToastPlaylistCreateFailed": "Не ўдалося стварыць плэй-ліст",
"ToastPodcastCreateFailed": "Не ўдалося стварыць падкаст",
"ToastPodcastCreateSuccess": "Падкаст паспяхова створаны",
"ToastRSSFeedCloseFailed": "Не ўдалося закрыць RSS-стужку",
"ToastRSSFeedCloseSuccess": "RSS-стужка закрыта",
"ToastStreamingNotAllowedOnCellular": "Патокавая перадача праз мабільную сувязь забаронена"
"ToastStreamingNotAllowedOnCellular": "Патокавая перадача праз мабільную сувязь забаронена",
"UnitMinutesShort": "{0} хв",
"UnitSecondsShort": "{0} с"
}
+18 -1
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Глави",
"HeaderCollection": "Колекция",
"HeaderCollectionItems": "Елемент в колекция",
"HeaderConfirm": "Потвърди",
"HeaderConnectionStatus": "Състояние на връзката",
"HeaderDataSettings": "Настройки на данните",
"HeaderDetails": "Детайли",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Последни сесии",
"HeaderTableOfContents": "Съдържание",
"HeaderUserInterfaceSettings": "Настройки на потребителския интерфейс",
"HeaderWelcome": "Добре дошли, <strong>{0}</strong>",
"HeaderYourStats": "Вашата статистика",
"LabelAddToPlaylist": "Добави в плейлист",
"LabelAddedAt": "Добавено в",
@@ -113,6 +115,7 @@
"LabelAutoSleepTimerAutoRewindHelp": "Когато автоматичният таймер на изключване изтече, повторното пускане на елемента автоматично ще върне позицията ви назад.",
"LabelAutoSleepTimerHelp": "Когато се възпроизвеждате медия между посочените начален и краен час, автоматично ще стартира таймер за изключване.",
"LabelBooks": "Книги",
"LabelByAuthor": "от {0}",
"LabelChapterTrack": "Трак на глава",
"LabelChapters": "Глави",
"LabelClosePlayer": "Затвори плейъра",
@@ -155,6 +158,9 @@
"LabelFinished": "Дата на приключване",
"LabelFolder": "Папка",
"LabelFontBoldness": "Дебелина на шрифта",
"LabelFontFamily": "Шрифт",
"LabelFontFamilySans": "Sans",
"LabelFontFamilySerif": "Serif",
"LabelFontScale": "Мащаб на шрифта",
"LabelGenre": "Жанр",
"LabelGenres": "Жанрове",
@@ -174,6 +180,9 @@
"LabelLayout": "Оформление",
"LabelLayoutAuto": "Авто",
"LabelLayoutSinglePage": "Единична страница",
"LabelLibrarySortByProgress": "Прогрес: Последно обновление",
"LabelLibrarySortByProgressFinished": "Прогрес: Приключено",
"LabelLibrarySortByProgressStarted": "Прогрес: Започнато",
"LabelLight": "Светло",
"LabelLineSpacing": "Междуредие",
"LabelListenAgain": "Слушай отново",
@@ -233,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Скалируй изминалото време спрямо скоростта",
"LabelSeason": "Сезон",
"LabelSelectADevice": "Избери устройство",
"LabelSelectMediaType": "Изберете тип на медията",
"LabelSequenceAscending": "Възходяща последователност",
"LabelSequenceDescending": "Низходяща последователност",
"LabelSeries": "От сериите",
@@ -285,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf сървър не е включен",
"MessageAudiobookshelfServerRequired": "<strong>ВАЖНО!</strong> Това приложение е създадено да работи с Audiobookshelf сървър, който вие или някой, когото познавате, хоства. Това приложение не предоставя никакво съдържание.",
"MessageBookshelfEmpty": "Библиотеката е празна",
"MessageConfirmAppExit": "Искате ли да излезете от апликацията?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Сигурни ли сте, че искате да изчистите опашката за сваляне на епизоди?",
"MessageConfirmDeleteLocalEpisode": "Премахни \"{0}\" епизода от устройството? Файловете на сървъра няма да бъдат премахнати.",
"MessageConfirmDeleteLocalFiles": "Да премахна ли локалните файлове на този елемент от вашето устройство? Файловете на сървъра и вашият напредък няма да бъдат засегнати.",
"MessageConfirmDeleteServerConfig": "Премахнете тази сървърна настройка?",
"MessageConfirmDeleteServerEpisode": "Сигурни ли сте че искате да изтрийете епизод \"{0}\" от сървъра?\nПредупреждение: Това ще изтрийе и аудио файла.",
"MessageConfirmDisableAutoTimer": "Сигурни ли сте, че искате да деактивирате автоматичния таймер за остатъка от днешния ден? Таймерът ще бъде активиран отново в края на този период на автоматичния таймер за изключване или ако рестартирате приложението.",
"MessageConfirmDiscardProgress": "Сигурни ли сте, че искате да нулирате напредъка си?",
"MessageConfirmDownloadUsingCellular": "Ще изтегляте, използвайки мобилни данни. Това може да включва такси за данни от оператора. Искате ли да продължите?",
"MessageConfirmMarkAsFinished": "Сигурни ли сте, че искате да маркирате този елемент като завършен?",
"MessageConfirmPlaybackTime": "Започни възпроизвеждане на \"{0}\" в {1}?",
"MessageConfirmRemoveBookmark": "Сигурни ли сте, че искате да премахнете отметката?",
"MessageConfirmStreamingUsingCellular": "Ще стриймвате, използвайки мобилни данни. Това може да включва такси за данни от оператора. Искате ли да продължите?",
"MessageDiscardProgress": "Нулирай прогреса",
@@ -355,5 +370,7 @@
"ToastPodcastCreateSuccess": "Подкаст успешно създаден",
"ToastRSSFeedCloseFailed": "Неуспешно затваряне на RSS емисията",
"ToastRSSFeedCloseSuccess": "RSS емисията е затворена",
"ToastStreamingNotAllowedOnCellular": "Стриймването не е разрешено чрез мобилни данни"
"ToastStreamingNotAllowedOnCellular": "Стриймването не е разрешено чрез мобилни данни",
"UnitMinutesShort": "{0}мин",
"UnitSecondsShort": "{0}сек"
}
+16 -2
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Kapitoly",
"HeaderCollection": "Kolekce",
"HeaderCollectionItems": "Položky kolekce",
"HeaderConfirm": "Potvrzení",
"HeaderConnectionStatus": "Stav připojení",
"HeaderDataSettings": "Nastavení dat",
"HeaderDetails": "Podrobnosti",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Poslední sezení",
"HeaderTableOfContents": "Obsah",
"HeaderUserInterfaceSettings": "Nastavení uživatelského rozhraní",
"HeaderWelcome": "Vítejte, <strong>{0}</strong>",
"HeaderYourStats": "Vaše statistiky",
"LabelAddToPlaylist": "Přidat do seznamu skladeb",
"LabelAddedAt": "Přidáno v",
@@ -113,6 +115,7 @@
"LabelAutoSleepTimerAutoRewindHelp": "Když dojde k uspání automatickým časovačem spánku, pozice přehrávání je posunuta zpět o vybraný čas.",
"LabelAutoSleepTimerHelp": "Během přehrávání média v časovém rozmezí \"Od\" a \"Do\" se automaticky spustí časovač spánku.",
"LabelBooks": "Knihy",
"LabelByAuthor": "od {0}",
"LabelChapterTrack": "Stopa kapitoly",
"LabelChapters": "Kapitoly",
"LabelClosePlayer": "Zavřít přehrávač",
@@ -158,7 +161,7 @@
"LabelFontFamily": "Rodina písem",
"LabelFontFamilySans": "Bezpatkové",
"LabelFontFamilySerif": "Patkové",
"LabelFontScale": "Měřítko písma",
"LabelFontScale": "Velikost písma",
"LabelGenre": "Žánr",
"LabelGenres": "Žánry",
"LabelHapticFeedback": "Haptická odezva",
@@ -177,6 +180,9 @@
"LabelLayout": "Rozvržení",
"LabelLayoutAuto": "Automatické",
"LabelLayoutSinglePage": "Jedna stránka",
"LabelLibrarySortByProgress": "Pokrok: naposledy aktualizováno",
"LabelLibrarySortByProgressFinished": "Pokrok: dokončeno",
"LabelLibrarySortByProgressStarted": "Pokrok: začato",
"LabelLight": "Slabá",
"LabelLineSpacing": "Řádkování",
"LabelListenAgain": "Poslouchat znovu",
@@ -236,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Škálovat uplynulý čas podle rychlosti",
"LabelSeason": "Sezóna",
"LabelSelectADevice": "Vyberte zařízení",
"LabelSelectMediaType": "Vyberte typ média",
"LabelSequenceAscending": "Řadit vzestupně",
"LabelSequenceDescending": "Řadit sestupně",
"LabelSeries": "Série",
@@ -288,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Server Audiobookshelf není připojen",
"MessageAudiobookshelfServerRequired": "<strong>Důležité!</strong> Tato aplikace je navržena, aby pracovala se serverem Audiobookshelf, který hostuje buď vy, nebo někdo, koho znáte. Tato aplikace neposkytuje žádný obsah.",
"MessageBookshelfEmpty": "Knihovna je prázdná",
"MessageConfirmAppExit": "Opravdu chcete opustit aplikaci?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Přejete si skutečně vymazat frontu stahování epizod?",
"MessageConfirmDeleteLocalEpisode": "Odebrat místní epizodu „{0}“ ze zařízení? Soubor na serveru zůstane nezměněný.",
"MessageConfirmDeleteLocalFiles": "Odebrat místní soubory této položky ze zařízení? Soubory na serveru a váš pokrok nebudou ovlivněny.",
"MessageConfirmDeleteServerConfig": "Odebrat tuto konfiguraci serveru?",
"MessageConfirmDeleteServerEpisode": "Přejete si skutečně odstranit epizodu \"{0}\" z serveru?\nUpozornění: Toto odstraní zvukový soubor.",
"MessageConfirmDisableAutoTimer": "Určitě chcete vypnout automatický časovač pro zbytek dnešního dne? Časovač bude opět aktivován po uběhnutí doby automatického spánku nebo po restartování aplikace.",
"MessageConfirmDiscardProgress": "Opravdu chcete zahodit svůj pokrok?",
"MessageConfirmDownloadUsingCellular": "Chystáte se stahovat přes mobilní data. Toto může zahrnovat poplatky za mobilní data. Chcete pokračovat?",
"MessageConfirmMarkAsFinished": "Opravdu chcete tuto položku označit jako dokončenou?",
"MessageConfirmPlaybackTime": "Spustit přehrávání pro \"{0}\" v {1}?",
"MessageConfirmRemoveBookmark": "Opravdu chcete odebrat záložku?",
"MessageConfirmStreamingUsingCellular": "Chystáte se přehrávat přes mobilní data. Toto může zahrnovat poplatky za mobilní data. Chcete pokračovat?",
"MessageDiscardProgress": "Zahodit pokrok",
@@ -358,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast byl úspěšně vytvořen",
"ToastRSSFeedCloseFailed": "Nepodařilo se zavřít RSS kanál",
"ToastRSSFeedCloseSuccess": "RSS kanál uzavřen",
"ToastStreamingNotAllowedOnCellular": "Přehrávání přes mobilní data není povoleno"
"ToastStreamingNotAllowedOnCellular": "Přehrávání přes mobilní data není povoleno",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+12 -3
View File
@@ -110,7 +110,7 @@
"LabelAuthors": "Forfattere",
"LabelAutoDownloadEpisodes": "Auto Download Episoder",
"LabelAutoRewindTime": "Automatisk tilbagespolingstid",
"LabelAutoSleepTimer": "Auto sleep timer",
"LabelAutoSleepTimer": "Auto søvn-timer",
"LabelAutoSleepTimerAutoRewind": "Automatisk sleep timer automatisk tilbagespoling",
"LabelAutoSleepTimerAutoRewindHelp": "Når den automatiske sleep-timer er færdig, vil genafspilning af elementet automatisk spole din position tilbage.",
"LabelAutoSleepTimerHelp": "Når der afspilles medie mellem de angivne start- og sluttidspunkter, starter en sleep-timer automatisk.",
@@ -180,6 +180,9 @@
"LabelLayout": "Layout",
"LabelLayoutAuto": "Automatisk",
"LabelLayoutSinglePage": "Enkel Side",
"LabelLibrarySortByProgress": "Fremgang: Sidst opdateret",
"LabelLibrarySortByProgressFinished": "Fremgang: Afsluttet",
"LabelLibrarySortByProgressStarted": "Fremgang: Startet",
"LabelLight": "Lys",
"LabelLineSpacing": "Linjeafstand",
"LabelListenAgain": "Lyt Igen",
@@ -239,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Skalér Forløbet Tid med Hastighed",
"LabelSeason": "Sæson",
"LabelSelectADevice": "Vælg en Enhed",
"LabelSelectMediaType": "Vælg medietype",
"LabelSequenceAscending": "Sekvens Stigende",
"LabelSequenceDescending": "Sekvens Faldende",
"LabelSeries": "Serie",
@@ -289,10 +293,13 @@
"MessageAndroid10Downloads": "Android 10 og mindre vil bruge intern lagerplads til downloads.",
"MessageAttemptingServerConnection": "Prøver at tilgå server...",
"MessageAudiobookshelfServerNotConnected": "Audiobookshel server er ikke tilsluttet",
"MessageAudiobookshelfServerRequired": "<strong>Vigtig</strong> Denne app er designet til at fungere med en Audiobookshelf server, som du eller en du kender hoster. Denne app levere ikke noget indhold.",
"MessageAudiobookshelfServerRequired": "<strong>Vigtigt!</strong> Denne app er designet til at fungere med en Audiobookshelf-server, som du eller en du kender hoster. Denne app leverer ikke noget indhold.",
"MessageBookshelfEmpty": "Bogreol Tom",
"MessageConfirmAppExit": "Ville du lukke appen?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Er du sikker på, at du vil rydde downloadkøen for episoder?",
"MessageConfirmDeleteLocalEpisode": "Slet lokal episode \"{0}\" fra din enhed? Filen på serveren vil ikke blive påvirket.",
"MessageConfirmDeleteLocalFiles": "Slet lokale filer af denne type fra din enhed? Filerne på serveren og din fremgang vil ikke blive påvirket.",
"MessageConfirmDeleteServerConfig": "Fjern denne serverkonfiguration?",
"MessageConfirmDisableAutoTimer": "Er du sikker på at du vil slå auto-timer fra resten af dagen? Timeren vil blive slået til ved slutningen af auto-sleep timer perioden eller appen genstartes.",
"MessageConfirmDiscardProgress": "Er du sikker på at du vil nulstille din fremgang?",
"MessageConfirmDownloadUsingCellular": "Du er ved at downloade via mobildata. Dette kan medføre ekstra omkostninger fra din teleoperatør. Vil du fortsætte?",
@@ -361,5 +368,7 @@
"ToastPodcastCreateSuccess": "Podcast oprettet med succes",
"ToastRSSFeedCloseFailed": "Mislykkedes lukning af RSS-feed",
"ToastRSSFeedCloseSuccess": "RSS-feed lukket",
"ToastStreamingNotAllowedOnCellular": "Det er ikke tillad at streame over mobildata"
"ToastStreamingNotAllowedOnCellular": "Det er ikke tillad at streame over mobildata",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+2 -2
View File
@@ -121,8 +121,8 @@
"LabelClosePlayer": "Player schließen",
"LabelCollapseSeries": "Serien einklappen",
"LabelComplete": "Vollständig",
"LabelContinueBooks": "Bücher fortfahren",
"LabelContinueEpisodes": "Episoden fortfahren",
"LabelContinueBooks": "Bücher fortsetzen",
"LabelContinueEpisodes": "Episoden fortsetzen",
"LabelContinueListening": "Weiterhören",
"LabelContinueReading": "Weiterlesen",
"LabelContinueSeries": "Serie fortsetzen",
+12
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Κεφάλαια",
"HeaderCollection": "Συλλογή",
"HeaderCollectionItems": "Αντικείμενα Συλλογής",
"HeaderConfirm": "Επιβεβαίωση",
"HeaderConnectionStatus": "Στατιστικά Σύνδεσης",
"HeaderDataSettings": "Ρυθμίσεις Δεδομένων",
"HeaderDetails": "Λεπτομέρειες",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Πρόσφατες Συνεδρίες",
"HeaderTableOfContents": "Πίνακας Περιεχομένων",
"HeaderUserInterfaceSettings": "Ρυθμίσεις Διεπαφής Χρήστη",
"HeaderWelcome": "Καλωσήρθες, <strong>{0}</strong>",
"HeaderYourStats": "Τα Στατιστικά Σας",
"LabelAddToPlaylist": "Προσθήκη στην Λίστα Αναπαραγωγής",
"LabelAddedAt": "Προστέθηκε Στις",
@@ -99,6 +101,7 @@
"LabelAllowSeekingOnMediaControls": "Να επιτρέπεται η αλλαγή θέσης από τα χειριστήρια ειδοποιήσεων πολυμέσων",
"LabelAlways": "Πάντα",
"LabelAndroidAutoBrowseLimitForGrouping": "Όριο λίστας κατά αλφαβητική σειρά",
"LabelAndroidAutoBrowseLimitForGroupingHelp": "Μην χρησιμοποιείτε την αλφαβητική λίστα περιορισμού όταν υπάρχουν λιγότερα από αυτά τα στοιχεία για εμφάνιση",
"LabelAndroidAutoBrowseSeriesSequenceOrder": "Ταξινόμηση βιβλίων σειράς",
"LabelAskConfirmation": "Ερώτηση για επιβεβαίωση",
"LabelAuthor": "Συγγραφέας",
@@ -106,19 +109,28 @@
"LabelAuthorLastFirst": "Συγγραφέας (Επώνυμο, Όνομα)",
"LabelAuthors": "Συγγραφείς",
"LabelAutoDownloadEpisodes": "Αυτόματο Κατέβασμα Επεισοδίων",
"LabelAutoRewindTime": "Χρόνος αυτόματης επαναφοράς",
"LabelAutoSleepTimer": "Αυτόματος Χρονοδιακόπτης Ύπνου",
"LabelAutoSleepTimerAutoRewind": "Αυτόματη επαναφορά κατά τον χρονοδιακόπτη ύπνου",
"LabelAutoSleepTimerAutoRewindHelp": "Όταν ολοκληρωθεί ο αυτόματος χρονοδιακόπτης ύπνου, η επαναφορά της αναπαραγωγής θα γυρίζει αυτόματα τη θέση σας πίσω.",
"LabelAutoSleepTimerHelp": "Όταν αναπαράγεται περιεχόμενο μεταξύ των καθορισμένων χρόνων έναρξης και λήξης, ο χρονοδιακόπτης ύπνου θα ξεκινά αυτόματα.",
"LabelBooks": "Βιβλία",
"LabelByAuthor": "κατά {0}",
"LabelChapterTrack": "Κομμάτι Κεφαλαίου",
"LabelChapters": "Κεφάλαια",
"LabelClosePlayer": "Κλείσιμο αναπαραγωγής",
"LabelCollapseSeries": "Σύμπτυξη Σειράς",
"LabelComplete": "Ολοκλήρωση",
"LabelContinueBooks": "Συνέχεια Βιβλίων",
"LabelContinueEpisodes": "Συνέχεια Επεισοδίων",
"LabelContinueListening": "Συνέχεια Ακρόασης",
"LabelContinueReading": "Συνέχεια Ανάγνωσης",
"LabelContinueSeries": "Συνέχεια Σειράς",
"LabelCustomTime": "Προσαρμοσμένη ώρα",
"LabelDescription": "Περιγραφή",
"LabelDisableAudioFadeOut": "Απενεργοποίηση σταδιακής μείωσης ήχου",
"LabelDisableAudioFadeOutHelp": "Η ένταση του ήχου θα αρχίσει να μειώνεται όταν απομένει λιγότερο από 1 λεπτό στον χρονοδιακόπτη ύπνου. Ενεργοποιήστε αυτή τη ρύθμιση για να μην γίνεται σταδιακή μείωση.",
"LabelDisableAutoRewind": "Απενεργοποίηση αυτόματης επαναφοράς",
"LabelDownload": "Λήψη",
"LabelDownloadUsingCellular": "Λήψη με χρήση δεδομένων",
"LabelDownloaded": "Ληφθέντα",
+78 -64
View File
@@ -5,7 +5,7 @@
"ButtonBack": "Atrás",
"ButtonCancel": "Cancelar",
"ButtonCancelTimer": "Cancelar temporizador",
"ButtonClearFilter": "Quitar filtros",
"ButtonClearFilter": "Vaciar filtro",
"ButtonClearLogs": "Vaciar registros",
"ButtonCloseFeed": "Cerrar suministro",
"ButtonCollections": "Colecciones",
@@ -18,16 +18,16 @@
"ButtonDeleteLocalEpisode": "Eliminar episodio local",
"ButtonDeleteLocalFile": "Eliminar archivo local",
"ButtonDeleteLocalItem": "Eliminar elemento local",
"ButtonDisableAutoTimer": "Desactivar temporizador automático",
"ButtonDisableAutoTimer": "Inhabilitar temporizador automático",
"ButtonDisconnect": "Desconectar",
"ButtonGoToWebClient": "Ir al cliente web",
"ButtonHistory": "Historial",
"ButtonHome": "Inicio",
"ButtonIssues": "Problemas",
"ButtonIssues": "Incidencias",
"ButtonLatest": "Más recientes",
"ButtonLibrary": "Biblioteca",
"ButtonLocalMedia": "Medios locales",
"ButtonLogs": "Registros",
"ButtonLogs": "Bitácoras",
"ButtonManageLocalFiles": "Gestionar archivos locales",
"ButtonMaskServerAddress": "Enmascarar dirección de servidor",
"ButtonNewFolder": "Carpeta nueva",
@@ -49,103 +49,105 @@
"ButtonSearch": "Buscar",
"ButtonSendEbookToDevice": "Enviar libro al dispositivo",
"ButtonSeries": "Series",
"ButtonSetTimer": "Ajustar el temporizador",
"ButtonSetTimer": "Ajustar cronómetro",
"ButtonStream": "En directo",
"ButtonSubmit": "Enviar",
"ButtonSubmit": "Entregar",
"ButtonSwitchServerUser": "Cambiar servidor/usuario",
"ButtonUnmaskServerAddress": "Desenmascarar dirección de servidor",
"ButtonUserStats": "Estadísticas de usuario",
"ButtonYes": "Sí",
"HeaderAccount": "Cuenta",
"HeaderAdvanced": "Avanzado",
"HeaderAndroidAutoSettings": "Configuración de Android Auto",
"HeaderAudioTracks": "Pistas de audio",
"HeaderAndroidAutoSettings": "Ajustes automáticos de Android",
"HeaderAudioTracks": "Pistas de Audio",
"HeaderChapters": "Capítulos",
"HeaderCollection": "Colección",
"HeaderCollectionItems": "Elementos en la colección",
"HeaderConnectionStatus": "Estado de la conexión",
"HeaderDataSettings": "Configuración de datos",
"HeaderCollectionItems": "Elementos de colección",
"HeaderConfirm": "Confirmar",
"HeaderConnectionStatus": "Estado de conexión",
"HeaderDataSettings": "Ajustes de datos",
"HeaderDetails": "Detalles",
"HeaderDownloads": "Descargas",
"HeaderEbookFiles": "Archivos de libros digitales",
"HeaderEpisodes": "Episodios",
"HeaderEreaderSettings": "Configuración del lector",
"HeaderEreaderSettings": "Ajustes del Lector-e",
"HeaderLatestEpisodes": "Episodios más recientes",
"HeaderLibraries": "Bibliotecas",
"HeaderLocalFolders": "Carpetas locales",
"HeaderLocalLibraryItems": "Elementos de la biblioteca local",
"HeaderLocalLibraryItems": "Elementos de Biblioteca Local",
"HeaderNewPlaylist": "Nueva lista de reproducción",
"HeaderOpenRSSFeed": "Abrir suministro RSS",
"HeaderPlaybackSettings": "Configuración de reproducción",
"HeaderPlaybackSettings": "Ajustes de Reproducción",
"HeaderPlaylist": "Lista de reproducción",
"HeaderPlaylistItems": "Elementos de lista de reproducción",
"HeaderProgressSyncFailed": "Falló la sincronización del progreso",
"HeaderProgressSyncFailed": "Progreso de sincronización incorrecto",
"HeaderRSSFeed": "Suministro RSS",
"HeaderRSSFeedGeneral": "Detalles de RSS",
"HeaderRSSFeedIsOpen": "El suministro RSS está abierto",
"HeaderSelectDownloadLocation": "Seleccionar ubicación de descarga",
"HeaderSettings": "Configuración",
"HeaderSleepTimer": "Temporizador de apagado",
"HeaderSleepTimerSettings": "Ajustes del temporizador para dormir",
"HeaderSelectDownloadLocation": "Seleccionar lugar de descarga",
"HeaderSettings": "Ajustes",
"HeaderSleepTimer": "Cronómetro de dormida",
"HeaderSleepTimerSettings": "Ajustes del temporizador para dormida",
"HeaderStatsMinutesListeningChart": "Minutos escuchando (últimos 7 días)",
"HeaderStatsRecentSessions": "Sesiones recientes",
"HeaderTableOfContents": "Sumario",
"HeaderUserInterfaceSettings": "Configuración de interfaz de usuario",
"HeaderUserInterfaceSettings": "Ajustes de interfaz de usuario",
"HeaderWelcome": "Bienvenido/a, <strong>{0}</strong>",
"HeaderYourStats": "Sus estadísticas",
"LabelAddToPlaylist": "Añadir a lista de reproducción",
"LabelAddedAt": "Añadido",
"LabelAddedDate": "{0} Añadido",
"LabelAddedAt": "Añadido en",
"LabelAddedDate": "Añadido {0}",
"LabelAll": "Todos",
"LabelAllowSeekingOnMediaControls": "Permitir la búsqueda de posición en los controles de notificación de medios",
"LabelAllowSeekingOnMediaControls": "Concede la búsqueda de posición en los controles de notificación de medios",
"LabelAlways": "Siempre",
"LabelAndroidAutoBrowseLimitForGrouping": "Limite del despliegue alfabético",
"LabelAndroidAutoBrowseLimitForGrouping": "Límite del despliegue alfabético",
"LabelAndroidAutoBrowseLimitForGroupingHelp": "No utilice el despliegue alfabético cuando haya menos de esta cantidad de elementos para mostrar",
"LabelAndroidAutoBrowseSeriesSequenceOrder": "Orden de libros de Series",
"LabelAndroidAutoBrowseSeriesSequenceOrder": "Ordenación de libros de Series",
"LabelAskConfirmation": "Pedir confirmación",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Nombre Apellido)",
"LabelAuthorLastFirst": "Autor (Apellido, Nombre)",
"LabelAuthors": "Autores",
"LabelAutoDownloadEpisodes": "Descargar episodios automáticamente",
"LabelAutoRewindTime": "Tiempo de rebobinado automático",
"LabelAutoSleepTimer": "Temporizador de apagado automático",
"LabelAutoSleepTimerAutoRewind": "Temporizador de apagado automático con rebobinado automático",
"LabelAutoSleepTimerAutoRewindHelp": "Cuando el temporizador de auto apagado finaliza, reproducir el elemento nuevamente rebobinará automáticamente tu posición.",
"LabelAutoDownloadEpisodes": "AutoDescargar episodios",
"LabelAutoRewindTime": "Tiempo de autorebobinado",
"LabelAutoSleepTimer": "Cronómetro de autoapagado",
"LabelAutoSleepTimerAutoRewind": "Cronómetro de autoapagado con autorebobinado",
"LabelAutoSleepTimerAutoRewindHelp": "Cuando el cronómetro de autoapagado finaliza, reproducir el elemento nuevamente autorebobinará tu posición.",
"LabelAutoSleepTimerHelp": "Cuando se reproduce contenido multimedia entre las horas de inicio y finalización especificadas, se activará automáticamente un temporizador de apagado.",
"LabelBooks": "Libros",
"LabelByAuthor": "por",
"LabelByAuthor": "por {0}",
"LabelChapterTrack": "Seguimiento de Capítulo",
"LabelChapters": "Capítulos",
"LabelClosePlayer": "Cerrar reproductor",
"LabelCollapseSeries": "Colapsar serie",
"LabelCollapseSeries": "Colapsar Series",
"LabelComplete": "Completo",
"LabelContinueBooks": "Continuar libros",
"LabelContinueEpisodes": "Continuar episodios",
"LabelContinueListening": "Seguir escuchando",
"LabelContinueEpisodes": "Continuar Episodios",
"LabelContinueListening": "Seguir Escuchando",
"LabelContinueReading": "Continuar leyendo",
"LabelContinueSeries": "Continuar series",
"LabelCustomTime": "Tiempo personalizado",
"LabelDescription": "Descripción",
"LabelDisableAudioFadeOut": "Desactivar el fundido de audio",
"LabelDisableAudioFadeOutHelp": "El volumen de audio comenzará a disminuir cuando quede menos de 1 minuto en el temporizador de apagado. Habilite este ajuste para que no se desvanezca.",
"LabelDisableAutoRewind": "Desactivar rebobinado automático",
"LabelDisableShakeToReset": "Desactivar agitar para reiniciar",
"LabelDisableShakeToResetHelp": "Si agitas el dispositivo mientras el temporizador está en marcha o en los 2 minutos siguientes a la expiración del temporizador, éste se reiniciará. Habilita esta configuración para desactivar el restablecimiento al agitar.",
"LabelDisableAudioFadeOutHelp": "El volumen de audio comenzará a disminuir cuando quede menos de 1 minuto en el temporizador de dormida. Habilite este ajuste para que no se desvanezca.",
"LabelDisableAutoRewind": "Desactivar autorebobinado",
"LabelDisableShakeToReset": "Desactivar agitar para restablecer",
"LabelDisableShakeToResetHelp": "Si agitas el dispositivo mientras el temporizador está en marcha o en los 2 minutos siguientes a la caducidad del temporizador, éste se reiniciará. Habilita estos ajustes para desactivar el restablecimiento al agitar.",
"LabelDisableVibrateOnReset": "Desactivar vibración al reiniciar",
"LabelDisableVibrateOnResetHelp": "Cuando el temporizador de apagado se reinicia, el dispositivo vibra. Activa esta opción para que no vibre cuando se reinicie el temporizador.",
"LabelDisableVibrateOnResetHelp": "Cuando el temporizador de apagado se reinicia, el dispositivo vibra. Activa esta opción para que no vibre cuando se duerme el temporizador.",
"LabelDiscover": "Descubrir",
"LabelDownload": "Descargar",
"LabelDownloadUsingCellular": "Descargar usando el móvil",
"LabelDownloaded": "Descargado",
"LabelDuration": "Duración",
"LabelEbook": "Libro electrónico",
"LabelEbooks": "Libros electrónicos",
"LabelEbook": "Libro-e",
"LabelEbooks": "Libros-e",
"LabelEnable": "Activar",
"LabelEnableMp3IndexSeeking": "Activar la búsqueda de índices mp3",
"LabelEnableMp3IndexSeekingHelp": "Esta configuración solo debe activarse si tiene archivos MP3 en los que no se puede buscar correctamente. La búsqueda inexacta probablemente se deba a archivos MP3 con tasas de bits variables (VBR). Esta configuración forzará la búsqueda de índice, en la que se construye una asignación de tiempo a bytes mientras se lee el archivo. En algunos casos, con archivos MP3 grandes, puede haber un retraso al buscar hacia el final del archivo.",
"LabelEnableMp3IndexSeekingHelp": "Estos ajustes solo estaría activado si tiene archivos mp3 en los que no se puede buscar correctamente. La búsqueda inexacta probablemente se deba a archivos mp3 con tasas de los bit variables (VBR). Este ajuste forzará la búsqueda de índice, en la que se construye una asignación de tiempo a bytes mientras se lee el archivo. En algunos casos, con archivos mp3 grandes, puede haber un retraso al buscar hacia el final del archivo.",
"LabelEnd": "Fin",
"LabelEndOfChapter": "Fin del capítulo",
"LabelEndTime": "Hora de finalización",
"LabelEndTime": "Tiempo de finalización",
"LabelEpisode": "Episodio",
"LabelExplicit": "Explícito",
"LabelFeedURL": "URL del suministro",
@@ -153,38 +155,41 @@
"LabelFileBirthtime": "Archivo creado en",
"LabelFileModified": "Archivo modificado",
"LabelFilename": "Nombre del archivo",
"LabelFinished": "Terminado",
"LabelFinished": "Finalizado",
"LabelFolder": "Carpeta",
"LabelFontBoldness": "Peso tipográfico",
"LabelFontBoldness": "Tipográfico sin Negrita",
"LabelFontFamily": "Familia tipográfica",
"LabelFontFamilySans": "Sans",
"LabelFontFamilySerif": "Serif",
"LabelFontScale": "Escala de letra",
"LabelGenre": "Género",
"LabelGenres": "Géneros",
"LabelHapticFeedback": "Respuesta háptica",
"LabelHasEbook": "Tiene un libro",
"LabelHasSupplementaryEbook": "Tiene un libro complementario",
"LabelHeavy": "Pesado",
"LabelHapticFeedback": "Comentario háptico",
"LabelHasEbook": "Tiene libro-e",
"LabelHasSupplementaryEbook": "Tiene un libro-e suplementario",
"LabelHeavy": "Denso",
"LabelHigh": "Alto",
"LabelHost": "Anfitrión",
"LabelInProgress": "En proceso",
"LabelIncomplete": "Incompleto",
"LabelInternalAppStorage": "Almacenamiento interno de aplicaciones",
"LabelJumpBackwardsTime": "Saltar atrás en el tiempo",
"LabelJumpForwardsTime": "Salto adelante en el tiempo",
"LabelInternalAppStorage": "Almacenamiento Interno de App",
"LabelJumpBackwardsTime": "Volver en el tiempo",
"LabelJumpForwardsTime": "Avanzar en el tiempo",
"LabelKeepScreenAwake": "Mantener la pantalla encendida",
"LabelLanguage": "Idioma",
"LabelLayout": "Disposición",
"LabelLayoutAuto": "Automático",
"LabelLayoutSinglePage": "Página única",
"LabelLibrarySortByProgress": "Progreso: Último actualizado",
"LabelLibrarySortByProgressFinished": "Progreso: Finalizado",
"LabelLibrarySortByProgressStarted": "Progreso: Iniciado",
"LabelLight": "Claro",
"LabelLineSpacing": "Interlineado",
"LabelListenAgain": "Volver a escuchar",
"LabelLocalBooks": "Libros Locales",
"LabelLocalPodcasts": "Pódcast locales",
"LabelLockOrientation": "Bloquear orientación",
"LabelLockPlayer": "Bloquear el reproductor",
"LabelLockPlayer": "Bloquear reproductor",
"LabelLow": "Bajo",
"LabelMediaType": "Tipo de multimedia",
"LabelMedium": "Medio",
@@ -195,7 +200,7 @@
"LabelNarrator": "Narrador",
"LabelNarrators": "Narradores",
"LabelNavigateWithVolume": "Navegar con las teclas de volumen",
"LabelNavigateWithVolumeMirrored": "Espejo",
"LabelNavigateWithVolumeMirrored": "Espejado",
"LabelNavigateWithVolumeWhilePlaying": "También puede utilizar los botones de volumen para desplazarse durante la reproducción",
"LabelNavigateWithVolumeWhilePlayingDisabled": "Apagado",
"LabelNavigateWithVolumeWhilePlayingEnabled": "Encender",
@@ -203,11 +208,11 @@
"LabelNewestAuthors": "Autores más nuevos",
"LabelNewestEpisodes": "Episodios más nuevos",
"LabelNo": "No",
"LabelNotFinished": "No terminado",
"LabelNotFinished": "No finalizado",
"LabelNotStarted": "Sin iniciar",
"LabelNumEpisodes": "{0} episodios",
"LabelNumEpisodesIncomplete": "{0} episodios, {1} incompletos",
"LabelNumberOfEpisodes": "N.º de episodios",
"LabelNumberOfEpisodes": "Nº de episodios",
"LabelOff": "Apagado",
"LabelOn": "Encendido",
"LabelPassword": "Contraseña",
@@ -218,16 +223,16 @@
"LabelPlaybackTranscode": "Transcodificar",
"LabelPodcast": "Pódcast",
"LabelPodcasts": "Pódcast",
"LabelPreventIndexing": "Evite que los directorios de pódcast de iTunes y Google indicen su suministro",
"LabelPreventIndexing": "Evite que los directorios de pódcast de iTunes y Google indexen su suministro",
"LabelProgress": "Progreso",
"LabelPubDate": "Fecha de publicación",
"LabelPublishYear": "Año de publicación",
"LabelPublishedDate": "Publicado {0}",
"LabelRSSFeedCustomOwnerEmail": "Correo electrónico de dueño personalizado",
"LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado",
"LabelRSSFeedCustomOwnerEmail": "Correo-e de propietario personalizado",
"LabelRSSFeedCustomOwnerName": "Nombre de propietario personalizado",
"LabelRSSFeedOpen": "Fuente RSS Abierta",
"LabelRSSFeedPreventIndexing": "Evitar indización",
"LabelRSSFeedSlug": "«Slug» de suministro RSS",
"LabelRSSFeedSlug": "Ficha de suministro RSS",
"LabelRandomly": "Aleatorio",
"LabelRead": "Leído",
"LabelReadAgain": "Volver a leer",
@@ -237,16 +242,17 @@
"LabelScaleElapsedTimeBySpeed": "Escala el tiempo transcurrido según la velocidad",
"LabelSeason": "Temporada",
"LabelSelectADevice": "Seleccione un dispositivo",
"LabelSelectMediaType": "Seleccionar tipo de medio",
"LabelSequenceAscending": "Secuencia ascendente",
"LabelSequenceDescending": "Secuencia descendente",
"LabelSeries": "Serie",
"LabelSeries": "Series",
"LabelServerAddress": "Dirección del servidor",
"LabelSetEbookAsPrimary": "Establecer como primario",
"LabelSetEbookAsSupplementary": "Establecer como suplementario",
"LabelShakeSensitivity": "Sensibilidad a la sacudida",
"LabelShowAll": "Mostrar todo",
"LabelSize": "Tamaño",
"LabelSleepTimer": "Temporizador de apagado",
"LabelSleepTimer": "Temporizador de dormida",
"LabelSleepTimerAlmostDoneChime": "Timbrar casi al terminar",
"LabelSleepTimerAlmostDoneChimeHelp": "Reproducir una señal acústica cuando queden 30 segundos en el temporizador",
"LabelStart": "Iniciar",
@@ -287,14 +293,19 @@
"MessageAndroid10Downloads": "Android 10 e inferiores utilizarán el almacenamiento interno de aplicaciones para las descargas.",
"MessageAttemptingServerConnection": "Intentando conectar con el servidor...",
"MessageAudiobookshelfServerNotConnected": "Servidor de Audiobookshelf no conectado",
"MessageAudiobookshelfServerRequired": "<strong>¡Importante!</strong> Esta aplicación está diseñada para trabajar con un servidor Audiobookshelf que usted o alguien que usted conoce es el anfitrión. Esta aplicación no proporciona ningún contenido.",
"MessageAudiobookshelfServerRequired": "<strong>¡Importante!</strong> Esta aplicación está diseñada para trabajar con un servidor Audiobookshelf que o alguien que conozcas es el host. Esta aplicación no proporciona ningún contenido.",
"MessageBookshelfEmpty": "Estantería vacía",
"MessageConfirmAppExit": "¿Desea salir de la aplicación?",
"MessageConfirmDeleteEpisodeDownloadQueue": "¿Seguro que desea vaciar la cola de descarga del episodio?",
"MessageConfirmDeleteLocalEpisode": "¿Quiere eliminar el episodio local «{0}» del dispositivo? El archivo en el servidor no se verá afectado.",
"MessageConfirmDeleteLocalFiles": "¿Quiere quitar los archivos locales de este elemento del dispositivo? Los archivos del servidor y su progreso no se verán afectados.",
"MessageConfirmDeleteServerConfig": "¿Quito esta configuración del servidor?",
"MessageConfirmDeleteServerEpisode": "¿Seguro que desea eliminar el episodio «{0}» desde el servidor?\nAdvertencia: esto eliminará el archivo de sonido.",
"MessageConfirmDisableAutoTimer": "¿Confirma que quiere desactivar el temporizador automático por el resto del día? El temporizador volverá a activarse al final de este periodo de temporizador de apagado automático, o si reinicia la aplicación.",
"MessageConfirmDiscardProgress": "¿Confirma que quiere restablecer su progreso?",
"MessageConfirmDownloadUsingCellular": "Está a punto de efectuar una descarga con datos móviles. Esto puede conllevar tarifas de datos de la operadora. ¿Quiere continuar?",
"MessageConfirmMarkAsFinished": "¿Confirma que quiere marcar este elemento como terminado?",
"MessageConfirmPlaybackTime": "¿Inicio la reproducción para «{0}» en {1}?",
"MessageConfirmRemoveBookmark": "¿Confirma que quiere quitar el marcador?",
"MessageConfirmStreamingUsingCellular": "Está a punto de hacer una transmisión con datos móviles. Esto puede conllevar tarifas de datos de la operadora. ¿Quiere continuar?",
"MessageDiscardProgress": "Descartar progreso",
@@ -332,6 +343,7 @@
"MessageNoUserPlaylists": "No tiene ninguna lista de reproducción",
"MessageOldServerAuthReLoginRequired": "La autenticación se ha mejorado para seguridad en la versión v2.26.0 del servidor. Todos los usuarios deberán reiniciar sesión.",
"MessageOldServerAuthWarning": "El servidor está utilizando un método de autenticación anticuado",
"MessageOldServerAuthWarningHelp": "Este servidor está ejecutando una versión más antigua que la v2.26.0. Ha sido añadido un sistema de autenticación más seguro en v2.26.0. Se recomienda encarecidamente que actualice el servidor a la última versión. Si ya tiene el servidor actualizado, acceda de nuevo para utilizar la autenticación nueva.",
"MessageOldServerConnectionWarning": "La configuración de la conexión al servidor utiliza un identificador de usuario antiguo. Elimine y vuelva a añadir esta conexión al servidor.",
"MessageOldServerConnectionWarningHelp": "Usted configuró originalmente la conexión a este servidor antes de la migración de la base de datos en la versión 2.3.0, publicada en junio de 2023. Una futura actualización del servidor eliminará la posibilidad de iniciar sesión con esta conexión antigua. Por favor, elimine la conexión existente al servidor y conéctese de nuevo (utilizando la misma dirección del servidor y las mismas credenciales). Si tiene algún medio descargado en este dispositivo, será necesario descargarlo de nuevo para sincronizarlo con el servidor.",
"MessagePodcastSearchField": "Introduzca el término de búsqueda o el URL del suministro RSS",
@@ -358,5 +370,7 @@
"ToastPodcastCreateSuccess": "Se creó el pódcast correctamente",
"ToastRSSFeedCloseFailed": "Error al cerrar el suministro RSS",
"ToastRSSFeedCloseSuccess": "Suministro RSS cerrado",
"ToastStreamingNotAllowedOnCellular": "El streaming no está permitido con datos móviles"
"ToastStreamingNotAllowedOnCellular": "El streaming no está permitido con datos móviles",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+14 -1
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Poglavlja",
"HeaderCollection": "Zbirka",
"HeaderCollectionItems": "Stavke u zbirci",
"HeaderConfirm": "Potvrdi",
"HeaderConnectionStatus": "Stanje veze",
"HeaderDataSettings": "Podatkovne postavke",
"HeaderDetails": "Pojedinosti",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Nedavne sesije",
"HeaderTableOfContents": "Sadržaj",
"HeaderUserInterfaceSettings": "Postavke korisničkog sučelja",
"HeaderWelcome": "Dobrodošao, <strong>{0}</strong>",
"HeaderYourStats": "Vaša statistika",
"LabelAddToPlaylist": "Dodaj na popis za izvođenje",
"LabelAddedAt": "Dodano",
@@ -178,6 +180,9 @@
"LabelLayout": "Prikaz",
"LabelLayoutAuto": "Automatski",
"LabelLayoutSinglePage": "Jedna stranica",
"LabelLibrarySortByProgress": "Napredak: Zadnje ažuriranje",
"LabelLibrarySortByProgressFinished": "Napredak: Završeno",
"LabelLibrarySortByProgressStarted": "Napredak: Započeto",
"LabelLight": "Lagano",
"LabelLineSpacing": "Razmak između redaka",
"LabelListenAgain": "Ponovno poslušaj",
@@ -237,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Prilagodi preostalo vrijeme brzini izvođenja",
"LabelSeason": "Sezona",
"LabelSelectADevice": "Odabir uređaja",
"LabelSelectMediaType": "Odaberi vrstu medija",
"LabelSequenceAscending": "Redoslijed uzlazno",
"LabelSequenceDescending": "Redoslijed silazno",
"LabelSeries": "Serijal",
@@ -289,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Poslužitelj Audiobookshelf nije povezan",
"MessageAudiobookshelfServerRequired": "<strong>Važno!</strong> Ova je aplikacija predviđena za rad s poslužiteljem Audiobookshelf na vašem poslužitelju kojim upravljate vi ili netko koga znate. Ova aplikacija ne nudi nikakav sadržaj.",
"MessageBookshelfEmpty": "Polica s knjigama je prazna",
"MessageConfirmAppExit": "Želiš izaći iz aplikacije?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Sigurno želiš izbrisati red čekanja za preuzimanje epizode?",
"MessageConfirmDeleteLocalEpisode": "Želite li ukloniti preuzeti nastavak \"{0}\" sa svog uređaja? Ovo ne utječe na datoteku na poslužitelju.",
"MessageConfirmDeleteLocalFiles": "Želite li ukloniti preuzete datoteke ove stavke sa svog uređaja? Ovo ne utječe na datoteke na poslužitelju niti na vaš napredak.",
"MessageConfirmDeleteServerConfig": "Ukloniti ovu konfiguraciju poslužitelja?",
"MessageConfirmDeleteServerEpisode": "Sigurno želiš izbrisati epizodu \"{0}\" sa servera?\nUpozorenje: Ovim će se izbrisati audio datoteka.",
"MessageConfirmDisableAutoTimer": "Sigurno želite onemogućiti automatski timer do kraja dana? Timer će se ponovno aktivirati po isteku trenutnog automatskog timera ili ako ponovno pokrenete aplikaciju.",
"MessageConfirmDiscardProgress": "Sigurno želite resetirati napredak?",
"MessageConfirmDownloadUsingCellular": "Spremate se pokrenuti preuzimanje koristeći mobilne podatke. Ovo može uzrokovati dodatne troškove. Želite li nastaviti?",
"MessageConfirmMarkAsFinished": "Sigurno želite označiti ovu stavku kao završenu?",
"MessageConfirmPlaybackTime": "Započeti reprodukciju za \"{0}\" u {1}?",
"MessageConfirmRemoveBookmark": "Sigurno želite ukloniti knjižnu oznaku?",
"MessageConfirmStreamingUsingCellular": "Pokrenut ćete strujanje korištenjem mobilnih podataka. Ovo može uzrokovati dodatne troškove. Želite li nastaviti?",
"MessageDiscardProgress": "Zanemari napredak",
@@ -359,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast uspješno izrađen",
"ToastRSSFeedCloseFailed": "Zatvaranje RSS izvora nije uspjelo",
"ToastRSSFeedCloseSuccess": "RSS izvor zatvoren",
"ToastStreamingNotAllowedOnCellular": "Strujanje korištenjem mobilnih podataka onemogućeno je"
"ToastStreamingNotAllowedOnCellular": "Strujanje korištenjem mobilnih podataka onemogućeno je",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+8 -8
View File
@@ -88,7 +88,7 @@
"HeaderSettings": "Beállítások",
"HeaderSleepTimer": "Alvásidőzítő",
"HeaderSleepTimerSettings": "Alvásidőzítő beállításai",
"HeaderStatsMinutesListeningChart": "Hallgatási grafikon percekben (az elmúlt 7 napból)",
"HeaderStatsMinutesListeningChart": "Hallgatási grafikon percben (az elmúlt 7 napból)",
"HeaderStatsRecentSessions": "Legutóbbi munkamenetek",
"HeaderTableOfContents": "Tartalomjegyzék",
"HeaderUserInterfaceSettings": "Felhasználói felület beállításai",
@@ -129,7 +129,7 @@
"LabelCustomTime": "Egyéni idő",
"LabelDescription": "Leírás",
"LabelDisableAudioFadeOut": "Hang fokozatos csendesítés letiltása",
"LabelDisableAudioFadeOutHelp": "Az audio hangerő csökkenése kezdődik, amikor kevesebb, mint 1 perc marad az alvásidőzítőből. Engedélyezze ezt a beállítást, hogy ne csendesedjen el fokozatosan a hang.",
"LabelDisableAudioFadeOutHelp": "A hangerő csökkenni kezd az alvásidőzítő utolsó percében. Kapcsold be ezt a beállítást a halkítás kikapcsolásához.",
"LabelDisableAutoRewind": "Automatikus visszatekerés letiltása",
"LabelDisableShakeToReset": "Rázás a visszaállításhoz letiltása",
"LabelDisableShakeToResetHelp": "Ha az időzítő futása alatt vagy az időzítő lejárta előtti 2 percben megrázza az eszközt, az alvásidőzítő visszaáll. Engedélyezze ezt a beállítást a rázásra történő visszaállítás letiltásához.",
@@ -259,10 +259,10 @@
"LabelStartTime": "Kezdési idő",
"LabelStatsBestDay": "Legjobb nap",
"LabelStatsDailyAverage": "Napi átlag",
"LabelStatsDays": "Napok",
"LabelStatsDaysListened": "Hallgatással töltött napok",
"LabelStatsDays": "Nap",
"LabelStatsDaysListened": "Hallgatással töltött nap",
"LabelStatsInARow": "egymás után",
"LabelStatsItemsFinished": "Befejezett elemek",
"LabelStatsItemsFinished": "Befejezett elem",
"LabelStatsMinutes": "perc",
"LabelStatsMinutesListening": "Hallgatás percekben",
"LabelStatsWeekListening": "Heti hallgatás",
@@ -300,7 +300,7 @@
"MessageConfirmDeleteLocalEpisode": "\"{0}\" helyi epizód eltávolítása az eszközről? A szerveren lévő fájl nem érintett.",
"MessageConfirmDeleteLocalFiles": "Ezen elem helyi fájljainak eltávolítása az eszközről? A szerveren lévő fájlok és a haladás nem érintettek.",
"MessageConfirmDeleteServerConfig": "Eltávolítja ezt a szerverkonfigurációt?",
"MessageConfirmDeleteServerEpisode": "Biztosan törölni szeretnéd a(z) „{0}” epizódot a szerverről?\nFigyelem: ezzel az audi fájl is törlődik.",
"MessageConfirmDeleteServerEpisode": "Biztosan törölni szeretnéd a(z) „{0}” epizódot a szerverről?\nFigyelem: ezzel az audiófájl is törlődik.",
"MessageConfirmDisableAutoTimer": "Biztos, hogy a mai nap hátralévő részére ki akarja kapcsolni az automatikus időzítőt? Az időzítő újra aktiválódik az automatikus alvásidőzítő időszak végén, vagy ha újraindítja az alkalmazást.",
"MessageConfirmDiscardProgress": "Biztosan alaphelyzetbe akarja állítani a haladást?",
"MessageConfirmDownloadUsingCellular": "Mobiladat-hálózaton keresztül készülsz letölteni. Ez adatforgalmi díjakkal járhat. Szeretnéd folytatni?",
@@ -323,11 +323,11 @@
"MessageLoadingServerData": "Szerveradatok betöltése...",
"MessageLocalFolderDescription": "A „Belső alkalmazás-tároló” csak ezzel az alkalmazással érhető el. Ez az alkalmazás csak a közvetlenül az alkalmazáson keresztül letöltött médiát támogatja. A megosztott tároló mappák segítségével más alkalmazások is hozzáférhetnek az alkalmazás által letöltött médiához.",
"MessageMarkAsFinished": "Befejezettnek jelölés",
"MessageMediaLinkedToADifferentServer": "A média egy másik címen található Audiobookshelf szerverhez kapcsolódik ({0}). A haladás szinkronizálva lesz, amikor csatlakozik ehhez a szervercímhez.",
"MessageMediaLinkedToADifferentServer": "A média egy másik címen ({0}) lévő Audiobookshelf szerverhez van kapcsolva. A folyamatjelölés akkor lesz szinkronizálva, amikor ehhez a szervercímhez csatlakozik.",
"MessageMediaLinkedToADifferentUser": "A média ehhez a szerverhez kapcsolódik, de egy másik felhasználó töltötte le. A haladás csak a letöltést végrehajtó felhasználóhoz lesz szinkronizálva.",
"MessageMediaLinkedToServer": "Szerverhez kapcsolt {0}",
"MessageMediaLinkedToThisServer": "A letöltött média ehhez a szerverhez kapcsolódik",
"MessageMediaNotLinkedToServer": "A média nem kapcsolódik egy Audiobookshelf szerverhez. Nem lesz szinkronizálva a haladás.",
"MessageMediaNotLinkedToServer": "A média nincs Audiobookshelf szerverhez kapcsolva. A folyamatjelölés nem lesz szinkronizálva.",
"MessageNoBookmarks": "Nincsenek könyvjelzők",
"MessageNoChapters": "Nincsenek fejezetek",
"MessageNoCollections": "Nincs gyűjtemény",
+16 -3
View File
@@ -50,7 +50,7 @@
"ButtonSendEbookToDevice": "Invia il libro al dispositivo",
"ButtonSeries": "Serie",
"ButtonSetTimer": "Imposta Timer",
"ButtonStream": "Stream",
"ButtonStream": "Flusso",
"ButtonSubmit": "Invia",
"ButtonSwitchServerUser": "Cambia Server/Utente",
"ButtonUnmaskServerAddress": "Mostra l'indirizzo server",
@@ -63,6 +63,7 @@
"HeaderChapters": "Capitoli",
"HeaderCollection": "Raccolta",
"HeaderCollectionItems": "Elementi della raccolta",
"HeaderConfirm": "Conferma",
"HeaderConnectionStatus": "Stato connessione",
"HeaderDataSettings": "Impostazioni dei dati",
"HeaderDetails": "Dettagli",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Sessioni Recenti",
"HeaderTableOfContents": "Indice",
"HeaderUserInterfaceSettings": "Impostazioni interfaccia utente",
"HeaderWelcome": "Benvenuto, <strong>{0}</strong>",
"HeaderYourStats": "Statistiche personali",
"LabelAddToPlaylist": "Aggiungi alla playlist",
"LabelAddedAt": "Aggiunto il",
@@ -178,6 +180,9 @@
"LabelLayout": "Disposizione",
"LabelLayoutAuto": "Automatico",
"LabelLayoutSinglePage": "Pagina singola",
"LabelLibrarySortByProgress": "Progresso: ultimo aggiornamento",
"LabelLibrarySortByProgressFinished": "Progresso: finito",
"LabelLibrarySortByProgressStarted": "Progresso: iniziato",
"LabelLight": "Leggera",
"LabelLineSpacing": "Interlinea",
"LabelListenAgain": "Ascolta ancora",
@@ -237,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Scala il tempo trascorso in base alla velocità",
"LabelSeason": "Stagione",
"LabelSelectADevice": "Seletiona dispositivo",
"LabelSelectMediaType": "Seleziona il tipo di supporto",
"LabelSequenceAscending": "Sequenza ascendente",
"LabelSequenceDescending": "Sequenza decrescente",
"LabelSeries": "Serie",
@@ -289,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server non connesso",
"MessageAudiobookshelfServerRequired": "<strong>Importante!</strong> Questa app è progettata per funzionare con un server Audiobookshelf ospitato da te o da qualcuno che conosci. Questa app non fornisce alcun contenuto.",
"MessageBookshelfEmpty": "Scaffale vuoto",
"MessageConfirmAppExit": "Volevi uscire dall'app?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Sei sicuro di voler cancellare la coda di download degli episodi?",
"MessageConfirmDeleteLocalEpisode": "Rimuovi episodi locali \"{0}\" dal tuo dispositivo? i file sul server non verranno toccati.",
"MessageConfirmDeleteLocalFiles": "Rimuovi i file locali dell'oggetto? I file sul server e i progressi non verranno toccati.",
"MessageConfirmDeleteServerConfig": "Rimuovere questa configurazione del server?",
"MessageConfirmDeleteServerEpisode": "Sei sicuro di voler eliminare l'episodio \"{0}\" dal server?\nAttenzione: questa operazione eliminerà il file audio.",
"MessageConfirmDisableAutoTimer": "Vuoi davvero disattivare il timer automatico per il resto della giornata? Il timer verrà riattivato alla fine di questo periodo di spegnimento automatico o se riavvii l'app.",
"MessageConfirmDiscardProgress": "Sei sicuro/sicura di voler ripristinare i tuoi progressi?",
"MessageConfirmDownloadUsingCellular": "Stai per eseguire il download utilizzando la rete dati cellulare. Ciò potrebbe includere addebiti per i dati dell'operatore. Vuoi continuare?",
"MessageConfirmMarkAsFinished": "Sei sicuro/sicura di voler contrassegnare questo elemento come finito?",
"MessageConfirmPlaybackTime": "Avviare la riproduzione per \"{0}\" alle {1}?",
"MessageConfirmRemoveBookmark": "Sei sicuro/sicura di voler rimuovere il segnalibro?",
"MessageConfirmStreamingUsingCellular": "Stai per eseguire lo streaming utilizzando la rete dati. Ciò potrebbe includere addebiti per i dati dell'operatore. Vuoi continuare?",
"MessageDiscardProgress": "Elimina i progressi",
@@ -323,7 +334,7 @@
"MessageNoItems": "Nessun oggetto",
"MessageNoItemsFound": "Nessun oggetto trovato",
"MessageNoListeningSessions": "Nessuna sessione di ascolto",
"MessageNoLogs": "Nessun registro",
"MessageNoLogs": "Nessun rapporto",
"MessageNoMediaFolders": "Nessuna cartella media",
"MessageNoNetworkConnection": "Nessuna connessione di rete",
"MessageNoPodcastsFound": "Nessun podcast trovato",
@@ -359,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast creato correttamente",
"ToastRSSFeedCloseFailed": "Errore chiusura flusso RSS",
"ToastRSSFeedCloseSuccess": "Flusso RSS chiuso",
"ToastStreamingNotAllowedOnCellular": "Lo streaming non è consentito sui dati mobili"
"ToastStreamingNotAllowedOnCellular": "Lo streaming non è consentito sui dati mobili",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+103 -22
View File
@@ -40,7 +40,7 @@
"ButtonPlayEpisode": "エピソードを再生",
"ButtonPlaylists": "プレイリスト",
"ButtonRead": "読む",
"ButtonReadLess": "閉じる",
"ButtonReadLess": "少なく表示",
"ButtonReadMore": "もっと見る",
"ButtonRemove": "削除",
"ButtonRemoveFromServer": "サーバーから削除",
@@ -88,7 +88,7 @@
"HeaderSettings": "設定",
"HeaderSleepTimer": "スリープタイマー",
"HeaderSleepTimerSettings": "スリープタイマー設定",
"HeaderStatsMinutesListeningChart": "過去7日間の視聴時間(分)",
"HeaderStatsMinutesListeningChart": "過去7日間のリスニング時間(分)",
"HeaderStatsRecentSessions": "最近の再生履歴",
"HeaderTableOfContents": "目次",
"HeaderUserInterfaceSettings": "画面設定",
@@ -96,7 +96,7 @@
"HeaderYourStats": "再生統計",
"LabelAddToPlaylist": "プレイリストの追加",
"LabelAddedAt": "追加日時",
"LabelAddedDate": "追加日時 ­­{0}",
"LabelAddedDate": "追加日時 {0}",
"LabelAll": "すべて",
"LabelAllowSeekingOnMediaControls": "メディア通知コントロールでの位置情報の取得を許可",
"LabelAlways": "常に",
@@ -104,28 +104,28 @@
"LabelAndroidAutoBrowseLimitForGroupingHelp": "表示項目数がこの数未満の場合、アルファベット順ドローダウンを使用しません",
"LabelAndroidAutoBrowseSeriesSequenceOrder": "シリーズ内の順序",
"LabelAskConfirmation": "確認を求める",
"LabelAuthor": "者",
"LabelAuthorFirstLast": "者(名 氏)",
"LabelAuthorLastFirst": "者(氏 名)",
"LabelAuthors": "者",
"LabelAuthor": "者",
"LabelAuthorFirstLast": "者(名 氏)",
"LabelAuthorLastFirst": "者(氏 名)",
"LabelAuthors": "者",
"LabelAutoDownloadEpisodes": "エピソードの自動ダウンロード",
"LabelAutoRewindTime": "自動巻き戻し時間",
"LabelAutoSleepTimer": "自動スリープタイマー",
"LabelAutoSleepTimerAutoRewind": "スリープタイマー時の自動巻き戻し",
"LabelAutoSleepTimerAutoRewindHelp": "自動スリープタイマーが終了した後、再生を再開すると再生位置が自動的に巻き戻されます。",
"LabelAutoSleepTimerHelp": "指定した開始時刻から終了時刻の間にメディアを再生すると、スリープタイマーが自動的に開始されます。",
"LabelBooks": "ほん",
"LabelByAuthor": " {0}",
"LabelBooks": "",
"LabelByAuthor": "by {0}",
"LabelChapterTrack": "チャプタートラック",
"LabelChapters": "チャプター",
"LabelClosePlayer": "プレヤーを閉じる",
"LabelClosePlayer": "プレヤーを閉じる",
"LabelCollapseSeries": "シリーズを折りたたむ",
"LabelComplete": "完了",
"LabelContinueBooks": "続きを読む本",
"LabelContinueEpisodes": "続きのエピソード",
"LabelContinueListening": "続きからく",
"LabelContinueListening": "続きからく",
"LabelContinueReading": "続きを読む",
"LabelContinueSeries": "シリーズを続",
"LabelContinueSeries": "シリーズを続ける",
"LabelCustomTime": "指定時間",
"LabelDescription": "説明",
"LabelDisableAudioFadeOut": "オーディオフェードアウトを無効",
@@ -140,8 +140,8 @@
"LabelDownloadUsingCellular": "モバイル通信を使用してダウンロード",
"LabelDownloaded": "ダウンロード完了",
"LabelDuration": "長さ",
"LabelEbook": "Eブック",
"LabelEbooks": "Eブック",
"LabelEbook": "電子書籍",
"LabelEbooks": "電子書籍",
"LabelEnable": "有効",
"LabelEnableMp3IndexSeeking": "mp3インデックス検索を有効化",
"LabelEnableMp3IndexSeekingHelp": "この設定は、正しくシークできないMP3ファイルがある場合にのみ有効にしてください。シークの不正確さは、可変ビットレート(VBR)のMP3ファイルが原因である可能性が高いです。この設定はインデックスシークを強制し、ファイルの読み取り時に時間-バイトマッピングを構築します。大きなMP3ファイルの場合、ファイルの終わり付近をシークする際に遅延が生じる場合があります。",
@@ -150,13 +150,13 @@
"LabelEndTime": "終了時間",
"LabelEpisode": "エピソード",
"LabelExplicit": "露骨な表現",
"LabelFeedURL": "Feed URL",
"LabelFeedURL": "フィードURL",
"LabelFile": "ファイル",
"LabelFileBirthtime": "ファイル作成日時",
"LabelFileModified": "ファイル更新日時",
"LabelFilename": "ファイル名",
"LabelFinished": "完了",
"LabelFolder": "フォルダ",
"LabelFolder": "フォルダ",
"LabelFontBoldness": "フォントの太さ",
"LabelFontFamily": "フォントファミリー",
"LabelFontFamilySans": "サン",
@@ -165,8 +165,8 @@
"LabelGenre": "ジャンル",
"LabelGenres": "ジャンル",
"LabelHapticFeedback": "ハプティックフィードバック",
"LabelHasEbook": "eBookあり",
"LabelHasSupplementaryEbook": "付属eBookあり",
"LabelHasEbook": "電子書籍あり",
"LabelHasSupplementaryEbook": "付属電子書籍あり",
"LabelHeavy": "思い",
"LabelHigh": "高い",
"LabelHost": "ホスト",
@@ -178,30 +178,111 @@
"LabelLayout": "レイアウト",
"LabelLayoutAuto": "自動",
"LabelLayoutSinglePage": "単ページ",
"LabelLibrarySortByProgress": "進捗: 最終更新",
"LabelLibrarySortByProgressFinished": "進捗: 完了",
"LabelLibrarySortByProgressStarted": "進捗: 開始済み",
"LabelLight": "ライト",
"LabelLineSpacing": "行間",
"LabelListenAgain": "再度視聴",
"LabelListenAgain": "もう一度聴く",
"LabelLocalBooks": "ローカルブック",
"LabelLocalPodcasts": "ローカルポッドキャスト",
"LabelLockPlayer": "プレイヤーのロック",
"LabelMediaType": "メディアの種類",
"LabelMissing": "消失",
"LabelMore": "多い",
"LabelMoreInfo": "追加情報",
"LabelName": "名",
"LabelName": "名",
"LabelNarrator": "ナレーター",
"LabelNarrators": "ナレーター",
"LabelNavigateWithVolume": "音量キーで操作",
"LabelNavigateWithVolumeWhilePlaying": "再生中に音量キーで操作を許可",
"LabelNavigateWithVolumeWhilePlayingDisabled": "オフ",
"LabelNavigateWithVolumeWhilePlayingEnabled": "オン",
"LabelNewestAuthors": "最新の者",
"LabelNewestAuthors": "最新の者",
"LabelNewestEpisodes": "最新エピソード",
"LabelNotFinished": "未完了",
"LabelNotStarted": "未開始",
"LabelNumEpisodes": "{0} エピソード",
"LabelNumEpisodesIncomplete": "{0} エピソード, {1} 未完了",
"LabelNumberOfEpisodes": "エピソード数",
"LabelPassword": "パスワード",
"LabelPath": "パス",
"LabelPlaybackLocal": "ローカル",
"LabelPodcast": "ポッドキャスト",
"LabelPodcasts": "ポッドキャスト",
"LabelPreventIndexing": "フィードがiTunesおよびGoogleのポッドキャストディレクトリにインデックス登録されるのを防ぎます",
"LabelPublishYear": "公開年"
"LabelProgress": "進捗",
"LabelPubDate": "公開日",
"LabelPublishYear": "公開年",
"LabelPublishedDate": "{0}発行",
"LabelRSSFeedCustomOwnerEmail": "カスタムオーナーメール",
"LabelRSSFeedCustomOwnerName": "カスタムオーナー名",
"LabelRSSFeedOpen": "RSSフィードを公開",
"LabelRSSFeedPreventIndexing": "インデックス化を防止",
"LabelRSSFeedSlug": "RSSフィードスラグ",
"LabelRandomly": "ランダム",
"LabelRead": "読む",
"LabelReadAgain": "もう一度読む",
"LabelRecentSeries": "最近のシリーズ",
"LabelRecentlyAdded": "最近追加",
"LabelSeason": "シーズン",
"LabelSeries": "シリーズ",
"LabelSetEbookAsPrimary": "メインとして設定",
"LabelSetEbookAsSupplementary": "付属として設定",
"LabelShowAll": "すべて表示",
"LabelSize": "サイズ",
"LabelSleepTimer": "スリープタイマー",
"LabelStart": "開始",
"LabelStatsBestDay": "日ごとの最長",
"LabelStatsDailyAverage": "日ごとの平均",
"LabelStatsDays": "日数",
"LabelStatsDaysListened": "聴いた日数",
"LabelStatsInARow": "連続",
"LabelStatsItemsFinished": "完了したアイテム",
"LabelStatsMinutes": "分",
"LabelStatsMinutesListening": "聴いた時間(分)",
"LabelStatsWeekListening": "週間リスニング",
"LabelTag": "タグ",
"LabelTags": "タグ",
"LabelTheme": "テーマ",
"LabelThemeDark": "ダーク",
"LabelThemeLight": "ライト",
"LabelTimeRemaining": "残り{0}",
"LabelTitle": "タイトル",
"LabelTracks": "トラック",
"LabelType": "タイプ",
"LabelUnknown": "不明",
"LabelUser": "ユーザー",
"LabelUsername": "ユーザー名",
"LabelYearReviewHide": "年間振り返りを非表示",
"LabelYearReviewShow": "年間振り返りを表示",
"LabelYourBookmarks": "ブックマーク",
"LabelYourProgress": "進捗状況",
"MessageDownloadingEpisode": "エピソードをダウンロード中",
"MessageEpisodesQueuedForDownload": "{0}件のエピソードがダウンロードキューに追加されました",
"MessageFeedURLWillBe": "フィードURLは {0} になります",
"MessageFetching": "取得中...",
"MessageLoading": "読み込み中...",
"MessageMarkAsFinished": "完了済みにする",
"MessageNoBookmarks": "ブックマークなし",
"MessageNoChapters": "チャプターなし",
"MessageNoCollections": "コレクションなし",
"MessageNoItems": "アイテムなし",
"MessageNoItemsFound": "アイテムが見つかりません",
"MessageNoListeningSessions": "リスニングセッションなし",
"MessageNoPodcastsFound": "ポッドキャストが見つかりません",
"MessageNoUpdatesWereNecessary": "更新は不要でした",
"MessageNoUserPlaylists": "プレイリストがありません",
"MessagePodcastSearchField": "検索キーワードまたはRSSフィードURLを入力",
"MessageReportBugsAndContribute": "バグ報告、機能リクエスト、コントリビューション:",
"NoteRSSFeedPodcastAppsHttps": "警告: ほとんどのポッドキャストアプリはHTTPSのRSSフィードURLが必要です",
"NoteRSSFeedPodcastAppsPubDate": "警告: 1件以上のエピソードに公開日がありません。一部のポッドキャストアプリではこれが必要です。",
"ToastBookmarkCreateFailed": "ブックマークの作成に失敗しました",
"ToastItemMarkedAsFinishedFailed": "完了としてマークするのに失敗しました",
"ToastItemMarkedAsNotFinishedFailed": "未完了としてマークするのに失敗しました",
"ToastPlaylistCreateFailed": "プレイリストの作成に失敗しました",
"ToastPodcastCreateFailed": "ポッドキャストの作成に失敗しました",
"ToastPodcastCreateSuccess": "ポッドキャストを作成しました",
"ToastRSSFeedCloseFailed": "RSSフィードのクローズに失敗しました",
"ToastRSSFeedCloseSuccess": "RSSフィードをクローズしました"
}
+24 -7
View File
@@ -41,7 +41,7 @@
"ButtonPlaylists": "Afspeellijsten",
"ButtonRead": "Lezen",
"ButtonReadLess": "Minder lezen",
"ButtonReadMore": "Meer lezen",
"ButtonReadMore": "Lees meer",
"ButtonRemove": "Verwijder",
"ButtonRemoveFromServer": "Verwijder van server",
"ButtonSave": "Opslaan",
@@ -63,11 +63,12 @@
"HeaderChapters": "Hoofdstukken",
"HeaderCollection": "Collectie",
"HeaderCollectionItems": "Collectie-objecten",
"HeaderConfirm": "Bevestigen",
"HeaderConnectionStatus": "Verbindingsstatus",
"HeaderDataSettings": "Data Instellingen",
"HeaderDataSettings": "Gegevens Instellingen",
"HeaderDetails": "Details",
"HeaderDownloads": "Downloads",
"HeaderEbookFiles": "Ebook bestanden",
"HeaderEbookFiles": "E-book bestanden",
"HeaderEpisodes": "Afleveringen",
"HeaderEreaderSettings": "Ereader-instellingen",
"HeaderLatestEpisodes": "Laatste afleveringen",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Recente sessies",
"HeaderTableOfContents": "Inhoudsopgave",
"HeaderUserInterfaceSettings": "Gebruiker Interface Instellingen",
"HeaderWelcome": "Welkom, <strong>{0}</strong>",
"HeaderYourStats": "Je statistieken",
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
"LabelAddedAt": "Toegevoegd op",
@@ -113,6 +115,7 @@
"LabelAutoSleepTimerAutoRewindHelp": "Wanneer de automatische slaap timer afloop zal het item terugspoelen naar de vorige positie.",
"LabelAutoSleepTimerHelp": "Wanneer er tussen de opgegeven begin- en eindtijd media wordt afgespeeld, start er automatisch een slaaptimer.",
"LabelBooks": "Boeken",
"LabelByAuthor": "door {0}",
"LabelChapterTrack": "Hoofdstuk Track",
"LabelChapters": "Hoofdstukken",
"LabelClosePlayer": "Sluit speler",
@@ -155,6 +158,9 @@
"LabelFinished": "Voltooid",
"LabelFolder": "Map",
"LabelFontBoldness": "Lettertype Dikte",
"LabelFontFamily": "Letterfamilie",
"LabelFontFamilySans": "Sans",
"LabelFontFamilySerif": "Serif",
"LabelFontScale": "Lettertype schaal",
"LabelGenre": "Genre",
"LabelGenres": "Categorieën",
@@ -174,6 +180,9 @@
"LabelLayout": "Layout",
"LabelLayoutAuto": "Automatisch",
"LabelLayoutSinglePage": "Enkele pagina",
"LabelLibrarySortByProgress": "Voortgang: Laatst geüpdatet",
"LabelLibrarySortByProgressFinished": "Voortgang: Voltooid",
"LabelLibrarySortByProgressStarted": "Voortgang: Gestart",
"LabelLight": "Licht",
"LabelLineSpacing": "Regelruimte",
"LabelListenAgain": "Opnieuw Beluisteren",
@@ -233,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Schaal verstreken tijd per snelheid",
"LabelSeason": "Seizoen",
"LabelSelectADevice": "Apparaat Selecteren",
"LabelSelectMediaType": "Selecteer mediatype",
"LabelSequenceAscending": "Sequentie Oplopend",
"LabelSequenceDescending": "Sequentie Aflopend",
"LabelSeries": "Serie",
@@ -285,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server niet geconnecteerd",
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> Deze app is ontworpen om te werken met een Audiobookshelf-server die u of iemand die u kent host. Deze app biedt geen content.",
"MessageBookshelfEmpty": "Boekenplank leeg",
"MessageConfirmDeleteLocalEpisode": "Lokale aflevering \"{0}\" van uw apparaat verwijderen? Het bestand op de server blijft onaangetast.",
"MessageConfirmAppExit": "Wil je de app afsluiten?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Weet je zeker dat je de downloadwachtrij voor afleveringen wilt wissen?",
"MessageConfirmDeleteLocalEpisode": "Lokale aflevering \"{0}\" van uw apparaat verwijderen? Het bestand op de server blijft bewaard.",
"MessageConfirmDeleteLocalFiles": "Lokale bestanden van dit item van uw apparaat verwijderen? De bestanden op de server en uw voortgang worden niet beïnvloed.",
"MessageConfirmDeleteServerConfig": "Verwijder deze server configuratie?",
"MessageConfirmDeleteServerEpisode": "Ben je zeker dat je aflevering “{0}” van de server wil verwijderen?\nWaarschuwing: Dit zal het audiobestand verwijderden.",
"MessageConfirmDisableAutoTimer": "Weet u zeker dat je de automatische timer voor de rest van vandaag wilt uitschakelen? De timer wordt automatisch weer ingeschakeld aan het einde van deze sluimerperiode of als u de app opnieuw start.",
"MessageConfirmDiscardProgress": "Weet u zeker dat u uw voortgang wilt resetten?",
"MessageConfirmDownloadUsingCellular": "U staat op het punt om te downloaden met behulp van mobiele data. Dit kan kosten voor data van de provider met zich meebrengen. Wilt u doorgaan?",
"MessageConfirmMarkAsFinished": "Weet u zeker dat u dit item als voltooid wilt markeren?",
"MessageConfirmPlaybackTime": "Start afspelen van “{0}” op {1}?",
"MessageConfirmRemoveBookmark": "Weet u zeker dat u de bladwijzer wilt verwijderen?",
"MessageConfirmStreamingUsingCellular": "U staat op het punt om te streamen met behulp van mobiele data. Dit kan kosten voor data van de provider met zich meebrengen. Wilt u doorgaan?",
"MessageDiscardProgress": "Voortgang negeren",
@@ -303,7 +318,7 @@
"MessageFetching": "Aan het ophalen...",
"MessageFollowTheProjectOnGithub": "Volg dit project op Github",
"MessageItemDownloadCompleteFailedToCreate": "Itemdownload voltooid, maar het aanmaken van een bibliotheekitem is mislukt",
"MessageItemMissing": "Item ontbreekt en moet opgelost worden op de server. Een item is typisch gemarkeerd als ontbrekend wanneer het file pad niet toegankelijk is.",
"MessageItemMissing": "Item is niet beschikbaar en moet opgelost worden op de server. Meestal is een item gemarkeerd als missend in verband met niet bereikbare bestandspaden.",
"MessageLoading": "Aan het laden...",
"MessageLoadingServerData": "Server data laden...",
"MessageLocalFolderDescription": "'Interne app-opslag' is alleen toegankelijk voor deze app. Deze app ondersteunt alleen media die rechtstreeks via de app is gedownload. Gedeelde opslagmappen kunnen worden gebruikt om andere apps toegang te geven tot media die door deze app zijn gedownload.",
@@ -331,7 +346,7 @@
"MessageOldServerAuthWarningHelp": "Deze server draait een versie ouder dan v2.26.0. Een veiliger authenticatie systeem is geïntroduceerd in v2.26.0. Het wordt met klem aangeraden om de server te updaten naar de laatste versie. Mocht de server al geüpdatet zijn, log dan opnieuw in om het nieuwe authenticatie mechanisme te gebruiken.",
"MessageOldServerConnectionWarning": "Server connectie configuratie gebruikt een oud user ID. Gelieve deze server connectie te verwijderen en opnieuw toe te voegen.",
"MessageOldServerConnectionWarningHelp": "U hebt de verbinding met deze server oorspronkelijk ingesteld vóór de databasemigratie in versie 2.3.0, uitgebracht in juni 2023. Een toekomstige serverupdate zal de mogelijkheid om in te loggen met deze oude verbinding verwijderen. Verwijder de bestaande serververbinding en maak opnieuw verbinding (met hetzelfde serveradres en dezelfde inloggegevens). Als u gedownloade media op dit apparaat hebt, moet u deze opnieuw downloaden om te synchroniseren met de server.",
"MessagePodcastSearchField": "Zoekterm of RSS feed URL invullen",
"MessagePodcastSearchField": "Voer zoekterm of RSS-feed-URL in",
"MessageProgressSyncFailed": "De meest recente poging om je luistervoortgang aan de server te rapporteren is mislukt. Verzoeken om voortgangssynchronisatie worden nog steeds elke 15 seconden tot 1 minuut uitgevoerd terwijl de media wordt afgespeeld.",
"MessageReportBugsAndContribute": "Rapporteer bugs, vraag functionaliteiten aan en draag bij op",
"MessageSeriesAlreadyDownloaded": "Je hebt alle boeken in deze serie al gedownload.",
@@ -355,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast aangemaakt",
"ToastRSSFeedCloseFailed": "Sluiten RSS-feed mislukt",
"ToastRSSFeedCloseSuccess": "RSS-feed gesloten",
"ToastStreamingNotAllowedOnCellular": "Streamen is niet toegstaan via mobiele verbinding"
"ToastStreamingNotAllowedOnCellular": "Streamen is niet toegstaan via mobiele verbinding",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+19 -1
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Kapittel",
"HeaderCollection": "Samlinger",
"HeaderCollectionItems": "Samlingsgjenstander",
"HeaderConfirm": "Bekreft",
"HeaderConnectionStatus": "Tilkoblingsstatus",
"HeaderDataSettings": "Datainnstillinger",
"HeaderDetails": "Detaljer",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Siste sesjoner",
"HeaderTableOfContents": "Innholdsfortegnelse",
"HeaderUserInterfaceSettings": "Innstillinger for Brukergrensesnitt",
"HeaderWelcome": "Velkommen, <strong>{0}</strong>",
"HeaderYourStats": "Din statistikk",
"LabelAddToPlaylist": "Legg til i spilleliste",
"LabelAddedAt": "Lagt Til",
@@ -113,6 +115,7 @@
"LabelAutoSleepTimerAutoRewindHelp": "Når automatisk søvntidsur fullføres og du gjenopptar avspillingen vil posisjonen din automatisk spoles tilbake.",
"LabelAutoSleepTimerHelp": "Ved avspilling av media mellom angitt start og slutt vil automatisk søvntidsur starte automatisk.",
"LabelBooks": "Bøker",
"LabelByAuthor": "av {0}",
"LabelChapterTrack": "Kapittelspor",
"LabelChapters": "Kapitler",
"LabelClosePlayer": "Lukk spiller",
@@ -155,6 +158,9 @@
"LabelFinished": "Fullført",
"LabelFolder": "Mappe",
"LabelFontBoldness": "Skrifttykkelse",
"LabelFontFamily": "Skriftfamilie",
"LabelFontFamilySans": "Sans",
"LabelFontFamilySerif": "Serif",
"LabelFontScale": "Font størrelse",
"LabelGenre": "Sjanger",
"LabelGenres": "Sjangers",
@@ -174,6 +180,9 @@
"LabelLayout": "Utseende",
"LabelLayoutAuto": "Automatisk",
"LabelLayoutSinglePage": "Enkeltside",
"LabelLibrarySortByProgress": "Fremdrift: Sist oppdatert",
"LabelLibrarySortByProgressFinished": "Fremdrift: Fullført",
"LabelLibrarySortByProgressStarted": "Fremdrift: Startet",
"LabelLight": "Lett",
"LabelLineSpacing": "Linjemellomrom",
"LabelListenAgain": "Lytt igjen",
@@ -233,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Skaler forløpt tid etter hastighet",
"LabelSeason": "Sesong",
"LabelSelectADevice": "Velg en enhet",
"LabelSelectMediaType": "Velg medietype",
"LabelSequenceAscending": "Stigende rekkefølge",
"LabelSequenceDescending": "Synkende rekkefølge",
"LabelSeries": "Serier",
@@ -285,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Ikke tilkoblet Audiobookshelf-tjener",
"MessageAudiobookshelfServerRequired": "<strong>Viktig!</strong> Programmet fungerer kun med en Audiobookshelf-tjener som du eller noen annen vertstjener. Programmet tilbyr ikke innhold.",
"MessageBookshelfEmpty": "Tom bokhylle",
"MessageConfirmAppExit": "Vil du avslutte appen?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Er du sikker på at du vil tømme nedlastingskøen for episoder?",
"MessageConfirmDeleteLocalEpisode": "Fjen episoden «{0}» fra enheten? Filen på tjeneren forblir som den er.",
"MessageConfirmDeleteLocalFiles": "Fjern dette elementets filer fra enheten? Filene på tjeneren og framdriften forblir som den er.",
"MessageConfirmDeleteServerConfig": "Fjerne denne serverkonfigurasjonen?",
"MessageConfirmDeleteServerEpisode": "Er du sikker på at du vil slette episoden \"{0}\" fra serveren?\nAdvarsel: Dette vil slette lydfilen.",
"MessageConfirmDisableAutoTimer": "Er du sikker på at du vil slå av den automatiske tidsuret for resten av dagen? Tidsuret vil bli reaktivert på slutten av perioden til dette automatiske søvn-tidsuret, eller hvis du starter appen på nytt.",
"MessageConfirmDiscardProgress": "Er du sikker på at du vil tilbakestille fremdriften din?",
"MessageConfirmDownloadUsingCellular": "Last ned over mobildata selv om kostnader kan tilkomme?",
"MessageConfirmMarkAsFinished": "Er du sikker på at du vil merke element som fullført?",
"MessageConfirmPlaybackTime": "Starte avspilling av \"{0}\" ved {1}?",
"MessageConfirmRemoveBookmark": "Er du sikker på at du vil fjerne bokmerket?",
"MessageConfirmStreamingUsingCellular": "Strøm via mobildata selv om kostnader kan tilkomme?",
"MessageDiscardProgress": "Forkast framdrift",
@@ -298,6 +313,7 @@
"MessageDownloading": "Laster ned …",
"MessageDownloadingEpisode": "Laster ned episode",
"MessageEpisodesQueuedForDownload": "{0} Episode(r) lagt til i kø for nedlasting",
"MessageFailedToRefreshToken": "Klarte ikke å oppdatere token, ny innlogging kreves",
"MessageFeedURLWillBe": "Feed URL vil bli {0}",
"MessageFetching": "Henter...",
"MessageFollowTheProjectOnGithub": "Følg prosjektet på GitHub",
@@ -354,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast opprettet",
"ToastRSSFeedCloseFailed": "Misslykkes å lukke RSS feed",
"ToastRSSFeedCloseSuccess": "RSS feed lukket",
"ToastStreamingNotAllowedOnCellular": "Strømming tillates ikke over mobildata"
"ToastStreamingNotAllowedOnCellular": "Strømming tillates ikke over mobildata",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+18 -6
View File
@@ -32,7 +32,7 @@
"ButtonMaskServerAddress": "Ukryj adres serwera",
"ButtonNewFolder": "Nowy folder",
"ButtonNextEpisode": "Następny odcinek",
"ButtonOk": "Ok",
"ButtonOk": "OK",
"ButtonOpenFeed": "Otwórz feed",
"ButtonOverride": "Nadpisz",
"ButtonPause": "Wstrzymaj",
@@ -63,6 +63,7 @@
"HeaderChapters": "Rozdziały",
"HeaderCollection": "Kolekcja",
"HeaderCollectionItems": "Elementy kolekcji",
"HeaderConfirm": "Potwierdzić",
"HeaderConnectionStatus": "Status połączenia",
"HeaderDataSettings": "Ustawienia danych",
"HeaderDetails": "Szczegóły",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Ostatnie sesje",
"HeaderTableOfContents": "Spis treści",
"HeaderUserInterfaceSettings": "Ustawienia inferfejsu użytkownika",
"HeaderWelcome": "Witaj, <strong>{0}</strong>",
"HeaderYourStats": "Twoje statystyki",
"LabelAddToPlaylist": "Dodaj do playlisty",
"LabelAddedAt": "Dodano",
@@ -113,10 +115,11 @@
"LabelAutoSleepTimerAutoRewindHelp": "Po zakończeniu automatycznego wyłącznika czasowego ponowne odtworzenie elementu spowoduje automatyczne przewinięcie pozycji do tyłu.",
"LabelAutoSleepTimerHelp": "Podczas odtwarzania multimediów między określonym czasem rozpoczęcia i zakończenia automatycznie uruchomi się wyłącznik czasowy.",
"LabelBooks": "Książki",
"LabelByAuthor": "Autor {0}",
"LabelChapterTrack": "Postęp rozdziału",
"LabelChapters": "Rozdziały",
"LabelClosePlayer": "Zamknij odtwarzacz",
"LabelCollapseSeries": "Podsumuj serię",
"LabelCollapseSeries": "Zwiń serię",
"LabelComplete": "Ukończone",
"LabelContinueBooks": "Kontynuuj książki",
"LabelContinueEpisodes": "Kontynuuj odcinki",
@@ -177,6 +180,7 @@
"LabelLayout": "Układ",
"LabelLayoutAuto": "Automatycznie",
"LabelLayoutSinglePage": "Pojedyncza strona",
"LabelLibrarySortByProgress": "Postęp: Ostatnia aktualizacja",
"LabelLibrarySortByProgressFinished": "Postęp: Ukończony",
"LabelLibrarySortByProgressStarted": "Postęp: Rozpoczęty",
"LabelLight": "Jasny",
@@ -238,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Skaluj czas, który upłynął według prędkości",
"LabelSeason": "Sezon",
"LabelSelectADevice": "Wybierz urządzenie",
"LabelSelectMediaType": "Wybierz rodzaj medi",
"LabelSequenceAscending": "Koleność Rosnąca",
"LabelSequenceDescending": "Kolejność Malejąca",
"LabelSeries": "Serie",
@@ -264,7 +269,7 @@
"LabelStreamingUsingCellular": "Transmisja przy użyciu sieci komórkowej",
"LabelTag": "Znacznik",
"LabelTags": "Znaczniki",
"LabelTheme": "Kompozycja",
"LabelTheme": "Motyw",
"LabelThemeBlack": "Czarny",
"LabelThemeDark": "Ciemny",
"LabelThemeLight": "Jasny",
@@ -290,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Brak połączenia z serwerem Audiobookshelf",
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> Ta aplikacja jest przeznaczona do współpracy z serwerem Audiobookshelf, który dostarczasz Ty lub ktoś, kogo znasz. Ta aplikacja nie dostarcza żadnych treści..",
"MessageBookshelfEmpty": "Półka pusta",
"MessageConfirmAppExit": "Czy chcesz zamknąć aplikację?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Czy na pewno chcesz wyczyścić kolejkę pobierania odcinków?",
"MessageConfirmDeleteLocalEpisode": "Usunąć lokalny odcinek \"{0}\" ze swojego urządzenia? Nie będzie to miało wpływu na plik na serwerze.",
"MessageConfirmDeleteLocalFiles": "Usunąć lokalne pliki tego elementu ze swojego urządzenia? Nie będzie to miało wpływu na pliki na serwerze i Twoje postępy.",
"MessageConfirmDisableAutoTimer": "Czy na pewno chcesz wyłączyć automatyczny timer na resztę dnia? Timer zostanie ponownie aktywowany po upływie czasu automatycznego uśpienia lub po ponownym uruchomieniu aplikacji..",
"MessageConfirmDeleteServerConfig": "Usunąć konfigurację tego serwera?",
"MessageConfirmDeleteServerEpisode": "Czy na pewno chcesz usunąć odcinek „{0}” z serwera?\nOstrzeżenie: spowoduje to usunięcie pliku audio.",
"MessageConfirmDisableAutoTimer": "Czy na pewno chcesz wyłączyć automatyczny timer na resztę dnia? Timer zostanie ponownie włączony pod koniec tego okresu automatycznego uśpienia lub po ponownym uruchomieniu aplikacji.",
"MessageConfirmDiscardProgress": "Na pewno chcesz zresetować postęp?",
"MessageConfirmDownloadUsingCellular": "Zamierzasz pobrać poprzez dane komórkowe. Może to wpłynąć na wysokość rachunku. Czy chcesz kontynuować?",
"MessageConfirmMarkAsFinished": "Na pewno chcesz oznaczyć ten element jako ukończony?",
"MessageConfirmPlaybackTime": "Rozpocząć odtwarzanie pliku „{0}” w {1}?",
"MessageConfirmRemoveBookmark": "Na pewno chcesz usunąć zakładkę?",
"MessageConfirmStreamingUsingCellular": "Transmisja strumieniowa będzie odbywać się przy użyciu danych komórkowych. Może to obejmować opłaty za transmisję danych operatora. Czy chcesz kontynuować?",
"MessageDiscardProgress": "Zresetuj postęp",
@@ -337,7 +347,7 @@
"MessageOldServerConnectionWarning": "Konfiguracja połączenia z serwerem używa starego identyfikatora użytkownika. Usuń i dodaj ponownie to połączenie z serwerem.",
"MessageOldServerConnectionWarningHelp": "Połączenie z tym serwerem zostało pierwotnie skonfigurowane przed migracją bazy danych w wersji 2.3.0, wydanej w czerwcu 2023 r. Przyszła aktualizacja serwera usunie możliwość logowania się przy użyciu tego starego połączenia. Usuń istniejące połączenie z serwerem i połącz się ponownie (używając tego samego adresu serwera i danych logowania). Jeśli na tym urządzeniu znajdują się pobrane pliki multimedialne, konieczne będzie ich ponowne pobranie w celu synchronizacji z serwerem.",
"MessagePodcastSearchField": "Wprowadź wyszukiwane hasło lub adres URL kanału RSS",
"MessageProgressSyncFailed": "Ostatnia próba zgłoszenia postępów słuchania do serwera nie powiodła się. Żądania synchronizacji postępu będą wysyłane co 15 sekund do 1 minuty podczas odtwarzania multimediów.",
"MessageProgressSyncFailed": "Ostatnia próba zgłoszenia postępu słuchania do serwera nie powiodła się. Żądania synchronizacji postępu będą nadal podejmowane co 15 sekund do 1 minuty podczas odtwarzania multimediów.",
"MessageReportBugsAndContribute": "Zgłoś błędy, pomysły i pomóż rozwijać aplikację na",
"MessageSeriesAlreadyDownloaded": "Seria książek już pobrana.",
"MessageSeriesDownloadConfirm": "Pobrać serię?",
@@ -360,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast został pomyślnie utworzony",
"ToastRSSFeedCloseFailed": "Zamknięcie kanału RSS nie powiodło się",
"ToastRSSFeedCloseSuccess": "Zamknięcie kanału RSS powiodło się",
"ToastStreamingNotAllowedOnCellular": "Transmisja nie jest dozwolona w przy użyciu danych komórkowych"
"ToastStreamingNotAllowedOnCellular": "Transmisja nie jest dozwolona w przy użyciu danych komórkowych",
"UnitMinutesShort": "{0}min",
"UnitSecondsShort": "{0}sek"
}
+21 -4
View File
@@ -23,7 +23,7 @@
"ButtonGoToWebClient": "Deschide în browse",
"ButtonHistory": "Istoric",
"ButtonHome": "Acasă",
"ButtonIssues": "Erori",
"ButtonIssues": "Probleme",
"ButtonLatest": "Noutăți",
"ButtonLibrary": "Bibliotecă",
"ButtonLocalMedia": "Media locală",
@@ -40,7 +40,7 @@
"ButtonPlayEpisode": "Redă episodul",
"ButtonPlaylists": "Liste",
"ButtonRead": "Citește",
"ButtonReadLess": "Mai puțin",
"ButtonReadLess": "Citește Mai Puțin",
"ButtonReadMore": "Afișează mai mult",
"ButtonRemove": "Elimină",
"ButtonRemoveFromServer": "Elimină de pe server",
@@ -63,6 +63,7 @@
"HeaderChapters": "Capitole",
"HeaderCollection": "Colecție",
"HeaderCollectionItems": "Conținutul colecției",
"HeaderConfirm": "Confirmă",
"HeaderConnectionStatus": "Starea conexiunii",
"HeaderDataSettings": "Configurare date",
"HeaderDetails": "Detalii",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Sesiuni recente",
"HeaderTableOfContents": "Cuprins",
"HeaderUserInterfaceSettings": "Setări interfață",
"HeaderWelcome": "Bun venit, <strong>{0}</strong>",
"HeaderYourStats": "Progresul tău",
"LabelAddToPlaylist": "Adaugă în listă",
"LabelAddedAt": "Adăugat la",
@@ -113,6 +115,7 @@
"LabelAutoSleepTimerAutoRewindHelp": "Când timerul de somn se termină, la reluarea redării vei fi mutat automat puțin înapoi.",
"LabelAutoSleepTimerHelp": "Când redai media între orele specificate, se va porni automat timerul de somn.",
"LabelBooks": "Cărți",
"LabelByAuthor": "de {0}",
"LabelChapterTrack": "Marcaje capitole",
"LabelChapters": "Capitole",
"LabelClosePlayer": "Închide playerul",
@@ -147,7 +150,7 @@
"LabelEndTime": "Oră de sfârșit",
"LabelEpisode": "Episod",
"LabelExplicit": "Explicit",
"LabelFeedURL": "URL flux",
"LabelFeedURL": "Flux URL",
"LabelFile": "Fișier",
"LabelFileBirthtime": "Data creării fișierului",
"LabelFileModified": "Fișier modificat",
@@ -155,6 +158,9 @@
"LabelFinished": "Finalizat",
"LabelFolder": "Dosar",
"LabelFontBoldness": "Grosimea fontului",
"LabelFontFamily": "Familia Fontului",
"LabelFontFamilySans": "Sans",
"LabelFontFamilySerif": "Serif",
"LabelFontScale": "Mărimea fontului",
"LabelGenre": "Gen",
"LabelGenres": "Genuri",
@@ -174,6 +180,9 @@
"LabelLayout": "Aspect",
"LabelLayoutAuto": "Automat",
"LabelLayoutSinglePage": "Pagină unică",
"LabelLibrarySortByProgress": "Progres: Ultima Actualizare",
"LabelLibrarySortByProgressFinished": "Progres: Finalizat",
"LabelLibrarySortByProgressStarted": "Progres: Început",
"LabelLight": "Deschis",
"LabelLineSpacing": "Spațiere între rânduri",
"LabelListenAgain": "Ascultă din nou",
@@ -233,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Ajustează timpul scurs după viteză",
"LabelSeason": "Sezon",
"LabelSelectADevice": "Alege un dispozitiv",
"LabelSelectMediaType": "Alege tipul suportului media",
"LabelSequenceAscending": "Ordine crescătoare",
"LabelSequenceDescending": "Ordine descrescătoare",
"LabelSeries": "Serii",
@@ -285,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Serverul Audiobookshelf nu este conectat",
"MessageAudiobookshelfServerRequired": "<strong>Important!</strong> Această aplicație este proiectată să funcționeze cu un server Audiobookshelf găzduit de tine sau de cineva cunoscut. Aplicația nu oferă conținut propriu.",
"MessageBookshelfEmpty": "Raftul este gol",
"MessageConfirmAppExit": "Doriți să ieșiti din aplicație?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Sunteți sigur că doriți să goliți coada de descărcări a episoadelor?",
"MessageConfirmDeleteLocalEpisode": "Ștergi episodul local „{0}” de pe dispozitiv? Fișierul de pe server nu va fi afectat.",
"MessageConfirmDeleteLocalFiles": "Ștergi fișierele locale ale acestui element de pe dispozitiv? Fișierele de pe server și progresul nu vor fi afectate.",
"MessageConfirmDeleteServerConfig": "Stergeți această configurație a serverului?",
"MessageConfirmDeleteServerEpisode": "Sunteți sigur că doriți să ștergeți episodul \"{0}\" de pe server?\nAtenție: Această acțiune va șterge fișierul audio.",
"MessageConfirmDisableAutoTimer": "Sigur vrei să dezactivezi timerul automat pentru restul zilei? Acesta va fi reactivat la finalul perioadei de somn automat sau când repornești aplicația.",
"MessageConfirmDiscardProgress": "Ești sigur că vrei să îți resetezi progresul?",
"MessageConfirmDownloadUsingCellular": "Urmează să descarci folosind date mobile. Acest lucru poate genera costuri suplimentare. Vrei să continui?",
"MessageConfirmMarkAsFinished": "Sigur vrei să marchezi acest element ca finalizat?",
"MessageConfirmPlaybackTime": "Porniți redarea pentru \"{0}\" la \"{1}\"?",
"MessageConfirmRemoveBookmark": "Sigur vrei să ștergi semnul de carte?",
"MessageConfirmStreamingUsingCellular": "Urmează să redai online folosind date mobile. Acest lucru poate genera costuri suplimentare. Vrei să continui?",
"MessageDiscardProgress": "Resetează progresul",
@@ -355,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast creat cu succes",
"ToastRSSFeedCloseFailed": "Nu s-a putut închide fluxul RSS",
"ToastRSSFeedCloseSuccess": "Flux RSS închis",
"ToastStreamingNotAllowedOnCellular": "Redarea online nu este permisă pe date mobile"
"ToastStreamingNotAllowedOnCellular": "Redarea online nu este permisă pe date mobile",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+15 -2
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Главы",
"HeaderCollection": "Коллекция",
"HeaderCollectionItems": "Элементы коллекции",
"HeaderConfirm": "Подтвердить",
"HeaderConnectionStatus": "Состояние подключения",
"HeaderDataSettings": "Настройки данных",
"HeaderDetails": "Подробности",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Последние сеансы",
"HeaderTableOfContents": "Содержание",
"HeaderUserInterfaceSettings": "Настройки интерфейса",
"HeaderWelcome": "Добро пожаловать,<strong>{0}</strong>",
"HeaderYourStats": "Ваша статистика",
"LabelAddToPlaylist": "Добавить в плейлист",
"LabelAddedAt": "Дата добавления",
@@ -163,7 +165,7 @@
"LabelGenre": "Жанр",
"LabelGenres": "Жанры",
"LabelHapticFeedback": "Тактильная отдача",
"LabelHasEbook": "Есть e-книга",
"LabelHasEbook": "Есть электронная книга",
"LabelHasSupplementaryEbook": "Есть дополнительная e-книга",
"LabelHeavy": "Тяжелый",
"LabelHigh": "Сильно",
@@ -178,6 +180,9 @@
"LabelLayout": "Макет",
"LabelLayoutAuto": "Авто",
"LabelLayoutSinglePage": "Одна страница",
"LabelLibrarySortByProgress": "Прогресс: Последнее обновление",
"LabelLibrarySortByProgressFinished": "Прогресс: Закончена",
"LabelLibrarySortByProgressStarted": "Прогресс: Начата",
"LabelLight": "Подсветка",
"LabelLineSpacing": "Межстрочный интервал",
"LabelListenAgain": "Послушать снова",
@@ -237,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Масштабирование затраченного времени по скорости",
"LabelSeason": "Сезон",
"LabelSelectADevice": "Выбор девайса",
"LabelSelectMediaType": "Выберите тип медиа",
"LabelSequenceAscending": "Последовательность по возрастанию",
"LabelSequenceDescending": "Последовательность по убыванию",
"LabelSeries": "Серия",
@@ -289,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Сервер Audiobookshelf не подключен",
"MessageAudiobookshelfServerRequired": "<strong>Важно!</strong> Это приложение предназначено для работы с сервером Audiobookshelf, который размещаете вы или кто-то из ваших знакомых. Это приложение не предоставляет никакого контента.",
"MessageBookshelfEmpty": "Книжная полка пуста",
"MessageConfirmAppExit": "Выйти из приложения?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Вы точно хотите очистить очередь загрузки выпусков?",
"MessageConfirmDeleteLocalEpisode": "Удалить локальный выпуск \"{0}\" с вашего устройства? Файл на сервере не будет затронут.",
"MessageConfirmDeleteLocalFiles": "Удалить локальные файлы этого элемента с вашего устройства? Это не повлияет на файлы на сервере и ваш прогресс.",
"MessageConfirmDeleteServerConfig": "Удалить эту конфигурацию сервера?",
"MessageConfirmDeleteServerEpisode": "Вы точно хотите удалить выпуск \"{0}\" с сервера?\nВнимание! Это физически удалит аудиофайл.",
"MessageConfirmDisableAutoTimer": "Вы уверены, что хотите отключить автоматический таймер до конца сегодняшнего дня? Таймер будет снова включен по истечении этого периода автоматического отключения или если вы перезапустите приложение.",
"MessageConfirmDiscardProgress": "Вы уверены, что хотите сбросить свой прогресс?",
"MessageConfirmDownloadUsingCellular": "Вы собираетесь выполнить загрузку с помощью сотовых данных. Это может включать плату за передачу данных оператором. Хотите продолжить?",
"MessageConfirmMarkAsFinished": "Вы уверены, что хотите пометить этот элемент как завершенный?",
"MessageConfirmPlaybackTime": "Начать воспроизведение \"{0}\" с {1}?",
"MessageConfirmRemoveBookmark": "Вы уверены, что хотите удалить закладку?",
"MessageConfirmStreamingUsingCellular": "Вы собираетесь вести потоковую передачу с использованием сотовых данных. Это может включать плату за передачу данных оператором. Хотите продолжить?",
"MessageDiscardProgress": "Отбросить прогресс",
@@ -359,5 +370,7 @@
"ToastPodcastCreateSuccess": "Подкаст успешно создан",
"ToastRSSFeedCloseFailed": "Не удалось закрыть RSS-ленту",
"ToastRSSFeedCloseSuccess": "RSS-лента закрыта",
"ToastStreamingNotAllowedOnCellular": "Потоковая передача данных по сотовой сети запрещена"
"ToastStreamingNotAllowedOnCellular": "Потоковая передача данных по сотовой сети запрещена",
"UnitMinutesShort": "{0}м",
"UnitSecondsShort": "{0}с"
}
+17 -4
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Kapitoly",
"HeaderCollection": "Zbierky",
"HeaderCollectionItems": "Položky zbierky",
"HeaderConfirm": "Potvrď",
"HeaderConnectionStatus": "Stav pripojenia",
"HeaderDataSettings": "Nastavenie dát",
"HeaderDetails": "Podrobnosti",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Nedávne relácie",
"HeaderTableOfContents": "Obsah",
"HeaderUserInterfaceSettings": "Nastavenia používateľského rozhrania",
"HeaderWelcome": "Vitajte, <strong>{0}</strong>",
"HeaderYourStats": "Vaše štatistiky",
"LabelAddToPlaylist": "Pridať do playlistu",
"LabelAddedAt": "Pridané",
@@ -113,7 +115,7 @@
"LabelAutoSleepTimerAutoRewindHelp": "Keď Auto časovač spánku skončí, pred nasledujúcim prehratím položky sa prehrávanie automaticky posunie.",
"LabelAutoSleepTimerHelp": "keď sa prehrávanie začne vo vymedzenom časovom intervale, časovač spánku sa automaticky spustí tiež.",
"LabelBooks": "Knihy",
"LabelByAuthor": "od",
"LabelByAuthor": "od {0}",
"LabelChapterTrack": "Zvuková stopa kapitoly",
"LabelChapters": "Kapitoly",
"LabelClosePlayer": "Zavrieť prehrávač",
@@ -156,7 +158,7 @@
"LabelFinished": "Ukončené",
"LabelFolder": "Priečinok",
"LabelFontBoldness": "Hrúbka písma",
"LabelFontFamily": "Písmo",
"LabelFontFamily": "písmo",
"LabelFontFamilySans": "Sans",
"LabelFontFamilySerif": "Serif",
"LabelFontScale": "Veľkosť písma",
@@ -178,6 +180,9 @@
"LabelLayout": "Rozloženie",
"LabelLayoutAuto": "Auto",
"LabelLayoutSinglePage": "Jedna stránka",
"LabelLibrarySortByProgress": "Stav: Naposledy aktualizované",
"LabelLibrarySortByProgressFinished": "Stav: Dokončené",
"LabelLibrarySortByProgressStarted": "Stav: Začal",
"LabelLight": "Svetlá",
"LabelLineSpacing": "Riadkovanie",
"LabelListenAgain": "Počúvať znova",
@@ -219,7 +224,7 @@
"LabelPodcast": "Podcast",
"LabelPodcasts": "Podcasty",
"LabelPreventIndexing": "Zabráni indexácii vašich zdrojov službami iTunes a Google podcast directories",
"LabelProgress": "Stav",
"LabelProgress": "Aktuálny stav",
"LabelPubDate": "Dátum publikovania",
"LabelPublishYear": "Rok vydania",
"LabelPublishedDate": "Vydané {0}",
@@ -237,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Zmeniť ubehnutý čas podľa rýchlosti",
"LabelSeason": "Sezóna",
"LabelSelectADevice": "Vyberte zariadenie",
"LabelSelectMediaType": "Vybrať typ média",
"LabelSequenceAscending": "Vzostupné poradie",
"LabelSequenceDescending": "Zostupné poradie",
"LabelSeries": "Série",
@@ -289,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Audiobookshelf server nie je pripojený",
"MessageAudiobookshelfServerRequired": "<strong>Dôležité!</strong> Táto aplikácia je navrhnutá na fungovanie so Audiobookshelf serverom, ktorý patrí vám alebo niekomu inému. Táto aplikácia sama o sebe neposkytuje žiadny obsah.",
"MessageBookshelfEmpty": "Polička je prázdna",
"MessageConfirmAppExit": "Chceli ste ukončiť aplikáciu?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Naozaj chcete vymazať frontu sťahovania epizód?",
"MessageConfirmDeleteLocalEpisode": "Želáte si odstrániť lokálnu epizódu \"{0}\" z vášho zariadenia? Súbor na serveri zostane nezmenený.",
"MessageConfirmDeleteLocalFiles": "Želáte si odstrániť z vášho zariadenia lokálne súbory patriace k tejto položke? Súbory na serveri a váš aktuálny stav počúvania zostanú nezmenené.",
"MessageConfirmDeleteServerConfig": "Odstrániť túto konfiguráciu servera?",
"MessageConfirmDeleteServerEpisode": "Naozaj chcete odstrániť epizódu „{0}“ zo servera?\nUpozornenie: Týmto sa vymaže aj zvukový súbor.",
"MessageConfirmDisableAutoTimer": "Ste si istí, že chcete vypnúť automatický časovač pre zvyšok dnešného dňa? Časovač sa znova zapne na konci nastavenej doby pre automatický časovač spánku alebo pri reštarte aplikácie.",
"MessageConfirmDiscardProgress": "Ste si istý, že chcete resetovať váš aktuálny stav počúvania?",
"MessageConfirmDownloadUsingCellular": "Chystáte sa sťahovať pri používaní mobilných dát. Toto môže mať za následok zvýšené poplatky u vášho poskytovateľ mobilnej siete. Chcete pokračovať?",
"MessageConfirmMarkAsFinished": "Ste si istý, že chcete označiť túto položku ako dokončenú?",
"MessageConfirmPlaybackTime": "Spustiť prehrávanie „{0}“ od {1}?",
"MessageConfirmRemoveBookmark": "Ste si istý, že chcete odstrániť túto záložku?",
"MessageConfirmStreamingUsingCellular": "Chystáte sa streamovať pri používaní mobilných dát. To môže mať za následok zvýšené poplatky za využité dáta. Chcete pokračovať?",
"MessageDiscardProgress": "Odstrániť aktuálny stav počúvania",
@@ -359,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast bol vytvorený",
"ToastRSSFeedCloseFailed": "Odstránenie RSS zdroja zlyhalo",
"ToastRSSFeedCloseSuccess": "RSS zdroj bol odstránený",
"ToastStreamingNotAllowedOnCellular": "Streamovanie cez mobilné dáta nie je povolené"
"ToastStreamingNotAllowedOnCellular": "Streamovanie cez mobilné dáta nie je povolené",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+16 -2
View File
@@ -51,7 +51,7 @@
"ButtonSeries": "Serije",
"ButtonSetTimer": "Nastavi časovnik",
"ButtonStream": "Pretakaj",
"ButtonSubmit": "Potrdi",
"ButtonSubmit": "Pošlji",
"ButtonSwitchServerUser": "Preklopi strežnik/uporabnik",
"ButtonUnmaskServerAddress": "Odkrij naslov strežnika",
"ButtonUserStats": "Uporabniška statistika",
@@ -63,6 +63,7 @@
"HeaderChapters": "Poglavja",
"HeaderCollection": "Zbirka",
"HeaderCollectionItems": "Elementi zbirke",
"HeaderConfirm": "Potrdi",
"HeaderConnectionStatus": "Stanje povezave",
"HeaderDataSettings": "Podatkovne nastavitve",
"HeaderDetails": "Podrobnosti",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Nedavne seje",
"HeaderTableOfContents": "Kazalo",
"HeaderUserInterfaceSettings": "Nastavitve uporabniškega vmesnika",
"HeaderWelcome": "Dobrodošel, <strong>{0}</strong>",
"HeaderYourStats": "Tvoja statistika",
"LabelAddToPlaylist": "Dodaj na seznam predvajanja",
"LabelAddedAt": "Dodano ob",
@@ -113,6 +115,7 @@
"LabelAutoSleepTimerAutoRewindHelp": "Ko se samodejni časovnik za spanje konča, bo ponovno predvajanje elementa samodejno previlo na zadnji položaj.",
"LabelAutoSleepTimerHelp": "Pri predvajanju medijev med določenim začetnim in končnim časom se samodejno zažene časovnik spanja.",
"LabelBooks": "knjig",
"LabelByAuthor": "od {0}",
"LabelChapterTrack": "Posnetek poglavja",
"LabelChapters": "Poglavja",
"LabelClosePlayer": "Zapri predvajalnik",
@@ -177,6 +180,9 @@
"LabelLayout": "Postavitev",
"LabelLayoutAuto": "Auto",
"LabelLayoutSinglePage": "Ena stran",
"LabelLibrarySortByProgress": "Napredek: Zadnja posodobitev",
"LabelLibrarySortByProgressFinished": "Napredek: Končano",
"LabelLibrarySortByProgressStarted": "Napredek: Začelo se je",
"LabelLight": "Svetlo",
"LabelLineSpacing": "Vrstični razmak",
"LabelListenAgain": "Poslušaj znova",
@@ -236,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Meri pretečeni čas glede na hitrost",
"LabelSeason": "Sezona",
"LabelSelectADevice": "Izberite napravo",
"LabelSelectMediaType": "Izberite vrsto medija",
"LabelSequenceAscending": "Zaporedje naraščajoče",
"LabelSequenceDescending": "Zaporedje padajoče",
"LabelSeries": "Serije",
@@ -288,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Strežnik Audiobookshelf ni povezan",
"MessageAudiobookshelfServerRequired": "<strong>Pomembno!</strong> Ta aplikacija je zasnovana za delo s strežnikom Audiobookshelf, ki ga gostite vi ali nekdo, ki ga poznate. Ta aplikacija ne ponuja nobene vsebine.",
"MessageBookshelfEmpty": "Knjižna polica prazna",
"MessageConfirmAppExit": "Ste želeli zapustiti aplikacijo?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Ali ste prepričani, da želite počistiti čakalno vrsto za prenos epizod?",
"MessageConfirmDeleteLocalEpisode": "Ali želite odstraniti lokalno epizodo \"{0}\" iz svoje naprave? Datoteka na strežniku ne bo prizadeta.",
"MessageConfirmDeleteLocalFiles": "Želite odstraniti lokalne datoteke tega elementa iz naprave? Datoteke na strežniku in vaš napredek ne bodo prizadeti.",
"MessageConfirmDeleteServerConfig": "Odstrani to konfiguracijo strežnika?",
"MessageConfirmDeleteServerEpisode": "Ali ste prepričani, da želite epizodo \"{0}\" izbrisati s strežnika?\nOpozorilo: S tem boste izbrisali zvočno datoteko.",
"MessageConfirmDisableAutoTimer": "Ali si prepričani, da želiš onemogočiti samodejni časovnik do konca današnjega dne? Časovnik bo znova omogočen ob koncu tega obdobja samodejnega preklopa v mirovanje ali če znova zaženeš aplikacijo.",
"MessageConfirmDiscardProgress": "Ali ste prepričani, da želite ponastaviti svoj napredek?",
"MessageConfirmDownloadUsingCellular": "Prenesli boste z uporabo mobilnih podatkov. To lahko vključuje stroške prenosa podatkov. Želite nadaljevati?",
"MessageConfirmMarkAsFinished": "Ali ste prepričani, da želite označiti ta element kot dokončan?",
"MessageConfirmPlaybackTime": "Začni predvajanje skladbe \"{0}\" ob {1}?",
"MessageConfirmRemoveBookmark": "Ali ste prepričani, da želite odstraniti zaznamek?",
"MessageConfirmStreamingUsingCellular": "Pretakali boste prek mobilnih podatkov. To lahko vključuje stroške prenosa podatkov. Želite nadaljevati?",
"MessageDiscardProgress": "Zavrzi napredek",
@@ -358,5 +370,7 @@
"ToastPodcastCreateSuccess": "Podcast je bil uspešno ustvarjen",
"ToastRSSFeedCloseFailed": "Vira RSS ni bilo mogoče zapreti",
"ToastRSSFeedCloseSuccess": "Vir RSS je bil zaprt",
"ToastStreamingNotAllowedOnCellular": "Pretakanje ni dovoljeno na mobilnih podatkih"
"ToastStreamingNotAllowedOnCellular": "Pretakanje ni dovoljeno na mobilnih podatkih",
"UnitMinutesShort": "{0}m",
"UnitSecondsShort": "{0}s"
}
+24 -24
View File
@@ -4,7 +4,7 @@
"ButtonAuthors": "Författare",
"ButtonBack": "Tillbaka",
"ButtonCancel": "Avbryt",
"ButtonCancelTimer": "Inaktivera Timer",
"ButtonCancelTimer": "Avbryt Timer",
"ButtonClearFilter": "Rensa filter",
"ButtonClearLogs": "Rensa Loggar",
"ButtonCloseFeed": "Stäng flöde",
@@ -29,15 +29,15 @@
"ButtonLocalMedia": "Lokal media",
"ButtonLogs": "Loggar",
"ButtonManageLocalFiles": "Hantera Lokal Filer",
"ButtonMaskServerAddress": "Dölj server adress",
"ButtonMaskServerAddress": "Dölj serveradress",
"ButtonNewFolder": "Ny Katalog",
"ButtonNextEpisode": "Ny Episod",
"ButtonNextEpisode": "Nästa avsnitt",
"ButtonOk": "OK",
"ButtonOpenFeed": "Öppna flöde",
"ButtonOverride": "Åsidosätt",
"ButtonPause": "Pausa",
"ButtonPlay": "Spela",
"ButtonPlayEpisode": "Spela Episod",
"ButtonPlayEpisode": "Spela Avsnitt",
"ButtonPlaylists": "Spellistor",
"ButtonRead": "Läs",
"ButtonReadLess": "Visa mindre",
@@ -51,21 +51,21 @@
"ButtonSeries": "Serie",
"ButtonSetTimer": "Ställ in timer",
"ButtonStream": "Ström",
"ButtonSubmit": "Spara",
"ButtonSubmit": "Skicka",
"ButtonSwitchServerUser": "Byt Server/Användare",
"ButtonUnmaskServerAddress": "Visa server adress",
"ButtonUnmaskServerAddress": "Visa serveradress",
"ButtonUserStats": "Användarstatistik",
"ButtonYes": "Ja",
"HeaderAccount": "Konto",
"HeaderAdvanced": "Avancerad",
"HeaderAndroidAutoSettings": "Android Auto Inställningar",
"HeaderAudioTracks": "Ljudfiler",
"HeaderAudioTracks": "Ljudspår",
"HeaderChapters": "Kapitel",
"HeaderCollection": "Samling",
"HeaderCollectionItems": "Böcker i samlingen",
"HeaderConfirm": "Bekräfta",
"HeaderConnectionStatus": "Anslutnings Status",
"HeaderDataSettings": "Data Inställningar",
"HeaderConnectionStatus": "Anslutningsstatus",
"HeaderDataSettings": "Datainställningar",
"HeaderDetails": "Detaljer",
"HeaderDownloads": "Nedladdningar",
"HeaderEbookFiles": "E-boksfiler",
@@ -74,35 +74,35 @@
"HeaderLatestEpisodes": "Senaste avsnitten",
"HeaderLibraries": "Bibliotek",
"HeaderLocalFolders": "Lokala Kataloger",
"HeaderLocalLibraryItems": "Lokala Bibliotek Filer",
"HeaderLocalLibraryItems": "Lokala Biblioteksfiler",
"HeaderNewPlaylist": "Ny Spellista",
"HeaderOpenRSSFeed": "Öppna RSS-flöde",
"HeaderPlaybackSettings": "Uppspelningsinställningar",
"HeaderPlaylist": "Spellista",
"HeaderPlaylistItems": "Böcker i spellistan",
"HeaderProgressSyncFailed": "Progress Sync misslyckades",
"HeaderRSSFeed": "RSS flöde",
"HeaderProgressSyncFailed": "Positionssynk misslyckades",
"HeaderRSSFeed": "RSS-flöde",
"HeaderRSSFeedGeneral": "RSS-information",
"HeaderRSSFeedIsOpen": "RSS-flödet är öppet",
"HeaderSelectDownloadLocation": "Välj Nedladdnings Plats",
"HeaderSelectDownloadLocation": "Välj Nedladdningsplats",
"HeaderSettings": "Inställningar",
"HeaderSleepTimer": "Timer för att sova",
"HeaderSleepTimerSettings": "Sovtimer Inställningar",
"HeaderSleepTimer": "Insomningstimer",
"HeaderSleepTimerSettings": "Insomningstimer-inställningar",
"HeaderStatsMinutesListeningChart": "Minuters lyssning (senaste 7 dagarna)",
"HeaderStatsRecentSessions": "Senaste tillfällena",
"HeaderTableOfContents": "Innehållsförteckning",
"HeaderUserInterfaceSettings": "Användargränssnittsinställningar",
"HeaderWelcome": "Välkommen, <strong>{0}</strong>",
"HeaderYourStats": "Din statistik",
"LabelAddToPlaylist": "Lägg till i en spellista",
"LabelAddToPlaylist": "Lägg till i spellista",
"LabelAddedAt": "Tillagd vid",
"LabelAddedDate": "Adderad {0}",
"LabelAddedDate": "Tillagd {0}",
"LabelAll": "Alla",
"LabelAllowSeekingOnMediaControls": "Tillåt positionssökning på medieaviseringskontroller",
"LabelAlways": "Alltid",
"LabelAndroidAutoBrowseLimitForGrouping": "Alfabetisk neddragningsgräns",
"LabelAndroidAutoBrowseLimitForGroupingHelp": "Använd inte alfabetisk neddragning när det finns mindre än denna mängd objekt att visa",
"LabelAndroidAutoBrowseSeriesSequenceOrder": "Serier bokföljd",
"LabelAndroidAutoBrowseSeriesSequenceOrder": "Seriebokföljd",
"LabelAskConfirmation": "Fråga efter bekräftelse",
"LabelAuthor": "Författare",
"LabelAuthorFirstLast": "Författare (Förnamn Efternamn)",
@@ -111,7 +111,7 @@
"LabelAutoDownloadEpisodes": "Automatisk nedladdning av avsnitt",
"LabelAutoRewindTime": "Automatisk tillbakaspolningstid",
"LabelAutoSleepTimer": "Automatisk insomningstimer",
"LabelAutoSleepTimerAutoRewind": "Automatisk insomningstimer automatisk bakåtspolning",
"LabelAutoSleepTimerAutoRewind": "Automatisk sovtimer automatisk bakåtspolning",
"LabelAutoSleepTimerAutoRewindHelp": "När den automatiska insomningstimern är klar spolas din position automatiskt tillbaka.",
"LabelAutoSleepTimerHelp": "Vid uppspelning av media mellan de angivna start- och sluttiderna startar en insomningstimer automatiskt.",
"LabelBooks": "Böcker",
@@ -147,12 +147,12 @@
"LabelEnableMp3IndexSeekingHelp": "Den här inställningen bör endast aktiveras om du har mp3-filer som inte söker korrekt. Felaktig sökning beror med största sannolikhet på mp3-filer med variabel bitrate (VBR). Den här inställningen tvingar fram indexsökning, där en tid-till-byte-mappning byggs upp när filen läses. I vissa fall med stora mp3-filer blir det en fördröjning vid sökning mot slutet av filen.",
"LabelEnd": "Slut",
"LabelEndOfChapter": "Slut av kapitel",
"LabelEndTime": "Slut tid",
"LabelEndTime": "Sluttid",
"LabelEpisode": "Avsnitt",
"LabelExplicit": "Bestämd",
"LabelExplicit": "Vuxeninnehåll",
"LabelFeedURL": "URL-adress för flödet",
"LabelFile": "Fil",
"LabelFileBirthtime": "Tidpunkt, adderad",
"LabelFileBirthtime": "Tidpunkt, tillagd",
"LabelFileModified": "Tidpunkt, ändrad",
"LabelFilename": "Filnamn",
"LabelFinished": "Avslutad",
@@ -252,9 +252,9 @@
"LabelShakeSensitivity": "Skakkänslighet",
"LabelShowAll": "Visa alla",
"LabelSize": "Storlek",
"LabelSleepTimer": "Sovtimer",
"LabelSleepTimer": "Insomningstimer",
"LabelSleepTimerAlmostDoneChime": "Spela ett ljud när det är nästan klart",
"LabelSleepTimerAlmostDoneChimeHelp": "Spela ett ljud när sovtimern har 30 sekunder kvar",
"LabelSleepTimerAlmostDoneChimeHelp": "Spela ett ljud när insomningstimern har 30 sekunder kvar",
"LabelStart": "Start",
"LabelStartTime": "Starttid",
"LabelStatsBestDay": "Bästa dag",
+14 -1
View File
@@ -63,6 +63,7 @@
"HeaderChapters": "Глави",
"HeaderCollection": "Добірка",
"HeaderCollectionItems": "Елементи добірки",
"HeaderConfirm": "Підтвердити",
"HeaderConnectionStatus": "Стан з'єднання",
"HeaderDataSettings": "Налаштування даних",
"HeaderDetails": "Подробиці",
@@ -91,6 +92,7 @@
"HeaderStatsRecentSessions": "Останні сеанси",
"HeaderTableOfContents": "Зміст",
"HeaderUserInterfaceSettings": "Налаштування користувацького інтерфейсу",
"HeaderWelcome": "Ласкаво просимо, <strong>{0}</strong>",
"HeaderYourStats": "Ваша статистика",
"LabelAddToPlaylist": "Додати до списку відтворення",
"LabelAddedAt": "Дата додавання",
@@ -178,6 +180,9 @@
"LabelLayout": "Вигляд",
"LabelLayoutAuto": "Авто",
"LabelLayoutSinglePage": "Одна",
"LabelLibrarySortByProgress": "Прогрес: Останнє оновлення",
"LabelLibrarySortByProgressFinished": "Прогрес: Завершено",
"LabelLibrarySortByProgressStarted": "Прогрес: Розпочато",
"LabelLight": "Легко",
"LabelLineSpacing": "Інтервал",
"LabelListenAgain": "Слухати знову",
@@ -237,6 +242,7 @@
"LabelScaleElapsedTimeBySpeed": "Час відповідно швидкості",
"LabelSeason": "Сезон",
"LabelSelectADevice": "Обрати пристрій",
"LabelSelectMediaType": "Оберіть тип медіа",
"LabelSequenceAscending": "Послідовність за зростанням",
"LabelSequenceDescending": "Послідовність за спаданням",
"LabelSeries": "Серії",
@@ -289,12 +295,17 @@
"MessageAudiobookshelfServerNotConnected": "Сервер Audiobookshelf не підключений",
"MessageAudiobookshelfServerRequired": "<strong>Важливо!</strong> Цей додаток розроблений для роботи з сервером Audiobookshelf, яким володієте ви або ваші знайомі. Цей додаток не надає жодного контенту.",
"MessageBookshelfEmpty": "Полиця порожня",
"MessageConfirmAppExit": "Ви хочете вийти з програми?",
"MessageConfirmDeleteEpisodeDownloadQueue": "Ви впевнені, що хочете очистити чергу завантаження епізодів?",
"MessageConfirmDeleteLocalEpisode": "Видалити локальний епізод \"{0}\" з вашого пристрою? Файл лишиться на сервері.",
"MessageConfirmDeleteLocalFiles": "Видалити локальні файли цього елемента з вашого пристрою? Файли лишаться на сервері.",
"MessageConfirmDeleteServerConfig": "Видалити цю конфігурацію сервера?",
"MessageConfirmDeleteServerEpisode": "Ви впевнені, що хочете видалити епізод \"{0}\" із сервера?\nПопередження: Це призведе до видалення аудіофайлу.",
"MessageConfirmDisableAutoTimer": "Ви впевнені, що бажаєте вимкнути автоматичний таймер до кінця сьогоднішнього дня? Таймер буде знову ввімкнено в кінці цього періоду автоматичного переходу в режим сну або якщо ви перезапустите програму.",
"MessageConfirmDiscardProgress": "Ви дійсно бажаєте скинути ваш прогрес?",
"MessageConfirmDownloadUsingCellular": "Ви збираєтеся завантажувати через мобільний інтернет. Оператор може брати кошти. Бажаєте продовжити?",
"MessageConfirmMarkAsFinished": "Ви дійсно бажаєте позначити цей елемент завершеним?",
"MessageConfirmPlaybackTime": "Почати відтворення \"{0}\" о {1}?",
"MessageConfirmRemoveBookmark": "Ви дійсно бажаєте видалити закладку?",
"MessageConfirmStreamingUsingCellular": "Ви збираєтеся транслювати через мобільний інтернет. Оператор може брати кошти. Бажаєте продовжити?",
"MessageDiscardProgress": "Скинути прогрес",
@@ -359,5 +370,7 @@
"ToastPodcastCreateSuccess": "Подкаст успішно створено",
"ToastRSSFeedCloseFailed": "Не вдалося закрити RSS-канал",
"ToastRSSFeedCloseSuccess": "RSS-канал закрито",
"ToastStreamingNotAllowedOnCellular": "Трансляція через мобільний інтернет заборонена"
"ToastStreamingNotAllowedOnCellular": "Трансляція через мобільний інтернет заборонена",
"UnitMinutesShort": "{0}хв",
"UnitSecondsShort": "{0}сек"
}
+59
View File
@@ -0,0 +1,59 @@
import { Capacitor } from '@capacitor/core'
import { FastAverageColor } from 'fast-average-color'
import { imageHttpDataToBlob } from '@/utils/imageHttpBlob'
/**
* True when the cover URL is http(s) and not same-origin with the WebView (or browser tab).
* Same-origin URLs (e.g. Capacitor file bridge on localhost) can use FastAverageColor directly.
*/
export function shouldFetchCoverViaNativeHttp(coverUrl) {
if (!coverUrl || typeof coverUrl !== 'string') return false
if (!coverUrl.startsWith('http://') && !coverUrl.startsWith('https://')) return false
try {
return new URL(coverUrl).origin !== window.location.origin
} catch {
return false
}
}
/**
* Average color for a cover image. On native, cross-origin http(s) covers are loaded with
* CapacitorHttp (no WebView CORS), then sampled via a same-origin blob URL.
* @param {*} vm - component instance with $nativeHttp (this)
* @param {string} fullCoverUrl
* @returns {Promise<{ rgba: string, isLight: boolean }|null>}
*/
export async function getAverageColorFromCoverUrl(vm, fullCoverUrl) {
if (!fullCoverUrl) return null
const fac = new FastAverageColor()
let objectUrl = null
try {
let resource = fullCoverUrl
if (Capacitor.isNativePlatform() && shouldFetchCoverViaNativeHttp(fullCoverUrl)) {
const raw = await vm.$nativeHttp.get(fullCoverUrl, {
responseType: 'blob',
connectTimeout: 15000,
readTimeout: 30000
})
const blob = imageHttpDataToBlob(raw)
if (!blob) {
throw new Error('Cover image response could not be converted to a blob')
}
objectUrl = URL.createObjectURL(blob)
resource = objectUrl
}
const color = await fac.getColorAsync(resource)
return { rgba: color.rgba, isLight: color.isLight }
} catch (e) {
console.error('[coverAverageColor]', e)
return null
} finally {
if (objectUrl) {
URL.revokeObjectURL(objectUrl)
}
fac.destroy()
}
}
+40
View File
@@ -0,0 +1,40 @@
/**
* Normalize CapacitorHttp binary responses (Blob, base64 string, data URL, ArrayBuffer) to a Blob.
* @param {unknown} data - CapacitorHttp response `data` when responseType is blob/arraybuffer
* @param {string} [mimeType='image/jpeg'] - fallback Content-Type
* @returns {Blob|null}
*/
export function imageHttpDataToBlob(data, mimeType = 'image/jpeg') {
if (data == null) return null
if (typeof Blob !== 'undefined' && data instanceof Blob) return data
if (data instanceof ArrayBuffer) return new Blob([data], { type: mimeType })
if (ArrayBuffer.isView(data)) return new Blob([data], { type: mimeType })
if (typeof data === 'object' && typeof data.base64 === 'string') {
return base64ToBlob(data.base64, mimeType)
}
if (typeof data === 'string') {
if (data.startsWith('data:')) {
const match = /^data:([^;]+);base64,([\s\S]+)$/.exec(data)
if (match) {
const type = match[1] || mimeType
return base64ToBlob(match[2], type)
}
}
try {
return base64ToBlob(data, mimeType)
} catch {
return null
}
}
return null
}
function base64ToBlob(base64, type) {
const binaryString = atob(base64)
const len = binaryString.length
const bytes = new Uint8Array(len)
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i)
}
return new Blob([bytes], { type })
}