Compare commits

...

151 commits

Author SHA1 Message Date
advplyr
9c0c7b6b08
Merge pull request #4469 from advplyr/fix_scanner_deleting_single_file_books
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Fix scanner after deleting single file books #4459
2025-07-09 14:54:05 -05:00
advplyr
df1391d93f Fix scanner after deleting single file books #4459 2025-07-09 13:42:53 -05:00
advplyr
4102ed8be4 Fix LazySeriesCard component test
Some checks failed
Run Component Tests / Run Component Tests (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
2025-07-07 16:49:20 -05:00
advplyr
ce803dd6de Use getServerSetting to ensure serverSettings is set before accessing
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-07-06 17:39:03 -05:00
advplyr
df60aeb456 Update narrator name to be clickable to filter by narrator
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Run Component Tests / Run Component Tests (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
2025-07-02 17:30:00 -05:00
advplyr
30c327d92a
Merge pull request #4454 from advplyr/fix_mediaprogress_updatedat_2
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Fix manually setting updatedAt of mediaProgresses using progress sync lastUpdate timestamp
2025-07-01 17:08:50 -05:00
advplyr
596bddf791 Fix manually setting updatedAt of mediaProgresses using progress sync lastUpdate timestamp #4366 2025-07-01 16:48:07 -05:00
advplyr
293851d931 Fix missing translation in remove podcast episode modal #4434
Some checks failed
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Run Component Tests / Run Component Tests (push) Has been cancelled
Verify all i18n files are alphabetized / update_translations (push) Has been cancelled
2025-06-30 17:49:05 -05:00
advplyr
7610e97f0f
Merge pull request #4416 from weblate/weblate-audiobookshelf-abs-web-client
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Verify all i18n files are alphabetized / update_translations (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Translations update from Hosted Weblate
2025-06-29 17:32:52 -05:00
Eigen_art
d102065d02
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-06-27 00:22:11 +02:00
Dan Johansen
34315d4c10
Translated using Weblate (Danish)
Currently translated at 99.7% (1104 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/da/
2025-06-27 00:22:10 +02:00
Michael Förster
276a179446
Translated using Weblate (German)
Currently translated at 99.9% (1106 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-06-27 00:22:10 +02:00
burghy86
4462d32e98
Translated using Weblate (Italian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/
2025-06-27 00:22:09 +02:00
SunSpring
9722674072
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-06-27 00:22:09 +02:00
Mathias Franco
35bb77c9c2
Translated using Weblate (Dutch)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-06-27 00:22:08 +02:00
biuklija
cf6f49ce75
Translated using Weblate (Croatian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/
2025-06-27 00:22:07 +02:00
Daniel Schosser
d614373c64
Translated using Weblate (German)
Currently translated at 99.9% (1106 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-06-27 00:22:07 +02:00
Stefan Ha
b9969c78a6
Translated using Weblate (German)
Currently translated at 99.9% (1106 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-06-27 00:22:06 +02:00
B0rax
fbf482d6b6
Translated using Weblate (German)
Currently translated at 99.9% (1106 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-06-27 00:22:06 +02:00
David Havndrup Munch
dd74d0a726
Translated using Weblate (Danish)
Currently translated at 98.9% (1095 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/da/
2025-06-27 00:22:05 +02:00
petr-prikryl
b13b80e011
Translated using Weblate (Czech)
Currently translated at 99.9% (1106 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-06-27 00:22:04 +02:00
advplyr
e384863148 Add support for running in production with dev.js config, node index --prod-with-dev-env
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
2025-06-26 17:21:58 -05:00
advplyr
d21fe49ce2
Merge pull request #4430 from advplyr/experimental_next_client
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
Add ENV REACT_CLIENT_PATH to target a Nextjs frontend instead of Nuxt
2025-06-23 17:23:15 -05:00
advplyr
a992400d6a Add ENV REACT_CLIENT_PATH to target a Nextjs frontend instead of Nuxt 2025-06-23 16:56:08 -05:00
advplyr
108b2a60f5
Merge pull request #4425 from Vito0912/feat/addExplicit
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Run Component Tests / Run Component Tests (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
Add explicit filter
2025-06-21 17:03:25 -05:00
advplyr
af684e6a69 Explicit library filter not shown for users without permission 2025-06-21 17:01:13 -05:00
Vito0912
5336d0525e
add explicit to podcasts 2025-06-21 12:29:54 +02:00
Vito0912
bb4eec9355
add explicit 2025-06-21 12:02:44 +02:00
advplyr
28404f37b8
Merge pull request #4422 from advplyr/podcast_episode_duration
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Run Component Tests / Run Component Tests (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
Show duration in episode view modal & episode feed modal
2025-06-19 17:35:36 -05:00
advplyr
7b92c15a46 Include durationSeconds on RSS podcast episode parsed from duration 2025-06-19 17:28:21 -05:00
advplyr
c150ed4e98 Update view episode modal to include duration & episode feed modal to include duration & size 2025-06-19 17:14:56 -05:00
advplyr
cb7632b216
Merge pull request #4419 from advplyr/episode-timestamps-clickable
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Episode view modal makes timestamps in description clickable
2025-06-18 17:28:55 -05:00
advplyr
b8849677de Episode view modal makes timestamps in description clickable 2025-06-18 17:20:36 -05:00
advplyr
9bf8d7de11 Fix server crash when FantLab provider request times out #4410
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-06-17 17:21:21 -05:00
advplyr
6634ce8fd4
Merge pull request #4417 from advplyr/book_author_secondary_sort_title
Update book library secondary title sort to use title ignore prefixes
2025-06-17 16:40:59 -05:00
advplyr
9d4303ef7b Update book library secondary title sort to use title ignore prefixes #4414 2025-06-17 16:25:30 -05:00
advplyr
1f7be58124 Fix database cleanup query pulling duplicate mediaProgresses
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-06-16 17:50:53 -05:00
advplyr
6b8b27b04f
Merge pull request #4413 from HadrienPatte/nusqlite3-path
Make `NUSQLITE3_PATH` build arg configurable
2025-06-16 17:22:21 -05:00
Hadrien Patte
ba4061e5a4
Make NUSQLITE3_PATH build arg configurable 2025-06-16 23:03:02 +02:00
advplyr
693dc00fa3 Update local session sync logs to help debug sync errors
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-06-15 17:21:47 -05:00
advplyr
f3f5f3b9bd Version bump v2.25.1
Some checks failed
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Run Component Tests / Run Component Tests (push) Has been cancelled
2025-06-14 17:57:19 -05:00
advplyr
b515c6c746 Remove mediaProgresses duplicate check 2025-06-14 17:56:35 -05:00
advplyr
35e196238a Version bump v2.25.0 2025-06-14 17:18:53 -05:00
advplyr
2dc93258f1
Merge pull request #4364 from weblate/weblate-audiobookshelf-abs-web-client
Some checks failed
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Verify all i18n files are alphabetized / update_translations (push) Has been cancelled
Translations update from Hosted Weblate
2025-06-13 17:32:53 -05:00
thehijacker
5123f7d240
Translated using Weblate (Slovenian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/
2025-06-14 00:29:31 +02:00
Usama Khalil
06d3bd76a8
Translated using Weblate (Arabic)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-06-14 00:29:31 +02:00
Ivan Smoliakov
52196afd99
Translated using Weblate (Russian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-06-14 00:29:30 +02:00
ugyes
3e44ee6f50
Translated using Weblate (Hungarian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-06-14 00:29:29 +02:00
Максим Горпиніч
9841826e10
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1107 of 1107 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-06-14 00:29:29 +02:00
Dawid Kuźnicki
def93d18ec
Translated using Weblate (Polish)
Currently translated at 76.9% (850 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-06-14 00:29:28 +02:00
Rekentek
387a3d05b4
Translated using Weblate (Dutch)
Currently translated at 98.5% (1089 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-06-14 00:29:28 +02:00
Daniel Schosser
398d04fc08
Translated using Weblate (German)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-06-14 00:29:27 +02:00
David Havndrup Munch
c5e5e516af
Translated using Weblate (Danish)
Currently translated at 98.9% (1093 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/da/
2025-06-14 00:29:27 +02:00
Plazec
1c6f99b876
Translated using Weblate (Czech)
Currently translated at 99.7% (1102 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-06-14 00:29:26 +02:00
Grzegorz Orlowski
d0af82e71a
Translated using Weblate (Polish)
Currently translated at 76.9% (850 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-06-14 00:29:25 +02:00
Usama Khalil
76e7616439
Translated using Weblate (Arabic)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-06-14 00:29:25 +02:00
max grakov
fe99a269bc
Translated using Weblate (Russian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-06-14 00:29:24 +02:00
thehijacker
5315f65023
Translated using Weblate (Slovenian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/
2025-06-14 00:29:24 +02:00
Максим Горпиніч
c2809808c3
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-06-14 00:29:23 +02:00
Anders Norman
204ac4f204
Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.6% (1024 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nb_NO/
2025-06-14 00:29:22 +02:00
Arieh Kellermann
accd5d1096
Translated using Weblate (German)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-06-14 00:29:22 +02:00
advplyr
5025c6a3ea
Merge pull request #4383 from JKubovy/improve-podcast-episode-search
Use fuse.js for podcast episode search
2025-06-13 17:29:13 -05:00
advplyr
6d0d1415e4 Add fuse.basic.min.js in libs instead of full npm package, use lower threshold for quick matching 2025-06-13 17:23:24 -05:00
advplyr
514f5c2409
Merge pull request #4394 from Vito0912/feat/addISBNAudible
Added the ISBN for Audible providers (returned data)
2025-06-13 16:21:32 -05:00
advplyr
2cc58b2c8a
Merge pull request #4404 from advplyr/podcast_useragents
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Update podcast episode downloads to have a fallback user agent string
2025-06-12 17:40:42 -05:00
advplyr
777a055fcd Update podcast episode downloads to have a fallback user agent string 2025-06-12 17:31:12 -05:00
advplyr
b45085d2d6 Update podcast episode download user agent to fix #4401 2025-06-12 17:19:24 -05:00
advplyr
22f6e86a12 Fix pathexists filepath back to posix
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-06-11 16:37:07 -05:00
advplyr
dc6783ea76
Merge pull request #4398 from advplyr/pathexists_user_access
Update pathexists endpoint to check user has access to library
2025-06-11 16:31:14 -05:00
advplyr
a6f10ca48e Update upload endpoint to check user has access to library 2025-06-11 16:14:51 -05:00
advplyr
aac01d6d9a Update pathexists endpoint to check user has access to library 2025-06-11 16:04:18 -05:00
Vito0912
a617994207
added isbn 2025-06-11 08:12:23 +02:00
advplyr
7a33a412fc
Merge pull request #4393 from advplyr/fix_pathexists_join
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Fix filesystem pathexists path join
2025-06-10 17:20:23 -05:00
advplyr
0135b3560c Fix filesystem pathexists path join 2025-06-10 17:02:42 -05:00
advplyr
6968a5c02a
Merge pull request #4378 from Vito0912/feat/PodcastNots
Some checks failed
Verify all i18n files are alphabetized / update_translations (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
Run Component Tests / Run Component Tests (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
Notifications for failed rss feeds and disabled rss feeds
2025-06-09 16:25:19 -05:00
advplyr
5e2bb0b12c Fix notification js docs and update description/defaults 2025-06-09 16:21:05 -05:00
advplyr
7122756e58 Update notification description grammar 2025-06-09 15:51:14 -05:00
advplyr
8ecc912c2d
Merge pull request #4388 from advplyr/book_author_secondary_sort
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Update book library sort by author to use title as secondary sort #4380
2025-06-08 17:38:45 -05:00
advplyr
c8cea4e6af Update book library sort by author to use title as secondary sort #4380 2025-06-08 17:28:19 -05:00
advplyr
0c5d05d319 Fix chapter table on audiobook tools page uneven column widths
Some checks failed
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Run Component Tests / Run Component Tests (push) Has been cancelled
2025-06-07 17:10:23 -05:00
advplyr
4a3eb7727b
Merge pull request #4385 from advplyr/clean_duplicate_mediaprogress
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Update cleanDatabase to remove duplicate mediaProgresses
2025-06-06 17:17:43 -05:00
advplyr
81640464ba Update cleanDatabase to remove duplicate mediaProgresses 2025-06-06 17:05:07 -05:00
Jan Kubovy
eda7036f70 Use fuse.js for podcast episode search
Replace levenshtein distance with fuse.js fuzzy searching library. Search in episode's title and subtitle
2025-06-06 10:43:52 +00:00
advplyr
e669a8d378
Merge pull request #4370 from Vito0912/feat/MaxFailedEpisodeChecks-
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Adds ENV for MaxFailedEpisodeChecks
2025-06-05 15:06:27 -05:00
advplyr
8e01859075 Cast PODCAST_DOWNLOAD_TIMEOUT and MAX_FAILED_EPISODE_CHECKS env vars to numbers 2025-06-05 14:31:12 -05:00
Vito0912
f0525d4f0d
abc is hard 2025-06-05 14:09:35 +02:00
Vito0912
84c9c6cb50
move to global 2025-06-05 14:07:35 +02:00
Vito0912
346df3680c
local strings 2025-06-05 14:02:29 +02:00
Vito0912
6aa7c8a3d8
added notification 2025-06-05 13:34:18 +02:00
advplyr
704c6f7bde
Merge pull request #4374 from Vito0912/feat/allowBase64Images
Some checks failed
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Run Component Tests / Run Component Tests (push) Has been cancelled
Corrects removing of attachments for Trix
2025-06-04 16:36:46 -05:00
advplyr
f01055f6e6
Merge pull request #4373 from Vito0912/feat/maybeFixPodcast
Potential fix/new knowledge for hangig podcasts
2025-06-04 16:33:40 -05:00
Vito0912
759c58d3f7 remove any attachment 2025-06-04 16:38:01 +02:00
Vito0912
357176b301 catch timeout 2025-06-04 16:15:18 +02:00
Vito0912
9bb4dc3ab0 potential fix 2025-06-04 10:58:44 +02:00
Vito0912
709c33f27a ensure proper type 2025-06-04 10:05:16 +02:00
Vito0912
4d846e225a Adds ENV for MaxFailedEpisodeChecks 2025-06-04 10:02:17 +02:00
advplyr
5dc6d613bd
Merge pull request #4361 from Vito0912/feat/encoderSettings
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Run Component Tests / Run Component Tests (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
Fix: Audiobook m4b advanced encoder ignore
2025-06-02 16:53:28 -05:00
advplyr
63ccdb68f0 Fix m4b encoder backup file overwriting the encoded file when they have the same filename 2025-06-02 16:50:03 -05:00
Vito0912
424ef1aec3
prettier 2 2025-06-02 19:34:25 +02:00
Vito0912
b6995ba5d1
prettier 2025-06-02 19:33:50 +02:00
Vito0912
9968743a93
fix wrong display and ignored values 2025-06-02 19:32:52 +02:00
advplyr
c377b57601 Version bump v2.24.0
Some checks failed
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Verify all i18n files are alphabetized / update_translations (push) Has been cancelled
2025-06-01 16:00:16 -05:00
advplyr
262d0b46e3
Merge pull request #4350 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-06-01 15:40:16 -05:00
Charlie
32fc4f6555
Translated using Weblate (French)
Currently translated at 99.9% (1104 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/
2025-06-01 15:57:47 +02:00
DR
81572adab6
Translated using Weblate (Hebrew)
Currently translated at 76.4% (845 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/he/
2025-06-01 00:37:34 +02:00
kuci-JK
1ad2e71fd5
Translated using Weblate (Czech)
Currently translated at 98.9% (1093 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-06-01 00:37:33 +02:00
FiendFEARing
db66b9eaeb
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-06-01 00:37:32 +02:00
Simple16
28c2e62e61
Translated using Weblate (Russian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-06-01 00:37:32 +02:00
Tommaso Bellandi
96401c377c
Translated using Weblate (Italian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/
2025-06-01 00:37:31 +02:00
advplyr
9d45880b37
Merge pull request #4355 from advplyr/sanitize_html_description
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Sanitize media item & episode description on update
2025-05-31 17:37:18 -05:00
advplyr
9052ceedd3 Sanitize media item & episode description on update 2025-05-31 17:01:58 -05:00
advplyr
4968864498 Fix safari specific issue with line clamp on description #4348
Some checks failed
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Run Component Tests / Run Component Tests (push) Has been cancelled
2025-05-30 17:33:15 -05:00
advplyr
f44c2d9e11
Merge pull request #4349 from advplyr/trix_prevent_attachments
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Run Component Tests / Run Component Tests (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
Update rich text editor to prevent pasting in images from the browser
2025-05-29 17:37:31 -05:00
advplyr
0c8e334b1a Update rich text editor to prevent pasting in images from the browser 2025-05-29 17:27:29 -05:00
advplyr
abaa7b5ad0 Add arabic language option
Some checks failed
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Verify all i18n files are alphabetized / update_translations (push) Has been cancelled
2025-05-28 17:09:39 -05:00
advplyr
df01e493ec
Merge pull request #4303 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-05-28 17:05:27 -05:00
Adolfo Jayme Barrientos
949c8ce230
Translated using Weblate (Catalan)
Currently translated at 96.2% (1064 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ca/
2025-05-27 22:57:04 +00:00
Grzegorz Orlowski
9eaa0c26cd
Translated using Weblate (Polish)
Currently translated at 73.3% (810 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-05-27 22:57:03 +00:00
Adolfo Jayme Barrientos
d71f091e3e
Translated using Weblate (Spanish)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/es/
2025-05-27 22:57:02 +00:00
Biepa
2589121908
Translated using Weblate (German)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-05-27 22:57:02 +00:00
ABS translator
ff425212e7
Translated using Weblate (Arabic)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-05-27 22:57:01 +00:00
thehijacker
243baaf775
Translated using Weblate (Slovenian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/
2025-05-27 22:57:00 +00:00
Jan Schoenfeld
7275b1063b
Translated using Weblate (German)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-05-27 22:57:00 +00:00
peter cerny
4fd97510b8
Translated using Weblate (Slovak)
Currently translated at 99.9% (1104 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sk/
2025-05-27 22:56:59 +00:00
Adolfo Jayme Barrientos
6e67b1d9dd
Translated using Weblate (Catalan)
Currently translated at 96.0% (1061 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ca/
2025-05-27 22:56:59 +00:00
SunSpring
0fc6afec26
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-05-27 22:56:58 +00:00
Adolfo Jayme Barrientos
c950ac7d69
Translated using Weblate (Spanish)
Currently translated at 99.9% (1104 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/es/
2025-05-27 22:56:57 +00:00
Usama Khalil
8979e19e92
Translated using Weblate (Arabic)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-05-27 22:56:57 +00:00
Максим Горпиніч
6a51cb07e8
Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-05-27 22:56:56 +00:00
biuklija
846a8c3881
Translated using Weblate (Croatian)
Currently translated at 100.0% (1105 of 1105 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/
2025-05-27 22:56:55 +00:00
peter cerny
0cd698cc8d
Translated using Weblate (Slovak)
Currently translated at 99.9% (1103 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sk/
2025-05-27 22:56:55 +00:00
Antoniy Chonkov
13d9462868
Translated using Weblate (Bulgarian)
Currently translated at 81.7% (903 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bg/
2025-05-27 22:56:54 +00:00
peter cerny
d8e2ff8b0e
Translated using Weblate (Slovak)
Currently translated at 99.5% (1099 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sk/
2025-05-27 22:56:53 +00:00
Usama Khalil
35c2a5c1a3
Translated using Weblate (Arabic)
Currently translated at 100.0% (1104 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-05-27 22:56:53 +00:00
Antoniy Chonkov
19dc096d22
Translated using Weblate (Bulgarian)
Currently translated at 75.5% (834 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bg/
2025-05-27 22:56:52 +00:00
Usama Khalil
535ebc10f0
Translated using Weblate (Arabic)
Currently translated at 98.5% (1088 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-05-27 22:56:51 +00:00
SunSpring
7486a0659b
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1104 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-05-27 22:56:51 +00:00
Usama Khalil
273866fe92
Translated using Weblate (Arabic)
Currently translated at 36.5% (404 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-05-27 22:56:50 +00:00
Usama Khalil
6425d95deb
Translated using Weblate (Arabic)
Currently translated at 27.4% (303 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-05-27 22:56:50 +00:00
Vito0912
68a39449a2
Translated using Weblate (German)
Currently translated at 99.6% (1100 of 1104 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-05-27 22:56:49 +00:00
advplyr
8e08458ea2 Merge branch 'master' of https://github.com/advplyr/audiobookshelf
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-05-27 17:56:32 -05:00
advplyr
1119ddef8a Add RSS Feed Open filter for podcast libraries to match book libraries #4335 2025-05-27 17:56:27 -05:00
advplyr
3d0219a866
Merge pull request #4342 from advplyr/check_path_api_fix
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Update pathexists file system API endpoint
2025-05-26 17:12:13 -05:00
advplyr
6ce1806359 Update pathexists file system API endpoint 2025-05-26 16:56:50 -05:00
advplyr
f05a513767 Fix m4b encoder bitrate preset selection #4337
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-05-25 16:12:35 -05:00
advplyr
d03c338b48 Fix log for podcast rss feed with no guid #4325
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
2025-05-24 17:09:58 -05:00
advplyr
5e5a988f7a
Merge pull request #4326 from advplyr/fix_mediaprogress_updatedat
Some checks failed
Run Unit Tests / Run Unit Tests (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Fix MediaProgress not using the lastUpdate time sent for local progress syncs
2025-05-22 17:43:31 -05:00
advplyr
6d1f0b27df Fix MediaProgress not using the lastUpdate time sent for local progress syncs 2025-05-22 17:30:38 -05:00
advplyr
d01a7cb756
Merge pull request #4318 from advplyr/increase_express_json_limit
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Run Component Tests / Run Component Tests (push) Has been cancelled
Build and Push Docker Image / build (push) Has been cancelled
Integration Test / build and test (push) Has been cancelled
Run Unit Tests / Run Unit Tests (push) Has been cancelled
Update max allowed json request size #4250
2025-05-20 18:04:02 -05:00
advplyr
cae874ef05 Update max allowed json request size #4250 2025-05-20 17:44:13 -05:00
advplyr
733afc3e29 Update edit series sequence to show error when sequence has spaces #4314
Some checks failed
CodeQL / Analyze (push) Waiting to run
Run Component Tests / Run Component Tests (push) Waiting to run
Build and Push Docker Image / build (push) Waiting to run
Integration Test / build and test (push) Waiting to run
Run Unit Tests / Run Unit Tests (push) Waiting to run
Verify all i18n files are alphabetized / update_translations (push) Has been cancelled
2025-05-19 17:37:11 -05:00
84 changed files with 2046 additions and 462 deletions

View file

@ -57,7 +57,7 @@ WORKDIR /app
# Copy compiled frontend and server from build stages # Copy compiled frontend and server from build stages
COPY --from=build-client /client/dist /app/client/dist COPY --from=build-client /client/dist /app/client/dist
COPY --from=build-server /server /app COPY --from=build-server /server /app
COPY --from=build-server /usr/local/lib/nusqlite3 /usr/local/lib/nusqlite3 COPY --from=build-server ${NUSQLITE3_PATH} ${NUSQLITE3_PATH}
EXPOSE 80 EXPOSE 80

View file

@ -198,7 +198,7 @@ export default {
return this.store.getters['user/getSizeMultiplier'] return this.store.getters['user/getSizeMultiplier']
}, },
dateFormat() { dateFormat() {
return this.store.state.serverSettings.dateFormat return this.store.getters['getServerSetting']('dateFormat')
}, },
_libraryItem() { _libraryItem() {
return this.libraryItem || {} return this.libraryItem || {}

View file

@ -71,7 +71,7 @@ export default {
return this.height * this.sizeMultiplier return this.height * this.sizeMultiplier
}, },
dateFormat() { dateFormat() {
return this.store.state.serverSettings.dateFormat return this.store.getters['getServerSetting']('dateFormat')
}, },
labelFontSize() { labelFontSize() {
if (this.width < 160) return 0.75 if (this.width < 160) return 0.75

View file

@ -94,6 +94,9 @@ export default {
userIsAdminOrUp() { userIsAdminOrUp() {
return this.$store.getters['user/getIsAdminOrUp'] return this.$store.getters['user/getIsAdminOrUp']
}, },
userCanAccessExplicitContent() {
return this.$store.getters['user/getUserCanAccessExplicitContent']
},
libraryMediaType() { libraryMediaType() {
return this.$store.getters['libraries/getCurrentLibraryMediaType'] return this.$store.getters['libraries/getCurrentLibraryMediaType']
}, },
@ -239,6 +242,15 @@ export default {
sublist: false sublist: false
} }
] ]
if (this.userCanAccessExplicitContent) {
items.push({
text: this.$strings.LabelExplicit,
value: 'explicit',
sublist: false
})
}
if (this.userIsAdminOrUp) { if (this.userIsAdminOrUp) {
items.push({ items.push({
text: this.$strings.LabelShareOpen, text: this.$strings.LabelShareOpen,
@ -249,7 +261,7 @@ export default {
return items return items
}, },
podcastItems() { podcastItems() {
return [ const items = [
{ {
text: this.$strings.LabelAll, text: this.$strings.LabelAll,
value: 'all' value: 'all'
@ -276,8 +288,23 @@ export default {
text: this.$strings.ButtonIssues, text: this.$strings.ButtonIssues,
value: 'issues', value: 'issues',
sublist: false sublist: false
},
{
text: this.$strings.LabelRSSFeedOpen,
value: 'feed-open',
sublist: false
} }
] ]
if (this.userCanAccessExplicitContent) {
items.push({
text: this.$strings.LabelExplicit,
value: 'explicit',
sublist: false
})
}
return items
}, },
selectItems() { selectItems() {
if (this.isSeries) return this.seriesItems if (this.isSeries) return this.seriesItems

View file

@ -79,10 +79,10 @@ export default {
return !this.bookmarks.find((bm) => Math.abs(this.currentTime - bm.time) < 1) return !this.bookmarks.find((bm) => Math.abs(this.currentTime - bm.time) < 1)
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
} }
}, },
methods: { methods: {

View file

@ -14,6 +14,7 @@
<ui-text-input-with-label ref="sequenceInput" v-model="selectedSeries.sequence" :label="$strings.LabelSequence" /> <ui-text-input-with-label ref="sequenceInput" v-model="selectedSeries.sequence" :label="$strings.LabelSequence" />
</div> </div>
</div> </div>
<div v-if="error" class="text-error text-sm mt-2 p-1">{{ error }}</div>
<div class="flex justify-end mt-2 p-1"> <div class="flex justify-end mt-2 p-1">
<ui-btn type="submit">{{ $strings.ButtonSubmit }}</ui-btn> <ui-btn type="submit">{{ $strings.ButtonSubmit }}</ui-btn>
</div> </div>
@ -34,12 +35,17 @@ export default {
existingSeriesNames: { existingSeriesNames: {
type: Array, type: Array,
default: () => [] default: () => []
},
originalSeriesSequence: {
type: String,
default: null
} }
}, },
data() { data() {
return { return {
el: null, el: null,
content: null content: null,
error: null
} }
}, },
watch: { watch: {
@ -85,10 +91,17 @@ export default {
} }
}, },
submitSeriesForm() { submitSeriesForm() {
this.error = null
if (this.$refs.newSeriesSelect) { if (this.$refs.newSeriesSelect) {
this.$refs.newSeriesSelect.blur() this.$refs.newSeriesSelect.blur()
} }
if (this.selectedSeries.sequence !== this.originalSeriesSequence && this.selectedSeries.sequence.includes(' ')) {
this.error = this.$strings.MessageSeriesSequenceCannotContainSpaces
return
}
this.$emit('submit') this.$emit('submit')
}, },
clickClose() { clickClose() {
@ -100,6 +113,7 @@ export default {
} }
}, },
setShow() { setShow() {
this.error = null
if (!this.el || !this.content) { if (!this.el || !this.content) {
this.init() this.init()
} }

View file

@ -159,10 +159,10 @@ export default {
return 'Unknown' return 'Unknown'
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
}, },
isOpenSession() { isOpenSession() {
return !!this._session.open return !!this._session.open

View file

@ -144,7 +144,7 @@ export default {
expirationDateString() { expirationDateString() {
if (!this.expireDurationSeconds) return this.$strings.LabelPermanent if (!this.expireDurationSeconds) return this.$strings.LabelPermanent
const dateMs = Date.now() + this.expireDurationSeconds * 1000 const dateMs = Date.now() + this.expireDurationSeconds * 1000
return this.$formatDatetime(dateMs, this.$store.state.serverSettings.dateFormat, this.$store.state.serverSettings.timeFormat) return this.$formatDatetime(dateMs, this.$store.getters['getServerSetting']('dateFormat'), this.$store.getters['getServerSetting']('timeFormat'))
} }
}, },
methods: { methods: {

View file

@ -40,7 +40,7 @@ export default {
} }
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
releasesToShow() { releasesToShow() {
return this.versionData?.releasesToShow || [] return this.versionData?.releasesToShow || []

View file

@ -35,7 +35,14 @@
<widgets-podcast-type-indicator :type="episode.episodeType" /> <widgets-podcast-type-indicator :type="episode.episodeType" />
</div> </div>
<p v-if="episode.subtitle" class="mb-1 text-sm text-gray-300 line-clamp-2">{{ episode.subtitle }}</p> <p v-if="episode.subtitle" class="mb-1 text-sm text-gray-300 line-clamp-2">{{ episode.subtitle }}</p>
<p class="text-xs text-gray-300">Published {{ episode.publishedAt ? $dateDistanceFromNow(episode.publishedAt) : 'Unknown' }}</p> <div class="flex items-center space-x-2">
<!-- published -->
<p class="text-xs text-gray-300 w-40">Published {{ episode.publishedAt ? $dateDistanceFromNow(episode.publishedAt) : 'Unknown' }}</p>
<!-- duration -->
<p v-if="episode.durationSeconds && !isNaN(episode.durationSeconds)" class="text-xs text-gray-300 min-w-28">{{ $strings.LabelDuration }}: {{ $elapsedPretty(episode.durationSeconds) }}</p>
<!-- size -->
<p v-if="episode.enclosure?.length && !isNaN(episode.enclosure.length) && Number(episode.enclosure.length) > 0" class="text-xs text-gray-300">{{ $strings.LabelSize }}: {{ $bytesPretty(Number(episode.enclosure.length)) }}</p>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -244,8 +251,8 @@ export default {
const sizeInMb = payloadSize / 1024 / 1024 const sizeInMb = payloadSize / 1024 / 1024
const sizeInMbPretty = sizeInMb.toFixed(2) + 'MB' const sizeInMbPretty = sizeInMb.toFixed(2) + 'MB'
console.log('Request size', sizeInMb) console.log('Request size', sizeInMb)
if (sizeInMb > 4.99) { if (sizeInMb > 9.99) {
return this.$toast.error(`Request is too large (${sizeInMbPretty}) should be < 5Mb`) return this.$toast.error(`Request is too large (${sizeInMbPretty}) should be < 10Mb`)
} }
this.processing = true this.processing = true

View file

@ -11,7 +11,7 @@
{{ $getString('MessageConfirmRemoveEpisode', [episodeTitle]) }} {{ $getString('MessageConfirmRemoveEpisode', [episodeTitle]) }}
</p> </p>
<p v-else class="text-lg text-gray-200 mb-4">{{ $getString('MessageConfirmRemoveEpisodes', [episodes.length]) }}</p> <p v-else class="text-lg text-gray-200 mb-4">{{ $getString('MessageConfirmRemoveEpisodes', [episodes.length]) }}</p>
<p class="text-xs font-semibold text-warning/90">Note: This does not delete the audio file unless toggling "Hard delete file"</p> <p class="text-xs font-semibold text-warning/90">{{ $strings.MessageConfirmRemoveEpisodeNote }}</p>
</div> </div>
<div class="flex justify-between items-center pt-4"> <div class="flex justify-between items-center pt-4">
<ui-checkbox v-model="hardDeleteFile" :label="$strings.LabelHardDeleteFile" check-color="error" checkbox-bg="bg" small label-class="text-base text-gray-200 pl-3" /> <ui-checkbox v-model="hardDeleteFile" :label="$strings.LabelHardDeleteFile" check-color="error" checkbox-bg="bg" small label-class="text-base text-gray-200 pl-3" />

View file

@ -16,7 +16,7 @@
</div> </div>
</div> </div>
<p dir="auto" class="text-lg font-semibold mb-6">{{ title }}</p> <p dir="auto" class="text-lg font-semibold mb-6">{{ title }}</p>
<div v-if="description" dir="auto" class="default-style less-spacing" v-html="description" /> <div v-if="description" dir="auto" class="default-style less-spacing" @click="handleDescriptionClick" v-html="description" />
<p v-else class="mb-2">{{ $strings.MessageNoDescription }}</p> <p v-else class="mb-2">{{ $strings.MessageNoDescription }}</p>
<div class="w-full h-px bg-white/5 my-4" /> <div class="w-full h-px bg-white/5 my-4" />
@ -34,6 +34,12 @@
{{ audioFileSize }} {{ audioFileSize }}
</p> </p>
</div> </div>
<div class="grow">
<p class="font-semibold text-xs mb-1">{{ $strings.LabelDuration }}</p>
<p class="mb-2 text-xs">
{{ audioFileDuration }}
</p>
</div>
</div> </div>
</div> </div>
</modals-modal> </modals-modal>
@ -68,7 +74,7 @@ export default {
return this.episode.title || 'No Episode Title' return this.episode.title || 'No Episode Title'
}, },
description() { description() {
return this.episode.description || '' return this.parseDescription(this.episode.description || '')
}, },
media() { media() {
return this.libraryItem?.media || {} return this.libraryItem?.media || {}
@ -90,11 +96,49 @@ export default {
return this.$bytesPretty(size) return this.$bytesPretty(size)
}, },
audioFileDuration() {
const duration = this.episode.duration || 0
return this.$elapsedPretty(duration)
},
bookCoverAspectRatio() { bookCoverAspectRatio() {
return this.$store.getters['libraries/getBookCoverAspectRatio'] return this.$store.getters['libraries/getBookCoverAspectRatio']
} }
}, },
methods: {}, methods: {
handleDescriptionClick(e) {
if (e.target.matches('span.time-marker')) {
const time = parseInt(e.target.dataset.time)
if (!isNaN(time)) {
this.$eventBus.$emit('play-item', {
episodeId: this.episodeId,
libraryItemId: this.libraryItem.id,
startTime: time
})
}
e.preventDefault()
}
},
parseDescription(description) {
const timeMarkerLinkRegex = /<a href="#([^"]*?\b\d{1,2}:\d{1,2}(?::\d{1,2})?)">(.*?)<\/a>/g
const timeMarkerRegex = /\b\d{1,2}:\d{1,2}(?::\d{1,2})?\b/g
function convertToSeconds(time) {
const timeParts = time.split(':').map(Number)
return timeParts.reduce((acc, part, index) => acc * 60 + part, 0)
}
return description
.replace(timeMarkerLinkRegex, (match, href, displayTime) => {
const time = displayTime.match(timeMarkerRegex)[0]
const seekTimeInSeconds = convertToSeconds(time)
return `<span class="time-marker cursor-pointer text-blue-400 hover:text-blue-300" data-time="${seekTimeInSeconds}">${displayTime}</span>`
})
.replace(timeMarkerRegex, (match) => {
const seekTimeInSeconds = convertToSeconds(match)
return `<span class="time-marker cursor-pointer text-blue-400 hover:text-blue-300" data-time="${seekTimeInSeconds}">${match}</span>`
})
}
},
mounted() {} mounted() {}
} }
</script> </script>

View file

@ -78,10 +78,10 @@ export default {
return this.$store.getters['user/getToken'] return this.$store.getters['user/getToken']
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
} }
}, },
methods: { methods: {

View file

@ -76,10 +76,10 @@ export default {
return usermap return usermap
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
} }
}, },
methods: { methods: {

View file

@ -112,7 +112,7 @@ export default {
return this.episode?.publishedAt return this.episode?.publishedAt
}, },
dateFormat() { dateFormat() {
return this.store.state.serverSettings.dateFormat return this.store.getters['getServerSetting']('dateFormat')
}, },
itemProgress() { itemProgress() {
return this.store.getters['user/getUserMediaProgress'](this.libraryItemId, this.episodeId) return this.store.getters['user/getUserMediaProgress'](this.libraryItemId, this.episodeId)

View file

@ -239,10 +239,10 @@ export default {
}) })
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
} }
}, },
methods: { methods: {

View file

@ -31,7 +31,7 @@
</div> </div>
</div> </div>
</trix-toolbar> </trix-toolbar>
<trix-editor :toolbar="toolbarId" :contenteditable="!disabledEditor" :class="['trix-content']" ref="trix" :input="computedId" :placeholder="placeholder" @trix-change="handleContentChange" @trix-initialize="handleInitialize" @trix-focus="processTrixFocus" @trix-blur="processTrixBlur" /> <trix-editor :toolbar="toolbarId" :contenteditable="!disabledEditor" :class="['trix-content']" ref="trix" :input="computedId" :placeholder="placeholder" @trix-change="handleContentChange" @trix-initialize="handleInitialize" @trix-focus="processTrixFocus" @trix-blur="processTrixBlur" @trix-attachment-add="handleAttachmentAdd" />
<input type="hidden" :name="inputName" :id="computedId" :value="editorContent" /> <input type="hidden" :name="inputName" :id="computedId" :value="editorContent" />
</div> </div>
</template> </template>
@ -316,6 +316,10 @@ export default {
if (this.$refs.trix && this.$refs.trix.blur) { if (this.$refs.trix && this.$refs.trix.blur) {
this.$refs.trix.blur() this.$refs.trix.blur()
} }
},
handleAttachmentAdd(event) {
// Prevent pasting in images/any files from the browser
event.attachment.remove()
} }
}, },
mounted() { mounted() {

View file

@ -85,7 +85,7 @@ export default {
nextRun() { nextRun() {
if (!this.cronExpression) return '' if (!this.cronExpression) return ''
const parsed = this.$getNextScheduledDate(this.cronExpression) const parsed = this.$getNextScheduledDate(this.cronExpression)
return this.$formatJsDatetime(parsed, this.$store.state.serverSettings.dateFormat, this.$store.state.serverSettings.timeFormat) || '' return this.$formatJsDatetime(parsed, this.$store.getters['getServerSetting']('dateFormat'), this.$store.getters['getServerSetting']('timeFormat')) || ''
}, },
description() { description() {
if ((this.selectedInterval !== 'custom' || !this.selectedWeekdays.length) && this.selectedInterval !== 'daily') return '' if ((this.selectedInterval !== 'custom' || !this.selectedWeekdays.length) && this.selectedInterval !== 'daily') return ''

View file

@ -143,10 +143,18 @@ export default {
localStorage.setItem('embedMetadataCodec', val) localStorage.setItem('embedMetadataCodec', val)
}, },
getEncodingOptions() { getEncodingOptions() {
return { if (this.showAdvancedView) {
codec: this.selectedCodec || 'aac', return {
bitrate: this.selectedBitrate || '128k', codec: this.customCodec || this.selectedCodec || 'aac',
channels: this.selectedChannels || 2 bitrate: this.customBitrate || this.selectedBitrate || '128k',
channels: this.customChannels || this.selectedChannels || 2
}
} else {
return {
codec: this.selectedCodec || 'aac',
bitrate: this.selectedBitrate || '128k',
channels: this.selectedChannels || 2
}
} }
}, },
setPreset() { setPreset() {
@ -162,7 +170,7 @@ export default {
} else { } else {
// Find closest bitrate rounding up // Find closest bitrate rounding up
const bitratesToMatch = [32, 64, 128, 192] const bitratesToMatch = [32, 64, 128, 192]
const closestBitrate = bitratesToMatch.find((bitrate) => bitrate >= this.currentBitrate) const closestBitrate = bitratesToMatch.find((bitrate) => bitrate >= this.currentBitrate) || 192
this.selectedBitrate = closestBitrate + 'k' this.selectedBitrate = closestBitrate + 'k'
} }

View file

@ -248,4 +248,4 @@ export default {
transform: scale(0); transform: scale(0);
} }
} }
</style> </style>

View file

@ -2,7 +2,7 @@
<div> <div>
<ui-multi-select-query-input v-model="seriesItems" text-key="displayName" :label="$strings.LabelSeries" :disabled="disabled" readonly show-edit @edit="editSeriesItem" @add="addNewSeries" /> <ui-multi-select-query-input v-model="seriesItems" text-key="displayName" :label="$strings.LabelSeries" :disabled="disabled" readonly show-edit @edit="editSeriesItem" @add="addNewSeries" />
<modals-edit-series-input-inner-modal v-model="showSeriesForm" :selected-series="selectedSeries" :existing-series-names="existingSeriesNames" @submit="submitSeriesForm" /> <modals-edit-series-input-inner-modal v-model="showSeriesForm" :selected-series="selectedSeries" :existing-series-names="existingSeriesNames" :original-series-sequence="originalSeriesSequence" @submit="submitSeriesForm" />
</div> </div>
</template> </template>
@ -18,6 +18,7 @@ export default {
data() { data() {
return { return {
selectedSeries: null, selectedSeries: null,
originalSeriesSequence: null,
showSeriesForm: false showSeriesForm: false
} }
}, },
@ -59,6 +60,7 @@ export default {
..._series ..._series
} }
this.originalSeriesSequence = _series.sequence
this.showSeriesForm = true this.showSeriesForm = true
}, },
addNewSeries() { addNewSeries() {
@ -68,6 +70,7 @@ export default {
sequence: '' sequence: ''
} }
this.originalSeriesSequence = null
this.showSeriesForm = true this.showSeriesForm = true
}, },
submitSeriesForm() { submitSeriesForm() {
@ -106,4 +109,4 @@ export default {
} }
} }
} }
</script> </script>

View file

@ -40,6 +40,7 @@ describe('LazySeriesCard', () => {
}, },
$store: { $store: {
getters: { getters: {
getServerSetting: () => 'MM/dd/yyyy',
'user/getUserCanUpdate': true, 'user/getUserCanUpdate': true,
'user/getUserMediaProgress': (id) => null, 'user/getUserMediaProgress': (id) => null,
'user/getSizeMultiplier': 1, 'user/getSizeMultiplier': 1,

View file

@ -1,12 +1,12 @@
{ {
"name": "audiobookshelf-client", "name": "audiobookshelf-client",
"version": "2.23.0", "version": "2.25.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "audiobookshelf-client", "name": "audiobookshelf-client",
"version": "2.23.0", "version": "2.25.1",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@nuxtjs/axios": "^5.13.6", "@nuxtjs/axios": "^5.13.6",

View file

@ -1,6 +1,6 @@
{ {
"name": "audiobookshelf-client", "name": "audiobookshelf-client",
"version": "2.23.0", "version": "2.25.1",
"buildNumber": 1, "buildNumber": 1,
"description": "Self-hosted audiobook and podcast client", "description": "Self-hosted audiobook and podcast client",
"main": "index.js", "main": "index.js",

View file

@ -28,14 +28,14 @@
<div class="flex justify-center flex-wrap lg:flex-nowrap gap-4"> <div class="flex justify-center flex-wrap lg:flex-nowrap gap-4">
<div class="w-full max-w-2xl border border-white/10 bg-bg"> <div class="w-full max-w-2xl border border-white/10 bg-bg">
<div class="flex py-2 px-4"> <div class="flex py-2 px-4">
<div class="w-1/3 text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelMetaTag }}</div> <div class="w-28 min-w-28 text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelMetaTag }}</div>
<div class="w-2/3 text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelValue }}</div> <div class="grow text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelValue }}</div>
</div> </div>
<div class="w-full max-h-72 overflow-auto"> <div class="w-full max-h-72 overflow-auto">
<template v-for="(value, key, index) in metadataObject"> <template v-for="(value, key, index) in metadataObject">
<div :key="key" class="flex py-1 px-4 text-sm" :class="index % 2 === 0 ? 'bg-primary/25' : ''"> <div :key="key" class="flex py-1 px-4 text-sm" :class="index % 2 === 0 ? 'bg-primary/25' : ''">
<div class="w-1/3 font-semibold">{{ key }}</div> <div class="w-28 min-w-28 font-semibold">{{ key }}</div>
<div class="w-2/3"> <div class="grow">
{{ value }} {{ value }}
</div> </div>
</div> </div>
@ -45,18 +45,18 @@
<div class="w-full max-w-2xl border border-white/10 bg-bg"> <div class="w-full max-w-2xl border border-white/10 bg-bg">
<div class="flex py-2 px-4 bg-primary/25"> <div class="flex py-2 px-4 bg-primary/25">
<div class="grow text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelChapterTitle }}</div> <div class="grow text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelChapterTitle }}</div>
<div class="w-24 text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelStart }}</div> <div class="w-16 min-w-16 text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelStart }}</div>
<div class="w-24 text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelEnd }}</div> <div class="w-16 min-w-16 text-xs font-semibold uppercase text-gray-200">{{ $strings.LabelEnd }}</div>
</div> </div>
<div class="w-full max-h-72 overflow-auto"> <div class="w-full max-h-72 overflow-auto">
<p v-if="!metadataChapters.length" class="py-5 text-center text-gray-200">{{ $strings.MessageNoChapters }}</p> <p v-if="!metadataChapters.length" class="py-5 text-center text-gray-200">{{ $strings.MessageNoChapters }}</p>
<template v-for="(chapter, index) in metadataChapters"> <template v-for="(chapter, index) in metadataChapters">
<div :key="index" class="flex py-1 px-4 text-sm" :class="index % 2 === 1 ? 'bg-primary/25' : ''"> <div :key="index" class="flex py-1 px-4 text-sm" :class="index % 2 === 1 ? 'bg-primary/25' : ''">
<div class="grow font-semibold">{{ chapter.title }}</div> <div class="grow font-semibold">{{ chapter.title }}</div>
<div class="w-24"> <div class="w-16 min-w-16">
{{ $secondsToTimestamp(chapter.start) }} {{ $secondsToTimestamp(chapter.start) }}
</div> </div>
<div class="w-24"> <div class="w-16 min-w-16">
{{ $secondsToTimestamp(chapter.end) }} {{ $secondsToTimestamp(chapter.end) }}
</div> </div>
</div> </div>
@ -356,6 +356,8 @@ export default {
const encodeOptions = this.$refs.encoderOptionsCard.getEncodingOptions() const encodeOptions = this.$refs.encoderOptionsCard.getEncodingOptions()
this.encodingOptions = encodeOptions
const queryParams = new URLSearchParams(encodeOptions) const queryParams = new URLSearchParams(encodeOptions)
this.processing = true this.processing = true

View file

@ -78,10 +78,10 @@ export default {
}, },
computed: { computed: {
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
} }
}, },
methods: { methods: {

View file

@ -250,10 +250,10 @@ export default {
return user?.username || null return user?.username || null
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
}, },
numSelected() { numSelected() {
return this.listeningSessions.filter((s) => s.selected).length return this.listeningSessions.filter((s) => s.selected).length

View file

@ -129,10 +129,10 @@ export default {
return this.listeningSessions.sessions[0] return this.listeningSessions.sessions[0]
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
} }
}, },
methods: { methods: {

View file

@ -98,10 +98,10 @@ export default {
return this.$store.getters['users/getIsUserOnline'](this.user.id) return this.$store.getters['users/getIsUserOnline'](this.user.id)
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() { timeFormat() {
return this.$store.state.serverSettings.timeFormat return this.$store.getters['getServerSetting']('timeFormat')
} }
}, },
methods: { methods: {

View file

@ -193,7 +193,7 @@ export default {
return `${process.env.serverUrl}/api/items/${this.libraryItemId}/download?token=${this.userToken}` return `${process.env.serverUrl}/api/items/${this.libraryItemId}/download?token=${this.userToken}`
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
}, },
userIsAdminOrUp() { userIsAdminOrUp() {
return this.$store.getters['user/getIsAdminOrUp'] return this.$store.getters['user/getIsAdminOrUp']
@ -819,6 +819,17 @@ export default {
-webkit-line-clamp: 4; -webkit-line-clamp: 4;
max-height: calc(6 * 1lh); max-height: calc(6 * 1lh);
} }
/* Safari-specific fix for the description clamping */
@supports (-webkit-touch-callout: none) {
#item-description {
position: relative;
display: block;
overflow: hidden;
max-height: calc(6 * 1lh);
}
}
#item-description.show-full { #item-description.show-full {
-webkit-line-clamp: unset; -webkit-line-clamp: unset;
max-height: 999rem; max-height: 999rem;

View file

@ -10,7 +10,7 @@
</tr> </tr>
<tr v-for="narrator in narrators" :key="narrator.id"> <tr v-for="narrator in narrators" :key="narrator.id">
<td> <td>
<p v-if="selectedNarrator?.id !== narrator.id" class="text-sm md:text-base text-gray-100">{{ narrator.name }}</p> <nuxt-link v-if="selectedNarrator?.id !== narrator.id" :to="`/library/${currentLibraryId}/bookshelf?filter=narrators.${narrator.id}`" class="text-sm md:text-base text-gray-100 hover:underline">{{ narrator.name }}</nuxt-link>
<form v-else @submit.prevent="saveClick"> <form v-else @submit.prevent="saveClick">
<ui-text-input v-model="newNarratorName" /> <ui-text-input v-model="newNarratorName" />
</form> </form>

View file

@ -141,7 +141,7 @@ export default {
return episodeIds return episodeIds
}, },
dateFormat() { dateFormat() {
return this.$store.state.serverSettings.dateFormat return this.$store.getters['getServerSetting']('dateFormat')
} }
}, },
methods: { methods: {

View file

@ -359,15 +359,14 @@ export default {
// Check if path already exists before starting upload // Check if path already exists before starting upload
// uploading fails if path already exists // uploading fails if path already exists
for (const item of items) { for (const item of items) {
const filepath = Path.join(this.selectedFolder.fullPath, item.directory)
const exists = await this.$axios const exists = await this.$axios
.$post(`/api/filesystem/pathexists`, { filepath, directory: item.directory, folderPath: this.selectedFolder.fullPath }) .$post(`/api/filesystem/pathexists`, { directory: item.directory, folderPath: this.selectedFolder.fullPath })
.then((data) => { .then((data) => {
if (data.exists) { if (data.exists) {
if (data.libraryItemTitle) { if (data.libraryItemTitle) {
this.$toast.error(this.$getString('ToastUploaderItemExistsInSubdirectoryError', [data.libraryItemTitle])) this.$toast.error(this.$getString('ToastUploaderItemExistsInSubdirectoryError', [data.libraryItemTitle]))
} else { } else {
this.$toast.error(this.$getString('ToastUploaderFilepathExistsError', [filepath])) this.$toast.error(this.$getString('ToastUploaderFilepathExistsError', [Path.join(this.selectedFolder.fullPath, item.directory)]))
} }
} }
return data.exists return data.exists

View file

@ -5,6 +5,7 @@ import { supplant } from './utils'
const defaultCode = 'en-us' const defaultCode = 'en-us'
const languageCodeMap = { const languageCodeMap = {
ar: { label: 'عربي', dateFnsLocale: 'ar' },
bg: { label: 'Български', dateFnsLocale: 'bg' }, bg: { label: 'Български', dateFnsLocale: 'bg' },
bn: { label: 'বাংলা', dateFnsLocale: 'bn' }, bn: { label: 'বাংলা', dateFnsLocale: 'bn' },
ca: { label: 'Català', dateFnsLocale: 'ca' }, ca: { label: 'Català', dateFnsLocale: 'ca' },

View file

@ -58,6 +58,9 @@ export const getters = {
getUserCanAccessAllLibraries: (state) => { getUserCanAccessAllLibraries: (state) => {
return !!state.user?.permissions?.accessAllLibraries return !!state.user?.permissions?.accessAllLibraries
}, },
getUserCanAccessExplicitContent: (state) => {
return !!state.user?.permissions?.accessExplicitContent
},
getLibrariesAccessible: (state, getters) => { getLibrariesAccessible: (state, getters) => {
if (!state.user) return [] if (!state.user) return []
if (getters.getUserCanAccessAllLibraries) return [] if (getters.getUserCanAccessAllLibraries) return []

File diff suppressed because it is too large Load diff

View file

@ -177,6 +177,7 @@
"HeaderPlaylist": "Плейлист", "HeaderPlaylist": "Плейлист",
"HeaderPlaylistItems": "Елементи от плейлист", "HeaderPlaylistItems": "Елементи от плейлист",
"HeaderPodcastsToAdd": "Подкасти за Добавяне", "HeaderPodcastsToAdd": "Подкасти за Добавяне",
"HeaderPresets": "Настройки по подразбиране",
"HeaderPreviewCover": "Преглед на Корица", "HeaderPreviewCover": "Преглед на Корица",
"HeaderRSSFeedGeneral": "RSS подробности", "HeaderRSSFeedGeneral": "RSS подробности",
"HeaderRSSFeedIsOpen": "RSS емисията е отворена", "HeaderRSSFeedIsOpen": "RSS емисията е отворена",
@ -219,6 +220,7 @@
"LabelAccountTypeAdmin": "Администратор", "LabelAccountTypeAdmin": "Администратор",
"LabelAccountTypeGuest": "Гост", "LabelAccountTypeGuest": "Гост",
"LabelAccountTypeUser": "Потребител", "LabelAccountTypeUser": "Потребител",
"LabelActivities": "Дейности",
"LabelActivity": "Дейност", "LabelActivity": "Дейност",
"LabelAddToCollection": "Добави в Колекция", "LabelAddToCollection": "Добави в Колекция",
"LabelAddToCollectionBatch": "Добави {0} Книги в Колекция", "LabelAddToCollectionBatch": "Добави {0} Книги в Колекция",
@ -253,7 +255,7 @@
"LabelBackupLocation": "Местоположение на Архив", "LabelBackupLocation": "Местоположение на Архив",
"LabelBackupsEnableAutomaticBackups": "Включи автоматично архивиране", "LabelBackupsEnableAutomaticBackups": "Включи автоматично архивиране",
"LabelBackupsEnableAutomaticBackupsHelp": "Архиви запазени в /metadata/backups", "LabelBackupsEnableAutomaticBackupsHelp": "Архиви запазени в /metadata/backups",
"LabelBackupsMaxBackupSize": "Максимален размер на архива (в GB)", "LabelBackupsMaxBackupSize": "Максимален размер на архива (в GB) (0 за неограничен)",
"LabelBackupsMaxBackupSizeHelp": "За защита срещу грешки в конфигурацията, архивите ще се провалят ако надхвърлят конфигурирания размер.", "LabelBackupsMaxBackupSizeHelp": "За защита срещу грешки в конфигурацията, архивите ще се провалят ако надхвърлят конфигурирания размер.",
"LabelBackupsNumberToKeep": "Брой архиви за запазване", "LabelBackupsNumberToKeep": "Брой архиви за запазване",
"LabelBackupsNumberToKeepHelp": "Само 1 архив ще бъде премахнат на веднъж, така че ако вече имате повече архиви от това трябва да ги премахнете ръчно.", "LabelBackupsNumberToKeepHelp": "Само 1 архив ще бъде премахнат на веднъж, така че ако вече имате повече архиви от това трябва да ги премахнете ръчно.",
@ -283,6 +285,7 @@
"LabelContinueSeries": "Продължи серии", "LabelContinueSeries": "Продължи серии",
"LabelCover": "Корица", "LabelCover": "Корица",
"LabelCoverImageURL": "URL на Корица", "LabelCoverImageURL": "URL на Корица",
"LabelCoverProvider": "Източник за обложки",
"LabelCreatedAt": "Създадено на", "LabelCreatedAt": "Създадено на",
"LabelCronExpression": "Cron израз", "LabelCronExpression": "Cron израз",
"LabelCurrent": "Текущо", "LabelCurrent": "Текущо",
@ -325,11 +328,20 @@
"LabelEncodingClearItemCache": "Уверете се, че периодично изчиствате кеша на елементите.", "LabelEncodingClearItemCache": "Уверете се, че периодично изчиствате кеша на елементите.",
"LabelEncodingFinishedM4B": "Завършеният M4B файл ще бъде поставен в папката на вашите аудиокниги на:", "LabelEncodingFinishedM4B": "Завършеният M4B файл ще бъде поставен в папката на вашите аудиокниги на:",
"LabelEncodingInfoEmbedded": "Метаданните ще бъдат вградени в аудио траковете в папката на вашите аудиокниги.", "LabelEncodingInfoEmbedded": "Метаданните ще бъдат вградени в аудио траковете в папката на вашите аудиокниги.",
"LabelEncodingStartedNavigation": "Когато задачата е стартирана, можете да смените тази страница.",
"LabelEncodingTimeWarning": "Кодирането може да отнеме до 30 минути.",
"LabelEncodingWarningAdvancedSettings": "Внимание: Не променяйте тези настройки, ако не сте запознати с ffmpeg настройките за кодиране.",
"LabelEncodingWatcherDisabled": "Ако сте изключили наблюдението на папки, ще е нужно да сканирате повторно аудио книгата.",
"LabelEnd": "Край", "LabelEnd": "Край",
"LabelEndOfChapter": "Край на глава", "LabelEndOfChapter": "Край на глава",
"LabelEpisode": "Епизод", "LabelEpisode": "Епизод",
"LabelEpisodeNotLinkedToRssFeed": "Епизодът не е свързан с RSS канал",
"LabelEpisodeNumber": "Епизод #{0}",
"LabelEpisodeTitle": "Заглавие на Епизод", "LabelEpisodeTitle": "Заглавие на Епизод",
"LabelEpisodeType": "Тип на Епизод", "LabelEpisodeType": "Тип на Епизод",
"LabelEpisodeUrlFromRssFeed": "URL адрес на епизод от RSS канал",
"LabelEpisodes": "Епизоди",
"LabelEpisodic": "Епизодичен",
"LabelExample": "Пример", "LabelExample": "Пример",
"LabelExpandSeries": "Покажи сериите", "LabelExpandSeries": "Покажи сериите",
"LabelExpandSubSeries": "Покажи съб сериите", "LabelExpandSubSeries": "Покажи съб сериите",
@ -341,7 +353,9 @@
"LabelFetchingMetadata": "Взимане на Метаданни", "LabelFetchingMetadata": "Взимане на Метаданни",
"LabelFile": "Файл", "LabelFile": "Файл",
"LabelFileBirthtime": "Дата на създаване на файла", "LabelFileBirthtime": "Дата на създаване на файла",
"LabelFileBornDate": "Роден {0}",
"LabelFileModified": "Дата на модификация на файла", "LabelFileModified": "Дата на модификация на файла",
"LabelFileModifiedDate": "Променен {0}",
"LabelFilename": "Име на файла", "LabelFilename": "Име на файла",
"LabelFilterByUser": "Филтриране по Потребител", "LabelFilterByUser": "Филтриране по Потребител",
"LabelFindEpisodes": "Намери Епизоди", "LabelFindEpisodes": "Намери Епизоди",
@ -355,14 +369,17 @@
"LabelFontScale": "Мащаб на шрифта", "LabelFontScale": "Мащаб на шрифта",
"LabelFontStrikethrough": "Зачертан", "LabelFontStrikethrough": "Зачертан",
"LabelFormat": "Формат", "LabelFormat": "Формат",
"LabelFull": "Пълен",
"LabelGenre": "Жанр", "LabelGenre": "Жанр",
"LabelGenres": "Жанрове", "LabelGenres": "Жанрове",
"LabelHardDeleteFile": "Пълно Изтриване на Файл", "LabelHardDeleteFile": "Пълно Изтриване на Файл",
"LabelHasEbook": "Има е-книга", "LabelHasEbook": "Има е-книга",
"LabelHasSupplementaryEbook": "Има допълнителна е-книга", "LabelHasSupplementaryEbook": "Има допълнителна е-книга",
"LabelHideSubtitles": "Скрий субтитри",
"LabelHighestPriority": "Най-висок Приоритет", "LabelHighestPriority": "Най-висок Приоритет",
"LabelHost": "Хост", "LabelHost": "Хост",
"LabelHour": "Час", "LabelHour": "Час",
"LabelHours": "Часа",
"LabelIcon": "Икона", "LabelIcon": "Икона",
"LabelImageURLFromTheWeb": "URL на Изображение от Интернет", "LabelImageURLFromTheWeb": "URL на Изображение от Интернет",
"LabelInProgress": "В процес на изпълнение", "LabelInProgress": "В процес на изпълнение",
@ -377,8 +394,11 @@
"LabelIntervalEvery6Hours": "Всеки 6 часа", "LabelIntervalEvery6Hours": "Всеки 6 часа",
"LabelIntervalEveryDay": "Всеки ден", "LabelIntervalEveryDay": "Всеки ден",
"LabelIntervalEveryHour": "Всеки час", "LabelIntervalEveryHour": "Всеки час",
"LabelIntervalEveryMinute": "Всяка минута",
"LabelInvert": "Обърни", "LabelInvert": "Обърни",
"LabelItem": "Елемент", "LabelItem": "Елемент",
"LabelJumpBackwardAmount": "Количество за прескачане назад",
"LabelJumpForwardAmount": "Количество за прескачане напред",
"LabelLanguage": "Език", "LabelLanguage": "Език",
"LabelLanguageDefaultServer": "Език по подразбиране на сървъра", "LabelLanguageDefaultServer": "Език по подразбиране на сървъра",
"LabelLanguages": "Езици", "LabelLanguages": "Езици",
@ -393,6 +413,7 @@
"LabelLess": "По-малко", "LabelLess": "По-малко",
"LabelLibrariesAccessibleToUser": "Библиотеки Достъпни за Потребителя", "LabelLibrariesAccessibleToUser": "Библиотеки Достъпни за Потребителя",
"LabelLibrary": "Библиотека", "LabelLibrary": "Библиотека",
"LabelLibraryFilterSublistEmpty": "Не {0}",
"LabelLibraryItem": "Елемент на Библиотека", "LabelLibraryItem": "Елемент на Библиотека",
"LabelLibraryName": "Име на Библиотека", "LabelLibraryName": "Име на Библиотека",
"LabelLimit": "Лимит", "LabelLimit": "Лимит",
@ -405,6 +426,10 @@
"LabelLowestPriority": "Най-нисък Приоритет", "LabelLowestPriority": "Най-нисък Приоритет",
"LabelMatchExistingUsersBy": "Съпостави съществуващи потребители по", "LabelMatchExistingUsersBy": "Съпостави съществуващи потребители по",
"LabelMatchExistingUsersByDescription": "Използва се за свързване на съществуващи потребители. След свързване потребителите ще бъдат съпоставени по уникален идентификатор от вашия доставчик на SSO", "LabelMatchExistingUsersByDescription": "Използва се за свързване на съществуващи потребители. След свързване потребителите ще бъдат съпоставени по уникален идентификатор от вашия доставчик на SSO",
"LabelMaxEpisodesToDownload": "Максимален брой епизоди за сваляне. Използвай 0 за неограничен.",
"LabelMaxEpisodesToDownloadPerCheck": "Максимален брой нови епизоди за сваляне за проверка",
"LabelMaxEpisodesToKeep": "Максимален брой епизоди за запазване",
"LabelMaxEpisodesToKeepHelp": "Стойност 0 указва без максимален лимит. След като нов епизод е автоматично свален, най-старият епизод ще бъде изтрит, ако имате повече от X епизода. Само по един епизод ще бъде изтриван за всеки нов свален такъв.",
"LabelMediaPlayer": "Медия Плейър", "LabelMediaPlayer": "Медия Плейър",
"LabelMediaType": "Тип медия", "LabelMediaType": "Тип медия",
"LabelMetaTag": "Мета Таг", "LabelMetaTag": "Мета Таг",
@ -412,6 +437,7 @@
"LabelMetadataOrderOfPrecedenceDescription": "По-високите източници на метаданни ще заменят по-ниските", "LabelMetadataOrderOfPrecedenceDescription": "По-високите източници на метаданни ще заменят по-ниските",
"LabelMetadataProvider": "Доставчик на Метаданни", "LabelMetadataProvider": "Доставчик на Метаданни",
"LabelMinute": "Минута", "LabelMinute": "Минута",
"LabelMinutes": "Минути",
"LabelMissing": "Липсващо", "LabelMissing": "Липсващо",
"LabelMissingEbook": "Няма електронна книга", "LabelMissingEbook": "Няма електронна книга",
"LabelMissingSupplementaryEbook": "Няма допълнителна електронна книга", "LabelMissingSupplementaryEbook": "Няма допълнителна електронна книга",
@ -449,11 +475,14 @@
"LabelOpenIDGroupClaimDescription": "Име на OpenID твърдението, което съдържа списък с групите на потребителя. Обикновено се нарича <code>groups</code>. <b>Ако е конфигурирано</b>, приложението автоматично ще присвоява роли въз основа на членството на потребителя в групи, при условие че тези групи са наименувани без чувствителност към регистъра като 'admin', 'user' или 'guest' в твърдението. Твърдението трябва да съдържа списък и ако потребителят принадлежи към множество групи, приложението ще присвои ролята, съответстваща на най-високото ниво на достъп. Ако няма съвпадение с група, достъпът ще бъде отказан.", "LabelOpenIDGroupClaimDescription": "Име на OpenID твърдението, което съдържа списък с групите на потребителя. Обикновено се нарича <code>groups</code>. <b>Ако е конфигурирано</b>, приложението автоматично ще присвоява роли въз основа на членството на потребителя в групи, при условие че тези групи са наименувани без чувствителност към регистъра като 'admin', 'user' или 'guest' в твърдението. Твърдението трябва да съдържа списък и ако потребителят принадлежи към множество групи, приложението ще присвои ролята, съответстваща на най-високото ниво на достъп. Ако няма съвпадение с група, достъпът ще бъде отказан.",
"LabelOpenRSSFeed": "Отвори RSS Feed", "LabelOpenRSSFeed": "Отвори RSS Feed",
"LabelOverwrite": "Презапиши", "LabelOverwrite": "Презапиши",
"LabelPaginationPageXOfY": "Страница {0} от {1}",
"LabelPassword": "Парола", "LabelPassword": "Парола",
"LabelPath": "Път", "LabelPath": "Път",
"LabelPermanent": "Постоянен",
"LabelPermissionsAccessAllLibraries": "Може да достъпи до всички библиотеки", "LabelPermissionsAccessAllLibraries": "Може да достъпи до всички библиотеки",
"LabelPermissionsAccessAllTags": "Може да достъпи всички тагове", "LabelPermissionsAccessAllTags": "Може да достъпи всички тагове",
"LabelPermissionsAccessExplicitContent": "Може да достъпи експлицитно съдържание", "LabelPermissionsAccessExplicitContent": "Може да достъпи експлицитно съдържание",
"LabelPermissionsCreateEreader": "Може да създава електронен четец",
"LabelPermissionsDelete": "Може да трие", "LabelPermissionsDelete": "Може да трие",
"LabelPermissionsDownload": "Може да сваля", "LabelPermissionsDownload": "Може да сваля",
"LabelPermissionsUpdate": "Може да обновява", "LabelPermissionsUpdate": "Може да обновява",
@ -461,6 +490,8 @@
"LabelPersonalYearReview": "Преглед на годината Ви ({0})", "LabelPersonalYearReview": "Преглед на годината Ви ({0})",
"LabelPhotoPathURL": "Път/URL на Снимка", "LabelPhotoPathURL": "Път/URL на Снимка",
"LabelPlayMethod": "Метод на Пускане", "LabelPlayMethod": "Метод на Пускане",
"LabelPlaybackRateIncrementDecrement": "Размер на увеличаване/намаляне при скоростта на възпроизвеждане",
"LabelPlayerChapterNumberMarker": "{0} от {1}",
"LabelPlaylists": "Плейлисти", "LabelPlaylists": "Плейлисти",
"LabelPodcast": "Подкаст", "LabelPodcast": "Подкаст",
"LabelPodcastSearchRegion": "Регион за Търсене на Подкасти", "LabelPodcastSearchRegion": "Регион за Търсене на Подкасти",
@ -472,9 +503,12 @@
"LabelPrimaryEbook": "Основна Електронна Книга", "LabelPrimaryEbook": "Основна Електронна Книга",
"LabelProgress": "Прогрес", "LabelProgress": "Прогрес",
"LabelProvider": "Доставчик", "LabelProvider": "Доставчик",
"LabelProviderAuthorizationValue": "Стойност на Authorization Header",
"LabelPubDate": "Дата на публикуване", "LabelPubDate": "Дата на публикуване",
"LabelPublishYear": "Година на публикуване", "LabelPublishYear": "Година на публикуване",
"LabelPublishedDate": "Публикувани {0}", "LabelPublishedDate": "Публикувани {0}",
"LabelPublishedDecade": "Десетилетие на публикуване",
"LabelPublishedDecades": "Десетилетия на публикуване",
"LabelPublisher": "Издател", "LabelPublisher": "Издател",
"LabelPublishers": "Издателство", "LabelPublishers": "Издателство",
"LabelRSSFeedCustomOwnerEmail": "Персонализиран имейл на собственика", "LabelRSSFeedCustomOwnerEmail": "Персонализиран имейл на собственика",
@ -484,6 +518,7 @@
"LabelRSSFeedSlug": "идентификатор на RSS емисия", "LabelRSSFeedSlug": "идентификатор на RSS емисия",
"LabelRSSFeedURL": "URL на RSS емисия", "LabelRSSFeedURL": "URL на RSS емисия",
"LabelRandomly": "Случайно", "LabelRandomly": "Случайно",
"LabelReAddSeriesToContinueListening": "Добави отново в \"Продължете да слушате\"",
"LabelRead": "Прочети", "LabelRead": "Прочети",
"LabelReadAgain": "Прочети отново", "LabelReadAgain": "Прочети отново",
"LabelReadEbookWithoutProgress": "Прочети електронната книга без записване прогрес", "LabelReadEbookWithoutProgress": "Прочети електронната книга без записване прогрес",
@ -493,29 +528,40 @@
"LabelRedo": "Повтори", "LabelRedo": "Повтори",
"LabelRegion": "Регион", "LabelRegion": "Регион",
"LabelReleaseDate": "Дата на Издаване", "LabelReleaseDate": "Дата на Издаване",
"LabelRemoveAllMetadataAbs": "Премахни всички metadata.abs файлове",
"LabelRemoveAllMetadataJson": "Премахни всички metadata.json файлове",
"LabelRemoveAudibleBranding": "Премахни въведението и заключението на Audible от главите",
"LabelRemoveCover": "Премахни Корица", "LabelRemoveCover": "Премахни Корица",
"LabelRemoveMetadataFile": "Премахни файловете с метаданни от папката на библиотеката",
"LabelRemoveMetadataFileHelp": "Премахни всички metadata.json и metadata.abs файлове от вашата {0} папка.",
"LabelRowsPerPage": "Редове на Страница", "LabelRowsPerPage": "Редове на Страница",
"LabelSearchTerm": "Търси Термин", "LabelSearchTerm": "Търси Термин",
"LabelSearchTitle": "Търси Заглавие", "LabelSearchTitle": "Търси Заглавие",
"LabelSearchTitleOrASIN": "Търси Заглавие или ASIN", "LabelSearchTitleOrASIN": "Търси Заглавие или ASIN",
"LabelSeason": "Сезон", "LabelSeason": "Сезон",
"LabelSeasonNumber": "Сезон #{0}",
"LabelSelectAll": "Избери всичко", "LabelSelectAll": "Избери всичко",
"LabelSelectAllEpisodes": "Избери всички епизоди", "LabelSelectAllEpisodes": "Избери всички епизоди",
"LabelSelectEpisodesShowing": "Избери {0} епизоди показани", "LabelSelectEpisodesShowing": "Избери {0} епизоди показани",
"LabelSelectUsers": "Избери Потребители", "LabelSelectUsers": "Избери Потребители",
"LabelSendEbookToDevice": "Изпрати електронна книга до ...", "LabelSendEbookToDevice": "Изпрати електронна книга до ...",
"LabelSequence": "Последователност", "LabelSequence": "Последователност",
"LabelSerial": "Сериал",
"LabelSeries": "От сериите", "LabelSeries": "От сериите",
"LabelSeriesName": "Име на Серия", "LabelSeriesName": "Име на Серия",
"LabelSeriesProgress": "Прогрес на Серия", "LabelSeriesProgress": "Прогрес на Серия",
"LabelServerLogLevel": "Ниво на сървърен журнал",
"LabelServerYearReview": "Преглед на годината на сървъра ({0})", "LabelServerYearReview": "Преглед на годината на сървъра ({0})",
"LabelSetEbookAsPrimary": "Направи главен", "LabelSetEbookAsPrimary": "Направи главен",
"LabelSetEbookAsSupplementary": "Направи второстепенен", "LabelSetEbookAsSupplementary": "Направи второстепенен",
"LabelSettingsAllowIframe": "Разреши вграждане в iframe",
"LabelSettingsAudiobooksOnly": "Само аудиокниги", "LabelSettingsAudiobooksOnly": "Само аудиокниги",
"LabelSettingsAudiobooksOnlyHelp": "Активирането на тази настройка ще игнорира файловете на електронни книги, освен ако не са в папка с аудиокниги, в което случай ще бъдат зададени като допълнителни електронни книги", "LabelSettingsAudiobooksOnlyHelp": "Активирането на тази настройка ще игнорира файловете на електронни книги, освен ако не са в папка с аудиокниги, в което случай ще бъдат зададени като допълнителни електронни книги",
"LabelSettingsBookshelfViewHelp": "Скеуморфен дизайн с дървени рафтове", "LabelSettingsBookshelfViewHelp": "Скеуморфен дизайн с дървени рафтове",
"LabelSettingsChromecastSupport": "Chromecast поддръжка", "LabelSettingsChromecastSupport": "Chromecast поддръжка",
"LabelSettingsDateFormat": "Формат на Дата", "LabelSettingsDateFormat": "Формат на Дата",
"LabelSettingsEnableWatcher": "Автоматично сканиране на библиотеките за промени",
"LabelSettingsEnableWatcherForLibrary": "Автоматично сканиране на библиотеката за промени",
"LabelSettingsEnableWatcherHelp": "Включва автоматичното добавяне/обновяване на елементи, когато се открият промени във файловете. *Изисква рестарт на сървъра", "LabelSettingsEnableWatcherHelp": "Включва автоматичното добавяне/обновяване на елементи, когато се открият промени във файловете. *Изисква рестарт на сървъра",
"LabelSettingsEpubsAllowScriptedContent": "Позволи скриптово съдържание в epub-и", "LabelSettingsEpubsAllowScriptedContent": "Позволи скриптово съдържание в epub-и",
"LabelSettingsEpubsAllowScriptedContentHelp": "Позволи epub файловете да изпълняват скриптове. Препоръчително е да бъде изключено освен ако не се доверявате на източника на epub файловете.", "LabelSettingsEpubsAllowScriptedContentHelp": "Позволи epub файловете да изпълняват скриптове. Препоръчително е да бъде изключено освен ако не се доверявате на източника на epub файловете.",
@ -527,10 +573,13 @@
"LabelSettingsHideSingleBookSeriesHelp": "Сериите с една книга ще бъдат скрити от страницата на серията и рафтовете на началната страница.", "LabelSettingsHideSingleBookSeriesHelp": "Сериите с една книга ще бъдат скрити от страницата на серията и рафтовете на началната страница.",
"LabelSettingsHomePageBookshelfView": "Начална страница изглед на рафт", "LabelSettingsHomePageBookshelfView": "Начална страница изглед на рафт",
"LabelSettingsLibraryBookshelfView": "Библиотека изглед на рафт", "LabelSettingsLibraryBookshelfView": "Библиотека изглед на рафт",
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Процент завършеност е по-голям от",
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Оставащо време е по-малко от (секунди)",
"LabelSettingsLibraryMarkAsFinishedWhen": "Отбелязване на мултимедиен елемент като завършен когато",
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Пропусни предишни книги в Продължи Поредица", "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Пропусни предишни книги в Продължи Поредица",
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Рафтът на началната страница 'Продължи поредицата' показва първата книга, която не е започната в поредици, в които има поне една завършена книга и няма книги в процес на четене. Активирането на тази настройка ще продължи поредицата от най-далечната завършена книга вместо от първата незапочната книга.", "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Рафтът на началната страница 'Продължи поредицата' показва първата книга, която не е започната в поредици, в които има поне една завършена книга и няма книги в процес на четене. Активирането на тази настройка ще продължи поредицата от най-далечната завършена книга вместо от първата незапочната книга.",
"LabelSettingsParseSubtitles": "Извлечи подзаглавия", "LabelSettingsParseSubtitles": "Извлечи подзаглавия",
"LabelSettingsParseSubtitlesHelp": "Извлича подзаглавия от имената на папките на аудиокнигите.<br>Подзаглавията трябва да бъдат разделени с \" - \"<br>например \"Заглавие на Книга - Тук е Подзаглавито\" има подзаглавие \"Тук е Подзаглавито\"", "LabelSettingsParseSubtitlesHelp": "Извлича подзаглавия от имената на папките на аудио книгите.<br>Подзаглавията трябва да бъдат разделени с \" - \"<br>например \"Заглавие на Книга - Тук е подзаглавието\" има подзаглавие \"Тук е подзаглавието\"",
"LabelSettingsPreferMatchedMetadata": "Предпочети съвпадащи метаданни", "LabelSettingsPreferMatchedMetadata": "Предпочети съвпадащи метаданни",
"LabelSettingsPreferMatchedMetadataHelp": "Съвпадащите данни ще заменят детайлите на елемента при използване на Бързо Съпоставяне. По подразбиране Бързото Съпоставяне ще попълни само липсващите детайли.", "LabelSettingsPreferMatchedMetadataHelp": "Съвпадащите данни ще заменят детайлите на елемента при използване на Бързо Съпоставяне. По подразбиране Бързото Съпоставяне ще попълни само липсващите детайли.",
"LabelSettingsSkipMatchingBooksWithASIN": "Пропусни съвпадащи книги, които вече имат ASIN", "LabelSettingsSkipMatchingBooksWithASIN": "Пропусни съвпадащи книги, които вече имат ASIN",
@ -544,11 +593,19 @@
"LabelSettingsStoreMetadataWithItem": "Запази метаданните с елемента", "LabelSettingsStoreMetadataWithItem": "Запази метаданните с елемента",
"LabelSettingsStoreMetadataWithItemHelp": "По подразбиране метаданните се съхраняват в /metadata/items, като активирате тази настройка метаданните ще се съхраняват в папката на елемента на вашата библиотека", "LabelSettingsStoreMetadataWithItemHelp": "По подразбиране метаданните се съхраняват в /metadata/items, като активирате тази настройка метаданните ще се съхраняват в папката на елемента на вашата библиотека",
"LabelSettingsTimeFormat": "Формат на Време", "LabelSettingsTimeFormat": "Формат на Време",
"LabelShare": "Сподели",
"LabelShareDownloadableHelp": "Разреши на потребителите през връзка за споделяне да свалят zip файл с мултимедийния елемент.",
"LabelShareOpen": "Общодостъпно",
"LabelShareURL": "URL за споделяне",
"LabelShowAll": "Покажи всички", "LabelShowAll": "Покажи всички",
"LabelShowSeconds": "Покажи секунди", "LabelShowSeconds": "Покажи секунди",
"LabelShowSubtitles": "Показвай подзаглавия",
"LabelSize": "Размер", "LabelSize": "Размер",
"LabelSleepTimer": "Таймер за изключване", "LabelSleepTimer": "Таймер за изключване",
"LabelSlug": "Слъг", "LabelSlug": "Слъг",
"LabelSortAscending": "Възходящ",
"LabelSortDescending": "Низходящ",
"LabelSortPubDate": "Подреди по дата на публикуване",
"LabelStart": "Старт", "LabelStart": "Старт",
"LabelStartTime": "Начално Време", "LabelStartTime": "Начално Време",
"LabelStarted": "Стартирано", "LabelStarted": "Стартирано",
@ -583,6 +640,11 @@
"LabelThemeDark": "Тъмна", "LabelThemeDark": "Тъмна",
"LabelThemeLight": "Светла", "LabelThemeLight": "Светла",
"LabelTimeBase": "Времева Основа", "LabelTimeBase": "Времева Основа",
"LabelTimeDurationXHours": "{0} часа",
"LabelTimeDurationXMinutes": "{0} минути",
"LabelTimeDurationXSeconds": "{0} секунди",
"LabelTimeInMinutes": "Време в минути",
"LabelTimeLeft": "остава {0}",
"LabelTimeListened": "Време Слушано", "LabelTimeListened": "Време Слушано",
"LabelTimeListenedToday": "Време Слушано Днес", "LabelTimeListenedToday": "Време Слушано Днес",
"LabelTimeRemaining": "{0} оставащи", "LabelTimeRemaining": "{0} оставащи",
@ -590,6 +652,7 @@
"LabelTitle": "Заглавие", "LabelTitle": "Заглавие",
"LabelToolsEmbedMetadata": "Вграждане на Метаданни", "LabelToolsEmbedMetadata": "Вграждане на Метаданни",
"LabelToolsEmbedMetadataDescription": "Вграждане на метаданни в аудио файлове, включително корица и глави.", "LabelToolsEmbedMetadataDescription": "Вграждане на метаданни в аудио файлове, включително корица и глави.",
"LabelToolsM4bEncoder": "M4B кодировчик",
"LabelToolsMakeM4b": "Направи M4B Аудиокнига Файл", "LabelToolsMakeM4b": "Направи M4B Аудиокнига Файл",
"LabelToolsMakeM4bDescription": "Генериране на .M4B аудиокнига файл с вградени метаданни, корица и глави.", "LabelToolsMakeM4bDescription": "Генериране на .M4B аудиокнига файл с вградени метаданни, корица и глави.",
"LabelToolsSplitM4b": "Раздели M4B на MP3-ки", "LabelToolsSplitM4b": "Раздели M4B на MP3-ки",
@ -602,26 +665,32 @@
"LabelTracksMultiTrack": "Многоканален", "LabelTracksMultiTrack": "Многоканален",
"LabelTracksNone": "Няма канали", "LabelTracksNone": "Няма канали",
"LabelTracksSingleTrack": "Единичен канал", "LabelTracksSingleTrack": "Единичен канал",
"LabelTrailer": "Трейлър",
"LabelType": "Тип", "LabelType": "Тип",
"LabelUnabridged": "Несъкратен", "LabelUnabridged": "Несъкратен",
"LabelUndo": "Отмени", "LabelUndo": "Отмени",
"LabelUnknown": "Неизвестен", "LabelUnknown": "Неизвестен",
"LabelUnknownPublishDate": "Неизвестна дата на публикуване",
"LabelUpdateCover": "Обнови Корица", "LabelUpdateCover": "Обнови Корица",
"LabelUpdateCoverHelp": "Позволи презаписване на съществуващите корици за избраните книги, когато се намери съвпадение", "LabelUpdateCoverHelp": "Позволи презаписване на съществуващите корици за избраните книги, когато се намери съвпадение",
"LabelUpdateDetails": "Обнови Детайли", "LabelUpdateDetails": "Обнови Детайли",
"LabelUpdateDetailsHelp": "Позволи презаписване на съществуващите детайли за избраните книги, когато се намери съвпадение", "LabelUpdateDetailsHelp": "Позволи презаписване на съществуващите детайли за избраните книги, когато се намери съвпадение",
"LabelUpdatedAt": "Обновено на", "LabelUpdatedAt": "Обновено на",
"LabelUploaderDragAndDrop": "Плъзни и Пусни Файлове или Папки", "LabelUploaderDragAndDrop": "Плъзни и Пусни Файлове или Папки",
"LabelUploaderDragAndDropFilesOnly": "Извлачване на файлове",
"LabelUploaderDropFiles": "Пусни Файлове", "LabelUploaderDropFiles": "Пусни Файлове",
"LabelUploaderItemFetchMetadataHelp": "Автоматично вземи заглавие, автор и серия", "LabelUploaderItemFetchMetadataHelp": "Автоматично вземи заглавие, автор и серия",
"LabelUseAdvancedOptions": "Използвай разширени опции",
"LabelUseChapterTrack": "Използвай канал за глава", "LabelUseChapterTrack": "Използвай канал за глава",
"LabelUseFullTrack": "Използвай пълен канал", "LabelUseFullTrack": "Използвай пълен канал",
"LabelUseZeroForUnlimited": "Използвай 0 за неограничен",
"LabelUser": "Потребител", "LabelUser": "Потребител",
"LabelUsername": "Потребителско име", "LabelUsername": "Потребителско име",
"LabelValue": "Стойност", "LabelValue": "Стойност",
"LabelVersion": "Версия", "LabelVersion": "Версия",
"LabelViewBookmarks": "Виж Отметки", "LabelViewBookmarks": "Виж Отметки",
"LabelViewChapters": "Виж Глави", "LabelViewChapters": "Виж Глави",
"LabelViewPlayerSettings": "Виж настройки на плеъра",
"LabelViewQueue": "Виж Опашка", "LabelViewQueue": "Виж Опашка",
"LabelVolume": "Сила на Звука", "LabelVolume": "Сила на Звука",
"LabelWeekdaysToRun": "Делници за изпълнение", "LabelWeekdaysToRun": "Делници за изпълнение",

View file

@ -177,6 +177,7 @@
"HeaderPlaylist": "Llista de Reproducció", "HeaderPlaylist": "Llista de Reproducció",
"HeaderPlaylistItems": "Elements de la Llista de Reproducció", "HeaderPlaylistItems": "Elements de la Llista de Reproducció",
"HeaderPodcastsToAdd": "Pòdcasts a afegir", "HeaderPodcastsToAdd": "Pòdcasts a afegir",
"HeaderPresets": "Valors predefinits",
"HeaderPreviewCover": "Previsualització de la Portada", "HeaderPreviewCover": "Previsualització de la Portada",
"HeaderRSSFeedGeneral": "Detalls RSS", "HeaderRSSFeedGeneral": "Detalls RSS",
"HeaderRSSFeedIsOpen": "La Font RSS està oberta", "HeaderRSSFeedIsOpen": "La Font RSS està oberta",
@ -439,7 +440,7 @@
"LabelMinute": "Minut", "LabelMinute": "Minut",
"LabelMinutes": "Minuts", "LabelMinutes": "Minuts",
"LabelMissing": "Absent", "LabelMissing": "Absent",
"LabelMissingEbook": "No té ebook", "LabelMissingEbook": "No té llibre electrònic",
"LabelMissingSupplementaryEbook": "No té ebook complementari", "LabelMissingSupplementaryEbook": "No té ebook complementari",
"LabelMobileRedirectURIs": "URI de redirecció mòbil permeses", "LabelMobileRedirectURIs": "URI de redirecció mòbil permeses",
"LabelMobileRedirectURIsDescription": "Aquesta és una llista blanca d'URI de redirecció vàlides per a aplicacions mòbils. El predeterminat és <code> audiobookshelf</code>, que pots eliminar o complementar amb URI addicionals per a la integració d'aplicacions de tercers. Usant un asterisc (<code> *</code>) com a única entrada que permet qualsevol URI.", "LabelMobileRedirectURIsDescription": "Aquesta és una llista blanca d'URI de redirecció vàlides per a aplicacions mòbils. El predeterminat és <code> audiobookshelf</code>, que pots eliminar o complementar amb URI addicionals per a la integració d'aplicacions de tercers. Usant un asterisc (<code> *</code>) com a única entrada que permet qualsevol URI.",
@ -497,25 +498,25 @@
"LabelPodcastType": "Tipus de pòdcast", "LabelPodcastType": "Tipus de pòdcast",
"LabelPodcasts": "Pòdcasts", "LabelPodcasts": "Pòdcasts",
"LabelPort": "Port", "LabelPort": "Port",
"LabelPrefixesToIgnore": "Prefixos per Ignorar (no distingeix entre majúscules i minúscules.)", "LabelPrefixesToIgnore": "Prefixos a ignorar (no distingeix entre majúscules i minúscules)",
"LabelPreventIndexing": "Evita que el vostre canal l'indexin els directoris de pòdcasts de l'iTunes i Google", "LabelPreventIndexing": "Evita que el vostre canal l'indexin els directoris de pòdcasts de l'iTunes i Google",
"LabelPrimaryEbook": "Ebook Principal", "LabelPrimaryEbook": "Llibre electrònic principal",
"LabelProgress": "Progrés", "LabelProgress": "Progrés",
"LabelProvider": "Proveïdor", "LabelProvider": "Proveïdor",
"LabelProviderAuthorizationValue": "Valor de l'encapçalament d'autorització", "LabelProviderAuthorizationValue": "Valor de l'encapçalament d'autorització",
"LabelPubDate": "Data de Publicació", "LabelPubDate": "Data de publicació",
"LabelPublishYear": "Any de Publicació", "LabelPublishYear": "Any de publicació",
"LabelPublishedDate": "Publicat {0}", "LabelPublishedDate": "Publicat {0}",
"LabelPublishedDecade": "Dècada de Publicació", "LabelPublishedDecade": "Dècada de publicació",
"LabelPublishedDecades": "Dècades Publicades", "LabelPublishedDecades": "Dècades Publicades",
"LabelPublisher": "Editor", "LabelPublisher": "Editor",
"LabelPublishers": "Editors", "LabelPublishers": "Editors",
"LabelRSSFeedCustomOwnerEmail": "Correu Electrònic Personalitzat del Propietari", "LabelRSSFeedCustomOwnerEmail": "Correu Electrònic Personalitzat del Propietari",
"LabelRSSFeedCustomOwnerName": "Nom Personalitzat del Propietari", "LabelRSSFeedCustomOwnerName": "Nom Personalitzat del Propietari",
"LabelRSSFeedOpen": "Font RSS Oberta", "LabelRSSFeedOpen": "Font RSS Oberta",
"LabelRSSFeedPreventIndexing": "Evitar l'indexació", "LabelRSSFeedPreventIndexing": "Evita la indexació",
"LabelRSSFeedSlug": "Font RSS Slug", "LabelRSSFeedSlug": "URL semàntic del canal RSS",
"LabelRSSFeedURL": "URL de la Font RSS", "LabelRSSFeedURL": "URL del canal RSS",
"LabelRandomly": "A l'atzar", "LabelRandomly": "A l'atzar",
"LabelReAddSeriesToContinueListening": "Reafegir la sèrie per continuar escoltant-la", "LabelReAddSeriesToContinueListening": "Reafegir la sèrie per continuar escoltant-la",
"LabelRead": "Llegit", "LabelRead": "Llegit",
@ -524,39 +525,40 @@
"LabelRecentSeries": "Sèries recents", "LabelRecentSeries": "Sèries recents",
"LabelRecentlyAdded": "Addicions recents", "LabelRecentlyAdded": "Addicions recents",
"LabelRecommended": "Recomanats", "LabelRecommended": "Recomanats",
"LabelRedo": "Refer", "LabelRedo": "Refés",
"LabelRegion": "Regió", "LabelRegion": "Regió",
"LabelReleaseDate": "Data d'Estrena", "LabelReleaseDate": "Data d'estrena",
"LabelRemoveAllMetadataAbs": "Eliminar tots els fitxers metadata.abs", "LabelRemoveAllMetadataAbs": "Elimina tots els fitxers metadata.abs",
"LabelRemoveAllMetadataJson": "Eliminar tots els fitxers metadata.json", "LabelRemoveAllMetadataJson": "Elimina tots els fitxers metadata.json",
"LabelRemoveCover": "Eliminar Coberta", "LabelRemoveAudibleBranding": "Elimina la introducció i el tancament de l'Audible dels capítols",
"LabelRemoveCover": "Elimina la coberta",
"LabelRemoveMetadataFile": "Eliminar fitxers de metadades en carpetes d'elements de biblioteca", "LabelRemoveMetadataFile": "Eliminar fitxers de metadades en carpetes d'elements de biblioteca",
"LabelRemoveMetadataFileHelp": "Elimina tots els fitxers metadata.json i metadata.abs de les vostres carpetes {0}.", "LabelRemoveMetadataFileHelp": "Elimina tots els fitxers metadata.json i metadata.abs de les vostres carpetes {0}.",
"LabelRowsPerPage": "Files per Pàgina", "LabelRowsPerPage": "Files per pàgina",
"LabelSearchTerm": "Cercar Terme", "LabelSearchTerm": "Cerca terme",
"LabelSearchTitle": "Cercar Títol", "LabelSearchTitle": "Cerca títol",
"LabelSearchTitleOrASIN": "Cercar Títol o ASIN", "LabelSearchTitleOrASIN": "Cerca títol o ASIN",
"LabelSeason": "Temporada", "LabelSeason": "Temporada",
"LabelSeasonNumber": "Temporada #{0}", "LabelSeasonNumber": "{0}a temporada",
"LabelSelectAll": "Seleccionar tot", "LabelSelectAll": "Selecciona-ho tot",
"LabelSelectAllEpisodes": "Seleccionar tots els episodis", "LabelSelectAllEpisodes": "Selecciona tots els episodis",
"LabelSelectEpisodesShowing": "Seleccionar els {0} episodis visibles", "LabelSelectEpisodesShowing": "Seleccionar els {0} episodis visibles",
"LabelSelectUsers": "Seleccionar usuaris", "LabelSelectUsers": "Seleccionar usuaris",
"LabelSendEbookToDevice": "Enviar Ebook a...", "LabelSendEbookToDevice": "Enviar Ebook a...",
"LabelSequence": "Seqüència", "LabelSequence": "Seqüència",
"LabelSerial": "En sèrie", "LabelSerial": "En sèrie",
"LabelSeries": "Sèries", "LabelSeries": "Sèrie",
"LabelSeriesName": "Nom de la Sèrie", "LabelSeriesName": "Nom de la sèrie",
"LabelSeriesProgress": "Progrés de la Sèrie", "LabelSeriesProgress": "Progrés de la sèrie",
"LabelServerLogLevel": "Nivell de registre del servidor", "LabelServerLogLevel": "Nivell de registre del servidor",
"LabelServerYearReview": "Resum de l'any del servidor ({0})", "LabelServerYearReview": "Resum de l'any del servidor ({0})",
"LabelSetEbookAsPrimary": "Establir com a principal", "LabelSetEbookAsPrimary": "Establir com a principal",
"LabelSetEbookAsSupplementary": "Establir com a suplementari", "LabelSetEbookAsSupplementary": "Establir com a suplementari",
"LabelSettingsAudiobooksOnly": "Només Audiollibres", "LabelSettingsAudiobooksOnly": "Només audiollibres",
"LabelSettingsAudiobooksOnlyHelp": "Activant aquesta opció s'ignoraran els fitxers d'ebook, excepte si estan dins d'una carpeta d'audiollibre, en aquest cas es marcaran com ebooks suplementaris", "LabelSettingsAudiobooksOnlyHelp": "En activar aquesta opció s'ignoraran els fitxers de llibre electrònic, excepte si estan dins d'una carpeta d'audiollibre; en aquest cas es marcaran com a llibres suplementaris",
"LabelSettingsBookshelfViewHelp": "Disseny esqueomorf amb prestatgeries de fusta", "LabelSettingsBookshelfViewHelp": "Disseny esqueomorf amb prestatgeries de fusta",
"LabelSettingsChromecastSupport": "Compatibilitat amb Chromecast", "LabelSettingsChromecastSupport": "Compatibilitat amb Chromecast",
"LabelSettingsDateFormat": "Format de Data", "LabelSettingsDateFormat": "Format de data",
"LabelSettingsEnableWatcherHelp": "Permet afegir/actualitzar elements automàticament quan es detectin canvis en els fitxers. *Requereix reiniciar el servidor", "LabelSettingsEnableWatcherHelp": "Permet afegir/actualitzar elements automàticament quan es detectin canvis en els fitxers. *Requereix reiniciar el servidor",
"LabelSettingsEpubsAllowScriptedContent": "Permetre scripts en epubs", "LabelSettingsEpubsAllowScriptedContent": "Permetre scripts en epubs",
"LabelSettingsEpubsAllowScriptedContentHelp": "Permetre que els fitxers epub executin scripts. Es recomana mantenir aquesta opció desactivada tret que confiïs en l'origen dels fitxers epub.", "LabelSettingsEpubsAllowScriptedContentHelp": "Permetre que els fitxers epub executin scripts. Es recomana mantenir aquesta opció desactivada tret que confiïs en l'origen dels fitxers epub.",
@ -576,6 +578,8 @@
"LabelSize": "Mida", "LabelSize": "Mida",
"LabelSleepTimer": "Temporitzador de repòs", "LabelSleepTimer": "Temporitzador de repòs",
"LabelSlug": "Slug", "LabelSlug": "Slug",
"LabelSortAscending": "Ascendent",
"LabelSortDescending": "Descendent",
"LabelStart": "Inicia", "LabelStart": "Inicia",
"LabelStartTime": "Hora d'inici", "LabelStartTime": "Hora d'inici",
"LabelStarted": "Iniciat", "LabelStarted": "Iniciat",
@ -801,23 +805,25 @@
"MessageQuickEmbedInProgress": "Integració ràpida en procés", "MessageQuickEmbedInProgress": "Integració ràpida en procés",
"MessageQuickEmbedQueue": "En cua per a inserció ràpida ({0} en cua)", "MessageQuickEmbedQueue": "En cua per a inserció ràpida ({0} en cua)",
"MessageQuickMatchAllEpisodes": "Combina ràpidament tots els episodis", "MessageQuickMatchAllEpisodes": "Combina ràpidament tots els episodis",
"MessageQuickMatchDescription": "Omple detalls d'elements buits i portades amb els primers resultats de '{0}'. No sobreescriu els detalls tret que l'opció \"Preferir metadades trobades\" del servidor estigui habilitada.", "MessageQuickMatchDescription": "Emplena els detalls i la coberta dels elements buits amb el resultat de la primera coincidència de «{0}». No sobreescriu els detalls tret que s'activi el paràmetre del servidor «Prefereix metadades coincidents».",
"MessageRemoveChapter": "Eliminar capítols", "MessageRemoveChapter": "Elimina el capítol",
"MessageRemoveEpisodes": "Eliminar {0} episodi(s)", "MessageRemoveEpisodes": "Elimina {0} episodi(s)",
"MessageRemoveFromPlayerQueue": "Eliminar de la cua del reproductor", "MessageRemoveFromPlayerQueue": "Elimina de la cua del reproductor",
"MessageRemoveUserWarning": "Segur que voleu suprimir permanentment l'usuari «{0}»?", "MessageRemoveUserWarning": "Segur que voleu suprimir permanentment l'usuari «{0}»?",
"MessageReportBugsAndContribute": "Informa d'errors, sol·licita funcions i contribueix a", "MessageReportBugsAndContribute": "Informa d'errors, sol·licita funcions i contribueix a",
"MessageResetChaptersConfirm": "Segur que voleu desfer els canvis i revertir els capítols al seu estat original?", "MessageResetChaptersConfirm": "Segur que voleu desfer els canvis i revertir els capítols al seu estat original?",
"MessageRestoreBackupConfirm": "Segur que voleu restaurar la còpia de seguretat creada a", "MessageRestoreBackupConfirm": "Segur que voleu restaurar la còpia de seguretat creada a",
"MessageRestoreBackupWarning": "Restaurar sobreescriurà tota la base de dades situada a /config i les imatges de portades a /metadata/items i /metadata/authors.<br /><br />La còpia de seguretat no modifica cap fitxer a les carpetes de la teva biblioteca. Si has activat l'opció del servidor per guardar portades i metadades a les carpetes de la biblioteca, aquests fitxers no es guarden ni sobreescriuen.<br /><br />Tots els clients que utilitzin el teu servidor s'actualitzaran automàticament.", "MessageRestoreBackupWarning": "Restaurar sobreescriurà tota la base de dades situada a /config i les imatges de portades a /metadata/items i /metadata/authors.<br /><br />La còpia de seguretat no modifica cap fitxer a les carpetes de la teva biblioteca. Si has activat l'opció del servidor per guardar portades i metadades a les carpetes de la biblioteca, aquests fitxers no es guarden ni sobreescriuen.<br /><br />Tots els clients que utilitzin el teu servidor s'actualitzaran automàticament.",
"MessageScheduleRunEveryWeekdayAtTime": "Executa cada {0} a les {1}",
"MessageSearchResultsFor": "Resultats de la cerca de", "MessageSearchResultsFor": "Resultats de la cerca de",
"MessageSelected": "{0} seleccionat(s)", "MessageSelected": "{0} seleccionat(s)",
"MessageSeriesSequenceCannotContainSpaces": "La seqüència de la sèrie no pot contenir espais",
"MessageServerCouldNotBeReached": "No es va poder establir la connexió amb el servidor", "MessageServerCouldNotBeReached": "No es va poder establir la connexió amb el servidor",
"MessageSetChaptersFromTracksDescription": "Establir capítols utilitzant cada fitxer d'àudio com un capítol i el títol del capítol com el nom del fitxer d'àudio", "MessageSetChaptersFromTracksDescription": "Establir capítols utilitzant cada fitxer d'àudio com un capítol i el títol del capítol com el nom del fitxer d'àudio",
"MessageShareExpirationWillBe": "La caducitat serà <strong>{0}</strong>", "MessageShareExpirationWillBe": "La caducitat serà <strong>{0}</strong>",
"MessageShareExpiresIn": "Caduca en {0}", "MessageShareExpiresIn": "Caduca en {0}",
"MessageShareURLWillBe": "La URL per compartir serà <strong>{0}</strong>", "MessageShareURLWillBe": "La URL per compartir serà <strong>{0}</strong>",
"MessageStartPlaybackAtTime": "Començar la reproducció per a \"{0}\" a {1}?", "MessageStartPlaybackAtTime": "Voleu començar la reproducció per a «{0}» a {1}?",
"MessageTaskAudioFileNotWritable": "El fitxer d'àudio «{0}» no es pot escriure", "MessageTaskAudioFileNotWritable": "El fitxer d'àudio «{0}» no es pot escriure",
"MessageTaskCanceledByUser": "Tasca cancel·lada per l'usuari", "MessageTaskCanceledByUser": "Tasca cancel·lada per l'usuari",
"MessageTaskDownloadingEpisodeDescription": "S'està baixant l'episodi «{0}»", "MessageTaskDownloadingEpisodeDescription": "S'està baixant l'episodi «{0}»",
@ -917,6 +923,7 @@
"ToastBackupRestoreFailed": "Error en restaurar la còpia de seguretat", "ToastBackupRestoreFailed": "Error en restaurar la còpia de seguretat",
"ToastBackupUploadFailed": "Error en carregar la còpia de seguretat", "ToastBackupUploadFailed": "Error en carregar la còpia de seguretat",
"ToastBackupUploadSuccess": "Còpia de seguretat carregada", "ToastBackupUploadSuccess": "Còpia de seguretat carregada",
"ToastBatchApplyDetailsToItemsSuccess": "S'han aplicat els detalls als elements",
"ToastBatchDeleteFailed": "Error en l'eliminació per lots", "ToastBatchDeleteFailed": "Error en l'eliminació per lots",
"ToastBatchDeleteSuccess": "Eliminació per lots correcte", "ToastBatchDeleteSuccess": "Eliminació per lots correcte",
"ToastBatchQuickMatchFailed": "Error en la sincronització ràpida per lots!", "ToastBatchQuickMatchFailed": "Error en la sincronització ràpida per lots!",
@ -930,6 +937,7 @@
"ToastCachePurgeSuccess": "Memòria cau purgada amb èxit", "ToastCachePurgeSuccess": "Memòria cau purgada amb èxit",
"ToastChaptersHaveErrors": "Els capítols tenen errors", "ToastChaptersHaveErrors": "Els capítols tenen errors",
"ToastChaptersInvalidShiftAmountLast": "La quantitat de desplaçament no és vàlida. L'hora d'inici de l'últim capítol s'estendria més enllà de la durada d'aquest audiollibre.", "ToastChaptersInvalidShiftAmountLast": "La quantitat de desplaçament no és vàlida. L'hora d'inici de l'últim capítol s'estendria més enllà de la durada d'aquest audiollibre.",
"ToastChaptersInvalidShiftAmountStart": "La quantitat de desplaçament no és vàlida. El primer capítol tindria una durada zero o negativa i el sobreescriuria el segon capítol. Augmenteu la durada inicial del segon capítol.",
"ToastChaptersMustHaveTitles": "Els capítols han de tenir un títol", "ToastChaptersMustHaveTitles": "Els capítols han de tenir un títol",
"ToastChaptersRemoved": "Capítols eliminats", "ToastChaptersRemoved": "Capítols eliminats",
"ToastChaptersUpdated": "Capítols actualitzats", "ToastChaptersUpdated": "Capítols actualitzats",
@ -937,6 +945,7 @@
"ToastCollectionRemoveSuccess": "Col·lecció eliminada", "ToastCollectionRemoveSuccess": "Col·lecció eliminada",
"ToastCollectionUpdateSuccess": "Col·lecció actualitzada", "ToastCollectionUpdateSuccess": "Col·lecció actualitzada",
"ToastCoverUpdateFailed": "Error en actualitzar la portada", "ToastCoverUpdateFailed": "Error en actualitzar la portada",
"ToastDateTimeInvalidOrIncomplete": "La data i hora no és vàlida o està incompleta",
"ToastDeleteFileFailed": "No s'ha pogut suprimir el fitxer", "ToastDeleteFileFailed": "No s'ha pogut suprimir el fitxer",
"ToastDeleteFileSuccess": "Fitxer suprimit", "ToastDeleteFileSuccess": "Fitxer suprimit",
"ToastDeviceAddFailed": "Error en afegir el dispositiu", "ToastDeviceAddFailed": "Error en afegir el dispositiu",
@ -985,7 +994,7 @@
"ToastNewUserCreatedFailed": "No s'ha pogut crear el compte: «{0}»", "ToastNewUserCreatedFailed": "No s'ha pogut crear el compte: «{0}»",
"ToastNewUserCreatedSuccess": "Nou compte creat", "ToastNewUserCreatedSuccess": "Nou compte creat",
"ToastNewUserLibraryError": "S'ha de seleccionar almenys una biblioteca", "ToastNewUserLibraryError": "S'ha de seleccionar almenys una biblioteca",
"ToastNewUserPasswordError": "Necessites una contrasenya, només el root pot estar sense contrasenya", "ToastNewUserPasswordError": "Cal una contrasenya; només l'usuari primari pot estar sense contrasenya",
"ToastNewUserTagError": "S'ha de seleccionar almenys una etiqueta", "ToastNewUserTagError": "S'ha de seleccionar almenys una etiqueta",
"ToastNewUserUsernameError": "Introduïu un nom d'usuari", "ToastNewUserUsernameError": "Introduïu un nom d'usuari",
"ToastNoNewEpisodesFound": "No s'han trobat nous episodis", "ToastNoNewEpisodesFound": "No s'han trobat nous episodis",
@ -1028,7 +1037,7 @@
"ToastScanFailed": "No s'ha pogut escanejar l'element de la biblioteca", "ToastScanFailed": "No s'ha pogut escanejar l'element de la biblioteca",
"ToastSelectAtLeastOneUser": "Selecciona almenys un usuari", "ToastSelectAtLeastOneUser": "Selecciona almenys un usuari",
"ToastSendEbookToDeviceFailed": "Error en enviar l'ebook al dispositiu", "ToastSendEbookToDeviceFailed": "Error en enviar l'ebook al dispositiu",
"ToastSendEbookToDeviceSuccess": "Ebook enviat al dispositiu \"{0}\"", "ToastSendEbookToDeviceSuccess": "El llibre electrònic s'ha enviat al dispositiu «{0}»",
"ToastSeriesSubmitFailedSameName": "No és possible afegir dues sèries amb el mateix nom", "ToastSeriesSubmitFailedSameName": "No és possible afegir dues sèries amb el mateix nom",
"ToastSeriesUpdateFailed": "Error en actualitzar la sèrie", "ToastSeriesUpdateFailed": "Error en actualitzar la sèrie",
"ToastSeriesUpdateSuccess": "Sèrie actualitzada", "ToastSeriesUpdateSuccess": "Sèrie actualitzada",

View file

@ -154,7 +154,7 @@
"HeaderListeningSessions": "Poslechové relace", "HeaderListeningSessions": "Poslechové relace",
"HeaderListeningStats": "Statistiky poslechu", "HeaderListeningStats": "Statistiky poslechu",
"HeaderLogin": "Přihlásit", "HeaderLogin": "Přihlásit",
"HeaderLogs": "Záznamy", "HeaderLogs": "Logy",
"HeaderManageGenres": "Spravovat žánry", "HeaderManageGenres": "Spravovat žánry",
"HeaderManageTags": "Spravovat štítky", "HeaderManageTags": "Spravovat štítky",
"HeaderMapDetails": "Podrobnosti mapování", "HeaderMapDetails": "Podrobnosti mapování",
@ -177,6 +177,7 @@
"HeaderPlaylist": "Seznam skladeb", "HeaderPlaylist": "Seznam skladeb",
"HeaderPlaylistItems": "Položky seznamu přehrávání", "HeaderPlaylistItems": "Položky seznamu přehrávání",
"HeaderPodcastsToAdd": "Podcasty k přidání", "HeaderPodcastsToAdd": "Podcasty k přidání",
"HeaderPresets": "Předvolba",
"HeaderPreviewCover": "Náhled obálky", "HeaderPreviewCover": "Náhled obálky",
"HeaderRSSFeedGeneral": "Podrobnosti o RSS", "HeaderRSSFeedGeneral": "Podrobnosti o RSS",
"HeaderRSSFeedIsOpen": "Informační kanál RSS je otevřený", "HeaderRSSFeedIsOpen": "Informační kanál RSS je otevřený",
@ -513,9 +514,9 @@
"LabelPublishers": "Vydavatelé", "LabelPublishers": "Vydavatelé",
"LabelRSSFeedCustomOwnerEmail": "Vlastní e-mail vlastníka", "LabelRSSFeedCustomOwnerEmail": "Vlastní e-mail vlastníka",
"LabelRSSFeedCustomOwnerName": "Vlastní jméno vlastníka", "LabelRSSFeedCustomOwnerName": "Vlastní jméno vlastníka",
"LabelRSSFeedOpen": "Otevření RSS kanálu", "LabelRSSFeedOpen": "RSS kanál otevřen",
"LabelRSSFeedPreventIndexing": "Zabránit indexování", "LabelRSSFeedPreventIndexing": "Zabránit indexování",
"LabelRSSFeedSlug": "RSS kanál Slug", "LabelRSSFeedSlug": "Klíčové slovo kanálu RSS",
"LabelRSSFeedURL": "URL RSS kanálu", "LabelRSSFeedURL": "URL RSS kanálu",
"LabelRandomly": "Náhodně", "LabelRandomly": "Náhodně",
"LabelReAddSeriesToContinueListening": "Znovu přidat sérii k pokračování poslechu", "LabelReAddSeriesToContinueListening": "Znovu přidat sérii k pokračování poslechu",
@ -530,6 +531,7 @@
"LabelReleaseDate": "Datum vydání", "LabelReleaseDate": "Datum vydání",
"LabelRemoveAllMetadataAbs": "Odebrat všechny soubory metadata.abs", "LabelRemoveAllMetadataAbs": "Odebrat všechny soubory metadata.abs",
"LabelRemoveAllMetadataJson": "Smazat všechny soubory metadata.json", "LabelRemoveAllMetadataJson": "Smazat všechny soubory metadata.json",
"LabelRemoveAudibleBranding": "Odebrat úvod a závěr Audible z kapitol",
"LabelRemoveCover": "Odstranit obálku", "LabelRemoveCover": "Odstranit obálku",
"LabelRemoveMetadataFile": "Odstranit soubory metadat ve složkách položek knihovny", "LabelRemoveMetadataFile": "Odstranit soubory metadat ve složkách položek knihovny",
"LabelRemoveMetadataFileHelp": "Odstraníte všechny soubory metadata.json a metadata.abs ve svých složkách {0}.", "LabelRemoveMetadataFileHelp": "Odstraníte všechny soubory metadata.json a metadata.abs ve svých složkách {0}.",
@ -549,7 +551,7 @@
"LabelSeries": "Série", "LabelSeries": "Série",
"LabelSeriesName": "Název série", "LabelSeriesName": "Název série",
"LabelSeriesProgress": "Průběh série", "LabelSeriesProgress": "Průběh série",
"LabelServerLogLevel": "Úroveň protokolu serveru", "LabelServerLogLevel": "Úroveň Logování serveru",
"LabelServerYearReview": "Přehled roku na serveru ({0})", "LabelServerYearReview": "Přehled roku na serveru ({0})",
"LabelSetEbookAsPrimary": "Nastavit jako primární", "LabelSetEbookAsPrimary": "Nastavit jako primární",
"LabelSetEbookAsSupplementary": "Nastavit jako doplňkové", "LabelSetEbookAsSupplementary": "Nastavit jako doplňkové",
@ -705,6 +707,8 @@
"LabelYourProgress": "Váš pokrok", "LabelYourProgress": "Váš pokrok",
"MessageAddToPlayerQueue": "Přidat do fronty přehrávače", "MessageAddToPlayerQueue": "Přidat do fronty přehrávače",
"MessageAppriseDescription": "Abyste mohli používat tuto funkci, musíte mít spuštěnou instanci <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nebo API, které bude zpracovávat stejné požadavky. <br />Adresa URL API Apprise by měla být úplná URL cesta pro odeslání oznámení, např. pokud je vaše instance API obsluhována na adrese <code>http://192.168.1.1:8337</code> pak byste měli zadat <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "Abyste mohli používat tuto funkci, musíte mít spuštěnou instanci <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nebo API, které bude zpracovávat stejné požadavky. <br />Adresa URL API Apprise by měla být úplná URL cesta pro odeslání oznámení, např. pokud je vaše instance API obsluhována na adrese <code>http://192.168.1.1:8337</code> pak byste měli zadat <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Ujistěte se, že používáte ASIN ze správného regionu Audible a ne z Amazonu.",
"MessageAuthenticationOIDCChangesRestart": "Po uložení restartujte server, aby se změny OIDC použily.",
"MessageBackupsDescription": "Zálohy zahrnují uživatele, průběh uživatele, podrobnosti o položkách knihovny, nastavení serveru a obrázky uložené v <code>/metadata/items</code> a <code>/metadata/authors</code>. Zálohy <strong>ne</strong> zahrnují všechny soubory uložené ve složkách knihovny.", "MessageBackupsDescription": "Zálohy zahrnují uživatele, průběh uživatele, podrobnosti o položkách knihovny, nastavení serveru a obrázky uložené v <code>/metadata/items</code> a <code>/metadata/authors</code>. Zálohy <strong>ne</strong> zahrnují všechny soubory uložené ve složkách knihovny.",
"MessageBackupsLocationEditNote": "Poznámka: Změna umístění záloh nepřesune ani nezmění existující zálohy", "MessageBackupsLocationEditNote": "Poznámka: Změna umístění záloh nepřesune ani nezmění existující zálohy",
"MessageBackupsLocationNoEditNote": "Poznámka: Umístění záloh je nastavené z proměnných prostředí a nelze zde změnit.", "MessageBackupsLocationNoEditNote": "Poznámka: Umístění záloh je nastavené z proměnných prostředí a nelze zde změnit.",
@ -723,6 +727,7 @@
"MessageChapterErrorStartGteDuration": "Neplatný čas začátku, musí být kratší než doba trvání audioknihy", "MessageChapterErrorStartGteDuration": "Neplatný čas začátku, musí být kratší než doba trvání audioknihy",
"MessageChapterErrorStartLtPrev": "Neplatný čas začátku, musí být větší nebo roven času začátku předchozí kapitoly", "MessageChapterErrorStartLtPrev": "Neplatný čas začátku, musí být větší nebo roven času začátku předchozí kapitoly",
"MessageChapterStartIsAfter": "Začátek kapitoly přesahuje konec audioknihy", "MessageChapterStartIsAfter": "Začátek kapitoly přesahuje konec audioknihy",
"MessageChaptersNotFound": "Kapitoly nenalezeny",
"MessageCheckingCron": "Kontrola cronu...", "MessageCheckingCron": "Kontrola cronu...",
"MessageConfirmCloseFeed": "Opravdu chcete zavřít tento kanál?", "MessageConfirmCloseFeed": "Opravdu chcete zavřít tento kanál?",
"MessageConfirmDeleteBackup": "Opravdu chcete smazat zálohu pro {0}?", "MessageConfirmDeleteBackup": "Opravdu chcete smazat zálohu pro {0}?",
@ -779,12 +784,13 @@
"MessageForceReScanDescription": "znovu prohledá všechny soubory jako při novém skenování. ID3 tagy zvukových souborů OPF soubory a textové soubory budou skenovány jako nové.", "MessageForceReScanDescription": "znovu prohledá všechny soubory jako při novém skenování. ID3 tagy zvukových souborů OPF soubory a textové soubory budou skenovány jako nové.",
"MessageImportantNotice": "Důležité upozornění!", "MessageImportantNotice": "Důležité upozornění!",
"MessageInsertChapterBelow": "Vložit kapitolu níže", "MessageInsertChapterBelow": "Vložit kapitolu níže",
"MessageInvalidAsin": "Neplatný ASIN",
"MessageItemsSelected": "{0} vybraných položek", "MessageItemsSelected": "{0} vybraných položek",
"MessageItemsUpdated": "{0} položky byly aktualizovány", "MessageItemsUpdated": "{0} položky byly aktualizovány",
"MessageJoinUsOn": "Přidejte se k nám", "MessageJoinUsOn": "Přidejte se k nám",
"MessageLoading": "Načítá se...", "MessageLoading": "Načítá se...",
"MessageLoadingFolders": "Načítám složky...", "MessageLoadingFolders": "Načítám složky...",
"MessageLogsDescription": "Protokoly se ukládají do souborů JSON v <code>/metadata/logs</code>. Protokoly o pádech jsou uloženy v <code>/metadata/logs/crash_logs.txt</code>.", "MessageLogsDescription": "Logy se ukládají do souborů JSON v <code>/metadata/logs</code>. Logy o pádech jsou uloženy v <code>/metadata/logs/crash_logs.txt</code>.",
"MessageM4BFailed": "M4B se nezdařil!", "MessageM4BFailed": "M4B se nezdařil!",
"MessageM4BFinished": "M4B dokončen!", "MessageM4BFinished": "M4B dokončen!",
"MessageMapChapterTitles": "Mapování názvů kapitol ke stávajícím kapitolám audioknihy bez úpravy časových razítek", "MessageMapChapterTitles": "Mapování názvů kapitol ke stávajícím kapitolám audioknihy bez úpravy časových razítek",
@ -808,11 +814,11 @@
"MessageNoEpisodes": "Žádné epizody", "MessageNoEpisodes": "Žádné epizody",
"MessageNoFoldersAvailable": "Nejsou k dispozici žádné složky", "MessageNoFoldersAvailable": "Nejsou k dispozici žádné složky",
"MessageNoGenres": "Žádné žánry", "MessageNoGenres": "Žádné žánry",
"MessageNoIssues": "Žádné výtisk", "MessageNoIssues": "Žádné problémy",
"MessageNoItems": "Žádné položky", "MessageNoItems": "Žádné položky",
"MessageNoItemsFound": "Nebyly nalezeny žádné položky", "MessageNoItemsFound": "Nebyly nalezeny žádné položky",
"MessageNoListeningSessions": "Žádné poslechové relace", "MessageNoListeningSessions": "Žádné poslechové relace",
"MessageNoLogs": "Žádné protokoly", "MessageNoLogs": "Žádné logy",
"MessageNoMediaProgress": "Žádný průběh médií", "MessageNoMediaProgress": "Žádný průběh médií",
"MessageNoNotifications": "Žádná oznámení", "MessageNoNotifications": "Žádná oznámení",
"MessageNoPodcastFeed": "Neplatný podcast: Žádný kanál", "MessageNoPodcastFeed": "Neplatný podcast: Žádný kanál",
@ -850,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Spusť každý {0} v {1}", "MessageScheduleRunEveryWeekdayAtTime": "Spusť každý {0} v {1}",
"MessageSearchResultsFor": "Výsledky hledání pro", "MessageSearchResultsFor": "Výsledky hledání pro",
"MessageSelected": "{0} vybráno", "MessageSelected": "{0} vybráno",
"MessageSeriesSequenceCannotContainSpaces": "Sekvence série nesmí obsahovat mezery",
"MessageServerCouldNotBeReached": "Server je nedostupný", "MessageServerCouldNotBeReached": "Server je nedostupný",
"MessageSetChaptersFromTracksDescription": "Nastavit kapitoly jako kapitolu a název kapitoly jako název zvukového souboru", "MessageSetChaptersFromTracksDescription": "Nastavit kapitoly jako kapitolu a název kapitoly jako název zvukového souboru",
"MessageShareExpirationWillBe": "Expiruje <strong>{0}</strong>", "MessageShareExpirationWillBe": "Expiruje <strong>{0}</strong>",
@ -911,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Spuštěno po dokončení zálohování", "NotificationOnBackupCompletedDescription": "Spuštěno po dokončení zálohování",
"NotificationOnBackupFailedDescription": "Spuštěno pokud zálohování selže", "NotificationOnBackupFailedDescription": "Spuštěno pokud zálohování selže",
"NotificationOnEpisodeDownloadedDescription": "Spuštěno při automatickém stažení epizody podcastu", "NotificationOnEpisodeDownloadedDescription": "Spuštěno při automatickém stažení epizody podcastu",
"NotificationOnRSSFeedDisabledDescription": "Aktivováno když je automatické stahování pozastaveno z důvodu příliš mnoho neůspěšných pokusů",
"NotificationOnRSSFeedFailedDescription": "Aktivováno když selže RSS kanál pro stahování epizod",
"NotificationOnTestDescription": "Akce pro otestování upozorňovacího systému", "NotificationOnTestDescription": "Akce pro otestování upozorňovacího systému",
"PlaceholderNewCollection": "Nový název kolekce", "PlaceholderNewCollection": "Nový název kolekce",
"PlaceholderNewFolderPath": "Nová cesta ke složce", "PlaceholderNewFolderPath": "Nová cesta ke složce",
@ -955,7 +964,7 @@
"ToastBackupRestoreFailed": "Nepodařilo se obnovit zálohu", "ToastBackupRestoreFailed": "Nepodařilo se obnovit zálohu",
"ToastBackupUploadFailed": "Nepodařilo se nahrát zálohu", "ToastBackupUploadFailed": "Nepodařilo se nahrát zálohu",
"ToastBackupUploadSuccess": "Záloha nahrána", "ToastBackupUploadSuccess": "Záloha nahrána",
"ToastBatchApplyDetailsToItemsSuccess": "Detaily aplikované na položky", "ToastBatchApplyDetailsToItemsSuccess": "Detaily byly aplikované na položky",
"ToastBatchDeleteFailed": "Hromadné smazání selhalo", "ToastBatchDeleteFailed": "Hromadné smazání selhalo",
"ToastBatchDeleteSuccess": "Hromadné smazání proběhlo úspěšně", "ToastBatchDeleteSuccess": "Hromadné smazání proběhlo úspěšně",
"ToastBatchQuickMatchFailed": "Rychlá schoda dávky se nezdařila!", "ToastBatchQuickMatchFailed": "Rychlá schoda dávky se nezdařila!",
@ -968,6 +977,8 @@
"ToastCachePurgeFailed": "Nepodařilo se vyčistit mezipaměť", "ToastCachePurgeFailed": "Nepodařilo se vyčistit mezipaměť",
"ToastCachePurgeSuccess": "Vyrovnávací paměť úspěšně vyčištěna", "ToastCachePurgeSuccess": "Vyrovnávací paměť úspěšně vyčištěna",
"ToastChaptersHaveErrors": "Kapitoly obsahují chyby", "ToastChaptersHaveErrors": "Kapitoly obsahují chyby",
"ToastChaptersInvalidShiftAmountLast": "Nesprávná délka posunu. Čas začátku poslední kapitoly by přesáhl dobu trvání této audioknihy.",
"ToastChaptersInvalidShiftAmountStart": "Nesprávná délka posunu. První kapitola by měla nulovou nebo zápornou délku a byla by přepsána druhou kapitolou. Zvětšete čas začátku druhé kapitoly.",
"ToastChaptersMustHaveTitles": "Kapitoly musí mít názvy", "ToastChaptersMustHaveTitles": "Kapitoly musí mít názvy",
"ToastChaptersRemoved": "Kapitoly odstraněny", "ToastChaptersRemoved": "Kapitoly odstraněny",
"ToastChaptersUpdated": "Kapitola aktualizována", "ToastChaptersUpdated": "Kapitola aktualizována",
@ -1088,7 +1099,7 @@
"ToastUnlinkOpenIdFailed": "Chyba při odpárování uživatele z OpenID", "ToastUnlinkOpenIdFailed": "Chyba při odpárování uživatele z OpenID",
"ToastUnlinkOpenIdSuccess": "Uživatel odpárován z uživatele z OpenID", "ToastUnlinkOpenIdSuccess": "Uživatel odpárován z uživatele z OpenID",
"ToastUploaderFilepathExistsError": "Soubor \"{0}\" na serveru již existuje", "ToastUploaderFilepathExistsError": "Soubor \"{0}\" na serveru již existuje",
"ToastUploaderItemExistsInSubdirectoryError": "Položka \"{0}\" používá podsložku nahrávané cesty.", "ToastUploaderItemExistsInSubdirectoryError": "Položka \"{0}\" používá podadresář cesty pro nahrání.",
"ToastUserDeleteFailed": "Nepodařilo se smazat uživatele", "ToastUserDeleteFailed": "Nepodařilo se smazat uživatele",
"ToastUserDeleteSuccess": "Uživatel smazán", "ToastUserDeleteSuccess": "Uživatel smazán",
"ToastUserPasswordChangeSuccess": "Heslo bylo změněno úspěšně", "ToastUserPasswordChangeSuccess": "Heslo bylo změněno úspěšně",

View file

@ -177,6 +177,7 @@
"HeaderPlaylist": "Afspilningsliste", "HeaderPlaylist": "Afspilningsliste",
"HeaderPlaylistItems": "Afspilningsliste Elementer", "HeaderPlaylistItems": "Afspilningsliste Elementer",
"HeaderPodcastsToAdd": "Podcasts til Tilføjelse", "HeaderPodcastsToAdd": "Podcasts til Tilføjelse",
"HeaderPresets": "Forudindstillinger",
"HeaderPreviewCover": "Forhåndsvis Omslag", "HeaderPreviewCover": "Forhåndsvis Omslag",
"HeaderRSSFeedGeneral": "RSS Detaljer", "HeaderRSSFeedGeneral": "RSS Detaljer",
"HeaderRSSFeedIsOpen": "RSS Feed er Åben", "HeaderRSSFeedIsOpen": "RSS Feed er Åben",
@ -513,7 +514,7 @@
"LabelPublishers": "Forlag", "LabelPublishers": "Forlag",
"LabelRSSFeedCustomOwnerEmail": "Brugerdefineret ejerens e-mail", "LabelRSSFeedCustomOwnerEmail": "Brugerdefineret ejerens e-mail",
"LabelRSSFeedCustomOwnerName": "Brugerdefineret ejerens navn", "LabelRSSFeedCustomOwnerName": "Brugerdefineret ejerens navn",
"LabelRSSFeedOpen": "Åben RSS-feed", "LabelRSSFeedOpen": "RSS-feed åbent",
"LabelRSSFeedPreventIndexing": "Forhindrer indeksering", "LabelRSSFeedPreventIndexing": "Forhindrer indeksering",
"LabelRSSFeedSlug": "RSS-feed-slug", "LabelRSSFeedSlug": "RSS-feed-slug",
"LabelRSSFeedURL": "RSS-feed-URL", "LabelRSSFeedURL": "RSS-feed-URL",
@ -530,6 +531,7 @@
"LabelReleaseDate": "Udgivelsesdato", "LabelReleaseDate": "Udgivelsesdato",
"LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer", "LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer",
"LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer", "LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer",
"LabelRemoveAudibleBranding": "Fjern Audible intro og outro fra kapitler",
"LabelRemoveCover": "Fjern omslag", "LabelRemoveCover": "Fjern omslag",
"LabelRemoveMetadataFile": "Fjern alle metadata filer i biblioteksmapper", "LabelRemoveMetadataFile": "Fjern alle metadata filer i biblioteksmapper",
"LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs filer i dine {0} mapper.", "LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs filer i dine {0} mapper.",
@ -604,6 +606,7 @@
"LabelSlug": "Snegl", "LabelSlug": "Snegl",
"LabelSortAscending": "Stigende", "LabelSortAscending": "Stigende",
"LabelSortDescending": "Faldende", "LabelSortDescending": "Faldende",
"LabelSortPubDate": "Sortér Pub Dato",
"LabelStart": "Start", "LabelStart": "Start",
"LabelStartTime": "Starttid", "LabelStartTime": "Starttid",
"LabelStarted": "Startet", "LabelStarted": "Startet",
@ -704,6 +707,8 @@
"LabelYourProgress": "Din fremgang", "LabelYourProgress": "Din fremgang",
"MessageAddToPlayerQueue": "Tilføj til afspilningskø", "MessageAddToPlayerQueue": "Tilføj til afspilningskø",
"MessageAppriseDescription": "For at bruge denne funktion skal du have en instans af <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kørende eller en API, der håndterer de samme anmodninger. <br /> Apprise API-webadressen skal være den fulde URL-sti for at sende underretningen, f.eks. hvis din API-instans er tilgængelig på <code>http://192.168.1.1:8337</code>, så skal du bruge <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "For at bruge denne funktion skal du have en instans af <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kørende eller en API, der håndterer de samme anmodninger. <br /> Apprise API-webadressen skal være den fulde URL-sti for at sende underretningen, f.eks. hvis din API-instans er tilgængelig på <code>http://192.168.1.1:8337</code>, så skal du bruge <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Sikr dig at du bruger ASIN fra den korrekte Audible region, ikke Amazon.",
"MessageAuthenticationOIDCChangesRestart": "Genstart sin server efter du har gemt for at bekræfte OIDC ændringer.",
"MessageBackupsDescription": "Backups inkluderer brugere, brugerfremskridt, biblioteksvareoplysninger, serverindstillinger og billeder gemt i <code>/metadata/items</code> og <code>/metadata/authors</code>. Backups inkluderer <strong>ikke</strong> nogen filer gemt i dine biblioteksmapper.", "MessageBackupsDescription": "Backups inkluderer brugere, brugerfremskridt, biblioteksvareoplysninger, serverindstillinger og billeder gemt i <code>/metadata/items</code> og <code>/metadata/authors</code>. Backups inkluderer <strong>ikke</strong> nogen filer gemt i dine biblioteksmapper.",
"MessageBackupsLocationEditNote": "Note: Opdatering af backup sti vil ikke fjerne eller modificere eksisterende backups", "MessageBackupsLocationEditNote": "Note: Opdatering af backup sti vil ikke fjerne eller modificere eksisterende backups",
"MessageBackupsLocationNoEditNote": "Note: Backup sti er sat igennem miljøvariabel og kan ikke ændres her.", "MessageBackupsLocationNoEditNote": "Note: Backup sti er sat igennem miljøvariabel og kan ikke ændres her.",
@ -722,6 +727,7 @@
"MessageChapterErrorStartGteDuration": "Ugyldig starttid skal være mindre end lydbogens varighed", "MessageChapterErrorStartGteDuration": "Ugyldig starttid skal være mindre end lydbogens varighed",
"MessageChapterErrorStartLtPrev": "Ugyldig starttid skal være større end eller lig med den foregående kapitels starttid", "MessageChapterErrorStartLtPrev": "Ugyldig starttid skal være større end eller lig med den foregående kapitels starttid",
"MessageChapterStartIsAfter": "Kapitelstarten er efter slutningen af din lydbog", "MessageChapterStartIsAfter": "Kapitelstarten er efter slutningen af din lydbog",
"MessageChaptersNotFound": "Kapitler ikke fundet",
"MessageCheckingCron": "Tjekker cron...", "MessageCheckingCron": "Tjekker cron...",
"MessageConfirmCloseFeed": "Er du sikker på, at du vil lukke dette feed?", "MessageConfirmCloseFeed": "Er du sikker på, at du vil lukke dette feed?",
"MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?", "MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?",
@ -778,6 +784,7 @@
"MessageForceReScanDescription": "vil scanne alle filer igen som en frisk scanning. Lydfilens ID3-tags, OPF-filer og tekstfiler scannes som nye.", "MessageForceReScanDescription": "vil scanne alle filer igen som en frisk scanning. Lydfilens ID3-tags, OPF-filer og tekstfiler scannes som nye.",
"MessageImportantNotice": "Vigtig besked!", "MessageImportantNotice": "Vigtig besked!",
"MessageInsertChapterBelow": "Indsæt kapitel nedenfor", "MessageInsertChapterBelow": "Indsæt kapitel nedenfor",
"MessageInvalidAsin": "Ugyldig ASIN",
"MessageItemsSelected": "{0} elementer valgt", "MessageItemsSelected": "{0} elementer valgt",
"MessageItemsUpdated": "{0} elementer opdateret", "MessageItemsUpdated": "{0} elementer opdateret",
"MessageJoinUsOn": "Deltag i os på", "MessageJoinUsOn": "Deltag i os på",
@ -849,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Kør hvert {0} af {1}", "MessageScheduleRunEveryWeekdayAtTime": "Kør hvert {0} af {1}",
"MessageSearchResultsFor": "Søgeresultater for", "MessageSearchResultsFor": "Søgeresultater for",
"MessageSelected": "{0} valgt", "MessageSelected": "{0} valgt",
"MessageSeriesSequenceCannotContainSpaces": "Serie sekvens kan ikke indeholde mellemrum",
"MessageServerCouldNotBeReached": "Serveren kunne ikke nås", "MessageServerCouldNotBeReached": "Serveren kunne ikke nås",
"MessageSetChaptersFromTracksDescription": "Indstil kapitler ved at bruge hver lydfil som et kapitel og kapiteloverskrift som lydfilnavn", "MessageSetChaptersFromTracksDescription": "Indstil kapitler ved at bruge hver lydfil som et kapitel og kapiteloverskrift som lydfilnavn",
"MessageShareExpirationWillBe": "Udløb vil være <strong>{0}</strong>", "MessageShareExpirationWillBe": "Udløb vil være <strong>{0}</strong>",
@ -910,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Udløst når backup er færdig", "NotificationOnBackupCompletedDescription": "Udløst når backup er færdig",
"NotificationOnBackupFailedDescription": "Udløst når backup fejler", "NotificationOnBackupFailedDescription": "Udløst når backup fejler",
"NotificationOnEpisodeDownloadedDescription": "Udløst når et podcast afsnit er automatisk downloadet", "NotificationOnEpisodeDownloadedDescription": "Udløst når et podcast afsnit er automatisk downloadet",
"NotificationOnRSSFeedDisabledDescription": "Aktiveret når automatiske episode-downloads er slået fra, på grund af for mange forsøg",
"NotificationOnRSSFeedFailedDescription": "Aktiveret når anmodning om RSS-feedet fejler for en automatisk episode-download",
"NotificationOnTestDescription": "Event for test af notifikationssystemet", "NotificationOnTestDescription": "Event for test af notifikationssystemet",
"PlaceholderNewCollection": "Nyt samlingnavn", "PlaceholderNewCollection": "Nyt samlingnavn",
"PlaceholderNewFolderPath": "Ny mappes sti", "PlaceholderNewFolderPath": "Ny mappes sti",
@ -954,6 +964,7 @@
"ToastBackupRestoreFailed": "Mislykkedes gendannelse af sikkerhedskopi", "ToastBackupRestoreFailed": "Mislykkedes gendannelse af sikkerhedskopi",
"ToastBackupUploadFailed": "Mislykkedes upload af sikkerhedskopi", "ToastBackupUploadFailed": "Mislykkedes upload af sikkerhedskopi",
"ToastBackupUploadSuccess": "Sikkerhedskopi uploadet", "ToastBackupUploadSuccess": "Sikkerhedskopi uploadet",
"ToastBatchApplyDetailsToItemsSuccess": "Detaljer bekræftet på element",
"ToastBatchDeleteFailed": "Batch slet fejlede", "ToastBatchDeleteFailed": "Batch slet fejlede",
"ToastBatchDeleteSuccess": "Batch slet succes", "ToastBatchDeleteSuccess": "Batch slet succes",
"ToastBatchQuickMatchFailed": "Batch Hurtig Match fejlede!", "ToastBatchQuickMatchFailed": "Batch Hurtig Match fejlede!",

View file

@ -53,7 +53,7 @@
"ButtonNext": "Vor", "ButtonNext": "Vor",
"ButtonNextChapter": "Nächstes Kapitel", "ButtonNextChapter": "Nächstes Kapitel",
"ButtonNextItemInQueue": "Das nächste Element in der Warteschlange", "ButtonNextItemInQueue": "Das nächste Element in der Warteschlange",
"ButtonOk": "Einverstanden", "ButtonOk": "Ok",
"ButtonOpenFeed": "Feed öffnen", "ButtonOpenFeed": "Feed öffnen",
"ButtonOpenManager": "Manager öffnen", "ButtonOpenManager": "Manager öffnen",
"ButtonPause": "Pausieren", "ButtonPause": "Pausieren",
@ -88,7 +88,7 @@
"ButtonSave": "Speichern", "ButtonSave": "Speichern",
"ButtonSaveAndClose": "Speichern & Schließen", "ButtonSaveAndClose": "Speichern & Schließen",
"ButtonSaveTracklist": "Speichere die Titelliste", "ButtonSaveTracklist": "Speichere die Titelliste",
"ButtonScan": "Partial-Scan (nur geänderte/neue Medien)", "ButtonScan": "Scannen",
"ButtonScanLibrary": "Bibliothek scannen", "ButtonScanLibrary": "Bibliothek scannen",
"ButtonScrollLeft": "Nach Links scrollen", "ButtonScrollLeft": "Nach Links scrollen",
"ButtonScrollRight": "Nach Rechts scrollen", "ButtonScrollRight": "Nach Rechts scrollen",
@ -514,7 +514,7 @@
"LabelPublishers": "Herausgeber", "LabelPublishers": "Herausgeber",
"LabelRSSFeedCustomOwnerEmail": "Benutzerdefinierte Eigentümer-E-Mail", "LabelRSSFeedCustomOwnerEmail": "Benutzerdefinierte Eigentümer-E-Mail",
"LabelRSSFeedCustomOwnerName": "Benutzerdefinierter Name des Eigentümers", "LabelRSSFeedCustomOwnerName": "Benutzerdefinierter Name des Eigentümers",
"LabelRSSFeedOpen": "RSS Feed offen", "LabelRSSFeedOpen": "RSS Feed öffnen",
"LabelRSSFeedPreventIndexing": "Indizierung verhindern", "LabelRSSFeedPreventIndexing": "Indizierung verhindern",
"LabelRSSFeedSlug": "RSS-Feed-Schlagwort", "LabelRSSFeedSlug": "RSS-Feed-Schlagwort",
"LabelRSSFeedURL": "RSS-Feed-URL", "LabelRSSFeedURL": "RSS-Feed-URL",
@ -708,7 +708,7 @@
"MessageAddToPlayerQueue": "Zur Abspielwarteliste hinzufügen", "MessageAddToPlayerQueue": "Zur Abspielwarteliste hinzufügen",
"MessageAppriseDescription": "Um diese Funktion nutzen zu können, musst du eine Instanz von <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> laufen haben oder eine API verwenden welche dieselbe Anfragen bearbeiten kann. <br />Die Apprise API Url muss der vollständige URL-Pfad sein, an den die Benachrichtigung gesendet werden soll, z.B. wenn Ihre API-Instanz unter <code>http://192.168.1.1:8337</code> läuft, würdest du <code>http://192.168.1.1:8337/notify</code> eingeben.", "MessageAppriseDescription": "Um diese Funktion nutzen zu können, musst du eine Instanz von <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> laufen haben oder eine API verwenden welche dieselbe Anfragen bearbeiten kann. <br />Die Apprise API Url muss der vollständige URL-Pfad sein, an den die Benachrichtigung gesendet werden soll, z.B. wenn Ihre API-Instanz unter <code>http://192.168.1.1:8337</code> läuft, würdest du <code>http://192.168.1.1:8337/notify</code> eingeben.",
"MessageAsinCheck": "Stellen Sie sicher, dass Sie die ASIN aus der richtigen Audible Region verwenden, nicht Amazon.", "MessageAsinCheck": "Stellen Sie sicher, dass Sie die ASIN aus der richtigen Audible Region verwenden, nicht Amazon.",
"MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muß der Server neugestartet werden um die OIDC Änderungen zu übernehmen.", "MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muss der Server neugestartet werden um die OIDC Änderungen zu übernehmen.",
"MessageBackupsDescription": "In einer Sicherung werden Benutzer, Benutzerfortschritte, Details zu den Bibliotheksobjekten, Servereinstellungen und Bilder welche in <code>/metadata/items</code> & <code>/metadata/authors</code> gespeichert sind gespeichert. Sicherungen enthalten keine Dateien welche in den einzelnen Bibliotheksordnern (Medien-Ordnern) gespeichert sind.", "MessageBackupsDescription": "In einer Sicherung werden Benutzer, Benutzerfortschritte, Details zu den Bibliotheksobjekten, Servereinstellungen und Bilder welche in <code>/metadata/items</code> & <code>/metadata/authors</code> gespeichert sind gespeichert. Sicherungen enthalten keine Dateien welche in den einzelnen Bibliotheksordnern (Medien-Ordnern) gespeichert sind.",
"MessageBackupsLocationEditNote": "Hinweis: Durch das Aktualisieren des Backup-Speicherorts werden vorhandene Sicherungen nicht verschoben oder geändert", "MessageBackupsLocationEditNote": "Hinweis: Durch das Aktualisieren des Backup-Speicherorts werden vorhandene Sicherungen nicht verschoben oder geändert",
"MessageBackupsLocationNoEditNote": "Hinweis: Der Sicherungsspeicherort wird über eine Umgebungsvariable festgelegt und kann hier nicht geändert werden.", "MessageBackupsLocationNoEditNote": "Hinweis: Der Sicherungsspeicherort wird über eine Umgebungsvariable festgelegt und kann hier nicht geändert werden.",
@ -852,12 +852,13 @@
"MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Bist du dir sicher?", "MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Bist du dir sicher?",
"MessageRestoreBackupConfirm": "Bist du dir sicher, dass du die Sicherung wiederherstellen willst, welche am", "MessageRestoreBackupConfirm": "Bist du dir sicher, dass du die Sicherung wiederherstellen willst, welche am",
"MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.<br /><br />Bei der Sicherung werden keine Dateien in deinen Bibliotheksordnern verändert. Wenn du die Servereinstellungen aktiviert hast, um Cover und Metadaten in deinen Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.<br /><br />Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.", "MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.<br /><br />Bei der Sicherung werden keine Dateien in deinen Bibliotheksordnern verändert. Wenn du die Servereinstellungen aktiviert hast, um Cover und Metadaten in deinen Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.<br /><br />Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.",
"MessageScheduleLibraryScanNote": "Für die meisten Nutzer wird empfohlen, diese Funktion deaktiviert zu lassen und stattdessen die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung erkennt automatisch Änderungen in deinen Bibliotheksordnern. Da die Ordnerüberwachung jedoch nicht mit jedem Dateisystem (z.B. NFS) funktioniert, können alternativ hier geplante Bibliotheks-Scans aktiviert werden.", "MessageScheduleLibraryScanNote": "Für die meisten Anwender wird empfohlen, diese Funktion deaktiviert und die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung wird Änderungen in den Bibliotheksordnern automatisch erkennen. Die Ordnerüberwachung funktioniert nicht mit allen Dateisystemen (wie NFS), hier kann stattdessen die automatischen Bibliothekssuchen verwendet werden.",
"MessageScheduleRunEveryWeekdayAtTime": "Immer {0} um {1} ausführen", "MessageScheduleRunEveryWeekdayAtTime": "Immer {0} um {1} ausführen",
"MessageSearchResultsFor": "Suchergebnisse für", "MessageSearchResultsFor": "Suchergebnisse für",
"MessageSelected": "{0} ausgewählt", "MessageSelected": "{0} ausgewählt",
"MessageSeriesSequenceCannotContainSpaces": "Serie Abfolge kann keine Leerzeichen enthalten",
"MessageServerCouldNotBeReached": "Server kann nicht erreicht werden", "MessageServerCouldNotBeReached": "Server kann nicht erreicht werden",
"MessageSetChaptersFromTracksDescription": "Kaitelerstellung basiert auf den existierenden einzelnen Audiodateien. Pro existierende Audiodatei wird 1 Kapitel erstellt, wobei deren Kapitelname aus dem Audiodateinamen extrahiert wird", "MessageSetChaptersFromTracksDescription": "Kapitelerstellung basiert auf den existierenden einzelnen Audiodateien. Pro existierende Audiodatei wird 1 Kapitel erstellt, wobei deren Kapitelname aus dem Audiodateinamen extrahiert wird",
"MessageShareExpirationWillBe": "Läuft am <strong>{0}</strong> ab", "MessageShareExpirationWillBe": "Läuft am <strong>{0}</strong> ab",
"MessageShareExpiresIn": "Läuft in {0} ab", "MessageShareExpiresIn": "Läuft in {0} ab",
"MessageShareURLWillBe": "Der Freigabe Link wird <strong>{0}</strong> sein", "MessageShareURLWillBe": "Der Freigabe Link wird <strong>{0}</strong> sein",
@ -917,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Wird ausgeführt wenn ein Backup erstellt wurde", "NotificationOnBackupCompletedDescription": "Wird ausgeführt wenn ein Backup erstellt wurde",
"NotificationOnBackupFailedDescription": "Wird ausgeführt wenn ein Backup fehlgeschlagen ist", "NotificationOnBackupFailedDescription": "Wird ausgeführt wenn ein Backup fehlgeschlagen ist",
"NotificationOnEpisodeDownloadedDescription": "Wird ausgeführt wenn eine Podcast Folge automatisch heruntergeladen wird", "NotificationOnEpisodeDownloadedDescription": "Wird ausgeführt wenn eine Podcast Folge automatisch heruntergeladen wird",
"NotificationOnRSSFeedDisabledDescription": "Wird ausgeführt wenn automatische Downloads von Episoden wegen zu vielen fehlgeschlagenen Versuchen deaktiviert sind",
"NotificationOnRSSFeedFailedDescription": "Wird ausgelöst, wenn die RSS-Feed-Anforderung für einen automatischen Episoden-Download fehlschlägt",
"NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird", "NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird",
"PlaceholderNewCollection": "Neuer Sammlungsname", "PlaceholderNewCollection": "Neuer Sammlungsname",
"PlaceholderNewFolderPath": "Neuer Ordnerpfad", "PlaceholderNewFolderPath": "Neuer Ordnerpfad",
@ -974,6 +977,8 @@
"ToastCachePurgeFailed": "Cache leeren fehlgeschlagen", "ToastCachePurgeFailed": "Cache leeren fehlgeschlagen",
"ToastCachePurgeSuccess": "Cache geleert", "ToastCachePurgeSuccess": "Cache geleert",
"ToastChaptersHaveErrors": "Kapitel sind fehlerhaft", "ToastChaptersHaveErrors": "Kapitel sind fehlerhaft",
"ToastChaptersInvalidShiftAmountLast": "Die Verschiebung ist nicht möglich, da die Startzeit des letzten Kapitels über die Gesamtdauer dieses Hörbuchs hinausgehen würde.",
"ToastChaptersInvalidShiftAmountStart": "Ungültige Höhe der Verschiebung. Das erste Kapitel hätte eine Länge von Null oder eine negative Länge und würde vom zweiten Kapitel überschrieben werden. Erhöhen Sie die Startdauer des zweiten Kapitels.",
"ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen", "ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen",
"ToastChaptersRemoved": "Kapitel entfernt", "ToastChaptersRemoved": "Kapitel entfernt",
"ToastChaptersUpdated": "Kapitel aktualisiert", "ToastChaptersUpdated": "Kapitel aktualisiert",

View file

@ -757,6 +757,7 @@
"MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?", "MessageConfirmRemoveAuthor": "Are you sure you want to remove author \"{0}\"?",
"MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?", "MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?",
"MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?", "MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?",
"MessageConfirmRemoveEpisodeNote": "Note: This does not delete the audio file unless toggling \"Hard delete file\"",
"MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?", "MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?",
"MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?", "MessageConfirmRemoveListeningSessions": "Are you sure you want to remove {0} listening sessions?",
"MessageConfirmRemoveMetadataFiles": "Are you sure you want to remove all metadata.{0} files in your library item folders?", "MessageConfirmRemoveMetadataFiles": "Are you sure you want to remove all metadata.{0} files in your library item folders?",
@ -856,6 +857,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Run every {0} at {1}", "MessageScheduleRunEveryWeekdayAtTime": "Run every {0} at {1}",
"MessageSearchResultsFor": "Search results for", "MessageSearchResultsFor": "Search results for",
"MessageSelected": "{0} selected", "MessageSelected": "{0} selected",
"MessageSeriesSequenceCannotContainSpaces": "Series sequence cannot contain spaces",
"MessageServerCouldNotBeReached": "Server could not be reached", "MessageServerCouldNotBeReached": "Server could not be reached",
"MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name", "MessageSetChaptersFromTracksDescription": "Set chapters using each audio file as a chapter and chapter title as the audio file name",
"MessageShareExpirationWillBe": "Expiration will be <strong>{0}</strong>", "MessageShareExpirationWillBe": "Expiration will be <strong>{0}</strong>",
@ -917,6 +919,8 @@
"NotificationOnBackupCompletedDescription": "Triggered when a backup is completed", "NotificationOnBackupCompletedDescription": "Triggered when a backup is completed",
"NotificationOnBackupFailedDescription": "Triggered when a backup fails", "NotificationOnBackupFailedDescription": "Triggered when a backup fails",
"NotificationOnEpisodeDownloadedDescription": "Triggered when a podcast episode is auto-downloaded", "NotificationOnEpisodeDownloadedDescription": "Triggered when a podcast episode is auto-downloaded",
"NotificationOnRSSFeedDisabledDescription": "Triggered when automatic episode downloads are disabled due to too many failed attempts",
"NotificationOnRSSFeedFailedDescription": "Triggered when the RSS feed request fails for an automatic episode download",
"NotificationOnTestDescription": "Event for testing the notification system", "NotificationOnTestDescription": "Event for testing the notification system",
"PlaceholderNewCollection": "New collection name", "PlaceholderNewCollection": "New collection name",
"PlaceholderNewFolderPath": "New folder path", "PlaceholderNewFolderPath": "New folder path",

View file

@ -499,7 +499,7 @@
"LabelPodcastType": "Tipo de pódcast", "LabelPodcastType": "Tipo de pódcast",
"LabelPodcasts": "Pódcast", "LabelPodcasts": "Pódcast",
"LabelPort": "Puerto", "LabelPort": "Puerto",
"LabelPrefixesToIgnore": "Prefijos para Ignorar (no distingue entre mayúsculas y minúsculas.)", "LabelPrefixesToIgnore": "Prefijos para ignorar (no distingue entre mayúsculas y minúsculas)",
"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 indicen su suministro",
"LabelPrimaryEbook": "Libro electrónico principal", "LabelPrimaryEbook": "Libro electrónico principal",
"LabelProgress": "Progreso", "LabelProgress": "Progreso",
@ -515,7 +515,7 @@
"LabelRSSFeedCustomOwnerEmail": "Correo electrónico de dueño personalizado", "LabelRSSFeedCustomOwnerEmail": "Correo electrónico de dueño personalizado",
"LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado", "LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado",
"LabelRSSFeedOpen": "Suministro RSS abierto", "LabelRSSFeedOpen": "Suministro RSS abierto",
"LabelRSSFeedPreventIndexing": "Prevenir indexado", "LabelRSSFeedPreventIndexing": "Evitar indización",
"LabelRSSFeedSlug": "«Slug» de suministro RSS", "LabelRSSFeedSlug": "«Slug» de suministro RSS",
"LabelRSSFeedURL": "URL de suministro RSS", "LabelRSSFeedURL": "URL de suministro RSS",
"LabelRandomly": "Aleatorio", "LabelRandomly": "Aleatorio",
@ -531,6 +531,7 @@
"LabelReleaseDate": "Fecha de estreno", "LabelReleaseDate": "Fecha de estreno",
"LabelRemoveAllMetadataAbs": "Eliminar todos los archivos metadata.abs", "LabelRemoveAllMetadataAbs": "Eliminar todos los archivos metadata.abs",
"LabelRemoveAllMetadataJson": "Eliminar todos los archivos metadata.json", "LabelRemoveAllMetadataJson": "Eliminar todos los archivos metadata.json",
"LabelRemoveAudibleBranding": "Quitar introducción y cierre de Audible de los capítulos",
"LabelRemoveCover": "Quitar cubierta", "LabelRemoveCover": "Quitar cubierta",
"LabelRemoveMetadataFile": "Eliminar archivos de metadatos en carpetas de elementos de biblioteca", "LabelRemoveMetadataFile": "Eliminar archivos de metadatos en carpetas de elementos de biblioteca",
"LabelRemoveMetadataFileHelp": "Elimine todos los archivos metadata.json y metadata.abs de sus carpetas {0}.", "LabelRemoveMetadataFileHelp": "Elimine todos los archivos metadata.json y metadata.abs de sus carpetas {0}.",
@ -539,7 +540,7 @@
"LabelSearchTitle": "Buscar título", "LabelSearchTitle": "Buscar título",
"LabelSearchTitleOrASIN": "Buscar título o ASIN", "LabelSearchTitleOrASIN": "Buscar título o ASIN",
"LabelSeason": "Temporada", "LabelSeason": "Temporada",
"LabelSeasonNumber": "Sesión #{0}", "LabelSeasonNumber": "{0}.ª temporada",
"LabelSelectAll": "Seleccionar todo", "LabelSelectAll": "Seleccionar todo",
"LabelSelectAllEpisodes": "Seleccionar todos los episodios", "LabelSelectAllEpisodes": "Seleccionar todos los episodios",
"LabelSelectEpisodesShowing": "Seleccionar los {0} episodios visibles", "LabelSelectEpisodesShowing": "Seleccionar los {0} episodios visibles",
@ -749,7 +750,7 @@
"MessageConfirmNotificationTestTrigger": "¿Activar esta notificación con datos de prueba?", "MessageConfirmNotificationTestTrigger": "¿Activar esta notificación con datos de prueba?",
"MessageConfirmPurgeCache": "Purgar la antememoria eliminará el directorio completo ubicado en <code>/metadata/cache</code>. <br /><br />¿Confirma que quiere eliminar el directorio de antememoria?", "MessageConfirmPurgeCache": "Purgar la antememoria eliminará el directorio completo ubicado en <code>/metadata/cache</code>. <br /><br />¿Confirma que quiere eliminar el directorio de antememoria?",
"MessageConfirmPurgeItemsCache": "Purgar la antememoria de elementos eliminará el directorio completo ubicado en <code>/metadata/cache/items</code>.<br />¿Lo confirma?", "MessageConfirmPurgeItemsCache": "Purgar la antememoria de elementos eliminará el directorio completo ubicado en <code>/metadata/cache/items</code>.<br />¿Lo confirma?",
"MessageConfirmQuickEmbed": "¡Advertencia! La integración rápida no realiza copias de seguridad a ninguno de tus archivos de audio. Asegúrate de haber realizado una copia de los mismos previamente. <br><br>¿Deseas continuar?", "MessageConfirmQuickEmbed": "Atención: la incrustación rápida no realiza copias de respaldo a ninguno de sus archivos de audio. Cerciórese de haber realizado una copia de los mismos previamente. <br><br>¿Quiere continuar?",
"MessageConfirmQuickMatchEpisodes": "El reconocimiento rápido de extensiones sobrescribirá los detalles si se encuentra una coincidencia. Se actualizarán las extensiones no reconocidas. ¿Quiere continuar?", "MessageConfirmQuickMatchEpisodes": "El reconocimiento rápido de extensiones sobrescribirá los detalles si se encuentra una coincidencia. Se actualizarán las extensiones no reconocidas. ¿Quiere continuar?",
"MessageConfirmReScanLibraryItems": "¿Confirma que quiere volver a analizar {0} elementos?", "MessageConfirmReScanLibraryItems": "¿Confirma que quiere volver a analizar {0} elementos?",
"MessageConfirmRemoveAllChapters": "¿Confirma que quiere quitar todos los capítulos?", "MessageConfirmRemoveAllChapters": "¿Confirma que quiere quitar todos los capítulos?",
@ -842,7 +843,7 @@
"MessageQuickEmbedInProgress": "Integración rápida en proceso", "MessageQuickEmbedInProgress": "Integración rápida en proceso",
"MessageQuickEmbedQueue": "En cola para inserción rápida ({0} en cola)", "MessageQuickEmbedQueue": "En cola para inserción rápida ({0} en cola)",
"MessageQuickMatchAllEpisodes": "Combina rápidamente todos los episodios", "MessageQuickMatchAllEpisodes": "Combina rápidamente todos los episodios",
"MessageQuickMatchDescription": "Rellenar detalles de elementos vacíos y portada con los primeros resultados de '{0}'. No sobrescribe los detalles a menos que la opción \"Preferir Metadatos Encontrados\" del servidor esté habilitada.", "MessageQuickMatchDescription": "Rellena los detalles y la cubierta de los elementos vacíos con el primer resultado coincidente de «{0}». No sobrescribe los detalles a menos que se active la opción del servidor «Preferir metadatos coincidentes».",
"MessageRemoveChapter": "Quitar capítulo", "MessageRemoveChapter": "Quitar capítulo",
"MessageRemoveEpisodes": "Quitar {0} episodio(s)", "MessageRemoveEpisodes": "Quitar {0} episodio(s)",
"MessageRemoveFromPlayerQueue": "Quitar de la cola de reproducción", "MessageRemoveFromPlayerQueue": "Quitar de la cola de reproducción",
@ -855,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Ejecutar cada {0} a las {1}", "MessageScheduleRunEveryWeekdayAtTime": "Ejecutar cada {0} a las {1}",
"MessageSearchResultsFor": "Resultados de la búsqueda de", "MessageSearchResultsFor": "Resultados de la búsqueda de",
"MessageSelected": "{0} seleccionado(s)", "MessageSelected": "{0} seleccionado(s)",
"MessageSeriesSequenceCannotContainSpaces": "La secuencia de la serie no puede contener espacios",
"MessageServerCouldNotBeReached": "No se pudo establecer la conexión con el servidor", "MessageServerCouldNotBeReached": "No se pudo establecer la conexión con el servidor",
"MessageSetChaptersFromTracksDescription": "Establecer capítulos usando cada archivo de audio como un capítulo y el título del capítulo como el nombre del archivo de audio", "MessageSetChaptersFromTracksDescription": "Establecer capítulos usando cada archivo de audio como un capítulo y el título del capítulo como el nombre del archivo de audio",
"MessageShareExpirationWillBe": "La caducidad será <strong>{0}</strong>", "MessageShareExpirationWillBe": "La caducidad será <strong>{0}</strong>",
@ -955,14 +957,14 @@
"ToastBackupCreateSuccess": "Respaldo creado", "ToastBackupCreateSuccess": "Respaldo creado",
"ToastBackupDeleteFailed": "Error al eliminar respaldo", "ToastBackupDeleteFailed": "Error al eliminar respaldo",
"ToastBackupDeleteSuccess": "Respaldo eliminado", "ToastBackupDeleteSuccess": "Respaldo eliminado",
"ToastBackupInvalidMaxKeep": "Número no válido de copias de seguridad a conservar", "ToastBackupInvalidMaxKeep": "Número no válido de copias de respaldo para conservar",
"ToastBackupInvalidMaxSize": "Tamaño máximo de copia de seguridad no válido", "ToastBackupInvalidMaxSize": "Tamaño máximo de copia de respaldo no válido",
"ToastBackupRestoreFailed": "Error al restaurar el respaldo", "ToastBackupRestoreFailed": "Error al restaurar el respaldo",
"ToastBackupUploadFailed": "Error al subir el respaldo", "ToastBackupUploadFailed": "Error al cargar la copia de respaldo",
"ToastBackupUploadSuccess": "Respaldo cargado", "ToastBackupUploadSuccess": "Respaldo cargado",
"ToastBatchApplyDetailsToItemsSuccess": "Detalles aplicados a los elementos", "ToastBatchApplyDetailsToItemsSuccess": "Detalles aplicados a los elementos",
"ToastBatchDeleteFailed": "Falló la eliminación por lotes", "ToastBatchDeleteFailed": "Falló la eliminación por lotes",
"ToastBatchDeleteSuccess": "Borrado por lotes correcto", "ToastBatchDeleteSuccess": "Se eliminó por lotes correctamente",
"ToastBatchQuickMatchFailed": "¡Error en la sincronización rápida por lotes!", "ToastBatchQuickMatchFailed": "¡Error en la sincronización rápida por lotes!",
"ToastBatchQuickMatchStarted": "¡Se inició el lote de búsqueda rápida de {0} libros!", "ToastBatchQuickMatchStarted": "¡Se inició el lote de búsqueda rápida de {0} libros!",
"ToastBatchUpdateFailed": "Falló la actualización por lotes", "ToastBatchUpdateFailed": "Falló la actualización por lotes",
@ -974,6 +976,7 @@
"ToastCachePurgeSuccess": "Se purgó la antememoria correctamente", "ToastCachePurgeSuccess": "Se purgó la antememoria correctamente",
"ToastChaptersHaveErrors": "Los capítulos tienen errores", "ToastChaptersHaveErrors": "Los capítulos tienen errores",
"ToastChaptersInvalidShiftAmountLast": "Cantidad de desplazamiento no válida. La hora de inicio del último capítulo se extendería más allá de la duración de este audiolibro.", "ToastChaptersInvalidShiftAmountLast": "Cantidad de desplazamiento no válida. La hora de inicio del último capítulo se extendería más allá de la duración de este audiolibro.",
"ToastChaptersInvalidShiftAmountStart": "Cantidad de desplazamiento no válida. El primer capítulo tendría una duración cero o negativa y lo sobrescribiría el segundo capítulo. Aumente la duración inicial del segundo capítulo.",
"ToastChaptersMustHaveTitles": "Los capítulos deben tener título", "ToastChaptersMustHaveTitles": "Los capítulos deben tener título",
"ToastChaptersRemoved": "Capítulos eliminados", "ToastChaptersRemoved": "Capítulos eliminados",
"ToastChaptersUpdated": "Capítulos actualizados", "ToastChaptersUpdated": "Capítulos actualizados",

View file

@ -530,6 +530,7 @@
"LabelReleaseDate": "Date de parution", "LabelReleaseDate": "Date de parution",
"LabelRemoveAllMetadataAbs": "Supprimer tous les fichiers metadata.abs", "LabelRemoveAllMetadataAbs": "Supprimer tous les fichiers metadata.abs",
"LabelRemoveAllMetadataJson": "Supprimer tous les fichiers metadata.json", "LabelRemoveAllMetadataJson": "Supprimer tous les fichiers metadata.json",
"LabelRemoveAudibleBranding": "Supprimer lintro et la fin Audible des chapitres",
"LabelRemoveCover": "Supprimer la couverture", "LabelRemoveCover": "Supprimer la couverture",
"LabelRemoveMetadataFile": "Supprimer les fichiers de métadonnées dans les dossiers des éléments de la bibliothèque", "LabelRemoveMetadataFile": "Supprimer les fichiers de métadonnées dans les dossiers des éléments de la bibliothèque",
"LabelRemoveMetadataFileHelp": "Supprimer tous les fichiers metadata.json et metadata.abs de vos dossiers {0}.", "LabelRemoveMetadataFileHelp": "Supprimer tous les fichiers metadata.json et metadata.abs de vos dossiers {0}.",
@ -705,6 +706,8 @@
"LabelYourProgress": "Votre progression", "LabelYourProgress": "Votre progression",
"MessageAddToPlayerQueue": "Ajouter en file dattente", "MessageAddToPlayerQueue": "Ajouter en file dattente",
"MessageAppriseDescription": "Nécessite une instance d<a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">API Apprise</a> pour utiliser cette fonctionnalité ou une api qui prend en charge les mêmes requêtes.<br />LURL de lAPI Apprise doit comprendre le chemin complet pour envoyer la notification. Par exemple, si votre instance écoute sur <code>http://192.168.1.1:8337</code> alors vous devez mettre <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "Nécessite une instance d<a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">API Apprise</a> pour utiliser cette fonctionnalité ou une api qui prend en charge les mêmes requêtes.<br />LURL de lAPI Apprise doit comprendre le chemin complet pour envoyer la notification. Par exemple, si votre instance écoute sur <code>http://192.168.1.1:8337</code> alors vous devez mettre <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Assurez-vous dutiliser lASIN de la bonne région Audible, et non dAmazon.",
"MessageAuthenticationOIDCChangesRestart": "Redémarrez votre serveur après avoir enregistré pour appliquer les modifications OIDC.",
"MessageBackupsDescription": "Les sauvegardes incluent les utilisateurs, la progression des utilisateurs, les détails des éléments de la bibliothèque, les paramètres du serveur et les images stockées dans <code>/metadata/items</code> & <code>/metadata/authors</code>. Les sauvegardes <strong>nincluent pas</strong> les fichiers stockés dans les dossiers de votre bibliothèque.", "MessageBackupsDescription": "Les sauvegardes incluent les utilisateurs, la progression des utilisateurs, les détails des éléments de la bibliothèque, les paramètres du serveur et les images stockées dans <code>/metadata/items</code> & <code>/metadata/authors</code>. Les sauvegardes <strong>nincluent pas</strong> les fichiers stockés dans les dossiers de votre bibliothèque.",
"MessageBackupsLocationEditNote": "Remarque: Mettre à jour l'emplacement de sauvegarde ne déplacera pas ou ne modifiera pas les sauvegardes existantes", "MessageBackupsLocationEditNote": "Remarque: Mettre à jour l'emplacement de sauvegarde ne déplacera pas ou ne modifiera pas les sauvegardes existantes",
"MessageBackupsLocationNoEditNote": "Remarque: lemplacement de sauvegarde est défini via une variable denvironnement et ne peut pas être modifié ici.", "MessageBackupsLocationNoEditNote": "Remarque: lemplacement de sauvegarde est défini via une variable denvironnement et ne peut pas être modifié ici.",
@ -723,6 +726,7 @@
"MessageChapterErrorStartGteDuration": "Horodatage invalide car il doit débuter avant la fin du livre", "MessageChapterErrorStartGteDuration": "Horodatage invalide car il doit débuter avant la fin du livre",
"MessageChapterErrorStartLtPrev": "Horodatage invalide car il doit débuter au moins après le précédent chapitre", "MessageChapterErrorStartLtPrev": "Horodatage invalide car il doit débuter au moins après le précédent chapitre",
"MessageChapterStartIsAfter": "Le premier chapitre est situé au début de votre livre audio", "MessageChapterStartIsAfter": "Le premier chapitre est situé au début de votre livre audio",
"MessageChaptersNotFound": "Chapitres non trouvés",
"MessageCheckingCron": "Vérification du cron…", "MessageCheckingCron": "Vérification du cron…",
"MessageConfirmCloseFeed": "Êtes-vous sûr·e de vouloir fermer ce flux?", "MessageConfirmCloseFeed": "Êtes-vous sûr·e de vouloir fermer ce flux?",
"MessageConfirmDeleteBackup": "Êtes-vous sûr·e de vouloir supprimer la sauvegarde de « {0} » ?", "MessageConfirmDeleteBackup": "Êtes-vous sûr·e de vouloir supprimer la sauvegarde de « {0} » ?",
@ -779,6 +783,7 @@
"MessageForceReScanDescription": "analysera de nouveau tous les fichiers. Les étiquettes ID3 des fichiers audio, les fichiers OPF et les fichiers texte seront analysés comme sils étaient nouveaux.", "MessageForceReScanDescription": "analysera de nouveau tous les fichiers. Les étiquettes ID3 des fichiers audio, les fichiers OPF et les fichiers texte seront analysés comme sils étaient nouveaux.",
"MessageImportantNotice": "Information importante !", "MessageImportantNotice": "Information importante !",
"MessageInsertChapterBelow": "Insérer le chapitre ci-dessous", "MessageInsertChapterBelow": "Insérer le chapitre ci-dessous",
"MessageInvalidAsin": "ASIN invalide",
"MessageItemsSelected": "{0} éléments sélectionnés", "MessageItemsSelected": "{0} éléments sélectionnés",
"MessageItemsUpdated": "{0} éléments mis à jour", "MessageItemsUpdated": "{0} éléments mis à jour",
"MessageJoinUsOn": "Rejoignez-nous sur", "MessageJoinUsOn": "Rejoignez-nous sur",
@ -850,6 +855,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Exécuté tous les {0} à {1}", "MessageScheduleRunEveryWeekdayAtTime": "Exécuté tous les {0} à {1}",
"MessageSearchResultsFor": "Résultats de recherche pour", "MessageSearchResultsFor": "Résultats de recherche pour",
"MessageSelected": "{0} sélectionnés", "MessageSelected": "{0} sélectionnés",
"MessageSeriesSequenceCannotContainSpaces": "La séquence de séries ne peut pas contenir despaces",
"MessageServerCouldNotBeReached": "Serveur inaccessible", "MessageServerCouldNotBeReached": "Serveur inaccessible",
"MessageSetChaptersFromTracksDescription": "Positionne un chapitre par fichier audio, avec le titre du fichier comme titre de chapitre", "MessageSetChaptersFromTracksDescription": "Positionne un chapitre par fichier audio, avec le titre du fichier comme titre de chapitre",
"MessageShareExpirationWillBe": "Expire le <strong>{0}</strong>", "MessageShareExpirationWillBe": "Expire le <strong>{0}</strong>",
@ -968,6 +974,8 @@
"ToastCachePurgeFailed": "Échec de la purge du cache", "ToastCachePurgeFailed": "Échec de la purge du cache",
"ToastCachePurgeSuccess": "Cache purgé avec succès", "ToastCachePurgeSuccess": "Cache purgé avec succès",
"ToastChaptersHaveErrors": "Les chapitres contiennent des erreurs", "ToastChaptersHaveErrors": "Les chapitres contiennent des erreurs",
"ToastChaptersInvalidShiftAmountLast": "Durée de décalage non valide. Lheure de début du dernier chapitre pourrait dépasser la durée de ce livre audio.",
"ToastChaptersInvalidShiftAmountStart": "Durée de décalage non valide. Le premier chapitre aurait une longueur nulle ou négative et serait écrasé par le second. Augmentez la durée de début du second chapitre.",
"ToastChaptersMustHaveTitles": "Les chapitre doivent avoir un titre", "ToastChaptersMustHaveTitles": "Les chapitre doivent avoir un titre",
"ToastChaptersRemoved": "Chapitres supprimés", "ToastChaptersRemoved": "Chapitres supprimés",
"ToastChaptersUpdated": "Chapitres mis à jour", "ToastChaptersUpdated": "Chapitres mis à jour",

View file

@ -10,6 +10,8 @@
"ButtonApplyChapters": "החל פרקים", "ButtonApplyChapters": "החל פרקים",
"ButtonAuthors": "סופרים", "ButtonAuthors": "סופרים",
"ButtonBack": "חזור", "ButtonBack": "חזור",
"ButtonBatchEditPopulateFromExisting": "מלא משדות קיימים",
"ButtonBatchEditPopulateMapDetails": "מלא פרטי מפה",
"ButtonBrowseForFolder": "עיין בתיקייה", "ButtonBrowseForFolder": "עיין בתיקייה",
"ButtonCancel": "ביטול", "ButtonCancel": "ביטול",
"ButtonCancelEncode": "בטל קידוד", "ButtonCancelEncode": "בטל קידוד",
@ -29,7 +31,9 @@
"ButtonEdit": "ערוך", "ButtonEdit": "ערוך",
"ButtonEditChapters": "ערוך פרקים", "ButtonEditChapters": "ערוך פרקים",
"ButtonEditPodcast": "ערוך פודקאסט", "ButtonEditPodcast": "ערוך פודקאסט",
"ButtonEnable": "הפעל", "ButtonEnable": "אפשר",
"ButtonFireAndFail": "שלח בכישלון",
"ButtonFireOnTest": "שלח באירוע בדיקה",
"ButtonForceReScan": "סרוק מחדש בכוח", "ButtonForceReScan": "סרוק מחדש בכוח",
"ButtonFullPath": "נתיב מלא", "ButtonFullPath": "נתיב מלא",
"ButtonHide": "הסתר", "ButtonHide": "הסתר",
@ -37,7 +41,7 @@
"ButtonIssues": "תקלות", "ButtonIssues": "תקלות",
"ButtonJumpBackward": "דלג אחורה", "ButtonJumpBackward": "דלג אחורה",
"ButtonJumpForward": "דלג קדימה", "ButtonJumpForward": "דלג קדימה",
"ButtonLatest": "חדש ביותר", "ButtonLatest": "אחרון",
"ButtonLibrary": "ספרייה", "ButtonLibrary": "ספרייה",
"ButtonLogout": "התנתק", "ButtonLogout": "התנתק",
"ButtonLookup": "חפש", "ButtonLookup": "חפש",
@ -70,7 +74,7 @@
"ButtonReScan": "סרוק מחדש", "ButtonReScan": "סרוק מחדש",
"ButtonRead": "קרא", "ButtonRead": "קרא",
"ButtonReadLess": "קרא פחות", "ButtonReadLess": "קרא פחות",
"ButtonReadMore": "קרא יותר", "ButtonReadMore": "קרא עוד",
"ButtonRefresh": "רענן", "ButtonRefresh": "רענן",
"ButtonRemove": "הסר", "ButtonRemove": "הסר",
"ButtonRemoveAll": "הסר הכל", "ButtonRemoveAll": "הסר הכל",
@ -86,7 +90,9 @@
"ButtonSaveTracklist": "שמור רשימת רצועות", "ButtonSaveTracklist": "שמור רשימת רצועות",
"ButtonScan": "סרוק", "ButtonScan": "סרוק",
"ButtonScanLibrary": "סרוק ספרייה", "ButtonScanLibrary": "סרוק ספרייה",
"ButtonSearch": "חפש", "ButtonScrollLeft": "גלול שמאלה",
"ButtonScrollRight": "גלול ימינה",
"ButtonSearch": "חיפוש",
"ButtonSelectFolderPath": "בחר נתיב לתיקייה", "ButtonSelectFolderPath": "בחר נתיב לתיקייה",
"ButtonSeries": "סדרה", "ButtonSeries": "סדרה",
"ButtonSetChaptersFromTracks": "קבע פרקים לפי הרצועות", "ButtonSetChaptersFromTracks": "קבע פרקים לפי הרצועות",
@ -96,7 +102,7 @@
"ButtonStartM4BEncode": "התחל קידוד M4B", "ButtonStartM4BEncode": "התחל קידוד M4B",
"ButtonStartMetadataEmbed": "התחל הטמעת מטא-נתונים", "ButtonStartMetadataEmbed": "התחל הטמעת מטא-נתונים",
"ButtonStats": "סטטיסטיקות", "ButtonStats": "סטטיסטיקות",
"ButtonSubmit": "שלח", "ButtonSubmit": "שליחה",
"ButtonTest": "בדיקה", "ButtonTest": "בדיקה",
"ButtonUnlinkOpenId": "נתק OpenID", "ButtonUnlinkOpenId": "נתק OpenID",
"ButtonUpload": "העלה", "ButtonUpload": "העלה",
@ -122,26 +128,26 @@
"HeaderChapters": "פרקים", "HeaderChapters": "פרקים",
"HeaderChooseAFolder": "בחר תיקייה", "HeaderChooseAFolder": "בחר תיקייה",
"HeaderCollection": "אוסף", "HeaderCollection": "אוסף",
"HeaderCollectionItems": "פריטי אוסף", "HeaderCollectionItems": "פרטי אוסף",
"HeaderCover": "כריכה", "HeaderCover": "כריכה",
"HeaderCurrentDownloads": "הורדות נוכחיות", "HeaderCurrentDownloads": "הורדות נוכחיות",
"HeaderCustomMessageOnLogin": "הודעה מותאמת אישית בהתחברות", "HeaderCustomMessageOnLogin": "הודעה מותאמת אישית בהתחברות",
"HeaderCustomMetadataProviders": "ספקי מטא-נתונים מותאמים אישית", "HeaderCustomMetadataProviders": "ספקי מטא-נתונים מותאמים אישית",
"HeaderDetails": "פרטים", "HeaderDetails": "פרטים",
"HeaderDownloadQueue": "תור הורדה", "HeaderDownloadQueue": "תור הורדה",
"HeaderEbookFiles": "קבצי ספר אלקטרוני", "HeaderEbookFiles": "קבצי Ebook",
"HeaderEmail": "אימייל", "HeaderEmail": "אימייל",
"HeaderEmailSettings": "הגדרות אימייל", "HeaderEmailSettings": "הגדרות אימייל",
"HeaderEpisodes": "פרקים", "HeaderEpisodes": "פרקים",
"HeaderEreaderDevices": "התקני קריאה דיגיטליים", "HeaderEreaderDevices": "התקני קריאה דיגיטליים",
"HeaderEreaderSettings": "הגדרות התקני קריאה דיגיטליים", "HeaderEreaderSettings": "הגדרות קורא אלקטרוני",
"HeaderFiles": "קבצים", "HeaderFiles": "קבצים",
"HeaderFindChapters": "מצא פרקים", "HeaderFindChapters": "מצא פרקים",
"HeaderIgnoredFiles": "קבצים שנתעלמו", "HeaderIgnoredFiles": "קבצים שנתעלמו",
"HeaderItemFiles": "קבצי פריט", "HeaderItemFiles": "קבצי פריט",
"HeaderItemMetadataUtils": "כלי מטא-נתונים", "HeaderItemMetadataUtils": "כלי מטא-נתונים",
"HeaderLastListeningSession": "הפעלת האזנה אחרונה", "HeaderLastListeningSession": "הפעלת האזנה אחרונה",
"HeaderLatestEpisodes": "הפרקים העדכניים ביותר", "HeaderLatestEpisodes": "פרקים אחרונים",
"HeaderLibraries": "ספריות", "HeaderLibraries": "ספריות",
"HeaderLibraryFiles": "קבצי ספרייה", "HeaderLibraryFiles": "קבצי ספרייה",
"HeaderLibraryStats": "סטטיסטיקות ספרייה", "HeaderLibraryStats": "סטטיסטיקות ספרייה",
@ -171,8 +177,9 @@
"HeaderPlaylist": "רשימת השמעה", "HeaderPlaylist": "רשימת השמעה",
"HeaderPlaylistItems": "פריטי רשימת השמעה", "HeaderPlaylistItems": "פריטי רשימת השמעה",
"HeaderPodcastsToAdd": "פודקאסטים להוספה", "HeaderPodcastsToAdd": "פודקאסטים להוספה",
"HeaderPresets": "קביעות מוגדרות מראש",
"HeaderPreviewCover": "תצוגה מקדימה של כריכה", "HeaderPreviewCover": "תצוגה מקדימה של כריכה",
"HeaderRSSFeedGeneral": "פרטי ערוץ RSS", "HeaderRSSFeedGeneral": "פרטי RSS",
"HeaderRSSFeedIsOpen": "ערוץ RSS פתוח", "HeaderRSSFeedIsOpen": "ערוץ RSS פתוח",
"HeaderRSSFeeds": "ערוצי RSS", "HeaderRSSFeeds": "ערוצי RSS",
"HeaderRemoveEpisode": "הסר פרק", "HeaderRemoveEpisode": "הסר פרק",
@ -188,14 +195,15 @@
"HeaderSettingsExperimental": "תכונות ניסיוניות", "HeaderSettingsExperimental": "תכונות ניסיוניות",
"HeaderSettingsGeneral": "כללי", "HeaderSettingsGeneral": "כללי",
"HeaderSettingsScanner": "סורק", "HeaderSettingsScanner": "סורק",
"HeaderSettingsWebClient": "מערך",
"HeaderSleepTimer": "טיימר שינה", "HeaderSleepTimer": "טיימר שינה",
"HeaderStatsLargestItems": "הפריטים הגדולים ביותר", "HeaderStatsLargestItems": "הפריטים הגדולים ביותר",
"HeaderStatsLongestItems": "הפריטים הארוכים ביותר (בשעות)", "HeaderStatsLongestItems": "הפריטים הארוכים ביותר (בשעות)",
"HeaderStatsMinutesListeningChart": "דקות האזנה (בימים האחרונים)", "HeaderStatsMinutesListeningChart": "דקות האזנה (7 ימים אחרונים)",
"HeaderStatsRecentSessions": פעלות אחרונות", "HeaderStatsRecentSessions": אזנות אחרונות",
"HeaderStatsTop10Authors": "10 היוצרים המובילים", "HeaderStatsTop10Authors": "10 היוצרים המובילים",
"HeaderStatsTop5Genres": "הז'אנרים המובילים 5", "HeaderStatsTop5Genres": "הז'אנרים המובילים 5",
"HeaderTableOfContents": "תוכן העניינים", "HeaderTableOfContents": "תוכן עניינים",
"HeaderTools": "כלים", "HeaderTools": "כלים",
"HeaderUpdateAccount": "עדכן חשבון", "HeaderUpdateAccount": "עדכן חשבון",
"HeaderUpdateAuthor": "עדכן יוצר", "HeaderUpdateAuthor": "עדכן יוצר",
@ -212,15 +220,17 @@
"LabelAccountTypeAdmin": "מנהל", "LabelAccountTypeAdmin": "מנהל",
"LabelAccountTypeGuest": "אורח", "LabelAccountTypeGuest": "אורח",
"LabelAccountTypeUser": "משתמש", "LabelAccountTypeUser": "משתמש",
"LabelActivities": "פעילויות",
"LabelActivity": "פעילות", "LabelActivity": "פעילות",
"LabelAddToCollection": "הוסף לאוסף", "LabelAddToCollection": "הוסף לאוסף",
"LabelAddToCollectionBatch": "הוסף {0} ספרים לאוסף", "LabelAddToCollectionBatch": "הוסף {0} ספרים לאוסף",
"LabelAddToPlaylist": "הוסף לרשימת השמעה", "LabelAddToPlaylist": "הוסף לרשימת השמעה",
"LabelAddToPlaylistBatch": "הוסף {0} פריטים לרשימת השמעה", "LabelAddToPlaylistBatch": "הוסף {0} פריטים לרשימת השמעה",
"LabelAddedAt": "נוסף בתאריך", "LabelAddedAt": "נוסף ב-",
"LabelAddedDate": "נוסף ב-{0}", "LabelAddedDate": "נוסף ב-{0}",
"LabelAdminUsersOnly": "רק מנהלים", "LabelAdminUsersOnly": "רק מנהלים",
"LabelAll": "הכל", "LabelAll": "הכל",
"LabelAllEpisodesDownloaded": "כל הפרקים הורדו",
"LabelAllUsers": "כל המשתמשים", "LabelAllUsers": "כל המשתמשים",
"LabelAllUsersExcludingGuests": "כל המשתמשים, ללא אורחים", "LabelAllUsersExcludingGuests": "כל המשתמשים, ללא אורחים",
"LabelAllUsersIncludingGuests": "כל המשתמשים כולל אורחים", "LabelAllUsersIncludingGuests": "כל המשתמשים כולל אורחים",
@ -230,10 +240,10 @@
"LabelAudioBitrate": "קצב סיביות (לדוגמא 128k)", "LabelAudioBitrate": "קצב סיביות (לדוגמא 128k)",
"LabelAudioChannels": "ערוצי קול (1 או 2)", "LabelAudioChannels": "ערוצי קול (1 או 2)",
"LabelAudioCodec": "קידוד קול", "LabelAudioCodec": "קידוד קול",
"LabelAuthor": "יוצר", "LabelAuthor": "סופר",
"LabelAuthorFirstLast": "יוצר (שם פרטי שם משפחה)", "LabelAuthorFirstLast": "סופר (שם, משפחה)",
"LabelAuthorLastFirst": "יוצר (שם משפחה, שם פרטי)", "LabelAuthorLastFirst": "סופר (משפחה, שם)",
"LabelAuthors": "יוצרים", "LabelAuthors": "סופרים",
"LabelAutoDownloadEpisodes": "הורד פרקים באופן אוטומטי", "LabelAutoDownloadEpisodes": "הורד פרקים באופן אוטומטי",
"LabelAutoFetchMetadata": "חפש והורד מטא-נתונים באופן אוטומטי", "LabelAutoFetchMetadata": "חפש והורד מטא-נתונים באופן אוטומטי",
"LabelAutoFetchMetadataHelp": "מחפש ומוריד מטא-נתונים לשדות כותרת, יוצר וסדרה כדי לשפר את תהליך ההעלאה. ייתכן שיהיה צורך להתאים מטא-נתונים נוסף לאחר ההעלאה.", "LabelAutoFetchMetadataHelp": "מחפש ומוריד מטא-נתונים לשדות כותרת, יוצר וסדרה כדי לשפר את תהליך ההעלאה. ייתכן שיהיה צורך להתאים מטא-נתונים נוסף לאחר ההעלאה.",
@ -242,36 +252,48 @@
"LabelAutoRegister": "הרשמה אוטומטית", "LabelAutoRegister": "הרשמה אוטומטית",
"LabelAutoRegisterDescription": "יצירת משתמשים חדשים אוטומטית לאחר התחברות", "LabelAutoRegisterDescription": "יצירת משתמשים חדשים אוטומטית לאחר התחברות",
"LabelBackToUser": "חזרה למשתמש", "LabelBackToUser": "חזרה למשתמש",
"LabelBackupAudioFiles": "גיבוי קבצי שמע",
"LabelBackupLocation": "מיקום גיבוי", "LabelBackupLocation": "מיקום גיבוי",
"LabelBackupsEnableAutomaticBackups": "הפעל גיבויים אוטומטיים", "LabelBackupsEnableAutomaticBackups": "גיבויים אוטומטיים",
"LabelBackupsEnableAutomaticBackupsHelp": "גיבויים שמורים ב /metadata/backups", "LabelBackupsEnableAutomaticBackupsHelp": "גיבויים שמורים ב /metadata/backups",
"LabelBackupsMaxBackupSize": "גודל הגיבוי המרבי (בג'יגה-בייט)", "LabelBackupsMaxBackupSize": "גודל הגיבוי המרבי (בג'יגה-בייט) (0 - ללא הגבלה)",
"LabelBackupsMaxBackupSizeHelp": "כהגנה על עצמך מפני תצורה שגויה, הגיבויים ייכשלו אם הם יעברו את הגודל שהוגדר.", "LabelBackupsMaxBackupSizeHelp": "כהגנה על עצמך מפני תצורה שגויה, הגיבויים ייכשלו אם הם יעברו את הגודל שהוגדר.",
"LabelBackupsNumberToKeep": "מספר הגיבויים לשמירה", "LabelBackupsNumberToKeep": "מספר הגיבויים לשמירה",
"LabelBackupsNumberToKeepHelp": "רק גיבוי אחד יוסר בכל פעם, לכן אם יש לך כבר יותר מגיבוי אחד יש להסיר אותם באופן ידני.", "LabelBackupsNumberToKeepHelp": "רק גיבוי אחד יוסר בכל פעם, לכן אם יש לך כבר יותר מגיבוי אחד יש להסיר אותם באופן ידני.",
"LabelBitrate": "קצב סיביות", "LabelBitrate": "קצב סיביות",
"LabelBonus": "בונוס",
"LabelBooks": "ספרים", "LabelBooks": "ספרים",
"LabelButtonText": "טקסט לחצן", "LabelButtonText": "טקסט לחצן",
"LabelByAuthor": "על ידי {0}",
"LabelChangePassword": "שינוי סיסמה", "LabelChangePassword": "שינוי סיסמה",
"LabelChannels": "ערוצים", "LabelChannels": "ערוצים",
"LabelChapterCount": "{0} פרקים",
"LabelChapterTitle": "כותרת הפרק", "LabelChapterTitle": "כותרת הפרק",
"LabelChapters": "פרקים", "LabelChapters": "פרקים",
"LabelChaptersFound": "פרקים שנמצאו", "LabelChaptersFound": "פרקים שנמצאו",
"LabelClickForMoreInfo": "לחץ למידע נוסף", "LabelClickForMoreInfo": "לחץ למידע נוסף",
"LabelClickToUseCurrentValue": "לחץ לשימוש בערך הנוכחי",
"LabelClosePlayer": "סגור נגן", "LabelClosePlayer": "סגור נגן",
"LabelCollapseSeries": "צמצום סדרה", "LabelCodec": "Coded",
"LabelCollapseSeries": "הסתר סדרה",
"LabelCollapseSubSeries": "הסתר תת סדרה",
"LabelCollection": "אוסף", "LabelCollection": "אוסף",
"LabelCollections": "אוספים", "LabelCollections": "אוספים",
"LabelComplete": "מלא", "LabelComplete": "הושלם",
"LabelConfirmPassword": "אישור סיסמה", "LabelConfirmPassword": "אישור סיסמה",
"LabelContinueListening": "המשך האזנה", "LabelContinueListening": "המשך האזנה",
"LabelContinueReading": "המשך קריאה", "LabelContinueReading": "המשך קריאה",
"LabelContinueSeries": "המשך סדרה", "LabelContinueSeries": "המשך סדרה",
"LabelCover": "כריכה", "LabelCover": "כריכה",
"LabelCoverImageURL": "כתובת התמונה ברשת", "LabelCoverImageURL": "כתובת התמונה ברשת",
"LabelCoverProvider": "ספק כריכה",
"LabelCreatedAt": "נוצר בתאריך", "LabelCreatedAt": "נוצר בתאריך",
"LabelCronExpression": "ביטוי cron",
"LabelCurrent": "נוכחי", "LabelCurrent": "נוכחי",
"LabelCurrently": "כעת:", "LabelCurrently": "כעת:",
"LabelCustomCronExpression": "ביטוי cron מותאם אישית:",
"LabelDatetime": "Datetime",
"LabelDays": "ימים",
"LabelDeleteFromFileSystemCheckbox": "מחיקה מהמערכת הקבצים (הסר סימון למחיקה רק ממסד הנתונים)", "LabelDeleteFromFileSystemCheckbox": "מחיקה מהמערכת הקבצים (הסר סימון למחיקה רק ממסד הנתונים)",
"LabelDescription": "תיאור", "LabelDescription": "תיאור",
"LabelDeselectAll": "הסר בחירת כל הפריטים", "LabelDeselectAll": "הסר בחירת כל הפריטים",
@ -282,51 +304,83 @@
"LabelDiscFromFilename": "דיסק משם הקובץ", "LabelDiscFromFilename": "דיסק משם הקובץ",
"LabelDiscFromMetadata": "דיסק מהמטא-נתונים", "LabelDiscFromMetadata": "דיסק מהמטא-נתונים",
"LabelDiscover": "גלה", "LabelDiscover": "גלה",
"LabelDownload": "הורד", "LabelDownload": "הורדה",
"LabelDownloadNEpisodes": "הורד {0} פרקים", "LabelDownloadNEpisodes": "הורד {0} פרקים",
"LabelDownloadable": "ניתן להורדה",
"LabelDuration": "משך", "LabelDuration": "משך",
"LabelDurationComparisonExactMatch": "(התאמה מדוייקת)",
"LabelDurationComparisonLonger": "({0} ארוך יותר)",
"LabelDurationComparisonShorter": "({0} קצר יותר)",
"LabelDurationFound": "משך נמצא:", "LabelDurationFound": "משך נמצא:",
"LabelEbook": "ספר אלקטרוני", "LabelEbook": "ספר אלקטרוני",
"LabelEbooks": "ספרים אלקטרוניים", "LabelEbooks": "ספרים אלקטרוניים",
"LabelEdit": "עריכה", "LabelEdit": "עריכה",
"LabelEmail": "דואר אלקטרוני", "LabelEmail": "דואר אלקטרוני",
"LabelEmailSettingsFromAddress": "מאת", "LabelEmailSettingsFromAddress": "מאת",
"LabelEmailSettingsRejectUnauthorized": "דחה תעודות לא מאושרות",
"LabelEmailSettingsRejectUnauthorizedHelp": "השבתת אימות תעודת SSL עלולה לחשוף את החיבור שלך לסיכוני אבטחה, כגון התקפות \"אדם באמצע\". השבת אפשרות זו רק אם אתה מבין את ההשלכות ובוטח בשרת הדואר שאליו אתה מתחבר.",
"LabelEmailSettingsSecure": "מאובטח", "LabelEmailSettingsSecure": "מאובטח",
"LabelEmailSettingsSecureHelp": "אם מופעל, החיבור ישתמש ב-TLS בעת ההתחברות לשרת. אם לא, אז TLS יהיה בשימוש אם השרת תומך בהרחבת STARTTLS. ברוב המקרים מומלץ להפעיל את הגדרה זו אם אתה מתחבר לפורט 465. לפורט 587 או 25, השאר כבוי. (from nodemailer.com/smtp/#authentication)", "LabelEmailSettingsSecureHelp": "אם מופעל, החיבור ישתמש ב-TLS בעת ההתחברות לשרת. אם לא, אז TLS יהיה בשימוש אם השרת תומך בהרחבת STARTTLS. ברוב המקרים מומלץ להפעיל את הגדרה זו אם אתה מתחבר לפורט 465. לפורט 587 או 25, השאר כבוי. (from nodemailer.com/smtp/#authentication)",
"LabelEmailSettingsTestAddress": "כתובת לבדיקה", "LabelEmailSettingsTestAddress": "כתובת לבדיקה",
"LabelEmbeddedCover": "כריכה מוטמעת", "LabelEmbeddedCover": "כריכה מוטמעת",
"LabelEnable": "הפעל", "LabelEnable": "אפשר",
"LabelEnd": "סיום", "LabelEncodingBackupLocation": "גיבוי של קבצי אודיו מקוריים יישמר ב:",
"LabelEncodingChaptersNotEmbedded": "פרקים אינם מוטבעים בספרי אודיו מרובי רצועות.",
"LabelEncodingClearItemCache": "הקפד לנקות מטמון פריטים מעת לעת.",
"LabelEncodingFinishedM4B": "קובץ M4B סופי יישמר בתיקייה ה-audiobook ב:",
"LabelEncodingInfoEmbedded": "מטה דאטה יוטמע ברצועות השמע בתוך תיקיית ה-audiobook.",
"LabelEncodingStartedNavigation": "לאחר שהמשימה תתחיל אפשר לנווט לדף אחר.",
"LabelEncodingTimeWarning": "קידוד יכול להימשך עד 30 דקות.",
"LabelEncodingWarningAdvancedSettings": "אזהרה: אל תעדכן את ההגדרות האלה אלא אם כן אתה מכיר את אפשרויות קידוד ffmpeg.",
"LabelEncodingWatcherDisabled": "אם ה-watcher כבוי, יש לסרוק את הספר מחדש לאחר מכן.",
"LabelEnd": "סוף",
"LabelEndOfChapter": "סוף הפרק",
"LabelEpisode": "פרק", "LabelEpisode": "פרק",
"LabelEpisodeNotLinkedToRssFeed": "פרק לא מקושר לערוץ RSS",
"LabelEpisodeNumber": "פרק #{0}",
"LabelEpisodeTitle": "כותרת הפרק", "LabelEpisodeTitle": "כותרת הפרק",
"LabelEpisodeType": "סוג הפרק", "LabelEpisodeType": "סוג הפרק",
"LabelEpisodeUrlFromRssFeed": "קישור פרק מערוץ RSS",
"LabelEpisodes": "פרקים",
"LabelEpisodic": "ארעי",
"LabelExample": "דוגמה", "LabelExample": "דוגמה",
"LabelExpandSeries": "הרחב סדרה",
"LabelExpandSubSeries": "הרחב תת סדרה",
"LabelExplicit": "בוטה", "LabelExplicit": "בוטה",
"LabelExplicitChecked": "בוטה (מסומן)",
"LabelExplicitUnchecked": "לא בוטה (לא מסומן)",
"LabelExportOPML": "ייצוא OPML",
"LabelFeedURL": "כתובת ערוץ", "LabelFeedURL": "כתובת ערוץ",
"LabelFetchingMetadata": "מושך מטא-נתונים", "LabelFetchingMetadata": "מושך מטא-נתונים",
"LabelFile": "קובץ", "LabelFile": "קובץ",
"LabelFileBirthtime": "זמן יצירת הקובץ", "LabelFileBirthtime": "זמן יצירת הקובץ",
"LabelFileModified": "הקובץ שונה", "LabelFileBornDate": "נוצר {0}",
"LabelFilename": "שם הקובץ", "LabelFileModified": "קובץ נערך",
"LabelFileModifiedDate": "שונה {0}",
"LabelFilename": "שם קובץ",
"LabelFilterByUser": "סינון לפי משתמש", "LabelFilterByUser": "סינון לפי משתמש",
"LabelFindEpisodes": "מצא פרקים", "LabelFindEpisodes": "מצא פרקים",
"LabelFinished": "הושלם", "LabelFinished": "הושלם",
"LabelFolder": "תיקייה", "LabelFolder": "תיקייה",
"LabelFolders": "תיקיות", "LabelFolders": "תיקיות",
"LabelFontBold": "מודגש", "LabelFontBold": "מודגש",
"LabelFontBoldness": "עובי פונט",
"LabelFontFamily": "משפחת הפונטים", "LabelFontFamily": "משפחת הפונטים",
"LabelFontItalic": "נטוי", "LabelFontItalic": "נטוי",
"LabelFontScale": "קנה מידה של הפונט", "LabelFontScale": "גודל פונט",
"LabelFontStrikethrough": "קו חוצה", "LabelFontStrikethrough": "קו חוצה",
"LabelFormat": "תבנית", "LabelFormat": "תבנית",
"LabelGenre": "ז'אנר", "LabelFull": "מלא",
"LabelGenres": "ז'אנרים", "LabelGenre": "סגנון",
"LabelGenres": "סגנונות",
"LabelHardDeleteFile": "מחיקה חזקה של הקובץ", "LabelHardDeleteFile": "מחיקה חזקה של הקובץ",
"LabelHasEbook": "ספר אלקטרוני קיים", "LabelHasEbook": "קיים ספר אלקטרוני",
"LabelHasSupplementaryEbook": "קיים ספר אלקטרוני נלווה", "LabelHasSupplementaryEbook": "קיים ספר אלקטרוני משלים",
"LabelHideSubtitles": "הסתר תת כותרות",
"LabelHighestPriority": "העדיפות הגבוהה ביותר", "LabelHighestPriority": "העדיפות הגבוהה ביותר",
"LabelHost": "מארח", "LabelHost": "מארח",
"LabelHour": "שעה", "LabelHour": "שעה",
"LabelHours": "שעות",
"LabelIcon": "סמל", "LabelIcon": "סמל",
"LabelImageURLFromTheWeb": "כתובת התמונה מהרשת", "LabelImageURLFromTheWeb": "כתובת התמונה מהרשת",
"LabelInProgress": "בתהליך", "LabelInProgress": "בתהליך",
@ -341,25 +395,30 @@
"LabelIntervalEvery6Hours": "כל 6 שעות", "LabelIntervalEvery6Hours": "כל 6 שעות",
"LabelIntervalEveryDay": "כל יום", "LabelIntervalEveryDay": "כל יום",
"LabelIntervalEveryHour": "כל שעה", "LabelIntervalEveryHour": "כל שעה",
"LabelIntervalEveryMinute": "כל דקה",
"LabelInvert": "הפוך", "LabelInvert": "הפוך",
"LabelItem": "פריט", "LabelItem": "פריט",
"LabelJumpBackwardAmount": "כמות הרצה לאחור",
"LabelJumpForwardAmount": "כמות הרצה קדימה",
"LabelLanguage": "שפה", "LabelLanguage": "שפה",
"LabelLanguageDefaultServer": "שפת ברירת המחדל של השרת", "LabelLanguageDefaultServer": "שפת ברירת המחדל של השרת",
"LabelLanguages": "שפות",
"LabelLastBookAdded": "הספר האחרון שנוסף", "LabelLastBookAdded": "הספר האחרון שנוסף",
"LabelLastBookUpdated": "הספר האחרון שעודכן", "LabelLastBookUpdated": "הספר האחרון שעודכן",
"LabelLastSeen": "נראה לאחרונה", "LabelLastSeen": "נראה לאחרונה",
"LabelLastTime": "הזמן האחרון", "LabelLastTime": "הזמן האחרון",
"LabelLastUpdate": "עדכון אחרון", "LabelLastUpdate": "עדכון אחרון",
"LabelLayout": "פריסה", "LabelLayout": "Layout",
"LabelLayoutSinglePage": "דף בודד", "LabelLayoutSinglePage": "עמוד יחיד",
"LabelLayoutSplitPage": "פיצול הדף", "LabelLayoutSplitPage": "פיצול הדף",
"LabelLess": "פחות", "LabelLess": "פחות",
"LabelLibrariesAccessibleToUser": "ספריות נגישות למשתמש", "LabelLibrariesAccessibleToUser": "ספריות נגישות למשתמש",
"LabelLibrary": "ספרייה", "LabelLibrary": "ספרייה",
"LabelLibraryFilterSublistEmpty": "לא {0}",
"LabelLibraryItem": "פריט ספרייה", "LabelLibraryItem": "פריט ספרייה",
"LabelLibraryName": "שם הספרייה", "LabelLibraryName": "שם הספרייה",
"LabelLimit": "מגבלה", "LabelLimit": "מגבלה",
"LabelLineSpacing": "ריווח שורות", "LabelLineSpacing": "מרווח שורה",
"LabelListenAgain": "האזן שוב", "LabelListenAgain": "האזן שוב",
"LabelLogLevelDebug": "דיבוג", "LabelLogLevelDebug": "דיבוג",
"LabelLogLevelInfo": "מידע", "LabelLogLevelInfo": "מידע",
@ -368,6 +427,10 @@
"LabelLowestPriority": "העדיפות הנמוכה ביותר", "LabelLowestPriority": "העדיפות הנמוכה ביותר",
"LabelMatchExistingUsersBy": "התאם משתמשים קיימים לפי", "LabelMatchExistingUsersBy": "התאם משתמשים קיימים לפי",
"LabelMatchExistingUsersByDescription": "משמש לחיבור משתמשים קיימים. לאחר החיבור, המשתמשים יותאמו לפי זיהוי ייחודי מספק ה-SSO שלך", "LabelMatchExistingUsersByDescription": "משמש לחיבור משתמשים קיימים. לאחר החיבור, המשתמשים יותאמו לפי זיהוי ייחודי מספק ה-SSO שלך",
"LabelMaxEpisodesToDownload": "מספר פרקים מקסימלי להורדה. 0 - ללא הגבלה.",
"LabelMaxEpisodesToDownloadPerCheck": "מספר פרקים חדשים מקסימלי להורדה בכל בדיקה",
"LabelMaxEpisodesToKeep": "מספר פרקים מקסימלי לשמור",
"LabelMaxEpisodesToKeepHelp": "ערך של 0 קובע ללא מגבלה. לאחר הורדה אוטומטית של פרק חדש יימחק את הפרק הישן ביותר אם יש לך יותר מ-X פרקים. פעולה זו תמחק רק פרק אחד לכל הורדה חדשה.",
"LabelMediaPlayer": "נגן מדיה", "LabelMediaPlayer": "נגן מדיה",
"LabelMediaType": "סוג מדיה", "LabelMediaType": "סוג מדיה",
"LabelMetaTag": "תג מטא", "LabelMetaTag": "תג מטא",
@ -375,6 +438,7 @@
"LabelMetadataOrderOfPrecedenceDescription": "מקורות המטא-נתונים עם עדיפות גבוהה יחליפו מקורות עם עדיפות נמוכה יותר", "LabelMetadataOrderOfPrecedenceDescription": "מקורות המטא-נתונים עם עדיפות גבוהה יחליפו מקורות עם עדיפות נמוכה יותר",
"LabelMetadataProvider": "ספק מטא-נתונים", "LabelMetadataProvider": "ספק מטא-נתונים",
"LabelMinute": "דקה", "LabelMinute": "דקה",
"LabelMinutes": "דקות",
"LabelMissing": "חסר", "LabelMissing": "חסר",
"LabelMissingEbook": "אין ספר אלקטרוני", "LabelMissingEbook": "אין ספר אלקטרוני",
"LabelMissingSupplementaryEbook": "אין ספר אלקטרוני נלווה", "LabelMissingSupplementaryEbook": "אין ספר אלקטרוני נלווה",
@ -387,10 +451,11 @@
"LabelNarrators": "מספרים", "LabelNarrators": "מספרים",
"LabelNew": "חדש", "LabelNew": "חדש",
"LabelNewPassword": "סיסמה חדשה", "LabelNewPassword": "סיסמה חדשה",
"LabelNewestAuthors": "הסופרים החדשים ביותר", "LabelNewestAuthors": "הסופרים האחרונים",
"LabelNewestEpisodes": "הפרקים החדשים ביותר", "LabelNewestEpisodes": "הפרקים החדשים ביותר",
"LabelNextBackupDate": "תאריך הגיבוי הבא", "LabelNextBackupDate": "תאריך הגיבוי הבא",
"LabelNextScheduledRun": "הרצה מתוזמנת הבאה", "LabelNextScheduledRun": "הרצה מתוזמנת הבאה",
"LabelNoCustomMetadataProviders": "אין ספקי מטא-נתונים מותאמים אישית",
"LabelNoEpisodesSelected": "לא נבחרו פרקים", "LabelNoEpisodesSelected": "לא נבחרו פרקים",
"LabelNotFinished": "לא הושלם", "LabelNotFinished": "לא הושלם",
"LabelNotStarted": "לא התחיל", "LabelNotStarted": "לא התחיל",
@ -405,7 +470,9 @@
"LabelNotificationsMaxQueueSize": "גודל התור המרבי לאירועי התראה", "LabelNotificationsMaxQueueSize": "גודל התור המרבי לאירועי התראה",
"LabelNotificationsMaxQueueSizeHelp": "האירועים מוגבלים לשליחה אחת לשנייה. האירועים יתעלמו אם התור מלא. הגדרה זו נועדה למנוע ספאם התראות.", "LabelNotificationsMaxQueueSizeHelp": "האירועים מוגבלים לשליחה אחת לשנייה. האירועים יתעלמו אם התור מלא. הגדרה זו נועדה למנוע ספאם התראות.",
"LabelNumberOfBooks": "מספר הספרים", "LabelNumberOfBooks": "מספר הספרים",
"LabelNumberOfEpisodes": "מספר הפרקים", "LabelNumberOfEpisodes": "# פרקים",
"LabelOpenIDAdvancedPermsClaimDescription": "שם OpenID claim המכילה הרשאות מתקדמות לפעולות משתמש בתוך האפליקציה, אשר יחולו על תפקידים שאינם מנהלי מערכת (<b>אם הוגדרה</b>). אם התביעה חסרה בתגובה, הגישה ל-ABS תידחה. אם אפשרות אחת חסרה, היא תטופל כ-<code>false</code> יש לוודא שטענת ספק הזהויות תואמת את המבנה הצפוי:",
"LabelOpenIDClaims": "השאר את האפשרויות הבאות ריקות כדי להשבית הקצאת קבוצות והרשאות מתקדמת, ולאחר מכן להקצות אוטומטית את קבוצת 'משתמש'.",
"LabelOpenRSSFeed": "פתח ערוץ RSS", "LabelOpenRSSFeed": "פתח ערוץ RSS",
"LabelOverwrite": "לשכפל", "LabelOverwrite": "לשכפל",
"LabelPassword": "סיסמה", "LabelPassword": "סיסמה",
@ -433,13 +500,15 @@
"LabelProvider": "ספק", "LabelProvider": "ספק",
"LabelPubDate": "תאריך פרסום", "LabelPubDate": "תאריך פרסום",
"LabelPublishYear": "שנת הפרסום", "LabelPublishYear": "שנת הפרסום",
"LabelPublishedDate": "פורסם {0}",
"LabelPublisher": "מוציא לאור", "LabelPublisher": "מוציא לאור",
"LabelRSSFeedCustomOwnerEmail": "אימייל בעלים מותאם אישית", "LabelRSSFeedCustomOwnerEmail": "אימייל בעלים מותאם אישית",
"LabelRSSFeedCustomOwnerName": "שם בעלים מותאם אישית", "LabelRSSFeedCustomOwnerName": "שם בעלים מותאם אישית",
"LabelRSSFeedOpen": "פתח ערוץ RSS", "LabelRSSFeedOpen": "ערוץ RSS פתוח",
"LabelRSSFeedPreventIndexing": "מנע רישום", "LabelRSSFeedPreventIndexing": "מנע רישום",
"LabelRSSFeedSlug": "Slug של ערוץ ה-RSS", "LabelRSSFeedSlug": "Slug של ערוץ ה-RSS",
"LabelRSSFeedURL": "כתובת ערוץ ה-RSS", "LabelRSSFeedURL": "כתובת ערוץ ה-RSS",
"LabelRandomly": "באופן אקראי",
"LabelRead": "קריאה", "LabelRead": "קריאה",
"LabelReadAgain": "קרא שוב", "LabelReadAgain": "קרא שוב",
"LabelReadEbookWithoutProgress": "קרא/י ספר אלקטרוני ללא שמירת התקדמות", "LabelReadEbookWithoutProgress": "קרא/י ספר אלקטרוני ללא שמירת התקדמות",
@ -465,7 +534,7 @@
"LabelSeriesProgress": "התקדמות בסדרה", "LabelSeriesProgress": "התקדמות בסדרה",
"LabelServerYearReview": "השנה בסקירה של השרת ({0})", "LabelServerYearReview": "השנה בסקירה של השרת ({0})",
"LabelSetEbookAsPrimary": "קבע כראשי", "LabelSetEbookAsPrimary": "קבע כראשי",
"LabelSetEbookAsSupplementary": "קבע כספר אלקטרוני נלווה", "LabelSetEbookAsSupplementary": "קבע כמשלים",
"LabelSettingsAudiobooksOnly": "רק ספרי קול", "LabelSettingsAudiobooksOnly": "רק ספרי קול",
"LabelSettingsAudiobooksOnlyHelp": "הפעלת ההגדרה הזו תתעלם מקבצי ספרים אלקטרוניים אלא אם כן הם נמצאים בתיקיית ספרי קול, שבמקרה זה יקבעו כספרים אלקטרוניים נלווים", "LabelSettingsAudiobooksOnlyHelp": "הפעלת ההגדרה הזו תתעלם מקבצי ספרים אלקטרוניים אלא אם כן הם נמצאים בתיקיית ספרי קול, שבמקרה זה יקבעו כספרים אלקטרוניים נלווים",
"LabelSettingsBookshelfViewHelp": "עיצוב סקאומורפי עם מדפי עץ", "LabelSettingsBookshelfViewHelp": "עיצוב סקאומורפי עם מדפי עץ",
@ -500,7 +569,7 @@
"LabelShowAll": "הצג הכל", "LabelShowAll": "הצג הכל",
"LabelSize": "גודל", "LabelSize": "גודל",
"LabelSleepTimer": "טיימר שינה", "LabelSleepTimer": "טיימר שינה",
"LabelStart": "התחלה", "LabelStart": "התחל",
"LabelStartTime": "זמן התחלה", "LabelStartTime": "זמן התחלה",
"LabelStarted": "התחיל", "LabelStarted": "התחיל",
"LabelStartedAt": "התחיל ב", "LabelStartedAt": "התחיל ב",
@ -576,8 +645,8 @@
"LabelViewQueue": "הצג תור נגן", "LabelViewQueue": "הצג תור נגן",
"LabelVolume": "עוצמת קול", "LabelVolume": "עוצמת קול",
"LabelWeekdaysToRun": "ימי השבוע להרצה", "LabelWeekdaysToRun": "ימי השבוע להרצה",
"LabelYearReviewHide": "הסתר שנת סקירה", "LabelYearReviewHide": "הסתר סקירת שנה",
"LabelYearReviewShow": "הצג שנת סקירה", "LabelYearReviewShow": "הצג סקירת שנה",
"LabelYourAudiobookDuration": "משך הספר הקולי שלך", "LabelYourAudiobookDuration": "משך הספר הקולי שלך",
"LabelYourBookmarks": "הסימניות שלך", "LabelYourBookmarks": "הסימניות שלך",
"LabelYourPlaylists": "הפלייליסטים שלך", "LabelYourPlaylists": "הפלייליסטים שלך",
@ -628,8 +697,8 @@
"MessageDownloadingEpisode": "מוריד פרק", "MessageDownloadingEpisode": "מוריד פרק",
"MessageDragFilesIntoTrackOrder": "גרור קבצים לסדר ההשמעה נכון", "MessageDragFilesIntoTrackOrder": "גרור קבצים לסדר ההשמעה נכון",
"MessageEmbedFinished": "ההטמעה הושלמה!", "MessageEmbedFinished": "ההטמעה הושלמה!",
"MessageEpisodesQueuedForDownload": "{0} פרקים בתור להורדה", "MessageEpisodesQueuedForDownload": "{0} פרק/ים בתור להורדה",
"MessageFeedURLWillBe": "כתובת URL של העדכון תהיה {0}", "MessageFeedURLWillBe": "כתובת ה- URL של הערוץ תהיה {0}",
"MessageFetching": "מושך...", "MessageFetching": "מושך...",
"MessageForceReScanDescription": "תבוצע סריקה מחדש כמו סריקה חדש מאפס, תגי ID3 של קבצי קול, קבצי OPF, וקבצי טקסט ייסרקו כחדשים.", "MessageForceReScanDescription": "תבוצע סריקה מחדש כמו סריקה חדש מאפס, תגי ID3 של קבצי קול, קבצי OPF, וקבצי טקסט ייסרקו כחדשים.",
"MessageImportantNotice": "הודעה חשובה!", "MessageImportantNotice": "הודעה חשובה!",
@ -644,7 +713,7 @@
"MessageMapChapterTitles": "מפה שמות פרקים לפרקי הספר השמורים שלך ללא שינוי תגי זמן", "MessageMapChapterTitles": "מפה שמות פרקים לפרקי הספר השמורים שלך ללא שינוי תגי זמן",
"MessageMarkAllEpisodesFinished": "סמן את כל הפרקים כהסתיימו", "MessageMarkAllEpisodesFinished": "סמן את כל הפרקים כהסתיימו",
"MessageMarkAllEpisodesNotFinished": "סמן את כל הפרקים כלא הסתיימו", "MessageMarkAllEpisodesNotFinished": "סמן את כל הפרקים כלא הסתיימו",
"MessageMarkAsFinished": "סמן כהסתיים", "MessageMarkAsFinished": "סמן כהושלם",
"MessageMarkAsNotFinished": "סמן כלא הסתיים", "MessageMarkAsNotFinished": "סמן כלא הסתיים",
"MessageMatchBooksDescription": "ינסה להתאים ספרים בספריית הספרים שלך עם ספר מספק החיפוש הנבחר וימלא פרטים ריקים ותמונות כריכה. לא יחליף פרטים קיימים.", "MessageMatchBooksDescription": "ינסה להתאים ספרים בספריית הספרים שלך עם ספר מספק החיפוש הנבחר וימלא פרטים ריקים ותמונות כריכה. לא יחליף פרטים קיימים.",
"MessageNoAudioTracks": "אין רצועות שמע", "MessageNoAudioTracks": "אין רצועות שמע",
@ -674,7 +743,7 @@
"MessageNoSeries": "אין סדרות", "MessageNoSeries": "אין סדרות",
"MessageNoTags": "אין תגיות", "MessageNoTags": "אין תגיות",
"MessageNoTasksRunning": "אין משימות פעילות", "MessageNoTasksRunning": "אין משימות פעילות",
"MessageNoUpdatesWereNecessary": "לא היה צורך בעדכונים", "MessageNoUpdatesWereNecessary": "לא נדרש עדכון",
"MessageNoUserPlaylists": "אין לך רשימות השמעה", "MessageNoUserPlaylists": "אין לך רשימות השמעה",
"MessageNotYetImplemented": "עדיין לא מיושם", "MessageNotYetImplemented": "עדיין לא מיושם",
"MessageOr": "או", "MessageOr": "או",
@ -682,6 +751,7 @@
"MessagePlayChapter": "הקשב לתחילת הפרק", "MessagePlayChapter": "הקשב לתחילת הפרק",
"MessagePlaylistCreateFromCollection": "צור רשימת השמעה מאוסף", "MessagePlaylistCreateFromCollection": "צור רשימת השמעה מאוסף",
"MessagePodcastHasNoRSSFeedForMatching": "לפודקאסט אין כתובת URL של ערוץ RSS להתאמה", "MessagePodcastHasNoRSSFeedForMatching": "לפודקאסט אין כתובת URL של ערוץ RSS להתאמה",
"MessagePodcastSearchField": "הזן מונח חיפוש או כתובת URL של ערוץ RSS",
"MessageQuickMatchDescription": "ממלא פרטים ריקים וכריכות עם התוצאה הראשונה מ '{0}'. לא ימחק פרטים אלא אם הגדרת השרת 'העדף מטה-נתונים מותאמים' מופעלת.", "MessageQuickMatchDescription": "ממלא פרטים ריקים וכריכות עם התוצאה הראשונה מ '{0}'. לא ימחק פרטים אלא אם הגדרת השרת 'העדף מטה-נתונים מותאמים' מופעלת.",
"MessageRemoveChapter": "הסר פרק", "MessageRemoveChapter": "הסר פרק",
"MessageRemoveEpisodes": "הסר {0} פרקים", "MessageRemoveEpisodes": "הסר {0} פרקים",
@ -708,7 +778,7 @@
"NoteChangeRootPassword": "המשתמש root הוא המשתמש היחיד שיכולה להיות לו סיסמה ריקה", "NoteChangeRootPassword": "המשתמש root הוא המשתמש היחיד שיכולה להיות לו סיסמה ריקה",
"NoteChapterEditorTimes": "הערה: זמן ההתחלה של הפרק הראשון חייב להישאר 0:00 וזמן ההתחלה של הפרק האחרון לא יכול לחרוג מהזמן של ספר השמע.", "NoteChapterEditorTimes": "הערה: זמן ההתחלה של הפרק הראשון חייב להישאר 0:00 וזמן ההתחלה של הפרק האחרון לא יכול לחרוג מהזמן של ספר השמע.",
"NoteFolderPicker": "הערה: תיקיות שכבר מופו לא יוצגו", "NoteFolderPicker": "הערה: תיקיות שכבר מופו לא יוצגו",
"NoteRSSFeedPodcastAppsHttps": "אזהרה: רוב יישומי הפודקאסט דורשים שכתובת ה-URL ערוץ ה-RSS תשתמש ב-HTTPS", "NoteRSSFeedPodcastAppsHttps": "אזהרה: רוב אפליקציות הפודקאסטים ידרשו שכתובת האתר של ערוץ ה-RSS תשתמש ב-HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "אזהרה: פרק אחד או יותר לא מכילים תאריך פרסום. חלק מיישומי הפודקאסט דורשים זאת.", "NoteRSSFeedPodcastAppsPubDate": "אזהרה: פרק אחד או יותר לא מכילים תאריך פרסום. חלק מיישומי הפודקאסט דורשים זאת.",
"NoteUploaderFoldersWithMediaFiles": "תיקיות עם קבצי מדיה יעובדו כפריטי ספריה נפרדים.", "NoteUploaderFoldersWithMediaFiles": "תיקיות עם קבצי מדיה יעובדו כפריטי ספריה נפרדים.",
"NoteUploaderOnlyAudioFiles": "אם מועלים רק קבצי שמע, כל קובץ שמע יעובד כספר שמע נפרד.", "NoteUploaderOnlyAudioFiles": "אם מועלים רק קבצי שמע, כל קובץ שמע יעובד כספר שמע נפרד.",
@ -741,7 +811,7 @@
"ToastCollectionUpdateSuccess": "האוסף עודכן בהצלחה", "ToastCollectionUpdateSuccess": "האוסף עודכן בהצלחה",
"ToastItemCoverUpdateSuccess": "כריכת הפריט עודכנה בהצלחה", "ToastItemCoverUpdateSuccess": "כריכת הפריט עודכנה בהצלחה",
"ToastItemDetailsUpdateSuccess": "פרטי הפריט עודכנו בהצלחה", "ToastItemDetailsUpdateSuccess": "פרטי הפריט עודכנו בהצלחה",
"ToastItemMarkedAsFinishedFailed": "סימון כפריט כהושלם נכשל", "ToastItemMarkedAsFinishedFailed": "סימון כפריט שהושלם נכשל",
"ToastItemMarkedAsFinishedSuccess": "הפריט סומן כהושלם בהצלחה", "ToastItemMarkedAsFinishedSuccess": "הפריט סומן כהושלם בהצלחה",
"ToastItemMarkedAsNotFinishedFailed": "סימון כפריט שלא הושלם נכשל", "ToastItemMarkedAsNotFinishedFailed": "סימון כפריט שלא הושלם נכשל",
"ToastItemMarkedAsNotFinishedSuccess": "הפריט סומן כלא הושלם בהצלחה", "ToastItemMarkedAsNotFinishedSuccess": "הפריט סומן כלא הושלם בהצלחה",

View file

@ -856,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Pokreni svaki {0} u {1}", "MessageScheduleRunEveryWeekdayAtTime": "Pokreni svaki {0} u {1}",
"MessageSearchResultsFor": "Rezultati pretrage za", "MessageSearchResultsFor": "Rezultati pretrage za",
"MessageSelected": "{0} odabrano", "MessageSelected": "{0} odabrano",
"MessageSeriesSequenceCannotContainSpaces": "Slijed serijala ne može sadržavati praznine",
"MessageServerCouldNotBeReached": "Nije moguće pristupiti poslužitelju", "MessageServerCouldNotBeReached": "Nije moguće pristupiti poslužitelju",
"MessageSetChaptersFromTracksDescription": "Postavi poglavlja koristeći se zvučnom datotekom kao poglavljem i nazivom datoteke kao naslovom poglavlja", "MessageSetChaptersFromTracksDescription": "Postavi poglavlja koristeći se zvučnom datotekom kao poglavljem i nazivom datoteke kao naslovom poglavlja",
"MessageShareExpirationWillBe": "Vrijeme isteka će biti <strong>{0}</strong>", "MessageShareExpirationWillBe": "Vrijeme isteka će biti <strong>{0}</strong>",
@ -917,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Pokreće se po završetku sigurnosnog kopiranja", "NotificationOnBackupCompletedDescription": "Pokreće se po završetku sigurnosnog kopiranja",
"NotificationOnBackupFailedDescription": "Pokreće se kada sigurnosno kopiranje ne uspije", "NotificationOnBackupFailedDescription": "Pokreće se kada sigurnosno kopiranje ne uspije",
"NotificationOnEpisodeDownloadedDescription": "Pokreće se kada se nastavak podcasta automatski preuzme", "NotificationOnEpisodeDownloadedDescription": "Pokreće se kada se nastavak podcasta automatski preuzme",
"NotificationOnRSSFeedDisabledDescription": "Pokreće se kada su automatska preuzimanja nastavaka onemogućena zbog previše neuspjelih pokušaja",
"NotificationOnRSSFeedFailedDescription": "Pokreće se u slučaju pogreške pri pokušaju automatskog preuzimanja nastavka s RSS izvora",
"NotificationOnTestDescription": "Događaj za testiranje sustava obavijesti", "NotificationOnTestDescription": "Događaj za testiranje sustava obavijesti",
"PlaceholderNewCollection": "Ime nove zbirke", "PlaceholderNewCollection": "Ime nove zbirke",
"PlaceholderNewFolderPath": "Nova putanja mape", "PlaceholderNewFolderPath": "Nova putanja mape",

View file

@ -11,7 +11,7 @@
"ButtonAuthors": "Szerzők", "ButtonAuthors": "Szerzők",
"ButtonBack": "Vissza", "ButtonBack": "Vissza",
"ButtonBatchEditPopulateFromExisting": "Létezőből feltöltés", "ButtonBatchEditPopulateFromExisting": "Létezőből feltöltés",
"ButtonBatchEditPopulateMapDetails": "", "ButtonBatchEditPopulateMapDetails": "A térkép részleteinek feltöltése",
"ButtonBrowseForFolder": "Mappa keresése", "ButtonBrowseForFolder": "Mappa keresése",
"ButtonCancel": "Mégse", "ButtonCancel": "Mégse",
"ButtonCancelEncode": "Kódolás megszakítása", "ButtonCancelEncode": "Kódolás megszakítása",
@ -177,6 +177,7 @@
"HeaderPlaylist": "Lejátszási lista", "HeaderPlaylist": "Lejátszási lista",
"HeaderPlaylistItems": "Lejátszási lista elemek", "HeaderPlaylistItems": "Lejátszási lista elemek",
"HeaderPodcastsToAdd": "Hozzáadandó podcastok", "HeaderPodcastsToAdd": "Hozzáadandó podcastok",
"HeaderPresets": "Alapbeállítások",
"HeaderPreviewCover": "Borító előnézete", "HeaderPreviewCover": "Borító előnézete",
"HeaderRSSFeedGeneral": "RSS részletek", "HeaderRSSFeedGeneral": "RSS részletek",
"HeaderRSSFeedIsOpen": "RSS hírcsatorna nyitva van", "HeaderRSSFeedIsOpen": "RSS hírcsatorna nyitva van",
@ -219,6 +220,7 @@
"LabelAccountTypeAdmin": "Adminisztrátor", "LabelAccountTypeAdmin": "Adminisztrátor",
"LabelAccountTypeGuest": "Vendég", "LabelAccountTypeGuest": "Vendég",
"LabelAccountTypeUser": "Felhasználó", "LabelAccountTypeUser": "Felhasználó",
"LabelActivities": "Tevékenységek",
"LabelActivity": "Tevékenység", "LabelActivity": "Tevékenység",
"LabelAddToCollection": "Hozzáadás a gyűjteményhez", "LabelAddToCollection": "Hozzáadás a gyűjteményhez",
"LabelAddToCollectionBatch": "{0} könyv hozzáadása a gyűjteményhez", "LabelAddToCollectionBatch": "{0} könyv hozzáadása a gyűjteményhez",
@ -228,6 +230,7 @@
"LabelAddedDate": "{0} Hozzáadva", "LabelAddedDate": "{0} Hozzáadva",
"LabelAdminUsersOnly": "Csak admin felhasználók", "LabelAdminUsersOnly": "Csak admin felhasználók",
"LabelAll": "Összes", "LabelAll": "Összes",
"LabelAllEpisodesDownloaded": "Minden epizód letöltve",
"LabelAllUsers": "Minden felhasználó", "LabelAllUsers": "Minden felhasználó",
"LabelAllUsersExcludingGuests": "Minden felhasználó, vendégek kivételével", "LabelAllUsersExcludingGuests": "Minden felhasználó, vendégek kivételével",
"LabelAllUsersIncludingGuests": "Minden felhasználó, beleértve a vendégeket is", "LabelAllUsersIncludingGuests": "Minden felhasználó, beleértve a vendégeket is",
@ -251,7 +254,7 @@
"LabelBackToUser": "Vissza a felhasználóhoz", "LabelBackToUser": "Vissza a felhasználóhoz",
"LabelBackupAudioFiles": "Audiófájlok biztonsági mentése", "LabelBackupAudioFiles": "Audiófájlok biztonsági mentése",
"LabelBackupLocation": "Biztonsági másolat helye", "LabelBackupLocation": "Biztonsági másolat helye",
"LabelBackupsEnableAutomaticBackups": "Automatikus biztonsági másolatok engedélyezése", "LabelBackupsEnableAutomaticBackups": "Automatikus biztonsági másolatok",
"LabelBackupsEnableAutomaticBackupsHelp": "Biztonsági másolatok mentése a /metadata/backups mappába", "LabelBackupsEnableAutomaticBackupsHelp": "Biztonsági másolatok mentése a /metadata/backups mappába",
"LabelBackupsMaxBackupSize": "Maximális biztonsági másolat méret (GB-ban) (0-tól végtelenig)", "LabelBackupsMaxBackupSize": "Maximális biztonsági másolat méret (GB-ban) (0-tól végtelenig)",
"LabelBackupsMaxBackupSizeHelp": "A rossz konfiguráció elleni védelem érdekében a biztonsági másolatok meghiúsulnak, ha meghaladják a beállított méretet.", "LabelBackupsMaxBackupSizeHelp": "A rossz konfiguráció elleni védelem érdekében a biztonsági másolatok meghiúsulnak, ha meghaladják a beállított méretet.",
@ -283,6 +286,7 @@
"LabelContinueSeries": "Sorozat folytatása", "LabelContinueSeries": "Sorozat folytatása",
"LabelCover": "Borító", "LabelCover": "Borító",
"LabelCoverImageURL": "Borítókép URL", "LabelCoverImageURL": "Borítókép URL",
"LabelCoverProvider": "Borító Szolgáltató",
"LabelCreatedAt": "Létrehozás ideje", "LabelCreatedAt": "Létrehozás ideje",
"LabelCronExpression": "Cron kifejezés", "LabelCronExpression": "Cron kifejezés",
"LabelCurrent": "Jelenlegi", "LabelCurrent": "Jelenlegi",
@ -391,7 +395,8 @@
"LabelIntervalEvery6Hours": "Minden 6 órában", "LabelIntervalEvery6Hours": "Minden 6 órában",
"LabelIntervalEveryDay": "Minden nap", "LabelIntervalEveryDay": "Minden nap",
"LabelIntervalEveryHour": "Minden órában", "LabelIntervalEveryHour": "Minden órában",
"LabelInvert": "Megfordítás", "LabelIntervalEveryMinute": "Minden percben",
"LabelInvert": "Inverz",
"LabelItem": "Elem", "LabelItem": "Elem",
"LabelJumpBackwardAmount": "Visszafelé ugrás mennyisége", "LabelJumpBackwardAmount": "Visszafelé ugrás mennyisége",
"LabelJumpForwardAmount": "Előre ugrás mennyisége", "LabelJumpForwardAmount": "Előre ugrás mennyisége",
@ -486,6 +491,7 @@
"LabelPersonalYearReview": "Az éved összefoglalása ({0})", "LabelPersonalYearReview": "Az éved összefoglalása ({0})",
"LabelPhotoPathURL": "Fénykép útvonal/URL", "LabelPhotoPathURL": "Fénykép útvonal/URL",
"LabelPlayMethod": "Lejátszási módszer", "LabelPlayMethod": "Lejátszási módszer",
"LabelPlaybackRateIncrementDecrement": "Lejátszási sebesség növelés/csökkentés értéke",
"LabelPlayerChapterNumberMarker": "{0} a {1} -ből", "LabelPlayerChapterNumberMarker": "{0} a {1} -ből",
"LabelPlaylists": "Lejátszási listák", "LabelPlaylists": "Lejátszási listák",
"LabelPodcast": "Podcast", "LabelPodcast": "Podcast",
@ -508,7 +514,7 @@
"LabelPublishers": "Kiadók", "LabelPublishers": "Kiadók",
"LabelRSSFeedCustomOwnerEmail": "Egyéni tulajdonos e-mail", "LabelRSSFeedCustomOwnerEmail": "Egyéni tulajdonos e-mail",
"LabelRSSFeedCustomOwnerName": "Egyéni tulajdonos neve", "LabelRSSFeedCustomOwnerName": "Egyéni tulajdonos neve",
"LabelRSSFeedOpen": "RSS hírcsatorna nyitva", "LabelRSSFeedOpen": "RSS-hírcsatorna nyitva",
"LabelRSSFeedPreventIndexing": "Indexelés megakadályozása", "LabelRSSFeedPreventIndexing": "Indexelés megakadályozása",
"LabelRSSFeedSlug": "RSS hírcsatorna slug", "LabelRSSFeedSlug": "RSS hírcsatorna slug",
"LabelRSSFeedURL": "RSS hírcsatorna URL", "LabelRSSFeedURL": "RSS hírcsatorna URL",
@ -525,6 +531,7 @@
"LabelReleaseDate": "Megjelenés dátuma", "LabelReleaseDate": "Megjelenés dátuma",
"LabelRemoveAllMetadataAbs": "Az összes metadata.abs fájl eltávolítása", "LabelRemoveAllMetadataAbs": "Az összes metadata.abs fájl eltávolítása",
"LabelRemoveAllMetadataJson": "Az összes metadata.json fájl eltávolítása", "LabelRemoveAllMetadataJson": "Az összes metadata.json fájl eltávolítása",
"LabelRemoveAudibleBranding": "Audible intro és outro eltávolítása a fejezetekből",
"LabelRemoveCover": "Borító eltávolítása", "LabelRemoveCover": "Borító eltávolítása",
"LabelRemoveMetadataFile": "Metaadatfájlok eltávolítása a könyvtár elemek mappáiból", "LabelRemoveMetadataFile": "Metaadatfájlok eltávolítása a könyvtár elemek mappáiból",
"LabelRemoveMetadataFileHelp": "A metadata.json és metadata.abs fájlokat eltávolítása a {0} mappáidból.", "LabelRemoveMetadataFileHelp": "A metadata.json és metadata.abs fájlokat eltávolítása a {0} mappáidból.",
@ -554,6 +561,8 @@
"LabelSettingsBookshelfViewHelp": "Skeuomorfikus dizájn fa polcokkal", "LabelSettingsBookshelfViewHelp": "Skeuomorfikus dizájn fa polcokkal",
"LabelSettingsChromecastSupport": "Chromecast támogatás", "LabelSettingsChromecastSupport": "Chromecast támogatás",
"LabelSettingsDateFormat": "Dátumformátum", "LabelSettingsDateFormat": "Dátumformátum",
"LabelSettingsEnableWatcher": "Változások automatikus vizsgálata a könyvtárakban",
"LabelSettingsEnableWatcherForLibrary": "Változások automatikus vizsgálata a könyvtárban",
"LabelSettingsEnableWatcherHelp": "Engedélyezi az automatikus elem hozzáadás/frissítés funkciót, amikor fájlváltozásokat észlel. *Szerver újraindítása szükséges", "LabelSettingsEnableWatcherHelp": "Engedélyezi az automatikus elem hozzáadás/frissítés funkciót, amikor fájlváltozásokat észlel. *Szerver újraindítása szükséges",
"LabelSettingsEpubsAllowScriptedContent": "Szkriptelt tartalmak engedélyezése epub-okban", "LabelSettingsEpubsAllowScriptedContent": "Szkriptelt tartalmak engedélyezése epub-okban",
"LabelSettingsEpubsAllowScriptedContentHelp": "Megengedi, hogy az epub fájlok szkripteket hajtsanak végre. Ezt a beállítást kikapcsolva ajánlott tartani, kivéve, ha megbízik az epub fájlok forrásában.", "LabelSettingsEpubsAllowScriptedContentHelp": "Megengedi, hogy az epub fájlok szkripteket hajtsanak végre. Ezt a beállítást kikapcsolva ajánlott tartani, kivéve, ha megbízik az epub fájlok forrásában.",
@ -597,6 +606,7 @@
"LabelSlug": "Rövid cím", "LabelSlug": "Rövid cím",
"LabelSortAscending": "Emelkedő", "LabelSortAscending": "Emelkedő",
"LabelSortDescending": "Csökkenő", "LabelSortDescending": "Csökkenő",
"LabelSortPubDate": "Rendezés megjelenés dátuma szerint",
"LabelStart": "Kezdés", "LabelStart": "Kezdés",
"LabelStartTime": "Kezdési idő", "LabelStartTime": "Kezdési idő",
"LabelStarted": "Elkezdődött", "LabelStarted": "Elkezdődött",
@ -697,12 +707,17 @@
"LabelYourProgress": "Haladásod", "LabelYourProgress": "Haladásod",
"MessageAddToPlayerQueue": "Hozzáadás a lejátszó sorhoz", "MessageAddToPlayerQueue": "Hozzáadás a lejátszó sorhoz",
"MessageAppriseDescription": "Ennek a funkció használatához futtatnia kell egy <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> példányt vagy egy olyan API-t, amely kezeli ezeket a kéréseket. <br />Az Apprise API URL-nek a teljes URL útvonalat kell tartalmaznia az értesítés elküldéséhez, például, ha az API példánya a <code>http://192.168.1.1:8337</code> címen szolgáltatva, akkor <code>http://192.168.1.1:8337/notify</code> értéket kell megadnia.", "MessageAppriseDescription": "Ennek a funkció használatához futtatnia kell egy <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> példányt vagy egy olyan API-t, amely kezeli ezeket a kéréseket. <br />Az Apprise API URL-nek a teljes URL útvonalat kell tartalmaznia az értesítés elküldéséhez, például, ha az API példánya a <code>http://192.168.1.1:8337</code> címen szolgáltatva, akkor <code>http://192.168.1.1:8337/notify</code> értéket kell megadnia.",
"MessageAsinCheck": "Győződjön meg róla, hogy az ASIN-t a megfelelő Audible régióból használja, nem az Amazonból.",
"MessageAuthenticationOIDCChangesRestart": "A mentés után indítsa újra a szervert az OIDC módosítások alkalmazásához.",
"MessageBackupsDescription": "A biztonsági másolatok tartalmazzák a felhasználókat, a felhasználói haladást, a könyvtári elem részleteit, a szerver beállításait és a képeket, amelyek a <code>/metadata/items</code> és <code>/metadata/authors</code> mappákban vannak tárolva. A biztonsági másolatok <strong>nem</strong> tartalmazzák a könyvtári mappákban tárolt fájlokat.", "MessageBackupsDescription": "A biztonsági másolatok tartalmazzák a felhasználókat, a felhasználói haladást, a könyvtári elem részleteit, a szerver beállításait és a képeket, amelyek a <code>/metadata/items</code> és <code>/metadata/authors</code> mappákban vannak tárolva. A biztonsági másolatok <strong>nem</strong> tartalmazzák a könyvtári mappákban tárolt fájlokat.",
"MessageBackupsLocationEditNote": "Megjegyzés: A biztonsági mentés helyének frissítése nem mozgatja vagy módosítja a meglévő biztonsági mentéseket", "MessageBackupsLocationEditNote": "Megjegyzés: A biztonsági mentés helyének frissítése nem mozgatja vagy módosítja a meglévő biztonsági mentéseket",
"MessageBackupsLocationNoEditNote": "Megjegyzés: A biztonsági mentés helye egy környezeti változóval van beállítva, és itt nem módosítható.", "MessageBackupsLocationNoEditNote": "Megjegyzés: A biztonsági mentés helye egy környezeti változóval van beállítva, és itt nem módosítható.",
"MessageBackupsLocationPathEmpty": "A biztonsági mentés helyének elérési útvonala nem lehet üres", "MessageBackupsLocationPathEmpty": "A biztonsági mentés helyének elérési útvonala nem lehet üres",
"MessageBatchEditPopulateMapDetailsAllHelp": "Az engedélyezett mezők feltöltése az összes elem adatával. A több értéket tartalmazó mezők összevonásra kerülnek",
"MessageBatchEditPopulateMapDetailsItemHelp": "A térkép engedélyezett adatmezőinek feltöltése ezen elem adataival",
"MessageBatchQuickMatchDescription": "A Gyors egyeztetés megpróbálja hozzáadni a hiányzó borítókat és metaadatokat a kiválasztott elemekhez. Engedélyezze az alábbi opciókat, hogy a Gyors egyeztetés felülírhassa a meglévő borítókat és/vagy metaadatokat.", "MessageBatchQuickMatchDescription": "A Gyors egyeztetés megpróbálja hozzáadni a hiányzó borítókat és metaadatokat a kiválasztott elemekhez. Engedélyezze az alábbi opciókat, hogy a Gyors egyeztetés felülírhassa a meglévő borítókat és/vagy metaadatokat.",
"MessageBookshelfNoCollections": "Még nem készített gyűjteményeket", "MessageBookshelfNoCollections": "Még nem készített gyűjteményeket",
"MessageBookshelfNoCollectionsHelp": "A gyűjtemények nyilvánosak. Minden, a könyvtárhoz hozzáféréssel rendelkező felhasználó láthatja őket.",
"MessageBookshelfNoRSSFeeds": "Nincsenek nyitott RSS hírcsatornák", "MessageBookshelfNoRSSFeeds": "Nincsenek nyitott RSS hírcsatornák",
"MessageBookshelfNoResultsForFilter": "Nincs eredmény a \"{0}: {1}\" szűrőre", "MessageBookshelfNoResultsForFilter": "Nincs eredmény a \"{0}: {1}\" szűrőre",
"MessageBookshelfNoResultsForQuery": "Nincs eredmény a lekérdezéshez", "MessageBookshelfNoResultsForQuery": "Nincs eredmény a lekérdezéshez",
@ -712,6 +727,7 @@
"MessageChapterErrorStartGteDuration": "Érvénytelen kezdési idő, kevesebbnek kell lennie, mint a hangoskönyv időtartama", "MessageChapterErrorStartGteDuration": "Érvénytelen kezdési idő, kevesebbnek kell lennie, mint a hangoskönyv időtartama",
"MessageChapterErrorStartLtPrev": "Érvénytelen kezdési idő, nagyobbnak kell lennie, mint az előző fejezet kezdési ideje", "MessageChapterErrorStartLtPrev": "Érvénytelen kezdési idő, nagyobbnak kell lennie, mint az előző fejezet kezdési ideje",
"MessageChapterStartIsAfter": "A fejezet kezdete a hangoskönyv végét követi", "MessageChapterStartIsAfter": "A fejezet kezdete a hangoskönyv végét követi",
"MessageChaptersNotFound": "Fejezetek nem találhatók",
"MessageCheckingCron": "Cron ellenőrzése...", "MessageCheckingCron": "Cron ellenőrzése...",
"MessageConfirmCloseFeed": "Biztosan be szeretné zárni ezt a hírcsatornát?", "MessageConfirmCloseFeed": "Biztosan be szeretné zárni ezt a hírcsatornát?",
"MessageConfirmDeleteBackup": "Biztosan törölni szeretné a(z) {0} biztonsági másolatot?", "MessageConfirmDeleteBackup": "Biztosan törölni szeretné a(z) {0} biztonsági másolatot?",
@ -768,6 +784,7 @@
"MessageForceReScanDescription": "minden fájlt újra szkennel, mint egy friss szkennelés. Az audiofájlok ID3 címkéi, OPF fájlok és szövegfájlok újként lesznek szkennelve.", "MessageForceReScanDescription": "minden fájlt újra szkennel, mint egy friss szkennelés. Az audiofájlok ID3 címkéi, OPF fájlok és szövegfájlok újként lesznek szkennelve.",
"MessageImportantNotice": "Fontos közlemény!", "MessageImportantNotice": "Fontos közlemény!",
"MessageInsertChapterBelow": "Fejezet beszúrása alulra", "MessageInsertChapterBelow": "Fejezet beszúrása alulra",
"MessageInvalidAsin": "Érvénytelen ASIN",
"MessageItemsSelected": "{0} kiválasztott elem", "MessageItemsSelected": "{0} kiválasztott elem",
"MessageItemsUpdated": "{0} frissített elem", "MessageItemsUpdated": "{0} frissített elem",
"MessageJoinUsOn": "Csatlakozzon hozzánk a", "MessageJoinUsOn": "Csatlakozzon hozzánk a",
@ -813,6 +830,7 @@
"MessageNoTasksRunning": "Nincsenek futó feladatok", "MessageNoTasksRunning": "Nincsenek futó feladatok",
"MessageNoUpdatesWereNecessary": "Nem volt szükség frissítésekre", "MessageNoUpdatesWereNecessary": "Nem volt szükség frissítésekre",
"MessageNoUserPlaylists": "Nincsenek felhasználói lejátszási listák", "MessageNoUserPlaylists": "Nincsenek felhasználói lejátszási listák",
"MessageNoUserPlaylistsHelp": "A lejátszási listák személyesek. Csak az a felhasználó láthatja őket, aki létrehozta őket.",
"MessageNotYetImplemented": "Még nem implementált", "MessageNotYetImplemented": "Még nem implementált",
"MessageOpmlPreviewNote": "Megjegyzés: Ez egy előnézeti kép az elemzett OPML fájlról. A podcast tényleges címe az RSS hírcsatornából származik.", "MessageOpmlPreviewNote": "Megjegyzés: Ez egy előnézeti kép az elemzett OPML fájlról. A podcast tényleges címe az RSS hírcsatornából származik.",
"MessageOr": "vagy", "MessageOr": "vagy",
@ -835,8 +853,10 @@
"MessageRestoreBackupConfirm": "Biztosan vissza szeretné állítani a biztonsági másolatot, amely ekkor készült:", "MessageRestoreBackupConfirm": "Biztosan vissza szeretné állítani a biztonsági másolatot, amely ekkor készült:",
"MessageRestoreBackupWarning": "A biztonsági mentés visszaállítása felülírja az egész adatbázist, amely a /config mappában található, valamint a borítóképeket a /metadata/items és /metadata/authors mappákban.<br /><br />A biztonsági mentések nem módosítják a könyvtár mappáiban található fájlokat. Ha engedélyezte a szerverbeállításokat a borítóképek és a metaadatok könyvtármappákban való tárolására, akkor ezek nem kerülnek biztonsági mentésre vagy felülírásra.<br /><br />A szerver használó összes kliens automatikusan frissül.", "MessageRestoreBackupWarning": "A biztonsági mentés visszaállítása felülírja az egész adatbázist, amely a /config mappában található, valamint a borítóképeket a /metadata/items és /metadata/authors mappákban.<br /><br />A biztonsági mentések nem módosítják a könyvtár mappáiban található fájlokat. Ha engedélyezte a szerverbeállításokat a borítóképek és a metaadatok könyvtármappákban való tárolására, akkor ezek nem kerülnek biztonsági mentésre vagy felülírásra.<br /><br />A szerver használó összes kliens automatikusan frissül.",
"MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. A mappafigyelő nem működik minden fájlrendszernél (mint például az NFS), ezért helyette ütemezett könyvtárellenőrzéseket lehet használni.", "MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. A mappafigyelő nem működik minden fájlrendszernél (mint például az NFS), ezért helyette ütemezett könyvtárellenőrzéseket lehet használni.",
"MessageScheduleRunEveryWeekdayAtTime": "Futás minden {1} óra {0}-kor",
"MessageSearchResultsFor": "Keresési eredmények", "MessageSearchResultsFor": "Keresési eredmények",
"MessageSelected": "{0} kiválasztva", "MessageSelected": "{0} kiválasztva",
"MessageSeriesSequenceCannotContainSpaces": "Sorozat sorrend nem tartalmazhat szóközt",
"MessageServerCouldNotBeReached": "A szervert nem lehet elérni", "MessageServerCouldNotBeReached": "A szervert nem lehet elérni",
"MessageSetChaptersFromTracksDescription": "Fejezetek beállítása minden egyes hangfájlt egy fejezetként használva, és a fejezet címét a hangfájl neveként", "MessageSetChaptersFromTracksDescription": "Fejezetek beállítása minden egyes hangfájlt egy fejezetként használva, és a fejezet címét a hangfájl neveként",
"MessageShareExpirationWillBe": "A lejárat: <strong>{0}</strong>", "MessageShareExpirationWillBe": "A lejárat: <strong>{0}</strong>",
@ -861,6 +881,7 @@
"MessageTaskNoFilesToScan": "Nincs beolvasandó fájl", "MessageTaskNoFilesToScan": "Nincs beolvasandó fájl",
"MessageTaskOpmlImport": "OPML import", "MessageTaskOpmlImport": "OPML import",
"MessageTaskOpmlImportDescription": "Podcastok létrehozása {0} RSS hírcsatornából", "MessageTaskOpmlImportDescription": "Podcastok létrehozása {0} RSS hírcsatornából",
"MessageTaskOpmlImportFeed": "OPML import hírcsatorna",
"MessageTaskOpmlImportFeedDescription": "RSS feed „{0}” importálása", "MessageTaskOpmlImportFeedDescription": "RSS feed „{0}” importálása",
"MessageTaskOpmlImportFeedFailed": "Nem sikerült letölteni a podcast feedet", "MessageTaskOpmlImportFeedFailed": "Nem sikerült letölteni a podcast feedet",
"MessageTaskOpmlImportFeedPodcastDescription": "„{0}” podcast létrehozása", "MessageTaskOpmlImportFeedPodcastDescription": "„{0}” podcast létrehozása",
@ -869,6 +890,7 @@
"MessageTaskOpmlImportFinished": "{0} podcast hozzáadva", "MessageTaskOpmlImportFinished": "{0} podcast hozzáadva",
"MessageTaskOpmlParseFailed": "Az OPML fájl elemzése nem sikerült", "MessageTaskOpmlParseFailed": "Az OPML fájl elemzése nem sikerült",
"MessageTaskOpmlParseFastFail": "Érvénytelen OPML fájl: <opml> tag nem található VAGY nem találtak <outline> taget", "MessageTaskOpmlParseFastFail": "Érvénytelen OPML fájl: <opml> tag nem található VAGY nem találtak <outline> taget",
"MessageTaskOpmlParseNoneFound": "Nem található feed az OPML fájlban",
"MessageTaskScanItemsAdded": "{0} hozzáadva", "MessageTaskScanItemsAdded": "{0} hozzáadva",
"MessageTaskScanItemsMissing": "{0} hiányzik", "MessageTaskScanItemsMissing": "{0} hiányzik",
"MessageTaskScanItemsUpdated": "{0} frissítve", "MessageTaskScanItemsUpdated": "{0} frissítve",
@ -896,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "A biztonsági mentés befejezésekor aktiválódik", "NotificationOnBackupCompletedDescription": "A biztonsági mentés befejezésekor aktiválódik",
"NotificationOnBackupFailedDescription": "A biztonsági mentés sikertelensége esetén aktiválódik", "NotificationOnBackupFailedDescription": "A biztonsági mentés sikertelensége esetén aktiválódik",
"NotificationOnEpisodeDownloadedDescription": "Egy podcast epizód automatikus letöltésekor aktiválódik", "NotificationOnEpisodeDownloadedDescription": "Egy podcast epizód automatikus letöltésekor aktiválódik",
"NotificationOnRSSFeedDisabledDescription": "Akkor lép működésbe, ha az automatikus epizódletöltés a túl sok sikertelen próbálkozás miatt letiltásra kerül",
"NotificationOnRSSFeedFailedDescription": "Akkor aktiválódik, ha az RSS feed kérés sikertelen az automatikus epizódletöltésnél",
"NotificationOnTestDescription": "Esemény az értesítési rendszer teszteléséhez", "NotificationOnTestDescription": "Esemény az értesítési rendszer teszteléséhez",
"PlaceholderNewCollection": "Új gyűjtemény neve", "PlaceholderNewCollection": "Új gyűjtemény neve",
"PlaceholderNewFolderPath": "Új mappa útvonala", "PlaceholderNewFolderPath": "Új mappa útvonala",
@ -940,8 +964,11 @@
"ToastBackupRestoreFailed": "A biztonsági mentés visszaállítása sikertelen", "ToastBackupRestoreFailed": "A biztonsági mentés visszaállítása sikertelen",
"ToastBackupUploadFailed": "A biztonsági mentés feltöltése sikertelen", "ToastBackupUploadFailed": "A biztonsági mentés feltöltése sikertelen",
"ToastBackupUploadSuccess": "Biztonsági mentés feltöltve", "ToastBackupUploadSuccess": "Biztonsági mentés feltöltve",
"ToastBatchApplyDetailsToItemsSuccess": "Tételekre alkalmazott részletek",
"ToastBatchDeleteFailed": "A tömeges törlés nem sikerült", "ToastBatchDeleteFailed": "A tömeges törlés nem sikerült",
"ToastBatchDeleteSuccess": "Sikeres tömeges törlés", "ToastBatchDeleteSuccess": "Sikeres tömeges törlés",
"ToastBatchQuickMatchFailed": "Tömeges Gyors Egyeztetés sikertelen!",
"ToastBatchQuickMatchStarted": "{0} könyv Tömeges Gyors Egyeztetése elkezdődött!",
"ToastBatchUpdateFailed": "Kötegelt frissítés sikertelen", "ToastBatchUpdateFailed": "Kötegelt frissítés sikertelen",
"ToastBatchUpdateSuccess": "Kötegelt frissítés sikeres", "ToastBatchUpdateSuccess": "Kötegelt frissítés sikeres",
"ToastBookmarkCreateFailed": "Könyvjelző létrehozása sikertelen", "ToastBookmarkCreateFailed": "Könyvjelző létrehozása sikertelen",
@ -950,9 +977,12 @@
"ToastCachePurgeFailed": "A gyorsítótár törlése sikertelen", "ToastCachePurgeFailed": "A gyorsítótár törlése sikertelen",
"ToastCachePurgeSuccess": "A gyorsítótár sikeresen törölve", "ToastCachePurgeSuccess": "A gyorsítótár sikeresen törölve",
"ToastChaptersHaveErrors": "A fejezetek hibákat tartalmaznak", "ToastChaptersHaveErrors": "A fejezetek hibákat tartalmaznak",
"ToastChaptersInvalidShiftAmountLast": "Érvénytelen eltolási érték. Az utolsó fejezet kezdési időpontja túlnyúlna a hangoskönyv időtartamán.",
"ToastChaptersInvalidShiftAmountStart": "Érvénytelen eltolási érték. Az első fejezet hossza nulla vagy negatív lenne, és a második fejezet felülírná. Növelje a második fejezet kezdő időtartamát.",
"ToastChaptersMustHaveTitles": "A fejezeteknek címekkel kell rendelkezniük", "ToastChaptersMustHaveTitles": "A fejezeteknek címekkel kell rendelkezniük",
"ToastChaptersRemoved": "Fejezetek eltávolítva", "ToastChaptersRemoved": "Fejezetek eltávolítva",
"ToastChaptersUpdated": "Fejezetek frissítve", "ToastChaptersUpdated": "Fejezetek frissítve",
"ToastCollectionItemsAddFailed": "A tétel(ek) hozzáadása gyűjteményhez sikertelen",
"ToastCollectionRemoveSuccess": "Gyűjtemény eltávolítva", "ToastCollectionRemoveSuccess": "Gyűjtemény eltávolítva",
"ToastCollectionUpdateSuccess": "Gyűjtemény frissítve", "ToastCollectionUpdateSuccess": "Gyűjtemény frissítve",
"ToastCoverUpdateFailed": "A borító frissítése nem sikerült", "ToastCoverUpdateFailed": "A borító frissítése nem sikerült",
@ -967,6 +997,7 @@
"ToastEncodeCancelFailed": "A kódolás törlése sikertelen volt", "ToastEncodeCancelFailed": "A kódolás törlése sikertelen volt",
"ToastEncodeCancelSucces": "Kódolás törölve", "ToastEncodeCancelSucces": "Kódolás törölve",
"ToastEpisodeDownloadQueueClearFailed": "Nem sikerült törölni a várólistát", "ToastEpisodeDownloadQueueClearFailed": "Nem sikerült törölni a várólistát",
"ToastEpisodeDownloadQueueClearSuccess": "Epizód letöltési várólista törölve",
"ToastEpisodeUpdateSuccess": "{0} epizód frissítve", "ToastEpisodeUpdateSuccess": "{0} epizód frissítve",
"ToastErrorCannotShare": "Ezen az eszközön nem lehet natívan megosztani", "ToastErrorCannotShare": "Ezen az eszközön nem lehet natívan megosztani",
"ToastFailedToLoadData": "Sikertelen adatbetöltés", "ToastFailedToLoadData": "Sikertelen adatbetöltés",
@ -974,6 +1005,7 @@
"ToastFailedToShare": "Nem sikerült megosztani", "ToastFailedToShare": "Nem sikerült megosztani",
"ToastFailedToUpdate": "Nem sikerült frissíteni", "ToastFailedToUpdate": "Nem sikerült frissíteni",
"ToastInvalidImageUrl": "Érvénytelen a kép URL címe", "ToastInvalidImageUrl": "Érvénytelen a kép URL címe",
"ToastInvalidMaxEpisodesToDownload": "A letölthető epizódok száma érvénytelen",
"ToastInvalidUrl": "Érvénytelen URL", "ToastInvalidUrl": "Érvénytelen URL",
"ToastItemCoverUpdateSuccess": "Elem borítója frissítve", "ToastItemCoverUpdateSuccess": "Elem borítója frissítve",
"ToastItemDeletedFailed": "Nem sikerült törölni az elemet", "ToastItemDeletedFailed": "Nem sikerült törölni az elemet",
@ -1011,8 +1043,11 @@
"ToastNoUpdatesNecessary": "Nincs szükség frissítésre", "ToastNoUpdatesNecessary": "Nincs szükség frissítésre",
"ToastNotificationCreateFailed": "Értesítés létrehozása sikertelen", "ToastNotificationCreateFailed": "Értesítés létrehozása sikertelen",
"ToastNotificationDeleteFailed": "Értesítés törlése sikertelen", "ToastNotificationDeleteFailed": "Értesítés törlése sikertelen",
"ToastNotificationFailedMaximum": "A sikertelen kísérletek maximális száma >= 0 kell, hogy legyen",
"ToastNotificationQueueMaximum": "Az értesítési sor maximális száma >= 0 kell, hogy legyen",
"ToastNotificationSettingsUpdateSuccess": "Értesítési beállítások frissítve", "ToastNotificationSettingsUpdateSuccess": "Értesítési beállítások frissítve",
"ToastNotificationTestTriggerFailed": "Nem sikerült a tesztértesítést elindítani", "ToastNotificationTestTriggerFailed": "Nem sikerült a tesztértesítést elindítani",
"ToastNotificationTestTriggerSuccess": "Kiváltott tesztértesítés",
"ToastNotificationUpdateSuccess": "Értesítés frissítve", "ToastNotificationUpdateSuccess": "Értesítés frissítve",
"ToastPlaylistCreateFailed": "Lejátszási lista létrehozása sikertelen", "ToastPlaylistCreateFailed": "Lejátszási lista létrehozása sikertelen",
"ToastPlaylistCreateSuccess": "Lejátszási lista létrehozva", "ToastPlaylistCreateSuccess": "Lejátszási lista létrehozva",
@ -1020,6 +1055,7 @@
"ToastPlaylistUpdateSuccess": "Lejátszási lista frissítve", "ToastPlaylistUpdateSuccess": "Lejátszási lista frissítve",
"ToastPodcastCreateFailed": "Podcast létrehozása sikertelen", "ToastPodcastCreateFailed": "Podcast létrehozása sikertelen",
"ToastPodcastCreateSuccess": "A podcast sikeresen létrehozva", "ToastPodcastCreateSuccess": "A podcast sikeresen létrehozva",
"ToastPodcastGetFeedFailed": "Nem sikerült podcast feedet kapni",
"ToastPodcastNoEpisodesInFeed": "Nincsenek epizódok az RSS hírcsatornában", "ToastPodcastNoEpisodesInFeed": "Nincsenek epizódok az RSS hírcsatornában",
"ToastPodcastNoRssFeed": "A podcastnak nincs RSS-hírcsatornája", "ToastPodcastNoRssFeed": "A podcastnak nincs RSS-hírcsatornája",
"ToastProgressIsNotBeingSynced": "Az előrehaladás nem szinkronizálódik, a lejátszás újraindul", "ToastProgressIsNotBeingSynced": "Az előrehaladás nem szinkronizálódik, a lejátszás újraindul",
@ -1032,10 +1068,18 @@
"ToastRemoveFailed": "Sikertelen eltávolítás", "ToastRemoveFailed": "Sikertelen eltávolítás",
"ToastRemoveItemFromCollectionFailed": "Tétel eltávolítása a gyűjteményből sikertelen", "ToastRemoveItemFromCollectionFailed": "Tétel eltávolítása a gyűjteményből sikertelen",
"ToastRemoveItemFromCollectionSuccess": "Tétel eltávolítva a gyűjteményből", "ToastRemoveItemFromCollectionSuccess": "Tétel eltávolítva a gyűjteményből",
"ToastRemoveItemsWithIssuesFailed": "Nem sikerült eltávolítani a hibás könyvtárelemeket",
"ToastRemoveItemsWithIssuesSuccess": "Hibás könyvtárelemek eltávolítva",
"ToastRenameFailed": "Sikertelen átnevezés", "ToastRenameFailed": "Sikertelen átnevezés",
"ToastRescanFailed": "Sikertelen újrakeresés a következőnél: {0}",
"ToastRescanRemoved": "A teljes újrabeolvasás befejezve, elem eltávolítva",
"ToastRescanUpToDate": "A teljes újrabeolvasás befejezve, elem naprakész volt",
"ToastRescanUpdated": "A teljes újrabeolvasás befejezve, elem frissítve",
"ToastScanFailed": "Nem sikerült beolvasni a könyvtárelemet",
"ToastSelectAtLeastOneUser": "Válasszon legalább egy felhasználót", "ToastSelectAtLeastOneUser": "Válasszon legalább egy felhasználót",
"ToastSendEbookToDeviceFailed": "E-könyv küldése az eszközre sikertelen", "ToastSendEbookToDeviceFailed": "E-könyv küldése az eszközre sikertelen",
"ToastSendEbookToDeviceSuccess": "E-könyv elküldve az eszközre \"{0}\"", "ToastSendEbookToDeviceSuccess": "E-könyv elküldve az eszközre \"{0}\"",
"ToastSeriesSubmitFailedSameName": "Nem lehet két azonos nevű sorozatot hozzáadni",
"ToastSeriesUpdateFailed": "Sorozat frissítése sikertelen", "ToastSeriesUpdateFailed": "Sorozat frissítése sikertelen",
"ToastSeriesUpdateSuccess": "Sorozat frissítése sikeres", "ToastSeriesUpdateSuccess": "Sorozat frissítése sikeres",
"ToastServerSettingsUpdateSuccess": "Szerver beállítások frissítve", "ToastServerSettingsUpdateSuccess": "Szerver beállítások frissítve",
@ -1043,6 +1087,8 @@
"ToastSessionDeleteFailed": "Munkamenet törlése sikertelen", "ToastSessionDeleteFailed": "Munkamenet törlése sikertelen",
"ToastSessionDeleteSuccess": "Munkamenet törölve", "ToastSessionDeleteSuccess": "Munkamenet törölve",
"ToastSleepTimerDone": "Alvásidőzítő kész... zZzzZZz", "ToastSleepTimerDone": "Alvásidőzítő kész... zZzzZZz",
"ToastSlugMustChange": "A Slug érvénytelen karaktereket tartalmaz",
"ToastSlugRequired": "Slug szükséges",
"ToastSocketConnected": "Socket csatlakoztatva", "ToastSocketConnected": "Socket csatlakoztatva",
"ToastSocketDisconnected": "Socket lecsatlakoztatva", "ToastSocketDisconnected": "Socket lecsatlakoztatva",
"ToastSocketFailedToConnect": "A Socket csatlakoztatása sikertelen", "ToastSocketFailedToConnect": "A Socket csatlakoztatása sikertelen",
@ -1050,9 +1096,14 @@
"ToastSortingPrefixesUpdateSuccess": "Rendezési előtagok frissítése ({0} elem)", "ToastSortingPrefixesUpdateSuccess": "Rendezési előtagok frissítése ({0} elem)",
"ToastTitleRequired": "A cím kötelező", "ToastTitleRequired": "A cím kötelező",
"ToastUnknownError": "Ismeretlen hiba", "ToastUnknownError": "Ismeretlen hiba",
"ToastUnlinkOpenIdFailed": "Nem sikerült leválasztani a felhasználót az OpenID-ről",
"ToastUnlinkOpenIdSuccess": "Felhasználó leválasztva az OpenID-ről",
"ToastUploaderFilepathExistsError": "A \"{0}\" fájl elérési útja már létezik a szerveren",
"ToastUploaderItemExistsInSubdirectoryError": "A „{0}” elem a feltöltési útvonal egy alkönyvtárát használja.",
"ToastUserDeleteFailed": "Felhasználó törlése sikertelen", "ToastUserDeleteFailed": "Felhasználó törlése sikertelen",
"ToastUserDeleteSuccess": "Felhasználó törölve", "ToastUserDeleteSuccess": "Felhasználó törölve",
"ToastUserPasswordChangeSuccess": "Jelszó sikeresen megváltoztatva", "ToastUserPasswordChangeSuccess": "Jelszó sikeresen megváltoztatva",
"ToastUserPasswordMismatch": "A jelszavak nem egyeznek",
"ToastUserPasswordMustChange": "Az új jelszó nem egyezik a régi jelszóval", "ToastUserPasswordMustChange": "Az új jelszó nem egyezik a régi jelszóval",
"ToastUserRootRequireName": "Egy root felhasználónevet kell megadnia" "ToastUserRootRequireName": "Egy root felhasználónevet kell megadnia"
} }

View file

@ -514,7 +514,7 @@
"LabelPublishers": "Editori", "LabelPublishers": "Editori",
"LabelRSSFeedCustomOwnerEmail": "E-mail del proprietario personalizzato", "LabelRSSFeedCustomOwnerEmail": "E-mail del proprietario personalizzato",
"LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato", "LabelRSSFeedCustomOwnerName": "Nome del proprietario personalizzato",
"LabelRSSFeedOpen": "Flusso RSS aperto", "LabelRSSFeedOpen": "Feed RSS aperto",
"LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione", "LabelRSSFeedPreventIndexing": "Impedisci l'indicizzazione",
"LabelRSSFeedSlug": "Parole chiave del flusso RSS", "LabelRSSFeedSlug": "Parole chiave del flusso RSS",
"LabelRSSFeedURL": "URL del flusso RSS", "LabelRSSFeedURL": "URL del flusso RSS",
@ -708,6 +708,7 @@
"MessageAddToPlayerQueue": "Aggiungi alla coda di riproduzione", "MessageAddToPlayerQueue": "Aggiungi alla coda di riproduzione",
"MessageAppriseDescription": "Per utilizzare questa funzione è necessario disporre di un'istanza di <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> in esecuzione o un'API che gestirà quelle stesse richieste. <br />L'API Url dovrebbe essere il percorso URL completo per inviare la notifica, ad esempio se la tua istanza API è servita cosi .<code>http://192.168.1.1:8337</code> Allora dovrai mettere <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "Per utilizzare questa funzione è necessario disporre di un'istanza di <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> in esecuzione o un'API che gestirà quelle stesse richieste. <br />L'API Url dovrebbe essere il percorso URL completo per inviare la notifica, ad esempio se la tua istanza API è servita cosi .<code>http://192.168.1.1:8337</code> Allora dovrai mettere <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Assicurati di utilizzare l'ASIN della regione Audible corretta, non di Amazon.", "MessageAsinCheck": "Assicurati di utilizzare l'ASIN della regione Audible corretta, non di Amazon.",
"MessageAuthenticationOIDCChangesRestart": "Riavvia il tuo server dopo aver salvato per applicare le modifiche OIDC.",
"MessageBackupsDescription": "I backup includono utenti, progressi degli utenti, dettagli sugli elementi della libreria, impostazioni del server e immagini archiviate in <code>/metadata/items</code> & <code>/metadata/authors</code>. I backup non includono i file archiviati nelle cartelle della libreria.", "MessageBackupsDescription": "I backup includono utenti, progressi degli utenti, dettagli sugli elementi della libreria, impostazioni del server e immagini archiviate in <code>/metadata/items</code> & <code>/metadata/authors</code>. I backup non includono i file archiviati nelle cartelle della libreria.",
"MessageBackupsLocationEditNote": "Nota: l'aggiornamento della posizione di backup non sposterà o modificherà i backup esistenti", "MessageBackupsLocationEditNote": "Nota: l'aggiornamento della posizione di backup non sposterà o modificherà i backup esistenti",
"MessageBackupsLocationNoEditNote": "Nota: la posizione del backup viene impostata tramite una variabile di ambiente e non può essere modificata qui.", "MessageBackupsLocationNoEditNote": "Nota: la posizione del backup viene impostata tramite una variabile di ambiente e non può essere modificata qui.",
@ -855,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Esegui ogni {0} alle {1}", "MessageScheduleRunEveryWeekdayAtTime": "Esegui ogni {0} alle {1}",
"MessageSearchResultsFor": "cerca risultati per", "MessageSearchResultsFor": "cerca risultati per",
"MessageSelected": "{0} selezionati", "MessageSelected": "{0} selezionati",
"MessageSeriesSequenceCannotContainSpaces": "La sequenza della serie non può contenere spazi",
"MessageServerCouldNotBeReached": "Impossibile raggiungere il server", "MessageServerCouldNotBeReached": "Impossibile raggiungere il server",
"MessageSetChaptersFromTracksDescription": "Impostare i capitoli utilizzando ciascun file audio come capitolo e il titolo del capitolo come nome del file audio", "MessageSetChaptersFromTracksDescription": "Impostare i capitoli utilizzando ciascun file audio come capitolo e il titolo del capitolo come nome del file audio",
"MessageShareExpirationWillBe": "Scadrà tra <strong>{0}</strong>", "MessageShareExpirationWillBe": "Scadrà tra <strong>{0}</strong>",
@ -916,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Attivato al completamento di un backup", "NotificationOnBackupCompletedDescription": "Attivato al completamento di un backup",
"NotificationOnBackupFailedDescription": "Attivato quando un backup fallisce", "NotificationOnBackupFailedDescription": "Attivato quando un backup fallisce",
"NotificationOnEpisodeDownloadedDescription": "Attivato quando un episodio di podcast viene scaricato automaticamente", "NotificationOnEpisodeDownloadedDescription": "Attivato quando un episodio di podcast viene scaricato automaticamente",
"NotificationOnRSSFeedDisabledDescription": "Attivato quando i download automatici degli episodi vengono disabilitati a causa di troppi tentativi falliti",
"NotificationOnRSSFeedFailedDescription": "Attivato quando la richiesta del feed RSS per il download automatico di un episodio fallisce",
"NotificationOnTestDescription": "test il sistema di notifica", "NotificationOnTestDescription": "test il sistema di notifica",
"PlaceholderNewCollection": "Nome Nuova Raccolta", "PlaceholderNewCollection": "Nome Nuova Raccolta",
"PlaceholderNewFolderPath": "Nuovo Percorso Cartella", "PlaceholderNewFolderPath": "Nuovo Percorso Cartella",

View file

@ -177,6 +177,7 @@
"HeaderPlaylist": "Afspeellijst", "HeaderPlaylist": "Afspeellijst",
"HeaderPlaylistItems": "Onderdelen in afspeellijst", "HeaderPlaylistItems": "Onderdelen in afspeellijst",
"HeaderPodcastsToAdd": "Toe te voegen podcasts", "HeaderPodcastsToAdd": "Toe te voegen podcasts",
"HeaderPresets": "Voorinstellingen",
"HeaderPreviewCover": "Preview cover", "HeaderPreviewCover": "Preview cover",
"HeaderRSSFeedGeneral": "RSS-details", "HeaderRSSFeedGeneral": "RSS-details",
"HeaderRSSFeedIsOpen": "RSS-feed is open", "HeaderRSSFeedIsOpen": "RSS-feed is open",
@ -394,6 +395,7 @@
"LabelIntervalEvery6Hours": "Iedere 6 uur", "LabelIntervalEvery6Hours": "Iedere 6 uur",
"LabelIntervalEveryDay": "Iedere dag", "LabelIntervalEveryDay": "Iedere dag",
"LabelIntervalEveryHour": "Ieder uur", "LabelIntervalEveryHour": "Ieder uur",
"LabelIntervalEveryMinute": "Elke minuut",
"LabelInvert": "Omdraaien", "LabelInvert": "Omdraaien",
"LabelItem": "Onderdeel", "LabelItem": "Onderdeel",
"LabelJumpBackwardAmount": "Terugspoelen hoeveelheid", "LabelJumpBackwardAmount": "Terugspoelen hoeveelheid",
@ -424,7 +426,7 @@
"LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum", "LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum",
"LabelLowestPriority": "Laagste Prioriteit", "LabelLowestPriority": "Laagste Prioriteit",
"LabelMatchExistingUsersBy": "Bestaande gebruikers matchen op", "LabelMatchExistingUsersBy": "Bestaande gebruikers matchen op",
"LabelMatchExistingUsersByDescription": "Wordt gebruikt om bestaande gebruikers te verbinden. Zodra ze verbonden zijn, worden gebruikers gekoppeld aan een unieke id van uw SSO-provider.", "LabelMatchExistingUsersByDescription": "Wordt gebruikt om bestaande gebruikers te verbinden. Zodra ze verbonden zijn, worden gebruikers gekoppeld aan een unieke id van uw SSO-provider",
"LabelMaxEpisodesToDownload": "Maximale # afleveringen om te downloaden. Gebruik 0 voor ongelimiteerd.", "LabelMaxEpisodesToDownload": "Maximale # afleveringen om te downloaden. Gebruik 0 voor ongelimiteerd.",
"LabelMaxEpisodesToDownloadPerCheck": "Maximale # nieuwe afleveringen om te downloaden per check", "LabelMaxEpisodesToDownloadPerCheck": "Maximale # nieuwe afleveringen om te downloaden per check",
"LabelMaxEpisodesToKeep": "Maximale # afleveringen om te houden", "LabelMaxEpisodesToKeep": "Maximale # afleveringen om te houden",
@ -512,7 +514,7 @@
"LabelPublishers": "Uitgevers", "LabelPublishers": "Uitgevers",
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar", "LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar", "LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
"LabelRSSFeedOpen": "RSS-feed open", "LabelRSSFeedOpen": "RSS Feed Open",
"LabelRSSFeedPreventIndexing": "Voorkom indexering", "LabelRSSFeedPreventIndexing": "Voorkom indexering",
"LabelRSSFeedSlug": "RSS-feed slug", "LabelRSSFeedSlug": "RSS-feed slug",
"LabelRSSFeedURL": "RSS-feed URL", "LabelRSSFeedURL": "RSS-feed URL",
@ -529,6 +531,7 @@
"LabelReleaseDate": "Verschijningsdatum", "LabelReleaseDate": "Verschijningsdatum",
"LabelRemoveAllMetadataAbs": "Verwijder alle metadata.abs bestanden", "LabelRemoveAllMetadataAbs": "Verwijder alle metadata.abs bestanden",
"LabelRemoveAllMetadataJson": "Verwijder alle metadata.json bestanden", "LabelRemoveAllMetadataJson": "Verwijder alle metadata.json bestanden",
"LabelRemoveAudibleBranding": "Verwijder Audible intro en outro uit hoofdstukken",
"LabelRemoveCover": "Verwijder cover", "LabelRemoveCover": "Verwijder cover",
"LabelRemoveMetadataFile": "Verwijder metadata bestanden in bibliotheek item folders", "LabelRemoveMetadataFile": "Verwijder metadata bestanden in bibliotheek item folders",
"LabelRemoveMetadataFileHelp": "Verwijder alle metadata.json en metadata.abs bestanden in uw {0} folders.", "LabelRemoveMetadataFileHelp": "Verwijder alle metadata.json en metadata.abs bestanden in uw {0} folders.",
@ -558,6 +561,8 @@
"LabelSettingsBookshelfViewHelp": "Skeumorphisch design met houten planken", "LabelSettingsBookshelfViewHelp": "Skeumorphisch design met houten planken",
"LabelSettingsChromecastSupport": "Chromecast ondersteuning", "LabelSettingsChromecastSupport": "Chromecast ondersteuning",
"LabelSettingsDateFormat": "Datum format", "LabelSettingsDateFormat": "Datum format",
"LabelSettingsEnableWatcher": "Bibliotheken automatisch scannen op wijzigingen",
"LabelSettingsEnableWatcherForLibrary": "Bibliotheek automatisch scannen op wijzigingen",
"LabelSettingsEnableWatcherHelp": "Zorgt voor het automatisch toevoegen/bijwerken van onderdelen als bestandswijzigingen worden gedetecteerd. *Vereist herstarten van server", "LabelSettingsEnableWatcherHelp": "Zorgt voor het automatisch toevoegen/bijwerken van onderdelen als bestandswijzigingen worden gedetecteerd. *Vereist herstarten van server",
"LabelSettingsEpubsAllowScriptedContent": "Sta scripted content toe in epubs", "LabelSettingsEpubsAllowScriptedContent": "Sta scripted content toe in epubs",
"LabelSettingsEpubsAllowScriptedContentHelp": "Sta toe dat epub-bestanden scripts uitvoeren. Het wordt aanbevolen om deze instelling uitgeschakeld te houden, tenzij u de bron van de epub-bestanden vertrouwt.", "LabelSettingsEpubsAllowScriptedContentHelp": "Sta toe dat epub-bestanden scripts uitvoeren. Het wordt aanbevolen om deze instelling uitgeschakeld te houden, tenzij u de bron van de epub-bestanden vertrouwt.",
@ -601,6 +606,7 @@
"LabelSlug": "Slak", "LabelSlug": "Slak",
"LabelSortAscending": "Oplopend", "LabelSortAscending": "Oplopend",
"LabelSortDescending": "Aflopend", "LabelSortDescending": "Aflopend",
"LabelSortPubDate": "Sorteer Pub Datum",
"LabelStart": "Start", "LabelStart": "Start",
"LabelStartTime": "Starttijd", "LabelStartTime": "Starttijd",
"LabelStarted": "Gestart", "LabelStarted": "Gestart",
@ -701,6 +707,8 @@
"LabelYourProgress": "Je voortgang", "LabelYourProgress": "Je voortgang",
"MessageAddToPlayerQueue": "Toevoegen aan wachtrij", "MessageAddToPlayerQueue": "Toevoegen aan wachtrij",
"MessageAppriseDescription": "Om deze functie te gebruiken heb je een draaiende instantie van <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nodig of een api die dezelfde requests afhandelt. <br />De Apprise API Url moet het volledige URL-pad zijn om de notificatie te verzenden, b.v., als je API-instantie draait op <code>http://192.168.1.1:8337</code> dan zou je <code>http://192.168.1.1:8337/notify</code> gebruiken.", "MessageAppriseDescription": "Om deze functie te gebruiken heb je een draaiende instantie van <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nodig of een api die dezelfde requests afhandelt. <br />De Apprise API Url moet het volledige URL-pad zijn om de notificatie te verzenden, b.v., als je API-instantie draait op <code>http://192.168.1.1:8337</code> dan zou je <code>http://192.168.1.1:8337/notify</code> gebruiken.",
"MessageAsinCheck": "Zorg ervoor dat u de ASIN van de juiste Audible-regio gebruikt, niet die van Amazon.",
"MessageAuthenticationOIDCChangesRestart": "Start uw server opnieuw op nadat u het opslaan hebt uitgevoerd, om de OIDC-wijzigingen toe te passen.",
"MessageBackupsDescription": "Back-ups omvatten gebruikers, gebruikers' voortgang, bibliotheekonderdeeldetails, serverinstellingen en afbeeldingen bewaard in <code>/metadata/items</code> & <code>/metadata/authors</code>. Back-ups <strong>bevatten niet</strong> de bestanden bewaard in je bibliotheekmappen.", "MessageBackupsDescription": "Back-ups omvatten gebruikers, gebruikers' voortgang, bibliotheekonderdeeldetails, serverinstellingen en afbeeldingen bewaard in <code>/metadata/items</code> & <code>/metadata/authors</code>. Back-ups <strong>bevatten niet</strong> de bestanden bewaard in je bibliotheekmappen.",
"MessageBackupsLocationEditNote": "Let op: het bijwerken van de back-uplocatie zal bestaande back-ups niet verplaatsen of wijzigen", "MessageBackupsLocationEditNote": "Let op: het bijwerken van de back-uplocatie zal bestaande back-ups niet verplaatsen of wijzigen",
"MessageBackupsLocationNoEditNote": "Let op: De back-uplocatie wordt ingesteld via een omgevingsvariabele en kan hier niet worden gewijzigd.", "MessageBackupsLocationNoEditNote": "Let op: De back-uplocatie wordt ingesteld via een omgevingsvariabele en kan hier niet worden gewijzigd.",
@ -719,6 +727,7 @@
"MessageChapterErrorStartGteDuration": "Ongeldig: starttijd moet kleiner zijn dan duur van audioboek", "MessageChapterErrorStartGteDuration": "Ongeldig: starttijd moet kleiner zijn dan duur van audioboek",
"MessageChapterErrorStartLtPrev": "Ongeldig: starttijd moet be groter zijn dan of equal aan starttijd van vorig hoofdstuk", "MessageChapterErrorStartLtPrev": "Ongeldig: starttijd moet be groter zijn dan of equal aan starttijd van vorig hoofdstuk",
"MessageChapterStartIsAfter": "Start van hoofdstuk is na het einde van je audioboek", "MessageChapterStartIsAfter": "Start van hoofdstuk is na het einde van je audioboek",
"MessageChaptersNotFound": "Hoofdstukken niet gevonden",
"MessageCheckingCron": "Cron aan het checken...", "MessageCheckingCron": "Cron aan het checken...",
"MessageConfirmCloseFeed": "Ben je zeker dat je deze feed wil sluiten?", "MessageConfirmCloseFeed": "Ben je zeker dat je deze feed wil sluiten?",
"MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?", "MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?",
@ -775,8 +784,9 @@
"MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.", "MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.",
"MessageImportantNotice": "Belangrijke opmerking!", "MessageImportantNotice": "Belangrijke opmerking!",
"MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen", "MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen",
"MessageItemsSelected": "{0} onderdelen geselecteerd", "MessageInvalidAsin": "Ongeldige ASIN",
"MessageItemsUpdated": "{0} onderdelen bijgewerkt", "MessageItemsSelected": "{0} items geselecteerd",
"MessageItemsUpdated": "{0} items bijgewerkt",
"MessageJoinUsOn": "Doe mee op", "MessageJoinUsOn": "Doe mee op",
"MessageLoading": "Aan het laden...", "MessageLoading": "Aan het laden...",
"MessageLoadingFolders": "Mappen aan het laden...", "MessageLoadingFolders": "Mappen aan het laden...",
@ -808,7 +818,7 @@
"MessageNoItems": "Geen onderdelen", "MessageNoItems": "Geen onderdelen",
"MessageNoItemsFound": "Geen onderdelen gevonden", "MessageNoItemsFound": "Geen onderdelen gevonden",
"MessageNoListeningSessions": "Geen luistersessies", "MessageNoListeningSessions": "Geen luistersessies",
"MessageNoLogs": "Geen logs", "MessageNoLogs": "Geen logbestanden",
"MessageNoMediaProgress": "Geen mediavoortgang", "MessageNoMediaProgress": "Geen mediavoortgang",
"MessageNoNotifications": "Geen notificaties", "MessageNoNotifications": "Geen notificaties",
"MessageNoPodcastFeed": "Ongeldige podcast: Geen Feed", "MessageNoPodcastFeed": "Ongeldige podcast: Geen Feed",
@ -843,8 +853,10 @@
"MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op", "MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op",
"MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.", "MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
"MessageScheduleLibraryScanNote": "Voor de meeste gebruikers is het raadzaam om deze functie uitgeschakeld te laten en de folder watcher-instelling ingeschakeld te houden. De folder watcher detecteert automatisch wijzigingen in uw bibliotheekmappen. De folder watcher werkt niet voor elk bestandssysteem (zoals NFS), dus geplande bibliotheekscans kunnen in plaats daarvan worden gebruikt.", "MessageScheduleLibraryScanNote": "Voor de meeste gebruikers is het raadzaam om deze functie uitgeschakeld te laten en de folder watcher-instelling ingeschakeld te houden. De folder watcher detecteert automatisch wijzigingen in uw bibliotheekmappen. De folder watcher werkt niet voor elk bestandssysteem (zoals NFS), dus geplande bibliotheekscans kunnen in plaats daarvan worden gebruikt.",
"MessageScheduleRunEveryWeekdayAtTime": "Elke {0} uitvoeren op {1}",
"MessageSearchResultsFor": "Zoekresultaten voor", "MessageSearchResultsFor": "Zoekresultaten voor",
"MessageSelected": "{0} geselecteerd", "MessageSelected": "{0} geselecteerd",
"MessageSeriesSequenceCannotContainSpaces": "Serievolgorde mag geen spaties bevatten",
"MessageServerCouldNotBeReached": "Server niet bereikbaar", "MessageServerCouldNotBeReached": "Server niet bereikbaar",
"MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel", "MessageSetChaptersFromTracksDescription": "Stel hoofdstukken in met ieder audiobestand als een hoofdstuk en de audiobestandsnaam als hoofdstuktitel",
"MessageShareExpirationWillBe": "Vervaldatum is <strong>{0}</strong>", "MessageShareExpirationWillBe": "Vervaldatum is <strong>{0}</strong>",
@ -906,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Wordt geactiveerd wanneer een back-up is voltooid", "NotificationOnBackupCompletedDescription": "Wordt geactiveerd wanneer een back-up is voltooid",
"NotificationOnBackupFailedDescription": "Wordt geactiveerd wanneer een back-up mislukt", "NotificationOnBackupFailedDescription": "Wordt geactiveerd wanneer een back-up mislukt",
"NotificationOnEpisodeDownloadedDescription": "Wordt geactiveerd wanneer een podcastaflevering automatisch wordt gedownload", "NotificationOnEpisodeDownloadedDescription": "Wordt geactiveerd wanneer een podcastaflevering automatisch wordt gedownload",
"NotificationOnRSSFeedDisabledDescription": "Wordt geactiveerd wanneer automatische afleveringsdownloads zijn uitgeschakeld vanwege te veel mislukte pogingen",
"NotificationOnRSSFeedFailedDescription": "Getriggerd wanneer de RSS feed aanvraag faalt voor een automatische aflevering download",
"NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem", "NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem",
"PlaceholderNewCollection": "Nieuwe naam collectie", "PlaceholderNewCollection": "Nieuwe naam collectie",
"PlaceholderNewFolderPath": "Nieuwe locatie map", "PlaceholderNewFolderPath": "Nieuwe locatie map",
@ -950,6 +964,7 @@
"ToastBackupRestoreFailed": "Herstellen back-up mislukt", "ToastBackupRestoreFailed": "Herstellen back-up mislukt",
"ToastBackupUploadFailed": "Uploaden back-up mislukt", "ToastBackupUploadFailed": "Uploaden back-up mislukt",
"ToastBackupUploadSuccess": "Back-up geüpload", "ToastBackupUploadSuccess": "Back-up geüpload",
"ToastBatchApplyDetailsToItemsSuccess": "Details toegepast op items",
"ToastBatchDeleteFailed": "Batch verwijderen mislukt", "ToastBatchDeleteFailed": "Batch verwijderen mislukt",
"ToastBatchDeleteSuccess": "Batch verwijderen gelukt", "ToastBatchDeleteSuccess": "Batch verwijderen gelukt",
"ToastBatchQuickMatchFailed": "Batch Snel Vergelijken mislukt!", "ToastBatchQuickMatchFailed": "Batch Snel Vergelijken mislukt!",
@ -962,6 +977,8 @@
"ToastCachePurgeFailed": "Cache wissen is mislukt", "ToastCachePurgeFailed": "Cache wissen is mislukt",
"ToastCachePurgeSuccess": "Cache succesvol verwijderd", "ToastCachePurgeSuccess": "Cache succesvol verwijderd",
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten", "ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
"ToastChaptersInvalidShiftAmountLast": "Ongeldige shift-tijd. De starttijd van het laatste hoofdstuk zou langer zijn dan de duur van dit audioboek.",
"ToastChaptersInvalidShiftAmountStart": "Ongeldige shift-lengte. Het eerste hoofdstuk zou nul of een negatieve lengte hebben en zou worden overschreven door het tweede hoofdstuk. Verleng de startduur van het tweede hoofdstuk.",
"ToastChaptersMustHaveTitles": "Hoofdstukken moeten titels hebben", "ToastChaptersMustHaveTitles": "Hoofdstukken moeten titels hebben",
"ToastChaptersRemoved": "Hoofdstukken verwijderd", "ToastChaptersRemoved": "Hoofdstukken verwijderd",
"ToastChaptersUpdated": "Hoofdstukken bijgewerkt", "ToastChaptersUpdated": "Hoofdstukken bijgewerkt",
@ -1062,6 +1079,7 @@
"ToastSelectAtLeastOneUser": "Selecteer ten minste een gebruiker", "ToastSelectAtLeastOneUser": "Selecteer ten minste een gebruiker",
"ToastSendEbookToDeviceFailed": "Ebook naar apparaat sturen mislukt", "ToastSendEbookToDeviceFailed": "Ebook naar apparaat sturen mislukt",
"ToastSendEbookToDeviceSuccess": "Ebook verstuurd naar apparaat \"{0}\"", "ToastSendEbookToDeviceSuccess": "Ebook verstuurd naar apparaat \"{0}\"",
"ToastSeriesSubmitFailedSameName": "Kan niet twee series met dezelfde naam toevoegen",
"ToastSeriesUpdateFailed": "Bijwerken serie mislukt", "ToastSeriesUpdateFailed": "Bijwerken serie mislukt",
"ToastSeriesUpdateSuccess": "Bijwerken serie gelukt", "ToastSeriesUpdateSuccess": "Bijwerken serie gelukt",
"ToastServerSettingsUpdateSuccess": "Server instellingen bijgewerkt", "ToastServerSettingsUpdateSuccess": "Server instellingen bijgewerkt",
@ -1080,6 +1098,8 @@
"ToastUnknownError": "Onbekende fout", "ToastUnknownError": "Onbekende fout",
"ToastUnlinkOpenIdFailed": "Gebruiker ontkoppelen van OpenID mislukt", "ToastUnlinkOpenIdFailed": "Gebruiker ontkoppelen van OpenID mislukt",
"ToastUnlinkOpenIdSuccess": "Gebruiker ontkoppeld van OpenID", "ToastUnlinkOpenIdSuccess": "Gebruiker ontkoppeld van OpenID",
"ToastUploaderFilepathExistsError": "Bestandspad \"{0}\" bestaat al op de server",
"ToastUploaderItemExistsInSubdirectoryError": "Item \"{0}\" gebruikt een submap van het uploadpad.",
"ToastUserDeleteFailed": "Verwijderen gebruiker mislukt", "ToastUserDeleteFailed": "Verwijderen gebruiker mislukt",
"ToastUserDeleteSuccess": "Gebruiker verwijderd", "ToastUserDeleteSuccess": "Gebruiker verwijderd",
"ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd", "ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd",

View file

@ -8,7 +8,7 @@
"ButtonAddYourFirstLibrary": "Legg til ditt første bibliotek", "ButtonAddYourFirstLibrary": "Legg til ditt første bibliotek",
"ButtonApply": "Bruk", "ButtonApply": "Bruk",
"ButtonApplyChapters": "Bruk kapittel", "ButtonApplyChapters": "Bruk kapittel",
"ButtonAuthors": "Forfatter", "ButtonAuthors": "Forfattere",
"ButtonBack": "Tilbake", "ButtonBack": "Tilbake",
"ButtonBrowseForFolder": "Bla gjennom mappe", "ButtonBrowseForFolder": "Bla gjennom mappe",
"ButtonCancel": "Avbryt", "ButtonCancel": "Avbryt",
@ -175,6 +175,7 @@
"HeaderPlaylist": "Spilleliste", "HeaderPlaylist": "Spilleliste",
"HeaderPlaylistItems": "Spillelisteelement", "HeaderPlaylistItems": "Spillelisteelement",
"HeaderPodcastsToAdd": "Podcaster å legge til", "HeaderPodcastsToAdd": "Podcaster å legge til",
"HeaderPresets": "Forhåndsinnstillinger",
"HeaderPreviewCover": "Forhåndsvis omslag", "HeaderPreviewCover": "Forhåndsvis omslag",
"HeaderRSSFeedGeneral": "RSS Detailer", "HeaderRSSFeedGeneral": "RSS Detailer",
"HeaderRSSFeedIsOpen": "RSS Feed er åpen", "HeaderRSSFeedIsOpen": "RSS Feed er åpen",
@ -217,6 +218,7 @@
"LabelAccountTypeAdmin": "Administrator", "LabelAccountTypeAdmin": "Administrator",
"LabelAccountTypeGuest": "Gjest", "LabelAccountTypeGuest": "Gjest",
"LabelAccountTypeUser": "Bruker", "LabelAccountTypeUser": "Bruker",
"LabelActivities": "Aktiviteter",
"LabelActivity": "Aktivitet", "LabelActivity": "Aktivitet",
"LabelAddToCollection": "Legg til i samling", "LabelAddToCollection": "Legg til i samling",
"LabelAddToCollectionBatch": "Legg {0} bøker til samling", "LabelAddToCollectionBatch": "Legg {0} bøker til samling",
@ -226,6 +228,7 @@
"LabelAddedDate": "La til {0}", "LabelAddedDate": "La til {0}",
"LabelAdminUsersOnly": "Kun administratorer", "LabelAdminUsersOnly": "Kun administratorer",
"LabelAll": "Alle", "LabelAll": "Alle",
"LabelAllEpisodesDownloaded": "Alle nedlastede episoder",
"LabelAllUsers": "Alle brukere", "LabelAllUsers": "Alle brukere",
"LabelAllUsersExcludingGuests": "Alle brukere bortsett fra gjester", "LabelAllUsersExcludingGuests": "Alle brukere bortsett fra gjester",
"LabelAllUsersIncludingGuests": "Alle brukere inkludert gjester", "LabelAllUsersIncludingGuests": "Alle brukere inkludert gjester",
@ -281,6 +284,7 @@
"LabelContinueSeries": "Fortsett serier", "LabelContinueSeries": "Fortsett serier",
"LabelCover": "Omslag", "LabelCover": "Omslag",
"LabelCoverImageURL": "Omslagsbilde URL", "LabelCoverImageURL": "Omslagsbilde URL",
"LabelCoverProvider": "Tilbyder av omslagsbilde",
"LabelCreatedAt": "Dato opprettet", "LabelCreatedAt": "Dato opprettet",
"LabelCronExpression": "Cron uttrykk", "LabelCronExpression": "Cron uttrykk",
"LabelCurrent": "Nåværende", "LabelCurrent": "Nåværende",
@ -389,6 +393,7 @@
"LabelIntervalEvery6Hours": "Hver 6. timer", "LabelIntervalEvery6Hours": "Hver 6. timer",
"LabelIntervalEveryDay": "Hver dag", "LabelIntervalEveryDay": "Hver dag",
"LabelIntervalEveryHour": "Hver time", "LabelIntervalEveryHour": "Hver time",
"LabelIntervalEveryMinute": "Hvert minutt",
"LabelInvert": "Inverter", "LabelInvert": "Inverter",
"LabelItem": "Enhet", "LabelItem": "Enhet",
"LabelJumpBackwardAmount": "Hopp bakover med", "LabelJumpBackwardAmount": "Hopp bakover med",
@ -464,6 +469,7 @@
"LabelNotificationsMaxQueueSizeHelp": "Hendelser er begrenset til avfyre én gang per sekund. Hendelser blir ignorert om køen er full. Dette forhindrer overflod av varslinger.", "LabelNotificationsMaxQueueSizeHelp": "Hendelser er begrenset til avfyre én gang per sekund. Hendelser blir ignorert om køen er full. Dette forhindrer overflod av varslinger.",
"LabelNumberOfBooks": "Antall bøker", "LabelNumberOfBooks": "Antall bøker",
"LabelNumberOfEpisodes": "Antall episoder", "LabelNumberOfEpisodes": "Antall episoder",
"LabelOpenIDAdvancedPermsClaimDescription": "Navnet på OpenID claim'et som inneholder avanserte tilganger for brukerhandlinger i applikasjonen som vil brukes for ikke-administratorroller (<b>hvis konfigurert</b>). Hvis claim'et mangler fra responsen, nektes tilgang til ABS. Hvis en enkelt opsjon mangler, blir behandlet som <code>false</code>. Påse at identitetstilbyderens claim stemmer overens med den forventede strukturen:",
"LabelOpenIDClaims": "La følge valg være tomme for å slå av avanserte gruppe og tillatelser. Gruppen \"Bruker\" vil da også automatisk legges til.", "LabelOpenIDClaims": "La følge valg være tomme for å slå av avanserte gruppe og tillatelser. Gruppen \"Bruker\" vil da også automatisk legges til.",
"LabelOpenRSSFeed": "Åpne RSS Feed", "LabelOpenRSSFeed": "Åpne RSS Feed",
"LabelOverwrite": "Overskriv", "LabelOverwrite": "Overskriv",
@ -521,6 +527,7 @@
"LabelReleaseDate": "Utgivelsesdato", "LabelReleaseDate": "Utgivelsesdato",
"LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer", "LabelRemoveAllMetadataAbs": "Fjern alle metadata.abs filer",
"LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer", "LabelRemoveAllMetadataJson": "Fjern alle metadata.json filer",
"LabelRemoveAudibleBranding": "Fjern Audible inn- og utledning fra kapitler",
"LabelRemoveCover": "Fjern omslag", "LabelRemoveCover": "Fjern omslag",
"LabelRemoveMetadataFile": "Fjern metadata-filer fra biblioteks-mapper", "LabelRemoveMetadataFile": "Fjern metadata-filer fra biblioteks-mapper",
"LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs i alle {0} mappene.", "LabelRemoveMetadataFileHelp": "Fjern alle metadata.json og metadata.abs i alle {0} mappene.",
@ -550,6 +557,8 @@
"LabelSettingsBookshelfViewHelp": "Skeuomorf design med hyller av ved", "LabelSettingsBookshelfViewHelp": "Skeuomorf design med hyller av ved",
"LabelSettingsChromecastSupport": "Chromecast støtte", "LabelSettingsChromecastSupport": "Chromecast støtte",
"LabelSettingsDateFormat": "Dato Format", "LabelSettingsDateFormat": "Dato Format",
"LabelSettingsEnableWatcher": "Skann biblioteker automatisk for endringer",
"LabelSettingsEnableWatcherForLibrary": "Skann bibliotek automatisk for endringer",
"LabelSettingsEnableWatcherHelp": "Aktiverer automatisk opprettelse/oppdatering av enheter når filendringer er oppdaget. *Krever restart av server*", "LabelSettingsEnableWatcherHelp": "Aktiverer automatisk opprettelse/oppdatering av enheter når filendringer er oppdaget. *Krever restart av server*",
"LabelSettingsEpubsAllowScriptedContent": "Tillat scripting i innholdet i ebub-bøker", "LabelSettingsEpubsAllowScriptedContent": "Tillat scripting i innholdet i ebub-bøker",
"LabelSettingsEpubsAllowScriptedContentHelp": "Tillat epub-filer å kjøre script. Det er anbefalt å slå av denne innstillingen med mindre du stoler på kilden til epub-filene.", "LabelSettingsEpubsAllowScriptedContentHelp": "Tillat epub-filer å kjøre script. Det er anbefalt å slå av denne innstillingen med mindre du stoler på kilden til epub-filene.",
@ -593,6 +602,7 @@
"LabelSlug": "Slug", "LabelSlug": "Slug",
"LabelSortAscending": "Stigende", "LabelSortAscending": "Stigende",
"LabelSortDescending": "Synkende", "LabelSortDescending": "Synkende",
"LabelSortPubDate": "Sorter etter publiseringsdato",
"LabelStart": "Start", "LabelStart": "Start",
"LabelStartTime": "Start Tid", "LabelStartTime": "Start Tid",
"LabelStarted": "Startet", "LabelStarted": "Startet",
@ -693,6 +703,8 @@
"LabelYourProgress": "Din fremgang", "LabelYourProgress": "Din fremgang",
"MessageAddToPlayerQueue": "Legg til i kø", "MessageAddToPlayerQueue": "Legg til i kø",
"MessageAppriseDescription": "For å bruke denne funksjonen trenger du en instans av <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kjørende eller et API som håndterer disse forespørslene. <br />Apprise API URL skal være hele URL-en til varslingen, f.eks., hvis din API-instans er på <code>http://192.168.1.1:8337</code> så skal du bruke <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "For å bruke denne funksjonen trenger du en instans av <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kjørende eller et API som håndterer disse forespørslene. <br />Apprise API URL skal være hele URL-en til varslingen, f.eks., hvis din API-instans er på <code>http://192.168.1.1:8337</code> så skal du bruke <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Påse at du bruker ASIN fra den riktige Audible-regionen, ikke Amazon.",
"MessageAuthenticationOIDCChangesRestart": "Etter å ha lagret, start serveren din på nytt for at OIDC-endringene skal tre i kraft.",
"MessageBackupsDescription": "Sikkerhetskopier inkluderer, brukerfremgang, detaljer om bibliotekgjenstander, tjener instillinger og bilder lagret under <code>/metadata/items</code> og <code>/metadata/authors</code>. Sikkerhetskopier <strong>vil ikke</strong> inkludere filer som er lagret i bibliotek mappene.", "MessageBackupsDescription": "Sikkerhetskopier inkluderer, brukerfremgang, detaljer om bibliotekgjenstander, tjener instillinger og bilder lagret under <code>/metadata/items</code> og <code>/metadata/authors</code>. Sikkerhetskopier <strong>vil ikke</strong> inkludere filer som er lagret i bibliotek mappene.",
"MessageBackupsLocationEditNote": "Viktig: Endring av mappen for sikkerhetskopi hverken endrer eller flytter eksisterende sikkerhetskopier!", "MessageBackupsLocationEditNote": "Viktig: Endring av mappen for sikkerhetskopi hverken endrer eller flytter eksisterende sikkerhetskopier!",
"MessageBackupsLocationNoEditNote": "NB: Mappen for sikkerhetskopi settes i en miljøvariabel og kan ikke endres her.", "MessageBackupsLocationNoEditNote": "NB: Mappen for sikkerhetskopi settes i en miljøvariabel og kan ikke endres her.",

View file

@ -177,6 +177,7 @@
"HeaderPlaylist": "Playlista", "HeaderPlaylist": "Playlista",
"HeaderPlaylistItems": "Pozycje listy odtwarzania", "HeaderPlaylistItems": "Pozycje listy odtwarzania",
"HeaderPodcastsToAdd": "Podcasty do dodania", "HeaderPodcastsToAdd": "Podcasty do dodania",
"HeaderPresets": "Ustawienia wstępne",
"HeaderPreviewCover": "Podgląd okładki", "HeaderPreviewCover": "Podgląd okładki",
"HeaderRSSFeedGeneral": "Szczegóły RSS", "HeaderRSSFeedGeneral": "Szczegóły RSS",
"HeaderRSSFeedIsOpen": "Kanał RSS jest otwarty", "HeaderRSSFeedIsOpen": "Kanał RSS jest otwarty",
@ -219,6 +220,7 @@
"LabelAccountTypeAdmin": "Administrator", "LabelAccountTypeAdmin": "Administrator",
"LabelAccountTypeGuest": "Gość", "LabelAccountTypeGuest": "Gość",
"LabelAccountTypeUser": "Użytkownik", "LabelAccountTypeUser": "Użytkownik",
"LabelActivities": "Aktywności",
"LabelActivity": "Aktywność", "LabelActivity": "Aktywność",
"LabelAddToCollection": "Dodaj do kolekcji", "LabelAddToCollection": "Dodaj do kolekcji",
"LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji", "LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji",
@ -228,6 +230,7 @@
"LabelAddedDate": "Dodano {0}", "LabelAddedDate": "Dodano {0}",
"LabelAdminUsersOnly": "Tylko użytkownicy administracyjni", "LabelAdminUsersOnly": "Tylko użytkownicy administracyjni",
"LabelAll": "Wszystkie", "LabelAll": "Wszystkie",
"LabelAllEpisodesDownloaded": "Wszystkie odcinki pobrane",
"LabelAllUsers": "Wszyscy użytkownicy", "LabelAllUsers": "Wszyscy użytkownicy",
"LabelAllUsersExcludingGuests": "Wszyscy użytkownicy z wyłączeniem gości", "LabelAllUsersExcludingGuests": "Wszyscy użytkownicy z wyłączeniem gości",
"LabelAllUsersIncludingGuests": "Wszyscy użytkownicy, łącznie z gośćmi", "LabelAllUsersIncludingGuests": "Wszyscy użytkownicy, łącznie z gośćmi",
@ -245,6 +248,7 @@
"LabelAutoFetchMetadata": "Automatycznie pobierz metadane", "LabelAutoFetchMetadata": "Automatycznie pobierz metadane",
"LabelAutoFetchMetadataHelp": "Pobiera metadane dotyczące tytułu, autora i serii, aby usprawnić przesyłanie. Po przesłaniu może być konieczne dopasowanie dodatkowych metadanych.", "LabelAutoFetchMetadataHelp": "Pobiera metadane dotyczące tytułu, autora i serii, aby usprawnić przesyłanie. Po przesłaniu może być konieczne dopasowanie dodatkowych metadanych.",
"LabelAutoLaunch": "Uruchom automatycznie", "LabelAutoLaunch": "Uruchom automatycznie",
"LabelAutoLaunchDescription": "Automatyczne przekierowanie do dostawcy uwierzytelniania podczas przechodzenia na stronę logowania (ręczna zamiana ścieżki <code>/login?autoLaunch=0</code>)",
"LabelAutoRegister": "Automatyczna rejestracja", "LabelAutoRegister": "Automatyczna rejestracja",
"LabelAutoRegisterDescription": "Automatycznie utwórz nowych użytkowników po zalogowaniu", "LabelAutoRegisterDescription": "Automatycznie utwórz nowych użytkowników po zalogowaniu",
"LabelBackToUser": "Powrót", "LabelBackToUser": "Powrót",
@ -282,6 +286,7 @@
"LabelContinueSeries": "Kontynuuj serię", "LabelContinueSeries": "Kontynuuj serię",
"LabelCover": "Okładka", "LabelCover": "Okładka",
"LabelCoverImageURL": "URL okładki", "LabelCoverImageURL": "URL okładki",
"LabelCoverProvider": "Dostawca okładki",
"LabelCreatedAt": "Utworzone", "LabelCreatedAt": "Utworzone",
"LabelCronExpression": "Wyrażenie CRON", "LabelCronExpression": "Wyrażenie CRON",
"LabelCurrent": "Aktualny", "LabelCurrent": "Aktualny",
@ -324,7 +329,9 @@
"LabelEpisode": "Odcinek", "LabelEpisode": "Odcinek",
"LabelEpisodeTitle": "Tytuł odcinka", "LabelEpisodeTitle": "Tytuł odcinka",
"LabelEpisodeType": "Typ odcinka", "LabelEpisodeType": "Typ odcinka",
"LabelEpisodeUrlFromRssFeed": "Adres URL odcinka z kanału RSS",
"LabelEpisodes": "Epizody", "LabelEpisodes": "Epizody",
"LabelEpisodic": "Epizodyczny",
"LabelExample": "Przykład", "LabelExample": "Przykład",
"LabelExpandSeries": "Rozwiń serie", "LabelExpandSeries": "Rozwiń serie",
"LabelExpandSubSeries": "Rozwiń podserie", "LabelExpandSubSeries": "Rozwiń podserie",
@ -352,6 +359,7 @@
"LabelFontScale": "Rozmiar czcionki", "LabelFontScale": "Rozmiar czcionki",
"LabelFontStrikethrough": "Przekreślony", "LabelFontStrikethrough": "Przekreślony",
"LabelFormat": "Format", "LabelFormat": "Format",
"LabelFull": "Pełny",
"LabelGenre": "Gatunek", "LabelGenre": "Gatunek",
"LabelGenres": "Gatunki", "LabelGenres": "Gatunki",
"LabelHardDeleteFile": "Usuń trwale plik", "LabelHardDeleteFile": "Usuń trwale plik",
@ -376,6 +384,7 @@
"LabelIntervalEvery6Hours": "Co 6 godzin", "LabelIntervalEvery6Hours": "Co 6 godzin",
"LabelIntervalEveryDay": "Każdego dnia", "LabelIntervalEveryDay": "Każdego dnia",
"LabelIntervalEveryHour": "Każdej godziny", "LabelIntervalEveryHour": "Każdej godziny",
"LabelIntervalEveryMinute": "Co minutę",
"LabelInvert": "Inversja", "LabelInvert": "Inversja",
"LabelItem": "Pozycja", "LabelItem": "Pozycja",
"LabelJumpBackwardAmount": "Przeskocz do tyłu o:", "LabelJumpBackwardAmount": "Przeskocz do tyłu o:",
@ -407,6 +416,9 @@
"LabelLowestPriority": "Najniższy priorytet", "LabelLowestPriority": "Najniższy priorytet",
"LabelMatchExistingUsersBy": "Dopasuje istniejących użytkowników poprzez", "LabelMatchExistingUsersBy": "Dopasuje istniejących użytkowników poprzez",
"LabelMatchExistingUsersByDescription": "Służy do łączenia istniejących użytkowników. Po połączeniu użytkownicy zostaną dopasowani za pomocą unikalnego identyfikatora od dostawcy SSO", "LabelMatchExistingUsersByDescription": "Służy do łączenia istniejących użytkowników. Po połączeniu użytkownicy zostaną dopasowani za pomocą unikalnego identyfikatora od dostawcy SSO",
"LabelMaxEpisodesToDownload": "Maksymalna liczba odcinków do pobrania. Użyj 0, aby wyłączyć ograniczenie.",
"LabelMaxEpisodesToKeep": "Maksymalna liczba odcinków do zachowania",
"LabelMaxEpisodesToKeepHelp": "Wartość 0 wyłącza maksymalny limit. Po automatycznym pobraniu nowego odcinka, najstarszy odcinek zostanie usunięty, jeśli masz ich więcej niż X. Spowoduje to usunięcie tylko 1 odcinka na nowe pobieranie.",
"LabelMediaPlayer": "Odtwarzacz", "LabelMediaPlayer": "Odtwarzacz",
"LabelMediaType": "Typ mediów", "LabelMediaType": "Typ mediów",
"LabelMetaTag": "Tag", "LabelMetaTag": "Tag",
@ -419,6 +431,7 @@
"LabelMissingEbook": "Nie posiada ebooka", "LabelMissingEbook": "Nie posiada ebooka",
"LabelMissingSupplementaryEbook": "Nie posiada dodatkowego ebooka", "LabelMissingSupplementaryEbook": "Nie posiada dodatkowego ebooka",
"LabelMobileRedirectURIs": "Dozwolone URI przekierowań mobilnych", "LabelMobileRedirectURIs": "Dozwolone URI przekierowań mobilnych",
"LabelMobileRedirectURIsDescription": "To jest biała lista prawidłowych adresów URI przekierowań dla aplikacji mobilnych. Domyślny adres to <code>audiobookshelf://oauth</code>, który można usunąć lub dodać inne adresy URI w celu integracji z aplikacjami innych firm. Użycie gwiazdki (<code>*</code>) jako jedynego wpisu zezwala na dowolny URI.",
"LabelMore": "Więcej", "LabelMore": "Więcej",
"LabelMoreInfo": "Więcej informacji", "LabelMoreInfo": "Więcej informacji",
"LabelName": "Nazwa", "LabelName": "Nazwa",
@ -448,12 +461,14 @@
"LabelNumberOfEpisodes": "# Odcinków", "LabelNumberOfEpisodes": "# Odcinków",
"LabelOpenRSSFeed": "Otwórz kanał RSS", "LabelOpenRSSFeed": "Otwórz kanał RSS",
"LabelOverwrite": "Nadpisz", "LabelOverwrite": "Nadpisz",
"LabelPaginationPageXOfY": "Strona {0} z {1}",
"LabelPassword": "Hasło", "LabelPassword": "Hasło",
"LabelPath": "Ścieżka", "LabelPath": "Ścieżka",
"LabelPermanent": "Stałe", "LabelPermanent": "Stałe",
"LabelPermissionsAccessAllLibraries": "Ma dostęp do wszystkich bibliotek", "LabelPermissionsAccessAllLibraries": "Ma dostęp do wszystkich bibliotek",
"LabelPermissionsAccessAllTags": "Ma dostęp do wszystkich tagów", "LabelPermissionsAccessAllTags": "Ma dostęp do wszystkich tagów",
"LabelPermissionsAccessExplicitContent": "Ma dostęp do treści oznacznych jako nieprzyzwoite", "LabelPermissionsAccessExplicitContent": "Ma dostęp do treści oznacznych jako nieprzyzwoite",
"LabelPermissionsCreateEreader": "Możliwość stworzenia czytnika e-booków",
"LabelPermissionsDelete": "Ma możliwość usuwania", "LabelPermissionsDelete": "Ma możliwość usuwania",
"LabelPermissionsDownload": "Ma możliwość pobierania", "LabelPermissionsDownload": "Ma możliwość pobierania",
"LabelPermissionsUpdate": "Ma możliwość aktualizowania", "LabelPermissionsUpdate": "Ma możliwość aktualizowania",
@ -461,19 +476,25 @@
"LabelPersonalYearReview": "Podsumowanie twojego roku ({0})", "LabelPersonalYearReview": "Podsumowanie twojego roku ({0})",
"LabelPhotoPathURL": "Scieżka/URL do zdjęcia", "LabelPhotoPathURL": "Scieżka/URL do zdjęcia",
"LabelPlayMethod": "Metoda odtwarzania", "LabelPlayMethod": "Metoda odtwarzania",
"LabelPlayerChapterNumberMarker": "{0} z {1}",
"LabelPlaylists": "Listy odtwarzania", "LabelPlaylists": "Listy odtwarzania",
"LabelPodcast": "Podcast",
"LabelPodcastSearchRegion": "Obszar wyszukiwania podcastów", "LabelPodcastSearchRegion": "Obszar wyszukiwania podcastów",
"LabelPodcastType": "Typ podcastu",
"LabelPodcasts": "Podcasty", "LabelPodcasts": "Podcasty",
"LabelPort": "Port",
"LabelPrefixesToIgnore": "Ignorowane prefiksy (wielkość liter nie ma znaczenia)", "LabelPrefixesToIgnore": "Ignorowane prefiksy (wielkość liter nie ma znaczenia)",
"LabelPreventIndexing": "Zapobiega indeksowaniu przez iTunes i Google", "LabelPreventIndexing": "Zapobiega indeksowaniu przez iTunes i Google",
"LabelPrimaryEbook": "Główny ebook", "LabelPrimaryEbook": "Główny ebook",
"LabelProgress": "Postęp", "LabelProgress": "Postęp",
"LabelProvider": "Dostawca", "LabelProvider": "Dostawca",
"LabelProviderAuthorizationValue": "Wartość nagłówka autoryzacji",
"LabelPubDate": "Data publikacji", "LabelPubDate": "Data publikacji",
"LabelPublishYear": "Rok publikacji", "LabelPublishYear": "Rok publikacji",
"LabelPublishedDate": "Opublikowano {0}",
"LabelPublisher": "Wydawca", "LabelPublisher": "Wydawca",
"LabelPublishers": "Wydawcy", "LabelPublishers": "Wydawcy",
"LabelRSSFeedOpen": "RSS Feed otwarty", "LabelRSSFeedOpen": "Otwarty Kanał RSS",
"LabelRSSFeedPreventIndexing": "Zapobiegaj indeksowaniu", "LabelRSSFeedPreventIndexing": "Zapobiegaj indeksowaniu",
"LabelRSSFeedURL": "URL kanały RSS", "LabelRSSFeedURL": "URL kanały RSS",
"LabelRandomly": "Losowo", "LabelRandomly": "Losowo",
@ -485,15 +506,22 @@
"LabelRecentlyAdded": "Niedawno dodane", "LabelRecentlyAdded": "Niedawno dodane",
"LabelRecommended": "Polecane", "LabelRecommended": "Polecane",
"LabelRedo": "Wycofaj", "LabelRedo": "Wycofaj",
"LabelRegion": "Region",
"LabelReleaseDate": "Data wydania", "LabelReleaseDate": "Data wydania",
"LabelRemoveAllMetadataAbs": "Usuń wszystkie pliki metadata.abs",
"LabelRemoveAllMetadataJson": "Usuń wszystkie pliki metadata.json",
"LabelRemoveCover": "Usuń okładkę", "LabelRemoveCover": "Usuń okładkę",
"LabelRemoveMetadataFile": "Usuń pliki metadanych z folderów biblioteki",
"LabelRemoveMetadataFileHelp": "Usuń wszystkie pliki metadata.json i metadata.abs z {0} folderów.",
"LabelRowsPerPage": "Wierszy na stronę", "LabelRowsPerPage": "Wierszy na stronę",
"LabelSearchTerm": "Wyszukiwanie frazy", "LabelSearchTerm": "Wyszukiwanie frazy",
"LabelSearchTitle": "Wyszukaj tytuł", "LabelSearchTitle": "Wyszukaj tytuł",
"LabelSearchTitleOrASIN": "Szukaj tytuł lub ASIN", "LabelSearchTitleOrASIN": "Szukaj tytuł lub ASIN",
"LabelSeason": "Sezon", "LabelSeason": "Sezon",
"LabelSeasonNumber": "Sezon #{0}",
"LabelSelectAll": "Wybierz wszystko", "LabelSelectAll": "Wybierz wszystko",
"LabelSelectAllEpisodes": "Wybierz wszystkie odcinki", "LabelSelectAllEpisodes": "Wybierz wszystkie odcinki",
"LabelSelectEpisodesShowing": "Wybierz {0} wyświetlanych odcinków",
"LabelSelectUsers": "Wybór użytkowników", "LabelSelectUsers": "Wybór użytkowników",
"LabelSendEbookToDevice": "Wyślij ebook do...", "LabelSendEbookToDevice": "Wyślij ebook do...",
"LabelSequence": "Kolejność", "LabelSequence": "Kolejność",
@ -508,6 +536,8 @@
"LabelSettingsBookshelfViewHelp": "Widok półki z książkami", "LabelSettingsBookshelfViewHelp": "Widok półki z książkami",
"LabelSettingsChromecastSupport": "Wsparcie Chromecast", "LabelSettingsChromecastSupport": "Wsparcie Chromecast",
"LabelSettingsDateFormat": "Format daty", "LabelSettingsDateFormat": "Format daty",
"LabelSettingsEnableWatcher": "Automatyczne skanowanie bibliotek w poszukiwaniu zmian",
"LabelSettingsEnableWatcherForLibrary": "Automatyczne skanowanie biblioteki w poszukiwaniu zmian",
"LabelSettingsEnableWatcherHelp": "Włącza automatyczne dodawanie/aktualizację pozycji gdy wykryte zostaną zmiany w plikach. Wymaga restartu serwera", "LabelSettingsEnableWatcherHelp": "Włącza automatyczne dodawanie/aktualizację pozycji gdy wykryte zostaną zmiany w plikach. Wymaga restartu serwera",
"LabelSettingsEpubsAllowScriptedContent": "Zezwalanie na skrypty w plikach epub", "LabelSettingsEpubsAllowScriptedContent": "Zezwalanie na skrypty w plikach epub",
"LabelSettingsEpubsAllowScriptedContentHelp": "Zezwala plikom epub na wykonywanie skryptów. Zaleca się mieć to ustawienie wyłączone, chyba że ma się zaufanie do źródła plików epub.", "LabelSettingsEpubsAllowScriptedContentHelp": "Zezwala plikom epub na wykonywanie skryptów. Zaleca się mieć to ustawienie wyłączone, chyba że ma się zaufanie do źródła plików epub.",
@ -519,6 +549,8 @@
"LabelSettingsHideSingleBookSeriesHelp": "Serie, które posiadają tylko jedną książkę, nie będą pokazywane na stronie z seriami i na stronie domowej z półkami.", "LabelSettingsHideSingleBookSeriesHelp": "Serie, które posiadają tylko jedną książkę, nie będą pokazywane na stronie z seriami i na stronie domowej z półkami.",
"LabelSettingsHomePageBookshelfView": "Widok półki z książkami na stronie głównej", "LabelSettingsHomePageBookshelfView": "Widok półki z książkami na stronie głównej",
"LabelSettingsLibraryBookshelfView": "Widok półki z książkami na stronie biblioteki", "LabelSettingsLibraryBookshelfView": "Widok półki z książkami na stronie biblioteki",
"LabelSettingsLibraryMarkAsFinishedWhen": "Oznacz element multimedialny jako ukończony, gdy",
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Pomiń poprzednie książki przy kontynuacji serii",
"LabelSettingsParseSubtitles": "Przetwarzaj podtytuły", "LabelSettingsParseSubtitles": "Przetwarzaj podtytuły",
"LabelSettingsParseSubtitlesHelp": "Opcja pozwala na pobranie podtytułu z nazwy folderu z audiobookiem. <br>Podtytuł musi być rozdzielony za pomocą separatora \" - \"<br>Przykład: \"Book Title - A Subtitle Here\" podtytuł \"A Subtitle Here\"", "LabelSettingsParseSubtitlesHelp": "Opcja pozwala na pobranie podtytułu z nazwy folderu z audiobookiem. <br>Podtytuł musi być rozdzielony za pomocą separatora \" - \"<br>Przykład: \"Book Title - A Subtitle Here\" podtytuł \"A Subtitle Here\"",
"LabelSettingsPreferMatchedMetadata": "Preferowanie dopasowanych metadanych", "LabelSettingsPreferMatchedMetadata": "Preferowanie dopasowanych metadanych",
@ -542,6 +574,9 @@
"LabelShowSubtitles": "Pokaż Napisy", "LabelShowSubtitles": "Pokaż Napisy",
"LabelSize": "Rozmiar", "LabelSize": "Rozmiar",
"LabelSleepTimer": "Wyłącznik czasowy", "LabelSleepTimer": "Wyłącznik czasowy",
"LabelSortAscending": "Rosnąco",
"LabelSortDescending": "Malejąco",
"LabelSortPubDate": "Sortuj według daty publikacji",
"LabelStart": "Rozpocznij", "LabelStart": "Rozpocznij",
"LabelStartTime": "Czas rozpoczęcia", "LabelStartTime": "Czas rozpoczęcia",
"LabelStarted": "Rozpoczęty", "LabelStarted": "Rozpoczęty",
@ -563,14 +598,21 @@
"LabelStatsWeekListening": "Tydzień słuchania", "LabelStatsWeekListening": "Tydzień słuchania",
"LabelSubtitle": "Podtytuł", "LabelSubtitle": "Podtytuł",
"LabelSupportedFileTypes": "Obsługiwane typy plików", "LabelSupportedFileTypes": "Obsługiwane typy plików",
"LabelTag": "Znacznik",
"LabelTags": "Tagi", "LabelTags": "Tagi",
"LabelTagsAccessibleToUser": "Tagi dostępne dla użytkownika", "LabelTagsAccessibleToUser": "Tagi dostępne dla użytkownika",
"LabelTagsNotAccessibleToUser": "Znaczniki niedostępne dla użytkownika",
"LabelTasks": "Uruchomione zadania",
"LabelTextEditorLink": "Link",
"LabelTextEditorNumberedList": "Lista numerowana",
"LabelTextEditorUnlink": "Usuń link",
"LabelThemeDark": "Ciemny", "LabelThemeDark": "Ciemny",
"LabelThemeLight": "Jasny", "LabelThemeLight": "Jasny",
"LabelTimeDurationXHours": "{0} godzin", "LabelTimeDurationXHours": "{0} godzin",
"LabelTimeDurationXMinutes": "{0} minuty", "LabelTimeDurationXMinutes": "{0} minuty",
"LabelTimeDurationXSeconds": "{0} sekundy", "LabelTimeDurationXSeconds": "{0} sekundy",
"LabelTimeInMinutes": "Czas w minutach", "LabelTimeInMinutes": "Czas w minutach",
"LabelTimeLeft": "pozostało {0}",
"LabelTimeListened": "Czas odtwarzania", "LabelTimeListened": "Czas odtwarzania",
"LabelTimeListenedToday": "Czas odtwarzania dzisiaj", "LabelTimeListenedToday": "Czas odtwarzania dzisiaj",
"LabelTimeRemaining": "Pozostało {0}", "LabelTimeRemaining": "Pozostało {0}",
@ -578,6 +620,7 @@
"LabelTitle": "Tytuł", "LabelTitle": "Tytuł",
"LabelToolsEmbedMetadata": "Załącz metadane", "LabelToolsEmbedMetadata": "Załącz metadane",
"LabelToolsEmbedMetadataDescription": "Załącz metadane do plików audio (okładkę oraz znaczniki rozdziałów).", "LabelToolsEmbedMetadataDescription": "Załącz metadane do plików audio (okładkę oraz znaczniki rozdziałów).",
"LabelToolsM4bEncoder": "Enkoder M4B",
"LabelToolsMakeM4b": "Generuj plik M4B", "LabelToolsMakeM4b": "Generuj plik M4B",
"LabelToolsMakeM4bDescription": "Tworzy plik w formacie .M4B, który zawiera metadane, okładkę oraz rozdziały.", "LabelToolsMakeM4bDescription": "Tworzy plik w formacie .M4B, który zawiera metadane, okładkę oraz rozdziały.",
"LabelToolsSplitM4b": "Podziel plik .M4B na pliki .MP3", "LabelToolsSplitM4b": "Podziel plik .M4B na pliki .MP3",
@ -590,12 +633,14 @@
"LabelType": "Typ", "LabelType": "Typ",
"LabelUndo": "Wycofaj", "LabelUndo": "Wycofaj",
"LabelUnknown": "Nieznany", "LabelUnknown": "Nieznany",
"LabelUnknownPublishDate": "Nieznana data publikacji",
"LabelUpdateCover": "Zaktalizuj odkładkę", "LabelUpdateCover": "Zaktalizuj odkładkę",
"LabelUpdateCoverHelp": "Umożliwienie nadpisania istniejących okładek dla wybranych książek w przypadku znalezienia dopasowania", "LabelUpdateCoverHelp": "Umożliwienie nadpisania istniejących okładek dla wybranych książek w przypadku znalezienia dopasowania",
"LabelUpdateDetails": "Zaktualizuj szczegóły", "LabelUpdateDetails": "Zaktualizuj szczegóły",
"LabelUpdateDetailsHelp": "Umożliwienie nadpisania istniejących szczegółów dla wybranych książek w przypadku znalezienia dopasowania", "LabelUpdateDetailsHelp": "Umożliwienie nadpisania istniejących szczegółów dla wybranych książek w przypadku znalezienia dopasowania",
"LabelUpdatedAt": "Zaktualizowano", "LabelUpdatedAt": "Zaktualizowano",
"LabelUploaderDragAndDrop": "Przeciągnij i puść foldery lub pliki", "LabelUploaderDragAndDrop": "Przeciągnij i puść foldery lub pliki",
"LabelUploaderDragAndDropFilesOnly": "Przeciągnij i upuść pliki",
"LabelUploaderDropFiles": "Puść pliki", "LabelUploaderDropFiles": "Puść pliki",
"LabelUploaderItemFetchMetadataHelp": "Automatycznie pobierz tytuł, autora i serie", "LabelUploaderItemFetchMetadataHelp": "Automatycznie pobierz tytuł, autora i serie",
"LabelUseChapterTrack": "Użyj ścieżki rozdziału", "LabelUseChapterTrack": "Użyj ścieżki rozdziału",

View file

@ -212,9 +212,9 @@
"HeaderUsers": "Пользователи", "HeaderUsers": "Пользователи",
"HeaderYearReview": "Итоги {0} года", "HeaderYearReview": "Итоги {0} года",
"HeaderYourStats": "Ваша статистика", "HeaderYourStats": "Ваша статистика",
"LabelAbridged": "Сокращенное издание", "LabelAbridged": "Сокращенная форма",
"LabelAbridgedChecked": "Сокращено (отмечено)", "LabelAbridgedChecked": "Сокращено (отмечено)",
"LabelAbridgedUnchecked": "Без сокращений (не отмечено)", "LabelAbridgedUnchecked": "Полное издание (не отмечено)",
"LabelAccessibleBy": "Доступ", "LabelAccessibleBy": "Доступ",
"LabelAccountType": "Тип учетной записи", "LabelAccountType": "Тип учетной записи",
"LabelAccountTypeAdmin": "Администратор", "LabelAccountTypeAdmin": "Администратор",
@ -346,9 +346,9 @@
"LabelExample": "Пример", "LabelExample": "Пример",
"LabelExpandSeries": "Развернуть серию", "LabelExpandSeries": "Развернуть серию",
"LabelExpandSubSeries": "Развернуть подсерию", "LabelExpandSubSeries": "Развернуть подсерию",
"LabelExplicit": "Явный", "LabelExplicit": "18+",
"LabelExplicitChecked": "Явный (отмечено)", "LabelExplicitChecked": "18+ (отмечено)",
"LabelExplicitUnchecked": "Не явно (не отмечено)", "LabelExplicitUnchecked": "+18 (не отмечено)",
"LabelExportOPML": "Экспорт OPML", "LabelExportOPML": "Экспорт OPML",
"LabelFeedURL": "URL канала", "LabelFeedURL": "URL канала",
"LabelFetchingMetadata": "Извлечение метаданных", "LabelFetchingMetadata": "Извлечение метаданных",
@ -514,7 +514,7 @@
"LabelPublishers": "Издатели", "LabelPublishers": "Издатели",
"LabelRSSFeedCustomOwnerEmail": "Пользовательский Email владельца", "LabelRSSFeedCustomOwnerEmail": "Пользовательский Email владельца",
"LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца", "LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца",
"LabelRSSFeedOpen": "Открыть RSS-канал", "LabelRSSFeedOpen": "Открыть RSS-ленту",
"LabelRSSFeedPreventIndexing": "Запретить индексирование", "LabelRSSFeedPreventIndexing": "Запретить индексирование",
"LabelRSSFeedSlug": "Встроить RSS-канал", "LabelRSSFeedSlug": "Встроить RSS-канал",
"LabelRSSFeedURL": "URL RSS-канала", "LabelRSSFeedURL": "URL RSS-канала",
@ -856,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Запуск каждые {0} по {1}", "MessageScheduleRunEveryWeekdayAtTime": "Запуск каждые {0} по {1}",
"MessageSearchResultsFor": "Результаты поиска для", "MessageSearchResultsFor": "Результаты поиска для",
"MessageSelected": "{0} выбрано", "MessageSelected": "{0} выбрано",
"MessageSeriesSequenceCannotContainSpaces": "Последовательность серии должна быть без пропусков",
"MessageServerCouldNotBeReached": "Не удалось связаться с сервером", "MessageServerCouldNotBeReached": "Не удалось связаться с сервером",
"MessageSetChaptersFromTracksDescription": "Установка глав с использованием каждого аудиофайла в качестве главы и заголовка главы в качестве имени аудиофайла", "MessageSetChaptersFromTracksDescription": "Установка глав с использованием каждого аудиофайла в качестве главы и заголовка главы в качестве имени аудиофайла",
"MessageShareExpirationWillBe": "Срок действия истекает <strong>{0}</strong>", "MessageShareExpirationWillBe": "Срок действия истекает <strong>{0}</strong>",
@ -917,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Запускается при завершении резервного копирования", "NotificationOnBackupCompletedDescription": "Запускается при завершении резервного копирования",
"NotificationOnBackupFailedDescription": "Срабатывает при сбое резервного копирования", "NotificationOnBackupFailedDescription": "Срабатывает при сбое резервного копирования",
"NotificationOnEpisodeDownloadedDescription": "Запускается при автоматической загрузке эпизода подкаста", "NotificationOnEpisodeDownloadedDescription": "Запускается при автоматической загрузке эпизода подкаста",
"NotificationOnRSSFeedDisabledDescription": "Срабатывает, когда автоматическая загрузка эпизодов отключена из-за слишком большого количества неудачных попыток",
"NotificationOnRSSFeedFailedDescription": "Срабатывает при сбое запроса RSS-канала на автоматическую загрузку эпизода",
"NotificationOnTestDescription": "Событие для тестирования системы оповещения", "NotificationOnTestDescription": "Событие для тестирования системы оповещения",
"PlaceholderNewCollection": "Новое имя коллекции", "PlaceholderNewCollection": "Новое имя коллекции",
"PlaceholderNewFolderPath": "Путь к новой папке", "PlaceholderNewFolderPath": "Путь к новой папке",

View file

@ -531,6 +531,7 @@
"LabelReleaseDate": "Dátum vydania", "LabelReleaseDate": "Dátum vydania",
"LabelRemoveAllMetadataAbs": "Odstrániť všetky súbory metadata.abs", "LabelRemoveAllMetadataAbs": "Odstrániť všetky súbory metadata.abs",
"LabelRemoveAllMetadataJson": "Odstrániť všetky súbory metadata.json", "LabelRemoveAllMetadataJson": "Odstrániť všetky súbory metadata.json",
"LabelRemoveAudibleBranding": "Odstrániť z kapitol Audible intro a outro",
"LabelRemoveCover": "Odstrániť prebal", "LabelRemoveCover": "Odstrániť prebal",
"LabelRemoveMetadataFile": "Odstrániť súbory metadát z priečinkov položiek v knižnici", "LabelRemoveMetadataFile": "Odstrániť súbory metadát z priečinkov položiek v knižnici",
"LabelRemoveMetadataFileHelp": "Odstrániť všetky súbory metadata.json a metadata.abs vo Vašich {0} priečinkoch.", "LabelRemoveMetadataFileHelp": "Odstrániť všetky súbory metadata.json a metadata.abs vo Vašich {0} priečinkoch.",
@ -707,6 +708,7 @@
"MessageAddToPlayerQueue": "Pridať do zoznamu prehrávania", "MessageAddToPlayerQueue": "Pridať do zoznamu prehrávania",
"MessageAppriseDescription": "Aby ste mohli používať túto funkciumusíte mať k dispozícii inštanciu <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> alebo inú, ktorá dokáže spracovávať rovnaké požiadavky/requesty.<br/>Apprise URL musí byť úplná URL určená na zasielanie notifikácií, tj. ak napr. vaša APi beží na <code>http://192.168.1.1:8337</code>, vložte do daného poľa <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "Aby ste mohli používať túto funkciumusíte mať k dispozícii inštanciu <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> alebo inú, ktorá dokáže spracovávať rovnaké požiadavky/requesty.<br/>Apprise URL musí byť úplná URL určená na zasielanie notifikácií, tj. ak napr. vaša APi beží na <code>http://192.168.1.1:8337</code>, vložte do daného poľa <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Uistite sa, že používate ASIN zo správneho regiónu Audible, nie Amazonu.", "MessageAsinCheck": "Uistite sa, že používate ASIN zo správneho regiónu Audible, nie Amazonu.",
"MessageAuthenticationOIDCChangesRestart": "Reštartujte svoj server po uložení, aby mohli byť použité zmeny OIDC.",
"MessageBackupsDescription": "Zálohy pokrývajú používateľov, ich aktuálne stavy počúvania, detaily položiek knižnice, nastavenia servera a obrázky uložené v <code>/metadata/items</code> a <code>/metadata/authors</code>. Zálohy <strong>neobsahujú</strong> súbory v priečinkoch vašich knižníc.", "MessageBackupsDescription": "Zálohy pokrývajú používateľov, ich aktuálne stavy počúvania, detaily položiek knižnice, nastavenia servera a obrázky uložené v <code>/metadata/items</code> a <code>/metadata/authors</code>. Zálohy <strong>neobsahujú</strong> súbory v priečinkoch vašich knižníc.",
"MessageBackupsLocationEditNote": "Poznámka: Zmena umiestnenia záloh nepresunie ani nezmení existujúce zálohy", "MessageBackupsLocationEditNote": "Poznámka: Zmena umiestnenia záloh nepresunie ani nezmení existujúce zálohy",
"MessageBackupsLocationNoEditNote": "Poznámka: Umietnenie záloh je nastavené prostredníctvom premennej prostredia a nie je ho možné zmeniť z tohto miesta.", "MessageBackupsLocationNoEditNote": "Poznámka: Umietnenie záloh je nastavené prostredníctvom premennej prostredia a nie je ho možné zmeniť z tohto miesta.",
@ -786,7 +788,7 @@
"MessageItemsSelected": "{0} vybraných položiek", "MessageItemsSelected": "{0} vybraných položiek",
"MessageItemsUpdated": "{0} aktualizovaných položiek", "MessageItemsUpdated": "{0} aktualizovaných položiek",
"MessageJoinUsOn": "Pridajte sa k nám", "MessageJoinUsOn": "Pridajte sa k nám",
"MessageLoading": "Načítanie...", "MessageLoading": "Načítavam...",
"MessageLoadingFolders": "Načítanie priečinkov...", "MessageLoadingFolders": "Načítanie priečinkov...",
"MessageLogsDescription": "Záznamy logovania sú uložené v <code>/metadata/logs</code> vo forme JSON súborov. Záznamy kritických chýb sú uložené v <code>/metadata/logs/crash_logs.txt</code>.", "MessageLogsDescription": "Záznamy logovania sú uložené v <code>/metadata/logs</code> vo forme JSON súborov. Záznamy kritických chýb sú uložené v <code>/metadata/logs/crash_logs.txt</code>.",
"MessageM4BFailed": "M4B zlyhalo!", "MessageM4BFailed": "M4B zlyhalo!",
@ -826,7 +828,7 @@
"MessageNoSeries": "Žiadne série", "MessageNoSeries": "Žiadne série",
"MessageNoTags": "Žiadne štítky", "MessageNoTags": "Žiadne štítky",
"MessageNoTasksRunning": "Žiadne prebiehajúce úlohy", "MessageNoTasksRunning": "Žiadne prebiehajúce úlohy",
"MessageNoUpdatesWereNecessary": "Žiadne nutné aktualizácie", "MessageNoUpdatesWereNecessary": "Neboli potrebné žiadne aktualizácie",
"MessageNoUserPlaylists": "Nemáte žiadny playlist", "MessageNoUserPlaylists": "Nemáte žiadny playlist",
"MessageNoUserPlaylistsHelp": "Playlisty sú súkromné. Každý playlist môže vidieť iba používateľ, ktorý ho vytvoril.", "MessageNoUserPlaylistsHelp": "Playlisty sú súkromné. Každý playlist môže vidieť iba používateľ, ktorý ho vytvoril.",
"MessageNotYetImplemented": "Ešte neimplementované", "MessageNotYetImplemented": "Ešte neimplementované",
@ -854,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Spustiť každú {0} o {1}", "MessageScheduleRunEveryWeekdayAtTime": "Spustiť každú {0} o {1}",
"MessageSearchResultsFor": "Výsledky vyhľadávania pre", "MessageSearchResultsFor": "Výsledky vyhľadávania pre",
"MessageSelected": "{0} vybrané", "MessageSelected": "{0} vybrané",
"MessageSeriesSequenceCannotContainSpaces": "Poradie série nemôže obsahovať medzery",
"MessageServerCouldNotBeReached": "Nepodarilo sa pripojiť na server", "MessageServerCouldNotBeReached": "Nepodarilo sa pripojiť na server",
"MessageSetChaptersFromTracksDescription": "Nastaviť jednotlivé zvukové súbory ako kapitoly a názvy zvukových súborov ako názvy týchto kapitol", "MessageSetChaptersFromTracksDescription": "Nastaviť jednotlivé zvukové súbory ako kapitoly a názvy zvukových súborov ako názvy týchto kapitol",
"MessageShareExpirationWillBe": "Expiruje <strong>{0}</strong>", "MessageShareExpirationWillBe": "Expiruje <strong>{0}</strong>",
@ -907,8 +910,8 @@
"NoteChangeRootPassword": "Root používateľ je jediný používateľ, ktorý môže mať prázdne heslo", "NoteChangeRootPassword": "Root používateľ je jediný používateľ, ktorý môže mať prázdne heslo",
"NoteChapterEditorTimes": "Poznámka: Prvá kapitola musí vždy začínať v 0:00 a začiatok poslednej kapitoly nemôže prekročiť trvanie tejto audioknihy.", "NoteChapterEditorTimes": "Poznámka: Prvá kapitola musí vždy začínať v 0:00 a začiatok poslednej kapitoly nemôže prekročiť trvanie tejto audioknihy.",
"NoteFolderPicker": "Poznámka: Priečinky, ktoré už boli priradené, sa ďalej nezobrazujú", "NoteFolderPicker": "Poznámka: Priečinky, ktoré už boli priradené, sa ďalej nezobrazujú",
"NoteRSSFeedPodcastAppsHttps": "Varovanie: Väčšina podcastových aplikácií vyžaduje, aby URL RSS zdroja vyžívala HTTPS", "NoteRSSFeedPodcastAppsHttps": "Varovanie: Väčšina podcastových aplikácií požaduje URL RSS zdroja s HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Varovanie: 1 alebo viacero vašich epizód neobsahuje infomáciu o dátume vydania. Niektoré podcastové aplikácie ju vyžadujú.", "NoteRSSFeedPodcastAppsPubDate": "Varovanie: 1 alebo viac vašich epizód neobsahuje infomáciu o dátum vydania. Niektoré podcastové ju vyžadujú.",
"NoteUploaderFoldersWithMediaFiles": "Priečinky obsahujúce súbory médií budú považované za samostatné položky knižnice.", "NoteUploaderFoldersWithMediaFiles": "Priečinky obsahujúce súbory médií budú považované za samostatné položky knižnice.",
"NoteUploaderOnlyAudioFiles": "Ak budú nahraté iba zvukové súbory, každý zvukový súbor bude považovaný za samostatnú audioknihu.", "NoteUploaderOnlyAudioFiles": "Ak budú nahraté iba zvukové súbory, každý zvukový súbor bude považovaný za samostatnú audioknihu.",
"NoteUploaderUnsupportedFiles": "Nepodporované súbory budú ignorované. Pri výbere alebo prenesení priečinka, budú všetky súbory, ktoré nie sú v priečinku niektorej z položiek, ignorované.", "NoteUploaderUnsupportedFiles": "Nepodporované súbory budú ignorované. Pri výbere alebo prenesení priečinka, budú všetky súbory, ktoré nie sú v priečinku niektorej z položiek, ignorované.",
@ -972,6 +975,8 @@
"ToastCachePurgeFailed": "Vyčistenie vyrovnávacej pamäte zlyhalo", "ToastCachePurgeFailed": "Vyčistenie vyrovnávacej pamäte zlyhalo",
"ToastCachePurgeSuccess": "Vyrovnávacia pamäť vyčistená", "ToastCachePurgeSuccess": "Vyrovnávacia pamäť vyčistená",
"ToastChaptersHaveErrors": "Kapitoly obsahujú chyby", "ToastChaptersHaveErrors": "Kapitoly obsahujú chyby",
"ToastChaptersInvalidShiftAmountLast": "Neplatná hodnota veľkosti posunutia. Začiatok poslednej kapitoly by ležal za koncom audioknihy.",
"ToastChaptersInvalidShiftAmountStart": "Nesprávna hodnota posunutia. Prvá kapitola by mala nulovú alebo zápornú dĺžku a bola by nahradená nasledujúcou kapitolou. Navýšte čas začiatku druhej kapitoly.",
"ToastChaptersMustHaveTitles": "Kapitoly musia mať názvy", "ToastChaptersMustHaveTitles": "Kapitoly musia mať názvy",
"ToastChaptersRemoved": "Kapitoly boli odstránené", "ToastChaptersRemoved": "Kapitoly boli odstránené",
"ToastChaptersUpdated": "Kapitoly boli aktualizované", "ToastChaptersUpdated": "Kapitoly boli aktualizované",

View file

@ -514,7 +514,7 @@
"LabelPublishers": "Izdajatelji", "LabelPublishers": "Izdajatelji",
"LabelRSSFeedCustomOwnerEmail": "E-pošta lastnika po meri", "LabelRSSFeedCustomOwnerEmail": "E-pošta lastnika po meri",
"LabelRSSFeedCustomOwnerName": "Ime lastnika po meri", "LabelRSSFeedCustomOwnerName": "Ime lastnika po meri",
"LabelRSSFeedOpen": "Odprt vir RSS", "LabelRSSFeedOpen": "RSS vir je odprt",
"LabelRSSFeedPreventIndexing": "Prepreči indeksiranje", "LabelRSSFeedPreventIndexing": "Prepreči indeksiranje",
"LabelRSSFeedSlug": "Slug RSS vira", "LabelRSSFeedSlug": "Slug RSS vira",
"LabelRSSFeedURL": "URL vira RSS", "LabelRSSFeedURL": "URL vira RSS",
@ -856,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "Zaženi vsakih {0} ob {1}", "MessageScheduleRunEveryWeekdayAtTime": "Zaženi vsakih {0} ob {1}",
"MessageSearchResultsFor": "Rezultati iskanja za", "MessageSearchResultsFor": "Rezultati iskanja za",
"MessageSelected": "{0} izbrano", "MessageSelected": "{0} izbrano",
"MessageSeriesSequenceCannotContainSpaces": "Zaporedje serij ne sme vsebovati presledkov",
"MessageServerCouldNotBeReached": "Strežnika ni bilo mogoče doseči", "MessageServerCouldNotBeReached": "Strežnika ni bilo mogoče doseči",
"MessageSetChaptersFromTracksDescription": "Nastavi poglavja z uporabo vsake zvočne datoteke kot poglavja in naslova poglavja kot imena zvočne datoteke", "MessageSetChaptersFromTracksDescription": "Nastavi poglavja z uporabo vsake zvočne datoteke kot poglavja in naslova poglavja kot imena zvočne datoteke",
"MessageShareExpirationWillBe": "Potečeno bo <strong>{0}</strong>", "MessageShareExpirationWillBe": "Potečeno bo <strong>{0}</strong>",
@ -917,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "Sproži se, ko je varnostno kopiranje končano", "NotificationOnBackupCompletedDescription": "Sproži se, ko je varnostno kopiranje končano",
"NotificationOnBackupFailedDescription": "Sproži se, ko varnostno kopiranje ne uspe", "NotificationOnBackupFailedDescription": "Sproži se, ko varnostno kopiranje ne uspe",
"NotificationOnEpisodeDownloadedDescription": "Sproži se, ko se epizoda podcasta samodejno prenese", "NotificationOnEpisodeDownloadedDescription": "Sproži se, ko se epizoda podcasta samodejno prenese",
"NotificationOnRSSFeedDisabledDescription": "Sproži se, ko so samodejni prenosi epizod onemogočeni zaradi preveč neuspelih poskusov",
"NotificationOnRSSFeedFailedDescription": "Sproži se, ko zahteva za vir RSS za samodejni prenos epizode ne uspe",
"NotificationOnTestDescription": "Dogodek za testiranje sistema obveščanja", "NotificationOnTestDescription": "Dogodek za testiranje sistema obveščanja",
"PlaceholderNewCollection": "Novo ime zbirke", "PlaceholderNewCollection": "Novo ime zbirke",
"PlaceholderNewFolderPath": "Pot nove mape", "PlaceholderNewFolderPath": "Pot nove mape",

View file

@ -3,7 +3,7 @@
"ButtonAddChapters": "Додати глави", "ButtonAddChapters": "Додати глави",
"ButtonAddDevice": "Додати пристрій", "ButtonAddDevice": "Додати пристрій",
"ButtonAddLibrary": "Додати бібліотеку", "ButtonAddLibrary": "Додати бібліотеку",
"ButtonAddPodcasts": "Додати подкаст", "ButtonAddPodcasts": "Додати подкасти",
"ButtonAddUser": "Додати користувача", "ButtonAddUser": "Додати користувача",
"ButtonAddYourFirstLibrary": "Додайте вашу першу бібліотеку", "ButtonAddYourFirstLibrary": "Додайте вашу першу бібліотеку",
"ButtonApply": "Застосувати", "ButtonApply": "Застосувати",
@ -16,7 +16,7 @@
"ButtonCancel": "Скасувати", "ButtonCancel": "Скасувати",
"ButtonCancelEncode": "Скасувати кодування", "ButtonCancelEncode": "Скасувати кодування",
"ButtonChangeRootPassword": "Змінити кореневий пароль", "ButtonChangeRootPassword": "Змінити кореневий пароль",
"ButtonCheckAndDownloadNewEpisodes": "Перевірити та завантажити нові епізоди", "ButtonCheckAndDownloadNewEpisodes": "Перевірити та скачати нові епізоди",
"ButtonChooseAFolder": "Обрати теку", "ButtonChooseAFolder": "Обрати теку",
"ButtonChooseFiles": "Обрати файли", "ButtonChooseFiles": "Обрати файли",
"ButtonClearFilter": "Очистити фільтр", "ButtonClearFilter": "Очистити фільтр",
@ -32,8 +32,8 @@
"ButtonEditChapters": "Редагувати глави", "ButtonEditChapters": "Редагувати глави",
"ButtonEditPodcast": "Редагувати подкаст", "ButtonEditPodcast": "Редагувати подкаст",
"ButtonEnable": "Увімкнути", "ButtonEnable": "Увімкнути",
"ButtonFireAndFail": "Вогонь і невдача", "ButtonFireAndFail": "Виконати і завершити з помилкою",
"ButtonFireOnTest": "Випробування на вогнестійкість", "ButtonFireOnTest": "Виконати подію onTest",
"ButtonForceReScan": "Примусово сканувати", "ButtonForceReScan": "Примусово сканувати",
"ButtonFullPath": "Повний шлях", "ButtonFullPath": "Повний шлях",
"ButtonHide": "Приховати", "ButtonHide": "Приховати",
@ -57,7 +57,7 @@
"ButtonOpenFeed": "Відкрити стрічку", "ButtonOpenFeed": "Відкрити стрічку",
"ButtonOpenManager": "Відкрити менеджер", "ButtonOpenManager": "Відкрити менеджер",
"ButtonPause": "Пауза", "ButtonPause": "Пауза",
"ButtonPlay": "Слухати", "ButtonPlay": "Відтворити",
"ButtonPlayAll": "Відтворити все", "ButtonPlayAll": "Відтворити все",
"ButtonPlaying": "Відтворюється", "ButtonPlaying": "Відтворюється",
"ButtonPlaylists": "Списки відтворення", "ButtonPlaylists": "Списки відтворення",
@ -86,7 +86,7 @@
"ButtonResetToDefault": "Скинути до стандартних", "ButtonResetToDefault": "Скинути до стандартних",
"ButtonRestore": "Відновити", "ButtonRestore": "Відновити",
"ButtonSave": "Зберегти", "ButtonSave": "Зберегти",
"ButtonSaveAndClose": "Зберегти та закрити", "ButtonSaveAndClose": "Зберегти і закрити",
"ButtonSaveTracklist": "Зберегти порядок", "ButtonSaveTracklist": "Зберегти порядок",
"ButtonScan": "Сканувати", "ButtonScan": "Сканувати",
"ButtonScanLibrary": "Сканувати бібліотеку", "ButtonScanLibrary": "Сканувати бібліотеку",
@ -103,7 +103,7 @@
"ButtonStartMetadataEmbed": "Почати вбудування метаданих", "ButtonStartMetadataEmbed": "Почати вбудування метаданих",
"ButtonStats": "Статистика", "ButtonStats": "Статистика",
"ButtonSubmit": "Надіслати", "ButtonSubmit": "Надіслати",
"ButtonTest": "Перевірити", "ButtonTest": "Тест",
"ButtonUnlinkOpenId": "Вимкнути OpenID", "ButtonUnlinkOpenId": "Вимкнути OpenID",
"ButtonUpload": "Завантажити", "ButtonUpload": "Завантажити",
"ButtonUploadBackup": "Завантажити резервну копію", "ButtonUploadBackup": "Завантажити резервну копію",
@ -115,7 +115,7 @@
"ButtonYes": "Так", "ButtonYes": "Так",
"ErrorUploadFetchMetadataAPI": "Помилка при отриманні метаданих", "ErrorUploadFetchMetadataAPI": "Помилка при отриманні метаданих",
"ErrorUploadFetchMetadataNoResults": "Не вдалося отримати метадані — спробуйте оновити заголовок та/або автора", "ErrorUploadFetchMetadataNoResults": "Не вдалося отримати метадані — спробуйте оновити заголовок та/або автора",
"ErrorUploadLacksTitle": "Назва обов'язкова", "ErrorUploadLacksTitle": "Потрібна назва",
"HeaderAccount": "Профіль", "HeaderAccount": "Профіль",
"HeaderAddCustomMetadataProvider": "Додати користувацький постачальник метаданих", "HeaderAddCustomMetadataProvider": "Додати користувацький постачальник метаданих",
"HeaderAdvanced": "Розширені", "HeaderAdvanced": "Розширені",
@ -130,11 +130,11 @@
"HeaderCollection": "Добірка", "HeaderCollection": "Добірка",
"HeaderCollectionItems": "Елементи добірки", "HeaderCollectionItems": "Елементи добірки",
"HeaderCover": "Обкладинка", "HeaderCover": "Обкладинка",
"HeaderCurrentDownloads": "Поточні завантаження", "HeaderCurrentDownloads": "Поточні скачування",
"HeaderCustomMessageOnLogin": "Повідомлення при вході", "HeaderCustomMessageOnLogin": "Повідомлення при вході",
"HeaderCustomMetadataProviders": "Постачальники метаданих", "HeaderCustomMetadataProviders": "Постачальники метаданих",
"HeaderDetails": "Подробиці", "HeaderDetails": "Подробиці",
"HeaderDownloadQueue": "Черга завантажень", "HeaderDownloadQueue": "Черга скачувань",
"HeaderEbookFiles": "Файли електронних книг", "HeaderEbookFiles": "Файли електронних книг",
"HeaderEmail": "Електронна пошта", "HeaderEmail": "Електронна пошта",
"HeaderEmailSettings": "Налаштування електронної пошти", "HeaderEmailSettings": "Налаштування електронної пошти",
@ -152,13 +152,13 @@
"HeaderLibraryFiles": "Файли бібліотеки", "HeaderLibraryFiles": "Файли бібліотеки",
"HeaderLibraryStats": "Статистика бібліотеки", "HeaderLibraryStats": "Статистика бібліотеки",
"HeaderListeningSessions": "Сеанси прослуховування", "HeaderListeningSessions": "Сеанси прослуховування",
"HeaderListeningStats": "Статистика відтворення", "HeaderListeningStats": "Статистика прослуховування",
"HeaderLogin": "Вхід", "HeaderLogin": "Вхід",
"HeaderLogs": "Журнал", "HeaderLogs": "Журнал",
"HeaderManageGenres": "Керувати жанрами", "HeaderManageGenres": "Керувати жанрами",
"HeaderManageTags": "Керувати мітками", "HeaderManageTags": "Керувати мітками",
"HeaderMapDetails": "Призначити подробиці", "HeaderMapDetails": "Призначити подробиці",
"HeaderMatch": "Пошук", "HeaderMatch": "Допасуй",
"HeaderMetadataOrderOfPrecedence": "Порядок метаданих", "HeaderMetadataOrderOfPrecedence": "Порядок метаданих",
"HeaderMetadataToEmbed": "Вбудувати метадані", "HeaderMetadataToEmbed": "Вбудувати метадані",
"HeaderNewAccount": "Новий профіль", "HeaderNewAccount": "Новий профіль",
@ -176,7 +176,7 @@
"HeaderPlayerSettings": "Налаштування програвача", "HeaderPlayerSettings": "Налаштування програвача",
"HeaderPlaylist": "Список відтворення", "HeaderPlaylist": "Список відтворення",
"HeaderPlaylistItems": "Елементи списку відтворення", "HeaderPlaylistItems": "Елементи списку відтворення",
"HeaderPodcastsToAdd": "Додати подкасти", "HeaderPodcastsToAdd": "Подкасти для додання",
"HeaderPresets": "Пресети", "HeaderPresets": "Пресети",
"HeaderPreviewCover": "Попередній перегляд", "HeaderPreviewCover": "Попередній перегляд",
"HeaderRSSFeedGeneral": "Подробиці RSS", "HeaderRSSFeedGeneral": "Подробиці RSS",
@ -186,7 +186,7 @@
"HeaderRemoveEpisodes": "Видалити епізодів: {0}", "HeaderRemoveEpisodes": "Видалити епізодів: {0}",
"HeaderSavedMediaProgress": "Збережений прогрес медіа", "HeaderSavedMediaProgress": "Збережений прогрес медіа",
"HeaderSchedule": "Розклад", "HeaderSchedule": "Розклад",
"HeaderScheduleEpisodeDownloads": "Запланувати автоматичне завантаження епізодів", "HeaderScheduleEpisodeDownloads": "Запланувати автоматичне скачування епізодів",
"HeaderScheduleLibraryScans": "Розклад автосканування бібліотеки", "HeaderScheduleLibraryScans": "Розклад автосканування бібліотеки",
"HeaderSession": "Сеанс", "HeaderSession": "Сеанс",
"HeaderSetBackupSchedule": "Встановити розклад резервного копіювання", "HeaderSetBackupSchedule": "Встановити розклад резервного копіювання",
@ -223,21 +223,21 @@
"LabelActivities": "Діяльність", "LabelActivities": "Діяльність",
"LabelActivity": "Активність", "LabelActivity": "Активність",
"LabelAddToCollection": "Додати у добірку", "LabelAddToCollection": "Додати у добірку",
"LabelAddToCollectionBatch": "Додати книги до добірки: {0}", "LabelAddToCollectionBatch": "Додати {0} книг до добірки",
"LabelAddToPlaylist": "Додати до списку відтворення", "LabelAddToPlaylist": "Додати до списку відтворення",
"LabelAddToPlaylistBatch": "Додано елементів у список відтворення: {0}", "LabelAddToPlaylistBatch": "Додати {0} елементів до списку відтворення",
"LabelAddedAt": "Дата додавання", "LabelAddedAt": "Дата додавання",
"LabelAddedDate": "Додано {0}", "LabelAddedDate": "Додано {0}",
"LabelAdminUsersOnly": "Тільки для адміністраторів", "LabelAdminUsersOnly": "Тільки для адміністраторів",
"LabelAll": "Усе", "LabelAll": "Усе",
"LabelAllEpisodesDownloaded": "Усі серії завантажено", "LabelAllEpisodesDownloaded": "Усі епізоди скачано",
"LabelAllUsers": "Усі користувачі", "LabelAllUsers": "Усі користувачі",
"LabelAllUsersExcludingGuests": "Усі, крім гостей", "LabelAllUsersExcludingGuests": "Усі, крім гостей",
"LabelAllUsersIncludingGuests": "Усі, включно з гостями", "LabelAllUsersIncludingGuests": "Усі, включно з гостями",
"LabelAlreadyInYourLibrary": "Вже у вашій бібліотеці", "LabelAlreadyInYourLibrary": "Вже у вашій бібліотеці",
"LabelApiToken": "Токен API", "LabelApiToken": "Токен API",
"LabelAppend": "Додати", "LabelAppend": "Додати",
"LabelAudioBitrate": "Бітрейт аудіо (напр. 128k)", "LabelAudioBitrate": "Бітрейт аудіо (наприклад, 128k)",
"LabelAudioChannels": "Канали аудіо (1 або 2)", "LabelAudioChannels": "Канали аудіо (1 або 2)",
"LabelAudioCodec": "Аудіокодек", "LabelAudioCodec": "Аудіокодек",
"LabelAuthor": "Автор", "LabelAuthor": "Автор",
@ -256,18 +256,18 @@
"LabelBackupLocation": "Розташування резервних копій", "LabelBackupLocation": "Розташування резервних копій",
"LabelBackupsEnableAutomaticBackups": "Автоматичне резервне копіювання", "LabelBackupsEnableAutomaticBackups": "Автоматичне резервне копіювання",
"LabelBackupsEnableAutomaticBackupsHelp": "Резервні копії збережено у /metadata/backups", "LabelBackupsEnableAutomaticBackupsHelp": "Резервні копії збережено у /metadata/backups",
"LabelBackupsMaxBackupSize": "Максимальний розмір резервної копії (у ГБ) (0 — необмежене)", "LabelBackupsMaxBackupSize": "Максимальний розмір резервної копії (у ГБ) (0 — без обмежень)",
"LabelBackupsMaxBackupSizeHelp": "У якості захисту від неправильного налаштування, резервну копію не буде збережено, якщо її розмір перевищуватиме вказаний.", "LabelBackupsMaxBackupSizeHelp": "У якості захисту від неправильного налаштування, резервну копію не буде збережено, якщо її розмір перевищуватиме вказаний.",
"LabelBackupsNumberToKeep": "Кількість резервних копій", "LabelBackupsNumberToKeep": "Кількість резервних копій",
"LabelBackupsNumberToKeepHelp": "Лиш 1 резервну копію буде видалено за раз, тож якщо їх багато, то вам варто видалити їх вручну.", "LabelBackupsNumberToKeepHelp": "Видаляється лише 1 резервна копія за раз, тому якщо у вас більше копій, видаліть їх вручну.",
"LabelBitrate": "Бітрейт", "LabelBitrate": "Бітрейт",
"LabelBonus": "Бонус", "LabelBonus": "Бонус",
"LabelBooks": "Книги", "LabelBooks": "Книг",
"LabelButtonText": "Текст кнопки", "LabelButtonText": "Текст кнопки",
"LabelByAuthor": "від {0}", "LabelByAuthor": "від {0}",
"LabelChangePassword": "Змінити пароль", "LabelChangePassword": "Змінити пароль",
"LabelChannels": "Канали", "LabelChannels": "Канали",
"LabelChapterCount": "{0} Глав", "LabelChapterCount": "{0} глав",
"LabelChapterTitle": "Назва глави", "LabelChapterTitle": "Назва глави",
"LabelChapters": "Глави", "LabelChapters": "Глави",
"LabelChaptersFound": "глав знайдено", "LabelChaptersFound": "глав знайдено",
@ -304,9 +304,9 @@
"LabelDiscFromFilename": "Диск за назвою файлу", "LabelDiscFromFilename": "Диск за назвою файлу",
"LabelDiscFromMetadata": "Диск за метаданими", "LabelDiscFromMetadata": "Диск за метаданими",
"LabelDiscover": "Огляд", "LabelDiscover": "Огляд",
"LabelDownload": "Завантажити", "LabelDownload": "Скачати",
"LabelDownloadNEpisodes": "Завантажити епізодів: {0}", "LabelDownloadNEpisodes": "Скачати {0} епізодів",
"LabelDownloadable": "Можна завантажити", "LabelDownloadable": "Можна скачати",
"LabelDuration": "Тривалість", "LabelDuration": "Тривалість",
"LabelDurationComparisonExactMatch": "(повний збіг)", "LabelDurationComparisonExactMatch": "(повний збіг)",
"LabelDurationComparisonLonger": "(на {0} довше)", "LabelDurationComparisonLonger": "(на {0} довше)",
@ -353,9 +353,9 @@
"LabelFeedURL": "Адреса стрічки", "LabelFeedURL": "Адреса стрічки",
"LabelFetchingMetadata": "Отримання метаданих", "LabelFetchingMetadata": "Отримання метаданих",
"LabelFile": "Файл", "LabelFile": "Файл",
"LabelFileBirthtime": "Дата створення", "LabelFileBirthtime": "Дата створення файлу",
"LabelFileBornDate": "Народився {0}", "LabelFileBornDate": "Народився {0}",
"LabelFileModified": "Дата змінення", "LabelFileModified": "Дата зміни файлу",
"LabelFileModifiedDate": "Змінено {0}", "LabelFileModifiedDate": "Змінено {0}",
"LabelFilename": "Ім'я файлу", "LabelFilename": "Ім'я файлу",
"LabelFilterByUser": "Фільтрувати за користувачем", "LabelFilterByUser": "Фільтрувати за користувачем",
@ -395,7 +395,7 @@
"LabelIntervalEvery6Hours": "Кожні 6 годин", "LabelIntervalEvery6Hours": "Кожні 6 годин",
"LabelIntervalEveryDay": "Щодня", "LabelIntervalEveryDay": "Щодня",
"LabelIntervalEveryHour": "Щогодини", "LabelIntervalEveryHour": "Щогодини",
"LabelIntervalEveryMinute": "Кожну хвилину", "LabelIntervalEveryMinute": "Щохвилини",
"LabelInvert": "Інвертувати", "LabelInvert": "Інвертувати",
"LabelItem": "Елемент", "LabelItem": "Елемент",
"LabelJumpBackwardAmount": "Час переходу назад", "LabelJumpBackwardAmount": "Час переходу назад",
@ -427,10 +427,10 @@
"LabelLowestPriority": "Найнижчий пріоритет", "LabelLowestPriority": "Найнижчий пріоритет",
"LabelMatchExistingUsersBy": "Шукати наявних користувачів за", "LabelMatchExistingUsersBy": "Шукати наявних користувачів за",
"LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO", "LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO",
"LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для завантаження. Використовуйте 0 для необмеженої кількості.", "LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для скачування. Використовуйте 0 для необмеженої кількості.",
"LabelMaxEpisodesToDownloadPerCheck": "Максимальна кількість нових епізодів для завантаження за перевірку", "LabelMaxEpisodesToDownloadPerCheck": "Максимальна кількість нових епізодів для скачування за перевірку",
"LabelMaxEpisodesToKeep": "Максимальна кількість епізодів для зберігання", "LabelMaxEpisodesToKeep": "Максимальна кількість епізодів для зберігання",
"LabelMaxEpisodesToKeepHelp": "Значення 0 не встановлює обмеження. Після автоматичного завантаження нового епізоду, буде видалено найстаріший епізод, якщо у вас більше ніж X епізодів. Видаляється лише 1 епізод за одне нове завантаження.", "LabelMaxEpisodesToKeepHelp": "Значення 0 — без обмежень. Після автоматичного завантаження нового епізоду буде видалено найстаріший, якщо їх більше X. Видаляється лише 1 епізод за одне нове завантаження.",
"LabelMediaPlayer": "Програвач медіа", "LabelMediaPlayer": "Програвач медіа",
"LabelMediaType": "Тип медіа", "LabelMediaType": "Тип медіа",
"LabelMetaTag": "Метатег", "LabelMetaTag": "Метатег",
@ -485,7 +485,7 @@
"LabelPermissionsAccessExplicitContent": "Доступ до відвертого вмісту", "LabelPermissionsAccessExplicitContent": "Доступ до відвертого вмісту",
"LabelPermissionsCreateEreader": "Можна створити читалку", "LabelPermissionsCreateEreader": "Можна створити читалку",
"LabelPermissionsDelete": "Може видаляти", "LabelPermissionsDelete": "Може видаляти",
"LabelPermissionsDownload": "Може завантажувати", "LabelPermissionsDownload": "Може скачувати",
"LabelPermissionsUpdate": "Може оновлювати", "LabelPermissionsUpdate": "Може оновлювати",
"LabelPermissionsUpload": "Може завантажувати", "LabelPermissionsUpload": "Може завантажувати",
"LabelPersonalYearReview": "Ваші підсумки року ({0})", "LabelPersonalYearReview": "Ваші підсумки року ({0})",
@ -514,7 +514,7 @@
"LabelPublishers": "Видавці", "LabelPublishers": "Видавці",
"LabelRSSFeedCustomOwnerEmail": "Користувацька електронна адреса власника", "LabelRSSFeedCustomOwnerEmail": "Користувацька електронна адреса власника",
"LabelRSSFeedCustomOwnerName": "Користувацьке ім'я власника", "LabelRSSFeedCustomOwnerName": "Користувацьке ім'я власника",
"LabelRSSFeedOpen": "RSS-канал відкрито", "LabelRSSFeedOpen": "RSS-канал відкритий",
"LabelRSSFeedPreventIndexing": "Запобігати індексації", "LabelRSSFeedPreventIndexing": "Запобігати індексації",
"LabelRSSFeedSlug": "Назва RSS-каналу", "LabelRSSFeedSlug": "Назва RSS-каналу",
"LabelRSSFeedURL": "Адреса RSS-каналу", "LabelRSSFeedURL": "Адреса RSS-каналу",
@ -542,8 +542,8 @@
"LabelSeason": "Сезон", "LabelSeason": "Сезон",
"LabelSeasonNumber": "Сезон #{0}", "LabelSeasonNumber": "Сезон #{0}",
"LabelSelectAll": "Вибрати все", "LabelSelectAll": "Вибрати все",
"LabelSelectAllEpisodes": "Вибрати всі серії", "LabelSelectAllEpisodes": "Вибрати всі епізоди",
"LabelSelectEpisodesShowing": "Обрати показані епізоди: {0}", "LabelSelectEpisodesShowing": "Вибрати {0} показаних епізодів",
"LabelSelectUsers": "Вибрати користувачів", "LabelSelectUsers": "Вибрати користувачів",
"LabelSendEbookToDevice": "Надіслати електронну книгу на...", "LabelSendEbookToDevice": "Надіслати електронну книгу на...",
"LabelSequence": "Послідовність", "LabelSequence": "Послідовність",
@ -595,7 +595,7 @@
"LabelSettingsStoreMetadataWithItemHelp": "За замовчуванням файли метаданих зберігаються у /metadata/items. Цей параметр увімкне збереження метаданих у теці елемента бібліотеки", "LabelSettingsStoreMetadataWithItemHelp": "За замовчуванням файли метаданих зберігаються у /metadata/items. Цей параметр увімкне збереження метаданих у теці елемента бібліотеки",
"LabelSettingsTimeFormat": "Формат часу", "LabelSettingsTimeFormat": "Формат часу",
"LabelShare": "Поділитися", "LabelShare": "Поділитися",
"LabelShareDownloadableHelp": "Дозволяє користувачам із посиланням для спільного доступу завантажувати zip-файл елемента бібліотеки.", "LabelShareDownloadableHelp": "Дозволяє користувачам із посиланням для спільного доступу скачування zip-файлу елемента бібліотеки.",
"LabelShareOpen": "Поділитися відкрито", "LabelShareOpen": "Поділитися відкрито",
"LabelShareURL": "Поділитися URL", "LabelShareURL": "Поділитися URL",
"LabelShowAll": "Показати все", "LabelShowAll": "Показати все",
@ -714,19 +714,19 @@
"MessageBackupsLocationNoEditNote": "Примітка: розташування резервної копії встановлюється за допомогою змінної середовища та не може бути змінене тут.", "MessageBackupsLocationNoEditNote": "Примітка: розташування резервної копії встановлюється за допомогою змінної середовища та не може бути змінене тут.",
"MessageBackupsLocationPathEmpty": "Шлях розташування резервної копії не може бути порожнім", "MessageBackupsLocationPathEmpty": "Шлях розташування резервної копії не може бути порожнім",
"MessageBatchEditPopulateMapDetailsAllHelp": "Заповнити увімкнені поля даними з усіх елементів. Поля з кількома значеннями буде об’єднано", "MessageBatchEditPopulateMapDetailsAllHelp": "Заповнити увімкнені поля даними з усіх елементів. Поля з кількома значеннями буде об’єднано",
"MessageBatchEditPopulateMapDetailsItemHelp": "Заповніть увімкнені поля деталей карти даними з цього елемента", "MessageBatchEditPopulateMapDetailsItemHelp": "Заповнити увімкнені поля деталізації даними з цього елемента",
"MessageBatchQuickMatchDescription": "Швидкий пошук спробує знайти відсутні обкладинки та метадані обраних елементів. Увімкніть налаштування нижче, аби дозволити заміну наявних обкладинок та/або метаданих під час швидкого пошуку.", "MessageBatchQuickMatchDescription": "Швидкий пошук спробує знайти відсутні обкладинки та метадані обраних елементів. Увімкніть налаштування нижче, аби дозволити заміну наявних обкладинок та/або метаданих під час швидкого пошуку.",
"MessageBookshelfNoCollections": "Ви не створили жодної добірки", "MessageBookshelfNoCollections": "Ви ще не створили жодної добірки",
"MessageBookshelfNoCollectionsHelp": "Колекції публічні. Їх можуть бачити всі користувачі, які мають доступ до бібліотеки.", "MessageBookshelfNoCollectionsHelp": "Колекції публічні. Їх можуть бачити всі користувачі, які мають доступ до бібліотеки.",
"MessageBookshelfNoRSSFeeds": "Немає відкритих RSS-каналів", "MessageBookshelfNoRSSFeeds": "Немає відкритих RSS-каналів",
"MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Немає результатів за запитом", "MessageBookshelfNoResultsForQuery": "Немає результатів за запитом",
"MessageBookshelfNoSeries": "Серії відсутні", "MessageBookshelfNoSeries": "У вас немає серій",
"MessageChapterEndIsAfter": "Кінець глави знаходиться після закінчення книги", "MessageChapterEndIsAfter": "Кінець глави після завершення аудіокниги",
"MessageChapterErrorFirstNotZero": "Перша глава мусить починатися з 0", "MessageChapterErrorFirstNotZero": "Перша глава повинна починатися з 0",
"MessageChapterErrorStartGteDuration": "Час початку мусить бути меншим за тривалість аудіокниги", "MessageChapterErrorStartGteDuration": "Час початку має бути меншим за тривалість аудіокниги",
"MessageChapterErrorStartLtPrev": "Неприпустимий час початку, має бути більшим за час початку попередньої глави", "MessageChapterErrorStartLtPrev": "Час початку має бути більшим або рівним часу початку попередньої глави",
"MessageChapterStartIsAfter": "Початок глави знаходиться після закінчення книги", "MessageChapterStartIsAfter": "Початок глави після завершення аудіокниги",
"MessageChaptersNotFound": "Розділи не знайдені", "MessageChaptersNotFound": "Розділи не знайдені",
"MessageCheckingCron": "Перевірка планувальника...", "MessageCheckingCron": "Перевірка планувальника...",
"MessageConfirmCloseFeed": "Ви дійсно бажаєте закрити цей канал?", "MessageConfirmCloseFeed": "Ви дійсно бажаєте закрити цей канал?",
@ -734,25 +734,25 @@
"MessageConfirmDeleteDevice": "Ви впевнені, що хочете видалити пристрій для читання \"{0}\"?", "MessageConfirmDeleteDevice": "Ви впевнені, що хочете видалити пристрій для читання \"{0}\"?",
"MessageConfirmDeleteFile": "Файл буде видалено з вашої файлової системи. Ви впевнені?", "MessageConfirmDeleteFile": "Файл буде видалено з вашої файлової системи. Ви впевнені?",
"MessageConfirmDeleteLibrary": "Ви дійсно бажаєте назавжди видалити бібліотеку \"{0}\"?", "MessageConfirmDeleteLibrary": "Ви дійсно бажаєте назавжди видалити бібліотеку \"{0}\"?",
"MessageConfirmDeleteLibraryItem": "Елемент бібліотеки буде видалено з бази даних та вашої файлової системи. Ви впевнені?", "MessageConfirmDeleteLibraryItem": "Елемент бібліотеки буде видалено з бази даних і файлової системи. Ви впевнені?",
"MessageConfirmDeleteLibraryItems": "З бази даних та вашої файлової системи будуть видалені елементи бібліотеки: {0}. Ви впевнені?", "MessageConfirmDeleteLibraryItems": "Буде видалено {0} елементів бібліотеки з бази даних і файлової системи. Ви впевнені?",
"MessageConfirmDeleteMetadataProvider": "Ви впевнені, що хочете видалити користувацького постачальника метаданих \"{0}\"?", "MessageConfirmDeleteMetadataProvider": "Ви впевнені, що хочете видалити користувацького постачальника метаданих \"{0}\"?",
"MessageConfirmDeleteNotification": "Ви впевнені, що хочете видалити це сповіщення?", "MessageConfirmDeleteNotification": "Ви впевнені, що хочете видалити це сповіщення?",
"MessageConfirmDeleteSession": "Ви дійсно бажаєте видалити цей сеанс?", "MessageConfirmDeleteSession": "Ви дійсно бажаєте видалити цей сеанс?",
"MessageConfirmEmbedMetadataInAudioFiles": "Ви впевнені, що хочете вставити метадані в {0} аудіофайлів?", "MessageConfirmEmbedMetadataInAudioFiles": "Ви впевнені, що хочете вбудувати метадані у {0} аудіофайлів?",
"MessageConfirmForceReScan": "Ви дійсно бажаєте примусово пересканувати?", "MessageConfirmForceReScan": "Ви дійсно бажаєте примусово пересканувати?",
"MessageConfirmMarkAllEpisodesFinished": "Ви дійсно бажаєте позначити усі епізоди завершеними?", "MessageConfirmMarkAllEpisodesFinished": "Ви впевнені, що хочете позначити всі епізоди завершеними?",
"MessageConfirmMarkAllEpisodesNotFinished": "Ви дійсно бажаєте позначити усі епізоди незавершеними?", "MessageConfirmMarkAllEpisodesNotFinished": "Ви впевнені, що хочете позначити всі епізоди незавершеними?",
"MessageConfirmMarkItemFinished": "Ви впевнені, що хочете позначити \"{0}\" як завершене?", "MessageConfirmMarkItemFinished": "Ви впевнені, що хочете позначити \"{0}\" як завершене?",
"MessageConfirmMarkItemNotFinished": "Ви впевнені, що хочете позначити \"{0}\" як незавершене?", "MessageConfirmMarkItemNotFinished": "Ви впевнені, що хочете позначити \"{0}\" як незавершене?",
"MessageConfirmMarkSeriesFinished": "Ви дійсно бажаєте позначити усі книги серії завершеними?", "MessageConfirmMarkSeriesFinished": "Ви дійсно бажаєте позначити усі книги серії завершеними?",
"MessageConfirmMarkSeriesNotFinished": "Ви дійсно бажаєте позначити всі книги серії незавершеними?", "MessageConfirmMarkSeriesNotFinished": "Ви дійсно бажаєте позначити всі книги серії незавершеними?",
"MessageConfirmNotificationTestTrigger": "Активувати це сповіщення з тестовими даними?", "MessageConfirmNotificationTestTrigger": "Активувати це сповіщення з тестовими даними?",
"MessageConfirmPurgeCache": "Очищення кешу видалить усю теку <code>/metadata/cache</code>. <br /><br />Ви дійсно бажаєте видалити теку кешу?", "MessageConfirmPurgeCache": "Очищення кешу видалить всю теку <code>/metadata/cache</code>. <br /><br />Ви впевнені, що хочете видалити теку кешу?",
"MessageConfirmPurgeItemsCache": "Очищення кешу елементів видалить усю теку <code>/metadata/cache/items</code>. <br />Ви певні?", "MessageConfirmPurgeItemsCache": "Очищення кешу елементів видалить всю теку <code>/metadata/cache/items</code>.<br />Ви впевнені?",
"MessageConfirmQuickEmbed": "Увага! Швидке вбудування не створює резервних копій ваших аудіо. Переконайтеся, що маєте копію ваших файлів.<br><br>Продовжити?", "MessageConfirmQuickEmbed": "Увага! Швидке вбудовування не створює резервних копій ваших аудіофайлів. Переконайтеся, що маєте резервну копію. <br><br>Продовжити?",
"MessageConfirmQuickMatchEpisodes": "При виявленні співпадінь інформація про епізоди швидкого пошуку буде перезаписана. Будуть оновлені тільки несуперечливі епізоди. Ви впевнені?", "MessageConfirmQuickMatchEpisodes": "Швидке співставлення епізодів перезапише подробиці, якщо знайдено відповідність. Оновлюються лише невідповідні епізоди. Ви впевнені?",
"MessageConfirmReScanLibraryItems": "Ви дійсно бажаєте пересканувати елементи: {0}?", "MessageConfirmReScanLibraryItems": "Ви впевнені, що хочете пересканувати {0} елементів?",
"MessageConfirmRemoveAllChapters": "Ви дійсно бажаєте видалити усі глави?", "MessageConfirmRemoveAllChapters": "Ви дійсно бажаєте видалити усі глави?",
"MessageConfirmRemoveAuthor": "Ви дійсно бажаєте видалити автора \"{0}\"?", "MessageConfirmRemoveAuthor": "Ви дійсно бажаєте видалити автора \"{0}\"?",
"MessageConfirmRemoveCollection": "Ви дійсно бажаєте видалити добірку \"{0}\"?", "MessageConfirmRemoveCollection": "Ви дійсно бажаєте видалити добірку \"{0}\"?",
@ -761,44 +761,44 @@
"MessageConfirmRemoveListeningSessions": "Ви дійсно бажаєте видалити сеанси прослуховування: {0}?", "MessageConfirmRemoveListeningSessions": "Ви дійсно бажаєте видалити сеанси прослуховування: {0}?",
"MessageConfirmRemoveMetadataFiles": "Ви впевнені, що хочете видалити всі файли metadata.{0} у папках елементів вашої бібліотеки?", "MessageConfirmRemoveMetadataFiles": "Ви впевнені, що хочете видалити всі файли metadata.{0} у папках елементів вашої бібліотеки?",
"MessageConfirmRemoveNarrator": "Ви дійсно бажаєте видалити читця \"{0}\"?", "MessageConfirmRemoveNarrator": "Ви дійсно бажаєте видалити читця \"{0}\"?",
"MessageConfirmRemovePlaylist": "Ви дійсно бажаєте видалити список відтворення \"{0}\"?", "MessageConfirmRemovePlaylist": "Ви дійсно бажаєте видалити ваш список відтворення \"{0}\"?",
"MessageConfirmRenameGenre": "Ви дійсно бажаєте замінити жанр \"{0}\" на \"{1}\" для усіх елементів?", "MessageConfirmRenameGenre": "Ви впевнені, що хочете перейменувати жанр \"{0}\" на \"{1}\" для всіх елементів?",
"MessageConfirmRenameGenreMergeNote": "Примітка: такий жанр вже існує, тож їх буде об'єднано.", "MessageConfirmRenameGenreMergeNote": "Примітка: Такий жанр вже існує, тому вони будуть об'єднані.",
"MessageConfirmRenameGenreWarning": "Увага! Вже існує схожий жанр у іншому регістрі \"{0}\".", "MessageConfirmRenameGenreWarning": "Увага! Схожий жанр з іншом регістром вже існує \"{0}\".",
"MessageConfirmRenameTag": "Ви дійсно бажаєте замінити мітку \"{0}\" на \"{1}\" для усіх елементів?", "MessageConfirmRenameTag": "Ви впевнені, що хочете перейменувати мітку \"{0}\" на \"{1}\" для всіх елементів?",
"MessageConfirmRenameTagMergeNote": "Примітка: така мітка вже існує, тож їх буде об'єднано.", "MessageConfirmRenameTagMergeNote": "Примітка: Така мітка вже існує, тому вони будуть об'єднані.",
"MessageConfirmRenameTagWarning": "Увага! Вже існує схожа мітка у іншому регістрі \"{0}\".", "MessageConfirmRenameTagWarning": "Увага! Схожа мітка з іншою регістром вже існує \"{0}\".",
"MessageConfirmResetProgress": "Ви впевнені, що хочете скинути свій прогрес?", "MessageConfirmResetProgress": "Ви впевнені, що хочете скинути свій прогрес?",
"MessageConfirmSendEbookToDevice": "Ви дійсно хочете відправити на пристрій \"{2}\" електроні книги: {0}, \"{1}\"?", "MessageConfirmSendEbookToDevice": "Ви дійсно хочете відправити на пристрій \"{2}\" електроні книги: {0}, \"{1}\"?",
"MessageConfirmUnlinkOpenId": "Ви впевнені, що хочете відв'язати цього користувача від OpenID?", "MessageConfirmUnlinkOpenId": "Ви впевнені, що хочете відв'язати цього користувача від OpenID?",
"MessageDaysListenedInTheLastYear": "{0} днів, прослуханих за останній рік", "MessageDaysListenedInTheLastYear": "{0} днів, прослуханих за останній рік",
"MessageDownloadingEpisode": "Завантаження епізоду", "MessageDownloadingEpisode": "Скачування епізоду",
"MessageDragFilesIntoTrackOrder": "Перетягніть файли до правильного порядку", "MessageDragFilesIntoTrackOrder": "Перетягніть файли до правильного порядку",
"MessageEmbedFailed": "Не вдалося вбудувати!", "MessageEmbedFailed": "Не вдалося вбудувати!",
"MessageEmbedFinished": "Вбудовано!", "MessageEmbedFinished": "Вбудовування завершено!",
"MessageEmbedQueue": "В черзі на вбудовування метаданих ({0} в черзі)", "MessageEmbedQueue": "У черзі на вбудовування метаданих ({0} у черзі)",
"MessageEpisodesQueuedForDownload": "Епізодів у черзі завантаження: {0}", "MessageEpisodesQueuedForDownload": "{0} епізод(ів) у черзі на завантаження",
"MessageEreaderDevices": "Аби гарантувати отримання електронних книг, вам може знадобитися додати вказану вище адресу електронної пошти як правильного відправника на кожному з пристроїв зі списку нижче.", "MessageEreaderDevices": "Аби гарантувати отримання електронних книг, вам може знадобитися додати вказану вище адресу електронної пошти як правильного відправника на кожному з пристроїв зі списку нижче.",
"MessageFeedURLWillBe": "URL-адреса каналу буде {0}", "MessageFeedURLWillBe": "URL-адреса каналу буде {0}",
"MessageFetching": "Отримання...", "MessageFetching": "Отримання...",
"MessageForceReScanDescription": "Просканує усі файли заново, неначе вперше. ID3-мітки, файли OPF та текстові файли будуть проскановані як нові.", "MessageForceReScanDescription": "Просканує всі файли заново, як при першому скануванні. ID3-мітки, OPF-файли та текстові файли будуть проскановані як нові.",
"MessageImportantNotice": "Важливе повідомлення!", "MessageImportantNotice": "Важливе повідомлення!",
"MessageInsertChapterBelow": "Введіть главу нижче", "MessageInsertChapterBelow": "Введіть главу нижче",
"MessageInvalidAsin": "Невірний ASIN", "MessageInvalidAsin": "Невірний ASIN",
"MessageItemsSelected": "Вибрано елементів: {0}", "MessageItemsSelected": "Вибрано {0} елементів",
"MessageItemsUpdated": "Оновлено елементів: {0}", "MessageItemsUpdated": "Оновлено {0} елементів",
"MessageJoinUsOn": "Приєднуйтесь до", "MessageJoinUsOn": "Приєднуйтесь до",
"MessageLoading": "Завантаження...", "MessageLoading": "Завантаження...",
"MessageLoadingFolders": "Завантаження тек...", "MessageLoadingFolders": "Завантаження папок...",
"MessageLogsDescription": "Журнали зберігаються у <code>/metadata/logs</code> як JSON-файли. Журнали збоїв зберігаються у <code>/metadata/logs/crash_logs.txt</code>.", "MessageLogsDescription": "Журнали зберігаються у <code>/metadata/logs</code> як JSON-файли. Журнали збоїв зберігаються у <code>/metadata/logs/crash_logs.txt</code>.",
"MessageM4BFailed": "Помилка M4B!", "MessageM4BFailed": "Помилка M4B!",
"MessageM4BFinished": "M4B створено!", "MessageM4BFinished": "M4B створено!",
"MessageMapChapterTitles": "Встановіть назви глав вашої аудіокниги без визначення налаштувань тривалості", "MessageMapChapterTitles": "Встановіть назви глав вашої аудіокниги без зміни часових міток",
"MessageMarkAllEpisodesFinished": "Позначити всі епізоди завершеними", "MessageMarkAllEpisodesFinished": "Позначити всі епізоди завершеними",
"MessageMarkAllEpisodesNotFinished": "Позначити всі епізоди незавершеними", "MessageMarkAllEpisodesNotFinished": "Позначити всі епізоди незавершеними",
"MessageMarkAsFinished": "Позначити завершеним", "MessageMarkAsFinished": "Позначити як завершене",
"MessageMarkAsNotFinished": "Позначити незавершеним", "MessageMarkAsNotFinished": "Позначити як незавершене",
"MessageMatchBooksDescription": "Спробує віднайти книгу у вказаному джерелі пошуку та встановити подробиці та обкладинку, яких бракує. Не перезаписує подробиці.", "MessageMatchBooksDescription": "Спробує знайти книги у бібліотеці у вибраному джерелі пошуку та заповнити порожні подробиці й обкладинку. Не перезаписує подробиці.",
"MessageNoAudioTracks": "Аудіодоріжки відсутні", "MessageNoAudioTracks": "Аудіодоріжки відсутні",
"MessageNoAuthors": "Автори відсутні", "MessageNoAuthors": "Автори відсутні",
"MessageNoBackups": "Резервні копії відсутні", "MessageNoBackups": "Резервні копії відсутні",
@ -808,8 +808,8 @@
"MessageNoCoversFound": "Обкладинок не знайдено", "MessageNoCoversFound": "Обкладинок не знайдено",
"MessageNoDescription": "Без опису", "MessageNoDescription": "Без опису",
"MessageNoDevices": "Немає пристроїв", "MessageNoDevices": "Немає пристроїв",
"MessageNoDownloadsInProgress": "Немає активних завантажень", "MessageNoDownloadsInProgress": "Немає активних скачувань",
"MessageNoDownloadsQueued": "Немає завантажень у черзі", "MessageNoDownloadsQueued": "Немає скачувань у черзі",
"MessageNoEpisodeMatchesFound": "Відповідних епізодів не знайдено", "MessageNoEpisodeMatchesFound": "Відповідних епізодів не знайдено",
"MessageNoEpisodes": "Епізоди відсутні", "MessageNoEpisodes": "Епізоди відсутні",
"MessageNoFoldersAvailable": "Немає доступних тек", "MessageNoFoldersAvailable": "Немає доступних тек",
@ -818,21 +818,21 @@
"MessageNoItems": "Елементи відсутні", "MessageNoItems": "Елементи відсутні",
"MessageNoItemsFound": "Елементів не знайдено", "MessageNoItemsFound": "Елементів не знайдено",
"MessageNoListeningSessions": "Сеанси прослуховування відсутні", "MessageNoListeningSessions": "Сеанси прослуховування відсутні",
"MessageNoLogs": "Немає журнали", "MessageNoLogs": "Немає журналів",
"MessageNoMediaProgress": "Прогрес відсутній", "MessageNoMediaProgress": "Прогрес відсутній",
"MessageNoNotifications": "Сповіщення відсутні", "MessageNoNotifications": "Сповіщення відсутні",
"MessageNoPodcastFeed": "Невірний подкаст: Немає каналу", "MessageNoPodcastFeed": "Некоректний подкаст: немає каналу",
"MessageNoPodcastsFound": "Подкастів не знайдено", "MessageNoPodcastsFound": "Подкастів не знайдено",
"MessageNoResults": "Немає результатів", "MessageNoResults": "Немає результатів",
"MessageNoSearchResultsFor": "Немає результатів пошуку для \"{0}\"", "MessageNoSearchResultsFor": "Немає результатів пошуку для \"{0}\"",
"MessageNoSeries": "Без серії", "MessageNoSeries": "Немає серій",
"MessageNoTags": "Без міток", "MessageNoTags": "Немає міток",
"MessageNoTasksRunning": "Немає активних завдань", "MessageNoTasksRunning": "Немає активних завдань",
"MessageNoUpdatesWereNecessary": "Оновлень не потрібно", "MessageNoUpdatesWereNecessary": "Оновлення не потрібні",
"MessageNoUserPlaylists": "У вас немає списків відтворення", "MessageNoUserPlaylists": "У вас немає списків відтворення",
"MessageNoUserPlaylistsHelp": "Списки відтворення приватні. Лише користувач, який їх створює, може бачити їх.", "MessageNoUserPlaylistsHelp": "Списки відтворення приватні. Лише користувач, який їх створив, може їх бачити.",
"MessageNotYetImplemented": "Ще не реалізовано", "MessageNotYetImplemented": "Ще не реалізовано",
"MessageOpmlPreviewNote": "Примітка: це попередній перегляд OPML-файлу. Актуальна назва подкасту буде завантажена з RSS-каналу.", "MessageOpmlPreviewNote": "Примітка: це попередній перегляд OPML-файлу. Актуальна назва подкасту буде взята з RSS-каналу.",
"MessageOr": "або", "MessageOr": "або",
"MessagePauseChapter": "Призупинити відтворення глави", "MessagePauseChapter": "Призупинити відтворення глави",
"MessagePlayChapter": "Слухати початок глави", "MessagePlayChapter": "Слухати початок глави",
@ -841,7 +841,7 @@
"MessagePodcastHasNoRSSFeedForMatching": "Подкаст не має RSS-каналу для пошуку", "MessagePodcastHasNoRSSFeedForMatching": "Подкаст не має RSS-каналу для пошуку",
"MessagePodcastSearchField": "Введіть пошуковий запит або URL RSS-стрічки", "MessagePodcastSearchField": "Введіть пошуковий запит або URL RSS-стрічки",
"MessageQuickEmbedInProgress": "Швидке вбудовування в процесі", "MessageQuickEmbedInProgress": "Швидке вбудовування в процесі",
"MessageQuickEmbedQueue": "В черзі на швидке вбудовування ({0} в черзі)", "MessageQuickEmbedQueue": "У черзі на швидке вбудовування ({0} в черзі)",
"MessageQuickMatchAllEpisodes": "Швидке співставлення всіх епізодів", "MessageQuickMatchAllEpisodes": "Швидке співставлення всіх епізодів",
"MessageQuickMatchDescription": "Заповнити відсутні подробиці та обкладинку першим результатом пошуку '{0}'. Не перезаписує подробиці, якщо не увімкнено параметр \"Надавати перевагу віднайденим метаданим\".", "MessageQuickMatchDescription": "Заповнити відсутні подробиці та обкладинку першим результатом пошуку '{0}'. Не перезаписує подробиці, якщо не увімкнено параметр \"Надавати перевагу віднайденим метаданим\".",
"MessageRemoveChapter": "Видалити главу", "MessageRemoveChapter": "Видалити главу",
@ -849,22 +849,23 @@
"MessageRemoveFromPlayerQueue": "Вилучити з черги відтворення", "MessageRemoveFromPlayerQueue": "Вилучити з черги відтворення",
"MessageRemoveUserWarning": "Ви дійсно бажаєте назавжди видалити користувача \"{0}\"?", "MessageRemoveUserWarning": "Ви дійсно бажаєте назавжди видалити користувача \"{0}\"?",
"MessageReportBugsAndContribute": "Повідомляйте про помилки, пропонуйте функції та долучайтеся на", "MessageReportBugsAndContribute": "Повідомляйте про помилки, пропонуйте функції та долучайтеся на",
"MessageResetChaptersConfirm": "Ви дійсно бажаєте скинути глави та скасувати внесені зміни?", "MessageResetChaptersConfirm": "Ви впевнені, що хочете скинути глави та скасувати внесені зміни?",
"MessageRestoreBackupConfirm": "Ви дійсно бажаєте відновити резервну копію від", "MessageRestoreBackupConfirm": "Ви впевнені, що хочете відновити резервну копію, створену",
"MessageRestoreBackupWarning": "Відновлення резервної копії перезапише всю базу даних, розташовану в /config, і зображення обкладинок в /metadata/items та /metadata/authors.<br /><br />Резервні копії не змінюють жодних файлів у теках бібліотеки. Якщо у налаштуваннях сервера увімкнено збереження обкладинок і метаданих у теках бібліотеки, вони не створюються під час резервного копіювання і не перезаписуються..<br /><br />Всі клієнти, що користуються вашим сервером, будуть автоматично оновлені.", "MessageRestoreBackupWarning": "Відновлення резервної копії перезапише всю базу даних у /config і зображення обкладинок у /metadata/items та /metadata/authors.<br /><br />Резервні копії не змінюють файли у теках бібліотеки. Якщо у налаштуваннях сервера увімкнено збереження обкладинок і метаданих у теках бібліотеки, вони не створюються під час резервного копіювання і не перезаписуються.<br /><br />Всі клієнти, що користуються вашим сервером, будуть автоматично оновлені.",
"MessageScheduleLibraryScanNote": "Для більшості користувачів рекомендується залишити цю функцію вимкненою та залишити параметр перегляду папок увімкненим. Засіб спостереження за папками автоматично виявить зміни в папках вашої бібліотеки. Засіб спостереження за папками не працює для кожної файлової системи (наприклад, NFS), тому замість нього можна використовувати сканування бібліотек за розкладом.", "MessageScheduleLibraryScanNote": "Для більшості користувачів рекомендується залишити цю функцію вимкненою та залишити параметр перегляду папок увімкненим. Засіб спостереження за папками автоматично виявить зміни в папках вашої бібліотеки. Засіб спостереження за папками не працює для кожної файлової системи (наприклад, NFS), тому замість нього можна використовувати сканування бібліотек за розкладом.",
"MessageScheduleRunEveryWeekdayAtTime": "Запуск кожні {0} о {1}", "MessageScheduleRunEveryWeekdayAtTime": "Запуск кожні {0} о {1}",
"MessageSearchResultsFor": "Результати пошуку для", "MessageSearchResultsFor": "Результати пошуку для",
"MessageSelected": "Вибрано: {0}", "MessageSelected": "Вибрано: {0}",
"MessageSeriesSequenceCannotContainSpaces": "Послідовність серій не може містити пробілів",
"MessageServerCouldNotBeReached": "Не вдалося підключитися до сервера", "MessageServerCouldNotBeReached": "Не вдалося підключитися до сервера",
"MessageSetChaptersFromTracksDescription": "Створити глави з аудіодоріжок, встановивши назви файлів за заголовки", "MessageSetChaptersFromTracksDescription": "Створити глави з аудіодоріжок, встановивши назви файлів за заголовки",
"MessageShareExpirationWillBe": "Термін сплине за <strong>{0}</strong>", "MessageShareExpirationWillBe": "Термін сплине за <strong>{0}</strong>",
"MessageShareExpiresIn": "Сплине за {0}", "MessageShareExpiresIn": "Спливає через {0}",
"MessageShareURLWillBe": "Поширюваний URL - <strong>{0}</strong>", "MessageShareURLWillBe": "URL для спільного доступу — <strong>{0}</strong>",
"MessageStartPlaybackAtTime": "Почати відтворення \"{0}\" з {1}?", "MessageStartPlaybackAtTime": "Почати відтворення \"{0}\" з {1}?",
"MessageTaskAudioFileNotWritable": "Аудіофайл \"{0}\" недоступний для запису", "MessageTaskAudioFileNotWritable": "Аудіофайл \"{0}\" недоступний для запису",
"MessageTaskCanceledByUser": "Задача скасована користувачем", "MessageTaskCanceledByUser": "Завдання скасовано користувачем",
"MessageTaskDownloadingEpisodeDescription": "Завантаження епізоду \"{0}\"", "MessageTaskDownloadingEpisodeDescription": "Скачування епізоду \"{0}\"",
"MessageTaskEmbeddingMetadata": "Вбудовування метаданих", "MessageTaskEmbeddingMetadata": "Вбудовування метаданих",
"MessageTaskEmbeddingMetadataDescription": "Вбудовування метаданих у аудіокнигу \"{0}\"", "MessageTaskEmbeddingMetadataDescription": "Вбудовування метаданих у аудіокнигу \"{0}\"",
"MessageTaskEncodingM4b": "Кодування M4B", "MessageTaskEncodingM4b": "Кодування M4B",
@ -879,19 +880,19 @@
"MessageTaskMatchingBooksInLibrary": "Відповідність книг у бібліотеці \"{0}\"", "MessageTaskMatchingBooksInLibrary": "Відповідність книг у бібліотеці \"{0}\"",
"MessageTaskNoFilesToScan": "Немає файлів для сканування", "MessageTaskNoFilesToScan": "Немає файлів для сканування",
"MessageTaskOpmlImport": "Імпорт OPML", "MessageTaskOpmlImport": "Імпорт OPML",
"MessageTaskOpmlImportDescription": "Створення подкастів з {0} RSS-стрічок", "MessageTaskOpmlImportDescription": "Створення подкастів з {0} RSS-каналів",
"MessageTaskOpmlImportFeed": "Канал імпорту OPML", "MessageTaskOpmlImportFeed": "Імпорт RSS-каналу OPML",
"MessageTaskOpmlImportFeedDescription": "Імпорт RSS-каналу \"{0}\"", "MessageTaskOpmlImportFeedDescription": "Імпорт RSS-каналу \"{0}\"",
"MessageTaskOpmlImportFeedFailed": "Не вдалося отримати подкаст-стрічку", "MessageTaskOpmlImportFeedFailed": "Не вдалося отримати подкаст-канал",
"MessageTaskOpmlImportFeedPodcastDescription": "Створення подкасту \"{0}\"", "MessageTaskOpmlImportFeedPodcastDescription": "Створення подкасту \"{0}\"",
"MessageTaskOpmlImportFeedPodcastExists": "Подкаст вже існує за цим шляхом", "MessageTaskOpmlImportFeedPodcastExists": "Подкаст вже існує за цим шляхом",
"MessageTaskOpmlImportFeedPodcastFailed": "Не вдалося створити подкаст", "MessageTaskOpmlImportFeedPodcastFailed": "Не вдалося створити подкаст",
"MessageTaskOpmlImportFinished": "Додано {0} подкастів", "MessageTaskOpmlImportFinished": "Додано {0} подкастів",
"MessageTaskOpmlParseFailed": "Не вдалося розібрати файл OPML", "MessageTaskOpmlParseFailed": "Не вдалося розібрати OPML-файл",
"MessageTaskOpmlParseFastFail": "Невірний файл OPML: не знайдено тег <opml> або тег <outline>", "MessageTaskOpmlParseFastFail": "Некоректний OPML-файл: не знайдено тег <opml> або <outline>",
"MessageTaskOpmlParseNoneFound": "У файлі OPML не знайдено жодного канала", "MessageTaskOpmlParseNoneFound": "У OPML-файлі не знайдено жодного каналу",
"MessageTaskScanItemsAdded": "{0} додано", "MessageTaskScanItemsAdded": "{0} додано",
"MessageTaskScanItemsMissing": "{0} відсутній", "MessageTaskScanItemsMissing": "{0} відсутні",
"MessageTaskScanItemsUpdated": "{0} оновлено", "MessageTaskScanItemsUpdated": "{0} оновлено",
"MessageTaskScanNoChangesNeeded": "Змін не потрібно", "MessageTaskScanNoChangesNeeded": "Змін не потрібно",
"MessageTaskScanningFileChanges": "Сканування змін файлів у \"{0}\"", "MessageTaskScanningFileChanges": "Сканування змін файлів у \"{0}\"",
@ -901,22 +902,24 @@
"MessageUploaderItemFailed": "Не вдалося завантажити", "MessageUploaderItemFailed": "Не вдалося завантажити",
"MessageUploaderItemSuccess": "Успішно завантажено!", "MessageUploaderItemSuccess": "Успішно завантажено!",
"MessageUploading": "Завантаження...", "MessageUploading": "Завантаження...",
"MessageValidCronExpression": "Допустима команда cron", "MessageValidCronExpression": "Коректний cron-вираз",
"MessageWatcherIsDisabledGlobally": "Спостерігача вимкнено в налаштуваннях сервера", "MessageWatcherIsDisabledGlobally": "Спостерігача вимкнено у глобальних налаштуваннях сервера",
"MessageXLibraryIsEmpty": "Бібліотека {0} порожня!", "MessageXLibraryIsEmpty": "Бібліотека {0} порожня!",
"MessageYourAudiobookDurationIsLonger": "Тривалість вашої аудіокниги довша за віднайдену", "MessageYourAudiobookDurationIsLonger": "Тривалість вашої аудіокниги більша за знайдену",
"MessageYourAudiobookDurationIsShorter": "Тривалість вашої аудіокниги коротша за віднайдену", "MessageYourAudiobookDurationIsShorter": "Тривалість вашої аудіокниги менша за знайдену",
"NoteChangeRootPassword": "Тільки користувач root — єдиний, хто може мати порожній пароль", "NoteChangeRootPassword": "Тільки користувач root може мати порожній пароль",
"NoteChapterEditorTimes": "Примітка: Перша глава мусить починатися з 0:00, а час початку останньої глави не може бути більшим за зазначену тривалість аудіокниги.", "NoteChapterEditorTimes": "Примітка: Перша глава повинна починатися з 0:00, а час початку останньої глави не може перевищувати тривалість цієї аудіокниги.",
"NoteFolderPicker": "Примітка: вже обрані теки не буде показано", "NoteFolderPicker": "Примітка: вже додані папки не відображаються",
"NoteRSSFeedPodcastAppsHttps": "Попередження: Більшість додатків подкастів вимагатимуть використання протоколу HTTPS від RSS-каналу", "NoteRSSFeedPodcastAppsHttps": "Попередження: більшість додатків подкастів вимагають використання HTTPS для RSS-каналу",
"NoteRSSFeedPodcastAppsPubDate": "Попередження: 1 або більше ваших епізодів не мають дати публікації. Деякі додатки подкастів вимагають це.", "NoteRSSFeedPodcastAppsPubDate": "Попередження: один або більше ваших епізодів не мають дати публікації. Деякі додатки подкастів цього вимагають.",
"NoteUploaderFoldersWithMediaFiles": "Теки з медіафайлами буде оброблено як окремі елементи бібліотеки.", "NoteUploaderFoldersWithMediaFiles": "Теки з медіафайлами обробляються як окремі елементи бібліотеки.",
"NoteUploaderOnlyAudioFiles": "Якщо завантажувати лише аудіофайли, то кожен файл буде оброблено як окрему книгу.", "NoteUploaderOnlyAudioFiles": "Якщо завантажувати лише аудіофайли, кожен файл буде окремою аудіокнигою.",
"NoteUploaderUnsupportedFiles": "Непідтримувані файли пропущено. Під час вибору або перетягування теки, файли, що знаходяться поза текою, пропускаються.", "NoteUploaderUnsupportedFiles": "Непідтримувані файли ігноруються. При виборі або перетягуванні теки, файли поза теками елементів ігноруються.",
"NotificationOnBackupCompletedDescription": "Запускається після завершення резервного копіювання", "NotificationOnBackupCompletedDescription": "Виконується після завершення резервного копіювання",
"NotificationOnBackupFailedDescription": "Срабатывает при збої резервного копіювання", "NotificationOnBackupFailedDescription": "Виконується при помилці резервного копіювання",
"NotificationOnEpisodeDownloadedDescription": "Запускається при автоматичному завантаженні епізоду подкасту", "NotificationOnEpisodeDownloadedDescription": "Виконується при автоматичному завантаженні епізоду подкасту",
"NotificationOnRSSFeedDisabledDescription": "Виконується, коли автоматичне завантаження епізодів вимкнено через забагато невдалих спроб",
"NotificationOnRSSFeedFailedDescription": "Виконується, коли запит RSS-каналу не вдається для автоматичного завантаження епізоду",
"NotificationOnTestDescription": "Подія для тестування системи сповіщень", "NotificationOnTestDescription": "Подія для тестування системи сповіщень",
"PlaceholderNewCollection": "Нова назва добірки", "PlaceholderNewCollection": "Нова назва добірки",
"PlaceholderNewFolderPath": "Новий шлях до теки", "PlaceholderNewFolderPath": "Новий шлях до теки",
@ -994,7 +997,7 @@
"ToastEncodeCancelFailed": "Не вдалося скасувати кодування", "ToastEncodeCancelFailed": "Не вдалося скасувати кодування",
"ToastEncodeCancelSucces": "Кодування скасовано", "ToastEncodeCancelSucces": "Кодування скасовано",
"ToastEpisodeDownloadQueueClearFailed": "Не вдалося очистити чергу", "ToastEpisodeDownloadQueueClearFailed": "Не вдалося очистити чергу",
"ToastEpisodeDownloadQueueClearSuccess": "Чергу на завантаження епізодів очищено", "ToastEpisodeDownloadQueueClearSuccess": "Чергу на скачування епізодів очищено",
"ToastEpisodeUpdateSuccess": "{0} епізодів оновлено", "ToastEpisodeUpdateSuccess": "{0} епізодів оновлено",
"ToastErrorCannotShare": "Не можна типово поширити на цей пристрій", "ToastErrorCannotShare": "Не можна типово поширити на цей пристрій",
"ToastFailedToLoadData": "Не вдалося завантажити дані", "ToastFailedToLoadData": "Не вдалося завантажити дані",
@ -1002,7 +1005,7 @@
"ToastFailedToShare": "Не вдалося поділитися", "ToastFailedToShare": "Не вдалося поділитися",
"ToastFailedToUpdate": "Не вдалося оновити", "ToastFailedToUpdate": "Не вдалося оновити",
"ToastInvalidImageUrl": "Невірний URL зображення", "ToastInvalidImageUrl": "Невірний URL зображення",
"ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для завантаження", "ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для скачування",
"ToastInvalidUrl": "Невірний URL", "ToastInvalidUrl": "Невірний URL",
"ToastItemCoverUpdateSuccess": "Обкладинку елемента оновлено", "ToastItemCoverUpdateSuccess": "Обкладинку елемента оновлено",
"ToastItemDeletedFailed": "Не вдалося видалити елемент", "ToastItemDeletedFailed": "Не вдалося видалити елемент",

View file

@ -21,7 +21,7 @@
"ButtonChooseFiles": "选择文件", "ButtonChooseFiles": "选择文件",
"ButtonClearFilter": "清除过滤器", "ButtonClearFilter": "清除过滤器",
"ButtonCloseFeed": "关闭源", "ButtonCloseFeed": "关闭源",
"ButtonCloseSession": "关闭开放会话", "ButtonCloseSession": "关闭活动会话",
"ButtonCollections": "收藏", "ButtonCollections": "收藏",
"ButtonConfigureScanner": "配置扫描", "ButtonConfigureScanner": "配置扫描",
"ButtonCreate": "创建", "ButtonCreate": "创建",
@ -177,6 +177,7 @@
"HeaderPlaylist": "播放列表", "HeaderPlaylist": "播放列表",
"HeaderPlaylistItems": "播放列表项目", "HeaderPlaylistItems": "播放列表项目",
"HeaderPodcastsToAdd": "要添加的播客", "HeaderPodcastsToAdd": "要添加的播客",
"HeaderPresets": "预设",
"HeaderPreviewCover": "预览封面", "HeaderPreviewCover": "预览封面",
"HeaderRSSFeedGeneral": "RSS 详细信息", "HeaderRSSFeedGeneral": "RSS 详细信息",
"HeaderRSSFeedIsOpen": "RSS 源已打开", "HeaderRSSFeedIsOpen": "RSS 源已打开",
@ -530,6 +531,7 @@
"LabelReleaseDate": "发布日期", "LabelReleaseDate": "发布日期",
"LabelRemoveAllMetadataAbs": "删除所有 metadata.abs 文件", "LabelRemoveAllMetadataAbs": "删除所有 metadata.abs 文件",
"LabelRemoveAllMetadataJson": "删除所有 metadata.json 文件", "LabelRemoveAllMetadataJson": "删除所有 metadata.json 文件",
"LabelRemoveAudibleBranding": "删除章节中的 Audible 简介和结尾",
"LabelRemoveCover": "移除封面", "LabelRemoveCover": "移除封面",
"LabelRemoveMetadataFile": "删除库项目文件夹中的元数据文件", "LabelRemoveMetadataFile": "删除库项目文件夹中的元数据文件",
"LabelRemoveMetadataFileHelp": "删除 {0} 文件夹中的所有 metadata.json 和 metadata.abs 文件.", "LabelRemoveMetadataFileHelp": "删除 {0} 文件夹中的所有 metadata.json 和 metadata.abs 文件.",
@ -706,6 +708,7 @@
"MessageAddToPlayerQueue": "添加到播放队列", "MessageAddToPlayerQueue": "添加到播放队列",
"MessageAppriseDescription": "要使用此功能,你需要运行一个 <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> 实例或一个可以处理这些相同请求的 API. <br />Apprise API Url 应该是发送通知的完整 URL 路径, 例如: 如果你的 API 实例运行在 <code>http://192.168.1.1:8337</code>, 那么你可以输入 <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "要使用此功能,你需要运行一个 <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> 实例或一个可以处理这些相同请求的 API. <br />Apprise API Url 应该是发送通知的完整 URL 路径, 例如: 如果你的 API 实例运行在 <code>http://192.168.1.1:8337</code>, 那么你可以输入 <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "确保你使用的 ASIN 来自正确的 Audible 地区, 而不是亚马逊.", "MessageAsinCheck": "确保你使用的 ASIN 来自正确的 Audible 地区, 而不是亚马逊.",
"MessageAuthenticationOIDCChangesRestart": "保存后重新启动服务器以应用 OIDC 更改.",
"MessageBackupsDescription": "备份包括用户, 用户进度, 媒体库项目详细信息, 服务器设置和图像, 存储在 <code>/metadata/items</code> & <code>/metadata/authors</code>. 备份不包括存储在你的媒体库文件夹中的任何文件.", "MessageBackupsDescription": "备份包括用户, 用户进度, 媒体库项目详细信息, 服务器设置和图像, 存储在 <code>/metadata/items</code> & <code>/metadata/authors</code>. 备份不包括存储在你的媒体库文件夹中的任何文件.",
"MessageBackupsLocationEditNote": "注意: 更新备份位置不会移动或修改现有备份", "MessageBackupsLocationEditNote": "注意: 更新备份位置不会移动或修改现有备份",
"MessageBackupsLocationNoEditNote": "注意: 备份位置是通过环境变量设置的, 不能在此处更改.", "MessageBackupsLocationNoEditNote": "注意: 备份位置是通过环境变量设置的, 不能在此处更改.",
@ -853,6 +856,7 @@
"MessageScheduleRunEveryWeekdayAtTime": "每隔 {0} 在 {1} 运行一次", "MessageScheduleRunEveryWeekdayAtTime": "每隔 {0} 在 {1} 运行一次",
"MessageSearchResultsFor": "搜索结果", "MessageSearchResultsFor": "搜索结果",
"MessageSelected": "{0} 已选择", "MessageSelected": "{0} 已选择",
"MessageSeriesSequenceCannotContainSpaces": "系列序列不能包含空格",
"MessageServerCouldNotBeReached": "无法访问服务器", "MessageServerCouldNotBeReached": "无法访问服务器",
"MessageSetChaptersFromTracksDescription": "把每个音频文件设置为章节并将章节标题设置为音频文件名", "MessageSetChaptersFromTracksDescription": "把每个音频文件设置为章节并将章节标题设置为音频文件名",
"MessageShareExpirationWillBe": "到期日期为 <strong>{0}</strong>", "MessageShareExpirationWillBe": "到期日期为 <strong>{0}</strong>",
@ -914,6 +918,8 @@
"NotificationOnBackupCompletedDescription": "备份完成时触发", "NotificationOnBackupCompletedDescription": "备份完成时触发",
"NotificationOnBackupFailedDescription": "备份失败时触发", "NotificationOnBackupFailedDescription": "备份失败时触发",
"NotificationOnEpisodeDownloadedDescription": "当播客节目自动下载时触发", "NotificationOnEpisodeDownloadedDescription": "当播客节目自动下载时触发",
"NotificationOnRSSFeedDisabledDescription": "由于尝试失败次数过多而导致剧集自动下载被禁用时触发",
"NotificationOnRSSFeedFailedDescription": "当 RSS 源请求自动下载剧集失败时触发",
"NotificationOnTestDescription": "测试通知系统的事件", "NotificationOnTestDescription": "测试通知系统的事件",
"PlaceholderNewCollection": "输入收藏夹名称", "PlaceholderNewCollection": "输入收藏夹名称",
"PlaceholderNewFolderPath": "输入文件夹路径", "PlaceholderNewFolderPath": "输入文件夹路径",
@ -971,6 +977,8 @@
"ToastCachePurgeFailed": "清除缓存失败", "ToastCachePurgeFailed": "清除缓存失败",
"ToastCachePurgeSuccess": "缓存清除成功", "ToastCachePurgeSuccess": "缓存清除成功",
"ToastChaptersHaveErrors": "章节有错误", "ToastChaptersHaveErrors": "章节有错误",
"ToastChaptersInvalidShiftAmountLast": "偏移量无效. 最后一章的开始时间将超过这本有声读物的持续时间.",
"ToastChaptersInvalidShiftAmountStart": "偏移量无效. 第一章的长度将为零或负数, 并会被第二章覆盖. 请增加第二章的起始时长.",
"ToastChaptersMustHaveTitles": "章节必须有标题", "ToastChaptersMustHaveTitles": "章节必须有标题",
"ToastChaptersRemoved": "已删除章节", "ToastChaptersRemoved": "已删除章节",
"ToastChaptersUpdated": "章节已更新", "ToastChaptersUpdated": "章节已更新",

View file

@ -4,7 +4,9 @@ const optionDefinitions = [
{ name: 'port', alias: 'p', type: String }, { name: 'port', alias: 'p', type: String },
{ name: 'host', alias: 'h', type: String }, { name: 'host', alias: 'h', type: String },
{ name: 'source', alias: 's', type: String }, { name: 'source', alias: 's', type: String },
{ name: 'dev', alias: 'd', type: Boolean } { name: 'dev', alias: 'd', type: Boolean },
// Run in production mode and use dev.js config
{ name: 'prod-with-dev-env', alias: 'r', type: Boolean }
] ]
const commandLineArgs = require('./server/libs/commandLineArgs') const commandLineArgs = require('./server/libs/commandLineArgs')
@ -17,7 +19,7 @@ const server = require('./server/Server')
global.appRoot = __dirname global.appRoot = __dirname
const isDev = process.env.NODE_ENV !== 'production' const isDev = process.env.NODE_ENV !== 'production'
if (isDev) { if (isDev || options['prod-with-dev-env']) {
const devEnv = require('./dev').config const devEnv = require('./dev').config
if (devEnv.Port) process.env.PORT = devEnv.Port if (devEnv.Port) process.env.PORT = devEnv.Port
if (devEnv.ConfigPath) process.env.CONFIG_PATH = devEnv.ConfigPath if (devEnv.ConfigPath) process.env.CONFIG_PATH = devEnv.ConfigPath
@ -28,6 +30,7 @@ if (isDev) {
if (devEnv.SkipBinariesCheck) process.env.SKIP_BINARIES_CHECK = '1' if (devEnv.SkipBinariesCheck) process.env.SKIP_BINARIES_CHECK = '1'
if (devEnv.AllowIframe) process.env.ALLOW_IFRAME = '1' if (devEnv.AllowIframe) process.env.ALLOW_IFRAME = '1'
if (devEnv.BackupPath) process.env.BACKUP_PATH = devEnv.BackupPath if (devEnv.BackupPath) process.env.BACKUP_PATH = devEnv.BackupPath
if (devEnv.ReactClientPath) process.env.REACT_CLIENT_PATH = devEnv.ReactClientPath
process.env.SOURCE = 'local' process.env.SOURCE = 'local'
process.env.ROUTER_BASE_PATH = devEnv.RouterBasePath ?? '/audiobookshelf' process.env.ROUTER_BASE_PATH = devEnv.RouterBasePath ?? '/audiobookshelf'
} }

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "audiobookshelf", "name": "audiobookshelf",
"version": "2.23.0", "version": "2.25.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "audiobookshelf", "name": "audiobookshelf",
"version": "2.23.0", "version": "2.25.1",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"axios": "^0.27.2", "axios": "^0.27.2",

View file

@ -1,12 +1,13 @@
{ {
"name": "audiobookshelf", "name": "audiobookshelf",
"version": "2.23.0", "version": "2.25.1",
"buildNumber": 1, "buildNumber": 1,
"description": "Self-hosted audiobook and podcast server", "description": "Self-hosted audiobook and podcast server",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"dev": "nodemon --watch server index.js -- --dev", "dev": "nodemon --watch server index.js -- --dev",
"start": "node index.js", "start": "node index.js",
"start-dev": "node index.js --prod-with-dev-env",
"client": "cd client && npm ci && npm run generate", "client": "cd client && npm ci && npm run generate",
"prod": "npm run client && npm ci && node index.js", "prod": "npm run client && npm ci && node index.js",
"build-win": "npm run client && pkg -t node20-win-x64 -o ./dist/win/audiobookshelf -C GZip .", "build-win": "npm run client && pkg -t node20-win-x64 -o ./dist/win/audiobookshelf -C GZip .",

View file

@ -442,7 +442,17 @@ class Auth {
// Local strategy login route (takes username and password) // Local strategy login route (takes username and password)
router.post('/login', passport.authenticate('local'), async (req, res) => { router.post('/login', passport.authenticate('local'), async (req, res) => {
// return the user login response json if the login was successfull // return the user login response json if the login was successfull
res.json(await this.getUserLoginResponsePayload(req.user)) const userResponse = await this.getUserLoginResponsePayload(req.user)
// Experimental Next.js client uses bearer token in cookies
res.cookie('auth_token', userResponse.user.token, {
httpOnly: true,
secure: req.secure || req.get('x-forwarded-proto') === 'https',
sameSite: 'strict',
maxAge: 1000 * 60 * 60 * 24 * 7 // 7 days
})
res.json(userResponse)
}) })
// openid strategy login route (this redirects to the configured openid login provider) // openid strategy login route (this redirects to the configured openid login provider)
@ -718,6 +728,7 @@ class Auth {
const authMethod = req.cookies.auth_method const authMethod = req.cookies.auth_method
res.clearCookie('auth_method') res.clearCookie('auth_method')
res.clearCookie('auth_token')
let logoutUrl = null let logoutUrl = null

View file

@ -765,6 +765,26 @@ class Database {
if (badSessionsRemoved > 0) { if (badSessionsRemoved > 0) {
Logger.warn(`Removed ${badSessionsRemoved} sessions that were 3 seconds or less`) Logger.warn(`Removed ${badSessionsRemoved} sessions that were 3 seconds or less`)
} }
// Remove mediaProgresses with duplicate mediaItemId (remove the oldest updatedAt or if updatedAt is the same, remove arbitrary one)
const [duplicateMediaProgresses] = await this.sequelize.query(`SELECT mp1.id, mp1.mediaItemId
FROM mediaProgresses mp1
WHERE EXISTS (
SELECT 1
FROM mediaProgresses mp2
WHERE mp2.mediaItemId = mp1.mediaItemId
AND mp2.userId = mp1.userId
AND (
mp2.updatedAt > mp1.updatedAt
OR (mp2.updatedAt = mp1.updatedAt AND mp2.id < mp1.id)
)
)`)
for (const duplicateMediaProgress of duplicateMediaProgresses) {
Logger.warn(`Found duplicate mediaProgress for mediaItem "${duplicateMediaProgress.mediaItemId}" - removing it`)
await this.mediaProgressModel.destroy({
where: { id: duplicateMediaProgress.id }
})
}
} }
async createTextSearchQuery(query) { async createTextSearchQuery(query) {

View file

@ -12,6 +12,7 @@ const { version } = require('../package.json')
// Utils // Utils
const fileUtils = require('./utils/fileUtils') const fileUtils = require('./utils/fileUtils')
const { toNumber } = require('./utils/index')
const Logger = require('./Logger') const Logger = require('./Logger')
const Auth = require('./Auth') const Auth = require('./Auth')
@ -84,12 +85,8 @@ class Server {
global.DisableSsrfRequestFilter = (url) => whitelistedUrls.includes(new URL(url).hostname) global.DisableSsrfRequestFilter = (url) => whitelistedUrls.includes(new URL(url).hostname)
} }
} }
global.PodcastDownloadTimeout = toNumber(process.env.PODCAST_DOWNLOAD_TIMEOUT, 30000)
if (process.env.PODCAST_DOWNLOAD_TIMEOUT) { global.MaxFailedEpisodeChecks = toNumber(process.env.MAX_FAILED_EPISODE_CHECKS, 24)
global.PodcastDownloadTimeout = process.env.PODCAST_DOWNLOAD_TIMEOUT
} else {
global.PodcastDownloadTimeout = 30000
}
if (!fs.pathExistsSync(global.ConfigPath)) { if (!fs.pathExistsSync(global.ConfigPath)) {
fs.mkdirSync(global.ConfigPath) fs.mkdirSync(global.ConfigPath)
@ -223,6 +220,7 @@ class Server {
async start() { async start() {
Logger.info('=== Starting Server ===') Logger.info('=== Starting Server ===')
this.initProcessEventListeners() this.initProcessEventListeners()
await this.init() await this.init()
@ -284,6 +282,7 @@ class Server {
await this.auth.initPassportJs() await this.auth.initPassportJs()
const router = express.Router() const router = express.Router()
// if RouterBasePath is set, modify all requests to include the base path // if RouterBasePath is set, modify all requests to include the base path
app.use((req, res, next) => { app.use((req, res, next) => {
const urlStartsWithRouterBasePath = req.url.startsWith(global.RouterBasePath) const urlStartsWithRouterBasePath = req.url.startsWith(global.RouterBasePath)
@ -310,16 +309,12 @@ class Server {
}) })
) )
router.use(express.urlencoded({ extended: true, limit: '5mb' })) router.use(express.urlencoded({ extended: true, limit: '5mb' }))
router.use(express.json({ limit: '5mb' })) router.use(express.json({ limit: '10mb' }))
router.use('/api', this.auth.ifAuthNeeded(this.authMiddleware.bind(this)), this.apiRouter.router) router.use('/api', this.auth.ifAuthNeeded(this.authMiddleware.bind(this)), this.apiRouter.router)
router.use('/hls', this.hlsRouter.router) router.use('/hls', this.hlsRouter.router)
router.use('/public', this.publicRouter.router) router.use('/public', this.publicRouter.router)
// Static path to generated nuxt
const distPath = Path.join(global.appRoot, '/client/dist')
router.use(express.static(distPath))
// Static folder // Static folder
router.use(express.static(Path.join(global.appRoot, 'static'))) router.use(express.static(Path.join(global.appRoot, 'static')))
@ -339,32 +334,6 @@ class Server {
// Auth routes // Auth routes
await this.auth.initAuthRoutes(router) await this.auth.initAuthRoutes(router)
// Client dynamic routes
const dynamicRoutes = [
'/item/:id',
'/author/:id',
'/audiobook/:id/chapters',
'/audiobook/:id/edit',
'/audiobook/:id/manage',
'/library/:library',
'/library/:library/search',
'/library/:library/bookshelf/:id?',
'/library/:library/authors',
'/library/:library/narrators',
'/library/:library/stats',
'/library/:library/series/:id?',
'/library/:library/podcast/search',
'/library/:library/podcast/latest',
'/library/:library/podcast/download-queue',
'/config/users/:id',
'/config/users/:id/sessions',
'/config/item-metadata-utils/:id',
'/collection/:id',
'/playlist/:id',
'/share/:slug'
]
dynamicRoutes.forEach((route) => router.get(route, (req, res) => res.sendFile(Path.join(distPath, 'index.html'))))
router.post('/init', (req, res) => { router.post('/init', (req, res) => {
if (Database.hasRootUser) { if (Database.hasRootUser) {
Logger.error(`[Server] attempt to init server when server already has a root user`) Logger.error(`[Server] attempt to init server when server already has a root user`)
@ -395,6 +364,48 @@ class Server {
}) })
router.get('/healthcheck', (req, res) => res.sendStatus(200)) router.get('/healthcheck', (req, res) => res.sendStatus(200))
const ReactClientPath = process.env.REACT_CLIENT_PATH
if (!ReactClientPath) {
// Static path to generated nuxt
const distPath = Path.join(global.appRoot, '/client/dist')
router.use(express.static(distPath))
// Client dynamic routes
const dynamicRoutes = [
'/item/:id',
'/author/:id',
'/audiobook/:id/chapters',
'/audiobook/:id/edit',
'/audiobook/:id/manage',
'/library/:library',
'/library/:library/search',
'/library/:library/bookshelf/:id?',
'/library/:library/authors',
'/library/:library/narrators',
'/library/:library/stats',
'/library/:library/series/:id?',
'/library/:library/podcast/search',
'/library/:library/podcast/latest',
'/library/:library/podcast/download-queue',
'/config/users/:id',
'/config/users/:id/sessions',
'/config/item-metadata-utils/:id',
'/collection/:id',
'/playlist/:id',
'/share/:slug'
]
dynamicRoutes.forEach((route) => router.get(route, (req, res) => res.sendFile(Path.join(distPath, 'index.html'))))
} else {
// This is for using the experimental Next.js client
Logger.info(`Using React client at ${ReactClientPath}`)
const nextPath = Path.join(ReactClientPath, 'node_modules/next')
const next = require(nextPath)
const nextApp = next({ dev: Logger.isDev, dir: ReactClientPath })
const handle = nextApp.getRequestHandler()
await nextApp.prepare()
router.get('*', (req, res) => handle(req, res))
}
const unixSocketPrefix = 'unix/' const unixSocketPrefix = 'unix/'
if (this.Host?.startsWith(unixSocketPrefix)) { if (this.Host?.startsWith(unixSocketPrefix)) {
const sockPath = this.Host.slice(unixSocketPrefix.length) const sockPath = this.Host.slice(unixSocketPrefix.length)

View file

@ -84,49 +84,73 @@ class FileSystemController {
*/ */
async checkPathExists(req, res) { async checkPathExists(req, res) {
if (!req.user.canUpload) { if (!req.user.canUpload) {
Logger.error(`[FileSystemController] Non-admin user "${req.user.username}" attempting to check path exists`) Logger.error(`[FileSystemController] User "${req.user.username}" without upload permissions attempting to check path exists`)
return res.sendStatus(403) return res.sendStatus(403)
} }
const { filepath, directory, folderPath } = req.body const { directory, folderPath } = req.body
if (!directory?.length || typeof directory !== 'string' || !folderPath?.length || typeof folderPath !== 'string') {
Logger.error(`[FileSystemController] Invalid request body: ${JSON.stringify(req.body)}`)
return res.status(400).json({
error: 'Invalid request body'
})
}
if (!filepath?.length || typeof filepath !== 'string') { // Check that library folder exists
const libraryFolder = await Database.libraryFolderModel.findOne({
where: {
path: folderPath
}
})
if (!libraryFolder) {
Logger.error(`[FileSystemController] Library folder not found: ${folderPath}`)
return res.sendStatus(404)
}
if (!req.user.checkCanAccessLibrary(libraryFolder.libraryId)) {
Logger.error(`[FileSystemController] User "${req.user.username}" attempting to check path exists for library "${libraryFolder.libraryId}" without access`)
return res.sendStatus(403)
}
let filepath = Path.join(libraryFolder.path, directory)
filepath = fileUtils.filePathToPOSIX(filepath)
// Ensure filepath is inside library folder (prevents directory traversal)
if (!filepath.startsWith(libraryFolder.path)) {
Logger.error(`[FileSystemController] Filepath is not inside library folder: ${filepath}`)
return res.sendStatus(400) return res.sendStatus(400)
} }
const exists = await fs.pathExists(filepath) if (await fs.pathExists(filepath)) {
if (exists) {
return res.json({ return res.json({
exists: true exists: true
}) })
} }
// If directory and folderPath are passed in, check if a library item exists in a subdirectory // Check if a library item exists in a subdirectory
// See: https://github.com/advplyr/audiobookshelf/issues/4146 // See: https://github.com/advplyr/audiobookshelf/issues/4146
if (typeof directory === 'string' && typeof folderPath === 'string' && directory.length > 0 && folderPath.length > 0) { const cleanedDirectory = directory.split('/').filter(Boolean).join('/')
const cleanedDirectory = directory.split('/').filter(Boolean).join('/') if (cleanedDirectory.includes('/')) {
if (cleanedDirectory.includes('/')) { // Can only be 2 levels deep
// Can only be 2 levels deep const possiblePaths = []
const possiblePaths = [] const subdir = Path.dirname(directory)
const subdir = Path.dirname(directory) possiblePaths.push(fileUtils.filePathToPOSIX(Path.join(folderPath, subdir)))
possiblePaths.push(fileUtils.filePathToPOSIX(Path.join(folderPath, subdir))) if (subdir.includes('/')) {
if (subdir.includes('/')) { possiblePaths.push(fileUtils.filePathToPOSIX(Path.join(folderPath, Path.dirname(subdir))))
possiblePaths.push(fileUtils.filePathToPOSIX(Path.join(folderPath, Path.dirname(subdir)))) }
}
const libraryItem = await Database.libraryItemModel.findOne({ const libraryItem = await Database.libraryItemModel.findOne({
where: { where: {
path: possiblePaths path: possiblePaths
} }
})
if (libraryItem) {
return res.json({
exists: true,
libraryItemTitle: libraryItem.title
}) })
if (libraryItem) {
return res.json({
exists: true,
libraryItemTitle: libraryItem.title
})
}
} }
} }

View file

@ -59,6 +59,12 @@ class MiscController {
if (!library) { if (!library) {
return res.status(404).send('Library not found') return res.status(404).send('Library not found')
} }
if (!req.user.checkCanAccessLibrary(library.id)) {
Logger.error(`[MiscController] User "${req.user.username}" attempting to upload to library "${library.id}" without access`)
return res.sendStatus(403)
}
const folder = library.libraryFolders.find((fold) => fold.id === folderId) const folder = library.libraryFolders.find((fold) => fold.id === folderId)
if (!folder) { if (!folder) {
return res.status(404).send('Folder not found') return res.status(404).send('Folder not found')

View file

@ -9,6 +9,7 @@ const fs = require('../libs/fsExtra')
const { getPodcastFeed, findMatchingEpisodes } = require('../utils/podcastUtils') const { getPodcastFeed, findMatchingEpisodes } = require('../utils/podcastUtils')
const { getFileTimestampsWithIno, filePathToPOSIX } = require('../utils/fileUtils') const { getFileTimestampsWithIno, filePathToPOSIX } = require('../utils/fileUtils')
const { validateUrl } = require('../utils/index') const { validateUrl } = require('../utils/index')
const htmlSanitizer = require('../utils/htmlSanitizer')
const Scanner = require('../scanner/Scanner') const Scanner = require('../scanner/Scanner')
const CoverManager = require('../managers/CoverManager') const CoverManager = require('../managers/CoverManager')
@ -404,6 +405,15 @@ class PodcastController {
const supportedStringKeys = ['title', 'subtitle', 'description', 'pubDate', 'episode', 'season', 'episodeType'] const supportedStringKeys = ['title', 'subtitle', 'description', 'pubDate', 'episode', 'season', 'episodeType']
for (const key in req.body) { for (const key in req.body) {
if (supportedStringKeys.includes(key) && typeof req.body[key] === 'string') { if (supportedStringKeys.includes(key) && typeof req.body[key] === 'string') {
// Sanitize description HTML
if (key === 'description' && req.body[key]) {
const sanitizedDescription = htmlSanitizer.sanitize(req.body[key])
if (sanitizedDescription !== req.body[key]) {
Logger.debug(`[PodcastController] Sanitized description from "${req.body[key]}" to "${sanitizedDescription}"`)
req.body[key] = sanitizedDescription
}
}
updatePayload[key] = req.body[key] updatePayload[key] = req.body[key]
} else if (key === 'chapters' && Array.isArray(req.body[key]) && req.body[key].every((ch) => typeof ch === 'object' && ch.title && ch.start)) { } else if (key === 'chapters' && Array.isArray(req.body[key]) && req.body[key].every((ch) => typeof ch === 'object' && ch.title && ch.start)) {
updatePayload[key] = req.body[key] updatePayload[key] = req.body[key]

File diff suppressed because one or more lines are too long

View file

@ -203,7 +203,15 @@ class AbMergeManager {
// Move library item tracks to cache // Move library item tracks to cache
for (const [index, trackPath] of task.data.originalTrackPaths.entries()) { for (const [index, trackPath] of task.data.originalTrackPaths.entries()) {
const trackFilename = Path.basename(trackPath) const trackFilename = Path.basename(trackPath)
const moveToPath = Path.join(task.data.itemCachePath, trackFilename) let moveToPath = Path.join(task.data.itemCachePath, trackFilename)
// If the track is the same as the temp file, we need to rename it to avoid overwriting it
if (task.data.tempFilepath === moveToPath) {
const trackExtname = Path.extname(task.data.tempFilepath)
const newTrackFilename = Path.basename(task.data.tempFilepath, trackExtname) + '.backup' + trackExtname
moveToPath = Path.join(task.data.itemCachePath, newTrackFilename)
}
Logger.debug(`[AbMergeManager] Backing up original track "${trackPath}" to ${moveToPath}`) Logger.debug(`[AbMergeManager] Backing up original track "${trackPath}" to ${moveToPath}`)
if (index === 0) { if (index === 0) {
// copy the first track to the cache directory // copy the first track to the cache directory

View file

@ -71,6 +71,54 @@ class NotificationManager {
this.triggerNotification('onBackupCompleted', eventData) this.triggerNotification('onBackupCompleted', eventData)
} }
/**
* Handles scheduled episode download RSS feed request failed
*
* @param {string} feedUrl
* @param {number} numFailed
* @param {string} title
*/
async onRSSFeedFailed(feedUrl, numFailed, title) {
if (!Database.notificationSettings.isUseable) return
if (!Database.notificationSettings.getHasActiveNotificationsForEvent('onRSSFeedFailed')) {
Logger.debug(`[NotificationManager] onRSSFeedFailed: No active notifications`)
return
}
Logger.debug(`[NotificationManager] onRSSFeedFailed: RSS feed request failed for ${feedUrl}`)
const eventData = {
feedUrl: feedUrl,
numFailed: numFailed || 0,
title: title || 'Unknown Title'
}
this.triggerNotification('onRSSFeedFailed', eventData)
}
/**
* Handles scheduled episode downloads disabled due to too many failed attempts
*
* @param {string} feedUrl
* @param {number} numFailed
* @param {string} title
*/
async onRSSFeedDisabled(feedUrl, numFailed, title) {
if (!Database.notificationSettings.isUseable) return
if (!Database.notificationSettings.getHasActiveNotificationsForEvent('onRSSFeedDisabled')) {
Logger.debug(`[NotificationManager] onRSSFeedDisabled: No active notifications`)
return
}
Logger.debug(`[NotificationManager] onRSSFeedDisabled: Podcast scheduled episode download disabled due to ${numFailed} failed requests for ${feedUrl}`)
const eventData = {
feedUrl: feedUrl,
numFailed: numFailed || 0,
title: title || 'Unknown Title'
}
this.triggerNotification('onRSSFeedDisabled', eventData)
}
/** /**
* *
* @param {string} errorMsg * @param {string} errorMsg

View file

@ -107,7 +107,7 @@ class PlaybackSessionManager {
const syncResults = [] const syncResults = []
for (const sessionJson of sessions) { for (const sessionJson of sessions) {
Logger.info(`[PlaybackSessionManager] Syncing local session "${sessionJson.displayTitle}" (${sessionJson.id})`) Logger.info(`[PlaybackSessionManager] Syncing local session "${sessionJson.displayTitle}" (${sessionJson.id}) (updatedAt: ${sessionJson.updatedAt})`)
const result = await this.syncLocalSession(user, sessionJson, deviceInfo) const result = await this.syncLocalSession(user, sessionJson, deviceInfo)
syncResults.push(result) syncResults.push(result)
} }
@ -230,9 +230,9 @@ class PlaybackSessionManager {
let userProgressForItem = user.getMediaProgress(mediaItemId) let userProgressForItem = user.getMediaProgress(mediaItemId)
if (userProgressForItem) { if (userProgressForItem) {
if (userProgressForItem.updatedAt.valueOf() > session.updatedAt) { if (userProgressForItem.updatedAt.valueOf() > session.updatedAt) {
Logger.debug(`[PlaybackSessionManager] Not updating progress for "${session.displayTitle}" because it has been updated more recently`) Logger.info(`[PlaybackSessionManager] Not updating progress for "${session.displayTitle}" because it has been updated more recently (${userProgressForItem.updatedAt.valueOf()} > ${session.updatedAt}) (incoming currentTime: ${session.currentTime}) (current currentTime: ${userProgressForItem.currentTime})`)
} else { } else {
Logger.debug(`[PlaybackSessionManager] Updating progress for "${session.displayTitle}" with current time ${session.currentTime} (previously ${userProgressForItem.currentTime})`) Logger.info(`[PlaybackSessionManager] Updating progress for "${session.displayTitle}" with current time ${session.currentTime} (previously ${userProgressForItem.currentTime})`)
const updateResponse = await user.createUpdateMediaProgressFromPayload({ const updateResponse = await user.createUpdateMediaProgressFromPayload({
libraryItemId: libraryItem.id, libraryItemId: libraryItem.id,
episodeId: session.episodeId, episodeId: session.episodeId,
@ -246,7 +246,7 @@ class PlaybackSessionManager {
} }
} }
} else { } else {
Logger.debug(`[PlaybackSessionManager] Creating new media progress for media item "${session.displayTitle}"`) Logger.info(`[PlaybackSessionManager] Creating new media progress for media item "${session.displayTitle}"`)
const updateResponse = await user.createUpdateMediaProgressFromPayload({ const updateResponse = await user.createUpdateMediaProgressFromPayload({
libraryItemId: libraryItem.id, libraryItemId: libraryItem.id,
episodeId: session.episodeId, episodeId: session.episodeId,

View file

@ -30,7 +30,7 @@ class PodcastManager {
this.currentDownload = null this.currentDownload = null
this.failedCheckMap = {} this.failedCheckMap = {}
this.MaxFailedEpisodeChecks = 24 this.MaxFailedEpisodeChecks = global.MaxFailedEpisodeChecks
} }
getEpisodeDownloadsInQueue(libraryItemId) { getEpisodeDownloadsInQueue(libraryItemId) {
@ -345,12 +345,14 @@ class PodcastManager {
// Allow up to MaxFailedEpisodeChecks failed attempts before disabling auto download // Allow up to MaxFailedEpisodeChecks failed attempts before disabling auto download
if (!this.failedCheckMap[libraryItem.id]) this.failedCheckMap[libraryItem.id] = 0 if (!this.failedCheckMap[libraryItem.id]) this.failedCheckMap[libraryItem.id] = 0
this.failedCheckMap[libraryItem.id]++ this.failedCheckMap[libraryItem.id]++
if (this.failedCheckMap[libraryItem.id] >= this.MaxFailedEpisodeChecks) { if (this.MaxFailedEpisodeChecks !== 0 && this.failedCheckMap[libraryItem.id] >= this.MaxFailedEpisodeChecks) {
Logger.error(`[PodcastManager] runEpisodeCheck ${this.failedCheckMap[libraryItem.id]} failed attempts at checking episodes for "${libraryItem.media.title}" - disabling auto download`) Logger.error(`[PodcastManager] runEpisodeCheck ${this.failedCheckMap[libraryItem.id]} failed attempts at checking episodes for "${libraryItem.media.title}" - disabling auto download`)
void NotificationManager.onRSSFeedDisabled(libraryItem.media.feedURL, this.failedCheckMap[libraryItem.id], libraryItem.media.title)
libraryItem.media.autoDownloadEpisodes = false libraryItem.media.autoDownloadEpisodes = false
delete this.failedCheckMap[libraryItem.id] delete this.failedCheckMap[libraryItem.id]
} else { } else {
Logger.warn(`[PodcastManager] runEpisodeCheck ${this.failedCheckMap[libraryItem.id]} failed attempts at checking episodes for "${libraryItem.media.title}"`) Logger.warn(`[PodcastManager] runEpisodeCheck ${this.failedCheckMap[libraryItem.id]} failed attempts at checking episodes for "${libraryItem.media.title}"`)
void NotificationManager.onRSSFeedFailed(libraryItem.media.feedURL, this.failedCheckMap[libraryItem.id], libraryItem.media.title)
} }
} else if (newEpisodes.length) { } else if (newEpisodes.length) {
delete this.failedCheckMap[libraryItem.id] delete this.failedCheckMap[libraryItem.id]
@ -384,7 +386,17 @@ class PodcastManager {
Logger.error(`[PodcastManager] checkPodcastForNewEpisodes no feed url for ${podcastLibraryItem.media.title} (ID: ${podcastLibraryItem.id})`) Logger.error(`[PodcastManager] checkPodcastForNewEpisodes no feed url for ${podcastLibraryItem.media.title} (ID: ${podcastLibraryItem.id})`)
return null return null
} }
const feed = await getPodcastFeed(podcastLibraryItem.media.feedURL) const feed = await Promise.race([
getPodcastFeed(podcastLibraryItem.media.feedURL),
new Promise((_, reject) =>
// The added second is to make sure that axios can fail first and only falls back later
setTimeout(() => reject(new Error('Timeout. getPodcastFeed seemed to timeout but not triggering the timeout.')), global.PodcastDownloadTimeout + 1000)
)
]).catch((error) => {
Logger.error(`[PodcastManager] checkPodcastForNewEpisodes failed to fetch feed for ${podcastLibraryItem.media.title} (ID: ${podcastLibraryItem.id}):`, error)
return null
})
if (!feed?.episodes) { if (!feed?.episodes) {
Logger.error(`[PodcastManager] checkPodcastForNewEpisodes invalid feed payload for ${podcastLibraryItem.media.title} (ID: ${podcastLibraryItem.id})`, feed) Logger.error(`[PodcastManager] checkPodcastForNewEpisodes invalid feed payload for ${podcastLibraryItem.media.title} (ID: ${podcastLibraryItem.id})`, feed)
return null return null

View file

@ -377,8 +377,17 @@ class Book extends Model {
if (typeof payload.metadata[key] == 'number') { if (typeof payload.metadata[key] == 'number') {
payload.metadata[key] = String(payload.metadata[key]) payload.metadata[key] = String(payload.metadata[key])
} }
if ((typeof payload.metadata[key] === 'string' || payload.metadata[key] === null) && this[key] !== payload.metadata[key]) { if ((typeof payload.metadata[key] === 'string' || payload.metadata[key] === null) && this[key] !== payload.metadata[key]) {
// Sanitize description HTML
if (key === 'description' && payload.metadata[key]) {
const sanitizedDescription = htmlSanitizer.sanitize(payload.metadata[key])
if (sanitizedDescription !== payload.metadata[key]) {
Logger.debug(`[Book] "${this.title}" Sanitized description from "${payload.metadata[key]}" to "${sanitizedDescription}"`)
payload.metadata[key] = sanitizedDescription
}
}
this[key] = payload.metadata[key] || null this[key] = payload.metadata[key] || null
if (key === 'title') { if (key === 'title') {

View file

@ -183,7 +183,7 @@ class MediaProgress extends Model {
* @param {import('./User').ProgressUpdatePayload} progressPayload * @param {import('./User').ProgressUpdatePayload} progressPayload
* @returns {Promise<MediaProgress>} * @returns {Promise<MediaProgress>}
*/ */
applyProgressUpdate(progressPayload) { async applyProgressUpdate(progressPayload) {
if (!this.extraData) this.extraData = {} if (!this.extraData) this.extraData = {}
if (progressPayload.isFinished !== undefined) { if (progressPayload.isFinished !== undefined) {
if (progressPayload.isFinished && !this.isFinished) { if (progressPayload.isFinished && !this.isFinished) {
@ -222,13 +222,13 @@ class MediaProgress extends Model {
const markAsFinishedPercentComplete = Number(progressPayload.markAsFinishedPercentComplete) / 100 const markAsFinishedPercentComplete = Number(progressPayload.markAsFinishedPercentComplete) / 100
shouldMarkAsFinished = markAsFinishedPercentComplete < this.progress shouldMarkAsFinished = markAsFinishedPercentComplete < this.progress
if (shouldMarkAsFinished) { if (shouldMarkAsFinished) {
Logger.debug(`[MediaProgress] Marking media progress as finished because progress (${this.progress}) is greater than ${markAsFinishedPercentComplete}`) Logger.info(`[MediaProgress] Marking media progress as finished because progress (${this.progress}) is greater than ${markAsFinishedPercentComplete} (media item ${this.mediaItemId})`)
} }
} else { } else {
const markAsFinishedTimeRemaining = isNullOrNaN(progressPayload.markAsFinishedTimeRemaining) ? 10 : Number(progressPayload.markAsFinishedTimeRemaining) const markAsFinishedTimeRemaining = isNullOrNaN(progressPayload.markAsFinishedTimeRemaining) ? 10 : Number(progressPayload.markAsFinishedTimeRemaining)
shouldMarkAsFinished = timeRemaining < markAsFinishedTimeRemaining shouldMarkAsFinished = timeRemaining < markAsFinishedTimeRemaining
if (shouldMarkAsFinished) { if (shouldMarkAsFinished) {
Logger.debug(`[MediaProgress] Marking media progress as finished because time remaining (${timeRemaining}) is less than ${markAsFinishedTimeRemaining} seconds`) Logger.info(`[MediaProgress] Marking media progress as finished because time remaining (${timeRemaining}) is less than ${markAsFinishedTimeRemaining} seconds (media item ${this.mediaItemId})`)
} }
} }
} }
@ -243,12 +243,23 @@ class MediaProgress extends Model {
this.finishedAt = null this.finishedAt = null
} }
await this.save()
// For local sync // For local sync
if (progressPayload.lastUpdate) { if (progressPayload.lastUpdate) {
this.updatedAt = progressPayload.lastUpdate if (isNaN(new Date(progressPayload.lastUpdate))) {
Logger.warn(`[MediaProgress] Invalid date provided for lastUpdate: ${progressPayload.lastUpdate} (media item ${this.mediaItemId})`)
} else {
const escapedDate = this.sequelize.escape(new Date(progressPayload.lastUpdate))
Logger.info(`[MediaProgress] Manually setting updatedAt to ${escapedDate} (media item ${this.mediaItemId})`)
await this.sequelize.query(`UPDATE "mediaProgresses" SET "updatedAt" = ${escapedDate} WHERE "id" = '${this.id}'`)
await this.reload()
}
} }
return this.save() return this
} }
} }

View file

@ -2,6 +2,7 @@ const { DataTypes, Model } = require('sequelize')
const { getTitlePrefixAtEnd, getTitleIgnorePrefix } = require('../utils') const { getTitlePrefixAtEnd, getTitleIgnorePrefix } = require('../utils')
const Logger = require('../Logger') const Logger = require('../Logger')
const libraryItemsPodcastFilters = require('../utils/queries/libraryItemsPodcastFilters') const libraryItemsPodcastFilters = require('../utils/queries/libraryItemsPodcastFilters')
const htmlSanitizer = require('../utils/htmlSanitizer')
/** /**
* @typedef PodcastExpandedProperties * @typedef PodcastExpandedProperties
@ -215,6 +216,15 @@ class Podcast extends Model {
newKey = 'itunesPageURL' newKey = 'itunesPageURL'
} }
if ((typeof payload.metadata[key] === 'string' || payload.metadata[key] === null) && payload.metadata[key] !== this[newKey]) { if ((typeof payload.metadata[key] === 'string' || payload.metadata[key] === null) && payload.metadata[key] !== this[newKey]) {
// Sanitize description HTML
if (key === 'description' && payload.metadata[key]) {
const sanitizedDescription = htmlSanitizer.sanitize(payload.metadata[key])
if (sanitizedDescription !== payload.metadata[key]) {
Logger.debug(`[Podcast] "${this.title}" Sanitized description from "${payload.metadata[key]}" to "${sanitizedDescription}"`)
payload.metadata[key] = sanitizedDescription
}
}
this[newKey] = payload.metadata[key] || null this[newKey] = payload.metadata[key] || null
if (key === 'title') { if (key === 'title') {

View file

@ -41,7 +41,7 @@ class Audible {
} }
cleanResult(item) { cleanResult(item) {
const { title, subtitle, asin, authors, narrators, publisherName, summary, releaseDate, image, genres, seriesPrimary, seriesSecondary, language, runtimeLengthMin, formatType } = item const { title, subtitle, asin, authors, narrators, publisherName, summary, releaseDate, image, genres, seriesPrimary, seriesSecondary, language, runtimeLengthMin, formatType, isbn } = item
const series = [] const series = []
if (seriesPrimary) { if (seriesPrimary) {
@ -70,6 +70,7 @@ class Audible {
description: summary || null, description: summary || null,
cover: image, cover: image,
asin, asin,
isbn,
genres: genresFiltered.length ? genresFiltered : null, genres: genresFiltered.length ? genresFiltered : null,
tags: tagsFiltered.length ? tagsFiltered.join(', ') : null, tags: tagsFiltered.length ? tagsFiltered.join(', ') : null,
series: series.length ? series : null, series: series.length ? series : null,

View file

@ -52,9 +52,7 @@ class FantLab {
return [] return []
}) })
return Promise.all(items.map(async (item) => await this.getWork(item, timeout))).then((resArray) => { return Promise.all(items.map(async (item) => await this.getWork(item, timeout))).then((resArray) => resArray.filter(Boolean))
return resArray.filter((res) => res)
})
} }
/** /**
@ -83,6 +81,10 @@ class FantLab {
return null return null
}) })
if (!bookData) {
return null
}
return this.cleanBookData(bookData, timeout) return this.cleanBookData(bookData, timeout)
} }

View file

@ -206,6 +206,11 @@ class LibraryItemScanner {
async scanPotentialNewLibraryItem(libraryItemPath, library, folder, isSingleMediaItem) { async scanPotentialNewLibraryItem(libraryItemPath, library, folder, isSingleMediaItem) {
const libraryItemScanData = await this.getLibraryItemScanData(libraryItemPath, library, folder, isSingleMediaItem) const libraryItemScanData = await this.getLibraryItemScanData(libraryItemPath, library, folder, isSingleMediaItem)
if (!libraryItemScanData.libraryFiles.length) {
Logger.info(`[LibraryItemScanner] Library item at path "${libraryItemPath}" has no files - ignoring`)
return null
}
const scanLogger = new ScanLogger() const scanLogger = new ScanLogger()
scanLogger.verbose = true scanLogger.verbose = true
scanLogger.setData('libraryItem', libraryItemScanData.relPath) scanLogger.setData('libraryItem', libraryItemScanData.relPath)

View file

@ -606,6 +606,11 @@ class LibraryScanner {
} else if (library.settings.audiobooksOnly && !hasAudioFiles(fileUpdateGroup, itemDir)) { } else if (library.settings.audiobooksOnly && !hasAudioFiles(fileUpdateGroup, itemDir)) {
Logger.debug(`[LibraryScanner] Folder update for relative path "${itemDir}" has no audio files`) Logger.debug(`[LibraryScanner] Folder update for relative path "${itemDir}" has no audio files`)
continue continue
} else if (!(await fs.pathExists(fullPath))) {
Logger.info(`[LibraryScanner] File update group "${itemDir}" does not exist - ignoring`)
itemGroupingResults[itemDir] = ScanResult.NOTHING
continue
} }
// Check if a library item is a subdirectory of this dir // Check if a library item is a subdirectory of this dir

View file

@ -370,7 +370,7 @@ class Scanner {
let numEpisodesUpdated = 0 let numEpisodesUpdated = 0
for (const episode of episodesToQuickMatch) { for (const episode of episodesToQuickMatch) {
const episodeMatches = findMatchingEpisodesInFeed(feed, episode.title) const episodeMatches = findMatchingEpisodesInFeed(feed, episode.title, 0.1)
if (episodeMatches?.length) { if (episodeMatches?.length) {
const wasUpdated = await this.updateEpisodeWithMatch(episode, episodeMatches[0].episode, options) const wasUpdated = await this.updateEpisodeWithMatch(episode, episodeMatches[0].episode, options)
if (wasUpdated) numEpisodesUpdated++ if (wasUpdated) numEpisodesUpdated++

View file

@ -103,18 +103,39 @@ module.exports.resizeImage = resizeImage
*/ */
module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => { module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const response = await axios({ // Some podcasts fail due to user agent strings
url: podcastEpisodeDownload.url, // See: https://github.com/advplyr/audiobookshelf/issues/3246 (requires iTMS user agent)
method: 'GET', // See: https://github.com/advplyr/audiobookshelf/issues/4401 (requires no iTMS user agent)
responseType: 'stream', const userAgents = ['audiobookshelf (+https://audiobookshelf.org; like iTMS)', 'audiobookshelf (+https://audiobookshelf.org)']
headers: {
'User-Agent': 'audiobookshelf (+https://audiobookshelf.org)' let response = null
}, let lastError = null
timeout: global.PodcastDownloadTimeout
}).catch((error) => { for (const userAgent of userAgents) {
Logger.error(`[ffmpegHelpers] Failed to download podcast episode with url "${podcastEpisodeDownload.url}"`, error) try {
return null response = await axios({
}) url: podcastEpisodeDownload.url,
method: 'GET',
responseType: 'stream',
headers: {
'User-Agent': userAgent
},
timeout: global.PodcastDownloadTimeout
})
Logger.debug(`[ffmpegHelpers] Successfully connected with User-Agent: ${userAgent}`)
break
} catch (error) {
lastError = error
Logger.warn(`[ffmpegHelpers] Failed to download podcast episode with User-Agent "${userAgent}" for url "${podcastEpisodeDownload.url}"`, error.message)
// If this is the last attempt, log the full error
if (userAgent === userAgents[userAgents.length - 1]) {
Logger.error(`[ffmpegHelpers] All User-Agent attempts failed for url "${podcastEpisodeDownload.url}"`, lastError)
}
}
}
if (!response) { if (!response) {
return resolve({ return resolve({
success: false success: false

View file

@ -109,7 +109,7 @@ function getIno(path) {
.stat(path, { bigint: true }) .stat(path, { bigint: true })
.then((data) => String(data.ino)) .then((data) => String(data.ino))
.catch((err) => { .catch((err) => {
Logger.error('[Utils] Failed to get ino for path', path, err) Logger.warn(`[Utils] Failed to get ino for path "${path}"`, err)
return null return null
}) })
} }

View file

@ -60,6 +60,38 @@ module.exports.notificationData = {
errorMsg: 'Example error message' errorMsg: 'Example error message'
} }
}, },
{
name: 'onRSSFeedFailed',
requiresLibrary: true,
description: 'Triggered when the RSS feed request fails for an automatic episode download',
descriptionKey: 'NotificationOnRSSFeedFailedDescription',
variables: ['feedUrl', 'numFailed', 'title'],
defaults: {
title: 'RSS Feed Request Failed',
body: 'Failed to request RSS feed for {{title}}.\nFeed URL: {{feedUrl}}\nNumber of failed attempts: {{numFailed}}'
},
testData: {
title: 'Test RSS Feed',
feedUrl: 'https://example.com/rss',
numFailed: 3
}
},
{
name: 'onRSSFeedDisabled',
requiresLibrary: true,
description: 'Triggered when automatic episode downloads are disabled due to too many failed attempts',
descriptionKey: 'NotificationOnRSSFeedDisabledDescription',
variables: ['feedUrl', 'numFailed', 'title'],
defaults: {
title: 'Podcast Episode Download Schedule Disabled',
body: 'Automatic episode downloads for {{title}} have been disabled due to too many failed RSS feed requests.\nFeed URL: {{feedUrl}}\nNumber of failed attempts: {{numFailed}}'
},
testData: {
title: 'Test RSS Feed',
feedUrl: 'https://example.com/rss',
numFailed: 5
}
},
{ {
name: 'onTest', name: 'onTest',
requiresLibrary: false, requiresLibrary: false,

View file

@ -1,8 +1,9 @@
const axios = require('axios') const axios = require('axios')
const ssrfFilter = require('ssrf-req-filter') const ssrfFilter = require('ssrf-req-filter')
const Logger = require('../Logger') const Logger = require('../Logger')
const { xmlToJSON, levenshteinDistance, timestampToSeconds } = require('./index') const { xmlToJSON, timestampToSeconds } = require('./index')
const htmlSanitizer = require('../utils/htmlSanitizer') const htmlSanitizer = require('../utils/htmlSanitizer')
const Fuse = require('../libs/fusejs')
/** /**
* @typedef RssPodcastChapter * @typedef RssPodcastChapter
@ -24,6 +25,7 @@ const htmlSanitizer = require('../utils/htmlSanitizer')
* @property {string} episode * @property {string} episode
* @property {string} author * @property {string} author
* @property {string} duration * @property {string} duration
* @property {number|null} durationSeconds - Parsed from duration string if duration is valid
* @property {string} explicit * @property {string} explicit
* @property {number} publishedAt - Unix timestamp * @property {number} publishedAt - Unix timestamp
* @property {{ url: string, type?: string, length?: string }} enclosure * @property {{ url: string, type?: string, length?: string }} enclosure
@ -205,7 +207,7 @@ function extractEpisodeData(item) {
} else if (typeof guidItem?._ === 'string') { } else if (typeof guidItem?._ === 'string') {
episode.guid = guidItem._ episode.guid = guidItem._
} else { } else {
Logger.error(`[podcastUtils] Invalid guid ${item['guid']} for ${episode.enclosure.url}`) Logger.error(`[podcastUtils] Invalid guid for ${episode.enclosure.url}`, item['guid'])
} }
} }
@ -216,8 +218,9 @@ function extractEpisodeData(item) {
}) })
// Extract psc:chapters if duration is set // Extract psc:chapters if duration is set
let episodeDuration = !isNaN(episode.duration) ? timestampToSeconds(episode.duration) : null episode.durationSeconds = episode.duration ? timestampToSeconds(episode.duration) : null
if (item['psc:chapters']?.[0]?.['psc:chapter']?.length && episodeDuration) {
if (item['psc:chapters']?.[0]?.['psc:chapter']?.length && episode.durationSeconds) {
// Example chapter: // Example chapter:
// {"id":0,"start":0,"end":43.004286,"title":"chapter 1"} // {"id":0,"start":0,"end":43.004286,"title":"chapter 1"}
@ -243,7 +246,7 @@ function extractEpisodeData(item) {
} else { } else {
episode.chapters = cleanedChapters.map((chapter, index) => { episode.chapters = cleanedChapters.map((chapter, index) => {
const nextChapter = cleanedChapters[index + 1] const nextChapter = cleanedChapters[index + 1]
const end = nextChapter ? nextChapter.start : episodeDuration const end = nextChapter ? nextChapter.start : episode.durationSeconds
return { return {
id: chapter.id, id: chapter.id,
title: chapter.title, title: chapter.title,
@ -272,6 +275,7 @@ function cleanEpisodeData(data) {
episode: data.episode || '', episode: data.episode || '',
author: data.author || '', author: data.author || '',
duration: data.duration || '', duration: data.duration || '',
durationSeconds: data.durationSeconds || null,
explicit: data.explicit || '', explicit: data.explicit || '',
publishedAt, publishedAt,
enclosure: data.enclosure, enclosure: data.enclosure,
@ -407,7 +411,7 @@ module.exports.getPodcastFeed = (feedUrl, excludeEpisodeMetadata = false) => {
}) })
} }
// Return array of episodes ordered by closest match (Levenshtein distance of 6 or less) // Return array of episodes ordered by closest match using fuse.js
module.exports.findMatchingEpisodes = async (feedUrl, searchTitle) => { module.exports.findMatchingEpisodes = async (feedUrl, searchTitle) => {
const feed = await this.getPodcastFeed(feedUrl).catch(() => { const feed = await this.getPodcastFeed(feedUrl).catch(() => {
return null return null
@ -420,32 +424,29 @@ module.exports.findMatchingEpisodes = async (feedUrl, searchTitle) => {
* *
* @param {RssPodcast} feed * @param {RssPodcast} feed
* @param {string} searchTitle * @param {string} searchTitle
* @returns {Array<{ episode: RssPodcastEpisode, levenshtein: number }>} * @param {number} [threshold=0.4] - 0.0 for perfect match, 1.0 for match anything
* @returns {Array<{ episode: RssPodcastEpisode }>}
*/ */
module.exports.findMatchingEpisodesInFeed = (feed, searchTitle) => { module.exports.findMatchingEpisodesInFeed = (feed, searchTitle, threshold = 0.4) => {
searchTitle = searchTitle.toLowerCase().trim()
if (!feed?.episodes) { if (!feed?.episodes) {
return null return null
} }
const fuseOptions = {
ignoreDiacritics: true,
threshold,
keys: [
{ name: 'title', weight: 0.7 }, // prefer match in title
{ name: 'subtitle', weight: 0.3 }
]
}
const fuse = new Fuse(feed.episodes, fuseOptions)
const matches = [] const matches = []
feed.episodes.forEach((ep) => { fuse.search(searchTitle).forEach((match) => {
if (!ep.title) return matches.push({
const epTitle = ep.title.toLowerCase().trim() episode: match.item
if (epTitle === searchTitle) { })
matches.push({
episode: ep,
levenshtein: 0
})
} else {
const levenshtein = levenshteinDistance(searchTitle, epTitle, true)
if (levenshtein <= 6 && epTitle.length > levenshtein) {
matches.push({
episode: ep,
levenshtein
})
}
}
}) })
return matches.sort((a, b) => a.levenshtein - b.levenshtein) return matches
} }

View file

@ -186,6 +186,8 @@ module.exports = {
mediaWhere['$series.id$'] = null mediaWhere['$series.id$'] = null
} else if (group === 'abridged') { } else if (group === 'abridged') {
mediaWhere['abridged'] = true mediaWhere['abridged'] = true
} else if (group === 'explicit') {
mediaWhere['explicit'] = true
} else if (['genres', 'tags', 'narrators'].includes(group)) { } else if (['genres', 'tags', 'narrators'].includes(group)) {
mediaWhere[group] = Sequelize.where(Sequelize.literal(`(SELECT count(*) FROM json_each(${group}) WHERE json_valid(${group}) AND json_each.value = :filterValue)`), { mediaWhere[group] = Sequelize.where(Sequelize.literal(`(SELECT count(*) FROM json_each(${group}) WHERE json_valid(${group}) AND json_each.value = :filterValue)`), {
[Sequelize.Op.gte]: 1 [Sequelize.Op.gte]: 1
@ -251,6 +253,15 @@ module.exports = {
*/ */
getOrder(sortBy, sortDesc, collapseseries) { getOrder(sortBy, sortDesc, collapseseries) {
const dir = sortDesc ? 'DESC' : 'ASC' const dir = sortDesc ? 'DESC' : 'ASC'
const getTitleOrder = () => {
if (global.ServerSettings.sortingIgnorePrefix) {
return [Sequelize.literal('`libraryItem`.`titleIgnorePrefix` COLLATE NOCASE'), dir]
} else {
return [Sequelize.literal('`libraryItem`.`title` COLLATE NOCASE'), dir]
}
}
if (sortBy === 'addedAt') { if (sortBy === 'addedAt') {
return [[Sequelize.literal('libraryItem.createdAt'), dir]] return [[Sequelize.literal('libraryItem.createdAt'), dir]]
} else if (sortBy === 'size') { } else if (sortBy === 'size') {
@ -264,19 +275,16 @@ module.exports = {
} else if (sortBy === 'media.metadata.publishedYear') { } else if (sortBy === 'media.metadata.publishedYear') {
return [[Sequelize.literal(`CAST(\`book\`.\`publishedYear\` AS INTEGER)`), dir]] return [[Sequelize.literal(`CAST(\`book\`.\`publishedYear\` AS INTEGER)`), dir]]
} else if (sortBy === 'media.metadata.authorNameLF') { } else if (sortBy === 'media.metadata.authorNameLF') {
return [[Sequelize.literal('`libraryItem`.`authorNamesLastFirst` COLLATE NOCASE'), dir]] // Sort by author name last first, secondary sort by title
return [[Sequelize.literal('`libraryItem`.`authorNamesLastFirst` COLLATE NOCASE'), dir], getTitleOrder()]
} else if (sortBy === 'media.metadata.authorName') { } else if (sortBy === 'media.metadata.authorName') {
return [[Sequelize.literal('`libraryItem`.`authorNamesFirstLast` COLLATE NOCASE'), dir]] // Sort by author name first last, secondary sort by title
return [[Sequelize.literal('`libraryItem`.`authorNamesFirstLast` COLLATE NOCASE'), dir], getTitleOrder()]
} else if (sortBy === 'media.metadata.title') { } else if (sortBy === 'media.metadata.title') {
if (collapseseries) { if (collapseseries) {
return [[Sequelize.literal('display_title COLLATE NOCASE'), dir]] return [[Sequelize.literal('display_title COLLATE NOCASE'), dir]]
} }
return [getTitleOrder()]
if (global.ServerSettings.sortingIgnorePrefix) {
return [[Sequelize.literal('`libraryItem`.`titleIgnorePrefix` COLLATE NOCASE'), dir]]
} else {
return [[Sequelize.literal('`libraryItem`.`title` COLLATE NOCASE'), dir]]
}
} else if (sortBy === 'sequence') { } else if (sortBy === 'sequence') {
const nullDir = sortDesc ? 'DESC NULLS FIRST' : 'ASC NULLS LAST' const nullDir = sortDesc ? 'DESC NULLS FIRST' : 'ASC NULLS LAST'
return [[Sequelize.literal(`CAST(\`series.bookSeries.sequence\` AS FLOAT) ${nullDir}`)]] return [[Sequelize.literal(`CAST(\`series.bookSeries.sequence\` AS FLOAT) ${nullDir}`)]]

View file

@ -59,6 +59,8 @@ module.exports = {
replacements.filterValue = value replacements.filterValue = value
} else if (group === 'languages') { } else if (group === 'languages') {
mediaWhere['language'] = value mediaWhere['language'] = value
} else if (group === 'explicit') {
mediaWhere['explicit'] = true
} }
return { return {
@ -149,11 +151,12 @@ module.exports = {
libraryId libraryId
} }
const libraryItemIncludes = [] const libraryItemIncludes = []
if (includeRSSFeed) { if (filterGroup === 'feed-open' || includeRSSFeed) {
const rssFeedRequired = filterGroup === 'feed-open'
libraryItemIncludes.push({ libraryItemIncludes.push({
model: Database.feedModel, model: Database.feedModel,
required: filterGroup === 'feed-open', required: rssFeedRequired,
separate: true separate: !rssFeedRequired
}) })
} }
if (filterGroup === 'issues') { if (filterGroup === 'issues') {