Compare commits

...

242 Commits

Author SHA1 Message Date
advplyr 29752798f3 Version bump v2.30.0 2025-10-08 10:34:34 -05:00
advplyr 8c86ca4ea5 Merge pull request #4729 from mikiher/build-win-no-compress
Add a script to build an uncompressed windows executable
2025-10-08 10:08:21 -05:00
mikiher 00c62fa494 Add a script to build an uncompressed windows executable 2025-10-08 17:42:00 +03:00
advplyr 6c7f3c7e77 Merge pull request #4695 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-10-07 16:25:14 -05:00
Jan-Eric Myhrgren aec8acbdd7 Translated using Weblate (Swedish)
Currently translated at 97.2% (1131 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-10-07 12:02:09 +02:00
Юра Климович 6e19ad7777 Translated using Weblate (Russian)
Currently translated at 100.0% (1163 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-10-07 12:02:08 +02:00
Grzegorz Orlowski 3aa95fec11 Translated using Weblate (Polish)
Currently translated at 88.2% (1026 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-10-07 12:02:05 +02:00
Ahetek 37dd46d31f Translated using Weblate (Polish)
Currently translated at 88.2% (1026 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-10-07 12:02:03 +02:00
Petter Schaug-Pettersen 54a996634e Translated using Weblate (Norwegian Bokmål)
Currently translated at 90.4% (1052 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nb_NO/
2025-10-07 12:02:02 +02:00
Oğuz Ersen 54a5e368c2 Translated using Weblate (Turkish)
Currently translated at 100.0% (1163 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/tr/
2025-10-05 17:02:05 +02:00
FiendFEARing 2d313851d2 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1163 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-10-05 17:02:04 +02:00
Максим Горпиніч eb00b19457 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1163 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-10-05 17:02:03 +02:00
Kabika82 bbae9acc2d Translated using Weblate (Hungarian)
Currently translated at 100.0% (1163 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-10-05 17:02:02 +02:00
Milo Ivir a4e8f01f0e Translated using Weblate (Croatian)
Currently translated at 100.0% (1163 of 1163 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/
2025-10-05 17:02:01 +02:00
SmileFate 6bdf402da8 Translated using Weblate (Turkish)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/tr/
2025-10-03 21:43:22 +00:00
DR 80b0e3546e Translated using Weblate (Hebrew)
Currently translated at 72.9% (847 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/he/
2025-10-03 21:43:21 +00:00
B0rax 161f3cb177 Translated using Weblate (German)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-10-03 21:43:21 +00:00
Jan 4a4d4a8f17 Translated using Weblate (German)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-10-03 21:43:20 +00:00
Petri Hämäläinen b21046027c Translated using Weblate (Finnish)
Currently translated at 95.5% (1109 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fi/
2025-10-03 21:43:19 +00:00
max grakov 3a163e1746 Translated using Weblate (Russian)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-10-03 21:43:18 +00:00
Amirhossein Ghorbanmehr 3c4e80f1c1 Translated using Weblate (Persian)
Currently translated at 2.2% (26 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fa/
2025-10-03 21:43:18 +00:00
SmileFate 2f3036faba Translated using Weblate (Turkish)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/tr/
2025-10-03 21:43:17 +00:00
advplyr 3934461c46 Added translation using Weblate (Persian) 2025-10-03 21:43:16 +00:00
advplyr 123351e08a Merge pull request #4716 from mikiher/async-cover-search
Async Cover Search
2025-10-03 16:43:05 -05:00
advplyr 1280ddfe74 ui/ux disable inputs while cover search in progress, add padding on empty state texts 2025-10-03 16:39:36 -05:00
mikiher 7e89b97a6d Tidy up cover search console logging and error toasts 2025-10-03 09:08:17 +03:00
mikiher 20de2ea388 Add "Best" option to book cover search 2025-10-03 08:23:53 +03:00
mikiher dbb5ee79ac Revert removal of audiobookcovers provider 2025-10-03 08:20:56 +03:00
mikiher c6dabd2620 Shorten timeout and error message for remaining providers 2025-10-02 22:23:12 +03:00
mikiher 26f949b9ba Remove audiobookcovers from provider list 2025-10-02 22:14:48 +03:00
mikiher 7630dbdcb7 Replace cover search with streaming version 2025-10-02 13:30:03 +03:00
mikiher a164c17d38 Reduce provider timout to 10 secs, Shorten error message 2025-10-02 13:26:05 +03:00
advplyr 03da194953 Update for nextjs client, pass all remaining requests through to nextjs 2025-09-28 09:41:15 -05:00
advplyr e040396b20 Merge pull request #4656 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-09-22 09:41:08 -05:00
Phil Jope bcbec67fec Translated using Weblate (German)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-09-20 23:02:02 +02:00
Vito0912 1543021685 Translated using Weblate (German)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-09-20 23:02:01 +02:00
Salmanegr 577e6aaec9 Translated using Weblate (Arabic)
Currently translated at 95.4% (1108 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ar/
2025-09-19 08:02:02 +00:00
Milo Ivir 77579acfd4 Translated using Weblate (Croatian)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/
2025-09-10 22:24:06 +00:00
Yuta Imada 9ca98ca750 Translated using Weblate (Japanese)
Currently translated at 15.5% (180 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/
2025-09-10 22:24:05 +00:00
Satanowski feb225d3a6 Translated using Weblate (Polish)
Currently translated at 82.3% (956 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-09-10 22:24:05 +00:00
Yuta Imada e501aa4f1e Translated using Weblate (Japanese)
Currently translated at 15.4% (179 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/
2025-09-10 22:24:04 +00:00
peter cerny 104f6e6c58 Translated using Weblate (Slovak)
Currently translated at 99.9% (1160 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sk/
2025-09-10 22:24:03 +00:00
jhonthan 552d8ae3b8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 67.7% (787 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pt_BR/
2025-09-10 22:24:03 +00:00
advplyr a41e9bae5d Merge pull request #4664 from advplyr/episode_download_fallback
Fix issue with episode downloads without streams
2025-09-10 17:23:53 -05:00
advplyr a456865ec0 Fix issue with episode downloads without streams, fallback to regular dl on ffprobe fail 2025-09-10 17:10:00 -05:00
advplyr 85d5531bc1 Update chapter editor remove redirect on save or delete all #4650 2025-09-07 17:50:59 -05:00
advplyr 4b840f9c97 Merge pull request #4627 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-09-05 17:24:15 -05:00
peter cerny b9510a69fe Translated using Weblate (Slovak)
Currently translated at 97.7% (1135 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sk/
2025-09-06 00:22:25 +02:00
Losicek d737a66af2 Translated using Weblate (Czech)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-09-06 00:22:24 +02:00
Plazec 576d18d8d6 Translated using Weblate (Czech)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-09-06 00:22:23 +02:00
petr-prikryl d238b02bd2 Translated using Weblate (Czech)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-09-06 00:22:23 +02:00
kuci-JK c6cb13ed39 Translated using Weblate (Czech)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-09-06 00:22:22 +02:00
Jon Erling Hustadnes 44c5dce8aa Translated using Weblate (Norwegian Bokmål)
Currently translated at 90.5% (1051 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nb_NO/
2025-09-06 00:22:21 +02:00
Darius M b726bee4e5 Translated using Weblate (Romanian)
Currently translated at 17.0% (198 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ro/
2025-09-06 00:22:20 +02:00
Hnatiucb b07e449043 Translated using Weblate (Romanian)
Currently translated at 17.0% (198 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ro/
2025-09-06 00:22:19 +02:00
icutehunter 9273e61f1e Translated using Weblate (Turkish)
Currently translated at 28.5% (332 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/tr/
2025-09-06 00:22:18 +02:00
ugyes 1b4a7acf13 Translated using Weblate (Hungarian)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-09-06 00:22:18 +02:00
kuci-JK 68c1395bdf Translated using Weblate (Czech)
Currently translated at 98.1% (1140 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-09-06 00:22:17 +02:00
Hnatiucb a007a9ec98 Translated using Weblate (Romanian)
Currently translated at 3.7% (44 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ro/
2025-09-06 00:22:16 +02:00
tngch 8b33b5e383 Translated using Weblate (Japanese)
Currently translated at 14.2% (166 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/
2025-09-06 00:22:15 +02:00
Jan-Eric Myhrgren c81b762d52 Translated using Weblate (Swedish)
Currently translated at 97.2% (1129 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-09-06 00:22:15 +02:00
Hnatiucb c53a5c5a0b Translated using Weblate (Romanian)
Currently translated at 3.3% (39 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ro/
2025-09-06 00:22:14 +02:00
thehijacker 83af75a582 Translated using Weblate (Slovenian)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/
2025-09-06 00:22:13 +02:00
Jan-Eric Myhrgren 60389a3bf3 Translated using Weblate (Swedish)
Currently translated at 97.2% (1129 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-09-06 00:22:13 +02:00
biuklija 20cceb3a8f Translated using Weblate (Croatian)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/
2025-09-06 00:22:11 +02:00
lolly76 7562fb2c21 Translated using Weblate (French)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/
2025-09-06 00:22:11 +02:00
Matej Krajčovič c7647aafd7 Translated using Weblate (Slovak)
Currently translated at 96.2% (1117 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sk/
2025-09-06 00:22:10 +02:00
FiendFEARing 4a73247e5c Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1161 of 1161 strings)

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

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-09-06 00:22:08 +02:00
Jan-Eric Myhrgren 5ff5245476 Translated using Weblate (Swedish)
Currently translated at 97.2% (1129 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-09-06 00:22:08 +02:00
advplyr 856cf180a5 Fix chapter editor overflow, set custom wrap breakpoint #4652 2025-09-05 17:21:55 -05:00
advplyr 6ea70608a1 Merge pull request #4636 from nichwall/multiselect_duplicate_entries
Fix: MultiSelect causes web client to become unresponsive if duplicate keys exist
2025-09-02 18:37:07 -04:00
advplyr ba7160c305 Add index to removeItem on multiselect keydown 2025-09-02 17:31:48 -05:00
advplyr 7d048b7a50 Merge pull request #4635 from Vito0912/feat/OIDCfix
Fix Invalid callback URL - must be same-origin for NPM users
2025-09-02 18:18:52 -04:00
Nicholas Wallace afab429c75 Fix: ensure all keys are unique in MultiSelect 2025-08-30 10:01:25 -07:00
Vito0912 50e2fe7fd2 Fix http/https error 2025-08-30 17:47:21 +02:00
advplyr c7c21cc137 Version bump v2.29.0 2025-08-25 17:10:29 -05:00
advplyr 7e4c7a7e3b Merge pull request #4618 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-08-25 17:50:57 -04:00
FiendFEARing 40babc9650 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-08-25 21:50:34 +00:00
Максим Горпиніч 7a94f014ea Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-08-25 21:50:33 +00:00
Jan-Eric Myhrgren 32adb1bafd Translated using Weblate (Swedish)
Currently translated at 97.5% (1132 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-25 21:50:32 +00:00
Yurt Page f9a6239049 Translated using Weblate (Russian)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-08-25 21:50:32 +00:00
Mathias Franco 8dee1ec942 Translated using Weblate (Dutch)
Currently translated at 100.0% (1161 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-08-25 21:50:31 +00:00
laxandrea 58e43cc6a7 Translated using Weblate (Italian)
Currently translated at 99.6% (1157 of 1161 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/
2025-08-25 21:50:30 +00:00
Jan-Eric Myhrgren b8999fbc37 Translated using Weblate (Swedish)
Currently translated at 97.3% (1126 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-25 21:50:29 +00:00
advplyr 0dda4b6b27 Added translation using Weblate (Basque) 2025-08-25 21:50:29 +00:00
Kabika82 817f2f6915 Translated using Weblate (Hungarian)
Currently translated at 100.0% (1157 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-08-25 21:50:28 +00:00
idojius86 77fc6bba1a Translated using Weblate (Spanish)
Currently translated at 97.1% (1124 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/es/
2025-08-25 21:50:28 +00:00
Jan-Eric Myhrgren c66d652a53 Translated using Weblate (Swedish)
Currently translated at 97.3% (1126 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-25 21:50:27 +00:00
thehijacker 86bddba5c3 Translated using Weblate (Slovenian)
Currently translated at 100.0% (1157 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/
2025-08-25 21:50:26 +00:00
Jan-Eric Myhrgren 7779fd2972 Translated using Weblate (Swedish)
Currently translated at 96.8% (1121 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-25 21:50:26 +00:00
Yurt Page 05a4577792 Translated using Weblate (Russian)
Currently translated at 100.0% (1157 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-08-25 21:50:25 +00:00
laxandrea 56dc042282 Translated using Weblate (Italian)
Currently translated at 99.3% (1149 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/
2025-08-25 21:50:24 +00:00
advplyr 95973243a6 Update book library progress sort labels as per discord vote 2025-08-25 16:50:10 -05:00
John 18ad23d016 Issue 4540 New SortBy Options: Started Date & Finished Date (#4575)
---------

Co-authored-by: advplyr <advplyr@protonmail.com>
2025-08-24 16:54:38 -05:00
advplyr e258f122f1 Update weblate readme widget to use vertical bar chart 2025-08-24 08:41:31 -05:00
advplyr 18200a8f01 Merge pull request #4533 from sir-wilhelm/wmic_replacement
Use PowerShell to get windows drive paths.
2025-08-23 17:55:50 -04:00
advplyr 9c47f404c9 Fix current author not showing in podcast match #4617 2025-08-23 16:55:32 -05:00
advplyr 2f6de71a3a Fix match tab local storage book provider being updated by podcast matching #4615 2025-08-22 08:35:11 -05:00
advplyr deb121c523 Fix podcast itunesId not set on create or update from match #4614 2025-08-22 08:20:49 -05:00
advplyr 320e4dfb47 Merge pull request #4586 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-08-20 18:47:09 -04:00
FiendFEARing 6194c48549 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1157 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-08-20 22:45:34 +00:00
Максим Горпиніч 6aa9ecaaba Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1157 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-08-20 22:45:33 +00:00
Jan-Eric Myhrgren b3d020b89f Translated using Weblate (Swedish)
Currently translated at 96.8% (1121 of 1157 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-20 22:45:33 +00:00
owlcollector e196a6e5ca Translated using Weblate (Japanese)
Currently translated at 9.7% (113 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/
2025-08-20 22:45:32 +00:00
Jan-Eric Myhrgren 73cf22b499 Translated using Weblate (Swedish)
Currently translated at 96.7% (1118 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-20 22:45:32 +00:00
ugyes ac7464ce7e Translated using Weblate (Hungarian)
Currently translated at 99.8% (1154 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-08-20 22:45:31 +00:00
B0rax 84e742f2a5 Translated using Weblate (German)
Currently translated at 100.0% (1156 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-20 22:45:30 +00:00
Daniel Schosser a1e882cbf1 Translated using Weblate (German)
Currently translated at 100.0% (1156 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-20 22:45:29 +00:00
Zhelyan Radoev 09121acbd5 Translated using Weblate (Bulgarian)
Currently translated at 87.3% (1010 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bg/
2025-08-20 22:45:28 +00:00
owlcollector 5b9df84ba3 Translated using Weblate (Japanese)
Currently translated at 8.5% (99 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/
2025-08-20 22:45:28 +00:00
Zhelyan Radoev 266db491aa Translated using Weblate (Bulgarian)
Currently translated at 83.9% (971 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/bg/
2025-08-20 22:45:27 +00:00
FiendFEARing c7a317a87b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1156 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-08-20 22:45:26 +00:00
Максим Горпиніч b027f3bda1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1156 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-08-20 22:45:26 +00:00
vanapro1 cea991b82f Translated using Weblate (Russian)
Currently translated at 100.0% (1156 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-08-20 22:45:25 +00:00
biuklija 7e2b51e6d2 Translated using Weblate (Croatian)
Currently translated at 100.0% (1156 of 1156 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/
2025-08-20 22:45:24 +00:00
Hang Pham 8f310b6bf0 Translated using Weblate (Vietnamese)
Currently translated at 62.2% (708 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/vi/
2025-08-20 22:45:24 +00:00
Sneaky b2a5fb46f1 Translated using Weblate (Swedish)
Currently translated at 96.6% (1100 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-20 22:45:23 +00:00
Jan-Eric Myhrgren 6d7639853b Translated using Weblate (Swedish)
Currently translated at 96.6% (1100 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-20 22:45:22 +00:00
ugyes 3a16acbba4 Translated using Weblate (Hungarian)
Currently translated at 99.8% (1136 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-08-20 22:45:22 +00:00
Troj@ 027e1efaca Translated using Weblate (Belarusian)
Currently translated at 66.5% (757 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/be/
2025-08-20 22:45:21 +00:00
Ivan Smoliakov d1fabba86b Translated using Weblate (Russian)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-08-20 22:45:20 +00:00
Mathias Franco b290a4ada3 Translated using Weblate (Dutch)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-08-20 22:45:19 +00:00
Paolo Ricci bb477c617e Translated using Weblate (Italian)
Currently translated at 99.7% (1135 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/it/
2025-08-20 22:45:19 +00:00
Michael Förster 9238c38842 Translated using Weblate (German)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-20 22:45:18 +00:00
Daniel Schosser d268516fcb Translated using Weblate (German)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-20 22:45:17 +00:00
Vito0912 d353cff1ae Translated using Weblate (German)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-20 22:45:17 +00:00
kuci-JK 604f17f60b Translated using Weblate (Czech)
Currently translated at 98.6% (1123 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/cs/
2025-08-20 22:45:16 +00:00
advplyr 3911a7273b Merge pull request #4595 from renesat/fix/listening-ipv6-url
Fix listening url log with ipv6 host
2025-08-20 18:45:04 -04:00
advplyr 138bb563b8 Update ipv6 server listening log 2025-08-20 17:42:22 -05:00
advplyr 3801ef062a Merge pull request #4596 from renesat/fix/redirect-url
Fix freeze on some audio sources
2025-08-19 18:11:13 -04:00
advplyr e4b9ac5446 Add episode updated translation for podcast match #4606 2025-08-19 16:52:50 -05:00
advplyr 9987d219f8 Remove success toast on podcast episodes removed #4606 2025-08-19 16:50:43 -05:00
advplyr dc7045c562 Merge pull request #4608 from laxandrea/remove-token-from-hls-url
Remove token from hls url
2025-08-19 17:29:10 -04:00
laxandrea 2cc6e56bd1 remove token from hls url
- following PR #4263
2025-08-19 15:29:49 +02:00
advplyr a89a24e48e Merge pull request #4598 from advplyr/episode_meta_tagging
Update podcast episode downloads to always attempt embedding meta tags
2025-08-17 10:20:54 -04:00
advplyr a968aca304 Update podcast episode downloads to always attempt embedding meta tags regardless of format 2025-08-17 09:05:29 -05:00
renesat 8d1f460640 Fix freeze on some audio sources 2025-08-16 18:56:23 +02:00
renesat 553ffd1934 Fix listening url log with ipv6 host 2025-08-16 18:24:31 +02:00
advplyr fd4932cdbb Add additional debug logs for OIDC login 2025-08-15 17:23:20 -05:00
advplyr dcaca43817 Merge pull request #4384 from josh-vin/feat/ChaptersEnhancments
Enhancement: Improves chapter editing and adds bulk import
2025-08-14 17:38:56 -04:00
advplyr 0eed4e82f9 Fix bulk add chapter icon button tooltip 2025-08-14 16:35:28 -05:00
advplyr 2ed2328401 Remove negative chapter end check & tooltip 2025-08-14 16:18:33 -05:00
advplyr 8b260c8bc6 Update bulk chapter modal styles, decreased text and button sizes 2025-08-14 16:16:34 -05:00
advplyr 7dcb9b98a0 Chapter lookup modal add back button to clear lookup results 2025-08-14 16:03:32 -05:00
advplyr 311ac7104e Merge pull request #4590 from advplyr/fix_authorize_race_condition
Fix authorize race condition by not updating the user on token refresh
2025-08-13 09:36:17 -04:00
advplyr 2c45b28d48 Fix authorize race condition by not updating the user on token refresh #4567 2025-08-13 08:31:01 -05:00
advplyr b53613f82c Merge pull request #4552 from Toby222/master
Replace some SVG icons with material-symbols
2025-08-12 18:55:50 -04:00
advplyr 751371abb8 Update ReadIcon svg with material-symbols 2025-08-12 17:46:01 -05:00
advplyr 6365c02875 Update explicit material symbols icon to fill 2025-08-12 17:40:48 -05:00
advplyr fb3834156b Version bump v2.28.0 2025-08-10 17:42:32 -05:00
advplyr c03f3f722d Merge pull request #4559 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-08-10 18:31:40 -04:00
FiendFEARing a06f48ca29 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-08-10 22:26:37 +00:00
NickSkier 9d79552dda Translated using Weblate (Russian)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-08-10 22:26:36 +00:00
Laurin Sorgend ed98614b6f Translated using Weblate (German)
Currently translated at 99.9% (1137 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-10 22:26:36 +00:00
owlcollector 09dd2cc79c Translated using Weblate (Japanese)
Currently translated at 6.0% (69 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ja/
2025-08-10 22:26:35 +00:00
weblate.user.1274 e87237048a Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.1% (1049 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nb_NO/
2025-08-10 22:26:35 +00:00
Kent Henriksen d71968fd80 Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.1% (1049 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nb_NO/
2025-08-10 22:26:34 +00:00
Thomas f83c605ae1 Translated using Weblate (French)
Currently translated at 99.1% (1128 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/
2025-08-10 22:26:34 +00:00
J. Lavoie 4325f470dd Translated using Weblate (German)
Currently translated at 99.8% (1136 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-10 22:26:33 +00:00
numerfolt 800ecf8e82 Translated using Weblate (German)
Currently translated at 99.8% (1136 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-10 22:26:32 +00:00
Vito0912 5cb143d50b Translated using Weblate (German)
Currently translated at 99.8% (1136 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-10 22:26:32 +00:00
Troj@ 798c73c66c Translated using Weblate (Belarusian)
Currently translated at 64.6% (736 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/be/
2025-08-10 22:26:31 +00:00
Максим Горпиніч 0fa7c46274 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-08-10 22:26:31 +00:00
Kent Henriksen c2d420ec70 Translated using Weblate (Norwegian Bokmål)
Currently translated at 91.0% (1036 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nb_NO/
2025-08-10 22:26:30 +00:00
biuklija 152daf7bf3 Translated using Weblate (Croatian)
Currently translated at 100.0% (1138 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hr/
2025-08-10 22:26:29 +00:00
Ashish Wadekar 8d99249e50 Translated using Weblate (Hindi)
Currently translated at 8.7% (100 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hi/
2025-08-10 22:26:29 +00:00
Camille de Lune c6724ba353 Translated using Weblate (French)
Currently translated at 99.1% (1128 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/fr/
2025-08-10 22:26:28 +00:00
Aleksandr Zakirov a519d44666 Translated using Weblate (Estonian)
Currently translated at 65.4% (745 of 1138 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/et/
2025-08-10 22:26:27 +00:00
Grzegorz Orlowski 7e8bf977cc Translated using Weblate (Polish)
Currently translated at 82.9% (942 of 1135 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-08-10 22:26:27 +00:00
advplyr 4018be6330 Fix oidc auto-register not cleaning up new user on errors #4563 2025-08-10 17:26:15 -05:00
advplyr 99a3867ce9 Update callback url check
Co-authored-by: Denis Arnst <git@sapd.eu>
2025-08-10 17:08:25 -05:00
advplyr 2116f60133 Merge pull request #4565 from advplyr/redirect_transcode_requests
Fix server crash when transcode requests are made to the direct play endpoint
2025-08-07 18:31:45 -04:00
advplyr 794f0ef42a Fix server crash when transcode requests are made to the direct play endpoint #4555 2025-08-07 17:21:05 -05:00
Josh Vincent 3e423839a1 Fixes UI for Bulk Chapter adder, and changes logic around locking 2025-08-04 18:33:06 -06:00
Josh Vincent 2773c8c4a9 Merge remote-tracking branch 'josh-vin/master' into feat/ChaptersEnhancments 2025-08-04 18:32:28 -06:00
advplyr e510174f12 Merge pull request #4557 from Vito0912/cors
Allow a whitelist of CORS origins
2025-08-04 19:02:30 -04:00
advplyr 08c9e8d47d Fix i18n string order 2025-08-04 17:56:56 -05:00
advplyr 1908ec3df5 Remove commented out experimental features setting 2025-08-04 17:54:59 -05:00
advplyr df3878d4ca Add Security section to settings with allowed cors origin setting, increase width of setting inputs 2025-08-04 17:54:29 -05:00
Vito0912 1097de6f1f now updates the input field 2025-08-04 19:17:46 +02:00
Vito0912 e408070b19 better heading 2025-08-03 14:02:33 +02:00
Vito0912 af67c2e86f locale 2025-08-03 13:57:44 +02:00
Vito0912 6a52d2a968 CORS 2025-08-03 13:52:58 +02:00
advplyr 3337b3af18 Version bump v2.27.0 2025-08-02 17:53:27 -05:00
advplyr 835d2c7f36 Merge pull request #4535 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-08-02 18:52:04 -04:00
FiendFEARing 03f91099e0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1135 of 1135 strings)

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

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-08-02 15:01:59 +02:00
Grzegorz Orlowski b03bd79f5d Translated using Weblate (Polish)
Currently translated at 77.6% (881 of 1135 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/pl/
2025-08-02 15:01:57 +02:00
Tobias Berger 5ef632a7eb Replace some SVG icons with material-symbols 2025-08-01 09:20:34 +02:00
Troj@ 79b4042e8e Translated using Weblate (Belarusian)
Currently translated at 63.6% (721 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/be/
2025-08-01 02:51:15 +02:00
FiendFEARing 8f718ef91c Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1133 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-08-01 02:51:15 +02:00
Pepijn 4053b20623 Translated using Weblate (Dutch)
Currently translated at 100.0% (1133 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-08-01 02:51:15 +02:00
Remco Schrijver c4d654635f Translated using Weblate (Dutch)
Currently translated at 100.0% (1133 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-08-01 02:51:15 +02:00
enosh ef5d0ffa48 Translated using Weblate (Hebrew)
Currently translated at 74.7% (847 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/he/
2025-08-01 02:51:15 +02:00
Troj@ 6a826cdb36 Translated using Weblate (Belarusian)
Currently translated at 58.1% (659 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/be/
2025-08-01 02:51:15 +02:00
thehijacker 1d837f5f21 Translated using Weblate (Slovenian)
Currently translated at 100.0% (1133 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sl/
2025-08-01 02:51:15 +02:00
Максим Горпиніч 80873b379c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1133 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-08-01 02:51:15 +02:00
Remco Schrijver 82a8f8f126 Translated using Weblate (Dutch)
Currently translated at 98.6% (1118 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-08-01 02:51:15 +02:00
Kabika82 4725a466da Translated using Weblate (Hungarian)
Currently translated at 100.0% (1133 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-08-01 02:51:15 +02:00
Jannik 031edc870c Translated using Weblate (German)
Currently translated at 99.8% (1131 of 1133 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-01 02:51:15 +02:00
Jan-Eric Myhrgren 625e2445b5 Translated using Weblate (Swedish)
Currently translated at 96.2% (1089 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/sv/
2025-08-01 02:51:15 +02:00
max grakov 1640af2f1c Translated using Weblate (Russian)
Currently translated at 100.0% (1131 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-08-01 02:51:15 +02:00
Remco Schrijver c76f76cc27 Translated using Weblate (Dutch)
Currently translated at 98.4% (1113 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/nl/
2025-08-01 02:51:15 +02:00
ugyes 74af212293 Translated using Weblate (Hungarian)
Currently translated at 100.0% (1131 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/hu/
2025-08-01 02:51:15 +02:00
Vito0912 e04efb9c6a Translated using Weblate (German)
Currently translated at 99.9% (1130 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-01 02:51:14 +02:00
B0rax ee17e7a555 Translated using Weblate (German)
Currently translated at 99.9% (1130 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-08-01 02:51:14 +02:00
FiendFEARing 694a852c07 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1131 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-08-01 02:51:14 +02:00
Максим Горпиніч 18068bb261 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1131 of 1131 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-08-01 02:51:14 +02:00
Mikkel Dupont Olesen 71257f6c6c Translated using Weblate (Danish)
Currently translated at 99.4% (1124 of 1130 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/da/
2025-08-01 02:51:14 +02:00
advplyr 4d70929d2e Add locale strings for user stats heatmap #4550 2025-07-31 19:51:05 -05:00
advplyr 578e9559e4 Merge pull request #4551 from chriscam85/master
Including total durations into the de-branding from #4226 as warning message is always present currently
2025-07-31 20:23:47 -04:00
advplyr 894ea0b80a Update chapter data log 2025-07-31 19:19:11 -05:00
Chris Campanile e54571f011 Including total durations into the de-branding from #4226 as warning message is always present currently 2025-07-31 16:48:05 -07:00
Josh Vincent 77d7a50b99 Merge remote-tracking branch 'josh-vin/master' into feat/ChaptersEnhancments 2025-07-30 16:51:12 -06:00
advplyr 32da0f1224 Merge pull request #4542 from advplyr/progress_updated_sort
Add book library sort by progress updated #1215
2025-07-28 15:13:40 -04:00
advplyr 2054accdc9 Update library sort dropdown to use max height available 2025-07-28 15:07:57 -04:00
advplyr 7d8b857c77 Add book library sort by progress updated #1215 2025-07-28 14:58:28 -04:00
advplyr 0107cb4782 UI/UX fix x overflow for sessions tables on mobile 2025-07-26 09:45:44 -05:00
advplyr f273eee807 Merge pull request #4534 from michaeldvinci/sepia-theme
Add 'sepia' theme to EpubReader
2025-07-25 17:34:34 -05:00
advplyr 4af21b079a Fix epub toc search input colors for themes 2025-07-25 17:31:59 -05:00
Michael Vinci c9eaf2db2d Add 'sepia' theme to EpubReader 2025-07-25 17:01:16 -05:00
sir-wilhelm cae1560344 Use PowerShell to get windows drive paths.
wmic has been deprecated on newer versions of Windows 11 and is not installed.

resolves #4531
2025-07-25 12:34:29 -05:00
advplyr a5fb0d9cdb Merge pull request #4530 from advplyr/fix_ereader_socket_event
Fix ereader update socket event sending all devices #4529
2025-07-24 17:33:42 -05:00
advplyr 53c80d9798 Merge pull request #4528 from FelixSche/master
Update SideRail.vue
2025-07-24 17:32:44 -05:00
advplyr 832165716b Fix ereader update socket event sending all devices #4529 2025-07-24 17:29:08 -05:00
Felix d9f2d8bf1d Update SideRail.vue
Changed cursor at version to pointer
2025-07-24 13:57:26 +02:00
advplyr a7a3a56509 Version bump v2.26.3 2025-07-23 17:18:51 -05:00
advplyr 4082fadf90 Merge pull request #4525 from weblate/weblate-audiobookshelf-abs-web-client
Translations update from Hosted Weblate
2025-07-23 17:17:51 -05:00
FiendFEARing 93160b83bf Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (1130 of 1130 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/zh_Hans/
2025-07-23 13:06:32 +02:00
Максим Горпиніч 472240f994 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (1130 of 1130 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/uk/
2025-07-23 13:06:31 +02:00
Dmitry c3f0fb8e5e Translated using Weblate (Russian)
Currently translated at 100.0% (1130 of 1130 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/ru/
2025-07-23 13:06:30 +02:00
Daniel Schosser b156ebeb9f Translated using Weblate (German)
Currently translated at 99.9% (1129 of 1130 strings)

Translation: Audiobookshelf/Abs Web Client
Translate-URL: https://hosted.weblate.org/projects/audiobookshelf/abs-web-client/de/
2025-07-23 13:06:29 +02:00
advplyr e4c775c847 Merge pull request #4523 from advplyr/fix_change_empty_root_password
Update change password to support null or empty string passwords #4522
2025-07-22 17:01:07 -05:00
advplyr 45e8e72759 Update change password to support null or empty string passwords #4522 2025-07-22 15:17:00 -05:00
advplyr 0ae7340889 Merge pull request #4520 from advplyr/fix_podcast_session_track_index
Fix podcast episode track index null in playback session
2025-07-22 15:04:22 -05:00
advplyr 8c38987d92 Fix podcast episode track index null in playback session 2025-07-22 14:44:36 -05:00
Josh Vincent 9da0be6d36 Allow clicking on elapsedTime to adjust chapter start 2025-06-08 13:18:41 -06:00
Josh Vincent c41bdb951c Moves the lock button and fixes padding on bulk add feature.
Moves the lock button the right of the Title text box.

Enhances the bulk chapter add feature by preserving zero-padding in chapter titles and prevents editing of locked chapters. Also allows Enter to be pressed in the Add Multiple Chapters modal.

Adds a warning toast when attempting to modify locked chapters.

Fixes sizing of boxes on smaller windows
2025-06-07 14:48:05 -06:00
Josh Vincent 54815ea9c7 Add a second to bulk chapters so its valid
This will enable users to go in and fix the chapter timing later but still save easily with the bulk import.
2025-06-06 13:25:20 -06:00
Josh Vincent 679ffed0ea Alphabetizes strings 2025-06-06 11:50:44 -06:00
Josh Vincent 09397cf3de Improves chapter editing and adds bulk import
Adds chapter locking functionality, allowing users to lock individual chapters or all chapters at once to prevent accidental edits.

Implements time increment buttons to precisely adjust chapter start times.

Introduces bulk chapter import functionality, allowing users to quickly add multiple chapters using a detected numbering pattern.

Adds elapsed time display during chapter playback for better user feedback.

Updates UI tooltips and icons for improved clarity and user experience.
2025-06-06 11:22:38 -06:00
87 changed files with 4168 additions and 873 deletions
+4 -15
View File
@@ -3,24 +3,18 @@
<div class="flex md:hidden h-10 items-center"> <div class="flex md:hidden h-10 items-center">
<nuxt-link :to="`/library/${currentLibraryId}`" class="grow h-full flex justify-center items-center" :class="isHomePage ? 'bg-primary/80' : 'bg-primary/40'"> <nuxt-link :to="`/library/${currentLibraryId}`" class="grow h-full flex justify-center items-center" :class="isHomePage ? 'bg-primary/80' : 'bg-primary/40'">
<p v-if="isHomePage || isPodcastLibrary" class="text-sm">{{ $strings.ButtonHome }}</p> <p v-if="isHomePage || isPodcastLibrary" class="text-sm">{{ $strings.ButtonHome }}</p>
<svg v-else xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <span v-else class="material-symbols text-lg">home</span>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
</svg>
</nuxt-link> </nuxt-link>
<nuxt-link :to="`/library/${currentLibraryId}/bookshelf`" class="grow h-full flex justify-center items-center" :class="isLibraryPage ? 'bg-primary/80' : 'bg-primary/40'"> <nuxt-link :to="`/library/${currentLibraryId}/bookshelf`" class="grow h-full flex justify-center items-center" :class="isLibraryPage ? 'bg-primary/80' : 'bg-primary/40'">
<p v-if="isLibraryPage || isPodcastLibrary" class="text-sm">{{ $strings.ButtonLibrary }}</p> <p v-if="isLibraryPage || isPodcastLibrary" class="text-sm">{{ $strings.ButtonLibrary }}</p>
<svg v-else xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <span v-else class="material-symbols text-lg">import_contacts</span>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" />
</svg>
</nuxt-link> </nuxt-link>
<nuxt-link v-if="isPodcastLibrary" :to="`/library/${currentLibraryId}/podcast/latest`" class="grow h-full flex justify-center items-center" :class="isPodcastLatestPage ? 'bg-primary/80' : 'bg-primary/40'"> <nuxt-link v-if="isPodcastLibrary" :to="`/library/${currentLibraryId}/podcast/latest`" class="grow h-full flex justify-center items-center" :class="isPodcastLatestPage ? 'bg-primary/80' : 'bg-primary/40'">
<p class="text-sm">{{ $strings.ButtonLatest }}</p> <p class="text-sm">{{ $strings.ButtonLatest }}</p>
</nuxt-link> </nuxt-link>
<nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/series`" class="grow h-full flex justify-center items-center" :class="isSeriesPage ? 'bg-primary/80' : 'bg-primary/40'"> <nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/series`" class="grow h-full flex justify-center items-center" :class="isSeriesPage ? 'bg-primary/80' : 'bg-primary/40'">
<p v-if="isSeriesPage" class="text-sm">{{ $strings.ButtonSeries }}</p> <p v-if="isSeriesPage" class="text-sm">{{ $strings.ButtonSeries }}</p>
<svg v-else xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <span v-else class="material-symbols text-lg">view_column</span>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2" />
</svg>
</nuxt-link> </nuxt-link>
<nuxt-link v-if="showPlaylists" :to="`/library/${currentLibraryId}/bookshelf/playlists`" class="grow h-full flex justify-center items-center" :class="isPlaylistsPage ? 'bg-primary/80' : 'bg-primary/40'"> <nuxt-link v-if="showPlaylists" :to="`/library/${currentLibraryId}/bookshelf/playlists`" class="grow h-full flex justify-center items-center" :class="isPlaylistsPage ? 'bg-primary/80' : 'bg-primary/40'">
<p v-if="isPlaylistsPage || isPodcastLibrary" class="text-sm">{{ $strings.ButtonPlaylists }}</p> <p v-if="isPlaylistsPage || isPodcastLibrary" class="text-sm">{{ $strings.ButtonPlaylists }}</p>
@@ -32,12 +26,7 @@
</nuxt-link> </nuxt-link>
<nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/authors`" class="grow h-full flex justify-center items-center" :class="isAuthorsPage ? 'bg-primary/80' : 'bg-primary/40'"> <nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/authors`" class="grow h-full flex justify-center items-center" :class="isAuthorsPage ? 'bg-primary/80' : 'bg-primary/40'">
<p v-if="isAuthorsPage" class="text-sm">{{ $strings.ButtonAuthors }}</p> <p v-if="isAuthorsPage" class="text-sm">{{ $strings.ButtonAuthors }}</p>
<svg v-else class="w-5 h-5" viewBox="0 0 24 24"> <span v-else class="material-symbols text-lg">groups</span>
<path
fill="currentColor"
d="M12,5.5A3.5,3.5 0 0,1 15.5,9A3.5,3.5 0 0,1 12,12.5A3.5,3.5 0 0,1 8.5,9A3.5,3.5 0 0,1 12,5.5M5,8C5.56,8 6.08,8.15 6.53,8.42C6.38,9.85 6.8,11.27 7.66,12.38C7.16,13.34 6.16,14 5,14A3,3 0 0,1 2,11A3,3 0 0,1 5,8M19,8A3,3 0 0,1 22,11A3,3 0 0,1 19,14C17.84,14 16.84,13.34 16.34,12.38C17.2,11.27 17.62,9.85 17.47,8.42C17.92,8.15 18.44,8 19,8M5.5,18.25C5.5,16.18 8.41,14.5 12,14.5C15.59,14.5 18.5,16.18 18.5,18.25V20H5.5V18.25M0,20V18.5C0,17.11 1.89,15.94 4.45,15.6C3.86,16.28 3.5,17.22 3.5,18.25V20H0M24,20H20.5V18.25C20.5,17.22 20.14,16.28 19.55,15.6C22.11,15.94 24,17.11 24,18.5V20Z"
/>
</svg>
</nuxt-link> </nuxt-link>
<nuxt-link v-if="isPodcastLibrary && userIsAdminOrUp" :to="`/library/${currentLibraryId}/podcast/search`" class="grow h-full flex justify-center items-center" :class="isPodcastSearchPage ? 'bg-primary/80' : 'bg-primary/40'"> <nuxt-link v-if="isPodcastLibrary && userIsAdminOrUp" :to="`/library/${currentLibraryId}/podcast/search`" class="grow h-full flex justify-center items-center" :class="isPodcastSearchPage ? 'bg-primary/80' : 'bg-primary/40'">
<p class="text-sm">{{ $strings.ButtonAdd }}</p> <p class="text-sm">{{ $strings.ButtonAdd }}</p>
+5 -16
View File
@@ -5,9 +5,7 @@
<div id="siderail-buttons-container" role="navigation" aria-label="Library Navigation" :class="{ 'player-open': streamLibraryItem }" class="w-full overflow-y-auto overflow-x-hidden"> <div id="siderail-buttons-container" role="navigation" aria-label="Library Navigation" :class="{ 'player-open': streamLibraryItem }" class="w-full overflow-y-auto overflow-x-hidden">
<nuxt-link :to="`/library/${currentLibraryId}`" class="w-full h-20 flex flex-col items-center justify-center text-white border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="homePage ? 'bg-primary/80' : 'bg-bg/60'"> <nuxt-link :to="`/library/${currentLibraryId}`" class="w-full h-20 flex flex-col items-center justify-center text-white border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="homePage ? 'bg-primary/80' : 'bg-bg/60'">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <span class="material-symbols text-2xl">home</span>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
</svg>
<p class="pt-1.5 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonHome }}</p> <p class="pt-1.5 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonHome }}</p>
@@ -23,9 +21,7 @@
</nuxt-link> </nuxt-link>
<nuxt-link :to="`/library/${currentLibraryId}/bookshelf`" class="w-full h-20 flex flex-col items-center justify-center text-white border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="showLibrary ? 'bg-primary/80' : 'bg-bg/60'"> <nuxt-link :to="`/library/${currentLibraryId}/bookshelf`" class="w-full h-20 flex flex-col items-center justify-center text-white border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="showLibrary ? 'bg-primary/80' : 'bg-bg/60'">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <span class="material-symbols text-2xl">import_contacts</span>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" />
</svg>
<p class="pt-1.5 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonLibrary }}</p> <p class="pt-1.5 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonLibrary }}</p>
@@ -33,9 +29,7 @@
</nuxt-link> </nuxt-link>
<nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/series`" class="w-full h-20 flex flex-col items-center justify-center text-white/80 border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="isSeriesPage ? 'bg-primary/80' : 'bg-bg/60'"> <nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/series`" class="w-full h-20 flex flex-col items-center justify-center text-white/80 border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="isSeriesPage ? 'bg-primary/80' : 'bg-bg/60'">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <span class="material-symbols text-2xl">view_column</span>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17V7m0 10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2h2a2 2 0 012 2m0 10a2 2 0 002 2h2a2 2 0 002-2M9 7a2 2 0 012-2h2a2 2 0 012 2m0 10V7m0 10a2 2 0 002 2h2a2 2 0 002-2V7a2 2 0 00-2-2h-2a2 2 0 00-2 2" />
</svg>
<p class="pt-1.5 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonSeries }}</p> <p class="pt-1.5 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonSeries }}</p>
@@ -59,12 +53,7 @@
</nuxt-link> </nuxt-link>
<nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/authors`" class="w-full h-20 flex flex-col items-center justify-center text-white/80 border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="isAuthorsPage ? 'bg-primary/80' : 'bg-bg/60'"> <nuxt-link v-if="isBookLibrary" :to="`/library/${currentLibraryId}/bookshelf/authors`" class="w-full h-20 flex flex-col items-center justify-center text-white/80 border-b border-primary/70 hover:bg-primary cursor-pointer relative" :class="isAuthorsPage ? 'bg-primary/80' : 'bg-bg/60'">
<svg class="w-6 h-6" viewBox="0 0 24 24"> <span class="material-symbols text-2xl">groups</span>
<path
fill="currentColor"
d="M12,5.5A3.5,3.5 0 0,1 15.5,9A3.5,3.5 0 0,1 12,12.5A3.5,3.5 0 0,1 8.5,9A3.5,3.5 0 0,1 12,5.5M5,8C5.56,8 6.08,8.15 6.53,8.42C6.38,9.85 6.8,11.27 7.66,12.38C7.16,13.34 6.16,14 5,14A3,3 0 0,1 2,11A3,3 0 0,1 5,8M19,8A3,3 0 0,1 22,11A3,3 0 0,1 19,14C17.84,14 16.84,13.34 16.34,12.38C17.2,11.27 17.62,9.85 17.47,8.42C17.92,8.15 18.44,8 19,8M5.5,18.25C5.5,16.18 8.41,14.5 12,14.5C15.59,14.5 18.5,16.18 18.5,18.25V20H5.5V18.25M0,20V18.5C0,17.11 1.89,15.94 4.45,15.6C3.86,16.28 3.5,17.22 3.5,18.25V20H0M24,20H20.5V18.25C20.5,17.22 20.14,16.28 19.55,15.6C22.11,15.94 24,17.11 24,18.5V20Z"
/>
</svg>
<p class="pt-1 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonAuthors }}</p> <p class="pt-1 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonAuthors }}</p>
@@ -116,7 +105,7 @@
</div> </div>
<div class="w-full h-12 px-1 py-2 border-t border-black/20 bg-bg absolute left-0" :style="{ bottom: streamLibraryItem ? '224px' : '65px' }"> <div class="w-full h-12 px-1 py-2 border-t border-black/20 bg-bg absolute left-0" :style="{ bottom: streamLibraryItem ? '224px' : '65px' }">
<p class="underline font-mono text-xs text-center text-gray-300 leading-3 mb-1" @click="clickChangelog">v{{ $config.version }}</p> <p class="underline font-mono text-xs text-center text-gray-300 leading-3 mb-1 cursor-pointer" @click="clickChangelog">v{{ $config.version }}</p>
<a v-if="hasUpdate" :href="githubTagUrl" target="_blank" class="text-warning text-xxs text-center block leading-3">Update</a> <a v-if="hasUpdate" :href="githubTagUrl" target="_blank" class="text-warning text-xxs text-center block leading-3">Update</a>
<p v-else class="text-xxs text-gray-400 leading-3 text-center italic">{{ Source }}</p> <p v-else class="text-xxs text-gray-400 leading-3 text-center italic">{{ Source }}</p>
</div> </div>
+29 -1
View File
@@ -101,7 +101,8 @@
<!-- Podcast Episode # --> <!-- Podcast Episode # -->
<div cy-id="podcastEpisodeNumber" v-if="recentEpisodeNumber !== null && !isHovering && !isSelectionMode && !processing" class="absolute rounded-lg bg-black/90 box-shadow-md z-10" :style="{ top: 0.375 + 'em', right: 0.375 + 'em', padding: `${0.1}em ${0.25}em` }"> <div cy-id="podcastEpisodeNumber" v-if="recentEpisodeNumber !== null && !isHovering && !isSelectionMode && !processing" class="absolute rounded-lg bg-black/90 box-shadow-md z-10" :style="{ top: 0.375 + 'em', right: 0.375 + 'em', padding: `${0.1}em ${0.25}em` }">
<p :style="{ fontSize: 0.8 + 'em' }"> <p :style="{ fontSize: 0.8 + 'em' }">
Episode<span v-if="recentEpisodeNumber"> #{{ recentEpisodeNumber }}</span> Episode
<span v-if="recentEpisodeNumber">#{{ recentEpisodeNumber }}</span>
</p> </p>
</div> </div>
@@ -200,6 +201,9 @@ export default {
dateFormat() { dateFormat() {
return this.store.getters['getServerSetting']('dateFormat') return this.store.getters['getServerSetting']('dateFormat')
}, },
timeFormat() {
return this.store.getters['getServerSetting']('timeFormat')
},
_libraryItem() { _libraryItem() {
return this.libraryItem || {} return this.libraryItem || {}
}, },
@@ -345,6 +349,18 @@ export default {
if (this.mediaMetadata.publishedYear) return this.$getString('LabelPublishedDate', [this.mediaMetadata.publishedYear]) if (this.mediaMetadata.publishedYear) return this.$getString('LabelPublishedDate', [this.mediaMetadata.publishedYear])
return '\u00A0' return '\u00A0'
} }
if (this.orderBy === 'progress') {
if (!this.userProgressLastUpdated) return '\u00A0'
return this.$getString('LabelLastProgressDate', [this.$formatDatetime(this.userProgressLastUpdated, this.dateFormat, this.timeFormat)])
}
if (this.orderBy === 'progress.createdAt') {
if (!this.userProgressStartedDate) return '\u00A0'
return this.$getString('LabelStartedDate', [this.$formatDatetime(this.userProgressStartedDate, this.dateFormat, this.timeFormat)])
}
if (this.orderBy === 'progress.finishedAt') {
if (!this.userProgressFinishedDate) return '\u00A0'
return this.$getString('LabelFinishedDate', [this.$formatDatetime(this.userProgressFinishedDate, this.dateFormat, this.timeFormat)])
}
return null return null
}, },
episodeProgress() { episodeProgress() {
@@ -377,6 +393,18 @@ export default {
let progressPercent = this.itemIsFinished ? 1 : this.booksInSeries ? this.seriesProgressPercent : this.useEBookProgress ? this.userProgress?.ebookProgress || 0 : this.userProgress?.progress || 0 let progressPercent = this.itemIsFinished ? 1 : this.booksInSeries ? this.seriesProgressPercent : this.useEBookProgress ? this.userProgress?.ebookProgress || 0 : this.userProgress?.progress || 0
return Math.max(Math.min(1, progressPercent), 0) return Math.max(Math.min(1, progressPercent), 0)
}, },
userProgressLastUpdated() {
if (!this.userProgress) return null
return this.userProgress.lastUpdate
},
userProgressStartedDate() {
if (!this.userProgress) return null
return this.userProgress.startedAt
},
userProgressFinishedDate() {
if (!this.userProgress) return null
return this.userProgress.finishedAt
},
itemIsFinished() { itemIsFinished() {
if (this.booksInSeries) return this.seriesIsFinished if (this.booksInSeries) return this.seriesIsFinished
return this.userProgress ? !!this.userProgress.isFinished : false return this.userProgress ? !!this.userProgress.isFinished : false
@@ -7,7 +7,7 @@
</span> </span>
</button> </button>
<ul v-show="showMenu" class="absolute z-10 mt-1 w-full bg-bg border border-black-200 shadow-lg max-h-96 rounded-md py-1 ring-1 ring-black/5 overflow-auto focus:outline-hidden text-sm" role="menu"> <ul v-show="showMenu" class="librarySortMenu absolute z-10 mt-1 w-full bg-bg border border-black-200 shadow-lg max-h-96 rounded-md py-1 ring-1 ring-black/5 overflow-auto focus:outline-hidden text-sm" role="menu">
<template v-for="item in selectItems"> <template v-for="item in selectItems">
<li :key="item.value" class="select-none relative py-2 pr-9 cursor-pointer hover:bg-white/5" :class="item.value === selected ? 'bg-white/5 text-yellow-400' : 'text-gray-200 hover:text-white'" role="menuitem" @click="clickedOption(item.value)"> <li :key="item.value" class="select-none relative py-2 pr-9 cursor-pointer hover:bg-white/5" :class="item.value === selected ? 'bg-white/5 text-yellow-400' : 'text-gray-200 hover:text-white'" role="menuitem" @click="clickedOption(item.value)">
<div class="flex items-center"> <div class="flex items-center">
@@ -130,6 +130,18 @@ export default {
text: this.$strings.LabelFileModified, text: this.$strings.LabelFileModified,
value: 'mtimeMs' value: 'mtimeMs'
}, },
{
text: this.$strings.LabelLibrarySortByProgress,
value: 'progress'
},
{
text: this.$strings.LabelLibrarySortByProgressStarted,
value: 'progress.createdAt'
},
{
text: this.$strings.LabelLibrarySortByProgressFinished,
value: 'progress.finishedAt'
},
{ {
text: this.$strings.LabelRandomly, text: this.$strings.LabelRandomly,
value: 'random' value: 'random'
@@ -191,3 +203,9 @@ export default {
} }
} }
</script> </script>
<style scoped>
.librarySortMenu {
max-height: calc(100vh - 125px);
}
</style>
+145 -19
View File
@@ -51,19 +51,21 @@
<form @submit.prevent="submitSearchForm"> <form @submit.prevent="submitSearchForm">
<div class="flex flex-wrap sm:flex-nowrap items-center justify-start -mx-1"> <div class="flex flex-wrap sm:flex-nowrap items-center justify-start -mx-1">
<div class="w-48 grow p-1"> <div class="w-48 grow p-1">
<ui-dropdown v-model="provider" :items="providers" :label="$strings.LabelProvider" small /> <ui-dropdown v-model="provider" :items="providers" :disabled="searchInProgress" :label="$strings.LabelProvider" small />
</div> </div>
<div class="w-72 grow p-1"> <div class="w-72 grow p-1">
<ui-text-input-with-label v-model="searchTitle" :label="searchTitleLabel" :placeholder="$strings.PlaceholderSearch" /> <ui-text-input-with-label v-model="searchTitle" :disabled="searchInProgress" :label="searchTitleLabel" :placeholder="$strings.PlaceholderSearch" />
</div> </div>
<div v-show="provider != 'itunes' && provider != 'audiobookcovers'" class="w-72 grow p-1"> <div v-show="provider != 'itunes' && provider != 'audiobookcovers'" class="w-72 grow p-1">
<ui-text-input-with-label v-model="searchAuthor" :label="$strings.LabelAuthor" /> <ui-text-input-with-label v-model="searchAuthor" :disabled="searchInProgress" :label="$strings.LabelAuthor" />
</div> </div>
<ui-btn class="mt-5 ml-1 md:min-w-24" :padding-x="4" type="submit">{{ $strings.ButtonSearch }}</ui-btn> <ui-btn v-if="!searchInProgress" class="mt-5 ml-1 md:min-w-24" :padding-x="4" type="submit">{{ $strings.ButtonSearch }}</ui-btn>
<ui-btn v-else class="mt-5 ml-1 md:min-w-24" :padding-x="4" type="button" color="bg-error" @click.prevent="cancelCurrentSearch">{{ $strings.ButtonCancel }}</ui-btn>
</div> </div>
</form> </form>
<div v-if="hasSearched" class="flex items-center flex-wrap justify-center sm:max-h-80 sm:overflow-y-scroll mt-2 max-w-full"> <div v-if="hasSearched" class="flex items-center flex-wrap justify-center sm:max-h-80 sm:overflow-y-scroll mt-2 max-w-full">
<p v-if="!coversFound.length">{{ $strings.MessageNoCoversFound }}</p> <p v-if="searchInProgress && !coversFound.length" class="text-gray-300 py-4">{{ $strings.MessageLoading }}</p>
<p v-else-if="!searchInProgress && !coversFound.length" class="text-gray-300 py-4">{{ $strings.MessageNoCoversFound }}</p>
<template v-for="cover in coversFound"> <template v-for="cover in coversFound">
<div :key="cover" class="m-0.5 mb-5 border-2 border-transparent hover:border-yellow-300 cursor-pointer" :class="cover === coverPath ? 'border-yellow-300' : ''" @click="updateCover(cover)"> <div :key="cover" class="m-0.5 mb-5 border-2 border-transparent hover:border-yellow-300 cursor-pointer" :class="cover === coverPath ? 'border-yellow-300' : ''" @click="updateCover(cover)">
<covers-preview-cover :src="cover" :width="80" show-open-new-tab :book-cover-aspect-ratio="bookCoverAspectRatio" /> <covers-preview-cover :src="cover" :width="80" show-open-new-tab :book-cover-aspect-ratio="bookCoverAspectRatio" />
@@ -105,7 +107,10 @@ export default {
showLocalCovers: false, showLocalCovers: false,
previewUpload: null, previewUpload: null,
selectedFile: null, selectedFile: null,
provider: 'google' provider: 'google',
currentSearchRequestId: null,
searchInProgress: false,
socketListenersActive: false
} }
}, },
watch: { watch: {
@@ -129,7 +134,7 @@ export default {
}, },
providers() { providers() {
if (this.isPodcast) return this.$store.state.scanners.podcastProviders if (this.isPodcast) return this.$store.state.scanners.podcastProviders
return [{ text: 'All', value: 'all' }, ...this.$store.state.scanners.providers, ...this.$store.state.scanners.coverOnlyProviders] return [{ text: 'Best', value: 'best' }, ...this.$store.state.scanners.providers, ...this.$store.state.scanners.coverOnlyProviders, { text: 'All', value: 'all' }]
}, },
searchTitleLabel() { searchTitleLabel() {
if (this.provider.startsWith('audible')) return this.$strings.LabelSearchTitleOrASIN if (this.provider.startsWith('audible')) return this.$strings.LabelSearchTitleOrASIN
@@ -186,6 +191,9 @@ export default {
_file.localPath = `${process.env.serverUrl}/api/items/${this.libraryItemId}/file/${file.ino}?token=${this.userToken}` _file.localPath = `${process.env.serverUrl}/api/items/${this.libraryItemId}/file/${file.ino}?token=${this.userToken}`
return _file return _file
}) })
},
socket() {
return this.$root.socket
} }
}, },
methods: { methods: {
@@ -235,7 +243,19 @@ export default {
this.searchTitle = this.mediaMetadata.title || '' this.searchTitle = this.mediaMetadata.title || ''
this.searchAuthor = this.mediaMetadata.authorName || '' this.searchAuthor = this.mediaMetadata.authorName || ''
if (this.isPodcast) this.provider = 'itunes' if (this.isPodcast) this.provider = 'itunes'
else this.provider = localStorage.getItem('book-cover-provider') || localStorage.getItem('book-provider') || 'google' else {
// Migrate from 'all' to 'best' (only once)
const migrationKey = 'book-cover-provider-migrated'
const currentProvider = localStorage.getItem('book-cover-provider') || localStorage.getItem('book-provider') || 'google'
if (!localStorage.getItem(migrationKey) && currentProvider === 'all') {
localStorage.setItem('book-cover-provider', 'best')
localStorage.setItem(migrationKey, 'true')
this.provider = 'best'
} else {
this.provider = currentProvider
}
}
}, },
removeCover() { removeCover() {
if (!this.coverPath) { if (!this.coverPath) {
@@ -291,22 +311,116 @@ export default {
console.error('PersistProvider', error) console.error('PersistProvider', error)
} }
}, },
generateRequestId() {
return `cover-search-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
},
addSocketListeners() {
if (!this.socket || this.socketListenersActive) return
this.socket.on('cover_search_result', this.handleSearchResult)
this.socket.on('cover_search_complete', this.handleSearchComplete)
this.socket.on('cover_search_error', this.handleSearchError)
this.socket.on('cover_search_provider_error', this.handleProviderError)
this.socket.on('cover_search_cancelled', this.handleSearchCancelled)
this.socket.on('disconnect', this.handleSocketDisconnect)
this.socketListenersActive = true
},
removeSocketListeners() {
if (!this.socket || !this.socketListenersActive) return
this.socket.off('cover_search_result', this.handleSearchResult)
this.socket.off('cover_search_complete', this.handleSearchComplete)
this.socket.off('cover_search_error', this.handleSearchError)
this.socket.off('cover_search_provider_error', this.handleProviderError)
this.socket.off('cover_search_cancelled', this.handleSearchCancelled)
this.socket.off('disconnect', this.handleSocketDisconnect)
this.socketListenersActive = false
},
handleSearchResult(data) {
if (data.requestId !== this.currentSearchRequestId) return
// Add new covers to the list (avoiding duplicates)
const newCovers = data.covers.filter((cover) => !this.coversFound.includes(cover))
this.coversFound.push(...newCovers)
},
handleSearchComplete(data) {
if (data.requestId !== this.currentSearchRequestId) return
this.searchInProgress = false
this.currentSearchRequestId = null
},
handleSearchError(data) {
if (data.requestId !== this.currentSearchRequestId) return
console.error('[Cover Search] Search error:', data.error)
this.$toast.error(this.$strings.ToastCoverSearchFailed)
this.searchInProgress = false
this.currentSearchRequestId = null
},
handleProviderError(data) {
if (data.requestId !== this.currentSearchRequestId) return
console.warn(`[Cover Search] Provider ${data.provider} failed:`, data.error)
},
handleSearchCancelled(data) {
if (data.requestId !== this.currentSearchRequestId) return
this.searchInProgress = false
this.currentSearchRequestId = null
},
handleSocketDisconnect() {
// If we were in the middle of a search, cancel it (server can't send results anymore)
if (this.searchInProgress && this.currentSearchRequestId) {
this.searchInProgress = false
this.currentSearchRequestId = null
}
},
cancelCurrentSearch() {
if (!this.currentSearchRequestId || !this.socket?.connected) {
console.error('[Cover Search] Socket not connected')
this.$toast.error(this.$strings.ToastConnectionNotAvailable)
return
}
this.socket.emit('cancel_cover_search', this.currentSearchRequestId)
this.currentSearchRequestId = null
this.searchInProgress = false
},
async submitSearchForm() { async submitSearchForm() {
if (!this.socket?.connected) {
console.error('[Cover Search] Socket not connected')
this.$toast.error(this.$strings.ToastConnectionNotAvailable)
return
}
// Cancel any existing search
if (this.searchInProgress) {
this.cancelCurrentSearch()
}
// Store provider in local storage // Store provider in local storage
this.persistProvider() this.persistProvider()
this.isProcessing = true // Setup socket listeners if not already done
const searchQuery = this.getSearchQuery() this.addSocketListeners()
const results = await this.$axios
.$get(`/api/search/covers?${searchQuery}`) // Clear previous results
.then((res) => res.results) this.coversFound = []
.catch((error) => {
console.error('Failed', error)
return []
})
this.coversFound = results
this.isProcessing = false
this.hasSearched = true this.hasSearched = true
this.searchInProgress = true
// Generate unique request ID
const requestId = this.generateRequestId()
this.currentSearchRequestId = requestId
// Emit search request via WebSocket
this.socket.emit('search_covers', {
requestId,
title: this.searchTitle,
author: this.searchAuthor || '',
provider: this.provider,
podcast: this.isPodcast
})
}, },
setCover(coverFile) { setCover(coverFile) {
this.isProcessing = true this.isProcessing = true
@@ -320,6 +434,18 @@ export default {
this.isProcessing = false this.isProcessing = false
}) })
} }
},
mounted() {
// Setup socket listeners when component is mounted
this.addSocketListeners()
},
beforeDestroy() {
// Cancel any ongoing search when component is destroyed
if (this.searchInProgress) {
this.cancelCurrentSearch()
}
// Remove socket listeners
this.removeSocketListeners()
} }
} }
</script> </script>
+5 -3
View File
@@ -77,8 +77,8 @@
<ui-checkbox v-model="selectedMatchUsage.author" checkbox-bg="bg" @input="checkboxToggled" /> <ui-checkbox v-model="selectedMatchUsage.author" checkbox-bg="bg" @input="checkboxToggled" />
<div class="grow ml-4"> <div class="grow ml-4">
<ui-text-input-with-label v-model="selectedMatch.author" :disabled="!selectedMatchUsage.author" :label="$strings.LabelAuthor" /> <ui-text-input-with-label v-model="selectedMatch.author" :disabled="!selectedMatchUsage.author" :label="$strings.LabelAuthor" />
<p v-if="mediaMetadata.authorName" class="text-xs ml-1 text-white/60"> <p v-if="mediaMetadata.authorName || (isPodcast && mediaMetadata.author)" class="text-xs ml-1 text-white/60">
{{ $strings.LabelCurrently }} <a title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('author', mediaMetadata.authorName)">{{ mediaMetadata.authorName }}</a> {{ $strings.LabelCurrently }} <a title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('author', isPodcast ? mediaMetadata.author : mediaMetadata.authorName)">{{ isPodcast ? mediaMetadata.author : mediaMetadata.authorName }}</a>
</p> </p>
</div> </div>
</div> </div>
@@ -400,7 +400,9 @@ export default {
this.$toast.warning(this.$strings.ToastTitleRequired) this.$toast.warning(this.$strings.ToastTitleRequired)
return return
} }
this.persistProvider() if (!this.isPodcast) {
this.persistProvider()
}
this.runSearch() this.runSearch()
}, },
async runSearch() { async runSearch() {
@@ -94,7 +94,6 @@ export default {
} }
this.processing = false this.processing = false
this.$toast.success(`${this.episodes.length} episode${this.episodes.length > 1 ? 's' : ''} removed`)
this.show = false this.show = false
this.$emit('clearSelected') this.$emit('clearSelected')
} }
@@ -114,7 +114,7 @@ export default {
.$patch(`/api/podcasts/${this.libraryItem.id}/episode/${this.episodeId}`, updatePayload) .$patch(`/api/podcasts/${this.libraryItem.id}/episode/${this.episodeId}`, updatePayload)
.then(() => { .then(() => {
this.isProcessing = false this.isProcessing = false
this.$toast.success('Podcast episode updated') this.$toast.success(this.$strings.ToastPodcastEpisodeUpdated)
this.$emit('selectTab', 'details') this.$emit('selectTab', 'details')
}) })
.catch((error) => { .catch((error) => {
+19 -9
View File
@@ -99,22 +99,32 @@ export default {
return `/api/items/${this.libraryItemId}/ebook` return `/api/items/${this.libraryItemId}/ebook`
}, },
themeRules() { themeRules() {
const isDark = this.ereaderSettings.theme === 'dark' const theme = this.ereaderSettings.theme
const fontColor = isDark ? '#fff' : '#000' const isDark = theme === 'dark'
const backgroundColor = isDark ? 'rgb(35 35 35)' : 'rgb(255, 255, 255)' const isSepia = theme === 'sepia'
const fontColor = isDark
? '#fff'
: isSepia
? '#5b4636'
: '#000'
const backgroundColor = isDark
? 'rgb(35 35 35)'
: isSepia
? 'rgb(244, 236, 216)'
: 'rgb(255, 255, 255)'
const lineSpacing = this.ereaderSettings.lineSpacing / 100 const lineSpacing = this.ereaderSettings.lineSpacing / 100
const fontScale = this.ereaderSettings.fontScale / 100
const fontScale = this.ereaderSettings.fontScale / 100 const textStroke = this.ereaderSettings.textStroke / 100
const textStroke = this.ereaderSettings.textStroke / 100
return { return {
'*': { '*': {
color: `${fontColor}!important`, color: `${fontColor}!important`,
'background-color': `${backgroundColor}!important`, 'background-color': `${backgroundColor}!important`,
'line-height': lineSpacing * fontScale + 'rem!important', 'line-height': `${lineSpacing * fontScale}rem!important`,
'-webkit-text-stroke': textStroke + 'px ' + fontColor + '!important' '-webkit-text-stroke': `${textStroke}px ${fontColor}!important`
}, },
a: { a: {
color: `${fontColor}!important` color: `${fontColor}!important`
+12 -3
View File
@@ -1,5 +1,5 @@
<template> <template>
<div v-if="show" id="reader" :data-theme="ereaderTheme" class="group absolute top-0 left-0 w-full z-60 data-[theme=dark]:bg-primary data-[theme=dark]:text-white data-[theme=light]:bg-white data-[theme=light]:text-black" :class="{ 'reader-player-open': !!streamLibraryItem }"> <div v-if="show" id="reader" :data-theme="ereaderTheme" class="group absolute top-0 left-0 w-full z-60 data-[theme=dark]:bg-primary data-[theme=dark]:text-white data-[theme=light]:bg-white data-[theme=light]:text-black data-[theme=sepia]:bg-[rgb(244,236,216)] data-[theme=sepia]:text-[#5b4636]" :class="{ 'reader-player-open': !!streamLibraryItem }">
<div class="absolute top-4 left-4 z-20 flex items-center"> <div class="absolute top-4 left-4 z-20 flex items-center">
<button v-if="isEpub" @click="toggleToC" type="button" aria-label="Table of contents menu" class="inline-flex opacity-80 hover:opacity-100"> <button v-if="isEpub" @click="toggleToC" type="button" aria-label="Table of contents menu" class="inline-flex opacity-80 hover:opacity-100">
<span class="material-symbols text-2xl">menu</span> <span class="material-symbols text-2xl">menu</span>
@@ -27,7 +27,12 @@
<!-- TOC side nav --> <!-- TOC side nav -->
<div v-if="tocOpen" class="w-full h-full overflow-y-scroll absolute inset-0 bg-black/20 z-20" @click.stop.prevent="toggleToC"></div> <div v-if="tocOpen" class="w-full h-full overflow-y-scroll absolute inset-0 bg-black/20 z-20" @click.stop.prevent="toggleToC"></div>
<div v-if="isEpub" class="w-96 h-full max-h-full absolute top-0 left-0 shadow-xl transition-transform z-30 group-data-[theme=dark]:bg-primary group-data-[theme=dark]:text-white group-data-[theme=light]:bg-white group-data-[theme=light]:text-black" :class="tocOpen ? 'translate-x-0' : '-translate-x-96'" @click.stop.prevent> <div
v-if="isEpub"
class="w-96 h-full max-h-full absolute top-0 left-0 shadow-xl transition-transform z-30 group-data-[theme=dark]:bg-primary group-data-[theme=dark]:text-white group-data-[theme=light]:bg-white group-data-[theme=light]:text-black group-data-[theme=sepia]:bg-[rgb(244,236,216)] group-data-[theme=sepia]:text-[#5b4636]"
:class="tocOpen ? 'translate-x-0' : '-translate-x-96'"
@click.stop.prevent
>
<div class="flex flex-col p-4 h-full"> <div class="flex flex-col p-4 h-full">
<div class="flex items-center mb-2"> <div class="flex items-center mb-2">
<button @click.stop.prevent="toggleToC" type="button" aria-label="Close table of contents" class="inline-flex opacity-80 hover:opacity-100"> <button @click.stop.prevent="toggleToC" type="button" aria-label="Close table of contents" class="inline-flex opacity-80 hover:opacity-100">
@@ -37,7 +42,7 @@
<p class="text-lg font-semibold ml-2">{{ $strings.HeaderTableOfContents }}</p> <p class="text-lg font-semibold ml-2">{{ $strings.HeaderTableOfContents }}</p>
</div> </div>
<form @submit.prevent="searchBook" @click.stop.prevent> <form @submit.prevent="searchBook" @click.stop.prevent>
<ui-text-input clearable ref="input" @clear="searchBook" v-model="searchQuery" :placeholder="$strings.PlaceholderSearch" class="h-8 w-full text-sm flex mb-2" /> <ui-text-input clearable ref="input" @clear="searchBook" v-model="searchQuery" :placeholder="$strings.PlaceholderSearch" custom-input-class="text-inherit !bg-inherit" class="h-8 w-full text-sm flex mb-2" />
</form> </form>
<div class="overflow-y-auto"> <div class="overflow-y-auto">
@@ -181,6 +186,10 @@ export default {
text: this.$strings.LabelThemeDark, text: this.$strings.LabelThemeDark,
value: 'dark' value: 'dark'
}, },
{
text: this.$strings.LabelThemeSepia,
value: 'sepia'
},
{ {
text: this.$strings.LabelThemeLight, text: this.$strings.LabelThemeLight,
value: 'light' value: 'light'
+1 -1
View File
@@ -152,7 +152,7 @@ export default {
this.showingTooltipIndex = index this.showingTooltipIndex = index
this.tooltipEl.style.display = 'block' this.tooltipEl.style.display = 'block'
this.tooltipTextEl.innerHTML = block.value ? `<strong>${this.$elapsedPretty(block.value, true)} listening</strong> on ${block.datePretty}` : `No listening sessions on ${block.datePretty}` this.tooltipTextEl.innerHTML = block.value ? this.$getString('MessageHeatmapListeningTimeTooltip', [this.$elapsedPrettyLocalized(block.value, true), block.datePretty]) : this.$getString('MessageHeatmapNoListeningSessions', [block.datePretty])
const calculateRect = this.tooltipEl.getBoundingClientRect() const calculateRect = this.tooltipEl.getBoundingClientRect()
+2 -6
View File
@@ -1,9 +1,7 @@
<template> <template>
<div class="flex flex-wrap justify-center mt-6"> <div class="flex flex-wrap justify-center mt-6">
<div class="flex p-2"> <div class="flex p-2">
<svg class="h-14 w-14" viewBox="0 0 24 24"> <span class="material-symbols text-5xl py-1">newsstand</span>
<path fill="currentColor" d="M9 3V18H12V3H9M12 5L16 18L19 17L15 4L12 5M5 5V18H8V5H5M3 19V21H21V19H3Z" />
</svg>
<div class="px-1"> <div class="px-1">
<p class="text-4.5xl leading-none font-bold">{{ $formatNumber(totalItems) }}</p> <p class="text-4.5xl leading-none font-bold">{{ $formatNumber(totalItems) }}</p>
<p class="text-xs md:text-sm text-white/80">{{ $strings.LabelStatsItemsInLibrary }}</p> <p class="text-xs md:text-sm text-white/80">{{ $strings.LabelStatsItemsInLibrary }}</p>
@@ -19,9 +17,7 @@
</div> </div>
<div v-if="isBookLibrary" class="flex p-2"> <div v-if="isBookLibrary" class="flex p-2">
<svg class="h-14 w-14" viewBox="0 0 24 24"> <span class="material-symbols text-5xl py-1">person</span>
<path fill="currentColor" d="M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,6A2,2 0 0,0 10,8A2,2 0 0,0 12,10A2,2 0 0,0 14,8A2,2 0 0,0 12,6M12,13C14.67,13 20,14.33 20,17V20H4V17C4,14.33 9.33,13 12,13M12,14.9C9.03,14.9 5.9,16.36 5.9,17V18.1H18.1V17C18.1,16.36 14.97,14.9 12,14.9Z" />
</svg>
<div class="px-1"> <div class="px-1">
<p class="text-4.5xl leading-none font-bold">{{ $formatNumber(totalAuthors) }}</p> <p class="text-4.5xl leading-none font-bold">{{ $formatNumber(totalAuthors) }}</p>
<p class="text-xs md:text-sm text-white/80">{{ $strings.LabelStatsAuthors }}</p> <p class="text-xs md:text-sm text-white/80">{{ $strings.LabelStatsAuthors }}</p>
+6 -4
View File
@@ -4,10 +4,11 @@
<div ref="wrapper" class="relative"> <div ref="wrapper" class="relative">
<form @submit.prevent="submitForm"> <form @submit.prevent="submitForm">
<div ref="inputWrapper" role="list" style="min-height: 36px" class="flex-wrap relative w-full shadow-xs flex items-center border border-gray-600 rounded-sm px-2 py-1" :class="wrapperClass" @click.stop.prevent="clickWrapper" @mouseup.stop.prevent @mousedown.prevent> <div ref="inputWrapper" role="list" style="min-height: 36px" class="flex-wrap relative w-full shadow-xs flex items-center border border-gray-600 rounded-sm px-2 py-1" :class="wrapperClass" @click.stop.prevent="clickWrapper" @mouseup.stop.prevent @mousedown.prevent>
<div v-for="item in selected" :key="item" role="listitem" class="rounded-full px-2 py-1 mx-0.5 my-0.5 text-xs bg-bg flex flex-nowrap break-all items-center relative"> <!-- Use index in v-for and key in case the same key exists multiple times -->
<div v-for="(item, idx) in selected" :key="item + '-' + idx" role="listitem" class="rounded-full px-2 py-1 mx-0.5 my-0.5 text-xs bg-bg flex flex-nowrap break-all items-center relative">
<div v-if="!disabled" class="w-full h-full rounded-full absolute top-0 left-0 px-1 bg-bg/75 flex items-center justify-end opacity-0 hover:opacity-100" :class="{ 'opacity-100': inputFocused }"> <div v-if="!disabled" class="w-full h-full rounded-full absolute top-0 left-0 px-1 bg-bg/75 flex items-center justify-end opacity-0 hover:opacity-100" :class="{ 'opacity-100': inputFocused }">
<button v-if="showEdit" type="button" :aria-label="$strings.ButtonEdit" class="material-symbols text-white hover:text-warning cursor-pointer" style="font-size: 1.1rem" @click.stop="editItem(item)">edit</button> <button v-if="showEdit" type="button" :aria-label="$strings.ButtonEdit" class="material-symbols text-white hover:text-warning cursor-pointer" style="font-size: 1.1rem" @click.stop="editItem(item)">edit</button>
<button type="button" :aria-label="$strings.ButtonRemove" class="material-symbols text-white hover:text-error focus:text-error cursor-pointer" style="font-size: 1.1rem" @click.stop="removeItem(item)" @keydown.enter.stop.prevent="removeItem(item)" @focus="setInputFocused(true)" @blur="setInputFocused(false)" tabindex="0">close</button> <button type="button" :aria-label="$strings.ButtonRemove" class="material-symbols text-white hover:text-error focus:text-error cursor-pointer" style="font-size: 1.1rem" @click.stop="removeItem(item, idx)" @keydown.enter.stop.prevent="removeItem(item, idx)" @focus="setInputFocused(true)" @blur="setInputFocused(false)" tabindex="0">close</button>
</div> </div>
{{ item }} {{ item }}
</div> </div>
@@ -259,8 +260,9 @@ export default {
} }
this.focus() this.focus()
}, },
removeItem(item) { removeItem(item, idx) {
var remaining = this.selected.filter((i) => i !== item) var remaining = this.selected.slice()
remaining.splice(idx, 1)
this.$emit('input', remaining) this.$emit('input', remaining)
this.$emit('removedItem', item) this.$emit('removedItem', item)
this.$nextTick(() => { this.$nextTick(() => {
+3 -7
View File
@@ -1,12 +1,8 @@
<template> <template>
<button :aria-label="isRead ? $strings.MessageMarkAsNotFinished : $strings.MessageMarkAsFinished" class="icon-btn rounded-md flex items-center justify-center h-9 w-9 relative" :class="borderless ? '' : 'bg-primary border border-gray-600'" @click="clickBtn"> <button :aria-label="isRead ? $strings.MessageMarkAsNotFinished : $strings.MessageMarkAsFinished" class="icon-btn rounded-md flex items-center justify-center h-9 w-9 relative" :class="borderless ? '' : 'bg-primary border border-gray-600'" @click="clickBtn">
<div class="w-5 h-5 text-white relative"> <div class="w-5 h-5 relative">
<svg v-if="isRead" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="rgb(63, 181, 68)"> <span v-if="isRead" class="material-symbols fill text-xl text-success">beenhere</span>
<path d="M19 1H5c-1.1 0-1.99.9-1.99 2L3 15.93c0 .69.35 1.3.88 1.66L12 23l8.11-5.41c.53-.36.88-.97.88-1.66L21 3c0-1.1-.9-2-2-2zm-9 15l-5-5 1.41-1.41L10 13.17l7.59-7.59L19 7l-9 9z" /> <span v-else class="material-symbols text-xl text-white">beenhere</span>
</svg>
<svg v-else xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M19 1H5c-1.1 0-1.99.9-1.99 2L3 15.93c0 .69.35 1.3.88 1.66L12 23l8.11-5.41c.53-.36.88-.97.88-1.66L21 3c0-1.1-.9-2-2-2zm-7 19.6l-7-4.66V3h14v12.93l-7 4.67zm-2.01-7.42l-2.58-2.59L6 12l4 4 8-8-1.42-1.42z" />
</svg>
</div> </div>
</button> </button>
</template> </template>
@@ -1,40 +1,6 @@
<template> <template>
<ui-tooltip :text="$strings.LabelExplicit" direction="top"> <ui-tooltip :text="$strings.LabelExplicit" direction="top">
<svg xmlns="http://www.w3.org/2000/svg" width="12px" height="12px" viewBox="0 0 512 512" class="ml-1"> <span class="material-symbols fill text-sm ml-1 !block">explicit</span>
<path
fill="white"
d="M 89.00,40.12
C 89.00,40.12 127.00,40.12 127.00,40.12
127.00,40.12 198.00,40.12 198.00,40.12
198.00,40.12 416.00,40.12 416.00,40.12
446.58,40.05 472.95,66.42 473.00,97.00
473.00,97.00 473.00,303.00 473.00,303.00
473.00,303.00 473.00,418.00 473.00,418.00
472.65,447.55 445.06,472.95 416.00,473.00
416.00,473.00 210.00,473.00 210.00,473.00
210.00,473.00 95.00,473.00 95.00,473.00
65.45,472.65 40.05,445.06 40.00,416.00
40.00,416.00 40.00,136.00 40.00,136.00
40.00,136.00 40.00,109.00 40.00,109.00
40.00,109.00 40.00,96.00 40.00,96.00
40.07,81.58 46.89,67.14 57.01,57.01
61.17,52.86 64.86,50.13 70.00,47.31
77.25,43.33 81.02,42.18 89.00,40.12 Z
M 337.00,121.00
C 337.00,121.00 175.00,121.00 175.00,121.00
175.00,121.00 175.00,392.00 175.00,392.00
175.00,392.00 337.00,392.00 337.00,392.00
337.00,392.00 337.00,349.00 337.00,349.00
337.00,349.00 226.00,349.00 226.00,349.00
226.00,349.00 226.00,274.00 226.00,274.00
226.00,274.00 332.00,274.00 332.00,274.00
332.00,274.00 332.00,232.00 332.00,232.00
332.00,232.00 226.00,232.00 226.00,232.00
226.00,232.00 226.00,164.00 226.00,164.00
226.00,164.00 337.00,164.00 337.00,164.00
337.00,164.00 337.00,121.00 337.00,121.00 Z"
/>
</svg>
</ui-tooltip> </ui-tooltip>
</template> </template>
+1 -1
View File
@@ -199,7 +199,7 @@ export default {
} }
} else { } else {
console.error('User has no more accessible libraries') console.error('User has no more accessible libraries')
this.$store.commit('libraries/setCurrentLibrary', null) this.$store.commit('libraries/setCurrentLibrary', { id: null })
} }
} }
}, },
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "audiobookshelf-client", "name": "audiobookshelf-client",
"version": "2.26.2", "version": "2.30.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "audiobookshelf-client", "name": "audiobookshelf-client",
"version": "2.26.2", "version": "2.30.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@nuxtjs/axios": "^5.13.6", "@nuxtjs/axios": "^5.13.6",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "audiobookshelf-client", "name": "audiobookshelf-client",
"version": "2.26.2", "version": "2.30.0",
"buildNumber": 1, "buildNumber": 1,
"description": "Self-hosted audiobook and podcast client", "description": "Self-hosted audiobook and podcast client",
"main": "index.js", "main": "index.js",
+390 -89
View File
@@ -12,24 +12,24 @@
<p class="text-base font-mono ml-4 hidden md:block">{{ $secondsToTimestamp(mediaDurationRounded) }}</p> <p class="text-base font-mono ml-4 hidden md:block">{{ $secondsToTimestamp(mediaDurationRounded) }}</p>
</div> </div>
<div class="flex flex-wrap-reverse lg:flex-nowrap justify-center py-4 px-4"> <div class="flex flex-wrap-reverse min-[1120px]:flex-nowrap justify-center py-4 px-4">
<div class="w-full max-w-3xl py-4"> <div class="w-full max-w-3xl py-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="w-12 hidden lg:block" /> <div class="w-12 hidden min-w-[1120px]:block" />
<p class="text-lg mb-4 font-semibold">{{ $strings.HeaderChapters }}</p> <p class="text-lg mb-4 font-semibold">{{ $strings.HeaderChapters }}</p>
<div class="grow" /> <div class="grow" />
<ui-checkbox v-model="showSecondInputs" checkbox-bg="primary" small label-class="text-sm text-gray-200 pl-1" :label="$strings.LabelShowSeconds" class="mx-2" /> <ui-checkbox v-model="showSecondInputs" checkbox-bg="primary" small label-class="text-sm text-gray-200 pl-1" :label="$strings.LabelShowSeconds" class="mx-2" />
<div class="w-32 hidden lg:block" /> <div class="w-32 hidden min-[1120px]:block" />
</div> </div>
<div class="flex items-center mb-3 py-1 -mx-1"> <div class="flex items-center mb-3 py-1 -mx-1">
<div class="w-12 hidden lg:block" /> <div class="w-12 hidden min-[1120px]:block" />
<ui-btn v-if="chapters.length" color="bg-primary" small class="mx-1 whitespace-nowrap" @click.stop="removeAllChaptersClick">{{ $strings.ButtonRemoveAll }}</ui-btn> <ui-btn v-if="chapters.length" color="bg-primary" small class="mx-1 whitespace-nowrap" @click.stop="removeAllChaptersClick">{{ $strings.ButtonRemoveAll }}</ui-btn>
<ui-btn v-if="newChapters.length > 1" :color="showShiftTimes ? 'bg-bg' : 'bg-primary'" class="mx-1 whitespace-nowrap" small @click="showShiftTimes = !showShiftTimes">{{ $strings.ButtonShiftTimes }}</ui-btn> <ui-btn v-if="newChapters.length > 1" :color="showShiftTimes ? 'bg-bg' : 'bg-primary'" class="mx-1 whitespace-nowrap" small @click="showShiftTimes = !showShiftTimes">{{ $strings.ButtonShiftTimes }}</ui-btn>
<ui-btn color="bg-primary" small :class="{ 'mx-1': newChapters.length > 1 }" @click="showFindChaptersModal = true">{{ $strings.ButtonLookup }}</ui-btn> <ui-btn color="bg-primary" small :class="{ 'mx-1': newChapters.length > 1 }" @click="showFindChaptersModal = true">{{ $strings.ButtonLookup }}</ui-btn>
<div class="grow" /> <div class="grow" />
<ui-btn v-if="hasChanges" small class="mx-1" @click.stop="resetChapters">{{ $strings.ButtonReset }}</ui-btn> <ui-btn v-if="hasChanges" small class="mx-1" @click.stop="resetChapters">{{ $strings.ButtonReset }}</ui-btn>
<ui-btn v-if="hasChanges" color="bg-success" class="mx-1" :disabled="!hasChanges" small @click="saveChapters">{{ $strings.ButtonSave }}</ui-btn> <ui-btn v-if="hasChanges" color="bg-success" class="mx-1" :disabled="!hasChanges" small @click="saveChapters">{{ $strings.ButtonSave }}</ui-btn>
<div class="w-32 hidden lg:block" /> <div class="w-32 hidden min-[1120px]:block" />
</div> </div>
<div class="overflow-hidden"> <div class="overflow-hidden">
@@ -53,54 +53,104 @@
<div class="flex text-xs uppercase text-gray-300 font-semibold mb-2"> <div class="flex text-xs uppercase text-gray-300 font-semibold mb-2">
<div class="w-8 min-w-8 md:w-12 md:min-w-12"></div> <div class="w-8 min-w-8 md:w-12 md:min-w-12"></div>
<div class="w-24 min-w-24 md:w-32 md:min-w-32 px-2">{{ $strings.LabelStart }}</div> <div class="w-38 min-w-38 md:w-40 md:min-w-40 px-1 pl-8">{{ $strings.LabelStart }}</div>
<div class="grow px-2">{{ $strings.LabelTitle }}</div> <div class="grow px-1 min-w-54">{{ $strings.LabelTitle }}</div>
<div class="w-7 min-w-7 px-1 flex items-center justify-center">
<ui-tooltip :text="allChaptersLocked ? $strings.TooltipUnlockAllChapters : $strings.TooltipLockAllChapters" direction="bottom">
<button class="w-7 h-7 rounded-full flex items-center justify-center cursor-pointer transition-colors duration-150" :class="allChaptersLocked ? 'text-orange-400 hover:text-orange-300' : 'text-gray-300 hover:text-white'" @click="toggleAllChaptersLock">
<span class="material-symbols text-xl">{{ allChaptersLocked ? 'lock' : 'lock_open' }}</span>
</button>
</ui-tooltip>
</div>
<div class="w-32"></div> <div class="w-32"></div>
</div> </div>
<template v-for="chapter in newChapters"> <div v-for="chapter in newChapters" :key="chapter.id" class="flex py-1">
<div :key="chapter.id" class="flex py-1"> <div class="w-8 min-w-8 md:w-12 md:min-w-12">#{{ chapter.id + 1 }}</div>
<div class="w-8 min-w-8 md:w-12 md:min-w-12">#{{ chapter.id + 1 }}</div> <div class="w-38 min-w-38 md:w-40 md:min-w-40 px-1">
<div class="w-24 min-w-24 md:w-32 md:min-w-32 px-1"> <div class="flex items-center gap-1">
<ui-text-input v-if="showSecondInputs" v-model="chapter.start" type="number" class="text-xs" @change="checkChapters" /> <ui-tooltip :text="$strings.TooltipSubtractOneSecond" direction="bottom">
<ui-time-picker v-else class="text-xs" v-model="chapter.start" :show-three-digit-hour="mediaDuration >= 360000" @change="checkChapters" /> <button
</div> class="w-6 h-6 rounded-full flex items-center justify-center text-gray-300 hover:text-white transform hover:scale-110 duration-150 flex-shrink-0"
<div class="grow px-1"> :class="{ 'opacity-50 cursor-not-allowed': chapter.id === 0 && chapter.start - timeIncrementAmount < 0 }"
<ui-text-input v-model="chapter.title" @change="checkChapters" class="text-xs min-w-52" /> @click="incrementChapterTime(chapter, -timeIncrementAmount)"
</div> :disabled="chapter.id === 0 && chapter.start - timeIncrementAmount < 0"
<div class="w-32 min-w-32 px-2 py-1"> >
<div class="flex items-center"> <span class="material-symbols text-sm">remove</span>
<ui-tooltip :text="$strings.MessageRemoveChapter" direction="bottom"> </button>
<button v-if="newChapters.length > 1" class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-error transform hover:scale-110 duration-150" @click="removeChapter(chapter)"> </ui-tooltip>
<span class="material-symbols text-base">remove</span>
</button>
</ui-tooltip>
<ui-tooltip :text="$strings.MessageInsertChapterBelow" direction="bottom"> <div class="flex-1 min-w-0">
<button class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-success transform hover:scale-110 duration-150" @click="addChapter(chapter)"> <ui-text-input v-if="showSecondInputs" v-model="chapter.start" type="number" class="text-xs" @change="checkChapters" />
<span class="material-symbols text-lg">add</span> <ui-time-picker v-else class="text-xs" v-model="chapter.start" :show-three-digit-hour="mediaDuration >= 360000" @change="checkChapters" />
</button>
</ui-tooltip>
<ui-tooltip :text="selectedChapterId === chapter.id && isPlayingChapter ? $strings.MessagePauseChapter : $strings.MessagePlayChapter" direction="bottom">
<button class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-white transform hover:scale-110 duration-150" @click="playChapter(chapter)">
<widgets-loading-spinner v-if="selectedChapterId === chapter.id && isLoadingChapter" />
<span v-else-if="selectedChapterId === chapter.id && isPlayingChapter" class="material-symbols text-base">pause</span>
<span v-else class="material-symbols text-base">play_arrow</span>
</button>
</ui-tooltip>
<ui-tooltip v-if="chapter.error" :text="chapter.error" direction="left">
<button class="w-7 h-7 rounded-full flex items-center justify-center text-error">
<span class="material-symbols text-lg">error_outline</span>
</button>
</ui-tooltip>
</div> </div>
<ui-tooltip :text="$strings.TooltipAddOneSecond" direction="bottom">
<button class="w-6 h-6 rounded-full flex items-center justify-center text-gray-300 hover:text-white transform hover:scale-110 duration-150 flex-shrink-0" :class="{ 'opacity-50 cursor-not-allowed': chapter.start + timeIncrementAmount >= mediaDuration }" @click="incrementChapterTime(chapter, timeIncrementAmount)" :disabled="chapter.start + timeIncrementAmount >= mediaDuration">
<span class="material-symbols text-sm">add</span>
</button>
</ui-tooltip>
</div> </div>
</div> </div>
</template> <div class="grow px-1">
<ui-text-input v-model="chapter.title" @change="checkChapters" class="text-xs min-w-52" />
</div>
<div class="w-7 min-w-7 px-1 py-1">
<div class="flex items-center justify-center">
<ui-tooltip :text="lockedChapters.has(chapter.id) ? $strings.TooltipUnlockChapter : $strings.TooltipLockChapter" direction="bottom">
<button class="w-7 h-7 rounded-full flex items-center justify-center transform hover:scale-110 duration-150 flex-shrink-0" :class="lockedChapters.has(chapter.id) ? 'text-orange-400 hover:text-orange-300' : 'text-gray-300 hover:text-white'" @click="toggleChapterLock(chapter, $event)">
<span class="material-symbols text-base">{{ lockedChapters.has(chapter.id) ? 'lock' : 'lock_open' }}</span>
</button>
</ui-tooltip>
</div>
</div>
<div class="w-32 min-w-32 px-2 py-1">
<div class="flex items-center">
<ui-tooltip :text="$strings.MessageRemoveChapter" direction="bottom">
<button v-if="newChapters.length > 1" class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-error transform hover:scale-110 duration-150" @click="removeChapter(chapter)">
<span class="material-symbols text-base">delete</span>
</button>
</ui-tooltip>
<ui-tooltip :text="$strings.MessageInsertChapterBelow" direction="bottom">
<button class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-success transform hover:scale-110 duration-150" @click="addChapter(chapter)">
<span class="material-symbols text-lg">add_row_below</span>
</button>
</ui-tooltip>
<ui-tooltip :text="selectedChapterId === chapter.id && isPlayingChapter ? $strings.MessagePauseChapter : $strings.MessagePlayChapter" direction="bottom">
<button class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-white transform hover:scale-110 duration-150" @click="playChapter(chapter)">
<widgets-loading-spinner v-if="selectedChapterId === chapter.id && isLoadingChapter" />
<span v-else-if="selectedChapterId === chapter.id && isPlayingChapter" class="material-symbols text-base">pause</span>
<span v-else class="material-symbols text-base">play_arrow</span>
</button>
</ui-tooltip>
<ui-tooltip v-if="selectedChapterId === chapter.id && (isPlayingChapter || isLoadingChapter)" :text="$strings.TooltipAdjustChapterStart" direction="bottom">
<div class="ml-2 text-xs text-gray-300 font-mono min-w-10 cursor-pointer hover:text-white transition-colors duration-150" @click="adjustChapterStartTime(chapter)">{{ elapsedTime }}s</div>
</ui-tooltip>
<ui-tooltip v-if="chapter.error" :text="chapter.error" direction="left">
<button class="w-7 h-7 rounded-full flex items-center justify-center text-error">
<span class="material-symbols text-lg">error_outline</span>
</button>
</ui-tooltip>
</div>
</div>
</div>
<div class="flex items-center mt-4 mb-2">
<div class="w-8 min-w-8 md:w-12 md:min-w-12"></div>
<div class="w-38 min-w-38 md:w-40 md:min-w-40 px-1"></div>
<div class="flex items-center gap-2 grow px-1">
<ui-text-input v-model="bulkChapterInput" :placeholder="$strings.PlaceholderBulkChapterInput" class="text-xs grow min-w-52" @keyup.enter="handleBulkChapterAdd" />
</div>
<div class="w-39 min-w-39 px-1 py-1">
<ui-tooltip :text="$strings.TooltipAddChapters" direction="bottom" class="inline-block align-middle">
<button class="w-5 h-5 rounded-full flex items-center justify-center text-gray-300 hover:text-success transform hover:scale-110 duration-150 flex-shrink-0" :aria-label="$strings.TooltipAddChapters" :class="{ 'opacity-50 cursor-not-allowed': !bulkChapterInput.trim() }" :disabled="!bulkChapterInput.trim()" @click="handleBulkChapterAdd">
<span class="material-symbols text-lg">add</span>
</button>
</ui-tooltip>
</div>
</div>
</div> </div>
<div class="w-full max-w-xl py-4 px-2"> <div class="w-full max-w-3xl min-[1120px]:max-w-xl py-4 px-2">
<div class="flex items-center mb-4 py-1"> <div class="flex items-center mb-4 py-1">
<p class="text-lg font-semibold">{{ $strings.HeaderAudioTracks }}</p> <p class="text-lg font-semibold">{{ $strings.HeaderAudioTracks }}</p>
<div class="grow" /> <div class="grow" />
@@ -110,23 +160,19 @@
</ui-tooltip> </ui-tooltip>
</div> </div>
<div class="flex text-xs uppercase text-gray-300 font-semibold mb-2"> <div class="flex text-xs uppercase text-gray-300 font-semibold mb-2">
<div class="grow">{{ $strings.LabelFilename }}</div> <div class="grow min-[1120px]:max-w-64 xl:max-w-sm">{{ $strings.LabelFilename }}</div>
<div class="w-20">{{ $strings.LabelDuration }}</div> <div class="w-20">{{ $strings.LabelDuration }}</div>
<div class="w-20 hidden md:block text-center">{{ $strings.HeaderChapters }}</div> <div class="w-20 hidden md:block text-center">{{ $strings.HeaderChapters }}</div>
</div> </div>
<template v-for="track in audioTracks"> <div v-for="track in audioTracks" :key="track.ino" class="flex items-center py-2" :class="currentTrackIndex === track.index && isPlayingChapter ? 'bg-success/10' : ''">
<div :key="track.ino" class="flex items-center py-2" :class="currentTrackIndex === track.index && isPlayingChapter ? 'bg-success/10' : ''"> <div class="pr-2 grow min-[1120px]:max-w-64 xl:max-w-sm">
<div class="grow max-w-[calc(100%-80px)] pr-2"> <p class="text-xs truncate">{{ track.metadata.filename }}</p>
<p class="text-xs truncate max-w-sm">{{ track.metadata.filename }}</p>
</div>
<div class="w-20" style="min-width: 80px">
<p class="text-xs font-mono text-gray-200">{{ $secondsToTimestamp(Math.round(track.duration), false, true) }}</p>
</div>
<div class="w-20 hidden md:flex justify-center" style="min-width: 80px">
<span v-if="(track.chapters || []).length" class="material-symbols text-success text-sm">check</span>
</div>
</div> </div>
</template> <div class="w-20" style="min-width: 80px">
<p class="text-xs font-mono text-gray-200">{{ $secondsToTimestamp(Math.round(track.duration), false, true) }}</p>
</div>
<div class="w-20 hidden md:flex justify-center" style="min-width: 80px"><span v-if="(track.chapters || []).length" class="material-symbols text-success text-sm">check</span></div>
</div>
</div> </div>
</div> </div>
@@ -134,6 +180,7 @@
<ui-loading-indicator /> <ui-loading-indicator />
</div> </div>
<!-- audible chapter lookup modal -->
<modals-modal v-model="showFindChaptersModal" name="edit-book" :width="500" :processing="findingChapters"> <modals-modal v-model="showFindChaptersModal" name="edit-book" :width="500" :processing="findingChapters">
<template #outer> <template #outer>
<div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden pointer-events-none"> <div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden pointer-events-none">
@@ -159,12 +206,16 @@
</div> </div>
</div> </div>
<div v-else class="w-full p-4"> <div v-else class="w-full p-4">
<div class="flex justify-between mb-4"> <div class="flex mb-4">
<button class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-white flex-shrink-0" :aria-label="$strings.ButtonBack" @click="resetChapterLookupData">
<span class="material-symbols text-lg">arrow_back</span>
</button>
<p> <p>
{{ $strings.LabelDurationFound }} <span class="font-semibold">{{ $secondsToTimestamp(chapterData.runtimeLengthSec) }}</span {{ $strings.LabelDurationFound }} <span class="font-semibold">{{ $secondsToTimestamp(chapterData.runtimeLengthSec) }}</span>
><br /> <br />
<span class="font-semibold" :class="{ 'text-warning': chapters.length !== chapterData.chapters.length }">{{ chapterData.chapters.length }}</span> {{ $strings.LabelChaptersFound }} <span class="font-semibold" :class="{ 'text-warning': chapters.length !== chapterData.chapters.length }">{{ chapterData.chapters.length }}</span> {{ $strings.LabelChaptersFound }}
</p> </p>
<div class="grow" />
<p> <p>
{{ $strings.LabelYourAudiobookDuration }}: <span class="font-semibold">{{ $secondsToTimestamp(mediaDurationRounded) }}</span {{ $strings.LabelYourAudiobookDuration }}: <span class="font-semibold">{{ $secondsToTimestamp(mediaDurationRounded) }}</span
><br /> ><br />
@@ -198,17 +249,49 @@
<p class="pl-2">{{ $strings.MessageChapterStartIsAfter }}</p> <p class="pl-2">{{ $strings.MessageChapterStartIsAfter }}</p>
</div> </div>
</div> </div>
<div class="flex items-center pt-2"> <div class="flex items-center pt-2 justify-between">
<ui-btn small color="bg-primary" class="mr-1" @click="applyChapterNamesOnly">{{ $strings.ButtonMapChapterTitles }}</ui-btn> <div class="flex items-center gap-2">
<ui-tooltip :text="$strings.MessageMapChapterTitles" direction="top" class="flex items-center"> <ui-btn small color="bg-primary" @click="applyChapterNamesOnly">{{ $strings.ButtonMapChapterTitles }}</ui-btn>
<span class="material-symbols text-xl text-gray-200">info</span> <ui-tooltip :text="$strings.MessageMapChapterTitles" direction="top" class="flex items-center">
</ui-tooltip> <span class="material-symbols text-xl text-gray-200">info</span>
<div class="grow" /> </ui-tooltip>
</div>
<ui-btn small color="bg-success" @click="applyChapterData">{{ $strings.ButtonApplyChapters }}</ui-btn> <ui-btn small color="bg-success" @click="applyChapterData">{{ $strings.ButtonApplyChapters }}</ui-btn>
</div> </div>
</div> </div>
</div> </div>
</modals-modal> </modals-modal>
<!-- create bulk chapters modal -->
<modals-modal v-model="showBulkChapterModal" name="bulk-chapters" :width="400">
<template #outer>
<div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden pointer-events-none">
<p class="text-3xl text-white truncate pointer-events-none">{{ $strings.HeaderBulkChapterModal }}</p>
</div>
</template>
<div class="w-full h-full max-h-full text-sm rounded-lg bg-bg shadow-lg border border-black-300 relative p-6">
<div class="flex flex-col space-y-8">
<p class="text-base">{{ $strings.MessageBulkChapterPattern }}</p>
<div v-if="detectedPattern" class="text-sm text-gray-400 bg-gray-800 p-2 rounded">
<strong>{{ $strings.LabelDetectedPattern }}</strong> "{{ detectedPattern.before }}{{ formatNumberWithPadding(detectedPattern.startingNumber, detectedPattern) }}{{ detectedPattern.after }}"
<br />
<strong>{{ $strings.LabelNextChapters }}</strong>
"{{ detectedPattern.before }}{{ formatNumberWithPadding(detectedPattern.startingNumber + 1, detectedPattern) }}{{ detectedPattern.after }}", "{{ detectedPattern.before }}{{ formatNumberWithPadding(detectedPattern.startingNumber + 2, detectedPattern) }}{{ detectedPattern.after }}", etc.
</div>
<div class="flex px-1 items-center">
<label class="text-base font-medium">{{ $strings.LabelNumberOfChapters }}</label>
<div class="grow" />
<ui-text-input v-model="bulkChapterCount" type="number" min="1" max="50" class="w-14" :style="{ height: `2em` }" @keyup.enter="addBulkChapters" />
</div>
<div class="flex px-1 items-center">
<ui-btn small @click="showBulkChapterModal = false">{{ $strings.ButtonCancel }}</ui-btn>
<div class="grow" />
<ui-btn small color="bg-success" @click="addBulkChapters">{{ $strings.ButtonAddChapters }}</ui-btn>
</div>
</div>
</div>
</modals-modal>
</div> </div>
</template> </template>
@@ -265,7 +348,17 @@ export default {
removeBranding: false, removeBranding: false,
showSecondInputs: false, showSecondInputs: false,
audibleRegions: ['US', 'CA', 'UK', 'AU', 'FR', 'DE', 'JP', 'IT', 'IN', 'ES'], audibleRegions: ['US', 'CA', 'UK', 'AU', 'FR', 'DE', 'JP', 'IT', 'IN', 'ES'],
hasChanges: false hasChanges: false,
timeIncrementAmount: 1,
elapsedTime: 0,
playStartTime: null,
elapsedTimeInterval: null,
lockedChapters: new Set(),
lastSelectedLockIndex: null,
bulkChapterInput: '',
showBulkChapterModal: false,
bulkChapterCount: 1,
detectedPattern: null
} }
}, },
computed: { computed: {
@@ -304,9 +397,18 @@ export default {
}, },
selectedChapterId() { selectedChapterId() {
return this.selectedChapter ? this.selectedChapter.id : null return this.selectedChapter ? this.selectedChapter.id : null
},
allChaptersLocked() {
return this.newChapters.length > 0 && this.newChapters.every((chapter) => this.lockedChapters.has(chapter.id))
} }
}, },
methods: { methods: {
formatNumberWithPadding(number, pattern) {
if (!pattern || !pattern.hasLeadingZeros || !pattern.originalPadding) {
return number.toString()
}
return number.toString().padStart(pattern.originalPadding, '0')
},
setChaptersFromTracks() { setChaptersFromTracks() {
let currentStartTime = 0 let currentStartTime = 0
let index = 0 let index = 0
@@ -321,7 +423,7 @@ export default {
currentStartTime += track.duration currentStartTime += track.duration
} }
this.newChapters = chapters this.newChapters = chapters
this.lockedChapters = new Set()
this.checkChapters() this.checkChapters()
}, },
toggleRemoveBranding() { toggleRemoveBranding() {
@@ -334,19 +436,22 @@ export default {
const amount = Number(this.shiftAmount) const amount = Number(this.shiftAmount)
const lastChapter = this.newChapters[this.newChapters.length - 1] // Check if any unlocked chapters would be affected negatively
if (lastChapter.start + amount > this.mediaDurationRounded) { const unlockedChapters = this.newChapters.filter((chap) => !this.lockedChapters.has(chap.id))
this.$toast.error(this.$strings.ToastChaptersInvalidShiftAmountLast)
return
}
if (this.newChapters[1].start + amount <= 0) { if (unlockedChapters.length === 0) {
this.$toast.error(this.$strings.ToastChaptersInvalidShiftAmountStart) this.$toast.warning(this.$strings.ToastChaptersAllLocked)
return return
} }
for (let i = 0; i < this.newChapters.length; i++) { for (let i = 0; i < this.newChapters.length; i++) {
const chap = this.newChapters[i] const chap = this.newChapters[i]
// Skip locked chapters
if (this.lockedChapters.has(chap.id)) {
continue
}
chap.end = Math.min(chap.end + amount, this.mediaDuration) chap.end = Math.min(chap.end + amount, this.mediaDuration)
if (i > 0) { if (i > 0) {
chap.start = Math.max(0, chap.start + amount) chap.start = Math.max(0, chap.start + amount)
@@ -354,6 +459,83 @@ export default {
} }
this.checkChapters() this.checkChapters()
}, },
incrementChapterTime(chapter, amount) {
if (chapter.id === 0 && chapter.start + amount < 0) {
return
}
if (chapter.start + amount >= this.mediaDuration) {
return
}
chapter.start = Math.max(0, chapter.start + amount)
this.checkChapters()
},
adjustChapterStartTime(chapter) {
const newStartTime = chapter.start + this.elapsedTime
chapter.start = newStartTime
this.checkChapters()
this.$toast.success(this.$strings.ToastChapterStartTimeAdjusted.replace('{0}', this.elapsedTime))
this.destroyAudioEl()
},
startElapsedTimeTracking() {
this.elapsedTime = 0
this.playStartTime = Date.now()
this.elapsedTimeInterval = setInterval(() => {
this.elapsedTime = Math.floor((Date.now() - this.playStartTime) / 1000)
}, 100)
},
stopElapsedTimeTracking() {
if (this.elapsedTimeInterval) {
clearInterval(this.elapsedTimeInterval)
this.elapsedTimeInterval = null
}
this.elapsedTime = 0
this.playStartTime = null
},
toggleChapterLock(chapter, event) {
const chapterId = chapter.id
if (event.shiftKey && this.lastSelectedLockIndex !== null) {
const startIndex = Math.min(this.lastSelectedLockIndex, chapterId)
const endIndex = Math.max(this.lastSelectedLockIndex, chapterId)
const shouldLock = !this.lockedChapters.has(chapterId)
for (let i = startIndex; i <= endIndex; i++) {
if (shouldLock) {
this.lockedChapters.add(i)
} else {
this.lockedChapters.delete(i)
}
}
} else {
if (this.lockedChapters.has(chapterId)) {
this.lockedChapters.delete(chapterId)
} else {
this.lockedChapters.add(chapterId)
}
}
this.lastSelectedLockIndex = chapterId
this.lockedChapters = new Set(this.lockedChapters)
},
lockAllChapters() {
this.newChapters.forEach((chapter) => {
this.lockedChapters.add(chapter.id)
})
this.lockedChapters = new Set(this.lockedChapters)
},
unlockAllChapters() {
this.lockedChapters.clear()
this.lockedChapters = new Set(this.lockedChapters)
},
toggleAllChaptersLock() {
if (this.allChaptersLocked) {
this.unlockAllChapters()
} else {
this.lockAllChapters()
}
},
editItem() { editItem() {
this.$store.commit('showEditModal', this.libraryItem) this.$store.commit('showEditModal', this.libraryItem)
}, },
@@ -368,6 +550,10 @@ export default {
this.checkChapters() this.checkChapters()
}, },
removeChapter(chapter) { removeChapter(chapter) {
if (this.lockedChapters.has(chapter.id)) {
this.$toast.warning(this.$strings.ToastChapterLocked)
return
}
this.newChapters = this.newChapters.filter((ch) => ch.id !== chapter.id) this.newChapters = this.newChapters.filter((ch) => ch.id !== chapter.id)
this.checkChapters() this.checkChapters()
}, },
@@ -451,6 +637,7 @@ export default {
console.log('Audio playing') console.log('Audio playing')
this.isLoadingChapter = false this.isLoadingChapter = false
this.isPlayingChapter = true this.isPlayingChapter = true
this.startElapsedTimeTracking()
}) })
audioEl.addEventListener('ended', () => { audioEl.addEventListener('ended', () => {
console.log('Audio ended') console.log('Audio ended')
@@ -473,6 +660,10 @@ export default {
this.selectedChapter = null this.selectedChapter = null
this.isPlayingChapter = false this.isPlayingChapter = false
this.isLoadingChapter = false this.isLoadingChapter = false
this.stopElapsedTimeTracking()
},
resetChapterLookupData() {
this.chapterData = null
}, },
saveChapters() { saveChapters() {
this.checkChapters() this.checkChapters()
@@ -506,11 +697,7 @@ export default {
this.saving = false this.saving = false
if (data.updated) { if (data.updated) {
this.$toast.success(this.$strings.ToastChaptersUpdated) this.$toast.success(this.$strings.ToastChaptersUpdated)
if (this.previousRoute) { this.reloadLibraryItem()
this.$router.push(this.previousRoute)
} else {
this.$router.push(`/item/${this.libraryItem.id}`)
}
} else { } else {
this.$toast.info(this.$strings.MessageNoUpdatesWereNecessary) this.$toast.info(this.$strings.MessageNoUpdatesWereNecessary)
} }
@@ -523,7 +710,7 @@ export default {
}, },
applyChapterNamesOnly() { applyChapterNamesOnly() {
this.newChapters.forEach((chapter, index) => { this.newChapters.forEach((chapter, index) => {
if (this.chapterData.chapters[index]) { if (this.chapterData.chapters[index] && !this.lockedChapters.has(chapter.id)) {
chapter.title = this.chapterData.chapters[index].title chapter.title = this.chapterData.chapters[index].title
} }
}) })
@@ -535,7 +722,7 @@ export default {
}, },
applyChapterData() { applyChapterData() {
let index = 0 let index = 0
this.newChapters = this.chapterData.chapters const audibleChapters = this.chapterData.chapters
.filter((chap) => chap.startOffsetSec < this.mediaDuration) .filter((chap) => chap.startOffsetSec < this.mediaDuration)
.map((chap) => { .map((chap) => {
return { return {
@@ -545,6 +732,21 @@ export default {
title: chap.title title: chap.title
} }
}) })
const merged = []
let audibleIdx = 0
for (let i = 0; i < Math.max(this.newChapters.length, audibleChapters.length); i++) {
const isLocked = this.lockedChapters.has(i)
if (isLocked && this.newChapters[i]) {
merged.push({ ...this.newChapters[i], id: i })
} else if (audibleChapters[audibleIdx]) {
merged.push({ ...audibleChapters[audibleIdx], id: i })
audibleIdx++
} else if (this.newChapters[i]) {
merged.push({ ...this.newChapters[i], id: i })
}
}
this.newChapters = merged
this.showFindChaptersModal = false this.showFindChaptersModal = false
this.chapterData = null this.chapterData = null
@@ -572,7 +774,7 @@ export default {
if (data.error) { if (data.error) {
this.asinError = this.$getString(data.stringKey) this.asinError = this.$getString(data.stringKey)
} else { } else {
console.log('Chapter data', data) console.log('Chapter data', { ...data })
this.chapterData = this.removeBranding ? this.removeBrandingFromData(data) : data this.chapterData = this.removeBranding ? this.removeBrandingFromData(data) : data
} }
}) })
@@ -609,6 +811,11 @@ export default {
data.chapters.pop() data.chapters.pop()
} }
// Remove Branding durations from Runtime totals
data.runtimeLengthMs -= introDuration + outroDuration
data.runtimeLengthSec = Math.floor(data.runtimeLengthMs / 1000)
console.log('Brandless Chapter data', data)
return data return data
} catch { } catch {
return data return data
@@ -638,6 +845,7 @@ export default {
} }
] ]
} }
this.lockedChapters = new Set()
this.checkChapters() this.checkChapters()
}, },
removeAllChaptersClick() { removeAllChaptersClick() {
@@ -662,11 +870,7 @@ export default {
.then((data) => { .then((data) => {
if (data.updated) { if (data.updated) {
this.$toast.success(this.$strings.ToastChaptersRemoved) this.$toast.success(this.$strings.ToastChaptersRemoved)
if (this.previousRoute) { this.reloadLibraryItem()
this.$router.push(this.previousRoute)
} else {
this.$router.push(`/item/${this.libraryItem.id}`)
}
} else { } else {
this.$toast.info(this.$strings.MessageNoUpdatesWereNecessary) this.$toast.info(this.$strings.MessageNoUpdatesWereNecessary)
} }
@@ -679,6 +883,91 @@ export default {
this.saving = false this.saving = false
}) })
}, },
handleBulkChapterAdd() {
const input = this.bulkChapterInput.trim()
if (!input) return
const numberMatch = input.match(/(\d+)/)
if (numberMatch) {
// Extract the base pattern and number, preserving zero-padding
const originalNumberString = numberMatch[1]
const foundNumber = parseInt(originalNumberString)
const numberIndex = numberMatch.index
const beforeNumber = input.substring(0, numberIndex)
const afterNumber = input.substring(numberIndex + originalNumberString.length)
this.detectedPattern = {
before: beforeNumber,
after: afterNumber,
startingNumber: foundNumber,
originalPadding: originalNumberString.length,
hasLeadingZeros: originalNumberString.length > 1 && originalNumberString.startsWith('0')
}
this.bulkChapterCount = 1
this.showBulkChapterModal = true
} else {
this.addSingleChapterFromInput(input)
}
},
addSingleChapterFromInput(title) {
// Find the last chapter to determine where to add the new one
const lastChapter = this.newChapters[this.newChapters.length - 1]
const newStart = lastChapter ? lastChapter.end : 0
const newEnd = Math.min(newStart + 300, this.mediaDuration)
const newChapter = {
id: this.newChapters.length,
start: newStart,
end: newEnd,
title: title
}
this.newChapters.push(newChapter)
this.bulkChapterInput = ''
this.checkChapters()
},
addBulkChapters() {
const count = parseInt(this.bulkChapterCount)
if (!count || count < 1 || count > 150) {
this.$toast.error(this.$strings.ToastBulkChapterInvalidCount)
return
}
const { before, after, startingNumber, originalPadding, hasLeadingZeros } = this.detectedPattern
const lastChapter = this.newChapters[this.newChapters.length - 1]
const baseStart = lastChapter ? lastChapter.start + 1 : 0
// Add multiple chapters with the detected pattern
for (let i = 0; i < count; i++) {
const chapterNumber = startingNumber + i
let formattedNumber = chapterNumber.toString()
// Apply zero-padding if the original had leading zeros
if (hasLeadingZeros && originalPadding > 1) {
formattedNumber = chapterNumber.toString().padStart(originalPadding, '0')
}
const newStart = baseStart + i
const newEnd = Math.min(newStart + i + i, this.mediaDuration)
const newChapter = {
id: this.newChapters.length,
start: newStart,
end: newEnd,
title: `${before}${formattedNumber}${after}`
}
this.newChapters.push(newChapter)
}
this.bulkChapterInput = ''
this.showBulkChapterModal = false
this.detectedPattern = null
this.checkChapters()
},
libraryItemUpdated(libraryItem) { libraryItemUpdated(libraryItem) {
if (libraryItem.id === this.libraryItem.id) { if (libraryItem.id === this.libraryItem.id) {
if (!!libraryItem.media.metadata.asin && this.mediaMetadata.asin !== libraryItem.media.metadata.asin) { if (!!libraryItem.media.metadata.asin && this.mediaMetadata.asin !== libraryItem.media.metadata.asin) {
@@ -686,6 +975,18 @@ export default {
} }
this.libraryItem = libraryItem this.libraryItem = libraryItem
} }
},
reloadLibraryItem() {
this.$axios
.$get(`/api/items/${this.libraryItem.id}?expanded=1`)
.then((data) => {
this.libraryItem = data
this.initChapters()
})
.catch((error) => {
console.error('Failed to reload library item', error)
this.$toast.error(this.$strings.ToastFailedToLoadData)
})
} }
}, },
mounted() { mounted() {
+30 -17
View File
@@ -131,35 +131,26 @@
</div> </div>
<div class="grow py-2"> <div class="grow py-2">
<ui-dropdown :label="$strings.LabelSettingsDateFormat" v-model="newServerSettings.dateFormat" :items="dateFormats" small class="max-w-52" @input="(val) => updateSettingsKey('dateFormat', val)" /> <ui-dropdown :label="$strings.LabelSettingsDateFormat" v-model="newServerSettings.dateFormat" :items="dateFormats" small class="max-w-72" @input="(val) => updateSettingsKey('dateFormat', val)" />
<p class="text-xs ml-1 text-white/60">{{ $strings.LabelExample }}: {{ dateExample }}</p> <p class="text-xs ml-1 text-white/60">{{ $strings.LabelExample }}: {{ dateExample }}</p>
</div> </div>
<div class="grow py-2"> <div class="grow py-2">
<ui-dropdown :label="$strings.LabelSettingsTimeFormat" v-model="newServerSettings.timeFormat" :items="timeFormats" small class="max-w-52" @input="(val) => updateSettingsKey('timeFormat', val)" /> <ui-dropdown :label="$strings.LabelSettingsTimeFormat" v-model="newServerSettings.timeFormat" :items="timeFormats" small class="max-w-72" @input="(val) => updateSettingsKey('timeFormat', val)" />
<p class="text-xs ml-1 text-white/60">{{ $strings.LabelExample }}: {{ timeExample }}</p> <p class="text-xs ml-1 text-white/60">{{ $strings.LabelExample }}: {{ timeExample }}</p>
</div> </div>
<div class="py-2"> <div class="py-2">
<ui-dropdown :label="$strings.LabelLanguageDefaultServer" ref="langDropdown" v-model="newServerSettings.language" :items="$languageCodeOptions" small class="max-w-52" @input="updateServerLanguage" /> <ui-dropdown :label="$strings.LabelLanguageDefaultServer" ref="langDropdown" v-model="newServerSettings.language" :items="$languageCodeOptions" small class="max-w-72" @input="updateServerLanguage" />
</div> </div>
<!-- old experimental features --> <div class="pt-4">
<!-- <div class="pt-4"> <h2 class="font-semibold">{{ $strings.HeaderSettingsSecurity }}</h2>
<h2 class="font-semibold">{{ $strings.HeaderSettingsExperimental }}</h2>
</div> </div>
<div class="flex items-center py-2"> <div class="py-2">
<ui-toggle-switch labeledBy="settings-experimental-features" v-model="showExperimentalFeatures" /> <ui-multi-select v-model="newServerSettings.allowedOrigins" :items="newServerSettings.allowedOrigins" :label="$strings.LabelCorsAllowed" class="max-w-72" @input="updateCorsOrigins" />
<ui-tooltip :text="$strings.LabelSettingsExperimentalFeaturesHelp"> </div>
<p class="pl-4">
<span id="settings-experimental-features">{{ $strings.LabelSettingsExperimentalFeatures }}</span>
<a :aria-label="$strings.LabelSettingsExperimentalFeaturesHelp" href="https://github.com/advplyr/audiobookshelf/discussions/75" target="_blank">
<span class="material-symbols icon-text">info</span>
</a>
</p>
</ui-tooltip>
</div> -->
</div> </div>
</div> </div>
</app-settings-content> </app-settings-content>
@@ -323,6 +314,27 @@ export default {
updateServerLanguage(val) { updateServerLanguage(val) {
this.updateSettingsKey('language', val) this.updateSettingsKey('language', val)
}, },
updateCorsOrigins(val) {
const validOrigins = []
const invalidOrigins = []
val.forEach((origin) => {
const trimmedOrigin = origin.trim().toLowerCase()
try {
new URL(trimmedOrigin)
validOrigins.push(trimmedOrigin)
} catch {
invalidOrigins.push(trimmedOrigin)
}
})
if (invalidOrigins.length > 0) {
this.$toast.error(this.$strings.ToastInvalidUrls)
}
this.newServerSettings.allowedOrigins = validOrigins
this.updateSettingsKey('allowedOrigins', validOrigins)
},
updateSettingsKey(key, val) { updateSettingsKey(key, val) {
if (key === 'scannerDisableWatcher') { if (key === 'scannerDisableWatcher') {
this.newServerSettings.scannerDisableWatcher = val this.newServerSettings.scannerDisableWatcher = val
@@ -352,6 +364,7 @@ export default {
initServerSettings() { initServerSettings() {
this.newServerSettings = this.serverSettings ? { ...this.serverSettings } : {} this.newServerSettings = this.serverSettings ? { ...this.serverSettings } : {}
this.newServerSettings.sortingPrefixes = [...(this.newServerSettings.sortingPrefixes || [])] this.newServerSettings.sortingPrefixes = [...(this.newServerSettings.sortingPrefixes || [])]
this.newServerSettings.allowedOrigins = [...(this.newServerSettings.allowedOrigins || [])]
this.scannerEnableWatcher = !this.newServerSettings.scannerDisableWatcher this.scannerEnableWatcher = !this.newServerSettings.scannerDisableWatcher
this.homepageUseBookshelfView = this.newServerSettings.homeBookshelfView != this.$constants.BookshelfView.DETAIL this.homepageUseBookshelfView = this.newServerSettings.homeBookshelfView != this.$constants.BookshelfView.DETAIL
+75 -73
View File
@@ -6,80 +6,82 @@
</div> </div>
<div v-if="listeningSessions.length" class="block max-w-full relative"> <div v-if="listeningSessions.length" class="block max-w-full relative">
<table class="userSessionsTable"> <div class="overflow-x-auto">
<tr class="bg-primary/40"> <table class="userSessionsTable">
<th class="w-6 min-w-6 text-left hidden md:table-cell h-11"> <tr class="bg-primary/40">
<ui-checkbox v-model="isAllSelected" :partial="numSelected > 0 && !isAllSelected" small checkbox-bg="bg" /> <th class="w-6 min-w-6 text-left hidden md:table-cell h-11">
</th> <ui-checkbox v-model="isAllSelected" :partial="numSelected > 0 && !isAllSelected" small checkbox-bg="bg" />
<th v-if="numSelected" class="grow text-left" :colspan="7"> </th>
<div class="flex items-center"> <th v-if="numSelected" class="grow text-left" :colspan="7">
<p>{{ $getString('MessageSelected', [numSelected]) }}</p> <div class="flex items-center">
<div class="grow" /> <p>{{ $getString('MessageSelected', [numSelected]) }}</p>
<ui-btn small color="bg-error" :loading="deletingSessions" @click.stop="removeSessionsClick">{{ $strings.ButtonRemove }}</ui-btn> <div class="grow" />
</div> <ui-btn small color="bg-error" :loading="deletingSessions" @click.stop="removeSessionsClick">{{ $strings.ButtonRemove }}</ui-btn>
</th> </div>
<th v-if="!numSelected" class="grow sm:grow-0 sm:w-48 sm:max-w-48 text-left group cursor-pointer" @click.stop="sortColumn('displayTitle')"> </th>
<div class="inline-flex items-center"> <th v-if="!numSelected" class="grow sm:grow-0 sm:w-48 sm:max-w-48 text-left group cursor-pointer" @click.stop="sortColumn('displayTitle')">
{{ $strings.LabelItem }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('displayTitle') }" class="material-symbols text-base pl-px">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span> <div class="inline-flex items-center">
</div> {{ $strings.LabelItem }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('displayTitle') }" class="material-symbols text-base pl-px">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span>
</th> </div>
<th v-if="!numSelected" class="w-20 min-w-20 text-left hidden md:table-cell">{{ $strings.LabelUser }}</th> </th>
<th v-if="!numSelected" class="w-26 min-w-26 text-left hidden md:table-cell group cursor-pointer" @click.stop="sortColumn('playMethod')"> <th v-if="!numSelected" class="w-20 min-w-20 text-left hidden md:table-cell">{{ $strings.LabelUser }}</th>
<div class="inline-flex items-center"> <th v-if="!numSelected" class="w-26 min-w-26 text-left hidden md:table-cell group cursor-pointer" @click.stop="sortColumn('playMethod')">
{{ $strings.LabelPlayMethod }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('playMethod') }" class="material-symbols text-base pl-px">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span> <div class="inline-flex items-center">
</div> {{ $strings.LabelPlayMethod }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('playMethod') }" class="material-symbols text-base pl-px">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span>
</th> </div>
<th v-if="!numSelected" class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</th> </th>
<th v-if="!numSelected" class="w-24 min-w-24 sm:w-32 sm:min-w-32 group cursor-pointer" @click.stop="sortColumn('timeListening')"> <th v-if="!numSelected" class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</th>
<div class="inline-flex items-center"> <th v-if="!numSelected" class="w-24 min-w-24 sm:w-32 sm:min-w-32 group cursor-pointer" @click.stop="sortColumn('timeListening')">
{{ $strings.LabelTimeListened }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('timeListening') }" class="material-symbols text-base pl-px hidden sm:inline-block">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span> <div class="inline-flex items-center">
</div> {{ $strings.LabelTimeListened }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('timeListening') }" class="material-symbols text-base pl-px hidden sm:inline-block">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span>
</th> </div>
<th v-if="!numSelected" class="w-24 min-w-24 group cursor-pointer" @click.stop="sortColumn('currentTime')"> </th>
<div class="inline-flex items-center"> <th v-if="!numSelected" class="w-24 min-w-24 group cursor-pointer" @click.stop="sortColumn('currentTime')">
{{ $strings.LabelLastTime }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('currentTime') }" class="material-symbols text-base pl-px hidden sm:inline-block">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span> <div class="inline-flex items-center">
</div> {{ $strings.LabelLastTime }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('currentTime') }" class="material-symbols text-base pl-px hidden sm:inline-block">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span>
</th> </div>
<th v-if="!numSelected" class="grow hidden sm:table-cell cursor-pointer group" @click.stop="sortColumn('updatedAt')"> </th>
<div class="inline-flex items-center"> <th v-if="!numSelected" class="grow hidden sm:table-cell cursor-pointer group" @click.stop="sortColumn('updatedAt')">
{{ $strings.LabelLastUpdate }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('updatedAt') }" class="material-symbols text-base pl-px">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span> <div class="inline-flex items-center">
</div> {{ $strings.LabelLastUpdate }} <span :class="{ 'opacity-0 group-hover:opacity-30': !isSortSelected('updatedAt') }" class="material-symbols text-base pl-px">{{ sortDesc ? 'arrow_drop_down' : 'arrow_drop_up' }}</span>
</th> </div>
</tr> </th>
</tr>
<tr v-for="session in listeningSessions" :key="session.id" :class="{ selected: session.selected }" class="cursor-pointer" @click="clickSessionRow(session)"> <tr v-for="session in listeningSessions" :key="session.id" :class="{ selected: session.selected }" class="cursor-pointer" @click="clickSessionRow(session)">
<td class="hidden md:table-cell py-1 max-w-6 relative"> <td class="hidden md:table-cell py-1 max-w-6 relative">
<ui-checkbox v-model="session.selected" small checkbox-bg="bg" /> <ui-checkbox v-model="session.selected" small checkbox-bg="bg" />
<!-- overlay of the checkbox so that the entire box is clickable --> <!-- overlay of the checkbox so that the entire box is clickable -->
<div class="absolute inset-0 w-full h-full" @click.stop="session.selected = !session.selected" /> <div class="absolute inset-0 w-full h-full" @click.stop="session.selected = !session.selected" />
</td> </td>
<td class="py-1 grow sm:grow-0 sm:w-48 sm:max-w-48"> <td class="py-1 grow sm:grow-0 sm:w-48 sm:max-w-48">
<p class="text-xs text-gray-200 truncate">{{ session.displayTitle }}</p> <p class="text-xs text-gray-200 truncate">{{ session.displayTitle }}</p>
<p class="text-xs text-gray-400 truncate">{{ session.displayAuthor }}</p> <p class="text-xs text-gray-400 truncate">{{ session.displayAuthor }}</p>
</td> </td>
<td class="hidden md:table-cell w-20 min-w-20"> <td class="hidden md:table-cell w-20 min-w-20">
<p v-if="filteredUserUsername" class="text-xs">{{ filteredUserUsername }}</p> <p v-if="filteredUserUsername" class="text-xs">{{ filteredUserUsername }}</p>
<p v-else class="text-xs">{{ session.user ? session.user.username : 'N/A' }}</p> <p v-else class="text-xs">{{ session.user ? session.user.username : 'N/A' }}</p>
</td> </td>
<td class="hidden md:table-cell w-26 min-w-26"> <td class="hidden md:table-cell w-26 min-w-26">
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p> <p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
</td> </td>
<td class="hidden sm:table-cell max-w-32 min-w-32"> <td class="hidden sm:table-cell max-w-32 min-w-32">
<p class="text-xs truncate" v-html="getDeviceInfoString(session.deviceInfo)" /> <p class="text-xs truncate" v-html="getDeviceInfoString(session.deviceInfo)" />
</td> </td>
<td class="text-center w-24 min-w-24 sm:w-32 sm:min-w-32"> <td class="text-center w-24 min-w-24 sm:w-32 sm:min-w-32">
<p class="text-xs font-mono">{{ $elapsedPrettyLocalized(session.timeListening) }}</p> <p class="text-xs font-mono">{{ $elapsedPrettyLocalized(session.timeListening) }}</p>
</td> </td>
<td class="text-center hover:underline w-24 min-w-24" @click.stop="clickCurrentTime(session)"> <td class="text-center hover:underline w-24 min-w-24" @click.stop="clickCurrentTime(session)">
<p class="text-xs font-mono">{{ $secondsToTimestamp(session.currentTime) }}</p> <p class="text-xs font-mono">{{ $secondsToTimestamp(session.currentTime) }}</p>
</td> </td>
<td class="text-center hidden sm:table-cell"> <td class="text-center hidden sm:table-cell">
<ui-tooltip v-if="session.updatedAt" direction="top" :text="$formatDatetime(session.updatedAt, dateFormat, timeFormat)"> <ui-tooltip v-if="session.updatedAt" direction="top" :text="$formatDatetime(session.updatedAt, dateFormat, timeFormat)">
<p class="text-xs text-gray-200">{{ $dateDistanceFromNow(session.updatedAt) }}</p> <p class="text-xs text-gray-200">{{ $dateDistanceFromNow(session.updatedAt) }}</p>
</ui-tooltip> </ui-tooltip>
</td> </td>
</tr> </tr>
</table> </table>
</div>
<!-- table bottom options --> <!-- table bottom options -->
<div class="flex items-center my-2"> <div class="flex items-center my-2">
<div class="grow" /> <div class="grow" />
+35 -33
View File
@@ -19,39 +19,41 @@
<div class="py-2"> <div class="py-2">
<h1 class="text-lg mb-2 text-white/90 px-2 sm:px-0">{{ $strings.HeaderListeningSessions }}</h1> <h1 class="text-lg mb-2 text-white/90 px-2 sm:px-0">{{ $strings.HeaderListeningSessions }}</h1>
<div v-if="listeningSessions.length"> <div v-if="listeningSessions.length">
<table class="userSessionsTable"> <div class="overflow-x-auto">
<tr class="bg-primary/40"> <table class="userSessionsTable">
<th class="w-48 min-w-48 text-left">{{ $strings.LabelItem }}</th> <tr class="bg-primary/40">
<th class="w-32 min-w-32 text-left hidden md:table-cell">{{ $strings.LabelPlayMethod }}</th> <th class="w-48 min-w-48 text-left">{{ $strings.LabelItem }}</th>
<th class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</th> <th class="w-32 min-w-32 text-left hidden md:table-cell">{{ $strings.LabelPlayMethod }}</th>
<th class="w-32 min-w-32">{{ $strings.LabelTimeListened }}</th> <th class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</th>
<th class="w-16 min-w-16">{{ $strings.LabelLastTime }}</th> <th class="w-32 min-w-32">{{ $strings.LabelTimeListened }}</th>
<th class="grow hidden sm:table-cell">{{ $strings.LabelLastUpdate }}</th> <th class="w-16 min-w-16">{{ $strings.LabelLastTime }}</th>
</tr> <th class="grow hidden sm:table-cell">{{ $strings.LabelLastUpdate }}</th>
<tr v-for="session in listeningSessions" :key="session.id" class="cursor-pointer" @click="showSession(session)"> </tr>
<td class="py-1 max-w-48"> <tr v-for="session in listeningSessions" :key="session.id" class="cursor-pointer" @click="showSession(session)">
<p class="text-xs text-gray-200 truncate">{{ session.displayTitle }}</p> <td class="py-1 max-w-48">
<p class="text-xs text-gray-400 truncate">{{ session.displayAuthor }}</p> <p class="text-xs text-gray-200 truncate">{{ session.displayTitle }}</p>
</td> <p class="text-xs text-gray-400 truncate">{{ session.displayAuthor }}</p>
<td class="hidden md:table-cell"> </td>
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p> <td class="hidden md:table-cell">
</td> <p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
<td class="hidden sm:table-cell min-w-32 max-w-32"> </td>
<p class="text-xs truncate" v-html="getDeviceInfoString(session.deviceInfo)" /> <td class="hidden sm:table-cell min-w-32 max-w-32">
</td> <p class="text-xs truncate" v-html="getDeviceInfoString(session.deviceInfo)" />
<td class="text-center"> </td>
<p class="text-xs font-mono">{{ $elapsedPrettyLocalized(session.timeListening) }}</p> <td class="text-center">
</td> <p class="text-xs font-mono">{{ $elapsedPrettyLocalized(session.timeListening) }}</p>
<td class="text-center hover:underline" @click.stop="clickCurrentTime(session)"> </td>
<p class="text-xs font-mono">{{ $secondsToTimestamp(session.currentTime) }}</p> <td class="text-center hover:underline" @click.stop="clickCurrentTime(session)">
</td> <p class="text-xs font-mono">{{ $secondsToTimestamp(session.currentTime) }}</p>
<td class="text-center hidden sm:table-cell"> </td>
<ui-tooltip v-if="session.updatedAt" direction="top" :text="$formatDatetime(session.updatedAt, dateFormat, timeFormat)"> <td class="text-center hidden sm:table-cell">
<p class="text-xs text-gray-200">{{ $dateDistanceFromNow(session.updatedAt) }}</p> <ui-tooltip v-if="session.updatedAt" direction="top" :text="$formatDatetime(session.updatedAt, dateFormat, timeFormat)">
</ui-tooltip> <p class="text-xs text-gray-200">{{ $dateDistanceFromNow(session.updatedAt) }}</p>
</td> </ui-tooltip>
</tr> </td>
</table> </tr>
</table>
</div>
<div class="flex items-center justify-end py-1"> <div class="flex items-center justify-end py-1">
<ui-icon-btn icon="arrow_back_ios_new" :size="7" icon-font-size="1rem" class="mx-1" :disabled="currentPage === 0" @click="prevPage" /> <ui-icon-btn icon="arrow_back_ios_new" :size="7" icon-font-size="1rem" class="mx-1" :disabled="currentPage === 0" @click="prevPage" />
<p class="text-sm mx-1">{{ $getString('LabelPaginationPageXOfY', [currentPage + 1, numPages]) }}</p> <p class="text-sm mx-1">{{ $getString('LabelPaginationPageXOfY', [currentPage + 1, numPages]) }}</p>
+1 -1
View File
@@ -189,7 +189,7 @@ export default {
require('@/plugins/chromecast.js').default(this) require('@/plugins/chromecast.js').default(this)
} }
this.$store.commit('libraries/setCurrentLibrary', userDefaultLibraryId) this.$store.commit('libraries/setCurrentLibrary', { id: userDefaultLibraryId })
this.$store.commit('user/setUser', user) this.$store.commit('user/setUser', user)
// Access token only returned from login, not authorize // Access token only returned from login, not authorize
if (user.accessToken) { if (user.accessToken) {
+3 -3
View File
@@ -133,7 +133,7 @@ export const actions = {
commit('setNumUserPlaylists', numUserPlaylists) commit('setNumUserPlaylists', numUserPlaylists)
commit('scanners/setCustomMetadataProviders', customMetadataProviders, { root: true }) commit('scanners/setCustomMetadataProviders', customMetadataProviders, { root: true })
commit('setCurrentLibrary', libraryId) commit('setCurrentLibrary', { id: libraryId })
return data return data
}) })
.catch((error) => { .catch((error) => {
@@ -182,8 +182,8 @@ export const mutations = {
setLibraryIssues(state, val) { setLibraryIssues(state, val) {
state.issues = val state.issues = val
}, },
setCurrentLibrary(state, val) { setCurrentLibrary(state, { id }) {
state.currentLibraryId = val state.currentLibraryId = id
}, },
set(state, libraries) { set(state, libraries) {
state.libraries = libraries state.libraries = libraries
+1 -2
View File
@@ -92,7 +92,7 @@ export const actions = {
if (state.settings.orderBy == 'media.duration') { if (state.settings.orderBy == 'media.duration') {
settingsUpdate.orderBy = 'media.numTracks' settingsUpdate.orderBy = 'media.numTracks'
} }
if (state.settings.orderBy == 'media.metadata.publishedYear') { if (state.settings.orderBy == 'media.metadata.publishedYear' || state.settings.orderBy == 'progress') {
settingsUpdate.orderBy = 'media.metadata.title' settingsUpdate.orderBy = 'media.metadata.title'
} }
const invalidFilters = ['series', 'authors', 'narrators', 'publishers', 'publishedDecades', 'languages', 'progress', 'issues', 'ebooks', 'abridged'] const invalidFilters = ['series', 'authors', 'narrators', 'publishers', 'publishedDecades', 'languages', 'progress', 'issues', 'ebooks', 'abridged']
@@ -152,7 +152,6 @@ export const actions = {
.$post('/auth/refresh') .$post('/auth/refresh')
.then(async (response) => { .then(async (response) => {
const newAccessToken = response.user.accessToken const newAccessToken = response.user.accessToken
commit('setUser', response.user)
commit('setAccessToken', newAccessToken) commit('setAccessToken', newAccessToken)
// Emit event used to re-authenticate socket in default.vue since $root is not available here // Emit event used to re-authenticate socket in default.vue since $root is not available here
if (this.$eventBus) { if (this.$eventBus) {
+1
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "إضافة", "ButtonAdd": "إضافة",
"ButtonAddApiKey": "إضافة مفتاح واجهة برمجة التطبيقات",
"ButtonAddChapters": "إضافة الفصول", "ButtonAddChapters": "إضافة الفصول",
"ButtonAddDevice": "إضافة جهاز", "ButtonAddDevice": "إضافة جهاز",
"ButtonAddLibrary": "إضافة مكتبة", "ButtonAddLibrary": "إضافة مكتبة",
+157 -13
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Дадаць", "ButtonAdd": "Дадаць",
"ButtonAddApiKey": "Дадаць API-ключ",
"ButtonAddChapters": "Дадаць раздзелы", "ButtonAddChapters": "Дадаць раздзелы",
"ButtonAddDevice": "Дадаць прыладу", "ButtonAddDevice": "Дадаць прыладу",
"ButtonAddLibrary": "Дадаць бібліятэку", "ButtonAddLibrary": "Дадаць бібліятэку",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Выбраць тэчку", "ButtonChooseAFolder": "Выбраць тэчку",
"ButtonChooseFiles": "Выбраць файлы", "ButtonChooseFiles": "Выбраць файлы",
"ButtonClearFilter": "Ачысціць фільтр", "ButtonClearFilter": "Ачысціць фільтр",
"ButtonClose": "Закрыць",
"ButtonCloseFeed": "Закрыць стужку", "ButtonCloseFeed": "Закрыць стужку",
"ButtonCloseSession": "Закрыць адкрыты сеанс", "ButtonCloseSession": "Закрыць адкрыты сеанс",
"ButtonCollections": "Калекцыі", "ButtonCollections": "Калекцыі",
@@ -69,7 +71,7 @@
"ButtonQueueAddItem": "Дадаць у чаргу", "ButtonQueueAddItem": "Дадаць у чаргу",
"ButtonQueueRemoveItem": "Выдаліць з чаргі", "ButtonQueueRemoveItem": "Выдаліць з чаргі",
"ButtonQuickEmbed": "Хуткае ўбудаванне", "ButtonQuickEmbed": "Хуткае ўбудаванне",
"ButtonQuickEmbedMetadata": "Хуткае ўбудаванне метаданых", "ButtonQuickEmbedMetadata": "Хуткае ўбудаванне метададзеных",
"ButtonQuickMatch": "Хуткі пошук", "ButtonQuickMatch": "Хуткі пошук",
"ButtonReScan": "Паўторнае сканаванне", "ButtonReScan": "Паўторнае сканаванне",
"ButtonRead": "Чытаць", "ButtonRead": "Чытаць",
@@ -98,8 +100,9 @@
"ButtonSetChaptersFromTracks": "Усталяваць раздзелы з трэкаў", "ButtonSetChaptersFromTracks": "Усталяваць раздзелы з трэкаў",
"ButtonShare": "Падзяліцца", "ButtonShare": "Падзяліцца",
"ButtonShiftTimes": "Карэкцыя часу", "ButtonShiftTimes": "Карэкцыя часу",
"ButtonShow": "Паказаць",
"ButtonStartM4BEncode": "Пачаць кадзіраванне ў M4B", "ButtonStartM4BEncode": "Пачаць кадзіраванне ў M4B",
"ButtonStartMetadataEmbed": "Пачаць убудаванне метаданых", "ButtonStartMetadataEmbed": "Пачаць убудаванне метададзеных",
"ButtonStats": "Статыстыка", "ButtonStats": "Статыстыка",
"ButtonSubmit": "Адправіць", "ButtonSubmit": "Адправіць",
"ButtonTest": "Тэст", "ButtonTest": "Тэст",
@@ -107,7 +110,7 @@
"ButtonUpload": "Загрузіць", "ButtonUpload": "Загрузіць",
"ButtonUploadBackup": "Загрузіць рэзервовую копію", "ButtonUploadBackup": "Загрузіць рэзервовую копію",
"ButtonUploadCover": "Загрузіць вокладку", "ButtonUploadCover": "Загрузіць вокладку",
"ButtonUploadOPMLFile": "Загрузіць OPML файл", "ButtonUploadOPMLFile": "Загрузіць файл OPML",
"ButtonUserDelete": "Выдаліць карыстальніка {0}", "ButtonUserDelete": "Выдаліць карыстальніка {0}",
"ButtonUserEdit": "Рэдагаваць карыстальніка {0}", "ButtonUserEdit": "Рэдагаваць карыстальніка {0}",
"ButtonViewAll": "Прагледзець усе", "ButtonViewAll": "Прагледзець усе",
@@ -116,8 +119,9 @@
"ErrorUploadFetchMetadataNoResults": "Не ўдалося атрымаць метададзеныя – паспрабуйце абнавіць назву і/або аўтара", "ErrorUploadFetchMetadataNoResults": "Не ўдалося атрымаць метададзеныя – паспрабуйце абнавіць назву і/або аўтара",
"ErrorUploadLacksTitle": "Павінна быць назва", "ErrorUploadLacksTitle": "Павінна быць назва",
"HeaderAccount": "Уліковы запіс", "HeaderAccount": "Уліковы запіс",
"HeaderAddCustomMetadataProvider": "Дадаць карыстальніцкага пастаўшчыка метаданных", "HeaderAddCustomMetadataProvider": "Дадаць карыстальніцкага пастаўшчыка метададзенных",
"HeaderAdvanced": "Дадаткова", "HeaderAdvanced": "Дадаткова",
"HeaderApiKeys": "API-ключы",
"HeaderAppriseNotificationSettings": "Налады апавяшчэнняў Apprise", "HeaderAppriseNotificationSettings": "Налады апавяшчэнняў Apprise",
"HeaderAudioTracks": "Аўдыядарожкі", "HeaderAudioTracks": "Аўдыядарожкі",
"HeaderAudiobookTools": "Сродкі кіравання файламі аўдыякніг", "HeaderAudiobookTools": "Сродкі кіравання файламі аўдыякніг",
@@ -157,9 +161,11 @@
"HeaderManageGenres": "Кіраванне жанрамі", "HeaderManageGenres": "Кіраванне жанрамі",
"HeaderManageTags": "Кіраванне тэгамі", "HeaderManageTags": "Кіраванне тэгамі",
"HeaderMapDetails": "Падрабязнасці адлюстравання", "HeaderMapDetails": "Падрабязнасці адлюстравання",
"HeaderMatch": "Супадзенне",
"HeaderMetadataOrderOfPrecedence": "Парадак прыярытэтнасці метададзеных", "HeaderMetadataOrderOfPrecedence": "Парадак прыярытэтнасці метададзеных",
"HeaderMetadataToEmbed": "Метададзеныя для ўбудавання", "HeaderMetadataToEmbed": "Метададзеныя для ўбудавання",
"HeaderNewAccount": "Новы ўліковы запіс", "HeaderNewAccount": "Новы ўліковы запіс",
"HeaderNewApiKey": "Новы API-ключ",
"HeaderNewLibrary": "Новая бібліятэка", "HeaderNewLibrary": "Новая бібліятэка",
"HeaderNotificationCreate": "Стварыць апавяшчэнне", "HeaderNotificationCreate": "Стварыць апавяшчэнне",
"HeaderNotificationUpdate": "Абнавіць апавяшчэнне", "HeaderNotificationUpdate": "Абнавіць апавяшчэнне",
@@ -175,9 +181,10 @@
"HeaderPlaylist": "Спіс прайгравання", "HeaderPlaylist": "Спіс прайгравання",
"HeaderPlaylistItems": "Элементы спіса прайгравання", "HeaderPlaylistItems": "Элементы спіса прайгравання",
"HeaderPodcastsToAdd": "Падкасты для дадання", "HeaderPodcastsToAdd": "Падкасты для дадання",
"HeaderPresets": "Прадустаноўкі",
"HeaderPreviewCover": "Прадпрагляд вокладкі", "HeaderPreviewCover": "Прадпрагляд вокладкі",
"HeaderRSSFeedGeneral": "Падрабязнасці RSS", "HeaderRSSFeedGeneral": "Падрабязнасці RSS",
"HeaderRSSFeedIsOpen": "RSS-стужка адкрыта", "HeaderRSSFeedIsOpen": "RSS-стужка адкрытая",
"HeaderRSSFeeds": "RSS-стужкі", "HeaderRSSFeeds": "RSS-стужкі",
"HeaderRemoveEpisode": "Выдаліць эпізод", "HeaderRemoveEpisode": "Выдаліць эпізод",
"HeaderRemoveEpisodes": "Выдаліць {0} эпізодаў", "HeaderRemoveEpisodes": "Выдаліць {0} эпізодаў",
@@ -203,6 +210,7 @@
"HeaderTableOfContents": "Змест", "HeaderTableOfContents": "Змест",
"HeaderTools": "Інструменты", "HeaderTools": "Інструменты",
"HeaderUpdateAccount": "Абнавіць уліковы запіс", "HeaderUpdateAccount": "Абнавіць уліковы запіс",
"HeaderUpdateApiKey": "Абнавіць API-ключ",
"HeaderUpdateAuthor": "Абнавіць аўтара", "HeaderUpdateAuthor": "Абнавіць аўтара",
"HeaderUpdateDetails": "Абнавіць падрабязнасці", "HeaderUpdateDetails": "Абнавіць падрабязнасці",
"HeaderUpdateLibrary": "Абнавіць бібліятэку", "HeaderUpdateLibrary": "Абнавіць бібліятэку",
@@ -227,10 +235,15 @@
"LabelAddedDate": "Дададзена {0}", "LabelAddedDate": "Дададзена {0}",
"LabelAdminUsersOnly": "Толькі для адміністратараў", "LabelAdminUsersOnly": "Толькі для адміністратараў",
"LabelAll": "Усе", "LabelAll": "Усе",
"LabelAllEpisodesDownloaded": "Усе эпізоды спампаваныя",
"LabelAllUsers": "Усе карыстальнікі", "LabelAllUsers": "Усе карыстальнікі",
"LabelAllUsersExcludingGuests": "Усе карыстальнікі, акрамя гасцей", "LabelAllUsersExcludingGuests": "Усе карыстальнікі, акрамя гасцей",
"LabelAllUsersIncludingGuests": "Усе карыстальнікі, уключаючы гасцей", "LabelAllUsersIncludingGuests": "Усе карыстальнікі, уключаючы гасцей",
"LabelAlreadyInYourLibrary": "Ужо ў вашай бібліятэцы", "LabelAlreadyInYourLibrary": "Ужо ў вашай бібліятэцы",
"LabelApiKeyCreated": "API-ключ \"{0}\" паспяхова створаны.",
"LabelApiKeyCreatedDescription": "Пераканайцеся, што вы скапіявалі API-ключ зараз, бо паўторна яго ўбачыць не атрымаецца.",
"LabelApiKeyUser": "Дзейнічаць ад імя карыстальніка",
"LabelApiKeyUserDescription": "Гэты API-ключ будзе мець тыя ж правы, што і карыстальнік, ад імя якога ён дзейнічае. У журналах гэта будзе выглядаць так, быццам запыт робіць сам карыстальнік.",
"LabelApiToken": "Токен API", "LabelApiToken": "Токен API",
"LabelAppend": "Дадаць", "LabelAppend": "Дадаць",
"LabelAudioBitrate": "Бітрэйт аўдыё (напрыклад, 128к)", "LabelAudioBitrate": "Бітрэйт аўдыё (напрыклад, 128к)",
@@ -242,39 +255,108 @@
"LabelAuthors": "Аўтары", "LabelAuthors": "Аўтары",
"LabelAutoDownloadEpisodes": "Аўтаматычнае спампаванне эпізодаў", "LabelAutoDownloadEpisodes": "Аўтаматычнае спампаванне эпізодаў",
"LabelAutoFetchMetadata": "Аўтаматычнае атрыманне метададзеных", "LabelAutoFetchMetadata": "Аўтаматычнае атрыманне метададзеных",
"LabelAutoFetchMetadataHelp": "Атрыманне звестак пра назву, аўтара і серыю для падыходнага фарматавання перад загрузкай. Далей можа быць неабходна дапоўніць метададзеныя.",
"LabelAutoLaunch": "Аўтазапуск",
"LabelAutoLaunchDescription": "Аўтаматычна перанакіроўваць да пастаўшчыка аўтэнтыфікацыі пры переходзе на старонку ўваходу (ручное пераключэнне праз шлях <code>/login?autoLaunch=0</code>)",
"LabelAutoRegister": "Аўтарэгістрацыя",
"LabelAutoRegisterDescription": "Аўтаматычна ствараць новых карыстальнікаў пасля ўваходу ў сістэму",
"LabelBackToUser": "Вярнуцца да карыстальніка",
"LabelBackupAudioFiles": "Рэзервовае капіраванне аўдыёфайлаў", "LabelBackupAudioFiles": "Рэзервовае капіраванне аўдыёфайлаў",
"LabelBackupLocation": "Месцазнаходжанне рэзервовых копій", "LabelBackupLocation": "Месцазнаходжанне рэзервовых копій",
"LabelBackupsEnableAutomaticBackups": "Аўтаматычнае рэзервовае капіраванне",
"LabelBackupsEnableAutomaticBackupsHelp": "Рэзервовыя копіі захаваныя ў /metadata/backups",
"LabelBackupsMaxBackupSize": "Максімальны памер рэзервовай копіі (у ГБ) (0 — неабмежавана)",
"LabelBackupsMaxBackupSizeHelp": "Для таго, каб пазбегнуць няправільных налад, рэзервовыя копіі не будуць створаны, калі іх памер будзе больш за дапушчальны.",
"LabelBackupsNumberToKeep": "Колькасць захаваных рэзервовых копій",
"LabelBackupsNumberToKeepHelp": "Адначасова будзе выдаляцца толькі 1 рэзервовая копія, таму, калі ў вас іх больш, вам варта выдаліць іх уручную.", "LabelBackupsNumberToKeepHelp": "Адначасова будзе выдаляцца толькі 1 рэзервовая копія, таму, калі ў вас іх больш, вам варта выдаліць іх уручную.",
"LabelBitrate": "Бітрэйт",
"LabelBonus": "Бонус",
"LabelBooks": "Кнігі", "LabelBooks": "Кнігі",
"LabelButtonText": "Тэкст кнопкі",
"LabelByAuthor": "ад {0}",
"LabelChangePassword": "Змяніць пароль",
"LabelChannels": "Каналы",
"LabelChapterCount": "{0} раздзелаў",
"LabelChapterTitle": "Назва раздзела",
"LabelChapters": "Раздзелы", "LabelChapters": "Раздзелы",
"LabelChaptersFound": "раздзелаў знойдзена",
"LabelClickForMoreInfo": "Націсніце для больш падрабязнай інфармацыі",
"LabelClickToUseCurrentValue": "Націсніце, каб выкарыстоўваць бягучае значэнне",
"LabelClosePlayer": "Зачыніць прайгравальнік", "LabelClosePlayer": "Зачыніць прайгравальнік",
"LabelCodec": "Кодэк",
"LabelCollapseSeries": "Згарнуць серыі", "LabelCollapseSeries": "Згарнуць серыі",
"LabelCollapseSubSeries": "Згарнуць падсерыі",
"LabelCollection": "Калекцыя",
"LabelCollections": "Калекцыі",
"LabelComplete": "Завершана", "LabelComplete": "Завершана",
"LabelConfirmPassword": "Пацвердзіце пароль",
"LabelContinueListening": "Працягваць слухаць", "LabelContinueListening": "Працягваць слухаць",
"LabelContinueReading": "Працягнуць чытанне", "LabelContinueReading": "Працягнуць чытанне",
"LabelContinueSeries": "Працягнуць серыі", "LabelContinueSeries": "Працягнуць серыі",
"LabelCover": "Вокладка",
"LabelCoverImageURL": "URL выявы вокладкі",
"LabelCoverProvider": "Крыніца вокладак",
"LabelCreatedAt": "Дата стварэння",
"LabelCronExpression": "Запіс Cron",
"LabelCurrent": "Бягучы",
"LabelCurrently": "Бягучы:",
"LabelCustomCronExpression": "Уласны запіс Cron:",
"LabelDatetime": "Дата і час", "LabelDatetime": "Дата і час",
"LabelDays": "Дзён",
"LabelDeleteFromFileSystemCheckbox": "Выдаліць з файлавай сістэмы (зніміце галачку, каб выдаліць толькі з базы даных)",
"LabelDescription": "Апісанне", "LabelDescription": "Апісанне",
"LabelDeselectAll": "Скасаваць выбар усяго",
"LabelDevice": "Прылада",
"LabelDeviceInfo": "Інфармацыя пра прыладу",
"LabelDeviceIsAvailableTo": "Прылада даступная для...",
"LabelDirectory": "Каталог",
"LabelDiscFromFilename": "Дыск з імя файла", "LabelDiscFromFilename": "Дыск з імя файла",
"LabelDiscFromMetadata": "Дыск па метададзеных",
"LabelDiscover": "Знайсці", "LabelDiscover": "Знайсці",
"LabelDownload": "Спампаваць", "LabelDownload": "Спампаваць",
"LabelDownloadNEpisodes": "Спампована {0} эпізодаў", "LabelDownloadNEpisodes": "Спампована {0} эпізодаў",
"LabelDownloadable": "Спампоўваецца", "LabelDownloadable": "Спампоўваецца",
"LabelDuration": "Працягласць", "LabelDuration": "Працягласць",
"LabelDurationComparisonExactMatch": "(дакладнае супадзенне)",
"LabelDurationComparisonLonger": "(на {0} даўжэй)",
"LabelDurationComparisonShorter": "(на {0} карацей)",
"LabelDurationFound": "Знойдзеная працягласць:",
"LabelEbook": "Электронная кніга", "LabelEbook": "Электронная кніга",
"LabelEbooks": "Электронныя кнігі", "LabelEbooks": "Электронныя кнігі",
"LabelEdit": "Рэдагаваць",
"LabelEmail": "Электронная пошта",
"LabelEmailSettingsFromAddress": "Адрас адпраўніка",
"LabelEmailSettingsRejectUnauthorized": "Адхіляць неаўтарызаваныя сертыфікаты",
"LabelEmailSettingsRejectUnauthorizedHelp": "Адключэнне праверкі SSL-сертыфіката можа зрабіць ваша злучэнне ўразлівым перад пагрозамі бяспекі, такімі як атакі \"чалавек пасярэдзіне\". Адключайце гэтую опцыю толькі калі цалкам разумееце наступствы і ўпэўнены ў надзейнасці паштовага сервера.",
"LabelEmailSettingsSecure": "Бяспечныя",
"LabelEmailSettingsSecureHelp": "Калі ўключана, злучэнне будзе выкарыстоўваць TLS пры падключэнні да сервера. Калі выключана, TLS будзе выкарыстоўвацца толькі ў выпадку падтрымкі пашырэння STARTTLS на серверы. У большасці выпадкаў усталюйце значэнне true пры падключэнні да порта 465. Для партоў 587 або 25 не ўключайце яго. (інфармацыя з nodemailer.com/smtp/#authentication)",
"LabelEmailSettingsTestAddress": "Тэставы адрас",
"LabelEmbeddedCover": "Убудаваная вокладка",
"LabelEnable": "Уключыць", "LabelEnable": "Уключыць",
"LabelEncodingBackupLocation": "Рэзервовая копія вашых арыгінальных аўдыёфайлаў будзе захавана ў:", "LabelEncodingBackupLocation": "Рэзервовая копія вашых арыгінальных аўдыёфайлаў будзе захавана ў:",
"LabelEncodingChaptersNotEmbedded": "Раздзелы не ўбудаваны ў шматдарожкавыя аўдыякнігі.", "LabelEncodingChaptersNotEmbedded": "Раздзелы не ўбудаваны ў шматдарожкавыя аўдыякнігі.",
"LabelEncodingClearItemCache": "Пераканайцеся, што перыядычна ачышчаеце кэш элементаў.",
"LabelEncodingFinishedM4B": "Гатовы файл M4B будзе змешчаны ў вашу тэчку з аўдыякнігамі па адрасе:", "LabelEncodingFinishedM4B": "Гатовы файл M4B будзе змешчаны ў вашу тэчку з аўдыякнігамі па адрасе:",
"LabelEncodingInfoEmbedded": "Метаданыя будуць убудаваны ў аўдыядарожкі ўнутры вашай тэчкі з аўдыякнігамі.", "LabelEncodingInfoEmbedded": "Метададзеныя будуць убудаваны ў аўдыядарожкі ўнутры вашай тэчкі з аўдыякнігамі.",
"LabelEncodingStartedNavigation": "Пасля запуску задачы вы можаце перайсці на іншую старонку.",
"LabelEncodingTimeWarning": "Кадаванне можа заняць да 30 хвілін.", "LabelEncodingTimeWarning": "Кадаванне можа заняць да 30 хвілін.",
"LabelEnd": "Канец", "LabelEnd": "Канец",
"LabelEndOfChapter": "Канец раздзела", "LabelEndOfChapter": "Канец раздзела",
"LabelEpisode": "Эпізод", "LabelEpisode": "Эпізод",
"LabelEpisodeNotLinkedToRssFeed": "Эпізод не звязаны з RSS-стужкай", "LabelEpisodeNotLinkedToRssFeed": "Эпізод не звязаны з RSS-стужкай",
"LabelEpisodeUrlFromRssFeed": "URL эпізоду з RSS-стужкі", "LabelEpisodeUrlFromRssFeed": "URL эпізоду з RSS-стужкі",
"LabelEpisodic": "Эпізадычны",
"LabelExample": "Прыклад",
"LabelExpandSeries": "Разгарнуць серыю",
"LabelExpandSubSeries": "Разгарнуць падсерыі",
"LabelExpired": "Пратэрмінаваны",
"LabelExpiresAt": "Тэрмін дзеяння заканчваецца ў",
"LabelExpiresInSeconds": "Тэрмін дзеяння заканчваецца праз (секунд)",
"LabelExpiresNever": "Ніколі",
"LabelExplicit": "Відверты",
"LabelExportOPML": "Экспарт OPML",
"LabelFeedURL": "URL стужкі", "LabelFeedURL": "URL стужкі",
"LabelFetchingMetadata": "Атрыманне метададзеных",
"LabelFile": "Файл", "LabelFile": "Файл",
"LabelFileBirthtime": "Час стварэння файла", "LabelFileBirthtime": "Час стварэння файла",
"LabelFileModified": "Час змянення файла", "LabelFileModified": "Час змянення файла",
@@ -289,6 +371,7 @@
"LabelHasSupplementaryEbook": "Мае дадатковую электронную кнігу", "LabelHasSupplementaryEbook": "Мае дадатковую электронную кнігу",
"LabelHideSubtitles": "Схаваць падзагалоўкі", "LabelHideSubtitles": "Схаваць падзагалоўкі",
"LabelHost": "Хост", "LabelHost": "Хост",
"LabelImageURLFromTheWeb": "URL выявы з інтэрнэту",
"LabelInProgress": "У працэсе", "LabelInProgress": "У працэсе",
"LabelIncomplete": "Незавершана", "LabelIncomplete": "Незавершана",
"LabelIntervalCustomDailyWeekly": "Карыстальніцкі штодзённы/штотыднёвы", "LabelIntervalCustomDailyWeekly": "Карыстальніцкі штодзённы/штотыднёвы",
@@ -319,6 +402,7 @@
"LabelLibraryFilterSublistEmpty": "Не {0}", "LabelLibraryFilterSublistEmpty": "Не {0}",
"LabelLibraryItem": "Элемент бібліятэкі", "LabelLibraryItem": "Элемент бібліятэкі",
"LabelLibraryName": "Імя бібліятэкі", "LabelLibraryName": "Імя бібліятэкі",
"LabelLibrarySortByProgress": "Прагрэс абноўлены",
"LabelLimit": "Абмежаванне", "LabelLimit": "Абмежаванне",
"LabelLineSpacing": "Міжрадковы інтэрвал", "LabelLineSpacing": "Міжрадковы інтэрвал",
"LabelListenAgain": "Паслухаць зноў", "LabelListenAgain": "Паслухаць зноў",
@@ -327,6 +411,8 @@
"LabelMaxEpisodesToKeepHelp": "Значэнне 0 не ўстанаўлівае максімальнага абмежавання. Пасля аўтаматычнай спампоўкі новага эпізоду будзе выдалены самы стары эпізод, калі ў вас больш за X эпізодаў. Пры кожнай новай спампоўцы будзе выдаляцца толькі 1 эпізод.", "LabelMaxEpisodesToKeepHelp": "Значэнне 0 не ўстанаўлівае максімальнага абмежавання. Пасля аўтаматычнай спампоўкі новага эпізоду будзе выдалены самы стары эпізод, калі ў вас больш за X эпізодаў. Пры кожнай новай спампоўцы будзе выдаляцца толькі 1 эпізод.",
"LabelMediaPlayer": "Медыяпрайгравальнік", "LabelMediaPlayer": "Медыяпрайгравальнік",
"LabelMediaType": "Тып медыя", "LabelMediaType": "Тып медыя",
"LabelMetadataOrderOfPrecedenceDescription": "Крыніцы метададзеных з вышэйшым прыярытэтам будуць замяняць крыніцы з ніжэйшым прыярытэтам",
"LabelMetadataProvider": "Пастаўшчык метададзеных",
"LabelMissing": "Адсутнічае", "LabelMissing": "Адсутнічае",
"LabelMore": "Больш", "LabelMore": "Больш",
"LabelMoreInfo": "Больш інфармацыі", "LabelMoreInfo": "Больш інфармацыі",
@@ -335,6 +421,7 @@
"LabelNarrators": "Чытальнікі", "LabelNarrators": "Чытальнікі",
"LabelNewestAuthors": "Новыя аўтары", "LabelNewestAuthors": "Новыя аўтары",
"LabelNewestEpisodes": "Новыя эпізоды", "LabelNewestEpisodes": "Новыя эпізоды",
"LabelNoCustomMetadataProviders": "Няма карыстацкіх пастаўшчыкоў метададзеных",
"LabelNotFinished": "Не скончана", "LabelNotFinished": "Не скончана",
"LabelNotStarted": "Не пачата", "LabelNotStarted": "Не пачата",
"LabelNotificationsMaxFailedAttemptsHelp": "Апавяшчэнні адключаюцца пасля таго, як не ўдаецца іх адправіць гэтулькі разоў", "LabelNotificationsMaxFailedAttemptsHelp": "Апавяшчэнні адключаюцца пасля таго, як не ўдаецца іх адправіць гэтулькі разоў",
@@ -353,7 +440,7 @@
"LabelPublishedDate": "Апублікавана {0}", "LabelPublishedDate": "Апублікавана {0}",
"LabelRSSFeedCustomOwnerEmail": "Карыстальніцкая электронная пошта ўладальніка", "LabelRSSFeedCustomOwnerEmail": "Карыстальніцкая электронная пошта ўладальніка",
"LabelRSSFeedCustomOwnerName": "Карыстальніцкае імя ўладальніка", "LabelRSSFeedCustomOwnerName": "Карыстальніцкае імя ўладальніка",
"LabelRSSFeedOpen": "RSS-стужка адкрытая", "LabelRSSFeedOpen": "RSS-стужка адкрыта",
"LabelRSSFeedPreventIndexing": "Прадухіліць індэксацыю", "LabelRSSFeedPreventIndexing": "Прадухіліць індэксацыю",
"LabelRSSFeedSlug": "Ідэнтыфікатар RSS-стужкі", "LabelRSSFeedSlug": "Ідэнтыфікатар RSS-стужкі",
"LabelRSSFeedURL": "URL RSS-стужкі", "LabelRSSFeedURL": "URL RSS-стужкі",
@@ -392,6 +479,7 @@
"LabelSettingsAudiobooksOnly": "Толькі аўдыякнігі", "LabelSettingsAudiobooksOnly": "Толькі аўдыякнігі",
"LabelSettingsAudiobooksOnlyHelp": "Уключэнне гэтай налады будзе ігнараваць файлы электронных кніг, калі толькі яны не знаходзяцца ў тэчцы з аўдыякнігамі. У такім выпадку яны будуць пазначаны як дадатковыя электронныя кнігі.", "LabelSettingsAudiobooksOnlyHelp": "Уключэнне гэтай налады будзе ігнараваць файлы электронных кніг, калі толькі яны не знаходзяцца ў тэчцы з аўдыякнігамі. У такім выпадку яны будуць пазначаны як дадатковыя электронныя кнігі.",
"LabelSettingsBookshelfViewHelp": "Рэалістычны дызайн з драўлянымі паліцамі", "LabelSettingsBookshelfViewHelp": "Рэалістычны дызайн з драўлянымі паліцамі",
"LabelSettingsEnableWatcherForLibrary": "Аўтаматычна правяраць бібліятэку на змены",
"LabelSettingsEnableWatcherHelp": "Адключае аўтаматычнае дадаванне/абнаўленне элементаў пры выяўленні змен у файлах. *Патрабуецца перазапуск сервера", "LabelSettingsEnableWatcherHelp": "Адключае аўтаматычнае дадаванне/абнаўленне элементаў пры выяўленні змен у файлах. *Патрабуецца перазапуск сервера",
"LabelSettingsEpubsAllowScriptedContent": "Дазволіць скрыптавы кантэнт у EPUB", "LabelSettingsEpubsAllowScriptedContent": "Дазволіць скрыптавы кантэнт у EPUB",
"LabelSettingsEpubsAllowScriptedContentHelp": "Дазволіць EPUB-файлам выконваць скрыпты. Рэкамендуецца пакінуць гэтую наладу выключанай, калі вы не давяраеце крыніцы EPUB-файлаў.", "LabelSettingsEpubsAllowScriptedContentHelp": "Дазволіць EPUB-файлам выконваць скрыпты. Рэкамендуецца пакінуць гэтую наладу выключанай, калі вы не давяраеце крыніцы EPUB-файлаў.",
@@ -409,6 +497,11 @@
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Палка \"Працягнуць серыю\" на галоўнай старонцы паказвае першую не пачатую кнігу ў серыях, дзе завершана хаця б адна кніга і няма кніг у працэсе чытання. Уключэнне гэтай налады дазволіць працягваць серыю з самай апошняй завершанай кнігі замест першай не пачатай.", "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Палка \"Працягнуць серыю\" на галоўнай старонцы паказвае першую не пачатую кнігу ў серыях, дзе завершана хаця б адна кніга і няма кніг у працэсе чытання. Уключэнне гэтай налады дазволіць працягваць серыю з самай апошняй завершанай кнігі замест першай не пачатай.",
"LabelSettingsParseSubtitles": "Разабраць падзагалоўкі", "LabelSettingsParseSubtitles": "Разабраць падзагалоўкі",
"LabelSettingsParseSubtitlesHelp": "Выдзяляць падзагаловак з назваў тэчак аўдыякніг.<br>Падзагаловак павінен быць аддзелены знакам \" - \".<br>Напрыклад, \"Назва кнігі - Падзагаловак тут\" мае падзагаловак \"Падзагаловак тут\"", "LabelSettingsParseSubtitlesHelp": "Выдзяляць падзагаловак з назваў тэчак аўдыякніг.<br>Падзагаловак павінен быць аддзелены знакам \" - \".<br>Напрыклад, \"Назва кнігі - Падзагаловак тут\" мае падзагаловак \"Падзагаловак тут\"",
"LabelSettingsPreferMatchedMetadata": "Аддаваць перавагу супадаючым метададзеным",
"LabelSettingsPreferMatchedMetadataHelp": "Супадаючыя дадзеныя будуць замяняць дэталі элемента пры выкарыстанні функцыі Хуткі пошук. Па змаўчанні Хуткі пошук запаўняе толькі адсутныя дэталі.",
"LabelSettingsStoreCoversWithItemHelp": "Па змаўчанні вокладкі захоўваюцца ў /metadata/items, уключэнне гэтай опцыі забяспечыць захоўванне вокладак у тэчцы элемента вашай бібліятэкі. Захоўвацца будзе толькі адзін файл з назвай \"cover\"",
"LabelSettingsStoreMetadataWithItem": "Захоўваць метададзеныя разам з элементам",
"LabelSettingsStoreMetadataWithItemHelp": "Па змаўчанні метададзеныя захоўваюцца ў /metadata/items. Уключэнне гэтай опцыі забяспечыць захоўванне файлаў метададзеных у тэчках элементаў вашай бібліятэкі",
"LabelSettingsTimeFormat": "Фармат часу", "LabelSettingsTimeFormat": "Фармат часу",
"LabelShareDownloadableHelp": "Дазваляе карыстальнікам, якія маюць спасылку на доступ, спампаваць ZIP-файл элемента бібліятэкі.", "LabelShareDownloadableHelp": "Дазваляе карыстальнікам, якія маюць спасылку на доступ, спампаваць ZIP-файл элемента бібліятэкі.",
"LabelShowAll": "Паказаць усё", "LabelShowAll": "Паказаць усё",
@@ -438,7 +531,7 @@
"LabelTags": "Меткі", "LabelTags": "Меткі",
"LabelTagsAccessibleToUser": "Меткі, даступныя карыстальніку", "LabelTagsAccessibleToUser": "Меткі, даступныя карыстальніку",
"LabelTagsNotAccessibleToUser": "Меткі, недаступныя карыстальніку", "LabelTagsNotAccessibleToUser": "Меткі, недаступныя карыстальніку",
"LabelTasks": "Выконваюцца задачы", "LabelTasks": "Запушчаныя задачы",
"LabelTextEditorBulletedList": "Маркіраваны спіс", "LabelTextEditorBulletedList": "Маркіраваны спіс",
"LabelTextEditorLink": "Спасылка", "LabelTextEditorLink": "Спасылка",
"LabelTextEditorNumberedList": "Нумараваны спіс", "LabelTextEditorNumberedList": "Нумараваны спіс",
@@ -457,11 +550,14 @@
"LabelTimeRemaining": "Засталося {0}", "LabelTimeRemaining": "Засталося {0}",
"LabelTimeToShift": "Час зрушэння ў секундах", "LabelTimeToShift": "Час зрушэння ў секундах",
"LabelTitle": "Назва", "LabelTitle": "Назва",
"LabelToolsSplitM4bDescription": "Стварэнне MP3 з M4B, падзеленага па раздзелах, з убудаванымі метаданымі, вокладкай і раздзеламі.", "LabelToolsEmbedMetadata": "Убудаваць метададзеныя",
"LabelToolsEmbedMetadataDescription": "Убудаваць метададзеныя ў аўдыёфайлы, уключаючы выяву вокладкі і раздзелы.",
"LabelToolsMakeM4bDescription": "Стварыць аўдыёкнігу ў фармаце .M4B з убудаванымі метададзенымі, выявай вокладкі і раздзеламі.",
"LabelToolsSplitM4bDescription": "Стварэнне MP3 з M4B, падзеленага па раздзелах, з убудаванымі метададзенымі, выявай вокладкі і раздзеламі.",
"LabelTotalDuration": "Агульная працягласць", "LabelTotalDuration": "Агульная працягласць",
"LabelTotalTimeListened": "Агульны час праслухоўвання", "LabelTotalTimeListened": "Агульны час праслухоўвання",
"LabelTrackFromFilename": "Дарожка з імя файла", "LabelTrackFromFilename": "Дарожка з імя файла",
"LabelTrackFromMetadata": "Дарожка з метаданых", "LabelTrackFromMetadata": "Дарожка з метададзеных",
"LabelTracks": "Дарожкі", "LabelTracks": "Дарожкі",
"LabelTracksMultiTrack": "Шматдарожкавы", "LabelTracksMultiTrack": "Шматдарожкавы",
"LabelTracksNone": "Няма дарожак", "LabelTracksNone": "Няма дарожак",
@@ -510,19 +606,30 @@
"MessageBackupsLocationPathEmpty": "Шлях да месцазнаходжання рэзервовых копій не можа быць пустым", "MessageBackupsLocationPathEmpty": "Шлях да месцазнаходжання рэзервовых копій не можа быць пустым",
"MessageBatchEditPopulateMapDetailsAllHelp": "Запоўніце ўключаныя палі дадзенымі з усіх элементаў. Палі з некалькімі значэннямі будуць аб'яднаны", "MessageBatchEditPopulateMapDetailsAllHelp": "Запоўніце ўключаныя палі дадзенымі з усіх элементаў. Палі з некалькімі значэннямі будуць аб'яднаны",
"MessageBatchEditPopulateMapDetailsItemHelp": "Запоўніце ўключаныя палі падрабязнасцей карты дадзенымі з гэтага элемента", "MessageBatchEditPopulateMapDetailsItemHelp": "Запоўніце ўключаныя палі падрабязнасцей карты дадзенымі з гэтага элемента",
"MessageBatchQuickMatchDescription": "Хуткі пошук паспрабуе дадаць адсутныя вокладкі і метададзеныя для выбраных элементаў. Уключыце ніжэй выкладзеныя опцыі, каб дазволіць Хуткаму пошуку замяняць існуючыя вокладкі і/або метададзеныя.",
"MessageBookshelfNoRSSFeeds": "Няма адкрытых RSS-стужак", "MessageBookshelfNoRSSFeeds": "Няма адкрытых RSS-стужак",
"MessageChapterErrorStartGteDuration": "Няправільны час пачатку: ён павінен быць меншым за працягласць аўдыякнігі", "MessageChapterErrorStartGteDuration": "Няправільны час пачатку: ён павінен быць меншым за працягласць аўдыякнігі",
"MessageChapterErrorStartLtPrev": "Няправільны час пачатку: ён павінен быць большым або роўным часу пачатку папярэдняга раздзела", "MessageChapterErrorStartLtPrev": "Няправільны час пачатку: ён павінен быць большым або роўным часу пачатку папярэдняга раздзела",
"MessageConfirmCloseFeed": "Вы ўпэўнены, што жадаеце закрыць гэтую стужку?", "MessageConfirmCloseFeed": "Вы ўпэўнены, што жадаеце закрыць гэтую стужку?",
"MessageConfirmDeleteMetadataProvider": "Ці ўпэўненыя вы, што жадаеце выдаліць карыстацкага пастаўшчыка метададзеных \"{0}\"?",
"MessageConfirmEmbedMetadataInAudioFiles": "Ці ўпэўненыя вы, што жадаеце ўбудаваць метададзеныя ў {0} аўдыёфайлаў?",
"MessageConfirmPurgeCache": "Ачышчэнне кэша выдаліць увесь каталог па адрасе <code>/metadata/cache</code>. <br /><br /> Ці сапраўды вы жадаеце выдаліць каталог кэша?",
"MessageConfirmPurgeItemsCache": "Ачышчэнне кэша элементаў выдаліць увесь каталог па адрасе <code>/metadata/cache/items</code>. <br /> Вы ўпэўнены?",
"MessageConfirmQuickMatchEpisodes": "Хуткае супадзенне эпізодаў перазапіша дэталі, калі супадзенне будзе знойдзена. Будуць абноўлены толькі эпізоды, якія не супадаюць. Вы ўпэўнены?",
"MessageConfirmRemoveListeningSessions": "Вы ўпэўнены, што жадаеце выдаліць {0} сеансаў праслухоўвання?", "MessageConfirmRemoveListeningSessions": "Вы ўпэўнены, што жадаеце выдаліць {0} сеансаў праслухоўвання?",
"MessageConfirmRemoveMetadataFiles": "Ці ўпэўненыя вы, што жадаеце выдаліць усе файлы метададзеных{0} у тэчках элементаў вашай бібліятэкі?",
"MessageConfirmRemovePlaylist": "Вы ўпэўненыя, што жадаеце выдаліць свой спіс прайгравання \"{0}\"?", "MessageConfirmRemovePlaylist": "Вы ўпэўненыя, што жадаеце выдаліць свой спіс прайгравання \"{0}\"?",
"MessageConfirmSendEbookToDevice": "Вы ўпэўнены, што хочаце адправіць {0} электронную кнігу \"{1}\" на прыладу \"{2}\"?", "MessageConfirmSendEbookToDevice": "Вы ўпэўнены, што хочаце адправіць {0} электронную кнігу \"{1}\" на прыладу \"{2}\"?",
"MessageDownloadingEpisode": "Спампоўка эпізоду", "MessageDownloadingEpisode": "Спампоўка эпізоду",
"MessageEmbedQueue": "У чарзе на ўбудаванне метададзеных (у чарзе {0})",
"MessageEpisodesQueuedForDownload": "{0} эпізод(аў) у чарзе для спампоўкі", "MessageEpisodesQueuedForDownload": "{0} эпізод(аў) у чарзе для спампоўкі",
"MessageEreaderDevices": "Каб забяспечыць дастаўку электронных кніг, вам можа спатрэбіцца дадаць вышэйзгаданы адрас электроннай пошты як дазволенага адпраўніка для кожнай прылады, пералічанай ніжэй.", "MessageEreaderDevices": "Каб забяспечыць дастаўку электронных кніг, вам можа спатрэбіцца дадаць вышэйзгаданы адрас электроннай пошты як дазволенага адпраўніка для кожнай прылады, пералічанай ніжэй.",
"MessageFeedURLWillBe": "URL стужкі будзе {0}", "MessageFeedURLWillBe": "URL стужкі будзе {0}",
"MessageFetching": "Атрыманне...", "MessageFetching": "Атрыманне...",
"MessageInvalidAsin": "Няправільны ASIN",
"MessageItemsUpdated": "{0} элементаў абноўлена",
"MessageLoading": "Загрузка...", "MessageLoading": "Загрузка...",
"MessageLogsDescription": "Журналы захоўваюцца ў каталогу <code>/metadata/logs</code> у фармаце JSON. Журналы памылак захоўваюцца ў файле <code>/metadata/logs/crashlogs.txt</code>.",
"MessageMapChapterTitles": "Супаставіць назвы раздзелаў з вашымі існуючымі раздзеламі аўдыякнігі без змянення часовых метак", "MessageMapChapterTitles": "Супаставіць назвы раздзелаў з вашымі існуючымі раздзеламі аўдыякнігі без змянення часовых метак",
"MessageMarkAsFinished": "Пазначыць як скончана", "MessageMarkAsFinished": "Пазначыць як скончана",
"MessageNoBookmarks": "Няма закладак", "MessageNoBookmarks": "Няма закладак",
@@ -536,26 +643,54 @@
"MessageNoMediaProgress": "Няма прагрэсу медыя", "MessageNoMediaProgress": "Няма прагрэсу медыя",
"MessageNoPodcastFeed": "Няправільны падкаст: Няма стужкі", "MessageNoPodcastFeed": "Няправільны падкаст: Няма стужкі",
"MessageNoPodcastsFound": "Падкасты не знойдзены", "MessageNoPodcastsFound": "Падкасты не знойдзены",
"MessageNoTasksRunning": "Няма запушчаных задач",
"MessageNoUpdatesWereNecessary": "Абнаўленні не патрабаваліся", "MessageNoUpdatesWereNecessary": "Абнаўленні не патрабаваліся",
"MessageNoUserPlaylists": "У вас няма спісаў прайгравання", "MessageNoUserPlaylists": "У вас няма спісаў прайгравання",
"MessageNoUserPlaylistsHelp": "Спісы прайгравання прыватныя. Толькі карыстальнік, які іх стварыў, можа іх бачыць.", "MessageNoUserPlaylistsHelp": "Спісы прайгравання прыватныя. Толькі карыстальнік, які іх стварыў, можа іх бачыць.",
"MessageOpmlPreviewNote": "Заўвага: гэта папярэдні прагляд разабранага OPML-файла. Фактычная назва падкаста будзе ўзятая з RSS-стужкі.", "MessageOpmlPreviewNote": "Заўвага: гэта папярэдні прагляд разабранага файла OPML. Фактычная назва падкаста будзе ўзятая з RSS-стужкі.",
"MessagePlaylistCreateFromCollection": "Стварыць спіс прайгравання з калекцыі", "MessagePlaylistCreateFromCollection": "Стварыць спіс прайгравання з калекцыі",
"MessagePodcastHasNoRSSFeedForMatching": "У падкаста няма URL RSS-стужкі для супадзення", "MessagePodcastHasNoRSSFeedForMatching": "У падкаста няма URL RSS-стужкі для супадзення",
"MessagePodcastSearchField": "Увядзіце пошукавы запыт або URL RSS-стужкі", "MessagePodcastSearchField": "Увядзіце пошукавы запыт або URL RSS-стужкі",
"MessageQuickMatchDescription": "Запоўніць пустыя дэталі элемента і вокладку першым вынікам супадзення з '{0}'. Не замяняе дэталі, калі опцыя «Аддаваць перавагу супадаючым метададзеным» на серверы не ўключана.",
"MessageReportBugsAndContribute": "Паведамляйце пра памылкі, прапануйце новыя функцыі і ўдзельнічайце на", "MessageReportBugsAndContribute": "Паведамляйце пра памылкі, прапануйце новыя функцыі і ўдзельнічайце на",
"MessageRestoreBackupWarning": "Аднаўленне рэзервовай копіі перазапіша ўсю базу даных, размешчаную ў /config, а таксама выявы вокладкі ў /metadata/items і /metadata/authors. <br /><br /> Рэзервовыя копіі не змяняюць файлы ў вашых тэчках бібліятэкі. Калі вы ўключылі наладкі сервера для захоўвання воклак і метададзеных у тэчках бібліятэкі, гэтыя файлы не будуць захаваныя ў рэзервовых копіях і не зменяцца. <br /><br /> Усе кліенты, якія карыстаюцца вашым серверам, будуць аўтаматычна абноўлены.",
"MessageScheduleRunEveryWeekdayAtTime": "Выконваць кожныя {0} у {1}", "MessageScheduleRunEveryWeekdayAtTime": "Выконваць кожныя {0} у {1}",
"MessageStartPlaybackAtTime": "Пачаць прайграванне для \"{0}\" з {1}?", "MessageStartPlaybackAtTime": "Пачаць прайграванне для \"{0}\" з {1}?",
"MessageTaskAudioFileNotWritable": "Аўдыёфайл \"{0}\" недаступны для запісу",
"MessageTaskCanceledByUser": "Задача скасавана карыстальнікам", "MessageTaskCanceledByUser": "Задача скасавана карыстальнікам",
"MessageTaskDownloadingEpisodeDescription": "Спампоўка эпізоду \"{0}\"", "MessageTaskDownloadingEpisodeDescription": "Спампоўка эпізоду \"{0}\"",
"MessageTaskEmbeddingMetadata": "Убудаванне метададзеных",
"MessageTaskEmbeddingMetadataDescription": "Убудаванне метададзеных у аўдыёкнігу \"{0}\"",
"MessageTaskEncodingM4b": "Кадаванне M4B",
"MessageTaskEncodingM4bDescription": "Кадаванне аўдыякнігі \"{0}\" у адзін файл m4b",
"MessageTaskFailed": "Не ўдалося",
"MessageTaskFailedToBackupAudioFile": "Не ўдалося зрабіць рэзервовую копію аўдыёфайла \"{0}\"",
"MessageTaskFailedToCreateCacheDirectory": "Не ўдалося стварыць каталог кэша",
"MessageTaskFailedToEmbedMetadataInFile": "Не ўдалося ўбудаваць метададзеныя ў файл \"{0}\"",
"MessageTaskFailedToMergeAudioFiles": "Не ўдалося аб’яднаць аўдыёфайлы",
"MessageTaskFailedToMoveM4bFile": "Не ўдалося перамясціць файл m4b",
"MessageTaskFailedToWriteMetadataFile": "Не ўдалося захаваць файл метададзеных",
"MessageTaskMatchingBooksInLibrary": "Пошук супадзенняў кніг у бібліятэцы \"{0}\"",
"MessageTaskNoFilesToScan": "Няма файлаў для сканавання",
"MessageTaskOpmlImport": "Імпарт OPML",
"MessageTaskOpmlImportDescription": "Стварэнне падкастаў з {0} RSS-стужак", "MessageTaskOpmlImportDescription": "Стварэнне падкастаў з {0} RSS-стужак",
"MessageTaskOpmlImportFeed": "Імпарт стужкі з OPML", "MessageTaskOpmlImportFeed": "Імпарт стужкі OPML",
"MessageTaskOpmlImportFeedDescription": "Імпартаванне RSS-стужкі \"{0}\"", "MessageTaskOpmlImportFeedDescription": "Імпартаванне RSS-стужкі \"{0}\"",
"MessageTaskOpmlImportFeedFailed": "Не ўдалося атрымаць стужку падкаста", "MessageTaskOpmlImportFeedFailed": "Не ўдалося атрымаць стужку падкаста",
"MessageTaskOpmlImportFeedPodcastDescription": "Стварэнне падкаста \"{0}\"", "MessageTaskOpmlImportFeedPodcastDescription": "Стварэнне падкаста \"{0}\"",
"MessageTaskOpmlImportFeedPodcastExists": "Падкаст ужо існуе па гэтым шляху", "MessageTaskOpmlImportFeedPodcastExists": "Падкаст ужо існуе па гэтым шляху",
"MessageTaskOpmlImportFeedPodcastFailed": "Не ўдалося стварыць падкаст", "MessageTaskOpmlImportFeedPodcastFailed": "Не ўдалося стварыць падкаст",
"MessageTaskOpmlParseNoneFound": "У OPML-файле не знойдзена стужак", "MessageTaskOpmlImportFinished": "Дададзена {0} падкастаў",
"MessageTaskOpmlParseFailed": "Не ўдалося разабраць файл OPML",
"MessageTaskOpmlParseFastFail": "Неправільны файл OPML: тэг <opml> не знойдзены АБО тэг <outline> не знойдзены",
"MessageTaskOpmlParseNoneFound": "У файле OPML не знойдзена стужак",
"MessageTaskScanItemsAdded": "{0} дададзена",
"MessageTaskScanItemsMissing": "{0} адсутнічае",
"MessageTaskScanItemsUpdated": "{0} абноўлена",
"MessageTaskScanNoChangesNeeded": "Змены не патрабуюцца",
"MessageTaskScanningFileChanges": "Сканіраванне змяненняў у файле \"{0}\"",
"MessageTaskScanningLibrary": "Сканіраванне бібліятэкі \"{0}\"",
"MessageTaskTargetDirectoryNotWritable": "Мэтавы каталог недаступны для запісу",
"NoteChapterEditorTimes": "Заўвага: Час пачатку першага раздзела павінен заставацца 0:00, а час пачатку апошняга раздзела не можа перавышаць працягласць гэтай аўдыякнігі.", "NoteChapterEditorTimes": "Заўвага: Час пачатку першага раздзела павінен заставацца 0:00, а час пачатку апошняга раздзела не можа перавышаць працягласць гэтай аўдыякнігі.",
"NoteRSSFeedPodcastAppsHttps": "Папярэджанне: большасць праграм для падкастаў патрабуюць, каб URL RSS-стужкі выкарыстоўваў HTTPS", "NoteRSSFeedPodcastAppsHttps": "Папярэджанне: большасць праграм для падкастаў патрабуюць, каб URL RSS-стужкі выкарыстоўваў HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Папярэджанне: адзін ці больш вашых эпізодаў не маюць даты публікацыі. Некаторыя праграмы для падкастаў патрабуюць гэтага.", "NoteRSSFeedPodcastAppsPubDate": "Папярэджанне: адзін ці больш вашых эпізодаў не маюць даты публікацыі. Некаторыя праграмы для падкастаў патрабуюць гэтага.",
@@ -567,6 +702,11 @@
"StatsBooksListenedTo": "кнігі, якія былі праслуханы", "StatsBooksListenedTo": "кнігі, якія былі праслуханы",
"StatsCollectionGrewTo": "Ваша калекцыя кніг павялічылася да…", "StatsCollectionGrewTo": "Ваша калекцыя кніг павялічылася да…",
"ToastAccountUpdateSuccess": "Уліковы запіс абноўлены", "ToastAccountUpdateSuccess": "Уліковы запіс абноўлены",
"ToastAuthorImageRemoveSuccess": "Выява аўтара выдалена",
"ToastAuthorUpdateSuccess": "Аўтар абноўлены",
"ToastAuthorUpdateSuccessNoImageFound": "Аўтар абноўлены (малюнак не знойдзены)",
"ToastBackupInvalidMaxKeep": "Няправільная колькасць рэзервовых копій для захоўвання",
"ToastBackupInvalidMaxSize": "Няправільны максімальны памер рэзервовай копіі",
"ToastBookmarkCreateFailed": "Не ўдалося стварыць закладку", "ToastBookmarkCreateFailed": "Не ўдалося стварыць закладку",
"ToastDateTimeInvalidOrIncomplete": "Дата і час указаны некарэктна або не цалкам", "ToastDateTimeInvalidOrIncomplete": "Дата і час указаны некарэктна або не цалкам",
"ToastDeviceTestEmailFailed": "Не ўдалося адправіць тэставае электроннае пісьмо", "ToastDeviceTestEmailFailed": "Не ўдалося адправіць тэставае электроннае пісьмо",
@@ -574,6 +714,7 @@
"ToastEncodeCancelSucces": "Кадаванне скасавана", "ToastEncodeCancelSucces": "Кадаванне скасавана",
"ToastEpisodeDownloadQueueClearFailed": "Не ўдалося ачысціць чаргу", "ToastEpisodeDownloadQueueClearFailed": "Не ўдалося ачысціць чаргу",
"ToastEpisodeDownloadQueueClearSuccess": "Чарга спампоўкі эпізодаў ачышчана", "ToastEpisodeDownloadQueueClearSuccess": "Чарга спампоўкі эпізодаў ачышчана",
"ToastInvalidImageUrl": "Няправільны URL выявы",
"ToastInvalidMaxEpisodesToDownload": "Няправільная максімальная колькасць эпізодаў для спампоўкі", "ToastInvalidMaxEpisodesToDownload": "Няправільная максімальная колькасць эпізодаў для спампоўкі",
"ToastItemMarkedAsFinishedFailed": "Не ўдалося пазначыць як Скончана", "ToastItemMarkedAsFinishedFailed": "Не ўдалося пазначыць як Скончана",
"ToastItemMarkedAsFinishedSuccess": "Элемент пазначаны як Завершаны", "ToastItemMarkedAsFinishedSuccess": "Элемент пазначаны як Завершаны",
@@ -602,6 +743,8 @@
"ToastPlaylistCreateSuccess": "Спіс прайгравання створаны", "ToastPlaylistCreateSuccess": "Спіс прайгравання створаны",
"ToastPlaylistRemoveSuccess": "Спіс прайгравання выдалены", "ToastPlaylistRemoveSuccess": "Спіс прайгравання выдалены",
"ToastPlaylistUpdateSuccess": "Спіс прайгравання абноўлены", "ToastPlaylistUpdateSuccess": "Спіс прайгравання абноўлены",
"ToastPodcastCreateFailed": "Не ўдалося стварыць падкаст",
"ToastPodcastCreateSuccess": "Падкаст паспяхова створаны",
"ToastPodcastGetFeedFailed": "Не ўдалося атрымаць стужку падкаста", "ToastPodcastGetFeedFailed": "Не ўдалося атрымаць стужку падкаста",
"ToastPodcastNoEpisodesInFeed": "У RSS-стужцы не знойдзена эпізодаў", "ToastPodcastNoEpisodesInFeed": "У RSS-стужцы не знойдзена эпізодаў",
"ToastPodcastNoRssFeed": "У падкаста няма RSS-стужкі", "ToastPodcastNoRssFeed": "У падкаста няма RSS-стужкі",
@@ -610,6 +753,7 @@
"ToastSendEbookToDeviceFailed": "Не ўдалося адправіць электронную кнігу на прыладу", "ToastSendEbookToDeviceFailed": "Не ўдалося адправіць электронную кнігу на прыладу",
"ToastSendEbookToDeviceSuccess": "Электронная кніга адпраўлена на прыладу \"{0}\"", "ToastSendEbookToDeviceSuccess": "Электронная кніга адпраўлена на прыладу \"{0}\"",
"ToastSleepTimerDone": "Таймер сну скончыўся... Хр-р-р", "ToastSleepTimerDone": "Таймер сну скончыўся... Хр-р-р",
"ToastUploaderItemExistsInSubdirectoryError": "Элемент \"{0}\" выкарыстоўвае падкаталог шляху загрузкі.",
"ToastUserPasswordMustChange": "Новы пароль не можа супадаць са старым", "ToastUserPasswordMustChange": "Новы пароль не можа супадаць са старым",
"ToastUserRootRequireName": "Неабходна ўвесці імя карыстальніка адміністратара" "ToastUserRootRequireName": "Неабходна ўвесці імя карыстальніка адміністратара"
} }
+110 -6
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Създай", "ButtonAdd": "Създай",
"ButtonAddApiKey": "Добави API ключ",
"ButtonAddChapters": "Добави Глави", "ButtonAddChapters": "Добави Глави",
"ButtonAddDevice": "Добави Устройство", "ButtonAddDevice": "Добави Устройство",
"ButtonAddLibrary": "Добави Библиотека", "ButtonAddLibrary": "Добави Библиотека",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Избери Папка", "ButtonChooseAFolder": "Избери Папка",
"ButtonChooseFiles": "Избери Файлове", "ButtonChooseFiles": "Избери Файлове",
"ButtonClearFilter": "Изчисти филтър", "ButtonClearFilter": "Изчисти филтър",
"ButtonClose": "Затвори",
"ButtonCloseFeed": "Затвори стената", "ButtonCloseFeed": "Затвори стената",
"ButtonCloseSession": "Затвори отворената сесия", "ButtonCloseSession": "Затвори отворената сесия",
"ButtonCollections": "Колекции", "ButtonCollections": "Колекции",
@@ -119,11 +121,13 @@
"HeaderAccount": "Профил", "HeaderAccount": "Профил",
"HeaderAddCustomMetadataProvider": "Добави персонализиран доставчик на метаданни", "HeaderAddCustomMetadataProvider": "Добави персонализиран доставчик на метаданни",
"HeaderAdvanced": "Разширени настройки", "HeaderAdvanced": "Разширени настройки",
"HeaderApiKeys": "API ключове",
"HeaderAppriseNotificationSettings": "Apprise Notification Опции", "HeaderAppriseNotificationSettings": "Apprise Notification Опции",
"HeaderAudioTracks": "Песни", "HeaderAudioTracks": "Песни",
"HeaderAudiobookTools": "Инструмент за Менижиране на Аудиокниги", "HeaderAudiobookTools": "Инструмент за Менижиране на Аудиокниги",
"HeaderAuthentication": "Аутентикация", "HeaderAuthentication": "Аутентикация",
"HeaderBackups": "Архив", "HeaderBackups": "Архив",
"HeaderBulkChapterModal": "Добави няколко глави",
"HeaderChangePassword": "Промяна на Парола", "HeaderChangePassword": "Промяна на Парола",
"HeaderChapters": "Глави", "HeaderChapters": "Глави",
"HeaderChooseAFolder": "Избети Папка", "HeaderChooseAFolder": "Избети Папка",
@@ -162,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Предимство на Метаданни", "HeaderMetadataOrderOfPrecedence": "Предимство на Метаданни",
"HeaderMetadataToEmbed": "Метаданни за Вграждане", "HeaderMetadataToEmbed": "Метаданни за Вграждане",
"HeaderNewAccount": "Нов Профил", "HeaderNewAccount": "Нов Профил",
"HeaderNewApiKey": "Нов API ключ",
"HeaderNewLibrary": "Нова Библиотека", "HeaderNewLibrary": "Нова Библиотека",
"HeaderNotificationCreate": "Създай нотификация", "HeaderNotificationCreate": "Създай нотификация",
"HeaderNotificationUpdate": "Обнови нотификация", "HeaderNotificationUpdate": "Обнови нотификация",
@@ -195,6 +200,7 @@
"HeaderSettingsExperimental": "Експериментални Функции", "HeaderSettingsExperimental": "Експериментални Функции",
"HeaderSettingsGeneral": "Общи", "HeaderSettingsGeneral": "Общи",
"HeaderSettingsScanner": "Скенер", "HeaderSettingsScanner": "Скенер",
"HeaderSettingsSecurity": "Сигурност",
"HeaderSettingsWebClient": "Уеб клиент", "HeaderSettingsWebClient": "Уеб клиент",
"HeaderSleepTimer": "Таймер за заспиване", "HeaderSleepTimer": "Таймер за заспиване",
"HeaderStatsLargestItems": "Най-Големите Елементи", "HeaderStatsLargestItems": "Най-Големите Елементи",
@@ -206,6 +212,7 @@
"HeaderTableOfContents": "Съдържание", "HeaderTableOfContents": "Съдържание",
"HeaderTools": "Инструменти", "HeaderTools": "Инструменти",
"HeaderUpdateAccount": "Обнови Профил", "HeaderUpdateAccount": "Обнови Профил",
"HeaderUpdateApiKey": "Обнови API ключ",
"HeaderUpdateAuthor": "Обнови Автор", "HeaderUpdateAuthor": "Обнови Автор",
"HeaderUpdateDetails": "Обнови Детайли", "HeaderUpdateDetails": "Обнови Детайли",
"HeaderUpdateLibrary": "Обнови Библиотека", "HeaderUpdateLibrary": "Обнови Библиотека",
@@ -230,10 +237,15 @@
"LabelAddedDate": "Добавено", "LabelAddedDate": "Добавено",
"LabelAdminUsersOnly": "Само за Администратори", "LabelAdminUsersOnly": "Само за Администратори",
"LabelAll": "Всичко", "LabelAll": "Всичко",
"LabelAllEpisodesDownloaded": "Всички епизоди са изтеглени",
"LabelAllUsers": "Всички Потребители", "LabelAllUsers": "Всички Потребители",
"LabelAllUsersExcludingGuests": "Всички потребители без гости", "LabelAllUsersExcludingGuests": "Всички потребители без гости",
"LabelAllUsersIncludingGuests": "Всички потребители включително гости", "LabelAllUsersIncludingGuests": "Всички потребители включително гости",
"LabelAlreadyInYourLibrary": "Вече е в твоята библиотека", "LabelAlreadyInYourLibrary": "Вече е в твоята библиотека",
"LabelApiKeyCreated": "API ключ \"{0}\" успешно създатен.",
"LabelApiKeyCreatedDescription": "Погрижете се да копирате API ключът сега, защото повече няма да можете да го виждате онново.",
"LabelApiKeyUser": "Действай от името на потребителя",
"LabelApiKeyUserDescription": "Този API ключ ще има същите права като на потребителя за чието име действа. В логовете ще изглежда все едно потребителя прави заявката.",
"LabelApiToken": "АПИ Токен", "LabelApiToken": "АПИ Токен",
"LabelAppend": "Добави", "LabelAppend": "Добави",
"LabelAudioBitrate": "Аудио битрейт (напр. 128k)", "LabelAudioBitrate": "Аудио битрейт (напр. 128k)",
@@ -253,7 +265,7 @@
"LabelBackToUser": "Обратно към Потребител", "LabelBackToUser": "Обратно към Потребител",
"LabelBackupAudioFiles": "Създай резервно копие на аудио файлове", "LabelBackupAudioFiles": "Създай резервно копие на аудио файлове",
"LabelBackupLocation": "Местоположение на Архив", "LabelBackupLocation": "Местоположение на Архив",
"LabelBackupsEnableAutomaticBackups": "Включи автоматично архивиране", "LabelBackupsEnableAutomaticBackups": "Автоматично архивиране",
"LabelBackupsEnableAutomaticBackupsHelp": "Архиви запазени в /metadata/backups", "LabelBackupsEnableAutomaticBackupsHelp": "Архиви запазени в /metadata/backups",
"LabelBackupsMaxBackupSize": "Максимален размер на архива (в GB) (0 за неограничен)", "LabelBackupsMaxBackupSize": "Максимален размер на архива (в GB) (0 за неограничен)",
"LabelBackupsMaxBackupSizeHelp": "За защита срещу грешки в конфигурацията, архивите ще се провалят ако надхвърлят конфигурирания размер.", "LabelBackupsMaxBackupSizeHelp": "За защита срещу грешки в конфигурацията, архивите ще се провалят ако надхвърлят конфигурирания размер.",
@@ -272,7 +284,7 @@
"LabelChaptersFound": "намерени глави", "LabelChaptersFound": "намерени глави",
"LabelClickForMoreInfo": "Кликни за повече информация", "LabelClickForMoreInfo": "Кликни за повече информация",
"LabelClickToUseCurrentValue": "Натисни да ползваш сегашната стойност", "LabelClickToUseCurrentValue": "Натисни да ползваш сегашната стойност",
"LabelClosePlayer": "Затвори", "LabelClosePlayer": "Затвори плейъра",
"LabelCodec": "Кодек", "LabelCodec": "Кодек",
"LabelCollapseSeries": "Скрий сериите", "LabelCollapseSeries": "Скрий сериите",
"LabelCollapseSubSeries": "Свий подсерии", "LabelCollapseSubSeries": "Свий подсерии",
@@ -283,6 +295,7 @@
"LabelContinueListening": "Продължи слушане", "LabelContinueListening": "Продължи слушане",
"LabelContinueReading": "Продължи четене", "LabelContinueReading": "Продължи четене",
"LabelContinueSeries": "Продължи серии", "LabelContinueSeries": "Продължи серии",
"LabelCorsAllowed": "Разрешени CORS Origins",
"LabelCover": "Корица", "LabelCover": "Корица",
"LabelCoverImageURL": "URL на Корица", "LabelCoverImageURL": "URL на Корица",
"LabelCoverProvider": "Източник за обложки", "LabelCoverProvider": "Източник за обложки",
@@ -296,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Изтрий от файловата система (отмени за да бъдат премахни само от базата данни)", "LabelDeleteFromFileSystemCheckbox": "Изтрий от файловата система (отмени за да бъдат премахни само от базата данни)",
"LabelDescription": "Описание", "LabelDescription": "Описание",
"LabelDeselectAll": "Премахни всички", "LabelDeselectAll": "Премахни всички",
"LabelDetectedPattern": "Намерен образец:",
"LabelDevice": "Устройство", "LabelDevice": "Устройство",
"LabelDeviceInfo": "Информация за Устройство", "LabelDeviceInfo": "Информация за Устройство",
"LabelDeviceIsAvailableTo": "Устройството е достъпно за ...", "LabelDeviceIsAvailableTo": "Устройството е достъпно за ...",
@@ -345,7 +359,11 @@
"LabelExample": "Пример", "LabelExample": "Пример",
"LabelExpandSeries": "Покажи сериите", "LabelExpandSeries": "Покажи сериите",
"LabelExpandSubSeries": "Покажи съб сериите", "LabelExpandSubSeries": "Покажи съб сериите",
"LabelExplicit": "С нецензурно съдържание", "LabelExpired": "Изтекъл",
"LabelExpiresAt": "Изтича на",
"LabelExpiresInSeconds": "Изтича след (секунди)",
"LabelExpiresNever": "Никога",
"LabelExplicit": "Експлицитно",
"LabelExplicitChecked": "С нецензурно съдържание (проверено)", "LabelExplicitChecked": "С нецензурно съдържание (проверено)",
"LabelExplicitUnchecked": "Без нецензурно съдържание (непроверено)", "LabelExplicitUnchecked": "Без нецензурно съдържание (непроверено)",
"LabelExportOPML": "Експортирай OPML", "LabelExportOPML": "Експортирай OPML",
@@ -404,6 +422,7 @@
"LabelLanguages": "Езици", "LabelLanguages": "Езици",
"LabelLastBookAdded": "Последно Добавена Книга", "LabelLastBookAdded": "Последно Добавена Книга",
"LabelLastBookUpdated": "Последно Обновена Книга", "LabelLastBookUpdated": "Последно Обновена Книга",
"LabelLastProgressDate": "Последен прогрес: {0}",
"LabelLastSeen": "Последно Видян", "LabelLastSeen": "Последно Видян",
"LabelLastTime": "Последно Време", "LabelLastTime": "Последно Време",
"LabelLastUpdate": "Последно Обновяване", "LabelLastUpdate": "Последно Обновяване",
@@ -416,6 +435,7 @@
"LabelLibraryFilterSublistEmpty": "Не {0}", "LabelLibraryFilterSublistEmpty": "Не {0}",
"LabelLibraryItem": "Елемент на Библиотека", "LabelLibraryItem": "Елемент на Библиотека",
"LabelLibraryName": "Име на Библиотека", "LabelLibraryName": "Име на Библиотека",
"LabelLibrarySortByProgress": "Прогресът е обновен",
"LabelLimit": "Лимит", "LabelLimit": "Лимит",
"LabelLineSpacing": "Междуредие", "LabelLineSpacing": "Междуредие",
"LabelListenAgain": "Слушай отново", "LabelListenAgain": "Слушай отново",
@@ -424,6 +444,7 @@
"LabelLogLevelWarn": "Предупреждение", "LabelLogLevelWarn": "Предупреждение",
"LabelLookForNewEpisodesAfterDate": "Търси нови епизоди след дата", "LabelLookForNewEpisodesAfterDate": "Търси нови епизоди след дата",
"LabelLowestPriority": "Най-нисък Приоритет", "LabelLowestPriority": "Най-нисък Приоритет",
"LabelMatchConfidence": "Увереност",
"LabelMatchExistingUsersBy": "Съпостави съществуващи потребители по", "LabelMatchExistingUsersBy": "Съпостави съществуващи потребители по",
"LabelMatchExistingUsersByDescription": "Използва се за свързване на съществуващи потребители. След свързване потребителите ще бъдат съпоставени по уникален идентификатор от вашия доставчик на SSO", "LabelMatchExistingUsersByDescription": "Използва се за свързване на съществуващи потребители. След свързване потребителите ще бъдат съпоставени по уникален идентификатор от вашия доставчик на SSO",
"LabelMaxEpisodesToDownload": "Максимален брой епизоди за сваляне. Използвай 0 за неограничен.", "LabelMaxEpisodesToDownload": "Максимален брой епизоди за сваляне. Използвай 0 за неограничен.",
@@ -453,7 +474,9 @@
"LabelNewestAuthors": "Най-новите автори", "LabelNewestAuthors": "Най-новите автори",
"LabelNewestEpisodes": "Най-новите епизоди", "LabelNewestEpisodes": "Най-новите епизоди",
"LabelNextBackupDate": "Следваща Дата на Архивиране", "LabelNextBackupDate": "Следваща Дата на Архивиране",
"LabelNextChapters": "Следващите глави ще бъдат:",
"LabelNextScheduledRun": "Следващо Планирано Изпълнение", "LabelNextScheduledRun": "Следващо Планирано Изпълнение",
"LabelNoApiKeys": "Няма API ключове",
"LabelNoCustomMetadataProviders": "Няма потребителски доставчици на метаданни", "LabelNoCustomMetadataProviders": "Няма потребителски доставчици на метаданни",
"LabelNoEpisodesSelected": "Няма избрани епизоди", "LabelNoEpisodesSelected": "Няма избрани епизоди",
"LabelNotFinished": "Не е приключено", "LabelNotFinished": "Не е приключено",
@@ -469,6 +492,7 @@
"LabelNotificationsMaxQueueSize": "Максимален размер на опашката за известия", "LabelNotificationsMaxQueueSize": "Максимален размер на опашката за известия",
"LabelNotificationsMaxQueueSizeHelp": "Събитията са ограничени до изстрелване на 1 на секунда. Събитията ще бъдат игнорирани ако опашката е на максимален размер. Това предотвратява спамирането на известия.", "LabelNotificationsMaxQueueSizeHelp": "Събитията са ограничени до изстрелване на 1 на секунда. Събитията ще бъдат игнорирани ако опашката е на максимален размер. Това предотвратява спамирането на известия.",
"LabelNumberOfBooks": "Брой на Книги", "LabelNumberOfBooks": "Брой на Книги",
"LabelNumberOfChapters": "Брой глави:",
"LabelNumberOfEpisodes": "Брой епизоди", "LabelNumberOfEpisodes": "Брой епизоди",
"LabelOpenIDAdvancedPermsClaimDescription": "Име на OpenID твърдението, което съдържа разширени права за достъп до потребителски действия в приложението, които ще се прилагат за роли, различни от администраторските (<b>ако е конфигурирано</b>). Ако твърдението липсва в отговора, достъпът до ABS ще бъде отказан. Ако липсва една опция, тя ще се третира като <code>false</code>. Уверете се, че твърдението на доставчика на идентичност съответства на очакваната структура:", "LabelOpenIDAdvancedPermsClaimDescription": "Име на OpenID твърдението, което съдържа разширени права за достъп до потребителски действия в приложението, които ще се прилагат за роли, различни от администраторските (<b>ако е конфигурирано</b>). Ако твърдението липсва в отговора, достъпът до ABS ще бъде отказан. Ако липсва една опция, тя ще се третира като <code>false</code>. Уверете се, че твърдението на доставчика на идентичност съответства на очакваната структура:",
"LabelOpenIDClaims": "Оставете следните опции празни, за да деактивирате разширеното присвояване на групи, като автоматично ще бъде присвоена групата 'Потребител'.", "LabelOpenIDClaims": "Оставете следните опции празни, за да деактивирате разширеното присвояване на групи, като автоматично ще бъде присвоена групата 'Потребител'.",
@@ -513,7 +537,7 @@
"LabelPublishers": "Издателство", "LabelPublishers": "Издателство",
"LabelRSSFeedCustomOwnerEmail": "Персонализиран имейл на собственика", "LabelRSSFeedCustomOwnerEmail": "Персонализиран имейл на собственика",
"LabelRSSFeedCustomOwnerName": "Персонализирано име на собственика", "LabelRSSFeedCustomOwnerName": "Персонализирано име на собственика",
"LabelRSSFeedOpen": "RSS Feed Оптворен", "LabelRSSFeedOpen": "RSS Feed е отворен",
"LabelRSSFeedPreventIndexing": "Предотвратете индексиране", "LabelRSSFeedPreventIndexing": "Предотвратете индексиране",
"LabelRSSFeedSlug": "идентификатор на RSS емисия", "LabelRSSFeedSlug": "идентификатор на RSS емисия",
"LabelRSSFeedURL": "URL на RSS емисия", "LabelRSSFeedURL": "URL на RSS емисия",
@@ -543,6 +567,7 @@
"LabelSelectAll": "Избери всичко", "LabelSelectAll": "Избери всичко",
"LabelSelectAllEpisodes": "Избери всички епизоди", "LabelSelectAllEpisodes": "Избери всички епизоди",
"LabelSelectEpisodesShowing": "Избери {0} епизоди показани", "LabelSelectEpisodesShowing": "Избери {0} епизоди показани",
"LabelSelectUser": "Избери потребител",
"LabelSelectUsers": "Избери Потребители", "LabelSelectUsers": "Избери Потребители",
"LabelSendEbookToDevice": "Изпрати електронна книга до ...", "LabelSendEbookToDevice": "Изпрати електронна книга до ...",
"LabelSequence": "Последователност", "LabelSequence": "Последователност",
@@ -639,6 +664,7 @@
"LabelTheme": "Тема", "LabelTheme": "Тема",
"LabelThemeDark": "Тъмна", "LabelThemeDark": "Тъмна",
"LabelThemeLight": "Светла", "LabelThemeLight": "Светла",
"LabelThemeSepia": "Сепия",
"LabelTimeBase": "Времева Основа", "LabelTimeBase": "Времева Основа",
"LabelTimeDurationXHours": "{0} часа", "LabelTimeDurationXHours": "{0} часа",
"LabelTimeDurationXMinutes": "{0} минути", "LabelTimeDurationXMinutes": "{0} минути",
@@ -693,7 +719,11 @@
"LabelViewPlayerSettings": "Виж настройки на плеъра", "LabelViewPlayerSettings": "Виж настройки на плеъра",
"LabelViewQueue": "Виж Опашка", "LabelViewQueue": "Виж Опашка",
"LabelVolume": "Сила на Звука", "LabelVolume": "Сила на Звука",
"LabelWebRedirectURLsDescription": "Разрешете тези URL-и във вашият OAuth доставчик, за да позволите пренасочването обратно към уеб приложението след вход:",
"LabelWebRedirectURLsSubfolder": "Подпапка за URL адреси за пренасочване",
"LabelWeekdaysToRun": "Делници за изпълнение", "LabelWeekdaysToRun": "Делници за изпълнение",
"LabelXBooks": "{0} книги",
"LabelXItems": "{0} елемента",
"LabelYearReviewHide": "Скрий ревю на годината ти", "LabelYearReviewHide": "Скрий ревю на годината ти",
"LabelYearReviewShow": "Виж ревю на годината ти", "LabelYearReviewShow": "Виж ревю на годината ти",
"LabelYourAudiobookDuration": "Продължителност на вашата аудиокнига", "LabelYourAudiobookDuration": "Продължителност на вашата аудиокнига",
@@ -702,31 +732,51 @@
"LabelYourProgress": "Твоят прогрес", "LabelYourProgress": "Твоят прогрес",
"MessageAddToPlayerQueue": "Добави към опашката на плейъра", "MessageAddToPlayerQueue": "Добави към опашката на плейъра",
"MessageAppriseDescription": "За да ползвате тази функция трябва да имате активна инстанция на <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> или на друго АПИ което да обработва тези заявки. <br />The Apprise API Url-а трябва дае пълния URL път за изпращане на известията, например, ако вашето АПИ ве подава от <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> или на друго АПИ което да обработва тези заявки. <br />The Apprise API Url-а трябва дае пълния URL път за изпращане на известията, например, ако вашето АПИ ве подава от <code>http://192.168.1.1:8337</code> трябва да сложитев <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Уверете се, че използвате ASIN от правилния Audible регион, а не от Amazon.",
"MessageAuthenticationLegacyTokenWarning": "Остарелите API токени ще бъдат премахнати в бъдеще. Вместо това използвайте <a href=\"/config/api-keys\">API ключове</a>.",
"MessageAuthenticationOIDCChangesRestart": "Рестартирайте сървърът след записването на настройките, за да активирате OIDC промените.",
"MessageAuthenticationSecurityMessage": "За осигуряването на по-добра сигурност, автентикацията беше подобрена. Всеки потребител ще трябва да се автентикира наново.",
"MessageBackupsDescription": "Резервните копия включват потребители, напредък на потребителите, подробности за елементите в библиотеката, настройки на сървъра и изображения, съхранени в <code>/metadata/items</code> и <code>/metadata/authors</code>. Резервните копия <strong>не</strong> включват никакви файлове, съхранени в папките на вашата библиотека.", "MessageBackupsDescription": "Резервните копия включват потребители, напредък на потребителите, подробности за елементите в библиотеката, настройки на сървъра и изображения, съхранени в <code>/metadata/items</code> и <code>/metadata/authors</code>. Резервните копия <strong>не</strong> включват никакви файлове, съхранени в папките на вашата библиотека.",
"MessageBackupsLocationEditNote": "Забележка: Актуализирането на местоположението за архивиране няма да премести или промени съществуващите архиви",
"MessageBackupsLocationNoEditNote": "Забележка: Местоположението за архивиране се задава с помощта на променлива на средата и не може бъде променена от тук.",
"MessageBackupsLocationPathEmpty": "Пътят към местоположението за архивиране не може да бъде празен",
"MessageBatchEditPopulateMapDetailsAllHelp": "Популирайте активираните полета с данни от всички елементи. Полетата със няколко стоайности ще бъдат обединени",
"MessageBatchEditPopulateMapDetailsItemHelp": "Попълнете активираните полета с информация за картата с данни от този елемент",
"MessageBatchQuickMatchDescription": "Бързото Съпоставяне ще опита да добави липсващи корици и метаданни за избраните елементи. Активирайте опциите по-долу, за да позволите на Бързото съпоставяне да презапише съществуващите корици и/или метаданни.", "MessageBatchQuickMatchDescription": "Бързото Съпоставяне ще опита да добави липсващи корици и метаданни за избраните елементи. Активирайте опциите по-долу, за да позволите на Бързото съпоставяне да презапише съществуващите корици и/или метаданни.",
"MessageBookshelfNoCollections": "Все още нямате създадени колекции", "MessageBookshelfNoCollections": "Все още нямате създадени колекции",
"MessageBookshelfNoCollectionsHelp": "Колекциите са публични. Всички потребители с достъп до библиотеката ще могат да ги виждат.",
"MessageBookshelfNoRSSFeeds": "Няма отворени RSS feed-ове", "MessageBookshelfNoRSSFeeds": "Няма отворени RSS feed-ове",
"MessageBookshelfNoResultsForFilter": "Няма резултат за филтер \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Няма резултат за филтер \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Няма резултати от заявката", "MessageBookshelfNoResultsForQuery": "Няма резултати от заявката",
"MessageBookshelfNoSeries": "Нямаш сеЗЙ", "MessageBookshelfNoSeries": "Нямаш сеЗЙ",
"MessageBulkChapterPattern": "Колко глави искате да добавите, използвайки тази схема за номериране?",
"MessageChapterEndIsAfter": "Краят на главата е след края на вашата аудиокнига", "MessageChapterEndIsAfter": "Краят на главата е след края на вашата аудиокнига",
"MessageChapterErrorFirstNotZero": "Първата глава трябва да започва от 0", "MessageChapterErrorFirstNotZero": "Първата глава трябва да започва от 0",
"MessageChapterErrorStartGteDuration": "Началото на главата трябва да бъде по-малко от продължителността на аудиокнигата", "MessageChapterErrorStartGteDuration": "Началото на главата трябва да бъде по-малко от продължителността на аудиокнигата",
"MessageChapterErrorStartLtPrev": "Началото на главата трябва да бъде по-голямо или равно на края на предишната глава", "MessageChapterErrorStartLtPrev": "Началото на главата трябва да бъде по-голямо или равно на края на предишната глава",
"MessageChapterStartIsAfter": "Началото на главата е след края на вашата аудиокнига", "MessageChapterStartIsAfter": "Началото на главата е след края на вашата аудиокнига",
"MessageChaptersNotFound": "Главите не са намерени",
"MessageCheckingCron": "Проверяване на cron...", "MessageCheckingCron": "Проверяване на cron...",
"MessageConfirmCloseFeed": "Сигурни ли сте, че искате да затворите този feed?", "MessageConfirmCloseFeed": "Сигурни ли сте, че искате да затворите този feed?",
"MessageConfirmDeleteApiKey": "Сигурни ли сте, че искате да изтриете API ключ \"{0}\"?",
"MessageConfirmDeleteBackup": "Сигурни ли сте, че искате да изтриете този архив {0}?", "MessageConfirmDeleteBackup": "Сигурни ли сте, че искате да изтриете този архив {0}?",
"MessageConfirmDeleteDevice": "Сигурни ли сте, че искате да изтриете е-четец \"{0}\"?",
"MessageConfirmDeleteFile": "Това ще изтрие файла от файловата Ви система. Сигурни ли сте?", "MessageConfirmDeleteFile": "Това ще изтрие файла от файловата Ви система. Сигурни ли сте?",
"MessageConfirmDeleteLibrary": "Сигурни ли сте, че искате да изтриете за винаги библиотека \"{0}\"?", "MessageConfirmDeleteLibrary": "Сигурни ли сте, че искате да изтриете за винаги библиотека \"{0}\"?",
"MessageConfirmDeleteLibraryItem": "Това ще изтрие елемента от базата данни и файловата Ви система. Сигурни ли сте?", "MessageConfirmDeleteLibraryItem": "Това ще изтрие елемента от базата данни и файловата Ви система. Сигурни ли сте?",
"MessageConfirmDeleteLibraryItems": "Това ще изтрие {0} елемента от базата данни и файловата Ви система. Сигурни ли сте?", "MessageConfirmDeleteLibraryItems": "Това ще изтрие {0} елемента от базата данни и файловата Ви система. Сигурни ли сте?",
"MessageConfirmDeleteMetadataProvider": "Сигурни ли сте, че искате да изтриете доставчика нa метаданни \"{0}\"?",
"MessageConfirmDeleteNotification": "Сигурни ли сте, че искате да изтриете това уведомление?",
"MessageConfirmDeleteSession": "Сигурни ли сте, че искате да изтриете тази сесия?", "MessageConfirmDeleteSession": "Сигурни ли сте, че искате да изтриете тази сесия?",
"MessageConfirmEmbedMetadataInAudioFiles": "Сигурнли ли сте, че искате да вградите метаданните в {0} аудио файла?",
"MessageConfirmForceReScan": "Сигурни ли сте, че искате да принудите повторно сканиране?", "MessageConfirmForceReScan": "Сигурни ли сте, че искате да принудите повторно сканиране?",
"MessageConfirmMarkAllEpisodesFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като завършени?", "MessageConfirmMarkAllEpisodesFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като завършени?",
"MessageConfirmMarkAllEpisodesNotFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като незавършени?", "MessageConfirmMarkAllEpisodesNotFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като незавършени?",
"MessageConfirmMarkItemFinished": "Сигурни ли сте, че искате да маркирате \"{0}\" като приключено?",
"MessageConfirmMarkItemNotFinished": "Сигурни ли сте, че искате да маркирате \"{0}\" като неприключено?",
"MessageConfirmMarkSeriesFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като завършени?", "MessageConfirmMarkSeriesFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като завършени?",
"MessageConfirmMarkSeriesNotFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като незавършени?", "MessageConfirmMarkSeriesNotFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като незавършени?",
"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>Искате ли да продължите?",
@@ -735,6 +785,7 @@
"MessageConfirmRemoveAuthor": "Сигурни ли сте, че искате да премахнете автор \"{0}\"?", "MessageConfirmRemoveAuthor": "Сигурни ли сте, че искате да премахнете автор \"{0}\"?",
"MessageConfirmRemoveCollection": "Сигурни ли сте, че искате да премахнете колекция \"{0}\"?", "MessageConfirmRemoveCollection": "Сигурни ли сте, че искате да премахнете колекция \"{0}\"?",
"MessageConfirmRemoveEpisode": "Сигурни ли сте, че искате да премахнете епизод \"{0}\"?", "MessageConfirmRemoveEpisode": "Сигурни ли сте, че искате да премахнете епизод \"{0}\"?",
"MessageConfirmRemoveEpisodeNote": "Забележка: Това няма да доведе до изтриване на аудио файла, освен ако не активирате опцията \"Твърдо изтриване на файла\"",
"MessageConfirmRemoveEpisodes": "Сигурни ли сте, че искате да премахнете {0} епизода?", "MessageConfirmRemoveEpisodes": "Сигурни ли сте, че искате да премахнете {0} епизода?",
"MessageConfirmRemoveListeningSessions": "Сигурни ли сте, че искате да премахнете {0} слушателски сесии?", "MessageConfirmRemoveListeningSessions": "Сигурни ли сте, че искате да премахнете {0} слушателски сесии?",
"MessageConfirmRemoveNarrator": "Сигурни ли сте, че искате да премахнете разказвач \"{0}\"?", "MessageConfirmRemoveNarrator": "Сигурни ли сте, че искате да премахнете разказвач \"{0}\"?",
@@ -745,19 +796,27 @@
"MessageConfirmRenameTag": "Сигурни ли сте, че искате да преименувате таг \"{0}\" на \"{1}\" за всички елементи?", "MessageConfirmRenameTag": "Сигурни ли сте, че искате да преименувате таг \"{0}\" на \"{1}\" за всички елементи?",
"MessageConfirmRenameTagMergeNote": "Забележка: Този таг вече съществува и ще бъде слято.", "MessageConfirmRenameTagMergeNote": "Забележка: Този таг вече съществува и ще бъде слято.",
"MessageConfirmRenameTagWarning": "Внимание! Вече съществува подобен таг с различно писане \"{0}\".", "MessageConfirmRenameTagWarning": "Внимание! Вече съществува подобен таг с различно писане \"{0}\".",
"MessageConfirmResetProgress": "Сигурни ли сте, че искате да нулирате прогреса си?",
"MessageConfirmSendEbookToDevice": "Сигурни ли сте, че искате да изпратите {0} електронна книга \"{1}\" до устройство \"{2}\"?", "MessageConfirmSendEbookToDevice": "Сигурни ли сте, че искате да изпратите {0} електронна книга \"{1}\" до устройство \"{2}\"?",
"MessageConfirmUnlinkOpenId": "Сигурни ли сте, че искате да отвържете този потребител от OpenID?",
"MessageDaysListenedInTheLastYear": "{0} дни слушане през последната година",
"MessageDownloadingEpisode": "Сваля епизод", "MessageDownloadingEpisode": "Сваля епизод",
"MessageDragFilesIntoTrackOrder": "Плъзнете файлове в правилния ред на каналите", "MessageDragFilesIntoTrackOrder": "Плъзнете файлове в правилния ред на каналите",
"MessageEmbedFailed": "Вграждането беше неуспешно!",
"MessageEmbedFinished": "Вграждането завърши!", "MessageEmbedFinished": "Вграждането завърши!",
"MessageEmbedQueue": "Поставено в опашката за вграждане на метаданни ({0} в опашката)",
"MessageEpisodesQueuedForDownload": "{0} Епизод(и) са сложени за сваляне", "MessageEpisodesQueuedForDownload": "{0} Епизод(и) са сложени за сваляне",
"MessageEreaderDevices": "За да осигурите доставката на е-книги, може да се наложи да добавите горепосочения имейл адрес като валиден подател за всяко устройство, изброено по-долу.", "MessageEreaderDevices": "За да осигурите доставката на е-книги, може да се наложи да добавите горепосочения имейл адрес като валиден подател за всяко устройство, изброено по-долу.",
"MessageFeedURLWillBe": "Адресът на емисията ще бъде {0}", "MessageFeedURLWillBe": "Адресът на емисията ще бъде {0}",
"MessageFetching": "Извличане...", "MessageFetching": "Извличане...",
"MessageForceReScanDescription": "ще сканира всички файлове отново като прясно сканиране. Аудио файлове ID3 тагове, OPF файлове и текстови файлове ще бъдат сканирани като нови.", "MessageForceReScanDescription": "ще сканира всички файлове отново като прясно сканиране. Аудио файлове ID3 тагове, OPF файлове и текстови файлове ще бъдат сканирани като нови.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} слушане</strong> на {1}",
"MessageHeatmapNoListeningSessions": "Няма сесии за слушане на {0}",
"MessageImportantNotice": "Важно Съобщение!", "MessageImportantNotice": "Важно Съобщение!",
"MessageInsertChapterBelow": "Вмъкни глава под", "MessageInsertChapterBelow": "Вмъкни глава под",
"MessageItemsSelected": "{0} избрани", "MessageInvalidAsin": "Невалиден ASIN",
"MessageItemsUpdated": "{0} елемента обновени", "MessageItemsSelected": "{0} избрани елемента",
"MessageItemsUpdated": "{0} обновени елемента",
"MessageJoinUsOn": "Присъединете се към нас", "MessageJoinUsOn": "Присъединете се към нас",
"MessageLoading": "Зарежда...", "MessageLoading": "Зарежда...",
"MessageLoadingFolders": "Зареждане на Папки...", "MessageLoadingFolders": "Зареждане на Папки...",
@@ -778,6 +837,7 @@
"MessageNoCollections": "Няма колекции", "MessageNoCollections": "Няма колекции",
"MessageNoCoversFound": "Не са намерени корици", "MessageNoCoversFound": "Не са намерени корици",
"MessageNoDescription": "Няма описание", "MessageNoDescription": "Няма описание",
"MessageNoDevices": "Няма устройства",
"MessageNoDownloadsInProgress": "Няма изтегляния в прогрес", "MessageNoDownloadsInProgress": "Няма изтегляния в прогрес",
"MessageNoDownloadsQueued": "Няма изтегляния в опашка", "MessageNoDownloadsQueued": "Няма изтегляния в опашка",
"MessageNoEpisodeMatchesFound": "Няма намерени съвпадения за епизоди", "MessageNoEpisodeMatchesFound": "Няма намерени съвпадения за епизоди",
@@ -791,6 +851,7 @@
"MessageNoLogs": "Няма логове", "MessageNoLogs": "Няма логове",
"MessageNoMediaProgress": "Няма прогрес на медията", "MessageNoMediaProgress": "Няма прогрес на медията",
"MessageNoNotifications": "Няма известия", "MessageNoNotifications": "Няма известия",
"MessageNoPodcastFeed": "Невалиден подкаст: Няма канал",
"MessageNoPodcastsFound": "Няма намерени подкасти", "MessageNoPodcastsFound": "Няма намерени подкасти",
"MessageNoResults": "Няма резултати", "MessageNoResults": "Няма резултати",
"MessageNoSearchResultsFor": "Няма резултати за \"{0}\"", "MessageNoSearchResultsFor": "Няма резултати за \"{0}\"",
@@ -799,13 +860,17 @@
"MessageNoTasksRunning": "Няма вършещи се задачи", "MessageNoTasksRunning": "Няма вършещи се задачи",
"MessageNoUpdatesWereNecessary": "Няма нужда от обновяване", "MessageNoUpdatesWereNecessary": "Няма нужда от обновяване",
"MessageNoUserPlaylists": "Нямате създадени плейлисти", "MessageNoUserPlaylists": "Нямате създадени плейлисти",
"MessageNoUserPlaylistsHelp": "Плейлистите за частни. Само създалият ги потребител ще може да ги вижда.",
"MessageNotYetImplemented": "Още не е изпълнено", "MessageNotYetImplemented": "Още не е изпълнено",
"MessageOr": "или", "MessageOr": "или",
"MessagePauseChapter": "Пауза на глава", "MessagePauseChapter": "Пауза на глава",
"MessagePlayChapter": "Пусни налчалото на глава", "MessagePlayChapter": "Пусни налчалото на глава",
"MessagePlaylistCreateFromCollection": "Създай плейлист от колекция", "MessagePlaylistCreateFromCollection": "Създай плейлист от колекция",
"MessagePleaseWait": "Моля изчакайте...",
"MessagePodcastHasNoRSSFeedForMatching": "Подкастът няма URL адрес на RSS feed за използване за съпоставяне", "MessagePodcastHasNoRSSFeedForMatching": "Подкастът няма URL адрес на RSS feed за използване за съпоставяне",
"MessagePodcastSearchField": "Въведи какво да търся или RSS емисия адрес", "MessagePodcastSearchField": "Въведи какво да търся или RSS емисия адрес",
"MessageQuickEmbedInProgress": "Бързото вграждане е в процес на изпълнение",
"MessageQuickEmbedQueue": "Поставено в опашката за бързо вграждане ({0} в опашката)",
"MessageQuickMatchDescription": "Попълни празните детайли и корици с първия резултат от '{0}'. Не презаписва детайлите, освен ако не е активирана настройката 'Предпочети съвпадащи метаданни' на сървъра.", "MessageQuickMatchDescription": "Попълни празните детайли и корици с първия резултат от '{0}'. Не презаписва детайлите, освен ако не е активирана настройката 'Предпочети съвпадащи метаданни' на сървъра.",
"MessageRemoveChapter": "Премахни глава", "MessageRemoveChapter": "Премахни глава",
"MessageRemoveEpisodes": "Премахни {0} епизод(и)", "MessageRemoveEpisodes": "Премахни {0} епизод(и)",
@@ -815,11 +880,43 @@
"MessageResetChaptersConfirm": "Сигурни ли сте, че искате да нулирате главите и да отмените промените, които сте направили?", "MessageResetChaptersConfirm": "Сигурни ли сте, че искате да нулирате главите и да отмените промените, които сте направили?",
"MessageRestoreBackupConfirm": "Сигурни ли сте, че искате да възстановите архива създаден на", "MessageRestoreBackupConfirm": "Сигурни ли сте, че искате да възстановите архива създаден на",
"MessageRestoreBackupWarning": "Възстановяването на архив ще презапише цялата база данни, намираща се в /config и кориците в /metadata/items & /metadata/authors.<br /><br />Архивите не променят файловете в папките на вашата библиотека. Ако сте активирали настройките на сървъра за съхранение на корици и метаданни в папките на вашата библиотека, те няма да бъдат архивирани или презаписани.<br /><br />Всички клиенти, използващи вашия сървър, ще бъдат автоматично обновени.", "MessageRestoreBackupWarning": "Възстановяването на архив ще презапише цялата база данни, намираща се в /config и кориците в /metadata/items & /metadata/authors.<br /><br />Архивите не променят файловете в папките на вашата библиотека. Ако сте активирали настройките на сървъра за съхранение на корици и метаданни в папките на вашата библиотека, те няма да бъдат архивирани или презаписани.<br /><br />Всички клиенти, използващи вашия сървър, ще бъдат автоматично обновени.",
"MessageScheduleRunEveryWeekdayAtTime": "Изпълни всеки {0} в {1}",
"MessageSearchResultsFor": "Резултати от търсенето за", "MessageSearchResultsFor": "Резултати от търсенето за",
"MessageSelected": "{0} избрани", "MessageSelected": "{0} избрани",
"MessageServerCouldNotBeReached": "Сървърът не може да бъде достигнат", "MessageServerCouldNotBeReached": "Сървърът не може да бъде достигнат",
"MessageSetChaptersFromTracksDescription": "Задайте глави, като използвате всеки аудио файл като глава и заглавие на главата като име на аудио файла", "MessageSetChaptersFromTracksDescription": "Задайте глави, като използвате всеки аудио файл като глава и заглавие на главата като име на аудио файла",
"MessageShareExpiresIn": "Изтича след {0}",
"MessageStartPlaybackAtTime": "Започни възпроизвеждане на \"{0}\" в {1}?", "MessageStartPlaybackAtTime": "Започни възпроизвеждане на \"{0}\" в {1}?",
"MessageTaskDownloadingEpisodeDescription": "Изтегляне на епизод \"{0}\"",
"MessageTaskEmbeddingMetadata": "Вграждане на метаданни",
"MessageTaskEmbeddingMetadataDescription": "Вграждане на метаданни в аудиокнига \"{0}\"",
"MessageTaskEncodingM4bDescription": "Кодиране на аудиокнига \"{0}\" в единичен m4b файл",
"MessageTaskFailed": "Неуспешно",
"MessageTaskFailedToBackupAudioFile": "Неуспешно създаване на разервно копие на аудио файл \"{0}\"",
"MessageTaskFailedToCreateCacheDirectory": "Неуспешно създаване на директория за кеширане",
"MessageTaskFailedToEmbedMetadataInFile": "Неуспешно вграждане на метаданни във файл \"{0}\"",
"MessageTaskFailedToMergeAudioFiles": "Неуспешно сливане на аудио файловете",
"MessageTaskFailedToMoveM4bFile": "Неуспешно преместване на m4b файл",
"MessageTaskFailedToWriteMetadataFile": "Неуспешно записване на файла за метаданни",
"MessageTaskMatchingBooksInLibrary": "Съответстващи книги в библиотека \"{0}\"",
"MessageTaskNoFilesToScan": "Няма файлове за сканиране",
"MessageTaskOpmlImport": "OPML импортиране",
"MessageTaskOpmlImportDescription": "Създаване на подкасти от {0} RSS хранилки",
"MessageTaskOpmlImportFeedDescription": "Импортиране на RSS хранилка \"{0}\"",
"MessageTaskOpmlImportFeedPodcastDescription": "Създаване на подкаст \"{0}\"",
"MessageTaskOpmlImportFeedPodcastExists": "На този път вече съществува подкаст",
"MessageTaskOpmlImportFeedPodcastFailed": "Неуспешно създаване на подкаст",
"MessageTaskOpmlImportFinished": "Добавени {0} подкаста",
"MessageTaskOpmlParseFailed": "Неуспешно анализиране на OPML файла",
"MessageTaskOpmlParseFastFail": "Невалиден OPML файл, не беше намерен нито <opml> таг нито <outline> таг",
"MessageTaskOpmlParseNoneFound": "Няма намерени канали във OPML файла",
"MessageTaskScanItemsAdded": "{0} добавени",
"MessageTaskScanItemsMissing": "{0} липсващи",
"MessageTaskScanItemsUpdated": "{0} обновени",
"MessageTaskScanNoChangesNeeded": "Не са нужни промени",
"MessageTaskScanningFileChanges": "Проверка за промени във файловете в \"{0}\"",
"MessageTaskScanningLibrary": "Сканиране на \"{0}\" библиотека",
"MessageTaskTargetDirectoryNotWritable": "Целевата директория не е достъпна за запис",
"MessageThinking": "Мисля...", "MessageThinking": "Мисля...",
"MessageUploaderItemFailed": "Неуспешно качване", "MessageUploaderItemFailed": "Неуспешно качване",
"MessageUploaderItemSuccess": "Успешно качване!", "MessageUploaderItemSuccess": "Успешно качване!",
@@ -837,11 +934,18 @@
"NoteUploaderFoldersWithMediaFiles": "Папките с медийни файлове ще бъдат обработени като отделни елементи на библиотеката.", "NoteUploaderFoldersWithMediaFiles": "Папките с медийни файлове ще бъдат обработени като отделни елементи на библиотеката.",
"NoteUploaderOnlyAudioFiles": "Ако качвате само аудио файлове, то всеки аудио файл ще бъде обработен като отделна аудиокнига.", "NoteUploaderOnlyAudioFiles": "Ако качвате само аудио файлове, то всеки аудио файл ще бъде обработен като отделна аудиокнига.",
"NoteUploaderUnsupportedFiles": "Неподдържаните файлове се игнорират. При избор или пускане на папка, други файлове, които не са в папка на елемент, се игнорират.", "NoteUploaderUnsupportedFiles": "Неподдържаните файлове се игнорират. При избор или пускане на папка, други файлове, които не са в папка на елемент, се игнорират.",
"NotificationOnBackupCompletedDescription": "Изпълнява се при завършване на създаване на резервно копие",
"NotificationOnBackupFailedDescription": "Изпълнява се при неуспешено създаване на резервно копие",
"NotificationOnEpisodeDownloadedDescription": "Изпълнява се при автоматично изтегляне на подкаст епизод",
"NotificationOnRSSFeedDisabledDescription": "Изпълнява се, когато автоматичното изтегляне на епизодите е деактивирано, поради твърде много неуспешни опити",
"PlaceholderNewCollection": "Ново име на колекцията", "PlaceholderNewCollection": "Ново име на колекцията",
"PlaceholderNewFolderPath": "Нов път на папката", "PlaceholderNewFolderPath": "Нов път на папката",
"PlaceholderNewPlaylist": "Ново име на плейлиста", "PlaceholderNewPlaylist": "Ново име на плейлиста",
"PlaceholderSearch": "Търсене...", "PlaceholderSearch": "Търсене...",
"PlaceholderSearchEpisode": "Търсене на Епизоди...", "PlaceholderSearchEpisode": "Търсене на Епизоди...",
"StatsAuthorsAdded": "добаврени автори",
"StatsBooksAdded": "добавени книги",
"StatsBooksFinished": "завършени книги",
"ToastAccountUpdateSuccess": "Успешно обновяване на акаунта", "ToastAccountUpdateSuccess": "Успешно обновяване на акаунта",
"ToastAuthorImageRemoveSuccess": "Авторската снимка е премахната", "ToastAuthorImageRemoveSuccess": "Авторската снимка е премахната",
"ToastAuthorUpdateMerged": "Обновяване на автора сливано", "ToastAuthorUpdateMerged": "Обновяване на автора сливано",
+45 -13
View File
@@ -11,7 +11,7 @@
"ButtonApplyChapters": "Aplikovat kapitoly", "ButtonApplyChapters": "Aplikovat kapitoly",
"ButtonAuthors": "Autoři", "ButtonAuthors": "Autoři",
"ButtonBack": "Zpět", "ButtonBack": "Zpět",
"ButtonBatchEditPopulateFromExisting": "Vytvořit z existujících", "ButtonBatchEditPopulateFromExisting": "Předvyplnit z existujících",
"ButtonBatchEditPopulateMapDetails": "Předvyplnit podrobnosti mapování", "ButtonBatchEditPopulateMapDetails": "Předvyplnit podrobnosti mapování",
"ButtonBrowseForFolder": "Vyhledat složku", "ButtonBrowseForFolder": "Vyhledat složku",
"ButtonCancel": "Zrušit", "ButtonCancel": "Zrušit",
@@ -61,7 +61,7 @@
"ButtonPause": "Pozastavit", "ButtonPause": "Pozastavit",
"ButtonPlay": "Přehrát", "ButtonPlay": "Přehrát",
"ButtonPlayAll": "Přehrát vše", "ButtonPlayAll": "Přehrát vše",
"ButtonPlaying": "Hraje", "ButtonPlaying": "Přehrává",
"ButtonPlaylists": "Seznamy skladeb", "ButtonPlaylists": "Seznamy skladeb",
"ButtonPrevious": "Předchozí", "ButtonPrevious": "Předchozí",
"ButtonPreviousChapter": "Předchozí Kapitola", "ButtonPreviousChapter": "Předchozí Kapitola",
@@ -71,7 +71,7 @@
"ButtonQueueAddItem": "Přidat do fronty", "ButtonQueueAddItem": "Přidat do fronty",
"ButtonQueueRemoveItem": "Odstranit z fronty", "ButtonQueueRemoveItem": "Odstranit z fronty",
"ButtonQuickEmbed": "Rychle Zapsat", "ButtonQuickEmbed": "Rychle Zapsat",
"ButtonQuickEmbedMetadata": "Rychle zapsat Metadata", "ButtonQuickEmbedMetadata": "Rychle Vložit Metadata",
"ButtonQuickMatch": "Rychlé přiřazení", "ButtonQuickMatch": "Rychlé přiřazení",
"ButtonReScan": "Znovu prohledat", "ButtonReScan": "Znovu prohledat",
"ButtonRead": "Číst", "ButtonRead": "Číst",
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Nástroje pro správu souborů audioknih", "HeaderAudiobookTools": "Nástroje pro správu souborů audioknih",
"HeaderAuthentication": "Autentizace", "HeaderAuthentication": "Autentizace",
"HeaderBackups": "Zálohy", "HeaderBackups": "Zálohy",
"HeaderBulkChapterModal": "Přidat více kapitol",
"HeaderChangePassword": "Změnit heslo", "HeaderChangePassword": "Změnit heslo",
"HeaderChapters": "Kapitoly", "HeaderChapters": "Kapitoly",
"HeaderChooseAFolder": "Zvolte složku", "HeaderChooseAFolder": "Zvolte složku",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Experimentální funkce", "HeaderSettingsExperimental": "Experimentální funkce",
"HeaderSettingsGeneral": "Obecné", "HeaderSettingsGeneral": "Obecné",
"HeaderSettingsScanner": "Skener", "HeaderSettingsScanner": "Skener",
"HeaderSettingsSecurity": "Zabezpečení",
"HeaderSettingsWebClient": "Webový klient", "HeaderSettingsWebClient": "Webový klient",
"HeaderSleepTimer": "Časovač vypnutí", "HeaderSleepTimer": "Časovač vypnutí",
"HeaderStatsLargestItems": "Největší položky", "HeaderStatsLargestItems": "Největší položky",
@@ -293,6 +295,7 @@
"LabelContinueListening": "Pokračovat v poslechu", "LabelContinueListening": "Pokračovat v poslechu",
"LabelContinueReading": "Pokračovat ve čtení", "LabelContinueReading": "Pokračovat ve čtení",
"LabelContinueSeries": "Pokračovat v sérii", "LabelContinueSeries": "Pokračovat v sérii",
"LabelCorsAllowed": "Povolené CORS Origins",
"LabelCover": "Obálka", "LabelCover": "Obálka",
"LabelCoverImageURL": "URL obrázku obálky", "LabelCoverImageURL": "URL obrázku obálky",
"LabelCoverProvider": "Poskytovatel obálky", "LabelCoverProvider": "Poskytovatel obálky",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Smazat ze souborového systému (zrušte zaškrtnutí pro odstranění pouze z databáze)", "LabelDeleteFromFileSystemCheckbox": "Smazat ze souborového systému (zrušte zaškrtnutí pro odstranění pouze z databáze)",
"LabelDescription": "Popis", "LabelDescription": "Popis",
"LabelDeselectAll": "Odznačit vše", "LabelDeselectAll": "Odznačit vše",
"LabelDetectedPattern": "Detekovaný vzor:",
"LabelDevice": "Zařízení", "LabelDevice": "Zařízení",
"LabelDeviceInfo": "Informace o zařízení", "LabelDeviceInfo": "Informace o zařízení",
"LabelDeviceIsAvailableTo": "Zařízení je dostupné pro...", "LabelDeviceIsAvailableTo": "Zařízení je dostupné pro...",
@@ -359,7 +363,7 @@
"LabelExpiresAt": "Expiruje v", "LabelExpiresAt": "Expiruje v",
"LabelExpiresInSeconds": "Expiruje za (sekundy)", "LabelExpiresInSeconds": "Expiruje za (sekundy)",
"LabelExpiresNever": "Nikdy", "LabelExpiresNever": "Nikdy",
"LabelExplicit": "Explicitně", "LabelExplicit": "Explicitní",
"LabelExplicitChecked": "Explicitní (zaškrtnuto)", "LabelExplicitChecked": "Explicitní (zaškrtnuto)",
"LabelExplicitUnchecked": "Není explicitní (nezaškrtnuto)", "LabelExplicitUnchecked": "Není explicitní (nezaškrtnuto)",
"LabelExportOPML": "Export OPML", "LabelExportOPML": "Export OPML",
@@ -374,6 +378,7 @@
"LabelFilterByUser": "Filtrovat podle uživatele", "LabelFilterByUser": "Filtrovat podle uživatele",
"LabelFindEpisodes": "Najít epizody", "LabelFindEpisodes": "Najít epizody",
"LabelFinished": "Dokončeno", "LabelFinished": "Dokončeno",
"LabelFinishedDate": "Dokončeno {0}",
"LabelFolder": "Složka", "LabelFolder": "Složka",
"LabelFolders": "Složky", "LabelFolders": "Složky",
"LabelFontBold": "Tučně", "LabelFontBold": "Tučně",
@@ -388,7 +393,7 @@
"LabelGenres": "Žánry", "LabelGenres": "Žánry",
"LabelHardDeleteFile": "Trvale smazat soubor", "LabelHardDeleteFile": "Trvale smazat soubor",
"LabelHasEbook": "Obsahuje elektronickou knihu", "LabelHasEbook": "Obsahuje elektronickou knihu",
"LabelHasSupplementaryEbook": "Obsahuje doplňkovou elektronickou knihu", "LabelHasSupplementaryEbook": "Obsahuje doplňkovou e-knihu",
"LabelHideSubtitles": "Skrýt titulky", "LabelHideSubtitles": "Skrýt titulky",
"LabelHighestPriority": "Nejvyšší priorita", "LabelHighestPriority": "Nejvyšší priorita",
"LabelHost": "Hostitel", "LabelHost": "Hostitel",
@@ -418,6 +423,7 @@
"LabelLanguages": "Jazyky", "LabelLanguages": "Jazyky",
"LabelLastBookAdded": "Poslední kniha přidána", "LabelLastBookAdded": "Poslední kniha přidána",
"LabelLastBookUpdated": "Poslední kniha aktualizována", "LabelLastBookUpdated": "Poslední kniha aktualizována",
"LabelLastProgressDate": "Poslední pokrok: {0}",
"LabelLastSeen": "Naposledy viděno", "LabelLastSeen": "Naposledy viděno",
"LabelLastTime": "Naposledy", "LabelLastTime": "Naposledy",
"LabelLastUpdate": "Poslední aktualizace", "LabelLastUpdate": "Poslední aktualizace",
@@ -430,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Žádné {0}", "LabelLibraryFilterSublistEmpty": "Žádné {0}",
"LabelLibraryItem": "Položka knihovny", "LabelLibraryItem": "Položka knihovny",
"LabelLibraryName": "Název knihovny", "LabelLibraryName": "Název knihovny",
"LabelLibrarySortByProgress": "Pokrok: naposledy aktualizováno",
"LabelLibrarySortByProgressFinished": "Pokrok: dokončeno",
"LabelLibrarySortByProgressStarted": "Pokrok: začato",
"LabelLimit": "Omezit", "LabelLimit": "Omezit",
"LabelLineSpacing": "Řádkování", "LabelLineSpacing": "Řádkování",
"LabelListenAgain": "Poslouchat znovu", "LabelListenAgain": "Poslouchat znovu",
@@ -438,10 +447,11 @@
"LabelLogLevelWarn": "Varovat", "LabelLogLevelWarn": "Varovat",
"LabelLookForNewEpisodesAfterDate": "Hledat nové epizody po tomto datu", "LabelLookForNewEpisodesAfterDate": "Hledat nové epizody po tomto datu",
"LabelLowestPriority": "Nejnižší priorita", "LabelLowestPriority": "Nejnižší priorita",
"LabelMatchConfidence": "Jistota",
"LabelMatchExistingUsersBy": "Přiřadit stávající uživatele podle", "LabelMatchExistingUsersBy": "Přiřadit stávající uživatele podle",
"LabelMatchExistingUsersByDescription": "Slouží k propojení stávajících uživatelů. Po propojení budou uživatelé přiřazeni k jedinečnému ID od poskytovatele SSO", "LabelMatchExistingUsersByDescription": "Slouží k propojení stávajících uživatelů. Po propojení budou uživatelé přiřazeni k jedinečnému ID od poskytovatele SSO",
"LabelMaxEpisodesToDownload": "Maximální # epizod pro stažení. Použijte 0 pro bez omezení.", "LabelMaxEpisodesToDownload": "Maximální # epizod pro stažení. Použijte 0 pro bez omezení.",
"LabelMaxEpisodesToDownloadPerCheck": "Maximální počet nových epizod ke stažení při jedné kontrole", "LabelMaxEpisodesToDownloadPerCheck": "Maximální # nových epizod ke stažení při jedné kontrole",
"LabelMaxEpisodesToKeep": "Maximální počet epizod k zachování", "LabelMaxEpisodesToKeep": "Maximální počet epizod k zachování",
"LabelMaxEpisodesToKeepHelp": "Hodnotou 0 není nastaven žádný maximální limit. Po automatickém stažení nové epizody se odstraní nejstarší epizoda, pokud máte více než X epizod. Při každém novém stažení se odstraní pouze 1 epizoda.", "LabelMaxEpisodesToKeepHelp": "Hodnotou 0 není nastaven žádný maximální limit. Po automatickém stažení nové epizody se odstraní nejstarší epizoda, pokud máte více než X epizod. Při každém novém stažení se odstraní pouze 1 epizoda.",
"LabelMediaPlayer": "Přehrávač médií", "LabelMediaPlayer": "Přehrávač médií",
@@ -467,6 +477,7 @@
"LabelNewestAuthors": "Nejnovější autoři", "LabelNewestAuthors": "Nejnovější autoři",
"LabelNewestEpisodes": "Nejnovější epizody", "LabelNewestEpisodes": "Nejnovější epizody",
"LabelNextBackupDate": "Datum příští zálohy", "LabelNextBackupDate": "Datum příští zálohy",
"LabelNextChapters": "Další kapitola bude:",
"LabelNextScheduledRun": "Další naplánované spuštění", "LabelNextScheduledRun": "Další naplánované spuštění",
"LabelNoApiKeys": "Žádné API klíče", "LabelNoApiKeys": "Žádné API klíče",
"LabelNoCustomMetadataProviders": "Žádní vlastní poskytovatelé metadat", "LabelNoCustomMetadataProviders": "Žádní vlastní poskytovatelé metadat",
@@ -484,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Maximální velikost fronty pro oznamovací události", "LabelNotificationsMaxQueueSize": "Maximální velikost fronty pro oznamovací události",
"LabelNotificationsMaxQueueSizeHelp": "Události jsou omezeny na 1 za sekundu. Události budou ignorovány, pokud je fronta v maximální velikosti. Tím se zabrání spamování oznámení.", "LabelNotificationsMaxQueueSizeHelp": "Události jsou omezeny na 1 za sekundu. Události budou ignorovány, pokud je fronta v maximální velikosti. Tím se zabrání spamování oznámení.",
"LabelNumberOfBooks": "Počet knih", "LabelNumberOfBooks": "Počet knih",
"LabelNumberOfChapters": "Počet kapitol:",
"LabelNumberOfEpisodes": "Počet epizod", "LabelNumberOfEpisodes": "Počet epizod",
"LabelOpenIDAdvancedPermsClaimDescription": "Název požadavku OpenID, který obsahuje rozšířená oprávnění pro akce uživatele v rámci aplikace, která se budou vztahovat na role, které nejsou administrátory (<b>pokud jsou nakonfigurovány</b>). Pokud požadavek v odpovědi chybí, přístup do systému ABS bude zamítnut. Pokud chybí jediná možnost, bude považována za <code>false</code>. Ujistěte se, že deklarace poskytovatele identity odpovídá očekávané struktuře:", "LabelOpenIDAdvancedPermsClaimDescription": "Název požadavku OpenID, který obsahuje rozšířená oprávnění pro akce uživatele v rámci aplikace, která se budou vztahovat na role, které nejsou administrátory (<b>pokud jsou nakonfigurovány</b>). Pokud požadavek v odpovědi chybí, přístup do systému ABS bude zamítnut. Pokud chybí jediná možnost, bude považována za <code>false</code>. Ujistěte se, že deklarace poskytovatele identity odpovídá očekávané struktuře:",
"LabelOpenIDClaims": "Následující možnosti ponechte prázdné, abyste zakázali pokročilé přiřazování skupin a oprávnění a automatické přiřazení skupiny \"User\".", "LabelOpenIDClaims": "Následující možnosti ponechte prázdné, abyste zakázali pokročilé přiřazování skupin a oprávnění a automatické přiřazení skupiny \"User\".",
@@ -626,6 +638,7 @@
"LabelStartTime": "Čas Spuštění", "LabelStartTime": "Čas Spuštění",
"LabelStarted": "Spuštěno", "LabelStarted": "Spuštěno",
"LabelStartedAt": "Spuštěno v", "LabelStartedAt": "Spuštěno v",
"LabelStartedDate": "Spuštěno {0}",
"LabelStatsAudioTracks": "Zvukové stopy", "LabelStatsAudioTracks": "Zvukové stopy",
"LabelStatsAuthors": "Autoři", "LabelStatsAuthors": "Autoři",
"LabelStatsBestDay": "Nejlepší den", "LabelStatsBestDay": "Nejlepší den",
@@ -655,6 +668,7 @@
"LabelTheme": "Téma", "LabelTheme": "Téma",
"LabelThemeDark": "Tmavé", "LabelThemeDark": "Tmavé",
"LabelThemeLight": "Světlé", "LabelThemeLight": "Světlé",
"LabelThemeSepia": "Hnědé",
"LabelTimeBase": "Časová základna", "LabelTimeBase": "Časová základna",
"LabelTimeDurationXHours": "{0} hodin", "LabelTimeDurationXHours": "{0} hodin",
"LabelTimeDurationXMinutes": "{0} minut", "LabelTimeDurationXMinutes": "{0} minut",
@@ -739,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Filtr \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Filtr \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Žádné výsledky pro dotaz", "MessageBookshelfNoResultsForQuery": "Žádné výsledky pro dotaz",
"MessageBookshelfNoSeries": "Nemáte žádnou sérii", "MessageBookshelfNoSeries": "Nemáte žádnou sérii",
"MessageBulkChapterPattern": "Kolik kapitol chcete přidat s tímto vzorem číslování?",
"MessageChapterEndIsAfter": "Konec kapitoly přesahuje konec audioknihy", "MessageChapterEndIsAfter": "Konec kapitoly přesahuje konec audioknihy",
"MessageChapterErrorFirstNotZero": "První kapitola musí začínat na 0", "MessageChapterErrorFirstNotZero": "První kapitola musí začínat na 0",
"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",
@@ -765,7 +780,7 @@
"MessageConfirmMarkItemNotFinished": "Opravdu chcete označit \"{0}\" jako nedokončené?", "MessageConfirmMarkItemNotFinished": "Opravdu chcete označit \"{0}\" jako nedokončené?",
"MessageConfirmMarkSeriesFinished": "Opravdu chcete označit všechny knihy z této série jako dokončené?", "MessageConfirmMarkSeriesFinished": "Opravdu chcete označit všechny knihy z této série jako dokončené?",
"MessageConfirmMarkSeriesNotFinished": "Opravdu chcete označit všechny knihy z této série jako nedokončené?", "MessageConfirmMarkSeriesNotFinished": "Opravdu chcete označit všechny knihy z této série jako nedokončené?",
"MessageConfirmNotificationTestTrigger": "Spustit toto oznámení s testovacími daty?", "MessageConfirmNotificationTestTrigger": "Vyvolat tuto notifikaci s testovacími daty?",
"MessageConfirmPurgeCache": "Vyčistit mezipaměť odstraní celý adresář na adrese <code>/metadata/cache</code>. <br /><br />Určitě chcete odstranit adresář mezipaměti?", "MessageConfirmPurgeCache": "Vyčistit mezipaměť odstraní celý adresář na adrese <code>/metadata/cache</code>. <br /><br />Určitě chcete odstranit adresář mezipaměti?",
"MessageConfirmPurgeItemsCache": "Vyčištění mezipaměti položek odstraní celý adresář <code>/metadata/cache/items</code>.<br />Jste si jistí?", "MessageConfirmPurgeItemsCache": "Vyčištění mezipaměti položek odstraní celý adresář <code>/metadata/cache/items</code>.<br />Jste si jistí?",
"MessageConfirmQuickEmbed": "Varování! Rychlé vložení nezálohuje vaše zvukové soubory. Ujistěte se, že máte zálohu zvukových souborů. <br><br>Chcete pokračovat?", "MessageConfirmQuickEmbed": "Varování! Rychlé vložení nezálohuje vaše zvukové soubory. Ujistěte se, že máte zálohu zvukových souborů. <br><br>Chcete pokračovat?",
@@ -801,6 +816,8 @@
"MessageFeedURLWillBe": "URL zdroje bude {0}", "MessageFeedURLWillBe": "URL zdroje bude {0}",
"MessageFetching": "Načítání...", "MessageFetching": "Načítání...",
"MessageForceReScanDescription": "znovu prohledá všechny soubory jako při novém skenování. ID3 tagy zvukových souborů OPF soubory a textové soubory budou skenovány jako nové.", "MessageForceReScanDescription": "znovu prohledá všechny soubory jako při novém skenování. ID3 tagy zvukových souborů OPF soubory a textové soubory budou skenovány jako nové.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} poslechnuto</strong> na {1}",
"MessageHeatmapNoListeningSessions": "Žádné relace poslouchání na {0}",
"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", "MessageInvalidAsin": "Neplatný ASIN",
@@ -837,7 +854,7 @@
"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é logy", "MessageNoLogs": "Žádné záznamy událostí",
"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",
@@ -867,7 +884,7 @@
"MessageRemoveEpisodes": "Odstranit {0} epizodu", "MessageRemoveEpisodes": "Odstranit {0} epizodu",
"MessageRemoveFromPlayerQueue": "Odstranit z fronty přehrávače", "MessageRemoveFromPlayerQueue": "Odstranit z fronty přehrávače",
"MessageRemoveUserWarning": "Opravdu chcete trvale smazat uživatele \"{0}\"?", "MessageRemoveUserWarning": "Opravdu chcete trvale smazat uživatele \"{0}\"?",
"MessageReportBugsAndContribute": "Hlásit chyby, žádat o funkce a přispívat", "MessageReportBugsAndContribute": "Nahlašte chyby, vyžádejte si funkce a přispěte na",
"MessageResetChaptersConfirm": "Opravdu chcete resetovat kapitoly a vrátit zpět provedené změny?", "MessageResetChaptersConfirm": "Opravdu chcete resetovat kapitoly a vrátit zpět provedené změny?",
"MessageRestoreBackupConfirm": "Opravdu chcete obnovit zálohu vytvořenou dne", "MessageRestoreBackupConfirm": "Opravdu chcete obnovit zálohu vytvořenou dne",
"MessageRestoreBackupWarning": "Obnovení zálohy přepíše celou databázi umístěnou v /config a obálku obrázků v /metadata/items & /metadata/authors.<br /><br />Backups nezmění žádné soubory ve složkách knihovny. Pokud jste povolili nastavení serveru pro ukládání obrázků obalu a metadat do složek knihovny, nebudou zálohovány ani přepsány.<br /><br />Všichni klienti používající váš server budou automaticky obnoveni.", "MessageRestoreBackupWarning": "Obnovení zálohy přepíše celou databázi umístěnou v /config a obálku obrázků v /metadata/items & /metadata/authors.<br /><br />Backups nezmění žádné soubory ve složkách knihovny. Pokud jste povolili nastavení serveru pro ukládání obrázků obalu a metadat do složek knihovny, nebudou zálohovány ani přepsány.<br /><br />Všichni klienti používající váš server budou automaticky obnoveni.",
@@ -900,7 +917,7 @@
"MessageTaskNoFilesToScan": "Žádné soubory k prohledání", "MessageTaskNoFilesToScan": "Žádné soubory k prohledání",
"MessageTaskOpmlImport": "Import OPML", "MessageTaskOpmlImport": "Import OPML",
"MessageTaskOpmlImportDescription": "Vytváření podcastů z {0} RSS feedů", "MessageTaskOpmlImportDescription": "Vytváření podcastů z {0} RSS feedů",
"MessageTaskOpmlImportFeed": "Importní zdroj OPML", "MessageTaskOpmlImportFeed": "Import OPML feedu",
"MessageTaskOpmlImportFeedDescription": "Importování RSS feedu \"{0}\"", "MessageTaskOpmlImportFeedDescription": "Importování RSS feedu \"{0}\"",
"MessageTaskOpmlImportFeedFailed": "Nepodařilo se získat kanál podcastu", "MessageTaskOpmlImportFeedFailed": "Nepodařilo se získat kanál podcastu",
"MessageTaskOpmlImportFeedPodcastDescription": "Vytváření podcastu \"{0}\"", "MessageTaskOpmlImportFeedPodcastDescription": "Vytváření podcastu \"{0}\"",
@@ -940,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Aktivováno když je automatické stahování pozastaveno z důvodu příliš mnoho neůspěšných pokusů", "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", "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",
"PlaceholderBulkChapterInput": "Zadejte název kapitoly nebo použije číslování (např. 'Epizoda 1', 'Kapitola 10', '1.')",
"PlaceholderNewCollection": "Nový název kolekce", "PlaceholderNewCollection": "Nový název kolekce",
"PlaceholderNewFolderPath": "Nová cesta ke složce", "PlaceholderNewFolderPath": "Nová cesta ke složce",
"PlaceholderNewPlaylist": "Nový název seznamu přehrávání", "PlaceholderNewPlaylist": "Nový název seznamu přehrávání",
@@ -993,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Vytvoření záložky se nezdařilo", "ToastBookmarkCreateFailed": "Vytvoření záložky se nezdařilo",
"ToastBookmarkCreateSuccess": "Přidána záložka", "ToastBookmarkCreateSuccess": "Přidána záložka",
"ToastBookmarkRemoveSuccess": "Záložka odstraněna", "ToastBookmarkRemoveSuccess": "Záložka odstraněna",
"ToastBulkChapterInvalidCount": "Zadejte číslo mezi 1 a 150",
"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",
"ToastChapterLocked": "Kapitola je uzamčena.",
"ToastChapterStartTimeAdjusted": "Začátek kapitoly posunut o {0} sekund",
"ToastChaptersAllLocked": "Všechny kapitoly jsou uzamčeny. Pro posun kapitol některé odemkněte.",
"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.", "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.", "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.",
@@ -1013,7 +1035,7 @@
"ToastDeviceTestEmailFailed": "Odeslání testovacího emailu selhalo", "ToastDeviceTestEmailFailed": "Odeslání testovacího emailu selhalo",
"ToastDeviceTestEmailSuccess": "Testovací email byl odeslán", "ToastDeviceTestEmailSuccess": "Testovací email byl odeslán",
"ToastEmailSettingsUpdateSuccess": "Nastavení emailu aktualizována", "ToastEmailSettingsUpdateSuccess": "Nastavení emailu aktualizována",
"ToastEncodeCancelFailed": "Chyba zrušení dování", "ToastEncodeCancelFailed": "Zrušení encodování selhalo",
"ToastEncodeCancelSucces": "Kódování zrušeno", "ToastEncodeCancelSucces": "Kódování zrušeno",
"ToastEpisodeDownloadQueueClearFailed": "Vyčištění fronty selhalo", "ToastEpisodeDownloadQueueClearFailed": "Vyčištění fronty selhalo",
"ToastEpisodeDownloadQueueClearSuccess": "Fronta stahování epizod je prázdná", "ToastEpisodeDownloadQueueClearSuccess": "Fronta stahování epizod je prázdná",
@@ -1028,6 +1050,7 @@
"ToastInvalidImageUrl": "Neplatná URL obrázku", "ToastInvalidImageUrl": "Neplatná URL obrázku",
"ToastInvalidMaxEpisodesToDownload": "Neplatný maximální počet epizod ke stažení", "ToastInvalidMaxEpisodesToDownload": "Neplatný maximální počet epizod ke stažení",
"ToastInvalidUrl": "Neplatná URL", "ToastInvalidUrl": "Neplatná URL",
"ToastInvalidUrls": "Alespoň jedna URL je neplatná",
"ToastItemCoverUpdateSuccess": "Obálka předmětu byl aktualizována", "ToastItemCoverUpdateSuccess": "Obálka předmětu byl aktualizována",
"ToastItemDeletedFailed": "Smazání položky selhalo", "ToastItemDeletedFailed": "Smazání položky selhalo",
"ToastItemDeletedSuccess": "Položka smazána", "ToastItemDeletedSuccess": "Položka smazána",
@@ -1077,6 +1100,7 @@
"ToastPlaylistUpdateSuccess": "Seznam přehrávání aktualizován", "ToastPlaylistUpdateSuccess": "Seznam přehrávání aktualizován",
"ToastPodcastCreateFailed": "Vytvoření podcastu se nezdařilo", "ToastPodcastCreateFailed": "Vytvoření podcastu se nezdařilo",
"ToastPodcastCreateSuccess": "Podcast byl úspěšně vytvořen", "ToastPodcastCreateSuccess": "Podcast byl úspěšně vytvořen",
"ToastPodcastEpisodeUpdated": "Epizoda aktualizována",
"ToastPodcastGetFeedFailed": "Chyba při získání podcastového feedu", "ToastPodcastGetFeedFailed": "Chyba při získání podcastového feedu",
"ToastPodcastNoEpisodesInFeed": "Žádné epizody nenalezeny v RSS feedu", "ToastPodcastNoEpisodesInFeed": "Žádné epizody nenalezeny v RSS feedu",
"ToastPodcastNoRssFeed": "Podcast nemá RSS feed", "ToastPodcastNoRssFeed": "Podcast nemá RSS feed",
@@ -1109,7 +1133,7 @@
"ToastSessionDeleteFailed": "Nepodařilo se smazat relaci", "ToastSessionDeleteFailed": "Nepodařilo se smazat relaci",
"ToastSessionDeleteSuccess": "Relace smazána", "ToastSessionDeleteSuccess": "Relace smazána",
"ToastSleepTimerDone": "Uspání knížky ... zZzzZz", "ToastSleepTimerDone": "Uspání knížky ... zZzzZz",
"ToastSlugMustChange": "Slug (URL) obsahuje chybné znaky", "ToastSlugMustChange": "Slug obsahuje chybné znaky",
"ToastSlugRequired": "Slug (URL) je vyžadována", "ToastSlugRequired": "Slug (URL) je vyžadována",
"ToastSocketConnected": "Socket připojen", "ToastSocketConnected": "Socket připojen",
"ToastSocketDisconnected": "Socket odpojen", "ToastSocketDisconnected": "Socket odpojen",
@@ -1127,5 +1151,13 @@
"ToastUserPasswordChangeSuccess": "Heslo bylo změněno úspěšně", "ToastUserPasswordChangeSuccess": "Heslo bylo změněno úspěšně",
"ToastUserPasswordMismatch": "Hesla se neschodují", "ToastUserPasswordMismatch": "Hesla se neschodují",
"ToastUserPasswordMustChange": "Nové heslo se musí lišit od předchozího", "ToastUserPasswordMustChange": "Nové heslo se musí lišit od předchozího",
"ToastUserRootRequireName": "Musíte zadat uživatelské jméno root" "ToastUserRootRequireName": "Musíte zadat uživatelské jméno root",
"TooltipAddChapters": "Přidat kapitolu/y",
"TooltipAddOneSecond": "Přidat 1 sekundu",
"TooltipAdjustChapterStart": "Kliknutím upravte začátek",
"TooltipLockAllChapters": "Uzamknout všechny kapitoly",
"TooltipLockChapter": "Uzamknout kapitolu (Shift+klik pro rozsah)",
"TooltipSubtractOneSecond": "Odečíst 1 sekundu",
"TooltipUnlockAllChapters": "Odemknout všechny kapitoly",
"TooltipUnlockChapter": "Odemknout kapitolu (Shift+klik pro rozsah)"
} }
+28 -9
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Tilføj", "ButtonAdd": "Tilføj",
"ButtonAddApiKey": "Tilføj API-nøgle",
"ButtonAddChapters": "Tilføj kapitler", "ButtonAddChapters": "Tilføj kapitler",
"ButtonAddDevice": "Tilføj enhed", "ButtonAddDevice": "Tilføj enhed",
"ButtonAddLibrary": "Tilføj Bibliotek", "ButtonAddLibrary": "Tilføj Bibliotek",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Vælg en mappe", "ButtonChooseAFolder": "Vælg en mappe",
"ButtonChooseFiles": "Vælg filer", "ButtonChooseFiles": "Vælg filer",
"ButtonClearFilter": "Ryd filter", "ButtonClearFilter": "Ryd filter",
"ButtonClose": "Luk",
"ButtonCloseFeed": "Luk feed", "ButtonCloseFeed": "Luk feed",
"ButtonCloseSession": "Luk Åben Session", "ButtonCloseSession": "Luk Åben Session",
"ButtonCollections": "Samlinger", "ButtonCollections": "Samlinger",
@@ -119,6 +121,7 @@
"HeaderAccount": "Konto", "HeaderAccount": "Konto",
"HeaderAddCustomMetadataProvider": "Tilføj Brugerdefineret Metadataudbyder", "HeaderAddCustomMetadataProvider": "Tilføj Brugerdefineret Metadataudbyder",
"HeaderAdvanced": "Avanceret", "HeaderAdvanced": "Avanceret",
"HeaderApiKeys": "API-nøgler",
"HeaderAppriseNotificationSettings": "Apprise Notifikationsindstillinger", "HeaderAppriseNotificationSettings": "Apprise Notifikationsindstillinger",
"HeaderAudioTracks": "Lydspor", "HeaderAudioTracks": "Lydspor",
"HeaderAudiobookTools": "Audiobog Filhåndteringsværktøjer", "HeaderAudiobookTools": "Audiobog Filhåndteringsværktøjer",
@@ -162,6 +165,7 @@
"HeaderMetadataOrderOfPrecedence": "Metadata-prioritet", "HeaderMetadataOrderOfPrecedence": "Metadata-prioritet",
"HeaderMetadataToEmbed": "Metadata til indlejring", "HeaderMetadataToEmbed": "Metadata til indlejring",
"HeaderNewAccount": "Ny Konto", "HeaderNewAccount": "Ny Konto",
"HeaderNewApiKey": "Ny API-nøgle",
"HeaderNewLibrary": "Nyt Bibliotek", "HeaderNewLibrary": "Nyt Bibliotek",
"HeaderNotificationCreate": "Opret Notifikation", "HeaderNotificationCreate": "Opret Notifikation",
"HeaderNotificationUpdate": "Updater Notifikation", "HeaderNotificationUpdate": "Updater Notifikation",
@@ -206,6 +210,7 @@
"HeaderTableOfContents": "Indholdsfortegnelse", "HeaderTableOfContents": "Indholdsfortegnelse",
"HeaderTools": "Værktøjer", "HeaderTools": "Værktøjer",
"HeaderUpdateAccount": "Opdater Konto", "HeaderUpdateAccount": "Opdater Konto",
"HeaderUpdateApiKey": "Opdater API-nøgle",
"HeaderUpdateAuthor": "Opdater Forfatter", "HeaderUpdateAuthor": "Opdater Forfatter",
"HeaderUpdateDetails": "Opdater Detaljer", "HeaderUpdateDetails": "Opdater Detaljer",
"HeaderUpdateLibrary": "Opdater Bibliotek", "HeaderUpdateLibrary": "Opdater Bibliotek",
@@ -235,6 +240,10 @@
"LabelAllUsersExcludingGuests": "Alle bruger eksklusiv gæster", "LabelAllUsersExcludingGuests": "Alle bruger eksklusiv gæster",
"LabelAllUsersIncludingGuests": "Alle bruger inklusiv gæster", "LabelAllUsersIncludingGuests": "Alle bruger inklusiv gæster",
"LabelAlreadyInYourLibrary": "Allerede i dit bibliotek", "LabelAlreadyInYourLibrary": "Allerede i dit bibliotek",
"LabelApiKeyCreated": "API-nøgle\"{0}\" oprettet succesfuldt.",
"LabelApiKeyCreatedDescription": "Sørg for at kopiere API-nøglen nu, da du ikke vil kunne se den igen.",
"LabelApiKeyUser": "Ret på vegne af brugeren",
"LabelApiKeyUserDescription": "Denne API-nøgle vil have de samme tilladelser som den bruger, den handler på vegne af. Dette vil fremgå på samme måde i logfiler, som hvis brugeren foretog anmodningen.",
"LabelApiToken": "API Token", "LabelApiToken": "API Token",
"LabelAppend": "Tilføj", "LabelAppend": "Tilføj",
"LabelAudioBitrate": "Lydbitrate (f.eks. 128k)", "LabelAudioBitrate": "Lydbitrate (f.eks. 128k)",
@@ -287,7 +296,7 @@
"LabelCover": "Omslag", "LabelCover": "Omslag",
"LabelCoverImageURL": "Omslagsbillede URL", "LabelCoverImageURL": "Omslagsbillede URL",
"LabelCoverProvider": "Cover billede udbyder", "LabelCoverProvider": "Cover billede udbyder",
"LabelCreatedAt": "Oprettet Kl.", "LabelCreatedAt": "Oprettet d.",
"LabelCronExpression": "Cron Udtryk", "LabelCronExpression": "Cron Udtryk",
"LabelCurrent": "Aktuel", "LabelCurrent": "Aktuel",
"LabelCurrently": "Aktuelt:", "LabelCurrently": "Aktuelt:",
@@ -346,6 +355,10 @@
"LabelExample": "Eksempel", "LabelExample": "Eksempel",
"LabelExpandSeries": "Udfold serie", "LabelExpandSeries": "Udfold serie",
"LabelExpandSubSeries": "Udfold underserie", "LabelExpandSubSeries": "Udfold underserie",
"LabelExpired": "Udløbet",
"LabelExpiresAt": "Udløbsdato",
"LabelExpiresInSeconds": "Udløber om (seconds)",
"LabelExpiresNever": "Aldrig",
"LabelExplicit": "Eksplisit", "LabelExplicit": "Eksplisit",
"LabelExplicitChecked": "Eksplicit (markeret)", "LabelExplicitChecked": "Eksplicit (markeret)",
"LabelExplicitUnchecked": "Ikke eksplicit (ikke markeret)", "LabelExplicitUnchecked": "Ikke eksplicit (ikke markeret)",
@@ -455,6 +468,7 @@
"LabelNewestEpisodes": "Nyeste episoder", "LabelNewestEpisodes": "Nyeste episoder",
"LabelNextBackupDate": "Næste sikkerhedskopi dato", "LabelNextBackupDate": "Næste sikkerhedskopi dato",
"LabelNextScheduledRun": "Næste planlagte kørsel", "LabelNextScheduledRun": "Næste planlagte kørsel",
"LabelNoApiKeys": "Ingen API-nøgler",
"LabelNoCustomMetadataProviders": "Ingen brugerdefinerede metadata udbydere", "LabelNoCustomMetadataProviders": "Ingen brugerdefinerede metadata udbydere",
"LabelNoEpisodesSelected": "Ingen episoder valgt", "LabelNoEpisodesSelected": "Ingen episoder valgt",
"LabelNotFinished": "Ikke færdig", "LabelNotFinished": "Ikke færdig",
@@ -544,6 +558,7 @@
"LabelSelectAll": "Vælg alle", "LabelSelectAll": "Vælg alle",
"LabelSelectAllEpisodes": "Vælg alle episoder", "LabelSelectAllEpisodes": "Vælg alle episoder",
"LabelSelectEpisodesShowing": "Vælg {0} episoder vist", "LabelSelectEpisodesShowing": "Vælg {0} episoder vist",
"LabelSelectUser": "Vælg bruger",
"LabelSelectUsers": "Valgte brugere", "LabelSelectUsers": "Valgte brugere",
"LabelSendEbookToDevice": "Send e-bog til...", "LabelSendEbookToDevice": "Send e-bog til...",
"LabelSequence": "Sekvens", "LabelSequence": "Sekvens",
@@ -577,14 +592,14 @@
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Procent gennemført er større end", "LabelSettingsLibraryMarkAsFinishedPercentComplete": "Procent gennemført er større end",
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Tid tilbage er mindre end (sekunder)", "LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Tid tilbage er mindre end (sekunder)",
"LabelSettingsLibraryMarkAsFinishedWhen": "Marker medie indhold som færdigt når", "LabelSettingsLibraryMarkAsFinishedWhen": "Marker medie indhold som færdigt når",
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Spring til tidligere bøger i Fortsæt serie", "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Spring tidligere bøger i Fortsæt serie over",
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Fortsæt Serien siden hylde viser de første bøger som ikke er startet i serier med mindst en bog som ikke er startet og ingen bøger i gang. Aktivering af denne indstilling vil fortsætte serien fra den sidst gennemførte bog modsat den først ikke startede bog.", "LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Fortsæt Serien siden viser den første bog som ikke er startet i serier med mindst en bog som ikke er startet og hvor ingen bøger i gang. Aktivering af denne indstilling vil fortsætte serien fra den sidst gennemførte bog i stedet for fra den første ikke startede bog.",
"LabelSettingsParseSubtitles": "Fortolk undertitler", "LabelSettingsParseSubtitles": "Fortolk undertitler",
"LabelSettingsParseSubtitlesHelp": "Udtræk undertekster fra lydbogsmappenavne.<br>Undertitler skal adskilles af \" - \"<br>f.eks. \"Bogtitel - En undertitel her\" har undertitlen \"En undertitel her\"", "LabelSettingsParseSubtitlesHelp": "Udtræk undertekster fra lydbogsmappenavne.<br>Undertitler skal adskilles af \" - \"<br>f.eks. \"Bogtitel - En undertitel her\" har undertitlen \"En undertitel her\"",
"LabelSettingsPreferMatchedMetadata": "Foretræk matchede metadata", "LabelSettingsPreferMatchedMetadata": "Foretræk matchede metadata",
"LabelSettingsPreferMatchedMetadataHelp": "Matchede data vil tilsidesætte elementdetaljer ved brug af Hurtig Match. Som standard udfylder Hurtig Match kun manglende detaljer.", "LabelSettingsPreferMatchedMetadataHelp": "Matchede data vil tilsidesætte elementdetaljer ved brug af Hurtig Match. Som standard udfylder Hurtig Match kun manglende detaljer.",
"LabelSettingsSkipMatchingBooksWithASIN": "Spring over matchende bøger, der allerede har en ASIN", "LabelSettingsSkipMatchingBooksWithASIN": "Ignorer matchende bøger, der allerede har en ASIN",
"LabelSettingsSkipMatchingBooksWithISBN": "Spring matchende bøger over, som allerede har et ISBN-nummer", "LabelSettingsSkipMatchingBooksWithISBN": "Ignorer matchende bøger, som allerede har et ISBN-nummer",
"LabelSettingsSortingIgnorePrefixes": "Ignorer præfikser ved sortering", "LabelSettingsSortingIgnorePrefixes": "Ignorer præfikser ved sortering",
"LabelSettingsSortingIgnorePrefixesHelp": "f.eks. for præfikset \"the\" vil bogtitlen \"The Book Title\" blive sorteret som \"Book Title, The\"", "LabelSettingsSortingIgnorePrefixesHelp": "f.eks. for præfikset \"the\" vil bogtitlen \"The Book Title\" blive sorteret som \"Book Title, The\"",
"LabelSettingsSquareBookCovers": "Brug kvadratiske bogomslag", "LabelSettingsSquareBookCovers": "Brug kvadratiske bogomslag",
@@ -708,7 +723,9 @@
"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.", "MessageAsinCheck": "Sikr dig at du bruger ASIN fra den korrekte Audible region, ikke Amazon.",
"MessageAuthenticationLegacyTokenWarning": "Ældre API tokens vil blive fjernet i fremtiden. Brug <a href=\"/config/api-keys\">API-nøgler</a> i stedet.",
"MessageAuthenticationOIDCChangesRestart": "Genstart sin server efter du har gemt for at bekræfte OIDC ændringer.", "MessageAuthenticationOIDCChangesRestart": "Genstart sin server efter du har gemt for at bekræfte OIDC ændringer.",
"MessageAuthenticationSecurityMessage": "Autentificeringen er blevet forbedret af sikkerhedsmæssige årsager. Alle brugere skal logge ind igen.",
"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.",
@@ -730,6 +747,7 @@
"MessageChaptersNotFound": "Kapitler ikke fundet", "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?",
"MessageConfirmDeleteApiKey": "Er du sikker på at du vil slette API-nøglen \"{0}\"?",
"MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?", "MessageConfirmDeleteBackup": "Er du sikker på, at du vil slette backup for {0}?",
"MessageConfirmDeleteDevice": "Er du sikker på at du vil fjerne elæser enhed \"{0}\"?", "MessageConfirmDeleteDevice": "Er du sikker på at du vil fjerne elæser enhed \"{0}\"?",
"MessageConfirmDeleteFile": "Dette vil slette filen fra dit filsystem. Er du sikker?", "MessageConfirmDeleteFile": "Dette vil slette filen fra dit filsystem. Er du sikker?",
@@ -998,6 +1016,7 @@
"ToastEpisodeDownloadQueueClearSuccess": "Afsnit download kø renset", "ToastEpisodeDownloadQueueClearSuccess": "Afsnit download kø renset",
"ToastEpisodeUpdateSuccess": "{0} afsnit opdateret", "ToastEpisodeUpdateSuccess": "{0} afsnit opdateret",
"ToastErrorCannotShare": "Kan ikke dele på denne enhed", "ToastErrorCannotShare": "Kan ikke dele på denne enhed",
"ToastFailedToCreate": "Oprettelsen mislykkedes",
"ToastFailedToLoadData": "Fejlede at indlæse data", "ToastFailedToLoadData": "Fejlede at indlæse data",
"ToastFailedToMatch": "Fejlet match", "ToastFailedToMatch": "Fejlet match",
"ToastFailedToShare": "Fejlet deling", "ToastFailedToShare": "Fejlet deling",
@@ -1014,11 +1033,11 @@
"ToastItemMarkedAsNotFinishedFailed": "Mislykkedes markering som ikke afsluttet", "ToastItemMarkedAsNotFinishedFailed": "Mislykkedes markering som ikke afsluttet",
"ToastItemMarkedAsNotFinishedSuccess": "Vare markeret som ikke afsluttet", "ToastItemMarkedAsNotFinishedSuccess": "Vare markeret som ikke afsluttet",
"ToastItemUpdateSuccess": "Genstand opdateret", "ToastItemUpdateSuccess": "Genstand opdateret",
"ToastLibraryCreateFailed": "Mislykkedes oprettelse af bibliotek", "ToastLibraryCreateFailed": "Oprettelse af bibliotek mislykkedes",
"ToastLibraryCreateSuccess": "Bibliotek \"{0}\" oprettet", "ToastLibraryCreateSuccess": "Bibliotek \"{0}\" oprettet",
"ToastLibraryDeleteFailed": "Mislykkedes sletning af bibliotek", "ToastLibraryDeleteFailed": "Sletning af bibliotek mislykkedes",
"ToastLibraryDeleteSuccess": "Bibliotek slettet", "ToastLibraryDeleteSuccess": "Bibliotek slettet",
"ToastLibraryScanFailedToStart": "Mislykkedes start af skanning", "ToastLibraryScanFailedToStart": "Start af skanning mislykkedes",
"ToastLibraryScanStarted": "Biblioteksskanning startet", "ToastLibraryScanStarted": "Biblioteksskanning startet",
"ToastLibraryUpdateSuccess": "Bibliotek \"{0}\" opdateret", "ToastLibraryUpdateSuccess": "Bibliotek \"{0}\" opdateret",
"ToastMatchAllAuthorsFailed": "Fejlede at matche alle forfattere", "ToastMatchAllAuthorsFailed": "Fejlede at matche alle forfattere",
@@ -1097,7 +1116,7 @@
"ToastUnlinkOpenIdFailed": "Fejlede i af afkoble bruger fra OpenID", "ToastUnlinkOpenIdFailed": "Fejlede i af afkoble bruger fra OpenID",
"ToastUnlinkOpenIdSuccess": "Bruger afkoblet fra OpenID", "ToastUnlinkOpenIdSuccess": "Bruger afkoblet fra OpenID",
"ToastUploaderFilepathExistsError": "Filsti \"{0}\" findes allerede på serveren", "ToastUploaderFilepathExistsError": "Filsti \"{0}\" findes allerede på serveren",
"ToastUploaderItemExistsInSubdirectoryError": "Genstand \"{0}\" benytter en undermappe af upload stien", "ToastUploaderItemExistsInSubdirectoryError": "Genstand \"{0}\" benytter en undermappe af upload stien.",
"ToastUserDeleteFailed": "Mislykkedes sletning af bruger", "ToastUserDeleteFailed": "Mislykkedes sletning af bruger",
"ToastUserDeleteSuccess": "Bruger slettet", "ToastUserDeleteSuccess": "Bruger slettet",
"ToastUserPasswordChangeSuccess": "Password ændret", "ToastUserPasswordChangeSuccess": "Password ændret",
+46 -13
View File
@@ -15,7 +15,7 @@
"ButtonBatchEditPopulateMapDetails": "Kartendetails auffüllen", "ButtonBatchEditPopulateMapDetails": "Kartendetails auffüllen",
"ButtonBrowseForFolder": "Ordnersuche", "ButtonBrowseForFolder": "Ordnersuche",
"ButtonCancel": "Abbrechen", "ButtonCancel": "Abbrechen",
"ButtonCancelEncode": "Codierung abbrechen", "ButtonCancelEncode": "Konvertierung abbrechen",
"ButtonChangeRootPassword": "Hauptpasswort ändern", "ButtonChangeRootPassword": "Hauptpasswort ändern",
"ButtonCheckAndDownloadNewEpisodes": "Überprüfe & lade neue Episoden herunter", "ButtonCheckAndDownloadNewEpisodes": "Überprüfe & lade neue Episoden herunter",
"ButtonChooseAFolder": "Wähle einen Ordner", "ButtonChooseAFolder": "Wähle einen Ordner",
@@ -55,7 +55,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": "Ok", "ButtonOk": "OK",
"ButtonOpenFeed": "Feed öffnen", "ButtonOpenFeed": "Feed öffnen",
"ButtonOpenManager": "Manager öffnen", "ButtonOpenManager": "Manager öffnen",
"ButtonPause": "Pausieren", "ButtonPause": "Pausieren",
@@ -75,7 +75,7 @@
"ButtonQuickMatch": "Schnellabgleich", "ButtonQuickMatch": "Schnellabgleich",
"ButtonReScan": "Neu scannen", "ButtonReScan": "Neu scannen",
"ButtonRead": "Lesen", "ButtonRead": "Lesen",
"ButtonReadLess": "weniger Anzeigen", "ButtonReadLess": "Weniger Anzeigen",
"ButtonReadMore": "Mehr Anzeigen", "ButtonReadMore": "Mehr Anzeigen",
"ButtonRefresh": "Neu Laden", "ButtonRefresh": "Neu Laden",
"ButtonRemove": "Entfernen", "ButtonRemove": "Entfernen",
@@ -104,7 +104,7 @@
"ButtonStartM4BEncode": "M4B-Kodierung starten", "ButtonStartM4BEncode": "M4B-Kodierung starten",
"ButtonStartMetadataEmbed": "Metadateneinbettung starten", "ButtonStartMetadataEmbed": "Metadateneinbettung starten",
"ButtonStats": "Statistiken", "ButtonStats": "Statistiken",
"ButtonSubmit": "Ok", "ButtonSubmit": "Absenden",
"ButtonTest": "Test", "ButtonTest": "Test",
"ButtonUnlinkOpenId": "OpenID trennen", "ButtonUnlinkOpenId": "OpenID trennen",
"ButtonUpload": "Hochladen", "ButtonUpload": "Hochladen",
@@ -116,7 +116,7 @@
"ButtonViewAll": "Alles anzeigen", "ButtonViewAll": "Alles anzeigen",
"ButtonYes": "Ja", "ButtonYes": "Ja",
"ErrorUploadFetchMetadataAPI": "Fehler beim Abrufen der Metadaten", "ErrorUploadFetchMetadataAPI": "Fehler beim Abrufen der Metadaten",
"ErrorUploadFetchMetadataNoResults": "Metadaten konnten nicht abgerufen werden. Versuche den Titel und oder den Autor zu aktualisieren", "ErrorUploadFetchMetadataNoResults": "Metadaten konnten nicht abgerufen werden. Versuche den Titel und/oder den Autor zu aktualisieren.",
"ErrorUploadLacksTitle": "Es muss ein Titel eingegeben werden", "ErrorUploadLacksTitle": "Es muss ein Titel eingegeben werden",
"HeaderAccount": "Konto", "HeaderAccount": "Konto",
"HeaderAddCustomMetadataProvider": "Benutzerdefinierten Metadatenanbieter hinzufügen", "HeaderAddCustomMetadataProvider": "Benutzerdefinierten Metadatenanbieter hinzufügen",
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Hörbuch-Dateiverwaltungswerkzeuge", "HeaderAudiobookTools": "Hörbuch-Dateiverwaltungswerkzeuge",
"HeaderAuthentication": "Authentifizierung", "HeaderAuthentication": "Authentifizierung",
"HeaderBackups": "Sicherungen", "HeaderBackups": "Sicherungen",
"HeaderBulkChapterModal": "Mehrere Kapitel hinzufügen",
"HeaderChangePassword": "Passwort ändern", "HeaderChangePassword": "Passwort ändern",
"HeaderChapters": "Kapitel", "HeaderChapters": "Kapitel",
"HeaderChooseAFolder": "Wähle einen Ordner", "HeaderChooseAFolder": "Wähle einen Ordner",
@@ -137,13 +138,13 @@
"HeaderCustomMessageOnLogin": "Benutzerdefinierte Nachricht für die Anmeldung", "HeaderCustomMessageOnLogin": "Benutzerdefinierte Nachricht für die Anmeldung",
"HeaderCustomMetadataProviders": "Benutzerdefinierte Metadatenanbieter", "HeaderCustomMetadataProviders": "Benutzerdefinierte Metadatenanbieter",
"HeaderDetails": "Details", "HeaderDetails": "Details",
"HeaderDownloadQueue": "Download Warteschlange", "HeaderDownloadQueue": "Download-Warteschlange",
"HeaderEbookFiles": "E-Buch-Dateien", "HeaderEbookFiles": "E-Book-Dateien",
"HeaderEmail": "E-Mail", "HeaderEmail": "E-Mail",
"HeaderEmailSettings": "E-Mail-Einstellungen", "HeaderEmailSettings": "E-Mail-Einstellungen",
"HeaderEpisodes": "Episoden", "HeaderEpisodes": "Episoden",
"HeaderEreaderDevices": "E-Reader Geräte", "HeaderEreaderDevices": "E-Reader Geräte",
"HeaderEreaderSettings": "Einstellungen zum Lesen", "HeaderEreaderSettings": "E-Reader-Einstellungen",
"HeaderFiles": "Dateien", "HeaderFiles": "Dateien",
"HeaderFindChapters": "Kapitel suchen", "HeaderFindChapters": "Kapitel suchen",
"HeaderIgnoredFiles": "Ignorierte Dateien", "HeaderIgnoredFiles": "Ignorierte Dateien",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Experimentelle Funktionen", "HeaderSettingsExperimental": "Experimentelle Funktionen",
"HeaderSettingsGeneral": "Allgemein", "HeaderSettingsGeneral": "Allgemein",
"HeaderSettingsScanner": "Scanner", "HeaderSettingsScanner": "Scanner",
"HeaderSettingsSecurity": "Sicherheit",
"HeaderSettingsWebClient": "Web-Client", "HeaderSettingsWebClient": "Web-Client",
"HeaderSleepTimer": "Sleep-Timer", "HeaderSleepTimer": "Sleep-Timer",
"HeaderStatsLargestItems": "Größte Medien", "HeaderStatsLargestItems": "Größte Medien",
@@ -293,6 +295,7 @@
"LabelContinueListening": "Weiterhören", "LabelContinueListening": "Weiterhören",
"LabelContinueReading": "Weiterlesen", "LabelContinueReading": "Weiterlesen",
"LabelContinueSeries": "Serien fortsetzen", "LabelContinueSeries": "Serien fortsetzen",
"LabelCorsAllowed": "Erlaubte CORS Quellen",
"LabelCover": "Titelbild", "LabelCover": "Titelbild",
"LabelCoverImageURL": "URL des Titelbildes", "LabelCoverImageURL": "URL des Titelbildes",
"LabelCoverProvider": "Titelbildanbieter", "LabelCoverProvider": "Titelbildanbieter",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Löschen von der Festplatte + Datenbank (deaktivieren um nur aus der Datenbank zu entfernen)", "LabelDeleteFromFileSystemCheckbox": "Löschen von der Festplatte + Datenbank (deaktivieren um nur aus der Datenbank zu entfernen)",
"LabelDescription": "Beschreibung", "LabelDescription": "Beschreibung",
"LabelDeselectAll": "Alles abwählen", "LabelDeselectAll": "Alles abwählen",
"LabelDetectedPattern": "Erkanntes Muster:",
"LabelDevice": "Gerät", "LabelDevice": "Gerät",
"LabelDeviceInfo": "Geräteinformationen", "LabelDeviceInfo": "Geräteinformationen",
"LabelDeviceIsAvailableTo": "Dem Gerät ist es möglich zu ...", "LabelDeviceIsAvailableTo": "Dem Gerät ist es möglich zu ...",
@@ -374,6 +378,7 @@
"LabelFilterByUser": "Nach Benutzern filtern", "LabelFilterByUser": "Nach Benutzern filtern",
"LabelFindEpisodes": "Episoden suchen", "LabelFindEpisodes": "Episoden suchen",
"LabelFinished": "Beendet", "LabelFinished": "Beendet",
"LabelFinishedDate": "Beendet {0}",
"LabelFolder": "Ordner", "LabelFolder": "Ordner",
"LabelFolders": "Verzeichnisse", "LabelFolders": "Verzeichnisse",
"LabelFontBold": "Fett", "LabelFontBold": "Fett",
@@ -418,6 +423,7 @@
"LabelLanguages": "Sprachen", "LabelLanguages": "Sprachen",
"LabelLastBookAdded": "Zuletzt hinzugefügtes Buch", "LabelLastBookAdded": "Zuletzt hinzugefügtes Buch",
"LabelLastBookUpdated": "Zuletzt aktualisiertes Buch", "LabelLastBookUpdated": "Zuletzt aktualisiertes Buch",
"LabelLastProgressDate": "Letzter Fortschritt: {0}",
"LabelLastSeen": "Zuletzt gesehen", "LabelLastSeen": "Zuletzt gesehen",
"LabelLastTime": "Letztes Mal", "LabelLastTime": "Letztes Mal",
"LabelLastUpdate": "Letzte Aktualisierung", "LabelLastUpdate": "Letzte Aktualisierung",
@@ -430,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Keine {0}", "LabelLibraryFilterSublistEmpty": "Keine {0}",
"LabelLibraryItem": "Bibliothekseintrag", "LabelLibraryItem": "Bibliothekseintrag",
"LabelLibraryName": "Bibliotheksname", "LabelLibraryName": "Bibliotheksname",
"LabelLibrarySortByProgress": "Fortschritt: Zuletzt aktualisiert",
"LabelLibrarySortByProgressFinished": "Fortschritt: Beendet",
"LabelLibrarySortByProgressStarted": "Fortschritt: Gestartet",
"LabelLimit": "Begrenzung", "LabelLimit": "Begrenzung",
"LabelLineSpacing": "Zeilenabstand", "LabelLineSpacing": "Zeilenabstand",
"LabelListenAgain": "Erneut anhören", "LabelListenAgain": "Erneut anhören",
@@ -438,6 +447,7 @@
"LabelLogLevelWarn": "Warnungen", "LabelLogLevelWarn": "Warnungen",
"LabelLookForNewEpisodesAfterDate": "Suche nach neuen Episoden nach diesem Datum", "LabelLookForNewEpisodesAfterDate": "Suche nach neuen Episoden nach diesem Datum",
"LabelLowestPriority": "Niedrigste Priorität", "LabelLowestPriority": "Niedrigste Priorität",
"LabelMatchConfidence": "Vertrauenswert",
"LabelMatchExistingUsersBy": "Zuordnen existierender Benutzer mit", "LabelMatchExistingUsersBy": "Zuordnen existierender Benutzer mit",
"LabelMatchExistingUsersByDescription": "Wird zum Verbinden vorhandener Benutzer verwendet. Sobald die Verbindung hergestellt ist, wird den Benutzern eine eindeutige ID vom SSO-Anbieter zugeordnet", "LabelMatchExistingUsersByDescription": "Wird zum Verbinden vorhandener Benutzer verwendet. Sobald die Verbindung hergestellt ist, wird den Benutzern eine eindeutige ID vom SSO-Anbieter zugeordnet",
"LabelMaxEpisodesToDownload": "Max. Anzahl an Episoden zum Herunterladen, 0 für unbegrenzte Episoden.", "LabelMaxEpisodesToDownload": "Max. Anzahl an Episoden zum Herunterladen, 0 für unbegrenzte Episoden.",
@@ -446,7 +456,7 @@
"LabelMaxEpisodesToKeepHelp": "0 setzt keine Begrenzung. Wenn eine neue Episode automatisch heruntergeladen wird, wird die älteste Episode gelöscht, wenn du mehr als X Episoden gespeichert hast. Es wird nur eine Episode pro neuem Download gelöscht.", "LabelMaxEpisodesToKeepHelp": "0 setzt keine Begrenzung. Wenn eine neue Episode automatisch heruntergeladen wird, wird die älteste Episode gelöscht, wenn du mehr als X Episoden gespeichert hast. Es wird nur eine Episode pro neuem Download gelöscht.",
"LabelMediaPlayer": "Mediaplayer", "LabelMediaPlayer": "Mediaplayer",
"LabelMediaType": "Medientyp", "LabelMediaType": "Medientyp",
"LabelMetaTag": "Meta Schlagwort", "LabelMetaTag": "Meta Tag",
"LabelMetaTags": "Meta Tags", "LabelMetaTags": "Meta Tags",
"LabelMetadataOrderOfPrecedenceDescription": "Höher priorisierte Quellen für Metadaten überschreiben Metadaten aus Quellen mit niedrigerer Priorität", "LabelMetadataOrderOfPrecedenceDescription": "Höher priorisierte Quellen für Metadaten überschreiben Metadaten aus Quellen mit niedrigerer Priorität",
"LabelMetadataProvider": "Metadatenanbieter", "LabelMetadataProvider": "Metadatenanbieter",
@@ -467,6 +477,7 @@
"LabelNewestAuthors": "Neueste Autoren", "LabelNewestAuthors": "Neueste Autoren",
"LabelNewestEpisodes": "Neueste Episoden", "LabelNewestEpisodes": "Neueste Episoden",
"LabelNextBackupDate": "Nächstes Sicherungsdatum", "LabelNextBackupDate": "Nächstes Sicherungsdatum",
"LabelNextChapters": "Das nächste Kapitel ist:",
"LabelNextScheduledRun": "Nächster planmäßiger Durchlauf", "LabelNextScheduledRun": "Nächster planmäßiger Durchlauf",
"LabelNoApiKeys": "Keine API-Schlüssel vorhanden", "LabelNoApiKeys": "Keine API-Schlüssel vorhanden",
"LabelNoCustomMetadataProviders": "Keine benutzerdefinierten Metadata Anbieter", "LabelNoCustomMetadataProviders": "Keine benutzerdefinierten Metadata Anbieter",
@@ -484,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Maximale Größe der Warteschlange für die Benachrichtigungsereignisse", "LabelNotificationsMaxQueueSize": "Maximale Größe der Warteschlange für die Benachrichtigungsereignisse",
"LabelNotificationsMaxQueueSizeHelp": "Es wird nur 1 Ereignis pro Sekunde ausgelöst. Ereignisse werden ignoriert, wenn die Warteschlange die maximale Größe erreicht hat. Dies verhindert Benachrichtigungsspamming.", "LabelNotificationsMaxQueueSizeHelp": "Es wird nur 1 Ereignis pro Sekunde ausgelöst. Ereignisse werden ignoriert, wenn die Warteschlange die maximale Größe erreicht hat. Dies verhindert Benachrichtigungsspamming.",
"LabelNumberOfBooks": "Anzahl der Hörbücher", "LabelNumberOfBooks": "Anzahl der Hörbücher",
"LabelNumberOfChapters": "Anzahl an Kapiteln:",
"LabelNumberOfEpisodes": "Anzahl der Episoden", "LabelNumberOfEpisodes": "Anzahl der Episoden",
"LabelOpenIDAdvancedPermsClaimDescription": "Name des OpenID-Claims, der erweiterte Berechtigungen für Benutzeraktionen innerhalb der Anwendung enthält, die auf Nicht-Admin-Rollen angewendet werden (<b>wenn konfiguriert</b>). Wenn der Claim in der Antwort fehlt, wird der Zugang zu ABS verweigert. Fehlt eine einzelne Option, wird sie als <code>false</code> behandelt. Stelle sicher, dass der Claim des Identitätsanbieters der erwarteten Struktur entspricht:", "LabelOpenIDAdvancedPermsClaimDescription": "Name des OpenID-Claims, der erweiterte Berechtigungen für Benutzeraktionen innerhalb der Anwendung enthält, die auf Nicht-Admin-Rollen angewendet werden (<b>wenn konfiguriert</b>). Wenn der Claim in der Antwort fehlt, wird der Zugang zu ABS verweigert. Fehlt eine einzelne Option, wird sie als <code>false</code> behandelt. Stelle sicher, dass der Claim des Identitätsanbieters der erwarteten Struktur entspricht:",
"LabelOpenIDClaims": "Lass die folgenden Optionen leer, um die erweiterte Zuweisung von Gruppen und Berechtigungen zu deaktivieren und automatisch die 'User'-Gruppe zuzuweisen.", "LabelOpenIDClaims": "Lass die folgenden Optionen leer, um die erweiterte Zuweisung von Gruppen und Berechtigungen zu deaktivieren und automatisch die 'User'-Gruppe zuzuweisen.",
@@ -528,7 +540,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 offen",
"LabelRSSFeedPreventIndexing": "Indizierung verhindern", "LabelRSSFeedPreventIndexing": "Indizierung verhindern",
"LabelRSSFeedSlug": "RSS-Feed-Schlagwort", "LabelRSSFeedSlug": "RSS-Feed-Schlagwort",
"LabelRSSFeedURL": "RSS-Feed-URL", "LabelRSSFeedURL": "RSS-Feed-URL",
@@ -626,6 +638,7 @@
"LabelStartTime": "Startzeit", "LabelStartTime": "Startzeit",
"LabelStarted": "Gestartet", "LabelStarted": "Gestartet",
"LabelStartedAt": "Gestartet am", "LabelStartedAt": "Gestartet am",
"LabelStartedDate": "Angefangen am {0}",
"LabelStatsAudioTracks": "Audiodateien", "LabelStatsAudioTracks": "Audiodateien",
"LabelStatsAuthors": "Autoren", "LabelStatsAuthors": "Autoren",
"LabelStatsBestDay": "Bester Tag", "LabelStatsBestDay": "Bester Tag",
@@ -655,6 +668,7 @@
"LabelTheme": "Farbschema", "LabelTheme": "Farbschema",
"LabelThemeDark": "Dunkel", "LabelThemeDark": "Dunkel",
"LabelThemeLight": "Hell", "LabelThemeLight": "Hell",
"LabelThemeSepia": "Sepia",
"LabelTimeBase": "Basiszeit", "LabelTimeBase": "Basiszeit",
"LabelTimeDurationXHours": "{0} Stunden", "LabelTimeDurationXHours": "{0} Stunden",
"LabelTimeDurationXMinutes": "{0} Minuten", "LabelTimeDurationXMinutes": "{0} Minuten",
@@ -722,7 +736,8 @@
"LabelYourProgress": "Fortschritt", "LabelYourProgress": "Fortschritt",
"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": "Stelle sicher, dass die ASIN aus der richtigen Audible Region verwendet wird, nicht Amazon.",
"MessageAuthenticationLegacyTokenWarning": "Alte API tokens werden in Zukunft entfernt. Benutze stattdessen <a href=\"/config/api-keys\">API Keys</a>.",
"MessageAuthenticationOIDCChangesRestart": "Nach dem Speichern muss 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.",
"MessageAuthenticationSecurityMessage": "Die Anmeldung wurde abgesichert. Benutzersitzungen werden getrennt, alle Benutzer müssen sich erneut anmelden.", "MessageAuthenticationSecurityMessage": "Die Anmeldung wurde abgesichert. Benutzersitzungen werden getrennt, alle Benutzer müssen sich erneut anmelden.",
"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.",
@@ -738,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Keine Ergebnisse für Filter \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Keine Ergebnisse für Filter \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Keine Ergebnisse für die Abfrage", "MessageBookshelfNoResultsForQuery": "Keine Ergebnisse für die Abfrage",
"MessageBookshelfNoSeries": "Keine Serien vorhanden", "MessageBookshelfNoSeries": "Keine Serien vorhanden",
"MessageBulkChapterPattern": "Wie viele Kapitel mit diesem Nummerierungs-Muster sollen hinzugefügt werden?",
"MessageChapterEndIsAfter": "Ungültige Kapitelendzeit: Kapitelende > Mediumende (Kapitelende liegt nach dem Ende des Mediums)", "MessageChapterEndIsAfter": "Ungültige Kapitelendzeit: Kapitelende > Mediumende (Kapitelende liegt nach dem Ende des Mediums)",
"MessageChapterErrorFirstNotZero": "Ungültige Kapitelstartzeit: Das erste Kapitel muss bei 0 beginnen", "MessageChapterErrorFirstNotZero": "Ungültige Kapitelstartzeit: Das erste Kapitel muss bei 0 beginnen",
"MessageChapterErrorStartGteDuration": "Ungültige Kapitelstartzeit: Kapitelanfang > Mediumlänge (Kapitelanfang liegt zeitlich nach dem Ende des Mediums -> Lösung: Kapitelanfang < Mediumlänge)", "MessageChapterErrorStartGteDuration": "Ungültige Kapitelstartzeit: Kapitelanfang > Mediumlänge (Kapitelanfang liegt zeitlich nach dem Ende des Mediums -> Lösung: Kapitelanfang < Mediumlänge)",
@@ -800,6 +816,8 @@
"MessageFeedURLWillBe": "Feed-URL wird {0} sein", "MessageFeedURLWillBe": "Feed-URL wird {0} sein",
"MessageFetching": "Wird abgerufen …", "MessageFetching": "Wird abgerufen …",
"MessageForceReScanDescription": "Durchsucht alle Dateien erneut, wie bei einem frischen Scan. ID3-Tags von Audiodateien, OPF-Dateien und Textdateien werden neu durchsucht.", "MessageForceReScanDescription": "Durchsucht alle Dateien erneut, wie bei einem frischen Scan. ID3-Tags von Audiodateien, OPF-Dateien und Textdateien werden neu durchsucht.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} </strong> auf {1} gehört",
"MessageHeatmapNoListeningSessions": "Keine Hörsitzungen am {0}",
"MessageImportantNotice": "Wichtiger Hinweis!", "MessageImportantNotice": "Wichtiger Hinweis!",
"MessageInsertChapterBelow": "Kapitel unten einfügen", "MessageInsertChapterBelow": "Kapitel unten einfügen",
"MessageInvalidAsin": "Ungültige ASIN", "MessageInvalidAsin": "Ungültige ASIN",
@@ -939,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Wird ausgeführt wenn automatische Downloads von Episoden wegen zu vielen fehlgeschlagenen Versuchen deaktiviert sind", "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", "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",
"PlaceholderBulkChapterInput": "Kapitelbezeichnung eingeben oder Nummerierung verwenden (z.B. 'Episode 1', 'Kapitel 10', '1.')",
"PlaceholderNewCollection": "Neuer Sammlungsname", "PlaceholderNewCollection": "Neuer Sammlungsname",
"PlaceholderNewFolderPath": "Neuer Ordnerpfad", "PlaceholderNewFolderPath": "Neuer Ordnerpfad",
"PlaceholderNewPlaylist": "Neuer Wiedergabelistenname", "PlaceholderNewPlaylist": "Neuer Wiedergabelistenname",
@@ -992,11 +1011,15 @@
"ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden", "ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden",
"ToastBookmarkCreateSuccess": "Lesezeichen hinzugefügt", "ToastBookmarkCreateSuccess": "Lesezeichen hinzugefügt",
"ToastBookmarkRemoveSuccess": "Lesezeichen entfernt", "ToastBookmarkRemoveSuccess": "Lesezeichen entfernt",
"ToastBulkChapterInvalidCount": "Gebe eine Zahl zwischen 1 und 150 ein",
"ToastCachePurgeFailed": "Cache leeren fehlgeschlagen", "ToastCachePurgeFailed": "Cache leeren fehlgeschlagen",
"ToastCachePurgeSuccess": "Cache geleert", "ToastCachePurgeSuccess": "Cache geleert",
"ToastChapterLocked": "Kapitel ist freigegeben.",
"ToastChapterStartTimeAdjusted": "Kapitelbeginn um {0} Sekunden angepasst",
"ToastChaptersAllLocked": "Alle Kapitel sind gesperrt. Gebe einige Kapitel frei um die Zeiten anzupassen.",
"ToastChaptersHaveErrors": "Kapitel sind fehlerhaft", "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.", "ToastChaptersInvalidShiftAmountLast": "Die Verschiebung ist nicht möglich, da die Startzeit des letzten Kapitels über die Gesamtdauer dieses Hörbuchs hinausgehen würde.",
"ToastChaptersInvalidShiftAmountStart": "Ungültige Höhe der Verschiebung. Das erste Kapitel hätte eine Länge von Null oder eine negative Länge und würde vom zweiten Kapitel überschrieben werden. Erhöhen Sie die Startdauer des zweiten Kapitels.", "ToastChaptersInvalidShiftAmountStart": "Ungültige Höhe der Verschiebung. Das erste Kapitel hätte eine Länge von Null oder eine negative Länge und würde vom zweiten Kapitel überschrieben werden. Erhöhe die Startdauer des zweiten Kapitels.",
"ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen", "ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen",
"ToastChaptersRemoved": "Kapitel entfernt", "ToastChaptersRemoved": "Kapitel entfernt",
"ToastChaptersUpdated": "Kapitel aktualisiert", "ToastChaptersUpdated": "Kapitel aktualisiert",
@@ -1027,6 +1050,7 @@
"ToastInvalidImageUrl": "Ungültiger Bild URL", "ToastInvalidImageUrl": "Ungültiger Bild URL",
"ToastInvalidMaxEpisodesToDownload": "Ungültige Max. Anzahl an Episoden zum Herunterladen", "ToastInvalidMaxEpisodesToDownload": "Ungültige Max. Anzahl an Episoden zum Herunterladen",
"ToastInvalidUrl": "Ungültiger URL", "ToastInvalidUrl": "Ungültiger URL",
"ToastInvalidUrls": "Eine oder mehrere URLs sind ungültig",
"ToastItemCoverUpdateSuccess": "Titelbild aktualisiert", "ToastItemCoverUpdateSuccess": "Titelbild aktualisiert",
"ToastItemDeletedFailed": "Fehler beim löschen des Artikels", "ToastItemDeletedFailed": "Fehler beim löschen des Artikels",
"ToastItemDeletedSuccess": "Artikel gelöscht", "ToastItemDeletedSuccess": "Artikel gelöscht",
@@ -1076,6 +1100,7 @@
"ToastPlaylistUpdateSuccess": "Wiedergabeliste aktualisiert", "ToastPlaylistUpdateSuccess": "Wiedergabeliste aktualisiert",
"ToastPodcastCreateFailed": "Podcast konnte nicht erstellt werden", "ToastPodcastCreateFailed": "Podcast konnte nicht erstellt werden",
"ToastPodcastCreateSuccess": "Podcast erstellt", "ToastPodcastCreateSuccess": "Podcast erstellt",
"ToastPodcastEpisodeUpdated": "Podcast-Folge aktualisiert",
"ToastPodcastGetFeedFailed": "Fehler beim abrufen des Podcast Feeds", "ToastPodcastGetFeedFailed": "Fehler beim abrufen des Podcast Feeds",
"ToastPodcastNoEpisodesInFeed": "Keine Episoden in RSS Feed gefunden", "ToastPodcastNoEpisodesInFeed": "Keine Episoden in RSS Feed gefunden",
"ToastPodcastNoRssFeed": "Podcast enthält keinen RSS Feed", "ToastPodcastNoRssFeed": "Podcast enthält keinen RSS Feed",
@@ -1126,5 +1151,13 @@
"ToastUserPasswordChangeSuccess": "Passwort erfolgreich verändert", "ToastUserPasswordChangeSuccess": "Passwort erfolgreich verändert",
"ToastUserPasswordMismatch": "Passwörter stimmen nicht überein", "ToastUserPasswordMismatch": "Passwörter stimmen nicht überein",
"ToastUserPasswordMustChange": "Neues Passwort muss sich von altem Passwort unterscheiden", "ToastUserPasswordMustChange": "Neues Passwort muss sich von altem Passwort unterscheiden",
"ToastUserRootRequireName": "Root Benutzername muss angegeben werden" "ToastUserRootRequireName": "Root Benutzername muss angegeben werden",
"TooltipAddChapters": "Kapitel hinzufügen",
"TooltipAddOneSecond": "1 Sekunde hinzufügen",
"TooltipAdjustChapterStart": "Klicke um die Startzeit anzupassen",
"TooltipLockAllChapters": "Alle Kapitel sperren",
"TooltipLockChapter": "Kapitel sperren (Shift+Klick für mehrere)",
"TooltipSubtractOneSecond": "1 Sekunde abziehen",
"TooltipUnlockAllChapters": "Alle Kapitel freigeben",
"TooltipUnlockChapter": "Kapitel freigeben (Shift+Klick für mehrere)"
} }
+34 -1
View File
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Audiobook File Management Tools", "HeaderAudiobookTools": "Audiobook File Management Tools",
"HeaderAuthentication": "Authentication", "HeaderAuthentication": "Authentication",
"HeaderBackups": "Backups", "HeaderBackups": "Backups",
"HeaderBulkChapterModal": "Add Multiple Chapters",
"HeaderChangePassword": "Change Password", "HeaderChangePassword": "Change Password",
"HeaderChapters": "Chapters", "HeaderChapters": "Chapters",
"HeaderChooseAFolder": "Choose a Folder", "HeaderChooseAFolder": "Choose a Folder",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Experimental Features", "HeaderSettingsExperimental": "Experimental Features",
"HeaderSettingsGeneral": "General", "HeaderSettingsGeneral": "General",
"HeaderSettingsScanner": "Scanner", "HeaderSettingsScanner": "Scanner",
"HeaderSettingsSecurity": "Security",
"HeaderSettingsWebClient": "Web Client", "HeaderSettingsWebClient": "Web Client",
"HeaderSleepTimer": "Sleep Timer", "HeaderSleepTimer": "Sleep Timer",
"HeaderStatsLargestItems": "Largest Items", "HeaderStatsLargestItems": "Largest Items",
@@ -293,6 +295,7 @@
"LabelContinueListening": "Continue Listening", "LabelContinueListening": "Continue Listening",
"LabelContinueReading": "Continue Reading", "LabelContinueReading": "Continue Reading",
"LabelContinueSeries": "Continue Series", "LabelContinueSeries": "Continue Series",
"LabelCorsAllowed": "Allowed CORS Origins",
"LabelCover": "Cover", "LabelCover": "Cover",
"LabelCoverImageURL": "Cover Image URL", "LabelCoverImageURL": "Cover Image URL",
"LabelCoverProvider": "Cover Provider", "LabelCoverProvider": "Cover Provider",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)", "LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
"LabelDescription": "Description", "LabelDescription": "Description",
"LabelDeselectAll": "Deselect All", "LabelDeselectAll": "Deselect All",
"LabelDetectedPattern": "Detected pattern:",
"LabelDevice": "Device", "LabelDevice": "Device",
"LabelDeviceInfo": "Device Info", "LabelDeviceInfo": "Device Info",
"LabelDeviceIsAvailableTo": "Device is available to...", "LabelDeviceIsAvailableTo": "Device is available to...",
@@ -374,6 +378,7 @@
"LabelFilterByUser": "Filter by User", "LabelFilterByUser": "Filter by User",
"LabelFindEpisodes": "Find Episodes", "LabelFindEpisodes": "Find Episodes",
"LabelFinished": "Finished", "LabelFinished": "Finished",
"LabelFinishedDate": "Finished {0}",
"LabelFolder": "Folder", "LabelFolder": "Folder",
"LabelFolders": "Folders", "LabelFolders": "Folders",
"LabelFontBold": "Bold", "LabelFontBold": "Bold",
@@ -418,6 +423,7 @@
"LabelLanguages": "Languages", "LabelLanguages": "Languages",
"LabelLastBookAdded": "Last Book Added", "LabelLastBookAdded": "Last Book Added",
"LabelLastBookUpdated": "Last Book Updated", "LabelLastBookUpdated": "Last Book Updated",
"LabelLastProgressDate": "Last progress: {0}",
"LabelLastSeen": "Last Seen", "LabelLastSeen": "Last Seen",
"LabelLastTime": "Last Time", "LabelLastTime": "Last Time",
"LabelLastUpdate": "Last Update", "LabelLastUpdate": "Last Update",
@@ -430,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "No {0}", "LabelLibraryFilterSublistEmpty": "No {0}",
"LabelLibraryItem": "Library Item", "LabelLibraryItem": "Library Item",
"LabelLibraryName": "Library Name", "LabelLibraryName": "Library Name",
"LabelLibrarySortByProgress": "Progress: Last Updated",
"LabelLibrarySortByProgressFinished": "Progress: Finished",
"LabelLibrarySortByProgressStarted": "Progress: Started",
"LabelLimit": "Limit", "LabelLimit": "Limit",
"LabelLineSpacing": "Line spacing", "LabelLineSpacing": "Line spacing",
"LabelListenAgain": "Listen Again", "LabelListenAgain": "Listen Again",
@@ -468,6 +477,7 @@
"LabelNewestAuthors": "Newest Authors", "LabelNewestAuthors": "Newest Authors",
"LabelNewestEpisodes": "Newest Episodes", "LabelNewestEpisodes": "Newest Episodes",
"LabelNextBackupDate": "Next backup date", "LabelNextBackupDate": "Next backup date",
"LabelNextChapters": "Next chapters will be:",
"LabelNextScheduledRun": "Next scheduled run", "LabelNextScheduledRun": "Next scheduled run",
"LabelNoApiKeys": "No API keys", "LabelNoApiKeys": "No API keys",
"LabelNoCustomMetadataProviders": "No custom metadata providers", "LabelNoCustomMetadataProviders": "No custom metadata providers",
@@ -485,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Max queue size for notification events", "LabelNotificationsMaxQueueSize": "Max queue size for notification events",
"LabelNotificationsMaxQueueSizeHelp": "Events are limited to firing 1 per second. Events will be ignored if the queue is at max size. This prevents notification spamming.", "LabelNotificationsMaxQueueSizeHelp": "Events are limited to firing 1 per second. Events will be ignored if the queue is at max size. This prevents notification spamming.",
"LabelNumberOfBooks": "Number of Books", "LabelNumberOfBooks": "Number of Books",
"LabelNumberOfChapters": "Number of chapters:",
"LabelNumberOfEpisodes": "# of Episodes", "LabelNumberOfEpisodes": "# of Episodes",
"LabelOpenIDAdvancedPermsClaimDescription": "Name of the OpenID claim that contains advanced permissions for user actions within the application which will apply to non-admin roles (<b>if configured</b>). If the claim is missing from the response, access to ABS will be denied. If a single option is missing, it will be treated as <code>false</code>. Ensure the identity provider's claim matches the expected structure:", "LabelOpenIDAdvancedPermsClaimDescription": "Name of the OpenID claim that contains advanced permissions for user actions within the application which will apply to non-admin roles (<b>if configured</b>). If the claim is missing from the response, access to ABS will be denied. If a single option is missing, it will be treated as <code>false</code>. Ensure the identity provider's claim matches the expected structure:",
"LabelOpenIDClaims": "Leave the following options empty to disable advanced group and permissions assignment, automatically assigning 'User' group then.", "LabelOpenIDClaims": "Leave the following options empty to disable advanced group and permissions assignment, automatically assigning 'User' group then.",
@@ -627,6 +638,7 @@
"LabelStartTime": "Start Time", "LabelStartTime": "Start Time",
"LabelStarted": "Started", "LabelStarted": "Started",
"LabelStartedAt": "Started At", "LabelStartedAt": "Started At",
"LabelStartedDate": "Started {0}",
"LabelStatsAudioTracks": "Audio Tracks", "LabelStatsAudioTracks": "Audio Tracks",
"LabelStatsAuthors": "Authors", "LabelStatsAuthors": "Authors",
"LabelStatsBestDay": "Best Day", "LabelStatsBestDay": "Best Day",
@@ -656,6 +668,7 @@
"LabelTheme": "Theme", "LabelTheme": "Theme",
"LabelThemeDark": "Dark", "LabelThemeDark": "Dark",
"LabelThemeLight": "Light", "LabelThemeLight": "Light",
"LabelThemeSepia": "Sepia",
"LabelTimeBase": "Time Base", "LabelTimeBase": "Time Base",
"LabelTimeDurationXHours": "{0} hours", "LabelTimeDurationXHours": "{0} hours",
"LabelTimeDurationXMinutes": "{0} minutes", "LabelTimeDurationXMinutes": "{0} minutes",
@@ -740,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "No results for filter \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "No results for filter \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "No results for query", "MessageBookshelfNoResultsForQuery": "No results for query",
"MessageBookshelfNoSeries": "You have no series", "MessageBookshelfNoSeries": "You have no series",
"MessageBulkChapterPattern": "How many chapters would you like to add with this numbering pattern?",
"MessageChapterEndIsAfter": "Chapter end is after the end of your audiobook", "MessageChapterEndIsAfter": "Chapter end is after the end of your audiobook",
"MessageChapterErrorFirstNotZero": "First chapter must start at 0", "MessageChapterErrorFirstNotZero": "First chapter must start at 0",
"MessageChapterErrorStartGteDuration": "Invalid start time must be less than audiobook duration", "MessageChapterErrorStartGteDuration": "Invalid start time must be less than audiobook duration",
@@ -802,6 +816,8 @@
"MessageFeedURLWillBe": "Feed URL will be {0}", "MessageFeedURLWillBe": "Feed URL will be {0}",
"MessageFetching": "Fetching...", "MessageFetching": "Fetching...",
"MessageForceReScanDescription": "will scan all files again like a fresh scan. Audio file ID3 tags, OPF files, and text files will be scanned as new.", "MessageForceReScanDescription": "will scan all files again like a fresh scan. Audio file ID3 tags, OPF files, and text files will be scanned as new.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} listening</strong> on {1}",
"MessageHeatmapNoListeningSessions": "No listening sessions on {0}",
"MessageImportantNotice": "Important Notice!", "MessageImportantNotice": "Important Notice!",
"MessageInsertChapterBelow": "Insert chapter below", "MessageInsertChapterBelow": "Insert chapter below",
"MessageInvalidAsin": "Invalid ASIN", "MessageInvalidAsin": "Invalid ASIN",
@@ -941,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Triggered when automatic episode downloads are disabled due to too many failed attempts", "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", "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",
"PlaceholderBulkChapterInput": "Enter chapter title or use numbering (e.g., 'Episode 1', 'Chapter 10', '1.')",
"PlaceholderNewCollection": "New collection name", "PlaceholderNewCollection": "New collection name",
"PlaceholderNewFolderPath": "New folder path", "PlaceholderNewFolderPath": "New folder path",
"PlaceholderNewPlaylist": "New playlist name", "PlaceholderNewPlaylist": "New playlist name",
@@ -994,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Failed to create bookmark", "ToastBookmarkCreateFailed": "Failed to create bookmark",
"ToastBookmarkCreateSuccess": "Bookmark added", "ToastBookmarkCreateSuccess": "Bookmark added",
"ToastBookmarkRemoveSuccess": "Bookmark removed", "ToastBookmarkRemoveSuccess": "Bookmark removed",
"ToastBulkChapterInvalidCount": "Enter a number between 1 and 150",
"ToastCachePurgeFailed": "Failed to purge cache", "ToastCachePurgeFailed": "Failed to purge cache",
"ToastCachePurgeSuccess": "Cache purged successfully", "ToastCachePurgeSuccess": "Cache purged successfully",
"ToastChapterLocked": "Chapter is locked.",
"ToastChapterStartTimeAdjusted": "Chapter start time adjusted by {0} seconds",
"ToastChaptersAllLocked": "All chapters are locked. Unlock some chapters to shift their times.",
"ToastChaptersHaveErrors": "Chapters have errors", "ToastChaptersHaveErrors": "Chapters have errors",
"ToastChaptersInvalidShiftAmountLast": "Invalid shift amount. The last chapter start time would extend beyond the duration of this audiobook.", "ToastChaptersInvalidShiftAmountLast": "Invalid shift amount. The last chapter start time would extend beyond the duration of this audiobook.",
"ToastChaptersInvalidShiftAmountStart": "Invalid shift amount. The first chapter would have zero or negative length and would be overwritten by the second chapter. Increase the start duration of second chapter.", "ToastChaptersInvalidShiftAmountStart": "Invalid shift amount. The first chapter would have zero or negative length and would be overwritten by the second chapter. Increase the start duration of second chapter.",
@@ -1005,6 +1026,8 @@
"ToastCollectionItemsAddFailed": "Item(s) added to collection failed", "ToastCollectionItemsAddFailed": "Item(s) added to collection failed",
"ToastCollectionRemoveSuccess": "Collection removed", "ToastCollectionRemoveSuccess": "Collection removed",
"ToastCollectionUpdateSuccess": "Collection updated", "ToastCollectionUpdateSuccess": "Collection updated",
"ToastConnectionNotAvailable": "Connection not available. Please try again later",
"ToastCoverSearchFailed": "Cover search failed",
"ToastCoverUpdateFailed": "Cover update failed", "ToastCoverUpdateFailed": "Cover update failed",
"ToastDateTimeInvalidOrIncomplete": "Date and time is invalid or incomplete", "ToastDateTimeInvalidOrIncomplete": "Date and time is invalid or incomplete",
"ToastDeleteFileFailed": "Failed to delete file", "ToastDeleteFileFailed": "Failed to delete file",
@@ -1029,6 +1052,7 @@
"ToastInvalidImageUrl": "Invalid image URL", "ToastInvalidImageUrl": "Invalid image URL",
"ToastInvalidMaxEpisodesToDownload": "Invalid max episodes to download", "ToastInvalidMaxEpisodesToDownload": "Invalid max episodes to download",
"ToastInvalidUrl": "Invalid URL", "ToastInvalidUrl": "Invalid URL",
"ToastInvalidUrls": "One or more URLs are invalid",
"ToastItemCoverUpdateSuccess": "Item cover updated", "ToastItemCoverUpdateSuccess": "Item cover updated",
"ToastItemDeletedFailed": "Failed to delete item", "ToastItemDeletedFailed": "Failed to delete item",
"ToastItemDeletedSuccess": "Deleted item", "ToastItemDeletedSuccess": "Deleted item",
@@ -1078,6 +1102,7 @@
"ToastPlaylistUpdateSuccess": "Playlist updated", "ToastPlaylistUpdateSuccess": "Playlist updated",
"ToastPodcastCreateFailed": "Failed to create podcast", "ToastPodcastCreateFailed": "Failed to create podcast",
"ToastPodcastCreateSuccess": "Podcast created successfully", "ToastPodcastCreateSuccess": "Podcast created successfully",
"ToastPodcastEpisodeUpdated": "Episode updated",
"ToastPodcastGetFeedFailed": "Failed to get podcast feed", "ToastPodcastGetFeedFailed": "Failed to get podcast feed",
"ToastPodcastNoEpisodesInFeed": "No episodes found in RSS feed", "ToastPodcastNoEpisodesInFeed": "No episodes found in RSS feed",
"ToastPodcastNoRssFeed": "Podcast does not have an RSS feed", "ToastPodcastNoRssFeed": "Podcast does not have an RSS feed",
@@ -1128,5 +1153,13 @@
"ToastUserPasswordChangeSuccess": "Password changed successfully", "ToastUserPasswordChangeSuccess": "Password changed successfully",
"ToastUserPasswordMismatch": "Passwords do not match", "ToastUserPasswordMismatch": "Passwords do not match",
"ToastUserPasswordMustChange": "New password cannot match old password", "ToastUserPasswordMustChange": "New password cannot match old password",
"ToastUserRootRequireName": "Must enter a root username" "ToastUserRootRequireName": "Must enter a root username",
"TooltipAddChapters": "Add chapter(s)",
"TooltipAddOneSecond": "Add 1 second",
"TooltipAdjustChapterStart": "Click to adjust start time",
"TooltipLockAllChapters": "Lock all chapters",
"TooltipLockChapter": "Lock chapter (Shift+click for range)",
"TooltipSubtractOneSecond": "Subtract 1 second",
"TooltipUnlockAllChapters": "Unlock all chapters",
"TooltipUnlockChapter": "Unlock chapter (Shift+click for range)"
} }
+22 -1
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Añadir", "ButtonAdd": "Añadir",
"ButtonAddApiKey": "Añadir clave API",
"ButtonAddChapters": "Añadir capítulos", "ButtonAddChapters": "Añadir capítulos",
"ButtonAddDevice": "Añadir dispositivo", "ButtonAddDevice": "Añadir dispositivo",
"ButtonAddLibrary": "Añadir biblioteca", "ButtonAddLibrary": "Añadir biblioteca",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Elegir una carpeta", "ButtonChooseAFolder": "Elegir una carpeta",
"ButtonChooseFiles": "Elegir archivos", "ButtonChooseFiles": "Elegir archivos",
"ButtonClearFilter": "Quitar filtros", "ButtonClearFilter": "Quitar filtros",
"ButtonClose": "Cerrar",
"ButtonCloseFeed": "Cerrar suministro", "ButtonCloseFeed": "Cerrar suministro",
"ButtonCloseSession": "Cerrar la sesión abierta", "ButtonCloseSession": "Cerrar la sesión abierta",
"ButtonCollections": "Colecciones", "ButtonCollections": "Colecciones",
@@ -119,11 +121,13 @@
"HeaderAccount": "Cuenta", "HeaderAccount": "Cuenta",
"HeaderAddCustomMetadataProvider": "Añadir proveedor de metadatos personalizado", "HeaderAddCustomMetadataProvider": "Añadir proveedor de metadatos personalizado",
"HeaderAdvanced": "Avanzado", "HeaderAdvanced": "Avanzado",
"HeaderApiKeys": "Claves API",
"HeaderAppriseNotificationSettings": "Configuración de notificaciones de Apprise", "HeaderAppriseNotificationSettings": "Configuración de notificaciones de Apprise",
"HeaderAudioTracks": "Pistas de audio", "HeaderAudioTracks": "Pistas de audio",
"HeaderAudiobookTools": "Herramientas de Gestión de Archivos de Audiolibro", "HeaderAudiobookTools": "Herramientas de Gestión de Archivos de Audiolibro",
"HeaderAuthentication": "Autenticación", "HeaderAuthentication": "Autenticación",
"HeaderBackups": "Respaldos", "HeaderBackups": "Respaldos",
"HeaderBulkChapterModal": "Añadir Múltiples Capítulos",
"HeaderChangePassword": "Cambiar contraseña", "HeaderChangePassword": "Cambiar contraseña",
"HeaderChapters": "Capítulos", "HeaderChapters": "Capítulos",
"HeaderChooseAFolder": "Escoger una Carpeta", "HeaderChooseAFolder": "Escoger una Carpeta",
@@ -162,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Orden de precedencia de metadatos", "HeaderMetadataOrderOfPrecedence": "Orden de precedencia de metadatos",
"HeaderMetadataToEmbed": "Metadatos para Insertar", "HeaderMetadataToEmbed": "Metadatos para Insertar",
"HeaderNewAccount": "Cuenta nueva", "HeaderNewAccount": "Cuenta nueva",
"HeaderNewApiKey": "Nueva clave API",
"HeaderNewLibrary": "Biblioteca nueva", "HeaderNewLibrary": "Biblioteca nueva",
"HeaderNotificationCreate": "Crear notificación", "HeaderNotificationCreate": "Crear notificación",
"HeaderNotificationUpdate": "Notificación de actualización", "HeaderNotificationUpdate": "Notificación de actualización",
@@ -195,6 +200,7 @@
"HeaderSettingsExperimental": "Funcionalidades experimentales", "HeaderSettingsExperimental": "Funcionalidades experimentales",
"HeaderSettingsGeneral": "Generales", "HeaderSettingsGeneral": "Generales",
"HeaderSettingsScanner": "Escáner", "HeaderSettingsScanner": "Escáner",
"HeaderSettingsSecurity": "Seguridad",
"HeaderSettingsWebClient": "Cliente web", "HeaderSettingsWebClient": "Cliente web",
"HeaderSleepTimer": "Temporizador de apagado", "HeaderSleepTimer": "Temporizador de apagado",
"HeaderStatsLargestItems": "Elementos más grandes", "HeaderStatsLargestItems": "Elementos más grandes",
@@ -206,6 +212,7 @@
"HeaderTableOfContents": "Sumario", "HeaderTableOfContents": "Sumario",
"HeaderTools": "Herramientas", "HeaderTools": "Herramientas",
"HeaderUpdateAccount": "Actualizar cuenta", "HeaderUpdateAccount": "Actualizar cuenta",
"HeaderUpdateApiKey": "Actualizar clave API",
"HeaderUpdateAuthor": "Actualizar autor", "HeaderUpdateAuthor": "Actualizar autor",
"HeaderUpdateDetails": "Actualizar detalles", "HeaderUpdateDetails": "Actualizar detalles",
"HeaderUpdateLibrary": "Actualizar biblioteca", "HeaderUpdateLibrary": "Actualizar biblioteca",
@@ -297,6 +304,7 @@
"LabelDeleteFromFileSystemCheckbox": "Eliminar del sistema de archivos (desmarque para quitar de la base de datos solamente)", "LabelDeleteFromFileSystemCheckbox": "Eliminar del sistema de archivos (desmarque para quitar de la base de datos solamente)",
"LabelDescription": "Descripción", "LabelDescription": "Descripción",
"LabelDeselectAll": "Deseleccionar Todos", "LabelDeselectAll": "Deseleccionar Todos",
"LabelDetectedPattern": "Patrón detectado:",
"LabelDevice": "Dispositivo", "LabelDevice": "Dispositivo",
"LabelDeviceInfo": "Información del dispositivo", "LabelDeviceInfo": "Información del dispositivo",
"LabelDeviceIsAvailableTo": "El dispositivo está disponible para...", "LabelDeviceIsAvailableTo": "El dispositivo está disponible para...",
@@ -454,6 +462,7 @@
"LabelNewestAuthors": "Autores más nuevos", "LabelNewestAuthors": "Autores más nuevos",
"LabelNewestEpisodes": "Episodios más nuevos", "LabelNewestEpisodes": "Episodios más nuevos",
"LabelNextBackupDate": "Fecha del siguiente respaldo", "LabelNextBackupDate": "Fecha del siguiente respaldo",
"LabelNextChapters": "Los próximos capítulos serán:",
"LabelNextScheduledRun": "Próxima ejecución programada", "LabelNextScheduledRun": "Próxima ejecución programada",
"LabelNoCustomMetadataProviders": "Sin proveedores de metadatos personalizados", "LabelNoCustomMetadataProviders": "Sin proveedores de metadatos personalizados",
"LabelNoEpisodesSelected": "Ningún Episodio Seleccionado", "LabelNoEpisodesSelected": "Ningún Episodio Seleccionado",
@@ -470,6 +479,7 @@
"LabelNotificationsMaxQueueSize": "Tamaño máximo de la cola de notificaciones", "LabelNotificationsMaxQueueSize": "Tamaño máximo de la cola de notificaciones",
"LabelNotificationsMaxQueueSizeHelp": "Las notificaciones están limitadas a 1 por segundo. Las notificaciones serán ignoradas si llegan al numero máximo de cola para prevenir spam de eventos.", "LabelNotificationsMaxQueueSizeHelp": "Las notificaciones están limitadas a 1 por segundo. Las notificaciones serán ignoradas si llegan al numero máximo de cola para prevenir spam de eventos.",
"LabelNumberOfBooks": "Número de libros", "LabelNumberOfBooks": "Número de libros",
"LabelNumberOfChapters": "Número de capítulos:",
"LabelNumberOfEpisodes": "N.º de episodios", "LabelNumberOfEpisodes": "N.º de episodios",
"LabelOpenIDAdvancedPermsClaimDescription": "Nombre de la notificación de OpenID que contiene permisos avanzados para acciones de usuario dentro de la aplicación que se aplicarán a roles que no sean de administrador (<b>si están configurados</b>). Si el reclamo no aparece en la respuesta, se denegará el acceso a ABS. Si falta una sola opción, se tratará como <code>falsa</code>. Asegúrese de que la notificación del proveedor de identidades coincida con la estructura esperada:", "LabelOpenIDAdvancedPermsClaimDescription": "Nombre de la notificación de OpenID que contiene permisos avanzados para acciones de usuario dentro de la aplicación que se aplicarán a roles que no sean de administrador (<b>si están configurados</b>). Si el reclamo no aparece en la respuesta, se denegará el acceso a ABS. Si falta una sola opción, se tratará como <code>falsa</code>. Asegúrese de que la notificación del proveedor de identidades coincida con la estructura esperada:",
"LabelOpenIDClaims": "Deje las siguientes opciones vacías para desactivar la asignación avanzada de grupos y permisos, lo que asignaría de manera automática al grupo «Usuario».", "LabelOpenIDClaims": "Deje las siguientes opciones vacías para desactivar la asignación avanzada de grupos y permisos, lo que asignaría de manera automática al grupo «Usuario».",
@@ -722,6 +732,7 @@
"MessageBookshelfNoResultsForFilter": "El filtro «{0}: {1}» no produjo ningún resultado", "MessageBookshelfNoResultsForFilter": "El filtro «{0}: {1}» no produjo ningún resultado",
"MessageBookshelfNoResultsForQuery": "No hay resultados para la consulta", "MessageBookshelfNoResultsForQuery": "No hay resultados para la consulta",
"MessageBookshelfNoSeries": "No tiene ninguna serie", "MessageBookshelfNoSeries": "No tiene ninguna serie",
"MessageBulkChapterPattern": "¿Cuántos capítulos desea añadir con este patrón de numeración?",
"MessageChapterEndIsAfter": "El final del capítulo es después del final de tu audiolibro", "MessageChapterEndIsAfter": "El final del capítulo es después del final de tu audiolibro",
"MessageChapterErrorFirstNotZero": "El primer capítulo debe iniciar en 0", "MessageChapterErrorFirstNotZero": "El primer capítulo debe iniciar en 0",
"MessageChapterErrorStartGteDuration": "El tiempo de inicio no es válido: debe ser inferior a la duración del audiolibro", "MessageChapterErrorStartGteDuration": "El tiempo de inicio no es válido: debe ser inferior a la duración del audiolibro",
@@ -919,6 +930,7 @@
"NotificationOnBackupFailedDescription": "Se activa cuando falla una copia de seguridad", "NotificationOnBackupFailedDescription": "Se activa cuando falla una copia de seguridad",
"NotificationOnEpisodeDownloadedDescription": "Se activa cuando se descarga automáticamente un episodio de un podcast", "NotificationOnEpisodeDownloadedDescription": "Se activa cuando se descarga automáticamente un episodio de un podcast",
"NotificationOnTestDescription": "Evento para probar el sistema de notificaciones", "NotificationOnTestDescription": "Evento para probar el sistema de notificaciones",
"PlaceholderBulkChapterInput": "Ingrese título de capítulo o use numeración (ej. 'Episodio 1', 'Capítulo 10', '1.')",
"PlaceholderNewCollection": "Nuevo nombre de la colección", "PlaceholderNewCollection": "Nuevo nombre de la colección",
"PlaceholderNewFolderPath": "Nueva ruta de carpeta", "PlaceholderNewFolderPath": "Nueva ruta de carpeta",
"PlaceholderNewPlaylist": "Nuevo nombre de la lista de reproducción", "PlaceholderNewPlaylist": "Nuevo nombre de la lista de reproducción",
@@ -972,8 +984,10 @@
"ToastBookmarkCreateFailed": "No se pudo crear el marcador", "ToastBookmarkCreateFailed": "No se pudo crear el marcador",
"ToastBookmarkCreateSuccess": "Marcador añadido", "ToastBookmarkCreateSuccess": "Marcador añadido",
"ToastBookmarkRemoveSuccess": "Marcador eliminado", "ToastBookmarkRemoveSuccess": "Marcador eliminado",
"ToastBulkChapterInvalidCount": "Por favor ingrese un número válido entre 1 y 150",
"ToastCachePurgeFailed": "No se pudo purgar la antememoria", "ToastCachePurgeFailed": "No se pudo purgar la antememoria",
"ToastCachePurgeSuccess": "Se purgó la antememoria correctamente", "ToastCachePurgeSuccess": "Se purgó la antememoria correctamente",
"ToastChaptersAllLocked": "Todos los capítulos están bloqueados. Desbloquee algunos capítulos para cambiar sus tiempos.",
"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.", "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.",
@@ -1103,5 +1117,12 @@
"ToastUserPasswordChangeSuccess": "Contraseña modificada correctamente", "ToastUserPasswordChangeSuccess": "Contraseña modificada correctamente",
"ToastUserPasswordMismatch": "No coinciden las contraseñas", "ToastUserPasswordMismatch": "No coinciden las contraseñas",
"ToastUserPasswordMustChange": "La nueva contraseña no puede ser igual que la anterior", "ToastUserPasswordMustChange": "La nueva contraseña no puede ser igual que la anterior",
"ToastUserRootRequireName": "Debe introducir un nombre de usuario administrativo" "ToastUserRootRequireName": "Debe introducir un nombre de usuario administrativo",
"TooltipAddChapters": "Añadir capítulo(s)",
"TooltipAddOneSecond": "Añadir 1 segundo",
"TooltipLockAllChapters": "Bloquear todos los capítulos",
"TooltipLockChapter": "Bloquear capítulo (Mayús+clic para rango)",
"TooltipSubtractOneSecond": "Restar 1 segundo",
"TooltipUnlockAllChapters": "Desbloquear todos los capítulos",
"TooltipUnlockChapter": "Desbloquear capítulo (Mayús+clic para rango)"
} }
+41 -35
View File
@@ -11,7 +11,7 @@
"ButtonAuthors": "Autorid", "ButtonAuthors": "Autorid",
"ButtonBack": "Tagasi", "ButtonBack": "Tagasi",
"ButtonBrowseForFolder": "Sirvi kausta", "ButtonBrowseForFolder": "Sirvi kausta",
"ButtonCancel": "Tühista", "ButtonCancel": "Katkesta",
"ButtonCancelEncode": "Tühista kodeerimine", "ButtonCancelEncode": "Tühista kodeerimine",
"ButtonChangeRootPassword": "Muuda põhiparooli", "ButtonChangeRootPassword": "Muuda põhiparooli",
"ButtonCheckAndDownloadNewEpisodes": "Kontrolli ja laadi alla uued episoodid", "ButtonCheckAndDownloadNewEpisodes": "Kontrolli ja laadi alla uued episoodid",
@@ -20,9 +20,9 @@
"ButtonClearFilter": "Tühista filter", "ButtonClearFilter": "Tühista filter",
"ButtonCloseFeed": "Sulge voog", "ButtonCloseFeed": "Sulge voog",
"ButtonCloseSession": "Sulge avatud sessioon", "ButtonCloseSession": "Sulge avatud sessioon",
"ButtonCollections": "Kogud", "ButtonCollections": "Kollektsioonid",
"ButtonConfigureScanner": "Konfigureeri skanner", "ButtonConfigureScanner": "Konfigureeri skanner",
"ButtonCreate": "Loo", "ButtonCreate": "Loo uus",
"ButtonCreateBackup": "Loo varundus", "ButtonCreateBackup": "Loo varundus",
"ButtonDelete": "Kustuta", "ButtonDelete": "Kustuta",
"ButtonDownloadQueue": "Järjekord", "ButtonDownloadQueue": "Järjekord",
@@ -37,7 +37,7 @@
"ButtonIssues": "Probleemid", "ButtonIssues": "Probleemid",
"ButtonJumpBackward": "Hüppa tagasi", "ButtonJumpBackward": "Hüppa tagasi",
"ButtonJumpForward": "Hüppa edasi", "ButtonJumpForward": "Hüppa edasi",
"ButtonLatest": "Uusim", "ButtonLatest": "Viimased",
"ButtonLibrary": "Raamatukogu", "ButtonLibrary": "Raamatukogu",
"ButtonLogout": "Logi välja", "ButtonLogout": "Logi välja",
"ButtonLookup": "Otsi", "ButtonLookup": "Otsi",
@@ -52,11 +52,11 @@
"ButtonOk": "Ok", "ButtonOk": "Ok",
"ButtonOpenFeed": "Ava voog", "ButtonOpenFeed": "Ava voog",
"ButtonOpenManager": "Ava haldur", "ButtonOpenManager": "Ava haldur",
"ButtonPause": "Peata", "ButtonPause": "Paus",
"ButtonPlay": "Mängi", "ButtonPlay": "Play",
"ButtonPlayAll": "Mängi kõik", "ButtonPlayAll": "Mängi kõik",
"ButtonPlaying": "Mängib", "ButtonPlaying": "Mängib",
"ButtonPlaylists": "Esitusloendid", "ButtonPlaylists": "Playlist",
"ButtonPrevious": "Eelmine", "ButtonPrevious": "Eelmine",
"ButtonPreviousChapter": "Eelmine peatükk", "ButtonPreviousChapter": "Eelmine peatükk",
"ButtonPurgeAllCache": "Tühjenda kogu vahemälu", "ButtonPurgeAllCache": "Tühjenda kogu vahemälu",
@@ -69,7 +69,7 @@
"ButtonReadLess": "Loe vähem", "ButtonReadLess": "Loe vähem",
"ButtonReadMore": "Loe rohkem", "ButtonReadMore": "Loe rohkem",
"ButtonRefresh": "Värskenda", "ButtonRefresh": "Värskenda",
"ButtonRemove": "Eemalda", "ButtonRemove": "Kustuta",
"ButtonRemoveAll": "Eemalda kõik", "ButtonRemoveAll": "Eemalda kõik",
"ButtonRemoveAllLibraryItems": "Eemalda kõik raamatukogu esemed", "ButtonRemoveAllLibraryItems": "Eemalda kõik raamatukogu esemed",
"ButtonRemoveFromContinueListening": "Eemalda jätkake kuulamisest", "ButtonRemoveFromContinueListening": "Eemalda jätkake kuulamisest",
@@ -120,12 +120,12 @@
"HeaderCustomMetadataProviders": "Kohandatud metaandmete pakkujad", "HeaderCustomMetadataProviders": "Kohandatud metaandmete pakkujad",
"HeaderDetails": "Detailid", "HeaderDetails": "Detailid",
"HeaderDownloadQueue": "Allalaadimise järjekord", "HeaderDownloadQueue": "Allalaadimise järjekord",
"HeaderEbookFiles": "E-raamatute failid", "HeaderEbookFiles": "E-raamatu failid",
"HeaderEmail": "E-post", "HeaderEmail": "E-post",
"HeaderEmailSettings": "E-posti seaded", "HeaderEmailSettings": "E-posti seaded",
"HeaderEpisodes": "Episoodid", "HeaderEpisodes": "Episoodid",
"HeaderEreaderDevices": "E-lugerite seadmed", "HeaderEreaderDevices": "E-lugerite seadmed",
"HeaderEreaderSettings": "E-lugerite seadistused", "HeaderEreaderSettings": "E-lugeja sätted",
"HeaderFiles": "Failid", "HeaderFiles": "Failid",
"HeaderFindChapters": "Leia peatükid", "HeaderFindChapters": "Leia peatükid",
"HeaderIgnoredFiles": "Ignoreeritud failid", "HeaderIgnoredFiles": "Ignoreeritud failid",
@@ -155,8 +155,8 @@
"HeaderPasswordAuthentication": "Parooli autentimine", "HeaderPasswordAuthentication": "Parooli autentimine",
"HeaderPermissions": "Õigused", "HeaderPermissions": "Õigused",
"HeaderPlayerQueue": "Mängija järjekord", "HeaderPlayerQueue": "Mängija järjekord",
"HeaderPlaylist": "Mänguloend", "HeaderPlaylist": "Playlist",
"HeaderPlaylistItems": "Mänguloendi esemed", "HeaderPlaylistItems": "Playlisti esemed",
"HeaderPodcastsToAdd": "Lisatavad podcastid", "HeaderPodcastsToAdd": "Lisatavad podcastid",
"HeaderPreviewCover": "Eelvaate kaas", "HeaderPreviewCover": "Eelvaate kaas",
"HeaderRSSFeedGeneral": "RSS-i üksikasjad", "HeaderRSSFeedGeneral": "RSS-i üksikasjad",
@@ -174,7 +174,7 @@
"HeaderSettingsExperimental": "Katsetusfunktsioonid", "HeaderSettingsExperimental": "Katsetusfunktsioonid",
"HeaderSettingsGeneral": "Üldised", "HeaderSettingsGeneral": "Üldised",
"HeaderSettingsScanner": "Skanner", "HeaderSettingsScanner": "Skanner",
"HeaderSleepTimer": "Uinaku taimer", "HeaderSleepTimer": "Unetaimer",
"HeaderStatsLargestItems": "Suurimad esemed", "HeaderStatsLargestItems": "Suurimad esemed",
"HeaderStatsLongestItems": "Kõige pikemad esemed (tunnid)", "HeaderStatsLongestItems": "Kõige pikemad esemed (tunnid)",
"HeaderStatsMinutesListeningChart": "Kuulamise minutid (viimased 7 päeva)", "HeaderStatsMinutesListeningChart": "Kuulamise minutid (viimased 7 päeva)",
@@ -197,9 +197,10 @@
"LabelActivity": "Tegevus", "LabelActivity": "Tegevus",
"LabelAddToCollection": "Lisa kogusse", "LabelAddToCollection": "Lisa kogusse",
"LabelAddToCollectionBatch": "Lisa {0} raamatut kogusse", "LabelAddToCollectionBatch": "Lisa {0} raamatut kogusse",
"LabelAddToPlaylist": "Lisa mänguloendisse", "LabelAddToPlaylist": "Lisa playlisti",
"LabelAddToPlaylistBatch": "Lisa {0} eset mänguloendisse", "LabelAddToPlaylistBatch": "Lisa {0} eset mänguloendisse",
"LabelAddedAt": "Lisatud", "LabelAddedAt": "Lisatud",
"LabelAddedDate": "Lisatud {0}",
"LabelAdminUsersOnly": "Ainult administraatorid", "LabelAdminUsersOnly": "Ainult administraatorid",
"LabelAll": "Kõik", "LabelAll": "Kõik",
"LabelAllUsers": "Kõik kasutajad", "LabelAllUsers": "Kõik kasutajad",
@@ -208,10 +209,10 @@
"LabelAlreadyInYourLibrary": "Juba teie raamatukogus", "LabelAlreadyInYourLibrary": "Juba teie raamatukogus",
"LabelAppend": "Lisa", "LabelAppend": "Lisa",
"LabelAuthor": "Autor", "LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Eesnimi Perekonnanimi)", "LabelAuthorFirstLast": "Autor (eesnimi perekonnanimi)",
"LabelAuthorLastFirst": "Autor (Perekonnanimi, Eesnimi)", "LabelAuthorLastFirst": "Autor (perekonnanimi, eesnimi)",
"LabelAuthors": "Autorid", "LabelAuthors": "Autorid",
"LabelAutoDownloadEpisodes": "Automaatne episoodide allalaadimine", "LabelAutoDownloadEpisodes": "Episoodide automaatne allalaadimine",
"LabelAutoFetchMetadata": "Automaatne metaandmete hankimine", "LabelAutoFetchMetadata": "Automaatne metaandmete hankimine",
"LabelAutoFetchMetadataHelp": "Toob tiitli, autori ja seeria metaandmed üleslaadimise hõlbustamiseks. Lisametaandmed võivad pärast üleslaadimist vajada vastavust.", "LabelAutoFetchMetadataHelp": "Toob tiitli, autori ja seeria metaandmed üleslaadimise hõlbustamiseks. Lisametaandmed võivad pärast üleslaadimist vajada vastavust.",
"LabelAutoLaunch": "Automaatne käivitamine", "LabelAutoLaunch": "Automaatne käivitamine",
@@ -265,7 +266,7 @@
"LabelDiscover": "Avasta", "LabelDiscover": "Avasta",
"LabelDownload": "Lae alla", "LabelDownload": "Lae alla",
"LabelDownloadNEpisodes": "Lae alla {0} episoodi", "LabelDownloadNEpisodes": "Lae alla {0} episoodi",
"LabelDuration": "Kestus", "LabelDuration": "Kestvus",
"LabelDurationFound": "Leitud kestus:", "LabelDurationFound": "Leitud kestus:",
"LabelEbook": "E-raamat", "LabelEbook": "E-raamat",
"LabelEbooks": "E-raamatud", "LabelEbooks": "E-raamatud",
@@ -278,6 +279,7 @@
"LabelEmbeddedCover": "Manustatud kaas", "LabelEmbeddedCover": "Manustatud kaas",
"LabelEnable": "Luba", "LabelEnable": "Luba",
"LabelEnd": "Lõpp", "LabelEnd": "Lõpp",
"LabelEndOfChapter": "Peatükki lõpp",
"LabelEpisode": "Episood", "LabelEpisode": "Episood",
"LabelEpisodeTitle": "Episoodi pealkiri", "LabelEpisodeTitle": "Episoodi pealkiri",
"LabelEpisodeType": "Episoodi tüüp", "LabelEpisodeType": "Episoodi tüüp",
@@ -288,13 +290,14 @@
"LabelFile": "Fail", "LabelFile": "Fail",
"LabelFileBirthtime": "Faili sünniaeg", "LabelFileBirthtime": "Faili sünniaeg",
"LabelFileModified": "Faili muudetud", "LabelFileModified": "Faili muudetud",
"LabelFilename": "Failinimi", "LabelFilename": "Faili nimi",
"LabelFilterByUser": "Filtri alusel kasutaja järgi", "LabelFilterByUser": "Filtri alusel kasutaja järgi",
"LabelFindEpisodes": "Otsi episoodid", "LabelFindEpisodes": "Otsi episoodid",
"LabelFinished": "Lõpetatud", "LabelFinished": "Lõpetatud",
"LabelFolder": "Kaust", "LabelFolder": "Kaust",
"LabelFolders": "Kataloogid", "LabelFolders": "Kataloogid",
"LabelFontBold": "Paks", "LabelFontBold": "Paks",
"LabelFontBoldness": "Fondi paksus",
"LabelFontFamily": "Fondi pere", "LabelFontFamily": "Fondi pere",
"LabelFontItalic": "Kaldkiri", "LabelFontItalic": "Kaldkiri",
"LabelFontScale": "Fondi suurus", "LabelFontScale": "Fondi suurus",
@@ -303,7 +306,7 @@
"LabelGenre": "Žanr", "LabelGenre": "Žanr",
"LabelGenres": "Žanrid", "LabelGenres": "Žanrid",
"LabelHardDeleteFile": "Faili lõplik kustutamine", "LabelHardDeleteFile": "Faili lõplik kustutamine",
"LabelHasEbook": "On e-raamat", "LabelHasEbook": "E-raamat olemas",
"LabelHasSupplementaryEbook": "On täiendav e-raamat", "LabelHasSupplementaryEbook": "On täiendav e-raamat",
"LabelHighestPriority": "Kõrgeim prioriteet", "LabelHighestPriority": "Kõrgeim prioriteet",
"LabelHour": "Tund", "LabelHour": "Tund",
@@ -311,7 +314,7 @@
"LabelImageURLFromTheWeb": "Pildi URL veebist", "LabelImageURLFromTheWeb": "Pildi URL veebist",
"LabelInProgress": "Pooleli", "LabelInProgress": "Pooleli",
"LabelIncludeInTracklist": "Kaasa jälgimisloendis", "LabelIncludeInTracklist": "Kaasa jälgimisloendis",
"LabelIncomplete": "Puudulik", "LabelIncomplete": "Lõpetamata",
"LabelInterval": "Intervall", "LabelInterval": "Intervall",
"LabelIntervalCustomDailyWeekly": "Kohandatud päevane/nädalane", "LabelIntervalCustomDailyWeekly": "Kohandatud päevane/nädalane",
"LabelIntervalEvery12Hours": "Iga 12 tunni tagant", "LabelIntervalEvery12Hours": "Iga 12 tunni tagant",
@@ -365,12 +368,12 @@
"LabelNarrators": "Jutustajad", "LabelNarrators": "Jutustajad",
"LabelNew": "Uus", "LabelNew": "Uus",
"LabelNewPassword": "Uus parool", "LabelNewPassword": "Uus parool",
"LabelNewestAuthors": "Uusimad autorid", "LabelNewestAuthors": "Uuemad autorid",
"LabelNewestEpisodes": "Uusimad episoodid", "LabelNewestEpisodes": "Uuemad episoodid",
"LabelNextBackupDate": "Järgmine varukoopia kuupäev", "LabelNextBackupDate": "Järgmine varukoopia kuupäev",
"LabelNextScheduledRun": "Järgmine ajakava järgmine", "LabelNextScheduledRun": "Järgmine ajakava järgmine",
"LabelNoEpisodesSelected": "Episoodid pole valitud", "LabelNoEpisodesSelected": "Episoodid pole valitud",
"LabelNotFinished": "Ei ole lõpetatud", "LabelNotFinished": "Lõpetamata",
"LabelNotStarted": "Pole alustatud", "LabelNotStarted": "Pole alustatud",
"LabelNotes": "Märkused", "LabelNotes": "Märkused",
"LabelNotificationAppriseURL": "Apprise URL-id", "LabelNotificationAppriseURL": "Apprise URL-id",
@@ -383,7 +386,7 @@
"LabelNotificationsMaxQueueSize": "Teavituste sündmuste maksimaalne järjekorra suurus", "LabelNotificationsMaxQueueSize": "Teavituste sündmuste maksimaalne järjekorra suurus",
"LabelNotificationsMaxQueueSizeHelp": "Sündmused on piiratud 1 sekundiga. Sündmusi ignoreeritakse, kui järjekord on maksimumsuuruses. See takistab teavituste rämpsposti.", "LabelNotificationsMaxQueueSizeHelp": "Sündmused on piiratud 1 sekundiga. Sündmusi ignoreeritakse, kui järjekord on maksimumsuuruses. See takistab teavituste rämpsposti.",
"LabelNumberOfBooks": "Raamatute arv", "LabelNumberOfBooks": "Raamatute arv",
"LabelNumberOfEpisodes": "Episoodide arv", "LabelNumberOfEpisodes": "# episoode",
"LabelOpenRSSFeed": "Ava RSS voog", "LabelOpenRSSFeed": "Ava RSS voog",
"LabelOverwrite": "Kirjuta üle", "LabelOverwrite": "Kirjuta üle",
"LabelPassword": "Parool", "LabelPassword": "Parool",
@@ -398,16 +401,18 @@
"LabelPhotoPathURL": "Foto tee/URL", "LabelPhotoPathURL": "Foto tee/URL",
"LabelPlayMethod": "Esitusmeetod", "LabelPlayMethod": "Esitusmeetod",
"LabelPlaylists": "Mänguloendid", "LabelPlaylists": "Mänguloendid",
"LabelPodcast": "Podcast",
"LabelPodcastSearchRegion": "Podcasti otsingu piirkond", "LabelPodcastSearchRegion": "Podcasti otsingu piirkond",
"LabelPodcastType": "Podcasti tüüp", "LabelPodcastType": "Podcasti tüüp",
"LabelPodcasts": "Podcastid", "LabelPodcasts": "Podcastid",
"LabelPrefixesToIgnore": "Eiramiseks eesliited (tõstutundetu)", "LabelPrefixesToIgnore": "Eiramiseks eesliited (tõstutundetu)",
"LabelPreventIndexing": "Vältige oma voogu indekseerimist iTunes'i ja Google podcasti kataloogides", "LabelPreventIndexing": "Vältige oma voogu indekseerimist iTunes'i ja Google podcasti kataloogides",
"LabelPrimaryEbook": "Esmane e-raamat", "LabelPrimaryEbook": "Esmane e-raamat",
"LabelProgress": "Edenemine", "LabelProgress": "Progress",
"LabelProvider": "Pakkuja", "LabelProvider": "Pakkuja",
"LabelPubDate": "Avaldamise kuupäev", "LabelPubDate": "Publitseerimise kuupäev",
"LabelPublishYear": "Aasta avaldamine", "LabelPublishYear": "Publitseerimise aasta",
"LabelPublishedDate": "Publitseeritud {0}",
"LabelPublisher": "Kirjastaja", "LabelPublisher": "Kirjastaja",
"LabelRSSFeedCustomOwnerEmail": "Kohandatud omaniku e-post", "LabelRSSFeedCustomOwnerEmail": "Kohandatud omaniku e-post",
"LabelRSSFeedCustomOwnerName": "Kohandatud omaniku nimi", "LabelRSSFeedCustomOwnerName": "Kohandatud omaniku nimi",
@@ -415,7 +420,8 @@
"LabelRSSFeedPreventIndexing": "Vältige indekseerimist", "LabelRSSFeedPreventIndexing": "Vältige indekseerimist",
"LabelRSSFeedSlug": "RSS voog Slug", "LabelRSSFeedSlug": "RSS voog Slug",
"LabelRSSFeedURL": "RSS voog URL", "LabelRSSFeedURL": "RSS voog URL",
"LabelRead": "Lugenud", "LabelRandomly": "Juhuslikus järjekorras",
"LabelRead": "Loetud läbi",
"LabelReadAgain": "Loe uuesti", "LabelReadAgain": "Loe uuesti",
"LabelReadEbookWithoutProgress": "Lugege e-raamatut ilma edenemist säilitamata", "LabelReadEbookWithoutProgress": "Lugege e-raamatut ilma edenemist säilitamata",
"LabelRecentSeries": "Hiljutised seeriad", "LabelRecentSeries": "Hiljutised seeriad",
@@ -469,9 +475,9 @@
"LabelSettingsStoreMetadataWithItem": "Salvesta metaandmed üksusega", "LabelSettingsStoreMetadataWithItem": "Salvesta metaandmed üksusega",
"LabelSettingsStoreMetadataWithItemHelp": "Vaikimisi salvestatakse metaandmed /metadata/items kausta. Selle seadistuse lubamine salvestab metaandmed teie raamatukogu üksuse kaustadesse", "LabelSettingsStoreMetadataWithItemHelp": "Vaikimisi salvestatakse metaandmed /metadata/items kausta. Selle seadistuse lubamine salvestab metaandmed teie raamatukogu üksuse kaustadesse",
"LabelSettingsTimeFormat": "Kellaaja vorming", "LabelSettingsTimeFormat": "Kellaaja vorming",
"LabelShowAll": "Näita kõiki", "LabelShowAll": "Näita kõik",
"LabelSize": "Suurus", "LabelSize": "Suurus",
"LabelSleepTimer": "Uinaku taimer", "LabelSleepTimer": "Unetaimer",
"LabelStart": "Alusta", "LabelStart": "Alusta",
"LabelStartTime": "Alustamise aeg", "LabelStartTime": "Alustamise aeg",
"LabelStarted": "Alustatud", "LabelStarted": "Alustatud",
@@ -480,13 +486,13 @@
"LabelStatsAuthors": "Autorid", "LabelStatsAuthors": "Autorid",
"LabelStatsBestDay": "Parim päev", "LabelStatsBestDay": "Parim päev",
"LabelStatsDailyAverage": "Päevane keskmine", "LabelStatsDailyAverage": "Päevane keskmine",
"LabelStatsDays": "Päevad", "LabelStatsDays": "Päevi",
"LabelStatsDaysListened": "Kuulatud päevad", "LabelStatsDaysListened": "Kuulatud päevad",
"LabelStatsHours": "Tunnid", "LabelStatsHours": "Tunnid",
"LabelStatsInARow": "järjest", "LabelStatsInARow": "järjest",
"LabelStatsItemsFinished": "Lõpetatud üksused", "LabelStatsItemsFinished": "Lõpetatud üksused",
"LabelStatsItemsInLibrary": "Üksused raamatukogus", "LabelStatsItemsInLibrary": "Üksused raamatukogus",
"LabelStatsMinutes": "minutit", "LabelStatsMinutes": "minuteid",
"LabelStatsMinutesListening": "Kuulamise minutid", "LabelStatsMinutesListening": "Kuulamise minutid",
"LabelStatsOverallDays": "Kokku päevad", "LabelStatsOverallDays": "Kokku päevad",
"LabelStatsOverallHours": "Kokku tunnid", "LabelStatsOverallHours": "Kokku tunnid",
@@ -502,7 +508,7 @@
"LabelTextEditorNumberedList": "Numberloend", "LabelTextEditorNumberedList": "Numberloend",
"LabelTextEditorUnlink": "Eemalda link", "LabelTextEditorUnlink": "Eemalda link",
"LabelTheme": "Teema", "LabelTheme": "Teema",
"LabelThemeDark": "Tume", "LabelThemeDark": "Pime",
"LabelThemeLight": "Hele", "LabelThemeLight": "Hele",
"LabelTimeBase": "Aja alus", "LabelTimeBase": "Aja alus",
"LabelTimeListened": "Kuulatud aeg", "LabelTimeListened": "Kuulatud aeg",
@@ -527,7 +533,7 @@
"LabelType": "Tüüp", "LabelType": "Tüüp",
"LabelUnabridged": "Täismahus", "LabelUnabridged": "Täismahus",
"LabelUndo": "Võta tagasi", "LabelUndo": "Võta tagasi",
"LabelUnknown": "Tundmatu", "LabelUnknown": "Teadmata",
"LabelUpdateCover": "Uuenda kaant", "LabelUpdateCover": "Uuenda kaant",
"LabelUpdateCoverHelp": "Luba üle kirjutamine olemasolevate kaante jaoks valitud raamatutele, kui leitakse sobivus", "LabelUpdateCoverHelp": "Luba üle kirjutamine olemasolevate kaante jaoks valitud raamatutele, kui leitakse sobivus",
"LabelUpdateDetails": "Uuenda üksikasju", "LabelUpdateDetails": "Uuenda üksikasju",
+1
View File
@@ -0,0 +1 @@
{}
+28
View File
@@ -0,0 +1,28 @@
{
"ButtonAdd": "افزودن",
"ButtonAuthors": "ناشر",
"ButtonBack": "بازگشت",
"ButtonCancel": "انصراف",
"ButtonClearFilter": "حذف صافی",
"ButtonCloseFeed": "بستن فید",
"ButtonCollections": "مجموعه ها",
"ButtonCreate": "ساختن",
"ButtonDelete": "حذف",
"ButtonHome": "خانه",
"ButtonIssues": "مشکلات",
"ButtonLatest": "جدیدترین",
"ButtonLibrary": "کتابخانه",
"ButtonOk": "تایید",
"ButtonOpenFeed": "باز کردن فید",
"ButtonPause": "توقف",
"ButtonPlay": "پخش",
"ButtonPlaylists": "لیست پخش",
"ButtonRead": "خواندن",
"ButtonReadLess": "خواندن کمتر",
"ButtonReadMore": "خواندن بیشتر",
"ButtonRemove": "حذف",
"ButtonSave": "ذخیره",
"ButtonSearch": "جستجو",
"ButtonSeries": "مجموعه",
"ButtonSubmit": "ثبت"
}
+10
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Lisää", "ButtonAdd": "Lisää",
"ButtonAddApiKey": "Lisää API avain",
"ButtonAddChapters": "Lisää lukuja", "ButtonAddChapters": "Lisää lukuja",
"ButtonAddDevice": "Lisää laite", "ButtonAddDevice": "Lisää laite",
"ButtonAddLibrary": "Lisää kirjasto", "ButtonAddLibrary": "Lisää kirjasto",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Valitse kansio", "ButtonChooseAFolder": "Valitse kansio",
"ButtonChooseFiles": "Valitse tiedostot", "ButtonChooseFiles": "Valitse tiedostot",
"ButtonClearFilter": "Poista suodatus", "ButtonClearFilter": "Poista suodatus",
"ButtonClose": "Sulje",
"ButtonCloseFeed": "Sulje syöte", "ButtonCloseFeed": "Sulje syöte",
"ButtonCloseSession": "Sulje Avoin Sessio", "ButtonCloseSession": "Sulje Avoin Sessio",
"ButtonCollections": "Kokoelmat", "ButtonCollections": "Kokoelmat",
@@ -119,11 +121,13 @@
"HeaderAccount": "Tili", "HeaderAccount": "Tili",
"HeaderAddCustomMetadataProvider": "Lisää mukautettu metadata tarjoaja", "HeaderAddCustomMetadataProvider": "Lisää mukautettu metadata tarjoaja",
"HeaderAdvanced": "Edistynyt", "HeaderAdvanced": "Edistynyt",
"HeaderApiKeys": "API avaimet",
"HeaderAppriseNotificationSettings": "Apprise-ilmoitusasetukset", "HeaderAppriseNotificationSettings": "Apprise-ilmoitusasetukset",
"HeaderAudioTracks": "Ääniraidat", "HeaderAudioTracks": "Ääniraidat",
"HeaderAudiobookTools": "Äänikirjojen tiedostonhallintatyökalut", "HeaderAudiobookTools": "Äänikirjojen tiedostonhallintatyökalut",
"HeaderAuthentication": "Todennus", "HeaderAuthentication": "Todennus",
"HeaderBackups": "Varmuuskopiot", "HeaderBackups": "Varmuuskopiot",
"HeaderBulkChapterModal": "Lisää useita kappaleita",
"HeaderChangePassword": "Vaihda salasana", "HeaderChangePassword": "Vaihda salasana",
"HeaderChapters": "Luvut", "HeaderChapters": "Luvut",
"HeaderChooseAFolder": "Valitse kansio", "HeaderChooseAFolder": "Valitse kansio",
@@ -162,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Metadatan tärkeysjärjestys", "HeaderMetadataOrderOfPrecedence": "Metadatan tärkeysjärjestys",
"HeaderMetadataToEmbed": "Sisällytettävä metadata", "HeaderMetadataToEmbed": "Sisällytettävä metadata",
"HeaderNewAccount": "Uusi tili", "HeaderNewAccount": "Uusi tili",
"HeaderNewApiKey": "Uusi API avain",
"HeaderNewLibrary": "Uusi kirjasto", "HeaderNewLibrary": "Uusi kirjasto",
"HeaderNotificationCreate": "Luo ilmoitus", "HeaderNotificationCreate": "Luo ilmoitus",
"HeaderNotificationUpdate": "Päivitä ilmoitus", "HeaderNotificationUpdate": "Päivitä ilmoitus",
@@ -194,6 +199,7 @@
"HeaderSettingsExperimental": "Kokeelliset ominaisuudet", "HeaderSettingsExperimental": "Kokeelliset ominaisuudet",
"HeaderSettingsGeneral": "Yleiset", "HeaderSettingsGeneral": "Yleiset",
"HeaderSettingsScanner": "Skannaaja", "HeaderSettingsScanner": "Skannaaja",
"HeaderSettingsSecurity": "Turvallisuus",
"HeaderSettingsWebClient": "Webasiakasohjelma", "HeaderSettingsWebClient": "Webasiakasohjelma",
"HeaderSleepTimer": "Uniajastin", "HeaderSleepTimer": "Uniajastin",
"HeaderStatsLargestItems": "Suurimmat kohteet", "HeaderStatsLargestItems": "Suurimmat kohteet",
@@ -205,6 +211,7 @@
"HeaderTableOfContents": "Sisällysluettelo", "HeaderTableOfContents": "Sisällysluettelo",
"HeaderTools": "Työkalut", "HeaderTools": "Työkalut",
"HeaderUpdateAccount": "Päivitä tili", "HeaderUpdateAccount": "Päivitä tili",
"HeaderUpdateApiKey": "Päivitä API avain",
"HeaderUpdateAuthor": "Päivitä tekijä", "HeaderUpdateAuthor": "Päivitä tekijä",
"HeaderUpdateDetails": "Päivitä yksityiskohdat", "HeaderUpdateDetails": "Päivitä yksityiskohdat",
"HeaderUpdateLibrary": "Päivitä kirjasto", "HeaderUpdateLibrary": "Päivitä kirjasto",
@@ -234,6 +241,8 @@
"LabelAllUsersExcludingGuests": "Kaikki käyttäjät vieraita lukuun ottamatta", "LabelAllUsersExcludingGuests": "Kaikki käyttäjät vieraita lukuun ottamatta",
"LabelAllUsersIncludingGuests": "Kaikki käyttäjät mukaan lukien vieraat", "LabelAllUsersIncludingGuests": "Kaikki käyttäjät mukaan lukien vieraat",
"LabelAlreadyInYourLibrary": "Jo kirjastossasi", "LabelAlreadyInYourLibrary": "Jo kirjastossasi",
"LabelApiKeyCreated": "API avain \"{0}\" luotu onnistuneesti.",
"LabelApiKeyCreatedDescription": "Varmista, että kopioit API avaimen. Sitä ei näytetä enää tämän jälkeen.",
"LabelApiToken": "Sovellusliittymätunnus", "LabelApiToken": "Sovellusliittymätunnus",
"LabelAppend": "Lisää loppuun", "LabelAppend": "Lisää loppuun",
"LabelAudioBitrate": "Äänen bittinopeus (esim. 128k)", "LabelAudioBitrate": "Äänen bittinopeus (esim. 128k)",
@@ -283,6 +292,7 @@
"LabelContinueListening": "Jatka kuuntelua", "LabelContinueListening": "Jatka kuuntelua",
"LabelContinueReading": "Jatka lukemista", "LabelContinueReading": "Jatka lukemista",
"LabelContinueSeries": "Jatka sarjoja", "LabelContinueSeries": "Jatka sarjoja",
"LabelCorsAllowed": "Salli CORS Origins",
"LabelCover": "Kansikuva", "LabelCover": "Kansikuva",
"LabelCoverImageURL": "Kansikuvan URL-osoite", "LabelCoverImageURL": "Kansikuvan URL-osoite",
"LabelCoverProvider": "Kansikuvan tarjoaja", "LabelCoverProvider": "Kansikuvan tarjoaja",
+41 -9
View File
@@ -76,7 +76,7 @@
"ButtonReScan": "Nouvelle analyse", "ButtonReScan": "Nouvelle analyse",
"ButtonRead": "Lire", "ButtonRead": "Lire",
"ButtonReadLess": "Lire moins", "ButtonReadLess": "Lire moins",
"ButtonReadMore": "Lire la suite", "ButtonReadMore": "Lire plus",
"ButtonRefresh": "Rafraîchir", "ButtonRefresh": "Rafraîchir",
"ButtonRemove": "Retirer", "ButtonRemove": "Retirer",
"ButtonRemoveAll": "Supprimer tout", "ButtonRemoveAll": "Supprimer tout",
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Outils de gestion de fichiers de livres audio", "HeaderAudiobookTools": "Outils de gestion de fichiers de livres audio",
"HeaderAuthentication": "Authentification", "HeaderAuthentication": "Authentification",
"HeaderBackups": "Sauvegardes", "HeaderBackups": "Sauvegardes",
"HeaderBulkChapterModal": "Ajouter Plusieurs Chapitres",
"HeaderChangePassword": "Modifier le mot de passe", "HeaderChangePassword": "Modifier le mot de passe",
"HeaderChapters": "Chapitres", "HeaderChapters": "Chapitres",
"HeaderChooseAFolder": "Sélectionner un dossier", "HeaderChooseAFolder": "Sélectionner un dossier",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Fonctionnalités expérimentales", "HeaderSettingsExperimental": "Fonctionnalités expérimentales",
"HeaderSettingsGeneral": "Général", "HeaderSettingsGeneral": "Général",
"HeaderSettingsScanner": "Analyseur", "HeaderSettingsScanner": "Analyseur",
"HeaderSettingsSecurity": "Sécurité",
"HeaderSettingsWebClient": "Client Web", "HeaderSettingsWebClient": "Client Web",
"HeaderSleepTimer": "Minuterie", "HeaderSleepTimer": "Minuterie",
"HeaderStatsLargestItems": "Éléments les plus grands", "HeaderStatsLargestItems": "Éléments les plus grands",
@@ -206,7 +208,7 @@
"HeaderStatsMinutesListeningChart": "Minutes d’écoute (7 derniers jours)", "HeaderStatsMinutesListeningChart": "Minutes d’écoute (7 derniers jours)",
"HeaderStatsRecentSessions": "Sessions récentes", "HeaderStatsRecentSessions": "Sessions récentes",
"HeaderStatsTop10Authors": "Top 10 Auteurs", "HeaderStatsTop10Authors": "Top 10 Auteurs",
"HeaderStatsTop5Genres": "Top 5 Genres", "HeaderStatsTop5Genres": "Top 5 des genres",
"HeaderTableOfContents": "Table des matières", "HeaderTableOfContents": "Table des matières",
"HeaderTools": "Outils", "HeaderTools": "Outils",
"HeaderUpdateAccount": "Mettre à jour le compte", "HeaderUpdateAccount": "Mettre à jour le compte",
@@ -293,6 +295,7 @@
"LabelContinueListening": "Continuer l'écoute", "LabelContinueListening": "Continuer l'écoute",
"LabelContinueReading": "Continuer la lecture", "LabelContinueReading": "Continuer la lecture",
"LabelContinueSeries": "Continuer les séries", "LabelContinueSeries": "Continuer les séries",
"LabelCorsAllowed": "Origines autorisées pour les requêtes CORS",
"LabelCover": "Couverture", "LabelCover": "Couverture",
"LabelCoverImageURL": "URL vers limage de couverture", "LabelCoverImageURL": "URL vers limage de couverture",
"LabelCoverProvider": "Source des couvertures", "LabelCoverProvider": "Source des couvertures",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Supprimer du système de fichiers (décocher pour ne supprimer que de la base de données)", "LabelDeleteFromFileSystemCheckbox": "Supprimer du système de fichiers (décocher pour ne supprimer que de la base de données)",
"LabelDescription": "Description", "LabelDescription": "Description",
"LabelDeselectAll": "Tout déselectionner", "LabelDeselectAll": "Tout déselectionner",
"LabelDetectedPattern": "Motif détecté :",
"LabelDevice": "Appareil", "LabelDevice": "Appareil",
"LabelDeviceInfo": "Détail de lappareil", "LabelDeviceInfo": "Détail de lappareil",
"LabelDeviceIsAvailableTo": "Lappareil est disponible pour…", "LabelDeviceIsAvailableTo": "Lappareil est disponible pour…",
@@ -359,7 +363,7 @@
"LabelExpiresAt": "Expire à", "LabelExpiresAt": "Expire à",
"LabelExpiresInSeconds": "Expire dans (secondes)", "LabelExpiresInSeconds": "Expire dans (secondes)",
"LabelExpiresNever": "Jamais", "LabelExpiresNever": "Jamais",
"LabelExplicit": "Restriction", "LabelExplicit": "Contenu explicite",
"LabelExplicitChecked": "Explicite (vérifié)", "LabelExplicitChecked": "Explicite (vérifié)",
"LabelExplicitUnchecked": "Non explicite (non vérifié)", "LabelExplicitUnchecked": "Non explicite (non vérifié)",
"LabelExportOPML": "Exporter OPML", "LabelExportOPML": "Exporter OPML",
@@ -374,6 +378,7 @@
"LabelFilterByUser": "Filtrer par utilisateur", "LabelFilterByUser": "Filtrer par utilisateur",
"LabelFindEpisodes": "Trouver des épisodes", "LabelFindEpisodes": "Trouver des épisodes",
"LabelFinished": "Terminé le", "LabelFinished": "Terminé le",
"LabelFinishedDate": "Terminé {0}",
"LabelFolder": "Dossier", "LabelFolder": "Dossier",
"LabelFolders": "Dossiers", "LabelFolders": "Dossiers",
"LabelFontBold": "Gras", "LabelFontBold": "Gras",
@@ -418,6 +423,7 @@
"LabelLanguages": "Langues", "LabelLanguages": "Langues",
"LabelLastBookAdded": "Dernier livre ajouté", "LabelLastBookAdded": "Dernier livre ajouté",
"LabelLastBookUpdated": "Dernier livre mis à jour", "LabelLastBookUpdated": "Dernier livre mis à jour",
"LabelLastProgressDate": "Dernière position : {0}",
"LabelLastSeen": "Vu dernièrement", "LabelLastSeen": "Vu dernièrement",
"LabelLastTime": "Progression", "LabelLastTime": "Progression",
"LabelLastUpdate": "Dernière mise à jour", "LabelLastUpdate": "Dernière mise à jour",
@@ -430,14 +436,18 @@
"LabelLibraryFilterSublistEmpty": "Aucun {0}", "LabelLibraryFilterSublistEmpty": "Aucun {0}",
"LabelLibraryItem": "Élément de bibliothèque", "LabelLibraryItem": "Élément de bibliothèque",
"LabelLibraryName": "Nom de la bibliothèque", "LabelLibraryName": "Nom de la bibliothèque",
"LabelLibrarySortByProgress": "Progression : dernière mise à jour",
"LabelLibrarySortByProgressFinished": "Progression : Terminé",
"LabelLibrarySortByProgressStarted": "Progression : Commencé",
"LabelLimit": "Limite", "LabelLimit": "Limite",
"LabelLineSpacing": "Espacement des lignes", "LabelLineSpacing": "Espacement des lignes",
"LabelListenAgain": "Écouter à nouveau", "LabelListenAgain": "Écouter à nouveau",
"LabelLogLevelDebug": "Débogage", "LabelLogLevelDebug": "Débogage",
"LabelLogLevelInfo": "Info", "LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn", "LabelLogLevelWarn": "Attention",
"LabelLookForNewEpisodesAfterDate": "Rechercher les nouveaux épisodes après cette date", "LabelLookForNewEpisodesAfterDate": "Rechercher les nouveaux épisodes après cette date",
"LabelLowestPriority": "Priorité la plus basse", "LabelLowestPriority": "Priorité la plus basse",
"LabelMatchConfidence": "Confiance",
"LabelMatchExistingUsersBy": "Correspondance avec les utilisateurs existants", "LabelMatchExistingUsersBy": "Correspondance avec les utilisateurs existants",
"LabelMatchExistingUsersByDescription": "Utilisé pour connecter les utilisateurs existants. Une fois connectés, les utilisateurs seront associés à un identifiant unique provenant de votre fournisseur SSO", "LabelMatchExistingUsersByDescription": "Utilisé pour connecter les utilisateurs existants. Une fois connectés, les utilisateurs seront associés à un identifiant unique provenant de votre fournisseur SSO",
"LabelMaxEpisodesToDownload": "Nombre maximum d’épisodes à télécharger. 0 pour illimité.", "LabelMaxEpisodesToDownload": "Nombre maximum d’épisodes à télécharger. 0 pour illimité.",
@@ -467,6 +477,7 @@
"LabelNewestAuthors": "Auteurs récents", "LabelNewestAuthors": "Auteurs récents",
"LabelNewestEpisodes": "Épisodes récents", "LabelNewestEpisodes": "Épisodes récents",
"LabelNextBackupDate": "Date de la prochaine sauvegarde", "LabelNextBackupDate": "Date de la prochaine sauvegarde",
"LabelNextChapters": "Les prochains chapitres seront :",
"LabelNextScheduledRun": "Prochain lancement prévu", "LabelNextScheduledRun": "Prochain lancement prévu",
"LabelNoApiKeys": "Aucune clé API", "LabelNoApiKeys": "Aucune clé API",
"LabelNoCustomMetadataProviders": "Aucun fournisseurs de métadonnées personnalisés", "LabelNoCustomMetadataProviders": "Aucun fournisseurs de métadonnées personnalisés",
@@ -484,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Nombres de notifications maximum à mettre en attente", "LabelNotificationsMaxQueueSize": "Nombres de notifications maximum à mettre en attente",
"LabelNotificationsMaxQueueSizeHelp": "La limite de notification est de un évènement par seconde. Les notifications seront ignorées si la file dattente est à son maximum. Cela empêche un flot trop important.", "LabelNotificationsMaxQueueSizeHelp": "La limite de notification est de un évènement par seconde. Les notifications seront ignorées si la file dattente est à son maximum. Cela empêche un flot trop important.",
"LabelNumberOfBooks": "Nombre de livres", "LabelNumberOfBooks": "Nombre de livres",
"LabelNumberOfChapters": "Nombre de chapitres :",
"LabelNumberOfEpisodes": "Nombre d'épisodes", "LabelNumberOfEpisodes": "Nombre d'épisodes",
"LabelOpenIDAdvancedPermsClaimDescription": "Nom de la demande OpenID qui contient des autorisations avancées pour les actions de lutilisateur dans lapplication, qui sappliqueront à des rôles autres que celui dadministrateur (<b>sil est configuré</b>). Si la demande est absente de la réponse, laccès à ABS sera refusé. Si une seule option est manquante, elle sera considérée comme <code>false</code>. Assurez-vous que la demande du fournisseur didentité correspond à la structure attendue :", "LabelOpenIDAdvancedPermsClaimDescription": "Nom de la demande OpenID qui contient des autorisations avancées pour les actions de lutilisateur dans lapplication, qui sappliqueront à des rôles autres que celui dadministrateur (<b>sil est configuré</b>). Si la demande est absente de la réponse, laccès à ABS sera refusé. Si une seule option est manquante, elle sera considérée comme <code>false</code>. Assurez-vous que la demande du fournisseur didentité correspond à la structure attendue :",
"LabelOpenIDClaims": "Laissez les options suivantes vides pour désactiver lattribution avancée de groupes et dautorisations, en attribuant alors automatiquement le groupe « Utilisateur ».", "LabelOpenIDClaims": "Laissez les options suivantes vides pour désactiver lattribution avancée de groupes et dautorisations, en attribuant alors automatiquement le groupe « Utilisateur ».",
@@ -614,7 +626,7 @@
"LabelShareOpen": "Ouvrir le partage", "LabelShareOpen": "Ouvrir le partage",
"LabelShareURL": "Partager lURL", "LabelShareURL": "Partager lURL",
"LabelShowAll": "Tout afficher", "LabelShowAll": "Tout afficher",
"LabelShowSeconds": "Afficher les seondes", "LabelShowSeconds": "Afficher les secondes",
"LabelShowSubtitles": "Afficher les sous-titres", "LabelShowSubtitles": "Afficher les sous-titres",
"LabelSize": "Taille", "LabelSize": "Taille",
"LabelSleepTimer": "Minuterie de mise en veille", "LabelSleepTimer": "Minuterie de mise en veille",
@@ -626,6 +638,7 @@
"LabelStartTime": "Heure de démarrage", "LabelStartTime": "Heure de démarrage",
"LabelStarted": "Démarré", "LabelStarted": "Démarré",
"LabelStartedAt": "Démarré à", "LabelStartedAt": "Démarré à",
"LabelStartedDate": "Commencé {0}",
"LabelStatsAudioTracks": "Pistes audio", "LabelStatsAudioTracks": "Pistes audio",
"LabelStatsAuthors": "Auteurs", "LabelStatsAuthors": "Auteurs",
"LabelStatsBestDay": "Meilleur jour", "LabelStatsBestDay": "Meilleur jour",
@@ -655,6 +668,7 @@
"LabelTheme": "Thème", "LabelTheme": "Thème",
"LabelThemeDark": "Sombre", "LabelThemeDark": "Sombre",
"LabelThemeLight": "Clair", "LabelThemeLight": "Clair",
"LabelThemeSepia": "Sépia",
"LabelTimeBase": "Base de temps", "LabelTimeBase": "Base de temps",
"LabelTimeDurationXHours": "{0} heures", "LabelTimeDurationXHours": "{0} heures",
"LabelTimeDurationXMinutes": "{0} minutes", "LabelTimeDurationXMinutes": "{0} minutes",
@@ -739,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Aucun résultat pour le filtre « {0} : {1} »", "MessageBookshelfNoResultsForFilter": "Aucun résultat pour le filtre « {0} : {1} »",
"MessageBookshelfNoResultsForQuery": "Aucun résultat pour la requête", "MessageBookshelfNoResultsForQuery": "Aucun résultat pour la requête",
"MessageBookshelfNoSeries": "Vous navez aucune série", "MessageBookshelfNoSeries": "Vous navez aucune série",
"MessageBulkChapterPattern": "Combien de chapitres souhaitez-vous ajouter avec ce motif de numérotation ?",
"MessageChapterEndIsAfter": "La fin du chapitre se situe après la fin de votre livre audio", "MessageChapterEndIsAfter": "La fin du chapitre se situe après la fin de votre livre audio",
"MessageChapterErrorFirstNotZero": "Le premier capitre doit débuter à 0", "MessageChapterErrorFirstNotZero": "Le premier capitre doit débuter à 0",
"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",
@@ -801,6 +816,8 @@
"MessageFeedURLWillBe": "LURL du flux sera {0}", "MessageFeedURLWillBe": "LURL du flux sera {0}",
"MessageFetching": "Récupération…", "MessageFetching": "Récupération…",
"MessageForceReScanDescription": "analysera de nouveau tous les fichiers. Les étiquettes ID3 des fichiers audio, les fichiers OPF et les fichiers texte seront analysés comme 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.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} À l’écoute</strong> sur {1}",
"MessageHeatmapNoListeningSessions": "Aucune session en cours sur {0}",
"MessageImportantNotice": "Information importante !", "MessageImportantNotice": "Information importante !",
"MessageInsertChapterBelow": "Insérer le chapitre ci-dessous", "MessageInsertChapterBelow": "Insérer le chapitre ci-dessous",
"MessageInvalidAsin": "ASIN invalide", "MessageInvalidAsin": "ASIN invalide",
@@ -837,7 +854,7 @@
"MessageNoItems": "Aucun élément", "MessageNoItems": "Aucun élément",
"MessageNoItemsFound": "Aucun élément trouvé", "MessageNoItemsFound": "Aucun élément trouvé",
"MessageNoListeningSessions": "Aucune session d’écoute en cours", "MessageNoListeningSessions": "Aucune session d’écoute en cours",
"MessageNoLogs": "Aucun journaux", "MessageNoLogs": "Aucun journal",
"MessageNoMediaProgress": "Aucun média en cours", "MessageNoMediaProgress": "Aucun média en cours",
"MessageNoNotifications": "Aucune notification", "MessageNoNotifications": "Aucune notification",
"MessageNoPodcastFeed": "Podcast invalide : pas de flux", "MessageNoPodcastFeed": "Podcast invalide : pas de flux",
@@ -858,7 +875,7 @@
"MessagePlaylistCreateFromCollection": "Créer une liste de lecture depuis la collection", "MessagePlaylistCreateFromCollection": "Créer une liste de lecture depuis la collection",
"MessagePleaseWait": "Merci de patienter…", "MessagePleaseWait": "Merci de patienter…",
"MessagePodcastHasNoRSSFeedForMatching": "Le Podcast na pas dURL de flux RSS à utiliser pour la correspondance", "MessagePodcastHasNoRSSFeedForMatching": "Le Podcast na pas dURL de flux RSS à utiliser pour la correspondance",
"MessagePodcastSearchField": "Saisissez le terme de recherche ou l'URL du flux RSS", "MessagePodcastSearchField": "Saisir un terme de recherche ou l'URL d'un flux RSS",
"MessageQuickEmbedInProgress": "Intégration rapide en cours", "MessageQuickEmbedInProgress": "Intégration rapide en cours",
"MessageQuickEmbedQueue": "En file d'attente pour une intégration rapide ({0} dans la file d'attente)", "MessageQuickEmbedQueue": "En file d'attente pour une intégration rapide ({0} dans la file d'attente)",
"MessageQuickMatchAllEpisodes": "Associer rapidement tous les épisodes", "MessageQuickMatchAllEpisodes": "Associer rapidement tous les épisodes",
@@ -940,11 +957,12 @@
"NotificationOnRSSFeedDisabledDescription": "Déclenché lorsque les téléchargements automatiques d’épisodes sont désactivés en raison dun trop grand nombre de tentatives infructueuses", "NotificationOnRSSFeedDisabledDescription": "Déclenché lorsque les téléchargements automatiques d’épisodes sont désactivés en raison dun trop grand nombre de tentatives infructueuses",
"NotificationOnRSSFeedFailedDescription": "Déclenché lorsque la demande de flux RSS échoue pour un téléchargement automatique d’épisode", "NotificationOnRSSFeedFailedDescription": "Déclenché lorsque la demande de flux RSS échoue pour un téléchargement automatique d’épisode",
"NotificationOnTestDescription": "Événement pour tester le système de notification", "NotificationOnTestDescription": "Événement pour tester le système de notification",
"PlaceholderBulkChapterInput": "Entrez le titre du chapitre ou utilisez la numérotation (ex. 'Épisode 1', 'Chapitre 10', '1.')",
"PlaceholderNewCollection": "Nom de la nouvelle collection", "PlaceholderNewCollection": "Nom de la nouvelle collection",
"PlaceholderNewFolderPath": "Nouveau chemin de dossier", "PlaceholderNewFolderPath": "Nouveau chemin de dossier",
"PlaceholderNewPlaylist": "Nouveau nom de liste de lecture", "PlaceholderNewPlaylist": "Nouveau nom de liste de lecture",
"PlaceholderSearch": "Recherche…", "PlaceholderSearch": "Recherche…",
"PlaceholderSearchEpisode": "Recherche dépisode", "PlaceholderSearchEpisode": "Rechercher un épisode..",
"StatsAuthorsAdded": "auteurs ajoutés", "StatsAuthorsAdded": "auteurs ajoutés",
"StatsBooksAdded": "livres ajoutés", "StatsBooksAdded": "livres ajoutés",
"StatsBooksAdditional": "Les ajouts comprennent…", "StatsBooksAdditional": "Les ajouts comprennent…",
@@ -993,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Échec de la création de signet", "ToastBookmarkCreateFailed": "Échec de la création de signet",
"ToastBookmarkCreateSuccess": "Signet ajouté", "ToastBookmarkCreateSuccess": "Signet ajouté",
"ToastBookmarkRemoveSuccess": "Signet supprimé", "ToastBookmarkRemoveSuccess": "Signet supprimé",
"ToastBulkChapterInvalidCount": "Veuillez entrer un nombre valide entre 1 et 150",
"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",
"ToastChapterLocked": "Le chapitre est verrouillé.",
"ToastChapterStartTimeAdjusted": "Début du chapitre ajusté de {0} secondes",
"ToastChaptersAllLocked": "Tous les chapitres sont verrouillés. Déverrouillez certains chapitres pour décaler leurs temps.",
"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.", "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.", "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.",
@@ -1028,6 +1050,7 @@
"ToastInvalidImageUrl": "URL de l'image invalide", "ToastInvalidImageUrl": "URL de l'image invalide",
"ToastInvalidMaxEpisodesToDownload": "Nombre maximum d’épisodes à télécharger non valide", "ToastInvalidMaxEpisodesToDownload": "Nombre maximum d’épisodes à télécharger non valide",
"ToastInvalidUrl": "URL invalide", "ToastInvalidUrl": "URL invalide",
"ToastInvalidUrls": "Une ou plusieurs URL sont invalides",
"ToastItemCoverUpdateSuccess": "Couverture mise à jour", "ToastItemCoverUpdateSuccess": "Couverture mise à jour",
"ToastItemDeletedFailed": "La suppression de l'élément à échouée", "ToastItemDeletedFailed": "La suppression de l'élément à échouée",
"ToastItemDeletedSuccess": "Élément supprimé", "ToastItemDeletedSuccess": "Élément supprimé",
@@ -1077,6 +1100,7 @@
"ToastPlaylistUpdateSuccess": "Liste de lecture mise à jour", "ToastPlaylistUpdateSuccess": "Liste de lecture mise à jour",
"ToastPodcastCreateFailed": "Échec de la création du podcast", "ToastPodcastCreateFailed": "Échec de la création du podcast",
"ToastPodcastCreateSuccess": "Podcast créé avec succès", "ToastPodcastCreateSuccess": "Podcast créé avec succès",
"ToastPodcastEpisodeUpdated": "Épisode mis à jour",
"ToastPodcastGetFeedFailed": "Échec de la récupération du flux du podcast", "ToastPodcastGetFeedFailed": "Échec de la récupération du flux du podcast",
"ToastPodcastNoEpisodesInFeed": "Aucun épisode trouvé dans le flux RSS", "ToastPodcastNoEpisodesInFeed": "Aucun épisode trouvé dans le flux RSS",
"ToastPodcastNoRssFeed": "Le podcast na pas de flux RSS", "ToastPodcastNoRssFeed": "Le podcast na pas de flux RSS",
@@ -1127,5 +1151,13 @@
"ToastUserPasswordChangeSuccess": "Mot de passe modifié avec succès", "ToastUserPasswordChangeSuccess": "Mot de passe modifié avec succès",
"ToastUserPasswordMismatch": "Les mots de passe ne correspondent pas", "ToastUserPasswordMismatch": "Les mots de passe ne correspondent pas",
"ToastUserPasswordMustChange": "Le nouveau mot de passe ne peut pas être identique à lancien", "ToastUserPasswordMustChange": "Le nouveau mot de passe ne peut pas être identique à lancien",
"ToastUserRootRequireName": "Vous devez entrer un nom dutilisateur root" "ToastUserRootRequireName": "Vous devez entrer un nom dutilisateur root",
"TooltipAddChapters": "Ajouter chapitre(s)",
"TooltipAddOneSecond": "Ajouter 1 seconde",
"TooltipAdjustChapterStart": "Cliquez pour régler l'heure de début",
"TooltipLockAllChapters": "Verrouiller tous les chapitres",
"TooltipLockChapter": "Verrouiller le chapitre (Maj+clic pour plage)",
"TooltipSubtractOneSecond": "Soustraire 1 seconde",
"TooltipUnlockAllChapters": "Déverrouiller tous les chapitres",
"TooltipUnlockChapter": "Déverrouiller le chapitre (Maj+clic pour plage)"
} }
+3 -1
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "הוסף", "ButtonAdd": "הוסף",
"ButtonAddApiKey": "הוסף מפתח ממשק תכנות (API)",
"ButtonAddChapters": "הוסף פרקים", "ButtonAddChapters": "הוסף פרקים",
"ButtonAddDevice": "הוסף התקן", "ButtonAddDevice": "הוסף התקן",
"ButtonAddLibrary": "הוסף ספרייה", "ButtonAddLibrary": "הוסף ספרייה",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "בחר תיקייה", "ButtonChooseAFolder": "בחר תיקייה",
"ButtonChooseFiles": "בחר קבצים", "ButtonChooseFiles": "בחר קבצים",
"ButtonClearFilter": "נקה סינון", "ButtonClearFilter": "נקה סינון",
"ButtonClose": "סגור",
"ButtonCloseFeed": "סגור ערוץ", "ButtonCloseFeed": "סגור ערוץ",
"ButtonCloseSession": "סגור סשן פתוח", "ButtonCloseSession": "סגור סשן פתוח",
"ButtonCollections": "אוספים", "ButtonCollections": "אוספים",
@@ -346,7 +348,7 @@
"LabelExample": "דוגמה", "LabelExample": "דוגמה",
"LabelExpandSeries": "הרחב סדרה", "LabelExpandSeries": "הרחב סדרה",
"LabelExpandSubSeries": "הרחב תת סדרה", "LabelExpandSubSeries": "הרחב תת סדרה",
"LabelExplicit": "בוטה", "LabelExplicit": "מפורש",
"LabelExplicitChecked": "בוטה (מסומן)", "LabelExplicitChecked": "בוטה (מסומן)",
"LabelExplicitUnchecked": "לא בוטה (לא מסומן)", "LabelExplicitUnchecked": "לא בוטה (לא מסומן)",
"LabelExportOPML": "ייצוא OPML", "LabelExportOPML": "ייצוא OPML",
+9
View File
@@ -1,12 +1,18 @@
{ {
"ButtonAdd": "जोड़ें", "ButtonAdd": "जोड़ें",
"ButtonAddApiKey": "एपीआई कुंजी जोड़ें",
"ButtonAddChapters": "अध्याय जोड़ें", "ButtonAddChapters": "अध्याय जोड़ें",
"ButtonAddDevice": "उपकरण जोड़ें",
"ButtonAddLibrary": "संग्रह जोड़ें",
"ButtonAddPodcasts": "पॉडकास्ट जोड़ें", "ButtonAddPodcasts": "पॉडकास्ट जोड़ें",
"ButtonAddUser": "उपयोगकर्ता जोड़ें",
"ButtonAddYourFirstLibrary": "अपनी पहली पुस्तकालय जोड़ें", "ButtonAddYourFirstLibrary": "अपनी पहली पुस्तकालय जोड़ें",
"ButtonApply": "लागू करें", "ButtonApply": "लागू करें",
"ButtonApplyChapters": "अध्यायों में परिवर्तन लागू करें", "ButtonApplyChapters": "अध्यायों में परिवर्तन लागू करें",
"ButtonAuthors": "लेखक", "ButtonAuthors": "लेखक",
"ButtonBack": "पीछे", "ButtonBack": "पीछे",
"ButtonBatchEditPopulateFromExisting": "मौजूदा से आबाद करें",
"ButtonBatchEditPopulateMapDetails": "मानचित्र विवरण भरें",
"ButtonBrowseForFolder": "फ़ोल्डर खोजें", "ButtonBrowseForFolder": "फ़ोल्डर खोजें",
"ButtonCancel": "रद्द करें", "ButtonCancel": "रद्द करें",
"ButtonCancelEncode": "एनकोड रद्द करें", "ButtonCancelEncode": "एनकोड रद्द करें",
@@ -15,7 +21,9 @@
"ButtonChooseAFolder": "एक फ़ोल्डर चुनें", "ButtonChooseAFolder": "एक फ़ोल्डर चुनें",
"ButtonChooseFiles": "फ़ाइलें चुनें", "ButtonChooseFiles": "फ़ाइलें चुनें",
"ButtonClearFilter": "लागू फ़िल्टर साफ़ करें", "ButtonClearFilter": "लागू फ़िल्टर साफ़ करें",
"ButtonClose": "बंद करें",
"ButtonCloseFeed": "फ़ीड बंद करें", "ButtonCloseFeed": "फ़ीड बंद करें",
"ButtonCloseSession": "वर्तमान सत्र बंद करें",
"ButtonCollections": "संग्रह", "ButtonCollections": "संग्रह",
"ButtonConfigureScanner": "स्कैनर सेटिंग्स बदलें", "ButtonConfigureScanner": "स्कैनर सेटिंग्स बदलें",
"ButtonCreate": "बनाएं", "ButtonCreate": "बनाएं",
@@ -25,6 +33,7 @@
"ButtonEdit": "संपादित करें", "ButtonEdit": "संपादित करें",
"ButtonEditChapters": "अध्याय संपादित करें", "ButtonEditChapters": "अध्याय संपादित करें",
"ButtonEditPodcast": "पॉडकास्ट संपादित करें", "ButtonEditPodcast": "पॉडकास्ट संपादित करें",
"ButtonEnable": "सक्षम करें",
"ButtonForceReScan": "बलपूर्वक पुन: स्कैन करें", "ButtonForceReScan": "बलपूर्वक पुन: स्कैन करें",
"ButtonFullPath": "पूर्ण पथ", "ButtonFullPath": "पूर्ण पथ",
"ButtonHide": "छुपाएं", "ButtonHide": "छुपाएं",
+37 -3
View File
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Alati za upravljanje datotekama zvučnih knjiga", "HeaderAudiobookTools": "Alati za upravljanje datotekama zvučnih knjiga",
"HeaderAuthentication": "Provjera autentičnosti", "HeaderAuthentication": "Provjera autentičnosti",
"HeaderBackups": "Sigurnosne kopije", "HeaderBackups": "Sigurnosne kopije",
"HeaderBulkChapterModal": "Dodaj više poglavlja",
"HeaderChangePassword": "Promjena zaporke", "HeaderChangePassword": "Promjena zaporke",
"HeaderChapters": "Poglavlja", "HeaderChapters": "Poglavlja",
"HeaderChooseAFolder": "Odaberi mapu", "HeaderChooseAFolder": "Odaberi mapu",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Eksperimentalne značajke", "HeaderSettingsExperimental": "Eksperimentalne značajke",
"HeaderSettingsGeneral": "Općenito", "HeaderSettingsGeneral": "Općenito",
"HeaderSettingsScanner": "Skener", "HeaderSettingsScanner": "Skener",
"HeaderSettingsSecurity": "Sigurnost",
"HeaderSettingsWebClient": "Web klijent", "HeaderSettingsWebClient": "Web klijent",
"HeaderSleepTimer": "Timer za spavanje", "HeaderSleepTimer": "Timer za spavanje",
"HeaderStatsLargestItems": "Najveće stavke", "HeaderStatsLargestItems": "Najveće stavke",
@@ -293,6 +295,7 @@
"LabelContinueListening": "Nastavi slušati", "LabelContinueListening": "Nastavi slušati",
"LabelContinueReading": "Nastavi čitati", "LabelContinueReading": "Nastavi čitati",
"LabelContinueSeries": "Nastavi serijal", "LabelContinueSeries": "Nastavi serijal",
"LabelCorsAllowed": "Dozvoljena CORS ishodišta",
"LabelCover": "Naslovnica", "LabelCover": "Naslovnica",
"LabelCoverImageURL": "URL naslovnice", "LabelCoverImageURL": "URL naslovnice",
"LabelCoverProvider": "Pružatelj naslovnica", "LabelCoverProvider": "Pružatelj naslovnica",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Izbriši datoteke (uklonite kvačicu ako stavku želite izbrisati samo iz baze podataka)", "LabelDeleteFromFileSystemCheckbox": "Izbriši datoteke (uklonite kvačicu ako stavku želite izbrisati samo iz baze podataka)",
"LabelDescription": "Opis", "LabelDescription": "Opis",
"LabelDeselectAll": "Odznači sve", "LabelDeselectAll": "Odznači sve",
"LabelDetectedPattern": "Prepoznat obrazac:",
"LabelDevice": "Uređaj", "LabelDevice": "Uređaj",
"LabelDeviceInfo": "O uređaju", "LabelDeviceInfo": "O uređaju",
"LabelDeviceIsAvailableTo": "Uređaj je dostupan...", "LabelDeviceIsAvailableTo": "Uređaj je dostupan...",
@@ -373,7 +377,8 @@
"LabelFilename": "Naziv datoteke", "LabelFilename": "Naziv datoteke",
"LabelFilterByUser": "Filtriraj po korisniku", "LabelFilterByUser": "Filtriraj po korisniku",
"LabelFindEpisodes": "Pronađi nastavke", "LabelFindEpisodes": "Pronađi nastavke",
"LabelFinished": "Dovršeno", "LabelFinished": "Završeno",
"LabelFinishedDate": "Završeno {0}",
"LabelFolder": "Mapa", "LabelFolder": "Mapa",
"LabelFolders": "Mape", "LabelFolders": "Mape",
"LabelFontBold": "Podebljano", "LabelFontBold": "Podebljano",
@@ -418,6 +423,7 @@
"LabelLanguages": "Jezici", "LabelLanguages": "Jezici",
"LabelLastBookAdded": "Zadnja dodana knjiga", "LabelLastBookAdded": "Zadnja dodana knjiga",
"LabelLastBookUpdated": "Zadnja ažurirana knjiga", "LabelLastBookUpdated": "Zadnja ažurirana knjiga",
"LabelLastProgressDate": "Zadnji napredak: {0}",
"LabelLastSeen": "Zadnji puta viđen", "LabelLastSeen": "Zadnji puta viđen",
"LabelLastTime": "Zadnje doslušano vrijeme", "LabelLastTime": "Zadnje doslušano vrijeme",
"LabelLastUpdate": "Zadnje ažuriranje", "LabelLastUpdate": "Zadnje ažuriranje",
@@ -430,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Br {0}", "LabelLibraryFilterSublistEmpty": "Br {0}",
"LabelLibraryItem": "Stavka knjižnice", "LabelLibraryItem": "Stavka knjižnice",
"LabelLibraryName": "Ime knjižnice", "LabelLibraryName": "Ime knjižnice",
"LabelLibrarySortByProgress": "Napredak: zadnje ažurirano",
"LabelLibrarySortByProgressFinished": "Napredak: dovršeno",
"LabelLibrarySortByProgressStarted": "Napredak: započeto",
"LabelLimit": "Ograničenje", "LabelLimit": "Ograničenje",
"LabelLineSpacing": "Razmak između redaka", "LabelLineSpacing": "Razmak između redaka",
"LabelListenAgain": "Ponovno poslušaj", "LabelListenAgain": "Ponovno poslušaj",
@@ -438,6 +447,7 @@
"LabelLogLevelWarn": "Warn", "LabelLogLevelWarn": "Warn",
"LabelLookForNewEpisodesAfterDate": "Traži nove nastavke nakon ovog datuma", "LabelLookForNewEpisodesAfterDate": "Traži nove nastavke nakon ovog datuma",
"LabelLowestPriority": "Najniži prioritet", "LabelLowestPriority": "Najniži prioritet",
"LabelMatchConfidence": "Pouzdanost",
"LabelMatchExistingUsersBy": "Prepoznaj postojeće korisnike pomoću", "LabelMatchExistingUsersBy": "Prepoznaj postojeće korisnike pomoću",
"LabelMatchExistingUsersByDescription": "Rabi se za povezivanje postojećih korisnika. Nakon što se spoje, korisnike se prepoznaje temeljem jedinstvene oznake vašeg pružatelja SSO usluga", "LabelMatchExistingUsersByDescription": "Rabi se za povezivanje postojećih korisnika. Nakon što se spoje, korisnike se prepoznaje temeljem jedinstvene oznake vašeg pružatelja SSO usluga",
"LabelMaxEpisodesToDownload": "Najveći broj nastavaka za preuzimanje. 0 za neograničeno.", "LabelMaxEpisodesToDownload": "Najveći broj nastavaka za preuzimanje. 0 za neograničeno.",
@@ -467,6 +477,7 @@
"LabelNewestAuthors": "Najnoviji autori", "LabelNewestAuthors": "Najnoviji autori",
"LabelNewestEpisodes": "Najnoviji nastavci", "LabelNewestEpisodes": "Najnoviji nastavci",
"LabelNextBackupDate": "Sljedeća izrada sigurnosne kopije", "LabelNextBackupDate": "Sljedeća izrada sigurnosne kopije",
"LabelNextChapters": "Sljedeća poglavlja bit će:",
"LabelNextScheduledRun": "Sljedeće zakazano izvođenje", "LabelNextScheduledRun": "Sljedeće zakazano izvođenje",
"LabelNoApiKeys": "Nema API ključeva", "LabelNoApiKeys": "Nema API ključeva",
"LabelNoCustomMetadataProviders": "Nema prilagođenih pružatelja meta-podataka", "LabelNoCustomMetadataProviders": "Nema prilagođenih pružatelja meta-podataka",
@@ -484,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Najveći broj događaja za obavijest u redu čekanja", "LabelNotificationsMaxQueueSize": "Najveći broj događaja za obavijest u redu čekanja",
"LabelNotificationsMaxQueueSizeHelp": "Događaji se mogu okinuti samo jednom u sekundi. Događaji će se zanemariti ako je red čekanja pun. Ovo sprečava prekomjerno slanje obavijesti.", "LabelNotificationsMaxQueueSizeHelp": "Događaji se mogu okinuti samo jednom u sekundi. Događaji će se zanemariti ako je red čekanja pun. Ovo sprečava prekomjerno slanje obavijesti.",
"LabelNumberOfBooks": "Broj knjiga", "LabelNumberOfBooks": "Broj knjiga",
"LabelNumberOfChapters": "Broj poglavljâ:",
"LabelNumberOfEpisodes": "broj nastavaka", "LabelNumberOfEpisodes": "broj nastavaka",
"LabelOpenIDAdvancedPermsClaimDescription": "Naziv OpenID zahtjeva koji sadrži napredna dopuštenja za korisničke radnje u aplikaciji koje će se primijeniti na ne-administratorske uloge (<b>ako su konfigurirane</b>). Ako zahtjev nedostaje u odgovoru, pristup ABS-u neće se odobriti. Ako i jedna opcija nedostaje, smatrat će se da je <code>false</code>. Pripazite da zahtjev pružatelja identiteta uvijek odgovara očekivanoj strukturi:", "LabelOpenIDAdvancedPermsClaimDescription": "Naziv OpenID zahtjeva koji sadrži napredna dopuštenja za korisničke radnje u aplikaciji koje će se primijeniti na ne-administratorske uloge (<b>ako su konfigurirane</b>). Ako zahtjev nedostaje u odgovoru, pristup ABS-u neće se odobriti. Ako i jedna opcija nedostaje, smatrat će se da je <code>false</code>. Pripazite da zahtjev pružatelja identiteta uvijek odgovara očekivanoj strukturi:",
"LabelOpenIDClaims": "Sljedeće opcije ostavite praznima ako želite onemogućiti napredno dodjeljivanje grupa i dozvola, odnosno ako želite automatski dodijeliti grupu 'korisnik'.", "LabelOpenIDClaims": "Sljedeće opcije ostavite praznima ako želite onemogućiti napredno dodjeljivanje grupa i dozvola, odnosno ako želite automatski dodijeliti grupu 'korisnik'.",
@@ -626,6 +638,7 @@
"LabelStartTime": "Vrijeme početka", "LabelStartTime": "Vrijeme početka",
"LabelStarted": "Započeto", "LabelStarted": "Započeto",
"LabelStartedAt": "Započeto", "LabelStartedAt": "Započeto",
"LabelStartedDate": "Započeto {0}",
"LabelStatsAudioTracks": "Zvučni zapisi", "LabelStatsAudioTracks": "Zvučni zapisi",
"LabelStatsAuthors": "Autori", "LabelStatsAuthors": "Autori",
"LabelStatsBestDay": "Najbolji dan", "LabelStatsBestDay": "Najbolji dan",
@@ -655,6 +668,7 @@
"LabelTheme": "Tema", "LabelTheme": "Tema",
"LabelThemeDark": "Tamna", "LabelThemeDark": "Tamna",
"LabelThemeLight": "Svijetla", "LabelThemeLight": "Svijetla",
"LabelThemeSepia": "Sepija",
"LabelTimeBase": "Baza vremena", "LabelTimeBase": "Baza vremena",
"LabelTimeDurationXHours": "{0} sati", "LabelTimeDurationXHours": "{0} sati",
"LabelTimeDurationXMinutes": "{0} minuta", "LabelTimeDurationXMinutes": "{0} minuta",
@@ -739,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Nema rezultata za filter \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Nema rezultata za filter \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Vaš upit nema rezultata", "MessageBookshelfNoResultsForQuery": "Vaš upit nema rezultata",
"MessageBookshelfNoSeries": "Nemate niti jedan serijal", "MessageBookshelfNoSeries": "Nemate niti jedan serijal",
"MessageBulkChapterPattern": "Koliko poglavlja želite dodati s ovim obrascem numeracije?",
"MessageChapterEndIsAfter": "Kraj poglavlja je nakon kraja zvučne knjige", "MessageChapterEndIsAfter": "Kraj poglavlja je nakon kraja zvučne knjige",
"MessageChapterErrorFirstNotZero": "Prvo poglavlje mora započeti u 0", "MessageChapterErrorFirstNotZero": "Prvo poglavlje mora započeti u 0",
"MessageChapterErrorStartGteDuration": "Netočno vrijeme početka, mora biti manje od trajanja zvučne knjige", "MessageChapterErrorStartGteDuration": "Netočno vrijeme početka, mora biti manje od trajanja zvučne knjige",
@@ -801,6 +816,8 @@
"MessageFeedURLWillBe": "URL izvora bit će {0}", "MessageFeedURLWillBe": "URL izvora bit će {0}",
"MessageFetching": "Dohvaćam...", "MessageFetching": "Dohvaćam...",
"MessageForceReScanDescription": "će ponovno skenirati sve datoteke kao nove datoteke. ID3 tagovi zvučnih datoteka, OPF datoteke i tekstualne datoteke skenirat će se kao da su nove.", "MessageForceReScanDescription": "će ponovno skenirati sve datoteke kao nove datoteke. ID3 tagovi zvučnih datoteka, OPF datoteke i tekstualne datoteke skenirat će se kao da su nove.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} sluša</strong> na {1}",
"MessageHeatmapNoListeningSessions": "Nema sesija slušanja na {0}",
"MessageImportantNotice": "Važna obavijest!", "MessageImportantNotice": "Važna obavijest!",
"MessageInsertChapterBelow": "Unesi poglavlje ispod", "MessageInsertChapterBelow": "Unesi poglavlje ispod",
"MessageInvalidAsin": "Nevažeći ASIN", "MessageInvalidAsin": "Nevažeći ASIN",
@@ -867,7 +884,7 @@
"MessageRemoveEpisodes": "Ukloni {0} nastavaka", "MessageRemoveEpisodes": "Ukloni {0} nastavaka",
"MessageRemoveFromPlayerQueue": "Ukloni iz redoslijeda izvođenja", "MessageRemoveFromPlayerQueue": "Ukloni iz redoslijeda izvođenja",
"MessageRemoveUserWarning": "Sigurno želite trajno izbrisati korisnika \"{0}\"?", "MessageRemoveUserWarning": "Sigurno želite trajno izbrisati korisnika \"{0}\"?",
"MessageReportBugsAndContribute": "Prijavite pogreške, zatražite funkcionalnosti i doprinesite na", "MessageReportBugsAndContribute": "Prijavite pogreške, zatražite značajke i doprinesite na",
"MessageResetChaptersConfirm": "Sigurno želite vratiti poglavlja na prethodno stanje i poništiti učinjene promjene?", "MessageResetChaptersConfirm": "Sigurno želite vratiti poglavlja na prethodno stanje i poništiti učinjene promjene?",
"MessageRestoreBackupConfirm": "Sigurno želite vratiti sigurnosnu kopiju izrađenu", "MessageRestoreBackupConfirm": "Sigurno želite vratiti sigurnosnu kopiju izrađenu",
"MessageRestoreBackupWarning": "Vraćanjem sigurnosne kopije prepisat ćete cijelu bazu podataka koja se nalazi u /config i slike naslovnice u /metadata/items i /metadata/authors.<br /><br />Sigurnosne kopije ne mijenjaju datoteke koje se nalaze u mapama vaših knjižnica. Ako ste u postavkama poslužitelja uključili mogućnost spremanja naslovnica i meta-podataka u mape knjižnice, te se datoteke neće niti sigurnosno pohraniti niti prepisati. <br /><br />Svi klijenti koji se spajaju na vaš poslužitelj automatski će se osvježiti.", "MessageRestoreBackupWarning": "Vraćanjem sigurnosne kopije prepisat ćete cijelu bazu podataka koja se nalazi u /config i slike naslovnice u /metadata/items i /metadata/authors.<br /><br />Sigurnosne kopije ne mijenjaju datoteke koje se nalaze u mapama vaših knjižnica. Ako ste u postavkama poslužitelja uključili mogućnost spremanja naslovnica i meta-podataka u mape knjižnice, te se datoteke neće niti sigurnosno pohraniti niti prepisati. <br /><br />Svi klijenti koji se spajaju na vaš poslužitelj automatski će se osvježiti.",
@@ -940,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Pokreće se kada su automatska preuzimanja nastavaka onemogućena zbog previše neuspjelih pokušaja", "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", "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",
"PlaceholderBulkChapterInput": "Upišite naslov poglavlja ili ga numerirajte (npr. '1. nastavak', 'Poglavlje 10', '1.')",
"PlaceholderNewCollection": "Ime nove zbirke", "PlaceholderNewCollection": "Ime nove zbirke",
"PlaceholderNewFolderPath": "Nova putanja mape", "PlaceholderNewFolderPath": "Nova putanja mape",
"PlaceholderNewPlaylist": "Naziv novog popisa za izvođenje", "PlaceholderNewPlaylist": "Naziv novog popisa za izvođenje",
@@ -993,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Izrada knjižne oznake nije uspjela", "ToastBookmarkCreateFailed": "Izrada knjižne oznake nije uspjela",
"ToastBookmarkCreateSuccess": "Knjižna oznaka dodana", "ToastBookmarkCreateSuccess": "Knjižna oznaka dodana",
"ToastBookmarkRemoveSuccess": "Knjižna oznaka uklonjena", "ToastBookmarkRemoveSuccess": "Knjižna oznaka uklonjena",
"ToastBulkChapterInvalidCount": "Upišite broj od 1 i 150",
"ToastCachePurgeFailed": "Čišćenje predmemorije nije uspjelo", "ToastCachePurgeFailed": "Čišćenje predmemorije nije uspjelo",
"ToastCachePurgeSuccess": "Predmemorija uspješno očišćena", "ToastCachePurgeSuccess": "Predmemorija uspješno očišćena",
"ToastChapterLocked": "Poglavlje je zaključano.",
"ToastChapterStartTimeAdjusted": "Vrijeme početka poglavlja prilagođeno za {0} sekundi",
"ToastChaptersAllLocked": "Sva su poglavlja zaključana. Otključajte neka poglavlja za pomicanje njihovog vremena.",
"ToastChaptersHaveErrors": "Poglavlja imaju pogreške", "ToastChaptersHaveErrors": "Poglavlja imaju pogreške",
"ToastChaptersInvalidShiftAmountLast": "Neispravna vrijednost pomaka. Početak zadnjeg poglavlja bio bi nakon duljine trajanja ove zvučne knjige.", "ToastChaptersInvalidShiftAmountLast": "Neispravna vrijednost pomaka. Početak zadnjeg poglavlja bio bi nakon duljine trajanja ove zvučne knjige.",
"ToastChaptersInvalidShiftAmountStart": "Neispravna vrijednost pomaka. Trajanje prvog poglavlja bilo bi nula ili negativno i drugo poglavlje bi ga prepisalo. Povećajte vrijeme početka drugog poglavlja.", "ToastChaptersInvalidShiftAmountStart": "Neispravna vrijednost pomaka. Trajanje prvog poglavlja bilo bi nula ili negativno i drugo poglavlje bi ga prepisalo. Povećajte vrijeme početka drugog poglavlja.",
@@ -1004,6 +1026,8 @@
"ToastCollectionItemsAddFailed": "Neuspješno dodavanje stavki u zbirku", "ToastCollectionItemsAddFailed": "Neuspješno dodavanje stavki u zbirku",
"ToastCollectionRemoveSuccess": "Zbirka izbrisana", "ToastCollectionRemoveSuccess": "Zbirka izbrisana",
"ToastCollectionUpdateSuccess": "Zbirka ažurirana", "ToastCollectionUpdateSuccess": "Zbirka ažurirana",
"ToastConnectionNotAvailable": "Veza nije dostupna. Pokušaj ponovo kasnije",
"ToastCoverSearchFailed": "Pretraga naslovnice neuspjela",
"ToastCoverUpdateFailed": "Ažuriranje naslovnice nije uspjelo", "ToastCoverUpdateFailed": "Ažuriranje naslovnice nije uspjelo",
"ToastDateTimeInvalidOrIncomplete": "Datum i vrijeme su neispravni ili nepotpuni", "ToastDateTimeInvalidOrIncomplete": "Datum i vrijeme su neispravni ili nepotpuni",
"ToastDeleteFileFailed": "Brisanje datoteke nije uspjelo", "ToastDeleteFileFailed": "Brisanje datoteke nije uspjelo",
@@ -1028,6 +1052,7 @@
"ToastInvalidImageUrl": "Neispravan URL slike", "ToastInvalidImageUrl": "Neispravan URL slike",
"ToastInvalidMaxEpisodesToDownload": "Neispravan unos maksimalnog broja nastavaka", "ToastInvalidMaxEpisodesToDownload": "Neispravan unos maksimalnog broja nastavaka",
"ToastInvalidUrl": "Neispravan URL", "ToastInvalidUrl": "Neispravan URL",
"ToastInvalidUrls": "Jedan ili više URL-ova nisu ispravni",
"ToastItemCoverUpdateSuccess": "Naslovnica stavke ažurirana", "ToastItemCoverUpdateSuccess": "Naslovnica stavke ažurirana",
"ToastItemDeletedFailed": "Brisanje stavke nije uspjelo", "ToastItemDeletedFailed": "Brisanje stavke nije uspjelo",
"ToastItemDeletedSuccess": "Stavka je izbrisana", "ToastItemDeletedSuccess": "Stavka je izbrisana",
@@ -1077,6 +1102,7 @@
"ToastPlaylistUpdateSuccess": "Popis za izvođenje ažuriran", "ToastPlaylistUpdateSuccess": "Popis za izvođenje ažuriran",
"ToastPodcastCreateFailed": "Podcast nije izrađen", "ToastPodcastCreateFailed": "Podcast nije izrađen",
"ToastPodcastCreateSuccess": "Podcast uspješno izrađen", "ToastPodcastCreateSuccess": "Podcast uspješno izrađen",
"ToastPodcastEpisodeUpdated": "Nastavak ažuriran",
"ToastPodcastGetFeedFailed": "Dohvat izvora podcasta nije uspio", "ToastPodcastGetFeedFailed": "Dohvat izvora podcasta nije uspio",
"ToastPodcastNoEpisodesInFeed": "U RSS izvoru nisu pronađeni nastavci", "ToastPodcastNoEpisodesInFeed": "U RSS izvoru nisu pronađeni nastavci",
"ToastPodcastNoRssFeed": "Podcast nema RSS izvor", "ToastPodcastNoRssFeed": "Podcast nema RSS izvor",
@@ -1127,5 +1153,13 @@
"ToastUserPasswordChangeSuccess": "Zaporka je uspješno promijenjena", "ToastUserPasswordChangeSuccess": "Zaporka je uspješno promijenjena",
"ToastUserPasswordMismatch": "Zaporke se ne podudaraju", "ToastUserPasswordMismatch": "Zaporke se ne podudaraju",
"ToastUserPasswordMustChange": "Nova zaporka ne smije biti jednaka staroj", "ToastUserPasswordMustChange": "Nova zaporka ne smije biti jednaka staroj",
"ToastUserRootRequireName": "Obavezan je unos korisničkog imena root korisnika" "ToastUserRootRequireName": "Obavezan je unos korisničkog imena root korisnika",
"TooltipAddChapters": "Dodavanje poglavlja",
"TooltipAddOneSecond": "Dodaj 1 sekundu",
"TooltipAdjustChapterStart": "Kliknite za uređivanje početnog vremena",
"TooltipLockAllChapters": "Zaključaj sva poglavlja",
"TooltipLockChapter": "Zaključaj poglavlje (Shift + klik za raspon)",
"TooltipSubtractOneSecond": "Oduzmi 1 sekundu",
"TooltipUnlockAllChapters": "Otključaj sva poglavlja",
"TooltipUnlockChapter": "Otključaj poglavlje (Shift+klik za raspon)"
} }
+57 -2
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Hozzáadás", "ButtonAdd": "Hozzáadás",
"ButtonAddApiKey": "API kulcs hozzáadása",
"ButtonAddChapters": "Fejezetek hozzáadása", "ButtonAddChapters": "Fejezetek hozzáadása",
"ButtonAddDevice": "Eszköz hozzáadása", "ButtonAddDevice": "Eszköz hozzáadása",
"ButtonAddLibrary": "Könyvtár hozzáadása", "ButtonAddLibrary": "Könyvtár hozzáadása",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Válassz egy mappát", "ButtonChooseAFolder": "Válassz egy mappát",
"ButtonChooseFiles": "Fájlok kiválasztása", "ButtonChooseFiles": "Fájlok kiválasztása",
"ButtonClearFilter": "Szűrő törlése", "ButtonClearFilter": "Szűrő törlése",
"ButtonClose": "Bezár",
"ButtonCloseFeed": "Hírcsatorna bezárása", "ButtonCloseFeed": "Hírcsatorna bezárása",
"ButtonCloseSession": "Nyitott munkamenet bezárása", "ButtonCloseSession": "Nyitott munkamenet bezárása",
"ButtonCollections": "Gyűjtemények", "ButtonCollections": "Gyűjtemények",
@@ -119,11 +121,13 @@
"HeaderAccount": "Fiók", "HeaderAccount": "Fiók",
"HeaderAddCustomMetadataProvider": "Egyedi metaadat szolgáltató hozzáadása", "HeaderAddCustomMetadataProvider": "Egyedi metaadat szolgáltató hozzáadása",
"HeaderAdvanced": "Haladó", "HeaderAdvanced": "Haladó",
"HeaderApiKeys": "API kulcsok",
"HeaderAppriseNotificationSettings": "Apprise értesítési beállítások", "HeaderAppriseNotificationSettings": "Apprise értesítési beállítások",
"HeaderAudioTracks": "Audiósávok", "HeaderAudioTracks": "Audiósávok",
"HeaderAudiobookTools": "Hangoskönyv fájlkezelő eszközök", "HeaderAudiobookTools": "Hangoskönyv fájlkezelő eszközök",
"HeaderAuthentication": "Hitelesítés", "HeaderAuthentication": "Hitelesítés",
"HeaderBackups": "Biztonsági másolatok", "HeaderBackups": "Biztonsági másolatok",
"HeaderBulkChapterModal": "Több fejezet hozzáadása",
"HeaderChangePassword": "Jelszó megváltoztatása", "HeaderChangePassword": "Jelszó megváltoztatása",
"HeaderChapters": "Fejezetek", "HeaderChapters": "Fejezetek",
"HeaderChooseAFolder": "Válasszon egy mappát", "HeaderChooseAFolder": "Válasszon egy mappát",
@@ -162,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Metaadatok előnyben részesítési sorrendje", "HeaderMetadataOrderOfPrecedence": "Metaadatok előnyben részesítési sorrendje",
"HeaderMetadataToEmbed": "Beágyazandó metaadatok", "HeaderMetadataToEmbed": "Beágyazandó metaadatok",
"HeaderNewAccount": "Új fiók", "HeaderNewAccount": "Új fiók",
"HeaderNewApiKey": "Új API kulcs",
"HeaderNewLibrary": "Új könyvtár", "HeaderNewLibrary": "Új könyvtár",
"HeaderNotificationCreate": "Értesítés készítése", "HeaderNotificationCreate": "Értesítés készítése",
"HeaderNotificationUpdate": "Értesítés frissítése", "HeaderNotificationUpdate": "Értesítés frissítése",
@@ -195,6 +200,7 @@
"HeaderSettingsExperimental": "Kísérleti funkciók", "HeaderSettingsExperimental": "Kísérleti funkciók",
"HeaderSettingsGeneral": "Általános", "HeaderSettingsGeneral": "Általános",
"HeaderSettingsScanner": "Szkenner", "HeaderSettingsScanner": "Szkenner",
"HeaderSettingsSecurity": "Biztonság",
"HeaderSettingsWebClient": "Webkliens", "HeaderSettingsWebClient": "Webkliens",
"HeaderSleepTimer": "Alvásidőzítő", "HeaderSleepTimer": "Alvásidőzítő",
"HeaderStatsLargestItems": "Legnagyobb elemek", "HeaderStatsLargestItems": "Legnagyobb elemek",
@@ -206,6 +212,7 @@
"HeaderTableOfContents": "Tartalomjegyzék", "HeaderTableOfContents": "Tartalomjegyzék",
"HeaderTools": "Eszközök", "HeaderTools": "Eszközök",
"HeaderUpdateAccount": "Fiók frissítése", "HeaderUpdateAccount": "Fiók frissítése",
"HeaderUpdateApiKey": "API kulcs frissítése",
"HeaderUpdateAuthor": "Szerző frissítése", "HeaderUpdateAuthor": "Szerző frissítése",
"HeaderUpdateDetails": "Részletek frissítése", "HeaderUpdateDetails": "Részletek frissítése",
"HeaderUpdateLibrary": "Könyvtár frissítése", "HeaderUpdateLibrary": "Könyvtár frissítése",
@@ -235,6 +242,10 @@
"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",
"LabelAlreadyInYourLibrary": "Már a könyvtárában van", "LabelAlreadyInYourLibrary": "Már a könyvtárában van",
"LabelApiKeyCreated": "\"{0}\" API kulcs sikeresen létrehozva.",
"LabelApiKeyCreatedDescription": "Feltétlenül másolja le az API kulcsot, mert később már nem fogja látni.",
"LabelApiKeyUser": "Felhasználó nevében eljárva",
"LabelApiKeyUserDescription": "Ez az API-kulcs ugyanazokkal a jogosultságokkal rendelkezik, mint az a felhasználó, akinek a nevében működik. A naplófájlokban ez úgy jelenik meg, mintha a felhasználó maga küldte volna a kérést.",
"LabelApiToken": "API Token", "LabelApiToken": "API Token",
"LabelAppend": "Hozzáfűzés", "LabelAppend": "Hozzáfűzés",
"LabelAudioBitrate": "Audió bitráta (pl.128k)", "LabelAudioBitrate": "Audió bitráta (pl.128k)",
@@ -264,7 +275,7 @@
"LabelBonus": "Bónusz", "LabelBonus": "Bónusz",
"LabelBooks": "Könyvek", "LabelBooks": "Könyvek",
"LabelButtonText": "Gomb szövege", "LabelButtonText": "Gomb szövege",
"LabelByAuthor": "{} által", "LabelByAuthor": "{0} által",
"LabelChangePassword": "Jelszó megváltoztatása", "LabelChangePassword": "Jelszó megváltoztatása",
"LabelChannels": "Csatornák", "LabelChannels": "Csatornák",
"LabelChapterCount": "{0} Fejezet", "LabelChapterCount": "{0} Fejezet",
@@ -284,6 +295,7 @@
"LabelContinueListening": "Hallgatás folytatása", "LabelContinueListening": "Hallgatás folytatása",
"LabelContinueReading": "Olvasás folytatása", "LabelContinueReading": "Olvasás folytatása",
"LabelContinueSeries": "Sorozat folytatása", "LabelContinueSeries": "Sorozat folytatása",
"LabelCorsAllowed": "Megengedett CORS Originek",
"LabelCover": "Borító", "LabelCover": "Borító",
"LabelCoverImageURL": "Borítókép URL", "LabelCoverImageURL": "Borítókép URL",
"LabelCoverProvider": "Borító Szolgáltató", "LabelCoverProvider": "Borító Szolgáltató",
@@ -297,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Törlés a fájlrendszerről (ne jelölje be, ha csak az adatbázisból szeretné eltávolítani)", "LabelDeleteFromFileSystemCheckbox": "Törlés a fájlrendszerről (ne jelölje be, ha csak az adatbázisból szeretné eltávolítani)",
"LabelDescription": "Leírás", "LabelDescription": "Leírás",
"LabelDeselectAll": "Minden kijelölés megszüntetése", "LabelDeselectAll": "Minden kijelölés megszüntetése",
"LabelDetectedPattern": "Észlelt minta:",
"LabelDevice": "Eszköz", "LabelDevice": "Eszköz",
"LabelDeviceInfo": "Eszköz információ", "LabelDeviceInfo": "Eszköz információ",
"LabelDeviceIsAvailableTo": "Eszköz elérhető a következő számára...", "LabelDeviceIsAvailableTo": "Eszköz elérhető a következő számára...",
@@ -346,6 +359,10 @@
"LabelExample": "Példa", "LabelExample": "Példa",
"LabelExpandSeries": "Sorozat kinyitása", "LabelExpandSeries": "Sorozat kinyitása",
"LabelExpandSubSeries": "Alsorozat kinyitása", "LabelExpandSubSeries": "Alsorozat kinyitása",
"LabelExpired": "Lejárt",
"LabelExpiresAt": "Lejár",
"LabelExpiresInSeconds": "Lejár (másodpercben)",
"LabelExpiresNever": "Soha",
"LabelExplicit": "Szókimondó", "LabelExplicit": "Szókimondó",
"LabelExplicitChecked": "Explicit (ellenőrizve)", "LabelExplicitChecked": "Explicit (ellenőrizve)",
"LabelExplicitUnchecked": "Nem explicit (nem ellenőrzött)", "LabelExplicitUnchecked": "Nem explicit (nem ellenőrzött)",
@@ -361,6 +378,7 @@
"LabelFilterByUser": "Szűrés felhasználó szerint", "LabelFilterByUser": "Szűrés felhasználó szerint",
"LabelFindEpisodes": "Epizódok keresése", "LabelFindEpisodes": "Epizódok keresése",
"LabelFinished": "Befejezett", "LabelFinished": "Befejezett",
"LabelFinishedDate": "Befejezve {0}",
"LabelFolder": "Mappa", "LabelFolder": "Mappa",
"LabelFolders": "Mappák", "LabelFolders": "Mappák",
"LabelFontBold": "Félkövér", "LabelFontBold": "Félkövér",
@@ -405,6 +423,7 @@
"LabelLanguages": "Nyelvek", "LabelLanguages": "Nyelvek",
"LabelLastBookAdded": "Utolsó hozzáadott könyv", "LabelLastBookAdded": "Utolsó hozzáadott könyv",
"LabelLastBookUpdated": "Utolsó frissített könyv", "LabelLastBookUpdated": "Utolsó frissített könyv",
"LabelLastProgressDate": "Legutóbbi haladás: {0}",
"LabelLastSeen": "Utolsó látogatás", "LabelLastSeen": "Utolsó látogatás",
"LabelLastTime": "Utolsó alkalom", "LabelLastTime": "Utolsó alkalom",
"LabelLastUpdate": "Utolsó frissítés", "LabelLastUpdate": "Utolsó frissítés",
@@ -417,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Nem {0}", "LabelLibraryFilterSublistEmpty": "Nem {0}",
"LabelLibraryItem": "Könyvtári elem", "LabelLibraryItem": "Könyvtári elem",
"LabelLibraryName": "Könyvtár neve", "LabelLibraryName": "Könyvtár neve",
"LabelLibrarySortByProgress": "Folyamat: Legutóbbi frissítés",
"LabelLibrarySortByProgressFinished": "Folyamat: Befejezve",
"LabelLibrarySortByProgressStarted": "Folyamat: Elindult",
"LabelLimit": "Korlát", "LabelLimit": "Korlát",
"LabelLineSpacing": "Sorköz", "LabelLineSpacing": "Sorköz",
"LabelListenAgain": "Újrahallgatás", "LabelListenAgain": "Újrahallgatás",
@@ -425,6 +447,7 @@
"LabelLogLevelWarn": "Figyelmeztetés", "LabelLogLevelWarn": "Figyelmeztetés",
"LabelLookForNewEpisodesAfterDate": "Új epizódok keresése ezen a dátum után", "LabelLookForNewEpisodesAfterDate": "Új epizódok keresése ezen a dátum után",
"LabelLowestPriority": "Legalacsonyabb prioritás", "LabelLowestPriority": "Legalacsonyabb prioritás",
"LabelMatchConfidence": "Bizalom",
"LabelMatchExistingUsersBy": "Meglévő felhasználók egyeztetése", "LabelMatchExistingUsersBy": "Meglévő felhasználók egyeztetése",
"LabelMatchExistingUsersByDescription": "Meglévő felhasználók összekapcsolására használt. Egyszer összekapcsolva, a felhasználók egyedülálló azonosítóval lesznek egyeztetve az Ön SSO szolgáltatójától", "LabelMatchExistingUsersByDescription": "Meglévő felhasználók összekapcsolására használt. Egyszer összekapcsolva, a felhasználók egyedülálló azonosítóval lesznek egyeztetve az Ön SSO szolgáltatójától",
"LabelMaxEpisodesToDownload": "Letölthető epizódok maximális száma. Használja a 0-t a korlátlan letöltéshez.", "LabelMaxEpisodesToDownload": "Letölthető epizódok maximális száma. Használja a 0-t a korlátlan letöltéshez.",
@@ -454,7 +477,9 @@
"LabelNewestAuthors": "A legújabb szerzők", "LabelNewestAuthors": "A legújabb szerzők",
"LabelNewestEpisodes": "Legújabb epizódok", "LabelNewestEpisodes": "Legújabb epizódok",
"LabelNextBackupDate": "Következő biztonsági másolat dátuma", "LabelNextBackupDate": "Következő biztonsági másolat dátuma",
"LabelNextChapters": "A következő fejezetek:",
"LabelNextScheduledRun": "Következő ütemezett futtatás", "LabelNextScheduledRun": "Következő ütemezett futtatás",
"LabelNoApiKeys": "Nincs API kulcs",
"LabelNoCustomMetadataProviders": "Nincsenek egyedi metaadat szolgáltatók", "LabelNoCustomMetadataProviders": "Nincsenek egyedi metaadat szolgáltatók",
"LabelNoEpisodesSelected": "Nincsenek kiválasztott epizódok", "LabelNoEpisodesSelected": "Nincsenek kiválasztott epizódok",
"LabelNotFinished": "Nem befejezett", "LabelNotFinished": "Nem befejezett",
@@ -470,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Maximális értesítési események sorának mérete", "LabelNotificationsMaxQueueSize": "Maximális értesítési események sorának mérete",
"LabelNotificationsMaxQueueSizeHelp": "Az események korlátozva vannak, hogy másodpercenként 1-szer történjenek. Ha a sor maximális méretű, akkor az események figyelmen kívül lesznek hagyva. Ez megakadályozza az értesítések spamelését.", "LabelNotificationsMaxQueueSizeHelp": "Az események korlátozva vannak, hogy másodpercenként 1-szer történjenek. Ha a sor maximális méretű, akkor az események figyelmen kívül lesznek hagyva. Ez megakadályozza az értesítések spamelését.",
"LabelNumberOfBooks": "Könyvek száma", "LabelNumberOfBooks": "Könyvek száma",
"LabelNumberOfChapters": "Fejezetek száma:",
"LabelNumberOfEpisodes": "Epizódok száma", "LabelNumberOfEpisodes": "Epizódok száma",
"LabelOpenIDAdvancedPermsClaimDescription": "Az OpenID-igény neve, amely a felhasználói műveletekre vonatkozó haladó jogosultságokat tartalmazza az alkalmazáson belül, és amely a nem adminisztrátori szerepkörökre vonatkozik (<b>ha konfigurálva van</b>). Ha az igény hiányzik a válaszból, az ABS-hez való hozzáférés megtagadásra kerül. Ha egyetlen opció hiányzik, azt <code>false</code>-ként fogja kezelni. Győződj meg arról, hogy az identitásszolgáltató igénye megfelel a várt struktúrának:", "LabelOpenIDAdvancedPermsClaimDescription": "Az OpenID-igény neve, amely a felhasználói műveletekre vonatkozó haladó jogosultságokat tartalmazza az alkalmazáson belül, és amely a nem adminisztrátori szerepkörökre vonatkozik (<b>ha konfigurálva van</b>). Ha az igény hiányzik a válaszból, az ABS-hez való hozzáférés megtagadásra kerül. Ha egyetlen opció hiányzik, azt <code>false</code>-ként fogja kezelni. Győződj meg arról, hogy az identitásszolgáltató igénye megfelel a várt struktúrának:",
"LabelOpenIDClaims": "Hagyd üresen a következő opciókat, hogy letiltsd a haladó csoport- és jogosultság-hozzárendelést, ekkor automatikusan a Felhasználó’ csoport kerül hozzárendelésre.", "LabelOpenIDClaims": "Hagyd üresen a következő opciókat, hogy letiltsd a haladó csoport- és jogosultság-hozzárendelést, ekkor automatikusan a Felhasználó’ csoport kerül hozzárendelésre.",
@@ -544,6 +570,7 @@
"LabelSelectAll": "Minden kiválasztása", "LabelSelectAll": "Minden kiválasztása",
"LabelSelectAllEpisodes": "Összes epizód kiválasztása", "LabelSelectAllEpisodes": "Összes epizód kiválasztása",
"LabelSelectEpisodesShowing": "Kiválasztás {0} megjelenített epizód", "LabelSelectEpisodesShowing": "Kiválasztás {0} megjelenített epizód",
"LabelSelectUser": "Felhasználó kiválasztása",
"LabelSelectUsers": "Felhasználók kiválasztása", "LabelSelectUsers": "Felhasználók kiválasztása",
"LabelSendEbookToDevice": "E-könyv küldése...", "LabelSendEbookToDevice": "E-könyv küldése...",
"LabelSequence": "Sorozat", "LabelSequence": "Sorozat",
@@ -611,6 +638,7 @@
"LabelStartTime": "Kezdési idő", "LabelStartTime": "Kezdési idő",
"LabelStarted": "Elkezdődött", "LabelStarted": "Elkezdődött",
"LabelStartedAt": "Kezdés ideje", "LabelStartedAt": "Kezdés ideje",
"LabelStartedDate": "Elindítva {0}",
"LabelStatsAudioTracks": "Audiósáv", "LabelStatsAudioTracks": "Audiósáv",
"LabelStatsAuthors": "Szerző", "LabelStatsAuthors": "Szerző",
"LabelStatsBestDay": "Legjobb nap", "LabelStatsBestDay": "Legjobb nap",
@@ -640,6 +668,7 @@
"LabelTheme": "Téma", "LabelTheme": "Téma",
"LabelThemeDark": "Sötét", "LabelThemeDark": "Sötét",
"LabelThemeLight": "Világos", "LabelThemeLight": "Világos",
"LabelThemeSepia": "Szépia",
"LabelTimeBase": "Időalap", "LabelTimeBase": "Időalap",
"LabelTimeDurationXHours": "{0} óra", "LabelTimeDurationXHours": "{0} óra",
"LabelTimeDurationXMinutes": "{0} perc", "LabelTimeDurationXMinutes": "{0} perc",
@@ -708,7 +737,9 @@
"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.", "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.",
"MessageAuthenticationLegacyTokenWarning": "A régi API-tokenek a jövőben eltávolításra kerülnek. Helyette használja az <a href=\"/config/api-keys\">API-kulcsokat</a>.",
"MessageAuthenticationOIDCChangesRestart": "A mentés után indítsa újra a szervert az OIDC módosítások alkalmazásához.", "MessageAuthenticationOIDCChangesRestart": "A mentés után indítsa újra a szervert az OIDC módosítások alkalmazásához.",
"MessageAuthenticationSecurityMessage": "A biztonság érdekében a hitelesítés folyamatát továbbfejlesztettük. Minden felhasználónak újra be kell jelentkeznie.",
"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ó.",
@@ -722,6 +753,7 @@
"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",
"MessageBookshelfNoSeries": "Nincsenek sorozatai", "MessageBookshelfNoSeries": "Nincsenek sorozatai",
"MessageBulkChapterPattern": "Hány fejezetet szeretne hozzáadni ezzel a számozási mintával?",
"MessageChapterEndIsAfter": "A fejezet vége a hangoskönyv végét követi", "MessageChapterEndIsAfter": "A fejezet vége a hangoskönyv végét követi",
"MessageChapterErrorFirstNotZero": "Az első fejezetnek 0:00-kor kell kezdődnie", "MessageChapterErrorFirstNotZero": "Az első fejezetnek 0:00-kor kell kezdődnie",
"MessageChapterErrorStartGteDuration": "Érvénytelen kezdési idő, kevesebbnek kell lennie, mint a hangoskönyv időtartama", "MessageChapterErrorStartGteDuration": "Érvénytelen kezdési idő, kevesebbnek kell lennie, mint a hangoskönyv időtartama",
@@ -730,6 +762,7 @@
"MessageChaptersNotFound": "Fejezetek nem találhatók", "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?",
"MessageConfirmDeleteApiKey": "Biztosan törölni szeretné az \"{0}\" API kulcsot?",
"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?",
"MessageConfirmDeleteDevice": "Biztos, hogy törölni szeretné a „{0}” e-olvasó eszközt?", "MessageConfirmDeleteDevice": "Biztos, hogy törölni szeretné a „{0}” e-olvasó eszközt?",
"MessageConfirmDeleteFile": "Ez törölni fogja a fájlt a fájlrendszerből. Biztos benne?", "MessageConfirmDeleteFile": "Ez törölni fogja a fájlt a fájlrendszerből. Biztos benne?",
@@ -783,6 +816,8 @@
"MessageFeedURLWillBe": "A hírcsatorna URL-je {0} lesz", "MessageFeedURLWillBe": "A hírcsatorna URL-je {0} lesz",
"MessageFetching": "Lekérdezés...", "MessageFetching": "Lekérdezés...",
"MessageForceReScanDescription": "minden fájlt újra szkennel, mint egy friss szkennelés. Az audiofájlok ID3 címkéi, OPF fájlok és szövegfájlok újként lesznek szkennelve.", "MessageForceReScanDescription": "minden fájlt újra szkennel, mint egy friss szkennelés. Az audiofájlok ID3 címkéi, OPF fájlok és szövegfájlok újként lesznek szkennelve.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} hallgatja</strong> ezen {1}",
"MessageHeatmapNoListeningSessions": "Nincs hallgatás folyamatban ezen: {0}",
"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", "MessageInvalidAsin": "Érvénytelen ASIN",
@@ -922,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Akkor lép működésbe, ha az automatikus epizódletöltés a túl sok sikertelen próbálkozás miatt letiltásra kerül", "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", "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",
"PlaceholderBulkChapterInput": "Írja be a fejezet címét vagy használjon számozást (pl. „1. epizód”, „10. fejezet”, „1.”)",
"PlaceholderNewCollection": "Új gyűjtemény neve", "PlaceholderNewCollection": "Új gyűjtemény neve",
"PlaceholderNewFolderPath": "Új mappa útvonala", "PlaceholderNewFolderPath": "Új mappa útvonala",
"PlaceholderNewPlaylist": "Új lejátszási lista neve", "PlaceholderNewPlaylist": "Új lejátszási lista neve",
@@ -975,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Könyvjelző létrehozása sikertelen", "ToastBookmarkCreateFailed": "Könyvjelző létrehozása sikertelen",
"ToastBookmarkCreateSuccess": "Könyvjelző hozzáadva", "ToastBookmarkCreateSuccess": "Könyvjelző hozzáadva",
"ToastBookmarkRemoveSuccess": "Könyvjelző eltávolítva", "ToastBookmarkRemoveSuccess": "Könyvjelző eltávolítva",
"ToastBulkChapterInvalidCount": "Írjon be egy számot 1 és 150 között",
"ToastCachePurgeFailed": "A gyorsítótár törlése sikertelen", "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",
"ToastChapterLocked": "A fejezet zárolt.",
"ToastChapterStartTimeAdjusted": "A fejezet kezdési ideje {0} másodperccel módosítva",
"ToastChaptersAllLocked": "Minden fejezet zárolt. Nyisson meg néhány fejezetet, hogy módosítsa azok idejét.",
"ToastChaptersHaveErrors": "A fejezetek hibákat tartalmaznak", "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.", "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.", "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.",
@@ -986,6 +1026,8 @@
"ToastCollectionItemsAddFailed": "A tétel(ek) hozzáadása gyűjteményhez sikertelen", "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",
"ToastConnectionNotAvailable": "A kapcsolat nem elérhető. Kérem, próbálkozzon később",
"ToastCoverSearchFailed": "A borítók keresése sikertelen",
"ToastCoverUpdateFailed": "A borító frissítése nem sikerült", "ToastCoverUpdateFailed": "A borító frissítése nem sikerült",
"ToastDateTimeInvalidOrIncomplete": "A dátum és az időpont érvénytelen vagy hiányos", "ToastDateTimeInvalidOrIncomplete": "A dátum és az időpont érvénytelen vagy hiányos",
"ToastDeleteFileFailed": "Nem sikerült törölni a fájlt", "ToastDeleteFileFailed": "Nem sikerült törölni a fájlt",
@@ -1001,6 +1043,8 @@
"ToastEpisodeDownloadQueueClearSuccess": "Epizód letöltési várólista törölve", "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",
"ToastFailedToCreate": "Sikertelen létrehozás",
"ToastFailedToDelete": "Sikertelen törlés",
"ToastFailedToLoadData": "Sikertelen adatbetöltés", "ToastFailedToLoadData": "Sikertelen adatbetöltés",
"ToastFailedToMatch": "Nem sikerült egyezőséget találni", "ToastFailedToMatch": "Nem sikerült egyezőséget találni",
"ToastFailedToShare": "Nem sikerült megosztani", "ToastFailedToShare": "Nem sikerült megosztani",
@@ -1008,6 +1052,7 @@
"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", "ToastInvalidMaxEpisodesToDownload": "A letölthető epizódok száma érvénytelen",
"ToastInvalidUrl": "Érvénytelen URL", "ToastInvalidUrl": "Érvénytelen URL",
"ToastInvalidUrls": "Egy vagy több URL érvénytelen",
"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",
"ToastItemDeletedSuccess": "Elem törölve", "ToastItemDeletedSuccess": "Elem törölve",
@@ -1032,6 +1077,7 @@
"ToastMustHaveAtLeastOnePath": "Legalább egy elérési útvonalnak kell lennie", "ToastMustHaveAtLeastOnePath": "Legalább egy elérési útvonalnak kell lennie",
"ToastNameEmailRequired": "Név és e-mail cím megadása kötelező", "ToastNameEmailRequired": "Név és e-mail cím megadása kötelező",
"ToastNameRequired": "A név megadása kötelező", "ToastNameRequired": "A név megadása kötelező",
"ToastNewApiKeyUserError": "Ki kell választani egy felhasználót",
"ToastNewEpisodesFound": "{0} új epizód", "ToastNewEpisodesFound": "{0} új epizód",
"ToastNewUserCreatedFailed": "Nem sikerült a fiókot létrehozni: „{0}”", "ToastNewUserCreatedFailed": "Nem sikerült a fiókot létrehozni: „{0}”",
"ToastNewUserCreatedSuccess": "Új fiók létrehozva", "ToastNewUserCreatedSuccess": "Új fiók létrehozva",
@@ -1056,6 +1102,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",
"ToastPodcastEpisodeUpdated": "Epizód frissítve",
"ToastPodcastGetFeedFailed": "Nem sikerült podcast feedet kapni", "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",
@@ -1106,5 +1153,13 @@
"ToastUserPasswordChangeSuccess": "Jelszó sikeresen megváltoztatva", "ToastUserPasswordChangeSuccess": "Jelszó sikeresen megváltoztatva",
"ToastUserPasswordMismatch": "A jelszavak nem egyeznek", "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",
"TooltipAddChapters": "Fejezet(ek) hozzáadása",
"TooltipAddOneSecond": "1 másodperc hozzáadása",
"TooltipAdjustChapterStart": "Kattintson a kezdési idő beállításához",
"TooltipLockAllChapters": "Az összes fejezet zárolása",
"TooltipLockChapter": "Fejezet zárolása (Shift+kattintás a tartományhoz)",
"TooltipSubtractOneSecond": "1 másodperc levonása",
"TooltipUnlockAllChapters": "Az összes fejezet feloldása",
"TooltipUnlockChapter": "Fejezet feloldása (Shift+kattintás a tartományhoz)"
} }
+50 -2
View File
@@ -1,6 +1,6 @@
{ {
"ButtonAdd": "Aggiungi", "ButtonAdd": "Aggiungi",
"ButtonAddApiKey": "Aggiungi chiave API", "ButtonAddApiKey": "Aggiungi la chiave API",
"ButtonAddChapters": "Aggiungi Capitoli", "ButtonAddChapters": "Aggiungi Capitoli",
"ButtonAddDevice": "Aggiungi Dispositivo", "ButtonAddDevice": "Aggiungi Dispositivo",
"ButtonAddLibrary": "Aggiungi Libreria", "ButtonAddLibrary": "Aggiungi Libreria",
@@ -121,11 +121,13 @@
"HeaderAccount": "Account", "HeaderAccount": "Account",
"HeaderAddCustomMetadataProvider": "Aggiungi fornitori di metadati personalizzati", "HeaderAddCustomMetadataProvider": "Aggiungi fornitori di metadati personalizzati",
"HeaderAdvanced": "Avanzate", "HeaderAdvanced": "Avanzate",
"HeaderApiKeys": "Le chiavi API",
"HeaderAppriseNotificationSettings": "Apprendi le impostazioni di Notifica", "HeaderAppriseNotificationSettings": "Apprendi le impostazioni di Notifica",
"HeaderAudioTracks": "Tracce audio", "HeaderAudioTracks": "Tracce audio",
"HeaderAudiobookTools": "Strumenti di gestione file audiolibri", "HeaderAudiobookTools": "Strumenti di gestione file audiolibri",
"HeaderAuthentication": "Authenticazione", "HeaderAuthentication": "Authenticazione",
"HeaderBackups": "Backup", "HeaderBackups": "Backup",
"HeaderBulkChapterModal": "Aggiungere più capitoli",
"HeaderChangePassword": "Cambia la password", "HeaderChangePassword": "Cambia la password",
"HeaderChapters": "Capitoli", "HeaderChapters": "Capitoli",
"HeaderChooseAFolder": "Seleziona la cartella", "HeaderChooseAFolder": "Seleziona la cartella",
@@ -164,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Priorità ordine Metadata", "HeaderMetadataOrderOfPrecedence": "Priorità ordine Metadata",
"HeaderMetadataToEmbed": "Metadata da incorporare", "HeaderMetadataToEmbed": "Metadata da incorporare",
"HeaderNewAccount": "Nuovo Account", "HeaderNewAccount": "Nuovo Account",
"HeaderNewApiKey": "Nuova chiave API",
"HeaderNewLibrary": "Nuova Libreria", "HeaderNewLibrary": "Nuova Libreria",
"HeaderNotificationCreate": "Crea una notifica", "HeaderNotificationCreate": "Crea una notifica",
"HeaderNotificationUpdate": "Aggiornamento della notifica", "HeaderNotificationUpdate": "Aggiornamento della notifica",
@@ -197,6 +200,7 @@
"HeaderSettingsExperimental": "Opzioni Sperimentali", "HeaderSettingsExperimental": "Opzioni Sperimentali",
"HeaderSettingsGeneral": "Generale", "HeaderSettingsGeneral": "Generale",
"HeaderSettingsScanner": "Scanner", "HeaderSettingsScanner": "Scanner",
"HeaderSettingsSecurity": "Sicurezza",
"HeaderSettingsWebClient": "Web Client", "HeaderSettingsWebClient": "Web Client",
"HeaderSleepTimer": "Sveglia", "HeaderSleepTimer": "Sveglia",
"HeaderStatsLargestItems": "File pesanti", "HeaderStatsLargestItems": "File pesanti",
@@ -208,6 +212,7 @@
"HeaderTableOfContents": "Indice", "HeaderTableOfContents": "Indice",
"HeaderTools": "Strumenti", "HeaderTools": "Strumenti",
"HeaderUpdateAccount": "Aggiorna Account", "HeaderUpdateAccount": "Aggiorna Account",
"HeaderUpdateApiKey": "Aggiornamento chiave API",
"HeaderUpdateAuthor": "Aggiorna Autore", "HeaderUpdateAuthor": "Aggiorna Autore",
"HeaderUpdateDetails": "Aggiorna Dettagli", "HeaderUpdateDetails": "Aggiorna Dettagli",
"HeaderUpdateLibrary": "Aggiorna Libreria", "HeaderUpdateLibrary": "Aggiorna Libreria",
@@ -237,6 +242,10 @@
"LabelAllUsersExcludingGuests": "Tutti gli Utenti Esclusi gli ospiti", "LabelAllUsersExcludingGuests": "Tutti gli Utenti Esclusi gli ospiti",
"LabelAllUsersIncludingGuests": "Tutti gli Utenti Inclusi gli ospiti", "LabelAllUsersIncludingGuests": "Tutti gli Utenti Inclusi gli ospiti",
"LabelAlreadyInYourLibrary": "Già esistente nella libreria", "LabelAlreadyInYourLibrary": "Già esistente nella libreria",
"LabelApiKeyCreated": "API Key \"{0}\" creato con successo.",
"LabelApiKeyCreatedDescription": "Assicurarsi di copiare la chiave API ora poiché non si potrà rivederla.",
"LabelApiKeyUser": "Agisce per conto dell'utente",
"LabelApiKeyUserDescription": "Questa chiave API avrà le stesse autorizzazioni dell'utente per conto del quale agisce. Apparirà nei registri come se l'utente stesse facendo la richiesta.",
"LabelApiToken": "API Token", "LabelApiToken": "API Token",
"LabelAppend": "Appese", "LabelAppend": "Appese",
"LabelAudioBitrate": "Audio Bitrate (es. 128k)", "LabelAudioBitrate": "Audio Bitrate (es. 128k)",
@@ -286,6 +295,7 @@
"LabelContinueListening": "Continua l'ascolto", "LabelContinueListening": "Continua l'ascolto",
"LabelContinueReading": "Continua la lettura", "LabelContinueReading": "Continua la lettura",
"LabelContinueSeries": "Continua serie", "LabelContinueSeries": "Continua serie",
"LabelCorsAllowed": "CORS consentiti Origine",
"LabelCover": "Copertina", "LabelCover": "Copertina",
"LabelCoverImageURL": "Indirizzo della cover URL", "LabelCoverImageURL": "Indirizzo della cover URL",
"LabelCoverProvider": "Cover Sorgente", "LabelCoverProvider": "Cover Sorgente",
@@ -348,6 +358,10 @@
"LabelExample": "Esempio", "LabelExample": "Esempio",
"LabelExpandSeries": "Espandi Serie", "LabelExpandSeries": "Espandi Serie",
"LabelExpandSubSeries": "Espandi Sub Serie", "LabelExpandSubSeries": "Espandi Sub Serie",
"LabelExpired": "Scadenza",
"LabelExpiresAt": "Scade a",
"LabelExpiresInSeconds": "Scade in (secondi)",
"LabelExpiresNever": "Mai",
"LabelExplicit": "Esplicito", "LabelExplicit": "Esplicito",
"LabelExplicitChecked": "Esplicito (selezionato)", "LabelExplicitChecked": "Esplicito (selezionato)",
"LabelExplicitUnchecked": "Non Esplicito (selezionato)", "LabelExplicitUnchecked": "Non Esplicito (selezionato)",
@@ -407,6 +421,7 @@
"LabelLanguages": "Lingua", "LabelLanguages": "Lingua",
"LabelLastBookAdded": "Ultimo Libro Aggiunto", "LabelLastBookAdded": "Ultimo Libro Aggiunto",
"LabelLastBookUpdated": "Ultimo Libro Aggiornato", "LabelLastBookUpdated": "Ultimo Libro Aggiornato",
"LabelLastProgressDate": "Ultimi progressi: Si'",
"LabelLastSeen": "Ultimi Visti", "LabelLastSeen": "Ultimi Visti",
"LabelLastTime": "Ultima Volta", "LabelLastTime": "Ultima Volta",
"LabelLastUpdate": "Ultimo Aggiornamento", "LabelLastUpdate": "Ultimo Aggiornamento",
@@ -419,6 +434,8 @@
"LabelLibraryFilterSublistEmpty": "Nessuno {0}", "LabelLibraryFilterSublistEmpty": "Nessuno {0}",
"LabelLibraryItem": "Elementi della biblioteca", "LabelLibraryItem": "Elementi della biblioteca",
"LabelLibraryName": "Nome della biblioteca", "LabelLibraryName": "Nome della biblioteca",
"LabelLibrarySortByProgress": "Aggiornamento dei progressi",
"LabelLibrarySortByProgressStarted": "Data di inizio",
"LabelLimit": "Limiti", "LabelLimit": "Limiti",
"LabelLineSpacing": "Interlinea", "LabelLineSpacing": "Interlinea",
"LabelListenAgain": "Ascolta ancora", "LabelListenAgain": "Ascolta ancora",
@@ -427,6 +444,7 @@
"LabelLogLevelWarn": "Allarme", "LabelLogLevelWarn": "Allarme",
"LabelLookForNewEpisodesAfterDate": "Cerca nuovi episodi dopo questa data", "LabelLookForNewEpisodesAfterDate": "Cerca nuovi episodi dopo questa data",
"LabelLowestPriority": "Priorità Minima", "LabelLowestPriority": "Priorità Minima",
"LabelMatchConfidence": "Fiducia",
"LabelMatchExistingUsersBy": "Abbina gli utenti esistenti per", "LabelMatchExistingUsersBy": "Abbina gli utenti esistenti per",
"LabelMatchExistingUsersByDescription": "Utilizzato per connettere gli utenti esistenti. Una volta connessi, gli utenti verranno abbinati a un ID univoco dal tuo provider SSO", "LabelMatchExistingUsersByDescription": "Utilizzato per connettere gli utenti esistenti. Una volta connessi, gli utenti verranno abbinati a un ID univoco dal tuo provider SSO",
"LabelMaxEpisodesToDownload": "Max # di episodi da scaricare. Usa 0 per illimitati.", "LabelMaxEpisodesToDownload": "Max # di episodi da scaricare. Usa 0 per illimitati.",
@@ -456,7 +474,9 @@
"LabelNewestAuthors": "Nuovi autori", "LabelNewestAuthors": "Nuovi autori",
"LabelNewestEpisodes": "Nuovi episodi", "LabelNewestEpisodes": "Nuovi episodi",
"LabelNextBackupDate": "Data Prossimo Backup", "LabelNextBackupDate": "Data Prossimo Backup",
"LabelNextChapters": "I prossimi capitoli saranno:",
"LabelNextScheduledRun": "Data prossima esecuzione schedulata", "LabelNextScheduledRun": "Data prossima esecuzione schedulata",
"LabelNoApiKeys": "Nessuna chiave API",
"LabelNoCustomMetadataProviders": "Nessun provider di metadati personalizzato", "LabelNoCustomMetadataProviders": "Nessun provider di metadati personalizzato",
"LabelNoEpisodesSelected": "Nessun Episodio Selezionato", "LabelNoEpisodesSelected": "Nessun Episodio Selezionato",
"LabelNotFinished": "Da completare", "LabelNotFinished": "Da completare",
@@ -472,6 +492,7 @@
"LabelNotificationsMaxQueueSize": "Coda Massima di notifiche eventi", "LabelNotificationsMaxQueueSize": "Coda Massima di notifiche eventi",
"LabelNotificationsMaxQueueSizeHelp": "Le notifiche sono limitate per 1 al secondo, per evitare lo spamming le notifiche verrano ignorare se superano la coda.", "LabelNotificationsMaxQueueSizeHelp": "Le notifiche sono limitate per 1 al secondo, per evitare lo spamming le notifiche verrano ignorare se superano la coda.",
"LabelNumberOfBooks": "Numero di libri", "LabelNumberOfBooks": "Numero di libri",
"LabelNumberOfChapters": "Numero di capitoli:",
"LabelNumberOfEpisodes": "Numero di episodi", "LabelNumberOfEpisodes": "Numero di episodi",
"LabelOpenIDAdvancedPermsClaimDescription": "Nome dell'attestazione OpenID che contiene autorizzazioni avanzate per le azioni dell'utente all'interno dell'applicazione che verranno applicate ai ruoli non amministratori (<b>se configurato</b>). Se il reclamo manca nella risposta, l'accesso ad ABS verrà negato. Se manca una singola opzione, verrà trattata come<code>falsa</code>. Assicurati che l'attestazione del provider di identità corrisponda alla struttura prevista:", "LabelOpenIDAdvancedPermsClaimDescription": "Nome dell'attestazione OpenID che contiene autorizzazioni avanzate per le azioni dell'utente all'interno dell'applicazione che verranno applicate ai ruoli non amministratori (<b>se configurato</b>). Se il reclamo manca nella risposta, l'accesso ad ABS verrà negato. Se manca una singola opzione, verrà trattata come<code>falsa</code>. Assicurati che l'attestazione del provider di identità corrisponda alla struttura prevista:",
"LabelOpenIDClaims": "Lasciare vuote le seguenti opzioni per disabilitare l'assegnazione avanzata di gruppi e autorizzazioni, assegnando quindi automaticamente il gruppo \"Utente\".", "LabelOpenIDClaims": "Lasciare vuote le seguenti opzioni per disabilitare l'assegnazione avanzata di gruppi e autorizzazioni, assegnando quindi automaticamente il gruppo \"Utente\".",
@@ -546,6 +567,7 @@
"LabelSelectAll": "Seleziona tutto", "LabelSelectAll": "Seleziona tutto",
"LabelSelectAllEpisodes": "Seleziona tutti gli Episodi", "LabelSelectAllEpisodes": "Seleziona tutti gli Episodi",
"LabelSelectEpisodesShowing": "Selezionati {0} episodi da visualizzare", "LabelSelectEpisodesShowing": "Selezionati {0} episodi da visualizzare",
"LabelSelectUser": "Seleziona l'utente",
"LabelSelectUsers": "Selezione Utenti", "LabelSelectUsers": "Selezione Utenti",
"LabelSendEbookToDevice": "Invia il libro a...", "LabelSendEbookToDevice": "Invia il libro a...",
"LabelSequence": "Sequenza", "LabelSequence": "Sequenza",
@@ -642,6 +664,7 @@
"LabelTheme": "Tema", "LabelTheme": "Tema",
"LabelThemeDark": "Scuro", "LabelThemeDark": "Scuro",
"LabelThemeLight": "Chiaro", "LabelThemeLight": "Chiaro",
"LabelThemeSepia": "Seppia",
"LabelTimeBase": "Tempo base", "LabelTimeBase": "Tempo base",
"LabelTimeDurationXHours": "{0} Ore", "LabelTimeDurationXHours": "{0} Ore",
"LabelTimeDurationXMinutes": "{0} minuti", "LabelTimeDurationXMinutes": "{0} minuti",
@@ -710,7 +733,9 @@
"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.",
"MessageAuthenticationLegacyTokenWarning": "I token API legacy verranno rimossi in futuro. Utilizzare piuttosto le <a href=\"/config/api-keys\">chiavi API</a>.",
"MessageAuthenticationOIDCChangesRestart": "Riavvia il tuo server dopo aver salvato per applicare le modifiche OIDC.", "MessageAuthenticationOIDCChangesRestart": "Riavvia il tuo server dopo aver salvato per applicare le modifiche OIDC.",
"MessageAuthenticationSecurityMessage": "L'autenticazione è stata migliorata per incrementare la sicurezza. Tutti gli utenti sono tenuti a rieffettuare il login.",
"MessageBackupsDescription": "I backup includono utenti, progressi degli utenti, dettagli sugli elementi della libreria, impostazioni del server e immagini archiviate in <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.",
@@ -724,6 +749,7 @@
"MessageBookshelfNoResultsForFilter": "Nessun risultato per il filtro \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Nessun risultato per il filtro \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Nessun risultato per la query", "MessageBookshelfNoResultsForQuery": "Nessun risultato per la query",
"MessageBookshelfNoSeries": "Non c'è nessuna Serie", "MessageBookshelfNoSeries": "Non c'è nessuna Serie",
"MessageBulkChapterPattern": "Quanti capitoli vuoi aggiungere con questo motivo di numerazione?",
"MessageChapterEndIsAfter": "La fine del capitolo è dopo la fine del tuo audiolibro", "MessageChapterEndIsAfter": "La fine del capitolo è dopo la fine del tuo audiolibro",
"MessageChapterErrorFirstNotZero": "Il primo capitolo deve iniziare da 0", "MessageChapterErrorFirstNotZero": "Il primo capitolo deve iniziare da 0",
"MessageChapterErrorStartGteDuration": "L'ora di inizio non valida deve essere inferiore alla durata dell'audiolibro", "MessageChapterErrorStartGteDuration": "L'ora di inizio non valida deve essere inferiore alla durata dell'audiolibro",
@@ -732,6 +758,7 @@
"MessageChaptersNotFound": "Capitoli non trovati", "MessageChaptersNotFound": "Capitoli non trovati",
"MessageCheckingCron": "Controllo cron...", "MessageCheckingCron": "Controllo cron...",
"MessageConfirmCloseFeed": "Sei sicuro di voler chiudere questo feed?", "MessageConfirmCloseFeed": "Sei sicuro di voler chiudere questo feed?",
"MessageConfirmDeleteApiKey": "Sei sicuro di voler eliminare la chiave API \"{0}\"?",
"MessageConfirmDeleteBackup": "Sei sicuro di voler eliminare il backup {0}?", "MessageConfirmDeleteBackup": "Sei sicuro di voler eliminare il backup {0}?",
"MessageConfirmDeleteDevice": "Sei sicuro/sicura di voler eliminare il lettore di libri {0}?", "MessageConfirmDeleteDevice": "Sei sicuro/sicura di voler eliminare il lettore di libri {0}?",
"MessageConfirmDeleteFile": "Questo eliminerà il file dal tuo file system. Sei sicuro?", "MessageConfirmDeleteFile": "Questo eliminerà il file dal tuo file system. Sei sicuro?",
@@ -759,6 +786,7 @@
"MessageConfirmRemoveAuthor": "Sei sicuro di voler rimuovere l'autore? \"{0}\"?", "MessageConfirmRemoveAuthor": "Sei sicuro di voler rimuovere l'autore? \"{0}\"?",
"MessageConfirmRemoveCollection": "Sei sicuro di voler rimuovere la Raccolta \"{0}\"?", "MessageConfirmRemoveCollection": "Sei sicuro di voler rimuovere la Raccolta \"{0}\"?",
"MessageConfirmRemoveEpisode": "Sei sicuro di voler rimuovere l'episodio \"{0}\"?", "MessageConfirmRemoveEpisode": "Sei sicuro di voler rimuovere l'episodio \"{0}\"?",
"MessageConfirmRemoveEpisodeNote": "Nota: Questo non cancella il file audio a meno che non toggling \"Hard delete file\"",
"MessageConfirmRemoveEpisodes": "Sei sicuro di voler rimuovere {0} episodi?", "MessageConfirmRemoveEpisodes": "Sei sicuro di voler rimuovere {0} episodi?",
"MessageConfirmRemoveListeningSessions": "Sei sicuro di voler rimuovere {0} sessioni di Ascolto?", "MessageConfirmRemoveListeningSessions": "Sei sicuro di voler rimuovere {0} sessioni di Ascolto?",
"MessageConfirmRemoveMetadataFiles": "Vuoi davvero rimuovere tutti i metadati.{0} file nelle cartelle degli elementi della tua libreria?", "MessageConfirmRemoveMetadataFiles": "Vuoi davvero rimuovere tutti i metadati.{0} file nelle cartelle degli elementi della tua libreria?",
@@ -784,6 +812,8 @@
"MessageFeedURLWillBe": "lURL del flusso sarà {0}", "MessageFeedURLWillBe": "lURL del flusso sarà {0}",
"MessageFetching": "Recupero info…", "MessageFetching": "Recupero info…",
"MessageForceReScanDescription": "eseguirà nuovamente la scansione di tutti i file come una nuova scansione. I tag ID3 dei file audio, i file OPF e i file di testo verranno scansionati come nuovi.", "MessageForceReScanDescription": "eseguirà nuovamente la scansione di tutti i file come una nuova scansione. I tag ID3 dei file audio, i file OPF e i file di testo verranno scansionati come nuovi.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} in ascolto</strong> su {1}",
"MessageHeatmapNoListeningSessions": "Nessuna sessione di ascolto su {0}",
"MessageImportantNotice": "Avviso Importante!", "MessageImportantNotice": "Avviso Importante!",
"MessageInsertChapterBelow": "Inserisci capitolo sotto", "MessageInsertChapterBelow": "Inserisci capitolo sotto",
"MessageInvalidAsin": "ASIN non Valido", "MessageInvalidAsin": "ASIN non Valido",
@@ -923,6 +953,7 @@
"NotificationOnRSSFeedDisabledDescription": "Attivato quando i download automatici degli episodi vengono disabilitati a causa di troppi tentativi falliti", "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", "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",
"PlaceholderBulkChapterInput": "Inserire il titolo del capitolo o utilizzate la numerazione (es. 'Episodio 1', 'Capitolo 10', '1.')",
"PlaceholderNewCollection": "Nome Nuova Raccolta", "PlaceholderNewCollection": "Nome Nuova Raccolta",
"PlaceholderNewFolderPath": "Nuovo Percorso Cartella", "PlaceholderNewFolderPath": "Nuovo Percorso Cartella",
"PlaceholderNewPlaylist": "Nome nuova playlist", "PlaceholderNewPlaylist": "Nome nuova playlist",
@@ -976,8 +1007,12 @@
"ToastBookmarkCreateFailed": "Creazione segnalibro fallita", "ToastBookmarkCreateFailed": "Creazione segnalibro fallita",
"ToastBookmarkCreateSuccess": "Segnalibro creato", "ToastBookmarkCreateSuccess": "Segnalibro creato",
"ToastBookmarkRemoveSuccess": "Segnalibro Rimosso", "ToastBookmarkRemoveSuccess": "Segnalibro Rimosso",
"ToastBulkChapterInvalidCount": "Inserire un numero tra 1 e 150",
"ToastCachePurgeFailed": "Impossibile eliminare la cache", "ToastCachePurgeFailed": "Impossibile eliminare la cache",
"ToastCachePurgeSuccess": "Cache eliminata correttamente", "ToastCachePurgeSuccess": "Cache eliminata correttamente",
"ToastChapterLocked": "Il capitolo è bloccato.",
"ToastChapterStartTimeAdjusted": "Tempo di inizio del capitolo modificato di {0} secondi",
"ToastChaptersAllLocked": "Tutti i capitoli sono bloccati. Sblocca alcuni capitoli per modificarne i tempi.",
"ToastChaptersHaveErrors": "I capitoli contengono errori", "ToastChaptersHaveErrors": "I capitoli contengono errori",
"ToastChaptersInvalidShiftAmountLast": "Quantità di spostamento non valida. L'orario di inizio dell'ultimo capitolo si estenderebbe oltre la durata di questo audiolibro.", "ToastChaptersInvalidShiftAmountLast": "Quantità di spostamento non valida. L'orario di inizio dell'ultimo capitolo si estenderebbe oltre la durata di questo audiolibro.",
"ToastChaptersInvalidShiftAmountStart": "Quantità di spostamento non valida. Il primo capitolo avrebbe una lunghezza pari a zero o negativa e verrebbe sovrascritto dal secondo capitolo. Aumentare la durata iniziale del secondo capitolo.", "ToastChaptersInvalidShiftAmountStart": "Quantità di spostamento non valida. Il primo capitolo avrebbe una lunghezza pari a zero o negativa e verrebbe sovrascritto dal secondo capitolo. Aumentare la durata iniziale del secondo capitolo.",
@@ -1002,6 +1037,8 @@
"ToastEpisodeDownloadQueueClearSuccess": "Coda di download degli episodi cancellata", "ToastEpisodeDownloadQueueClearSuccess": "Coda di download degli episodi cancellata",
"ToastEpisodeUpdateSuccess": "{0} episodi aggiornati", "ToastEpisodeUpdateSuccess": "{0} episodi aggiornati",
"ToastErrorCannotShare": "Impossibile condividere in modo nativo su questo dispositivo", "ToastErrorCannotShare": "Impossibile condividere in modo nativo su questo dispositivo",
"ToastFailedToCreate": "Non creato",
"ToastFailedToDelete": "Non eliminata",
"ToastFailedToLoadData": "Impossibile caricare i dati", "ToastFailedToLoadData": "Impossibile caricare i dati",
"ToastFailedToMatch": "Impossibile abbinare", "ToastFailedToMatch": "Impossibile abbinare",
"ToastFailedToShare": "Impossibile condividere", "ToastFailedToShare": "Impossibile condividere",
@@ -1009,6 +1046,7 @@
"ToastInvalidImageUrl": "URL dell'immagine non valido", "ToastInvalidImageUrl": "URL dell'immagine non valido",
"ToastInvalidMaxEpisodesToDownload": "Numero massimo di episodi non valido da scaricare", "ToastInvalidMaxEpisodesToDownload": "Numero massimo di episodi non valido da scaricare",
"ToastInvalidUrl": "URL non valido", "ToastInvalidUrl": "URL non valido",
"ToastInvalidUrls": "Uno o più URL sono invalidi",
"ToastItemCoverUpdateSuccess": "Cover aggiornata", "ToastItemCoverUpdateSuccess": "Cover aggiornata",
"ToastItemDeletedFailed": "Impossibile eliminare l'elemento", "ToastItemDeletedFailed": "Impossibile eliminare l'elemento",
"ToastItemDeletedSuccess": "Elemento eliminato", "ToastItemDeletedSuccess": "Elemento eliminato",
@@ -1033,6 +1071,7 @@
"ToastMustHaveAtLeastOnePath": "Deve avere almeno un percorso", "ToastMustHaveAtLeastOnePath": "Deve avere almeno un percorso",
"ToastNameEmailRequired": "Nome ed email sono obbligatori", "ToastNameEmailRequired": "Nome ed email sono obbligatori",
"ToastNameRequired": "Il nome è obbligatorio", "ToastNameRequired": "Il nome è obbligatorio",
"ToastNewApiKeyUserError": "Deve selezionare un utente",
"ToastNewEpisodesFound": "{0} nuovi episodi trovati", "ToastNewEpisodesFound": "{0} nuovi episodi trovati",
"ToastNewUserCreatedFailed": "Impossibile creare l'account: \"{0}\"", "ToastNewUserCreatedFailed": "Impossibile creare l'account: \"{0}\"",
"ToastNewUserCreatedSuccess": "Nuovo account creato", "ToastNewUserCreatedSuccess": "Nuovo account creato",
@@ -1057,6 +1096,7 @@
"ToastPlaylistUpdateSuccess": "Playlist Aggiornata", "ToastPlaylistUpdateSuccess": "Playlist Aggiornata",
"ToastPodcastCreateFailed": "Errore creazione podcast", "ToastPodcastCreateFailed": "Errore creazione podcast",
"ToastPodcastCreateSuccess": "Podcast creato correttamente", "ToastPodcastCreateSuccess": "Podcast creato correttamente",
"ToastPodcastEpisodeUpdated": "Episodio aggiornato",
"ToastPodcastGetFeedFailed": "Impossibile ottenere il feed del podcast", "ToastPodcastGetFeedFailed": "Impossibile ottenere il feed del podcast",
"ToastPodcastNoEpisodesInFeed": "Nessun episodio trovato nel feed RSS", "ToastPodcastNoEpisodesInFeed": "Nessun episodio trovato nel feed RSS",
"ToastPodcastNoRssFeed": "Il podcast non ha un feed RSS", "ToastPodcastNoRssFeed": "Il podcast non ha un feed RSS",
@@ -1107,5 +1147,13 @@
"ToastUserPasswordChangeSuccess": "Password modificata con successo", "ToastUserPasswordChangeSuccess": "Password modificata con successo",
"ToastUserPasswordMismatch": "Le password non corrispondono", "ToastUserPasswordMismatch": "Le password non corrispondono",
"ToastUserPasswordMustChange": "La nuova password non può corrispondere alla vecchia password", "ToastUserPasswordMustChange": "La nuova password non può corrispondere alla vecchia password",
"ToastUserRootRequireName": "È necessario immettere un nome utente root" "ToastUserRootRequireName": "È necessario immettere un nome utente root",
"TooltipAddChapters": "Aggiungere capitolo/i",
"TooltipAddOneSecond": "Aggiungere 1 secondo",
"TooltipAdjustChapterStart": "Clicca per modificare il tempo di inizio",
"TooltipLockAllChapters": "Bloccare tutti i capitoli",
"TooltipLockChapter": "Bloccare capitolo (Shift+click per intervallo)",
"TooltipSubtractOneSecond": "Sottrarre 1 secondo",
"TooltipUnlockAllChapters": "Sbloccare tutti i capitoli",
"TooltipUnlockChapter": "Sbloccare capitolo (Shift+click per intervallo)"
} }
+164 -3
View File
@@ -1,21 +1,182 @@
{ {
"ButtonAdd": "追加", "ButtonAdd": "追加",
"ButtonAddApiKey": "APIキーの追加",
"ButtonAddChapters": "チャプターの追加", "ButtonAddChapters": "チャプターの追加",
"ButtonAddDevice": "端末の追加",
"ButtonAddLibrary": "ライブラリーの追加",
"ButtonAddPodcasts": "ポッドキャストの追加",
"ButtonAddUser": "ユーザーの追加",
"ButtonAddYourFirstLibrary": "最初のライブラリーを追加",
"ButtonApply": "確定",
"ButtonApplyChapters": "チャプターを確定する",
"ButtonAuthors": "作者",
"ButtonBack": "戻る",
"ButtonBatchEditPopulateFromExisting": "既存のものから取り込む",
"ButtonBatchEditPopulateMapDetails": "チャプター情報を読み込む",
"ButtonBrowseForFolder": "フォルダーを選択する",
"ButtonCancel": "キャンセル", "ButtonCancel": "キャンセル",
"ButtonCancelEncode": "エンコードを取り消す",
"ButtonChangeRootPassword": "Rootのパスワードを変更する",
"ButtonCheckAndDownloadNewEpisodes": "新しいエピソードを確認してダウンロード",
"ButtonChooseAFolder": "フォルダーを選ぶ",
"ButtonChooseFiles": "ファイルを選ぶ",
"ButtonClearFilter": "絞り込みを解除",
"ButtonClose": "閉じる",
"ButtonCloseFeed": "フィードを閉じる",
"ButtonCloseSession": "開いているセッションを閉じる",
"ButtonCollections": "コレクション",
"ButtonConfigureScanner": "スキャナーの設定",
"ButtonCreate": "作成",
"ButtonCreateBackup": "バックアップを作成する",
"ButtonDelete": "削除",
"ButtonDownloadQueue": "次に再生",
"ButtonEdit": "編集",
"ButtonEditChapters": "チャプターの編集",
"ButtonEditPodcast": "ポッドキャストの編集",
"ButtonEnable": "オンにする",
"ButtonFireAndFail": "エラーを無視して実行",
"ButtonFireOnTest": "テストを実行",
"ButtonForceReScan": "強制的に再スキャンする",
"ButtonFullPath": "絶対パス",
"ButtonHide": "非表示",
"ButtonHome": "ホーム",
"ButtonIssues": "問題",
"ButtonJumpBackward": "巻き戻し",
"ButtonJumpForward": "早送り",
"ButtonLatest": "最新",
"ButtonLibrary": "ライブラリー",
"ButtonLogout": "ログアウト",
"ButtonLookup": "参照",
"ButtonManageTracks": "トラックの管理",
"ButtonMapChapterTitles": "チャプターのタイトルを割り当て",
"ButtonMatchAllAuthors": "すべての作者と紐付け",
"ButtonMatchBooks": "本と紐付け",
"ButtonNevermind": "中止",
"ButtonNext": "次",
"ButtonNextChapter": "次のチャプター",
"ButtonNextItemInQueue": "キューの中の次のアイテム",
"ButtonOk": "はい", "ButtonOk": "はい",
"ButtonPlay": "プレイ", "ButtonOpenFeed": "フィードを開く",
"ButtonOpenManager": "管理画面を開く",
"ButtonPause": "一時停止",
"ButtonPlay": "再生",
"ButtonPlayAll": "全て再生",
"ButtonPlaying": "プレイ中", "ButtonPlaying": "プレイ中",
"ButtonPlaylists": "プレイリスト",
"ButtonPrevious": "先", "ButtonPrevious": "先",
"ButtonRead": "野村", "ButtonPreviousChapter": "前のチャプター",
"ButtonProbeAudioFile": "オーディオファイルを解析",
"ButtonPurgeAllCache": "全てのキャッシュを削除",
"ButtonPurgeItemsCache": "項目のキャッシュを削除",
"ButtonQueueAddItem": "次に再生する",
"ButtonQueueRemoveItem": "次に再生から削除",
"ButtonQuickEmbed": "クイック埋め込み",
"ButtonQuickEmbedMetadata": "メタデータの埋め込み",
"ButtonReScan": "再スキャン",
"ButtonRead": "読む",
"ButtonReadLess": "閉じる",
"ButtonReadMore": "もっと見る",
"ButtonRefresh": "再読み込み",
"ButtonRemove": "削除",
"ButtonRemoveAll": "全て削除",
"ButtonRemoveAllLibraryItems": "ライブラリーの項目を全て削除",
"ButtonReset": "元に戻す",
"ButtonResetToDefault": "デフォルトに戻す",
"ButtonRestore": "復元",
"ButtonSave": "保存",
"ButtonSaveAndClose": "保存して閉じる",
"ButtonScan": "スキャン",
"ButtonScanLibrary": "ライブラリーをスキャン",
"ButtonScrollLeft": "左にスクロール",
"ButtonScrollRight": "右にスクロール",
"ButtonSearch": "検索",
"ButtonSeries": "シリーズ",
"ButtonSubmit": "送信",
"ButtonYes": "はい", "ButtonYes": "はい",
"HeaderAccount": "アカウント",
"HeaderAdvanced": "上級者向け",
"HeaderAudioTracks": "オーディオトラック",
"HeaderChapters": "チャプター",
"HeaderCollection": "コレクション",
"HeaderCollectionItems": "コレクションの項目",
"HeaderDetails": "詳細",
"HeaderEbookFiles": "電子書籍ファイル",
"HeaderEpisodes": "エピソード",
"HeaderEreaderSettings": "電子書籍リーダーの設定",
"HeaderLatestEpisodes": "最新のエピソード",
"HeaderLibraries": "ライブラリー",
"HeaderOpenRSSFeed": "RSS Feedを開く",
"HeaderPlayerSettings": "プレーヤーの設定", "HeaderPlayerSettings": "プレーヤーの設定",
"HeaderPlaylist": "プレイリスト",
"HeaderPlaylistItems": "プレイリストアイテム",
"HeaderRSSFeedGeneral": "RSS 詳細",
"HeaderSettings": "設定",
"HeaderSettingsGeneral": "一般",
"HeaderSettingsScanner": "スキャナー",
"HeaderSleepTimer": "スリープタイマー",
"HeaderStatsMinutesListeningChart": "過去7日間の視聴時間(分)",
"LabelAddToPlaylist": "プレイリストの追加",
"LabelAuthor": "著者",
"LabelAuthorFirstLast": "著者(名 氏)",
"LabelAuthorLastFirst": "著者(氏 名)",
"LabelAuthors": "著者",
"LabelAutoDownloadEpisodes": "エピソードの自動ダウンロード",
"LabelBooks": "ほん", "LabelBooks": "ほん",
"LabelChapters": "チャプター",
"LabelClosePlayer": "プレイヤーを閉じる",
"LabelComplete": "完了",
"LabelContinueListening": "続きから聞く",
"LabelDescription": "説明",
"LabelDownload": "ダウンロード",
"LabelDuration": "長さ",
"LabelEbook": "Eブック",
"LabelEbooks": "Eブック",
"LabelEnable": "有効",
"LabelEndOfChapter": "チャプターの最後",
"LabelEpisode": "エピソード",
"LabelFeedURL": "Feed URL",
"LabelFile": "ファイル",
"LabelFilename": "ファイル名",
"LabelFinished": "完了",
"LabelFolder": "フォルダ",
"LabelFontBoldness": "フォントの太さ",
"LabelFontScale": "フォントサイズ",
"LabelGenre": "ジャンル",
"LabelGenres": "ジャンル",
"LabelHost": "ホスト",
"LabelInProgress": "進行中",
"LabelLanguage": "言語", "LabelLanguage": "言語",
"LabelLanguages": "言語", "LabelLanguages": "言語",
"LabelLayout": "レイアウト",
"LabelLayoutSinglePage": "単ページ",
"LabelLineSpacing": "行間",
"LabelListenAgain": "再度視聴",
"LabelMediaType": "メディアの種類",
"LabelMoreInfo": "追加情報",
"LabelName": "名", "LabelName": "名",
"LabelNarrator": "ナレーター",
"LabelNarrators": "ナレーター",
"LabelNew": "新しい", "LabelNew": "新しい",
"LabelNewPassword": "新しいのパスワード", "LabelNewPassword": "新しいのパスワード",
"LabelNewestAuthors": "最新の著者",
"LabelNewestEpisodes": "最新エピソード",
"LabelPassword": "パスワード", "LabelPassword": "パスワード",
"LabelPath": "パス",
"LabelPlaylists": "プレイリスト", "LabelPlaylists": "プレイリスト",
"LabelPodcast": "ポッドキャスト" "LabelPodcast": "ポッドキャスト",
"LabelPodcasts": "ポッドキャスト",
"LabelPreventIndexing": "フィードがiTunesおよびGoogleのポッドキャストディレクトリにインデックス登録されるのを防ぎます",
"LabelPublishYear": "公開年",
"LabelSettingsFindCovers": "表紙を探す",
"LabelSettingsFindCoversHelp": "もしオーディオブックに表紙が埋め込まれていない、もしくは表紙画像がフォルダー内に見つからなければ、スキャナーは表紙を探そうとします。<br>注記: これによってスキャン時間が長くなります",
"LabelSettingsParseSubtitles": "サブタイトルを抽出する",
"LabelSettingsParseSubtitlesHelp": "オーディオブックのフォルダー名からサブタイトルを抽出します。<br>サブタイトルは \"-\" で区切ってください<br>例: \"本のタイトル - ここにサブタイトル\" という名前だと \"ここにサブタイトル\" というサブタイトルになります",
"LabelSettingsPreferMatchedMetadata": "一致したメタデータを優先する",
"LabelSettingsPreferMatchedMetadataHelp": "クイックマッチを使用する時、一致したデータは書籍の詳細を上書きします。デフォルトでは、埋まっていない項目のみ入力されます。",
"LabelSettingsSortingIgnorePrefixes": "並び替えでプレフィックスを無視する",
"LabelSettingsSortingIgnorePrefixesHelp": "例: プレフィックス \"the\" の付いた本のタイトル \"The Book Title\" は \"Book Title, The\" として並び替えられます",
"LabelSettingsStoreCoversWithItem": "表紙を項目と一緒に保存する",
"LabelSettingsStoreCoversWithItemHelp": "デフォルトでは表紙は /metadata/items に保存されますが、この設定をオンにするとライブラリーの項目のフォルダーに保存されます。\"cover\" という名前のファイル一つのみが保持されます",
"LabelSettingsStoreMetadataWithItem": "メタデータを項目と一緒に保存する",
"LabelSettingsStoreMetadataWithItemHelp": "デフォルトではメタデータは/metadata/itemsに保存されますが、この設定をオンにするとライブラリーの項目のフォルダーに保存されます"
} }
+64 -11
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Toevoegen", "ButtonAdd": "Toevoegen",
"ButtonAddApiKey": "API Key toevoegen",
"ButtonAddChapters": "Hoofdstukken toevoegen", "ButtonAddChapters": "Hoofdstukken toevoegen",
"ButtonAddDevice": "Toestel toevoegen", "ButtonAddDevice": "Toestel toevoegen",
"ButtonAddLibrary": "Bibliotheek toevoegen", "ButtonAddLibrary": "Bibliotheek toevoegen",
@@ -10,7 +11,7 @@
"ButtonApplyChapters": "Hoofdstukken toepassen", "ButtonApplyChapters": "Hoofdstukken toepassen",
"ButtonAuthors": "Auteurs", "ButtonAuthors": "Auteurs",
"ButtonBack": "Terug", "ButtonBack": "Terug",
"ButtonBatchEditPopulateFromExisting": "Vullen vanuit bestaande", "ButtonBatchEditPopulateFromExisting": "Vul in met huidige",
"ButtonBatchEditPopulateMapDetails": "Kaartgegevens invullen", "ButtonBatchEditPopulateMapDetails": "Kaartgegevens invullen",
"ButtonBrowseForFolder": "Bladeren naar map", "ButtonBrowseForFolder": "Bladeren naar map",
"ButtonCancel": "Annuleren", "ButtonCancel": "Annuleren",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Map kiezen", "ButtonChooseAFolder": "Map kiezen",
"ButtonChooseFiles": "Bestanden kiezen", "ButtonChooseFiles": "Bestanden kiezen",
"ButtonClearFilter": "Filter verwijderen", "ButtonClearFilter": "Filter verwijderen",
"ButtonClose": "Sluiten",
"ButtonCloseFeed": "Feed sluiten", "ButtonCloseFeed": "Feed sluiten",
"ButtonCloseSession": "Sluit Sessie", "ButtonCloseSession": "Sluit Sessie",
"ButtonCollections": "Collecties", "ButtonCollections": "Collecties",
@@ -32,8 +34,8 @@
"ButtonEditChapters": "Hoofdstukken wijzigen", "ButtonEditChapters": "Hoofdstukken wijzigen",
"ButtonEditPodcast": "Podcast wijzigen", "ButtonEditPodcast": "Podcast wijzigen",
"ButtonEnable": "Aanzetten", "ButtonEnable": "Aanzetten",
"ButtonFireAndFail": "Fire and Fail", "ButtonFireAndFail": "Uitvoeren en falen",
"ButtonFireOnTest": "Fire onTest event", "ButtonFireOnTest": "Test-Event uitvoeren",
"ButtonForceReScan": "Forceer nieuwe scan", "ButtonForceReScan": "Forceer nieuwe scan",
"ButtonFullPath": "Volledig pad", "ButtonFullPath": "Volledig pad",
"ButtonHide": "Verberg", "ButtonHide": "Verberg",
@@ -119,11 +121,13 @@
"HeaderAccount": "Account", "HeaderAccount": "Account",
"HeaderAddCustomMetadataProvider": "Aangepaste Metadataprovider Toevoegen", "HeaderAddCustomMetadataProvider": "Aangepaste Metadataprovider Toevoegen",
"HeaderAdvanced": "Geavanceerd", "HeaderAdvanced": "Geavanceerd",
"HeaderApiKeys": "API Key",
"HeaderAppriseNotificationSettings": "Apprise-notificatie instellingen", "HeaderAppriseNotificationSettings": "Apprise-notificatie instellingen",
"HeaderAudioTracks": "Audiotracks", "HeaderAudioTracks": "Audiotracks",
"HeaderAudiobookTools": "Audioboekbestandbeheer tools", "HeaderAudiobookTools": "Audioboekbestandbeheer tools",
"HeaderAuthentication": "Authenticatie", "HeaderAuthentication": "Authenticatie",
"HeaderBackups": "Back-ups", "HeaderBackups": "Back-ups",
"HeaderBulkChapterModal": "Meerdere hoofdstukken toevoegen",
"HeaderChangePassword": "Wachtwoord wijzigen", "HeaderChangePassword": "Wachtwoord wijzigen",
"HeaderChapters": "Hoofdstukken", "HeaderChapters": "Hoofdstukken",
"HeaderChooseAFolder": "Map kiezen", "HeaderChooseAFolder": "Map kiezen",
@@ -162,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Metadata volgorde", "HeaderMetadataOrderOfPrecedence": "Metadata volgorde",
"HeaderMetadataToEmbed": "In te sluiten metadata", "HeaderMetadataToEmbed": "In te sluiten metadata",
"HeaderNewAccount": "Nieuwe account", "HeaderNewAccount": "Nieuwe account",
"HeaderNewApiKey": "Nieuwe API Key",
"HeaderNewLibrary": "Nieuwe bibliotheek", "HeaderNewLibrary": "Nieuwe bibliotheek",
"HeaderNotificationCreate": "Notificatie Aanmaken", "HeaderNotificationCreate": "Notificatie Aanmaken",
"HeaderNotificationUpdate": "Update Notificatie", "HeaderNotificationUpdate": "Update Notificatie",
@@ -195,6 +200,7 @@
"HeaderSettingsExperimental": "Experimentele functies", "HeaderSettingsExperimental": "Experimentele functies",
"HeaderSettingsGeneral": "Algemeen", "HeaderSettingsGeneral": "Algemeen",
"HeaderSettingsScanner": "Scanner", "HeaderSettingsScanner": "Scanner",
"HeaderSettingsSecurity": "Beveiliging",
"HeaderSettingsWebClient": "Web Client", "HeaderSettingsWebClient": "Web Client",
"HeaderSleepTimer": "Slaaptimer", "HeaderSleepTimer": "Slaaptimer",
"HeaderStatsLargestItems": "Grootste items", "HeaderStatsLargestItems": "Grootste items",
@@ -206,6 +212,7 @@
"HeaderTableOfContents": "Inhoudsopgave", "HeaderTableOfContents": "Inhoudsopgave",
"HeaderTools": "Gereedschap", "HeaderTools": "Gereedschap",
"HeaderUpdateAccount": "Account bijwerken", "HeaderUpdateAccount": "Account bijwerken",
"HeaderUpdateApiKey": "API Key updaten",
"HeaderUpdateAuthor": "Auteur bijwerken", "HeaderUpdateAuthor": "Auteur bijwerken",
"HeaderUpdateDetails": "Details bijwerken", "HeaderUpdateDetails": "Details bijwerken",
"HeaderUpdateLibrary": "Bibliotheek bijwerken", "HeaderUpdateLibrary": "Bibliotheek bijwerken",
@@ -227,7 +234,7 @@
"LabelAddToPlaylist": "Toevoegen aan afspeellijst", "LabelAddToPlaylist": "Toevoegen aan afspeellijst",
"LabelAddToPlaylistBatch": "{0} onderdelen toevoegen aan afspeellijst", "LabelAddToPlaylistBatch": "{0} onderdelen toevoegen aan afspeellijst",
"LabelAddedAt": "Toegevoegd op", "LabelAddedAt": "Toegevoegd op",
"LabelAddedDate": "Toegevoegd {0}", "LabelAddedDate": "{0} toegevoegd",
"LabelAdminUsersOnly": "Enkel Admin gebruikers", "LabelAdminUsersOnly": "Enkel Admin gebruikers",
"LabelAll": "Alle", "LabelAll": "Alle",
"LabelAllEpisodesDownloaded": "Alle afleveringen gedownload", "LabelAllEpisodesDownloaded": "Alle afleveringen gedownload",
@@ -235,6 +242,10 @@
"LabelAllUsersExcludingGuests": "Alle gebruikers exclusief gasten", "LabelAllUsersExcludingGuests": "Alle gebruikers exclusief gasten",
"LabelAllUsersIncludingGuests": "Alle gebruikers inclusief gasten", "LabelAllUsersIncludingGuests": "Alle gebruikers inclusief gasten",
"LabelAlreadyInYourLibrary": "Reeds in je bibliotheek", "LabelAlreadyInYourLibrary": "Reeds in je bibliotheek",
"LabelApiKeyCreated": "API Key \"{0}\" succesvol aangemaakt.",
"LabelApiKeyCreatedDescription": "Zorg ervoor dat je de API key nu kopieert, je kan deze later niet meer bekijken.",
"LabelApiKeyUser": "Uitvoeren namens de gebruiker",
"LabelApiKeyUserDescription": "Deze API key krijgt dezelfde rechten als de gebruiker waar deze zich tot voordoet. In de logs zullen de requests ook op naam van de gebruiker staan.",
"LabelApiToken": "API Token", "LabelApiToken": "API Token",
"LabelAppend": "Achteraan toevoegen", "LabelAppend": "Achteraan toevoegen",
"LabelAudioBitrate": "Audio Bitrate (b.v. 128k)", "LabelAudioBitrate": "Audio Bitrate (b.v. 128k)",
@@ -284,6 +295,7 @@
"LabelContinueListening": "Verder Luisteren", "LabelContinueListening": "Verder Luisteren",
"LabelContinueReading": "Verder lezen", "LabelContinueReading": "Verder lezen",
"LabelContinueSeries": "Doorgaan met Serie", "LabelContinueSeries": "Doorgaan met Serie",
"LabelCorsAllowed": "CORS bronnen toestaan",
"LabelCover": "Omslag", "LabelCover": "Omslag",
"LabelCoverImageURL": "Omslagafbeelding-URL", "LabelCoverImageURL": "Omslagafbeelding-URL",
"LabelCoverProvider": "Omslag bron", "LabelCoverProvider": "Omslag bron",
@@ -297,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Verwijderen uit bestandssysteem (uncheck om alleen uit database te verwijderen)", "LabelDeleteFromFileSystemCheckbox": "Verwijderen uit bestandssysteem (uncheck om alleen uit database te verwijderen)",
"LabelDescription": "Beschrijving", "LabelDescription": "Beschrijving",
"LabelDeselectAll": "Deselecteer alle", "LabelDeselectAll": "Deselecteer alle",
"LabelDetectedPattern": "Gedetecteerd patroon:",
"LabelDevice": "Apparaat", "LabelDevice": "Apparaat",
"LabelDeviceInfo": "Apparaat info", "LabelDeviceInfo": "Apparaat info",
"LabelDeviceIsAvailableTo": "Apparaat is beschikbaar voor...", "LabelDeviceIsAvailableTo": "Apparaat is beschikbaar voor...",
@@ -312,7 +325,7 @@
"LabelDurationComparisonLonger": "({0} langer)", "LabelDurationComparisonLonger": "({0} langer)",
"LabelDurationComparisonShorter": "({0} korter)", "LabelDurationComparisonShorter": "({0} korter)",
"LabelDurationFound": "Gevonden duur:", "LabelDurationFound": "Gevonden duur:",
"LabelEbook": "Ebook", "LabelEbook": "E-boek",
"LabelEbooks": "Eboeken", "LabelEbooks": "Eboeken",
"LabelEdit": "Wijzig", "LabelEdit": "Wijzig",
"LabelEmail": "Email", "LabelEmail": "Email",
@@ -346,6 +359,10 @@
"LabelExample": "Voorbeeld", "LabelExample": "Voorbeeld",
"LabelExpandSeries": "Serie Uitvouwen", "LabelExpandSeries": "Serie Uitvouwen",
"LabelExpandSubSeries": "Subserie Uitvouwen", "LabelExpandSubSeries": "Subserie Uitvouwen",
"LabelExpired": "Verlopen",
"LabelExpiresAt": "Loopt af op",
"LabelExpiresInSeconds": "Loopt af in (seconds) seconden",
"LabelExpiresNever": "Nooit",
"LabelExplicit": "Expliciet", "LabelExplicit": "Expliciet",
"LabelExplicitChecked": "Expliciet (gechecked)", "LabelExplicitChecked": "Expliciet (gechecked)",
"LabelExplicitUnchecked": "Niet Expliciet (niet gechecked)", "LabelExplicitUnchecked": "Niet Expliciet (niet gechecked)",
@@ -361,10 +378,11 @@
"LabelFilterByUser": "Filter op gebruiker", "LabelFilterByUser": "Filter op gebruiker",
"LabelFindEpisodes": "Zoek afleveringen", "LabelFindEpisodes": "Zoek afleveringen",
"LabelFinished": "Voltooid", "LabelFinished": "Voltooid",
"LabelFinishedDate": "Voltooid {0}",
"LabelFolder": "Map", "LabelFolder": "Map",
"LabelFolders": "Mappen", "LabelFolders": "Mappen",
"LabelFontBold": "Vetgedrukt", "LabelFontBold": "Vetgedrukt",
"LabelFontBoldness": "Font Boldness", "LabelFontBoldness": "Lettertype Dikte",
"LabelFontFamily": "Lettertypefamilie", "LabelFontFamily": "Lettertypefamilie",
"LabelFontItalic": "Cursief", "LabelFontItalic": "Cursief",
"LabelFontScale": "Lettertype schaal", "LabelFontScale": "Lettertype schaal",
@@ -372,7 +390,7 @@
"LabelFormat": "Formaat", "LabelFormat": "Formaat",
"LabelFull": "Vol", "LabelFull": "Vol",
"LabelGenre": "Genre", "LabelGenre": "Genre",
"LabelGenres": "Genres", "LabelGenres": "Categorieën",
"LabelHardDeleteFile": "Bestand permanent verwijderen", "LabelHardDeleteFile": "Bestand permanent verwijderen",
"LabelHasEbook": "Heeft Ebook", "LabelHasEbook": "Heeft Ebook",
"LabelHasSupplementaryEbook": "Heeft aanvullend Ebook", "LabelHasSupplementaryEbook": "Heeft aanvullend Ebook",
@@ -405,6 +423,7 @@
"LabelLanguages": "Talen", "LabelLanguages": "Talen",
"LabelLastBookAdded": "Laatst toegevoegde boek", "LabelLastBookAdded": "Laatst toegevoegde boek",
"LabelLastBookUpdated": "Laatst bijgewerkte boek", "LabelLastBookUpdated": "Laatst bijgewerkte boek",
"LabelLastProgressDate": "Laatste vooruitgang: {0}",
"LabelLastSeen": "Laatst gezien", "LabelLastSeen": "Laatst gezien",
"LabelLastTime": "Laatste keer", "LabelLastTime": "Laatste keer",
"LabelLastUpdate": "Laatste wijziging", "LabelLastUpdate": "Laatste wijziging",
@@ -417,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Nee {0}", "LabelLibraryFilterSublistEmpty": "Nee {0}",
"LabelLibraryItem": "Bibliotheekonderdeel", "LabelLibraryItem": "Bibliotheekonderdeel",
"LabelLibraryName": "Bibliotheeknaam", "LabelLibraryName": "Bibliotheeknaam",
"LabelLibrarySortByProgress": "Voortuigang geüpdatet",
"LabelLibrarySortByProgressFinished": "Datum voltooid",
"LabelLibrarySortByProgressStarted": "Datum gestart",
"LabelLimit": "Limiet", "LabelLimit": "Limiet",
"LabelLineSpacing": "Regelruimte", "LabelLineSpacing": "Regelruimte",
"LabelListenAgain": "Opnieuw Beluisteren", "LabelListenAgain": "Opnieuw Beluisteren",
@@ -425,6 +447,7 @@
"LabelLogLevelWarn": "Waarschuwing", "LabelLogLevelWarn": "Waarschuwing",
"LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum", "LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum",
"LabelLowestPriority": "Laagste Prioriteit", "LabelLowestPriority": "Laagste Prioriteit",
"LabelMatchConfidence": "Vertrouwen",
"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.",
@@ -454,7 +477,9 @@
"LabelNewestAuthors": "Nieuwste Auteurs", "LabelNewestAuthors": "Nieuwste Auteurs",
"LabelNewestEpisodes": "Nieuwste Afleveringen", "LabelNewestEpisodes": "Nieuwste Afleveringen",
"LabelNextBackupDate": "Volgende back-up datum", "LabelNextBackupDate": "Volgende back-up datum",
"LabelNextChapters": "Volgende hoofdstukken zijn:",
"LabelNextScheduledRun": "Volgende geplande run", "LabelNextScheduledRun": "Volgende geplande run",
"LabelNoApiKeys": "Geen API keys",
"LabelNoCustomMetadataProviders": "Geen custom metadata bronnen", "LabelNoCustomMetadataProviders": "Geen custom metadata bronnen",
"LabelNoEpisodesSelected": "Geen afleveringen geselecteerd", "LabelNoEpisodesSelected": "Geen afleveringen geselecteerd",
"LabelNotFinished": "Niet Voltooid", "LabelNotFinished": "Niet Voltooid",
@@ -470,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Max rijgrootte voor notificatie gebeurtenissen", "LabelNotificationsMaxQueueSize": "Max rijgrootte voor notificatie gebeurtenissen",
"LabelNotificationsMaxQueueSizeHelp": "Gebeurtenissen zijn beperkt tot 1 aftrap per seconde. Gebeurtenissen zullen genegeerd worden als de rij aan de maximale grootte zit. Dit voorkomt notificatie-spamming.", "LabelNotificationsMaxQueueSizeHelp": "Gebeurtenissen zijn beperkt tot 1 aftrap per seconde. Gebeurtenissen zullen genegeerd worden als de rij aan de maximale grootte zit. Dit voorkomt notificatie-spamming.",
"LabelNumberOfBooks": "Aantal Boeken", "LabelNumberOfBooks": "Aantal Boeken",
"LabelNumberOfChapters": "Aantal hoofdstukken:",
"LabelNumberOfEpisodes": "# Afleveringen", "LabelNumberOfEpisodes": "# Afleveringen",
"LabelOpenIDAdvancedPermsClaimDescription": "Naam van de OpenID-claim die geavanceerde machtigingen bevat voor gebruikersacties binnen de applicatie die van toepassing zijn op niet-beheerdersrollen (<b>indien geconfigureerd</b>). Als de claim ontbreekt in het antwoord, wordt toegang tot ABS geweigerd. Als er één optie ontbreekt, wordt deze behandeld als <code>false</code>. Zorg ervoor dat de claim van de identiteitsprovider overeenkomt met de verwachte structuur:", "LabelOpenIDAdvancedPermsClaimDescription": "Naam van de OpenID-claim die geavanceerde machtigingen bevat voor gebruikersacties binnen de applicatie die van toepassing zijn op niet-beheerdersrollen (<b>indien geconfigureerd</b>). Als de claim ontbreekt in het antwoord, wordt toegang tot ABS geweigerd. Als er één optie ontbreekt, wordt deze behandeld als <code>false</code>. Zorg ervoor dat de claim van de identiteitsprovider overeenkomt met de verwachte structuur:",
"LabelOpenIDClaims": "Laat de volgende opties leeg om geavanceerde groeps- en machtigingstoewijzing uit te schakelen en de groep 'Gebruiker' automatisch toe te wijzen.", "LabelOpenIDClaims": "Laat de volgende opties leeg om geavanceerde groeps- en machtigingstoewijzing uit te schakelen en de groep 'Gebruiker' automatisch toe te wijzen.",
@@ -514,7 +540,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",
@@ -544,6 +570,7 @@
"LabelSelectAll": "Alles selecteren", "LabelSelectAll": "Alles selecteren",
"LabelSelectAllEpisodes": "Selecteer alle afleveringen", "LabelSelectAllEpisodes": "Selecteer alle afleveringen",
"LabelSelectEpisodesShowing": "Selecteer {0} afleveringen laten zien", "LabelSelectEpisodesShowing": "Selecteer {0} afleveringen laten zien",
"LabelSelectUser": "Gebruiker kiezen",
"LabelSelectUsers": "Selecteer gebruikers", "LabelSelectUsers": "Selecteer gebruikers",
"LabelSendEbookToDevice": "Stuur ebook naar...", "LabelSendEbookToDevice": "Stuur ebook naar...",
"LabelSequence": "Sequentie", "LabelSequence": "Sequentie",
@@ -611,6 +638,7 @@
"LabelStartTime": "Starttijd", "LabelStartTime": "Starttijd",
"LabelStarted": "Gestart", "LabelStarted": "Gestart",
"LabelStartedAt": "Gestart op", "LabelStartedAt": "Gestart op",
"LabelStartedDate": "Gestart {0}",
"LabelStatsAudioTracks": "Audiotracks", "LabelStatsAudioTracks": "Audiotracks",
"LabelStatsAuthors": "Auteurs", "LabelStatsAuthors": "Auteurs",
"LabelStatsBestDay": "Beste dag", "LabelStatsBestDay": "Beste dag",
@@ -636,10 +664,11 @@
"LabelTextEditorBulletedList": "Opgesomde lijst", "LabelTextEditorBulletedList": "Opgesomde lijst",
"LabelTextEditorLink": "Link", "LabelTextEditorLink": "Link",
"LabelTextEditorNumberedList": "Genummerde lijst", "LabelTextEditorNumberedList": "Genummerde lijst",
"LabelTextEditorUnlink": "Unlink", "LabelTextEditorUnlink": "Ontkoppelen",
"LabelTheme": "Thema", "LabelTheme": "Thema",
"LabelThemeDark": "Donker", "LabelThemeDark": "Donker",
"LabelThemeLight": "Licht", "LabelThemeLight": "Licht",
"LabelThemeSepia": "Sepia",
"LabelTimeBase": "Tijdsbasis", "LabelTimeBase": "Tijdsbasis",
"LabelTimeDurationXHours": "{0} Uren", "LabelTimeDurationXHours": "{0} Uren",
"LabelTimeDurationXMinutes": "{0} minuten", "LabelTimeDurationXMinutes": "{0} minuten",
@@ -708,7 +737,9 @@
"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.", "MessageAsinCheck": "Zorg ervoor dat u de ASIN van de juiste Audible-regio gebruikt, niet die van Amazon.",
"MessageAuthenticationLegacyTokenWarning": "API tokens zijn verouderd en worden in de toekomst niet meer ondersteund. Gebruik inplaats daarvan <a href=\"/config/api-keys\">API keys</a> .",
"MessageAuthenticationOIDCChangesRestart": "Start uw server opnieuw op nadat u het opslaan hebt uitgevoerd, om de OIDC-wijzigingen toe te passen.", "MessageAuthenticationOIDCChangesRestart": "Start uw server opnieuw op nadat u het opslaan hebt uitgevoerd, om de OIDC-wijzigingen toe te passen.",
"MessageAuthenticationSecurityMessage": "Authenticatie is verbeterd omwille van veiligheid. Alle gebruikers moeten opnieuw inloggen.",
"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.",
@@ -722,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Geen resultaten voor filter \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Geen resultaten voor filter \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Geen resultaten voor query", "MessageBookshelfNoResultsForQuery": "Geen resultaten voor query",
"MessageBookshelfNoSeries": "Je hebt geen series", "MessageBookshelfNoSeries": "Je hebt geen series",
"MessageBulkChapterPattern": "Hoeveel hoofdstukken wilt u met dit nummeringspatroon toevoegen?",
"MessageChapterEndIsAfter": "Hoofdstukeinde is na het einde van je audioboek", "MessageChapterEndIsAfter": "Hoofdstukeinde is na het einde van je audioboek",
"MessageChapterErrorFirstNotZero": "Eerste hoofdstuk moet starten op 0", "MessageChapterErrorFirstNotZero": "Eerste hoofdstuk moet starten op 0",
"MessageChapterErrorStartGteDuration": "Ongeldig: starttijd moet kleiner zijn dan duur van audioboek", "MessageChapterErrorStartGteDuration": "Ongeldig: starttijd moet kleiner zijn dan duur van audioboek",
@@ -730,6 +762,7 @@
"MessageChaptersNotFound": "Hoofdstukken niet gevonden", "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?",
"MessageConfirmDeleteApiKey": "Weet je zeker dat je deze API key \"{0}\" wil verwijderen?",
"MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?", "MessageConfirmDeleteBackup": "Weet je zeker dat je de backup voor {0} wil verwijderen?",
"MessageConfirmDeleteDevice": "Ben je zeker dat je e-reader apparaat \"{0}\" wil verwijderen?", "MessageConfirmDeleteDevice": "Ben je zeker dat je e-reader apparaat \"{0}\" wil verwijderen?",
"MessageConfirmDeleteFile": "Dit verwijdert het bestand uit het bestandssysteem. Weet je het zeker?", "MessageConfirmDeleteFile": "Dit verwijdert het bestand uit het bestandssysteem. Weet je het zeker?",
@@ -762,7 +795,7 @@
"MessageConfirmRemoveListeningSessions": "Weet je zeker dat je {0} luistersessies wilt verwijderen?", "MessageConfirmRemoveListeningSessions": "Weet je zeker dat je {0} luistersessies wilt verwijderen?",
"MessageConfirmRemoveMetadataFiles": "Bent u zeker dat u alle metadata wil verwijderen. {0} bestanden in uw bibliotheel item folders?", "MessageConfirmRemoveMetadataFiles": "Bent u zeker dat u alle metadata wil verwijderen. {0} bestanden in uw bibliotheel item folders?",
"MessageConfirmRemoveNarrator": "Weet je zeker dat je verteller \"{0}\" wil verwijderen?", "MessageConfirmRemoveNarrator": "Weet je zeker dat je verteller \"{0}\" wil verwijderen?",
"MessageConfirmRemovePlaylist": "Weet je zeker dat je je afspeellijst \"{0}\" wil verwijderen?", "MessageConfirmRemovePlaylist": "Weet je zeker dat je afspeellijst \"{0}\" wil verwijderen?",
"MessageConfirmRenameGenre": "Weet je zeker dat je genre \"{0}\" wil hernoemen naar \"{1}\" voor alle onderdelen?", "MessageConfirmRenameGenre": "Weet je zeker dat je genre \"{0}\" wil hernoemen naar \"{1}\" voor alle onderdelen?",
"MessageConfirmRenameGenreMergeNote": "Opmerking: Dit genre bestaat al, dus zullen ze worden samengevoegd.", "MessageConfirmRenameGenreMergeNote": "Opmerking: Dit genre bestaat al, dus zullen ze worden samengevoegd.",
"MessageConfirmRenameGenreWarning": "Waarschuwing! Een gelijknamig genre met ander hoofdlettergebruik bestaat al: \"{0}\".", "MessageConfirmRenameGenreWarning": "Waarschuwing! Een gelijknamig genre met ander hoofdlettergebruik bestaat al: \"{0}\".",
@@ -783,6 +816,8 @@
"MessageFeedURLWillBe": "Feed URL zal {0} zijn", "MessageFeedURLWillBe": "Feed URL zal {0} zijn",
"MessageFetching": "Aan het ophalen...", "MessageFetching": "Aan het ophalen...",
"MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.", "MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} luistert</strong> op {1}",
"MessageHeatmapNoListeningSessions": "Geen luistersessies op {0}",
"MessageImportantNotice": "Belangrijke opmerking!", "MessageImportantNotice": "Belangrijke opmerking!",
"MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen", "MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen",
"MessageInvalidAsin": "Ongeldige ASIN", "MessageInvalidAsin": "Ongeldige ASIN",
@@ -922,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Wordt geactiveerd wanneer automatische afleveringsdownloads zijn uitgeschakeld vanwege te veel mislukte pogingen", "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", "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",
"PlaceholderBulkChapterInput": "Voer een hoofdstuktitel in of gebruik nummering (bijv. 'Aflevering 1', 'Hoofdstuk 10', '1.')",
"PlaceholderNewCollection": "Nieuwe naam collectie", "PlaceholderNewCollection": "Nieuwe naam collectie",
"PlaceholderNewFolderPath": "Nieuwe locatie map", "PlaceholderNewFolderPath": "Nieuwe locatie map",
"PlaceholderNewPlaylist": "Nieuwe naam afspeellijst", "PlaceholderNewPlaylist": "Nieuwe naam afspeellijst",
@@ -975,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Aanmaken boekwijzer mislukt", "ToastBookmarkCreateFailed": "Aanmaken boekwijzer mislukt",
"ToastBookmarkCreateSuccess": "boekwijzer toegevoegd", "ToastBookmarkCreateSuccess": "boekwijzer toegevoegd",
"ToastBookmarkRemoveSuccess": "Boekwijzer verwijderd", "ToastBookmarkRemoveSuccess": "Boekwijzer verwijderd",
"ToastBulkChapterInvalidCount": "Voer een nummer in tussen 1 en 150",
"ToastCachePurgeFailed": "Cache wissen is mislukt", "ToastCachePurgeFailed": "Cache wissen is mislukt",
"ToastCachePurgeSuccess": "Cache succesvol verwijderd", "ToastCachePurgeSuccess": "Cache succesvol verwijderd",
"ToastChapterLocked": "Hoofdstuk is vergrendeld.",
"ToastChapterStartTimeAdjusted": "Hoofdstukstarttijd aangepast met {0} seconden",
"ToastChaptersAllLocked": "Alle hoofdstukken zijn vergrendeld. Ontgrendel sommige hoofdstukken om hun tijd te verschuiven.",
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten", "ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
"ToastChaptersInvalidShiftAmountLast": "Ongeldige shift-tijd. De starttijd van het laatste hoofdstuk zou langer zijn dan de duur van dit audioboek.", "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.", "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.",
@@ -1001,6 +1041,8 @@
"ToastEpisodeDownloadQueueClearSuccess": "Aflevering download-wachtrij geleegt", "ToastEpisodeDownloadQueueClearSuccess": "Aflevering download-wachtrij geleegt",
"ToastEpisodeUpdateSuccess": "{0} afleveringen bijgewerkt", "ToastEpisodeUpdateSuccess": "{0} afleveringen bijgewerkt",
"ToastErrorCannotShare": "Kan niet native delen op dit apparaat", "ToastErrorCannotShare": "Kan niet native delen op dit apparaat",
"ToastFailedToCreate": "Fout tijdens creëren",
"ToastFailedToDelete": "Fout tijdens verwijderen",
"ToastFailedToLoadData": "Data laden mislukt", "ToastFailedToLoadData": "Data laden mislukt",
"ToastFailedToMatch": "Match mislukt", "ToastFailedToMatch": "Match mislukt",
"ToastFailedToShare": "Delen mislukt", "ToastFailedToShare": "Delen mislukt",
@@ -1008,6 +1050,7 @@
"ToastInvalidImageUrl": "Ongeldige afbeeldings-URL", "ToastInvalidImageUrl": "Ongeldige afbeeldings-URL",
"ToastInvalidMaxEpisodesToDownload": "Ongeldig maximum aantal afleveringen om te downloaden", "ToastInvalidMaxEpisodesToDownload": "Ongeldig maximum aantal afleveringen om te downloaden",
"ToastInvalidUrl": "Ongeldige URL", "ToastInvalidUrl": "Ongeldige URL",
"ToastInvalidUrls": "Een of meerdere URLs zijn ongeldig",
"ToastItemCoverUpdateSuccess": "Omslag bijgewerkt", "ToastItemCoverUpdateSuccess": "Omslag bijgewerkt",
"ToastItemDeletedFailed": "Item verwijderen mislukt", "ToastItemDeletedFailed": "Item verwijderen mislukt",
"ToastItemDeletedSuccess": "Verwijderd item", "ToastItemDeletedSuccess": "Verwijderd item",
@@ -1032,6 +1075,7 @@
"ToastMustHaveAtLeastOnePath": "Moet ten minste een pad hebben", "ToastMustHaveAtLeastOnePath": "Moet ten minste een pad hebben",
"ToastNameEmailRequired": "Naam en email zijn vereist", "ToastNameEmailRequired": "Naam en email zijn vereist",
"ToastNameRequired": "Naam is vereist", "ToastNameRequired": "Naam is vereist",
"ToastNewApiKeyUserError": "Selecteer een gebruiker",
"ToastNewEpisodesFound": "{0} nieuwe afleveringen gevonden", "ToastNewEpisodesFound": "{0} nieuwe afleveringen gevonden",
"ToastNewUserCreatedFailed": "Account: \"{0}\" aanmaken mislukt", "ToastNewUserCreatedFailed": "Account: \"{0}\" aanmaken mislukt",
"ToastNewUserCreatedSuccess": "Nieuw account aangemaakt", "ToastNewUserCreatedSuccess": "Nieuw account aangemaakt",
@@ -1056,6 +1100,7 @@
"ToastPlaylistUpdateSuccess": "Afspeellijst bijgewerkt", "ToastPlaylistUpdateSuccess": "Afspeellijst bijgewerkt",
"ToastPodcastCreateFailed": "Podcast aanmaken mislukt", "ToastPodcastCreateFailed": "Podcast aanmaken mislukt",
"ToastPodcastCreateSuccess": "Podcast aangemaakt", "ToastPodcastCreateSuccess": "Podcast aangemaakt",
"ToastPodcastEpisodeUpdated": "Aflevering bijgewerkt",
"ToastPodcastGetFeedFailed": "Podcast feed ophalen mislukt", "ToastPodcastGetFeedFailed": "Podcast feed ophalen mislukt",
"ToastPodcastNoEpisodesInFeed": "Geen afleveringen gevonden in RSS feed", "ToastPodcastNoEpisodesInFeed": "Geen afleveringen gevonden in RSS feed",
"ToastPodcastNoRssFeed": "Podcast heeft geen RSS feed", "ToastPodcastNoRssFeed": "Podcast heeft geen RSS feed",
@@ -1106,5 +1151,13 @@
"ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd", "ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd",
"ToastUserPasswordMismatch": "Wachtwoorden komen niet overeen", "ToastUserPasswordMismatch": "Wachtwoorden komen niet overeen",
"ToastUserPasswordMustChange": "Het nieuwe wachtwoord kan niet overeenkomen met het oude wachtwoord", "ToastUserPasswordMustChange": "Het nieuwe wachtwoord kan niet overeenkomen met het oude wachtwoord",
"ToastUserRootRequireName": "U moet een root-gebruikersnaam invoeren" "ToastUserRootRequireName": "U moet een root-gebruikersnaam invoeren",
"TooltipAddChapters": "Hoofdstuk(ken) toevoegen",
"TooltipAddOneSecond": "1 seconde toevoegen",
"TooltipAdjustChapterStart": "Klik om de starttijd aan te passen",
"TooltipLockAllChapters": "Alle hoofdstukken vergrendelen",
"TooltipLockChapter": "Hoofdstuk vergrendelen (Shift+klikken voor bereik)",
"TooltipSubtractOneSecond": "Trek 1 seconde af",
"TooltipUnlockAllChapters": "Alle hoofdstukken ontgrendelen",
"TooltipUnlockChapter": "Hoofdstuk ontgrendelen (Shift+klikken voor bereik)"
} }
+32 -10
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Legg til", "ButtonAdd": "Legg til",
"ButtonAddApiKey": "Legg til API-nøkkel",
"ButtonAddChapters": "Legg til kapittel", "ButtonAddChapters": "Legg til kapittel",
"ButtonAddDevice": "Legg til enhet", "ButtonAddDevice": "Legg til enhet",
"ButtonAddLibrary": "Legg til bibliotek", "ButtonAddLibrary": "Legg til bibliotek",
@@ -10,6 +11,8 @@
"ButtonApplyChapters": "Bruk kapittel", "ButtonApplyChapters": "Bruk kapittel",
"ButtonAuthors": "Forfattere", "ButtonAuthors": "Forfattere",
"ButtonBack": "Tilbake", "ButtonBack": "Tilbake",
"ButtonBatchEditPopulateFromExisting": "Fyll ut fra eksisterende",
"ButtonBatchEditPopulateMapDetails": "Legg til detaljer",
"ButtonBrowseForFolder": "Bla gjennom mappe", "ButtonBrowseForFolder": "Bla gjennom mappe",
"ButtonCancel": "Avbryt", "ButtonCancel": "Avbryt",
"ButtonCancelEncode": "Avbryt konvertering", "ButtonCancelEncode": "Avbryt konvertering",
@@ -18,6 +21,7 @@
"ButtonChooseAFolder": "Velg mappe", "ButtonChooseAFolder": "Velg mappe",
"ButtonChooseFiles": "Velg filer", "ButtonChooseFiles": "Velg filer",
"ButtonClearFilter": "Fjern filter", "ButtonClearFilter": "Fjern filter",
"ButtonClose": "Lukk",
"ButtonCloseFeed": "Lukk Feed", "ButtonCloseFeed": "Lukk Feed",
"ButtonCloseSession": "Lukk åpen økt", "ButtonCloseSession": "Lukk åpen økt",
"ButtonCollections": "Samlinger", "ButtonCollections": "Samlinger",
@@ -117,11 +121,13 @@
"HeaderAccount": "Konto", "HeaderAccount": "Konto",
"HeaderAddCustomMetadataProvider": "Legg til egendefinert metadata tilbyder", "HeaderAddCustomMetadataProvider": "Legg til egendefinert metadata tilbyder",
"HeaderAdvanced": "Avansert", "HeaderAdvanced": "Avansert",
"HeaderApiKeys": "API-nøkler",
"HeaderAppriseNotificationSettings": "Apprise varslingsinstillinger", "HeaderAppriseNotificationSettings": "Apprise varslingsinstillinger",
"HeaderAudioTracks": "Lydspor", "HeaderAudioTracks": "Lydspor",
"HeaderAudiobookTools": "Lydbok Filbehandlingsverktøy", "HeaderAudiobookTools": "Lydbok Filbehandlingsverktøy",
"HeaderAuthentication": "Autentisering", "HeaderAuthentication": "Autentisering",
"HeaderBackups": "Sikkerhetskopier", "HeaderBackups": "Sikkerhetskopier",
"HeaderBulkChapterModal": "Legg til flere kapitler",
"HeaderChangePassword": "Bytt passord", "HeaderChangePassword": "Bytt passord",
"HeaderChapters": "Kapittel", "HeaderChapters": "Kapittel",
"HeaderChooseAFolder": "Velg en mappe", "HeaderChooseAFolder": "Velg en mappe",
@@ -160,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Prioriteringsrekkefølge for metadata", "HeaderMetadataOrderOfPrecedence": "Prioriteringsrekkefølge for metadata",
"HeaderMetadataToEmbed": "Metadata å bake inn", "HeaderMetadataToEmbed": "Metadata å bake inn",
"HeaderNewAccount": "Ny konto", "HeaderNewAccount": "Ny konto",
"HeaderNewApiKey": "Ny API-nøkkel",
"HeaderNewLibrary": "Ny bibliotek", "HeaderNewLibrary": "Ny bibliotek",
"HeaderNotificationCreate": "Opprett varsling", "HeaderNotificationCreate": "Opprett varsling",
"HeaderNotificationUpdate": "Oppdater varsling", "HeaderNotificationUpdate": "Oppdater varsling",
@@ -193,6 +200,7 @@
"HeaderSettingsExperimental": "Eksperimentelle funksjoner", "HeaderSettingsExperimental": "Eksperimentelle funksjoner",
"HeaderSettingsGeneral": "Generell", "HeaderSettingsGeneral": "Generell",
"HeaderSettingsScanner": "Skanner", "HeaderSettingsScanner": "Skanner",
"HeaderSettingsSecurity": "Sikkerhet",
"HeaderSettingsWebClient": "Webklient", "HeaderSettingsWebClient": "Webklient",
"HeaderSleepTimer": "Sove timer", "HeaderSleepTimer": "Sove timer",
"HeaderStatsLargestItems": "Største enheter", "HeaderStatsLargestItems": "Største enheter",
@@ -204,6 +212,7 @@
"HeaderTableOfContents": "Innholdsfortegnelse", "HeaderTableOfContents": "Innholdsfortegnelse",
"HeaderTools": "Verktøy", "HeaderTools": "Verktøy",
"HeaderUpdateAccount": "Oppdater konto", "HeaderUpdateAccount": "Oppdater konto",
"HeaderUpdateApiKey": "Oppdater API-nøkkel",
"HeaderUpdateAuthor": "Oppdater forfatter", "HeaderUpdateAuthor": "Oppdater forfatter",
"HeaderUpdateDetails": "Oppdater detaljer", "HeaderUpdateDetails": "Oppdater detaljer",
"HeaderUpdateLibrary": "Oppdater bibliotek", "HeaderUpdateLibrary": "Oppdater bibliotek",
@@ -233,6 +242,10 @@
"LabelAllUsersExcludingGuests": "Alle brukere bortsett fra gjester", "LabelAllUsersExcludingGuests": "Alle brukere bortsett fra gjester",
"LabelAllUsersIncludingGuests": "Alle brukere inkludert gjester", "LabelAllUsersIncludingGuests": "Alle brukere inkludert gjester",
"LabelAlreadyInYourLibrary": "Allerede i biblioteket", "LabelAlreadyInYourLibrary": "Allerede i biblioteket",
"LabelApiKeyCreated": "API-nøkkel \"{0}\" ble opprettet.",
"LabelApiKeyCreatedDescription": "Husk å kopiere API-nøkkelen nå siden du ikke kan se den igjen senere.",
"LabelApiKeyUser": "Handle på vegne av bruker",
"LabelApiKeyUserDescription": "Denne API-nøkkelen vil ha de samme tillatelsene som brukeren den handler på vegne av. I loggene vil dette se ut som om brukeren selv foretok forespørselen.",
"LabelApiToken": "API token", "LabelApiToken": "API token",
"LabelAppend": "Legge til", "LabelAppend": "Legge til",
"LabelAudioBitrate": "Bitrate for lyd (f.eks. 128k)", "LabelAudioBitrate": "Bitrate for lyd (f.eks. 128k)",
@@ -252,7 +265,7 @@
"LabelBackToUser": "Tilbake til bruker", "LabelBackToUser": "Tilbake til bruker",
"LabelBackupAudioFiles": "Sikkerhetskopier lydfiler", "LabelBackupAudioFiles": "Sikkerhetskopier lydfiler",
"LabelBackupLocation": "Mappe for sikkerhetskopiering", "LabelBackupLocation": "Mappe for sikkerhetskopiering",
"LabelBackupsEnableAutomaticBackups": "Aktiver automatisk sikkerhetskopi", "LabelBackupsEnableAutomaticBackups": "Automatiske sikkerhetskopier",
"LabelBackupsEnableAutomaticBackupsHelp": "Sikkerhetskopier lagret under /metadata/backups", "LabelBackupsEnableAutomaticBackupsHelp": "Sikkerhetskopier lagret under /metadata/backups",
"LabelBackupsMaxBackupSize": "Maksimal størrelse for sikkerhetskopi (i GB) (0 for ubegrenset)", "LabelBackupsMaxBackupSize": "Maksimal størrelse for sikkerhetskopi (i GB) (0 for ubegrenset)",
"LabelBackupsMaxBackupSizeHelp": "For å forhindre feilkonfigurasjon, vil sikkerhetskopier mislykkes hvis de oveskride konfigurert størrelse.", "LabelBackupsMaxBackupSizeHelp": "For å forhindre feilkonfigurasjon, vil sikkerhetskopier mislykkes hvis de oveskride konfigurert størrelse.",
@@ -282,6 +295,7 @@
"LabelContinueListening": "Fortsett lytting", "LabelContinueListening": "Fortsett lytting",
"LabelContinueReading": "Fortsett lesing", "LabelContinueReading": "Fortsett lesing",
"LabelContinueSeries": "Fortsett serier", "LabelContinueSeries": "Fortsett serier",
"LabelCorsAllowed": "Tillate CORS-opprinnelser",
"LabelCover": "Omslag", "LabelCover": "Omslag",
"LabelCoverImageURL": "Omslagsbilde URL", "LabelCoverImageURL": "Omslagsbilde URL",
"LabelCoverProvider": "Tilbyder av omslagsbilde", "LabelCoverProvider": "Tilbyder av omslagsbilde",
@@ -344,6 +358,10 @@
"LabelExample": "Eksempel", "LabelExample": "Eksempel",
"LabelExpandSeries": "Vis serie", "LabelExpandSeries": "Vis serie",
"LabelExpandSubSeries": "Vis underserie", "LabelExpandSubSeries": "Vis underserie",
"LabelExpired": "Utløpt",
"LabelExpiresAt": "Utløper",
"LabelExpiresInSeconds": "Utløper om (sekunder)",
"LabelExpiresNever": "Aldri",
"LabelExplicit": "Eksplisitt", "LabelExplicit": "Eksplisitt",
"LabelExplicitChecked": "Eksplisitt (avhuket)", "LabelExplicitChecked": "Eksplisitt (avhuket)",
"LabelExplicitUnchecked": "Ikke eksplisitt (ikke avhuket)", "LabelExplicitUnchecked": "Ikke eksplisitt (ikke avhuket)",
@@ -373,7 +391,7 @@
"LabelGenres": "Sjangre", "LabelGenres": "Sjangre",
"LabelHardDeleteFile": "Tving sletting av fil", "LabelHardDeleteFile": "Tving sletting av fil",
"LabelHasEbook": "Har e-bok", "LabelHasEbook": "Har e-bok",
"LabelHasSupplementaryEbook": "Har komplimentær e-bok", "LabelHasSupplementaryEbook": "Har supplerende e-bok",
"LabelHideSubtitles": "Skjul undertitler", "LabelHideSubtitles": "Skjul undertitler",
"LabelHighestPriority": "Høyeste prioritet", "LabelHighestPriority": "Høyeste prioritet",
"LabelHost": "Tjener", "LabelHost": "Tjener",
@@ -403,10 +421,11 @@
"LabelLanguages": "Språk", "LabelLanguages": "Språk",
"LabelLastBookAdded": "Siste bok lagt til", "LabelLastBookAdded": "Siste bok lagt til",
"LabelLastBookUpdated": "Siste bok oppdatert", "LabelLastBookUpdated": "Siste bok oppdatert",
"LabelLastProgressDate": "Siste fremgang: {0}",
"LabelLastSeen": "Sist sett", "LabelLastSeen": "Sist sett",
"LabelLastTime": "Siste tid", "LabelLastTime": "Siste tid",
"LabelLastUpdate": "Siste oppdatering", "LabelLastUpdate": "Siste oppdatering",
"LabelLayout": "Oppsett", "LabelLayout": "Utseende",
"LabelLayoutSinglePage": "Enkeltside", "LabelLayoutSinglePage": "Enkeltside",
"LabelLayoutSplitPage": "Del side", "LabelLayoutSplitPage": "Del side",
"LabelLess": "Mindre", "LabelLess": "Mindre",
@@ -415,12 +434,13 @@
"LabelLibraryFilterSublistEmpty": "Ingen {0}", "LabelLibraryFilterSublistEmpty": "Ingen {0}",
"LabelLibraryItem": "Bibliotek enhet", "LabelLibraryItem": "Bibliotek enhet",
"LabelLibraryName": "Bibliotek navn", "LabelLibraryName": "Bibliotek navn",
"LabelLibrarySortByProgress": "Fremgang: Sist oppdatert",
"LabelLimit": "Begrensning", "LabelLimit": "Begrensning",
"LabelLineSpacing": "Linjemellomrom", "LabelLineSpacing": "Linjemellomrom",
"LabelListenAgain": "Lytt igjen", "LabelListenAgain": "Lytt igjen",
"LabelLogLevelDebug": "Debug", "LabelLogLevelDebug": "Debug",
"LabelLogLevelInfo": "Info", "LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Warn", "LabelLogLevelWarn": "Varsel",
"LabelLookForNewEpisodesAfterDate": "Se etter nye episoder etter denne datoen", "LabelLookForNewEpisodesAfterDate": "Se etter nye episoder etter denne datoen",
"LabelLowestPriority": "Laveste prioritet", "LabelLowestPriority": "Laveste prioritet",
"LabelMatchExistingUsersBy": "Knytt sammen eksisterende brukere basert på", "LabelMatchExistingUsersBy": "Knytt sammen eksisterende brukere basert på",
@@ -468,9 +488,10 @@
"LabelNotificationsMaxQueueSize": "Maksimalt antall varslinger i kø", "LabelNotificationsMaxQueueSize": "Maksimalt antall varslinger i kø",
"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": "# 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:", "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.",
"LabelOpenIDGroupClaimDescription": "Navn på OpenID-forespørsel som inneholder en lite over brukerens grupper. Vanligvis kalt <code>grupper</code>. <b>Om konfigurert</b>, vil applikasjonen tildele roller baseret på brukerens gruppemedlemsskaper, gitt disse grupper er navngitt (uten forbehold for store og små bokstaver) 'admin', 'user' eller 'guest' i forespørsel. Forespørselen burde inneholde en liste (og hvis brukeren tilhører flere grupper), applikasjonen vil tildele rolle med høyeste adgangsnivå. Hvis ingen grupper matcher vil adgang bli nektet.",
"LabelOpenRSSFeed": "Åpne RSS Feed", "LabelOpenRSSFeed": "Åpne RSS Feed",
"LabelOverwrite": "Overskriv", "LabelOverwrite": "Overskriv",
"LabelPaginationPageXOfY": "Side {0} av {1}", "LabelPaginationPageXOfY": "Side {0} av {1}",
@@ -510,11 +531,11 @@
"LabelPublishers": "Utgivere", "LabelPublishers": "Utgivere",
"LabelRSSFeedCustomOwnerEmail": "Tilpasset eier e-post", "LabelRSSFeedCustomOwnerEmail": "Tilpasset eier e-post",
"LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn", "LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn",
"LabelRSSFeedOpen": "RSS Feed åpne", "LabelRSSFeedOpen": "RSS-strøm åpen",
"LabelRSSFeedPreventIndexing": "Forhindre indeksering", "LabelRSSFeedPreventIndexing": "Forhindre indeksering",
"LabelRSSFeedSlug": "RSS-feed ID", "LabelRSSFeedSlug": "RSS-feed ID",
"LabelRSSFeedURL": "RSS-feed URL", "LabelRSSFeedURL": "RSS-feed URL",
"LabelRandomly": "Tilfeldig", "LabelRandomly": "Tilfeldighet",
"LabelReAddSeriesToContinueListening": "Legg til igjen til \"Fortsett å lytte\"", "LabelReAddSeriesToContinueListening": "Legg til igjen til \"Fortsett å lytte\"",
"LabelRead": "Les", "LabelRead": "Les",
"LabelReadAgain": "Les igjen", "LabelReadAgain": "Les igjen",
@@ -624,7 +645,7 @@
"LabelStatsWeekListening": "Uker lyttet", "LabelStatsWeekListening": "Uker lyttet",
"LabelSubtitle": "Undertittel", "LabelSubtitle": "Undertittel",
"LabelSupportedFileTypes": "Støttede filtyper", "LabelSupportedFileTypes": "Støttede filtyper",
"LabelTag": "Tag", "LabelTag": "Merke",
"LabelTags": "Tagger", "LabelTags": "Tagger",
"LabelTagsAccessibleToUser": "Tagger tilgjengelig for bruker", "LabelTagsAccessibleToUser": "Tagger tilgjengelig for bruker",
"LabelTagsNotAccessibleToUser": "Tagger ikke tilgjengelig for bruker", "LabelTagsNotAccessibleToUser": "Tagger ikke tilgjengelig for bruker",
@@ -740,7 +761,7 @@
"MessageConfirmMarkSeriesFinished": "Er du sikker på at du vil markere alle bøkene i serien som fullført?", "MessageConfirmMarkSeriesFinished": "Er du sikker på at du vil markere alle bøkene i serien som fullført?",
"MessageConfirmMarkSeriesNotFinished": "Er du sikker på at du vil markere alle bøkene i serien som ikke fullført?", "MessageConfirmMarkSeriesNotFinished": "Er du sikker på at du vil markere alle bøkene i serien som ikke fullført?",
"MessageConfirmNotificationTestTrigger": "Utløs dette varselet med test-data?", "MessageConfirmNotificationTestTrigger": "Utløs dette varselet med test-data?",
"MessageConfirmPurgeCache": "(Purge cache) Dette vil sletter hele mappen <code>/metadata/cache</code>. <br /><br />Er du sikker på at du du vil slette cache-mappen?", "MessageConfirmPurgeCache": "Tømming av mellomlagring vil slette hele mappen <code>/metadata/cache</code>. <br /><br />Er du sikker på at du du vil slette mappen?",
"MessageConfirmPurgeItemsCache": "(Purge items cache) Dette vil sletter hele mappen <code>/metadata/cache/items</code>.<br />Er du sikker?", "MessageConfirmPurgeItemsCache": "(Purge items cache) Dette vil sletter hele mappen <code>/metadata/cache/items</code>.<br />Er du sikker?",
"MessageConfirmQuickEmbed": "Advarsel! Rask innbygging av metadata tar ikke backup av lyd-filene først. Forsikre deg om at du har sikkerhetskopi av filene. <br><br> Fortsett?", "MessageConfirmQuickEmbed": "Advarsel! Rask innbygging av metadata tar ikke backup av lyd-filene først. Forsikre deg om at du har sikkerhetskopi av filene. <br><br> Fortsett?",
"MessageConfirmQuickMatchEpisodes": "Hurtig gjenkjenning av episoder overskriver detaljene hvis en match blir funnet. Kun episoder som ikke allerede er matchet blir oppdatert. Er du sikker?", "MessageConfirmQuickMatchEpisodes": "Hurtig gjenkjenning av episoder overskriver detaljene hvis en match blir funnet. Kun episoder som ikke allerede er matchet blir oppdatert. Er du sikker?",
@@ -829,7 +850,7 @@
"MessagePlaylistCreateFromCollection": "Lag spilleliste fra samling", "MessagePlaylistCreateFromCollection": "Lag spilleliste fra samling",
"MessagePleaseWait": "Vennligst vent...", "MessagePleaseWait": "Vennligst vent...",
"MessagePodcastHasNoRSSFeedForMatching": "Podcast har ingen RSS feed url til bruk av sammenligning", "MessagePodcastHasNoRSSFeedForMatching": "Podcast har ingen RSS feed url til bruk av sammenligning",
"MessagePodcastSearchField": "Skriv inn søkeord eller RSS-feed URL", "MessagePodcastSearchField": "Skriv inn søkeord eller URL til en RSS-strøm",
"MessageQuickEmbedInProgress": "Hurtiginnbygging pågår", "MessageQuickEmbedInProgress": "Hurtiginnbygging pågår",
"MessageQuickEmbedQueue": "Kø for hurtiginnbygging ({0} i kø)", "MessageQuickEmbedQueue": "Kø for hurtiginnbygging ({0} i kø)",
"MessageQuickMatchAllEpisodes": "Kjapp matching av alle episoder", "MessageQuickMatchAllEpisodes": "Kjapp matching av alle episoder",
@@ -920,6 +941,7 @@
"ToastCollectionItemsAddFailed": "Feil med å legge til element(er)", "ToastCollectionItemsAddFailed": "Feil med å legge til element(er)",
"ToastCollectionRemoveSuccess": "Samling fjernet", "ToastCollectionRemoveSuccess": "Samling fjernet",
"ToastCollectionUpdateSuccess": "samlingupdated", "ToastCollectionUpdateSuccess": "samlingupdated",
"ToastCoverSearchFailed": "Finner ikke bokomslag",
"ToastCoverUpdateFailed": "Oppdatering av bilde feilet", "ToastCoverUpdateFailed": "Oppdatering av bilde feilet",
"ToastDeleteFileFailed": "Kunne ikke slette fil", "ToastDeleteFileFailed": "Kunne ikke slette fil",
"ToastDeleteFileSuccess": "Fil slettet", "ToastDeleteFileSuccess": "Fil slettet",
+167 -1
View File
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Narzędzia do zarządzania audiobookami", "HeaderAudiobookTools": "Narzędzia do zarządzania audiobookami",
"HeaderAuthentication": "Uwierzytelnianie", "HeaderAuthentication": "Uwierzytelnianie",
"HeaderBackups": "Kopie zapasowe", "HeaderBackups": "Kopie zapasowe",
"HeaderBulkChapterModal": "Dodaj wiele rozdziałów",
"HeaderChangePassword": "Zmień hasło", "HeaderChangePassword": "Zmień hasło",
"HeaderChapters": "Rozdziały", "HeaderChapters": "Rozdziały",
"HeaderChooseAFolder": "Wybierz folder", "HeaderChooseAFolder": "Wybierz folder",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Funkcje eksperymentalne", "HeaderSettingsExperimental": "Funkcje eksperymentalne",
"HeaderSettingsGeneral": "Ogólne", "HeaderSettingsGeneral": "Ogólne",
"HeaderSettingsScanner": "Skanowanie", "HeaderSettingsScanner": "Skanowanie",
"HeaderSettingsSecurity": "Bezpieczeństwo",
"HeaderSettingsWebClient": "Klient webowy", "HeaderSettingsWebClient": "Klient webowy",
"HeaderSleepTimer": "Wyłącznik czasowy", "HeaderSleepTimer": "Wyłącznik czasowy",
"HeaderStatsLargestItems": "Największe pozycje", "HeaderStatsLargestItems": "Największe pozycje",
@@ -241,6 +243,9 @@
"LabelAllUsersIncludingGuests": "Wszyscy użytkownicy, łącznie z gośćmi", "LabelAllUsersIncludingGuests": "Wszyscy użytkownicy, łącznie z gośćmi",
"LabelAlreadyInYourLibrary": "Już istnieje w twojej bibliotece", "LabelAlreadyInYourLibrary": "Już istnieje w twojej bibliotece",
"LabelApiKeyCreated": "Klucz API \"{0}\" został pomyślnie utworzony.", "LabelApiKeyCreated": "Klucz API \"{0}\" został pomyślnie utworzony.",
"LabelApiKeyCreatedDescription": "Pamiętaj o skopiowaniu klucza API, ponieważ nie będziesz już mógł go zobaczyć.",
"LabelApiKeyUser": "Wykonaj w imieniu innego użytkownika",
"LabelApiKeyUserDescription": "Ten klucz API będzie miał te same uprawnienia co użytkownik, w którego imieniu ma być używany. Wpisy w logach będą identyczne z tymi, wywołanymi przez samego użytkownika.",
"LabelApiToken": "API Token", "LabelApiToken": "API Token",
"LabelAppend": "Dołącz", "LabelAppend": "Dołącz",
"LabelAudioBitrate": "Audio Bitrate (np. 128k)", "LabelAudioBitrate": "Audio Bitrate (np. 128k)",
@@ -303,6 +308,7 @@
"LabelDeleteFromFileSystemCheckbox": "Usuń z systemu plików (odznacz, aby usunąć tylko z bazy danych)", "LabelDeleteFromFileSystemCheckbox": "Usuń z systemu plików (odznacz, aby usunąć tylko z bazy danych)",
"LabelDescription": "Opis", "LabelDescription": "Opis",
"LabelDeselectAll": "Odznacz wszystko", "LabelDeselectAll": "Odznacz wszystko",
"LabelDetectedPattern": "Wykryty schemat:",
"LabelDevice": "Urządzenie", "LabelDevice": "Urządzenie",
"LabelDeviceInfo": "Informacja o urządzeniu", "LabelDeviceInfo": "Informacja o urządzeniu",
"LabelDeviceIsAvailableTo": "Urządzenie jest dostępne do...", "LabelDeviceIsAvailableTo": "Urządzenie jest dostępne do...",
@@ -312,6 +318,7 @@
"LabelDiscover": "Odkrywaj", "LabelDiscover": "Odkrywaj",
"LabelDownload": "Pobierz", "LabelDownload": "Pobierz",
"LabelDownloadNEpisodes": "Ściąganie {0} odcinków", "LabelDownloadNEpisodes": "Ściąganie {0} odcinków",
"LabelDownloadable": "Do pobrania",
"LabelDuration": "Czas trwania", "LabelDuration": "Czas trwania",
"LabelDurationComparisonExactMatch": "(dokładne dopasowanie)", "LabelDurationComparisonExactMatch": "(dokładne dopasowanie)",
"LabelDurationComparisonLonger": "({0} dłużej)", "LabelDurationComparisonLonger": "({0} dłużej)",
@@ -334,9 +341,15 @@
"LabelEncodingClearItemCache": "Pamiętaj o okresowym czyszczeniu pamięci podręcznej elementów.", "LabelEncodingClearItemCache": "Pamiętaj o okresowym czyszczeniu pamięci podręcznej elementów.",
"LabelEncodingFinishedM4B": "Ukończony plik M4B zostanie umieszczony w folderze audiobooka pod adresem:", "LabelEncodingFinishedM4B": "Ukończony plik M4B zostanie umieszczony w folderze audiobooka pod adresem:",
"LabelEncodingInfoEmbedded": "Metadane zostaną osadzone w ścieżkach audio w folderze z audiobookiem.", "LabelEncodingInfoEmbedded": "Metadane zostaną osadzone w ścieżkach audio w folderze z audiobookiem.",
"LabelEncodingStartedNavigation": "Po uruchomieniu zadania możesz opuścić tę stronę.",
"LabelEncodingTimeWarning": "Konwersja może potrwać do 30 minut.",
"LabelEncodingWarningAdvancedSettings": "Ostrzeżenie: Nie aktualizuj tych ustawień, jeśli nie jesteś zaznajomiony ze sposobem działania ffmpeg i opcji konwersji.",
"LabelEncodingWatcherDisabled": "Jeśli monitorowanie folderów jest wyłączone, należy ponownie przeskanować audiobooka.",
"LabelEnd": "Zakończ", "LabelEnd": "Zakończ",
"LabelEndOfChapter": "Koniec rozdziału", "LabelEndOfChapter": "Koniec rozdziału",
"LabelEpisode": "Odcinek", "LabelEpisode": "Odcinek",
"LabelEpisodeNotLinkedToRssFeed": "Odcinek nie jest powiązany z kanałem RSS",
"LabelEpisodeNumber": "Odcinek #{0}",
"LabelEpisodeTitle": "Tytuł odcinka", "LabelEpisodeTitle": "Tytuł odcinka",
"LabelEpisodeType": "Typ odcinka", "LabelEpisodeType": "Typ odcinka",
"LabelEpisodeUrlFromRssFeed": "Adres URL odcinka z kanału RSS", "LabelEpisodeUrlFromRssFeed": "Adres URL odcinka z kanału RSS",
@@ -345,6 +358,10 @@
"LabelExample": "Przykład", "LabelExample": "Przykład",
"LabelExpandSeries": "Rozwiń serie", "LabelExpandSeries": "Rozwiń serie",
"LabelExpandSubSeries": "Rozwiń podserie", "LabelExpandSubSeries": "Rozwiń podserie",
"LabelExpired": "Przeterminowane",
"LabelExpiresAt": "Wygasa w",
"LabelExpiresInSeconds": "Wygasa za (sekund)",
"LabelExpiresNever": "Nigdy",
"LabelExplicit": "Nieprzyzwoite", "LabelExplicit": "Nieprzyzwoite",
"LabelExplicitChecked": "Nieprzyzwoite (sprawdzone)", "LabelExplicitChecked": "Nieprzyzwoite (sprawdzone)",
"LabelExplicitUnchecked": "Przyzwoite (niesprawdzone)", "LabelExplicitUnchecked": "Przyzwoite (niesprawdzone)",
@@ -360,6 +377,7 @@
"LabelFilterByUser": "Filtruj według danego użytkownika", "LabelFilterByUser": "Filtruj według danego użytkownika",
"LabelFindEpisodes": "Znajdź odcinki", "LabelFindEpisodes": "Znajdź odcinki",
"LabelFinished": "Zakończone", "LabelFinished": "Zakończone",
"LabelFinishedDate": "Ukończone {0}",
"LabelFolder": "Katalog", "LabelFolder": "Katalog",
"LabelFolders": "Foldery", "LabelFolders": "Foldery",
"LabelFontBold": "Pogrubiony", "LabelFontBold": "Pogrubiony",
@@ -404,6 +422,7 @@
"LabelLanguages": "Języki", "LabelLanguages": "Języki",
"LabelLastBookAdded": "Ostatnio dodana książka", "LabelLastBookAdded": "Ostatnio dodana książka",
"LabelLastBookUpdated": "Ostatnio modyfikowana książka", "LabelLastBookUpdated": "Ostatnio modyfikowana książka",
"LabelLastProgressDate": "Ostatni postęp: {0}",
"LabelLastSeen": "Ostatnio widziany", "LabelLastSeen": "Ostatnio widziany",
"LabelLastTime": "Ostatni czas", "LabelLastTime": "Ostatni czas",
"LabelLastUpdate": "Ostatnia aktualizacja", "LabelLastUpdate": "Ostatnia aktualizacja",
@@ -416,6 +435,9 @@
"LabelLibraryFilterSublistEmpty": "Brak {0}", "LabelLibraryFilterSublistEmpty": "Brak {0}",
"LabelLibraryItem": "Element biblioteki", "LabelLibraryItem": "Element biblioteki",
"LabelLibraryName": "Nazwa biblioteki", "LabelLibraryName": "Nazwa biblioteki",
"LabelLibrarySortByProgress": "Postęp: Ostatnio zaktualizowane",
"LabelLibrarySortByProgressFinished": "Postęp: Ukończone",
"LabelLibrarySortByProgressStarted": "Postęp: Rozpoczęte",
"LabelLimit": "Limit", "LabelLimit": "Limit",
"LabelLineSpacing": "Odstęp między wierszami", "LabelLineSpacing": "Odstęp między wierszami",
"LabelListenAgain": "Słuchaj ponownie", "LabelListenAgain": "Słuchaj ponownie",
@@ -424,9 +446,11 @@
"LabelLogLevelWarn": "Ostrzeżenie", "LabelLogLevelWarn": "Ostrzeżenie",
"LabelLookForNewEpisodesAfterDate": "Szukaj nowych odcinków po dacie", "LabelLookForNewEpisodesAfterDate": "Szukaj nowych odcinków po dacie",
"LabelLowestPriority": "Najniższy priorytet", "LabelLowestPriority": "Najniższy priorytet",
"LabelMatchConfidence": "Zaufanie",
"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.", "LabelMaxEpisodesToDownload": "Maksymalna liczba odcinków do pobrania. Użyj 0, aby wyłączyć ograniczenie.",
"LabelMaxEpisodesToDownloadPerCheck": "Maksymalna liczba nowych odcinków do pobrania na jedno sprawdzenie",
"LabelMaxEpisodesToKeep": "Maksymalna liczba odcinków do zachowania", "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.", "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",
@@ -452,7 +476,9 @@
"LabelNewestAuthors": "Najnowsi autorzy", "LabelNewestAuthors": "Najnowsi autorzy",
"LabelNewestEpisodes": "Najnowsze odcinki", "LabelNewestEpisodes": "Najnowsze odcinki",
"LabelNextBackupDate": "Data kolejnej kopii zapasowej", "LabelNextBackupDate": "Data kolejnej kopii zapasowej",
"LabelNextChapters": "Następny odcinek:",
"LabelNextScheduledRun": "Następne uruchomienie", "LabelNextScheduledRun": "Następne uruchomienie",
"LabelNoApiKeys": "Brak kluczy API",
"LabelNoCustomMetadataProviders": "Brak niestandardowych dostawców metadanych", "LabelNoCustomMetadataProviders": "Brak niestandardowych dostawców metadanych",
"LabelNoEpisodesSelected": "Nie wybrano żadnych odcinków", "LabelNoEpisodesSelected": "Nie wybrano żadnych odcinków",
"LabelNotFinished": "Nieukończone", "LabelNotFinished": "Nieukończone",
@@ -468,7 +494,10 @@
"LabelNotificationsMaxQueueSize": "Maksymalny rozmiar kolejki dla powiadomień", "LabelNotificationsMaxQueueSize": "Maksymalny rozmiar kolejki dla powiadomień",
"LabelNotificationsMaxQueueSizeHelp": "Zdarzenia są ograniczone do 1 na sekundę. Zdarzenia będą ignorowane jeśli kolejka ma maksymalny rozmiar. Zapobiega to spamowaniu powiadomieniami.", "LabelNotificationsMaxQueueSizeHelp": "Zdarzenia są ograniczone do 1 na sekundę. Zdarzenia będą ignorowane jeśli kolejka ma maksymalny rozmiar. Zapobiega to spamowaniu powiadomieniami.",
"LabelNumberOfBooks": "Liczba książek", "LabelNumberOfBooks": "Liczba książek",
"LabelNumberOfChapters": "Liczba rozdziałów:",
"LabelNumberOfEpisodes": "# Odcinków", "LabelNumberOfEpisodes": "# Odcinków",
"LabelOpenIDAdvancedPermsClaimDescription": "Nazwa deklaracji OpenID zawierającej zaawansowane uprawnienia do działań użytkownika w aplikacji, które będą miały zastosowanie do ról innych niż administracyjne (<b>jeśli skonfigurowano</b>). Jeśli deklaracja nie zostanie uwzględniona w odpowiedzi, dostęp do ABS zostanie zablokowany. Brak jednej opcji zostanie uznany za <code>fałsz</code>. Upewnij się, że deklaracja dostawcy tożsamości jest zgodna z oczekiwaną strukturą:",
"LabelOpenIDClaims": "Pozostaw poniższe opcje puste, aby wyłączyć zaawansowane przypisywanie grup i uprawnień. Automatycznie zostanie przypisana grupa „Użytkownik”.",
"LabelOpenRSSFeed": "Otwórz kanał RSS", "LabelOpenRSSFeed": "Otwórz kanał RSS",
"LabelOverwrite": "Nadpisz", "LabelOverwrite": "Nadpisz",
"LabelPaginationPageXOfY": "Strona {0} z {1}", "LabelPaginationPageXOfY": "Strona {0} z {1}",
@@ -486,6 +515,7 @@
"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",
"LabelPlaybackRateIncrementDecrement": "Zwiększenie/zmniejszenie szybkości odtwarzania",
"LabelPlayerChapterNumberMarker": "{0} z {1}", "LabelPlayerChapterNumberMarker": "{0} z {1}",
"LabelPlaylists": "Listy odtwarzania", "LabelPlaylists": "Listy odtwarzania",
"LabelPodcast": "Podcast", "LabelPodcast": "Podcast",
@@ -502,10 +532,15 @@
"LabelPubDate": "Data publikacji", "LabelPubDate": "Data publikacji",
"LabelPublishYear": "Rok publikacji", "LabelPublishYear": "Rok publikacji",
"LabelPublishedDate": "Opublikowano {0}", "LabelPublishedDate": "Opublikowano {0}",
"LabelPublishedDecade": "Dekada publikacji",
"LabelPublishedDecades": "Dekada publikacji",
"LabelPublisher": "Wydawca", "LabelPublisher": "Wydawca",
"LabelPublishers": "Wydawcy", "LabelPublishers": "Wydawcy",
"LabelRSSFeedCustomOwnerEmail": "Email właściciela",
"LabelRSSFeedCustomOwnerName": "Nazwa właściciela",
"LabelRSSFeedOpen": "Otwarty Kanał RSS", "LabelRSSFeedOpen": "Otwarty Kanał RSS",
"LabelRSSFeedPreventIndexing": "Zapobiegaj indeksowaniu", "LabelRSSFeedPreventIndexing": "Zapobiegaj indeksowaniu",
"LabelRSSFeedSlug": "Numer Kanału RSS",
"LabelRSSFeedURL": "URL kanały RSS", "LabelRSSFeedURL": "URL kanały RSS",
"LabelRandomly": "Losowo", "LabelRandomly": "Losowo",
"LabelReAddSeriesToContinueListening": "Ponownie Dodaj Serię do sekcji Kontunuuj Odtwarzanie", "LabelReAddSeriesToContinueListening": "Ponownie Dodaj Serię do sekcji Kontunuuj Odtwarzanie",
@@ -520,6 +555,7 @@
"LabelReleaseDate": "Data wydania", "LabelReleaseDate": "Data wydania",
"LabelRemoveAllMetadataAbs": "Usuń wszystkie pliki metadata.abs", "LabelRemoveAllMetadataAbs": "Usuń wszystkie pliki metadata.abs",
"LabelRemoveAllMetadataJson": "Usuń wszystkie pliki metadata.json", "LabelRemoveAllMetadataJson": "Usuń wszystkie pliki metadata.json",
"LabelRemoveAudibleBranding": "Usuń Audible intro i outro z rozdziałów",
"LabelRemoveCover": "Usuń okładkę", "LabelRemoveCover": "Usuń okładkę",
"LabelRemoveMetadataFile": "Usuń pliki metadanych z folderów biblioteki", "LabelRemoveMetadataFile": "Usuń pliki metadanych z folderów biblioteki",
"LabelRemoveMetadataFileHelp": "Usuń wszystkie pliki metadata.json i metadata.abs z {0} folderów.", "LabelRemoveMetadataFileHelp": "Usuń wszystkie pliki metadata.json i metadata.abs z {0} folderów.",
@@ -532,15 +568,19 @@
"LabelSelectAll": "Wybierz wszystko", "LabelSelectAll": "Wybierz wszystko",
"LabelSelectAllEpisodes": "Wybierz wszystkie odcinki", "LabelSelectAllEpisodes": "Wybierz wszystkie odcinki",
"LabelSelectEpisodesShowing": "Wybierz {0} wyświetlanych odcinków", "LabelSelectEpisodesShowing": "Wybierz {0} wyświetlanych odcinków",
"LabelSelectUser": "Wybierz użytkownika",
"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ść",
"LabelSerial": "Seria",
"LabelSeries": "Serie", "LabelSeries": "Serie",
"LabelSeriesName": "Nazwy serii", "LabelSeriesName": "Nazwy serii",
"LabelSeriesProgress": "Postęp w serii", "LabelSeriesProgress": "Postęp w serii",
"LabelServerLogLevel": "Poziom logowania servera",
"LabelServerYearReview": "Podsumowanie serwera w roku ({0})", "LabelServerYearReview": "Podsumowanie serwera w roku ({0})",
"LabelSetEbookAsPrimary": "Ustaw jako pierwszy", "LabelSetEbookAsPrimary": "Ustaw jako pierwszy",
"LabelSetEbookAsSupplementary": "Ustaw jako dodatkowy", "LabelSetEbookAsSupplementary": "Ustaw jako dodatkowy",
"LabelSettingsAllowIframe": "Zezwól na osadzanie w ramce iframe",
"LabelSettingsAudiobooksOnly": "Wyłącznie audiobooki", "LabelSettingsAudiobooksOnly": "Wyłącznie audiobooki",
"LabelSettingsAudiobooksOnlyHelp": "Włączenie tej funkcji spowoduje ignorowanie plików ebooków, chyba że znajdują się wewnątrz folderu audiobooka kiedy to będą pokazywane jako dodatkowe ebooki", "LabelSettingsAudiobooksOnlyHelp": "Włączenie tej funkcji spowoduje ignorowanie plików ebooków, chyba że znajdują się wewnątrz folderu audiobooka kiedy to będą pokazywane jako dodatkowe ebooki",
"LabelSettingsBookshelfViewHelp": "Widok półki z książkami", "LabelSettingsBookshelfViewHelp": "Widok półki z książkami",
@@ -559,10 +599,13 @@
"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",
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Procent ukończenia jest większy niż",
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Pozostały czas jest mniejszy niż (sekund)",
"LabelSettingsLibraryMarkAsFinishedWhen": "Oznacz element multimedialny jako ukończony, gdy", "LabelSettingsLibraryMarkAsFinishedWhen": "Oznacz element multimedialny jako ukończony, gdy",
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Pomiń poprzednie książki przy kontynuacji serii", "LabelSettingsOnlyShowLaterBooksInContinueSeries": "Pomiń poprzednie książki przy kontynuacji serii",
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Strona „Kontynuuj serię” wyświetla pierwszą nierozpoczętą książkę z serii, w której ukończono co najmniej jedną książkę i żadnej nie rozpoczęto. Włączając to ustawienie, będziesz kontynuować serię po przeczytaniu ostatniej książki, a nie od pierwszej nierozpoczętej książki z 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: \"Tytuł książki - Podtytuł\" podtytuł \"Podtytuł\"",
"LabelSettingsPreferMatchedMetadata": "Preferowanie dopasowanych metadanych", "LabelSettingsPreferMatchedMetadata": "Preferowanie dopasowanych metadanych",
"LabelSettingsPreferMatchedMetadataHelp": "Dopasowane dane będą miały pierwszeństwo nad szczegółami pozycji podczas używania Szybkiego dopasowania. Domyślnie Szybkie dopasowanie uzupełnia tylko brakujące szczegóły.", "LabelSettingsPreferMatchedMetadataHelp": "Dopasowane dane będą miały pierwszeństwo nad szczegółami pozycji podczas używania Szybkiego dopasowania. Domyślnie Szybkie dopasowanie uzupełnia tylko brakujące szczegóły.",
"LabelSettingsSkipMatchingBooksWithASIN": "Pomiń dopasowanie książek, które już mają ASIN", "LabelSettingsSkipMatchingBooksWithASIN": "Pomiń dopasowanie książek, które już mają ASIN",
@@ -577,6 +620,7 @@
"LabelSettingsStoreMetadataWithItemHelp": "Domyślnie metadane są przechowywane w folderze /metadata/items, włączenie tej opcji spowoduje, że okładka będzie przechowywana w folderze ksiązki. Tylko jedna okładka o nazwie pliku \"cover\" będzie przechowywana", "LabelSettingsStoreMetadataWithItemHelp": "Domyślnie metadane są przechowywane w folderze /metadata/items, włączenie tej opcji spowoduje, że okładka będzie przechowywana w folderze ksiązki. Tylko jedna okładka o nazwie pliku \"cover\" będzie przechowywana",
"LabelSettingsTimeFormat": "Format czasu", "LabelSettingsTimeFormat": "Format czasu",
"LabelShare": "Udostępnij", "LabelShare": "Udostępnij",
"LabelShareDownloadableHelp": "Użytkownicy mogą przy pomocy linka ściągnąć archiwum ZIP pozycji biblioteki",
"LabelShareOpen": "Otwórz udział", "LabelShareOpen": "Otwórz udział",
"LabelShareURL": "Link do udziału", "LabelShareURL": "Link do udziału",
"LabelShowAll": "Pokaż wszystko", "LabelShowAll": "Pokaż wszystko",
@@ -591,6 +635,7 @@
"LabelStartTime": "Czas rozpoczęcia", "LabelStartTime": "Czas rozpoczęcia",
"LabelStarted": "Rozpoczęty", "LabelStarted": "Rozpoczęty",
"LabelStartedAt": "Rozpoczęto", "LabelStartedAt": "Rozpoczęto",
"LabelStartedDate": "Rozpoczęto {0}",
"LabelStatsAudioTracks": "Ścieżki audio", "LabelStatsAudioTracks": "Ścieżki audio",
"LabelStatsAuthors": "Autorzy", "LabelStatsAuthors": "Autorzy",
"LabelStatsBestDay": "Najlepszy dzień", "LabelStatsBestDay": "Najlepszy dzień",
@@ -613,11 +658,14 @@
"LabelTagsAccessibleToUser": "Tagi dostępne dla użytkownika", "LabelTagsAccessibleToUser": "Tagi dostępne dla użytkownika",
"LabelTagsNotAccessibleToUser": "Znaczniki niedostępne dla użytkownika", "LabelTagsNotAccessibleToUser": "Znaczniki niedostępne dla użytkownika",
"LabelTasks": "Uruchomione zadania", "LabelTasks": "Uruchomione zadania",
"LabelTextEditorBulletedList": "Lista punktowana",
"LabelTextEditorLink": "Link", "LabelTextEditorLink": "Link",
"LabelTextEditorNumberedList": "Lista numerowana", "LabelTextEditorNumberedList": "Lista numerowana",
"LabelTextEditorUnlink": "Usuń link", "LabelTextEditorUnlink": "Usuń link",
"LabelTheme": "Kompozycja",
"LabelThemeDark": "Ciemny", "LabelThemeDark": "Ciemny",
"LabelThemeLight": "Jasny", "LabelThemeLight": "Jasny",
"LabelThemeSepia": "Sepia",
"LabelTimeDurationXHours": "{0} godzin", "LabelTimeDurationXHours": "{0} godzin",
"LabelTimeDurationXMinutes": "{0} minuty", "LabelTimeDurationXMinutes": "{0} minuty",
"LabelTimeDurationXSeconds": "{0} sekundy", "LabelTimeDurationXSeconds": "{0} sekundy",
@@ -640,7 +688,12 @@
"LabelTrackFromFilename": "Ścieżka z nazwy pliku", "LabelTrackFromFilename": "Ścieżka z nazwy pliku",
"LabelTrackFromMetadata": "Ścieżka z metadanych", "LabelTrackFromMetadata": "Ścieżka z metadanych",
"LabelTracks": "Ścieżki", "LabelTracks": "Ścieżki",
"LabelTracksMultiTrack": "Wielościeżkowy",
"LabelTracksNone": "Brak ścieżek",
"LabelTracksSingleTrack": "Pojedyncza ścieżka",
"LabelTrailer": "Zwiastun",
"LabelType": "Typ", "LabelType": "Typ",
"LabelUnabridged": "Pełna wersja",
"LabelUndo": "Wycofaj", "LabelUndo": "Wycofaj",
"LabelUnknown": "Nieznany", "LabelUnknown": "Nieznany",
"LabelUnknownPublishDate": "Nieznana data publikacji", "LabelUnknownPublishDate": "Nieznana data publikacji",
@@ -653,8 +706,10 @@
"LabelUploaderDragAndDropFilesOnly": "Przeciągnij i upuść 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",
"LabelUseAdvancedOptions": "Opcje zaawansowane",
"LabelUseChapterTrack": "Użyj ścieżki rozdziału", "LabelUseChapterTrack": "Użyj ścieżki rozdziału",
"LabelUseFullTrack": "Użycie ścieżki rozdziału", "LabelUseFullTrack": "Użycie ścieżki rozdziału",
"LabelUseZeroForUnlimited": "Użyj 0, aby wyłączyć ograniczenia",
"LabelUser": "Użytkownik", "LabelUser": "Użytkownik",
"LabelUsername": "Nazwa użytkownika", "LabelUsername": "Nazwa użytkownika",
"LabelValue": "Wartość", "LabelValue": "Wartość",
@@ -673,47 +728,93 @@
"LabelYourBookmarks": "Twoje zakładki", "LabelYourBookmarks": "Twoje zakładki",
"LabelYourPlaylists": "Twoje playlisty", "LabelYourPlaylists": "Twoje playlisty",
"LabelYourProgress": "Twój postęp", "LabelYourProgress": "Twój postęp",
"MessageAddToPlayerQueue": "Dodaj do kolejki odtwarzania",
"MessageAppriseDescription": "Aby użyć tej funkcji, konieczne jest posiadanie instancji <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> albo innego rozwiązania, które obsługuje schemat zapytań Apprise. <br />URL do interfejsu API powinno być całkowitą ścieżką, np., jeśli Twoje API do powiadomień jest dostępne pod adresem <code>http://192.168.1.1:8337</code> to wpisany tutaj URL powinien mieć postać: <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "Aby użyć tej funkcji, konieczne jest posiadanie instancji <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> albo innego rozwiązania, które obsługuje schemat zapytań Apprise. <br />URL do interfejsu API powinno być całkowitą ścieżką, np., jeśli Twoje API do powiadomień jest dostępne pod adresem <code>http://192.168.1.1:8337</code> to wpisany tutaj URL powinien mieć postać: <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Upewnij się, że używasz ASIN z poprawnego regionu Audible, nie Amazona.",
"MessageAuthenticationLegacyTokenWarning": "Starsze tokeny API zostaną w przyszłości usunięte. Zamiast nich należy używać <a href=\"/config/api-keys\">kluczy API</a>.",
"MessageAuthenticationOIDCChangesRestart": "Zrestartuj serwer aby zastosować zmiany w OIDC.",
"MessageAuthenticationSecurityMessage": "Uwierzytelnianie zostało ulepszone ze względów bezpieczeństwa. Wszyscy użytkownicy muszą się ponownie zalogować.",
"MessageBackupsDescription": "Kopie zapasowe obejmują użytkowników, postępy użytkowników, szczegóły pozycji biblioteki, ustawienia serwera i obrazy przechowywane w <code>/metadata/items</code> & <code>/metadata/authors</code>. Kopie zapasowe nie obejmują żadnych plików przechowywanych w folderach biblioteki.", "MessageBackupsDescription": "Kopie zapasowe obejmują użytkowników, postępy użytkowników, szczegóły pozycji biblioteki, ustawienia serwera i obrazy przechowywane w <code>/metadata/items</code> & <code>/metadata/authors</code>. Kopie zapasowe nie obejmują żadnych plików przechowywanych w folderach biblioteki.",
"MessageBackupsLocationEditNote": "Uwaga: Zmiana lokalizacji kopii zapasowej nie przenosi ani nie modyfikuje istniejących kopii zapasowych", "MessageBackupsLocationEditNote": "Uwaga: Zmiana lokalizacji kopii zapasowej nie przenosi ani nie modyfikuje istniejących kopii zapasowych",
"MessageBackupsLocationNoEditNote": "Uwaga: Lokalizacja kopii zapasowej jest ustawiona poprzez zmienną środowiskową i nie może być tutaj zmieniona.", "MessageBackupsLocationNoEditNote": "Uwaga: Lokalizacja kopii zapasowej jest ustawiona poprzez zmienną środowiskową i nie może być tutaj zmieniona.",
"MessageBackupsLocationPathEmpty": "Ścieżka do kopii zapasowej nie może być pusta", "MessageBackupsLocationPathEmpty": "Ścieżka do kopii zapasowej nie może być pusta",
"MessageBatchEditPopulateMapDetailsAllHelp": "Wypełnij włączone pola danymi ze wszystkich elementów. Pola z wieloma wartościami zostaną scalone.",
"MessageBatchQuickMatchDescription": "Quick Match będzie próbował dodać brakujące okładki i metadane dla wybranych elementów. Włącz poniższe opcje, aby umożliwić Quick Match nadpisanie istniejących okładek i/lub metadanych.", "MessageBatchQuickMatchDescription": "Quick Match będzie próbował dodać brakujące okładki i metadane dla wybranych elementów. Włącz poniższe opcje, aby umożliwić Quick Match nadpisanie istniejących okładek i/lub metadanych.",
"MessageBookshelfNoCollections": "Nie posiadasz jeszcze żadnych kolekcji", "MessageBookshelfNoCollections": "Nie posiadasz jeszcze żadnych kolekcji",
"MessageBookshelfNoCollectionsHelp": "Kolekcje są publiczne. Wszyscy użytkownicy mający dostęp do biblioteki mogą je zobaczyć.",
"MessageBookshelfNoRSSFeeds": "Nie posiadasz żadnych otwartych feedów RSS", "MessageBookshelfNoRSSFeeds": "Nie posiadasz żadnych otwartych feedów RSS",
"MessageBookshelfNoResultsForFilter": "Nie znaleziono żadnych pozycji przy aktualnym filtrowaniu \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Nie znaleziono żadnych pozycji przy aktualnym filtrowaniu \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Brak wyników zapytania", "MessageBookshelfNoResultsForQuery": "Brak wyników zapytania",
"MessageBookshelfNoSeries": "Nie masz jeszcze żadnych serii", "MessageBookshelfNoSeries": "Nie masz jeszcze żadnych serii",
"MessageBulkChapterPattern": "Ile rozdziałów chcesz dodać przy pomocy tego wzorca numeracji?",
"MessageChapterEndIsAfter": "Koniec rozdziału następuje po zakończeniu audiobooka", "MessageChapterEndIsAfter": "Koniec rozdziału następuje po zakończeniu audiobooka",
"MessageChapterErrorFirstNotZero": "Pierwszy rozdział musi rozpoczynać się na 0", "MessageChapterErrorFirstNotZero": "Pierwszy rozdział musi rozpoczynać się na 0",
"MessageChapterErrorStartGteDuration": "Nieprawidłowy czas rozpoczęcia, musi być krótszy niż długość audiobooka",
"MessageChapterErrorStartLtPrev": "Nieprawidłowy czas rozpoczęcia, musi być większy lub taki sam, jak czas rozpoczęcia poprzedniego rozdziału.",
"MessageChapterStartIsAfter": "Początek rozdziału następuje po zakończeniu audiobooka", "MessageChapterStartIsAfter": "Początek rozdziału następuje po zakończeniu audiobooka",
"MessageChaptersNotFound": "Nie znaleziono rozdziałów",
"MessageCheckingCron": "Sprawdzanie cron...", "MessageCheckingCron": "Sprawdzanie cron...",
"MessageConfirmCloseFeed": "Czy na pewno chcesz zamknąć ten kanał?",
"MessageConfirmDeleteApiKey": "Czy na pewno chcesz usunąć klucz API \"{0}\"?",
"MessageConfirmDeleteBackup": "Czy na pewno chcesz usunąć kopię zapasową dla {0}?", "MessageConfirmDeleteBackup": "Czy na pewno chcesz usunąć kopię zapasową dla {0}?",
"MessageConfirmDeleteDevice": "Czy na pewno chcesz usunąć czytnik e-booków \"{0}\"?",
"MessageConfirmDeleteFile": "Ta operacja usunie plik z twojego dysku. Jesteś pewien?", "MessageConfirmDeleteFile": "Ta operacja usunie plik z twojego dysku. Jesteś pewien?",
"MessageConfirmDeleteLibrary": "Czy na pewno chcesz trwale usunąć bibliotekę \"{0}\"?", "MessageConfirmDeleteLibrary": "Czy na pewno chcesz trwale usunąć bibliotekę \"{0}\"?",
"MessageConfirmDeleteLibraryItem": "Ta operacja usunie pozycję biblioteki z bazy danych i z dysku. Czy jesteś pewien?", "MessageConfirmDeleteLibraryItem": "Ta operacja usunie pozycję biblioteki z bazy danych i z dysku. Czy jesteś pewien?",
"MessageConfirmDeleteLibraryItems": "{0} element(ów) zostanie teraz usuniętych z bazy danych i systemu plików. Czy jesteś pewien?",
"MessageConfirmDeleteMetadataProvider": "Czy na pewno chcesz usunąć niestandardowego dostawcę metadanych: \"{0}\"?",
"MessageConfirmDeleteNotification": "Czy na pewno chcesz usunąć to powiadomienie?",
"MessageConfirmDeleteSession": "Czy na pewno chcesz usunąć tę sesję?", "MessageConfirmDeleteSession": "Czy na pewno chcesz usunąć tę sesję?",
"MessageConfirmEmbedMetadataInAudioFiles": "Czy na pewno chcesz osadzić metadane w {0} plikach audio?",
"MessageConfirmForceReScan": "Czy na pewno chcesz wymusić ponowne skanowanie?", "MessageConfirmForceReScan": "Czy na pewno chcesz wymusić ponowne skanowanie?",
"MessageConfirmMarkAllEpisodesFinished": "Czy na pewno chcesz oznaczyć wszystkie odcinki jako ukończone?", "MessageConfirmMarkAllEpisodesFinished": "Czy na pewno chcesz oznaczyć wszystkie odcinki jako ukończone?",
"MessageConfirmMarkAllEpisodesNotFinished": "Czy na pewno chcesz oznaczyć wszystkie odcinki jako nieukończone?", "MessageConfirmMarkAllEpisodesNotFinished": "Czy na pewno chcesz oznaczyć wszystkie odcinki jako nieukończone?",
"MessageConfirmMarkItemFinished": "Czy na pewno chcesz oznaczyć \"{0}\" jako zakończone?",
"MessageConfirmMarkItemNotFinished": "Czy na pewno chcesz oznaczyć \"{0}\" jako nieukończone?",
"MessageConfirmMarkSeriesFinished": "Czy na pewno chcesz oznaczyć wszystkie książki w tej serii jako ukończone?", "MessageConfirmMarkSeriesFinished": "Czy na pewno chcesz oznaczyć wszystkie książki w tej serii jako ukończone?",
"MessageConfirmMarkSeriesNotFinished": "Czy na pewno chcesz oznaczyć wszystkie książki w tej serii jako nieukończone?", "MessageConfirmMarkSeriesNotFinished": "Czy na pewno chcesz oznaczyć wszystkie książki w tej serii jako nieukończone?",
"MessageConfirmNotificationTestTrigger": "Czy wywołać to powiadomienie za pomocą danych testowych?",
"MessageConfirmPurgeCache": "Wyczyszczenie pamięci podręcznej spowoduje usunięcie całego katalogu <code>/metadata/cache</code>. <br /><br />Czy na pewno chcesz usunąć katalog pamięci podręcznej?",
"MessageConfirmPurgeItemsCache": "Wyczyszczenie pamięci podręcznej elementów spowoduje usunięcie całego katalogu <code>/metadata/cache/items</code>.<br />Czy jesteś pewien?",
"MessageConfirmQuickEmbed": "Ostrzeżenie! Szybkie osadzanie nie utworzy kopii zapasowej plików audio. Upewnij się, że masz kopię zapasową plików audio. <br><br>Czy chcesz kontynuować?",
"MessageConfirmQuickMatchEpisodes": "Szybkie dopasowywanie odcinków spowoduje nadpisanie szczegółów w przypadku znalezienia dopasowania. Zaktualizowane zostaną tylko niedopasowane odcinki. Jesteś pewien?",
"MessageConfirmReScanLibraryItems": "Czy na pewno chcesz ponownie zeskanować {0} pozycji?",
"MessageConfirmRemoveAllChapters": "Czy na pewno chcesz usunąć wszystkie rozdziały?",
"MessageConfirmRemoveAuthor": "Czy na pewno chcesz usunąć autora \"{0}\"?",
"MessageConfirmRemoveCollection": "Czy na pewno chcesz usunąć kolekcję \"{0}\"?", "MessageConfirmRemoveCollection": "Czy na pewno chcesz usunąć kolekcję \"{0}\"?",
"MessageConfirmRemoveEpisode": "Czy na pewno chcesz usunąć odcinek \"{0}\"?", "MessageConfirmRemoveEpisode": "Czy na pewno chcesz usunąć odcinek \"{0}\"?",
"MessageConfirmRemoveEpisodeNote": "Uwaga: Plik audio nie zostanie usunięty, chyba że przełączysz opcję „Twarde usunięcie pliku”",
"MessageConfirmRemoveEpisodes": "Czy na pewno chcesz usunąć {0} odcinki?", "MessageConfirmRemoveEpisodes": "Czy na pewno chcesz usunąć {0} odcinki?",
"MessageConfirmRemoveListeningSessions": "Czy na pewno chcesz usunąć {0} sesji słuchania?", "MessageConfirmRemoveListeningSessions": "Czy na pewno chcesz usunąć {0} sesji słuchania?",
"MessageConfirmRemoveMetadataFiles": "Czy na pewno chcesz usunąć wszystkie metadane.{0} plików w folderach elementów biblioteki?",
"MessageConfirmRemoveNarrator": "Czy na pewno chcesz usunąć lektora \"{0}\"?",
"MessageConfirmRemovePlaylist": "Czy jesteś pewien, że chcesz usunąć twoją playlistę \"{0}\"?", "MessageConfirmRemovePlaylist": "Czy jesteś pewien, że chcesz usunąć twoją playlistę \"{0}\"?",
"MessageConfirmRenameGenre": "Czy na pewno chcesz zmienić nazwę gatunku \"{0}\" na \"{1}\" dla wszystkich elementów?",
"MessageConfirmRenameGenreMergeNote": "Uwaga: Ten gatunek już istnieje, więc zostaną połączone.",
"MessageConfirmRenameGenreWarning": "Uwaga! Podobny gatunek z inną wielkością liter już istnieje: \"{0}\".",
"MessageConfirmRenameTag": "Czy na pewno chcesz zmienić nazwę tagu \"{0}\" na \"{1}\" dla wszystkich elementów?",
"MessageConfirmRenameTagMergeNote": "Uwaga: Ten tag już istnieje, więc zostaną scalone.",
"MessageConfirmRenameTagWarning": "Uwaga! Podobny tag z inną wielkością liter już istnieje: \"{0}\".",
"MessageConfirmResetProgress": "Czy na pewno chcesz zresetować swój postęp?",
"MessageConfirmSendEbookToDevice": "Czy na pewno chcesz wysłać {0} e-booka \"{1}\" na urządzenie \"{2}\"?",
"MessageConfirmUnlinkOpenId": "Czy na pewno chcesz odłączyć tego użytkownika od OpenID?",
"MessageDaysListenedInTheLastYear": "{0} dni słuchania w ciągu ostatniego roku",
"MessageDownloadingEpisode": "Pobieranie odcinka", "MessageDownloadingEpisode": "Pobieranie odcinka",
"MessageDragFilesIntoTrackOrder": "przeciągnij pliki aby ustawić właściwą kolejność utworów", "MessageDragFilesIntoTrackOrder": "przeciągnij pliki aby ustawić właściwą kolejność utworów",
"MessageEmbedFailed": "Niepowodzenie wstawiania!", "MessageEmbedFailed": "Niepowodzenie wstawiania!",
"MessageEmbedFinished": "Osadzanie zakończone!", "MessageEmbedFinished": "Osadzanie zakończone!",
"MessageEmbedQueue": "W kolejce do osadzenia metadanych ({0} w kolejce)",
"MessageEpisodesQueuedForDownload": "{0} odcinki w kolejce do pobrania", "MessageEpisodesQueuedForDownload": "{0} odcinki w kolejce do pobrania",
"MessageEreaderDevices": "Aby zagwarantować dostawę e-booków, konieczne może być dodanie powyższego adresu e-mail jako prawidłowego nadawcy dla każdego z urządzeń wymienionych poniżej.",
"MessageFeedURLWillBe": "URL kanału: {0}", "MessageFeedURLWillBe": "URL kanału: {0}",
"MessageFetching": "Pobieranie...", "MessageFetching": "Pobieranie...",
"MessageForceReScanDescription": "przeskanuje wszystkie pliki ponownie, jak przy świeżym skanowaniu. Tagi ID3 plików audio, pliki OPF i pliki tekstowe będą skanowane jak nowe.", "MessageForceReScanDescription": "przeskanuje wszystkie pliki ponownie, jak przy świeżym skanowaniu. Tagi ID3 plików audio, pliki OPF i pliki tekstowe będą skanowane jak nowe.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} słucha</strong> na {1}",
"MessageImportantNotice": "Ważna informacja!", "MessageImportantNotice": "Ważna informacja!",
"MessageInsertChapterBelow": "Wstaw rozdział poniżej", "MessageInsertChapterBelow": "Wstaw rozdział poniżej",
"MessageInvalidAsin": "Nieprawidłowy ASIN",
"MessageItemsSelected": "{0} zaznaczone elementy", "MessageItemsSelected": "{0} zaznaczone elementy",
"MessageItemsUpdated": "Zaktualizowano {0} elementów",
"MessageJoinUsOn": "Dołącz do nas na", "MessageJoinUsOn": "Dołącz do nas na",
"MessageLoading": "Ładowanie...", "MessageLoading": "Ładowanie...",
"MessageLoadingFolders": "Ładowanie folderów...", "MessageLoadingFolders": "Ładowanie folderów...",
@@ -734,6 +835,9 @@
"MessageNoCollections": "Brak kolekcji", "MessageNoCollections": "Brak kolekcji",
"MessageNoCoversFound": "Okładki nieznalezione", "MessageNoCoversFound": "Okładki nieznalezione",
"MessageNoDescription": "Brak opisu", "MessageNoDescription": "Brak opisu",
"MessageNoDevices": "Brak urządzeń",
"MessageNoDownloadsInProgress": "Brak aktualnie trwających pobrań",
"MessageNoDownloadsQueued": "Brak pobrań w kolejce",
"MessageNoEpisodeMatchesFound": "Nie znaleziono pasujących odcinków", "MessageNoEpisodeMatchesFound": "Nie znaleziono pasujących odcinków",
"MessageNoEpisodes": "Brak odcinków", "MessageNoEpisodes": "Brak odcinków",
"MessageNoFoldersAvailable": "Brak dostępnych folderów", "MessageNoFoldersAvailable": "Brak dostępnych folderów",
@@ -745,34 +849,65 @@
"MessageNoLogs": "Brak logów", "MessageNoLogs": "Brak logów",
"MessageNoMediaProgress": "Brak postępu", "MessageNoMediaProgress": "Brak postępu",
"MessageNoNotifications": "Brak powiadomień", "MessageNoNotifications": "Brak powiadomień",
"MessageNoPodcastFeed": "Nieprawidłowy podcast: Brak kanału",
"MessageNoPodcastsFound": "Nie znaleziono podcastów", "MessageNoPodcastsFound": "Nie znaleziono podcastów",
"MessageNoResults": "Brak wyników", "MessageNoResults": "Brak wyników",
"MessageNoSearchResultsFor": "Brak wyników wyszukiwania dla \"{0}\"", "MessageNoSearchResultsFor": "Brak wyników wyszukiwania dla \"{0}\"",
"MessageNoSeries": "Brak serii",
"MessageNoTags": "Brak tagów",
"MessageNoTasksRunning": "Brak uruchomionych zadań", "MessageNoTasksRunning": "Brak uruchomionych zadań",
"MessageNoUpdatesWereNecessary": "Brak aktualizacji", "MessageNoUpdatesWereNecessary": "Brak aktualizacji",
"MessageNoUserPlaylists": "Nie masz żadnych list odtwarzania", "MessageNoUserPlaylists": "Nie masz żadnych list odtwarzania",
"MessageNoUserPlaylistsHelp": "Listy odtwarzania są prywatne. Tylko użytkownik, który je utworzył, może je zobaczyć.",
"MessageNotYetImplemented": "Jeszcze nie zaimplementowane", "MessageNotYetImplemented": "Jeszcze nie zaimplementowane",
"MessageOpmlPreviewNote": "Uwaga: To jest podgląd sparsowanego pliku OPML. Tytuł podcastu wzięty został z wątku RSS.", "MessageOpmlPreviewNote": "Uwaga: To jest podgląd sparsowanego pliku OPML. Tytuł podcastu wzięty został z wątku RSS.",
"MessageOr": "lub", "MessageOr": "lub",
"MessagePauseChapter": "Zatrzymaj odtwarzanie rozdziały", "MessagePauseChapter": "Zatrzymaj odtwarzanie rozdziały",
"MessagePlayChapter": "Rozpocznij odtwarzanie od początku rozdziału", "MessagePlayChapter": "Rozpocznij odtwarzanie od początku rozdziału",
"MessagePlaylistCreateFromCollection": "Utwórz listę odtwarzania na podstawie kolekcji", "MessagePlaylistCreateFromCollection": "Utwórz listę odtwarzania na podstawie kolekcji",
"MessagePleaseWait": "Proszę czekać...",
"MessagePodcastHasNoRSSFeedForMatching": "Podcast nie ma adresu url kanału RSS, który mógłby zostać użyty do dopasowania", "MessagePodcastHasNoRSSFeedForMatching": "Podcast nie ma adresu url kanału RSS, który mógłby zostać użyty do dopasowania",
"MessagePodcastSearchField": "Wprowadź wyszukiwane hasło lub adres URL kanału RSS",
"MessageQuickEmbedInProgress": "Szybkie osadzanie w toku",
"MessageQuickEmbedQueue": "W kolejce do szybkiego osadzenia ({0} w kolejce)",
"MessageQuickMatchAllEpisodes": "Szybkie dopasowanie wszystkich odcinków",
"MessageQuickMatchDescription": "Wypełnij puste informacje i okładkę pierwszym wynikiem dopasowania z '{0}'. Nie nadpisuje szczegółów, chyba że włączone jest ustawienie serwera 'Preferuj dopasowane metadane'.", "MessageQuickMatchDescription": "Wypełnij puste informacje i okładkę pierwszym wynikiem dopasowania z '{0}'. Nie nadpisuje szczegółów, chyba że włączone jest ustawienie serwera 'Preferuj dopasowane metadane'.",
"MessageRemoveChapter": "Usuń rozdział", "MessageRemoveChapter": "Usuń rozdział",
"MessageRemoveEpisodes": "Usuń {0} odcinków", "MessageRemoveEpisodes": "Usuń {0} odcinków",
"MessageRemoveFromPlayerQueue": "Usuń z kolejki odtwarzacza", "MessageRemoveFromPlayerQueue": "Usuń z kolejki odtwarzacza",
"MessageRemoveUserWarning": "Czy na pewno chcesz trwale usunąć użytkownika \"{0}\"?", "MessageRemoveUserWarning": "Czy na pewno chcesz trwale usunąć użytkownika \"{0}\"?",
"MessageReportBugsAndContribute": "Zgłoś błędy, pomysły i pomóż rozwijać aplikację na", "MessageReportBugsAndContribute": "Zgłoś błędy, pomysły i pomóż rozwijać aplikację na",
"MessageResetChaptersConfirm": "Czy na pewno chcesz zresetować rozdziały i cofnąć wprowadzone zmiany?",
"MessageRestoreBackupConfirm": "Czy na pewno chcesz przywrócić kopię zapasową utworzoną w dniu", "MessageRestoreBackupConfirm": "Czy na pewno chcesz przywrócić kopię zapasową utworzoną w dniu",
"MessageRestoreBackupWarning": "Przywrócenie kopii zapasowej spowoduje nadpisanie bazy danych w folderze /config oraz okładek w folderze /metadata/items & /metadata/authors.<br /><br />Kopie zapasowe nie modyfikują żadnego pliku w folderach z plikami audio. Jeśli włączyłeś ustawienia serwera, aby przechowywać okładki i metadane w folderach biblioteki, to nie są one zapisywane w kopii zapasowej lub nadpisywane<br /><br />Wszyscy klienci korzystający z Twojego serwera będą automatycznie odświeżani.", "MessageRestoreBackupWarning": "Przywrócenie kopii zapasowej spowoduje nadpisanie bazy danych w folderze /config oraz okładek w folderze /metadata/items & /metadata/authors.<br /><br />Kopie zapasowe nie modyfikują żadnego pliku w folderach z plikami audio. Jeśli włączyłeś ustawienia serwera, aby przechowywać okładki i metadane w folderach biblioteki, to nie są one zapisywane w kopii zapasowej lub nadpisywane<br /><br />Wszyscy klienci korzystający z Twojego serwera będą automatycznie odświeżani.",
"MessageScheduleLibraryScanNote": "W przypadku większości użytkowników zaleca się pozostawienie tej funkcji wyłączonej i włączenie opcji monitorowania folderów. Monitor folderów automatycznie wykrywa zmiany w folderach biblioteki. Monitor folderów nie działa w przypadku wszystkich systemów plików (np. NFS), dlatego zamiast niego można używać zaplanowanych skanowań biblioteki.",
"MessageScheduleRunEveryWeekdayAtTime": "Uruchom w każdy {0} o {1}",
"MessageSearchResultsFor": "Wyniki wyszukiwania dla", "MessageSearchResultsFor": "Wyniki wyszukiwania dla",
"MessageSelected": "{0} wybranych", "MessageSelected": "{0} wybranych",
"MessageServerCouldNotBeReached": "Nie udało się uzyskać połączenia z serwerem", "MessageServerCouldNotBeReached": "Nie udało się uzyskać połączenia z serwerem",
"MessageSetChaptersFromTracksDescription": "Ustaw rozdziały, używając każdego pliku audio jako rozdziału, a tytuł rozdziału jako nazwy pliku audio.",
"MessageShareExpirationWillBe": "Czas udostępniania <strong>{0}</strong>", "MessageShareExpirationWillBe": "Czas udostępniania <strong>{0}</strong>",
"MessageShareExpiresIn": "Wygaśnie za {0}", "MessageShareExpiresIn": "Wygaśnie za {0}",
"MessageShareURLWillBe": "Udostępnione pod linkiem <strong>{0}</strong>", "MessageShareURLWillBe": "Udostępnione pod linkiem <strong>{0}</strong>",
"MessageStartPlaybackAtTime": "Rozpoczęcie odtwarzania \"{0}\" od {1}?", "MessageStartPlaybackAtTime": "Rozpoczęcie odtwarzania \"{0}\" od {1}?",
"MessageTaskAudioFileNotWritable": "Plik audio \"{0}\" jest niemodyfikowalny",
"MessageTaskCanceledByUser": "Zadanie anulowane przez użytkownika",
"MessageTaskDownloadingEpisodeDescription": "Ściąganie odcinka \"{0}\"",
"MessageTaskEmbeddingMetadata": "Wbudowywanie medatanych",
"MessageTaskEmbeddingMetadataDescription": "Wbudowywanie metadanych do audiobooka \"{0}\"",
"MessageTaskEncodingM4b": "Kodowanie M4B",
"MessageTaskEncodingM4bDescription": "Konwersja audiobooka \"{0}\" do pojedynczego pliku m4b",
"MessageTaskFailed": "Niepowodzenie",
"MessageTaskFailedToBackupAudioFile": "Nieudana próba wykonania kopii zapasowego pliku audio \"{0}\"",
"MessageTaskFailedToCreateCacheDirectory": "Nie udało się utworzyć katalogu cache",
"MessageTaskFailedToEmbedMetadataInFile": "Nie udało się wbudować metadanych do pliku \"{0}\"",
"MessageTaskFailedToWriteMetadataFile": "Niepowodzenie zapisania pliku metadanych",
"MessageTaskNoFilesToScan": "Brak plików do skanowania",
"MessageTaskScanItemsAdded": "Dodano {0}",
"MessageTaskScanItemsMissing": "Brakuje {0}",
"MessageTaskScanItemsUpdated": "Zaktualizowano {0}",
"MessageTaskScanNoChangesNeeded": "Brak zmian",
"MessageTaskTargetDirectoryNotWritable": "Brak prawa zapisu do folderu docelowego",
"MessageThinking": "Myślę...", "MessageThinking": "Myślę...",
"MessageUploaderItemFailed": "Nie udało się przesłać", "MessageUploaderItemFailed": "Nie udało się przesłać",
"MessageUploaderItemSuccess": "Przesłanie powiodło się!", "MessageUploaderItemSuccess": "Przesłanie powiodło się!",
@@ -830,6 +965,21 @@
"ToastBookmarkRemoveSuccess": "Zakładka została usunięta", "ToastBookmarkRemoveSuccess": "Zakładka została usunięta",
"ToastCollectionRemoveSuccess": "Kolekcja usunięta", "ToastCollectionRemoveSuccess": "Kolekcja usunięta",
"ToastCollectionUpdateSuccess": "Zaktualizowano kolekcję", "ToastCollectionUpdateSuccess": "Zaktualizowano kolekcję",
"ToastCoverSearchFailed": "Nieudane wyszukiwanie okładki",
"ToastCoverUpdateFailed": "Nieudana aktualizacja okładki",
"ToastDateTimeInvalidOrIncomplete": "Niepoprawna data i czas",
"ToastDeleteFileFailed": "Usunięcie pliku nie powiodło się",
"ToastDeleteFileSuccess": "Plik został usunięty",
"ToastDeviceAddFailed": "Nieudana próba dodania urządzenia",
"ToastDeviceNameAlreadyExists": "Czytnik z taką nazwą już istnieje",
"ToastDeviceTestEmailFailed": "NIeudana próba wysłania testowego maila",
"ToastDeviceTestEmailSuccess": "Testowy email został wysłany",
"ToastEmailSettingsUpdateSuccess": "Ustawienia email zaktualizowane",
"ToastEpisodeDownloadQueueClearSuccess": "Wyczyszczono kolejkę epizodów do ściągnięcia",
"ToastEpisodeUpdateSuccess": "Zaktualizowano {0} odcinków",
"ToastInvalidImageUrl": "Nieprawidłowy URL obrazu",
"ToastInvalidUrl": "Nieprawidłowy URL",
"ToastInvalidUrls": "Jeden lub więcej URL-i są nieprawidłowe",
"ToastItemCoverUpdateSuccess": "Zaktualizowano okładkę", "ToastItemCoverUpdateSuccess": "Zaktualizowano okładkę",
"ToastItemDetailsUpdateSuccess": "Zaktualizowano szczegóły", "ToastItemDetailsUpdateSuccess": "Zaktualizowano szczegóły",
"ToastItemMarkedAsFinishedFailed": "Nie udało się oznaczyć jako ukończone", "ToastItemMarkedAsFinishedFailed": "Nie udało się oznaczyć jako ukończone",
@@ -843,12 +993,28 @@
"ToastLibraryScanFailedToStart": "Nie udało się rozpocząć skanowania", "ToastLibraryScanFailedToStart": "Nie udało się rozpocząć skanowania",
"ToastLibraryScanStarted": "Rozpoczęto skanowanie biblioteki", "ToastLibraryScanStarted": "Rozpoczęto skanowanie biblioteki",
"ToastLibraryUpdateSuccess": "Zaktualizowano \"{0}\" pozycji", "ToastLibraryUpdateSuccess": "Zaktualizowano \"{0}\" pozycji",
"ToastMatchAllAuthorsFailed": "Nie udało się dopasować wszystkich autorów",
"ToastMustHaveAtLeastOnePath": "Musi mieć przynajmniej jedną ścieżkę",
"ToastNameEmailRequired": "Nazwa i email są wymagane",
"ToastNameRequired": "Imię jest wymagane",
"ToastNewApiKeyUserError": "Trzeba wybrać użytkownika",
"ToastNewEpisodesFound": "Znaleziono {0} nowych odcinków",
"ToastNewUserCreatedFailed": "Nie udało się utworzyć konta: \"{0}\"",
"ToastNewUserCreatedSuccess": "Utworzono nowe konto",
"ToastNewUserLibraryError": "Trzeba wybrać co najmniej jedną bibliotekę",
"ToastNewUserPasswordError": "Hasło jest wymagane, jedynie użytkownik \"root\" może posiadać puste hasło",
"ToastNewUserTagError": "Trzeba wybrać chociaż jeden tag",
"ToastNewUserUsernameError": "Wprowadź nazwę użytkownika",
"ToastNoNewEpisodesFound": "Nie znaleziono nowych odcinków",
"ToastNoRSSFeed": "Podcast nie posiada RSS Feed",
"ToastNotificationFailedMaximum": "Maks. ilość nieudanych prób musi być >= 0",
"ToastPlaylistCreateFailed": "Nie udało się utworzyć playlisty", "ToastPlaylistCreateFailed": "Nie udało się utworzyć playlisty",
"ToastPlaylistCreateSuccess": "Playlista utworzona", "ToastPlaylistCreateSuccess": "Playlista utworzona",
"ToastPlaylistRemoveSuccess": "Playlista usunięta", "ToastPlaylistRemoveSuccess": "Playlista usunięta",
"ToastPlaylistUpdateSuccess": "Playlista zaktualizowana", "ToastPlaylistUpdateSuccess": "Playlista zaktualizowana",
"ToastPodcastCreateFailed": "Nie udało się utworzyć podcastu", "ToastPodcastCreateFailed": "Nie udało się utworzyć podcastu",
"ToastPodcastCreateSuccess": "Podcast został pomyślnie utworzony", "ToastPodcastCreateSuccess": "Podcast został pomyślnie utworzony",
"ToastPodcastEpisodeUpdated": "Zaktualizowano odcinki",
"ToastRSSFeedCloseFailed": "Zamknięcie kanału RSS nie powiodło się", "ToastRSSFeedCloseFailed": "Zamknięcie kanału RSS nie powiodło się",
"ToastRSSFeedCloseSuccess": "Zamknięcie kanału RSS powiodło się", "ToastRSSFeedCloseSuccess": "Zamknięcie kanału RSS powiodło się",
"ToastRemoveItemFromCollectionFailed": "Nie udało się usunąć elementu z kolekcji", "ToastRemoveItemFromCollectionFailed": "Nie udało się usunąć elementu z kolekcji",
+1
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Adicionar", "ButtonAdd": "Adicionar",
"ButtonAddApiKey": "Adicionar Chave API",
"ButtonAddChapters": "Adicionar Capítulos", "ButtonAddChapters": "Adicionar Capítulos",
"ButtonAddDevice": "Adicionar Dispositivo", "ButtonAddDevice": "Adicionar Dispositivo",
"ButtonAddLibrary": "Adicionar Biblioteca", "ButtonAddLibrary": "Adicionar Biblioteca",
+200 -1
View File
@@ -1 +1,200 @@
{} {
"ButtonAdd": "Adaugă",
"ButtonAddApiKey": "Adaugă cheia API",
"ButtonAddChapters": "Adaugă Capitole",
"ButtonAddDevice": "Adaugă Dispozitiv",
"ButtonAddLibrary": "Adaugă Librărie",
"ButtonAddUser": "Adaugă Utilizator",
"ButtonAuthors": "Autori",
"ButtonBack": "Înapoi",
"ButtonCancel": "Anulează",
"ButtonClearFilter": "Șterge filtrul",
"ButtonClose": "Închide",
"ButtonCloseFeed": "Închide sursa",
"ButtonCloseSession": "Închide Sesiunea Curentă",
"ButtonCollections": "Colecții",
"ButtonCreate": "Creează",
"ButtonDelete": "Șterge",
"ButtonHide": "Ascunde",
"ButtonHome": "Acasă",
"ButtonIssues": "Erori",
"ButtonLatest": "Noutăți",
"ButtonLibrary": "Bibliotecă",
"ButtonOk": "OK",
"ButtonOpenFeed": "Vezi noutățile",
"ButtonPause": "Pauză",
"ButtonPlay": "Redă",
"ButtonPlaylists": "Liste",
"ButtonRead": "Citește",
"ButtonReadLess": "Mai puțin",
"ButtonReadMore": "Afișează mai mult",
"ButtonRemove": "Elimină",
"ButtonSave": "Salvează",
"ButtonSearch": "Caută",
"ButtonSeries": "Serii",
"ButtonSubmit": "Trimite",
"ButtonYes": "Da",
"HeaderAccount": "Cont",
"HeaderAdvanced": "Avansat",
"HeaderAudioTracks": "Înregistrări audio",
"HeaderChapters": "Capitole",
"HeaderCollection": "Colecție",
"HeaderCollectionItems": "Conținutul colecției",
"HeaderDetails": "Detalii",
"HeaderEbookFiles": "Ebook-uri",
"HeaderEpisodes": "Episoade",
"HeaderEreaderSettings": "Setări eReader",
"HeaderLatestEpisodes": "Episoade recente",
"HeaderLibraries": "Biblioteci",
"HeaderOpenRSSFeed": "Deschide flux RSS",
"HeaderPlaylist": "Listă de redare",
"HeaderPlaylistItems": "Conținut listă",
"HeaderRSSFeedGeneral": "Date RSS",
"HeaderRSSFeedIsOpen": "RSS activ",
"HeaderSettings": "Setări",
"HeaderSleepTimer": "Timer de somn",
"HeaderStatsMinutesListeningChart": "Minute ascultate (ultimele 7 zile)",
"HeaderStatsRecentSessions": "Sesiuni recente",
"HeaderTableOfContents": "Cuprins",
"HeaderYourStats": "Progresul tău",
"LabelAddToPlaylist": "Adaugă în listă",
"LabelAddedAt": "Adăugat la",
"LabelAddedDate": "Adăugat {0}",
"LabelAll": "Toate",
"LabelAuthor": "Autor",
"LabelAuthorFirstLast": "Autor (Prenume Nume)",
"LabelAuthorLastFirst": "Autor (Nume, Prenume)",
"LabelAuthors": "Autori",
"LabelAutoDownloadEpisodes": "Descarcă automat episoadele",
"LabelBooks": "Cărți",
"LabelChapters": "Capitole",
"LabelClosePlayer": "Închide playerul",
"LabelCollapseSeries": "Restrânge seriile",
"LabelComplete": "Finalizat",
"LabelContinueListening": "Ascultă în continuare",
"LabelContinueReading": "Continuă lectura",
"LabelContinueSeries": "Continuă seria",
"LabelDescription": "Descriere",
"LabelDiscover": "Descoperă",
"LabelDownload": "Descarcă",
"LabelDuration": "Durată",
"LabelEbook": "Carte electronică",
"LabelEbooks": "Cărți electronice",
"LabelEnable": "Activează",
"LabelEnd": "Sfârșit",
"LabelEndOfChapter": "Sfârșitul capitolului",
"LabelEpisode": "Episod",
"LabelExplicit": "Explicit",
"LabelFeedURL": "URL flux",
"LabelFile": "Fișier",
"LabelFileBirthtime": "Data creării fișierului",
"LabelFileModified": "Fișier modificat",
"LabelFilename": "Nume fișier",
"LabelFinished": "Finalizat",
"LabelFolder": "Dosar",
"LabelFontBoldness": "Grosimea fontului",
"LabelFontScale": "Mărimea fontului",
"LabelGenre": "Gen",
"LabelGenres": "Genuri",
"LabelHasEbook": "Are carte electronică",
"LabelHasSupplementaryEbook": "Are carte electronică suplimentară",
"LabelHost": "Gazdă",
"LabelInProgress": "În desfășurare",
"LabelIncomplete": "Incomplet",
"LabelLanguage": "Limbă",
"LabelLayout": "Aspect",
"LabelLayoutSinglePage": "Pagină unică",
"LabelLineSpacing": "Spațiere între rânduri",
"LabelListenAgain": "Ascultă din nou",
"LabelMediaType": "Tip media",
"LabelMissing": "Lipsă",
"LabelMore": "Mai multe",
"LabelMoreInfo": "Mai multe informații",
"LabelName": "Nume",
"LabelNarrator": "Narator",
"LabelNarrators": "Naratori",
"LabelNewestAuthors": "Autori noi",
"LabelNewestEpisodes": "Episoade noi",
"LabelNotFinished": "Nefinalizat",
"LabelNotStarted": "Neînceput",
"LabelNumberOfEpisodes": "# de Episoade",
"LabelPassword": "Parolă",
"LabelPath": "Cale",
"LabelPodcast": "Podcast",
"LabelPodcasts": "Podcasturi",
"LabelPreventIndexing": "Împiedică indexarea fluxului în directoarele iTunes și Google Podcasts",
"LabelProgress": "Progres",
"LabelPubDate": "Data publicării",
"LabelPublishYear": "Anul publicării",
"LabelPublishedDate": "Publicat la {0}",
"LabelRSSFeedCustomOwnerEmail": "Email personalizat al proprietarului",
"LabelRSSFeedCustomOwnerName": "Nume personalizat al proprietarului",
"LabelRSSFeedOpen": "Flux RSS deschis",
"LabelRSSFeedPreventIndexing": "Previne indexarea",
"LabelRSSFeedSlug": "Identificator flux RSS",
"LabelRandomly": "Aleatoriu",
"LabelRead": "Citește",
"LabelReadAgain": "Citește din nou",
"LabelRecentSeries": "Serii recente",
"LabelRecentlyAdded": "Adăugate recent",
"LabelSeason": "Sezon",
"LabelSeries": "Serii",
"LabelSetEbookAsPrimary": "Setează ca principală",
"LabelSetEbookAsSupplementary": "Setează ca suplimentară",
"LabelShowAll": "Afișează tot",
"LabelSize": "Dimensiune",
"LabelSleepTimer": "Timer de somn",
"LabelStart": "Pornește",
"LabelStatsBestDay": "Ziua cea mai bună",
"LabelStatsDailyAverage": "Medie zilnică",
"LabelStatsDays": "Zile",
"LabelStatsDaysListened": "Zile ascultate",
"LabelStatsInARow": "la rând",
"LabelStatsItemsFinished": "Finalizate",
"LabelStatsMinutes": "minute",
"LabelStatsMinutesListening": "Minute ascultate",
"LabelStatsWeekListening": "Ascultare săptămânală",
"LabelTag": "Etichetă",
"LabelTags": "Etichete",
"LabelTheme": "Temă",
"LabelThemeDark": "Întunecat",
"LabelThemeLight": "Deschis",
"LabelTimeRemaining": "{0} rămase",
"LabelTitle": "Titlu",
"LabelTracks": "Fișiere audio",
"LabelType": "Tip",
"LabelUnknown": "Necunoscut",
"LabelUser": "Utilizator",
"LabelUsername": "Nume utilizator",
"LabelYearReviewHide": "Ascunde retrospectiva anului",
"LabelYearReviewShow": "Vezi retrospectiva anului",
"LabelYourBookmarks": "Semnele tale de carte",
"LabelYourProgress": "Progresul tău",
"MessageDownloadingEpisode": "Se descarcă episodul",
"MessageEpisodesQueuedForDownload": "{0} episod(e) în așteptare pentru descărcare",
"MessageFeedURLWillBe": "Adresa fluxului va fi {0}",
"MessageFetching": "Se preiau date…",
"MessageLoading": "Se încarcă…",
"MessageMarkAsFinished": "Marchează ca finalizat",
"MessageNoBookmarks": "Fără semne de carte",
"MessageNoChapters": "Fără capitole",
"MessageNoCollections": "Fără colecții",
"MessageNoItems": "Niciun element",
"MessageNoItemsFound": "Nu s-au găsit elemente",
"MessageNoListeningSessions": "Nicio sesiune de ascultare",
"MessageNoPodcastsFound": "Nu s-au găsit podcasturi",
"MessageNoUpdatesWereNecessary": "Nu au fost necesare actualizări",
"MessageNoUserPlaylists": "Nu ai nicio listă de redare",
"MessagePodcastSearchField": "Introdu termenul de căutare sau URL-ul unui flux RSS",
"MessageReportBugsAndContribute": "Raportează erori, cere funcții noi și contribuie pe",
"NoteRSSFeedPodcastAppsHttps": "Atenționare: Majoritatea aplicațiilor de podcast cer ca URL-ul fluxului RSS să folosească HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Atenționare: unul sau mai multe episoade nu au data publicării (Pub Date). Unele aplicații de podcast o cer.",
"ToastBookmarkCreateFailed": "Nu s-a putut crea semnul de carte",
"ToastItemMarkedAsFinishedFailed": "Nu s-a putut marca drept finalizat",
"ToastItemMarkedAsNotFinishedFailed": "Nu s-a putut marca drept nefinalizat",
"ToastPlaylistCreateFailed": "Nu s-a putut crea lista de redare",
"ToastPodcastCreateFailed": "Nu s-a putut crea podcastul",
"ToastPodcastCreateSuccess": "Podcast creat cu succes",
"ToastRSSFeedCloseFailed": "Nu s-a putut închide fluxul RSS",
"ToastRSSFeedCloseSuccess": "Flux RSS închis"
}
+115 -80
View File
@@ -17,12 +17,12 @@
"ButtonCancel": "Отмена", "ButtonCancel": "Отмена",
"ButtonCancelEncode": "Отменить кодирование", "ButtonCancelEncode": "Отменить кодирование",
"ButtonChangeRootPassword": "Поменять мастер пароль", "ButtonChangeRootPassword": "Поменять мастер пароль",
"ButtonCheckAndDownloadNewEpisodes": "Проверка и Загрузка новых эпизодов", "ButtonCheckAndDownloadNewEpisodes": "Скачать новые выпуски",
"ButtonChooseAFolder": "Выбор папки", "ButtonChooseAFolder": "Выбор папки",
"ButtonChooseFiles": "Выбор файлов", "ButtonChooseFiles": "Выбор файлов",
"ButtonClearFilter": "Очистить фильтр", "ButtonClearFilter": "Очистить фильтр",
"ButtonClose": "Закрыть", "ButtonClose": "Закрыть",
"ButtonCloseFeed": "Закрыть канал", "ButtonCloseFeed": "Закрыть ленту",
"ButtonCloseSession": "Закрыть открытый сеанс", "ButtonCloseSession": "Закрыть открытый сеанс",
"ButtonCollections": "Коллекции", "ButtonCollections": "Коллекции",
"ButtonConfigureScanner": "Конфигурация сканера", "ButtonConfigureScanner": "Конфигурация сканера",
@@ -56,7 +56,7 @@
"ButtonNextChapter": "Следующая глава", "ButtonNextChapter": "Следующая глава",
"ButtonNextItemInQueue": "Следующий элемент в очереди", "ButtonNextItemInQueue": "Следующий элемент в очереди",
"ButtonOk": "Ок", "ButtonOk": "Ок",
"ButtonOpenFeed": "Открыть канал", "ButtonOpenFeed": "Открыть ленту",
"ButtonOpenManager": "Открыть менеджер", "ButtonOpenManager": "Открыть менеджер",
"ButtonPause": "Пауза", "ButtonPause": "Пауза",
"ButtonPlay": "Слушать", "ButtonPlay": "Слушать",
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Инструменты файлов аудиокниг", "HeaderAudiobookTools": "Инструменты файлов аудиокниг",
"HeaderAuthentication": "Аутентификация", "HeaderAuthentication": "Аутентификация",
"HeaderBackups": "Бэкапы", "HeaderBackups": "Бэкапы",
"HeaderBulkChapterModal": "Добавление нескольких глав",
"HeaderChangePassword": "Изменить пароль", "HeaderChangePassword": "Изменить пароль",
"HeaderChapters": "Главы", "HeaderChapters": "Главы",
"HeaderChooseAFolder": "Выберите папку", "HeaderChooseAFolder": "Выберите папку",
@@ -141,7 +142,7 @@
"HeaderEbookFiles": "Файлы e-книг", "HeaderEbookFiles": "Файлы e-книг",
"HeaderEmail": "E-mail", "HeaderEmail": "E-mail",
"HeaderEmailSettings": "Настройки Email", "HeaderEmailSettings": "Настройки Email",
"HeaderEpisodes": "Эпизоды", "HeaderEpisodes": "Выпуски",
"HeaderEreaderDevices": "Устройства E-книга", "HeaderEreaderDevices": "Устройства E-книга",
"HeaderEreaderSettings": "Настройки E-ридера", "HeaderEreaderSettings": "Настройки E-ридера",
"HeaderFiles": "Файлы", "HeaderFiles": "Файлы",
@@ -150,7 +151,7 @@
"HeaderItemFiles": "Файлы элемента", "HeaderItemFiles": "Файлы элемента",
"HeaderItemMetadataUtils": "Утилиты", "HeaderItemMetadataUtils": "Утилиты",
"HeaderLastListeningSession": "Последний сеанс прослушивания", "HeaderLastListeningSession": "Последний сеанс прослушивания",
"HeaderLatestEpisodes": "Последние эпизоды", "HeaderLatestEpisodes": "Последние выпуски",
"HeaderLibraries": "Библиотеки", "HeaderLibraries": "Библиотеки",
"HeaderLibraryFiles": "Файлы библиотеки", "HeaderLibraryFiles": "Файлы библиотеки",
"HeaderLibraryStats": "Статистика библиотеки", "HeaderLibraryStats": "Статистика библиотеки",
@@ -172,7 +173,7 @@
"HeaderNotifications": "Уведомления", "HeaderNotifications": "Уведомления",
"HeaderOpenIDConnectAuthentication": "Аутентификация OpenID Connect", "HeaderOpenIDConnectAuthentication": "Аутентификация OpenID Connect",
"HeaderOpenListeningSessions": "Открытые сеансы прослушивания", "HeaderOpenListeningSessions": "Открытые сеансы прослушивания",
"HeaderOpenRSSFeed": "Открыть RSS-канал", "HeaderOpenRSSFeed": "Открыть RSS-ленту",
"HeaderOtherFiles": "Другие файлы", "HeaderOtherFiles": "Другие файлы",
"HeaderPasswordAuthentication": "Аутентификация по паролю", "HeaderPasswordAuthentication": "Аутентификация по паролю",
"HeaderPermissions": "Разрешения", "HeaderPermissions": "Разрешения",
@@ -184,13 +185,13 @@
"HeaderPresets": "Пресеты", "HeaderPresets": "Пресеты",
"HeaderPreviewCover": "Предпросмотр обложки", "HeaderPreviewCover": "Предпросмотр обложки",
"HeaderRSSFeedGeneral": "Сведения о RSS", "HeaderRSSFeedGeneral": "Сведения о RSS",
"HeaderRSSFeedIsOpen": "RSS-канал открыт", "HeaderRSSFeedIsOpen": "RSS-лента открыта",
"HeaderRSSFeeds": "RSS-каналы", "HeaderRSSFeeds": "RSS-ленты",
"HeaderRemoveEpisode": "Удалить эпизод", "HeaderRemoveEpisode": "Удалить выпуск",
"HeaderRemoveEpisodes": "Удалить {0} эпизодов", "HeaderRemoveEpisodes": "Удалить {0} выпусков",
"HeaderSavedMediaProgress": "Прогресс медиа сохранен", "HeaderSavedMediaProgress": "Прогресс медиа сохранен",
"HeaderSchedule": "Планировщик", "HeaderSchedule": "Планировщик",
"HeaderScheduleEpisodeDownloads": "Запланируйте автоматическую загрузку эпизодов", "HeaderScheduleEpisodeDownloads": "Запланировать автоматическое скачивание выпусков",
"HeaderScheduleLibraryScans": "Планировщик автоматического сканирования библиотеки", "HeaderScheduleLibraryScans": "Планировщик автоматического сканирования библиотеки",
"HeaderSession": "Сеансы", "HeaderSession": "Сеансы",
"HeaderSetBackupSchedule": "Установить планировщик бэкапов", "HeaderSetBackupSchedule": "Установить планировщик бэкапов",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Экспериментальные функции", "HeaderSettingsExperimental": "Экспериментальные функции",
"HeaderSettingsGeneral": "Основные", "HeaderSettingsGeneral": "Основные",
"HeaderSettingsScanner": "Сканер", "HeaderSettingsScanner": "Сканер",
"HeaderSettingsSecurity": "Безопасность",
"HeaderSettingsWebClient": "Веб-клиент", "HeaderSettingsWebClient": "Веб-клиент",
"HeaderSleepTimer": "Таймер сна", "HeaderSleepTimer": "Таймер сна",
"HeaderStatsLargestItems": "Самые большые элементы", "HeaderStatsLargestItems": "Самые большые элементы",
@@ -235,7 +237,7 @@
"LabelAddedDate": "Добавлено {0}", "LabelAddedDate": "Добавлено {0}",
"LabelAdminUsersOnly": "Только для пользователей с правами администратора", "LabelAdminUsersOnly": "Только для пользователей с правами администратора",
"LabelAll": "Все", "LabelAll": "Все",
"LabelAllEpisodesDownloaded": "Все эпизоды загружены", "LabelAllEpisodesDownloaded": "Все выпуски скачаны",
"LabelAllUsers": "Все пользователи", "LabelAllUsers": "Все пользователи",
"LabelAllUsersExcludingGuests": "Все пользователи, кроме гостей", "LabelAllUsersExcludingGuests": "Все пользователи, кроме гостей",
"LabelAllUsersIncludingGuests": "Все пользователи, включая гостей", "LabelAllUsersIncludingGuests": "Все пользователи, включая гостей",
@@ -253,7 +255,7 @@
"LabelAuthorFirstLast": "Автор (Имя Фамилия)", "LabelAuthorFirstLast": "Автор (Имя Фамилия)",
"LabelAuthorLastFirst": "Автор (Фамилия, Имя)", "LabelAuthorLastFirst": "Автор (Фамилия, Имя)",
"LabelAuthors": "Авторы", "LabelAuthors": "Авторы",
"LabelAutoDownloadEpisodes": "Скачивать эпизоды автоматически", "LabelAutoDownloadEpisodes": "Скачивать выпуски автоматически",
"LabelAutoFetchMetadata": "Автоматическое извлечение метаданных", "LabelAutoFetchMetadata": "Автоматическое извлечение метаданных",
"LabelAutoFetchMetadataHelp": "Извлекает метаданные для названия, автора и серии для упрощения загрузки. После загрузки может потребоваться сопоставление дополнительных метаданных.", "LabelAutoFetchMetadataHelp": "Извлекает метаданные для названия, автора и серии для упрощения загрузки. После загрузки может потребоваться сопоставление дополнительных метаданных.",
"LabelAutoLaunch": "Автозапуск", "LabelAutoLaunch": "Автозапуск",
@@ -275,7 +277,7 @@
"LabelButtonText": "Текст кнопки", "LabelButtonText": "Текст кнопки",
"LabelByAuthor": "{0}", "LabelByAuthor": "{0}",
"LabelChangePassword": "Изменить пароль", "LabelChangePassword": "Изменить пароль",
"LabelChannels": "Каналы", "LabelChannels": "Ленты",
"LabelChapterCount": "{0} Главы", "LabelChapterCount": "{0} Главы",
"LabelChapterTitle": "Название главы", "LabelChapterTitle": "Название главы",
"LabelChapters": "Главы", "LabelChapters": "Главы",
@@ -293,6 +295,7 @@
"LabelContinueListening": "Продолжить слушать", "LabelContinueListening": "Продолжить слушать",
"LabelContinueReading": "Продолжить чтение", "LabelContinueReading": "Продолжить чтение",
"LabelContinueSeries": "Продолжить серию", "LabelContinueSeries": "Продолжить серию",
"LabelCorsAllowed": "Разрешённые CORS источники",
"LabelCover": "Обложка", "LabelCover": "Обложка",
"LabelCoverImageURL": "URL изображения обложки", "LabelCoverImageURL": "URL изображения обложки",
"LabelCoverProvider": "Провайдер обложек", "LabelCoverProvider": "Провайдер обложек",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Удалить из файловой системы (снимите флажок, чтобы удалить только из базы данных)", "LabelDeleteFromFileSystemCheckbox": "Удалить из файловой системы (снимите флажок, чтобы удалить только из базы данных)",
"LabelDescription": "Описание", "LabelDescription": "Описание",
"LabelDeselectAll": "Снять выделение", "LabelDeselectAll": "Снять выделение",
"LabelDetectedPattern": "Обнаруженный образец:",
"LabelDevice": "Устройство", "LabelDevice": "Устройство",
"LabelDeviceInfo": "Информация об устройстве", "LabelDeviceInfo": "Информация об устройстве",
"LabelDeviceIsAvailableTo": "Устройство доступно для...", "LabelDeviceIsAvailableTo": "Устройство доступно для...",
@@ -314,7 +318,7 @@
"LabelDiscFromMetadata": "Диск из Метаданных", "LabelDiscFromMetadata": "Диск из Метаданных",
"LabelDiscover": "Не начато", "LabelDiscover": "Не начато",
"LabelDownload": "Скачать", "LabelDownload": "Скачать",
"LabelDownloadNEpisodes": "Скачать {0} эпизодов", "LabelDownloadNEpisodes": "Скачать {0} выпусков",
"LabelDownloadable": "Загружаемый", "LabelDownloadable": "Загружаемый",
"LabelDuration": "Длительность", "LabelDuration": "Длительность",
"LabelDurationComparisonExactMatch": "(точное совпадение)", "LabelDurationComparisonExactMatch": "(точное совпадение)",
@@ -328,7 +332,7 @@
"LabelEmailSettingsFromAddress": "Адрес От", "LabelEmailSettingsFromAddress": "Адрес От",
"LabelEmailSettingsRejectUnauthorized": "Отклонение неавторизованных сертификатов", "LabelEmailSettingsRejectUnauthorized": "Отклонение неавторизованных сертификатов",
"LabelEmailSettingsRejectUnauthorizedHelp": "Отключение проверки SSL-сертификата может подвергнуть ваше подключение рискам безопасности, таким как атаки типа \"man-in-the-middle\". Отключайте эту опцию только в том случае, если вы понимаете последствия и доверяете почтовому серверу, к которому подключаетесь.", "LabelEmailSettingsRejectUnauthorizedHelp": "Отключение проверки SSL-сертификата может подвергнуть ваше подключение рискам безопасности, таким как атаки типа \"man-in-the-middle\". Отключайте эту опцию только в том случае, если вы понимаете последствия и доверяете почтовому серверу, к которому подключаетесь.",
"LabelEmailSettingsSecure": "Безопасность", "LabelEmailSettingsSecure": "Безопасно",
"LabelEmailSettingsSecureHelp": "Если значение истинно, то соединение будет использовать TLS при подключении к серверу. Если значение ложно, то TLS будет использован, если сервер поддерживает расширение STARTTLS. В большинстве случаев установите это значение в истину, если вы подключаетесь к порту 465. Для порта 587 или 25 оставьте значение ложным. (из nodemailer.com/smtp/#authentication)", "LabelEmailSettingsSecureHelp": "Если значение истинно, то соединение будет использовать TLS при подключении к серверу. Если значение ложно, то TLS будет использован, если сервер поддерживает расширение STARTTLS. В большинстве случаев установите это значение в истину, если вы подключаетесь к порту 465. Для порта 587 или 25 оставьте значение ложным. (из nodemailer.com/smtp/#authentication)",
"LabelEmailSettingsTestAddress": "Тестовый адрес", "LabelEmailSettingsTestAddress": "Тестовый адрес",
"LabelEmbeddedCover": "Встроенная обложка", "LabelEmbeddedCover": "Встроенная обложка",
@@ -344,13 +348,13 @@
"LabelEncodingWatcherDisabled": "Если у вас отключено наблюдение за папкой, вам нужно будет повторно пересканировать эту аудиокнигу.", "LabelEncodingWatcherDisabled": "Если у вас отключено наблюдение за папкой, вам нужно будет повторно пересканировать эту аудиокнигу.",
"LabelEnd": "Конец", "LabelEnd": "Конец",
"LabelEndOfChapter": "Конец главы", "LabelEndOfChapter": "Конец главы",
"LabelEpisode": "Эпизод", "LabelEpisode": "Выпуск",
"LabelEpisodeNotLinkedToRssFeed": "Эпизод, не связанный с RSS-каналом", "LabelEpisodeNotLinkedToRssFeed": "Выпуск, не связанный с RSS-лентой",
"LabelEpisodeNumber": "Эпизод #{0}", "LabelEpisodeNumber": "Выпуск #{0}",
"LabelEpisodeTitle": "Имя эпизода", "LabelEpisodeTitle": "Название выпуска",
"LabelEpisodeType": "Тип эпизода", "LabelEpisodeType": "Тип выпуска",
"LabelEpisodeUrlFromRssFeed": "URL-адрес эпизода из RSS-ленты", "LabelEpisodeUrlFromRssFeed": "URL-адрес выпуска из RSS-ленты",
"LabelEpisodes": "Эпизодов", "LabelEpisodes": "Выпуски",
"LabelEpisodic": "Эпизодический", "LabelEpisodic": "Эпизодический",
"LabelExample": "Пример", "LabelExample": "Пример",
"LabelExpandSeries": "Развернуть серию", "LabelExpandSeries": "Развернуть серию",
@@ -363,7 +367,7 @@
"LabelExplicitChecked": "18+ (отмечено)", "LabelExplicitChecked": "18+ (отмечено)",
"LabelExplicitUnchecked": "+18 (не отмечено)", "LabelExplicitUnchecked": "+18 (не отмечено)",
"LabelExportOPML": "Экспорт OPML", "LabelExportOPML": "Экспорт OPML",
"LabelFeedURL": "URL канала", "LabelFeedURL": "URL-адрес ленты",
"LabelFetchingMetadata": "Извлечение метаданных", "LabelFetchingMetadata": "Извлечение метаданных",
"LabelFile": "Файл", "LabelFile": "Файл",
"LabelFileBirthtime": "Дата создания", "LabelFileBirthtime": "Дата создания",
@@ -372,8 +376,9 @@
"LabelFileModifiedDate": "Изменено {0}", "LabelFileModifiedDate": "Изменено {0}",
"LabelFilename": "Имя файла", "LabelFilename": "Имя файла",
"LabelFilterByUser": "Фильтр по пользователю", "LabelFilterByUser": "Фильтр по пользователю",
"LabelFindEpisodes": "Найти эпизоды", "LabelFindEpisodes": "Найти выпуски",
"LabelFinished": "Закончен", "LabelFinished": "Закончен",
"LabelFinishedDate": "Завершено {0}",
"LabelFolder": "Папка", "LabelFolder": "Папка",
"LabelFolders": "Папки", "LabelFolders": "Папки",
"LabelFontBold": "Жирный", "LabelFontBold": "Жирный",
@@ -418,6 +423,7 @@
"LabelLanguages": "Языки", "LabelLanguages": "Языки",
"LabelLastBookAdded": "Последняя книга добавлена", "LabelLastBookAdded": "Последняя книга добавлена",
"LabelLastBookUpdated": "Последняя книга обновлена", "LabelLastBookUpdated": "Последняя книга обновлена",
"LabelLastProgressDate": "Последний прогресс: {0}",
"LabelLastSeen": "Последнее сканирование", "LabelLastSeen": "Последнее сканирование",
"LabelLastTime": "Последний по времени", "LabelLastTime": "Последний по времени",
"LabelLastUpdate": "Последний обновленный", "LabelLastUpdate": "Последний обновленный",
@@ -430,20 +436,24 @@
"LabelLibraryFilterSublistEmpty": "Нет {0}", "LabelLibraryFilterSublistEmpty": "Нет {0}",
"LabelLibraryItem": "Элемент библиотеки", "LabelLibraryItem": "Элемент библиотеки",
"LabelLibraryName": "Имя библиотеки", "LabelLibraryName": "Имя библиотеки",
"LabelLibrarySortByProgress": "Прогресс: Последнее обновление",
"LabelLibrarySortByProgressFinished": "Прогресс: Завершено",
"LabelLibrarySortByProgressStarted": "Прогресс: Начато",
"LabelLimit": "Лимит", "LabelLimit": "Лимит",
"LabelLineSpacing": "Межстрочный интервал", "LabelLineSpacing": "Межстрочный интервал",
"LabelListenAgain": "Послушать снова", "LabelListenAgain": "Послушать снова",
"LabelLogLevelDebug": "Debug", "LabelLogLevelDebug": "Debug",
"LabelLogLevelInfo": "Info", "LabelLogLevelInfo": "Info",
"LabelLogLevelWarn": "Предупреждение", "LabelLogLevelWarn": "Предупреждение",
"LabelLookForNewEpisodesAfterDate": "Искать новые эпизоды после этой даты", "LabelLookForNewEpisodesAfterDate": "Искать новые выпуски после этой даты",
"LabelLowestPriority": "Самый низкий приоритет", "LabelLowestPriority": "Самый низкий приоритет",
"LabelMatchConfidence": "Уверенность",
"LabelMatchExistingUsersBy": "Сопоставление существующих пользователей по", "LabelMatchExistingUsersBy": "Сопоставление существующих пользователей по",
"LabelMatchExistingUsersByDescription": "Используется для подключения существующих пользователей. После подключения пользователям будет присвоен уникальный идентификатор от поставщика единого входа", "LabelMatchExistingUsersByDescription": "Используется для подключения существующих пользователей. После подключения пользователям будет присвоен уникальный идентификатор от поставщика единого входа",
"LabelMaxEpisodesToDownload": "Максимальное количество эпизодов для загрузки. Используйте 0 для неограниченного количества.", "LabelMaxEpisodesToDownload": "Максимальное количество выпусков для скачивания. Используйте 0 для неограниченного количества.",
"LabelMaxEpisodesToDownloadPerCheck": "Максимальное количество новых эпизодов для загрузки за одну проверку", "LabelMaxEpisodesToDownloadPerCheck": "Максимальное количество новых выпусков для скачивания за один раз",
"LabelMaxEpisodesToKeep": "Максимальное количество сохраняемых эпизодов", "LabelMaxEpisodesToKeep": "Максимальное количество сохраняемых выпусков",
"LabelMaxEpisodesToKeepHelp": "Значение 0 не устанавливает максимального ограничения. После автоматической загрузки нового эпизода самый старый эпизод будет удален, если у вас более X эпизодов. При этом будет удален только 1 эпизод за каждую новую загрузку.", "LabelMaxEpisodesToKeepHelp": "Значение 0 не устанавливает максимального ограничения. После автоматической скачивании нового выпуска самый старый будет удалён, если у вас их уже более X выпусков. При этом будет удалён только 1 выпуск за каждое новое скачивание.",
"LabelMediaPlayer": "Медиа проигрыватель", "LabelMediaPlayer": "Медиа проигрыватель",
"LabelMediaType": "Тип медиа", "LabelMediaType": "Тип медиа",
"LabelMetaTag": "Мета тег", "LabelMetaTag": "Мета тег",
@@ -465,12 +475,13 @@
"LabelNew": "Новый", "LabelNew": "Новый",
"LabelNewPassword": "Новый пароль", "LabelNewPassword": "Новый пароль",
"LabelNewestAuthors": "Новые авторы", "LabelNewestAuthors": "Новые авторы",
"LabelNewestEpisodes": "Новые эпизоды", "LabelNewestEpisodes": "Новые выпуски",
"LabelNextBackupDate": "Следующая дата бэкапирования", "LabelNextBackupDate": "Следующая дата бэкапирования",
"LabelNextChapters": "Следующие главы будут:",
"LabelNextScheduledRun": "Следущий запланированный запуск", "LabelNextScheduledRun": "Следущий запланированный запуск",
"LabelNoApiKeys": "API ключи отсутствуют", "LabelNoApiKeys": "API ключи отсутствуют",
"LabelNoCustomMetadataProviders": "Нет пользовательских поставщиков метаданных", "LabelNoCustomMetadataProviders": "Нет пользовательских поставщиков метаданных",
"LabelNoEpisodesSelected": "Эпизоды не выбраны", "LabelNoEpisodesSelected": "Нет выбранных выпусков",
"LabelNotFinished": "Не завершено", "LabelNotFinished": "Не завершено",
"LabelNotStarted": "Не запущено", "LabelNotStarted": "Не запущено",
"LabelNotes": "Заметки", "LabelNotes": "Заметки",
@@ -484,11 +495,12 @@
"LabelNotificationsMaxQueueSize": "Макс. размер очереди для событий уведомлений", "LabelNotificationsMaxQueueSize": "Макс. размер очереди для событий уведомлений",
"LabelNotificationsMaxQueueSizeHelp": "События ограничены 1 в секунду. События будут игнорированы если в очереди максимальное количество. Это предотвращает спам сообщениями.", "LabelNotificationsMaxQueueSizeHelp": "События ограничены 1 в секунду. События будут игнорированы если в очереди максимальное количество. Это предотвращает спам сообщениями.",
"LabelNumberOfBooks": "Количество книг", "LabelNumberOfBooks": "Количество книг",
"LabelNumberOfEpisodes": "# из эпизодов", "LabelNumberOfChapters": "Кол-во глав:",
"LabelNumberOfEpisodes": "# из выпусков",
"LabelOpenIDAdvancedPermsClaimDescription": "Имя утверждения OpenID, содержащего расширенные разрешения на действия пользователя в приложении, которые будут применяться к ролям, не являющимся администраторами (<b>если они настроены</b>). Если утверждение отсутствует в ответе, в доступе к ABS будет отказано. Если одна опция отсутствует, она будет рассматриваться как <code>false</code>. Убедитесь, что утверждение поставщика удостоверений соответствует ожидаемой структуре:", "LabelOpenIDAdvancedPermsClaimDescription": "Имя утверждения OpenID, содержащего расширенные разрешения на действия пользователя в приложении, которые будут применяться к ролям, не являющимся администраторами (<b>если они настроены</b>). Если утверждение отсутствует в ответе, в доступе к ABS будет отказано. Если одна опция отсутствует, она будет рассматриваться как <code>false</code>. Убедитесь, что утверждение поставщика удостоверений соответствует ожидаемой структуре:",
"LabelOpenIDClaims": "Оставьте следующие параметры пустыми, чтобы отключить расширенное назначение групп и разрешений, будет автоматически присвоена группа «Пользователь».", "LabelOpenIDClaims": "Оставьте следующие параметры пустыми, чтобы отключить расширенное назначение групп и разрешений, будет автоматически присвоена группа «Пользователь».",
"LabelOpenIDGroupClaimDescription": "Имя утверждения OpenID, содержащего список групп пользователя. Обычно их называют <code>groups</code>. <b>Если эта настройка</b> настроена, приложение будет автоматически назначать роли на основе членства пользователя в группах при условии, что эти группы названы в утверждении без учета регистра \"admin\", \"user\" или \"guest\". Утверждение должно содержать список, и если пользователь принадлежит к нескольким группам, то приложение назначит роль, соответствующую самому высокому уровню доступа. Если ни одна из групп не совпадает, доступ будет запрещен.", "LabelOpenIDGroupClaimDescription": "Имя утверждения OpenID, содержащего список групп пользователя. Обычно их называют <code>groups</code>. <b>Если эта настройка</b> настроена, приложение будет автоматически назначать роли на основе членства пользователя в группах при условии, что эти группы названы в утверждении без учета регистра \"admin\", \"user\" или \"guest\". Утверждение должно содержать список, и если пользователь принадлежит к нескольким группам, то приложение назначит роль, соответствующую самому высокому уровню доступа. Если ни одна из групп не совпадает, доступ будет запрещен.",
"LabelOpenRSSFeed": "Открыть RSS-канал", "LabelOpenRSSFeed": "Открыть RSS-ленту",
"LabelOverwrite": "Перезаписать", "LabelOverwrite": "Перезаписать",
"LabelPaginationPageXOfY": "Страница {0} из {1}", "LabelPaginationPageXOfY": "Страница {0} из {1}",
"LabelPassword": "Пароль", "LabelPassword": "Пароль",
@@ -530,8 +542,8 @@
"LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца", "LabelRSSFeedCustomOwnerName": "Пользовательское Имя владельца",
"LabelRSSFeedOpen": "Открыть RSS-ленту", "LabelRSSFeedOpen": "Открыть RSS-ленту",
"LabelRSSFeedPreventIndexing": "Запретить индексирование", "LabelRSSFeedPreventIndexing": "Запретить индексирование",
"LabelRSSFeedSlug": "Встроить RSS-канал", "LabelRSSFeedSlug": "Ключевое слово RSS-ленты",
"LabelRSSFeedURL": "URL RSS-канала", "LabelRSSFeedURL": "URL-адрес RSS-ленты",
"LabelRandomly": "Случайно", "LabelRandomly": "Случайно",
"LabelReAddSeriesToContinueListening": "Повторно добавить серию в «Продолжить слушать»", "LabelReAddSeriesToContinueListening": "Повторно добавить серию в «Продолжить слушать»",
"LabelRead": "Читать", "LabelRead": "Читать",
@@ -556,8 +568,8 @@
"LabelSeason": "Сезон", "LabelSeason": "Сезон",
"LabelSeasonNumber": "Сезон #{0}", "LabelSeasonNumber": "Сезон #{0}",
"LabelSelectAll": "Выбрать все", "LabelSelectAll": "Выбрать все",
"LabelSelectAllEpisodes": "Выбрать все эпизоды", "LabelSelectAllEpisodes": "Выбрать все выпуски",
"LabelSelectEpisodesShowing": "Выберите {0} эпизодов для показа", "LabelSelectEpisodesShowing": "Выберите {0} выпусков для отображения",
"LabelSelectUser": "Выбрать пользователя", "LabelSelectUser": "Выбрать пользователя",
"LabelSelectUsers": "Выбор пользователей", "LabelSelectUsers": "Выбор пользователей",
"LabelSendEbookToDevice": "Отправить e-книгу в...", "LabelSendEbookToDevice": "Отправить e-книгу в...",
@@ -626,6 +638,7 @@
"LabelStartTime": "Время начала", "LabelStartTime": "Время начала",
"LabelStarted": "Начат", "LabelStarted": "Начат",
"LabelStartedAt": "Начато В", "LabelStartedAt": "Начато В",
"LabelStartedDate": "Начато {0}",
"LabelStatsAudioTracks": "Аудио треки", "LabelStatsAudioTracks": "Аудио треки",
"LabelStatsAuthors": "Авторы", "LabelStatsAuthors": "Авторы",
"LabelStatsBestDay": "Лучший День", "LabelStatsBestDay": "Лучший День",
@@ -655,7 +668,8 @@
"LabelTheme": "Тема", "LabelTheme": "Тема",
"LabelThemeDark": "Темная", "LabelThemeDark": "Темная",
"LabelThemeLight": "Светлая", "LabelThemeLight": "Светлая",
"LabelTimeBase": "Временная база", "LabelThemeSepia": "Сепия",
"LabelTimeBase": "Основное время",
"LabelTimeDurationXHours": "{0} часов", "LabelTimeDurationXHours": "{0} часов",
"LabelTimeDurationXMinutes": "{0} минут", "LabelTimeDurationXMinutes": "{0} минут",
"LabelTimeDurationXSeconds": "{0} секунд", "LabelTimeDurationXSeconds": "{0} секунд",
@@ -723,6 +737,7 @@
"MessageAddToPlayerQueue": "Добавить в очередь проигрывателя", "MessageAddToPlayerQueue": "Добавить в очередь проигрывателя",
"MessageAppriseDescription": "Для использования этой функции необходимо иметь запущенный экземпляр <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> или api которое обрабатывает те же самые запросы. <br />URL-адрес API Apprise должен быть полным 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 />URL-адрес API Apprise должен быть полным URL-адресом для отправки уведомления, т.е., если API запущено по адресу <code>http://192.168.1.1:8337</code> тогда нужно указать <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Убедитесь, что вы используете ASIN из правильной региональной зоны Audible, а не из Amazon.", "MessageAsinCheck": "Убедитесь, что вы используете ASIN из правильной региональной зоны Audible, а не из Amazon.",
"MessageAuthenticationLegacyTokenWarning": "Устаревшие токены API в будущем будут удалены. Вместо них используйте <a href=\"/config/api-keys\">API-ключи</a>.",
"MessageAuthenticationOIDCChangesRestart": "Перезапустите ваш сервер после сохранения для применения изменений в OIDC.", "MessageAuthenticationOIDCChangesRestart": "Перезапустите ваш сервер после сохранения для применения изменений в OIDC.",
"MessageAuthenticationSecurityMessage": "В целях безопасности была улучшена аутентификация. Всем пользователям необходимо повторно войти в систему.", "MessageAuthenticationSecurityMessage": "В целях безопасности была улучшена аутентификация. Всем пользователям необходимо повторно войти в систему.",
"MessageBackupsDescription": "Бэкап включает пользователей, прогресс пользователей, данные элементов библиотеки, настройки сервера и изображения хранящиеся в <code>/metadata/items</code> и <code>/metadata/authors</code>. Бэкапы <strong>НЕ</strong> сохраняют файлы из папок библиотек.", "MessageBackupsDescription": "Бэкап включает пользователей, прогресс пользователей, данные элементов библиотеки, настройки сервера и изображения хранящиеся в <code>/metadata/items</code> и <code>/metadata/authors</code>. Бэкапы <strong>НЕ</strong> сохраняют файлы из папок библиотек.",
@@ -734,10 +749,11 @@
"MessageBatchQuickMatchDescription": "Быстрый Поиск попытается добавить отсутствующие обложки и метаданные для выбранных элементов. Включите параметры ниже, чтобы разрешить Быстрому Поиску перезаписывать существующие обложки и/или метаданные.", "MessageBatchQuickMatchDescription": "Быстрый Поиск попытается добавить отсутствующие обложки и метаданные для выбранных элементов. Включите параметры ниже, чтобы разрешить Быстрому Поиску перезаписывать существующие обложки и/или метаданные.",
"MessageBookshelfNoCollections": "Вы еще не создали ни одной коллекции", "MessageBookshelfNoCollections": "Вы еще не создали ни одной коллекции",
"MessageBookshelfNoCollectionsHelp": "Коллекции являются общедоступными. Все пользователи, имеющие доступ к библиотеке, могут их просматривать.", "MessageBookshelfNoCollectionsHelp": "Коллекции являются общедоступными. Все пользователи, имеющие доступ к библиотеке, могут их просматривать.",
"MessageBookshelfNoRSSFeeds": "Нет открытых RSS-каналов", "MessageBookshelfNoRSSFeeds": "Нет открытых RSS-лент",
"MessageBookshelfNoResultsForFilter": "Нет Результатов для фильтра \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Нет Результатов для фильтра \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Нет результатов для запроса", "MessageBookshelfNoResultsForQuery": "Нет результатов для запроса",
"MessageBookshelfNoSeries": "У вас нет серий", "MessageBookshelfNoSeries": "У вас нет серий",
"MessageBulkChapterPattern": "Сколько глав вы хотели бы добавить, используя эту схему нумерации?",
"MessageChapterEndIsAfter": "Конец главы после окончания вашей аудиокниги", "MessageChapterEndIsAfter": "Конец главы после окончания вашей аудиокниги",
"MessageChapterErrorFirstNotZero": "Первая глава должна начинаться с 0", "MessageChapterErrorFirstNotZero": "Первая глава должна начинаться с 0",
"MessageChapterErrorStartGteDuration": "Неверное время начала, должно быть меньше продолжительности аудиокниги", "MessageChapterErrorStartGteDuration": "Неверное время начала, должно быть меньше продолжительности аудиокниги",
@@ -745,7 +761,7 @@
"MessageChapterStartIsAfter": "Глава начинается после окончания аудиокниги", "MessageChapterStartIsAfter": "Глава начинается после окончания аудиокниги",
"MessageChaptersNotFound": "Главы не найденны", "MessageChaptersNotFound": "Главы не найденны",
"MessageCheckingCron": "Проверка cron...", "MessageCheckingCron": "Проверка cron...",
"MessageConfirmCloseFeed": "Вы уверены, что хотите закрыть этот канал?", "MessageConfirmCloseFeed": "Вы уверены, что хотите закрыть эту ленту?",
"MessageConfirmDeleteApiKey": "Вы уверены, что хотите удалить API ключ \"{0}\"?", "MessageConfirmDeleteApiKey": "Вы уверены, что хотите удалить API ключ \"{0}\"?",
"MessageConfirmDeleteBackup": "Вы уверены, что хотите удалить бэкап для {0}?", "MessageConfirmDeleteBackup": "Вы уверены, что хотите удалить бэкап для {0}?",
"MessageConfirmDeleteDevice": "Вы уверены, что хотите удалить устройство для чтения электронных книг \"{0}\"?", "MessageConfirmDeleteDevice": "Вы уверены, что хотите удалить устройство для чтения электронных книг \"{0}\"?",
@@ -758,8 +774,8 @@
"MessageConfirmDeleteSession": "Вы уверены, что хотите удалить этот сеанс?", "MessageConfirmDeleteSession": "Вы уверены, что хотите удалить этот сеанс?",
"MessageConfirmEmbedMetadataInAudioFiles": "Вы уверены, что хотите вставить метаданные в {0} аудиофайлов?", "MessageConfirmEmbedMetadataInAudioFiles": "Вы уверены, что хотите вставить метаданные в {0} аудиофайлов?",
"MessageConfirmForceReScan": "Вы уверены, что хотите принудительно выполнить повторное сканирование?", "MessageConfirmForceReScan": "Вы уверены, что хотите принудительно выполнить повторное сканирование?",
"MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все эпизоды как завершенные?", "MessageConfirmMarkAllEpisodesFinished": "Вы уверены, что хотите отметить все выпуски как прослушанные?",
"MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все эпизоды как не завершенные?", "MessageConfirmMarkAllEpisodesNotFinished": "Вы уверены, что хотите отметить все выпуски как непрослушанные?",
"MessageConfirmMarkItemFinished": "Вы уверены, что хотите отметить «{0}» как завершенную?", "MessageConfirmMarkItemFinished": "Вы уверены, что хотите отметить «{0}» как завершенную?",
"MessageConfirmMarkItemNotFinished": "Вы уверены, что хотите отметить «{0}» как не завершенную?", "MessageConfirmMarkItemNotFinished": "Вы уверены, что хотите отметить «{0}» как не завершенную?",
"MessageConfirmMarkSeriesFinished": "Вы уверены, что хотите отметить все книги этой серии как завершенные?", "MessageConfirmMarkSeriesFinished": "Вы уверены, что хотите отметить все книги этой серии как завершенные?",
@@ -768,14 +784,14 @@
"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}\"?",
"MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить эпизод \"{0}\"?", "MessageConfirmRemoveEpisode": "Вы уверены, что хотите удалить выпуск «{0}»?",
"MessageConfirmRemoveEpisodeNote": "Примечание: Это не приведет к удалению аудиофайла, если не включить опцию \"Жесткое удаление файла\"", "MessageConfirmRemoveEpisodeNote": "Примечание: Это не приведет к удалению аудиофайла, если не включить опцию \"Жесткое удаление файла\"",
"MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} эпизодов?", "MessageConfirmRemoveEpisodes": "Вы уверены, что хотите удалить {0} выпусков?",
"MessageConfirmRemoveListeningSessions": "Вы уверены, что хотите удалить {0} сеансов прослушивания?", "MessageConfirmRemoveListeningSessions": "Вы уверены, что хотите удалить {0} сеансов прослушивания?",
"MessageConfirmRemoveMetadataFiles": "Вы уверены, что хотите удалить все файлы metadata. {0} файлов из папок элементов вашей библиотеки?", "MessageConfirmRemoveMetadataFiles": "Вы уверены, что хотите удалить все файлы metadata. {0} файлов из папок элементов вашей библиотеки?",
"MessageConfirmRemoveNarrator": "Вы уверены, что хотите удалить чтеца \"{0}\"?", "MessageConfirmRemoveNarrator": "Вы уверены, что хотите удалить чтеца \"{0}\"?",
@@ -790,16 +806,18 @@
"MessageConfirmSendEbookToDevice": "Вы уверены, что хотите отправить {0} e-книгу \"{1}\" на устройство \"{2}\"?", "MessageConfirmSendEbookToDevice": "Вы уверены, что хотите отправить {0} e-книгу \"{1}\" на устройство \"{2}\"?",
"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-файлы и текстовые файлы будут сканироваться как новые.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} прослушивание</strong> на {1}",
"MessageHeatmapNoListeningSessions": "Нет сессий прослушивания на {0}",
"MessageImportantNotice": "Важное замечание!", "MessageImportantNotice": "Важное замечание!",
"MessageInsertChapterBelow": "Вставить главу ниже", "MessageInsertChapterBelow": "Вставить главу ниже",
"MessageInvalidAsin": "Неправильный ASIN", "MessageInvalidAsin": "Неправильный ASIN",
@@ -812,8 +830,8 @@
"MessageM4BFailed": "M4B Ошибка!", "MessageM4BFailed": "M4B Ошибка!",
"MessageM4BFinished": "M4B Завершено!", "MessageM4BFinished": "M4B Завершено!",
"MessageMapChapterTitles": "Сопоставление названий глав с существующими главами аудиокниги без корректировки временных меток", "MessageMapChapterTitles": "Сопоставление названий глав с существующими главами аудиокниги без корректировки временных меток",
"MessageMarkAllEpisodesFinished": "Отметить все эпизоды как завершенные", "MessageMarkAllEpisodesFinished": "Отметить все выпуски как прослушанные",
"MessageMarkAllEpisodesNotFinished": "Отметить все эпизоды как не завершенные", "MessageMarkAllEpisodesNotFinished": "Отметить все выпуски как непрослушанные",
"MessageMarkAsFinished": "Отметить, как завершенную", "MessageMarkAsFinished": "Отметить, как завершенную",
"MessageMarkAsNotFinished": "Отметить, как не завершенную", "MessageMarkAsNotFinished": "Отметить, как не завершенную",
"MessageMatchBooksDescription": "попытается сопоставить книги в библиотеке с книгой из выбранного поставщика поиска и заполнить пустые детали и обложку. Не перезаписывает сведения.", "MessageMatchBooksDescription": "попытается сопоставить книги в библиотеке с книгой из выбранного поставщика поиска и заполнить пустые детали и обложку. Не перезаписывает сведения.",
@@ -828,8 +846,8 @@
"MessageNoDevices": "Нет устройств", "MessageNoDevices": "Нет устройств",
"MessageNoDownloadsInProgress": "В настоящее время загрузка не выполняется", "MessageNoDownloadsInProgress": "В настоящее время загрузка не выполняется",
"MessageNoDownloadsQueued": "Нет загрузок в очереди", "MessageNoDownloadsQueued": "Нет загрузок в очереди",
"MessageNoEpisodeMatchesFound": "Совпадения эпизодов не найдены", "MessageNoEpisodeMatchesFound": "Совпадения выпусков не найдены",
"MessageNoEpisodes": "Нет эпизодов", "MessageNoEpisodes": "Нету выпусков",
"MessageNoFoldersAvailable": "Нет доступных папок", "MessageNoFoldersAvailable": "Нет доступных папок",
"MessageNoGenres": "Нет жанров", "MessageNoGenres": "Нет жанров",
"MessageNoIssues": "Нет проблем", "MessageNoIssues": "Нет проблем",
@@ -839,7 +857,7 @@
"MessageNoLogs": "Нет записей", "MessageNoLogs": "Нет записей",
"MessageNoMediaProgress": "Нет прогресса медиа", "MessageNoMediaProgress": "Нет прогресса медиа",
"MessageNoNotifications": "Нет уведомлений", "MessageNoNotifications": "Нет уведомлений",
"MessageNoPodcastFeed": "Недопустимый подкаст: Нет канала", "MessageNoPodcastFeed": "Недопустимый подкаст: Нет ленты",
"MessageNoPodcastsFound": "Подкасты не найдены", "MessageNoPodcastsFound": "Подкасты не найдены",
"MessageNoResults": "Нет результатов", "MessageNoResults": "Нет результатов",
"MessageNoSearchResultsFor": "Нет результатов поиска для \"{0}\"", "MessageNoSearchResultsFor": "Нет результатов поиска для \"{0}\"",
@@ -850,20 +868,20 @@
"MessageNoUserPlaylists": "У вас нет плейлистов", "MessageNoUserPlaylists": "У вас нет плейлистов",
"MessageNoUserPlaylistsHelp": "Списки воспроизведения являются конфиденциальными. Только пользователь, который их создает, может их видеть.", "MessageNoUserPlaylistsHelp": "Списки воспроизведения являются конфиденциальными. Только пользователь, который их создает, может их видеть.",
"MessageNotYetImplemented": "Пока не реализовано", "MessageNotYetImplemented": "Пока не реализовано",
"MessageOpmlPreviewNote": "Примечание: Это предварительный просмотр разобранного файла OPML. Фактическое название подкаста будет взято из RSS-канала.", "MessageOpmlPreviewNote": "Примечание: Это предварительный просмотр разобранного файла OPML. Фактическое название подкаста будет взято из RSS-ленты.",
"MessageOr": "или", "MessageOr": "или",
"MessagePauseChapter": "Пауза воспроизведения главы", "MessagePauseChapter": "Пауза воспроизведения главы",
"MessagePlayChapter": "Прослушать начало главы", "MessagePlayChapter": "Прослушать начало главы",
"MessagePlaylistCreateFromCollection": "Создать плейлист из коллекции", "MessagePlaylistCreateFromCollection": "Создать плейлист из коллекции",
"MessagePleaseWait": "Пожалуйста подождите...", "MessagePleaseWait": "Пожалуйста подождите...",
"MessagePodcastHasNoRSSFeedForMatching": "Подкаст не имеет URL-адреса RSS-канала, который можно использовать для поиска", "MessagePodcastHasNoRSSFeedForMatching": "Подкаст не имеет URL-адреса RSS-ленты, который можно использовать для поиска",
"MessagePodcastSearchField": "Введите поисковый запрос или URL-адрес RSS-канала", "MessagePodcastSearchField": "Введите поисковый запрос или URL-адрес RSS-ленты",
"MessageQuickEmbedInProgress": "Быстрое внедрение в процессе выполнения", "MessageQuickEmbedInProgress": "Быстрое внедрение в процессе выполнения",
"MessageQuickEmbedQueue": "Поставлен в очередь для быстрого внедрения ({0} в очереди)", "MessageQuickEmbedQueue": "Поставлен в очередь для быстрого внедрения ({0} в очереди)",
"MessageQuickMatchAllEpisodes": "Быстрое сопоставление всех эпизодов", "MessageQuickMatchAllEpisodes": "Быстрое сопоставление всех выпусков",
"MessageQuickMatchDescription": "Заполняет пустые детали элемента и обложку первым результатом поиска из «{0}». Не перезаписывает сведения, если не включен параметр сервера 'Предпочитать метаданные поиска'.", "MessageQuickMatchDescription": "Заполняет пустые детали элемента и обложку первым результатом поиска из «{0}». Не перезаписывает сведения, если не включен параметр сервера 'Предпочитать метаданные поиска'.",
"MessageRemoveChapter": "Удалить главу", "MessageRemoveChapter": "Удалить главу",
"MessageRemoveEpisodes": "Удалить {0} эпизод(ов)", "MessageRemoveEpisodes": "Удалить {0} выпуск(ов)",
"MessageRemoveFromPlayerQueue": "Удалить из очереди воспроизведения", "MessageRemoveFromPlayerQueue": "Удалить из очереди воспроизведения",
"MessageRemoveUserWarning": "Вы уверены, что хотите навсегда удалить пользователя \"{0}\"?", "MessageRemoveUserWarning": "Вы уверены, что хотите навсегда удалить пользователя \"{0}\"?",
"MessageReportBugsAndContribute": "Сообщайте об ошибках, запрашивайте функции и вносите свой вклад на", "MessageReportBugsAndContribute": "Сообщайте об ошибках, запрашивайте функции и вносите свой вклад на",
@@ -883,7 +901,7 @@
"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",
@@ -898,9 +916,9 @@
"MessageTaskMatchingBooksInLibrary": "Сопоставление книг в библиотеке \"{0}\"", "MessageTaskMatchingBooksInLibrary": "Сопоставление книг в библиотеке \"{0}\"",
"MessageTaskNoFilesToScan": "Нет файлов для сканирования", "MessageTaskNoFilesToScan": "Нет файлов для сканирования",
"MessageTaskOpmlImport": "Импорт OPML", "MessageTaskOpmlImport": "Импорт OPML",
"MessageTaskOpmlImportDescription": "Создание подкастов из {0} RSS-каналов", "MessageTaskOpmlImportDescription": "Создание подкастов из {0} RSS-ленты",
"MessageTaskOpmlImportFeed": "Канал импорта OPML", "MessageTaskOpmlImportFeed": "Канал импорта OPML",
"MessageTaskOpmlImportFeedDescription": "Импорт RSS-канала \"{0}\"", "MessageTaskOpmlImportFeedDescription": "Импорт RSS-ленты «{0}»",
"MessageTaskOpmlImportFeedFailed": "Не удалось получить ленту подкаста", "MessageTaskOpmlImportFeedFailed": "Не удалось получить ленту подкаста",
"MessageTaskOpmlImportFeedPodcastDescription": "Создание подкаста \"{0}\"", "MessageTaskOpmlImportFeedPodcastDescription": "Создание подкаста \"{0}\"",
"MessageTaskOpmlImportFeedPodcastExists": "Подкаст уже существует по адресу", "MessageTaskOpmlImportFeedPodcastExists": "Подкаст уже существует по адресу",
@@ -908,7 +926,7 @@
"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} обновлено",
@@ -928,22 +946,23 @@
"NoteChangeRootPassword": "Пользователь root — единственный пользователь, который может иметь пустой пароль", "NoteChangeRootPassword": "Пользователь root — единственный пользователь, который может иметь пустой пароль",
"NoteChapterEditorTimes": "Примечание: Время начала первой главы должно оставаться в 0:00, а время начала последней главы не может превышать продолжительность этой аудиокниги.", "NoteChapterEditorTimes": "Примечание: Время начала первой главы должно оставаться в 0:00, а время начала последней главы не может превышать продолжительность этой аудиокниги.",
"NoteFolderPicker": "Примечание: папки, уже сопоставленные, не будут отображаться", "NoteFolderPicker": "Примечание: папки, уже сопоставленные, не будут отображаться",
"NoteRSSFeedPodcastAppsHttps": "Предупреждение: Большинству приложений подкастов потребуется, чтобы URL-адрес RSS-канала использовал HTTPS", "NoteRSSFeedPodcastAppsHttps": "Предупреждение: Большинству приложений подкастов потребуется, чтобы URL-адрес RSS-ленты использовал HTTPS",
"NoteRSSFeedPodcastAppsPubDate": "Предупреждение: 1 или более эпизодов не имеют даты публикации. Некоторые приложения для подкастов требуют этого.", "NoteRSSFeedPodcastAppsPubDate": "Предупреждение: 1 или более выпусков не имеют даты публикации. Некоторые приложения для подкастов требуют этого.",
"NoteUploaderFoldersWithMediaFiles": "Папки с медиафайлами будут обрабатываться как отдельные элементы библиотеки.", "NoteUploaderFoldersWithMediaFiles": "Папки с медиафайлами будут обрабатываться как отдельные элементы библиотеки.",
"NoteUploaderOnlyAudioFiles": "Если загружать только аудиофайлы, то каждый аудиофайл будет обрабатываться как отдельная аудиокнига.", "NoteUploaderOnlyAudioFiles": "Если загружать только аудиофайлы, то каждый аудиофайл будет обрабатываться как отдельная аудиокнига.",
"NoteUploaderUnsupportedFiles": "Неподдерживаемые файлы игнорируются. При выборе или удалении папки другие файлы, не находящиеся в папке элемента, игнорируются.", "NoteUploaderUnsupportedFiles": "Неподдерживаемые файлы игнорируются. При выборе или удалении папки другие файлы, не находящиеся в папке элемента, игнорируются.",
"NotificationOnBackupCompletedDescription": "Запускается при завершении резервного копирования", "NotificationOnBackupCompletedDescription": "Запускается при завершении резервного копирования",
"NotificationOnBackupFailedDescription": "Срабатывает при сбое резервного копирования", "NotificationOnBackupFailedDescription": "Срабатывает при сбое резервного копирования",
"NotificationOnEpisodeDownloadedDescription": "Запускается при автоматической загрузке эпизода подкаста", "NotificationOnEpisodeDownloadedDescription": "Запускается при автоматической скачивании выпуска подкаста",
"NotificationOnRSSFeedDisabledDescription": "Срабатывает, когда автоматическая загрузка эпизодов отключена из-за слишком большого количества неудачных попыток", "NotificationOnRSSFeedDisabledDescription": "Срабатывает, когда автоматическая скачка выпусков отключена из-за слишком большого количества неудачных попыток",
"NotificationOnRSSFeedFailedDescription": "Срабатывает при сбое запроса RSS-канала на автоматическую загрузку эпизода", "NotificationOnRSSFeedFailedDescription": "Срабатывает при сбое запроса RSS-ленты на автоматическую скачивание выпуска",
"NotificationOnTestDescription": "Событие для тестирования системы оповещения", "NotificationOnTestDescription": "Событие для тестирования системы оповещения",
"PlaceholderBulkChapterInput": "Введите название главы или используйте нумерацию (например, «Выпуск 1», «Глава 10», «1.»)",
"PlaceholderNewCollection": "Новое имя коллекции", "PlaceholderNewCollection": "Новое имя коллекции",
"PlaceholderNewFolderPath": "Путь к новой папке", "PlaceholderNewFolderPath": "Путь к новой папке",
"PlaceholderNewPlaylist": "Новое название плейлиста", "PlaceholderNewPlaylist": "Новое название плейлиста",
"PlaceholderSearch": "Поиск...", "PlaceholderSearch": "Поиск...",
"PlaceholderSearchEpisode": "Поиск эпизода...", "PlaceholderSearchEpisode": "Поиск выпуска...",
"StatsAuthorsAdded": "авторов добавлено", "StatsAuthorsAdded": "авторов добавлено",
"StatsBooksAdded": "книг добавлено", "StatsBooksAdded": "книг добавлено",
"StatsBooksAdditional": "Некоторые дополнения включают в себя…", "StatsBooksAdditional": "Некоторые дополнения включают в себя…",
@@ -992,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Не удалось создать закладку", "ToastBookmarkCreateFailed": "Не удалось создать закладку",
"ToastBookmarkCreateSuccess": "Добавлена закладка", "ToastBookmarkCreateSuccess": "Добавлена закладка",
"ToastBookmarkRemoveSuccess": "Закладка удалена", "ToastBookmarkRemoveSuccess": "Закладка удалена",
"ToastBulkChapterInvalidCount": "Введите число от 1 до 150",
"ToastCachePurgeFailed": "Не удалось очистить кэш", "ToastCachePurgeFailed": "Не удалось очистить кэш",
"ToastCachePurgeSuccess": "Кэш успешно очищен", "ToastCachePurgeSuccess": "Кэш успешно очищен",
"ToastChapterLocked": "Глава заблокирована.",
"ToastChapterStartTimeAdjusted": "Время начала главы скорректировано на {0} секунд",
"ToastChaptersAllLocked": "Все главы заблокированы. Разблокируйте некоторые главы, чтобы сдвинуть их время.",
"ToastChaptersHaveErrors": "Главы имеют ошибки", "ToastChaptersHaveErrors": "Главы имеют ошибки",
"ToastChaptersInvalidShiftAmountLast": "Некорректное значение сдвига. Начало последней главы будет превышать продолжительность этой аудиокниги.", "ToastChaptersInvalidShiftAmountLast": "Некорректное значение сдвига. Начало последней главы будет превышать продолжительность этой аудиокниги.",
"ToastChaptersInvalidShiftAmountStart": "Некорректное значение сдвига. Первая глава будет иметь нулевую или отрицательную длину и будет перезаписана второй главой. Увеличьте начальную продолжительность второй главы.", "ToastChaptersInvalidShiftAmountStart": "Некорректное значение сдвига. Первая глава будет иметь нулевую или отрицательную длину и будет перезаписана второй главой. Увеличьте начальную продолжительность второй главы.",
@@ -1003,6 +1026,8 @@
"ToastCollectionItemsAddFailed": "Не удалось добавить элемент(ы) в коллекцию", "ToastCollectionItemsAddFailed": "Не удалось добавить элемент(ы) в коллекцию",
"ToastCollectionRemoveSuccess": "Коллекция удалена", "ToastCollectionRemoveSuccess": "Коллекция удалена",
"ToastCollectionUpdateSuccess": "Коллекция обновлена", "ToastCollectionUpdateSuccess": "Коллекция обновлена",
"ToastConnectionNotAvailable": "Подключение недоступно. Пожалуйста попробуйте позже",
"ToastCoverSearchFailed": "Ошибка поиска обложки",
"ToastCoverUpdateFailed": "Не удалось обновить обложку", "ToastCoverUpdateFailed": "Не удалось обновить обложку",
"ToastDateTimeInvalidOrIncomplete": "Дата и время указаны неверно или не до конца", "ToastDateTimeInvalidOrIncomplete": "Дата и время указаны неверно или не до конца",
"ToastDeleteFileFailed": "Не удалось удалить файл", "ToastDeleteFileFailed": "Не удалось удалить файл",
@@ -1015,8 +1040,8 @@
"ToastEncodeCancelFailed": "Не удалось отменить кодирование", "ToastEncodeCancelFailed": "Не удалось отменить кодирование",
"ToastEncodeCancelSucces": "Кодирование отменено", "ToastEncodeCancelSucces": "Кодирование отменено",
"ToastEpisodeDownloadQueueClearFailed": "Не удалось очистить очередь", "ToastEpisodeDownloadQueueClearFailed": "Не удалось очистить очередь",
"ToastEpisodeDownloadQueueClearSuccess": "Очередь загрузки эпизода очищена", "ToastEpisodeDownloadQueueClearSuccess": "Очищена очередь скачивания выпусков",
"ToastEpisodeUpdateSuccess": "{0 эпизодов обновлено", "ToastEpisodeUpdateSuccess": "{0} выпусков обновлено",
"ToastErrorCannotShare": "Невозможно предоставить общий доступ на этом устройстве", "ToastErrorCannotShare": "Невозможно предоставить общий доступ на этом устройстве",
"ToastFailedToCreate": "Не удалось создать", "ToastFailedToCreate": "Не удалось создать",
"ToastFailedToDelete": "Не удалось удалить", "ToastFailedToDelete": "Не удалось удалить",
@@ -1025,8 +1050,9 @@
"ToastFailedToShare": "Не удалось поделиться", "ToastFailedToShare": "Не удалось поделиться",
"ToastFailedToUpdate": "Не удалось обновить", "ToastFailedToUpdate": "Не удалось обновить",
"ToastInvalidImageUrl": "Неверный URL изображения", "ToastInvalidImageUrl": "Неверный URL изображения",
"ToastInvalidMaxEpisodesToDownload": "Недопустимое максимальное количество загружаемых эпизодов", "ToastInvalidMaxEpisodesToDownload": "Недопустимое максимальное количество скачиваемых выпусков",
"ToastInvalidUrl": "Неверный URL", "ToastInvalidUrl": "Неверный URL",
"ToastInvalidUrls": "Один или несколько URL неверны",
"ToastItemCoverUpdateSuccess": "Обложка элемента обновлена", "ToastItemCoverUpdateSuccess": "Обложка элемента обновлена",
"ToastItemDeletedFailed": "Не удалось удалить элемент", "ToastItemDeletedFailed": "Не удалось удалить элемент",
"ToastItemDeletedSuccess": "Удаленный элемент", "ToastItemDeletedSuccess": "Удаленный элемент",
@@ -1052,15 +1078,15 @@
"ToastNameEmailRequired": "Имя и адрес электронной почты обязательны", "ToastNameEmailRequired": "Имя и адрес электронной почты обязательны",
"ToastNameRequired": "Имя обязательно для заполнения", "ToastNameRequired": "Имя обязательно для заполнения",
"ToastNewApiKeyUserError": "Необходимо выбрать пользователя", "ToastNewApiKeyUserError": "Необходимо выбрать пользователя",
"ToastNewEpisodesFound": "{0} новых эпизодов найдено", "ToastNewEpisodesFound": "Найдено {0} новых выпусков",
"ToastNewUserCreatedFailed": "Не удалось создать учетную запись: \"{0}\"", "ToastNewUserCreatedFailed": "Не удалось создать учетную запись: \"{0}\"",
"ToastNewUserCreatedSuccess": "Новая учетная запись создана", "ToastNewUserCreatedSuccess": "Новая учетная запись создана",
"ToastNewUserLibraryError": "Необходимо выбрать хотя бы одну библиотеку", "ToastNewUserLibraryError": "Необходимо выбрать хотя бы одну библиотеку",
"ToastNewUserPasswordError": "Должен иметь пароль, только пользователь root может иметь пустой пароль", "ToastNewUserPasswordError": "Должен иметь пароль, только пользователь root может иметь пустой пароль",
"ToastNewUserTagError": "Необходимо выбрать хотя бы один тег", "ToastNewUserTagError": "Необходимо выбрать хотя бы один тег",
"ToastNewUserUsernameError": "Введите имя пользователя", "ToastNewUserUsernameError": "Введите имя пользователя",
"ToastNoNewEpisodesFound": "Новых эпизодов не найдено", "ToastNoNewEpisodesFound": "Новых выпусков нету",
"ToastNoRSSFeed": "У подкаста нет RSS-канала", "ToastNoRSSFeed": "У подкаста нет RSS-ленты",
"ToastNoUpdatesNecessary": "Обновления не требуются", "ToastNoUpdatesNecessary": "Обновления не требуются",
"ToastNotificationCreateFailed": "Не удалось создать уведомление", "ToastNotificationCreateFailed": "Не удалось создать уведомление",
"ToastNotificationDeleteFailed": "Не удалось удалить уведомление", "ToastNotificationDeleteFailed": "Не удалось удалить уведомление",
@@ -1076,16 +1102,17 @@
"ToastPlaylistUpdateSuccess": "Плейлист обновлен", "ToastPlaylistUpdateSuccess": "Плейлист обновлен",
"ToastPodcastCreateFailed": "Не удалось создать подкаст", "ToastPodcastCreateFailed": "Не удалось создать подкаст",
"ToastPodcastCreateSuccess": "Подкаст успешно создан", "ToastPodcastCreateSuccess": "Подкаст успешно создан",
"ToastPodcastEpisodeUpdated": "Выпуск обновлён",
"ToastPodcastGetFeedFailed": "Не удалось получить ленту подкастов", "ToastPodcastGetFeedFailed": "Не удалось получить ленту подкастов",
"ToastPodcastNoEpisodesInFeed": "В RSS-ленте эпизодов не найдено", "ToastPodcastNoEpisodesInFeed": "В RSS-ленте выпусков не найдено",
"ToastPodcastNoRssFeed": "В подкасте нет RSS-канала", "ToastPodcastNoRssFeed": "В подкасте нет RSS-ленты",
"ToastProgressIsNotBeingSynced": "Прогресс не синхронизируется, перезапустите воспроизведение", "ToastProgressIsNotBeingSynced": "Прогресс не синхронизируется, перезапустите воспроизведение",
"ToastProviderCreatedFailed": "Не удалось добавить провайдера", "ToastProviderCreatedFailed": "Не удалось добавить провайдера",
"ToastProviderCreatedSuccess": "Добавлен новый провайдер", "ToastProviderCreatedSuccess": "Добавлен новый провайдер",
"ToastProviderNameAndUrlRequired": "Имя и URL обязательные", "ToastProviderNameAndUrlRequired": "Имя и URL обязательные",
"ToastProviderRemoveSuccess": "Провайдер удален", "ToastProviderRemoveSuccess": "Провайдер удален",
"ToastRSSFeedCloseFailed": "Не удалось закрыть RSS-канал", "ToastRSSFeedCloseFailed": "Не удалось закрыть RSS-ленту",
"ToastRSSFeedCloseSuccess": "RSS-канал закрыт", "ToastRSSFeedCloseSuccess": "RSS-лента закрыта",
"ToastRemoveFailed": "Не удалось удалить", "ToastRemoveFailed": "Не удалось удалить",
"ToastRemoveItemFromCollectionFailed": "Не удалось удалить элемент из коллекции", "ToastRemoveItemFromCollectionFailed": "Не удалось удалить элемент из коллекции",
"ToastRemoveItemFromCollectionSuccess": "Элемент удален из коллекции", "ToastRemoveItemFromCollectionSuccess": "Элемент удален из коллекции",
@@ -1126,5 +1153,13 @@
"ToastUserPasswordChangeSuccess": "Пароль успешно изменен", "ToastUserPasswordChangeSuccess": "Пароль успешно изменен",
"ToastUserPasswordMismatch": "Пароли не совпадают", "ToastUserPasswordMismatch": "Пароли не совпадают",
"ToastUserPasswordMustChange": "Новый пароль не может совпадать со старым паролем", "ToastUserPasswordMustChange": "Новый пароль не может совпадать со старым паролем",
"ToastUserRootRequireName": "Необходимо ввести имя пользователя root" "ToastUserRootRequireName": "Необходимо ввести имя пользователя root",
"TooltipAddChapters": "Добавить главу(ы)",
"TooltipAddOneSecond": "Добавить 1 секунду",
"TooltipAdjustChapterStart": "Нажмите, чтобы настроить время начала",
"TooltipLockAllChapters": "Заблокировать все главы",
"TooltipLockChapter": "Заблокировать главу (Shift+клик для диапазона)",
"TooltipSubtractOneSecond": "Вычтите 1 секунду",
"TooltipUnlockAllChapters": "Разблокируйте все главы",
"TooltipUnlockChapter": "Разблокируйте главу (Shift+клик для диапазона)"
} }
+55 -2
View File
@@ -1,10 +1,11 @@
{ {
"ButtonAdd": "Pridať", "ButtonAdd": "Pridať",
"ButtonAddApiKey": "Pridať kľúč API",
"ButtonAddChapters": "Pridať kapitoly", "ButtonAddChapters": "Pridať kapitoly",
"ButtonAddDevice": "Pridať zariadenie", "ButtonAddDevice": "Pridať zariadenie",
"ButtonAddLibrary": "Pridať knižnicu", "ButtonAddLibrary": "Pridať knižnicu",
"ButtonAddPodcasts": "Pridať podcasty", "ButtonAddPodcasts": "Pridať podcasty",
"ButtonAddUser": "Pridať užívateľa", "ButtonAddUser": "Pridať používateľa",
"ButtonAddYourFirstLibrary": "Pridajte vašu prvú knižnicu", "ButtonAddYourFirstLibrary": "Pridajte vašu prvú knižnicu",
"ButtonApply": "Použiť", "ButtonApply": "Použiť",
"ButtonApplyChapters": "Použiť kapitoly", "ButtonApplyChapters": "Použiť kapitoly",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Vyberte priečinok", "ButtonChooseAFolder": "Vyberte priečinok",
"ButtonChooseFiles": "Vyberte súbory", "ButtonChooseFiles": "Vyberte súbory",
"ButtonClearFilter": "Zrušiť filter", "ButtonClearFilter": "Zrušiť filter",
"ButtonClose": "Uzavrieť",
"ButtonCloseFeed": "Zatvoriť zdroj", "ButtonCloseFeed": "Zatvoriť zdroj",
"ButtonCloseSession": "Ukončiť otvorené pripojenie", "ButtonCloseSession": "Ukončiť otvorené pripojenie",
"ButtonCollections": "Kolekcie", "ButtonCollections": "Kolekcie",
@@ -119,11 +121,13 @@
"HeaderAccount": "Účet", "HeaderAccount": "Účet",
"HeaderAddCustomMetadataProvider": "Pridať vastný zdroj metadát", "HeaderAddCustomMetadataProvider": "Pridať vastný zdroj metadát",
"HeaderAdvanced": "Pokročilé", "HeaderAdvanced": "Pokročilé",
"HeaderApiKeys": "Kľúče API",
"HeaderAppriseNotificationSettings": "Nastavenie Apprise notifikácií", "HeaderAppriseNotificationSettings": "Nastavenie Apprise notifikácií",
"HeaderAudioTracks": "Zvukové stopy", "HeaderAudioTracks": "Zvukové stopy",
"HeaderAudiobookTools": "Nástroje na správu súborov audiokníh", "HeaderAudiobookTools": "Nástroje na správu súborov audiokníh",
"HeaderAuthentication": "Overenie", "HeaderAuthentication": "Overenie",
"HeaderBackups": "Zálohy", "HeaderBackups": "Zálohy",
"HeaderBulkChapterModal": "Pridať viaceré kapitoly",
"HeaderChangePassword": "Zmeniť heslo", "HeaderChangePassword": "Zmeniť heslo",
"HeaderChapters": "Kapitoly", "HeaderChapters": "Kapitoly",
"HeaderChooseAFolder": "Vybrať priečinok", "HeaderChooseAFolder": "Vybrať priečinok",
@@ -162,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Metadáta pravidiel poradia", "HeaderMetadataOrderOfPrecedence": "Metadáta pravidiel poradia",
"HeaderMetadataToEmbed": "Metadáta na vloženie", "HeaderMetadataToEmbed": "Metadáta na vloženie",
"HeaderNewAccount": "Nový účet", "HeaderNewAccount": "Nový účet",
"HeaderNewApiKey": "Nový kľúč API",
"HeaderNewLibrary": "Nová knižnica", "HeaderNewLibrary": "Nová knižnica",
"HeaderNotificationCreate": "Vytvoriť notifikáciu", "HeaderNotificationCreate": "Vytvoriť notifikáciu",
"HeaderNotificationUpdate": "Aktualizovať notifikáciu", "HeaderNotificationUpdate": "Aktualizovať notifikáciu",
@@ -195,6 +200,7 @@
"HeaderSettingsExperimental": "Experimentálne funkcie", "HeaderSettingsExperimental": "Experimentálne funkcie",
"HeaderSettingsGeneral": "Hlavné", "HeaderSettingsGeneral": "Hlavné",
"HeaderSettingsScanner": "Skener", "HeaderSettingsScanner": "Skener",
"HeaderSettingsSecurity": "Zabezpečenie",
"HeaderSettingsWebClient": "Webový klient", "HeaderSettingsWebClient": "Webový klient",
"HeaderSleepTimer": "Časovač spánku", "HeaderSleepTimer": "Časovač spánku",
"HeaderStatsLargestItems": "Najväčšie položky", "HeaderStatsLargestItems": "Najväčšie položky",
@@ -206,6 +212,7 @@
"HeaderTableOfContents": "Obsah", "HeaderTableOfContents": "Obsah",
"HeaderTools": "Nástroje", "HeaderTools": "Nástroje",
"HeaderUpdateAccount": "Aktualizovať účet", "HeaderUpdateAccount": "Aktualizovať účet",
"HeaderUpdateApiKey": "Aktualizovať kľúč API",
"HeaderUpdateAuthor": "Aktualizovať autora", "HeaderUpdateAuthor": "Aktualizovať autora",
"HeaderUpdateDetails": "Aktualizovať detaily", "HeaderUpdateDetails": "Aktualizovať detaily",
"HeaderUpdateLibrary": "Aktualizovať knižnicu", "HeaderUpdateLibrary": "Aktualizovať knižnicu",
@@ -235,6 +242,10 @@
"LabelAllUsersExcludingGuests": "Všetci užívatelia okrem hostí", "LabelAllUsersExcludingGuests": "Všetci užívatelia okrem hostí",
"LabelAllUsersIncludingGuests": "Všetci užívatelia vrátane hostí", "LabelAllUsersIncludingGuests": "Všetci užívatelia vrátane hostí",
"LabelAlreadyInYourLibrary": "Už v tvojej knižnici", "LabelAlreadyInYourLibrary": "Už v tvojej knižnici",
"LabelApiKeyCreated": "Kľúč API \"{0}\" bol úspešne vytvorený.",
"LabelApiKeyCreatedDescription": "Skopírujte si kľúč API teraz, neskôr ho už neuvidíte.",
"LabelApiKeyUser": "Vykonáva v mene používateľa",
"LabelApiKeyUserDescription": "Uvedená API bude mať rovnaké práva ako používateľ, v mene ktorého koná. Rovnako v záznamoch budú jednotlivé krky uvedené, ako keby ich vykonal samotný používateľ.",
"LabelApiToken": "API Token", "LabelApiToken": "API Token",
"LabelAppend": "Pridať", "LabelAppend": "Pridať",
"LabelAudioBitrate": "Bitrate audio stopy (napr. 128k)", "LabelAudioBitrate": "Bitrate audio stopy (napr. 128k)",
@@ -284,6 +295,7 @@
"LabelContinueListening": "Pokračovať v počúvaní", "LabelContinueListening": "Pokračovať v počúvaní",
"LabelContinueReading": "Pokračovať v čítaní", "LabelContinueReading": "Pokračovať v čítaní",
"LabelContinueSeries": "Pokračovať v sérii", "LabelContinueSeries": "Pokračovať v sérii",
"LabelCorsAllowed": "CORS Origins povolené",
"LabelCover": "Prebal", "LabelCover": "Prebal",
"LabelCoverImageURL": "URL obrázku prebalu", "LabelCoverImageURL": "URL obrázku prebalu",
"LabelCoverProvider": "Poskytovateľ prebalu", "LabelCoverProvider": "Poskytovateľ prebalu",
@@ -297,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Zmazať zo systému (odškrtni len pre odstránenie z databázy)", "LabelDeleteFromFileSystemCheckbox": "Zmazať zo systému (odškrtni len pre odstránenie z databázy)",
"LabelDescription": "Popis", "LabelDescription": "Popis",
"LabelDeselectAll": "Odznačiť všetko", "LabelDeselectAll": "Odznačiť všetko",
"LabelDetectedPattern": "Identifikovaný vzor:",
"LabelDevice": "Zariadenie", "LabelDevice": "Zariadenie",
"LabelDeviceInfo": "Informácie o zariadení", "LabelDeviceInfo": "Informácie o zariadení",
"LabelDeviceIsAvailableTo": "Zariadenie je k dispozícii...", "LabelDeviceIsAvailableTo": "Zariadenie je k dispozícii...",
@@ -346,6 +359,10 @@
"LabelExample": "Príklad", "LabelExample": "Príklad",
"LabelExpandSeries": "Rozbaliť série", "LabelExpandSeries": "Rozbaliť série",
"LabelExpandSubSeries": "Rozbaliť podsérie", "LabelExpandSubSeries": "Rozbaliť podsérie",
"LabelExpired": "Vypršal",
"LabelExpiresAt": "Vyprší",
"LabelExpiresInSeconds": "Vyprší za (sekúnd)",
"LabelExpiresNever": "Nikdy",
"LabelExplicit": "Explicitný obsah", "LabelExplicit": "Explicitný obsah",
"LabelExplicitChecked": "Explicitné (zaškrtnuté)", "LabelExplicitChecked": "Explicitné (zaškrtnuté)",
"LabelExplicitUnchecked": "Ne-explicitné (nezaškrtnuté)", "LabelExplicitUnchecked": "Ne-explicitné (nezaškrtnuté)",
@@ -361,6 +378,7 @@
"LabelFilterByUser": "Užívateľský filter", "LabelFilterByUser": "Užívateľský filter",
"LabelFindEpisodes": "Nájsť epizódy", "LabelFindEpisodes": "Nájsť epizódy",
"LabelFinished": "Ukončené", "LabelFinished": "Ukončené",
"LabelFinishedDate": "Dokončené {0}",
"LabelFolder": "Priečinok", "LabelFolder": "Priečinok",
"LabelFolders": "Priečinky", "LabelFolders": "Priečinky",
"LabelFontBold": "Tučné", "LabelFontBold": "Tučné",
@@ -405,6 +423,7 @@
"LabelLanguages": "Jazyky", "LabelLanguages": "Jazyky",
"LabelLastBookAdded": "Posledná pridaná kniha", "LabelLastBookAdded": "Posledná pridaná kniha",
"LabelLastBookUpdated": "Posledná aktualizovaná kniha", "LabelLastBookUpdated": "Posledná aktualizovaná kniha",
"LabelLastProgressDate": "Posledný pokrok: {0}",
"LabelLastSeen": "Posledne videné", "LabelLastSeen": "Posledne videné",
"LabelLastTime": "Posledný čas", "LabelLastTime": "Posledný čas",
"LabelLastUpdate": "Posledná aktualizácia", "LabelLastUpdate": "Posledná aktualizácia",
@@ -417,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Žiadne {0}", "LabelLibraryFilterSublistEmpty": "Žiadne {0}",
"LabelLibraryItem": "Položka knižnice", "LabelLibraryItem": "Položka knižnice",
"LabelLibraryName": "Názov knižnice", "LabelLibraryName": "Názov knižnice",
"LabelLibrarySortByProgress": "Pokrok: Aktualizované",
"LabelLibrarySortByProgressFinished": "Pokrok: Dokončené",
"LabelLibrarySortByProgressStarted": "Pokrok: Začiatok",
"LabelLimit": "Limit", "LabelLimit": "Limit",
"LabelLineSpacing": "Riadkovanie", "LabelLineSpacing": "Riadkovanie",
"LabelListenAgain": "Počúvať znova", "LabelListenAgain": "Počúvať znova",
@@ -425,6 +447,7 @@
"LabelLogLevelWarn": "Varovanie", "LabelLogLevelWarn": "Varovanie",
"LabelLookForNewEpisodesAfterDate": "Hľadať nové epizódy od uvedeného dátumu", "LabelLookForNewEpisodesAfterDate": "Hľadať nové epizódy od uvedeného dátumu",
"LabelLowestPriority": "Najnižšia priorita", "LabelLowestPriority": "Najnižšia priorita",
"LabelMatchConfidence": "Istota",
"LabelMatchExistingUsersBy": "Vyhľadaj vytvorených užívateľov podľa", "LabelMatchExistingUsersBy": "Vyhľadaj vytvorených užívateľov podľa",
"LabelMatchExistingUsersByDescription": "Používané na pripájanie vytvorených užívateľov. Po pripojení budú užívatelia vyhľadaní na základe jedinečného id poskytnutého Vaším poskytovateľom SSO", "LabelMatchExistingUsersByDescription": "Používané na pripájanie vytvorených užívateľov. Po pripojení budú užívatelia vyhľadaní na základe jedinečného id poskytnutého Vaším poskytovateľom SSO",
"LabelMaxEpisodesToDownload": "Stiahnuť maximálne # epizód. Pre neobmedzené sťahovanie zadajte 0.", "LabelMaxEpisodesToDownload": "Stiahnuť maximálne # epizód. Pre neobmedzené sťahovanie zadajte 0.",
@@ -454,7 +477,9 @@
"LabelNewestAuthors": "Najnovší autori", "LabelNewestAuthors": "Najnovší autori",
"LabelNewestEpisodes": "Najnovšie epizódy", "LabelNewestEpisodes": "Najnovšie epizódy",
"LabelNextBackupDate": "Ďalší dátum zálohovania", "LabelNextBackupDate": "Ďalší dátum zálohovania",
"LabelNextChapters": "Nasledujúce kapitoly:",
"LabelNextScheduledRun": "Ďalší plánovaný beh", "LabelNextScheduledRun": "Ďalší plánovaný beh",
"LabelNoApiKeys": "Žiadne API kľúče",
"LabelNoCustomMetadataProviders": "Žiadne vlastné zdroje metadát", "LabelNoCustomMetadataProviders": "Žiadne vlastné zdroje metadát",
"LabelNoEpisodesSelected": "Neboli vybrané žiadne epizódy", "LabelNoEpisodesSelected": "Neboli vybrané žiadne epizódy",
"LabelNotFinished": "Nedokončené", "LabelNotFinished": "Nedokončené",
@@ -470,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Maximálna dĺžka fronty oznámení", "LabelNotificationsMaxQueueSize": "Maximálna dĺžka fronty oznámení",
"LabelNotificationsMaxQueueSizeHelp": "Odosielanie udalostí je ohraničené na jedno oznámenie za sekundu. Novovzniknuté udalosti budú ignorované, ak bude fronta oznámení naplnená. Toto nastavenie zabraňuje nevyžiadanému zahlteniu oznámeniami.", "LabelNotificationsMaxQueueSizeHelp": "Odosielanie udalostí je ohraničené na jedno oznámenie za sekundu. Novovzniknuté udalosti budú ignorované, ak bude fronta oznámení naplnená. Toto nastavenie zabraňuje nevyžiadanému zahlteniu oznámeniami.",
"LabelNumberOfBooks": "Počet kníh", "LabelNumberOfBooks": "Počet kníh",
"LabelNumberOfChapters": "Počet kapitol:",
"LabelNumberOfEpisodes": "# z epizód", "LabelNumberOfEpisodes": "# z epizód",
"LabelOpenIDAdvancedPermsClaimDescription": "Názov OpenID predpokladá prítomnosť pokročilých povolení pre užívateľské akcie v rámci aplikácie, ktoré sú aplikovateľné na ne-administrátorské role (<b>ak sú nakonfigurované</b>). Ak potvrdenie takýchto pokročilých povolení nie je v odozve prítomné, prístup do ABS bude automaticky zamietnutý. Ak v odozve chýba len niektoré z očakávaných nastavení, tak bude jeho hodnota automaticky nastavená na <code>false</code>. Uistite sa prosím, že forma odozvy poskytovateľa identity má nasledovnú štruktúru:", "LabelOpenIDAdvancedPermsClaimDescription": "Názov OpenID predpokladá prítomnosť pokročilých povolení pre užívateľské akcie v rámci aplikácie, ktoré sú aplikovateľné na ne-administrátorské role (<b>ak sú nakonfigurované</b>). Ak potvrdenie takýchto pokročilých povolení nie je v odozve prítomné, prístup do ABS bude automaticky zamietnutý. Ak v odozve chýba len niektoré z očakávaných nastavení, tak bude jeho hodnota automaticky nastavená na <code>false</code>. Uistite sa prosím, že forma odozvy poskytovateľa identity má nasledovnú štruktúru:",
"LabelOpenIDClaims": "Ak ponecháte nasledujúce nastavenia prázdne, pokročilé nastavenia skupín a povolení nebudú aktivované a automaticky bude nastavená skupina 'Užívateľ'.", "LabelOpenIDClaims": "Ak ponecháte nasledujúce nastavenia prázdne, pokročilé nastavenia skupín a povolení nebudú aktivované a automaticky bude nastavená skupina 'Užívateľ'.",
@@ -544,6 +570,7 @@
"LabelSelectAll": "Vybrať všetko", "LabelSelectAll": "Vybrať všetko",
"LabelSelectAllEpisodes": "Vybrať všetky epizódy", "LabelSelectAllEpisodes": "Vybrať všetky epizódy",
"LabelSelectEpisodesShowing": "Vybrať {0} zobrazených epizód", "LabelSelectEpisodesShowing": "Vybrať {0} zobrazených epizód",
"LabelSelectUser": "Vyberte používateľa",
"LabelSelectUsers": "Vybrať užívateľov", "LabelSelectUsers": "Vybrať užívateľov",
"LabelSendEbookToDevice": "Poslať e-knihu do...", "LabelSendEbookToDevice": "Poslať e-knihu do...",
"LabelSequence": "Postupnosť", "LabelSequence": "Postupnosť",
@@ -611,6 +638,7 @@
"LabelStartTime": "Čas spustenia", "LabelStartTime": "Čas spustenia",
"LabelStarted": "Začaté", "LabelStarted": "Začaté",
"LabelStartedAt": "Začaté v", "LabelStartedAt": "Začaté v",
"LabelStartedDate": "Začaté {0}",
"LabelStatsAudioTracks": "Zvukové stopy", "LabelStatsAudioTracks": "Zvukové stopy",
"LabelStatsAuthors": "Autori", "LabelStatsAuthors": "Autori",
"LabelStatsBestDay": "Najlepší deň", "LabelStatsBestDay": "Najlepší deň",
@@ -640,6 +668,7 @@
"LabelTheme": "Téma", "LabelTheme": "Téma",
"LabelThemeDark": "Tmavá", "LabelThemeDark": "Tmavá",
"LabelThemeLight": "Svetlá", "LabelThemeLight": "Svetlá",
"LabelThemeSepia": "Sépia",
"LabelTimeBase": "Časová základňa", "LabelTimeBase": "Časová základňa",
"LabelTimeDurationXHours": "{0} hodín", "LabelTimeDurationXHours": "{0} hodín",
"LabelTimeDurationXMinutes": "{0} minút", "LabelTimeDurationXMinutes": "{0} minút",
@@ -708,7 +737,9 @@
"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.",
"MessageAuthenticationLegacyTokenWarning": "Zastaralé API toleny budú v budúcnosti odstránené. Použite miesto nich <a href=\"/config/api-keys\">API kľúče</a>.",
"MessageAuthenticationOIDCChangesRestart": "Reštartujte svoj server po uložení, aby mohli byť použité zmeny OIDC.", "MessageAuthenticationOIDCChangesRestart": "Reštartujte svoj server po uložení, aby mohli byť použité zmeny OIDC.",
"MessageAuthenticationSecurityMessage": "Overovanie bolo kvôli bezpečnosti vylepšené. Všetci používatelia sa musia znova prihlásiť.",
"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.",
@@ -722,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Žiadny výsledok filtrovania \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Žiadny výsledok filtrovania \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Žiadne výsledky dopytu", "MessageBookshelfNoResultsForQuery": "Žiadne výsledky dopytu",
"MessageBookshelfNoSeries": "Nemáte žiadne série", "MessageBookshelfNoSeries": "Nemáte žiadne série",
"MessageBulkChapterPattern": "Koľko ďalších kapitol si želáte pridať s týmto spôsobom číslovania?",
"MessageChapterEndIsAfter": "Koniec kapitoly je až za koncom vašej audioknihy", "MessageChapterEndIsAfter": "Koniec kapitoly je až za koncom vašej audioknihy",
"MessageChapterErrorFirstNotZero": "Prvá kapitola musí začínať na 0", "MessageChapterErrorFirstNotZero": "Prvá kapitola musí začínať na 0",
"MessageChapterErrorStartGteDuration": "Neplatný čas začiatku musí byť menší ako celkové trvanie audioknihy", "MessageChapterErrorStartGteDuration": "Neplatný čas začiatku musí byť menší ako celkové trvanie audioknihy",
@@ -730,6 +762,7 @@
"MessageChaptersNotFound": "Kapitoly nenájdené", "MessageChaptersNotFound": "Kapitoly nenájdené",
"MessageCheckingCron": "Kontrola cron-u...", "MessageCheckingCron": "Kontrola cron-u...",
"MessageConfirmCloseFeed": "Ste si istý, že chcete zavrieť tento zdroj?", "MessageConfirmCloseFeed": "Ste si istý, že chcete zavrieť tento zdroj?",
"MessageConfirmDeleteApiKey": "Ste si istý, že chcete zmazať API kľúč \"{0}\"?",
"MessageConfirmDeleteBackup": "Ste si istý, že chcete zmazať zálohu {0}?", "MessageConfirmDeleteBackup": "Ste si istý, že chcete zmazať zálohu {0}?",
"MessageConfirmDeleteDevice": "Ste si istý, že chcete zmazať zariadenie čítačky e-kníh \"{0}\"?", "MessageConfirmDeleteDevice": "Ste si istý, že chcete zmazať zariadenie čítačky e-kníh \"{0}\"?",
"MessageConfirmDeleteFile": "Týmto odstránite súbor z vášho súborového systému. Ste si istý?", "MessageConfirmDeleteFile": "Týmto odstránite súbor z vášho súborového systému. Ste si istý?",
@@ -783,6 +816,8 @@
"MessageFeedURLWillBe": "URL zdroja bude {0}", "MessageFeedURLWillBe": "URL zdroja bude {0}",
"MessageFetching": "Získavam...", "MessageFetching": "Získavam...",
"MessageForceReScanDescription": "preskenuje všetky súbory ako pri prvom skenovaní. ID3 štítky zvukových súborov, OPF súbory a textové súbory budú nanovo naskenované.", "MessageForceReScanDescription": "preskenuje všetky súbory ako pri prvom skenovaní. ID3 štítky zvukových súborov, OPF súbory a textové súbory budú nanovo naskenované.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} počúvajúcich</strong> na {1}",
"MessageHeatmapNoListeningSessions": "Žiadne relácie počúvania na {0}",
"MessageImportantNotice": "Dôležité upozornenie!", "MessageImportantNotice": "Dôležité upozornenie!",
"MessageInsertChapterBelow": "Vložte kapitolu nižšie", "MessageInsertChapterBelow": "Vložte kapitolu nižšie",
"MessageInvalidAsin": "Neplatné ASIN", "MessageInvalidAsin": "Neplatné ASIN",
@@ -922,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Spustí sa, keď je automatické sťahovanie epizód pozastavené z dôvodu veľkého počtu zlyhaní", "NotificationOnRSSFeedDisabledDescription": "Spustí sa, keď je automatické sťahovanie epizód pozastavené z dôvodu veľkého počtu zlyhaní",
"NotificationOnRSSFeedFailedDescription": "Spustí sa v prípade, keď zlyhá požiadavka RSS zdroja na automatické stiahnutie epizódy", "NotificationOnRSSFeedFailedDescription": "Spustí sa v prípade, keď zlyhá požiadavka RSS zdroja na automatické stiahnutie epizódy",
"NotificationOnTestDescription": "Udalosť určená na testovanie systému notifikácií", "NotificationOnTestDescription": "Udalosť určená na testovanie systému notifikácií",
"PlaceholderBulkChapterInput": "Zadajte názov kapitoly alebo použite číslovanie (napr., 'Epizóda 1', 'Kapitola 10', '1.')",
"PlaceholderNewCollection": "Názov novej zbierky", "PlaceholderNewCollection": "Názov novej zbierky",
"PlaceholderNewFolderPath": "Umiestnenie nového priečinka", "PlaceholderNewFolderPath": "Umiestnenie nového priečinka",
"PlaceholderNewPlaylist": "Názov nového playlistu", "PlaceholderNewPlaylist": "Názov nového playlistu",
@@ -975,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Vytvorenie záložky zlyhalo", "ToastBookmarkCreateFailed": "Vytvorenie záložky zlyhalo",
"ToastBookmarkCreateSuccess": "Záložka pridaná", "ToastBookmarkCreateSuccess": "Záložka pridaná",
"ToastBookmarkRemoveSuccess": "Záložka odstránená", "ToastBookmarkRemoveSuccess": "Záložka odstránená",
"ToastBulkChapterInvalidCount": "Zadajte číslo medzi 1 a 150",
"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á",
"ToastChapterLocked": "Kapitola je zamknutá.",
"ToastChapterStartTimeAdjusted": "Čas začiatku kapitoly upravený o {0} sek.",
"ToastChaptersAllLocked": "Všetky kapitoly sú zamknuté. Odomknite niektoré kapitoly, aby ste posunuli ich časy.",
"ToastChaptersHaveErrors": "Kapitoly obsahujú chyby", "ToastChaptersHaveErrors": "Kapitoly obsahujú chyby",
"ToastChaptersInvalidShiftAmountLast": "Neplatná hodnota veľkosti posunutia. Začiatok poslednej kapitoly by ležal za koncom audioknihy.", "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.", "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.",
@@ -1001,6 +1041,8 @@
"ToastEpisodeDownloadQueueClearSuccess": "Poradie sťahovania bolo vyčistené", "ToastEpisodeDownloadQueueClearSuccess": "Poradie sťahovania bolo vyčistené",
"ToastEpisodeUpdateSuccess": "{0} epizód bolo aktualizovaných", "ToastEpisodeUpdateSuccess": "{0} epizód bolo aktualizovaných",
"ToastErrorCannotShare": "Na tomto zariadení nie je možné zdielať vybraným spôsobom", "ToastErrorCannotShare": "Na tomto zariadení nie je možné zdielať vybraným spôsobom",
"ToastFailedToCreate": "Vytvorenie zlyhalo",
"ToastFailedToDelete": "Zmazanie zlyhalo",
"ToastFailedToLoadData": "Načítanie údajov zlyhalo", "ToastFailedToLoadData": "Načítanie údajov zlyhalo",
"ToastFailedToMatch": "Spárovanie zlyhalo", "ToastFailedToMatch": "Spárovanie zlyhalo",
"ToastFailedToShare": "Zdieľanie zlyhalo", "ToastFailedToShare": "Zdieľanie zlyhalo",
@@ -1008,6 +1050,7 @@
"ToastInvalidImageUrl": "Neplatná URL obrázku", "ToastInvalidImageUrl": "Neplatná URL obrázku",
"ToastInvalidMaxEpisodesToDownload": "Neplatný maximálny počet epizód na stiahnutie", "ToastInvalidMaxEpisodesToDownload": "Neplatný maximálny počet epizód na stiahnutie",
"ToastInvalidUrl": "Neplatná URL", "ToastInvalidUrl": "Neplatná URL",
"ToastInvalidUrls": "Jedna alebo viac URL liniek sú neplatné",
"ToastItemCoverUpdateSuccess": "Prebal položky bol aktualizovaný", "ToastItemCoverUpdateSuccess": "Prebal položky bol aktualizovaný",
"ToastItemDeletedFailed": "Odstránenie položky zlyhalo", "ToastItemDeletedFailed": "Odstránenie položky zlyhalo",
"ToastItemDeletedSuccess": "Položka bola odstránená", "ToastItemDeletedSuccess": "Položka bola odstránená",
@@ -1032,6 +1075,7 @@
"ToastMustHaveAtLeastOnePath": "Musí mať aspoň jednu cestu umiestnenia", "ToastMustHaveAtLeastOnePath": "Musí mať aspoň jednu cestu umiestnenia",
"ToastNameEmailRequired": "Meno a e-mail sú povinné", "ToastNameEmailRequired": "Meno a e-mail sú povinné",
"ToastNameRequired": "Meno je povinné", "ToastNameRequired": "Meno je povinné",
"ToastNewApiKeyUserError": "Musíte vybrať používateľa",
"ToastNewEpisodesFound": "Bolo nájdených {0} nových epizód", "ToastNewEpisodesFound": "Bolo nájdených {0} nových epizód",
"ToastNewUserCreatedFailed": "Vytvorenie účtu zlyhalo: \"{0}\"", "ToastNewUserCreatedFailed": "Vytvorenie účtu zlyhalo: \"{0}\"",
"ToastNewUserCreatedSuccess": "Nový účet bol vytvorený", "ToastNewUserCreatedSuccess": "Nový účet bol vytvorený",
@@ -1056,6 +1100,7 @@
"ToastPlaylistUpdateSuccess": "Playlist bol aktualizovaný", "ToastPlaylistUpdateSuccess": "Playlist bol aktualizovaný",
"ToastPodcastCreateFailed": "Vytvorenie podcastu zlyhalo", "ToastPodcastCreateFailed": "Vytvorenie podcastu zlyhalo",
"ToastPodcastCreateSuccess": "Podcast bol vytvorený", "ToastPodcastCreateSuccess": "Podcast bol vytvorený",
"ToastPodcastEpisodeUpdated": "Epizóda bola aktualizovaná",
"ToastPodcastGetFeedFailed": "Získanie zdroja podcastu zlyhalo", "ToastPodcastGetFeedFailed": "Získanie zdroja podcastu zlyhalo",
"ToastPodcastNoEpisodesInFeed": "Na RSS zdroji neboli nájdené žiadne epizódy", "ToastPodcastNoEpisodesInFeed": "Na RSS zdroji neboli nájdené žiadne epizódy",
"ToastPodcastNoRssFeed": "Podcast nemá RSS zdroj", "ToastPodcastNoRssFeed": "Podcast nemá RSS zdroj",
@@ -1106,5 +1151,13 @@
"ToastUserPasswordChangeSuccess": "Zmena hesla prebehla úspešne", "ToastUserPasswordChangeSuccess": "Zmena hesla prebehla úspešne",
"ToastUserPasswordMismatch": "Heslá sa nezhodujú", "ToastUserPasswordMismatch": "Heslá sa nezhodujú",
"ToastUserPasswordMustChange": "Nové heslo sa nesmie zhodovať so starým", "ToastUserPasswordMustChange": "Nové heslo sa nesmie zhodovať so starým",
"ToastUserRootRequireName": "Musíte zadať používateľské meno root používateľa" "ToastUserRootRequireName": "Musíte zadať používateľské meno root používateľa",
"TooltipAddChapters": "Pridať kapitolu(-y)",
"TooltipAddOneSecond": "Pridať 1 sekundu",
"TooltipAdjustChapterStart": "Kliknite, ak chcete zmeniť začiatočný čas",
"TooltipLockAllChapters": "Zamknúť všetky kapitoly",
"TooltipLockChapter": "Zamknúť kapitolu (Shift+klik pre skupinu)",
"TooltipSubtractOneSecond": "Odobrať 1 sekundu",
"TooltipUnlockAllChapters": "Odomknúť všetky kapitoly",
"TooltipUnlockChapter": "Odomknúť kapitolu (Shift+klik pre skupinu)"
} }
+54 -1
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Dodaj", "ButtonAdd": "Dodaj",
"ButtonAddApiKey": "Dodaj API ključ",
"ButtonAddChapters": "Dodaj poglavja", "ButtonAddChapters": "Dodaj poglavja",
"ButtonAddDevice": "Dodaj napravo", "ButtonAddDevice": "Dodaj napravo",
"ButtonAddLibrary": "Dodaj knjižnico", "ButtonAddLibrary": "Dodaj knjižnico",
@@ -20,6 +21,7 @@
"ButtonChooseAFolder": "Izberite mapo", "ButtonChooseAFolder": "Izberite mapo",
"ButtonChooseFiles": "Izberite datoteke", "ButtonChooseFiles": "Izberite datoteke",
"ButtonClearFilter": "Počisti filter", "ButtonClearFilter": "Počisti filter",
"ButtonClose": "Zapri",
"ButtonCloseFeed": "Zapri vir", "ButtonCloseFeed": "Zapri vir",
"ButtonCloseSession": "Zapri odprto sejo", "ButtonCloseSession": "Zapri odprto sejo",
"ButtonCollections": "Zbirke", "ButtonCollections": "Zbirke",
@@ -119,11 +121,13 @@
"HeaderAccount": "Račun", "HeaderAccount": "Račun",
"HeaderAddCustomMetadataProvider": "Dodaj ponudnika metapodatkov po meri", "HeaderAddCustomMetadataProvider": "Dodaj ponudnika metapodatkov po meri",
"HeaderAdvanced": "Napredno", "HeaderAdvanced": "Napredno",
"HeaderApiKeys": "API ključi",
"HeaderAppriseNotificationSettings": "Nastavitve obvestil Apprise", "HeaderAppriseNotificationSettings": "Nastavitve obvestil Apprise",
"HeaderAudioTracks": "Zvočni posnetki", "HeaderAudioTracks": "Zvočni posnetki",
"HeaderAudiobookTools": "Orodja za upravljanje datotek zvočnih knjig", "HeaderAudiobookTools": "Orodja za upravljanje datotek zvočnih knjig",
"HeaderAuthentication": "Avtentikacija", "HeaderAuthentication": "Avtentikacija",
"HeaderBackups": "Varnostne kopije", "HeaderBackups": "Varnostne kopije",
"HeaderBulkChapterModal": "Dodaj več poglavij",
"HeaderChangePassword": "Zamenjaj geslo", "HeaderChangePassword": "Zamenjaj geslo",
"HeaderChapters": "Poglavja", "HeaderChapters": "Poglavja",
"HeaderChooseAFolder": "Izberite mapo", "HeaderChooseAFolder": "Izberite mapo",
@@ -162,6 +166,7 @@
"HeaderMetadataOrderOfPrecedence": "Vrstni red metapodatkov", "HeaderMetadataOrderOfPrecedence": "Vrstni red metapodatkov",
"HeaderMetadataToEmbed": "Metapodatki za vdelavo", "HeaderMetadataToEmbed": "Metapodatki za vdelavo",
"HeaderNewAccount": "Nov račun", "HeaderNewAccount": "Nov račun",
"HeaderNewApiKey": "Nov API ključ",
"HeaderNewLibrary": "Nova knjižnica", "HeaderNewLibrary": "Nova knjižnica",
"HeaderNotificationCreate": "Ustvari obvestilo", "HeaderNotificationCreate": "Ustvari obvestilo",
"HeaderNotificationUpdate": "Posodobi obvestilo", "HeaderNotificationUpdate": "Posodobi obvestilo",
@@ -195,6 +200,7 @@
"HeaderSettingsExperimental": "Eksperimentalne funkcije", "HeaderSettingsExperimental": "Eksperimentalne funkcije",
"HeaderSettingsGeneral": "Splošno", "HeaderSettingsGeneral": "Splošno",
"HeaderSettingsScanner": "Pregledovalnik", "HeaderSettingsScanner": "Pregledovalnik",
"HeaderSettingsSecurity": "Varnost",
"HeaderSettingsWebClient": "Spletni odjemalec", "HeaderSettingsWebClient": "Spletni odjemalec",
"HeaderSleepTimer": "Časovnik za izklop", "HeaderSleepTimer": "Časovnik za izklop",
"HeaderStatsLargestItems": "Največji elementi", "HeaderStatsLargestItems": "Največji elementi",
@@ -206,6 +212,7 @@
"HeaderTableOfContents": "Kazalo", "HeaderTableOfContents": "Kazalo",
"HeaderTools": "Orodja", "HeaderTools": "Orodja",
"HeaderUpdateAccount": "Posodobi račun", "HeaderUpdateAccount": "Posodobi račun",
"HeaderUpdateApiKey": "Posodobi API ključ",
"HeaderUpdateAuthor": "Posodobi avtorja", "HeaderUpdateAuthor": "Posodobi avtorja",
"HeaderUpdateDetails": "Posodobi podrobnosti", "HeaderUpdateDetails": "Posodobi podrobnosti",
"HeaderUpdateLibrary": "Posodobi knjižnico", "HeaderUpdateLibrary": "Posodobi knjižnico",
@@ -235,6 +242,10 @@
"LabelAllUsersExcludingGuests": "Vsi uporabniki razen gosti", "LabelAllUsersExcludingGuests": "Vsi uporabniki razen gosti",
"LabelAllUsersIncludingGuests": "Vsi uporabniki vključno z gosti", "LabelAllUsersIncludingGuests": "Vsi uporabniki vključno z gosti",
"LabelAlreadyInYourLibrary": "Že v tvoji knjižnici", "LabelAlreadyInYourLibrary": "Že v tvoji knjižnici",
"LabelApiKeyCreated": "API ključ \"{0}\" je uspešno ustvarjen.",
"LabelApiKeyCreatedDescription": "Ne pozabite takoj kopirati API ključ, saj ga kasneje ne boste mogli več videti.",
"LabelApiKeyUser": "Izvedi v imenu uporabnika",
"LabelApiKeyUserDescription": "Ta API ključ bo imel enaka dovoljenja kot uporabnik, v imenu katerega deluje. V dnevnikih bo to prikazano enako, kot če bi zahtevo oddal uporabnik.",
"LabelApiToken": "API žeton", "LabelApiToken": "API žeton",
"LabelAppend": "Priloži", "LabelAppend": "Priloži",
"LabelAudioBitrate": "Avdio bitna hitrost (npr. 128k)", "LabelAudioBitrate": "Avdio bitna hitrost (npr. 128k)",
@@ -284,6 +295,7 @@
"LabelContinueListening": "Nadaljuj poslušanje", "LabelContinueListening": "Nadaljuj poslušanje",
"LabelContinueReading": "Nadaljuj branje", "LabelContinueReading": "Nadaljuj branje",
"LabelContinueSeries": "Nadaljuj s serijo", "LabelContinueSeries": "Nadaljuj s serijo",
"LabelCorsAllowed": "Dovoljeni CORS viri",
"LabelCover": "Naslovnica", "LabelCover": "Naslovnica",
"LabelCoverImageURL": "URL naslovne slike", "LabelCoverImageURL": "URL naslovne slike",
"LabelCoverProvider": "Ponudnik naslovnic", "LabelCoverProvider": "Ponudnik naslovnic",
@@ -297,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Izbriši iz datotečnega sistema (počisti polje, če želiš odstraniti samo iz zbirke podatkov)", "LabelDeleteFromFileSystemCheckbox": "Izbriši iz datotečnega sistema (počisti polje, če želiš odstraniti samo iz zbirke podatkov)",
"LabelDescription": "Opis", "LabelDescription": "Opis",
"LabelDeselectAll": "Odznači vse", "LabelDeselectAll": "Odznači vse",
"LabelDetectedPattern": "Zaznan vzorec:",
"LabelDevice": "Naprava", "LabelDevice": "Naprava",
"LabelDeviceInfo": "Podatki o napravi", "LabelDeviceInfo": "Podatki o napravi",
"LabelDeviceIsAvailableTo": "Naprava je na voljo za...", "LabelDeviceIsAvailableTo": "Naprava je na voljo za...",
@@ -346,6 +359,10 @@
"LabelExample": "Primer", "LabelExample": "Primer",
"LabelExpandSeries": "Razširi serije", "LabelExpandSeries": "Razširi serije",
"LabelExpandSubSeries": "Razširi podserije", "LabelExpandSubSeries": "Razširi podserije",
"LabelExpired": "Potekel",
"LabelExpiresAt": "Peteče ob",
"LabelExpiresInSeconds": "Poteče čez (sekunde)",
"LabelExpiresNever": "Nikoli",
"LabelExplicit": "Eksplicitno", "LabelExplicit": "Eksplicitno",
"LabelExplicitChecked": "Eksplicitno (omogočeno)", "LabelExplicitChecked": "Eksplicitno (omogočeno)",
"LabelExplicitUnchecked": "Ne eksplicitno (onemogočeno)", "LabelExplicitUnchecked": "Ne eksplicitno (onemogočeno)",
@@ -361,6 +378,7 @@
"LabelFilterByUser": "Filtriraj po uporabniku", "LabelFilterByUser": "Filtriraj po uporabniku",
"LabelFindEpisodes": "Poišči epizode", "LabelFindEpisodes": "Poišči epizode",
"LabelFinished": "Zaključeno", "LabelFinished": "Zaključeno",
"LabelFinishedDate": "Končano {0}",
"LabelFolder": "Mapa", "LabelFolder": "Mapa",
"LabelFolders": "Mape", "LabelFolders": "Mape",
"LabelFontBold": "Krepko", "LabelFontBold": "Krepko",
@@ -405,6 +423,7 @@
"LabelLanguages": "Jeziki", "LabelLanguages": "Jeziki",
"LabelLastBookAdded": "Zadnja dodana knjiga", "LabelLastBookAdded": "Zadnja dodana knjiga",
"LabelLastBookUpdated": "Zadnja posodobljena knjiga", "LabelLastBookUpdated": "Zadnja posodobljena knjiga",
"LabelLastProgressDate": "Zadnji napredek: {0}",
"LabelLastSeen": "Nazadnje viden", "LabelLastSeen": "Nazadnje viden",
"LabelLastTime": "Nazadnje", "LabelLastTime": "Nazadnje",
"LabelLastUpdate": "Zadnja posodobitev", "LabelLastUpdate": "Zadnja posodobitev",
@@ -417,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Ne {0}", "LabelLibraryFilterSublistEmpty": "Ne {0}",
"LabelLibraryItem": "Element knjižnice", "LabelLibraryItem": "Element knjižnice",
"LabelLibraryName": "Ime knjižnice", "LabelLibraryName": "Ime knjižnice",
"LabelLibrarySortByProgress": "Napredek: Nazadnje posodobljen",
"LabelLibrarySortByProgressFinished": "Napredej: Končano",
"LabelLibrarySortByProgressStarted": "Napredek: Začeto",
"LabelLimit": "Omejitev", "LabelLimit": "Omejitev",
"LabelLineSpacing": "Vrstični razmak", "LabelLineSpacing": "Vrstični razmak",
"LabelListenAgain": "Poslušaj znova", "LabelListenAgain": "Poslušaj znova",
@@ -425,6 +447,7 @@
"LabelLogLevelWarn": "Opozoritve", "LabelLogLevelWarn": "Opozoritve",
"LabelLookForNewEpisodesAfterDate": "Poiščite nove epizode po tem datumu", "LabelLookForNewEpisodesAfterDate": "Poiščite nove epizode po tem datumu",
"LabelLowestPriority": "Najnižja prioriteta", "LabelLowestPriority": "Najnižja prioriteta",
"LabelMatchConfidence": "Zaupanje",
"LabelMatchExistingUsersBy": "Poveži obstoječe uporabnike po", "LabelMatchExistingUsersBy": "Poveži obstoječe uporabnike po",
"LabelMatchExistingUsersByDescription": "Uporablja se za povezovanje obstoječih uporabnikov. Ko se vzpostavi povezava, se bodo uporabniki ujemali z enoličnim ID-jem vašega ponudnika SSO", "LabelMatchExistingUsersByDescription": "Uporablja se za povezovanje obstoječih uporabnikov. Ko se vzpostavi povezava, se bodo uporabniki ujemali z enoličnim ID-jem vašega ponudnika SSO",
"LabelMaxEpisodesToDownload": "Največje število epizod za prenos. Uporabite 0 za neomejeno.", "LabelMaxEpisodesToDownload": "Največje število epizod za prenos. Uporabite 0 za neomejeno.",
@@ -454,7 +477,9 @@
"LabelNewestAuthors": "Najnovejši avtorji", "LabelNewestAuthors": "Najnovejši avtorji",
"LabelNewestEpisodes": "Najnovejše epizode", "LabelNewestEpisodes": "Najnovejše epizode",
"LabelNextBackupDate": "Naslednji datum varnostnega kopiranja", "LabelNextBackupDate": "Naslednji datum varnostnega kopiranja",
"LabelNextChapters": "Naslednja poglavja bodo:",
"LabelNextScheduledRun": "Naslednji načrtovani zagon", "LabelNextScheduledRun": "Naslednji načrtovani zagon",
"LabelNoApiKeys": "Ni API ključev",
"LabelNoCustomMetadataProviders": "Ni ponudnikov metapodatkov po meri", "LabelNoCustomMetadataProviders": "Ni ponudnikov metapodatkov po meri",
"LabelNoEpisodesSelected": "Izbrana ni nobena epizoda", "LabelNoEpisodesSelected": "Izbrana ni nobena epizoda",
"LabelNotFinished": "Ni dokončano", "LabelNotFinished": "Ni dokončano",
@@ -470,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Največja velikost čakalne vrste za dogodke obvestil", "LabelNotificationsMaxQueueSize": "Največja velikost čakalne vrste za dogodke obvestil",
"LabelNotificationsMaxQueueSizeHelp": "Dogodki so omejeni na sprožitev 1 na sekundo. Dogodki bodo prezrti, če je čakalna vrsta najvišja. To preprečuje neželeno pošiljanje obvestil.", "LabelNotificationsMaxQueueSizeHelp": "Dogodki so omejeni na sprožitev 1 na sekundo. Dogodki bodo prezrti, če je čakalna vrsta najvišja. To preprečuje neželeno pošiljanje obvestil.",
"LabelNumberOfBooks": "Število knjig", "LabelNumberOfBooks": "Število knjig",
"LabelNumberOfChapters": "Število poglavij:",
"LabelNumberOfEpisodes": "# epizod", "LabelNumberOfEpisodes": "# epizod",
"LabelOpenIDAdvancedPermsClaimDescription": "Ime zahtevka OpenID, ki vsebuje napredna dovoljenja za uporabniška dejanja v aplikaciji, ki bodo veljala za neskrbniške vloge (<b>če je konfigurirano</b>). Če trditev manjka v odgovoru, bo dostop do ABS zavrnjen. Če ena možnost manjka, bo obravnavana kot <code>false</code>. Zagotovite, da se zahtevek ponudnika identitete ujema s pričakovano strukturo:", "LabelOpenIDAdvancedPermsClaimDescription": "Ime zahtevka OpenID, ki vsebuje napredna dovoljenja za uporabniška dejanja v aplikaciji, ki bodo veljala za neskrbniške vloge (<b>če je konfigurirano</b>). Če trditev manjka v odgovoru, bo dostop do ABS zavrnjen. Če ena možnost manjka, bo obravnavana kot <code>false</code>. Zagotovite, da se zahtevek ponudnika identitete ujema s pričakovano strukturo:",
"LabelOpenIDClaims": "Pustite naslednje možnosti prazne, da onemogočite napredno dodeljevanje skupin in dovoljenj, nato pa samodejno dodelite skupino 'Uporabnik'.", "LabelOpenIDClaims": "Pustite naslednje možnosti prazne, da onemogočite napredno dodeljevanje skupin in dovoljenj, nato pa samodejno dodelite skupino 'Uporabnik'.",
@@ -544,6 +570,7 @@
"LabelSelectAll": "Izberite vse", "LabelSelectAll": "Izberite vse",
"LabelSelectAllEpisodes": "Izberite vse epizode", "LabelSelectAllEpisodes": "Izberite vse epizode",
"LabelSelectEpisodesShowing": "Izberi {0} prikazanih epizod", "LabelSelectEpisodesShowing": "Izberi {0} prikazanih epizod",
"LabelSelectUser": "Izberi uporabnika",
"LabelSelectUsers": "Izberite uporabnike", "LabelSelectUsers": "Izberite uporabnike",
"LabelSendEbookToDevice": "Pošlji eknjigo k...", "LabelSendEbookToDevice": "Pošlji eknjigo k...",
"LabelSequence": "Zaporedje", "LabelSequence": "Zaporedje",
@@ -611,6 +638,7 @@
"LabelStartTime": "Čas začetka", "LabelStartTime": "Čas začetka",
"LabelStarted": "Začeto", "LabelStarted": "Začeto",
"LabelStartedAt": "Začeto ob", "LabelStartedAt": "Začeto ob",
"LabelStartedDate": "Začeto {0}",
"LabelStatsAudioTracks": "Zvočni posnetki", "LabelStatsAudioTracks": "Zvočni posnetki",
"LabelStatsAuthors": "Avtorji", "LabelStatsAuthors": "Avtorji",
"LabelStatsBestDay": "Najboljši dan", "LabelStatsBestDay": "Najboljši dan",
@@ -640,6 +668,7 @@
"LabelTheme": "Tema", "LabelTheme": "Tema",
"LabelThemeDark": "Temna", "LabelThemeDark": "Temna",
"LabelThemeLight": "Svetla", "LabelThemeLight": "Svetla",
"LabelThemeSepia": "Sepija",
"LabelTimeBase": "Osnovni čas", "LabelTimeBase": "Osnovni čas",
"LabelTimeDurationXHours": "{0} ur", "LabelTimeDurationXHours": "{0} ur",
"LabelTimeDurationXMinutes": "{0} minut", "LabelTimeDurationXMinutes": "{0} minut",
@@ -708,7 +737,9 @@
"MessageAddToPlayerQueue": "Dodaj v čakalno vrsto predvajalnika", "MessageAddToPlayerQueue": "Dodaj v čakalno vrsto predvajalnika",
"MessageAppriseDescription": "Če želite uporabljati to funkcijo, morate imeti zagnano namestitev <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">API Apprise</a> ali API, ki bo obravnavala te iste zahteve. <br />Url API-ja Apprise mora biti celotna pot URL-ja za pošiljanje obvestila, npr. če je vaša namestitev API-ja postrežena na <code>http://192.168.1.1:8337</code>, bi morali vnesti <code >http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "Če želite uporabljati to funkcijo, morate imeti zagnano namestitev <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">API Apprise</a> ali API, ki bo obravnavala te iste zahteve. <br />Url API-ja Apprise mora biti celotna pot URL-ja za pošiljanje obvestila, npr. če je vaša namestitev API-ja postrežena na <code>http://192.168.1.1:8337</code>, bi morali vnesti <code >http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Prepričajte se, da uporabljate ASIN iz pravilne zvočne regije, ne iz Amazona.", "MessageAsinCheck": "Prepričajte se, da uporabljate ASIN iz pravilne zvočne regije, ne iz Amazona.",
"MessageAuthenticationLegacyTokenWarning": "Zastareli API žetoni bodo v prihodnosti odstranjeni. Namesto tega uporabite <a href=\"/config/api-keys\">API ključe</a>.",
"MessageAuthenticationOIDCChangesRestart": "Za uveljavitev OIDC sprememb, po shranjevanju znova zaženite strežnik.", "MessageAuthenticationOIDCChangesRestart": "Za uveljavitev OIDC sprememb, po shranjevanju znova zaženite strežnik.",
"MessageAuthenticationSecurityMessage": "Zaradi varnosti je bila izboljšana avtentikacija. Vsi uporabniki se morajo ponovno prijaviti.",
"MessageBackupsDescription": "Varnostne kopije vključujejo uporabnike, napredek uporabnikov, podrobnosti elementov knjižnice, nastavitve strežnika in slike, shranjene v <code>/metadata/items</code> & <code>/metadata/authors</code>. Varnostne kopije <strong>ne</strong> vključujejo datotek, shranjenih v mapah vaše knjižnice.", "MessageBackupsDescription": "Varnostne kopije vključujejo uporabnike, napredek uporabnikov, podrobnosti elementov knjižnice, nastavitve strežnika in slike, shranjene v <code>/metadata/items</code> & <code>/metadata/authors</code>. Varnostne kopije <strong>ne</strong> vključujejo datotek, shranjenih v mapah vaše knjižnice.",
"MessageBackupsLocationEditNote": "Opomba: Posodabljanje lokacije varnostne kopije ne bo premaknilo ali spremenilo obstoječih varnostnih kopij", "MessageBackupsLocationEditNote": "Opomba: Posodabljanje lokacije varnostne kopije ne bo premaknilo ali spremenilo obstoječih varnostnih kopij",
"MessageBackupsLocationNoEditNote": "Opomba: Lokacija varnostne kopije je nastavljena s spremenljivko okolja in je tu ni mogoče spremeniti.", "MessageBackupsLocationNoEditNote": "Opomba: Lokacija varnostne kopije je nastavljena s spremenljivko okolja in je tu ni mogoče spremeniti.",
@@ -722,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Ni rezultatov za filter \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Ni rezultatov za filter \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Ni rezultatov za poizvedbo", "MessageBookshelfNoResultsForQuery": "Ni rezultatov za poizvedbo",
"MessageBookshelfNoSeries": "Nimate serij", "MessageBookshelfNoSeries": "Nimate serij",
"MessageBulkChapterPattern": "Koliko poglavij želite dodati s tem vzorcem oštevilčenja?",
"MessageChapterEndIsAfter": "Konec poglavja je po koncu zvočne knjige", "MessageChapterEndIsAfter": "Konec poglavja je po koncu zvočne knjige",
"MessageChapterErrorFirstNotZero": "Prvo poglavje se mora začeti pri 0", "MessageChapterErrorFirstNotZero": "Prvo poglavje se mora začeti pri 0",
"MessageChapterErrorStartGteDuration": "Neveljaven začetni čas, mora biti krajši od trajanja zvočne knjige", "MessageChapterErrorStartGteDuration": "Neveljaven začetni čas, mora biti krajši od trajanja zvočne knjige",
@@ -730,6 +762,7 @@
"MessageChaptersNotFound": "Poglavij ni bilo najdenih", "MessageChaptersNotFound": "Poglavij ni bilo najdenih",
"MessageCheckingCron": "Preverjam cron...", "MessageCheckingCron": "Preverjam cron...",
"MessageConfirmCloseFeed": "Ali ste prepričani, da želite zapreti ta vir?", "MessageConfirmCloseFeed": "Ali ste prepričani, da želite zapreti ta vir?",
"MessageConfirmDeleteApiKey": "Ali ste prepričani, da želite izbrisati API ključ \"{0}\"?",
"MessageConfirmDeleteBackup": "Ali ste prepričani, da želite izbrisati varnostno kopijo za {0}?", "MessageConfirmDeleteBackup": "Ali ste prepričani, da želite izbrisati varnostno kopijo za {0}?",
"MessageConfirmDeleteDevice": "Ali ste prepričani, da želite izbrisati e-bralnik \"{0}\"?", "MessageConfirmDeleteDevice": "Ali ste prepričani, da želite izbrisati e-bralnik \"{0}\"?",
"MessageConfirmDeleteFile": "To bo izbrisalo datoteko iz vašega datotečnega sistema. Ali ste prepričani?", "MessageConfirmDeleteFile": "To bo izbrisalo datoteko iz vašega datotečnega sistema. Ali ste prepričani?",
@@ -783,6 +816,8 @@
"MessageFeedURLWillBe": "URL vira bo {0}", "MessageFeedURLWillBe": "URL vira bo {0}",
"MessageFetching": "Pridobivam...", "MessageFetching": "Pridobivam...",
"MessageForceReScanDescription": "bo znova pregledal vse datoteke kot pregled od začetka. Oznake ID3 zvočnih datotek, datoteke OPF in besedilne datoteke bodo pregledane kot nove.", "MessageForceReScanDescription": "bo znova pregledal vse datoteke kot pregled od začetka. Oznake ID3 zvočnih datotek, datoteke OPF in besedilne datoteke bodo pregledane kot nove.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} posluša</strong> na {1}",
"MessageHeatmapNoListeningSessions": "Ni sej poslušanj na {0}",
"MessageImportantNotice": "Pomembno obvestilo!", "MessageImportantNotice": "Pomembno obvestilo!",
"MessageInsertChapterBelow": "Spodaj vstavite poglavje", "MessageInsertChapterBelow": "Spodaj vstavite poglavje",
"MessageInvalidAsin": "Neveljaven ASIN", "MessageInvalidAsin": "Neveljaven ASIN",
@@ -922,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Sproži se, ko so samodejni prenosi epizod onemogočeni zaradi preveč neuspelih poskusov", "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", "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",
"PlaceholderBulkChapterInput": "Vnesite naslov poglavja ali uporabite oštevilčenje (npr. 'Epizoda 1', 'Poglavje 10', '1.')",
"PlaceholderNewCollection": "Novo ime zbirke", "PlaceholderNewCollection": "Novo ime zbirke",
"PlaceholderNewFolderPath": "Pot nove mape", "PlaceholderNewFolderPath": "Pot nove mape",
"PlaceholderNewPlaylist": "Novo ime seznama predvajanja", "PlaceholderNewPlaylist": "Novo ime seznama predvajanja",
@@ -975,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Zaznamka ni bilo mogoče ustvariti", "ToastBookmarkCreateFailed": "Zaznamka ni bilo mogoče ustvariti",
"ToastBookmarkCreateSuccess": "Zaznamek dodan", "ToastBookmarkCreateSuccess": "Zaznamek dodan",
"ToastBookmarkRemoveSuccess": "Zaznamek odstranjen", "ToastBookmarkRemoveSuccess": "Zaznamek odstranjen",
"ToastBulkChapterInvalidCount": "Vnesite število med 1 in 150",
"ToastCachePurgeFailed": "Čiščenje predpomnilnika ni uspelo", "ToastCachePurgeFailed": "Čiščenje predpomnilnika ni uspelo",
"ToastCachePurgeSuccess": "Predpomnilnik je bil uspešno očiščen", "ToastCachePurgeSuccess": "Predpomnilnik je bil uspešno očiščen",
"ToastChapterLocked": "Poglavje je zaklenjeno.",
"ToastChapterStartTimeAdjusted": "Začetni čas poglavja je bil prilagojen za {0} sekund",
"ToastChaptersAllLocked": "Vsa poglavja so zaklenjena. Odklenite nekatera poglavja, da premaknete njihove čase.",
"ToastChaptersHaveErrors": "Poglavja imajo napake", "ToastChaptersHaveErrors": "Poglavja imajo napake",
"ToastChaptersInvalidShiftAmountLast": "Neveljavna vrednost zamika. Začetni čas zadnjega poglavja bi presegel trajanje te zvočne knjige.", "ToastChaptersInvalidShiftAmountLast": "Neveljavna vrednost zamika. Začetni čas zadnjega poglavja bi presegel trajanje te zvočne knjige.",
"ToastChaptersInvalidShiftAmountStart": "Neveljavna vrednost zamika. Prvo poglavje bi imelo ničelno ali negativno dolžino in bi ga prepisalo drugo poglavje. Povečajte začetno trajanje drugega poglavja.", "ToastChaptersInvalidShiftAmountStart": "Neveljavna vrednost zamika. Prvo poglavje bi imelo ničelno ali negativno dolžino in bi ga prepisalo drugo poglavje. Povečajte začetno trajanje drugega poglavja.",
@@ -1001,6 +1041,8 @@
"ToastEpisodeDownloadQueueClearSuccess": "Čakalna vrsta za prenos epizod je počiščena", "ToastEpisodeDownloadQueueClearSuccess": "Čakalna vrsta za prenos epizod je počiščena",
"ToastEpisodeUpdateSuccess": "Število posodobljenih epizod: {0}", "ToastEpisodeUpdateSuccess": "Število posodobljenih epizod: {0}",
"ToastErrorCannotShare": "V tej napravi ni mogoče dati v skupno rabo", "ToastErrorCannotShare": "V tej napravi ni mogoče dati v skupno rabo",
"ToastFailedToCreate": "Ustvarjanje ni bilo uspešno",
"ToastFailedToDelete": "Brisanje ni bilo uspešno",
"ToastFailedToLoadData": "Podatkov ni bilo mogoče naložiti", "ToastFailedToLoadData": "Podatkov ni bilo mogoče naložiti",
"ToastFailedToMatch": "Ujemanje ni uspelo", "ToastFailedToMatch": "Ujemanje ni uspelo",
"ToastFailedToShare": "Skupna raba ni uspela", "ToastFailedToShare": "Skupna raba ni uspela",
@@ -1008,6 +1050,7 @@
"ToastInvalidImageUrl": "Neveljaven URL slike", "ToastInvalidImageUrl": "Neveljaven URL slike",
"ToastInvalidMaxEpisodesToDownload": "Neveljavno največje število epizod za prenos", "ToastInvalidMaxEpisodesToDownload": "Neveljavno največje število epizod za prenos",
"ToastInvalidUrl": "Neveljaven URL", "ToastInvalidUrl": "Neveljaven URL",
"ToastInvalidUrls": "Eden ali več URL-jev je neveljavnih",
"ToastItemCoverUpdateSuccess": "Naslovnica elementa je bila posodobljena", "ToastItemCoverUpdateSuccess": "Naslovnica elementa je bila posodobljena",
"ToastItemDeletedFailed": "Elementa ni bilo mogoče izbrisati", "ToastItemDeletedFailed": "Elementa ni bilo mogoče izbrisati",
"ToastItemDeletedSuccess": "Element je bil izbrisan", "ToastItemDeletedSuccess": "Element je bil izbrisan",
@@ -1032,6 +1075,7 @@
"ToastMustHaveAtLeastOnePath": "Imeti mora vsaj eno pot", "ToastMustHaveAtLeastOnePath": "Imeti mora vsaj eno pot",
"ToastNameEmailRequired": "Ime in e-pošta sta obvezna", "ToastNameEmailRequired": "Ime in e-pošta sta obvezna",
"ToastNameRequired": "Ime je obvezno", "ToastNameRequired": "Ime je obvezno",
"ToastNewApiKeyUserError": "Morate izbrati uporabnika",
"ToastNewEpisodesFound": "Število najdenih novih epizod: {0}", "ToastNewEpisodesFound": "Število najdenih novih epizod: {0}",
"ToastNewUserCreatedFailed": "Računa ni bilo mogoče ustvariti: \"{0}\"", "ToastNewUserCreatedFailed": "Računa ni bilo mogoče ustvariti: \"{0}\"",
"ToastNewUserCreatedSuccess": "Nov račun je bil ustvarjen", "ToastNewUserCreatedSuccess": "Nov račun je bil ustvarjen",
@@ -1056,6 +1100,7 @@
"ToastPlaylistUpdateSuccess": "Seznam predvajanja je bil posodobljen", "ToastPlaylistUpdateSuccess": "Seznam predvajanja je bil posodobljen",
"ToastPodcastCreateFailed": "Podcasta ni bilo mogoče ustvariti", "ToastPodcastCreateFailed": "Podcasta ni bilo mogoče ustvariti",
"ToastPodcastCreateSuccess": "Podcast je bil uspešno ustvarjen", "ToastPodcastCreateSuccess": "Podcast je bil uspešno ustvarjen",
"ToastPodcastEpisodeUpdated": "Epizoda je bila posodobljena",
"ToastPodcastGetFeedFailed": "Vira podcasta ni bilo mogoče pridobiti", "ToastPodcastGetFeedFailed": "Vira podcasta ni bilo mogoče pridobiti",
"ToastPodcastNoEpisodesInFeed": "V viru RSS ni bilo mogoče najti nobene epizode", "ToastPodcastNoEpisodesInFeed": "V viru RSS ni bilo mogoče najti nobene epizode",
"ToastPodcastNoRssFeed": "Podcast nima vira RSS", "ToastPodcastNoRssFeed": "Podcast nima vira RSS",
@@ -1106,5 +1151,13 @@
"ToastUserPasswordChangeSuccess": "Geslo je bilo uspešno spremenjeno", "ToastUserPasswordChangeSuccess": "Geslo je bilo uspešno spremenjeno",
"ToastUserPasswordMismatch": "Gesli se ne ujemata", "ToastUserPasswordMismatch": "Gesli se ne ujemata",
"ToastUserPasswordMustChange": "Novo geslo se ne sme ujemati s starim geslom", "ToastUserPasswordMustChange": "Novo geslo se ne sme ujemati s starim geslom",
"ToastUserRootRequireName": "Vnesti morate korensko uporabniško ime" "ToastUserRootRequireName": "Vnesti morate korensko uporabniško ime",
"TooltipAddChapters": "Dodaj poglavje(-a)",
"TooltipAddOneSecond": "Dodaj 1 sekundo",
"TooltipAdjustChapterStart": "Kliknite za prilagoditev začetnega časa",
"TooltipLockAllChapters": "Zakleni vsa poglavja",
"TooltipLockChapter": "Zakleni poglavje (Shift+klik za obseg)",
"TooltipSubtractOneSecond": "Odštej 1 sekundo",
"TooltipUnlockAllChapters": "Odkleni vsa poglavja",
"TooltipUnlockChapter": "Odkleni poglavje (Shift+klik za obseg)"
} }
+87 -28
View File
@@ -104,9 +104,9 @@
"ButtonStartM4BEncode": "Starta M4B-omkodning", "ButtonStartM4BEncode": "Starta M4B-omkodning",
"ButtonStartMetadataEmbed": "Infoga metadata", "ButtonStartMetadataEmbed": "Infoga metadata",
"ButtonStats": "Statistik", "ButtonStats": "Statistik",
"ButtonSubmit": "Skicka", "ButtonSubmit": "Spara",
"ButtonTest": "Testa", "ButtonTest": "Testa",
"ButtonUnlinkOpenId": "Koppla från OpenID", "ButtonUnlinkOpenId": "Koppla ifrån OpenID",
"ButtonUpload": "Ladda upp", "ButtonUpload": "Ladda upp",
"ButtonUploadBackup": "Läs in säkerhetskopia", "ButtonUploadBackup": "Läs in säkerhetskopia",
"ButtonUploadCover": "Ladda upp omslag", "ButtonUploadCover": "Ladda upp omslag",
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Hantering av ljudboksfiler", "HeaderAudiobookTools": "Hantering av ljudboksfiler",
"HeaderAuthentication": "Autentisering", "HeaderAuthentication": "Autentisering",
"HeaderBackups": "Säkerhetskopior", "HeaderBackups": "Säkerhetskopior",
"HeaderBulkChapterModal": "Addera flera kapitel",
"HeaderChangePassword": "Ändra lösenord", "HeaderChangePassword": "Ändra lösenord",
"HeaderChapters": "Kapitel", "HeaderChapters": "Kapitel",
"HeaderChooseAFolder": "Välj en mapp", "HeaderChooseAFolder": "Välj en mapp",
@@ -181,6 +182,7 @@
"HeaderPlaylist": "Spellista", "HeaderPlaylist": "Spellista",
"HeaderPlaylistItems": "Böcker i spellistan", "HeaderPlaylistItems": "Böcker i spellistan",
"HeaderPodcastsToAdd": "Podcaster att lägga till", "HeaderPodcastsToAdd": "Podcaster att lägga till",
"HeaderPresets": "Förinställningar",
"HeaderPreviewCover": "Förhandsgranska omslag", "HeaderPreviewCover": "Förhandsgranska omslag",
"HeaderRSSFeedGeneral": "RSS-information", "HeaderRSSFeedGeneral": "RSS-information",
"HeaderRSSFeedIsOpen": "RSS-flödet är öppet", "HeaderRSSFeedIsOpen": "RSS-flödet är öppet",
@@ -198,6 +200,7 @@
"HeaderSettingsExperimental": "Experimentella funktioner", "HeaderSettingsExperimental": "Experimentella funktioner",
"HeaderSettingsGeneral": "Allmänt", "HeaderSettingsGeneral": "Allmänt",
"HeaderSettingsScanner": "Skanner", "HeaderSettingsScanner": "Skanner",
"HeaderSettingsSecurity": "Säkerhet",
"HeaderSettingsWebClient": "Webklient", "HeaderSettingsWebClient": "Webklient",
"HeaderSleepTimer": "Timer för att sova", "HeaderSleepTimer": "Timer för att sova",
"HeaderStatsLargestItems": "Största objekten", "HeaderStatsLargestItems": "Största objekten",
@@ -241,6 +244,7 @@
"LabelAlreadyInYourLibrary": "Finns redan i samlingen", "LabelAlreadyInYourLibrary": "Finns redan i samlingen",
"LabelApiKeyCreated": "API-nyckel \"{0}\" har adderats.", "LabelApiKeyCreated": "API-nyckel \"{0}\" har adderats.",
"LabelApiKeyCreatedDescription": "Se till att kopiera API-nyckeln omedelbart eftersom du inte kommer att kunna se den igen.", "LabelApiKeyCreatedDescription": "Se till att kopiera API-nyckeln omedelbart eftersom du inte kommer att kunna se den igen.",
"LabelApiKeyUser": "Utför på uppdrag av användare",
"LabelApiKeyUserDescription": "Denna API-nyckel kommer att ha samma behörigheter som användaren den agerar på uppdrag av. Detta kommer att visas på samma sätt i loggarna som om användaren gjorde begäran.", "LabelApiKeyUserDescription": "Denna API-nyckel kommer att ha samma behörigheter som användaren den agerar på uppdrag av. Detta kommer att visas på samma sätt i loggarna som om användaren gjorde begäran.",
"LabelApiToken": "API-token", "LabelApiToken": "API-token",
"LabelAppend": "Lägg till", "LabelAppend": "Lägg till",
@@ -291,12 +295,13 @@
"LabelContinueListening": "Fortsätt att lyssna", "LabelContinueListening": "Fortsätt att lyssna",
"LabelContinueReading": "Fortsätt att läsa", "LabelContinueReading": "Fortsätt att läsa",
"LabelContinueSeries": "Fortsätt med serien", "LabelContinueSeries": "Fortsätt med serien",
"LabelCorsAllowed": "Godkänd CORS Origins",
"LabelCover": "Omslag", "LabelCover": "Omslag",
"LabelCoverImageURL": "URL till omslagsbild", "LabelCoverImageURL": "URL till omslagsbild",
"LabelCoverProvider": "Källa för omslag", "LabelCoverProvider": "Källa för omslag",
"LabelCreatedAt": "Skapad", "LabelCreatedAt": "Skapad",
"LabelCronExpression": "Schemaläggning med hjälp av Cron (Cron Expression)", "LabelCronExpression": "Schemaläggning med hjälp av Cron (Cron Expression)",
"LabelCurrent": "Nuvarande plats", "LabelCurrent": "Nuvarande",
"LabelCurrently": "För närvarande:", "LabelCurrently": "För närvarande:",
"LabelCustomCronExpression": "Anpassat Cron-uttryck:", "LabelCustomCronExpression": "Anpassat Cron-uttryck:",
"LabelDatetime": "Datum och klockslag", "LabelDatetime": "Datum och klockslag",
@@ -304,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Ta även bort från filsystem (avmarkera = raderar endast från databasen)", "LabelDeleteFromFileSystemCheckbox": "Ta även bort från filsystem (avmarkera = raderar endast från databasen)",
"LabelDescription": "Beskrivning", "LabelDescription": "Beskrivning",
"LabelDeselectAll": "Avmarkera alla", "LabelDeselectAll": "Avmarkera alla",
"LabelDetectedPattern": "Identifierat mönster:",
"LabelDevice": "Enhet", "LabelDevice": "Enhet",
"LabelDeviceInfo": "Enhetsinformation", "LabelDeviceInfo": "Enhetsinformation",
"LabelDeviceIsAvailableTo": "Enhet är tillgänglig för...", "LabelDeviceIsAvailableTo": "Enhet är tillgänglig för...",
@@ -325,9 +331,9 @@
"LabelEmail": "E-post", "LabelEmail": "E-post",
"LabelEmailSettingsFromAddress": "Från e-postadress", "LabelEmailSettingsFromAddress": "Från e-postadress",
"LabelEmailSettingsRejectUnauthorized": "Avvisa icke-autentiserade certifikat", "LabelEmailSettingsRejectUnauthorized": "Avvisa icke-autentiserade certifikat",
"LabelEmailSettingsRejectUnauthorizedHelp": "Inaktivering av SSL-certifikatsvalidering kan exponera din anslutning för säkerhetsrisker, som man-in-the-middle-attacker. Inaktivera bara denna inställning om du förstår implikationerna och litar på den epostserver du ansluter till.", "LabelEmailSettingsRejectUnauthorizedHelp": "Om valideringen av SSL-certifikat stängs av kan det exponera din anslutning för säkerhetsrisker, som attacker av typen 'man-in-the-middle'. Stäng endast av denna inställning om du förstår konsekvenserna och litar på den epostserver du är ansluten till.",
"LabelEmailSettingsSecure": "Säker", "LabelEmailSettingsSecure": "Säker",
"LabelEmailSettingsSecureHelp": "Om sant kommer anslutningen att använda TLS vid anslutning till servern. Om falskt används TLS om servern stöder STARTTLS-tillägget. I de flesta fall, om du ansluter till port 465, bör du ställa in detta värde till sant. För port 587 eller 25, låt det vara falskt. (från nodemailer.com/smtp/#authentication)", "LabelEmailSettingsSecureHelp": "Om aktiverad kommer anslutningen att använda TLS vid anslutning till servern. Annars används TLS om servern stöder STARTTLS-tillägget. I de flesta fall, om du ansluter till port 465, bör detta alternativ vara aktiverat. För port 587 eller 25, bör det vara avstängt. (från nodemailer.com/smtp/#authentication)",
"LabelEmailSettingsTestAddress": "E-postadress för test", "LabelEmailSettingsTestAddress": "E-postadress för test",
"LabelEmbeddedCover": "Infogat omslag", "LabelEmbeddedCover": "Infogat omslag",
"LabelEnable": "Aktivera", "LabelEnable": "Aktivera",
@@ -364,14 +370,15 @@
"LabelFeedURL": "URL-adress för flödet", "LabelFeedURL": "URL-adress för flödet",
"LabelFetchingMetadata": "Hämtar metadata", "LabelFetchingMetadata": "Hämtar metadata",
"LabelFile": "Fil", "LabelFile": "Fil",
"LabelFileBirthtime": "Tidpunkt, fil skapad", "LabelFileBirthtime": "Tidpunkt, adderad",
"LabelFileBornDate": "Skapad {0}", "LabelFileBornDate": "Skapad {0}",
"LabelFileModified": "Tidpunkt, fil ändrad", "LabelFileModified": "Tidpunkt, ändrad",
"LabelFileModifiedDate": "Ändrad {0}", "LabelFileModifiedDate": "Ändrad {0}",
"LabelFilename": "Filnamn", "LabelFilename": "Filnamn",
"LabelFilterByUser": "Välj användare", "LabelFilterByUser": "Välj användare",
"LabelFindEpisodes": "Sök avsnitt", "LabelFindEpisodes": "Sök avsnitt",
"LabelFinished": "Avslutad", "LabelFinished": "Avslutad",
"LabelFinishedDate": "Avslutad {0}",
"LabelFolder": "Mapp", "LabelFolder": "Mapp",
"LabelFolders": "Mappar", "LabelFolders": "Mappar",
"LabelFontBold": "Fetstil", "LabelFontBold": "Fetstil",
@@ -416,6 +423,7 @@
"LabelLanguages": "Språk", "LabelLanguages": "Språk",
"LabelLastBookAdded": "Bok senast adderad", "LabelLastBookAdded": "Bok senast adderad",
"LabelLastBookUpdated": "Bok senast uppdaterad", "LabelLastBookUpdated": "Bok senast uppdaterad",
"LabelLastProgressDate": "Senaste framsteg: {0}",
"LabelLastSeen": "Senast inloggad", "LabelLastSeen": "Senast inloggad",
"LabelLastTime": "Senaste tillfället", "LabelLastTime": "Senaste tillfället",
"LabelLastUpdate": "Senast uppdaterad", "LabelLastUpdate": "Senast uppdaterad",
@@ -428,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Ingen {0}", "LabelLibraryFilterSublistEmpty": "Ingen {0}",
"LabelLibraryItem": "Objekt", "LabelLibraryItem": "Objekt",
"LabelLibraryName": "Biblioteksnamn", "LabelLibraryName": "Biblioteksnamn",
"LabelLibrarySortByProgress": "Framsteg uppdaterat",
"LabelLibrarySortByProgressFinished": "Avslutsdag",
"LabelLibrarySortByProgressStarted": "Startdag",
"LabelLimit": "Begränsning", "LabelLimit": "Begränsning",
"LabelLineSpacing": "Radavstånd", "LabelLineSpacing": "Radavstånd",
"LabelListenAgain": "Lyssna igen", "LabelListenAgain": "Lyssna igen",
@@ -436,8 +447,9 @@
"LabelLogLevelWarn": "Varningar", "LabelLogLevelWarn": "Varningar",
"LabelLookForNewEpisodesAfterDate": "Sök efter nya avsnitt efter detta datum", "LabelLookForNewEpisodesAfterDate": "Sök efter nya avsnitt efter detta datum",
"LabelLowestPriority": "Lägst prioritet", "LabelLowestPriority": "Lägst prioritet",
"LabelMatchConfidence": "Förtroende",
"LabelMatchExistingUsersBy": "Matcha befintliga användare med", "LabelMatchExistingUsersBy": "Matcha befintliga användare med",
"LabelMatchExistingUsersByDescription": "Används för att koppla existerande användare. När kopplingen sker kommer användaren att matchas med ett unikt ID från SSO-leverantören.", "LabelMatchExistingUsersByDescription": "Används för att ansluta befintlig användare. När anslutningen sker kommer användaren att matchas med ett unikt ID från SSO-leverantören.",
"LabelMaxEpisodesToDownload": "Maximalt antal avsnitt att ladda ner (0 = obegränsat).", "LabelMaxEpisodesToDownload": "Maximalt antal avsnitt att ladda ner (0 = obegränsat).",
"LabelMaxEpisodesToDownloadPerCheck": "Maximalt antal nya avsnitt att ladda ner per tillfälle", "LabelMaxEpisodesToDownloadPerCheck": "Maximalt antal nya avsnitt att ladda ner per tillfälle",
"LabelMaxEpisodesToKeep": "Maximalt antal avsnitt att behålla", "LabelMaxEpisodesToKeep": "Maximalt antal avsnitt att behålla",
@@ -460,11 +472,12 @@
"LabelName": "Namn", "LabelName": "Namn",
"LabelNarrator": "Uppläsare", "LabelNarrator": "Uppläsare",
"LabelNarrators": "Uppläsare", "LabelNarrators": "Uppläsare",
"LabelNew": "Ny plats", "LabelNew": "Nytt",
"LabelNewPassword": "Nytt lösenord", "LabelNewPassword": "Nytt lösenord",
"LabelNewestAuthors": "Senaste författarna", "LabelNewestAuthors": "Senaste författarna",
"LabelNewestEpisodes": "Senaste avsnitten", "LabelNewestEpisodes": "Senaste avsnitten",
"LabelNextBackupDate": "Nästa tillfälle för säkerhetskopiering", "LabelNextBackupDate": "Nästa tillfälle för säkerhetskopiering",
"LabelNextChapters": "Nästa kapitel kommer att vara:",
"LabelNextScheduledRun": "Nästa schemalagda körning", "LabelNextScheduledRun": "Nästa schemalagda körning",
"LabelNoApiKeys": "Ingen API-nyckel", "LabelNoApiKeys": "Ingen API-nyckel",
"LabelNoCustomMetadataProviders": "Ingen egen källa för metadata", "LabelNoCustomMetadataProviders": "Ingen egen källa för metadata",
@@ -472,16 +485,17 @@
"LabelNotFinished": "Ej avslutad", "LabelNotFinished": "Ej avslutad",
"LabelNotStarted": "Ej påbörjad", "LabelNotStarted": "Ej påbörjad",
"LabelNotes": "Anteckningar", "LabelNotes": "Anteckningar",
"LabelNotificationAppriseURL": "Apprise URL(er)", "LabelNotificationAppriseURL": "Apprise URL-adress(er)",
"LabelNotificationAvailableVariables": "Tillgängliga variabler", "LabelNotificationAvailableVariables": "Tillgängliga variabler",
"LabelNotificationBodyTemplate": "Kroppsmall", "LabelNotificationBodyTemplate": "Kroppsmall",
"LabelNotificationEvent": "Aviseringshändelse", "LabelNotificationEvent": "Händelser som skickar ett meddelande",
"LabelNotificationTitleTemplate": "Titelsmall", "LabelNotificationTitleTemplate": "Titelsmall",
"LabelNotificationsMaxFailedAttempts": "Max antal misslyckade försök", "LabelNotificationsMaxFailedAttempts": "Max antal misslyckade försök",
"LabelNotificationsMaxFailedAttemptsHelp": "Aviseringar inaktiveras när de misslyckas med att skickas så många gånger", "LabelNotificationsMaxFailedAttemptsHelp": "Aviseringar inaktiveras när de misslyckas med att skickas så många gånger",
"LabelNotificationsMaxQueueSize": "Max köstorlek för aviseringsevenemang", "LabelNotificationsMaxQueueSize": "Max köstorlek för aviseringsevenemang",
"LabelNotificationsMaxQueueSizeHelp": "Evenemang är begränsade till att utlösa ett per sekund. Evenemang kommer att ignoreras om kön är full. Detta förhindrar aviseringsspam.", "LabelNotificationsMaxQueueSizeHelp": "Evenemang är begränsade till att utlösa ett per sekund. Evenemang kommer att ignoreras om kön är full. Detta förhindrar aviseringsspam.",
"LabelNumberOfBooks": "Antal böcker", "LabelNumberOfBooks": "Antal böcker",
"LabelNumberOfChapters": "Antal kapitel:",
"LabelNumberOfEpisodes": "# av Avsnitt", "LabelNumberOfEpisodes": "# av Avsnitt",
"LabelOpenIDAdvancedPermsClaimDescription": "Namn på OpenID-anspråket som innehåller avancerade behörigheter för användaråtgärder i applikationen, vilka gäller för icke-administratörsroller (<b>om konfigurerat</b>). Om anspråket saknas i svaret kommer åtkomst till ABS att nekas. Om ett enskilt alternativ saknas kommer det att behandlas som <code>falskt</code>. Se till att identitetsleverantörens anspråk matchar den förväntade strukturen:", "LabelOpenIDAdvancedPermsClaimDescription": "Namn på OpenID-anspråket som innehåller avancerade behörigheter för användaråtgärder i applikationen, vilka gäller för icke-administratörsroller (<b>om konfigurerat</b>). Om anspråket saknas i svaret kommer åtkomst till ABS att nekas. Om ett enskilt alternativ saknas kommer det att behandlas som <code>falskt</code>. Se till att identitetsleverantörens anspråk matchar den förväntade strukturen:",
"LabelOpenIDClaims": "Lämna följande alternativ tomma för att inaktivera avancerad grupp- och behörighetstilldelning, och tilldela då automatiskt gruppen 'Användare'.", "LabelOpenIDClaims": "Lämna följande alternativ tomma för att inaktivera avancerad grupp- och behörighetstilldelning, och tilldela då automatiskt gruppen 'Användare'.",
@@ -516,6 +530,7 @@
"LabelPrimaryEbook": "Primär e-bok", "LabelPrimaryEbook": "Primär e-bok",
"LabelProgress": "Framsteg", "LabelProgress": "Framsteg",
"LabelProvider": "Källa", "LabelProvider": "Källa",
"LabelProviderAuthorizationValue": "Värde för auktoriseringsheader",
"LabelPubDate": "Publiceringsdatum", "LabelPubDate": "Publiceringsdatum",
"LabelPublishYear": "Utgivningsår", "LabelPublishYear": "Utgivningsår",
"LabelPublishedDate": "Publicerad {0}", "LabelPublishedDate": "Publicerad {0}",
@@ -525,7 +540,7 @@
"LabelPublishers": "Utgivare", "LabelPublishers": "Utgivare",
"LabelRSSFeedCustomOwnerEmail": "Anpassad ägarens e-post", "LabelRSSFeedCustomOwnerEmail": "Anpassad ägarens e-post",
"LabelRSSFeedCustomOwnerName": "Anpassat ägarnamn", "LabelRSSFeedCustomOwnerName": "Anpassat ägarnamn",
"LabelRSSFeedOpen": "Öppna RSS-flöde", "LabelRSSFeedOpen": "RSS-flöde öppet",
"LabelRSSFeedPreventIndexing": "Förhindra indexering", "LabelRSSFeedPreventIndexing": "Förhindra indexering",
"LabelRSSFeedSlug": "RSS-flödesslag", "LabelRSSFeedSlug": "RSS-flödesslag",
"LabelRSSFeedURL": "URL-adress för RSS-flödet", "LabelRSSFeedURL": "URL-adress för RSS-flödet",
@@ -608,18 +623,22 @@
"LabelSettingsTimeFormat": "Tidsformat", "LabelSettingsTimeFormat": "Tidsformat",
"LabelShare": "Dela", "LabelShare": "Dela",
"LabelShareDownloadableHelp": "Tillåt att användare som fått en delad länk att ladda ner ett komprimerat objekt från biblioteket.", "LabelShareDownloadableHelp": "Tillåt att användare som fått en delad länk att ladda ner ett komprimerat objekt från biblioteket.",
"LabelShareOpen": "Delning öppet",
"LabelShareURL": "Dela URL-länk", "LabelShareURL": "Dela URL-länk",
"LabelShowAll": "Visa alla", "LabelShowAll": "Visa alla",
"LabelShowSeconds": "Visa i sekunder", "LabelShowSeconds": "Visa i sekunder",
"LabelShowSubtitles": "Visa underrubriker", "LabelShowSubtitles": "Visa underrubriker",
"LabelSize": "Storlek", "LabelSize": "Storlek",
"LabelSleepTimer": "Sovtimer", "LabelSleepTimer": "Sovtimer",
"LabelSlug": "Kortnamn",
"LabelSortAscending": "Stigande", "LabelSortAscending": "Stigande",
"LabelSortDescending": "Fallande", "LabelSortDescending": "Fallande",
"LabelSortPubDate": "Sortera efter publiceringsdatum",
"LabelStart": "Start", "LabelStart": "Start",
"LabelStartTime": "Starttid", "LabelStartTime": "Starttid",
"LabelStarted": "Startad", "LabelStarted": "Startad",
"LabelStartedAt": "Startades", "LabelStartedAt": "Startades",
"LabelStartedDate": "Påbörjad {0}",
"LabelStatsAudioTracks": "Ljudfiler", "LabelStatsAudioTracks": "Ljudfiler",
"LabelStatsAuthors": "Författare", "LabelStatsAuthors": "Författare",
"LabelStatsBestDay": "Bästa dag", "LabelStatsBestDay": "Bästa dag",
@@ -649,6 +668,7 @@
"LabelTheme": "Utseende", "LabelTheme": "Utseende",
"LabelThemeDark": "Mörkt", "LabelThemeDark": "Mörkt",
"LabelThemeLight": "Ljust", "LabelThemeLight": "Ljust",
"LabelThemeSepia": "Sepia",
"LabelTimeBase": "Tidsbas", "LabelTimeBase": "Tidsbas",
"LabelTimeDurationXHours": "{0} timmar", "LabelTimeDurationXHours": "{0} timmar",
"LabelTimeDurationXMinutes": "{0} minuter", "LabelTimeDurationXMinutes": "{0} minuter",
@@ -671,10 +691,10 @@
"LabelTotalTimeListened": "Total tid lyssnad", "LabelTotalTimeListened": "Total tid lyssnad",
"LabelTrackFromFilename": "Plats från filnamnet", "LabelTrackFromFilename": "Plats från filnamnet",
"LabelTrackFromMetadata": "Plats från metadata", "LabelTrackFromMetadata": "Plats från metadata",
"LabelTracks": "Spår", "LabelTracks": "Ljudspår",
"LabelTracksMultiTrack": "Flerspårigt", "LabelTracksMultiTrack": "Flera ljudspår",
"LabelTracksNone": "Inga spår", "LabelTracksNone": "Inga ljudspår",
"LabelTracksSingleTrack": "Enspårigt", "LabelTracksSingleTrack": "Ett ljudspår",
"LabelTrailer": "Trailer", "LabelTrailer": "Trailer",
"LabelType": "Typ", "LabelType": "Typ",
"LabelUnabridged": "Oavkortad", "LabelUnabridged": "Oavkortad",
@@ -703,6 +723,7 @@
"LabelViewPlayerSettings": "Visa inställningar för uppspelning", "LabelViewPlayerSettings": "Visa inställningar för uppspelning",
"LabelViewQueue": "Visa spellista", "LabelViewQueue": "Visa spellista",
"LabelVolume": "Volym", "LabelVolume": "Volym",
"LabelWebRedirectURLsDescription": "Auktorisera dessa URLer i din OAuth-leverantör för att tillåta omdirigering tillbaka till webbappen efter inloggning:",
"LabelWeekdaysToRun": "Veckodagar att köra skanning", "LabelWeekdaysToRun": "Veckodagar att köra skanning",
"LabelXBooks": "{0} böcker", "LabelXBooks": "{0} böcker",
"LabelXItems": "{0} objekt", "LabelXItems": "{0} objekt",
@@ -713,7 +734,10 @@
"LabelYourPlaylists": "Dina spellistor", "LabelYourPlaylists": "Dina spellistor",
"LabelYourProgress": "Framsteg", "LabelYourProgress": "Framsteg",
"MessageAddToPlayerQueue": "Lägg till i spellistan", "MessageAddToPlayerQueue": "Lägg till i spellistan",
"MessageAppriseDescription": "För att använda den här funktionen behöver du ha en instans av <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> igång eller en API som hanterar dessa begäranden. <br />Apprise API-urlen bör vara hela URL-sökvägen för att skicka meddelandet, t.ex., om din API-instans är tillgänglig på <code>http://192.168.1.1:8337</code>, bör du ange <code>http://192.168.1.1:8337/notify</code>.", "MessageAppriseDescription": "För att använda den här funktionen behöver du ha en instans av <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> startad eller ett API som hanterar dessa förfrågningar. <br />URL-adressen till Apprise API bör vara hela sökvägen för att skicka meddelandet, t.ex., om din API-instans är tillgänglig på <code>http://192.168.1.1:8337</code>, bör du ange <code>http://192.168.1.1:8337/notify</code>.",
"MessageAsinCheck": "Säkerställ att du använder ASIN-kod för rätt region/område.",
"MessageAuthenticationLegacyTokenWarning": "Legacy API-koder kommer att raderas i framtiden. Använd denna istället: <a href=\"/config/api-keys\">API Keys</a>.",
"MessageAuthenticationOIDCChangesRestart": "Du måste starta om servern efter att du ändrat eller adderat OIDC (OpenID Connect).",
"MessageAuthenticationSecurityMessage": "Identifieringen av användare har förbättrats av säkerhetsskäl. Alla användare måste därför logga in på nytt.", "MessageAuthenticationSecurityMessage": "Identifieringen av användare har förbättrats av säkerhetsskäl. Alla användare måste därför logga in på nytt.",
"MessageBackupsDescription": "Säkerhetskopior inkluderar användare, användarnas framsteg, biblioteksobjekt,<br>serverinställningar och bilder lagrade i <code>/metadata/items</code> & <code>/metadata/authors</code>.<br>De inkluderar <strong>INTE</strong> några filer lagrade i dina biblioteksmappar.", "MessageBackupsDescription": "Säkerhetskopior inkluderar användare, användarnas framsteg, biblioteksobjekt,<br>serverinställningar och bilder lagrade i <code>/metadata/items</code> & <code>/metadata/authors</code>.<br>De inkluderar <strong>INTE</strong> några filer lagrade i dina biblioteksmappar.",
"MessageBackupsLocationEditNote": "OBS: När du ändrar plats för säkerhetskopiorna så flyttas INTE gamla säkerhetskopior dit", "MessageBackupsLocationEditNote": "OBS: När du ändrar plats för säkerhetskopiorna så flyttas INTE gamla säkerhetskopior dit",
@@ -733,6 +757,7 @@
"MessageChapterErrorStartGteDuration": "Ogiltig starttid, måste vara mindre än ljudbokens längd", "MessageChapterErrorStartGteDuration": "Ogiltig starttid, måste vara mindre än ljudbokens längd",
"MessageChapterErrorStartLtPrev": "Ogiltig starttid, måste vara större än eller lika med föregående kapitlets starttid", "MessageChapterErrorStartLtPrev": "Ogiltig starttid, måste vara större än eller lika med föregående kapitlets starttid",
"MessageChapterStartIsAfter": "Kapitlets start är efter din ljudboks slut", "MessageChapterStartIsAfter": "Kapitlets start är efter din ljudboks slut",
"MessageChaptersNotFound": "Inga kapitel kunde hittas",
"MessageCheckingCron": "Kontrollerar cron...", "MessageCheckingCron": "Kontrollerar cron...",
"MessageConfirmCloseFeed": "Är du säker på att du vill stänga detta flöde?", "MessageConfirmCloseFeed": "Är du säker på att du vill stänga detta flöde?",
"MessageConfirmDeleteApiKey": "Är du säker på att du vill radera API-nyckel \"{0}\"?", "MessageConfirmDeleteApiKey": "Är du säker på att du vill radera API-nyckel \"{0}\"?",
@@ -754,7 +779,7 @@
"MessageConfirmMarkSeriesFinished": "Är du säker på att du vill markera alla böcker i denna serie som avslutade?", "MessageConfirmMarkSeriesFinished": "Är du säker på att du vill markera alla böcker i denna serie som avslutade?",
"MessageConfirmMarkSeriesNotFinished": "Är du säker på att du vill markera alla böcker i denna serie som ej avslutade?", "MessageConfirmMarkSeriesNotFinished": "Är du säker på att du vill markera alla böcker i denna serie som ej avslutade?",
"MessageConfirmPurgeCache": "När du rensar cashen kommer katalogen <code>/metadata/cache</code> att raderas. <br /><br />Är du säker på att du vill radera katalogen?", "MessageConfirmPurgeCache": "När du rensar cashen kommer katalogen <code>/metadata/cache</code> att raderas. <br /><br />Är du säker på att du vill radera katalogen?",
"MessageConfirmPurgeItemsCache": "När du rensar cashen för föremål kommer katalogen <code>/metadata/cache/items</code> att raderas. <br /><br />Är du säker på att du vill radera katalogen?", "MessageConfirmPurgeItemsCache": "När du rensar cashen för objekten kommer katalogen <code>/metadata/cache/items</code> att raderas. <br /><br />Är du säker på att du vill radera katalogen?",
"MessageConfirmQuickEmbed": "VARNING! När du infogar metadata i dina ljudfiler kommer INGEN SÄKERHETSKOPIA av filerna att göras. Se därför till att först säkerhetskopiera ljudfilerna. <br><br>Vill du fortsätta?", "MessageConfirmQuickEmbed": "VARNING! När du infogar metadata i dina ljudfiler kommer INGEN SÄKERHETSKOPIA av filerna att göras. Se därför till att först säkerhetskopiera ljudfilerna. <br><br>Vill du fortsätta?",
"MessageConfirmQuickMatchEpisodes": "Snabbmatchning av avsnitt kommer att ersätta befintlig information vid en träff. Endast omatchade avsnitt kommer att uppdateras. Vill du fortsätta?", "MessageConfirmQuickMatchEpisodes": "Snabbmatchning av avsnitt kommer att ersätta befintlig information vid en träff. Endast omatchade avsnitt kommer att uppdateras. Vill du fortsätta?",
"MessageConfirmReScanLibraryItems": "Är du säker på att du vill göra en ny skanning för {0} objekt?", "MessageConfirmReScanLibraryItems": "Är du säker på att du vill göra en ny skanning för {0} objekt?",
@@ -775,6 +800,7 @@
"MessageConfirmRenameTagWarning": "VARNING! En liknande tagg med annat skrivsätt finns redan \"{0}\".", "MessageConfirmRenameTagWarning": "VARNING! En liknande tagg med annat skrivsätt finns redan \"{0}\".",
"MessageConfirmResetProgress": "Är du säker på att du vill nollställa ditt framsteg?", "MessageConfirmResetProgress": "Är du säker på att du vill nollställa ditt framsteg?",
"MessageConfirmSendEbookToDevice": "Är du säker på att du vill skicka {0} e-bok \"{1}\" till enheten \"{2}\"?", "MessageConfirmSendEbookToDevice": "Är du säker på att du vill skicka {0} e-bok \"{1}\" till enheten \"{2}\"?",
"MessageConfirmUnlinkOpenId": "Är du säker på att du vill koppla bort denna användare från OpenID?",
"MessageDaysListenedInTheLastYear": "{0} dagars lyssnande det senaste året", "MessageDaysListenedInTheLastYear": "{0} dagars lyssnande det senaste året",
"MessageDownloadingEpisode": "Laddar ner avsnitt", "MessageDownloadingEpisode": "Laddar ner avsnitt",
"MessageDragFilesIntoTrackOrder": "Ändra ordningen genom att klicka och dra filerna till rätt plats", "MessageDragFilesIntoTrackOrder": "Ändra ordningen genom att klicka och dra filerna till rätt plats",
@@ -788,19 +814,19 @@
"MessageInsertChapterBelow": "Infoga kapitel nedanför", "MessageInsertChapterBelow": "Infoga kapitel nedanför",
"MessageInvalidAsin": "Felaktig ASIN-kod", "MessageInvalidAsin": "Felaktig ASIN-kod",
"MessageItemsSelected": "{0} objekt markerade", "MessageItemsSelected": "{0} objekt markerade",
"MessageItemsUpdated": "{0} Objekt uppdaterade", "MessageItemsUpdated": "{0} objekt uppdaterade",
"MessageJoinUsOn": "Anslut dig till oss på", "MessageJoinUsOn": "Anslut dig till oss på",
"MessageLoading": "Laddar...", "MessageLoading": "Laddar...",
"MessageLoadingFolders": "Laddar mappar...", "MessageLoadingFolders": "Laddar mappar...",
"MessageLogsDescription": "Filer med loggningsinformation sparas i mappen <code>/metadata/logs</code> som JSON-filer.<br>Filer med information om krascher sparas i <code>/metadata/logs/crash_logs.txt</code>.", "MessageLogsDescription": "Filer med loggningsinformation sparas i mappen <code>/metadata/logs</code> som JSON-filer.<br>Filer med information om krascher sparas i <code>/metadata/logs/crash_logs.txt</code>.",
"MessageM4BFailed": "M4B misslyckades!", "MessageM4BFailed": "Skapandet av en M4B-fil misslyckades!",
"MessageM4BFinished": "M4B klar!", "MessageM4BFinished": "Omkodningen till M4B är genomförd!",
"MessageMapChapterTitles": "Kartlägg kapitelrubriker till dina befintliga ljudbokskapitel utan att justera tidstämplar", "MessageMapChapterTitles": "Kartlägg kapitelrubriker till dina befintliga ljudbokskapitel utan att justera tidstämplar",
"MessageMarkAllEpisodesFinished": "Markera alla avsnitt som avslutade", "MessageMarkAllEpisodesFinished": "Markera alla avsnitt som avslutade",
"MessageMarkAllEpisodesNotFinished": "Markera alla avsnitt som ej avslutade", "MessageMarkAllEpisodesNotFinished": "Markera alla avsnitt som ej avslutade",
"MessageMarkAsFinished": "Markera som avslutad", "MessageMarkAsFinished": "Markera som avslutad",
"MessageMarkAsNotFinished": "Markera som ej avslutad", "MessageMarkAsNotFinished": "Markera som ej avslutad",
"MessageMatchBooksDescription": "kommer att försöka matcha böcker i biblioteket med en bok från den valda källan och fylla i uppgifter som saknas och omslag. Inga befintliga uppgifter kommer att ersättas.", "MessageMatchBooksDescription": "kommer att försöka matcha böcker i biblioteket med en bok från den valda källan och fylla i de uppgifter som saknas och addera omslag som saknas. Inga befintliga uppgifter kommer att ersättas.",
"MessageNoAudioTracks": "Inga ljudfiler har hittats", "MessageNoAudioTracks": "Inga ljudfiler har hittats",
"MessageNoAuthors": "Inga författare", "MessageNoAuthors": "Inga författare",
"MessageNoBackups": "Inga säkerhetskopior", "MessageNoBackups": "Inga säkerhetskopior",
@@ -856,10 +882,12 @@
"MessageScheduleRunEveryWeekdayAtTime": "Startar varje {0} klockan {1}", "MessageScheduleRunEveryWeekdayAtTime": "Startar varje {0} klockan {1}",
"MessageSearchResultsFor": "Sökresultat för", "MessageSearchResultsFor": "Sökresultat för",
"MessageSelected": "{0} valda", "MessageSelected": "{0} valda",
"MessageSeriesSequenceCannotContainSpaces": "Ordningsnumret i en serie får inte innehålla ett mellanslag",
"MessageServerCouldNotBeReached": "Servern kunde inte nås", "MessageServerCouldNotBeReached": "Servern kunde inte nås",
"MessageSetChaptersFromTracksDescription": "Använd varje ljudfil som ett kapitel och ljudfilens namn som kapitlets rubrik", "MessageSetChaptersFromTracksDescription": "Använd varje ljudfil som ett kapitel och ljudfilens namn som kapitlets rubrik",
"MessageShareExpirationWillBe": "Giltig till kommer att bli <strong>{0}</strong>",
"MessageShareExpiresIn": "Upphör om {0}", "MessageShareExpiresIn": "Upphör om {0}",
"MessageStartPlaybackAtTime": "Starta uppspelning av \"{0}\" vid tidpunkt {1}?", "MessageStartPlaybackAtTime": "Starta uppspelning av \"{0}\" från tidpunkt {1}?",
"MessageTaskAudioFileNotWritable": "Det går inte att skriva till ljudfilen \"{0}\"", "MessageTaskAudioFileNotWritable": "Det går inte att skriva till ljudfilen \"{0}\"",
"MessageTaskCanceledByUser": "Uppgiften avslutades av användaren", "MessageTaskCanceledByUser": "Uppgiften avslutades av användaren",
"MessageTaskDownloadingEpisodeDescription": "Laddar ner avsnitt \"{0}\"", "MessageTaskDownloadingEpisodeDescription": "Laddar ner avsnitt \"{0}\"",
@@ -911,6 +939,10 @@
"NotificationOnBackupCompletedDescription": "Aktiveras när en backup är genomförd", "NotificationOnBackupCompletedDescription": "Aktiveras när en backup är genomförd",
"NotificationOnBackupFailedDescription": "Aktiveras när en backup misslyckas", "NotificationOnBackupFailedDescription": "Aktiveras när en backup misslyckas",
"NotificationOnEpisodeDownloadedDescription": "Aktiveras när avsnitt i en podcast automatiskt har hämtats", "NotificationOnEpisodeDownloadedDescription": "Aktiveras när avsnitt i en podcast automatiskt har hämtats",
"NotificationOnRSSFeedDisabledDescription": "Aktiveras när den automatiska nedladdningen av avsnitt i en podcast stängts av pga för många misslyckade försök",
"NotificationOnRSSFeedFailedDescription": "Aktiveras när den automatiska nedladdningen av avsnitt i en podcast misslyckats",
"NotificationOnTestDescription": "Händelse för att testa meddelandesystemet",
"PlaceholderBulkChapterInput": "Addera kapitlets titel eller numrera kapitlen (t.ex. 'Avsnitt 1', 'Kapitel 10', '1.)",
"PlaceholderNewCollection": "Nytt namn på samlingen", "PlaceholderNewCollection": "Nytt namn på samlingen",
"PlaceholderNewFolderPath": "Ny sökväg till mappen", "PlaceholderNewFolderPath": "Ny sökväg till mappen",
"PlaceholderNewPlaylist": "Nytt namn på spellistan", "PlaceholderNewPlaylist": "Nytt namn på spellistan",
@@ -935,6 +967,7 @@
"StatsTotalDuration": "Med den totala längden…", "StatsTotalDuration": "Med den totala längden…",
"StatsYearInReview": "- SAMMANSTÄLLNING AV ÅRET", "StatsYearInReview": "- SAMMANSTÄLLNING AV ÅRET",
"ToastAccountUpdateSuccess": "Kontot har uppdaterats", "ToastAccountUpdateSuccess": "Kontot har uppdaterats",
"ToastAppriseUrlRequired": "En URL-adress till Apprise API måste anges",
"ToastAsinRequired": "En ASIN-kod krävs", "ToastAsinRequired": "En ASIN-kod krävs",
"ToastAuthorImageRemoveSuccess": "Författarens bild borttagen", "ToastAuthorImageRemoveSuccess": "Författarens bild borttagen",
"ToastAuthorNotFound": "Författaren \"{0}\" kunde inte identifieras", "ToastAuthorNotFound": "Författaren \"{0}\" kunde inte identifieras",
@@ -952,7 +985,7 @@
"ToastBackupInvalidMaxSize": "Felaktig storlek på backup har angivits", "ToastBackupInvalidMaxSize": "Felaktig storlek på backup har angivits",
"ToastBackupRestoreFailed": "Det gick inte att återställa säkerhetskopian", "ToastBackupRestoreFailed": "Det gick inte att återställa säkerhetskopian",
"ToastBackupUploadFailed": "Det gick inte att ladda upp säkerhetskopian", "ToastBackupUploadFailed": "Det gick inte att ladda upp säkerhetskopian",
"ToastBackupUploadSuccess": "Säkerhetskopian uppladdad", "ToastBackupUploadSuccess": "Säkerhetskopian har laddats upp",
"ToastBatchApplyDetailsToItemsSuccess": "Informationen har adderats till alla objekt", "ToastBatchApplyDetailsToItemsSuccess": "Informationen har adderats till alla objekt",
"ToastBatchQuickMatchStarted": "Snabbmatchning av {0} böcker har påbörjats!", "ToastBatchQuickMatchStarted": "Snabbmatchning av {0} böcker har påbörjats!",
"ToastBatchUpdateFailed": "Batchuppdateringen misslyckades", "ToastBatchUpdateFailed": "Batchuppdateringen misslyckades",
@@ -960,15 +993,23 @@
"ToastBookmarkCreateFailed": "Det gick inte att skapa bokmärket", "ToastBookmarkCreateFailed": "Det gick inte att skapa bokmärket",
"ToastBookmarkCreateSuccess": "Bokmärket har adderats", "ToastBookmarkCreateSuccess": "Bokmärket har adderats",
"ToastBookmarkRemoveSuccess": "Bokmärket har raderats", "ToastBookmarkRemoveSuccess": "Bokmärket har raderats",
"ToastBulkChapterInvalidCount": "Ange ett nummer mellan 1 och 150",
"ToastCachePurgeFailed": "Misslyckades med att rensa cachen", "ToastCachePurgeFailed": "Misslyckades med att rensa cachen",
"ToastCachePurgeSuccess": "Rensning av cachen har genomförts", "ToastCachePurgeSuccess": "Rensning av cachen har genomförts",
"ToastChapterLocked": "Kapitlet är låst.",
"ToastChapterStartTimeAdjusted": "Kapitlets starttid justerades med {0} sekunder",
"ToastChaptersAllLocked": "Alla kapitel är låsta. Lås upp några av dem för att kunna ändra deras tider.",
"ToastChaptersHaveErrors": "Kapitlen har fel", "ToastChaptersHaveErrors": "Kapitlen har fel",
"ToastChaptersInvalidShiftAmountLast": "Felaktig ändring. Det sista kapitlets starttid kommer att hamna efter den totala längden på ljudboken.",
"ToastChaptersInvalidShiftAmountStart": "Felaktig ändring. Det första kapitlets längd kommer att vara 0 eller ha ett negativt värde. Det kommer därför att skrivas över av det andra kapitlet. Öka starttiden för det andra kapitlet.",
"ToastChaptersMustHaveTitles": "Kapitel måste ha titlar", "ToastChaptersMustHaveTitles": "Kapitel måste ha titlar",
"ToastChaptersRemoved": "Kapitlen har raderats", "ToastChaptersRemoved": "Kapitlen har raderats",
"ToastChaptersUpdated": "Kapitlen har uppdaterats", "ToastChaptersUpdated": "Kapitlen har uppdaterats",
"ToastCollectionItemsAddFailed": "Misslyckades med att addera böcker till samlingen", "ToastCollectionItemsAddFailed": "Misslyckades med att addera böcker till samlingen",
"ToastCollectionRemoveSuccess": "Samlingen har raderats", "ToastCollectionRemoveSuccess": "Samlingen har raderats",
"ToastCollectionUpdateSuccess": "Samlingen har uppdaterats", "ToastCollectionUpdateSuccess": "Samlingen har uppdaterats",
"ToastConnectionNotAvailable": "Uppkopplingen är inte tillgänglig. Var vänlig försök senare.",
"ToastCoverSearchFailed": "Sökningen efter omslag misslyckades",
"ToastCoverUpdateFailed": "Uppdatering av omslag misslyckades", "ToastCoverUpdateFailed": "Uppdatering av omslag misslyckades",
"ToastDateTimeInvalidOrIncomplete": "Datum och klockslag är felaktigt eller ej komplett", "ToastDateTimeInvalidOrIncomplete": "Datum och klockslag är felaktigt eller ej komplett",
"ToastDeleteFileFailed": "Misslyckades att radera filen", "ToastDeleteFileFailed": "Misslyckades att radera filen",
@@ -983,13 +1024,16 @@
"ToastEpisodeDownloadQueueClearFailed": "Misslyckades med att tömma kön", "ToastEpisodeDownloadQueueClearFailed": "Misslyckades med att tömma kön",
"ToastEpisodeDownloadQueueClearSuccess": "Kö för nedladdning av avsnitt har tömts", "ToastEpisodeDownloadQueueClearSuccess": "Kö för nedladdning av avsnitt har tömts",
"ToastEpisodeUpdateSuccess": "{0} avsnitt uppdaterades", "ToastEpisodeUpdateSuccess": "{0} avsnitt uppdaterades",
"ToastFailedToCreate": "Misslyckades med att addera",
"ToastFailedToDelete": "Misslyckades med att radera",
"ToastFailedToLoadData": "Misslyckades med att ladda data", "ToastFailedToLoadData": "Misslyckades med att ladda data",
"ToastFailedToMatch": "Misslyckades med att matcha", "ToastFailedToMatch": "Misslyckades med att matcha",
"ToastFailedToShare": "Misslyckades med att dela", "ToastFailedToShare": "Misslyckades med att dela",
"ToastFailedToUpdate": "Misslyckades med att uppdatera", "ToastFailedToUpdate": "Misslyckades med att uppdatera",
"ToastInvalidImageUrl": "Felaktig URL-adress till omslagsbilden", "ToastInvalidImageUrl": "Felaktig URL-adress till omslagsbilden",
"ToastInvalidMaxEpisodesToDownload": "Ogiltigt maximalt antal avsnitt att ladda ner", "ToastInvalidMaxEpisodesToDownload": "Felaktigt värde angivet för maximalt antal avsnitt att ladda ner",
"ToastInvalidUrl": "Felaktig URL-adress", "ToastInvalidUrl": "Felaktig URL-adress",
"ToastInvalidUrls": "En eller flera URL-adresser är felaktig",
"ToastItemCoverUpdateSuccess": "Objektets omslag har uppdaterats", "ToastItemCoverUpdateSuccess": "Objektets omslag har uppdaterats",
"ToastItemDeletedFailed": "Misslyckades med att radera objektet", "ToastItemDeletedFailed": "Misslyckades med att radera objektet",
"ToastItemDeletedSuccess": "Objektet har raderats", "ToastItemDeletedSuccess": "Objektet har raderats",
@@ -1013,11 +1057,12 @@
"ToastMetadataFilesRemovedSuccess": "{0} 'metadata.{1}' raderades", "ToastMetadataFilesRemovedSuccess": "{0} 'metadata.{1}' raderades",
"ToastNameEmailRequired": "Ett namn och en e-postadress måste anges", "ToastNameEmailRequired": "Ett namn och en e-postadress måste anges",
"ToastNameRequired": "Ett namn måste anges", "ToastNameRequired": "Ett namn måste anges",
"ToastNewApiKeyUserError": "En användare måste väljas",
"ToastNewEpisodesFound": "Hittade {0} nya avsnitt", "ToastNewEpisodesFound": "Hittade {0} nya avsnitt",
"ToastNewUserCreatedFailed": "Misslyckades med att skapa kontot \"{0}\"", "ToastNewUserCreatedFailed": "Misslyckades med att skapa kontot \"{0}\"",
"ToastNewUserCreatedSuccess": "Ett nytt konto har skapats", "ToastNewUserCreatedSuccess": "Ett nytt konto har skapats",
"ToastNewUserLibraryError": "Minst ett bibliotek måste anges", "ToastNewUserLibraryError": "Minst ett bibliotek måste anges",
"ToastNewUserPasswordError": "Ett lösenord måste anges. Endast användaren 'root' kan vara utan lösenord.", "ToastNewUserPasswordError": "Ett lösenord måste anges. Endast användaren 'root' tillåts sakna lösenord.",
"ToastNewUserTagError": "Minst en tagg måste läggas till", "ToastNewUserTagError": "Minst en tagg måste läggas till",
"ToastNewUserUsernameError": "Ange ett användarnamn", "ToastNewUserUsernameError": "Ange ett användarnamn",
"ToastNoNewEpisodesFound": "Inga nya avsnitt kunde hittas", "ToastNoNewEpisodesFound": "Inga nya avsnitt kunde hittas",
@@ -1025,6 +1070,9 @@
"ToastNoUpdatesNecessary": "Inga uppdateringar var nödvändiga", "ToastNoUpdatesNecessary": "Inga uppdateringar var nödvändiga",
"ToastNotificationCreateFailed": "Misslyckades med att skapa meddelandet", "ToastNotificationCreateFailed": "Misslyckades med att skapa meddelandet",
"ToastNotificationDeleteFailed": "Misslyckades med att radera meddelandet", "ToastNotificationDeleteFailed": "Misslyckades med att radera meddelandet",
"ToastNotificationFailedMaximum": "Maximalt antal misslyckade försök måste vara större än eller lika med 0",
"ToastNotificationSettingsUpdateSuccess": "Inställningarna för meddelanden har ändrats",
"ToastNotificationTestTriggerFailed": "Misslyckades med att skicka testmeddelandet",
"ToastNotificationUpdateSuccess": "Meddelandet har uppdaterats", "ToastNotificationUpdateSuccess": "Meddelandet har uppdaterats",
"ToastPlaylistCreateFailed": "Det gick inte att skapa spellistan", "ToastPlaylistCreateFailed": "Det gick inte att skapa spellistan",
"ToastPlaylistCreateSuccess": "Spellistan skapad", "ToastPlaylistCreateSuccess": "Spellistan skapad",
@@ -1032,6 +1080,7 @@
"ToastPlaylistUpdateSuccess": "Spellistan har uppdaterats", "ToastPlaylistUpdateSuccess": "Spellistan har uppdaterats",
"ToastPodcastCreateFailed": "Misslyckades med att skapa podcasten", "ToastPodcastCreateFailed": "Misslyckades med att skapa podcasten",
"ToastPodcastCreateSuccess": "Podcasten skapades framgångsrikt", "ToastPodcastCreateSuccess": "Podcasten skapades framgångsrikt",
"ToastPodcastEpisodeUpdated": "Avsnittet har uppdaterats",
"ToastPodcastNoEpisodesInFeed": "Inga avsnitt finns i RSS-flödet", "ToastPodcastNoEpisodesInFeed": "Inga avsnitt finns i RSS-flödet",
"ToastPodcastNoRssFeed": "Denna podcast har ingen RSS-flöde", "ToastPodcastNoRssFeed": "Denna podcast har ingen RSS-flöde",
"ToastProviderCreatedFailed": "Misslyckades med att addera en källa", "ToastProviderCreatedFailed": "Misslyckades med att addera en källa",
@@ -1055,7 +1104,7 @@
"ToastSendEbookToDeviceFailed": "Misslyckades med att skicka e-boken till enheten", "ToastSendEbookToDeviceFailed": "Misslyckades med att skicka e-boken till enheten",
"ToastSendEbookToDeviceSuccess": "E-boken skickad till enheten \"{0}\"", "ToastSendEbookToDeviceSuccess": "E-boken skickad till enheten \"{0}\"",
"ToastSeriesSubmitFailedSameName": "Det är inte möjligt att addera två serier med samma namn", "ToastSeriesSubmitFailedSameName": "Det är inte möjligt att addera två serier med samma namn",
"ToastSeriesUpdateFailed": "Uppdateringen av serier misslyckades", "ToastSeriesUpdateFailed": "Misslyckades med att uppdatera serien",
"ToastSeriesUpdateSuccess": "Uppdateringen av serierna lyckades", "ToastSeriesUpdateSuccess": "Uppdateringen av serierna lyckades",
"ToastServerSettingsUpdateSuccess": "Inställningarna för servern har uppdaterats", "ToastServerSettingsUpdateSuccess": "Inställningarna för servern har uppdaterats",
"ToastSessionDeleteFailed": "Misslyckades med att ta bort sessionen", "ToastSessionDeleteFailed": "Misslyckades med att ta bort sessionen",
@@ -1068,11 +1117,21 @@
"ToastSortingPrefixesUpdateSuccess": "{0} begrepp för sortering har uppdateras", "ToastSortingPrefixesUpdateSuccess": "{0} begrepp för sortering har uppdateras",
"ToastTitleRequired": "En titel måste anges", "ToastTitleRequired": "En titel måste anges",
"ToastUnknownError": "Ett okänt fel inträffade", "ToastUnknownError": "Ett okänt fel inträffade",
"ToastUnlinkOpenIdFailed": "Misslyckades med att koppla bort användaren från OpenID",
"ToastUnlinkOpenIdSuccess": "Användaren har kopplats bort från OpenID",
"ToastUploaderFilepathExistsError": "En fil med namnet \"{0}\" finns redan på servern", "ToastUploaderFilepathExistsError": "En fil med namnet \"{0}\" finns redan på servern",
"ToastUserDeleteFailed": "Misslyckades med att ta bort användaren", "ToastUserDeleteFailed": "Misslyckades med att ta bort användaren",
"ToastUserDeleteSuccess": "Användaren borttagen", "ToastUserDeleteSuccess": "Användaren borttagen",
"ToastUserPasswordChangeSuccess": "Lösenordet har ändrats", "ToastUserPasswordChangeSuccess": "Lösenordet har ändrats",
"ToastUserPasswordMismatch": "Lösenorden är inte identiska", "ToastUserPasswordMismatch": "Lösenorden är inte identiska",
"ToastUserPasswordMustChange": "Det nya lösenordet kan inte vara samma som det gamla", "ToastUserPasswordMustChange": "Det nya lösenordet kan inte vara samma som det gamla",
"ToastUserRootRequireName": "Ett användarnamn för 'root' måste anges" "ToastUserRootRequireName": "Ett användarnamn för 'root' måste anges",
"TooltipAddChapters": "Addera kapitel",
"TooltipAddOneSecond": "Öka med 1 sekund",
"TooltipAdjustChapterStart": "Klicka för att ändra starttiden",
"TooltipLockAllChapters": "Lås alla kapitel",
"TooltipLockChapter": "Lås kapitel (Tryck på Shift + Klick för att markera flera)",
"TooltipSubtractOneSecond": "Minska med 1 sekund",
"TooltipUnlockAllChapters": "Lås upp alla kapitel",
"TooltipUnlockChapter": "Lås upp kapitel (Tryck på Shift + Klick för att markera flera)"
} }
+975 -136
View File
File diff suppressed because it is too large Load Diff
+38 -4
View File
@@ -76,7 +76,7 @@
"ButtonReScan": "Пересканувати", "ButtonReScan": "Пересканувати",
"ButtonRead": "Читати", "ButtonRead": "Читати",
"ButtonReadLess": "Згорнути", "ButtonReadLess": "Згорнути",
"ButtonReadMore": "Читати далі", "ButtonReadMore": "Читати більше",
"ButtonRefresh": "Оновити", "ButtonRefresh": "Оновити",
"ButtonRemove": "Видалити", "ButtonRemove": "Видалити",
"ButtonRemoveAll": "Видалити все", "ButtonRemoveAll": "Видалити все",
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "Інструменти керування файлами книг", "HeaderAudiobookTools": "Інструменти керування файлами книг",
"HeaderAuthentication": "Автентифікація", "HeaderAuthentication": "Автентифікація",
"HeaderBackups": "Резервні копії", "HeaderBackups": "Резервні копії",
"HeaderBulkChapterModal": "Додати кілька розділів",
"HeaderChangePassword": "Змінити пароль", "HeaderChangePassword": "Змінити пароль",
"HeaderChapters": "Глави", "HeaderChapters": "Глави",
"HeaderChooseAFolder": "Обрати теку", "HeaderChooseAFolder": "Обрати теку",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "Експериментальні функції", "HeaderSettingsExperimental": "Експериментальні функції",
"HeaderSettingsGeneral": "Основне", "HeaderSettingsGeneral": "Основне",
"HeaderSettingsScanner": "Сканер", "HeaderSettingsScanner": "Сканер",
"HeaderSettingsSecurity": "Безпека",
"HeaderSettingsWebClient": "Вебклієнт", "HeaderSettingsWebClient": "Вебклієнт",
"HeaderSleepTimer": "Таймер вимкнення", "HeaderSleepTimer": "Таймер вимкнення",
"HeaderStatsLargestItems": "Найбільші елементи", "HeaderStatsLargestItems": "Найбільші елементи",
@@ -291,8 +293,9 @@
"LabelComplete": "Завершити", "LabelComplete": "Завершити",
"LabelConfirmPassword": "Підтвердити пароль", "LabelConfirmPassword": "Підтвердити пароль",
"LabelContinueListening": "Слухати далі", "LabelContinueListening": "Слухати далі",
"LabelContinueReading": "Читати далі", "LabelContinueReading": "Продовжити читання",
"LabelContinueSeries": "Продовжити серії", "LabelContinueSeries": "Продовжити серії",
"LabelCorsAllowed": "Дозволені джерела CORS",
"LabelCover": "Обкладинка", "LabelCover": "Обкладинка",
"LabelCoverImageURL": "URL-адреса обкладинки", "LabelCoverImageURL": "URL-адреса обкладинки",
"LabelCoverProvider": "Постачальник покриття", "LabelCoverProvider": "Постачальник покриття",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "Видалити з файлової системи (зніміть прапорець, щоб видалити лише з бази даних)", "LabelDeleteFromFileSystemCheckbox": "Видалити з файлової системи (зніміть прапорець, щоб видалити лише з бази даних)",
"LabelDescription": "Опис", "LabelDescription": "Опис",
"LabelDeselectAll": "Скасувати вибір", "LabelDeselectAll": "Скасувати вибір",
"LabelDetectedPattern": "Виявлений візерунок:",
"LabelDevice": "Пристрій", "LabelDevice": "Пристрій",
"LabelDeviceInfo": "Про пристрій", "LabelDeviceInfo": "Про пристрій",
"LabelDeviceIsAvailableTo": "Пристрій доступний для...", "LabelDeviceIsAvailableTo": "Пристрій доступний для...",
@@ -374,6 +378,7 @@
"LabelFilterByUser": "Фільтрувати за користувачем", "LabelFilterByUser": "Фільтрувати за користувачем",
"LabelFindEpisodes": "Знайти епізоди", "LabelFindEpisodes": "Знайти епізоди",
"LabelFinished": "Завершено", "LabelFinished": "Завершено",
"LabelFinishedDate": "Завершено {0}",
"LabelFolder": "Тека", "LabelFolder": "Тека",
"LabelFolders": "Теки", "LabelFolders": "Теки",
"LabelFontBold": "Жирний", "LabelFontBold": "Жирний",
@@ -418,6 +423,7 @@
"LabelLanguages": "Мови", "LabelLanguages": "Мови",
"LabelLastBookAdded": "Останню книгу додано", "LabelLastBookAdded": "Останню книгу додано",
"LabelLastBookUpdated": "Останню книгу оновлено", "LabelLastBookUpdated": "Останню книгу оновлено",
"LabelLastProgressDate": "Останній прогрес: {0}",
"LabelLastSeen": "Активність", "LabelLastSeen": "Активність",
"LabelLastTime": "Останній час", "LabelLastTime": "Останній час",
"LabelLastUpdate": "Останнє оновлення", "LabelLastUpdate": "Останнє оновлення",
@@ -430,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "Ні {0}", "LabelLibraryFilterSublistEmpty": "Ні {0}",
"LabelLibraryItem": "Елемент бібліотеки", "LabelLibraryItem": "Елемент бібліотеки",
"LabelLibraryName": "Назва бібліотеки", "LabelLibraryName": "Назва бібліотеки",
"LabelLibrarySortByProgress": "Прогрес: Останнє оновлення",
"LabelLibrarySortByProgressFinished": "Прогрес: Завершено",
"LabelLibrarySortByProgressStarted": "Прогрес: Розпочато",
"LabelLimit": "Обмеження", "LabelLimit": "Обмеження",
"LabelLineSpacing": "Відстань між рядками", "LabelLineSpacing": "Відстань між рядками",
"LabelListenAgain": "Слухати знову", "LabelListenAgain": "Слухати знову",
@@ -438,6 +447,7 @@
"LabelLogLevelWarn": "Увага", "LabelLogLevelWarn": "Увага",
"LabelLookForNewEpisodesAfterDate": "Шукати нові епізоди після вказаної дати", "LabelLookForNewEpisodesAfterDate": "Шукати нові епізоди після вказаної дати",
"LabelLowestPriority": "Найнижчий пріоритет", "LabelLowestPriority": "Найнижчий пріоритет",
"LabelMatchConfidence": "Впевненість",
"LabelMatchExistingUsersBy": "Шукати наявних користувачів за", "LabelMatchExistingUsersBy": "Шукати наявних користувачів за",
"LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO", "LabelMatchExistingUsersByDescription": "Використовується для підключення наявних користувачів. Після підключення користувач отримає унікальний id від вашого сервісу SSO",
"LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для скачування. Використовуйте 0 для необмеженої кількості.", "LabelMaxEpisodesToDownload": "Максимальна кількість епізодів для скачування. Використовуйте 0 для необмеженої кількості.",
@@ -467,6 +477,7 @@
"LabelNewestAuthors": "Нові автори", "LabelNewestAuthors": "Нові автори",
"LabelNewestEpisodes": "Нові епізоди", "LabelNewestEpisodes": "Нові епізоди",
"LabelNextBackupDate": "Дата наступного резервного копіювання", "LabelNextBackupDate": "Дата наступного резервного копіювання",
"LabelNextChapters": "Наступні розділи будуть:",
"LabelNextScheduledRun": "Наступний запланований запуск", "LabelNextScheduledRun": "Наступний запланований запуск",
"LabelNoApiKeys": "Без ключів API", "LabelNoApiKeys": "Без ключів API",
"LabelNoCustomMetadataProviders": "Без постачальників метаданих", "LabelNoCustomMetadataProviders": "Без постачальників метаданих",
@@ -484,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "Ліміт розміру черги сповіщень", "LabelNotificationsMaxQueueSize": "Ліміт розміру черги сповіщень",
"LabelNotificationsMaxQueueSizeHelp": "Події обмежені до 1 на секунду. Події буде проігноровано, якщо ліміт черги досягнуто. Це запобігає спаму сповіщеннями.", "LabelNotificationsMaxQueueSizeHelp": "Події обмежені до 1 на секунду. Події буде проігноровано, якщо ліміт черги досягнуто. Це запобігає спаму сповіщеннями.",
"LabelNumberOfBooks": "Кількість книг", "LabelNumberOfBooks": "Кількість книг",
"LabelNumberOfChapters": "Кількість розділів:",
"LabelNumberOfEpisodes": "Кількість серій", "LabelNumberOfEpisodes": "Кількість серій",
"LabelOpenIDAdvancedPermsClaimDescription": "Назва OpenID claim, що містить розширені дозволи на дії користувачів у додатку, які будуть застосовуватися до ролей, що не є адміністраторами (<b>якщо налаштовано</b>). Якщо у відповіді нема claim, у доступі до Audiobookshelf буде відмовлено. Якщо відсутня хоча б одна опція, відповідь буде вважатися <code>хибною</code>. Переконайтеся, що запит постачальника ідентифікаційних даних відповідає очікуваній структурі:", "LabelOpenIDAdvancedPermsClaimDescription": "Назва OpenID claim, що містить розширені дозволи на дії користувачів у додатку, які будуть застосовуватися до ролей, що не є адміністраторами (<b>якщо налаштовано</b>). Якщо у відповіді нема claim, у доступі до Audiobookshelf буде відмовлено. Якщо відсутня хоча б одна опція, відповідь буде вважатися <code>хибною</code>. Переконайтеся, що запит постачальника ідентифікаційних даних відповідає очікуваній структурі:",
"LabelOpenIDClaims": "Не змінюйте наступні параметри, аби вимкнути розширене призначення груп і дозволів, автоматично призначаючи групу 'Користувач'.", "LabelOpenIDClaims": "Не змінюйте наступні параметри, аби вимкнути розширене призначення груп і дозволів, автоматично призначаючи групу 'Користувач'.",
@@ -626,6 +638,7 @@
"LabelStartTime": "Час початку", "LabelStartTime": "Час початку",
"LabelStarted": "Стартував", "LabelStarted": "Стартував",
"LabelStartedAt": "Почато з", "LabelStartedAt": "Почато з",
"LabelStartedDate": "Розпочато {0}",
"LabelStatsAudioTracks": "Аудіодоріжки", "LabelStatsAudioTracks": "Аудіодоріжки",
"LabelStatsAuthors": "Автори", "LabelStatsAuthors": "Автори",
"LabelStatsBestDay": "Найкращий день", "LabelStatsBestDay": "Найкращий день",
@@ -655,6 +668,7 @@
"LabelTheme": "Тема", "LabelTheme": "Тема",
"LabelThemeDark": "Темна", "LabelThemeDark": "Темна",
"LabelThemeLight": "Світла", "LabelThemeLight": "Світла",
"LabelThemeSepia": "Сепія",
"LabelTimeBase": "Шкала часу", "LabelTimeBase": "Шкала часу",
"LabelTimeDurationXHours": "{0} години", "LabelTimeDurationXHours": "{0} години",
"LabelTimeDurationXMinutes": "{0} хвилини", "LabelTimeDurationXMinutes": "{0} хвилини",
@@ -739,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "Немає результатів з фільтром \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "Немає результатів за запитом", "MessageBookshelfNoResultsForQuery": "Немає результатів за запитом",
"MessageBookshelfNoSeries": "У вас немає серій", "MessageBookshelfNoSeries": "У вас немає серій",
"MessageBulkChapterPattern": "Скільки розділів ви хочете додати за допомогою цієї схеми нумерації?",
"MessageChapterEndIsAfter": "Кінець глави після завершення аудіокниги", "MessageChapterEndIsAfter": "Кінець глави після завершення аудіокниги",
"MessageChapterErrorFirstNotZero": "Перша глава повинна починатися з 0", "MessageChapterErrorFirstNotZero": "Перша глава повинна починатися з 0",
"MessageChapterErrorStartGteDuration": "Час початку має бути меншим за тривалість аудіокниги", "MessageChapterErrorStartGteDuration": "Час початку має бути меншим за тривалість аудіокниги",
@@ -801,6 +816,8 @@
"MessageFeedURLWillBe": "URL-адреса каналу буде {0}", "MessageFeedURLWillBe": "URL-адреса каналу буде {0}",
"MessageFetching": "Отримання...", "MessageFetching": "Отримання...",
"MessageForceReScanDescription": "Просканує всі файли заново, як при першому скануванні. ID3-мітки, OPF-файли та текстові файли будуть проскановані як нові.", "MessageForceReScanDescription": "Просканує всі файли заново, як при першому скануванні. ID3-мітки, OPF-файли та текстові файли будуть проскановані як нові.",
"MessageHeatmapListeningTimeTooltip": "<strong>{0} прослуховування</strong> на {1}",
"MessageHeatmapNoListeningSessions": "Немає сеансів прослуховування на {0}",
"MessageImportantNotice": "Важливе повідомлення!", "MessageImportantNotice": "Важливе повідомлення!",
"MessageInsertChapterBelow": "Введіть главу нижче", "MessageInsertChapterBelow": "Введіть главу нижче",
"MessageInvalidAsin": "Невірний ASIN", "MessageInvalidAsin": "Невірний ASIN",
@@ -837,7 +854,7 @@
"MessageNoItems": "Елементи відсутні", "MessageNoItems": "Елементи відсутні",
"MessageNoItemsFound": "Елементів не знайдено", "MessageNoItemsFound": "Елементів не знайдено",
"MessageNoListeningSessions": "Сеанси прослуховування відсутні", "MessageNoListeningSessions": "Сеанси прослуховування відсутні",
"MessageNoLogs": "Немає журнали", "MessageNoLogs": "Немає Журнали",
"MessageNoMediaProgress": "Прогрес відсутній", "MessageNoMediaProgress": "Прогрес відсутній",
"MessageNoNotifications": "Сповіщення відсутні", "MessageNoNotifications": "Сповіщення відсутні",
"MessageNoPodcastFeed": "Некоректний подкаст: немає каналу", "MessageNoPodcastFeed": "Некоректний подкаст: немає каналу",
@@ -940,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "Виконується, коли автоматичне завантаження епізодів вимкнено через забагато невдалих спроб", "NotificationOnRSSFeedDisabledDescription": "Виконується, коли автоматичне завантаження епізодів вимкнено через забагато невдалих спроб",
"NotificationOnRSSFeedFailedDescription": "Виконується, коли запит RSS-каналу не вдається для автоматичного завантаження епізоду", "NotificationOnRSSFeedFailedDescription": "Виконується, коли запит RSS-каналу не вдається для автоматичного завантаження епізоду",
"NotificationOnTestDescription": "Подія для тестування системи сповіщень", "NotificationOnTestDescription": "Подія для тестування системи сповіщень",
"PlaceholderBulkChapterInput": "Введіть назву розділу або використовуйте нумерацію (наприклад, «Епізод 1», «Розділ 10», «1.»)",
"PlaceholderNewCollection": "Нова назва добірки", "PlaceholderNewCollection": "Нова назва добірки",
"PlaceholderNewFolderPath": "Новий шлях до теки", "PlaceholderNewFolderPath": "Новий шлях до теки",
"PlaceholderNewPlaylist": "Нова назва списку", "PlaceholderNewPlaylist": "Нова назва списку",
@@ -993,8 +1011,12 @@
"ToastBookmarkCreateFailed": "Не вдалося створити закладку", "ToastBookmarkCreateFailed": "Не вдалося створити закладку",
"ToastBookmarkCreateSuccess": "Закладку додано", "ToastBookmarkCreateSuccess": "Закладку додано",
"ToastBookmarkRemoveSuccess": "Закладку видалено", "ToastBookmarkRemoveSuccess": "Закладку видалено",
"ToastBulkChapterInvalidCount": "Введіть число від 1 до 150",
"ToastCachePurgeFailed": "Не вдалося очистити кеш", "ToastCachePurgeFailed": "Не вдалося очистити кеш",
"ToastCachePurgeSuccess": "Кеш очищено", "ToastCachePurgeSuccess": "Кеш очищено",
"ToastChapterLocked": "Розділ заблоковано.",
"ToastChapterStartTimeAdjusted": "Час початку розділу змінено на {0} секунд",
"ToastChaptersAllLocked": "Усі розділи заблоковано. Розблокуйте деякі розділи, щоб змістити їхній час.",
"ToastChaptersHaveErrors": "Глави містять помилки", "ToastChaptersHaveErrors": "Глави містять помилки",
"ToastChaptersInvalidShiftAmountLast": "Недійсна тривалість зсуву. Час початку останнього розділу перевищує тривалість цієї аудіокниги.", "ToastChaptersInvalidShiftAmountLast": "Недійсна тривалість зсуву. Час початку останнього розділу перевищує тривалість цієї аудіокниги.",
"ToastChaptersInvalidShiftAmountStart": "Недійсна величина зсуву. Перший розділ матиме нульову або від’ємну тривалість і буде перезаписаний другим розділом. Збільште початкову тривалість другого розділу.", "ToastChaptersInvalidShiftAmountStart": "Недійсна величина зсуву. Перший розділ матиме нульову або від’ємну тривалість і буде перезаписаний другим розділом. Збільште початкову тривалість другого розділу.",
@@ -1004,6 +1026,8 @@
"ToastCollectionItemsAddFailed": "Не вдалося додати елемент(и) до колекції", "ToastCollectionItemsAddFailed": "Не вдалося додати елемент(и) до колекції",
"ToastCollectionRemoveSuccess": "Добірку видалено", "ToastCollectionRemoveSuccess": "Добірку видалено",
"ToastCollectionUpdateSuccess": "Добірку оновлено", "ToastCollectionUpdateSuccess": "Добірку оновлено",
"ToastConnectionNotAvailable": "З’єднання недоступне. Спробуйте пізніше",
"ToastCoverSearchFailed": "Пошук обкладинки не вдався",
"ToastCoverUpdateFailed": "Не вдалося оновити обкладинку", "ToastCoverUpdateFailed": "Не вдалося оновити обкладинку",
"ToastDateTimeInvalidOrIncomplete": "Дата й час недійсні або неповні", "ToastDateTimeInvalidOrIncomplete": "Дата й час недійсні або неповні",
"ToastDeleteFileFailed": "Не вдалося видалити файл", "ToastDeleteFileFailed": "Не вдалося видалити файл",
@@ -1028,6 +1052,7 @@
"ToastInvalidImageUrl": "Невірний URL зображення", "ToastInvalidImageUrl": "Невірний URL зображення",
"ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для скачування", "ToastInvalidMaxEpisodesToDownload": "Невірна кількість епізодів для скачування",
"ToastInvalidUrl": "Невірний URL", "ToastInvalidUrl": "Невірний URL",
"ToastInvalidUrls": "Одна або декілька URL-адрес недійсні",
"ToastItemCoverUpdateSuccess": "Обкладинку елемента оновлено", "ToastItemCoverUpdateSuccess": "Обкладинку елемента оновлено",
"ToastItemDeletedFailed": "Не вдалося видалити елемент", "ToastItemDeletedFailed": "Не вдалося видалити елемент",
"ToastItemDeletedSuccess": "Видалений елемент", "ToastItemDeletedSuccess": "Видалений елемент",
@@ -1077,6 +1102,7 @@
"ToastPlaylistUpdateSuccess": "Список відтворення оновлено", "ToastPlaylistUpdateSuccess": "Список відтворення оновлено",
"ToastPodcastCreateFailed": "Не вдалося створити подкаст", "ToastPodcastCreateFailed": "Не вдалося створити подкаст",
"ToastPodcastCreateSuccess": "Подкаст успішно створено", "ToastPodcastCreateSuccess": "Подкаст успішно створено",
"ToastPodcastEpisodeUpdated": "Епізод оновлено",
"ToastPodcastGetFeedFailed": "Не вдалося отримати фід подкасту", "ToastPodcastGetFeedFailed": "Не вдалося отримати фід подкасту",
"ToastPodcastNoEpisodesInFeed": "У RSS-каналі не знайдено епізодів", "ToastPodcastNoEpisodesInFeed": "У RSS-каналі не знайдено епізодів",
"ToastPodcastNoRssFeed": "Подкаст не має RSS-каналу", "ToastPodcastNoRssFeed": "Подкаст не має RSS-каналу",
@@ -1127,5 +1153,13 @@
"ToastUserPasswordChangeSuccess": "Пароль успішно змінено", "ToastUserPasswordChangeSuccess": "Пароль успішно змінено",
"ToastUserPasswordMismatch": "Паролі не збігаються", "ToastUserPasswordMismatch": "Паролі не збігаються",
"ToastUserPasswordMustChange": "Новий пароль не може співпадати з попереднім", "ToastUserPasswordMustChange": "Новий пароль не може співпадати з попереднім",
"ToastUserRootRequireName": "Потрібно ввести ім'я користувача root" "ToastUserRootRequireName": "Потрібно ввести ім'я користувача root",
"TooltipAddChapters": "Додати розділ(и)",
"TooltipAddOneSecond": "Додати 1 секунду",
"TooltipAdjustChapterStart": "Натисніть, щоб налаштувати час початку",
"TooltipLockAllChapters": "Заблокувати всі розділи",
"TooltipLockChapter": "Заблокувати розділ (Shift+клацання для діапазону)",
"TooltipSubtractOneSecond": "Відніміть 1 секунду",
"TooltipUnlockAllChapters": "Розблокувати всі розділи",
"TooltipUnlockChapter": "Розблокувати розділ (Shift+клацання для діапазону)"
} }
+43 -12
View File
@@ -1,5 +1,6 @@
{ {
"ButtonAdd": "Thêm", "ButtonAdd": "Thêm",
"ButtonAddApiKey": "Thêm API Key",
"ButtonAddChapters": "Thêm Chương", "ButtonAddChapters": "Thêm Chương",
"ButtonAddDevice": "Thêm Thiết Bị", "ButtonAddDevice": "Thêm Thiết Bị",
"ButtonAddLibrary": "Thêm Thư Viện", "ButtonAddLibrary": "Thêm Thư Viện",
@@ -9,6 +10,7 @@
"ButtonApply": "Áp Dụng", "ButtonApply": "Áp Dụng",
"ButtonApplyChapters": "Áp Dụng Chương", "ButtonApplyChapters": "Áp Dụng Chương",
"ButtonAuthors": "Tác Giả", "ButtonAuthors": "Tác Giả",
"ButtonBack": "Quay lại",
"ButtonBrowseForFolder": "Duyệt Thư Mục", "ButtonBrowseForFolder": "Duyệt Thư Mục",
"ButtonCancel": "Hủy", "ButtonCancel": "Hủy",
"ButtonCancelEncode": "Hủy Mã Hóa", "ButtonCancelEncode": "Hủy Mã Hóa",
@@ -17,7 +19,9 @@
"ButtonChooseAFolder": "Chọn một thư mục", "ButtonChooseAFolder": "Chọn một thư mục",
"ButtonChooseFiles": "Chọn tập tin", "ButtonChooseFiles": "Chọn tập tin",
"ButtonClearFilter": "Xóa Bộ Lọc", "ButtonClearFilter": "Xóa Bộ Lọc",
"ButtonClose": "Đóng",
"ButtonCloseFeed": "Đóng Feed", "ButtonCloseFeed": "Đóng Feed",
"ButtonCloseSession": "Đóng phiên hiện tại",
"ButtonCollections": "Bộ Sưu Tập", "ButtonCollections": "Bộ Sưu Tập",
"ButtonConfigureScanner": "Cấu Hình Bộ Quét", "ButtonConfigureScanner": "Cấu Hình Bộ Quét",
"ButtonCreate": "Tạo", "ButtonCreate": "Tạo",
@@ -27,6 +31,10 @@
"ButtonEdit": "Chỉnh Sửa", "ButtonEdit": "Chỉnh Sửa",
"ButtonEditChapters": "Chỉnh Sửa Chương", "ButtonEditChapters": "Chỉnh Sửa Chương",
"ButtonEditPodcast": "Chỉnh Sửa Podcast", "ButtonEditPodcast": "Chỉnh Sửa Podcast",
"ButtonEnable": "Kích hoạt",
"ButtonFireAndFail": "Chạy và báo lỗi",
"ButtonFireOnTest": "Chạy thử",
"ButtonForceReScan": "Quét lại",
"ButtonFullPath": "Đường Dẫn Đầy Đủ", "ButtonFullPath": "Đường Dẫn Đầy Đủ",
"ButtonHide": "Ẩn", "ButtonHide": "Ẩn",
"ButtonHome": "Trang Chủ", "ButtonHome": "Trang Chủ",
@@ -44,21 +52,28 @@
"ButtonNevermind": "Không Sao", "ButtonNevermind": "Không Sao",
"ButtonNext": "Tiếp Theo", "ButtonNext": "Tiếp Theo",
"ButtonNextChapter": "Chương Tiếp Theo", "ButtonNextChapter": "Chương Tiếp Theo",
"ButtonNextItemInQueue": "Mục tiếp theo trong hàng đợi",
"ButtonOk": "Chấp nhận",
"ButtonOpenFeed": "Mở Feed", "ButtonOpenFeed": "Mở Feed",
"ButtonOpenManager": "Mở Quản Lý", "ButtonOpenManager": "Mở Quản Lý",
"ButtonPause": "Tạm Dừng", "ButtonPause": "Tạm Dừng",
"ButtonPlay": "Phát", "ButtonPlay": "Phát",
"ButtonPlayAll": "Phát tất cả",
"ButtonPlaying": "Đang Phát", "ButtonPlaying": "Đang Phát",
"ButtonPlaylists": "Danh Sách Phát", "ButtonPlaylists": "Danh Sách Phát",
"ButtonPrevious": "Trước", "ButtonPrevious": "Trước",
"ButtonPreviousChapter": "Chương Trước", "ButtonPreviousChapter": "Chương Trước",
"ButtonProbeAudioFile": "Kiểm tra tệp âm thanh",
"ButtonPurgeAllCache": "Xóa Sạch Tất Cả Bộ Nhớ Cache", "ButtonPurgeAllCache": "Xóa Sạch Tất Cả Bộ Nhớ Cache",
"ButtonPurgeItemsCache": "Xóa Sạch Bộ Nhớ Cache Các Mục", "ButtonPurgeItemsCache": "Xóa Sạch Bộ Nhớ Cache Các Mục",
"ButtonQueueAddItem": "Thêm vào hàng đợi", "ButtonQueueAddItem": "Thêm vào hàng đợi",
"ButtonQueueRemoveItem": "Xóa khỏi hàng đợi", "ButtonQueueRemoveItem": "Xóa khỏi hàng đợi",
"ButtonQuickEmbed": "Nhúng nhanh",
"ButtonQuickMatch": "Khớp Nhanh", "ButtonQuickMatch": "Khớp Nhanh",
"ButtonReScan": "Quét Lại", "ButtonReScan": "Quét Lại",
"ButtonRead": "Đọc", "ButtonRead": "Đọc",
"ButtonReadLess": "Thu gọn",
"ButtonReadMore": "Đọc thêm",
"ButtonRefresh": "Làm Mới", "ButtonRefresh": "Làm Mới",
"ButtonRemove": "Xóa", "ButtonRemove": "Xóa",
"ButtonRemoveAll": "Xóa Tất Cả", "ButtonRemoveAll": "Xóa Tất Cả",
@@ -74,6 +89,8 @@
"ButtonSaveTracklist": "Lưu Danh Sách Track", "ButtonSaveTracklist": "Lưu Danh Sách Track",
"ButtonScan": "Quét", "ButtonScan": "Quét",
"ButtonScanLibrary": "Quét Thư Viện", "ButtonScanLibrary": "Quét Thư Viện",
"ButtonScrollLeft": "Cuộn trái",
"ButtonScrollRight": "Cuộn phải",
"ButtonSearch": "Tìm Kiếm", "ButtonSearch": "Tìm Kiếm",
"ButtonSelectFolderPath": "Chọn Đường Dẫn Thư Mục", "ButtonSelectFolderPath": "Chọn Đường Dẫn Thư Mục",
"ButtonSetChaptersFromTracks": "Đặt chương từ các track", "ButtonSetChaptersFromTracks": "Đặt chương từ các track",
@@ -82,8 +99,10 @@
"ButtonShow": "Hiện", "ButtonShow": "Hiện",
"ButtonStartM4BEncode": "Bắt đầu Mã Hóa M4B", "ButtonStartM4BEncode": "Bắt đầu Mã Hóa M4B",
"ButtonStartMetadataEmbed": "Bắt đầu Nhúng Dữ Liệu", "ButtonStartMetadataEmbed": "Bắt đầu Nhúng Dữ Liệu",
"ButtonStats": "Dữ liệu",
"ButtonSubmit": "Gửi", "ButtonSubmit": "Gửi",
"ButtonTest": "Kiểm Tra", "ButtonTest": "Kiểm Tra",
"ButtonUnlinkOpenId": "Huỷ liên kết OpenID",
"ButtonUpload": "Tải Lên", "ButtonUpload": "Tải Lên",
"ButtonUploadBackup": "Tải Lên Bản Sao Lưu", "ButtonUploadBackup": "Tải Lên Bản Sao Lưu",
"ButtonUploadCover": "Tải Lên Bìa", "ButtonUploadCover": "Tải Lên Bìa",
@@ -98,7 +117,7 @@
"HeaderAccount": "Tài Khoản", "HeaderAccount": "Tài Khoản",
"HeaderAdvanced": "Nâng Cao", "HeaderAdvanced": "Nâng Cao",
"HeaderAppriseNotificationSettings": "Cài Đặt Thông Báo Apprise", "HeaderAppriseNotificationSettings": "Cài Đặt Thông Báo Apprise",
"HeaderAudioTracks": "Các Track Âm Thanh", "HeaderAudioTracks": "Danh Sách Âm Thanh",
"HeaderAudiobookTools": "Công Cụ Quản Lý Tệp Truyện Nói", "HeaderAudiobookTools": "Công Cụ Quản Lý Tệp Truyện Nói",
"HeaderAuthentication": "Xác Thực", "HeaderAuthentication": "Xác Thực",
"HeaderBackups": "Bản Sao Lưu", "HeaderBackups": "Bản Sao Lưu",
@@ -106,9 +125,10 @@
"HeaderChapters": "Chương", "HeaderChapters": "Chương",
"HeaderChooseAFolder": "Chọn Một Thư Mục", "HeaderChooseAFolder": "Chọn Một Thư Mục",
"HeaderCollection": "Bộ Sưu Tập", "HeaderCollection": "Bộ Sưu Tập",
"HeaderCollectionItems": "Các Mục Bộ Sưu Tập", "HeaderCollectionItems": "Danh sách Bộ Sưu Tập",
"HeaderCover": "Bìa", "HeaderCover": "Bìa",
"HeaderCurrentDownloads": "Tải Xuống Hiện Tại", "HeaderCurrentDownloads": "Tải Xuống Hiện Tại",
"HeaderCustomMessageOnLogin": "Tin nhắn tuỳ chọn khi đăng nhập",
"HeaderCustomMetadataProviders": "Các Nhà Cung Cấp Metadata Tùy Chỉnh", "HeaderCustomMetadataProviders": "Các Nhà Cung Cấp Metadata Tùy Chỉnh",
"HeaderDetails": "Chi Tiết", "HeaderDetails": "Chi Tiết",
"HeaderDownloadQueue": "Hàng Đợi Tải Xuống", "HeaderDownloadQueue": "Hàng Đợi Tải Xuống",
@@ -139,6 +159,8 @@
"HeaderMetadataToEmbed": "Metadata để nhúng", "HeaderMetadataToEmbed": "Metadata để nhúng",
"HeaderNewAccount": "Tài Khoản Mới", "HeaderNewAccount": "Tài Khoản Mới",
"HeaderNewLibrary": "Thư Viện Mới", "HeaderNewLibrary": "Thư Viện Mới",
"HeaderNotificationCreate": "Tạo thông báo",
"HeaderNotificationUpdate": "Cập nhập thông báo",
"HeaderNotifications": "Thông Báo", "HeaderNotifications": "Thông Báo",
"HeaderOpenIDConnectAuthentication": "Xác Thực Mở ID Connect", "HeaderOpenIDConnectAuthentication": "Xác Thực Mở ID Connect",
"HeaderOpenRSSFeed": "Mở RSS Feed", "HeaderOpenRSSFeed": "Mở RSS Feed",
@@ -146,6 +168,7 @@
"HeaderPasswordAuthentication": "Xác Thực Mật Khẩu", "HeaderPasswordAuthentication": "Xác Thực Mật Khẩu",
"HeaderPermissions": "Quyền Hạn", "HeaderPermissions": "Quyền Hạn",
"HeaderPlayerQueue": "Hàng Đợi Người Chơi", "HeaderPlayerQueue": "Hàng Đợi Người Chơi",
"HeaderPlayerSettings": "Cài đặt trình phát",
"HeaderPlaylist": "Danh Sách Phát", "HeaderPlaylist": "Danh Sách Phát",
"HeaderPlaylistItems": "Các Mục Danh Sách Phát", "HeaderPlaylistItems": "Các Mục Danh Sách Phát",
"HeaderPodcastsToAdd": "Podcasts để Thêm", "HeaderPodcastsToAdd": "Podcasts để Thêm",
@@ -156,6 +179,7 @@
"HeaderRemoveEpisodes": "Xóa {0} Tập", "HeaderRemoveEpisodes": "Xóa {0} Tập",
"HeaderSavedMediaProgress": "Tiến Trình Phương Tiện Đã Lưu", "HeaderSavedMediaProgress": "Tiến Trình Phương Tiện Đã Lưu",
"HeaderSchedule": "Lịch Trình", "HeaderSchedule": "Lịch Trình",
"HeaderScheduleEpisodeDownloads": "Đặt lịch tự động tải tập",
"HeaderScheduleLibraryScans": "Lên Lịch Quét Tự Động Thư Viện", "HeaderScheduleLibraryScans": "Lên Lịch Quét Tự Động Thư Viện",
"HeaderSession": "Phiên", "HeaderSession": "Phiên",
"HeaderSetBackupSchedule": "Đặt Lịch Sao Lưu", "HeaderSetBackupSchedule": "Đặt Lịch Sao Lưu",
@@ -164,6 +188,7 @@
"HeaderSettingsExperimental": "Tính Năng Thử Nghiệm", "HeaderSettingsExperimental": "Tính Năng Thử Nghiệm",
"HeaderSettingsGeneral": "Chung", "HeaderSettingsGeneral": "Chung",
"HeaderSettingsScanner": "Máy Quét", "HeaderSettingsScanner": "Máy Quét",
"HeaderSettingsSecurity": "Bảo mật",
"HeaderSleepTimer": "Hẹn Giờ Tắt", "HeaderSleepTimer": "Hẹn Giờ Tắt",
"HeaderStatsLargestItems": "Các Mục Lớn Nhất", "HeaderStatsLargestItems": "Các Mục Lớn Nhất",
"HeaderStatsLongestItems": "Các Mục Dài Nhất (giờ)", "HeaderStatsLongestItems": "Các Mục Dài Nhất (giờ)",
@@ -174,6 +199,7 @@
"HeaderTableOfContents": "Mục Lục", "HeaderTableOfContents": "Mục Lục",
"HeaderTools": "Công Cụ", "HeaderTools": "Công Cụ",
"HeaderUpdateAccount": "Cập Nhật Tài Khoản", "HeaderUpdateAccount": "Cập Nhật Tài Khoản",
"HeaderUpdateApiKey": "Cập nhập API Key",
"HeaderUpdateAuthor": "Cập Nhật Tác Giả", "HeaderUpdateAuthor": "Cập Nhật Tác Giả",
"HeaderUpdateDetails": "Cập Nhật Chi Tiết", "HeaderUpdateDetails": "Cập Nhật Chi Tiết",
"HeaderUpdateLibrary": "Cập Nhật Thư Viện", "HeaderUpdateLibrary": "Cập Nhật Thư Viện",
@@ -190,6 +216,8 @@
"LabelAddToCollectionBatch": "Thêm {0} Sách vào Bộ Sưu Tập", "LabelAddToCollectionBatch": "Thêm {0} Sách vào Bộ Sưu Tập",
"LabelAddToPlaylist": "Thêm vào Danh Sách Phát", "LabelAddToPlaylist": "Thêm vào Danh Sách Phát",
"LabelAddedAt": "Đã Thêm Lúc", "LabelAddedAt": "Đã Thêm Lúc",
"LabelAddedDate": "Đã thêm {0}",
"LabelAutoDownloadEpisodes": "Tự Động Tải Xuống Các Tập",
"LabelBackupsMaxBackupSize": "Maximum backup size (in GB)", "LabelBackupsMaxBackupSize": "Maximum backup size (in GB)",
"LabelBooks": "Sách", "LabelBooks": "Sách",
"LabelButtonText": "Nút Văn Bản", "LabelButtonText": "Nút Văn Bản",
@@ -231,7 +259,7 @@
"LabelDownloadNEpisodes": "Tải Xuống {0} Tập", "LabelDownloadNEpisodes": "Tải Xuống {0} Tập",
"LabelDuration": "Thời Lượng", "LabelDuration": "Thời Lượng",
"LabelDurationFound": "Thời lượng được tìm thấy:", "LabelDurationFound": "Thời lượng được tìm thấy:",
"LabelEbooks": "Các Ebook", "LabelEbooks": "",
"LabelEdit": "Chỉnh Sửa", "LabelEdit": "Chỉnh Sửa",
"LabelEmailSettingsFromAddress": "Địa chỉ Gửi từ", "LabelEmailSettingsFromAddress": "Địa chỉ Gửi từ",
"LabelEmailSettingsSecure": "Bảo Mật", "LabelEmailSettingsSecure": "Bảo Mật",
@@ -257,6 +285,7 @@
"LabelFolder": "Thư Mục", "LabelFolder": "Thư Mục",
"LabelFolders": "Các Thư Mục", "LabelFolders": "Các Thư Mục",
"LabelFontBold": "Đậm", "LabelFontBold": "Đậm",
"LabelFontBoldness": "Chữ đậm",
"LabelFontFamily": "Gia đình font", "LabelFontFamily": "Gia đình font",
"LabelFontItalic": "Nghiêng", "LabelFontItalic": "Nghiêng",
"LabelFontScale": "Tỷ lệ font", "LabelFontScale": "Tỷ lệ font",
@@ -268,7 +297,7 @@
"LabelHasEbook": "Có ebook", "LabelHasEbook": "Có ebook",
"LabelHasSupplementaryEbook": "Có ebook bổ sung", "LabelHasSupplementaryEbook": "Có ebook bổ sung",
"LabelHighestPriority": "Ưu tiên cao nhất", "LabelHighestPriority": "Ưu tiên cao nhất",
"LabelHost": "Máy chủ", "LabelHost": "Máy Chủ",
"LabelHour": "Giờ", "LabelHour": "Giờ",
"LabelIcon": "Biểu tượng", "LabelIcon": "Biểu tượng",
"LabelImageURLFromTheWeb": "URL hình ảnh từ web", "LabelImageURLFromTheWeb": "URL hình ảnh từ web",
@@ -303,7 +332,7 @@
"LabelLibraryName": "Tên thư viện", "LabelLibraryName": "Tên thư viện",
"LabelLimit": "Giới hạn", "LabelLimit": "Giới hạn",
"LabelLineSpacing": "Khoảng cách dòng", "LabelLineSpacing": "Khoảng cách dòng",
"LabelListenAgain": "Nghe lại", "LabelListenAgain": "Nghe Lại",
"LabelLogLevelDebug": "Gỡ lỗi", "LabelLogLevelDebug": "Gỡ lỗi",
"LabelLogLevelInfo": "Thông tin", "LabelLogLevelInfo": "Thông tin",
"LabelLogLevelWarn": "Cảnh báo", "LabelLogLevelWarn": "Cảnh báo",
@@ -312,13 +341,13 @@
"LabelMatchExistingUsersBy": "Kết hợp người dùng hiện có theo", "LabelMatchExistingUsersBy": "Kết hợp người dùng hiện có theo",
"LabelMatchExistingUsersByDescription": "Sử dụng để kết nối người dùng hiện có. Khi kết nối, người dùng sẽ được kết hợp bằng một ID duy nhất từ nhà cung cấp SSO của bạn", "LabelMatchExistingUsersByDescription": "Sử dụng để kết nối người dùng hiện có. Khi kết nối, người dùng sẽ được kết hợp bằng một ID duy nhất từ nhà cung cấp SSO của bạn",
"LabelMediaPlayer": "Trình phát đa phương tiện", "LabelMediaPlayer": "Trình phát đa phương tiện",
"LabelMediaType": "Loại phương tiện", "LabelMediaType": "Loại Phương Tiện",
"LabelMetaTag": "Thẻ Meta", "LabelMetaTag": "Thẻ Meta",
"LabelMetaTags": "Các thẻ Meta", "LabelMetaTags": "Các thẻ Meta",
"LabelMetadataOrderOfPrecedenceDescription": "Nguồn siêu dữ liệu ưu tiên cao hơn sẽ ghi đè lên các nguồn siêu dữ liệu ưu tiên thấp hơn", "LabelMetadataOrderOfPrecedenceDescription": "Nguồn siêu dữ liệu ưu tiên cao hơn sẽ ghi đè lên các nguồn siêu dữ liệu ưu tiên thấp hơn",
"LabelMetadataProvider": "Nhà cung cấp siêu dữ liệu", "LabelMetadataProvider": "Nhà cung cấp siêu dữ liệu",
"LabelMinute": "Phút", "LabelMinute": "Phút",
"LabelMissing": "Thiếu", "LabelMissing": "",
"LabelMissingEbook": "Không có ebook", "LabelMissingEbook": "Không có ebook",
"LabelMissingSupplementaryEbook": "Không có ebook bổ sung", "LabelMissingSupplementaryEbook": "Không có ebook bổ sung",
"LabelMobileRedirectURIs": "URI chuyển hướng di động được cho phép", "LabelMobileRedirectURIs": "URI chuyển hướng di động được cho phép",
@@ -335,7 +364,7 @@
"LabelNextBackupDate": "Ngày sao lưu tiếp theo", "LabelNextBackupDate": "Ngày sao lưu tiếp theo",
"LabelNextScheduledRun": "Chạy tiếp theo theo lịch trình", "LabelNextScheduledRun": "Chạy tiếp theo theo lịch trình",
"LabelNoEpisodesSelected": "Không có tập nào được chọn", "LabelNoEpisodesSelected": "Không có tập nào được chọn",
"LabelNotFinished": "Chưa hoàn thành", "LabelNotFinished": "Chưa Hoàn Thành",
"LabelNotStarted": "Chưa bắt đầu", "LabelNotStarted": "Chưa bắt đầu",
"LabelNotes": "Ghi chú", "LabelNotes": "Ghi chú",
"LabelNotificationAppriseURL": "URL(s) thông báo", "LabelNotificationAppriseURL": "URL(s) thông báo",
@@ -348,7 +377,7 @@
"LabelNotificationsMaxQueueSize": "Kích thước hàng đợi tối đa cho sự kiện thông báo", "LabelNotificationsMaxQueueSize": "Kích thước hàng đợi tối đa cho sự kiện thông báo",
"LabelNotificationsMaxQueueSizeHelp": "Các sự kiện bị giới hạn mỗi giây chỉ gửi 1 lần. Các sự kiện sẽ bị bỏ qua nếu hàng đợi đạt kích thước tối đa. Điều này ngăn chặn spam thông báo.", "LabelNotificationsMaxQueueSizeHelp": "Các sự kiện bị giới hạn mỗi giây chỉ gửi 1 lần. Các sự kiện sẽ bị bỏ qua nếu hàng đợi đạt kích thước tối đa. Điều này ngăn chặn spam thông báo.",
"LabelNumberOfBooks": "Số lượng Sách", "LabelNumberOfBooks": "Số lượng Sách",
"LabelNumberOfEpisodes": "# của Tập", "LabelNumberOfEpisodes": "Số lượng tập",
"LabelOpenRSSFeed": "Mở RSS Feed", "LabelOpenRSSFeed": "Mở RSS Feed",
"LabelOverwrite": "Ghi đè", "LabelOverwrite": "Ghi đè",
"LabelPassword": "Mật khẩu", "LabelPassword": "Mật khẩu",
@@ -364,17 +393,19 @@
"LabelPhotoPathURL": "Đường dẫn/URL ảnh", "LabelPhotoPathURL": "Đường dẫn/URL ảnh",
"LabelPlayMethod": "Phương pháp phát", "LabelPlayMethod": "Phương pháp phát",
"LabelPlaylists": "Danh sách phát", "LabelPlaylists": "Danh sách phát",
"LabelPodcast": "Podcast",
"LabelPodcastSearchRegion": "Vùng tìm kiếm podcast", "LabelPodcastSearchRegion": "Vùng tìm kiếm podcast",
"LabelPodcastType": "Loại Podcast", "LabelPodcastType": "Loại Podcast",
"LabelPodcasts": "Các podcast", "LabelPodcasts": "Podcasts",
"LabelPort": "Cổng", "LabelPort": "Cổng",
"LabelPrefixesToIgnore": "Tiền tố để bỏ qua (không phân biệt chữ hoa/chữ thường)", "LabelPrefixesToIgnore": "Tiền tố để bỏ qua (không phân biệt chữ hoa/chữ thường)",
"LabelPreventIndexing": "Ngăn chặn feed của bạn được chỉ mục bởi thư mục podcast của iTunes và Google", "LabelPreventIndexing": "Ngăn Chặn Feed của bạn bị truy xuất bởi thư mục iTunes và Google podcast",
"LabelPrimaryEbook": "Ebook chính", "LabelPrimaryEbook": "Ebook chính",
"LabelProgress": "Tiến độ", "LabelProgress": "Tiến độ",
"LabelProvider": "Nhà cung cấp", "LabelProvider": "Nhà cung cấp",
"LabelPubDate": "Ngày Xuất bản", "LabelPubDate": "Ngày Xuất bản",
"LabelPublishYear": "Năm Xuất bản", "LabelPublishYear": "Năm Xuất Bản",
"LabelPublishedDate": "Xuất bản vào {0}",
"LabelPublisher": "Nhà xuất bản", "LabelPublisher": "Nhà xuất bản",
"LabelRSSFeedCustomOwnerEmail": "Email chủ sở hữu tùy chỉnh", "LabelRSSFeedCustomOwnerEmail": "Email chủ sở hữu tùy chỉnh",
"LabelRSSFeedCustomOwnerName": "Tên chủ sở hữu tùy chỉnh", "LabelRSSFeedCustomOwnerName": "Tên chủ sở hữu tùy chỉnh",
+35 -1
View File
@@ -127,6 +127,7 @@
"HeaderAudiobookTools": "有声读物文件管理工具", "HeaderAudiobookTools": "有声读物文件管理工具",
"HeaderAuthentication": "身份验证", "HeaderAuthentication": "身份验证",
"HeaderBackups": "备份", "HeaderBackups": "备份",
"HeaderBulkChapterModal": "添加多个章节",
"HeaderChangePassword": "更改密码", "HeaderChangePassword": "更改密码",
"HeaderChapters": "章节", "HeaderChapters": "章节",
"HeaderChooseAFolder": "选择文件夹", "HeaderChooseAFolder": "选择文件夹",
@@ -199,6 +200,7 @@
"HeaderSettingsExperimental": "实验功能", "HeaderSettingsExperimental": "实验功能",
"HeaderSettingsGeneral": "通用", "HeaderSettingsGeneral": "通用",
"HeaderSettingsScanner": "扫描", "HeaderSettingsScanner": "扫描",
"HeaderSettingsSecurity": "安全",
"HeaderSettingsWebClient": "网页客户端", "HeaderSettingsWebClient": "网页客户端",
"HeaderSleepTimer": "睡眠计时", "HeaderSleepTimer": "睡眠计时",
"HeaderStatsLargestItems": "最大的项目", "HeaderStatsLargestItems": "最大的项目",
@@ -293,6 +295,7 @@
"LabelContinueListening": "继续收听", "LabelContinueListening": "继续收听",
"LabelContinueReading": "继续阅读", "LabelContinueReading": "继续阅读",
"LabelContinueSeries": "继续收听系列", "LabelContinueSeries": "继续收听系列",
"LabelCorsAllowed": "允许的跨域来源",
"LabelCover": "封面", "LabelCover": "封面",
"LabelCoverImageURL": "封面图像 URL", "LabelCoverImageURL": "封面图像 URL",
"LabelCoverProvider": "封面提供者", "LabelCoverProvider": "封面提供者",
@@ -306,6 +309,7 @@
"LabelDeleteFromFileSystemCheckbox": "从文件系统删除 (取消选中仅从数据库中删除)", "LabelDeleteFromFileSystemCheckbox": "从文件系统删除 (取消选中仅从数据库中删除)",
"LabelDescription": "描述", "LabelDescription": "描述",
"LabelDeselectAll": "全部取消选择", "LabelDeselectAll": "全部取消选择",
"LabelDetectedPattern": "检测到的编号格式:",
"LabelDevice": "设备", "LabelDevice": "设备",
"LabelDeviceInfo": "设备信息", "LabelDeviceInfo": "设备信息",
"LabelDeviceIsAvailableTo": "设备可用于...", "LabelDeviceIsAvailableTo": "设备可用于...",
@@ -374,6 +378,7 @@
"LabelFilterByUser": "按用户筛选", "LabelFilterByUser": "按用户筛选",
"LabelFindEpisodes": "查找剧集", "LabelFindEpisodes": "查找剧集",
"LabelFinished": "已听完", "LabelFinished": "已听完",
"LabelFinishedDate": "完成于 {0}",
"LabelFolder": "文件夹", "LabelFolder": "文件夹",
"LabelFolders": "文件夹", "LabelFolders": "文件夹",
"LabelFontBold": "加粗", "LabelFontBold": "加粗",
@@ -418,6 +423,7 @@
"LabelLanguages": "语言", "LabelLanguages": "语言",
"LabelLastBookAdded": "最后添加的书", "LabelLastBookAdded": "最后添加的书",
"LabelLastBookUpdated": "最后更新的书", "LabelLastBookUpdated": "最后更新的书",
"LabelLastProgressDate": "上次阅读时间: {0}",
"LabelLastSeen": "上次查看时间", "LabelLastSeen": "上次查看时间",
"LabelLastTime": "最近一次", "LabelLastTime": "最近一次",
"LabelLastUpdate": "最近更新", "LabelLastUpdate": "最近更新",
@@ -430,6 +436,9 @@
"LabelLibraryFilterSublistEmpty": "没有 {0}", "LabelLibraryFilterSublistEmpty": "没有 {0}",
"LabelLibraryItem": "媒体库项目", "LabelLibraryItem": "媒体库项目",
"LabelLibraryName": "媒体库名称", "LabelLibraryName": "媒体库名称",
"LabelLibrarySortByProgress": "收听进度: 上次收听时间",
"LabelLibrarySortByProgressFinished": "收听进度: 已完成的",
"LabelLibrarySortByProgressStarted": "收听进度: 已开始的",
"LabelLimit": "限制", "LabelLimit": "限制",
"LabelLineSpacing": "行间距", "LabelLineSpacing": "行间距",
"LabelListenAgain": "再次收听", "LabelListenAgain": "再次收听",
@@ -438,6 +447,7 @@
"LabelLogLevelWarn": "警告", "LabelLogLevelWarn": "警告",
"LabelLookForNewEpisodesAfterDate": "在此日期后查找新剧集", "LabelLookForNewEpisodesAfterDate": "在此日期后查找新剧集",
"LabelLowestPriority": "最低优先级", "LabelLowestPriority": "最低优先级",
"LabelMatchConfidence": "置信度",
"LabelMatchExistingUsersBy": "匹配现有用户", "LabelMatchExistingUsersBy": "匹配现有用户",
"LabelMatchExistingUsersByDescription": "用于连接现有用户. 连接后, 用户将通过 SSO 提供商提供的唯一 id 进行匹配", "LabelMatchExistingUsersByDescription": "用于连接现有用户. 连接后, 用户将通过 SSO 提供商提供的唯一 id 进行匹配",
"LabelMaxEpisodesToDownload": "可下载的最大集数. 输入 0 表示无限制.", "LabelMaxEpisodesToDownload": "可下载的最大集数. 输入 0 表示无限制.",
@@ -467,6 +477,7 @@
"LabelNewestAuthors": "最新作者", "LabelNewestAuthors": "最新作者",
"LabelNewestEpisodes": "最新剧集", "LabelNewestEpisodes": "最新剧集",
"LabelNextBackupDate": "下次备份日期", "LabelNextBackupDate": "下次备份日期",
"LabelNextChapters": "后续章节示例:",
"LabelNextScheduledRun": "下次任务运行", "LabelNextScheduledRun": "下次任务运行",
"LabelNoApiKeys": "无 API 密钥", "LabelNoApiKeys": "无 API 密钥",
"LabelNoCustomMetadataProviders": "没有自定义元数据提供商", "LabelNoCustomMetadataProviders": "没有自定义元数据提供商",
@@ -484,6 +495,7 @@
"LabelNotificationsMaxQueueSize": "通知事件的最大队列大小", "LabelNotificationsMaxQueueSize": "通知事件的最大队列大小",
"LabelNotificationsMaxQueueSizeHelp": "通知事件被限制为每秒触发 1 个. 如果队列处于最大大小, 则将忽略事件. 这可以防止通知垃圾邮件.", "LabelNotificationsMaxQueueSizeHelp": "通知事件被限制为每秒触发 1 个. 如果队列处于最大大小, 则将忽略事件. 这可以防止通知垃圾邮件.",
"LabelNumberOfBooks": "图书数量", "LabelNumberOfBooks": "图书数量",
"LabelNumberOfChapters": "章节数量:",
"LabelNumberOfEpisodes": "# 集数", "LabelNumberOfEpisodes": "# 集数",
"LabelOpenIDAdvancedPermsClaimDescription": "OpenID 声明的名称, 该声明包含应用程序内用户操作的高级权限, 该权限将应用于非管理员角色(<b>如果已配置</b>). 如果响应中缺少声明, 获取 ABS 的权限将被拒绝. 如果缺少单个选项, 它将被视为 <code>禁用</code>. 确保身份提供商的声明与预期结构匹配:", "LabelOpenIDAdvancedPermsClaimDescription": "OpenID 声明的名称, 该声明包含应用程序内用户操作的高级权限, 该权限将应用于非管理员角色(<b>如果已配置</b>). 如果响应中缺少声明, 获取 ABS 的权限将被拒绝. 如果缺少单个选项, 它将被视为 <code>禁用</code>. 确保身份提供商的声明与预期结构匹配:",
"LabelOpenIDClaims": "将以下选项留空以禁用高级组和权限分配, 然后自动分配 'User' 组.", "LabelOpenIDClaims": "将以下选项留空以禁用高级组和权限分配, 然后自动分配 'User' 组.",
@@ -626,6 +638,7 @@
"LabelStartTime": "开始时间", "LabelStartTime": "开始时间",
"LabelStarted": "开始于", "LabelStarted": "开始于",
"LabelStartedAt": "收听始于", "LabelStartedAt": "收听始于",
"LabelStartedDate": "开始于 {0}",
"LabelStatsAudioTracks": "音轨", "LabelStatsAudioTracks": "音轨",
"LabelStatsAuthors": "作者", "LabelStatsAuthors": "作者",
"LabelStatsBestDay": "单日最高", "LabelStatsBestDay": "单日最高",
@@ -655,6 +668,7 @@
"LabelTheme": "主题", "LabelTheme": "主题",
"LabelThemeDark": "黑暗", "LabelThemeDark": "黑暗",
"LabelThemeLight": "明亮", "LabelThemeLight": "明亮",
"LabelThemeSepia": "棕褐色",
"LabelTimeBase": "时间基准", "LabelTimeBase": "时间基准",
"LabelTimeDurationXHours": "{0} 小时", "LabelTimeDurationXHours": "{0} 小时",
"LabelTimeDurationXMinutes": "{0} 分钟", "LabelTimeDurationXMinutes": "{0} 分钟",
@@ -739,6 +753,7 @@
"MessageBookshelfNoResultsForFilter": "过滤器无结果 \"{0}: {1}\"", "MessageBookshelfNoResultsForFilter": "过滤器无结果 \"{0}: {1}\"",
"MessageBookshelfNoResultsForQuery": "没有可查询的结果", "MessageBookshelfNoResultsForQuery": "没有可查询的结果",
"MessageBookshelfNoSeries": "你没有系列", "MessageBookshelfNoSeries": "你没有系列",
"MessageBulkChapterPattern": "您想用此编号模式添加多少个章节?",
"MessageChapterEndIsAfter": "章节结束是在有声读物结束之后", "MessageChapterEndIsAfter": "章节结束是在有声读物结束之后",
"MessageChapterErrorFirstNotZero": "第一章节必须从 0 开始", "MessageChapterErrorFirstNotZero": "第一章节必须从 0 开始",
"MessageChapterErrorStartGteDuration": "无效的开始时间, 必须小于有声读物持续时间", "MessageChapterErrorStartGteDuration": "无效的开始时间, 必须小于有声读物持续时间",
@@ -801,6 +816,8 @@
"MessageFeedURLWillBe": "源 URL 将改为 {0}", "MessageFeedURLWillBe": "源 URL 将改为 {0}",
"MessageFetching": "正在获取...", "MessageFetching": "正在获取...",
"MessageForceReScanDescription": "将像重新扫描一样再次扫描所有文件. 音频文件 ID3 标签, OPF 文件和文本文件将被扫描为新文件.", "MessageForceReScanDescription": "将像重新扫描一样再次扫描所有文件. 音频文件 ID3 标签, OPF 文件和文本文件将被扫描为新文件.",
"MessageHeatmapListeningTimeTooltip": "{1} <strong>收听了 {0}</strong>",
"MessageHeatmapNoListeningSessions": "{0} 没有收听",
"MessageImportantNotice": "重要通知!", "MessageImportantNotice": "重要通知!",
"MessageInsertChapterBelow": "在下面插入章节", "MessageInsertChapterBelow": "在下面插入章节",
"MessageInvalidAsin": "无效的 ASIN", "MessageInvalidAsin": "无效的 ASIN",
@@ -940,6 +957,7 @@
"NotificationOnRSSFeedDisabledDescription": "由于尝试失败次数过多而导致剧集自动下载被禁用时触发", "NotificationOnRSSFeedDisabledDescription": "由于尝试失败次数过多而导致剧集自动下载被禁用时触发",
"NotificationOnRSSFeedFailedDescription": "当用于自动下载剧集的 RSS 源请求失败时触发", "NotificationOnRSSFeedFailedDescription": "当用于自动下载剧集的 RSS 源请求失败时触发",
"NotificationOnTestDescription": "测试通知系统的事件", "NotificationOnTestDescription": "测试通知系统的事件",
"PlaceholderBulkChapterInput": "请输入章节标题, 或使用编号格式 (例如: \"Episode 1\", \"Chapter 10\", \"1.\")",
"PlaceholderNewCollection": "输入收藏夹名称", "PlaceholderNewCollection": "输入收藏夹名称",
"PlaceholderNewFolderPath": "输入文件夹路径", "PlaceholderNewFolderPath": "输入文件夹路径",
"PlaceholderNewPlaylist": "输入播放列表名称", "PlaceholderNewPlaylist": "输入播放列表名称",
@@ -993,8 +1011,12 @@
"ToastBookmarkCreateFailed": "创建书签失败", "ToastBookmarkCreateFailed": "创建书签失败",
"ToastBookmarkCreateSuccess": "书签已添加", "ToastBookmarkCreateSuccess": "书签已添加",
"ToastBookmarkRemoveSuccess": "书签已删除", "ToastBookmarkRemoveSuccess": "书签已删除",
"ToastBulkChapterInvalidCount": "输入一个1到150之间的整数",
"ToastCachePurgeFailed": "清除缓存失败", "ToastCachePurgeFailed": "清除缓存失败",
"ToastCachePurgeSuccess": "缓存清除成功", "ToastCachePurgeSuccess": "缓存清除成功",
"ToastChapterLocked": "章节已锁定.",
"ToastChapterStartTimeAdjusted": "章节开始时间已调整 {0} 秒",
"ToastChaptersAllLocked": "所有章节均已锁定. 请解锁要调整时间的章节.",
"ToastChaptersHaveErrors": "章节有错误", "ToastChaptersHaveErrors": "章节有错误",
"ToastChaptersInvalidShiftAmountLast": "偏移量无效. 最后一章的开始时间将超过这本有声读物的持续时间.", "ToastChaptersInvalidShiftAmountLast": "偏移量无效. 最后一章的开始时间将超过这本有声读物的持续时间.",
"ToastChaptersInvalidShiftAmountStart": "偏移量无效. 第一章的长度将为零或负数, 并会被第二章覆盖. 请增加第二章的起始时长.", "ToastChaptersInvalidShiftAmountStart": "偏移量无效. 第一章的长度将为零或负数, 并会被第二章覆盖. 请增加第二章的起始时长.",
@@ -1004,6 +1026,8 @@
"ToastCollectionItemsAddFailed": "项目添加到收藏夹失败", "ToastCollectionItemsAddFailed": "项目添加到收藏夹失败",
"ToastCollectionRemoveSuccess": "收藏夹已删除", "ToastCollectionRemoveSuccess": "收藏夹已删除",
"ToastCollectionUpdateSuccess": "收藏夹已更新", "ToastCollectionUpdateSuccess": "收藏夹已更新",
"ToastConnectionNotAvailable": "连接不可用. 请稍后重试",
"ToastCoverSearchFailed": "封面搜索失败",
"ToastCoverUpdateFailed": "封面更新失败", "ToastCoverUpdateFailed": "封面更新失败",
"ToastDateTimeInvalidOrIncomplete": "日期和时间无效或不完整", "ToastDateTimeInvalidOrIncomplete": "日期和时间无效或不完整",
"ToastDeleteFileFailed": "删除文件失败", "ToastDeleteFileFailed": "删除文件失败",
@@ -1028,6 +1052,7 @@
"ToastInvalidImageUrl": "图片网址无效", "ToastInvalidImageUrl": "图片网址无效",
"ToastInvalidMaxEpisodesToDownload": "可下载的最大集数无效", "ToastInvalidMaxEpisodesToDownload": "可下载的最大集数无效",
"ToastInvalidUrl": "网址无效", "ToastInvalidUrl": "网址无效",
"ToastInvalidUrls": "一个或多个 URL 无效",
"ToastItemCoverUpdateSuccess": "项目封面已更新", "ToastItemCoverUpdateSuccess": "项目封面已更新",
"ToastItemDeletedFailed": "删除项目失败", "ToastItemDeletedFailed": "删除项目失败",
"ToastItemDeletedSuccess": "已删除项目", "ToastItemDeletedSuccess": "已删除项目",
@@ -1077,6 +1102,7 @@
"ToastPlaylistUpdateSuccess": "播放列表已更新", "ToastPlaylistUpdateSuccess": "播放列表已更新",
"ToastPodcastCreateFailed": "创建播客失败", "ToastPodcastCreateFailed": "创建播客失败",
"ToastPodcastCreateSuccess": "已成功创建播客", "ToastPodcastCreateSuccess": "已成功创建播客",
"ToastPodcastEpisodeUpdated": "剧集已更新",
"ToastPodcastGetFeedFailed": "无法获取播客信息", "ToastPodcastGetFeedFailed": "无法获取播客信息",
"ToastPodcastNoEpisodesInFeed": "RSS 订阅中未找到任何剧集", "ToastPodcastNoEpisodesInFeed": "RSS 订阅中未找到任何剧集",
"ToastPodcastNoRssFeed": "播客没有 RSS 源", "ToastPodcastNoRssFeed": "播客没有 RSS 源",
@@ -1127,5 +1153,13 @@
"ToastUserPasswordChangeSuccess": "密码修改成功", "ToastUserPasswordChangeSuccess": "密码修改成功",
"ToastUserPasswordMismatch": "密码不匹配", "ToastUserPasswordMismatch": "密码不匹配",
"ToastUserPasswordMustChange": "新密码不能与旧密码相同", "ToastUserPasswordMustChange": "新密码不能与旧密码相同",
"ToastUserRootRequireName": "必须输入 root 用户名" "ToastUserRootRequireName": "必须输入 root 用户名",
"TooltipAddChapters": "添加章节",
"TooltipAddOneSecond": "加 1 秒",
"TooltipAdjustChapterStart": "点击调整开始时间",
"TooltipLockAllChapters": "锁定所有章节",
"TooltipLockChapter": "锁定章节 (按住 Shift再点击, 可进行范围选择)",
"TooltipSubtractOneSecond": "减 1 秒",
"TooltipUnlockAllChapters": "解锁所有章节",
"TooltipUnlockChapter": "解锁章节 (按住 Shift再点击, 可进行范围选择)"
} }
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "audiobookshelf", "name": "audiobookshelf",
"version": "2.26.2", "version": "2.30.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "audiobookshelf", "name": "audiobookshelf",
"version": "2.26.2", "version": "2.30.0",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"axios": "^0.27.2", "axios": "^0.27.2",
+2 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "audiobookshelf", "name": "audiobookshelf",
"version": "2.26.2", "version": "2.30.0",
"buildNumber": 1, "buildNumber": 1,
"description": "Self-hosted audiobook and podcast server", "description": "Self-hosted audiobook and podcast server",
"main": "index.js", "main": "index.js",
@@ -11,6 +11,7 @@
"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 .",
"build-win-no-compress": "npm run client && pkg -t node20-win-x64 -o ./dist/win/audiobookshelf .",
"build-linux": "build/linuxpackager", "build-linux": "build/linuxpackager",
"docker": "docker buildx build --platform linux/amd64,linux/arm64 --push . -t advplyr/audiobookshelf", "docker": "docker buildx build --platform linux/amd64,linux/arm64 --push . -t advplyr/audiobookshelf",
"docker-amd64-local": "docker buildx build --platform linux/amd64 --load . -t advplyr/audiobookshelf-amd64-local", "docker-amd64-local": "docker buildx build --platform linux/amd64 --load . -t advplyr/audiobookshelf-amd64-local",
+1 -1
View File
@@ -355,7 +355,7 @@ This application is built using [NodeJs](https://nodejs.org/).
### Localization ### Localization
Thank you to [Weblate](https://hosted.weblate.org/engage/audiobookshelf/) for hosting our localization infrastructure pro-bono. If you want to see Audiobookshelf in your language, please help us localize. Additional information on helping with the translations [here](https://www.audiobookshelf.org/faq#how-do-i-help-with-translations). <a href="https://hosted.weblate.org/engage/audiobookshelf/"> <img src="https://hosted.weblate.org/widget/audiobookshelf/abs-web-client/horizontal-auto.svg" alt="Translation status" /> </a> Thank you to [Weblate](https://hosted.weblate.org/engage/audiobookshelf/) for hosting our localization infrastructure pro-bono. If you want to see Audiobookshelf in your language, please help us localize. Additional information on helping with the translations [here](https://www.audiobookshelf.org/faq#how-do-i-help-with-translations). <a href="https://hosted.weblate.org/engage/audiobookshelf/"> <img src="https://hosted.weblate.org/widget/audiobookshelf/abs-web-client/multi-auto.svg" alt="Translation status" /> </a>
### Dev Container Setup ### Dev Container Setup
+21 -3
View File
@@ -213,6 +213,7 @@ class Auth {
* @param {Request} req * @param {Request} req
* @param {Response} res * @param {Response} res
* @param {string} authMethod - The authentication method, default is 'local'. * @param {string} authMethod - The authentication method, default is 'local'.
* @returns {Object|null} - Returns error object if validation fails, null if successful
*/ */
paramsToCookies(req, res, authMethod = 'local') { paramsToCookies(req, res, authMethod = 'local') {
const TWO_MINUTES = 120000 // 2 minutes in milliseconds const TWO_MINUTES = 120000 // 2 minutes in milliseconds
@@ -227,13 +228,24 @@ class Auth {
// Validate and store the callback URL // Validate and store the callback URL
if (!callback) { if (!callback) {
return res.status(400).send({ message: 'No callback parameter' }) res.status(400).send({ message: 'No callback parameter' })
return { error: 'No callback parameter' }
} }
// Security: Validate callback URL is same-origin only
if (!this.oidcAuthStrategy.isValidWebCallbackUrl(callback, req)) {
Logger.warn(`[Auth] Rejected invalid callback URL: ${callback}`)
res.status(400).send({ message: 'Invalid callback URL - must be same-origin' })
return { error: 'Invalid callback URL - must be same-origin' }
}
res.cookie('auth_cb', callback, { maxAge: TWO_MINUTES, httpOnly: true }) res.cookie('auth_cb', callback, { maxAge: TWO_MINUTES, httpOnly: true })
} }
// Store the authentication method for long // Store the authentication method for long
Logger.debug(`[Auth] paramsToCookies: setting auth_method cookie to ${authMethod}`)
res.cookie('auth_method', authMethod, { maxAge: 1000 * 60 * 60 * 24 * 365 * 10, httpOnly: true }) res.cookie('auth_method', authMethod, { maxAge: 1000 * 60 * 60 * 24 * 365 * 10, httpOnly: true })
return null
} }
/** /**
@@ -247,6 +259,7 @@ class Auth {
// Handle token generation and get userResponse object // Handle token generation and get userResponse object
// For API based auth (e.g. mobile), we will return the refresh token in the response // For API based auth (e.g. mobile), we will return the refresh token in the response
const isApiBased = this.isAuthMethodAPIBased(req.cookies.auth_method) const isApiBased = this.isAuthMethodAPIBased(req.cookies.auth_method)
Logger.debug(`[Auth] handleLoginSuccessBasedOnCookie: isApiBased: ${isApiBased}, auth_method: ${req.cookies.auth_method}`)
const userResponse = await this.handleLoginSuccess(req, res, isApiBased) const userResponse = await this.handleLoginSuccess(req, res, isApiBased)
if (isApiBased) { if (isApiBased) {
@@ -254,7 +267,6 @@ class Auth {
res.json(userResponse) res.json(userResponse)
} else { } else {
// UI request -> check if we have a callback url // UI request -> check if we have a callback url
// TODO: do we want to somehow limit the values for auth_cb?
if (req.cookies.auth_cb) { if (req.cookies.auth_cb) {
let stateQuery = req.cookies.auth_state ? `&state=${req.cookies.auth_state}` : '' let stateQuery = req.cookies.auth_state ? `&state=${req.cookies.auth_state}` : ''
// UI request -> redirect to auth_cb url and send the jwt token as parameter // UI request -> redirect to auth_cb url and send the jwt token as parameter
@@ -288,6 +300,8 @@ class Auth {
userResponse.user.refreshToken = returnTokens ? refreshToken : null userResponse.user.refreshToken = returnTokens ? refreshToken : null
userResponse.user.accessToken = accessToken userResponse.user.accessToken = accessToken
Logger.debug(`[Auth] handleLoginSuccess: returnTokens: ${returnTokens}, isRefreshTokenInResponse: ${!!userResponse.user.refreshToken}`)
if (!returnTokens) { if (!returnTokens) {
this.tokenManager.setRefreshTokenCookie(req, res, refreshToken) this.tokenManager.setRefreshTokenCookie(req, res, refreshToken)
} }
@@ -350,7 +364,11 @@ class Auth {
return res.status(authorizationUrlResponse.status).send(authorizationUrlResponse.error) return res.status(authorizationUrlResponse.status).send(authorizationUrlResponse.error)
} }
this.paramsToCookies(req, res, authorizationUrlResponse.isMobileFlow ? 'openid-mobile' : 'openid') // Check if paramsToCookies sent a response (e.g., due to invalid callback URL)
const cookieResult = this.paramsToCookies(req, res, authorizationUrlResponse.isMobileFlow ? 'openid-mobile' : 'openid')
if (cookieResult && cookieResult.error) {
return // Response already sent by paramsToCookies
}
res.redirect(authorizationUrlResponse.authorizationUrl) res.redirect(authorizationUrlResponse.authorizationUrl)
}) })
+9 -5
View File
@@ -11,6 +11,7 @@ const axios = require('axios')
const { version } = require('../package.json') const { version } = require('../package.json')
// Utils // Utils
const is = require('./libs/requestIp/isJs')
const fileUtils = require('./utils/fileUtils') const fileUtils = require('./utils/fileUtils')
const { toNumber } = require('./utils/index') const { toNumber } = require('./utils/index')
const Logger = require('./Logger') const Logger = require('./Logger')
@@ -229,6 +230,10 @@ class Server {
res.setHeader('Content-Security-Policy', "frame-ancestors 'self'") res.setHeader('Content-Security-Policy', "frame-ancestors 'self'")
} }
// Security: Prevent referrer leakage to protect against token exposure
// Using 'no-referrer' to completely prevent token leakage in referer headers
res.setHeader('Referrer-Policy', 'no-referrer')
/** /**
* @temporary * @temporary
* This is necessary for the ebook & cover API endpoint in the mobile apps * This is necessary for the ebook & cover API endpoint in the mobile apps
@@ -240,8 +245,8 @@ class Server {
* Running in development allows cors to allow testing the mobile apps in the browser * Running in development allows cors to allow testing the mobile apps in the browser
* or env variable ALLOW_CORS = '1' * or env variable ALLOW_CORS = '1'
*/ */
if (global.AllowCors || Logger.isDev || req.path.match(/\/api\/items\/([a-z0-9-]{36})\/(ebook|cover)(\/[0-9]+)?/)) { if (global.AllowCors || Logger.isDev || req.path.match(/\/api\/items\/([a-z0-9-]{36})\/(ebook|cover)(\/[0-9]+)?/) || global.ServerSettings.allowedOrigins?.length) {
const allowedOrigins = ['capacitor://localhost', 'http://localhost'] const allowedOrigins = ['capacitor://localhost', 'http://localhost', ...(global.ServerSettings.allowedOrigins ? global.ServerSettings.allowedOrigins : [])]
if (global.AllowCors || Logger.isDev || allowedOrigins.some((o) => o === req.get('origin'))) { if (global.AllowCors || Logger.isDev || allowedOrigins.some((o) => o === req.get('origin'))) {
res.header('Access-Control-Allow-Origin', req.get('origin')) res.header('Access-Control-Allow-Origin', req.get('origin'))
res.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS') res.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS')
@@ -402,8 +407,7 @@ class Server {
const nextApp = next({ dev: Logger.isDev, dir: ReactClientPath }) const nextApp = next({ dev: Logger.isDev, dir: ReactClientPath })
const handle = nextApp.getRequestHandler() const handle = nextApp.getRequestHandler()
await nextApp.prepare() await nextApp.prepare()
router.get('*', (req, res) => handle(req, res)) router.all('*', (req, res) => handle(req, res))
router.post('/internal-api/*', (req, res) => handle(req, res))
} }
const unixSocketPrefix = 'unix/' const unixSocketPrefix = 'unix/'
@@ -415,7 +419,7 @@ class Server {
}) })
} else { } else {
this.server.listen(this.Port, this.Host, () => { this.server.listen(this.Port, this.Host, () => {
if (this.Host) Logger.info(`Listening on http://${this.Host}:${this.Port}`) if (this.Host) Logger.info(`Listening on http://${is.ipv6(this.Host) ? `[${this.Host}]` : this.Host}:${this.Port}`)
else Logger.info(`Listening on port :${this.Port}`) else Logger.info(`Listening on port :${this.Port}`)
}) })
} }
+104
View File
@@ -2,6 +2,7 @@ const SocketIO = require('socket.io')
const Logger = require('./Logger') const Logger = require('./Logger')
const Database = require('./Database') const Database = require('./Database')
const TokenManager = require('./auth/TokenManager') const TokenManager = require('./auth/TokenManager')
const CoverSearchManager = require('./managers/CoverSearchManager')
/** /**
* @typedef SocketClient * @typedef SocketClient
@@ -180,6 +181,10 @@ class SocketAuthority {
// Scanning // Scanning
socket.on('cancel_scan', (libraryId) => this.cancelScan(libraryId)) socket.on('cancel_scan', (libraryId) => this.cancelScan(libraryId))
// Cover search streaming
socket.on('search_covers', (payload) => this.handleCoverSearch(socket, payload))
socket.on('cancel_cover_search', (requestId) => this.handleCancelCoverSearch(socket, requestId))
// Logs // Logs
socket.on('set_log_listener', (level) => Logger.addSocketListener(socket, level)) socket.on('set_log_listener', (level) => Logger.addSocketListener(socket, level))
socket.on('remove_log_listener', () => Logger.removeSocketListener(socket.id)) socket.on('remove_log_listener', () => Logger.removeSocketListener(socket.id))
@@ -200,6 +205,10 @@ class SocketAuthority {
const disconnectTime = Date.now() - _client.connected_at const disconnectTime = Date.now() - _client.connected_at
Logger.info(`[SocketAuthority] Socket ${socket.id} disconnected from client "${_client.user.username}" after ${disconnectTime}ms (Reason: ${reason})`) Logger.info(`[SocketAuthority] Socket ${socket.id} disconnected from client "${_client.user.username}" after ${disconnectTime}ms (Reason: ${reason})`)
// Cancel any active cover searches for this socket
this.cancelSocketCoverSearches(socket.id)
delete this.clients[socket.id] delete this.clients[socket.id]
} }
}) })
@@ -300,5 +309,100 @@ class SocketAuthority {
Logger.debug('[SocketAuthority] Cancel scan', id) Logger.debug('[SocketAuthority] Cancel scan', id)
this.Server.cancelLibraryScan(id) this.Server.cancelLibraryScan(id)
} }
/**
* Handle cover search request via WebSocket
* @param {SocketIO.Socket} socket
* @param {Object} payload
*/
async handleCoverSearch(socket, payload) {
const client = this.clients[socket.id]
if (!client?.user) {
Logger.error('[SocketAuthority] Unauthorized cover search request')
socket.emit('cover_search_error', {
requestId: payload.requestId,
error: 'Unauthorized'
})
return
}
const { requestId, title, author, provider, podcast } = payload
if (!requestId || !title) {
Logger.error('[SocketAuthority] Invalid cover search request')
socket.emit('cover_search_error', {
requestId,
error: 'Invalid request parameters'
})
return
}
Logger.info(`[SocketAuthority] User ${client.user.username} initiated cover search ${requestId}`)
// Callback for streaming results to client
const onResult = (result) => {
socket.emit('cover_search_result', {
requestId,
provider: result.provider,
covers: result.covers,
total: result.total
})
}
// Callback when search completes
const onComplete = () => {
Logger.info(`[SocketAuthority] Cover search ${requestId} completed`)
socket.emit('cover_search_complete', { requestId })
}
// Callback for provider errors
const onError = (provider, errorMessage) => {
socket.emit('cover_search_provider_error', {
requestId,
provider,
error: errorMessage
})
}
// Start the search
CoverSearchManager.startSearch(requestId, { title, author, provider, podcast }, onResult, onComplete, onError).catch((error) => {
Logger.error(`[SocketAuthority] Cover search ${requestId} failed:`, error)
socket.emit('cover_search_error', {
requestId,
error: error.message
})
})
}
/**
* Handle cancel cover search request
* @param {SocketIO.Socket} socket
* @param {string} requestId
*/
handleCancelCoverSearch(socket, requestId) {
const client = this.clients[socket.id]
if (!client?.user) {
Logger.error('[SocketAuthority] Unauthorized cancel cover search request')
return
}
Logger.info(`[SocketAuthority] User ${client.user.username} cancelled cover search ${requestId}`)
const cancelled = CoverSearchManager.cancelSearch(requestId)
if (cancelled) {
socket.emit('cover_search_cancelled', { requestId })
}
}
/**
* Cancel all cover searches associated with a socket (called on disconnect)
* @param {string} socketId
*/
cancelSocketCoverSearches(socketId) {
// Get all active search request IDs and cancel those that might belong to this socket
// Since we don't track socket-to-request mapping, we log this for debugging
// The client will handle reconnection gracefully
Logger.debug(`[SocketAuthority] Socket ${socketId} disconnected, any active searches will timeout`)
}
} }
module.exports = new SocketAuthority() module.exports = new SocketAuthority()
+75 -2
View File
@@ -110,6 +110,8 @@ class OidcAuthStrategy {
* @param {Function} done - Passport callback * @param {Function} done - Passport callback
*/ */
async verifyCallback(tokenset, userinfo, done) { async verifyCallback(tokenset, userinfo, done) {
let isNewUser = false
let user = null
try { try {
Logger.debug(`[OidcAuth] openid callback userinfo=`, JSON.stringify(userinfo, null, 2)) Logger.debug(`[OidcAuth] openid callback userinfo=`, JSON.stringify(userinfo, null, 2))
@@ -121,9 +123,24 @@ class OidcAuthStrategy {
throw new Error(`Group claim ${Database.serverSettings.authOpenIDGroupClaim} not found or empty in userinfo`) throw new Error(`Group claim ${Database.serverSettings.authOpenIDGroupClaim} not found or empty in userinfo`)
} }
let user = await Database.userModel.findOrCreateUserFromOpenIdUserInfo(userinfo) user = await Database.userModel.findUserFromOpenIdUserInfo(userinfo)
if (!user?.isActive) { if (user?.error) {
throw new Error('Invalid userinfo or already linked')
}
if (!user) {
// If no existing user was matched, auto-register if configured
if (global.ServerSettings.authOpenIDAutoRegister) {
Logger.info(`[User] openid: Auto-registering user with sub "${userinfo.sub}"`, userinfo)
user = await Database.userModel.createUserFromOpenIdUserInfo(userinfo)
isNewUser = true
} else {
Logger.warn(`[User] openid: User not found and auto-register is disabled`)
}
}
if (!user.isActive) {
throw new Error('User not active or not found') throw new Error('User not active or not found')
} }
@@ -136,6 +153,10 @@ class OidcAuthStrategy {
return done(null, user) return done(null, user)
} catch (error) { } catch (error) {
Logger.error(`[OidcAuth] openid callback error: ${error?.message}\n${error?.stack}`) Logger.error(`[OidcAuth] openid callback error: ${error?.message}\n${error?.stack}`)
// Remove new user if an error occurs
if (isNewUser && user) {
await user.destroy()
}
return done(null, null, 'Unauthorized') return done(null, null, 'Unauthorized')
} }
} }
@@ -483,6 +504,58 @@ class OidcAuthStrategy {
res.status(500).send('Internal Server Error') res.status(500).send('Internal Server Error')
} }
} }
/**
* Validates if a callback URL is safe for redirect (same-origin only)
* @param {string} callbackUrl - The callback URL to validate
* @param {Request} req - Express request object to get current host
* @returns {boolean} - True if the URL is safe (same-origin), false otherwise
*/
isValidWebCallbackUrl(callbackUrl, req) {
if (!callbackUrl) return false
try {
// Handle relative URLs - these are always safe if they start with router base path
if (callbackUrl.startsWith('/')) {
// Only allow relative paths that start with the router base path
if (callbackUrl.startsWith(global.RouterBasePath + '/')) {
return true
}
Logger.warn(`[OidcAuth] Rejected callback URL outside router base path: ${callbackUrl}`)
return false
}
// For absolute URLs, ensure they point to the same origin
const callbackUrlObj = new URL(callbackUrl)
// NPM appends both http and https in x-forwarded-proto sometimes, so we need to check for both
const xfp = (req.get('x-forwarded-proto') || '').toLowerCase()
const currentProtocol =
req.secure ||
xfp
.split(',')
.map((s) => s.trim())
.includes('https')
? 'https'
: 'http'
const currentHost = req.get('host')
// Check if protocol and host match exactly
if (callbackUrlObj.protocol === currentProtocol + ':' && callbackUrlObj.host === currentHost) {
// Additional check: ensure path starts with router base path
if (callbackUrlObj.pathname.startsWith(global.RouterBasePath + '/')) {
return true
}
Logger.warn(`[OidcAuth] Rejected same-origin callback URL outside router base path: ${callbackUrl}`)
return false
}
Logger.warn(`[OidcAuth] Rejected callback URL to different origin: ${callbackUrl} (expected ${currentProtocol}://${currentHost})`)
return false
} catch (error) {
Logger.error(`[OidcAuth] Invalid callback URL format: ${callbackUrl}`, error)
return false
}
}
} }
module.exports = OidcAuthStrategy module.exports = OidcAuthStrategy
+2 -2
View File
@@ -280,7 +280,7 @@ class MeController {
} }
const { password, newPassword } = req.body const { password, newPassword } = req.body
if (!password || !newPassword || typeof password !== 'string' || typeof newPassword !== 'string') { if ((typeof password !== 'string' && password !== null) || (typeof newPassword !== 'string' && newPassword !== null)) {
return res.status(400).send('Missing or invalid password or new password') return res.status(400).send('Missing or invalid password or new password')
} }
@@ -450,7 +450,7 @@ class MeController {
if (updated) { if (updated) {
await Database.updateSetting(Database.emailSettings) await Database.updateSetting(Database.emailSettings)
SocketAuthority.clientEmitter(req.user.id, 'ereader-devices-updated', { SocketAuthority.clientEmitter(req.user.id, 'ereader-devices-updated', {
ereaderDevices: Database.emailSettings.ereaderDevices ereaderDevices: Database.emailSettings.getEReaderDevices(req.user)
}) })
} }
res.json({ res.json({
+19 -1
View File
@@ -4,6 +4,7 @@ const Logger = require('../Logger')
const Database = require('../Database') const Database = require('../Database')
const { toNumber, isUUID } = require('../utils/index') const { toNumber, isUUID } = require('../utils/index')
const { getAudioMimeTypeFromExtname, encodeUriPath } = require('../utils/fileUtils') const { getAudioMimeTypeFromExtname, encodeUriPath } = require('../utils/fileUtils')
const { PlayMethod } = require('../utils/constants')
const ShareManager = require('../managers/ShareManager') const ShareManager = require('../managers/ShareManager')
@@ -288,12 +289,29 @@ class SessionController {
return res.sendStatus(404) return res.sendStatus(404)
} }
const audioTrack = playbackSession.audioTracks.find((t) => t.index === audioTrackIndex) let audioTrack = playbackSession.audioTracks.find((t) => toNumber(t.index, 1) === audioTrackIndex)
// Support clients passing 0 or 1 for podcast episode audio track index (handles old episodes pre-v2.21.0 having null index)
if (!audioTrack && playbackSession.mediaType === 'podcast' && audioTrackIndex === 0) {
audioTrack = playbackSession.audioTracks[0]
}
if (!audioTrack) { if (!audioTrack) {
Logger.error(`[SessionController] Unable to find audio track with index=${audioTrackIndex}`) Logger.error(`[SessionController] Unable to find audio track with index=${audioTrackIndex}`)
return res.sendStatus(404) return res.sendStatus(404)
} }
// Redirect transcode requests to the HLS router
// Handles bug introduced in android v0.10.0-beta where transcode requests are made to this endpoint
if (playbackSession.playMethod === PlayMethod.TRANSCODE && audioTrack.contentUrl) {
Logger.debug(`[SessionController] Redirecting transcode request to "${audioTrack.contentUrl}"`)
return res.redirect(audioTrack.contentUrl)
}
if (!audioTrack.metadata?.path) {
Logger.error(`[SessionController] Invalid audio track "${audioTrack.index}" for session "${req.params.id}"`)
return res.sendStatus(500)
}
const user = await Database.userModel.getUserById(playbackSession.userId) const user = await Database.userModel.getUserById(playbackSession.userId)
Logger.debug(`[SessionController] Serving audio track ${audioTrack.index} for session "${req.params.id}" belonging to user "${user.username}"`) Logger.debug(`[SessionController] Serving audio track ${audioTrack.index} for session "${req.params.id}" belonging to user "${user.username}"`)
+9 -1
View File
@@ -11,7 +11,7 @@ const { levenshteinDistance, levenshteinSimilarity, escapeRegExp, isValidASIN }
const htmlSanitizer = require('../utils/htmlSanitizer') const htmlSanitizer = require('../utils/htmlSanitizer')
class BookFinder { class BookFinder {
#providerResponseTimeout = 30000 #providerResponseTimeout = 10000
constructor() { constructor() {
this.openLibrary = new OpenLibrary() this.openLibrary = new OpenLibrary()
@@ -608,6 +608,14 @@ class BookFinder {
Logger.debug(`[BookFinder] Found ${providerResults.length} covers from ${providerString}`) Logger.debug(`[BookFinder] Found ${providerResults.length} covers from ${providerString}`)
searchResults.push(...providerResults) searchResults.push(...providerResults)
} }
} else if (provider === 'best') {
// Best providers: google, fantlab, and audible.com
const bestProviders = ['google', 'fantlab', 'audible']
for (const providerString of bestProviders) {
const providerResults = await this.search(null, providerString, title, author, options)
Logger.debug(`[BookFinder] Found ${providerResults.length} covers from ${providerString}`)
searchResults.push(...providerResults)
}
} else { } else {
searchResults = await this.search(null, provider, title, author, options) searchResults = await this.search(null, provider, title, author, options)
} }
+251
View File
@@ -0,0 +1,251 @@
const { setMaxListeners } = require('events')
const Logger = require('../Logger')
const BookFinder = require('../finders/BookFinder')
const PodcastFinder = require('../finders/PodcastFinder')
/**
* Manager for handling streaming cover search across multiple providers
*/
class CoverSearchManager {
constructor() {
/** @type {Map<string, AbortController>} Map of requestId to AbortController */
this.activeSearches = new Map()
// Default timeout for each provider search
this.providerTimeout = 10000 // 10 seconds
// Set to 0 to disable the max listeners limit
// We need one listener per provider (15+) and may have multiple concurrent searches
this.maxListeners = 0
}
/**
* Start a streaming cover search
* @param {string} requestId - Unique identifier for this search request
* @param {Object} searchParams - Search parameters
* @param {string} searchParams.title - Title to search for
* @param {string} searchParams.author - Author to search for (optional)
* @param {string} searchParams.provider - Provider to search (or 'all')
* @param {boolean} searchParams.podcast - Whether this is a podcast search
* @param {Function} onResult - Callback for each result chunk
* @param {Function} onComplete - Callback when search completes
* @param {Function} onError - Callback for errors
*/
async startSearch(requestId, searchParams, onResult, onComplete, onError) {
if (this.activeSearches.has(requestId)) {
Logger.warn(`[CoverSearchManager] Search with requestId ${requestId} already exists`)
return
}
const abortController = new AbortController()
// Increase max listeners on this signal to accommodate parallel provider searches
// AbortSignal is an EventTarget, so we use the events module's setMaxListeners
setMaxListeners(this.maxListeners, abortController.signal)
this.activeSearches.set(requestId, abortController)
Logger.info(`[CoverSearchManager] Starting search ${requestId} with params:`, searchParams)
try {
const { title, author, provider, podcast } = searchParams
if (podcast) {
await this.searchPodcastCovers(requestId, title, abortController.signal, onResult, onError)
} else {
await this.searchBookCovers(requestId, provider, title, author, abortController.signal, onResult, onError)
}
if (!abortController.signal.aborted) {
onComplete()
}
} catch (error) {
if (error.name === 'AbortError') {
Logger.info(`[CoverSearchManager] Search ${requestId} was cancelled`)
} else {
Logger.error(`[CoverSearchManager] Search ${requestId} failed:`, error)
onError(error.message)
}
} finally {
this.activeSearches.delete(requestId)
}
}
/**
* Cancel an active search
* @param {string} requestId - Request ID to cancel
*/
cancelSearch(requestId) {
const abortController = this.activeSearches.get(requestId)
if (abortController) {
Logger.info(`[CoverSearchManager] Cancelling search ${requestId}`)
abortController.abort()
this.activeSearches.delete(requestId)
return true
}
return false
}
/**
* Search for podcast covers
*/
async searchPodcastCovers(requestId, title, signal, onResult, onError) {
try {
const results = await this.executeWithTimeout(() => PodcastFinder.findCovers(title), this.providerTimeout, signal)
if (signal.aborted) return
const covers = this.extractCoversFromResults(results)
if (covers.length > 0) {
onResult({
provider: 'itunes',
covers,
total: covers.length
})
}
} catch (error) {
if (error.name !== 'AbortError') {
Logger.error(`[CoverSearchManager] Podcast search failed:`, error)
onError('itunes', error.message)
}
}
}
/**
* Search for book covers across providers
*/
async searchBookCovers(requestId, provider, title, author, signal, onResult, onError) {
let providers = []
if (provider === 'all') {
providers = [...BookFinder.providers]
} else if (provider === 'best') {
// Best providers: google, fantlab, and audible.com
providers = ['google', 'fantlab', 'audible']
} else {
providers = [provider]
}
Logger.debug(`[CoverSearchManager] Searching ${providers.length} providers in parallel`)
// Search all providers in parallel
const searchPromises = providers.map(async (providerName) => {
if (signal.aborted) return
try {
const searchResults = await this.executeWithTimeout(() => BookFinder.search(null, providerName, title, author || ''), this.providerTimeout, signal)
if (signal.aborted) return
const covers = this.extractCoversFromResults(searchResults)
Logger.debug(`[CoverSearchManager] Found ${covers.length} covers from ${providerName}`)
if (covers.length > 0) {
onResult({
provider: providerName,
covers,
total: covers.length
})
}
} catch (error) {
if (error.name !== 'AbortError') {
Logger.warn(`[CoverSearchManager] Provider ${providerName} failed:`, error.message)
onError(providerName, error.message)
}
}
})
await Promise.allSettled(searchPromises)
}
/**
* Execute a promise with timeout and abort signal
*/
async executeWithTimeout(fn, timeout, signal) {
return new Promise(async (resolve, reject) => {
let abortHandler = null
let timeoutId = null
// Cleanup function to ensure we always remove listeners
const cleanup = () => {
if (timeoutId) {
clearTimeout(timeoutId)
timeoutId = null
}
if (abortHandler) {
signal.removeEventListener('abort', abortHandler)
abortHandler = null
}
}
// Set up timeout
timeoutId = setTimeout(() => {
cleanup()
const error = new Error('Provider timeout')
error.name = 'TimeoutError'
reject(error)
}, timeout)
// Check if already aborted
if (signal.aborted) {
cleanup()
const error = new Error('Search cancelled')
error.name = 'AbortError'
reject(error)
return
}
// Set up abort handler
abortHandler = () => {
cleanup()
const error = new Error('Search cancelled')
error.name = 'AbortError'
reject(error)
}
signal.addEventListener('abort', abortHandler)
try {
const result = await fn()
cleanup()
resolve(result)
} catch (error) {
cleanup()
reject(error)
}
})
}
/**
* Extract cover URLs from search results
*/
extractCoversFromResults(results) {
const covers = []
if (!Array.isArray(results)) return covers
results.forEach((result) => {
if (result.covers && Array.isArray(result.covers)) {
covers.push(...result.covers)
}
if (result.cover) {
covers.push(result.cover)
}
})
// Remove duplicates
return [...new Set(covers)]
}
/**
* Cancel all active searches (cleanup on server shutdown)
*/
cancelAllSearches() {
Logger.info(`[CoverSearchManager] Cancelling ${this.activeSearches.size} active searches`)
for (const [requestId, abortController] of this.activeSearches.entries()) {
abortController.abort()
}
this.activeSearches.clear()
}
}
module.exports = new CoverSearchManager()
+30 -34
View File
@@ -121,28 +121,27 @@ class PodcastManager {
await fs.mkdir(this.currentDownload.libraryItem.path) await fs.mkdir(this.currentDownload.libraryItem.path)
} }
let success = false // Download episode and tag it
if (this.currentDownload.isMp3) { const ffmpegDownloadResponse = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => {
// Download episode and tag it Logger.error(`[PodcastManager] Podcast Episode download failed`, error)
const ffmpegDownloadResponse = await ffmpegHelpers.downloadPodcastEpisode(this.currentDownload).catch((error) => { })
Logger.error(`[PodcastManager] Podcast Episode download failed`, error) let success = !!ffmpegDownloadResponse?.success
})
success = !!ffmpegDownloadResponse?.success
// If failed due to ffmpeg error, retry without tagging if (success) {
// e.g. RSS feed may have incorrect file extension and file type // Attempt to ffprobe and add podcast episode audio file
// See https://github.com/advplyr/audiobookshelf/issues/3837 success = await this.scanAddPodcastEpisodeAudioFile()
if (!success && ffmpegDownloadResponse?.isFfmpegError) { if (!success) {
Logger.info(`[PodcastManager] Retrying episode download without tagging`) Logger.error(`[PodcastManager] Failed to scan and add podcast episode audio file - removing file`)
// Download episode only await fs.remove(this.currentDownload.targetPath)
success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath)
.then(() => true)
.catch((error) => {
Logger.error(`[PodcastManager] Podcast Episode download failed`, error)
return false
})
} }
} else { }
// If failed due to ffmpeg or ffprobe error, retry without tagging
// e.g. RSS feed may have incorrect file extension and file type
// See https://github.com/advplyr/audiobookshelf/issues/3837
// e.g. Ffmpeg may be download the file without streams causing the ffprobe to fail
if (!success && !ffmpegDownloadResponse?.isRequestError) {
Logger.info(`[PodcastManager] Retrying episode download without tagging`)
// Download episode only // Download episode only
success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath) success = await downloadFile(this.currentDownload.url, this.currentDownload.targetPath)
.then(() => true) .then(() => true)
@@ -150,23 +149,20 @@ class PodcastManager {
Logger.error(`[PodcastManager] Podcast Episode download failed`, error) Logger.error(`[PodcastManager] Podcast Episode download failed`, error)
return false return false
}) })
if (success) {
success = await this.scanAddPodcastEpisodeAudioFile()
if (!success) {
Logger.error(`[PodcastManager] Failed to scan and add podcast episode audio file - removing file`)
await fs.remove(this.currentDownload.targetPath)
}
}
} }
if (success) { if (success) {
success = await this.scanAddPodcastEpisodeAudioFile() Logger.info(`[PodcastManager] Successfully downloaded podcast episode "${this.currentDownload.episodeTitle}"`)
if (!success) { this.currentDownload.setFinished(true)
await fs.remove(this.currentDownload.targetPath) task.setFinished()
this.currentDownload.setFinished(false)
const taskFailedString = {
text: 'Failed',
key: 'MessageTaskFailed'
}
task.setFailed(taskFailedString)
} else {
Logger.info(`[PodcastManager] Successfully downloaded podcast episode "${this.currentDownload.episodeTitle}"`)
this.currentDownload.setFinished(true)
task.setFinished()
}
} else { } else {
const taskFailedString = { const taskFailedString = {
text: 'Failed', text: 'Failed',
+12
View File
@@ -82,6 +82,13 @@ class Podcast extends Model {
const genres = Array.isArray(payload.metadata.genres) && payload.metadata.genres.every((g) => typeof g === 'string' && g.length) ? payload.metadata.genres : [] const genres = Array.isArray(payload.metadata.genres) && payload.metadata.genres.every((g) => typeof g === 'string' && g.length) ? payload.metadata.genres : []
const tags = Array.isArray(payload.tags) && payload.tags.every((t) => typeof t === 'string' && t.length) ? payload.tags : [] const tags = Array.isArray(payload.tags) && payload.tags.every((t) => typeof t === 'string' && t.length) ? payload.tags : []
const stringKeys = ['title', 'author', 'releaseDate', 'feedUrl', 'imageUrl', 'description', 'itunesPageUrl', 'itunesId', 'itunesArtistId', 'language', 'type']
stringKeys.forEach((key) => {
if (typeof payload.metadata[key] === 'number') {
payload.metadata[key] = String(payload.metadata[key])
}
})
return this.create( return this.create(
{ {
title, title,
@@ -205,6 +212,11 @@ class Podcast extends Model {
if (payload.metadata) { if (payload.metadata) {
const stringKeys = ['title', 'author', 'releaseDate', 'feedUrl', 'imageUrl', 'description', 'itunesPageUrl', 'itunesId', 'itunesArtistId', 'language', 'type'] const stringKeys = ['title', 'author', 'releaseDate', 'feedUrl', 'imageUrl', 'description', 'itunesPageUrl', 'itunesId', 'itunesArtistId', 'language', 'type']
stringKeys.forEach((key) => { stringKeys.forEach((key) => {
// Convert numbers to strings
if (typeof payload.metadata[key] === 'number') {
payload.metadata[key] = String(payload.metadata[key])
}
let newKey = key let newKey = key
if (key === 'type') { if (key === 'type') {
newKey = 'podcastType' newKey = 'podcastType'
+1
View File
@@ -185,6 +185,7 @@ class PodcastEpisode extends Model {
const track = structuredClone(this.audioFile) const track = structuredClone(this.audioFile)
track.startOffset = 0 track.startOffset = 0
track.title = this.audioFile.metadata.filename track.title = this.audioFile.metadata.filename
track.index = 1 // Podcast episodes only have one track
track.contentUrl = `/api/items/${libraryItemId}/file/${track.ino}` track.contentUrl = `/api/items/${libraryItemId}/file/${track.ino}`
return track return track
} }
+35 -31
View File
@@ -211,18 +211,18 @@ class User extends Model {
} }
/** /**
* Finds an existing user by OpenID subject identifier, or by email/username based on server settings, * Finds an existing user by OpenID subject identifier, or by email/username based on server settings
* or creates a new user if configured to do so. * Returns null if no user is found
* *
* @param {Object} userinfo * @param {Object} userinfo
* @returns {Promise<User>} * @returns {Promise<User|{error: string}>}
*/ */
static async findOrCreateUserFromOpenIdUserInfo(userinfo) { static async findUserFromOpenIdUserInfo(userinfo) {
let user = await this.getUserByOpenIDSub(userinfo.sub) let user = await this.getUserByOpenIDSub(userinfo.sub)
// Matched by sub // Matched by sub
if (user) { if (user) {
Logger.debug(`[User] openid: User found by sub`) Logger.debug(`[User] openid: User found by sub "${userinfo.sub}"`)
return user return user
} }
@@ -232,20 +232,27 @@ class User extends Model {
// Only disallow when email_verified explicitly set to false (allow both if not set or true) // Only disallow when email_verified explicitly set to false (allow both if not set or true)
if (userinfo.email_verified === false) { if (userinfo.email_verified === false) {
Logger.warn(`[User] openid: User not found and email "${userinfo.email}" is not verified`) Logger.warn(`[User] openid: User not found and email "${userinfo.email}" is not verified`)
return null return {
error: 'Email not verified'
}
} else { } else {
Logger.info(`[User] openid: User not found, checking existing with email "${userinfo.email}"`) Logger.info(`[User] openid: User not found, checking existing with email "${userinfo.email}"`)
user = await this.getUserByEmail(userinfo.email) user = await this.getUserByEmail(userinfo.email)
if (user?.authOpenIDSub) { if (user?.authOpenIDSub) {
Logger.warn(`[User] openid: User found with email "${userinfo.email}" but is already matched with sub "${user.authOpenIDSub}"`) Logger.warn(`[User] openid: User found with email "${userinfo.email}" but is already matched with sub "${user.authOpenIDSub}"`)
return null // User is linked to a different OpenID subject; do not proceed. // User is linked to a different OpenID subject; do not proceed.
return {
error: 'User already linked to a different OpenID subject'
}
} }
} }
} else { } else {
Logger.warn(`[User] openid: User not found and no email in userinfo`) Logger.warn(`[User] openid: User not found and no email in userinfo`)
// We deny login, because if the admin whishes to match email, it makes sense to require it // We deny login, because if the admin whishes to match email, it makes sense to require it
return null return {
error: 'No email in userinfo'
}
} }
} }
// Match existing user by username // Match existing user by username
@@ -260,43 +267,40 @@ class User extends Model {
username = userinfo.username username = userinfo.username
} else { } else {
Logger.warn(`[User] openid: User not found and neither preferred_username nor username in userinfo`) Logger.warn(`[User] openid: User not found and neither preferred_username nor username in userinfo`)
return null return {
error: 'No username in userinfo'
}
} }
user = await this.getUserByUsername(username) user = await this.getUserByUsername(username)
if (user?.authOpenIDSub) { if (user?.authOpenIDSub) {
Logger.warn(`[User] openid: User found with username "${username}" but is already matched with sub "${user.authOpenIDSub}"`) Logger.warn(`[User] openid: User found with username "${username}" but is already matched with sub "${user.authOpenIDSub}"`)
return null // User is linked to a different OpenID subject; do not proceed. // User is linked to a different OpenID subject; do not proceed.
return {
error: 'User already linked to a different OpenID subject'
}
} }
} }
if (!user) {
return null
}
// Found existing user via email or username // Found existing user via email or username
if (user) { if (!user.isActive) {
if (!user.isActive) { Logger.warn(`[User] openid: User found but is not active`)
Logger.warn(`[User] openid: User found but is not active`)
return null
}
// Update user with OpenID sub
if (!user.extraData) user.extraData = {}
user.extraData.authOpenIDSub = userinfo.sub
user.changed('extraData', true)
await user.save()
Logger.debug(`[User] openid: User found by email/username`)
return user return user
} }
// If no existing user was matched, auto-register if configured // Update user with OpenID sub
if (global.ServerSettings.authOpenIDAutoRegister) { if (!user.extraData) user.extraData = {}
Logger.info(`[User] openid: Auto-registering user with sub "${userinfo.sub}"`, userinfo) user.extraData.authOpenIDSub = userinfo.sub
user = await this.createUserFromOpenIdUserInfo(userinfo) user.changed('extraData', true)
return user await user.save()
}
Logger.warn(`[User] openid: User not found and auto-register is disabled`) Logger.debug(`[User] openid: User found by email/username`)
return null return user
} }
/** /**
-10
View File
@@ -63,16 +63,6 @@ class PodcastEpisodeDownload {
const enclosureType = this.rssPodcastEpisode.enclosure.type const enclosureType = this.rssPodcastEpisode.enclosure.type
return typeof enclosureType === 'string' ? enclosureType : null return typeof enclosureType === 'string' ? enclosureType : null
} }
/**
* RSS feed may have an episode with file extension of mp3 but the specified enclosure type is not mpeg.
* @see https://github.com/advplyr/audiobookshelf/issues/3711
*
* @returns {boolean}
*/
get isMp3() {
if (this.enclosureType && !this.enclosureType.includes('mpeg')) return false
return this.fileExtension === 'mp3'
}
get episodeTitle() { get episodeTitle() {
return this.rssPodcastEpisode.title return this.rssPodcastEpisode.title
} }
+1 -1
View File
@@ -146,7 +146,7 @@ class Stream extends EventEmitter {
async generatePlaylist() { async generatePlaylist() {
await fs.ensureDir(this.streamPath) await fs.ensureDir(this.streamPath)
await hlsPlaylistGenerator(this.playlistPath, 'output', this.totalDuration, this.segmentLength, this.hlsSegmentType, this.userToken) await hlsPlaylistGenerator(this.playlistPath, 'output', this.totalDuration, this.segmentLength, this.hlsSegmentType)
return this.clientPlaylistUri return this.clientPlaylistUri
} }
@@ -53,6 +53,7 @@ class ServerSettings {
this.dateFormat = 'MM/dd/yyyy' this.dateFormat = 'MM/dd/yyyy'
this.timeFormat = 'HH:mm' this.timeFormat = 'HH:mm'
this.language = 'en-us' this.language = 'en-us'
this.allowedOrigins = []
this.logLevel = Logger.logLevel this.logLevel = Logger.logLevel
@@ -120,6 +121,7 @@ class ServerSettings {
this.dateFormat = settings.dateFormat || 'MM/dd/yyyy' this.dateFormat = settings.dateFormat || 'MM/dd/yyyy'
this.timeFormat = settings.timeFormat || 'HH:mm' this.timeFormat = settings.timeFormat || 'HH:mm'
this.language = settings.language || 'en-us' this.language = settings.language || 'en-us'
this.allowedOrigins = settings.allowedOrigins || []
this.logLevel = settings.logLevel || Logger.logLevel this.logLevel = settings.logLevel || Logger.logLevel
this.version = settings.version || null this.version = settings.version || null
this.buildNumber = settings.buildNumber || 0 // Added v2.4.5 this.buildNumber = settings.buildNumber || 0 // Added v2.4.5
@@ -231,6 +233,7 @@ class ServerSettings {
dateFormat: this.dateFormat, dateFormat: this.dateFormat,
timeFormat: this.timeFormat, timeFormat: this.timeFormat,
language: this.language, language: this.language,
allowedOrigins: this.allowedOrigins,
logLevel: this.logLevel, logLevel: this.logLevel,
version: this.version, version: this.version,
buildNumber: this.buildNumber, buildNumber: this.buildNumber,
+3 -3
View File
@@ -3,7 +3,7 @@ const Logger = require('../Logger')
const { isValidASIN } = require('../utils/index') const { isValidASIN } = require('../utils/index')
class Audible { class Audible {
#responseTimeout = 30000 #responseTimeout = 10000
constructor() { constructor() {
this.regionMap = { this.regionMap = {
@@ -106,7 +106,7 @@ class Audible {
return res.data return res.data
}) })
.catch((error) => { .catch((error) => {
Logger.error('[Audible] ASIN search error', error) Logger.error('[Audible] ASIN search error', error.message)
return null return null
}) })
} }
@@ -158,7 +158,7 @@ class Audible {
return Promise.all(res.data.products.map((result) => this.asinSearch(result.asin, region, timeout))) return Promise.all(res.data.products.map((result) => this.asinSearch(result.asin, region, timeout)))
}) })
.catch((error) => { .catch((error) => {
Logger.error('[Audible] query search error', error) Logger.error('[Audible] query search error', error.message)
return [] return []
}) })
} }
+2 -2
View File
@@ -2,7 +2,7 @@ const axios = require('axios')
const Logger = require('../Logger') const Logger = require('../Logger')
class AudiobookCovers { class AudiobookCovers {
#responseTimeout = 30000 #responseTimeout = 10000
constructor() {} constructor() {}
@@ -24,7 +24,7 @@ class AudiobookCovers {
}) })
.then((res) => res?.data || []) .then((res) => res?.data || [])
.catch((error) => { .catch((error) => {
Logger.error('[AudiobookCovers] Cover search error', error) Logger.error('[AudiobookCovers] Cover search error', error.message)
return [] return []
}) })
return items.map((item) => ({ cover: item.versions.png.original })) return items.map((item) => ({ cover: item.versions.png.original }))
+3 -3
View File
@@ -55,7 +55,7 @@ class Audnexus {
return this._processRequest(this.limiter(() => axios.get(authorRequestUrl))) return this._processRequest(this.limiter(() => axios.get(authorRequestUrl)))
.then((res) => res.data || []) .then((res) => res.data || [])
.catch((error) => { .catch((error) => {
Logger.error(`[Audnexus] Author ASIN request failed for ${name}`, error) Logger.error(`[Audnexus] Author ASIN request failed for ${name}`, error.message)
return [] return []
}) })
} }
@@ -82,7 +82,7 @@ class Audnexus {
return this._processRequest(this.limiter(() => axios.get(authorRequestUrl.toString()))) return this._processRequest(this.limiter(() => axios.get(authorRequestUrl.toString())))
.then((res) => res.data) .then((res) => res.data)
.catch((error) => { .catch((error) => {
Logger.error(`[Audnexus] Author request failed for ${asin}`, error) Logger.error(`[Audnexus] Author request failed for ${asin}`, error.message)
return null return null
}) })
} }
@@ -158,7 +158,7 @@ class Audnexus {
return this._processRequest(this.limiter(() => axios.get(chaptersRequestUrl.toString()))) return this._processRequest(this.limiter(() => axios.get(chaptersRequestUrl.toString())))
.then((res) => res.data) .then((res) => res.data)
.catch((error) => { .catch((error) => {
Logger.error(`[Audnexus] Chapter ASIN request failed for ${asin}/${region}`, error) Logger.error(`[Audnexus] Chapter ASIN request failed for ${asin}/${region}`, error.message)
return null return null
}) })
} }
+2 -2
View File
@@ -4,7 +4,7 @@ const Logger = require('../Logger')
const htmlSanitizer = require('../utils/htmlSanitizer') const htmlSanitizer = require('../utils/htmlSanitizer')
class CustomProviderAdapter { class CustomProviderAdapter {
#responseTimeout = 30000 #responseTimeout = 10000
constructor() {} constructor() {}
@@ -61,7 +61,7 @@ class CustomProviderAdapter {
return res.data.matches return res.data.matches
}) })
.catch((error) => { .catch((error) => {
Logger.error('[CustomMetadataProvider] Search error', error) Logger.error('[CustomMetadataProvider] Search error', error.message)
return [] return []
}) })
+4 -4
View File
@@ -2,7 +2,7 @@ const axios = require('axios')
const Logger = require('../Logger') const Logger = require('../Logger')
class FantLab { class FantLab {
#responseTimeout = 30000 #responseTimeout = 10000
// 7 - other // 7 - other
// 11 - essay // 11 - essay
// 12 - article // 12 - article
@@ -48,7 +48,7 @@ class FantLab {
return res.data || [] return res.data || []
}) })
.catch((error) => { .catch((error) => {
Logger.error('[FantLab] search error', error) Logger.error('[FantLab] search error', error.message)
return [] return []
}) })
@@ -77,7 +77,7 @@ class FantLab {
return resp.data || null return resp.data || null
}) })
.catch((error) => { .catch((error) => {
Logger.error(`[FantLab] work info request for url "${url}" error`, error) Logger.error(`[FantLab] work info request for url "${url}" error`, error.message)
return null return null
}) })
@@ -193,7 +193,7 @@ class FantLab {
return resp.data || null return resp.data || null
}) })
.catch((error) => { .catch((error) => {
Logger.error(`[FantLab] search cover from edition with url "${url}" error`, error) Logger.error(`[FantLab] search cover from edition with url "${url}" error`, error.message)
return null return null
}) })
+2 -2
View File
@@ -2,7 +2,7 @@ const axios = require('axios')
const Logger = require('../Logger') const Logger = require('../Logger')
class GoogleBooks { class GoogleBooks {
#responseTimeout = 30000 #responseTimeout = 10000
constructor() {} constructor() {}
@@ -67,7 +67,7 @@ class GoogleBooks {
return res.data.items return res.data.items
}) })
.catch((error) => { .catch((error) => {
Logger.error('[GoogleBooks] Volume search error', error) Logger.error('[GoogleBooks] Volume search error', error.message)
return [] return []
}) })
return items.map((item) => this.cleanResult(item)) return items.map((item) => this.cleanResult(item))
+2 -2
View File
@@ -1,7 +1,7 @@
const axios = require('axios').default const axios = require('axios').default
class OpenLibrary { class OpenLibrary {
#responseTimeout = 30000 #responseTimeout = 10000
constructor() { constructor() {
this.baseUrl = 'https://openlibrary.org' this.baseUrl = 'https://openlibrary.org'
@@ -23,7 +23,7 @@ class OpenLibrary {
return res.data return res.data
}) })
.catch((error) => { .catch((error) => {
console.error('Failed', error) console.error('Failed', error.message)
return null return null
}) })
} }
+2 -2
View File
@@ -28,7 +28,7 @@ const htmlSanitizer = require('../utils/htmlSanitizer')
*/ */
class iTunes { class iTunes {
#responseTimeout = 30000 #responseTimeout = 10000
constructor() {} constructor() {}
@@ -63,7 +63,7 @@ class iTunes {
return response.data.results || [] return response.data.results || []
}) })
.catch((error) => { .catch((error) => {
Logger.error(`[iTunes] search request error`, error) Logger.error(`[iTunes] search request error`, error.message)
return [] return []
}) })
} }
+5 -4
View File
@@ -99,7 +99,7 @@ module.exports.resizeImage = resizeImage
/** /**
* *
* @param {import('../objects/PodcastEpisodeDownload')} podcastEpisodeDownload * @param {import('../objects/PodcastEpisodeDownload')} podcastEpisodeDownload
* @returns {Promise<{success: boolean, isFfmpegError?: boolean}>} * @returns {Promise<{success: boolean, isRequestError?: boolean}>}
*/ */
module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => { module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
@@ -118,6 +118,7 @@ module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
method: 'GET', method: 'GET',
responseType: 'stream', responseType: 'stream',
headers: { headers: {
Accept: '*/*',
'User-Agent': userAgent 'User-Agent': userAgent
}, },
timeout: global.PodcastDownloadTimeout timeout: global.PodcastDownloadTimeout
@@ -138,7 +139,8 @@ module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
if (!response) { if (!response) {
return resolve({ return resolve({
success: false success: false,
isRequestError: true
}) })
} }
@@ -203,8 +205,7 @@ module.exports.downloadPodcastEpisode = (podcastEpisodeDownload) => {
Logger.error(`Full stderr dump for episode url "${podcastEpisodeDownload.url}": ${stderrLines.join('\n')}`) Logger.error(`Full stderr dump for episode url "${podcastEpisodeDownload.url}": ${stderrLines.join('\n')}`)
} }
resolve({ resolve({
success: false, success: false
isFfmpegError: true
}) })
}) })
ffmpeg.on('progress', (progress) => { ffmpeg.on('progress', (progress) => {
+2 -3
View File
@@ -476,7 +476,7 @@ module.exports.getWindowsDrives = async () => {
return [] return []
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
exec('wmic logicaldisk get name', async (error, stdout, stderr) => { exec('powershell -Command "(Get-PSDrive -PSProvider FileSystem).Name"', async (error, stdout, stderr) => {
if (error) { if (error) {
reject(error) reject(error)
return return
@@ -485,10 +485,9 @@ module.exports.getWindowsDrives = async () => {
?.split(/\r?\n/) ?.split(/\r?\n/)
.map((line) => line.trim()) .map((line) => line.trim())
.filter((line) => line) .filter((line) => line)
.slice(1)
const validDrives = [] const validDrives = []
for (const drive of drives) { for (const drive of drives) {
let drivepath = drive + '/' let drivepath = drive + ':/'
if (await fs.pathExists(drivepath)) { if (await fs.pathExists(drivepath)) {
validDrives.push(drivepath) validDrives.push(drivepath)
} else { } else {
@@ -1,6 +1,6 @@
const fs = require('../../libs/fsExtra') const fs = require('../../libs/fsExtra')
function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, token) { function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType) {
var ext = hlsSegmentType === 'fmp4' ? 'm4s' : 'ts' var ext = hlsSegmentType === 'fmp4' ? 'm4s' : 'ts'
var lines = [ var lines = [
@@ -18,18 +18,18 @@ function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, to
var lastSegment = duration - (numSegments * segmentLength) var lastSegment = duration - (numSegments * segmentLength)
for (let i = 0; i < numSegments; i++) { for (let i = 0; i < numSegments; i++) {
lines.push(`#EXTINF:6,`) lines.push(`#EXTINF:6,`)
lines.push(`${segmentName}-${i}.${ext}?token=${token}`) lines.push(`${segmentName}-${i}.${ext}`)
} }
if (lastSegment > 0) { if (lastSegment > 0) {
lines.push(`#EXTINF:${lastSegment},`) lines.push(`#EXTINF:${lastSegment},`)
lines.push(`${segmentName}-${numSegments}.${ext}?token=${token}`) lines.push(`${segmentName}-${numSegments}.${ext}`)
} }
lines.push('#EXT-X-ENDLIST') lines.push('#EXT-X-ENDLIST')
return lines.join('\n') return lines.join('\n')
} }
function generatePlaylist(outputPath, segmentName, duration, segmentLength, hlsSegmentType, token) { function generatePlaylist(outputPath, segmentName, duration, segmentLength, hlsSegmentType) {
var playlistStr = getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, token) var playlistStr = getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType)
return fs.writeFile(outputPath, playlistStr) return fs.writeFile(outputPath, playlistStr)
} }
module.exports = generatePlaylist module.exports = generatePlaylist
@@ -289,7 +289,11 @@ module.exports = {
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}`)]]
} else if (sortBy === 'progress') { } else if (sortBy === 'progress') {
return [[Sequelize.literal('mediaProgresses.updatedAt'), dir]] return [[Sequelize.literal(`mediaProgresses.updatedAt ${dir} NULLS LAST`)]]
} else if (sortBy === 'progress.createdAt') {
return [[Sequelize.literal(`mediaProgresses.createdAt ${dir} NULLS LAST`)]]
} else if (sortBy === 'progress.finishedAt') {
return [[Sequelize.literal(`mediaProgresses.finishedAt ${dir} NULLS LAST`)]]
} else if (sortBy === 'random') { } else if (sortBy === 'random') {
return [Database.sequelize.random()] return [Database.sequelize.random()]
} }
@@ -399,9 +403,6 @@ module.exports = {
if (filterGroup !== 'series' && sortBy === 'sequence') { if (filterGroup !== 'series' && sortBy === 'sequence') {
sortBy = 'media.metadata.title' sortBy = 'media.metadata.title'
} }
if (filterGroup !== 'progress' && sortBy === 'progress') {
sortBy = 'media.metadata.title'
}
const includeRSSFeed = include.includes('rssfeed') const includeRSSFeed = include.includes('rssfeed')
const includeMediaItemShare = !!user?.isAdminOrUp && include.includes('share') const includeMediaItemShare = !!user?.isAdminOrUp && include.includes('share')
@@ -522,7 +523,7 @@ module.exports = {
} }
bookIncludes.push({ bookIncludes.push({
model: Database.mediaProgressModel, model: Database.mediaProgressModel,
attributes: ['id', 'isFinished', 'currentTime', 'ebookProgress', 'updatedAt'], attributes: ['id', 'isFinished', 'currentTime', 'ebookProgress', 'updatedAt', 'createdAt', 'finishedAt'],
where: mediaProgressWhere, where: mediaProgressWhere,
required: false required: false
}) })
@@ -532,6 +533,18 @@ module.exports = {
} }
} }
// When sorting by progress but not filtering by progress, include media progresses
if (filterGroup !== 'progress' && ['progress.createdAt', 'progress.finishedAt', 'progress'].includes(sortBy)) {
bookIncludes.push({
model: Database.mediaProgressModel,
attributes: ['id', 'isFinished', 'currentTime', 'ebookProgress', 'updatedAt', 'createdAt', 'finishedAt'],
where: {
userId: user.id
},
required: false
})
}
let { mediaWhere, replacements } = this.getMediaGroupQuery(filterGroup, filterValue) let { mediaWhere, replacements } = this.getMediaGroupQuery(filterGroup, filterValue)
let bookWhere = Array.isArray(mediaWhere) ? mediaWhere : [mediaWhere] let bookWhere = Array.isArray(mediaWhere) ? mediaWhere : [mediaWhere]