mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-06-13 05:54:23 +02:00
Compare commits
583 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6d3773a0b8 | |||
| a47c869d0b | |||
| eb0383d37a | |||
| e66ffb9c23 | |||
| 972193b193 | |||
| 690a7e0da9 | |||
| fbe1d1eed6 | |||
| e83aca572e | |||
| 367826ce64 | |||
| 6e6c43c53c | |||
| 6479cdb66d | |||
| 635e132325 | |||
| 45dd843ce1 | |||
| 7c956b1582 | |||
| 9afa39e29e | |||
| 5f8450602e | |||
| fa6dae1a53 | |||
| a1d439b8d5 | |||
| 2f32673991 | |||
| c1a6b51d78 | |||
| 6c2e13fb4e | |||
| 210fa55b6a | |||
| fb8ca043ad | |||
| 69d7c399b8 | |||
| a35ba05600 | |||
| 40f42b2ab6 | |||
| cf4b9e938d | |||
| 31120ad111 | |||
| cd8640f00e | |||
| d0ba455ed6 | |||
| e5b7aea46c | |||
| 2f2d026b06 | |||
| c156b063f5 | |||
| e6d49a2d53 | |||
| 6d3404272c | |||
| c0319ebbac | |||
| 1d0b7e383a | |||
| 9f5d8386f3 | |||
| 6e0da3bf7a | |||
| ee6016f70e | |||
| f1a2e56054 | |||
| d2915e689f | |||
| 05d9ab81f9 | |||
| 75eed9d09a | |||
| e5af2f336b | |||
| ade1752e97 | |||
| fa5fa7b788 | |||
| b01facc034 | |||
| dd4fc09909 | |||
| c15cb48def | |||
| fe13456a2b | |||
| 2ee893062f | |||
| 31630f50a5 | |||
| edfce46058 | |||
| cc5244c596 | |||
| b8942c5931 | |||
| 6e5feee78a | |||
| e7cb0466e6 | |||
| 6c7221d37d | |||
| 1f3fa80ddd | |||
| 87f3766299 | |||
| d08cef11ed | |||
| 7201cced42 | |||
| 4f8fbbc979 | |||
| e55fed4a33 | |||
| dcbeecff7a | |||
| 32276aacd9 | |||
| b921a08809 | |||
| c089336e41 | |||
| 5107b0307c | |||
| 8498378bca | |||
| b61e2c30f2 | |||
| 3e4225bced | |||
| e6d99d07f0 | |||
| 122fc34a75 | |||
| e5c0a9d22c | |||
| 3bf136a20b | |||
| b387d9484a | |||
| e8668d9f22 | |||
| f3e90bd420 | |||
| 4bf15bbffd | |||
| 04eb3bc437 | |||
| 81e96df9c5 | |||
| 44aff23e1b | |||
| cc48d9f26d | |||
| ac08e897ee | |||
| 3c2eec8279 | |||
| 7b37c98e88 | |||
| 088353ae26 | |||
| e003544edd | |||
| 076ece6fe7 | |||
| 14f72ab7d4 | |||
| ebcb122eb8 | |||
| 626596b192 | |||
| 10a4777ddf | |||
| 0ecbb1c3f4 | |||
| dc2398a072 | |||
| c1e21d31ee | |||
| 70e6efc3d0 | |||
| 092c504eb1 | |||
| f7d7c9a4f5 | |||
| 8bdcabf973 | |||
| 646c861bcc | |||
| ee60169995 | |||
| afb4108c30 | |||
| 2e2d857ce0 | |||
| ed5766b4ab | |||
| a33e87db99 | |||
| 5de942aefb | |||
| bcfe1e9647 | |||
| 503f4611b2 | |||
| 648983708e | |||
| 991d25f628 | |||
| d2a7c3c381 | |||
| 219a9fc6d5 | |||
| ba2259d174 | |||
| d7bfccdc4a | |||
| 5f1edcb609 | |||
| 329e3c7179 | |||
| 919ea32416 | |||
| 3b6419bc1b | |||
| d4fdb47c7f | |||
| cee9b9d8e3 | |||
| 9441346b0a | |||
| 6b8464c270 | |||
| d12f727603 | |||
| 1552c250df | |||
| 623c2fba12 | |||
| be27908d44 | |||
| 7a39d581a1 | |||
| 53a416fd28 | |||
| 7393c03218 | |||
| 594589da3d | |||
| 44d7deae99 | |||
| ff9e87c4d5 | |||
| c2fd87d55c | |||
| 27843c3f9b | |||
| 0ec2ced011 | |||
| 552ed43243 | |||
| 0606738b38 | |||
| a5d2c1bd64 | |||
| d8e272e091 | |||
| 3e9ca51088 | |||
| 8758c62ae2 | |||
| db9019a94f | |||
| 39b8b9df4f | |||
| a36f097095 | |||
| ae0ccb1b47 | |||
| f178841e57 | |||
| 568b154e8a | |||
| 8c5678b573 | |||
| e51c7b2be1 | |||
| d460757df4 | |||
| cd295c03ca | |||
| 38dd1beff7 | |||
| 61b72aff9d | |||
| 9eda4e36fa | |||
| a05cb170a2 | |||
| c75d976320 | |||
| ab9b798bfa | |||
| 40783c8644 | |||
| a0137fcb42 | |||
| 9fdda6be62 | |||
| b0c073dd7e | |||
| b83e2836f6 | |||
| f91be18527 | |||
| c1f4e4120e | |||
| b42c7421b0 | |||
| 82f512d405 | |||
| 01a833ea59 | |||
| f1c39e8587 | |||
| 5e68936c20 | |||
| a4c9b062c1 | |||
| 763d8810e3 | |||
| 3316505d1c | |||
| 2cf6e8a5fe | |||
| 961d066bdd | |||
| 372c9a5322 | |||
| f77de1743e | |||
| a5750deaaf | |||
| 0c7b738b7c | |||
| c3c9e7731d | |||
| d3b5612fc0 | |||
| 96ef0129ed | |||
| 85546b7dd7 | |||
| d59714d804 | |||
| 96693659bf | |||
| ee2d8d1f71 | |||
| f03b0915eb | |||
| a92ba564bd | |||
| e684a8dc43 | |||
| 6db6b862e6 | |||
| 57c7b123f0 | |||
| fd593caafc | |||
| d0a3f74710 | |||
| b1921e7034 | |||
| 538a5065a4 | |||
| 166e0442a0 | |||
| 816a47a4ba | |||
| 141211590f | |||
| b01e7570d3 | |||
| 0a8662d198 | |||
| 0a4de61eff | |||
| 0a82d6a41b | |||
| 3f6162f53c | |||
| 888190a6be | |||
| ce4ff4f894 | |||
| 1da3ab7fdc | |||
| 4f30cbf2f6 | |||
| a87ea32715 | |||
| feed827223 | |||
| 797dba2448 | |||
| f0acbb2e81 | |||
| fc06aa2c78 | |||
| 4224f44259 | |||
| 2592467d09 | |||
| 37beb7b37c | |||
| cafd92e206 | |||
| 3e876e3383 | |||
| 29752798f3 | |||
| 8c86ca4ea5 | |||
| 00c62fa494 | |||
| 6c7f3c7e77 | |||
| aec8acbdd7 | |||
| 6e19ad7777 | |||
| 3aa95fec11 | |||
| 37dd46d31f | |||
| 54a996634e | |||
| 54a5e368c2 | |||
| 2d313851d2 | |||
| eb00b19457 | |||
| bbae9acc2d | |||
| a4e8f01f0e | |||
| 6bdf402da8 | |||
| 80b0e3546e | |||
| 161f3cb177 | |||
| 4a4d4a8f17 | |||
| b21046027c | |||
| 3a163e1746 | |||
| 3c4e80f1c1 | |||
| 2f3036faba | |||
| 3934461c46 | |||
| 123351e08a | |||
| 1280ddfe74 | |||
| 7e89b97a6d | |||
| 20de2ea388 | |||
| dbb5ee79ac | |||
| c6dabd2620 | |||
| 26f949b9ba | |||
| 7630dbdcb7 | |||
| a164c17d38 | |||
| 03da194953 | |||
| 9ce6de3100 | |||
| e040396b20 | |||
| bcbec67fec | |||
| 1543021685 | |||
| 577e6aaec9 | |||
| 77579acfd4 | |||
| 9ca98ca750 | |||
| feb225d3a6 | |||
| e501aa4f1e | |||
| 104f6e6c58 | |||
| 552d8ae3b8 | |||
| a41e9bae5d | |||
| a456865ec0 | |||
| 85d5531bc1 | |||
| 4b840f9c97 | |||
| b9510a69fe | |||
| d737a66af2 | |||
| 576d18d8d6 | |||
| d238b02bd2 | |||
| c6cb13ed39 | |||
| 44c5dce8aa | |||
| b726bee4e5 | |||
| b07e449043 | |||
| 9273e61f1e | |||
| 1b4a7acf13 | |||
| 68c1395bdf | |||
| a007a9ec98 | |||
| 8b33b5e383 | |||
| c81b762d52 | |||
| c53a5c5a0b | |||
| 83af75a582 | |||
| 60389a3bf3 | |||
| 20cceb3a8f | |||
| 7562fb2c21 | |||
| c7647aafd7 | |||
| 4a73247e5c | |||
| 326086c197 | |||
| 5ff5245476 | |||
| 856cf180a5 | |||
| fbe9971a8b | |||
| 6ea70608a1 | |||
| ba7160c305 | |||
| 7d048b7a50 | |||
| afab429c75 | |||
| 50e2fe7fd2 | |||
| c7c21cc137 | |||
| 7e4c7a7e3b | |||
| 40babc9650 | |||
| 7a94f014ea | |||
| 32adb1bafd | |||
| f9a6239049 | |||
| 8dee1ec942 | |||
| 58e43cc6a7 | |||
| b8999fbc37 | |||
| 0dda4b6b27 | |||
| 817f2f6915 | |||
| 77fc6bba1a | |||
| c66d652a53 | |||
| 86bddba5c3 | |||
| 7779fd2972 | |||
| 05a4577792 | |||
| 56dc042282 | |||
| 95973243a6 | |||
| 18ad23d016 | |||
| e258f122f1 | |||
| 18200a8f01 | |||
| 9c47f404c9 | |||
| 2f6de71a3a | |||
| deb121c523 | |||
| 320e4dfb47 | |||
| 6194c48549 | |||
| 6aa9ecaaba | |||
| b3d020b89f | |||
| e196a6e5ca | |||
| 73cf22b499 | |||
| ac7464ce7e | |||
| 84e742f2a5 | |||
| a1e882cbf1 | |||
| 09121acbd5 | |||
| 5b9df84ba3 | |||
| 266db491aa | |||
| c7a317a87b | |||
| b027f3bda1 | |||
| cea991b82f | |||
| 7e2b51e6d2 | |||
| 8f310b6bf0 | |||
| b2a5fb46f1 | |||
| 6d7639853b | |||
| 3a16acbba4 | |||
| 027e1efaca | |||
| d1fabba86b | |||
| b290a4ada3 | |||
| bb477c617e | |||
| 9238c38842 | |||
| d268516fcb | |||
| d353cff1ae | |||
| 604f17f60b | |||
| 3911a7273b | |||
| 138bb563b8 | |||
| 3801ef062a | |||
| e4b9ac5446 | |||
| 9987d219f8 | |||
| dc7045c562 | |||
| 2cc6e56bd1 | |||
| a89a24e48e | |||
| a968aca304 | |||
| 8d1f460640 | |||
| 553ffd1934 | |||
| fd4932cdbb | |||
| dcaca43817 | |||
| 0eed4e82f9 | |||
| 2ed2328401 | |||
| 8b260c8bc6 | |||
| 7dcb9b98a0 | |||
| 311ac7104e | |||
| 2c45b28d48 | |||
| b53613f82c | |||
| 751371abb8 | |||
| 6365c02875 | |||
| fb3834156b | |||
| c03f3f722d | |||
| a06f48ca29 | |||
| 9d79552dda | |||
| ed98614b6f | |||
| 09dd2cc79c | |||
| e87237048a | |||
| d71968fd80 | |||
| f83c605ae1 | |||
| 4325f470dd | |||
| 800ecf8e82 | |||
| 5cb143d50b | |||
| 798c73c66c | |||
| 0fa7c46274 | |||
| c2d420ec70 | |||
| 152daf7bf3 | |||
| 8d99249e50 | |||
| c6724ba353 | |||
| a519d44666 | |||
| 7e8bf977cc | |||
| 4018be6330 | |||
| 99a3867ce9 | |||
| 2116f60133 | |||
| 794f0ef42a | |||
| 3e423839a1 | |||
| 2773c8c4a9 | |||
| e510174f12 | |||
| 08c9e8d47d | |||
| 1908ec3df5 | |||
| df3878d4ca | |||
| 1097de6f1f | |||
| e408070b19 | |||
| af67c2e86f | |||
| 6a52d2a968 | |||
| 3337b3af18 | |||
| 835d2c7f36 | |||
| 03f91099e0 | |||
| c04afd0787 | |||
| b03bd79f5d | |||
| 5ef632a7eb | |||
| 79b4042e8e | |||
| 8f718ef91c | |||
| 4053b20623 | |||
| c4d654635f | |||
| ef5d0ffa48 | |||
| 6a826cdb36 | |||
| 1d837f5f21 | |||
| 80873b379c | |||
| 82a8f8f126 | |||
| 4725a466da | |||
| 031edc870c | |||
| 625e2445b5 | |||
| 1640af2f1c | |||
| c76f76cc27 | |||
| 74af212293 | |||
| e04efb9c6a | |||
| ee17e7a555 | |||
| 694a852c07 | |||
| 18068bb261 | |||
| 71257f6c6c | |||
| 4d70929d2e | |||
| 578e9559e4 | |||
| 894ea0b80a | |||
| e54571f011 | |||
| 77d7a50b99 | |||
| 32da0f1224 | |||
| 2054accdc9 | |||
| 7d8b857c77 | |||
| 0107cb4782 | |||
| f273eee807 | |||
| 4af21b079a | |||
| c9eaf2db2d | |||
| cae1560344 | |||
| a5fb0d9cdb | |||
| 53c80d9798 | |||
| 832165716b | |||
| d9f2d8bf1d | |||
| a7a3a56509 | |||
| 4082fadf90 | |||
| 93160b83bf | |||
| 472240f994 | |||
| c3f0fb8e5e | |||
| b156ebeb9f | |||
| e4c775c847 | |||
| 45e8e72759 | |||
| 0ae7340889 | |||
| 8c38987d92 | |||
| 878f0787ba | |||
| 880d85eaef | |||
| f7aaebc1de | |||
| d96ebbe82d | |||
| 70d67156f0 | |||
| f293b317be | |||
| 1f23794f88 | |||
| e6bfd118f6 | |||
| 1166400ab1 | |||
| 55f0ac871b | |||
| 3584f6e24f | |||
| 23bf2594c8 | |||
| 8fb460ce05 | |||
| 8c4bbfd6a2 | |||
| 742961e0b8 | |||
| 5b6807892f | |||
| b911a25c57 | |||
| 53110674e4 | |||
| f963cd4753 | |||
| 0dccc3bcae | |||
| 5b4fd5b254 | |||
| bdb9d3caeb | |||
| 9aca824b59 | |||
| 8e891805eb | |||
| 2760517445 | |||
| 889ee33320 | |||
| 4f65801713 | |||
| 3e75acd4ef | |||
| 3e8fe2ef60 | |||
| 0bc441de20 | |||
| a8c2f0d4c8 | |||
| b59da8bd0c | |||
| 77cb4f75c6 | |||
| 9cf1711fae | |||
| f472116dc3 | |||
| c7eb9d7799 | |||
| c66380eaeb | |||
| 1bebb22705 | |||
| 4e96649fe3 | |||
| a21cec806e | |||
| 8a3b8d2249 | |||
| 581277914c | |||
| e678fe6e2f | |||
| 3845940245 | |||
| 6c63e2131c | |||
| e25e2b238f | |||
| 99110f587a | |||
| b553e959e2 | |||
| f7b94a4b6d | |||
| e9a705587a | |||
| 264ae928a9 | |||
| f5248a9f00 | |||
| 3473ff594a | |||
| 20bb6e13b5 | |||
| a05d32b1d7 | |||
| c6b3521cb6 | |||
| 2444504c6a | |||
| d38532c07a | |||
| 4f7831611f | |||
| d09db19cd5 | |||
| 030e43f382 | |||
| f081a7fdc1 | |||
| f0d5f46199 | |||
| 0b8f6db45e | |||
| 806c0a2991 | |||
| 7d6d3e6687 | |||
| ad07ed7e25 | |||
| d3402e30c2 | |||
| 25fe4dee3a | |||
| 3c21c82ce1 | |||
| 3c8876a37d | |||
| fba70c9831 | |||
| 27e40d16fd | |||
| 448cbf8530 | |||
| f1153f9da5 | |||
| d09a21d922 | |||
| 62afa3c3ee | |||
| 85446be0e5 | |||
| 018ca8e7ee | |||
| f02453ac92 | |||
| 84b77f4c7f | |||
| d41276ba8c | |||
| 576d7dc024 | |||
| 6d2b1df560 | |||
| 8255e4308c | |||
| 794adf0292 | |||
| f2e0b9762c | |||
| 7d0def0edb | |||
| 0653572396 | |||
| d9a3750667 | |||
| 9c0c7b6b08 | |||
| bf6d81b333 | |||
| 8775e55762 | |||
| d0d152c20d | |||
| 4ff7355262 | |||
| 6cc7a44a22 | |||
| ad092ef8f8 | |||
| 691f291843 | |||
| ac381854e5 | |||
| 9c8900560c | |||
| d9cfcc86e7 | |||
| 97afd22f81 | |||
| e24eaab3f1 | |||
| e201247d69 | |||
| a24dae5262 | |||
| e59babdf24 | |||
| 8dbe1e4e5d | |||
| cdc37ddb0f | |||
| f127a7beb5 | |||
| 44ff90a6f2 | |||
| 8b995a179d | |||
| 4d32a22de9 | |||
| af1ff12dbb | |||
| d96ed01ce4 | |||
| 4f5123e842 | |||
| 9c44fc0d01 | |||
| 5017e7ce9e | |||
| 9da0be6d36 | |||
| c41bdb951c | |||
| 54815ea9c7 | |||
| 679ffed0ea | |||
| 09397cf3de | |||
| de25763a74 | |||
| a894ceb9cf | |||
| 387e58a714 |
@@ -47,7 +47,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
@@ -60,7 +60,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
@@ -73,6 +73,6 @@ jobs:
|
||||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: '/language:${{matrix.language}}'
|
||||
|
||||
@@ -22,7 +22,7 @@ add_user() {
|
||||
declare -r descr="${4:-No description}"
|
||||
declare -r shell="${5:-/bin/false}"
|
||||
|
||||
if ! getent passwd | grep -q "^$user:"; then
|
||||
if ! getent passwd "$user" 2>&1 >/dev/null; then
|
||||
echo "Creating system user: $user in $group with $descr and shell $shell"
|
||||
useradd $uid_flags --gid $group --no-create-home --system --shell $shell -c "$descr" $user
|
||||
fi
|
||||
@@ -39,7 +39,7 @@ add_group() {
|
||||
declare -r gid_flags="--gid $gid"
|
||||
fi
|
||||
|
||||
if ! getent group | grep -q "^$group:" ; then
|
||||
if ! getent group "$group" 2>&1 >/dev/null; then
|
||||
echo "Creating system group: $group"
|
||||
groupadd $gid_flags --system $group
|
||||
fi
|
||||
|
||||
@@ -300,6 +300,8 @@ export default {
|
||||
})
|
||||
},
|
||||
userUpdated(user) {
|
||||
if (user.id !== this.$store.state.user.user.id) return
|
||||
|
||||
if (user.seriesHideFromContinueListening && user.seriesHideFromContinueListening.length) {
|
||||
this.removeAllSeriesFromContinueSeries(user.seriesHideFromContinueListening)
|
||||
}
|
||||
|
||||
@@ -93,10 +93,10 @@ export default {
|
||||
editAuthor(author) {
|
||||
this.$store.commit('globals/showEditAuthorModal', author)
|
||||
},
|
||||
editItem(libraryItem) {
|
||||
editItem(libraryItem, tab = 'details') {
|
||||
var itemIds = this.shelf.entities.map((e) => e.id)
|
||||
this.$store.commit('setBookshelfBookIds', itemIds)
|
||||
this.$store.commit('showEditModal', libraryItem)
|
||||
this.$store.commit('showEditModalOnTab', { libraryItem, tab: tab || 'details' })
|
||||
},
|
||||
editEpisode({ libraryItem, episode }) {
|
||||
this.$store.commit('setEpisodeTableEpisodeIds', [episode.id])
|
||||
|
||||
@@ -3,24 +3,18 @@
|
||||
<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'">
|
||||
<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">
|
||||
<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>
|
||||
<span v-else class="material-symbols text-lg">home</span>
|
||||
</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'">
|
||||
<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">
|
||||
<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>
|
||||
<span v-else class="material-symbols text-lg">import_contacts</span>
|
||||
</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'">
|
||||
<p class="text-sm">{{ $strings.ButtonLatest }}</p>
|
||||
</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'">
|
||||
<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">
|
||||
<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>
|
||||
<span v-else class="material-symbols text-lg">view_column</span>
|
||||
</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'">
|
||||
<p v-if="isPlaylistsPage || isPodcastLibrary" class="text-sm">{{ $strings.ButtonPlaylists }}</p>
|
||||
@@ -32,12 +26,7 @@
|
||||
</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'">
|
||||
<p v-if="isAuthorsPage" class="text-sm">{{ $strings.ButtonAuthors }}</p>
|
||||
<svg v-else class="w-5 h-5" viewBox="0 0 24 24">
|
||||
<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>
|
||||
<span v-else class="material-symbols text-lg">groups</span>
|
||||
</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'">
|
||||
<p class="text-sm">{{ $strings.ButtonAdd }}</p>
|
||||
|
||||
@@ -70,6 +70,11 @@ export default {
|
||||
title: this.$strings.HeaderUsers,
|
||||
path: '/config/users'
|
||||
},
|
||||
{
|
||||
id: 'config-api-keys',
|
||||
title: this.$strings.HeaderApiKeys,
|
||||
path: '/config/api-keys'
|
||||
},
|
||||
{
|
||||
id: 'config-sessions',
|
||||
title: this.$strings.HeaderListeningSessions,
|
||||
|
||||
@@ -232,11 +232,11 @@ export default {
|
||||
clearFilter() {
|
||||
this.$store.dispatch('user/updateUserSettings', { filterBy: 'all' })
|
||||
},
|
||||
editEntity(entity) {
|
||||
editEntity(entity, tab = 'details') {
|
||||
if (this.entityName === 'items' || this.entityName === 'series-books') {
|
||||
const bookIds = this.entities.map((e) => e.id)
|
||||
this.$store.commit('setBookshelfBookIds', bookIds)
|
||||
this.$store.commit('showEditModal', entity)
|
||||
this.$store.commit('showEditModalOnTab', { libraryItem: entity, tab: tab || 'details' })
|
||||
} else if (this.entityName === 'collections') {
|
||||
this.$store.commit('globals/setEditCollection', entity)
|
||||
} else if (this.entityName === 'playlists') {
|
||||
@@ -778,10 +778,6 @@ export default {
|
||||
windowResize() {
|
||||
this.executeRebuild()
|
||||
},
|
||||
socketInit() {
|
||||
// Server settings are set on socket init
|
||||
this.executeRebuild()
|
||||
},
|
||||
initListeners() {
|
||||
window.addEventListener('resize', this.windowResize)
|
||||
|
||||
@@ -794,7 +790,6 @@ export default {
|
||||
})
|
||||
|
||||
this.$eventBus.$on('bookshelf_clear_selection', this.clearSelectedEntities)
|
||||
this.$eventBus.$on('socket_init', this.socketInit)
|
||||
this.$eventBus.$on('user-settings', this.settingsUpdated)
|
||||
|
||||
if (this.$root.socket) {
|
||||
@@ -826,7 +821,6 @@ export default {
|
||||
}
|
||||
|
||||
this.$eventBus.$off('bookshelf_clear_selection', this.clearSelectedEntities)
|
||||
this.$eventBus.$off('socket_init', this.socketInit)
|
||||
this.$eventBus.$off('user-settings', this.settingsUpdated)
|
||||
|
||||
if (this.$root.socket) {
|
||||
|
||||
@@ -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">
|
||||
<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">
|
||||
<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>
|
||||
<span class="material-symbols text-2xl">home</span>
|
||||
|
||||
<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 :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">
|
||||
<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>
|
||||
<span class="material-symbols text-2xl">import_contacts</span>
|
||||
|
||||
<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 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">
|
||||
<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>
|
||||
<span class="material-symbols text-2xl">view_column</span>
|
||||
|
||||
<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 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">
|
||||
<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>
|
||||
<span class="material-symbols text-2xl">groups</span>
|
||||
|
||||
<p class="pt-1 text-center leading-4" style="font-size: 0.9rem">{{ $strings.ButtonAuthors }}</p>
|
||||
|
||||
@@ -116,7 +105,7 @@
|
||||
</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' }">
|
||||
<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>
|
||||
<p v-else class="text-xxs text-gray-400 leading-3 text-center italic">{{ Source }}</p>
|
||||
</div>
|
||||
|
||||
@@ -71,9 +71,6 @@ export default {
|
||||
coverHeight() {
|
||||
return this.cardHeight
|
||||
},
|
||||
userToken() {
|
||||
return this.store.getters['user/getToken']
|
||||
},
|
||||
_author() {
|
||||
return this.author || {}
|
||||
},
|
||||
|
||||
@@ -13,9 +13,17 @@
|
||||
<div class="grow" />
|
||||
<p class="text-sm md:text-base">{{ book.publishedYear }}</p>
|
||||
</div>
|
||||
<p v-if="book.author" class="text-gray-300 text-xs md:text-sm">{{ $getString('LabelByAuthor', [book.author]) }}</p>
|
||||
<p v-if="book.narrator" class="text-gray-400 text-xs">{{ $strings.LabelNarrators }}: {{ book.narrator }}</p>
|
||||
<p v-if="book.duration" class="text-gray-400 text-xs">{{ $strings.LabelDuration }}: {{ $elapsedPrettyExtended(bookDuration, false) }} {{ bookDurationComparison }}</p>
|
||||
|
||||
<div class="flex items-center">
|
||||
<div>
|
||||
<p v-if="book.author" class="text-gray-300 text-xs md:text-sm">{{ $getString('LabelByAuthor', [book.author]) }}</p>
|
||||
<p v-if="book.narrator" class="text-gray-400 text-xs">{{ $strings.LabelNarrators }}: {{ book.narrator }}</p>
|
||||
<p v-if="book.duration" class="text-gray-400 text-xs">{{ $strings.LabelDuration }}: {{ $elapsedPrettyExtended(bookDuration, false) }} {{ bookDurationComparison }}</p>
|
||||
</div>
|
||||
<div class="grow" />
|
||||
<div v-if="book.matchConfidence" class="rounded-full px-2 py-1 text-xs whitespace-nowrap text-white" :class="book.matchConfidence > 0.95 ? 'bg-success/80' : 'bg-info/80'">{{ $strings.LabelMatchConfidence }}: {{ (book.matchConfidence * 100).toFixed(0) }}%</div>
|
||||
</div>
|
||||
|
||||
<div v-if="book.series?.length" class="flex py-1 -mx-1">
|
||||
<div v-for="(series, index) in book.series" :key="index" class="bg-white/10 rounded-full px-1 py-0.5 mx-1">
|
||||
<p class="leading-3 text-xs text-gray-400">
|
||||
|
||||
@@ -62,7 +62,24 @@
|
||||
</widgets-alert>
|
||||
|
||||
<div v-if="isNonInteractable" class="absolute top-0 left-0 w-full h-full bg-black/50 flex items-center justify-center z-20">
|
||||
<ui-loading-indicator :text="nonInteractionLabel" />
|
||||
<ui-loading-indicator>
|
||||
<div class="mb-4">
|
||||
<span class="text-lg font-medium text-white">
|
||||
{{ nonInteractionLabel }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div v-if="isUploading" class="w-64 mx-auto mb-2">
|
||||
<div class="flex items-center justify-center mb-2">
|
||||
<span class="text-sm font-medium text-white/60 text-center w-full">
|
||||
{{ uploadProgressText }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="w-full bg-primary/20 rounded-full h-2.5">
|
||||
<div class="bg-green-500 h-2.5 rounded-full transition-all duration-300 ease-out" :style="{ width: uploadProgressPercent + '%' }"></div>
|
||||
</div>
|
||||
</div>
|
||||
</ui-loading-indicator>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -91,7 +108,11 @@ export default {
|
||||
isUploading: false,
|
||||
uploadFailed: false,
|
||||
uploadSuccess: false,
|
||||
isFetchingMetadata: false
|
||||
isFetchingMetadata: false,
|
||||
uploadProgress: {
|
||||
loaded: 0,
|
||||
total: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -116,6 +137,15 @@ export default {
|
||||
} else if (this.isFetchingMetadata) {
|
||||
return this.$strings.LabelFetchingMetadata
|
||||
}
|
||||
},
|
||||
uploadProgressPercent() {
|
||||
if (this.uploadProgress.total === 0) return 0
|
||||
return Math.min(100, Math.round((this.uploadProgress.loaded / this.uploadProgress.total) * 100))
|
||||
},
|
||||
uploadProgressText() {
|
||||
const loaded = this.$bytesPretty(this.uploadProgress.loaded)
|
||||
const total = this.$bytesPretty(this.uploadProgress.total)
|
||||
return `${this.uploadProgressPercent}% (${loaded} / ${total})`
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -123,6 +153,21 @@ export default {
|
||||
this.isUploading = status === 'uploading'
|
||||
this.uploadFailed = status === 'failed'
|
||||
this.uploadSuccess = status === 'success'
|
||||
|
||||
if (status !== 'uploading') {
|
||||
this.uploadProgress = {
|
||||
loaded: 0,
|
||||
total: 0
|
||||
}
|
||||
}
|
||||
},
|
||||
setUploadProgress(progress) {
|
||||
if (this.isUploading && progress) {
|
||||
this.uploadProgress = {
|
||||
loaded: progress.loaded || 0,
|
||||
total: progress.total || 0
|
||||
}
|
||||
}
|
||||
},
|
||||
titleUpdated() {
|
||||
this.error = ''
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Error widget -->
|
||||
<ui-tooltip cy-id="ErrorTooltip" v-if="showError" :text="errorText" class="absolute bottom-4e left-0 z-10">
|
||||
<ui-tooltip cy-id="ErrorTooltip" v-if="showError" :text="errorText" plaintext class="absolute bottom-4e left-0 z-10">
|
||||
<div :style="{ height: 1.5 + 'em', width: 2.5 + 'em' }" class="bg-error rounded-r-full shadow-md flex items-center justify-end border-r border-b border-red-300">
|
||||
<span class="material-symbols text-red-100 pr-1e" :style="{ fontSize: 0.875 + 'em' }">priority_high</span>
|
||||
</div>
|
||||
@@ -101,7 +101,8 @@
|
||||
<!-- 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` }">
|
||||
<p :style="{ fontSize: 0.8 + 'em' }">
|
||||
Episode<span v-if="recentEpisodeNumber"> #{{ recentEpisodeNumber }}</span>
|
||||
Episode
|
||||
<span v-if="recentEpisodeNumber">#{{ recentEpisodeNumber }}</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -120,12 +121,12 @@
|
||||
<!-- Alternative bookshelf title/author/sort -->
|
||||
<div cy-id="detailBottom" :id="`description-area-${index}`" v-if="isAlternativeBookshelfView || isAuthorBookshelfView" dir="auto" class="relative mt-2e mb-2e left-0 z-50 w-full">
|
||||
<div :style="{ fontSize: 0.9 + 'em' }">
|
||||
<ui-tooltip v-if="displayTitle" :text="displayTitle" :disabled="!displayTitleTruncated" direction="bottom" :delayOnShow="500" class="flex items-center">
|
||||
<ui-tooltip v-if="displayTitle" :text="displayTitle" plaintext :disabled="!displayTitleTruncated" direction="bottom" :delayOnShow="500" class="flex items-center">
|
||||
<p cy-id="title" ref="displayTitle" class="truncate">{{ displayTitle }}</p>
|
||||
<widgets-explicit-indicator cy-id="explicitIndicator" v-if="isExplicit" />
|
||||
</ui-tooltip>
|
||||
</div>
|
||||
<ui-tooltip v-if="showSubtitles" :text="displaySubtitle" :disabled="!displaySubtitleTruncated" direction="bottom" :delayOnShow="500" class="flex items-center">
|
||||
<ui-tooltip v-if="showSubtitles" :text="displaySubtitle" plaintext :disabled="!displaySubtitleTruncated" direction="bottom" :delayOnShow="500" class="flex items-center">
|
||||
<p cy-id="subtitle" class="truncate" ref="displaySubtitle" :style="{ fontSize: 0.6 + 'em' }">{{ displaySubtitle }}</p>
|
||||
</ui-tooltip>
|
||||
<p cy-id="line2" class="truncate text-gray-400" :style="{ fontSize: 0.8 + 'em' }">{{ displayLineTwo || ' ' }}</p>
|
||||
@@ -200,6 +201,9 @@ export default {
|
||||
dateFormat() {
|
||||
return this.store.getters['getServerSetting']('dateFormat')
|
||||
},
|
||||
timeFormat() {
|
||||
return this.store.getters['getServerSetting']('timeFormat')
|
||||
},
|
||||
_libraryItem() {
|
||||
return this.libraryItem || {}
|
||||
},
|
||||
@@ -345,6 +349,18 @@ export default {
|
||||
if (this.mediaMetadata.publishedYear) return this.$getString('LabelPublishedDate', [this.mediaMetadata.publishedYear])
|
||||
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
|
||||
},
|
||||
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
|
||||
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() {
|
||||
if (this.booksInSeries) return this.seriesIsFinished
|
||||
return this.userProgress ? !!this.userProgress.isFinished : false
|
||||
@@ -760,11 +788,11 @@ export default {
|
||||
},
|
||||
showEditModalFiles() {
|
||||
// More menu func
|
||||
this.store.commit('showEditModalOnTab', { libraryItem: this.libraryItem, tab: 'files' })
|
||||
this.$emit('edit', this.libraryItem, 'files')
|
||||
},
|
||||
showEditModalMatch() {
|
||||
// More menu func
|
||||
this.store.commit('showEditModalOnTab', { libraryItem: this.libraryItem, tab: 'match' })
|
||||
this.$emit('edit', this.libraryItem, 'match')
|
||||
},
|
||||
sendToDevice(deviceName) {
|
||||
// More menu func
|
||||
|
||||
@@ -338,6 +338,18 @@ export default {
|
||||
const series = this.series.find((se) => se.id == decoded)
|
||||
if (series) filterValue = series.name
|
||||
}
|
||||
} else if (parts[0] === 'progress') {
|
||||
const item = this.progress.find((p) => p.id == decoded)
|
||||
if (item) filterValue = item.name
|
||||
} else if (parts[0] === 'tracks') {
|
||||
const item = this.tracks.find((t) => t.id == decoded)
|
||||
if (item) filterValue = item.name
|
||||
} else if (parts[0] === 'ebooks') {
|
||||
const item = this.ebooks.find((e) => e.id == decoded)
|
||||
if (item) filterValue = item.name
|
||||
} else if (parts[0] === 'missing') {
|
||||
const item = this.missing.find((m) => m.id == decoded)
|
||||
if (item) filterValue = item.name
|
||||
} else {
|
||||
filterValue = decoded
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
</span>
|
||||
</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">
|
||||
<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">
|
||||
@@ -130,6 +130,18 @@ export default {
|
||||
text: this.$strings.LabelFileModified,
|
||||
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,
|
||||
value: 'random'
|
||||
@@ -191,3 +203,9 @@ export default {
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.librarySortMenu {
|
||||
max-height: calc(100vh - 125px);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -39,9 +39,6 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
_author() {
|
||||
return this.author || {}
|
||||
},
|
||||
|
||||
@@ -309,9 +309,9 @@ export default {
|
||||
} else {
|
||||
console.log('Account updated', data.user)
|
||||
|
||||
if (data.user.id === this.user.id && data.user.token !== this.user.token) {
|
||||
console.log('Current user token was updated')
|
||||
this.$store.commit('user/setUserToken', data.user.token)
|
||||
if (data.user.id === this.user.id && data.user.accessToken !== this.user.accessToken) {
|
||||
console.log('Current user access token was updated')
|
||||
this.$store.commit('user/setAccessToken', data.user.accessToken)
|
||||
}
|
||||
|
||||
this.$toast.success(this.$strings.ToastAccountUpdateSuccess)
|
||||
@@ -351,9 +351,6 @@ export default {
|
||||
this.$toast.error(errMsg || 'Failed to create account')
|
||||
})
|
||||
},
|
||||
toggleActive() {
|
||||
this.newUser.isActive = !this.newUser.isActive
|
||||
},
|
||||
userTypeUpdated(type) {
|
||||
this.newUser.permissions = {
|
||||
download: type !== 'guest',
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
<template>
|
||||
<modals-modal ref="modal" v-model="show" name="api-key-created" :width="800" :height="'unset'" persistent>
|
||||
<template #outer>
|
||||
<div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden">
|
||||
<p class="text-3xl text-white truncate">{{ title }}</p>
|
||||
</div>
|
||||
</template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<div class="px-4 w-full text-sm py-6 rounded-lg bg-bg shadow-lg border border-black-300 overflow-y-auto overflow-x-hidden" style="min-height: 200px; max-height: 80vh">
|
||||
<div class="w-full p-8">
|
||||
<p class="text-lg text-white mb-4">{{ $getString('LabelApiKeyCreated', [apiKeyName]) }}</p>
|
||||
|
||||
<p class="text-lg text-white mb-4">{{ $strings.LabelApiKeyCreatedDescription }}</p>
|
||||
|
||||
<ui-text-input label="API Key" :value="apiKeyKey" readonly show-copy />
|
||||
|
||||
<div class="flex justify-end mt-4">
|
||||
<ui-btn color="bg-primary" @click="show = false">{{ $strings.ButtonClose }}</ui-btn>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</modals-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
value: Boolean,
|
||||
apiKey: {
|
||||
type: Object,
|
||||
default: () => null
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
computed: {
|
||||
show: {
|
||||
get() {
|
||||
return this.value
|
||||
},
|
||||
set(val) {
|
||||
this.$emit('input', val)
|
||||
}
|
||||
},
|
||||
title() {
|
||||
return this.$strings.HeaderNewApiKey
|
||||
},
|
||||
apiKeyName() {
|
||||
return this.apiKey?.name || ''
|
||||
},
|
||||
apiKeyKey() {
|
||||
return this.apiKey?.apiKey || ''
|
||||
}
|
||||
},
|
||||
methods: {},
|
||||
mounted() {}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,198 @@
|
||||
<template>
|
||||
<modals-modal ref="modal" v-model="show" name="api-key" :width="800" :height="'unset'" :processing="processing">
|
||||
<template #outer>
|
||||
<div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden">
|
||||
<p class="text-3xl text-white truncate">{{ title }}</p>
|
||||
</div>
|
||||
</template>
|
||||
<form @submit.prevent="submitForm">
|
||||
<div class="px-4 w-full text-sm py-6 rounded-lg bg-bg shadow-lg border border-black-300 overflow-y-auto overflow-x-hidden" style="min-height: 400px; max-height: 80vh">
|
||||
<div class="w-full p-8">
|
||||
<div class="flex py-2">
|
||||
<div class="w-1/2 px-2">
|
||||
<ui-text-input-with-label v-model.trim="newApiKey.name" :readonly="!isNew" :label="$strings.LabelName" />
|
||||
</div>
|
||||
<div v-if="isNew" class="w-1/2 px-2">
|
||||
<ui-text-input-with-label v-model.trim="newApiKey.expiresIn" :label="$strings.LabelExpiresInSeconds" type="number" :min="0" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center pt-4 pb-2 gap-2">
|
||||
<div class="flex items-center px-2">
|
||||
<p class="px-3 font-semibold" id="user-enabled-toggle">{{ $strings.LabelEnable }}</p>
|
||||
<ui-toggle-switch :disabled="isExpired && !apiKey.isActive" labeledBy="user-enabled-toggle" v-model="newApiKey.isActive" />
|
||||
</div>
|
||||
<div v-if="isExpired" class="px-2">
|
||||
<p class="text-sm text-error">{{ $strings.LabelExpired }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full border-t border-b border-black-200 py-4 px-3 mt-4">
|
||||
<p class="text-lg mb-2 font-semibold">{{ $strings.LabelApiKeyUser }}</p>
|
||||
<p class="text-sm mb-2 text-gray-400">{{ $strings.LabelApiKeyUserDescription }}</p>
|
||||
<ui-select-input v-model="newApiKey.userId" :disabled="isExpired && !apiKey.isActive" :items="userItems" :placeholder="$strings.LabelSelectUser" :label="$strings.LabelApiKeyUser" label-hidden />
|
||||
</div>
|
||||
|
||||
<div class="flex pt-4 px-2">
|
||||
<div class="grow" />
|
||||
<ui-btn color="bg-success" type="submit">{{ $strings.ButtonSubmit }}</ui-btn>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</modals-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
value: Boolean,
|
||||
apiKey: {
|
||||
type: Object,
|
||||
default: () => null
|
||||
},
|
||||
users: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
processing: false,
|
||||
newApiKey: {},
|
||||
isNew: true
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
show: {
|
||||
handler(newVal) {
|
||||
if (newVal) {
|
||||
this.init()
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
show: {
|
||||
get() {
|
||||
return this.value
|
||||
},
|
||||
set(val) {
|
||||
this.$emit('input', val)
|
||||
}
|
||||
},
|
||||
title() {
|
||||
return this.isNew ? this.$strings.HeaderNewApiKey : this.$strings.HeaderUpdateApiKey
|
||||
},
|
||||
userItems() {
|
||||
return this.users
|
||||
.filter((u) => {
|
||||
// Only show root user if the current user is root
|
||||
return u.type !== 'root' || this.$store.getters['user/getIsRoot']
|
||||
})
|
||||
.map((u) => ({ text: u.username, value: u.id, subtext: u.type }))
|
||||
},
|
||||
isExpired() {
|
||||
if (!this.apiKey || !this.apiKey.expiresAt) return false
|
||||
|
||||
return new Date(this.apiKey.expiresAt).getTime() < Date.now()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
submitForm() {
|
||||
if (!this.newApiKey.name) {
|
||||
this.$toast.error(this.$strings.ToastNameRequired)
|
||||
return
|
||||
}
|
||||
|
||||
if (!this.newApiKey.userId) {
|
||||
this.$toast.error(this.$strings.ToastNewApiKeyUserError)
|
||||
return
|
||||
}
|
||||
|
||||
if (this.isNew) {
|
||||
this.submitCreateApiKey()
|
||||
} else {
|
||||
this.submitUpdateApiKey()
|
||||
}
|
||||
},
|
||||
submitUpdateApiKey() {
|
||||
if (this.newApiKey.isActive === this.apiKey.isActive && this.newApiKey.userId === this.apiKey.userId) {
|
||||
this.$toast.info(this.$strings.ToastNoUpdatesNecessary)
|
||||
this.show = false
|
||||
return
|
||||
}
|
||||
|
||||
const apiKey = {
|
||||
isActive: this.newApiKey.isActive,
|
||||
userId: this.newApiKey.userId
|
||||
}
|
||||
|
||||
this.processing = true
|
||||
this.$axios
|
||||
.$patch(`/api/api-keys/${this.apiKey.id}`, apiKey)
|
||||
.then((data) => {
|
||||
this.processing = false
|
||||
if (data.error) {
|
||||
this.$toast.error(`${this.$strings.ToastFailedToUpdate}: ${data.error}`)
|
||||
} else {
|
||||
this.show = false
|
||||
this.$emit('updated', data.apiKey)
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
this.processing = false
|
||||
console.error('Failed to update apiKey', error)
|
||||
var errMsg = error.response ? error.response.data || '' : ''
|
||||
this.$toast.error(errMsg || this.$strings.ToastFailedToUpdate)
|
||||
})
|
||||
},
|
||||
submitCreateApiKey() {
|
||||
const apiKey = { ...this.newApiKey }
|
||||
|
||||
if (this.newApiKey.expiresIn) {
|
||||
apiKey.expiresIn = parseInt(this.newApiKey.expiresIn)
|
||||
} else {
|
||||
delete apiKey.expiresIn
|
||||
}
|
||||
|
||||
this.processing = true
|
||||
this.$axios
|
||||
.$post('/api/api-keys', apiKey)
|
||||
.then((data) => {
|
||||
this.processing = false
|
||||
if (data.error) {
|
||||
this.$toast.error(this.$strings.ToastFailedToCreate + ': ' + data.error)
|
||||
} else {
|
||||
this.show = false
|
||||
this.$emit('created', data.apiKey)
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
this.processing = false
|
||||
console.error('Failed to create apiKey', error)
|
||||
var errMsg = error.response ? error.response.data || '' : ''
|
||||
this.$toast.error(errMsg || this.$strings.ToastFailedToCreate)
|
||||
})
|
||||
},
|
||||
init() {
|
||||
this.isNew = !this.apiKey
|
||||
|
||||
if (this.apiKey) {
|
||||
this.newApiKey = {
|
||||
name: this.apiKey.name,
|
||||
isActive: this.apiKey.isActive,
|
||||
userId: this.apiKey.userId
|
||||
}
|
||||
} else {
|
||||
this.newApiKey = {
|
||||
name: null,
|
||||
expiresIn: null,
|
||||
isActive: true,
|
||||
userId: null
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {}
|
||||
}
|
||||
</script>
|
||||
@@ -88,7 +88,7 @@ export default {
|
||||
},
|
||||
providers() {
|
||||
if (this.isPodcast) return this.$store.state.scanners.podcastProviders
|
||||
return this.$store.state.scanners.providers
|
||||
return this.$store.state.scanners.bookProviders
|
||||
},
|
||||
libraryProvider() {
|
||||
return this.$store.getters['libraries/getLibraryProvider'](this.currentLibraryId) || 'google'
|
||||
@@ -96,6 +96,9 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
// Fetch providers when modal is shown
|
||||
this.$store.dispatch('scanners/fetchProviders')
|
||||
|
||||
// If we don't have a set provider (first open of dialog) or we've switched library, set
|
||||
// the selected provider to the current library default provider
|
||||
if (!this.options.provider || this.lastUsedLibrary != this.currentLibraryId) {
|
||||
@@ -127,8 +130,7 @@ export default {
|
||||
this.show = false
|
||||
})
|
||||
}
|
||||
},
|
||||
mounted() {}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
</div>
|
||||
<div class="w-full md:w-1/3">
|
||||
<p v-if="!isMediaItemShareSession" class="font-semibold uppercase text-xs text-gray-400 tracking-wide mb-2 mt-6 md:mt-0">{{ $strings.LabelUser }}</p>
|
||||
<p v-if="!isMediaItemShareSession" class="mb-1 text-xs">{{ _session.userId }}</p>
|
||||
<p v-if="!isMediaItemShareSession" class="mb-1 text-xs">{{ username }}</p>
|
||||
|
||||
<p class="font-semibold uppercase text-xs text-gray-400 tracking-wide mt-6 mb-2">{{ $strings.LabelMediaPlayer }}</p>
|
||||
<p class="mb-1">{{ playMethodName }}</p>
|
||||
@@ -132,6 +132,9 @@ export default {
|
||||
_session() {
|
||||
return this.session || {}
|
||||
},
|
||||
username() {
|
||||
return this._session.user?.username || this._session.userId || ''
|
||||
},
|
||||
deviceInfo() {
|
||||
return this._session.deviceInfo || {}
|
||||
},
|
||||
|
||||
@@ -23,7 +23,7 @@ export default {
|
||||
processing: Boolean,
|
||||
persistent: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
default: false
|
||||
},
|
||||
width: {
|
||||
type: [String, Number],
|
||||
@@ -99,7 +99,7 @@ export default {
|
||||
this.preventClickoutside = false
|
||||
return
|
||||
}
|
||||
if (this.processing && this.persistent) return
|
||||
if (this.processing || this.persistent) return
|
||||
if (ev.srcElement && ev.srcElement.classList.contains('modal-bg')) {
|
||||
this.show = false
|
||||
}
|
||||
|
||||
@@ -51,19 +51,21 @@
|
||||
<form @submit.prevent="submitSearchForm">
|
||||
<div class="flex flex-wrap sm:flex-nowrap items-center justify-start -mx-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 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 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>
|
||||
<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>
|
||||
</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">
|
||||
<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">
|
||||
<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" />
|
||||
@@ -105,7 +107,10 @@ export default {
|
||||
showLocalCovers: false,
|
||||
previewUpload: null,
|
||||
selectedFile: null,
|
||||
provider: 'google'
|
||||
provider: 'google',
|
||||
currentSearchRequestId: null,
|
||||
searchInProgress: false,
|
||||
socketListenersActive: false
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@@ -128,8 +133,8 @@ export default {
|
||||
}
|
||||
},
|
||||
providers() {
|
||||
if (this.isPodcast) return this.$store.state.scanners.podcastProviders
|
||||
return [{ text: 'All', value: 'all' }, ...this.$store.state.scanners.providers, ...this.$store.state.scanners.coverOnlyProviders]
|
||||
if (this.isPodcast) return this.$store.state.scanners.podcastCoverProviders
|
||||
return this.$store.state.scanners.bookCoverProviders
|
||||
},
|
||||
searchTitleLabel() {
|
||||
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}`
|
||||
return _file
|
||||
})
|
||||
},
|
||||
socket() {
|
||||
return this.$root.socket
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -235,7 +243,19 @@ export default {
|
||||
this.searchTitle = this.mediaMetadata.title || ''
|
||||
this.searchAuthor = this.mediaMetadata.authorName || ''
|
||||
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() {
|
||||
if (!this.coverPath) {
|
||||
@@ -291,22 +311,116 @@ export default {
|
||||
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() {
|
||||
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
|
||||
this.persistProvider()
|
||||
|
||||
this.isProcessing = true
|
||||
const searchQuery = this.getSearchQuery()
|
||||
const results = await this.$axios
|
||||
.$get(`/api/search/covers?${searchQuery}`)
|
||||
.then((res) => res.results)
|
||||
.catch((error) => {
|
||||
console.error('Failed', error)
|
||||
return []
|
||||
})
|
||||
this.coversFound = results
|
||||
this.isProcessing = false
|
||||
// Setup socket listeners if not already done
|
||||
this.addSocketListeners()
|
||||
|
||||
// Clear previous results
|
||||
this.coversFound = []
|
||||
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) {
|
||||
this.isProcessing = true
|
||||
@@ -320,6 +434,20 @@ export default {
|
||||
this.isProcessing = false
|
||||
})
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// Setup socket listeners when component is mounted
|
||||
this.addSocketListeners()
|
||||
// Fetch providers if not already loaded
|
||||
this.$store.dispatch('scanners/fetchProviders')
|
||||
},
|
||||
beforeDestroy() {
|
||||
// Cancel any ongoing search when component is destroyed
|
||||
if (this.searchInProgress) {
|
||||
this.cancelCurrentSearch()
|
||||
}
|
||||
// Remove socket listeners
|
||||
this.removeSocketListeners()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -29,9 +29,6 @@ export default {
|
||||
media() {
|
||||
return this.libraryItem.media || {}
|
||||
},
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
userCanUpdate() {
|
||||
return this.$store.getters['user/getUserCanUpdate']
|
||||
},
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div id="match-wrapper" class="w-full h-full overflow-hidden px-2 md:px-4 py-4 md:py-6 relative">
|
||||
<form @submit.prevent="submitSearch">
|
||||
<div class="flex flex-wrap md:flex-nowrap items-center justify-start -mx-1">
|
||||
<div class="w-36 px-1">
|
||||
<div v-if="providersLoaded" class="w-36 px-1">
|
||||
<ui-dropdown v-model="provider" :items="providers" :label="$strings.LabelProvider" small />
|
||||
</div>
|
||||
<div class="grow md:w-72 px-1">
|
||||
@@ -77,8 +77,8 @@
|
||||
<ui-checkbox v-model="selectedMatchUsage.author" checkbox-bg="bg" @input="checkboxToggled" />
|
||||
<div class="grow ml-4">
|
||||
<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">
|
||||
{{ $strings.LabelCurrently }} <a title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('author', mediaMetadata.authorName)">{{ mediaMetadata.authorName }}</a>
|
||||
<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', isPodcast ? mediaMetadata.author : mediaMetadata.authorName)">{{ isPodcast ? mediaMetadata.author : mediaMetadata.authorName }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -87,7 +87,7 @@
|
||||
<div class="grow ml-4">
|
||||
<ui-multi-select v-model="selectedMatch.narrator" :items="narrators" :disabled="!selectedMatchUsage.narrator" :label="$strings.LabelNarrators" />
|
||||
<p v-if="mediaMetadata.narratorName" class="text-xs ml-1 text-white/60">
|
||||
{{ $strings.LabelCurrently }} <a title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('narrator', mediaMetadata.narrators)">{{ mediaMetadata.narratorName }}</a>
|
||||
{{ $strings.LabelCurrently }} <a :title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('narrator', mediaMetadata.narrators)">{{ mediaMetadata.narratorName }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -96,7 +96,7 @@
|
||||
<div class="grow ml-4">
|
||||
<ui-rich-text-editor v-model="selectedMatch.description" :disabled="!selectedMatchUsage.description" :label="$strings.LabelDescription" />
|
||||
<p v-if="mediaMetadata.description" class="text-xs ml-1 text-white/60">
|
||||
{{ $strings.LabelCurrently }} <a title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('description', mediaMetadata.description)">{{ mediaMetadata.descriptionPlain.substr(0, 100) + (mediaMetadata.descriptionPlain.length > 100 ? '...' : '') }}</a>
|
||||
{{ $strings.LabelCurrently }} <a :title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('description', mediaMetadata.description)">{{ mediaMetadata.descriptionPlain.substr(0, 100) + (mediaMetadata.descriptionPlain.length > 100 ? '...' : '') }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -105,7 +105,7 @@
|
||||
<div class="grow ml-4">
|
||||
<ui-text-input-with-label v-model="selectedMatch.publisher" :disabled="!selectedMatchUsage.publisher" :label="$strings.LabelPublisher" />
|
||||
<p v-if="mediaMetadata.publisher" class="text-xs ml-1 text-white/60">
|
||||
{{ $strings.LabelCurrently }} <a title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('publisher', mediaMetadata.publisher)">{{ mediaMetadata.publisher }}</a>
|
||||
{{ $strings.LabelCurrently }} <a :title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('publisher', mediaMetadata.publisher)">{{ mediaMetadata.publisher }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -114,7 +114,7 @@
|
||||
<div class="grow ml-4">
|
||||
<ui-text-input-with-label v-model="selectedMatch.publishedYear" :disabled="!selectedMatchUsage.publishedYear" :label="$strings.LabelPublishYear" />
|
||||
<p v-if="mediaMetadata.publishedYear" class="text-xs ml-1 text-white/60">
|
||||
{{ $strings.LabelCurrently }} <a title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('publishedYear', mediaMetadata.publishedYear)">{{ mediaMetadata.publishedYear }}</a>
|
||||
{{ $strings.LabelCurrently }} <a :title="$strings.LabelClickToUseCurrentValue" class="cursor-pointer hover:underline" @click.stop="setMatchFieldValue('publishedYear', mediaMetadata.publishedYear)">{{ mediaMetadata.publishedYear }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -253,6 +253,7 @@ export default {
|
||||
hasSearched: false,
|
||||
selectedMatch: null,
|
||||
selectedMatchOrig: null,
|
||||
waitingForProviders: false,
|
||||
selectedMatchUsage: {
|
||||
title: true,
|
||||
subtitle: true,
|
||||
@@ -285,9 +286,19 @@ export default {
|
||||
handler(newVal) {
|
||||
if (newVal) this.init()
|
||||
}
|
||||
},
|
||||
providersLoaded(isLoaded) {
|
||||
// Complete initialization once providers are loaded
|
||||
if (isLoaded && this.waitingForProviders) {
|
||||
this.waitingForProviders = false
|
||||
this.initProviderAndSearch()
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
providersLoaded() {
|
||||
return this.$store.getters['scanners/areProvidersLoaded']
|
||||
},
|
||||
isProcessing: {
|
||||
get() {
|
||||
return this.processing
|
||||
@@ -319,7 +330,7 @@ export default {
|
||||
},
|
||||
providers() {
|
||||
if (this.isPodcast) return this.$store.state.scanners.podcastProviders
|
||||
return this.$store.state.scanners.providers
|
||||
return this.$store.state.scanners.bookProviders
|
||||
},
|
||||
searchTitleLabel() {
|
||||
if (this.provider.startsWith('audible')) return this.$strings.LabelSearchTitleOrASIN
|
||||
@@ -400,7 +411,9 @@ export default {
|
||||
this.$toast.warning(this.$strings.ToastTitleRequired)
|
||||
return
|
||||
}
|
||||
this.persistProvider()
|
||||
if (!this.isPodcast) {
|
||||
this.persistProvider()
|
||||
}
|
||||
this.runSearch()
|
||||
},
|
||||
async runSearch() {
|
||||
@@ -476,6 +489,24 @@ export default {
|
||||
|
||||
this.checkboxToggled()
|
||||
},
|
||||
initProviderAndSearch() {
|
||||
// Set provider based on media type
|
||||
if (this.isPodcast) {
|
||||
this.provider = 'itunes'
|
||||
} else {
|
||||
this.provider = this.getDefaultBookProvider()
|
||||
}
|
||||
|
||||
// Prefer using ASIN if set and using audible provider
|
||||
if (this.provider.startsWith('audible') && this.libraryItem.media.metadata.asin) {
|
||||
this.searchTitle = this.libraryItem.media.metadata.asin
|
||||
this.searchAuthor = ''
|
||||
}
|
||||
|
||||
if (this.searchTitle) {
|
||||
this.submitSearch()
|
||||
}
|
||||
},
|
||||
init() {
|
||||
this.clearSelectedMatch()
|
||||
this.initSelectedMatchUsage()
|
||||
@@ -493,19 +524,13 @@ export default {
|
||||
}
|
||||
this.searchTitle = this.libraryItem.media.metadata.title
|
||||
this.searchAuthor = this.libraryItem.media.metadata.authorName || ''
|
||||
if (this.isPodcast) this.provider = 'itunes'
|
||||
else {
|
||||
this.provider = this.getDefaultBookProvider()
|
||||
}
|
||||
|
||||
// Prefer using ASIN if set and using audible provider
|
||||
if (this.provider.startsWith('audible') && this.libraryItem.media.metadata.asin) {
|
||||
this.searchTitle = this.libraryItem.media.metadata.asin
|
||||
this.searchAuthor = ''
|
||||
}
|
||||
|
||||
if (this.searchTitle) {
|
||||
this.submitSearch()
|
||||
// Wait for providers to be loaded before setting provider and searching
|
||||
if (this.providersLoaded || this.isPodcast) {
|
||||
this.waitingForProviders = false
|
||||
this.initProviderAndSearch()
|
||||
} else {
|
||||
this.waitingForProviders = true
|
||||
}
|
||||
},
|
||||
selectMatch(match) {
|
||||
@@ -635,6 +660,10 @@ export default {
|
||||
this.selectedMatch = null
|
||||
this.selectedMatchOrig = null
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// Fetch providers if not already loaded
|
||||
this.$store.dispatch('scanners/fetchProviders')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -74,7 +74,7 @@ export default {
|
||||
},
|
||||
providers() {
|
||||
if (this.mediaType === 'podcast') return this.$store.state.scanners.podcastProviders
|
||||
return this.$store.state.scanners.providers
|
||||
return this.$store.state.scanners.bookProviders
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -156,6 +156,8 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.init()
|
||||
// Fetch providers if not already loaded
|
||||
this.$store.dispatch('scanners/fetchProviders')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -104,7 +104,6 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
provider: null,
|
||||
useSquareBookCovers: false,
|
||||
enableWatcher: false,
|
||||
skipMatchingMediaWithAsin: false,
|
||||
@@ -134,10 +133,6 @@ export default {
|
||||
isPodcastLibrary() {
|
||||
return this.mediaType === 'podcast'
|
||||
},
|
||||
providers() {
|
||||
if (this.mediaType === 'podcast') return this.$store.state.scanners.podcastProviders
|
||||
return this.$store.state.scanners.providers
|
||||
},
|
||||
maskAsFinishedWhenItems() {
|
||||
return [
|
||||
{
|
||||
|
||||
@@ -97,7 +97,10 @@ export default {
|
||||
...playlist
|
||||
}
|
||||
})
|
||||
.sort((a, b) => (a.isItemIncluded ? -1 : 1))
|
||||
.sort((a, b) => {
|
||||
if (a.isItemIncluded !== b.isItemIncluded) return a.isItemIncluded ? -1 : 1
|
||||
return a.name.localeCompare(b.name)
|
||||
})
|
||||
},
|
||||
isBatch() {
|
||||
return this.selectedPlaylistItems.length > 1
|
||||
|
||||
@@ -94,7 +94,6 @@ export default {
|
||||
}
|
||||
|
||||
this.processing = false
|
||||
this.$toast.success(`${this.episodes.length} episode${this.episodes.length > 1 ? 's' : ''} removed`)
|
||||
this.show = false
|
||||
this.$emit('clearSelected')
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ export default {
|
||||
.$patch(`/api/podcasts/${this.libraryItem.id}/episode/${this.episodeId}`, updatePayload)
|
||||
.then(() => {
|
||||
this.isProcessing = false
|
||||
this.$toast.success('Podcast episode updated')
|
||||
this.$toast.success(this.$strings.ToastPodcastEpisodeUpdated)
|
||||
this.$emit('selectTab', 'details')
|
||||
})
|
||||
.catch((error) => {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</button>
|
||||
</ui-tooltip>
|
||||
<ui-tooltip direction="top" :text="jumpBackwardText">
|
||||
<button :aria-label="jumpForwardText" class="text-gray-300" @mousedown.prevent @mouseup.prevent @click.stop="jumpBackward">
|
||||
<button :aria-label="jumpBackwardText" class="text-gray-300" @mousedown.prevent @mouseup.prevent @click.stop="jumpBackward">
|
||||
<span class="material-symbols text-2xl sm:text-3xl">replay</span>
|
||||
</button>
|
||||
</ui-tooltip>
|
||||
|
||||
@@ -129,9 +129,6 @@ export default {
|
||||
return `${hoursRounded}h`
|
||||
}
|
||||
},
|
||||
token() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
timeRemaining() {
|
||||
if (this.useChapterTrack && this.currentChapter) {
|
||||
var currChapTime = this.currentTime - this.currentChapter.start
|
||||
|
||||
@@ -104,9 +104,6 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
libraryItemId() {
|
||||
return this.libraryItem?.id
|
||||
},
|
||||
@@ -234,10 +231,7 @@ export default {
|
||||
async extract() {
|
||||
this.loading = true
|
||||
var buff = await this.$axios.$get(this.ebookUrl, {
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: `Bearer ${this.userToken}`
|
||||
}
|
||||
responseType: 'blob'
|
||||
})
|
||||
const archive = await Archive.open(buff)
|
||||
const originalFilesObject = await archive.getFilesObject()
|
||||
|
||||
@@ -57,9 +57,6 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
/** @returns {string} */
|
||||
libraryItemId() {
|
||||
return this.libraryItem?.id
|
||||
@@ -97,27 +94,37 @@ export default {
|
||||
},
|
||||
ebookUrl() {
|
||||
if (this.fileId) {
|
||||
return `${this.$config.routerBasePath}/api/items/${this.libraryItemId}/ebook/${this.fileId}`
|
||||
return `/api/items/${this.libraryItemId}/ebook/${this.fileId}`
|
||||
}
|
||||
return `${this.$config.routerBasePath}/api/items/${this.libraryItemId}/ebook`
|
||||
return `/api/items/${this.libraryItemId}/ebook`
|
||||
},
|
||||
themeRules() {
|
||||
const isDark = this.ereaderSettings.theme === 'dark'
|
||||
const fontColor = isDark ? '#fff' : '#000'
|
||||
const backgroundColor = isDark ? 'rgb(35 35 35)' : 'rgb(255, 255, 255)'
|
||||
const theme = this.ereaderSettings.theme
|
||||
const isDark = theme === 'dark'
|
||||
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 fontScale = this.ereaderSettings.fontScale / 100
|
||||
|
||||
const textStroke = this.ereaderSettings.textStroke / 100
|
||||
const fontScale = this.ereaderSettings.fontScale / 100
|
||||
const textStroke = this.ereaderSettings.textStroke / 100
|
||||
|
||||
return {
|
||||
'*': {
|
||||
color: `${fontColor}!important`,
|
||||
'background-color': `${backgroundColor}!important`,
|
||||
'line-height': lineSpacing * fontScale + 'rem!important',
|
||||
'-webkit-text-stroke': textStroke + 'px ' + fontColor + '!important'
|
||||
'line-height': `${lineSpacing * fontScale}rem!important`,
|
||||
'-webkit-text-stroke': `${textStroke}px ${fontColor}!important`
|
||||
},
|
||||
a: {
|
||||
color: `${fontColor}!important`
|
||||
@@ -309,14 +316,24 @@ export default {
|
||||
/** @type {EpubReader} */
|
||||
const reader = this
|
||||
|
||||
// Use axios to make request because we have token refresh logic in interceptor
|
||||
const customRequest = async (url) => {
|
||||
try {
|
||||
return this.$axios.$get(url, {
|
||||
responseType: 'arraybuffer'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('EpubReader.initEpub customRequest failed:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
/** @type {ePub.Book} */
|
||||
reader.book = new ePub(reader.ebookUrl, {
|
||||
width: this.readerWidth,
|
||||
height: this.readerHeight - 50,
|
||||
openAs: 'epub',
|
||||
requestHeaders: {
|
||||
Authorization: `Bearer ${this.userToken}`
|
||||
}
|
||||
requestMethod: customRequest
|
||||
})
|
||||
|
||||
/** @type {ePub.Rendition} */
|
||||
@@ -337,29 +354,33 @@ export default {
|
||||
this.applyTheme()
|
||||
})
|
||||
|
||||
reader.book.ready.then(() => {
|
||||
// set up event listeners
|
||||
reader.rendition.on('relocated', reader.relocated)
|
||||
reader.rendition.on('keydown', reader.keyUp)
|
||||
reader.book.ready
|
||||
.then(() => {
|
||||
// set up event listeners
|
||||
reader.rendition.on('relocated', reader.relocated)
|
||||
reader.rendition.on('keydown', reader.keyUp)
|
||||
|
||||
reader.rendition.on('touchstart', (event) => {
|
||||
this.$emit('touchstart', event)
|
||||
})
|
||||
reader.rendition.on('touchend', (event) => {
|
||||
this.$emit('touchend', event)
|
||||
})
|
||||
|
||||
// load ebook cfi locations
|
||||
const savedLocations = this.loadLocations()
|
||||
if (savedLocations) {
|
||||
reader.book.locations.load(savedLocations)
|
||||
} else {
|
||||
reader.book.locations.generate().then(() => {
|
||||
this.checkSaveLocations(reader.book.locations.save())
|
||||
reader.rendition.on('touchstart', (event) => {
|
||||
this.$emit('touchstart', event)
|
||||
})
|
||||
}
|
||||
this.getChapters()
|
||||
})
|
||||
reader.rendition.on('touchend', (event) => {
|
||||
this.$emit('touchend', event)
|
||||
})
|
||||
|
||||
// load ebook cfi locations
|
||||
const savedLocations = this.loadLocations()
|
||||
if (savedLocations) {
|
||||
reader.book.locations.load(savedLocations)
|
||||
} else {
|
||||
reader.book.locations.generate().then(() => {
|
||||
this.checkSaveLocations(reader.book.locations.save())
|
||||
})
|
||||
}
|
||||
this.getChapters()
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('EpubReader.initEpub failed:', error)
|
||||
})
|
||||
},
|
||||
getChapters() {
|
||||
// Load the list of chapters in the book. See https://github.com/futurepress/epub.js/issues/759
|
||||
|
||||
@@ -26,9 +26,6 @@ export default {
|
||||
return {}
|
||||
},
|
||||
computed: {
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
libraryItemId() {
|
||||
return this.libraryItem?.id
|
||||
},
|
||||
@@ -96,11 +93,8 @@ export default {
|
||||
},
|
||||
async initMobi() {
|
||||
// Fetch mobi file as blob
|
||||
var buff = await this.$axios.$get(this.ebookUrl, {
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
Authorization: `Bearer ${this.userToken}`
|
||||
}
|
||||
const buff = await this.$axios.$get(this.ebookUrl, {
|
||||
responseType: 'blob'
|
||||
})
|
||||
var reader = new FileReader()
|
||||
reader.onload = async (event) => {
|
||||
|
||||
@@ -55,7 +55,8 @@ export default {
|
||||
loadedRatio: 0,
|
||||
page: 1,
|
||||
numPages: 0,
|
||||
pdfDocInitParams: null
|
||||
pdfDocInitParams: null,
|
||||
isRefreshing: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -152,7 +153,34 @@ export default {
|
||||
this.page++
|
||||
this.updateProgress()
|
||||
},
|
||||
error(err) {
|
||||
async refreshToken() {
|
||||
if (this.isRefreshing) return
|
||||
this.isRefreshing = true
|
||||
const newAccessToken = await this.$store.dispatch('user/refreshToken').catch((error) => {
|
||||
console.error('Failed to refresh token', error)
|
||||
return null
|
||||
})
|
||||
if (!newAccessToken) {
|
||||
// Redirect to login on failed refresh
|
||||
this.$router.push('/login')
|
||||
return
|
||||
}
|
||||
|
||||
// Force Vue to re-render the PDF component by creating a new object
|
||||
this.pdfDocInitParams = {
|
||||
url: this.ebookUrl,
|
||||
httpHeaders: {
|
||||
Authorization: `Bearer ${newAccessToken}`
|
||||
}
|
||||
}
|
||||
this.isRefreshing = false
|
||||
},
|
||||
async error(err) {
|
||||
if (err && err.status === 401) {
|
||||
console.log('Received 401 error, refreshing token')
|
||||
await this.refreshToken()
|
||||
return
|
||||
}
|
||||
console.error(err)
|
||||
},
|
||||
resize() {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<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">
|
||||
<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>
|
||||
@@ -27,7 +27,12 @@
|
||||
|
||||
<!-- 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="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 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">
|
||||
@@ -37,7 +42,7 @@
|
||||
<p class="text-lg font-semibold ml-2">{{ $strings.HeaderTableOfContents }}</p>
|
||||
</div>
|
||||
<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>
|
||||
|
||||
<div class="overflow-y-auto">
|
||||
@@ -181,6 +186,10 @@ export default {
|
||||
text: this.$strings.LabelThemeDark,
|
||||
value: 'dark'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelThemeSepia,
|
||||
value: 'sepia'
|
||||
},
|
||||
{
|
||||
text: this.$strings.LabelThemeLight,
|
||||
value: 'light'
|
||||
@@ -266,9 +275,6 @@ export default {
|
||||
isComic() {
|
||||
return this.ebookFormat == 'cbz' || this.ebookFormat == 'cbr'
|
||||
},
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
keepProgress() {
|
||||
return this.$store.state.ereaderKeepProgress
|
||||
},
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div :key="n" class="absolute pointer-events-none left-0 h-px bg-white/10" :style="{ top: n * lineSpacing - lineSpacing / 2 + 'px', width: '360px', marginLeft: '24px' }" />
|
||||
|
||||
<div :key="`dot-${n}`" class="absolute z-10" :style="{ left: points[n - 1].x + 'px', bottom: points[n - 1].y + 'px' }">
|
||||
<ui-tooltip :text="last7DaysOfListening[n - 1].minutesListening" direction="top">
|
||||
<ui-tooltip :text="last7DaysOfListening[n - 1].minutesListening" plaintext direction="top">
|
||||
<div class="h-2 w-2 bg-yellow-400 hover:bg-yellow-300 rounded-full transform duration-150 transition-transform hover:scale-125" />
|
||||
</ui-tooltip>
|
||||
</div>
|
||||
@@ -186,10 +186,16 @@ export default {
|
||||
daysInARow() {
|
||||
var count = 0
|
||||
while (true) {
|
||||
var _date = this.$addDaysToToday(count * -1)
|
||||
var datestr = this.$formatJsDate(_date, 'yyyy-MM-dd')
|
||||
const _date = this.$addDaysToToday(count * -1 - 1)
|
||||
const datestr = this.$formatJsDate(_date, 'yyyy-MM-dd')
|
||||
|
||||
if (!this.listeningStatsDays[datestr] || this.listeningStatsDays[datestr] === 0) {
|
||||
// don't require listening today to count towards days in a row, but do count it if already listened today
|
||||
const today = this.$formatJsDate(new Date(), 'yyyy-MM-dd')
|
||||
if (this.listeningStatsDays[today]) {
|
||||
count++
|
||||
}
|
||||
|
||||
return count
|
||||
}
|
||||
count++
|
||||
|
||||
@@ -152,7 +152,7 @@ export default {
|
||||
|
||||
this.showingTooltipIndex = index
|
||||
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()
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
<template>
|
||||
<div class="flex flex-wrap justify-center mt-6">
|
||||
<div class="flex p-2">
|
||||
<svg class="h-14 w-14" viewBox="0 0 24 24">
|
||||
<path fill="currentColor" d="M9 3V18H12V3H9M12 5L16 18L19 17L15 4L12 5M5 5V18H8V5H5M3 19V21H21V19H3Z" />
|
||||
</svg>
|
||||
<span class="material-symbols text-5xl py-1">newsstand</span>
|
||||
<div class="px-1">
|
||||
<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>
|
||||
@@ -19,9 +17,7 @@
|
||||
</div>
|
||||
|
||||
<div v-if="isBookLibrary" class="flex p-2">
|
||||
<svg class="h-14 w-14" viewBox="0 0 24 24">
|
||||
<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>
|
||||
<span class="material-symbols text-5xl py-1">person</span>
|
||||
<div class="px-1">
|
||||
<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>
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
<template>
|
||||
<div>
|
||||
<div class="text-center">
|
||||
<table v-if="apiKeys.length > 0" id="api-keys">
|
||||
<tr>
|
||||
<th>{{ $strings.LabelName }}</th>
|
||||
<th class="w-44">{{ $strings.LabelApiKeyUser }}</th>
|
||||
<th class="w-32">{{ $strings.LabelExpiresAt }}</th>
|
||||
<th class="w-32">{{ $strings.LabelCreatedAt }}</th>
|
||||
<th class="w-32"></th>
|
||||
</tr>
|
||||
<tr v-for="apiKey in apiKeys" :key="apiKey.id" :class="apiKey.isActive ? '' : 'bg-error/10!'">
|
||||
<td>
|
||||
<div class="flex items-center">
|
||||
<p class="pl-2 truncate">{{ apiKey.name }}</p>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-xs">
|
||||
<nuxt-link v-if="apiKey.user" :to="`/config/users/${apiKey.user.id}`" class="text-xs hover:underline">
|
||||
{{ apiKey.user.username }}
|
||||
</nuxt-link>
|
||||
<p v-else class="text-xs">Error</p>
|
||||
</td>
|
||||
<td class="text-xs">
|
||||
<p v-if="apiKey.expiresAt" class="text-xs" :title="apiKey.expiresAt">{{ getExpiresAtText(apiKey) }}</p>
|
||||
<p v-else class="text-xs">{{ $strings.LabelExpiresNever }}</p>
|
||||
</td>
|
||||
<td class="text-xs font-mono">
|
||||
<ui-tooltip direction="top" :text="$formatJsDatetime(new Date(apiKey.createdAt), dateFormat, timeFormat)">
|
||||
{{ $formatJsDate(new Date(apiKey.createdAt), dateFormat) }}
|
||||
</ui-tooltip>
|
||||
</td>
|
||||
<td class="py-0">
|
||||
<div class="w-full flex justify-left">
|
||||
<div class="h-8 w-8 flex items-center justify-center text-white/50 hover:text-white/100 cursor-pointer" @click.stop="editApiKey(apiKey)">
|
||||
<button type="button" :aria-label="$strings.ButtonEdit" class="material-symbols text-base">edit</button>
|
||||
</div>
|
||||
<div class="h-8 w-8 flex items-center justify-center text-white/50 hover:text-error cursor-pointer" @click.stop="deleteApiKeyClick(apiKey)">
|
||||
<button type="button" :aria-label="$strings.ButtonDelete" class="material-symbols text-base">delete</button>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p v-else class="text-base text-gray-300 py-4">{{ $strings.LabelNoApiKeys }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
apiKeys: [],
|
||||
isDeletingApiKey: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
dateFormat() {
|
||||
return this.$store.state.serverSettings.dateFormat
|
||||
},
|
||||
timeFormat() {
|
||||
return this.$store.state.serverSettings.timeFormat
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getExpiresAtText(apiKey) {
|
||||
if (new Date(apiKey.expiresAt).getTime() < Date.now()) {
|
||||
return this.$strings.LabelExpired
|
||||
}
|
||||
return this.$formatJsDatetime(new Date(apiKey.expiresAt), this.dateFormat, this.timeFormat)
|
||||
},
|
||||
deleteApiKeyClick(apiKey) {
|
||||
if (this.isDeletingApiKey) return
|
||||
|
||||
const payload = {
|
||||
message: this.$getString('MessageConfirmDeleteApiKey', [apiKey.name]),
|
||||
callback: (confirmed) => {
|
||||
if (confirmed) {
|
||||
this.deleteApiKey(apiKey)
|
||||
}
|
||||
},
|
||||
type: 'yesNo'
|
||||
}
|
||||
this.$store.commit('globals/setConfirmPrompt', payload)
|
||||
},
|
||||
deleteApiKey(apiKey) {
|
||||
this.isDeletingApiKey = true
|
||||
this.$axios
|
||||
.$delete(`/api/api-keys/${apiKey.id}`)
|
||||
.then((data) => {
|
||||
if (data.error) {
|
||||
this.$toast.error(data.error)
|
||||
} else {
|
||||
this.removeApiKey(apiKey.id)
|
||||
this.$emit('numApiKeys', this.apiKeys.length)
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed to delete apiKey', error)
|
||||
this.$toast.error(this.$strings.ToastFailedToDelete)
|
||||
})
|
||||
.finally(() => {
|
||||
this.isDeletingApiKey = false
|
||||
})
|
||||
},
|
||||
editApiKey(apiKey) {
|
||||
this.$emit('edit', apiKey)
|
||||
},
|
||||
addApiKey(apiKey) {
|
||||
this.apiKeys.push(apiKey)
|
||||
},
|
||||
removeApiKey(apiKeyId) {
|
||||
this.apiKeys = this.apiKeys.filter((a) => a.id !== apiKeyId)
|
||||
},
|
||||
updateApiKey(apiKey) {
|
||||
this.apiKeys = this.apiKeys.map((a) => (a.id === apiKey.id ? apiKey : a))
|
||||
},
|
||||
loadApiKeys() {
|
||||
this.$axios
|
||||
.$get('/api/api-keys')
|
||||
.then((res) => {
|
||||
this.apiKeys = res.apiKeys.sort((a, b) => {
|
||||
return a.createdAt - b.createdAt
|
||||
})
|
||||
this.$emit('numApiKeys', this.apiKeys.length)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed to load apiKeys', error)
|
||||
})
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadApiKeys()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#api-keys {
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid #474747;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#api-keys td,
|
||||
#api-keys th {
|
||||
/* border: 1px solid #2e2e2e; */
|
||||
padding: 8px 8px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#api-keys td.py-0 {
|
||||
padding: 0px 8px;
|
||||
}
|
||||
|
||||
#api-keys tr:nth-child(even) {
|
||||
background-color: #373838;
|
||||
}
|
||||
|
||||
#api-keys tr:nth-child(odd) {
|
||||
background-color: #2f2f2f;
|
||||
}
|
||||
|
||||
#api-keys tr:hover {
|
||||
background-color: #444;
|
||||
}
|
||||
|
||||
#api-keys th {
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
background-color: #272727;
|
||||
}
|
||||
</style>
|
||||
@@ -49,9 +49,6 @@ export default {
|
||||
libraryItemId() {
|
||||
return this.libraryItem.id
|
||||
},
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
userCanDownload() {
|
||||
return this.$store.getters['user/getUserCanDownload']
|
||||
},
|
||||
|
||||
@@ -53,9 +53,6 @@ export default {
|
||||
libraryItemId() {
|
||||
return this.libraryItem.id
|
||||
},
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
userCanDownload() {
|
||||
return this.$store.getters['user/getUserCanDownload']
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="w-40">
|
||||
<div :class="hasSlotContent ? 'w-auto' : 'w-40'">
|
||||
<div class="bg-bg border border-gray-500 py-2 px-5 rounded-lg flex items-center flex-col box-shadow-md">
|
||||
<div class="loader-dots block relative w-20 h-5 mt-2">
|
||||
<div class="absolute top-0 mt-1 w-3 h-3 rounded-full bg-green-500"></div>
|
||||
@@ -7,7 +7,9 @@
|
||||
<div class="absolute top-0 mt-1 w-3 h-3 rounded-full bg-green-500"></div>
|
||||
<div class="absolute top-0 mt-1 w-3 h-3 rounded-full bg-green-500"></div>
|
||||
</div>
|
||||
<div class="text-gray-200 text-xs font-light mt-2 text-center">{{ message }}</div>
|
||||
<slot>
|
||||
<div class="text-gray-200 text-xs font-light mt-2 text-center">{{ message }}</div>
|
||||
</slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -23,6 +25,9 @@ export default {
|
||||
computed: {
|
||||
message() {
|
||||
return this.text || this.$strings.MessagePleaseWait
|
||||
},
|
||||
hasSlotContent() {
|
||||
return this.$slots.default && this.$slots.default.length > 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
<div ref="wrapper" class="relative">
|
||||
<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 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 }">
|
||||
<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>
|
||||
{{ item }}
|
||||
</div>
|
||||
@@ -259,8 +260,9 @@ export default {
|
||||
}
|
||||
this.focus()
|
||||
},
|
||||
removeItem(item) {
|
||||
var remaining = this.selected.filter((i) => i !== item)
|
||||
removeItem(item, idx) {
|
||||
var remaining = this.selected.slice()
|
||||
remaining.splice(idx, 1)
|
||||
this.$emit('input', remaining)
|
||||
this.$emit('removedItem', item)
|
||||
this.$nextTick(() => {
|
||||
@@ -276,7 +278,7 @@ export default {
|
||||
})
|
||||
},
|
||||
insertNewItem(item) {
|
||||
this.selected.push(item)
|
||||
if (!this.selected.includes(item)) this.selected.push(item)
|
||||
this.$emit('input', this.selected)
|
||||
this.$emit('newItem', item)
|
||||
this.textInput = null
|
||||
|
||||
@@ -85,9 +85,6 @@ export default {
|
||||
this.$emit('input', val)
|
||||
}
|
||||
},
|
||||
userToken() {
|
||||
return this.$store.getters['user/getToken']
|
||||
},
|
||||
wrapperClass() {
|
||||
var classes = []
|
||||
if (this.disabled) classes.push('bg-black-300')
|
||||
@@ -290,7 +287,7 @@ export default {
|
||||
})
|
||||
},
|
||||
insertNewItem(item) {
|
||||
this.selected.push(item)
|
||||
if (!this.selected.find((i) => i.name === item.name)) this.selected.push(item)
|
||||
this.$emit('input', this.selected)
|
||||
this.$emit('newItem', item)
|
||||
this.textInput = null
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
<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">
|
||||
<div class="w-5 h-5 text-white relative">
|
||||
<svg v-if="isRead" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="rgb(63, 181, 68)">
|
||||
<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" />
|
||||
</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 class="w-5 h-5 relative">
|
||||
<span v-if="isRead" class="material-symbols fill text-xl text-success">beenhere</span>
|
||||
<span v-else class="material-symbols text-xl text-white">beenhere</span>
|
||||
</div>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<div class="relative w-full">
|
||||
<p v-if="label" class="text-sm font-semibold px-1" :class="disabled ? 'text-gray-300' : ''">{{ label }}</p>
|
||||
<p v-if="label && !labelHidden" class="text-sm font-semibold px-1" :class="disabled ? 'text-gray-300' : ''">{{ label }}</p>
|
||||
<button ref="buttonWrapper" type="button" :aria-label="longLabel" :disabled="disabled" class="relative w-full border rounded-sm shadow-xs pl-3 pr-8 py-2 text-left sm:text-sm" :class="buttonClass" aria-haspopup="listbox" aria-expanded="true" @click.stop.prevent="clickShowMenu">
|
||||
<span class="flex items-center">
|
||||
<span class="block truncate font-sans" :class="{ 'font-semibold': selectedSubtext, 'text-sm': small }">{{ selectedText }}</span>
|
||||
<span class="block truncate font-sans" :class="{ 'font-semibold': selectedSubtext, 'text-sm': small, 'text-gray-400': !selectedText }">{{ selectedText || placeholder }}</span>
|
||||
<span v-if="selectedSubtext">: </span>
|
||||
<span v-if="selectedSubtext" class="font-normal block truncate font-sans text-sm text-gray-400">{{ selectedSubtext }}</span>
|
||||
</span>
|
||||
@@ -36,10 +36,15 @@ export default {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
labelHidden: Boolean,
|
||||
items: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
disabled: Boolean,
|
||||
small: Boolean,
|
||||
menuMaxHeight: {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<em v-if="note" class="font-normal text-xs pl-2">{{ note }}</em>
|
||||
</label>
|
||||
</slot>
|
||||
<ui-text-input :placeholder="placeholder || label" :inputId="identifier" ref="input" v-model="inputValue" :disabled="disabled" :readonly="readonly" :type="type" :show-copy="showCopy" class="w-full" :class="inputClass" :trim-whitespace="trimWhitespace" @blur="inputBlurred" />
|
||||
<ui-text-input :placeholder="placeholder || label" :inputId="identifier" ref="input" v-model="inputValue" :disabled="disabled" :readonly="readonly" :type="type" :min="min" :show-copy="showCopy" class="w-full" :class="inputClass" :trim-whitespace="trimWhitespace" @blur="inputBlurred" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -21,6 +21,7 @@ export default {
|
||||
type: String,
|
||||
default: 'text'
|
||||
},
|
||||
min: [String, Number],
|
||||
readonly: Boolean,
|
||||
disabled: Boolean,
|
||||
inputClass: String,
|
||||
|
||||
@@ -22,7 +22,8 @@ export default {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
disabled: Boolean
|
||||
disabled: Boolean,
|
||||
plaintext: Boolean
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -46,7 +47,11 @@ export default {
|
||||
methods: {
|
||||
updateText() {
|
||||
if (this.tooltip) {
|
||||
this.tooltip.innerHTML = this.text
|
||||
if (this.plaintext) {
|
||||
this.tooltip.textContent = this.text
|
||||
} else {
|
||||
this.tooltip.innerHTML = this.text
|
||||
}
|
||||
this.setTooltipPosition(this.tooltip)
|
||||
}
|
||||
},
|
||||
@@ -58,7 +63,11 @@ export default {
|
||||
tooltip.className = 'tooltip-wrapper absolute px-2 py-1 text-white text-xs rounded-sm shadow-lg max-w-xs text-center hidden sm:block'
|
||||
tooltip.style.zIndex = 100
|
||||
tooltip.style.backgroundColor = 'rgba(0,0,0,0.85)'
|
||||
tooltip.innerHTML = this.text
|
||||
if (this.plaintext) {
|
||||
tooltip.textContent = this.text
|
||||
} else {
|
||||
tooltip.innerHTML = this.text
|
||||
}
|
||||
tooltip.addEventListener('mouseover', this.cancelHide)
|
||||
tooltip.addEventListener('mouseleave', this.hideTooltip)
|
||||
|
||||
|
||||
@@ -1,40 +1,6 @@
|
||||
<template>
|
||||
<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">
|
||||
<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>
|
||||
<span class="material-symbols fill text-sm ml-1 !block">explicit</span>
|
||||
</ui-tooltip>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -132,10 +132,10 @@ export default {
|
||||
editAuthor(author) {
|
||||
this.$store.commit('globals/showEditAuthorModal', author)
|
||||
},
|
||||
editItem(libraryItem) {
|
||||
editItem(libraryItem, tab = 'details') {
|
||||
var itemIds = this.items.map((e) => e.id)
|
||||
this.$store.commit('setBookshelfBookIds', itemIds)
|
||||
this.$store.commit('showEditModal', libraryItem)
|
||||
this.$store.commit('showEditModalOnTab', { libraryItem, tab: tab || 'details' })
|
||||
},
|
||||
selectItem(payload) {
|
||||
this.$emit('selectEntity', payload)
|
||||
|
||||
@@ -33,6 +33,7 @@ export default {
|
||||
return {
|
||||
socket: null,
|
||||
isSocketConnected: false,
|
||||
isSocketAuthenticated: false,
|
||||
isFirstSocketConnection: true,
|
||||
socketConnectionToastId: null,
|
||||
currentLang: null,
|
||||
@@ -81,9 +82,28 @@ export default {
|
||||
document.body.classList.add('app-bar')
|
||||
}
|
||||
},
|
||||
tokenRefreshed(newAccessToken) {
|
||||
if (this.isSocketConnected && !this.isSocketAuthenticated) {
|
||||
console.log('[SOCKET] Re-authenticating socket after token refresh')
|
||||
this.socket.emit('auth', newAccessToken)
|
||||
}
|
||||
},
|
||||
updateSocketConnectionToast(content, type, timeout) {
|
||||
if (this.socketConnectionToastId !== null && this.socketConnectionToastId !== undefined) {
|
||||
this.$toast.update(this.socketConnectionToastId, { content: content, options: { timeout: timeout, type: type, closeButton: false, position: 'bottom-center', onClose: () => null, closeOnClick: timeout !== null } }, false)
|
||||
const toastUpdateOptions = {
|
||||
content: content,
|
||||
options: {
|
||||
timeout: timeout,
|
||||
type: type,
|
||||
closeButton: false,
|
||||
position: 'bottom-center',
|
||||
onClose: () => {
|
||||
this.socketConnectionToastId = null
|
||||
},
|
||||
closeOnClick: timeout !== null
|
||||
}
|
||||
}
|
||||
this.$toast.update(this.socketConnectionToastId, toastUpdateOptions, false)
|
||||
} else {
|
||||
this.socketConnectionToastId = this.$toast[type](content, { position: 'bottom-center', timeout: timeout, closeButton: false, closeOnClick: timeout !== null })
|
||||
}
|
||||
@@ -109,7 +129,7 @@ export default {
|
||||
this.updateSocketConnectionToast(this.$strings.ToastSocketDisconnected, 'error', null)
|
||||
},
|
||||
reconnect() {
|
||||
console.error('[SOCKET] reconnected')
|
||||
console.log('[SOCKET] reconnected')
|
||||
},
|
||||
reconnectAttempt(val) {
|
||||
console.log(`[SOCKET] reconnect attempt ${val}`)
|
||||
@@ -120,6 +140,10 @@ export default {
|
||||
reconnectFailed() {
|
||||
console.error('[SOCKET] reconnect failed')
|
||||
},
|
||||
authFailed(payload) {
|
||||
console.error('[SOCKET] auth failed', payload.message)
|
||||
this.isSocketAuthenticated = false
|
||||
},
|
||||
init(payload) {
|
||||
console.log('Init Payload', payload)
|
||||
|
||||
@@ -127,7 +151,7 @@ export default {
|
||||
this.$store.commit('users/setUsersOnline', payload.usersOnline)
|
||||
}
|
||||
|
||||
this.$eventBus.$emit('socket_init')
|
||||
this.isSocketAuthenticated = true
|
||||
},
|
||||
streamOpen(stream) {
|
||||
if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamOpen(stream)
|
||||
@@ -175,7 +199,7 @@ export default {
|
||||
}
|
||||
} else {
|
||||
console.error('User has no more accessible libraries')
|
||||
this.$store.commit('libraries/setCurrentLibrary', null)
|
||||
this.$store.commit('libraries/setCurrentLibrary', { id: null })
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -347,13 +371,24 @@ export default {
|
||||
},
|
||||
customMetadataProviderAdded(provider) {
|
||||
if (!provider?.id) return
|
||||
this.$store.commit('scanners/addCustomMetadataProvider', provider)
|
||||
// Refresh providers cache
|
||||
this.$store.dispatch('scanners/refreshProviders')
|
||||
},
|
||||
customMetadataProviderRemoved(provider) {
|
||||
if (!provider?.id) return
|
||||
this.$store.commit('scanners/removeCustomMetadataProvider', provider)
|
||||
// Refresh providers cache
|
||||
this.$store.dispatch('scanners/refreshProviders')
|
||||
},
|
||||
initializeSocket() {
|
||||
if (this.$root.socket) {
|
||||
// Can happen in dev due to hot reload
|
||||
console.warn('Socket already initialized')
|
||||
this.socket = this.$root.socket
|
||||
this.isSocketConnected = this.$root.socket?.connected
|
||||
this.isFirstSocketConnection = false
|
||||
this.socketConnectionToastId = null
|
||||
return
|
||||
}
|
||||
this.socket = this.$nuxtSocket({
|
||||
name: process.env.NODE_ENV === 'development' ? 'dev' : 'prod',
|
||||
persist: 'main',
|
||||
@@ -364,6 +399,7 @@ export default {
|
||||
path: `${this.$config.routerBasePath}/socket.io`
|
||||
})
|
||||
this.$root.socket = this.socket
|
||||
this.isSocketAuthenticated = false
|
||||
console.log('Socket initialized')
|
||||
|
||||
// Pre-defined socket events
|
||||
@@ -377,6 +413,7 @@ export default {
|
||||
|
||||
// Event received after authorizing socket
|
||||
this.socket.on('init', this.init)
|
||||
this.socket.on('auth_failed', this.authFailed)
|
||||
|
||||
// Stream Listeners
|
||||
this.socket.on('stream_open', this.streamOpen)
|
||||
@@ -571,6 +608,7 @@ export default {
|
||||
this.updateBodyClass()
|
||||
this.resize()
|
||||
this.$eventBus.$on('change-lang', this.changeLanguage)
|
||||
this.$eventBus.$on('token_refreshed', this.tokenRefreshed)
|
||||
window.addEventListener('resize', this.resize)
|
||||
window.addEventListener('keydown', this.keyDown)
|
||||
|
||||
@@ -594,6 +632,7 @@ export default {
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.$eventBus.$off('change-lang', this.changeLanguage)
|
||||
this.$eventBus.$off('token_refreshed', this.tokenRefreshed)
|
||||
window.removeEventListener('resize', this.resize)
|
||||
window.removeEventListener('keydown', this.keyDown)
|
||||
}
|
||||
|
||||
@@ -118,8 +118,8 @@ export default {
|
||||
propsData: props,
|
||||
parent: this,
|
||||
created() {
|
||||
this.$on('edit', (entity) => {
|
||||
if (_this.editEntity) _this.editEntity(entity)
|
||||
this.$on('edit', (entity, tab) => {
|
||||
if (_this.editEntity) _this.editEntity(entity, tab)
|
||||
})
|
||||
this.$on('select', ({ entity, shiftKey }) => {
|
||||
if (_this.selectEntity) _this.selectEntity(entity, shiftKey)
|
||||
|
||||
@@ -73,7 +73,8 @@ module.exports = {
|
||||
|
||||
// Axios module configuration: https://go.nuxtjs.dev/config-axios
|
||||
axios: {
|
||||
baseURL: routerBasePath
|
||||
baseURL: routerBasePath,
|
||||
progress: false
|
||||
},
|
||||
|
||||
// nuxt/pwa https://pwa.nuxtjs.org
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.25.1",
|
||||
"version": "2.33.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.25.1",
|
||||
"version": "2.33.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@nuxtjs/axios": "^5.13.6",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "audiobookshelf-client",
|
||||
"version": "2.25.1",
|
||||
"version": "2.33.0",
|
||||
"buildNumber": 1,
|
||||
"description": "Self-hosted audiobook and podcast client",
|
||||
"main": "index.js",
|
||||
|
||||
+11
-10
@@ -182,18 +182,19 @@ export default {
|
||||
password: this.password,
|
||||
newPassword: this.newPassword
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.success) {
|
||||
this.$toast.success(this.$strings.ToastUserPasswordChangeSuccess)
|
||||
this.resetForm()
|
||||
} else {
|
||||
this.$toast.error(res.error || this.$strings.ToastUnknownError)
|
||||
}
|
||||
this.changingPassword = false
|
||||
.then(() => {
|
||||
this.$toast.success(this.$strings.ToastUserPasswordChangeSuccess)
|
||||
this.resetForm()
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error(error)
|
||||
this.$toast.error(this.$strings.ToastUnknownError)
|
||||
console.error('Failed to change password', error)
|
||||
let errorMessage = this.$strings.ToastUnknownError
|
||||
if (error.response?.data && typeof error.response.data === 'string') {
|
||||
errorMessage = error.response.data
|
||||
}
|
||||
this.$toast.error(errorMessage)
|
||||
})
|
||||
.finally(() => {
|
||||
this.changingPassword = false
|
||||
})
|
||||
},
|
||||
|
||||
@@ -12,24 +12,24 @@
|
||||
<p class="text-base font-mono ml-4 hidden md:block">{{ $secondsToTimestamp(mediaDurationRounded) }}</p>
|
||||
</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="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>
|
||||
<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" />
|
||||
<div class="w-32 hidden lg:block" />
|
||||
<div class="w-32 hidden min-[1120px]:block" />
|
||||
</div>
|
||||
<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="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>
|
||||
<div class="grow" />
|
||||
<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>
|
||||
<div class="w-32 hidden lg:block" />
|
||||
<div class="w-32 hidden min-[1120px]:block" />
|
||||
</div>
|
||||
|
||||
<div class="overflow-hidden">
|
||||
@@ -53,54 +53,104 @@
|
||||
|
||||
<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-24 min-w-24 md:w-32 md:min-w-32 px-2">{{ $strings.LabelStart }}</div>
|
||||
<div class="grow px-2">{{ $strings.LabelTitle }}</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-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>
|
||||
<template v-for="chapter in newChapters">
|
||||
<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-24 min-w-24 md:w-32 md:min-w-32 px-1">
|
||||
<ui-text-input v-if="showSecondInputs" v-model="chapter.start" type="number" class="text-xs" @change="checkChapters" />
|
||||
<ui-time-picker v-else class="text-xs" v-model="chapter.start" :show-three-digit-hour="mediaDuration >= 360000" @change="checkChapters" />
|
||||
</div>
|
||||
<div class="grow px-1">
|
||||
<ui-text-input v-model="chapter.title" @change="checkChapters" class="text-xs min-w-52" />
|
||||
</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">remove</span>
|
||||
</button>
|
||||
</ui-tooltip>
|
||||
<div v-for="chapter in newChapters" :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-38 min-w-38 md:w-40 md:min-w-40 px-1">
|
||||
<div class="flex items-center gap-1">
|
||||
<ui-tooltip :text="$strings.TooltipSubtractOneSecond" 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.id === 0 && chapter.start - timeIncrementAmount < 0 }"
|
||||
@click="incrementChapterTime(chapter, -timeIncrementAmount)"
|
||||
:disabled="chapter.id === 0 && chapter.start - timeIncrementAmount < 0"
|
||||
>
|
||||
<span class="material-symbols text-sm">remove</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</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="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 class="flex-1 min-w-0">
|
||||
<ui-text-input v-if="showSecondInputs" v-model="chapter.start" type="number" class="text-xs" @change="checkChapters" />
|
||||
<ui-time-picker v-else class="text-xs" v-model="chapter.start" :show-three-digit-hour="mediaDuration >= 360000" @change="checkChapters" />
|
||||
</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>
|
||||
</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 :disabled="!getAudioTrackForTime(chapter.start)" class="w-7 h-7 rounded-full flex items-center justify-center text-gray-300 hover:text-white transform hover:scale-110 duration-150 disabled:opacity-50 disabled:cursor-not-allowed" @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-xl">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" plaintext 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 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">
|
||||
<p class="text-lg font-semibold">{{ $strings.HeaderAudioTracks }}</p>
|
||||
<div class="grow" />
|
||||
@@ -110,23 +160,19 @@
|
||||
</ui-tooltip>
|
||||
</div>
|
||||
<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 hidden md:block text-center">{{ $strings.HeaderChapters }}</div>
|
||||
</div>
|
||||
<template v-for="track in audioTracks">
|
||||
<div :key="track.ino" class="flex items-center py-2" :class="currentTrackIndex === track.index && isPlayingChapter ? 'bg-success/10' : ''">
|
||||
<div class="grow max-w-[calc(100%-80px)] pr-2">
|
||||
<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 v-for="track in audioTracks" :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">
|
||||
<p class="text-xs truncate">{{ track.metadata.filename }}</p>
|
||||
</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>
|
||||
|
||||
@@ -134,6 +180,7 @@
|
||||
<ui-loading-indicator />
|
||||
</div>
|
||||
|
||||
<!-- audible chapter lookup modal -->
|
||||
<modals-modal v-model="showFindChaptersModal" name="edit-book" :width="500" :processing="findingChapters">
|
||||
<template #outer>
|
||||
<div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden pointer-events-none">
|
||||
@@ -159,12 +206,16 @@
|
||||
</div>
|
||||
</div>
|
||||
<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>
|
||||
{{ $strings.LabelDurationFound }} <span class="font-semibold">{{ $secondsToTimestamp(chapterData.runtimeLengthSec) }}</span
|
||||
><br />
|
||||
{{ $strings.LabelDurationFound }} <span class="font-semibold">{{ $secondsToTimestamp(chapterData.runtimeLengthSec) }}</span>
|
||||
<br />
|
||||
<span class="font-semibold" :class="{ 'text-warning': chapters.length !== chapterData.chapters.length }">{{ chapterData.chapters.length }}</span> {{ $strings.LabelChaptersFound }}
|
||||
</p>
|
||||
<div class="grow" />
|
||||
<p>
|
||||
{{ $strings.LabelYourAudiobookDuration }}: <span class="font-semibold">{{ $secondsToTimestamp(mediaDurationRounded) }}</span
|
||||
><br />
|
||||
@@ -198,17 +249,49 @@
|
||||
<p class="pl-2">{{ $strings.MessageChapterStartIsAfter }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center pt-2">
|
||||
<ui-btn small color="bg-primary" class="mr-1" @click="applyChapterNamesOnly">{{ $strings.ButtonMapChapterTitles }}</ui-btn>
|
||||
<ui-tooltip :text="$strings.MessageMapChapterTitles" direction="top" class="flex items-center">
|
||||
<span class="material-symbols text-xl text-gray-200">info</span>
|
||||
</ui-tooltip>
|
||||
<div class="grow" />
|
||||
<div class="flex items-center pt-2 justify-between">
|
||||
<div class="flex items-center gap-2">
|
||||
<ui-btn small color="bg-primary" @click="applyChapterNamesOnly">{{ $strings.ButtonMapChapterTitles }}</ui-btn>
|
||||
<ui-tooltip :text="$strings.MessageMapChapterTitles" direction="top" class="flex items-center">
|
||||
<span class="material-symbols text-xl text-gray-200">info</span>
|
||||
</ui-tooltip>
|
||||
</div>
|
||||
<ui-btn small color="bg-success" @click="applyChapterData">{{ $strings.ButtonApplyChapters }}</ui-btn>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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>
|
||||
</template>
|
||||
|
||||
@@ -265,7 +348,17 @@ export default {
|
||||
removeBranding: false,
|
||||
showSecondInputs: false,
|
||||
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: {
|
||||
@@ -304,9 +397,18 @@ export default {
|
||||
},
|
||||
selectedChapterId() {
|
||||
return this.selectedChapter ? this.selectedChapter.id : null
|
||||
},
|
||||
allChaptersLocked() {
|
||||
return this.newChapters.length > 0 && this.newChapters.every((chapter) => this.lockedChapters.has(chapter.id))
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
formatNumberWithPadding(number, pattern) {
|
||||
if (!pattern || !pattern.hasLeadingZeros || !pattern.originalPadding) {
|
||||
return number.toString()
|
||||
}
|
||||
return number.toString().padStart(pattern.originalPadding, '0')
|
||||
},
|
||||
setChaptersFromTracks() {
|
||||
let currentStartTime = 0
|
||||
let index = 0
|
||||
@@ -321,7 +423,7 @@ export default {
|
||||
currentStartTime += track.duration
|
||||
}
|
||||
this.newChapters = chapters
|
||||
|
||||
this.lockedChapters = new Set()
|
||||
this.checkChapters()
|
||||
},
|
||||
toggleRemoveBranding() {
|
||||
@@ -334,19 +436,22 @@ export default {
|
||||
|
||||
const amount = Number(this.shiftAmount)
|
||||
|
||||
const lastChapter = this.newChapters[this.newChapters.length - 1]
|
||||
if (lastChapter.start + amount > this.mediaDurationRounded) {
|
||||
this.$toast.error(this.$strings.ToastChaptersInvalidShiftAmountLast)
|
||||
return
|
||||
}
|
||||
// Check if any unlocked chapters would be affected negatively
|
||||
const unlockedChapters = this.newChapters.filter((chap) => !this.lockedChapters.has(chap.id))
|
||||
|
||||
if (this.newChapters[1].start + amount <= 0) {
|
||||
this.$toast.error(this.$strings.ToastChaptersInvalidShiftAmountStart)
|
||||
if (unlockedChapters.length === 0) {
|
||||
this.$toast.warning(this.$strings.ToastChaptersAllLocked)
|
||||
return
|
||||
}
|
||||
|
||||
for (let i = 0; i < this.newChapters.length; 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)
|
||||
if (i > 0) {
|
||||
chap.start = Math.max(0, chap.start + amount)
|
||||
@@ -354,6 +459,83 @@ export default {
|
||||
}
|
||||
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() {
|
||||
this.$store.commit('showEditModal', this.libraryItem)
|
||||
},
|
||||
@@ -368,6 +550,10 @@ export default {
|
||||
this.checkChapters()
|
||||
},
|
||||
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.checkChapters()
|
||||
},
|
||||
@@ -408,6 +594,14 @@ export default {
|
||||
|
||||
this.hasChanges = hasChanges
|
||||
},
|
||||
getAudioTrackForTime(time) {
|
||||
if (typeof time !== 'number') {
|
||||
return null
|
||||
}
|
||||
return this.tracks.find((at) => {
|
||||
return time >= at.startOffset && time < at.startOffset + at.duration
|
||||
})
|
||||
},
|
||||
playChapter(chapter) {
|
||||
console.log('Play Chapter', chapter.id)
|
||||
if (this.selectedChapterId === chapter.id) {
|
||||
@@ -422,9 +616,12 @@ export default {
|
||||
this.destroyAudioEl()
|
||||
}
|
||||
|
||||
const audioTrack = this.tracks.find((at) => {
|
||||
return chapter.start >= at.startOffset && chapter.start < at.startOffset + at.duration
|
||||
})
|
||||
const audioTrack = this.getAudioTrackForTime(chapter.start)
|
||||
if (!audioTrack) {
|
||||
console.error('No audio track found for chapter', chapter)
|
||||
return
|
||||
}
|
||||
|
||||
this.selectedChapter = chapter
|
||||
this.isLoadingChapter = true
|
||||
|
||||
@@ -451,6 +648,7 @@ export default {
|
||||
console.log('Audio playing')
|
||||
this.isLoadingChapter = false
|
||||
this.isPlayingChapter = true
|
||||
this.startElapsedTimeTracking()
|
||||
})
|
||||
audioEl.addEventListener('ended', () => {
|
||||
console.log('Audio ended')
|
||||
@@ -473,6 +671,10 @@ export default {
|
||||
this.selectedChapter = null
|
||||
this.isPlayingChapter = false
|
||||
this.isLoadingChapter = false
|
||||
this.stopElapsedTimeTracking()
|
||||
},
|
||||
resetChapterLookupData() {
|
||||
this.chapterData = null
|
||||
},
|
||||
saveChapters() {
|
||||
this.checkChapters()
|
||||
@@ -506,11 +708,7 @@ export default {
|
||||
this.saving = false
|
||||
if (data.updated) {
|
||||
this.$toast.success(this.$strings.ToastChaptersUpdated)
|
||||
if (this.previousRoute) {
|
||||
this.$router.push(this.previousRoute)
|
||||
} else {
|
||||
this.$router.push(`/item/${this.libraryItem.id}`)
|
||||
}
|
||||
this.reloadLibraryItem()
|
||||
} else {
|
||||
this.$toast.info(this.$strings.MessageNoUpdatesWereNecessary)
|
||||
}
|
||||
@@ -523,7 +721,7 @@ export default {
|
||||
},
|
||||
applyChapterNamesOnly() {
|
||||
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
|
||||
}
|
||||
})
|
||||
@@ -535,7 +733,7 @@ export default {
|
||||
},
|
||||
applyChapterData() {
|
||||
let index = 0
|
||||
this.newChapters = this.chapterData.chapters
|
||||
const audibleChapters = this.chapterData.chapters
|
||||
.filter((chap) => chap.startOffsetSec < this.mediaDuration)
|
||||
.map((chap) => {
|
||||
return {
|
||||
@@ -545,6 +743,21 @@ export default {
|
||||
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.chapterData = null
|
||||
|
||||
@@ -572,7 +785,7 @@ export default {
|
||||
if (data.error) {
|
||||
this.asinError = this.$getString(data.stringKey)
|
||||
} else {
|
||||
console.log('Chapter data', data)
|
||||
console.log('Chapter data', { ...data })
|
||||
this.chapterData = this.removeBranding ? this.removeBrandingFromData(data) : data
|
||||
}
|
||||
})
|
||||
@@ -609,6 +822,11 @@ export default {
|
||||
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
|
||||
} catch {
|
||||
return data
|
||||
@@ -638,6 +856,7 @@ export default {
|
||||
}
|
||||
]
|
||||
}
|
||||
this.lockedChapters = new Set()
|
||||
this.checkChapters()
|
||||
},
|
||||
removeAllChaptersClick() {
|
||||
@@ -662,11 +881,7 @@ export default {
|
||||
.then((data) => {
|
||||
if (data.updated) {
|
||||
this.$toast.success(this.$strings.ToastChaptersRemoved)
|
||||
if (this.previousRoute) {
|
||||
this.$router.push(this.previousRoute)
|
||||
} else {
|
||||
this.$router.push(`/item/${this.libraryItem.id}`)
|
||||
}
|
||||
this.reloadLibraryItem()
|
||||
} else {
|
||||
this.$toast.info(this.$strings.MessageNoUpdatesWereNecessary)
|
||||
}
|
||||
@@ -679,6 +894,91 @@ export default {
|
||||
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) {
|
||||
if (libraryItem.id === this.libraryItem.id) {
|
||||
if (!!libraryItem.media.metadata.asin && this.mediaMetadata.asin !== libraryItem.media.metadata.asin) {
|
||||
@@ -686,6 +986,18 @@ export default {
|
||||
}
|
||||
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() {
|
||||
|
||||
@@ -53,6 +53,7 @@ export default {
|
||||
else if (pageName === 'sessions') return this.$strings.HeaderListeningSessions
|
||||
else if (pageName === 'stats') return this.$strings.HeaderYourStats
|
||||
else if (pageName === 'users') return this.$strings.HeaderUsers
|
||||
else if (pageName === 'api-keys') return this.$strings.HeaderApiKeys
|
||||
else if (pageName === 'item-metadata-utils') return this.$strings.HeaderItemMetadataUtils
|
||||
else if (pageName === 'rss-feeds') return this.$strings.HeaderRSSFeeds
|
||||
else if (pageName === 'email') return this.$strings.HeaderEmail
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
<template>
|
||||
<div>
|
||||
<app-settings-content :header-text="$strings.HeaderApiKeys">
|
||||
<template #header-items>
|
||||
<div v-if="numApiKeys" class="mx-2 px-1.5 rounded-lg bg-primary/50 text-gray-300/90 text-sm inline-flex items-center justify-center">
|
||||
<span>{{ numApiKeys }}</span>
|
||||
</div>
|
||||
|
||||
<ui-tooltip :text="$strings.LabelClickForMoreInfo" class="inline-flex ml-2">
|
||||
<a href="https://www.audiobookshelf.org/guides/api-keys" target="_blank" class="inline-flex">
|
||||
<span class="material-symbols text-xl w-5 text-gray-200">help_outline</span>
|
||||
</a>
|
||||
</ui-tooltip>
|
||||
|
||||
<div class="grow" />
|
||||
|
||||
<ui-btn color="bg-primary" :disabled="loadingUsers || users.length === 0" small @click="setShowApiKeyModal()">{{ $strings.ButtonAddApiKey }}</ui-btn>
|
||||
</template>
|
||||
|
||||
<tables-api-keys-table ref="apiKeysTable" class="pt-2" @edit="setShowApiKeyModal" @numApiKeys="(count) => (numApiKeys = count)" />
|
||||
</app-settings-content>
|
||||
<modals-api-key-modal ref="apiKeyModal" v-model="showApiKeyModal" :api-key="selectedApiKey" :users="users" @created="apiKeyCreated" @updated="apiKeyUpdated" />
|
||||
<modals-api-key-created-modal ref="apiKeyCreatedModal" v-model="showApiKeyCreatedModal" :api-key="selectedApiKey" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
asyncData({ store, redirect }) {
|
||||
if (!store.getters['user/getIsAdminOrUp']) {
|
||||
redirect('/')
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loadingUsers: false,
|
||||
selectedApiKey: null,
|
||||
showApiKeyModal: false,
|
||||
showApiKeyCreatedModal: false,
|
||||
numApiKeys: 0,
|
||||
users: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
apiKeyCreated(apiKey) {
|
||||
this.numApiKeys++
|
||||
this.selectedApiKey = apiKey
|
||||
this.showApiKeyCreatedModal = true
|
||||
if (this.$refs.apiKeysTable) {
|
||||
this.$refs.apiKeysTable.addApiKey(apiKey)
|
||||
}
|
||||
},
|
||||
apiKeyUpdated(apiKey) {
|
||||
if (this.$refs.apiKeysTable) {
|
||||
this.$refs.apiKeysTable.updateApiKey(apiKey)
|
||||
}
|
||||
},
|
||||
setShowApiKeyModal(selectedApiKey) {
|
||||
this.selectedApiKey = selectedApiKey
|
||||
this.showApiKeyModal = true
|
||||
},
|
||||
loadUsers() {
|
||||
this.loadingUsers = true
|
||||
this.$axios
|
||||
.$get('/api/users')
|
||||
.then((res) => {
|
||||
this.users = res.users.sort((a, b) => {
|
||||
return a.createdAt - b.createdAt
|
||||
})
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed', error)
|
||||
})
|
||||
.finally(() => {
|
||||
this.loadingUsers = false
|
||||
})
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadUsers()
|
||||
},
|
||||
beforeDestroy() {}
|
||||
}
|
||||
</script>
|
||||
@@ -131,35 +131,26 @@
|
||||
</div>
|
||||
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
|
||||
<!-- old experimental features -->
|
||||
<!-- <div class="pt-4">
|
||||
<h2 class="font-semibold">{{ $strings.HeaderSettingsExperimental }}</h2>
|
||||
<div class="pt-4">
|
||||
<h2 class="font-semibold">{{ $strings.HeaderSettingsSecurity }}</h2>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center py-2">
|
||||
<ui-toggle-switch labeledBy="settings-experimental-features" v-model="showExperimentalFeatures" />
|
||||
<ui-tooltip :text="$strings.LabelSettingsExperimentalFeaturesHelp">
|
||||
<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 class="py-2">
|
||||
<ui-multi-select v-model="newServerSettings.allowedOrigins" :items="newServerSettings.allowedOrigins" :label="$strings.LabelCorsAllowed" class="max-w-72" @input="updateCorsOrigins" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</app-settings-content>
|
||||
@@ -256,7 +247,8 @@ export default {
|
||||
return this.$store.state.serverSettings
|
||||
},
|
||||
providers() {
|
||||
return this.$store.state.scanners.providers
|
||||
// Use book cover providers for the cover provider dropdown
|
||||
return this.$store.state.scanners.bookCoverProviders || []
|
||||
},
|
||||
dateFormats() {
|
||||
return this.$store.state.globals.dateFormats
|
||||
@@ -323,6 +315,27 @@ export default {
|
||||
updateServerLanguage(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) {
|
||||
if (key === 'scannerDisableWatcher') {
|
||||
this.newServerSettings.scannerDisableWatcher = val
|
||||
@@ -352,6 +365,7 @@ export default {
|
||||
initServerSettings() {
|
||||
this.newServerSettings = this.serverSettings ? { ...this.serverSettings } : {}
|
||||
this.newServerSettings.sortingPrefixes = [...(this.newServerSettings.sortingPrefixes || [])]
|
||||
this.newServerSettings.allowedOrigins = [...(this.newServerSettings.allowedOrigins || [])]
|
||||
this.scannerEnableWatcher = !this.newServerSettings.scannerDisableWatcher
|
||||
|
||||
this.homepageUseBookshelfView = this.newServerSettings.homeBookshelfView != this.$constants.BookshelfView.DETAIL
|
||||
@@ -403,6 +417,8 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.initServerSettings()
|
||||
// Fetch providers if not already loaded (for cover provider dropdown)
|
||||
this.$store.dispatch('scanners/fetchProviders')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -6,80 +6,86 @@
|
||||
</div>
|
||||
|
||||
<div v-if="listeningSessions.length" class="block max-w-full relative">
|
||||
<table class="userSessionsTable">
|
||||
<tr class="bg-primary/40">
|
||||
<th class="w-6 min-w-6 text-left hidden md:table-cell h-11">
|
||||
<ui-checkbox v-model="isAllSelected" :partial="numSelected > 0 && !isAllSelected" small checkbox-bg="bg" />
|
||||
</th>
|
||||
<th v-if="numSelected" class="grow text-left" :colspan="7">
|
||||
<div class="flex items-center">
|
||||
<p>{{ $getString('MessageSelected', [numSelected]) }}</p>
|
||||
<div class="grow" />
|
||||
<ui-btn small color="bg-error" :loading="deletingSessions" @click.stop="removeSessionsClick">{{ $strings.ButtonRemove }}</ui-btn>
|
||||
</div>
|
||||
</th>
|
||||
<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')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="w-20 min-w-20 text-left hidden md:table-cell">{{ $strings.LabelUser }}</th>
|
||||
<th v-if="!numSelected" class="w-26 min-w-26 text-left hidden md:table-cell group cursor-pointer" @click.stop="sortColumn('playMethod')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</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')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="w-24 min-w-24 group cursor-pointer" @click.stop="sortColumn('currentTime')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="grow hidden sm:table-cell cursor-pointer group" @click.stop="sortColumn('updatedAt')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
</tr>
|
||||
<div class="overflow-x-auto">
|
||||
<table class="userSessionsTable">
|
||||
<tr class="bg-primary/40">
|
||||
<th class="w-6 min-w-6 text-left hidden md:table-cell h-11">
|
||||
<ui-checkbox v-model="isAllSelected" :partial="numSelected > 0 && !isAllSelected" small checkbox-bg="bg" />
|
||||
</th>
|
||||
<th v-if="numSelected" class="grow text-left" :colspan="7">
|
||||
<div class="flex items-center">
|
||||
<p>{{ $getString('MessageSelected', [numSelected]) }}</p>
|
||||
<div class="grow" />
|
||||
<ui-btn small color="bg-error" :loading="deletingSessions" @click.stop="removeSessionsClick">{{ $strings.ButtonRemove }}</ui-btn>
|
||||
</div>
|
||||
</th>
|
||||
<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')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="w-20 min-w-20 text-left hidden md:table-cell">{{ $strings.LabelUser }}</th>
|
||||
<th v-if="!numSelected" class="w-26 min-w-26 text-left hidden md:table-cell group cursor-pointer" @click.stop="sortColumn('playMethod')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</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')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="w-24 min-w-24 group cursor-pointer" @click.stop="sortColumn('currentTime')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
<th v-if="!numSelected" class="grow hidden sm:table-cell cursor-pointer group" @click.stop="sortColumn('updatedAt')">
|
||||
<div class="inline-flex items-center">
|
||||
{{ $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>
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
<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">
|
||||
<ui-checkbox v-model="session.selected" small checkbox-bg="bg" />
|
||||
<!-- 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" />
|
||||
</td>
|
||||
<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-400 truncate">{{ session.displayAuthor }}</p>
|
||||
</td>
|
||||
<td class="hidden md:table-cell w-20 min-w-20">
|
||||
<p v-if="filteredUserUsername" class="text-xs">{{ filteredUserUsername }}</p>
|
||||
<p v-else class="text-xs">{{ session.user ? session.user.username : 'N/A' }}</p>
|
||||
</td>
|
||||
<td class="hidden md:table-cell w-26 min-w-26">
|
||||
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
|
||||
</td>
|
||||
<td class="hidden sm:table-cell max-w-32 min-w-32">
|
||||
<p class="text-xs truncate" v-html="getDeviceInfoString(session.deviceInfo)" />
|
||||
</td>
|
||||
<td class="text-center w-24 min-w-24 sm:w-32 sm:min-w-32">
|
||||
<p class="text-xs font-mono">{{ $elapsedPretty(session.timeListening) }}</p>
|
||||
</td>
|
||||
<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>
|
||||
</td>
|
||||
<td class="text-center hidden sm:table-cell">
|
||||
<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>
|
||||
</ui-tooltip>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<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">
|
||||
<ui-checkbox v-model="session.selected" small checkbox-bg="bg" />
|
||||
<!-- 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" />
|
||||
</td>
|
||||
<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-400 truncate">{{ session.displayAuthor }}</p>
|
||||
</td>
|
||||
<td class="hidden md:table-cell w-20 min-w-20">
|
||||
<p v-if="filteredUserUsername" class="text-xs">{{ filteredUserUsername }}</p>
|
||||
<p v-else class="text-xs">{{ session.user ? session.user.username : 'N/A' }}</p>
|
||||
</td>
|
||||
<td class="hidden md:table-cell w-26 min-w-26">
|
||||
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
|
||||
</td>
|
||||
<td class="hidden sm:table-cell max-w-32 min-w-32">
|
||||
<p class="text-xs truncate">
|
||||
<template v-for="(line, index) in getDeviceInfoLines(session.deviceInfo)">
|
||||
<br v-if="index > 0" :key="'br-' + index" />{{ line }}
|
||||
</template>
|
||||
</p>
|
||||
</td>
|
||||
<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>
|
||||
</td>
|
||||
<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>
|
||||
</td>
|
||||
<td class="text-center hidden sm:table-cell">
|
||||
<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>
|
||||
</ui-tooltip>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<!-- table bottom options -->
|
||||
<div class="flex items-center my-2">
|
||||
<div class="grow" />
|
||||
@@ -128,7 +134,11 @@
|
||||
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
|
||||
</td>
|
||||
<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">
|
||||
<template v-for="(line, index) in getDeviceInfoLines(session.deviceInfo)">
|
||||
<br v-if="index > 0" :key="'br-' + index" />{{ line }}
|
||||
</template>
|
||||
</p>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<p class="text-xs font-mono">{{ $elapsedPretty(session.timeListening) }}</p>
|
||||
@@ -170,7 +180,11 @@
|
||||
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
|
||||
</td>
|
||||
<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">
|
||||
<template v-for="(line, index) in getDeviceInfoLines(session.deviceInfo)">
|
||||
<br v-if="index > 0" :key="'br-' + index" />{{ line }}
|
||||
</template>
|
||||
</p>
|
||||
</td>
|
||||
<td class="text-center hover:underline" @click.stop="clickCurrentTime(session)">
|
||||
<p class="text-xs font-mono">{{ $secondsToTimestamp(session.currentTime) }}</p>
|
||||
@@ -431,16 +445,16 @@ export default {
|
||||
this.selectedSession = session
|
||||
this.showSessionModal = true
|
||||
},
|
||||
getDeviceInfoString(deviceInfo) {
|
||||
if (!deviceInfo) return ''
|
||||
var lines = []
|
||||
getDeviceInfoLines(deviceInfo) {
|
||||
if (!deviceInfo) return []
|
||||
const lines = []
|
||||
if (deviceInfo.clientName) lines.push(`${deviceInfo.clientName} ${deviceInfo.clientVersion || ''}`)
|
||||
if (deviceInfo.osName) lines.push(`${deviceInfo.osName} ${deviceInfo.osVersion}`)
|
||||
if (deviceInfo.browserName) lines.push(deviceInfo.browserName)
|
||||
|
||||
if (deviceInfo.manufacturer && deviceInfo.model) lines.push(`${deviceInfo.manufacturer} ${deviceInfo.model}`)
|
||||
if (deviceInfo.sdkVersion) lines.push(`SDK Version: ${deviceInfo.sdkVersion}`)
|
||||
return lines.join('<br>')
|
||||
return lines
|
||||
},
|
||||
getPlayMethodName(playMethod) {
|
||||
if (playMethod === this.$constants.PlayMethod.DIRECTPLAY) return 'Direct Play'
|
||||
|
||||
@@ -13,8 +13,10 @@
|
||||
<widgets-online-indicator :value="!!userOnline" />
|
||||
<h1 class="text-xl pl-2">{{ username }}</h1>
|
||||
</div>
|
||||
<div v-if="userToken" class="flex text-xs mt-4">
|
||||
<ui-text-input-with-label :label="$strings.LabelApiToken" :value="userToken" readonly show-copy />
|
||||
<div v-if="legacyToken" class="text-xs space-y-2 mt-4">
|
||||
<ui-text-input-with-label label="Legacy API Token" :value="legacyToken" readonly show-copy />
|
||||
|
||||
<p class="text-warning" v-html="$strings.MessageAuthenticationLegacyTokenWarning" />
|
||||
</div>
|
||||
<div class="w-full h-px bg-white/10 my-2" />
|
||||
<div class="py-2">
|
||||
@@ -100,9 +102,12 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
userToken() {
|
||||
legacyToken() {
|
||||
return this.user.token
|
||||
},
|
||||
userToken() {
|
||||
return this.user.accessToken
|
||||
},
|
||||
bookCoverAspectRatio() {
|
||||
return this.$store.getters['libraries/getBookCoverAspectRatio']
|
||||
},
|
||||
|
||||
@@ -19,39 +19,45 @@
|
||||
<div class="py-2">
|
||||
<h1 class="text-lg mb-2 text-white/90 px-2 sm:px-0">{{ $strings.HeaderListeningSessions }}</h1>
|
||||
<div v-if="listeningSessions.length">
|
||||
<table class="userSessionsTable">
|
||||
<tr class="bg-primary/40">
|
||||
<th class="w-48 min-w-48 text-left">{{ $strings.LabelItem }}</th>
|
||||
<th class="w-32 min-w-32 text-left hidden md:table-cell">{{ $strings.LabelPlayMethod }}</th>
|
||||
<th class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</th>
|
||||
<th class="w-32 min-w-32">{{ $strings.LabelTimeListened }}</th>
|
||||
<th class="w-16 min-w-16">{{ $strings.LabelLastTime }}</th>
|
||||
<th class="grow hidden sm:table-cell">{{ $strings.LabelLastUpdate }}</th>
|
||||
</tr>
|
||||
<tr v-for="session in listeningSessions" :key="session.id" class="cursor-pointer" @click="showSession(session)">
|
||||
<td class="py-1 max-w-48">
|
||||
<p class="text-xs text-gray-200 truncate">{{ session.displayTitle }}</p>
|
||||
<p class="text-xs text-gray-400 truncate">{{ session.displayAuthor }}</p>
|
||||
<div class="overflow-x-auto">
|
||||
<table class="userSessionsTable">
|
||||
<tr class="bg-primary/40">
|
||||
<th class="w-48 min-w-48 text-left">{{ $strings.LabelItem }}</th>
|
||||
<th class="w-32 min-w-32 text-left hidden md:table-cell">{{ $strings.LabelPlayMethod }}</th>
|
||||
<th class="w-32 min-w-32 text-left hidden sm:table-cell">{{ $strings.LabelDeviceInfo }}</th>
|
||||
<th class="w-32 min-w-32">{{ $strings.LabelTimeListened }}</th>
|
||||
<th class="w-16 min-w-16">{{ $strings.LabelLastTime }}</th>
|
||||
<th class="grow hidden sm:table-cell">{{ $strings.LabelLastUpdate }}</th>
|
||||
</tr>
|
||||
<tr v-for="session in listeningSessions" :key="session.id" class="cursor-pointer" @click="showSession(session)">
|
||||
<td class="py-1 max-w-48">
|
||||
<p class="text-xs text-gray-200 truncate">{{ session.displayTitle }}</p>
|
||||
<p class="text-xs text-gray-400 truncate">{{ session.displayAuthor }}</p>
|
||||
</td>
|
||||
<td class="hidden md:table-cell">
|
||||
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
|
||||
</td>
|
||||
<td class="hidden sm:table-cell min-w-32 max-w-32">
|
||||
<p class="text-xs truncate">
|
||||
<template v-for="(line, index) in getDeviceInfoLines(session.deviceInfo)">
|
||||
<br v-if="index > 0" :key="'br-' + index" />{{ line }}
|
||||
</template>
|
||||
</p>
|
||||
</td>
|
||||
<td class="hidden md:table-cell">
|
||||
<p class="text-xs">{{ getPlayMethodName(session.playMethod) }}</p>
|
||||
</td>
|
||||
<td class="hidden sm:table-cell min-w-32 max-w-32">
|
||||
<p class="text-xs truncate" v-html="getDeviceInfoString(session.deviceInfo)" />
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<p class="text-xs font-mono">{{ $elapsedPretty(session.timeListening) }}</p>
|
||||
</td>
|
||||
<td class="text-center hover:underline" @click.stop="clickCurrentTime(session)">
|
||||
<p class="text-xs font-mono">{{ $secondsToTimestamp(session.currentTime) }}</p>
|
||||
</td>
|
||||
<td class="text-center hidden sm:table-cell">
|
||||
<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>
|
||||
</ui-tooltip>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<td class="text-center">
|
||||
<p class="text-xs font-mono">{{ $elapsedPrettyLocalized(session.timeListening) }}</p>
|
||||
</td>
|
||||
<td class="text-center hover:underline" @click.stop="clickCurrentTime(session)">
|
||||
<p class="text-xs font-mono">{{ $secondsToTimestamp(session.currentTime) }}</p>
|
||||
</td>
|
||||
<td class="text-center hidden sm:table-cell">
|
||||
<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>
|
||||
</ui-tooltip>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<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" />
|
||||
<p class="text-sm mx-1">{{ $getString('LabelPaginationPageXOfY', [currentPage + 1, numPages]) }}</p>
|
||||
@@ -191,16 +197,16 @@ export default {
|
||||
this.selectedSession = session
|
||||
this.showSessionModal = true
|
||||
},
|
||||
getDeviceInfoString(deviceInfo) {
|
||||
if (!deviceInfo) return ''
|
||||
var lines = []
|
||||
getDeviceInfoLines(deviceInfo) {
|
||||
if (!deviceInfo) return []
|
||||
const lines = []
|
||||
if (deviceInfo.clientName) lines.push(`${deviceInfo.clientName} ${deviceInfo.clientVersion || ''}`)
|
||||
if (deviceInfo.osName) lines.push(`${deviceInfo.osName} ${deviceInfo.osVersion}`)
|
||||
if (deviceInfo.browserName) lines.push(deviceInfo.browserName)
|
||||
|
||||
if (deviceInfo.manufacturer && deviceInfo.model) lines.push(`${deviceInfo.manufacturer} ${deviceInfo.model}`)
|
||||
if (deviceInfo.sdkVersion) lines.push(`SDK Version: ${deviceInfo.sdkVersion}`)
|
||||
return lines.join('<br>')
|
||||
return lines
|
||||
},
|
||||
getPlayMethodName(playMethod) {
|
||||
if (playMethod === this.$constants.PlayMethod.DIRECTPLAY) return 'Direct Play'
|
||||
|
||||
+40
-8
@@ -40,6 +40,15 @@
|
||||
|
||||
<p v-if="error" class="text-error text-center py-2">{{ error }}</p>
|
||||
|
||||
<div v-if="showNewAuthSystemMessage" class="mb-4">
|
||||
<widgets-alert type="warning">
|
||||
<div>
|
||||
<p>{{ $strings.MessageAuthenticationSecurityMessage }}</p>
|
||||
<a v-if="showNewAuthSystemAdminMessage" href="https://github.com/advplyr/audiobookshelf/discussions/4460" target="_blank" class="underline">{{ $strings.LabelMoreInfo }}</a>
|
||||
</div>
|
||||
</widgets-alert>
|
||||
</div>
|
||||
|
||||
<form v-show="login_local" @submit.prevent="submitForm">
|
||||
<label class="text-xs text-gray-300 uppercase">{{ $strings.LabelUsername }}</label>
|
||||
<ui-text-input v-model.trim="username" :disabled="processing" class="mb-3 w-full" inputName="username" />
|
||||
@@ -85,7 +94,10 @@ export default {
|
||||
MetadataPath: '',
|
||||
login_local: true,
|
||||
login_openid: false,
|
||||
authFormData: null
|
||||
authFormData: null,
|
||||
// New JWT auth system re-login flags
|
||||
showNewAuthSystemMessage: false,
|
||||
showNewAuthSystemAdminMessage: false
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@@ -177,13 +189,20 @@ export default {
|
||||
require('@/plugins/chromecast.js').default(this)
|
||||
}
|
||||
|
||||
this.$store.commit('libraries/setCurrentLibrary', userDefaultLibraryId)
|
||||
this.$store.commit('libraries/setLastLoad', 0) // Ensure libraries get loaded again when switching users
|
||||
this.$store.commit('libraries/setCurrentLibrary', { id: userDefaultLibraryId })
|
||||
this.$store.commit('user/setUser', user)
|
||||
// Access token only returned from login, not authorize
|
||||
if (user.accessToken) {
|
||||
this.$store.commit('user/setAccessToken', user.accessToken)
|
||||
}
|
||||
|
||||
this.$store.dispatch('user/loadUserSettings')
|
||||
},
|
||||
async submitForm() {
|
||||
this.error = null
|
||||
this.showNewAuthSystemMessage = false
|
||||
this.showNewAuthSystemAdminMessage = false
|
||||
this.processing = true
|
||||
|
||||
const payload = {
|
||||
@@ -210,6 +229,8 @@ export default {
|
||||
|
||||
this.processing = true
|
||||
|
||||
this.$store.commit('user/setAccessToken', token)
|
||||
|
||||
return this.$axios
|
||||
.$post('/api/authorize', null, {
|
||||
headers: {
|
||||
@@ -217,15 +238,25 @@ export default {
|
||||
}
|
||||
})
|
||||
.then((res) => {
|
||||
// Force re-login if user is using an old token with no expiration
|
||||
if (res.user.isOldToken) {
|
||||
this.username = res.user.username
|
||||
this.showNewAuthSystemMessage = true
|
||||
// Admin user sees link to github discussion
|
||||
this.showNewAuthSystemAdminMessage = res.user.type === 'admin' || res.user.type === 'root'
|
||||
return false
|
||||
}
|
||||
|
||||
this.setUser(res)
|
||||
this.processing = false
|
||||
return true
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Authorize error', error)
|
||||
this.processing = false
|
||||
return false
|
||||
})
|
||||
.finally(() => {
|
||||
this.processing = false
|
||||
})
|
||||
},
|
||||
checkStatus() {
|
||||
this.processing = true
|
||||
@@ -268,8 +299,8 @@ export default {
|
||||
}
|
||||
|
||||
if (authMethods.includes('openid')) {
|
||||
// Auto redirect unless query string ?autoLaunch=0
|
||||
if (this.authFormData?.authOpenIDAutoLaunch && this.$route.query?.autoLaunch !== '0') {
|
||||
// Auto redirect unless query string ?autoLaunch=0 OR when explicity requested through ?autoLaunch=1
|
||||
if ((this.authFormData?.authOpenIDAutoLaunch && this.$route.query?.autoLaunch !== '0') || this.$route.query?.autoLaunch == '1') {
|
||||
window.location.href = this.openidAuthUri
|
||||
}
|
||||
|
||||
@@ -280,8 +311,9 @@ export default {
|
||||
}
|
||||
},
|
||||
async mounted() {
|
||||
if (this.$route.query?.setToken) {
|
||||
localStorage.setItem('token', this.$route.query.setToken)
|
||||
// Token passed as query parameter after successful oidc login
|
||||
if (this.$route.query?.accessToken) {
|
||||
localStorage.setItem('token', this.$route.query.accessToken)
|
||||
}
|
||||
if (localStorage.getItem('token')) {
|
||||
if (await this.checkAuth()) return // if valid user no need to check status
|
||||
|
||||
@@ -155,7 +155,7 @@ export default {
|
||||
},
|
||||
providers() {
|
||||
if (this.selectedLibraryIsPodcast) return this.$store.state.scanners.podcastProviders
|
||||
return this.$store.state.scanners.providers
|
||||
return this.$store.state.scanners.bookProviders
|
||||
},
|
||||
canFetchMetadata() {
|
||||
return !this.selectedLibraryIsPodcast && this.fetchMetadata.enabled
|
||||
@@ -297,6 +297,15 @@ export default {
|
||||
ref.setUploadStatus(status)
|
||||
}
|
||||
},
|
||||
updateItemCardProgress(index, progress) {
|
||||
var ref = this.$refs[`itemCard-${index}`]
|
||||
if (ref && ref.length) ref = ref[0]
|
||||
if (!ref) {
|
||||
console.error('Book card ref not found', index, this.$refs)
|
||||
} else {
|
||||
ref.setUploadProgress(progress)
|
||||
}
|
||||
},
|
||||
async uploadItem(item) {
|
||||
var form = new FormData()
|
||||
form.set('title', item.title)
|
||||
@@ -312,8 +321,20 @@ export default {
|
||||
form.set(`${index++}`, file)
|
||||
})
|
||||
|
||||
const config = {
|
||||
onUploadProgress: (progressEvent) => {
|
||||
if (progressEvent.lengthComputable) {
|
||||
const progress = {
|
||||
loaded: progressEvent.loaded,
|
||||
total: progressEvent.total
|
||||
}
|
||||
this.updateItemCardProgress(item.index, progress)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this.$axios
|
||||
.$post('/api/upload', form)
|
||||
.$post('/api/upload', form, config)
|
||||
.then(() => true)
|
||||
.catch((error) => {
|
||||
console.error('Failed to upload item', error)
|
||||
@@ -394,6 +415,8 @@ export default {
|
||||
this.setMetadataProvider()
|
||||
|
||||
this.setDefaultFolder()
|
||||
// Fetch providers if not already loaded
|
||||
this.$store.dispatch('scanners/fetchProviders')
|
||||
window.addEventListener('dragenter', this.dragenter)
|
||||
window.addEventListener('dragleave', this.dragleave)
|
||||
window.addEventListener('dragover', this.dragover)
|
||||
|
||||
+88
-3
@@ -1,4 +1,19 @@
|
||||
export default function ({ $axios, store, $config }) {
|
||||
export default function ({ $axios, store, $root, app }) {
|
||||
// Track if we're currently refreshing to prevent multiple refresh attempts
|
||||
let isRefreshing = false
|
||||
let failedQueue = []
|
||||
|
||||
const processQueue = (error, token = null) => {
|
||||
failedQueue.forEach(({ resolve, reject }) => {
|
||||
if (error) {
|
||||
reject(error)
|
||||
} else {
|
||||
resolve(token)
|
||||
}
|
||||
})
|
||||
failedQueue = []
|
||||
}
|
||||
|
||||
$axios.onRequest((config) => {
|
||||
if (!config.url) {
|
||||
console.error('Axios request invalid config', config)
|
||||
@@ -7,7 +22,7 @@ export default function ({ $axios, store, $config }) {
|
||||
if (config.url.startsWith('http:') || config.url.startsWith('https:')) {
|
||||
return
|
||||
}
|
||||
const bearerToken = store.state.user.user?.token || null
|
||||
const bearerToken = store.getters['user/getToken']
|
||||
if (bearerToken) {
|
||||
config.headers.common['Authorization'] = `Bearer ${bearerToken}`
|
||||
}
|
||||
@@ -17,9 +32,79 @@ export default function ({ $axios, store, $config }) {
|
||||
}
|
||||
})
|
||||
|
||||
$axios.onError((error) => {
|
||||
$axios.onError(async (error) => {
|
||||
const originalRequest = error.config
|
||||
const code = parseInt(error.response && error.response.status)
|
||||
const message = error.response ? error.response.data || 'Unknown Error' : 'Unknown Error'
|
||||
|
||||
console.error('Axios error', code, message)
|
||||
|
||||
// Handle 401 Unauthorized (token expired)
|
||||
if (code === 401 && !originalRequest._retry) {
|
||||
// Skip refresh for auth endpoints to prevent infinite loops
|
||||
if (originalRequest.url === '/auth/refresh' || originalRequest.url === '/login') {
|
||||
// Refresh failed or login failed, redirect to login
|
||||
store.commit('user/setUser', null)
|
||||
store.commit('user/setAccessToken', null)
|
||||
app.router.push('/login')
|
||||
return Promise.reject(error)
|
||||
}
|
||||
|
||||
if (isRefreshing) {
|
||||
// If already refreshing, queue this request
|
||||
return new Promise((resolve, reject) => {
|
||||
failedQueue.push({ resolve, reject })
|
||||
})
|
||||
.then((token) => {
|
||||
if (!originalRequest.headers) {
|
||||
originalRequest.headers = {}
|
||||
}
|
||||
originalRequest.headers['Authorization'] = `Bearer ${token}`
|
||||
return $axios(originalRequest)
|
||||
})
|
||||
.catch((err) => {
|
||||
return Promise.reject(err)
|
||||
})
|
||||
}
|
||||
|
||||
originalRequest._retry = true
|
||||
isRefreshing = true
|
||||
|
||||
try {
|
||||
// Attempt to refresh the token
|
||||
// Updates store if successful, otherwise clears store and throw error
|
||||
const newAccessToken = await store.dispatch('user/refreshToken')
|
||||
if (!newAccessToken) {
|
||||
console.error('No new access token received')
|
||||
return Promise.reject(error)
|
||||
}
|
||||
|
||||
// Update the original request with new token
|
||||
if (!originalRequest.headers) {
|
||||
originalRequest.headers = {}
|
||||
}
|
||||
originalRequest.headers['Authorization'] = `Bearer ${newAccessToken}`
|
||||
|
||||
// Process any queued requests
|
||||
processQueue(null, newAccessToken)
|
||||
|
||||
// Retry the original request
|
||||
return $axios(originalRequest)
|
||||
} catch (refreshError) {
|
||||
console.error('Token refresh failed:', refreshError)
|
||||
|
||||
// Process queued requests with error
|
||||
processQueue(refreshError, null)
|
||||
|
||||
// Redirect to login
|
||||
app.router.push('/login')
|
||||
|
||||
return Promise.reject(refreshError)
|
||||
} finally {
|
||||
isRefreshing = false
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.reject(error)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ const defaultCode = 'en-us'
|
||||
|
||||
const languageCodeMap = {
|
||||
ar: { label: 'عربي', dateFnsLocale: 'ar' },
|
||||
be: { label: 'Беларуская', dateFnsLocale: 'be' },
|
||||
bg: { label: 'Български', dateFnsLocale: 'bg' },
|
||||
bn: { label: 'বাংলা', dateFnsLocale: 'bn' },
|
||||
ca: { label: 'Català', dateFnsLocale: 'ca' },
|
||||
@@ -22,13 +23,16 @@ const languageCodeMap = {
|
||||
it: { label: 'Italiano', dateFnsLocale: 'it' },
|
||||
lt: { label: 'Lietuvių', dateFnsLocale: 'lt' },
|
||||
hu: { label: 'Magyar', dateFnsLocale: 'hu' },
|
||||
ko: { label: '한국어', dateFnsLocale: 'ko' },
|
||||
nl: { label: 'Nederlands', dateFnsLocale: 'nl' },
|
||||
no: { label: 'Norsk', dateFnsLocale: 'no' },
|
||||
pl: { label: 'Polski', dateFnsLocale: 'pl' },
|
||||
'pt-br': { label: 'Português (Brasil)', dateFnsLocale: 'ptBR' },
|
||||
ru: { label: 'Русский', dateFnsLocale: 'ru' },
|
||||
sk: { label: 'Slovenčina', dateFnsLocale: 'sk' },
|
||||
sl: { label: 'Slovenščina', dateFnsLocale: 'sl' },
|
||||
sv: { label: 'Svenska', dateFnsLocale: 'sv' },
|
||||
tr: { label: 'Türkçe', dateFnsLocale: 'tr' },
|
||||
uk: { label: 'Українська', dateFnsLocale: 'uk' },
|
||||
'vi-vn': { label: 'Tiếng Việt', dateFnsLocale: 'vi' },
|
||||
'zh-cn': { label: '简体中文 (Simplified Chinese)', dateFnsLocale: 'zhCN' },
|
||||
@@ -46,6 +50,7 @@ const podcastSearchRegionMap = {
|
||||
au: { label: 'Australia' },
|
||||
br: { label: 'Brasil' },
|
||||
be: { label: 'België / Belgique / Belgien' },
|
||||
by: { label: 'Беларусь' },
|
||||
cz: { label: 'Česko' },
|
||||
dk: { label: 'Danmark' },
|
||||
de: { label: 'Deutschland' },
|
||||
@@ -65,6 +70,7 @@ const podcastSearchRegionMap = {
|
||||
pt: { label: 'Portugal' },
|
||||
ru: { label: 'Россия' },
|
||||
ch: { label: 'Schweiz / Suisse / Svizzera' },
|
||||
sk: { label: 'Slovensko' },
|
||||
se: { label: 'Sverige' },
|
||||
vn: { label: 'Việt Nam' },
|
||||
ua: { label: 'Україна' },
|
||||
|
||||
@@ -37,6 +37,48 @@ Vue.prototype.$elapsedPretty = (seconds, useFullNames = false, useMilliseconds =
|
||||
return `${hours} ${useFullNames ? `hour${hours === 1 ? '' : 's'}` : 'hr'} ${minutes} ${useFullNames ? `minute${minutes === 1 ? '' : 's'}` : 'min'}`
|
||||
}
|
||||
|
||||
Vue.prototype.$elapsedPrettyLocalized = (seconds, useFullNames = false, useMilliseconds = false) => {
|
||||
if (isNaN(seconds) || seconds === null) return ''
|
||||
|
||||
try {
|
||||
const df = new Intl.DurationFormat(Vue.prototype.$languageCodes.current, {
|
||||
style: useFullNames ? 'long' : 'short'
|
||||
})
|
||||
|
||||
const duration = {}
|
||||
|
||||
if (seconds < 60) {
|
||||
if (useMilliseconds && seconds < 1) {
|
||||
duration.milliseconds = Math.floor(seconds * 1000)
|
||||
} else {
|
||||
duration.seconds = Math.floor(seconds)
|
||||
}
|
||||
} else if (seconds < 3600) {
|
||||
// 1 hour
|
||||
duration.minutes = Math.floor(seconds / 60)
|
||||
} else if (seconds < 86400) {
|
||||
// 1 day
|
||||
duration.hours = Math.floor(seconds / 3600)
|
||||
const minutes = Math.floor((seconds % 3600) / 60)
|
||||
if (minutes > 0) {
|
||||
duration.minutes = minutes
|
||||
}
|
||||
} else {
|
||||
duration.days = Math.floor(seconds / 86400)
|
||||
const hours = Math.floor((seconds % 86400) / 3600)
|
||||
if (hours > 0) {
|
||||
duration.hours = hours
|
||||
}
|
||||
}
|
||||
|
||||
return df.format(duration)
|
||||
} catch (error) {
|
||||
// Handle not supported
|
||||
console.warn('Intl.DurationFormat not supported, not localizing duration')
|
||||
return Vue.prototype.$elapsedPretty(seconds, useFullNames, useMilliseconds)
|
||||
}
|
||||
}
|
||||
|
||||
Vue.prototype.$secondsToTimestamp = (seconds, includeMs = false, alwaysIncludeHours = false) => {
|
||||
if (!seconds) {
|
||||
return alwaysIncludeHours ? '00:00:00' : '0:00'
|
||||
|
||||
@@ -117,7 +117,6 @@ export const actions = {
|
||||
const library = data.library
|
||||
const filterData = data.filterdata
|
||||
const issues = data.issues || 0
|
||||
const customMetadataProviders = data.customMetadataProviders || []
|
||||
const numUserPlaylists = data.numUserPlaylists
|
||||
|
||||
dispatch('user/checkUpdateLibrarySortFilter', library.mediaType, { root: true })
|
||||
@@ -131,9 +130,7 @@ export const actions = {
|
||||
commit('setLibraryIssues', issues)
|
||||
commit('setLibraryFilterData', filterData)
|
||||
commit('setNumUserPlaylists', numUserPlaylists)
|
||||
commit('scanners/setCustomMetadataProviders', customMetadataProviders, { root: true })
|
||||
|
||||
commit('setCurrentLibrary', libraryId)
|
||||
commit('setCurrentLibrary', { id: libraryId })
|
||||
return data
|
||||
})
|
||||
.catch((error) => {
|
||||
@@ -159,7 +156,7 @@ export const actions = {
|
||||
.$get(`/api/libraries`)
|
||||
.then((data) => {
|
||||
commit('set', data.libraries)
|
||||
commit('setLastLoad')
|
||||
commit('setLastLoad', new Date())
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed', error)
|
||||
@@ -176,14 +173,14 @@ export const mutations = {
|
||||
setFoldersLastUpdate(state) {
|
||||
state.folderLastUpdate = Date.now()
|
||||
},
|
||||
setLastLoad(state) {
|
||||
state.lastLoad = Date.now()
|
||||
setLastLoad(state, date) {
|
||||
state.lastLoad = date
|
||||
},
|
||||
setLibraryIssues(state, val) {
|
||||
state.issues = val
|
||||
},
|
||||
setCurrentLibrary(state, val) {
|
||||
state.currentLibraryId = val
|
||||
setCurrentLibrary(state, { id }) {
|
||||
state.currentLibraryId = id
|
||||
},
|
||||
set(state, libraries) {
|
||||
state.libraries = libraries
|
||||
|
||||
+50
-116
@@ -1,126 +1,60 @@
|
||||
export const state = () => ({
|
||||
providers: [
|
||||
{
|
||||
text: 'Google Books',
|
||||
value: 'google'
|
||||
},
|
||||
{
|
||||
text: 'Open Library',
|
||||
value: 'openlibrary'
|
||||
},
|
||||
{
|
||||
text: 'iTunes',
|
||||
value: 'itunes'
|
||||
},
|
||||
{
|
||||
text: 'Audible.com',
|
||||
value: 'audible'
|
||||
},
|
||||
{
|
||||
text: 'Audible.ca',
|
||||
value: 'audible.ca'
|
||||
},
|
||||
{
|
||||
text: 'Audible.co.uk',
|
||||
value: 'audible.uk'
|
||||
},
|
||||
{
|
||||
text: 'Audible.com.au',
|
||||
value: 'audible.au'
|
||||
},
|
||||
{
|
||||
text: 'Audible.fr',
|
||||
value: 'audible.fr'
|
||||
},
|
||||
{
|
||||
text: 'Audible.de',
|
||||
value: 'audible.de'
|
||||
},
|
||||
{
|
||||
text: 'Audible.co.jp',
|
||||
value: 'audible.jp'
|
||||
},
|
||||
{
|
||||
text: 'Audible.it',
|
||||
value: 'audible.it'
|
||||
},
|
||||
{
|
||||
text: 'Audible.co.in',
|
||||
value: 'audible.in'
|
||||
},
|
||||
{
|
||||
text: 'Audible.es',
|
||||
value: 'audible.es'
|
||||
},
|
||||
{
|
||||
text: 'FantLab.ru',
|
||||
value: 'fantlab'
|
||||
}
|
||||
],
|
||||
podcastProviders: [
|
||||
{
|
||||
text: 'iTunes',
|
||||
value: 'itunes'
|
||||
}
|
||||
],
|
||||
coverOnlyProviders: [
|
||||
{
|
||||
text: 'AudiobookCovers.com',
|
||||
value: 'audiobookcovers'
|
||||
}
|
||||
]
|
||||
bookProviders: [],
|
||||
podcastProviders: [],
|
||||
bookCoverProviders: [],
|
||||
podcastCoverProviders: [],
|
||||
providersLoaded: false
|
||||
})
|
||||
|
||||
export const getters = {
|
||||
checkBookProviderExists: state => (providerValue) => {
|
||||
return state.providers.some(p => p.value === providerValue)
|
||||
checkBookProviderExists: (state) => (providerValue) => {
|
||||
return state.bookProviders.some((p) => p.value === providerValue)
|
||||
},
|
||||
checkPodcastProviderExists: state => (providerValue) => {
|
||||
return state.podcastProviders.some(p => p.value === providerValue)
|
||||
checkPodcastProviderExists: (state) => (providerValue) => {
|
||||
return state.podcastProviders.some((p) => p.value === providerValue)
|
||||
},
|
||||
areProvidersLoaded: (state) => state.providersLoaded
|
||||
}
|
||||
|
||||
export const actions = {
|
||||
async fetchProviders({ commit, state }) {
|
||||
// Only fetch if not already loaded
|
||||
if (state.providersLoaded) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await this.$axios.$get('/api/search/providers')
|
||||
if (response?.providers) {
|
||||
commit('setAllProviders', response.providers)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch providers', error)
|
||||
}
|
||||
},
|
||||
async refreshProviders({ commit, state }) {
|
||||
// if providers are not loaded, do nothing - they will be fetched when required (
|
||||
if (!state.providersLoaded) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await this.$axios.$get('/api/search/providers')
|
||||
if (response?.providers) {
|
||||
commit('setAllProviders', response.providers)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to refresh providers', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const actions = {}
|
||||
|
||||
export const mutations = {
|
||||
addCustomMetadataProvider(state, provider) {
|
||||
if (provider.mediaType === 'book') {
|
||||
if (state.providers.some(p => p.value === provider.slug)) return
|
||||
state.providers.push({
|
||||
text: provider.name,
|
||||
value: provider.slug
|
||||
})
|
||||
} else {
|
||||
if (state.podcastProviders.some(p => p.value === provider.slug)) return
|
||||
state.podcastProviders.push({
|
||||
text: provider.name,
|
||||
value: provider.slug
|
||||
})
|
||||
}
|
||||
},
|
||||
removeCustomMetadataProvider(state, provider) {
|
||||
if (provider.mediaType === 'book') {
|
||||
state.providers = state.providers.filter(p => p.value !== provider.slug)
|
||||
} else {
|
||||
state.podcastProviders = state.podcastProviders.filter(p => p.value !== provider.slug)
|
||||
}
|
||||
},
|
||||
setCustomMetadataProviders(state, providers) {
|
||||
if (!providers?.length) return
|
||||
|
||||
const mediaType = providers[0].mediaType
|
||||
if (mediaType === 'book') {
|
||||
// clear previous values, and add new values to the end
|
||||
state.providers = state.providers.filter((p) => !p.value.startsWith('custom-'))
|
||||
state.providers = [
|
||||
...state.providers,
|
||||
...providers.map((p) => ({
|
||||
text: p.name,
|
||||
value: p.slug
|
||||
}))
|
||||
]
|
||||
} else {
|
||||
// Podcast providers not supported yet
|
||||
}
|
||||
setAllProviders(state, providers) {
|
||||
state.bookProviders = providers.books || []
|
||||
state.podcastProviders = providers.podcasts || []
|
||||
state.bookCoverProviders = providers.booksCovers || []
|
||||
state.podcastCoverProviders = providers.podcasts || [] // Use same as bookCovers since podcasts use iTunes only
|
||||
state.providersLoaded = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+33
-12
@@ -1,5 +1,6 @@
|
||||
export const state = () => ({
|
||||
user: null,
|
||||
accessToken: null,
|
||||
settings: {
|
||||
orderBy: 'media.metadata.title',
|
||||
orderDesc: false,
|
||||
@@ -25,19 +26,19 @@ export const getters = {
|
||||
getIsRoot: (state) => state.user && state.user.type === 'root',
|
||||
getIsAdminOrUp: (state) => state.user && (state.user.type === 'admin' || state.user.type === 'root'),
|
||||
getToken: (state) => {
|
||||
return state.user?.token || null
|
||||
return state.accessToken || null
|
||||
},
|
||||
getUserMediaProgress:
|
||||
(state) =>
|
||||
(libraryItemId, episodeId = null) => {
|
||||
if (!state.user.mediaProgress) return null
|
||||
if (!state.user?.mediaProgress) return null
|
||||
return state.user.mediaProgress.find((li) => {
|
||||
if (episodeId && li.episodeId !== episodeId) return false
|
||||
return li.libraryItemId == libraryItemId
|
||||
})
|
||||
},
|
||||
getUserBookmarksForItem: (state) => (libraryItemId) => {
|
||||
if (!state.user.bookmarks) return []
|
||||
if (!state.user?.bookmarks) return []
|
||||
return state.user.bookmarks.filter((bm) => bm.libraryItemId === libraryItemId)
|
||||
},
|
||||
getUserSetting: (state) => (key) => {
|
||||
@@ -91,7 +92,7 @@ export const actions = {
|
||||
if (state.settings.orderBy == 'media.duration') {
|
||||
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'
|
||||
}
|
||||
const invalidFilters = ['series', 'authors', 'narrators', 'publishers', 'publishedDecades', 'languages', 'progress', 'issues', 'ebooks', 'abridged']
|
||||
@@ -145,21 +146,41 @@ export const actions = {
|
||||
} catch (error) {
|
||||
console.error('Failed to load userSettings from local storage', error)
|
||||
}
|
||||
},
|
||||
refreshToken({ state, commit }) {
|
||||
return this.$axios
|
||||
.$post('/auth/refresh')
|
||||
.then(async (response) => {
|
||||
const newAccessToken = response.user.accessToken
|
||||
commit('setAccessToken', newAccessToken)
|
||||
// Emit event used to re-authenticate socket in default.vue since $root is not available here
|
||||
if (this.$eventBus) {
|
||||
this.$eventBus.$emit('token_refreshed', newAccessToken)
|
||||
}
|
||||
return newAccessToken
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed to refresh token', error)
|
||||
commit('setUser', null)
|
||||
commit('setAccessToken', null)
|
||||
// Calling function handles redirect to login
|
||||
throw error
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export const mutations = {
|
||||
setUser(state, user) {
|
||||
state.user = user
|
||||
if (user) {
|
||||
if (user.token) localStorage.setItem('token', user.token)
|
||||
} else {
|
||||
localStorage.removeItem('token')
|
||||
}
|
||||
},
|
||||
setUserToken(state, token) {
|
||||
state.user.token = token
|
||||
localStorage.setItem('token', token)
|
||||
setAccessToken(state, token) {
|
||||
if (!token) {
|
||||
localStorage.removeItem('token')
|
||||
state.accessToken = null
|
||||
} else {
|
||||
state.accessToken = token
|
||||
localStorage.setItem('token', token)
|
||||
}
|
||||
},
|
||||
updateMediaProgress(state, { id, data }) {
|
||||
if (!state.user) return
|
||||
|
||||
+14
-5
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "إضافة",
|
||||
"ButtonAddApiKey": "إضافة مفتاح واجهة برمجة التطبيقات",
|
||||
"ButtonAddChapters": "إضافة الفصول",
|
||||
"ButtonAddDevice": "إضافة جهاز",
|
||||
"ButtonAddLibrary": "إضافة مكتبة",
|
||||
@@ -20,7 +21,8 @@
|
||||
"ButtonChooseAFolder": "اختر المجلد",
|
||||
"ButtonChooseFiles": "اختر الملفات",
|
||||
"ButtonClearFilter": "تصفية الفرز",
|
||||
"ButtonCloseFeed": "إغلاق",
|
||||
"ButtonClose": "إغلاق",
|
||||
"ButtonCloseFeed": "إغلاق الموجز",
|
||||
"ButtonCloseSession": "إغلاق الجلسة المفتوحة",
|
||||
"ButtonCollections": "المجموعات",
|
||||
"ButtonConfigureScanner": "إعدادات الماسح الضوئي",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "الحساب",
|
||||
"HeaderAddCustomMetadataProvider": "إضافة موفر بيانات تعريفية مخصص",
|
||||
"HeaderAdvanced": "متقدم",
|
||||
"HeaderApiKeys": "مفاتيح API",
|
||||
"HeaderAppriseNotificationSettings": "إعدادات الإشعارات",
|
||||
"HeaderAudioTracks": "المقاطع الصوتية",
|
||||
"HeaderAudiobookTools": "أدوات إدارة ملفات الكتب الصوتية",
|
||||
"HeaderAuthentication": "المصادقة",
|
||||
"HeaderBackups": "النسخ الاحتياطية",
|
||||
"HeaderBulkChapterModal": "أضف فصولاً متعددة",
|
||||
"HeaderChangePassword": "تغيير كلمة المرور",
|
||||
"HeaderChapters": "الفصول",
|
||||
"HeaderChooseAFolder": "اختيار المجلد",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "ترتيب أولوية البيانات الوصفية",
|
||||
"HeaderMetadataToEmbed": "البيانات الوصفية المراد تضمينها",
|
||||
"HeaderNewAccount": "حساب جديد",
|
||||
"HeaderNewApiKey": "مفتاح API جديد",
|
||||
"HeaderNewLibrary": "مكتبة جديدة",
|
||||
"HeaderNotificationCreate": "إنشاء إشعار",
|
||||
"HeaderNotificationUpdate": "تحديث إشعار",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "ميزات تجريبية",
|
||||
"HeaderSettingsGeneral": "عام",
|
||||
"HeaderSettingsScanner": "إعدادات المسح",
|
||||
"HeaderSettingsSecurity": "الأمان",
|
||||
"HeaderSettingsWebClient": "عميل الويب",
|
||||
"HeaderSleepTimer": "مؤقت النوم",
|
||||
"HeaderStatsLargestItems": "أكبر العناصر حجماً",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "جدول المحتويات",
|
||||
"HeaderTools": "أدوات",
|
||||
"HeaderUpdateAccount": "تحديث الحساب",
|
||||
"HeaderUpdateApiKey": "تحديث مفتاح API",
|
||||
"HeaderUpdateAuthor": "تحديث المؤلف",
|
||||
"HeaderUpdateDetails": "تحديث التفاصيل",
|
||||
"HeaderUpdateLibrary": "تحديث المكتبة",
|
||||
@@ -235,6 +242,8 @@
|
||||
"LabelAllUsersExcludingGuests": "جميع المستخدمين باستثناء الضيوف",
|
||||
"LabelAllUsersIncludingGuests": "جميع المستخدمين بما في ذلك الضيوف",
|
||||
"LabelAlreadyInYourLibrary": "موجود بالفعل في مكتبتك",
|
||||
"LabelApiKeyCreated": "تم إنشاء مفتاح API \"{0}\" بنجاح.",
|
||||
"LabelApiKeyCreatedDescription": "تأكد من نسخ مفتاح API الآن، لن تتمكن من رؤيته مرة أخرى.",
|
||||
"LabelApiToken": "رمز API",
|
||||
"LabelAppend": "إلحاق",
|
||||
"LabelAudioBitrate": "معدل بت الصوت (على سبيل المثال 128 كيلو بايت)",
|
||||
@@ -346,7 +355,7 @@
|
||||
"LabelExample": "مثال",
|
||||
"LabelExpandSeries": "توسيع السلاسل",
|
||||
"LabelExpandSubSeries": "توسيع السلاسل الفرعية",
|
||||
"LabelExplicit": "صريح",
|
||||
"LabelExplicit": "محتوى صريح",
|
||||
"LabelExplicitChecked": "صريح (محدد)",
|
||||
"LabelExplicitUnchecked": "غير صريح (غير محدد)",
|
||||
"LabelExportOPML": "تصدير OPML",
|
||||
@@ -365,7 +374,7 @@
|
||||
"LabelFolders": "مجلدات",
|
||||
"LabelFontBold": "عريض",
|
||||
"LabelFontBoldness": "تعريض الخط",
|
||||
"LabelFontFamily": "عائلة الخط",
|
||||
"LabelFontFamily": "عائلة الخطوط",
|
||||
"LabelFontItalic": "مائل",
|
||||
"LabelFontScale": "نطاق الخط",
|
||||
"LabelFontStrikethrough": "يتوسطه خط",
|
||||
@@ -561,7 +570,7 @@
|
||||
"LabelSettingsBookshelfViewHelp": "تصميم يحاكي الواقع مع رفوف خشبية",
|
||||
"LabelSettingsChromecastSupport": "دعم Chromecast",
|
||||
"LabelSettingsDateFormat": "تنسيق التاريخ",
|
||||
"LabelSettingsEnableWatcher": "فحص المكتبات تلقائيًا بحثًا عن تغييرات",
|
||||
"LabelSettingsEnableWatcher": "مراقبة المكتبات تلقائياً بحثاً عن تغييرات",
|
||||
"LabelSettingsEnableWatcherForLibrary": "فحص المكتبة تلقائيًا بحثًا عن تغييرات",
|
||||
"LabelSettingsEnableWatcherHelp": "يمكّن الإضافة/التحديث التلقائي للعناصر عند اكتشاف تغييرات في الملفات. *يتطلب إعادة تشغيل الخادم",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "السماح بالمحتوى النصي في ملفات epub",
|
||||
@@ -852,7 +861,7 @@
|
||||
"MessageResetChaptersConfirm": "هل أنت متأكد أنك تريد إعادة تعيين الفصول والتراجع عن التغييرات التي أجريتها؟",
|
||||
"MessageRestoreBackupConfirm": "هل أنت متأكد أنك تريد استعادة النسخ الاحتياطي الذي تم إنشاؤه في",
|
||||
"MessageRestoreBackupWarning": "ستؤدي استعادة النسخ الاحتياطي إلى الكتابة فوق قاعدة البيانات بأكملها الموجودة في /config وصور الأغلفة في /metadata/items و /metadata/authors.<br /><br /> لا تعدل النسخ الاحتياطية أي ملفات في مجلدات مكتبتك. إذا قمت بتمكين إعدادات الخادم لتخزين صور الأغلفة والبيانات الوصفية في مجلدات مكتبتك، فلن يتم نسخها احتياطيًا أو الكتابة فوقها.<br /><br /> سيتم تحديث جميع العملاء الذين يستخدمون الخادم الخاص بك تلقائيًا.",
|
||||
"MessageScheduleLibraryScanNote": "بالنسبة لمعظم المستخدمين، يوصى بترك هذه الميزة معطلة وإبقاء إعداد مراقب المجلدات ممكّنًا. سيكتشف مراقب المجلدات تلقائيًا التغييرات في مجلدات مكتبتك. لا يعمل مراقب المجلدات مع كل نظام ملفات (مثل NFS)، لذا يمكن استخدام عمليات فحص المكتبة المجدولة بدلاً من ذلك.",
|
||||
"MessageScheduleLibraryScanNote": "لمعظم المستخدمين، موصى بترك هذه الميزة معطلة وإبقاء ممكّنة الأعداد، ”قم بمراقبة المكتبة تلقائاً للتغييرات“. سوف يقم بالكشف التلقائي عن تغييرات في مجلدات مكتبتك. لو لم يعمل الإعداد، \"قم بمراقبة المكتبة تلقائاً للتغييرات،“مع نظمة ملفاتك المستخدمة (مثل NFS على سبيل المثال)، فأمكِن هذه الميزة.",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "تشغيل كل {0} في الساعة {1}",
|
||||
"MessageSearchResultsFor": "نتائج البحث عن",
|
||||
"MessageSelected": "تم تحديد {0}",
|
||||
|
||||
+691
-141
File diff suppressed because it is too large
Load Diff
+130
-8
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Създай",
|
||||
"ButtonAddApiKey": "Добави API ключ",
|
||||
"ButtonAddChapters": "Добави Глави",
|
||||
"ButtonAddDevice": "Добави Устройство",
|
||||
"ButtonAddLibrary": "Добави Библиотека",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Избери Папка",
|
||||
"ButtonChooseFiles": "Избери Файлове",
|
||||
"ButtonClearFilter": "Изчисти филтър",
|
||||
"ButtonClose": "Затвори",
|
||||
"ButtonCloseFeed": "Затвори стената",
|
||||
"ButtonCloseSession": "Затвори отворената сесия",
|
||||
"ButtonCollections": "Колекции",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Профил",
|
||||
"HeaderAddCustomMetadataProvider": "Добави персонализиран доставчик на метаданни",
|
||||
"HeaderAdvanced": "Разширени настройки",
|
||||
"HeaderApiKeys": "API ключове",
|
||||
"HeaderAppriseNotificationSettings": "Apprise Notification Опции",
|
||||
"HeaderAudioTracks": "Песни",
|
||||
"HeaderAudiobookTools": "Инструмент за Менижиране на Аудиокниги",
|
||||
"HeaderAuthentication": "Аутентикация",
|
||||
"HeaderBackups": "Архив",
|
||||
"HeaderBulkChapterModal": "Добави няколко глави",
|
||||
"HeaderChangePassword": "Промяна на Парола",
|
||||
"HeaderChapters": "Глави",
|
||||
"HeaderChooseAFolder": "Избети Папка",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Предимство на Метаданни",
|
||||
"HeaderMetadataToEmbed": "Метаданни за Вграждане",
|
||||
"HeaderNewAccount": "Нов Профил",
|
||||
"HeaderNewApiKey": "Нов API ключ",
|
||||
"HeaderNewLibrary": "Нова Библиотека",
|
||||
"HeaderNotificationCreate": "Създай нотификация",
|
||||
"HeaderNotificationUpdate": "Обнови нотификация",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Експериментални Функции",
|
||||
"HeaderSettingsGeneral": "Общи",
|
||||
"HeaderSettingsScanner": "Скенер",
|
||||
"HeaderSettingsSecurity": "Сигурност",
|
||||
"HeaderSettingsWebClient": "Уеб клиент",
|
||||
"HeaderSleepTimer": "Таймер за заспиване",
|
||||
"HeaderStatsLargestItems": "Най-Големите Елементи",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Съдържание",
|
||||
"HeaderTools": "Инструменти",
|
||||
"HeaderUpdateAccount": "Обнови Профил",
|
||||
"HeaderUpdateApiKey": "Обнови API ключ",
|
||||
"HeaderUpdateAuthor": "Обнови Автор",
|
||||
"HeaderUpdateDetails": "Обнови Детайли",
|
||||
"HeaderUpdateLibrary": "Обнови Библиотека",
|
||||
@@ -230,10 +237,15 @@
|
||||
"LabelAddedDate": "Добавено",
|
||||
"LabelAdminUsersOnly": "Само за Администратори",
|
||||
"LabelAll": "Всичко",
|
||||
"LabelAllEpisodesDownloaded": "Всички епизоди са изтеглени",
|
||||
"LabelAllUsers": "Всички Потребители",
|
||||
"LabelAllUsersExcludingGuests": "Всички потребители без гости",
|
||||
"LabelAllUsersIncludingGuests": "Всички потребители включително гости",
|
||||
"LabelAlreadyInYourLibrary": "Вече е в твоята библиотека",
|
||||
"LabelApiKeyCreated": "API ключ \"{0}\" успешно създатен.",
|
||||
"LabelApiKeyCreatedDescription": "Погрижете се да копирате API ключът сега, защото повече няма да можете да го виждате онново.",
|
||||
"LabelApiKeyUser": "Действай от името на потребителя",
|
||||
"LabelApiKeyUserDescription": "Този API ключ ще има същите права като на потребителя за чието име действа. В логовете ще изглежда все едно потребителя прави заявката.",
|
||||
"LabelApiToken": "АПИ Токен",
|
||||
"LabelAppend": "Добави",
|
||||
"LabelAudioBitrate": "Аудио битрейт (напр. 128k)",
|
||||
@@ -253,7 +265,7 @@
|
||||
"LabelBackToUser": "Обратно към Потребител",
|
||||
"LabelBackupAudioFiles": "Създай резервно копие на аудио файлове",
|
||||
"LabelBackupLocation": "Местоположение на Архив",
|
||||
"LabelBackupsEnableAutomaticBackups": "Включи автоматично архивиране",
|
||||
"LabelBackupsEnableAutomaticBackups": "Автоматично архивиране",
|
||||
"LabelBackupsEnableAutomaticBackupsHelp": "Архиви запазени в /metadata/backups",
|
||||
"LabelBackupsMaxBackupSize": "Максимален размер на архива (в GB) (0 за неограничен)",
|
||||
"LabelBackupsMaxBackupSizeHelp": "За защита срещу грешки в конфигурацията, архивите ще се провалят ако надхвърлят конфигурирания размер.",
|
||||
@@ -272,7 +284,7 @@
|
||||
"LabelChaptersFound": "намерени глави",
|
||||
"LabelClickForMoreInfo": "Кликни за повече информация",
|
||||
"LabelClickToUseCurrentValue": "Натисни да ползваш сегашната стойност",
|
||||
"LabelClosePlayer": "Затвори",
|
||||
"LabelClosePlayer": "Затвори плейъра",
|
||||
"LabelCodec": "Кодек",
|
||||
"LabelCollapseSeries": "Скрий сериите",
|
||||
"LabelCollapseSubSeries": "Свий подсерии",
|
||||
@@ -283,6 +295,7 @@
|
||||
"LabelContinueListening": "Продължи слушане",
|
||||
"LabelContinueReading": "Продължи четене",
|
||||
"LabelContinueSeries": "Продължи серии",
|
||||
"LabelCorsAllowed": "Разрешени CORS Origins",
|
||||
"LabelCover": "Корица",
|
||||
"LabelCoverImageURL": "URL на Корица",
|
||||
"LabelCoverProvider": "Източник за обложки",
|
||||
@@ -296,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Изтрий от файловата система (отмени за да бъдат премахни само от базата данни)",
|
||||
"LabelDescription": "Описание",
|
||||
"LabelDeselectAll": "Премахни всички",
|
||||
"LabelDetectedPattern": "Намерен образец:",
|
||||
"LabelDevice": "Устройство",
|
||||
"LabelDeviceInfo": "Информация за Устройство",
|
||||
"LabelDeviceIsAvailableTo": "Устройството е достъпно за ...",
|
||||
@@ -345,7 +359,11 @@
|
||||
"LabelExample": "Пример",
|
||||
"LabelExpandSeries": "Покажи сериите",
|
||||
"LabelExpandSubSeries": "Покажи съб сериите",
|
||||
"LabelExplicit": "С нецензурно съдържание",
|
||||
"LabelExpired": "Изтекъл",
|
||||
"LabelExpiresAt": "Изтича на",
|
||||
"LabelExpiresInSeconds": "Изтича след (секунди)",
|
||||
"LabelExpiresNever": "Никога",
|
||||
"LabelExplicit": "Експлицитно",
|
||||
"LabelExplicitChecked": "С нецензурно съдържание (проверено)",
|
||||
"LabelExplicitUnchecked": "Без нецензурно съдържание (непроверено)",
|
||||
"LabelExportOPML": "Експортирай OPML",
|
||||
@@ -360,6 +378,7 @@
|
||||
"LabelFilterByUser": "Филтриране по Потребител",
|
||||
"LabelFindEpisodes": "Намери Епизоди",
|
||||
"LabelFinished": "Дата на приключване",
|
||||
"LabelFinishedDate": "Приключено на {0}",
|
||||
"LabelFolder": "Папка",
|
||||
"LabelFolders": "Папки",
|
||||
"LabelFontBold": "Получерно",
|
||||
@@ -404,6 +423,7 @@
|
||||
"LabelLanguages": "Езици",
|
||||
"LabelLastBookAdded": "Последно Добавена Книга",
|
||||
"LabelLastBookUpdated": "Последно Обновена Книга",
|
||||
"LabelLastProgressDate": "Последен прогрес: {0}",
|
||||
"LabelLastSeen": "Последно Видян",
|
||||
"LabelLastTime": "Последно Време",
|
||||
"LabelLastUpdate": "Последно Обновяване",
|
||||
@@ -416,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Не {0}",
|
||||
"LabelLibraryItem": "Елемент на Библиотека",
|
||||
"LabelLibraryName": "Име на Библиотека",
|
||||
"LabelLibrarySortByProgress": "Прогрес: Последно Обновен",
|
||||
"LabelLibrarySortByProgressFinished": "Прогрес: Приключено",
|
||||
"LabelLibrarySortByProgressStarted": "Прогрес: Започнато",
|
||||
"LabelLimit": "Лимит",
|
||||
"LabelLineSpacing": "Междуредие",
|
||||
"LabelListenAgain": "Слушай отново",
|
||||
@@ -424,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Предупреждение",
|
||||
"LabelLookForNewEpisodesAfterDate": "Търси нови епизоди след дата",
|
||||
"LabelLowestPriority": "Най-нисък Приоритет",
|
||||
"LabelMatchConfidence": "Увереност",
|
||||
"LabelMatchExistingUsersBy": "Съпостави съществуващи потребители по",
|
||||
"LabelMatchExistingUsersByDescription": "Използва се за свързване на съществуващи потребители. След свързване потребителите ще бъдат съпоставени по уникален идентификатор от вашия доставчик на SSO",
|
||||
"LabelMaxEpisodesToDownload": "Максимален брой епизоди за сваляне. Използвай 0 за неограничен.",
|
||||
@@ -453,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Най-новите автори",
|
||||
"LabelNewestEpisodes": "Най-новите епизоди",
|
||||
"LabelNextBackupDate": "Следваща Дата на Архивиране",
|
||||
"LabelNextChapters": "Следващите глави ще бъдат:",
|
||||
"LabelNextScheduledRun": "Следващо Планирано Изпълнение",
|
||||
"LabelNoApiKeys": "Няма API ключове",
|
||||
"LabelNoCustomMetadataProviders": "Няма потребителски доставчици на метаданни",
|
||||
"LabelNoEpisodesSelected": "Няма избрани епизоди",
|
||||
"LabelNotFinished": "Не е приключено",
|
||||
@@ -469,6 +495,7 @@
|
||||
"LabelNotificationsMaxQueueSize": "Максимален размер на опашката за известия",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Събитията са ограничени до изстрелване на 1 на секунда. Събитията ще бъдат игнорирани ако опашката е на максимален размер. Това предотвратява спамирането на известия.",
|
||||
"LabelNumberOfBooks": "Брой на Книги",
|
||||
"LabelNumberOfChapters": "Брой глави:",
|
||||
"LabelNumberOfEpisodes": "Брой епизоди",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Име на OpenID твърдението, което съдържа разширени права за достъп до потребителски действия в приложението, които ще се прилагат за роли, различни от администраторските (<b>ако е конфигурирано</b>). Ако твърдението липсва в отговора, достъпът до ABS ще бъде отказан. Ако липсва една опция, тя ще се третира като <code>false</code>. Уверете се, че твърдението на доставчика на идентичност съответства на очакваната структура:",
|
||||
"LabelOpenIDClaims": "Оставете следните опции празни, за да деактивирате разширеното присвояване на групи, като автоматично ще бъде присвоена групата 'Потребител'.",
|
||||
@@ -513,7 +540,7 @@
|
||||
"LabelPublishers": "Издателство",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Персонализиран имейл на собственика",
|
||||
"LabelRSSFeedCustomOwnerName": "Персонализирано име на собственика",
|
||||
"LabelRSSFeedOpen": "RSS Feed Оптворен",
|
||||
"LabelRSSFeedOpen": "RSS Feed е отворен",
|
||||
"LabelRSSFeedPreventIndexing": "Предотвратете индексиране",
|
||||
"LabelRSSFeedSlug": "идентификатор на RSS емисия",
|
||||
"LabelRSSFeedURL": "URL на RSS емисия",
|
||||
@@ -543,6 +570,7 @@
|
||||
"LabelSelectAll": "Избери всичко",
|
||||
"LabelSelectAllEpisodes": "Избери всички епизоди",
|
||||
"LabelSelectEpisodesShowing": "Избери {0} епизоди показани",
|
||||
"LabelSelectUser": "Избери потребител",
|
||||
"LabelSelectUsers": "Избери Потребители",
|
||||
"LabelSendEbookToDevice": "Изпрати електронна книга до ...",
|
||||
"LabelSequence": "Последователност",
|
||||
@@ -560,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Скеуморфен дизайн с дървени рафтове",
|
||||
"LabelSettingsChromecastSupport": "Chromecast поддръжка",
|
||||
"LabelSettingsDateFormat": "Формат на Дата",
|
||||
"LabelSettingsEnableWatcher": "Автоматично сканиране на библиотеките за промени",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Автоматично сканиране на библиотеката за промени",
|
||||
"LabelSettingsEnableWatcher": "Автоматично преглеждане на библиотеките за промени",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Автоматично преглеждане на библиотеката за промени",
|
||||
"LabelSettingsEnableWatcherHelp": "Включва автоматичното добавяне/обновяване на елементи, когато се открият промени във файловете. *Изисква рестарт на сървъра",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Позволи скриптово съдържание в epub-и",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Позволи epub файловете да изпълняват скриптове. Препоръчително е да бъде изключено освен ако не се доверявате на източника на epub файловете.",
|
||||
@@ -610,6 +638,7 @@
|
||||
"LabelStartTime": "Начално Време",
|
||||
"LabelStarted": "Стартирано",
|
||||
"LabelStartedAt": "Стартирано на",
|
||||
"LabelStartedDate": "Започнато {0}",
|
||||
"LabelStatsAudioTracks": "Аудио Канали",
|
||||
"LabelStatsAuthors": "Автори",
|
||||
"LabelStatsBestDay": "Най-добър ден",
|
||||
@@ -639,6 +668,7 @@
|
||||
"LabelTheme": "Тема",
|
||||
"LabelThemeDark": "Тъмна",
|
||||
"LabelThemeLight": "Светла",
|
||||
"LabelThemeSepia": "Сепия",
|
||||
"LabelTimeBase": "Времева Основа",
|
||||
"LabelTimeDurationXHours": "{0} часа",
|
||||
"LabelTimeDurationXMinutes": "{0} минути",
|
||||
@@ -693,7 +723,11 @@
|
||||
"LabelViewPlayerSettings": "Виж настройки на плеъра",
|
||||
"LabelViewQueue": "Виж Опашка",
|
||||
"LabelVolume": "Сила на Звука",
|
||||
"LabelWebRedirectURLsDescription": "Разрешете тези URL-и във вашият OAuth доставчик, за да позволите пренасочването обратно към уеб приложението след вход:",
|
||||
"LabelWebRedirectURLsSubfolder": "Подпапка за URL адреси за пренасочване",
|
||||
"LabelWeekdaysToRun": "Делници за изпълнение",
|
||||
"LabelXBooks": "{0} книги",
|
||||
"LabelXItems": "{0} елемента",
|
||||
"LabelYearReviewHide": "Скрий ревю на годината ти",
|
||||
"LabelYearReviewShow": "Виж ревю на годината ти",
|
||||
"LabelYourAudiobookDuration": "Продължителност на вашата аудиокнига",
|
||||
@@ -702,41 +736,64 @@
|
||||
"LabelYourProgress": "Твоят прогрес",
|
||||
"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>.",
|
||||
"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> включват никакви файлове, съхранени в папките на вашата библиотека.",
|
||||
"MessageBackupsLocationEditNote": "Забележка: Актуализирането на местоположението за архивиране няма да премести или промени съществуващите архиви",
|
||||
"MessageBackupsLocationNoEditNote": "Забележка: Местоположението за архивиране се задава с помощта на променлива на средата и не може бъде променена от тук.",
|
||||
"MessageBackupsLocationPathEmpty": "Пътят към местоположението за архивиране не може да бъде празен",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Популирайте активираните полета с данни от всички елементи. Полетата със няколко стоайности ще бъдат обединени",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Попълнете активираните полета с информация за картата с данни от този елемент",
|
||||
"MessageBatchQuickMatchDescription": "Бързото Съпоставяне ще опита да добави липсващи корици и метаданни за избраните елементи. Активирайте опциите по-долу, за да позволите на Бързото съпоставяне да презапише съществуващите корици и/или метаданни.",
|
||||
"MessageBookshelfNoCollections": "Все още нямате създадени колекции",
|
||||
"MessageBookshelfNoCollectionsHelp": "Колекциите са публични. Всички потребители с достъп до библиотеката ще могат да ги виждат.",
|
||||
"MessageBookshelfNoRSSFeeds": "Няма отворени RSS feed-ове",
|
||||
"MessageBookshelfNoResultsForFilter": "Няма резултат за филтер \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Няма резултати от заявката",
|
||||
"MessageBookshelfNoSeries": "Нямаш сеЗЙ",
|
||||
"MessageBulkChapterPattern": "Колко глави искате да добавите, използвайки тази схема за номериране?",
|
||||
"MessageChapterEndIsAfter": "Краят на главата е след края на вашата аудиокнига",
|
||||
"MessageChapterErrorFirstNotZero": "Първата глава трябва да започва от 0",
|
||||
"MessageChapterErrorStartGteDuration": "Началото на главата трябва да бъде по-малко от продължителността на аудиокнигата",
|
||||
"MessageChapterErrorStartLtPrev": "Началото на главата трябва да бъде по-голямо или равно на края на предишната глава",
|
||||
"MessageChapterStartIsAfter": "Началото на главата е след края на вашата аудиокнига",
|
||||
"MessageChaptersNotFound": "Главите не са намерени",
|
||||
"MessageCheckingCron": "Проверяване на cron...",
|
||||
"MessageConfirmCloseFeed": "Сигурни ли сте, че искате да затворите този feed?",
|
||||
"MessageConfirmDeleteApiKey": "Сигурни ли сте, че искате да изтриете API ключ \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Сигурни ли сте, че искате да изтриете този архив {0}?",
|
||||
"MessageConfirmDeleteDevice": "Сигурни ли сте, че искате да изтриете е-четец \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Това ще изтрие файла от файловата Ви система. Сигурни ли сте?",
|
||||
"MessageConfirmDeleteLibrary": "Сигурни ли сте, че искате да изтриете за винаги библиотека \"{0}\"?",
|
||||
"MessageConfirmDeleteLibraryItem": "Това ще изтрие елемента от базата данни и файловата Ви система. Сигурни ли сте?",
|
||||
"MessageConfirmDeleteLibraryItems": "Това ще изтрие {0} елемента от базата данни и файловата Ви система. Сигурни ли сте?",
|
||||
"MessageConfirmDeleteMetadataProvider": "Сигурни ли сте, че искате да изтриете доставчика нa метаданни \"{0}\"?",
|
||||
"MessageConfirmDeleteNotification": "Сигурни ли сте, че искате да изтриете това уведомление?",
|
||||
"MessageConfirmDeleteSession": "Сигурни ли сте, че искате да изтриете тази сесия?",
|
||||
"MessageConfirmEmbedMetadataInAudioFiles": "Сигурнли ли сте, че искате да вградите метаданните в {0} аудио файла?",
|
||||
"MessageConfirmForceReScan": "Сигурни ли сте, че искате да принудите повторно сканиране?",
|
||||
"MessageConfirmMarkAllEpisodesFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като завършени?",
|
||||
"MessageConfirmMarkAllEpisodesNotFinished": "Сигурни ли сте, че искате да маркирате всички епизоди като незавършени?",
|
||||
"MessageConfirmMarkItemFinished": "Сигурни ли сте, че искате да маркирате \"{0}\" като приключено?",
|
||||
"MessageConfirmMarkItemNotFinished": "Сигурни ли сте, че искате да маркирате \"{0}\" като неприключено?",
|
||||
"MessageConfirmMarkSeriesFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като завършени?",
|
||||
"MessageConfirmMarkSeriesNotFinished": "Сигурни ли сте, че искате да маркирате всички книги в тази серия като незавършени?",
|
||||
"MessageConfirmNotificationTestTrigger": "Пуснете това уведомление с тестови данни?",
|
||||
"MessageConfirmPurgeCache": "Изчистването на кеша ще изтрие цялата директория в <code>/metadata/cache</code>. <br /><br />Сигурни ли сте, че искате да премахнете директорията на кеша?",
|
||||
"MessageConfirmPurgeItemsCache": "Изчистването на кеша на елементите ще изтрие цялата директория в <code>/metadata/cache/items</code>. <br />Сигурни ли сте?",
|
||||
"MessageConfirmQuickEmbed": "Внимание! Бързото вграждане няма да архивира вашите аудио файлове. Уверете се, че имате резервно копие на вашите аудио файлове. <br><br>Искате ли да продължите?",
|
||||
"MessageConfirmQuickMatchEpisodes": "Бързото сравняване на епизоди ще презапише детайлите, ако се намери съвпадение. Само не съвпаднали епизоди ще бъдат обновени. Сигурни ли сте?",
|
||||
"MessageConfirmReScanLibraryItems": "Сигурни ли сте, че искате да сканирате отново {0} елемента?",
|
||||
"MessageConfirmRemoveAllChapters": "Сигурни ли сте, че искате да премахнете всички глави?",
|
||||
"MessageConfirmRemoveAuthor": "Сигурни ли сте, че искате да премахнете автор \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Сигурни ли сте, че искате да премахнете колекция \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Сигурни ли сте, че искате да премахнете епизод \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Забележка: Това няма да доведе до изтриване на аудио файла, освен ако не активирате опцията \"Твърдо изтриване на файла\"",
|
||||
"MessageConfirmRemoveEpisodes": "Сигурни ли сте, че искате да премахнете {0} епизода?",
|
||||
"MessageConfirmRemoveListeningSessions": "Сигурни ли сте, че искате да премахнете {0} слушателски сесии?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Сигурни ли сте, че искате да премахнете всичките метаданни. {0} файлове във папките на Вашата библиотека?",
|
||||
"MessageConfirmRemoveNarrator": "Сигурни ли сте, че искате да премахнете разказвач \"{0}\"?",
|
||||
"MessageConfirmRemovePlaylist": "Сигурни ли сте, че искате да премахнете плейлиста \"{0}\"?",
|
||||
"MessageConfirmRenameGenre": "Сигурни ли сте, че искате да преименувате жанра \"{0}\" на \"{1}\" за всички елементи?",
|
||||
@@ -745,19 +802,27 @@
|
||||
"MessageConfirmRenameTag": "Сигурни ли сте, че искате да преименувате таг \"{0}\" на \"{1}\" за всички елементи?",
|
||||
"MessageConfirmRenameTagMergeNote": "Забележка: Този таг вече съществува и ще бъде слято.",
|
||||
"MessageConfirmRenameTagWarning": "Внимание! Вече съществува подобен таг с различно писане \"{0}\".",
|
||||
"MessageConfirmResetProgress": "Сигурни ли сте, че искате да нулирате прогреса си?",
|
||||
"MessageConfirmSendEbookToDevice": "Сигурни ли сте, че искате да изпратите {0} електронна книга \"{1}\" до устройство \"{2}\"?",
|
||||
"MessageConfirmUnlinkOpenId": "Сигурни ли сте, че искате да отвържете този потребител от OpenID?",
|
||||
"MessageDaysListenedInTheLastYear": "{0} дни слушане през последната година",
|
||||
"MessageDownloadingEpisode": "Сваля епизод",
|
||||
"MessageDragFilesIntoTrackOrder": "Плъзнете файлове в правилния ред на каналите",
|
||||
"MessageEmbedFailed": "Вграждането беше неуспешно!",
|
||||
"MessageEmbedFinished": "Вграждането завърши!",
|
||||
"MessageEmbedQueue": "Поставено в опашката за вграждане на метаданни ({0} в опашката)",
|
||||
"MessageEpisodesQueuedForDownload": "{0} Епизод(и) са сложени за сваляне",
|
||||
"MessageEreaderDevices": "За да осигурите доставката на е-книги, може да се наложи да добавите горепосочения имейл адрес като валиден подател за всяко устройство, изброено по-долу.",
|
||||
"MessageFeedURLWillBe": "Адресът на емисията ще бъде {0}",
|
||||
"MessageFetching": "Извличане...",
|
||||
"MessageForceReScanDescription": "ще сканира всички файлове отново като прясно сканиране. Аудио файлове ID3 тагове, OPF файлове и текстови файлове ще бъдат сканирани като нови.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} слушане</strong> на {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Няма сесии за слушане на {0}",
|
||||
"MessageImportantNotice": "Важно Съобщение!",
|
||||
"MessageInsertChapterBelow": "Вмъкни глава под",
|
||||
"MessageItemsSelected": "{0} избрани",
|
||||
"MessageItemsUpdated": "{0} елемента обновени",
|
||||
"MessageInvalidAsin": "Невалиден ASIN",
|
||||
"MessageItemsSelected": "{0} избрани елемента",
|
||||
"MessageItemsUpdated": "{0} обновени елемента",
|
||||
"MessageJoinUsOn": "Присъединете се към нас",
|
||||
"MessageLoading": "Зарежда...",
|
||||
"MessageLoadingFolders": "Зареждане на Папки...",
|
||||
@@ -778,6 +843,7 @@
|
||||
"MessageNoCollections": "Няма колекции",
|
||||
"MessageNoCoversFound": "Не са намерени корици",
|
||||
"MessageNoDescription": "Няма описание",
|
||||
"MessageNoDevices": "Няма устройства",
|
||||
"MessageNoDownloadsInProgress": "Няма изтегляния в прогрес",
|
||||
"MessageNoDownloadsQueued": "Няма изтегляния в опашка",
|
||||
"MessageNoEpisodeMatchesFound": "Няма намерени съвпадения за епизоди",
|
||||
@@ -791,6 +857,7 @@
|
||||
"MessageNoLogs": "Няма логове",
|
||||
"MessageNoMediaProgress": "Няма прогрес на медията",
|
||||
"MessageNoNotifications": "Няма известия",
|
||||
"MessageNoPodcastFeed": "Невалиден подкаст: Няма канал",
|
||||
"MessageNoPodcastsFound": "Няма намерени подкасти",
|
||||
"MessageNoResults": "Няма резултати",
|
||||
"MessageNoSearchResultsFor": "Няма резултати за \"{0}\"",
|
||||
@@ -799,13 +866,19 @@
|
||||
"MessageNoTasksRunning": "Няма вършещи се задачи",
|
||||
"MessageNoUpdatesWereNecessary": "Няма нужда от обновяване",
|
||||
"MessageNoUserPlaylists": "Нямате създадени плейлисти",
|
||||
"MessageNoUserPlaylistsHelp": "Плейлистите за частни. Само създалият ги потребител ще може да ги вижда.",
|
||||
"MessageNotYetImplemented": "Още не е изпълнено",
|
||||
"MessageOpmlPreviewNote": "Забележка: Това е преглед на анализирания OPML файл. Действителното заглавие на подкаста ще бъде взето от RSS фийда.",
|
||||
"MessageOr": "или",
|
||||
"MessagePauseChapter": "Пауза на глава",
|
||||
"MessagePlayChapter": "Пусни налчалото на глава",
|
||||
"MessagePlaylistCreateFromCollection": "Създай плейлист от колекция",
|
||||
"MessagePleaseWait": "Моля изчакайте...",
|
||||
"MessagePodcastHasNoRSSFeedForMatching": "Подкастът няма URL адрес на RSS feed за използване за съпоставяне",
|
||||
"MessagePodcastSearchField": "Въведи какво да търся или RSS емисия адрес",
|
||||
"MessageQuickEmbedInProgress": "Бързото вграждане е в процес на изпълнение",
|
||||
"MessageQuickEmbedQueue": "Поставено в опашката за бързо вграждане ({0} в опашката)",
|
||||
"MessageQuickMatchAllEpisodes": "Бързо Сравняване на Всички Епизоди",
|
||||
"MessageQuickMatchDescription": "Попълни празните детайли и корици с първия резултат от '{0}'. Не презаписва детайлите, освен ако не е активирана настройката 'Предпочети съвпадащи метаданни' на сървъра.",
|
||||
"MessageRemoveChapter": "Премахни глава",
|
||||
"MessageRemoveEpisodes": "Премахни {0} епизод(и)",
|
||||
@@ -815,11 +888,52 @@
|
||||
"MessageResetChaptersConfirm": "Сигурни ли сте, че искате да нулирате главите и да отмените промените, които сте направили?",
|
||||
"MessageRestoreBackupConfirm": "Сигурни ли сте, че искате да възстановите архива създаден на",
|
||||
"MessageRestoreBackupWarning": "Възстановяването на архив ще презапише цялата база данни, намираща се в /config и кориците в /metadata/items & /metadata/authors.<br /><br />Архивите не променят файловете в папките на вашата библиотека. Ако сте активирали настройките на сървъра за съхранение на корици и метаданни в папките на вашата библиотека, те няма да бъдат архивирани или презаписани.<br /><br />Всички клиенти, използващи вашия сървър, ще бъдат автоматично обновени.",
|
||||
"MessageScheduleLibraryScanNote": "За повече потребители се препоръчва да оставят този фийчър изключен и да оставят настройката \"Автоматично преглеждане за промени в библиотеката\" включена - тя автоматично ще засече промени в папките на вашата библиотека. Включете тази настройка ако \"Автоматично преглеждане за промени в библиотеката\" не рабови на вашата файлова система (например NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Изпълни всеки {0} в {1}",
|
||||
"MessageSearchResultsFor": "Резултати от търсенето за",
|
||||
"MessageSelected": "{0} избрани",
|
||||
"MessageSeriesSequenceCannotContainSpaces": "Подредбата в серия не може да съдържа шпации.",
|
||||
"MessageServerCouldNotBeReached": "Сървърът не може да бъде достигнат",
|
||||
"MessageSetChaptersFromTracksDescription": "Задайте глави, като използвате всеки аудио файл като глава и заглавие на главата като име на аудио файла",
|
||||
"MessageShareExpirationWillBe": "Изтичането ще бъде на <strong>{0}</strong>",
|
||||
"MessageShareExpiresIn": "Изтича след {0}",
|
||||
"MessageShareURLWillBe": "URL за споделяне ще бъде <strong>{0}</strong>",
|
||||
"MessageStartPlaybackAtTime": "Започни възпроизвеждане на \"{0}\" в {1}?",
|
||||
"MessageTaskAudioFileNotWritable": "На Аудио файл \"{0}\" не може да се записва",
|
||||
"MessageTaskCanceledByUser": "Задачата е отказана от потребител",
|
||||
"MessageTaskDownloadingEpisodeDescription": "Изтегляне на епизод \"{0}\"",
|
||||
"MessageTaskEmbeddingMetadata": "Вграждане на метаданни",
|
||||
"MessageTaskEmbeddingMetadataDescription": "Вграждане на метаданни в аудиокнига \"{0}\"",
|
||||
"MessageTaskEncodingM4b": "Кодиране M4B",
|
||||
"MessageTaskEncodingM4bDescription": "Кодиране на аудиокнига \"{0}\" в единичен m4b файл",
|
||||
"MessageTaskFailed": "Неуспешно",
|
||||
"MessageTaskFailedToBackupAudioFile": "Неуспешно създаване на разервно копие на аудио файл \"{0}\"",
|
||||
"MessageTaskFailedToCreateCacheDirectory": "Неуспешно създаване на директория за кеширане",
|
||||
"MessageTaskFailedToEmbedMetadataInFile": "Неуспешно вграждане на метаданни във файл \"{0}\"",
|
||||
"MessageTaskFailedToMergeAudioFiles": "Неуспешно сливане на аудио файловете",
|
||||
"MessageTaskFailedToMoveM4bFile": "Неуспешно преместване на m4b файл",
|
||||
"MessageTaskFailedToWriteMetadataFile": "Неуспешно записване на файла за метаданни",
|
||||
"MessageTaskMatchingBooksInLibrary": "Съответстващи книги в библиотека \"{0}\"",
|
||||
"MessageTaskNoFilesToScan": "Няма файлове за сканиране",
|
||||
"MessageTaskOpmlImport": "OPML импортиране",
|
||||
"MessageTaskOpmlImportDescription": "Създаване на подкасти от {0} RSS хранилки",
|
||||
"MessageTaskOpmlImportFeed": "OPML импортиран фийд",
|
||||
"MessageTaskOpmlImportFeedDescription": "Импортиране на RSS хранилка \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedFailed": "Неуспешно взимане на подкаст фийд",
|
||||
"MessageTaskOpmlImportFeedPodcastDescription": "Създаване на подкаст \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedPodcastExists": "На този път вече съществува подкаст",
|
||||
"MessageTaskOpmlImportFeedPodcastFailed": "Неуспешно създаване на подкаст",
|
||||
"MessageTaskOpmlImportFinished": "Добавени {0} подкаста",
|
||||
"MessageTaskOpmlParseFailed": "Неуспешно анализиране на OPML файла",
|
||||
"MessageTaskOpmlParseFastFail": "Невалиден OPML файл, не беше намерен нито <opml> таг нито <outline> таг",
|
||||
"MessageTaskOpmlParseNoneFound": "Няма намерени канали във OPML файла",
|
||||
"MessageTaskScanItemsAdded": "{0} добавени",
|
||||
"MessageTaskScanItemsMissing": "{0} липсващи",
|
||||
"MessageTaskScanItemsUpdated": "{0} обновени",
|
||||
"MessageTaskScanNoChangesNeeded": "Не са нужни промени",
|
||||
"MessageTaskScanningFileChanges": "Проверка за промени във файловете в \"{0}\"",
|
||||
"MessageTaskScanningLibrary": "Сканиране на \"{0}\" библиотека",
|
||||
"MessageTaskTargetDirectoryNotWritable": "Целевата директория не е достъпна за запис",
|
||||
"MessageThinking": "Мисля...",
|
||||
"MessageUploaderItemFailed": "Неуспешно качване",
|
||||
"MessageUploaderItemSuccess": "Успешно качване!",
|
||||
@@ -837,11 +951,19 @@
|
||||
"NoteUploaderFoldersWithMediaFiles": "Папките с медийни файлове ще бъдат обработени като отделни елементи на библиотеката.",
|
||||
"NoteUploaderOnlyAudioFiles": "Ако качвате само аудио файлове, то всеки аудио файл ще бъде обработен като отделна аудиокнига.",
|
||||
"NoteUploaderUnsupportedFiles": "Неподдържаните файлове се игнорират. При избор или пускане на папка, други файлове, които не са в папка на елемент, се игнорират.",
|
||||
"NotificationOnBackupCompletedDescription": "Изпълнява се при завършване на създаване на резервно копие",
|
||||
"NotificationOnBackupFailedDescription": "Изпълнява се при неуспешено създаване на резервно копие",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Изпълнява се при автоматично изтегляне на подкаст епизод",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Изпълнява се, когато автоматичното изтегляне на епизодите е деактивирано, поради твърде много неуспешни опити",
|
||||
"NotificationOnRSSFeedFailedDescription": "Пуска се когато заявката за RSS фийд е неуспешна за автоматично сваляне на епизод",
|
||||
"PlaceholderNewCollection": "Ново име на колекцията",
|
||||
"PlaceholderNewFolderPath": "Нов път на папката",
|
||||
"PlaceholderNewPlaylist": "Ново име на плейлиста",
|
||||
"PlaceholderSearch": "Търсене...",
|
||||
"PlaceholderSearchEpisode": "Търсене на Епизоди...",
|
||||
"StatsAuthorsAdded": "добаврени автори",
|
||||
"StatsBooksAdded": "добавени книги",
|
||||
"StatsBooksFinished": "завършени книги",
|
||||
"ToastAccountUpdateSuccess": "Успешно обновяване на акаунта",
|
||||
"ToastAuthorImageRemoveSuccess": "Авторската снимка е премахната",
|
||||
"ToastAuthorUpdateMerged": "Обновяване на автора сливано",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "যোগ করুন",
|
||||
"ButtonAddApiKey": "এপিআই কী যোগ করুন",
|
||||
"ButtonAddChapters": "অধ্যায় যোগ করুন",
|
||||
"ButtonAddDevice": "ডিভাইস যোগ করুন",
|
||||
"ButtonAddLibrary": "লাইব্রেরি যোগ করুন",
|
||||
@@ -10,6 +11,8 @@
|
||||
"ButtonApplyChapters": "অধ্যায় প্রয়োগ করুন",
|
||||
"ButtonAuthors": "লেখকগণ",
|
||||
"ButtonBack": "পেছনে যান",
|
||||
"ButtonBatchEditPopulateFromExisting": "বিদ্যমান থেকে পূরণ করুন",
|
||||
"ButtonBatchEditPopulateMapDetails": "ম্যাপ থেকে পূরণ করুন",
|
||||
"ButtonBrowseForFolder": "ফোল্ডারের জন্য ব্রাউজ করুন",
|
||||
"ButtonCancel": "বাতিল করুন",
|
||||
"ButtonCancelEncode": "এনকোড বাতিল করুন",
|
||||
@@ -18,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "একটি ফোল্ডার চয়ন করুন",
|
||||
"ButtonChooseFiles": "ফাইল চয়ন করুন",
|
||||
"ButtonClearFilter": "ফিল্টার পরিষ্কার করুন",
|
||||
"ButtonClose": "বন্ধ করুন",
|
||||
"ButtonCloseFeed": "ফিড বন্ধ করুন",
|
||||
"ButtonCloseSession": "খোলা সেশন বন্ধ করুন",
|
||||
"ButtonCollections": "সংগ্রহ",
|
||||
@@ -117,11 +121,13 @@
|
||||
"HeaderAccount": "অ্যাকাউন্ট",
|
||||
"HeaderAddCustomMetadataProvider": "কাস্টম মেটাডেটা সরবরাহকারী যোগ করুন",
|
||||
"HeaderAdvanced": "অ্যাডভান্সড",
|
||||
"HeaderApiKeys": "এপিআই কী সমূহ",
|
||||
"HeaderAppriseNotificationSettings": "বিজ্ঞপ্তি সেটিংস অবহিত করুন",
|
||||
"HeaderAudioTracks": "অডিও ট্র্যাকসগুলো",
|
||||
"HeaderAudiobookTools": "অডিওবই ফাইল ম্যানেজমেন্ট টুলস",
|
||||
"HeaderAuthentication": "প্রমাণীকরণ",
|
||||
"HeaderBackups": "ব্যাকআপ",
|
||||
"HeaderBulkChapterModal": "একাধিক অধ্যায় যোগ করুন",
|
||||
"HeaderChangePassword": "পাসওয়ার্ড পরিবর্তন করুন",
|
||||
"HeaderChapters": "অধ্যায়",
|
||||
"HeaderChooseAFolder": "একটি ফোল্ডার চয়ন করুন",
|
||||
@@ -160,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "মেটাডেটা অগ্রাধিকারের ক্রম",
|
||||
"HeaderMetadataToEmbed": "এম্বেড করার জন্য মেটাডেটা",
|
||||
"HeaderNewAccount": "নতুন অ্যাকাউন্ট",
|
||||
"HeaderNewApiKey": "নতুন API কী",
|
||||
"HeaderNewLibrary": "নতুন লাইব্রেরি",
|
||||
"HeaderNotificationCreate": "বিজ্ঞপ্তি তৈরি করুন",
|
||||
"HeaderNotificationUpdate": "বিজ্ঞপ্তি আপডেট করুন",
|
||||
@@ -175,6 +182,7 @@
|
||||
"HeaderPlaylist": "প্লেলিস্ট",
|
||||
"HeaderPlaylistItems": "প্লেলিস্ট আইটেম",
|
||||
"HeaderPodcastsToAdd": "যোগ করার জন্য পডকাস্ট",
|
||||
"HeaderPresets": "প্রিসেট",
|
||||
"HeaderPreviewCover": "কভার ্দেখুন",
|
||||
"HeaderRSSFeedGeneral": "আরএসএস বিবরণ",
|
||||
"HeaderRSSFeedIsOpen": "আরএসএস ফিড খোলা আছে",
|
||||
@@ -192,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "পরীক্ষামূলক ফিচার",
|
||||
"HeaderSettingsGeneral": "সাধারণ",
|
||||
"HeaderSettingsScanner": "স্ক্যানার",
|
||||
"HeaderSettingsSecurity": "নিরাপত্তা",
|
||||
"HeaderSettingsWebClient": "ওয়েব ক্লায়েন্ট",
|
||||
"HeaderSleepTimer": "স্লিপ টাইমার",
|
||||
"HeaderStatsLargestItems": "সবচেয়ে বড় আইটেম",
|
||||
|
||||
+10
-1
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Afegeix",
|
||||
"ButtonAddApiKey": "Afegeix clau API",
|
||||
"ButtonAddChapters": "Afegeix capítols",
|
||||
"ButtonAddDevice": "Afegeix un aparell",
|
||||
"ButtonAddLibrary": "Afegeix una biblioteca",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Trieu una carpeta",
|
||||
"ButtonChooseFiles": "Trieu fitxers",
|
||||
"ButtonClearFilter": "Neteja el filtre",
|
||||
"ButtonClose": "Tanca",
|
||||
"ButtonCloseFeed": "Tanca el canal",
|
||||
"ButtonCloseSession": "Tanca la sessió oberta",
|
||||
"ButtonCollections": "Col·leccions",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Compte",
|
||||
"HeaderAddCustomMetadataProvider": "Afegeix un proveïdor de metadades personalitzat",
|
||||
"HeaderAdvanced": "Avançat",
|
||||
"HeaderApiKeys": "Claus API",
|
||||
"HeaderAppriseNotificationSettings": "Paràmetres de notificacions Apprise",
|
||||
"HeaderAudioTracks": "Pistes d'àudio",
|
||||
"HeaderAudiobookTools": "Eines de gestió de fitxers de l'audiollibre",
|
||||
"HeaderAuthentication": "Autenticació",
|
||||
"HeaderBackups": "Còpies de Seguretat",
|
||||
"HeaderBulkChapterModal": "Afegeix capítols múltiples",
|
||||
"HeaderChangePassword": "Canvia Contrasenya",
|
||||
"HeaderChapters": "Capítols",
|
||||
"HeaderChooseAFolder": "Tria una Carpeta",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Ordre de Precedència de Metadades",
|
||||
"HeaderMetadataToEmbed": "Metadades a Inserir",
|
||||
"HeaderNewAccount": "Nou Compte",
|
||||
"HeaderNewApiKey": "Nova clau API",
|
||||
"HeaderNewLibrary": "Nova Biblioteca",
|
||||
"HeaderNotificationCreate": "Crea Notificació",
|
||||
"HeaderNotificationUpdate": "Actualització de Notificació",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Funcionalitats experimentals",
|
||||
"HeaderSettingsGeneral": "Generals",
|
||||
"HeaderSettingsScanner": "Escàner",
|
||||
"HeaderSettingsSecurity": "Seguretat",
|
||||
"HeaderSettingsWebClient": "Client web",
|
||||
"HeaderSleepTimer": "Temporitzador de son",
|
||||
"HeaderStatsLargestItems": "Elements més grans",
|
||||
@@ -417,6 +423,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Sense {0}",
|
||||
"LabelLibraryItem": "Element de Biblioteca",
|
||||
"LabelLibraryName": "Nom de Biblioteca",
|
||||
"LabelLibrarySortByProgress": "Progrés: Última actualització",
|
||||
"LabelLibrarySortByProgressFinished": "Progrés: Finalitzat",
|
||||
"LabelLibrarySortByProgressStarted": "Progrés: Començat",
|
||||
"LabelLimit": "Límits",
|
||||
"LabelLineSpacing": "Interlineat",
|
||||
"LabelListenAgain": "Escoltar de nou",
|
||||
@@ -439,7 +448,7 @@
|
||||
"LabelMetadataProvider": "Proveïdor de metadades",
|
||||
"LabelMinute": "Minut",
|
||||
"LabelMinutes": "Minuts",
|
||||
"LabelMissing": "Absent",
|
||||
"LabelMissing": "Falta",
|
||||
"LabelMissingEbook": "No té llibre electrònic",
|
||||
"LabelMissingSupplementaryEbook": "No té ebook complementari",
|
||||
"LabelMobileRedirectURIs": "URI de redirecció mòbil permeses",
|
||||
|
||||
+72
-16
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Přidat",
|
||||
"ButtonAddApiKey": "Přidat API klíč",
|
||||
"ButtonAddChapters": "Přidat kapitoly",
|
||||
"ButtonAddDevice": "Přidat zařízení",
|
||||
"ButtonAddLibrary": "Přidat knihovnu",
|
||||
@@ -10,7 +11,7 @@
|
||||
"ButtonApplyChapters": "Aplikovat kapitoly",
|
||||
"ButtonAuthors": "Autoři",
|
||||
"ButtonBack": "Zpět",
|
||||
"ButtonBatchEditPopulateFromExisting": "Vytvořit z existujících",
|
||||
"ButtonBatchEditPopulateFromExisting": "Předvyplnit z existujících",
|
||||
"ButtonBatchEditPopulateMapDetails": "Předvyplnit podrobnosti mapování",
|
||||
"ButtonBrowseForFolder": "Vyhledat složku",
|
||||
"ButtonCancel": "Zrušit",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Vybrat složku",
|
||||
"ButtonChooseFiles": "Vybrat soubory",
|
||||
"ButtonClearFilter": "Vymazat filtr",
|
||||
"ButtonClose": "Zavřít",
|
||||
"ButtonCloseFeed": "Zavřít kanál",
|
||||
"ButtonCloseSession": "Zavřít otevřenou relaci",
|
||||
"ButtonCollections": "Kolekce",
|
||||
@@ -59,7 +61,7 @@
|
||||
"ButtonPause": "Pozastavit",
|
||||
"ButtonPlay": "Přehrát",
|
||||
"ButtonPlayAll": "Přehrát vše",
|
||||
"ButtonPlaying": "Hraje",
|
||||
"ButtonPlaying": "Přehrává",
|
||||
"ButtonPlaylists": "Seznamy skladeb",
|
||||
"ButtonPrevious": "Předchozí",
|
||||
"ButtonPreviousChapter": "Předchozí Kapitola",
|
||||
@@ -69,7 +71,7 @@
|
||||
"ButtonQueueAddItem": "Přidat do fronty",
|
||||
"ButtonQueueRemoveItem": "Odstranit z fronty",
|
||||
"ButtonQuickEmbed": "Rychle Zapsat",
|
||||
"ButtonQuickEmbedMetadata": "Rychle zapsat Metadata",
|
||||
"ButtonQuickEmbedMetadata": "Rychle Vložit Metadata",
|
||||
"ButtonQuickMatch": "Rychlé přiřazení",
|
||||
"ButtonReScan": "Znovu prohledat",
|
||||
"ButtonRead": "Číst",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Účet",
|
||||
"HeaderAddCustomMetadataProvider": "Přidat vlastního poskytovatele metadat",
|
||||
"HeaderAdvanced": "Pokročilé",
|
||||
"HeaderApiKeys": "API klíče",
|
||||
"HeaderAppriseNotificationSettings": "Nastavení oznámení Apprise",
|
||||
"HeaderAudioTracks": "Zvukové stopy",
|
||||
"HeaderAudiobookTools": "Nástroje pro správu souborů audioknih",
|
||||
"HeaderAuthentication": "Autentizace",
|
||||
"HeaderBackups": "Zálohy",
|
||||
"HeaderBulkChapterModal": "Přidat více kapitol",
|
||||
"HeaderChangePassword": "Změnit heslo",
|
||||
"HeaderChapters": "Kapitoly",
|
||||
"HeaderChooseAFolder": "Zvolte složku",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Pořadí priorit metadat",
|
||||
"HeaderMetadataToEmbed": "Metadata k vložení",
|
||||
"HeaderNewAccount": "Nový účet",
|
||||
"HeaderNewApiKey": "Nový API klíč",
|
||||
"HeaderNewLibrary": "Nová knihovna",
|
||||
"HeaderNotificationCreate": "Vytvořit notifikaci",
|
||||
"HeaderNotificationUpdate": "Aktualizovat notifikaci",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Experimentální funkce",
|
||||
"HeaderSettingsGeneral": "Obecné",
|
||||
"HeaderSettingsScanner": "Skener",
|
||||
"HeaderSettingsSecurity": "Zabezpečení",
|
||||
"HeaderSettingsWebClient": "Webový klient",
|
||||
"HeaderSleepTimer": "Časovač vypnutí",
|
||||
"HeaderStatsLargestItems": "Největší položky",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Obsah",
|
||||
"HeaderTools": "Nástroje",
|
||||
"HeaderUpdateAccount": "Aktualizovat účet",
|
||||
"HeaderUpdateApiKey": "Aktualizovat API klíč",
|
||||
"HeaderUpdateAuthor": "Aktualizovat autora",
|
||||
"HeaderUpdateDetails": "Aktualizovat podrobnosti",
|
||||
"HeaderUpdateLibrary": "Aktualizovat knihovnu",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Všichni uživatelé kromě hostů",
|
||||
"LabelAllUsersIncludingGuests": "Všichni uživatelé včetně hostů",
|
||||
"LabelAlreadyInYourLibrary": "Již ve vaší knihovně",
|
||||
"LabelApiKeyCreated": "API klíč \"{0}\" byl úspěšně vytvořen.",
|
||||
"LabelApiKeyCreatedDescription": "Zkopírujte si API klíč nyní, později již nebude možné jej zobrazit.",
|
||||
"LabelApiKeyUser": "Vydávat se za uživatele",
|
||||
"LabelApiKeyUserDescription": "Tento API klíč bude mít stejná oprávnění jako uživatel za něhož vystupuje. V protokolech to bude vypadat jako kdyby požadavky vytvářel přímo daný uživatel.",
|
||||
"LabelApiToken": "API Token",
|
||||
"LabelAppend": "Připojit",
|
||||
"LabelAudioBitrate": "Bitový tok zvuku (např. 128k)",
|
||||
@@ -284,6 +295,7 @@
|
||||
"LabelContinueListening": "Pokračovat v poslechu",
|
||||
"LabelContinueReading": "Pokračovat ve čtení",
|
||||
"LabelContinueSeries": "Pokračovat v sérii",
|
||||
"LabelCorsAllowed": "Povolené CORS Origins",
|
||||
"LabelCover": "Obálka",
|
||||
"LabelCoverImageURL": "URL obrázku obálky",
|
||||
"LabelCoverProvider": "Poskytovatel obálky",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Smazat ze souborového systému (zrušte zaškrtnutí pro odstranění pouze z databáze)",
|
||||
"LabelDescription": "Popis",
|
||||
"LabelDeselectAll": "Odznačit vše",
|
||||
"LabelDetectedPattern": "Detekovaný vzor:",
|
||||
"LabelDevice": "Zařízení",
|
||||
"LabelDeviceInfo": "Informace o zařízení",
|
||||
"LabelDeviceIsAvailableTo": "Zařízení je dostupné pro...",
|
||||
@@ -346,11 +359,15 @@
|
||||
"LabelExample": "Příklad",
|
||||
"LabelExpandSeries": "Rozbalit série",
|
||||
"LabelExpandSubSeries": "Rozbalit podsérie",
|
||||
"LabelExpired": "Expirovaný",
|
||||
"LabelExpiresAt": "Expiruje v",
|
||||
"LabelExpiresInSeconds": "Expiruje za (sekundy)",
|
||||
"LabelExpiresNever": "Nikdy",
|
||||
"LabelExplicit": "Explicitní",
|
||||
"LabelExplicitChecked": "Explicitní (zaškrtnuto)",
|
||||
"LabelExplicitUnchecked": "Není explicitní (nezaškrtnuto)",
|
||||
"LabelExportOPML": "Export OPML",
|
||||
"LabelFeedURL": "URL zdroje",
|
||||
"LabelFeedURL": "URL kanálu",
|
||||
"LabelFetchingMetadata": "Získávání metadat",
|
||||
"LabelFile": "Soubor",
|
||||
"LabelFileBirthtime": "Čas vzniku souboru",
|
||||
@@ -361,21 +378,22 @@
|
||||
"LabelFilterByUser": "Filtrovat podle uživatele",
|
||||
"LabelFindEpisodes": "Najít epizody",
|
||||
"LabelFinished": "Dokončeno",
|
||||
"LabelFinishedDate": "Dokončeno {0}",
|
||||
"LabelFolder": "Složka",
|
||||
"LabelFolders": "Složky",
|
||||
"LabelFontBold": "Tučně",
|
||||
"LabelFontBoldness": "Výraznost písma",
|
||||
"LabelFontFamily": "Rodina písem",
|
||||
"LabelFontItalic": "Kurzíva",
|
||||
"LabelFontScale": "Měřítko písma",
|
||||
"LabelFontScale": "Velikost písma",
|
||||
"LabelFontStrikethrough": "Přeškrtnutí",
|
||||
"LabelFormat": "Formát",
|
||||
"LabelFull": "Plné",
|
||||
"LabelGenre": "Žánr",
|
||||
"LabelGenres": "Žánry",
|
||||
"LabelHardDeleteFile": "Trvale smazat soubor",
|
||||
"LabelHasEbook": "Obsahuje elektronickou knihu",
|
||||
"LabelHasSupplementaryEbook": "Obsahuje doplňkovou elektronickou knihu",
|
||||
"LabelHasEbook": "Má e-knihu",
|
||||
"LabelHasSupplementaryEbook": "Obsahuje doplňkovou e-knihu",
|
||||
"LabelHideSubtitles": "Skrýt titulky",
|
||||
"LabelHighestPriority": "Nejvyšší priorita",
|
||||
"LabelHost": "Hostitel",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "Jazyky",
|
||||
"LabelLastBookAdded": "Poslední kniha přidána",
|
||||
"LabelLastBookUpdated": "Poslední kniha aktualizována",
|
||||
"LabelLastProgressDate": "Poslední pokrok: {0}",
|
||||
"LabelLastSeen": "Naposledy viděno",
|
||||
"LabelLastTime": "Naposledy",
|
||||
"LabelLastUpdate": "Poslední aktualizace",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Žádné {0}",
|
||||
"LabelLibraryItem": "Položka knihovny",
|
||||
"LabelLibraryName": "Název knihovny",
|
||||
"LabelLibrarySortByProgress": "Pokrok: naposledy aktualizováno",
|
||||
"LabelLibrarySortByProgressFinished": "Pokrok: dokončeno",
|
||||
"LabelLibrarySortByProgressStarted": "Pokrok: začato",
|
||||
"LabelLimit": "Omezit",
|
||||
"LabelLineSpacing": "Řádkování",
|
||||
"LabelListenAgain": "Poslouchat znovu",
|
||||
@@ -425,10 +447,11 @@
|
||||
"LabelLogLevelWarn": "Varovat",
|
||||
"LabelLookForNewEpisodesAfterDate": "Hledat nové epizody po tomto datu",
|
||||
"LabelLowestPriority": "Nejnižší priorita",
|
||||
"LabelMatchConfidence": "Jistota",
|
||||
"LabelMatchExistingUsersBy": "Přiřadit stávající uživatele podle",
|
||||
"LabelMatchExistingUsersByDescription": "Slouží k propojení stávajících uživatelů. Po propojení budou uživatelé přiřazeni k jedinečnému ID od poskytovatele SSO",
|
||||
"LabelMaxEpisodesToDownload": "Maximální # epizod pro stažení. Použijte 0 pro bez omezení.",
|
||||
"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í",
|
||||
"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í",
|
||||
@@ -454,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Nejnovější autoři",
|
||||
"LabelNewestEpisodes": "Nejnovější epizody",
|
||||
"LabelNextBackupDate": "Datum příští zálohy",
|
||||
"LabelNextChapters": "Další kapitola bude:",
|
||||
"LabelNextScheduledRun": "Další naplánované spuštění",
|
||||
"LabelNoApiKeys": "Žádné API klíče",
|
||||
"LabelNoCustomMetadataProviders": "Žádní vlastní poskytovatelé metadat",
|
||||
"LabelNoEpisodesSelected": "Nebyly vybrány žádné epizody",
|
||||
"LabelNotFinished": "Nedokončeno",
|
||||
@@ -470,6 +495,7 @@
|
||||
"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í.",
|
||||
"LabelNumberOfBooks": "Počet knih",
|
||||
"LabelNumberOfChapters": "Počet kapitol:",
|
||||
"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:",
|
||||
"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\".",
|
||||
@@ -544,6 +570,7 @@
|
||||
"LabelSelectAll": "Vybrat vše",
|
||||
"LabelSelectAllEpisodes": "Vybrat všechny epizody",
|
||||
"LabelSelectEpisodesShowing": "Vyberte {0} epizody, které se zobrazují",
|
||||
"LabelSelectUser": "Vybrat uživatele",
|
||||
"LabelSelectUsers": "Vybrat uživatele",
|
||||
"LabelSendEbookToDevice": "Odeslat e-knihu do...",
|
||||
"LabelSequence": "Sekvence",
|
||||
@@ -562,7 +589,7 @@
|
||||
"LabelSettingsChromecastSupport": "Podpora Chromecastu",
|
||||
"LabelSettingsDateFormat": "Formát data",
|
||||
"LabelSettingsEnableWatcher": "Automaticky skenovat změny v knihovnách",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automaticky skenovat změny v knihovně",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automaticky sledovat změny v knihovně",
|
||||
"LabelSettingsEnableWatcherHelp": "Povoluje automatické přidávání/aktualizaci položek, když jsou zjištěny změny souborů. *Vyžaduje restart serveru",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Povolení skriptovaného obsahu v epubu",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Povolení spouštění skriptů v souborech epub. Doporučujeme toto nastavení vypnout, pokud nedůvěřujete zdroji souborů epub.",
|
||||
@@ -611,6 +638,7 @@
|
||||
"LabelStartTime": "Čas Spuštění",
|
||||
"LabelStarted": "Spuštěno",
|
||||
"LabelStartedAt": "Spuštěno v",
|
||||
"LabelStartedDate": "Spuštěno {0}",
|
||||
"LabelStatsAudioTracks": "Zvukové stopy",
|
||||
"LabelStatsAuthors": "Autoři",
|
||||
"LabelStatsBestDay": "Nejlepší den",
|
||||
@@ -640,6 +668,7 @@
|
||||
"LabelTheme": "Téma",
|
||||
"LabelThemeDark": "Tmavé",
|
||||
"LabelThemeLight": "Světlé",
|
||||
"LabelThemeSepia": "Hnědé",
|
||||
"LabelTimeBase": "Časová základna",
|
||||
"LabelTimeDurationXHours": "{0} hodin",
|
||||
"LabelTimeDurationXMinutes": "{0} minut",
|
||||
@@ -708,7 +737,9 @@
|
||||
"MessageAddToPlayerQueue": "Přidat do fronty přehrávače",
|
||||
"MessageAppriseDescription": "Abyste mohli používat tuto funkci, musíte mít spuštěnou instanci <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> nebo API, které bude zpracovávat stejné požadavky. <br />Adresa URL API Apprise by měla být úplná URL cesta pro odeslání oznámení, např. pokud je vaše instance API obsluhována na adrese <code>http://192.168.1.1:8337</code> pak byste měli zadat <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Ujistěte se, že používáte ASIN ze správného regionu Audible a ne z Amazonu.",
|
||||
"MessageAuthenticationLegacyTokenWarning": "Zastaralé API tokeny budou v budoucnu odstraněny. Použijte místo nich <a href=\"/config/api-keys\">API klíče</a>.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Po uložení restartujte server, aby se změny OIDC použily.",
|
||||
"MessageAuthenticationSecurityMessage": "Bezpečnost autentizace byla vylepšena. Všichni uživatelé se musí znovu přihlásit.",
|
||||
"MessageBackupsDescription": "Zálohy zahrnují uživatele, průběh uživatele, podrobnosti o položkách knihovny, nastavení serveru a obrázky uložené v <code>/metadata/items</code> a <code>/metadata/authors</code>. Zálohy <strong>ne</strong> zahrnují všechny soubory uložené ve složkách knihovny.",
|
||||
"MessageBackupsLocationEditNote": "Poznámka: Změna umístění záloh nepřesune ani nezmění existující zálohy",
|
||||
"MessageBackupsLocationNoEditNote": "Poznámka: Umístění záloh je nastavené z proměnných prostředí a nelze zde změnit.",
|
||||
@@ -722,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Filtr \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Žádné výsledky pro dotaz",
|
||||
"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",
|
||||
"MessageChapterErrorFirstNotZero": "První kapitola musí začínat na 0",
|
||||
"MessageChapterErrorStartGteDuration": "Neplatný čas začátku, musí být kratší než doba trvání audioknihy",
|
||||
@@ -730,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Kapitoly nenalezeny",
|
||||
"MessageCheckingCron": "Kontrola cronu...",
|
||||
"MessageConfirmCloseFeed": "Opravdu chcete zavřít tento kanál?",
|
||||
"MessageConfirmDeleteApiKey": "Opravdu chcete vymazat API klíč \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Opravdu chcete smazat zálohu pro {0}?",
|
||||
"MessageConfirmDeleteDevice": "Opravdu chcete vymazat zařízení e-reader \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Tento krok smaže soubor ze souborového systému. Jsi si jisti?",
|
||||
@@ -747,7 +780,7 @@
|
||||
"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é?",
|
||||
"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?",
|
||||
"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?",
|
||||
@@ -757,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Opravdu chcete odstranit autora \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Opravdu chcete odstranit kolekci \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Opravdu chcete odstranit epizodu \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Poznámka: Tím se zvukový soubor neodstraní, pokud nepřepnete volbu “Tvrdé odstranění souboru“",
|
||||
"MessageConfirmRemoveEpisodes": "Opravdu chcete odstranit {0} epizody?",
|
||||
"MessageConfirmRemoveListeningSessions": "Opravdu chcete odebrat {0} poslechových relací?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Jste si jisti, že chcete odstranit všechny metadata.{0} soubory ve složkách s položkami ve vaší knihovně?",
|
||||
@@ -782,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "URL zdroje bude {0}",
|
||||
"MessageFetching": "Načítání...",
|
||||
"MessageForceReScanDescription": "znovu prohledá všechny soubory jako při novém skenování. ID3 tagy zvukových souborů OPF soubory a textové soubory budou skenovány jako nové.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} poslechnuto</strong> na {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Žádné relace poslouchání na {0}",
|
||||
"MessageImportantNotice": "Důležité upozornění!",
|
||||
"MessageInsertChapterBelow": "Vložit kapitolu níže",
|
||||
"MessageInvalidAsin": "Neplatný ASIN",
|
||||
@@ -818,7 +854,7 @@
|
||||
"MessageNoItems": "Žádné položky",
|
||||
"MessageNoItemsFound": "Nebyly nalezeny žádné položky",
|
||||
"MessageNoListeningSessions": "Žádné poslechové relace",
|
||||
"MessageNoLogs": "Žádné logy",
|
||||
"MessageNoLogs": "Žádné záznamy událostí",
|
||||
"MessageNoMediaProgress": "Žádný průběh médií",
|
||||
"MessageNoNotifications": "Žádná oznámení",
|
||||
"MessageNoPodcastFeed": "Neplatný podcast: Žádný kanál",
|
||||
@@ -848,7 +884,7 @@
|
||||
"MessageRemoveEpisodes": "Odstranit {0} epizodu",
|
||||
"MessageRemoveFromPlayerQueue": "Odstranit z fronty přehrávače",
|
||||
"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?",
|
||||
"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.",
|
||||
@@ -881,7 +917,7 @@
|
||||
"MessageTaskNoFilesToScan": "Žádné soubory k prohledání",
|
||||
"MessageTaskOpmlImport": "Import OPML",
|
||||
"MessageTaskOpmlImportDescription": "Vytváření podcastů z {0} RSS feedů",
|
||||
"MessageTaskOpmlImportFeed": "Importní zdroj OPML",
|
||||
"MessageTaskOpmlImportFeed": "Import OPML feedu",
|
||||
"MessageTaskOpmlImportFeedDescription": "Importování RSS feedu \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedFailed": "Nepodařilo se získat kanál podcastu",
|
||||
"MessageTaskOpmlImportFeedPodcastDescription": "Vytváření podcastu \"{0}\"",
|
||||
@@ -921,6 +957,7 @@
|
||||
"NotificationOnRSSFeedDisabledDescription": "Aktivováno když je automatické stahování pozastaveno z důvodu příliš mnoho neůspěšných pokusů",
|
||||
"NotificationOnRSSFeedFailedDescription": "Aktivováno když selže RSS kanál pro stahování epizod",
|
||||
"NotificationOnTestDescription": "Akce pro otestování upozorňovacího systému",
|
||||
"PlaceholderBulkChapterInput": "Zadejte název kapitoly nebo použije číslování (např. 'Epizoda 1', 'Kapitola 10', '1.')",
|
||||
"PlaceholderNewCollection": "Nový název kolekce",
|
||||
"PlaceholderNewFolderPath": "Nová cesta ke složce",
|
||||
"PlaceholderNewPlaylist": "Nový název seznamu přehrávání",
|
||||
@@ -974,8 +1011,12 @@
|
||||
"ToastBookmarkCreateFailed": "Vytvoření záložky se nezdařilo",
|
||||
"ToastBookmarkCreateSuccess": "Přidána záložka",
|
||||
"ToastBookmarkRemoveSuccess": "Záložka odstraněna",
|
||||
"ToastBulkChapterInvalidCount": "Zadejte číslo mezi 1 a 150",
|
||||
"ToastCachePurgeFailed": "Nepodařilo se vyčistit mezipaměť",
|
||||
"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",
|
||||
"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.",
|
||||
@@ -985,6 +1026,8 @@
|
||||
"ToastCollectionItemsAddFailed": "Přidávání položek do kolekce selhalo",
|
||||
"ToastCollectionRemoveSuccess": "Kolekce odstraněna",
|
||||
"ToastCollectionUpdateSuccess": "Kolekce aktualizována",
|
||||
"ToastConnectionNotAvailable": "Připojení není k dispozici. Zkuste to prosím znovu později",
|
||||
"ToastCoverSearchFailed": "Hledání obálky se nezdařilo",
|
||||
"ToastCoverUpdateFailed": "Aktualizace obálky selhala",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Datum a čas jsou chybné nebo nekompletní",
|
||||
"ToastDeleteFileFailed": "Nepodařilo se smazat soubor",
|
||||
@@ -994,12 +1037,14 @@
|
||||
"ToastDeviceTestEmailFailed": "Odeslání testovacího emailu selhalo",
|
||||
"ToastDeviceTestEmailSuccess": "Testovací email byl odeslán",
|
||||
"ToastEmailSettingsUpdateSuccess": "Nastavení emailu aktualizována",
|
||||
"ToastEncodeCancelFailed": "Chyba zrušení kódování",
|
||||
"ToastEncodeCancelFailed": "Zrušení encodování selhalo",
|
||||
"ToastEncodeCancelSucces": "Kódování zrušeno",
|
||||
"ToastEpisodeDownloadQueueClearFailed": "Vyčištění fronty selhalo",
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Fronta stahování epizod je prázdná",
|
||||
"ToastEpisodeUpdateSuccess": "{0} epizod aktualizováno",
|
||||
"ToastErrorCannotShare": "Na tomto zařízení nelze nativně sdílet",
|
||||
"ToastFailedToCreate": "Nepodařilo se vytvořit",
|
||||
"ToastFailedToDelete": "Nepodařilo se odstranit",
|
||||
"ToastFailedToLoadData": "Nepodařilo se načíst data",
|
||||
"ToastFailedToMatch": "Nepodařilo se spárovat",
|
||||
"ToastFailedToShare": "Sdílení selhalo",
|
||||
@@ -1007,6 +1052,7 @@
|
||||
"ToastInvalidImageUrl": "Neplatná URL obrázku",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Neplatný maximální počet epizod ke stažení",
|
||||
"ToastInvalidUrl": "Neplatná URL",
|
||||
"ToastInvalidUrls": "Alespoň jedna URL je neplatná",
|
||||
"ToastItemCoverUpdateSuccess": "Obálka předmětu byl aktualizována",
|
||||
"ToastItemDeletedFailed": "Smazání položky selhalo",
|
||||
"ToastItemDeletedSuccess": "Položka smazána",
|
||||
@@ -1031,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Musí mít minimálně jednu cestu",
|
||||
"ToastNameEmailRequired": "Jméno a email jsou vyžadovány",
|
||||
"ToastNameRequired": "Jméno je vyžadováno",
|
||||
"ToastNewApiKeyUserError": "Je nutné vybrat uživatele",
|
||||
"ToastNewEpisodesFound": "{0} nových epizod bylo nalezeno",
|
||||
"ToastNewUserCreatedFailed": "Chyba při vytváření účtu: \"{0}\"",
|
||||
"ToastNewUserCreatedSuccess": "Vytvořen nový účet",
|
||||
@@ -1055,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Seznam přehrávání aktualizován",
|
||||
"ToastPodcastCreateFailed": "Vytvoření podcastu se nezdařilo",
|
||||
"ToastPodcastCreateSuccess": "Podcast byl úspěšně vytvořen",
|
||||
"ToastPodcastEpisodeUpdated": "Epizoda aktualizována",
|
||||
"ToastPodcastGetFeedFailed": "Chyba při získání podcastového feedu",
|
||||
"ToastPodcastNoEpisodesInFeed": "Žádné epizody nenalezeny v RSS feedu",
|
||||
"ToastPodcastNoRssFeed": "Podcast nemá RSS feed",
|
||||
@@ -1087,7 +1135,7 @@
|
||||
"ToastSessionDeleteFailed": "Nepodařilo se smazat relaci",
|
||||
"ToastSessionDeleteSuccess": "Relace smazána",
|
||||
"ToastSleepTimerDone": "Uspání knížky ... zZzzZz",
|
||||
"ToastSlugMustChange": "Slug (URL) obsahuje chybné znaky",
|
||||
"ToastSlugMustChange": "Slug obsahuje chybné znaky",
|
||||
"ToastSlugRequired": "Slug (URL) je vyžadována",
|
||||
"ToastSocketConnected": "Socket připojen",
|
||||
"ToastSocketDisconnected": "Socket odpojen",
|
||||
@@ -1105,5 +1153,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Heslo bylo změněno úspěšně",
|
||||
"ToastUserPasswordMismatch": "Hesla se neschodují",
|
||||
"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)"
|
||||
}
|
||||
|
||||
+90
-32
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Tilføj",
|
||||
"ButtonAddApiKey": "Tilføj API-nøgle",
|
||||
"ButtonAddChapters": "Tilføj kapitler",
|
||||
"ButtonAddDevice": "Tilføj enhed",
|
||||
"ButtonAddLibrary": "Tilføj Bibliotek",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Vælg en mappe",
|
||||
"ButtonChooseFiles": "Vælg filer",
|
||||
"ButtonClearFilter": "Ryd filter",
|
||||
"ButtonClose": "Luk",
|
||||
"ButtonCloseFeed": "Luk feed",
|
||||
"ButtonCloseSession": "Luk Åben Session",
|
||||
"ButtonCollections": "Samlinger",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Konto",
|
||||
"HeaderAddCustomMetadataProvider": "Tilføj Brugerdefineret Metadataudbyder",
|
||||
"HeaderAdvanced": "Avanceret",
|
||||
"HeaderApiKeys": "API-nøgler",
|
||||
"HeaderAppriseNotificationSettings": "Apprise Notifikationsindstillinger",
|
||||
"HeaderAudioTracks": "Lydspor",
|
||||
"HeaderAudiobookTools": "Audiobog Filhåndteringsværktøjer",
|
||||
"HeaderAuthentication": "Autentificering",
|
||||
"HeaderBackups": "Sikkerhedskopier",
|
||||
"HeaderBulkChapterModal": "Tilføj flere kapitler",
|
||||
"HeaderChangePassword": "Skift Adgangskode",
|
||||
"HeaderChapters": "Kapitler",
|
||||
"HeaderChooseAFolder": "Vælg en Mappe",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Metadata-prioritet",
|
||||
"HeaderMetadataToEmbed": "Metadata til indlejring",
|
||||
"HeaderNewAccount": "Ny Konto",
|
||||
"HeaderNewApiKey": "Ny API-nøgle",
|
||||
"HeaderNewLibrary": "Nyt Bibliotek",
|
||||
"HeaderNotificationCreate": "Opret Notifikation",
|
||||
"HeaderNotificationUpdate": "Updater Notifikation",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Eksperimentelle Funktioner",
|
||||
"HeaderSettingsGeneral": "Generelt",
|
||||
"HeaderSettingsScanner": "Scanner",
|
||||
"HeaderSettingsSecurity": "Sikkerhed",
|
||||
"HeaderSettingsWebClient": "Webklient",
|
||||
"HeaderSleepTimer": "Søvntimer",
|
||||
"HeaderStatsLargestItems": "Største Elementer",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Indholdsfortegnelse",
|
||||
"HeaderTools": "Værktøjer",
|
||||
"HeaderUpdateAccount": "Opdater Konto",
|
||||
"HeaderUpdateApiKey": "Opdater API-nøgle",
|
||||
"HeaderUpdateAuthor": "Opdater Forfatter",
|
||||
"HeaderUpdateDetails": "Opdater Detaljer",
|
||||
"HeaderUpdateLibrary": "Opdater Bibliotek",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Alle bruger eksklusiv gæster",
|
||||
"LabelAllUsersIncludingGuests": "Alle bruger inklusiv gæster",
|
||||
"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",
|
||||
"LabelAppend": "Tilføj",
|
||||
"LabelAudioBitrate": "Lydbitrate (f.eks. 128k)",
|
||||
@@ -264,7 +275,7 @@
|
||||
"LabelBonus": "Bonus",
|
||||
"LabelBooks": "Bøger",
|
||||
"LabelButtonText": "Knap tekst",
|
||||
"LabelByAuthor": "af {0}",
|
||||
"LabelByAuthor": "Efter Forfatter",
|
||||
"LabelChangePassword": "Ændre Adgangskode",
|
||||
"LabelChannels": "Kanaler",
|
||||
"LabelChapterCount": "{0} Kapitler",
|
||||
@@ -284,10 +295,11 @@
|
||||
"LabelContinueListening": "Fortsæt med at lytte",
|
||||
"LabelContinueReading": "Fortsæt med at læse",
|
||||
"LabelContinueSeries": "Fortsæt Serien",
|
||||
"LabelCorsAllowed": "Tilladte CORS-oprindelser",
|
||||
"LabelCover": "Omslag",
|
||||
"LabelCoverImageURL": "Omslagsbillede URL",
|
||||
"LabelCoverProvider": "Cover billede udbyder",
|
||||
"LabelCreatedAt": "Oprettet Kl.",
|
||||
"LabelCreatedAt": "Oprettet d.",
|
||||
"LabelCronExpression": "Cron Udtryk",
|
||||
"LabelCurrent": "Aktuel",
|
||||
"LabelCurrently": "Aktuelt:",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Slet fra filsystem (afmarker kun for at fjerne fra databasen)",
|
||||
"LabelDescription": "Beskrivelse",
|
||||
"LabelDeselectAll": "Fravælg Alle",
|
||||
"LabelDetectedPattern": "Identificeret mønster:",
|
||||
"LabelDevice": "Enheds",
|
||||
"LabelDeviceInfo": "Enhedsinformation",
|
||||
"LabelDeviceIsAvailableTo": "Enhed er tilgængelig for...",
|
||||
@@ -346,6 +359,10 @@
|
||||
"LabelExample": "Eksempel",
|
||||
"LabelExpandSeries": "Udfold serie",
|
||||
"LabelExpandSubSeries": "Udfold underserie",
|
||||
"LabelExpired": "Udløbet",
|
||||
"LabelExpiresAt": "Udløbsdato",
|
||||
"LabelExpiresInSeconds": "Udløber om (seconds)",
|
||||
"LabelExpiresNever": "Aldrig",
|
||||
"LabelExplicit": "Eksplisit",
|
||||
"LabelExplicitChecked": "Eksplicit (markeret)",
|
||||
"LabelExplicitUnchecked": "Ikke eksplicit (ikke markeret)",
|
||||
@@ -361,11 +378,12 @@
|
||||
"LabelFilterByUser": "Filtrér efter bruger",
|
||||
"LabelFindEpisodes": "Find episoder",
|
||||
"LabelFinished": "Færdig",
|
||||
"LabelFinishedDate": "Færdig {0}",
|
||||
"LabelFolder": "Mappe",
|
||||
"LabelFolders": "Mapper",
|
||||
"LabelFontBold": "Fed",
|
||||
"LabelFontBoldness": "Skrift tykkelse",
|
||||
"LabelFontFamily": "Fontfamilie",
|
||||
"LabelFontFamily": "Skrifttypefamilie",
|
||||
"LabelFontItalic": "Kursiv",
|
||||
"LabelFontScale": "Skriftstørrelse",
|
||||
"LabelFontStrikethrough": "Gennemstreget",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "Sprog",
|
||||
"LabelLastBookAdded": "Senest tilføjede bog",
|
||||
"LabelLastBookUpdated": "Senest opdaterede bog",
|
||||
"LabelLastProgressDate": "Sidste fremgang: {0}",
|
||||
"LabelLastSeen": "Sidst set",
|
||||
"LabelLastTime": "Sidste gang",
|
||||
"LabelLastUpdate": "Seneste opdatering",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Nej {0}",
|
||||
"LabelLibraryItem": "Bibliotekselement",
|
||||
"LabelLibraryName": "Biblioteksnavn",
|
||||
"LabelLibrarySortByProgress": "Fremgang: Sidst opdateret",
|
||||
"LabelLibrarySortByProgressFinished": "Fremgang: Afsluttet",
|
||||
"LabelLibrarySortByProgressStarted": "Fremgang: Startet",
|
||||
"LabelLimit": "Grænse",
|
||||
"LabelLineSpacing": "Linjeafstand",
|
||||
"LabelListenAgain": "Lyt igen",
|
||||
@@ -425,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Advarsel",
|
||||
"LabelLookForNewEpisodesAfterDate": "Søg efter nye episoder efter denne dato",
|
||||
"LabelLowestPriority": "Laveste prioritet",
|
||||
"LabelMatchConfidence": "Confidens",
|
||||
"LabelMatchExistingUsersBy": "Match eksisterende brugere ved",
|
||||
"LabelMatchExistingUsersByDescription": "Anvendt for at forbinde brugere. Når forbundet, brugere vil blive matchet ved unikt id fra din SSO udbyder",
|
||||
"LabelMaxEpisodesToDownload": "Max # afsnit for at downloade. Anvend 0 for ubegrænset.",
|
||||
@@ -454,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Nyeste forfattere",
|
||||
"LabelNewestEpisodes": "Nyeste episoder",
|
||||
"LabelNextBackupDate": "Næste sikkerhedskopi dato",
|
||||
"LabelNextChapters": "Næste kapitler vil være:",
|
||||
"LabelNextScheduledRun": "Næste planlagte kørsel",
|
||||
"LabelNoApiKeys": "Ingen API-nøgler",
|
||||
"LabelNoCustomMetadataProviders": "Ingen brugerdefinerede metadata udbydere",
|
||||
"LabelNoEpisodesSelected": "Ingen episoder valgt",
|
||||
"LabelNotFinished": "Ikke færdig",
|
||||
@@ -470,6 +495,7 @@
|
||||
"LabelNotificationsMaxQueueSize": "Maksimal køstørrelse for meddelelseshændelser",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Hændelser begrænses til at udløse en gang pr. sekund. Hændelser ignoreres, hvis køen er fyldt. Dette forhindrer meddelelsesspam.",
|
||||
"LabelNumberOfBooks": "Antal bøger",
|
||||
"LabelNumberOfChapters": "Antal kapitler:",
|
||||
"LabelNumberOfEpisodes": "# afsnit",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Navnet af OpenID claimet som indeholder avancerede brugerhandlinger inden i applikationen som vil gælde for ikke administrative roller (<b>hvis konfigureret</b>). Hvis et claim mangler fra svaret vil adgang til ABS blive nægtet. Hvis en enkelt indstilling/option mangler, vil det bliver behandlet som <code>false</code>. Sørg for at identity provider's claim matcher den forventede struktur:",
|
||||
"LabelOpenIDClaims": "Efterlad de følgende indstillinger tomme for at deaktivere avanceret gruppe og adgangsindstilling, ved automatisk at assigne 'Bruger' grupper.",
|
||||
@@ -544,6 +570,7 @@
|
||||
"LabelSelectAll": "Vælg alle",
|
||||
"LabelSelectAllEpisodes": "Vælg alle episoder",
|
||||
"LabelSelectEpisodesShowing": "Vælg {0} episoder vist",
|
||||
"LabelSelectUser": "Vælg bruger",
|
||||
"LabelSelectUsers": "Valgte brugere",
|
||||
"LabelSendEbookToDevice": "Send e-bog til...",
|
||||
"LabelSequence": "Sekvens",
|
||||
@@ -561,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Skeumorfisk design med træhylder",
|
||||
"LabelSettingsChromecastSupport": "Chromecast-understøttelse",
|
||||
"LabelSettingsDateFormat": "Datoformat",
|
||||
"LabelSettingsEnableWatcher": "Scan automatisk bibliotek for ændringer",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Scan automatisk bibliotek for ændringer",
|
||||
"LabelSettingsEnableWatcher": "Automatisk biblioteksovervåger",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automatisk biblioteksovervåger",
|
||||
"LabelSettingsEnableWatcherHelp": "Aktiverer automatisk tilføjelse/opdatering af elementer, når filændringer registreres. *Kræver servergenstart",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Tillad scriptet indhold i epub",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Tillad epub filer at køre scripts. Det anbefales at holde denne indstilling deaktiveret med mindre du stoler på kilderne af epub filerne.",
|
||||
@@ -577,14 +604,14 @@
|
||||
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Procent gennemført er større end",
|
||||
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Tid tilbage er mindre end (sekunder)",
|
||||
"LabelSettingsLibraryMarkAsFinishedWhen": "Marker medie indhold som færdigt når",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Spring til tidligere bøger i Fortsæt serie",
|
||||
"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.",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Spring tidligere bøger i Fortsæt serie over",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"LabelSettingsSkipMatchingBooksWithISBN": "Spring matchende bøger over, som allerede har et ISBN-nummer",
|
||||
"LabelSettingsSkipMatchingBooksWithASIN": "Ignorer matchende bøger, der allerede har en ASIN",
|
||||
"LabelSettingsSkipMatchingBooksWithISBN": "Ignorer matchende bøger, som allerede har et ISBN-nummer",
|
||||
"LabelSettingsSortingIgnorePrefixes": "Ignorer præfikser ved sortering",
|
||||
"LabelSettingsSortingIgnorePrefixesHelp": "f.eks. for præfikset \"the\" vil bogtitlen \"The Book Title\" blive sorteret som \"Book Title, The\"",
|
||||
"LabelSettingsSquareBookCovers": "Brug kvadratiske bogomslag",
|
||||
@@ -611,6 +638,7 @@
|
||||
"LabelStartTime": "Starttid",
|
||||
"LabelStarted": "Startet",
|
||||
"LabelStartedAt": "Startet klokken",
|
||||
"LabelStartedDate": "Startet {0}",
|
||||
"LabelStatsAudioTracks": "Lydspor",
|
||||
"LabelStatsAuthors": "Forfattere",
|
||||
"LabelStatsBestDay": "Bedste dag",
|
||||
@@ -640,6 +668,7 @@
|
||||
"LabelTheme": "Tema",
|
||||
"LabelThemeDark": "Mørk",
|
||||
"LabelThemeLight": "Lys",
|
||||
"LabelThemeSepia": "Sepia",
|
||||
"LabelTimeBase": "Tidsbase",
|
||||
"LabelTimeDurationXHours": "{0} timer",
|
||||
"LabelTimeDurationXMinutes": "{0} minutter",
|
||||
@@ -708,7 +737,9 @@
|
||||
"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>.",
|
||||
"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.",
|
||||
"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.",
|
||||
"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.",
|
||||
@@ -722,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Ingen resultater for filter \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Intet resultat for query",
|
||||
"MessageBookshelfNoSeries": "Du har ingen serier",
|
||||
"MessageBulkChapterPattern": "Hvor mange kapitler vil du tilføje med dette nummereringsmønster?",
|
||||
"MessageChapterEndIsAfter": "Kapitelslutningen er efter slutningen af din lydbog",
|
||||
"MessageChapterErrorFirstNotZero": "Første kapitel skal starte ved 0",
|
||||
"MessageChapterErrorStartGteDuration": "Ugyldig starttid skal være mindre end lydbogens varighed",
|
||||
@@ -730,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Kapitler ikke fundet",
|
||||
"MessageCheckingCron": "Tjekker cron...",
|
||||
"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}?",
|
||||
"MessageConfirmDeleteDevice": "Er du sikker på at du vil fjerne elæser enhed \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Dette vil slette filen fra dit filsystem. Er du sikker?",
|
||||
@@ -757,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Er du sikker på, at du vil fjerne forfatteren \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Er du sikker på, at du vil fjerne samlingen \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Er du sikker på, at du vil fjerne episoden \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Obs: Dette sletter ikke lydfilen medmindre \"Permanent sletning af fil\" er aktiveret",
|
||||
"MessageConfirmRemoveEpisodes": "Er du sikker på, at du vil fjerne {0} episoder?",
|
||||
"MessageConfirmRemoveListeningSessions": "Er du sikker på at du vil fjerne {0} lytte sessioner?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Er du sikker på at du vil fjerne alle metadata.{0} filer i dine biblioteksfoldere?",
|
||||
@@ -782,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "Feed-URL vil være {0}",
|
||||
"MessageFetching": "Henter...",
|
||||
"MessageForceReScanDescription": "vil scanne alle filer igen som en frisk scanning. Lydfilens ID3-tags, OPF-filer og tekstfiler scannes som nye.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} lytter</strong> på {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Ingen lyttesessioner på {0}",
|
||||
"MessageImportantNotice": "Vigtig besked!",
|
||||
"MessageInsertChapterBelow": "Indsæt kapitel nedenfor",
|
||||
"MessageInvalidAsin": "Ugyldig ASIN",
|
||||
@@ -852,7 +888,7 @@
|
||||
"MessageResetChaptersConfirm": "Er du sikker på, at du vil nulstille kapitler og annullere ændringerne, du har foretaget?",
|
||||
"MessageRestoreBackupConfirm": "Er du sikker på, at du vil gendanne sikkerhedskopien oprettet den",
|
||||
"MessageRestoreBackupWarning": "Gendannelse af en sikkerhedskopi vil overskrive hele databasen, som er placeret på /config, og omslagsbilleder i /metadata/items & /metadata/authors.<br /><br />Sikkerhedskopier ændrer ikke nogen filer i dine biblioteksmapper. Hvis du har aktiveret serverindstillinger for at gemme omslagskunst og metadata i dine biblioteksmapper, sikkerhedskopieres eller overskrives disse ikke.<br /><br />Alle klienter, der bruger din server, opdateres automatisk.",
|
||||
"MessageScheduleLibraryScanNote": "For de fleste brugere, er det anbefalet at efterlade denne funktion deaktiveret for at holde mappe lurer indstilling aktiveret. Mappe lureren vil automatisk opdage ændringer i biblioteksmapper. Mappe lureren virker ikke for alle filsystemer (så som NFS) så schedulerede biblioteksscans vil blive anvendt.",
|
||||
"MessageScheduleLibraryScanNote": "For de fleste brugere er det anbefalet, at efterlade denne funktion deaktiveret, og lade biblioteksovervågeren være aktiveret - den vil automatisk opdage ændringer i dine biblioteksmapper. Aktiver denne funktion, hvis biblioteksovervågeren ikke virker med dit filsystem (f. eks. NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Kør hvert {0} af {1}",
|
||||
"MessageSearchResultsFor": "Søgeresultater for",
|
||||
"MessageSelected": "{0} valgt",
|
||||
@@ -921,6 +957,7 @@
|
||||
"NotificationOnRSSFeedDisabledDescription": "Aktiveret når automatiske episode-downloads er slået fra, på grund af for mange forsøg",
|
||||
"NotificationOnRSSFeedFailedDescription": "Aktiveret når anmodning om RSS-feedet fejler for en automatisk episode-download",
|
||||
"NotificationOnTestDescription": "Event for test af notifikationssystemet",
|
||||
"PlaceholderBulkChapterInput": "Indtast kapiteltitel eller brug nummerering (f.eks. 'Episode 1', 'Kapitel 10', '1.')",
|
||||
"PlaceholderNewCollection": "Nyt samlingnavn",
|
||||
"PlaceholderNewFolderPath": "Ny mappes sti",
|
||||
"PlaceholderNewPlaylist": "Nyt afspilningslistnavn",
|
||||
@@ -974,22 +1011,30 @@
|
||||
"ToastBookmarkCreateFailed": "Mislykkedes oprettelse af bogmærke",
|
||||
"ToastBookmarkCreateSuccess": "Bogmærke tilføjet",
|
||||
"ToastBookmarkRemoveSuccess": "Bogmærke fjernet",
|
||||
"ToastBulkChapterInvalidCount": "Indtast et tal mellem 1 og 150",
|
||||
"ToastCachePurgeFailed": "Fejlede at opryde cache",
|
||||
"ToastCachePurgeSuccess": "Cache ryddet op i succesfuldt",
|
||||
"ToastChapterLocked": "Kapitel er låst.",
|
||||
"ToastChapterStartTimeAdjusted": "Kapitelstarttid justeret med {0} sekunder",
|
||||
"ToastChaptersAllLocked": "Alle kapitler er låst. Lås op for nogle kapitler for at ændre deres tider.",
|
||||
"ToastChaptersHaveErrors": "Kapitler har fejl",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Ugyldig ændring. Det sidste kapitels starttid ville fortsætte længere end varigheden på denne lydbog.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Ugyldig ændring. Første kapitel ville have en længde på nul eller negativt og ville blive overskrevet af andet kapitel. Udvid startvarigheden på andet kapitel.",
|
||||
"ToastChaptersMustHaveTitles": "Kapitler skal have titler",
|
||||
"ToastChaptersRemoved": "Kapitler fjernet",
|
||||
"ToastChaptersUpdated": "Kapitler opdateret",
|
||||
"ToastCollectionItemsAddFailed": "Genstand(e) tilføjet til kollektion fejlet",
|
||||
"ToastCollectionRemoveSuccess": "Samling fjernet",
|
||||
"ToastCollectionUpdateSuccess": "Samling opdateret",
|
||||
"ToastConnectionNotAvailable": "Forbindelse mislykkedes. Prøv igen senere",
|
||||
"ToastCoverSearchFailed": "Cover-søgning mislykkedes",
|
||||
"ToastCoverUpdateFailed": "Cover opdatering fejlede",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Dato og tid er forkert eller ufærdig",
|
||||
"ToastDeleteFileFailed": "Slet fil fejlede",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Dato og tid er ugyldig eller ufærdig",
|
||||
"ToastDeleteFileFailed": "Sletning af fil fejlede",
|
||||
"ToastDeleteFileSuccess": "Fil slettet",
|
||||
"ToastDeviceAddFailed": "Fejlede at tilføje enhed",
|
||||
"ToastDeviceNameAlreadyExists": "Elæser enhed med det navn eksistere allerede",
|
||||
"ToastDeviceTestEmailFailed": "Fejlede at sende test mail",
|
||||
"ToastDeviceAddFailed": "Tilføjelse af enhed Fejlede",
|
||||
"ToastDeviceNameAlreadyExists": "E-læser enhed med det navn eksistere allerede",
|
||||
"ToastDeviceTestEmailFailed": "Afsendelse af test mail fejlede",
|
||||
"ToastDeviceTestEmailSuccess": "Test mail sendt",
|
||||
"ToastEmailSettingsUpdateSuccess": "Mail indstillinger opdateret",
|
||||
"ToastEncodeCancelFailed": "Fejlede at afbryde indkodning",
|
||||
@@ -998,27 +1043,30 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Afsnit download kø renset",
|
||||
"ToastEpisodeUpdateSuccess": "{0} afsnit opdateret",
|
||||
"ToastErrorCannotShare": "Kan ikke dele på denne enhed",
|
||||
"ToastFailedToLoadData": "Fejlede at indlæse data",
|
||||
"ToastFailedToCreate": "Oprettelsen mislykkedes",
|
||||
"ToastFailedToDelete": "Sletning fejlede",
|
||||
"ToastFailedToLoadData": "Indlæsning af data fejlede",
|
||||
"ToastFailedToMatch": "Fejlet match",
|
||||
"ToastFailedToShare": "Fejlet deling",
|
||||
"ToastFailedToShare": "Deling fejlede",
|
||||
"ToastFailedToUpdate": "Fejlet opdatering",
|
||||
"ToastInvalidImageUrl": "Forkert billede URL",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Forkert maks afsnit at hente",
|
||||
"ToastInvalidUrl": "Forkert URL",
|
||||
"ToastItemCoverUpdateSuccess": "Varens omslag opdateret",
|
||||
"ToastItemDeletedFailed": "Fejlede at slette genstand",
|
||||
"ToastInvalidImageUrl": "Ugyldig billede URL",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Ugyldigt maks afsnit at hente",
|
||||
"ToastInvalidUrl": "Ugyldig URL",
|
||||
"ToastInvalidUrls": "En eller flere URLer er ugyldige",
|
||||
"ToastItemCoverUpdateSuccess": "Omslag opdateret",
|
||||
"ToastItemDeletedFailed": "Sletning af genstand fejlede",
|
||||
"ToastItemDeletedSuccess": "Genstand slettet",
|
||||
"ToastItemDetailsUpdateSuccess": "Varedetaljer opdateret",
|
||||
"ToastItemMarkedAsFinishedFailed": "Mislykkedes markering som afsluttet",
|
||||
"ToastItemMarkedAsFinishedSuccess": "Vare markeret som afsluttet",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Mislykkedes markering som ikke afsluttet",
|
||||
"ToastItemMarkedAsNotFinishedSuccess": "Vare markeret som ikke afsluttet",
|
||||
"ToastItemDetailsUpdateSuccess": "Detaljer opdateret",
|
||||
"ToastItemMarkedAsFinishedFailed": "Markering som afsluttet mislykkedes",
|
||||
"ToastItemMarkedAsFinishedSuccess": "Element markeret som afsluttet",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Markering som ikke afsluttet mislykkedes",
|
||||
"ToastItemMarkedAsNotFinishedSuccess": "Element markeret som ikke afsluttet",
|
||||
"ToastItemUpdateSuccess": "Genstand opdateret",
|
||||
"ToastLibraryCreateFailed": "Mislykkedes oprettelse af bibliotek",
|
||||
"ToastLibraryCreateFailed": "Oprettelse af bibliotek mislykkedes",
|
||||
"ToastLibraryCreateSuccess": "Bibliotek \"{0}\" oprettet",
|
||||
"ToastLibraryDeleteFailed": "Mislykkedes sletning af bibliotek",
|
||||
"ToastLibraryDeleteFailed": "Sletning af bibliotek mislykkedes",
|
||||
"ToastLibraryDeleteSuccess": "Bibliotek slettet",
|
||||
"ToastLibraryScanFailedToStart": "Mislykkedes start af skanning",
|
||||
"ToastLibraryScanFailedToStart": "Start af skanning mislykkedes",
|
||||
"ToastLibraryScanStarted": "Biblioteksskanning startet",
|
||||
"ToastLibraryUpdateSuccess": "Bibliotek \"{0}\" opdateret",
|
||||
"ToastMatchAllAuthorsFailed": "Fejlede at matche alle forfattere",
|
||||
@@ -1029,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Skal have mindst en sti",
|
||||
"ToastNameEmailRequired": "Navn og email påkrævet",
|
||||
"ToastNameRequired": "Navn påkrævet",
|
||||
"ToastNewApiKeyUserError": "En bruger skal vælges",
|
||||
"ToastNewEpisodesFound": "{0} nye afsnit fundet",
|
||||
"ToastNewUserCreatedFailed": "Fejlede at oprette konto: \"{0}\"",
|
||||
"ToastNewUserCreatedSuccess": "Ny konto oprettet",
|
||||
@@ -1053,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Afspilningsliste opdateret",
|
||||
"ToastPodcastCreateFailed": "Mislykkedes oprettelse af podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast oprettet med succes",
|
||||
"ToastPodcastEpisodeUpdated": "Episode opdateret",
|
||||
"ToastPodcastGetFeedFailed": "Fejlede at hente podcast feed",
|
||||
"ToastPodcastNoEpisodesInFeed": "Ingen nye afsnit fundet i RSS feed",
|
||||
"ToastPodcastNoRssFeed": "Podcast har ingen RSS feed",
|
||||
@@ -1097,11 +1147,19 @@
|
||||
"ToastUnlinkOpenIdFailed": "Fejlede i af afkoble bruger fra OpenID",
|
||||
"ToastUnlinkOpenIdSuccess": "Bruger afkoblet fra OpenID",
|
||||
"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",
|
||||
"ToastUserDeleteSuccess": "Bruger slettet",
|
||||
"ToastUserPasswordChangeSuccess": "Password ændret",
|
||||
"ToastUserPasswordMismatch": "Passwords passer ikke sammen",
|
||||
"ToastUserPasswordMustChange": "Nyt password må ikke være det gamle",
|
||||
"ToastUserRootRequireName": "Skal indholde et root brugernavn"
|
||||
"ToastUserRootRequireName": "Skal indholde et root brugernavn",
|
||||
"TooltipAddChapters": "Tilføj kapitler",
|
||||
"TooltipAddOneSecond": "Tilføj 1 sekund",
|
||||
"TooltipAdjustChapterStart": "Klik for at ændre starttiden",
|
||||
"TooltipLockAllChapters": "Lås alle kapitler",
|
||||
"TooltipLockChapter": "Lås kapitel (Shift+click for at markere flere)",
|
||||
"TooltipSubtractOneSecond": "Fratag 1 sekund",
|
||||
"TooltipUnlockAllChapters": "Lås alle kapitaler op",
|
||||
"TooltipUnlockChapter": "Lås kapitel op (Shift+click for at markere flere)"
|
||||
}
|
||||
|
||||
+79
-23
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Hinzufügen",
|
||||
"ButtonAddApiKey": "API-Schlüssel hinzufügen",
|
||||
"ButtonAddChapters": "Kapitel hinzufügen",
|
||||
"ButtonAddDevice": "Gerät hinzufügen",
|
||||
"ButtonAddLibrary": "Bibliothek hinzufügen",
|
||||
@@ -12,14 +13,15 @@
|
||||
"ButtonBack": "Zurück",
|
||||
"ButtonBatchEditPopulateFromExisting": "Auffüllen aus vorhandenem",
|
||||
"ButtonBatchEditPopulateMapDetails": "Kartendetails auffüllen",
|
||||
"ButtonBrowseForFolder": "Ordnersuche",
|
||||
"ButtonBrowseForFolder": "Ordner auswählen",
|
||||
"ButtonCancel": "Abbrechen",
|
||||
"ButtonCancelEncode": "Codierung abbrechen",
|
||||
"ButtonCancelEncode": "Konvertierung abbrechen",
|
||||
"ButtonChangeRootPassword": "Hauptpasswort ändern",
|
||||
"ButtonCheckAndDownloadNewEpisodes": "Überprüfe & lade neue Episoden herunter",
|
||||
"ButtonChooseAFolder": "Wähle einen Ordner",
|
||||
"ButtonChooseFiles": "Wähle eine Datei",
|
||||
"ButtonClearFilter": "Filter löschen",
|
||||
"ButtonClose": "Schließen",
|
||||
"ButtonCloseFeed": "Feed schließen",
|
||||
"ButtonCloseSession": "Offene Sitzung schließen",
|
||||
"ButtonCollections": "Sammlungen",
|
||||
@@ -32,7 +34,7 @@
|
||||
"ButtonEditChapters": "Kapitel bearbeiten",
|
||||
"ButtonEditPodcast": "Podcast bearbeiten",
|
||||
"ButtonEnable": "Aktivieren",
|
||||
"ButtonFireAndFail": "Abfeuern und versagen",
|
||||
"ButtonFireAndFail": "Abschicken und fehlschlagen",
|
||||
"ButtonFireOnTest": "Test-Event abfeuern",
|
||||
"ButtonForceReScan": "Komplett-Scan (alle Medien)",
|
||||
"ButtonFullPath": "Vollständiger Pfad",
|
||||
@@ -53,7 +55,7 @@
|
||||
"ButtonNext": "Vor",
|
||||
"ButtonNextChapter": "Nächstes Kapitel",
|
||||
"ButtonNextItemInQueue": "Das nächste Element in der Warteschlange",
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOk": "OK",
|
||||
"ButtonOpenFeed": "Feed öffnen",
|
||||
"ButtonOpenManager": "Manager öffnen",
|
||||
"ButtonPause": "Pausieren",
|
||||
@@ -73,7 +75,7 @@
|
||||
"ButtonQuickMatch": "Schnellabgleich",
|
||||
"ButtonReScan": "Neu scannen",
|
||||
"ButtonRead": "Lesen",
|
||||
"ButtonReadLess": "weniger Anzeigen",
|
||||
"ButtonReadLess": "Weniger Anzeigen",
|
||||
"ButtonReadMore": "Mehr Anzeigen",
|
||||
"ButtonRefresh": "Neu Laden",
|
||||
"ButtonRemove": "Entfernen",
|
||||
@@ -102,7 +104,7 @@
|
||||
"ButtonStartM4BEncode": "M4B-Kodierung starten",
|
||||
"ButtonStartMetadataEmbed": "Metadateneinbettung starten",
|
||||
"ButtonStats": "Statistiken",
|
||||
"ButtonSubmit": "Ok",
|
||||
"ButtonSubmit": "Absenden",
|
||||
"ButtonTest": "Test",
|
||||
"ButtonUnlinkOpenId": "OpenID trennen",
|
||||
"ButtonUpload": "Hochladen",
|
||||
@@ -114,16 +116,18 @@
|
||||
"ButtonViewAll": "Alles anzeigen",
|
||||
"ButtonYes": "Ja",
|
||||
"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",
|
||||
"HeaderAccount": "Konto",
|
||||
"HeaderAddCustomMetadataProvider": "Benutzerdefinierten Metadatenanbieter hinzufügen",
|
||||
"HeaderAdvanced": "Erweitert",
|
||||
"HeaderApiKeys": "API-Schlüssel",
|
||||
"HeaderAppriseNotificationSettings": "Apprise Benachrichtigungseinstellungen",
|
||||
"HeaderAudioTracks": "Audiodateien",
|
||||
"HeaderAudiobookTools": "Hörbuch-Dateiverwaltungswerkzeuge",
|
||||
"HeaderAuthentication": "Authentifizierung",
|
||||
"HeaderBackups": "Sicherungen",
|
||||
"HeaderBulkChapterModal": "Mehrere Kapitel hinzufügen",
|
||||
"HeaderChangePassword": "Passwort ändern",
|
||||
"HeaderChapters": "Kapitel",
|
||||
"HeaderChooseAFolder": "Wähle einen Ordner",
|
||||
@@ -134,13 +138,13 @@
|
||||
"HeaderCustomMessageOnLogin": "Benutzerdefinierte Nachricht für die Anmeldung",
|
||||
"HeaderCustomMetadataProviders": "Benutzerdefinierte Metadatenanbieter",
|
||||
"HeaderDetails": "Details",
|
||||
"HeaderDownloadQueue": "Download Warteschlange",
|
||||
"HeaderEbookFiles": "E-Buch-Dateien",
|
||||
"HeaderDownloadQueue": "Download-Warteschlange",
|
||||
"HeaderEbookFiles": "E-Book-Dateien",
|
||||
"HeaderEmail": "E-Mail",
|
||||
"HeaderEmailSettings": "E-Mail-Einstellungen",
|
||||
"HeaderEpisodes": "Episoden",
|
||||
"HeaderEreaderDevices": "E-Reader Geräte",
|
||||
"HeaderEreaderSettings": "Einstellungen zum Lesen",
|
||||
"HeaderEreaderSettings": "E-Reader-Einstellungen",
|
||||
"HeaderFiles": "Dateien",
|
||||
"HeaderFindChapters": "Kapitel suchen",
|
||||
"HeaderIgnoredFiles": "Ignorierte Dateien",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Metadaten Rangfolge",
|
||||
"HeaderMetadataToEmbed": "Einzubettende Metadaten",
|
||||
"HeaderNewAccount": "Neues Konto",
|
||||
"HeaderNewApiKey": "Neuen API-Schlüssel erstellen",
|
||||
"HeaderNewLibrary": "Neue Bibliothek",
|
||||
"HeaderNotificationCreate": "Benachrichtigung erstellen",
|
||||
"HeaderNotificationUpdate": "Benachrichtigung bearbeiten",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Experimentelle Funktionen",
|
||||
"HeaderSettingsGeneral": "Allgemein",
|
||||
"HeaderSettingsScanner": "Scanner",
|
||||
"HeaderSettingsSecurity": "Sicherheit",
|
||||
"HeaderSettingsWebClient": "Web-Client",
|
||||
"HeaderSleepTimer": "Sleep-Timer",
|
||||
"HeaderStatsLargestItems": "Größte Medien",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Inhaltsverzeichnis",
|
||||
"HeaderTools": "Werkzeuge",
|
||||
"HeaderUpdateAccount": "Konto aktualisieren",
|
||||
"HeaderUpdateApiKey": "API-Schlüssel aktualisieren",
|
||||
"HeaderUpdateAuthor": "Autor aktualisieren",
|
||||
"HeaderUpdateDetails": "Details aktualisieren",
|
||||
"HeaderUpdateLibrary": "Bibliothek aktualisieren",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Alle Benutzer außer Gästen",
|
||||
"LabelAllUsersIncludingGuests": "Alle Benutzer und Gäste",
|
||||
"LabelAlreadyInYourLibrary": "Bereits in der Bibliothek",
|
||||
"LabelApiKeyCreated": "API-Schlüssel \"{0}\" erfolgreich erstellt.",
|
||||
"LabelApiKeyCreatedDescription": "Speichere den API-Schlüssel an einem sicheren Ort, du wirst ihn später nicht mehr abrufen können.",
|
||||
"LabelApiKeyUser": "Im Kontext eines Nutzers agieren",
|
||||
"LabelApiKeyUserDescription": "Dieser API-Schlüssel hat die gleichen Berechtigungen wie der Benutzer, in dessen Namen er erstellt wurde .In den Protokollen wird es aussehen, als ob der Benutzer die Anfrage durchführte.",
|
||||
"LabelApiToken": "API Schlüssel",
|
||||
"LabelAppend": "Anhängen",
|
||||
"LabelAudioBitrate": "Audiobitrate (z. B. 128 kbit/s)",
|
||||
@@ -284,6 +295,7 @@
|
||||
"LabelContinueListening": "Weiterhören",
|
||||
"LabelContinueReading": "Weiterlesen",
|
||||
"LabelContinueSeries": "Serien fortsetzen",
|
||||
"LabelCorsAllowed": "Erlaubte CORS Quellen",
|
||||
"LabelCover": "Titelbild",
|
||||
"LabelCoverImageURL": "URL des Titelbildes",
|
||||
"LabelCoverProvider": "Titelbildanbieter",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Löschen von der Festplatte + Datenbank (deaktivieren um nur aus der Datenbank zu entfernen)",
|
||||
"LabelDescription": "Beschreibung",
|
||||
"LabelDeselectAll": "Alles abwählen",
|
||||
"LabelDetectedPattern": "Erkanntes Muster:",
|
||||
"LabelDevice": "Gerät",
|
||||
"LabelDeviceInfo": "Geräteinformationen",
|
||||
"LabelDeviceIsAvailableTo": "Dem Gerät ist es möglich zu ...",
|
||||
@@ -346,7 +359,11 @@
|
||||
"LabelExample": "Beispiel",
|
||||
"LabelExpandSeries": "Serie ausklappen",
|
||||
"LabelExpandSubSeries": "Unterserie ausklappen",
|
||||
"LabelExplicit": "Explizit (Altersbeschränkung)",
|
||||
"LabelExpired": "Abgelaufen",
|
||||
"LabelExpiresAt": "Läuft ab am",
|
||||
"LabelExpiresInSeconds": "Ablauf in (seconds) Sekunden",
|
||||
"LabelExpiresNever": "Niemals",
|
||||
"LabelExplicit": "Explizit",
|
||||
"LabelExplicitChecked": "Explicit (Altersbeschränkung) (angehakt)",
|
||||
"LabelExplicitUnchecked": "Not Explicit (Altersbeschränkung) (nicht angehakt)",
|
||||
"LabelExportOPML": "OPML exportieren",
|
||||
@@ -361,6 +378,7 @@
|
||||
"LabelFilterByUser": "Nach Benutzern filtern",
|
||||
"LabelFindEpisodes": "Episoden suchen",
|
||||
"LabelFinished": "Beendet",
|
||||
"LabelFinishedDate": "Beendet {0}",
|
||||
"LabelFolder": "Ordner",
|
||||
"LabelFolders": "Verzeichnisse",
|
||||
"LabelFontBold": "Fett",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "Sprachen",
|
||||
"LabelLastBookAdded": "Zuletzt hinzugefügtes Buch",
|
||||
"LabelLastBookUpdated": "Zuletzt aktualisiertes Buch",
|
||||
"LabelLastProgressDate": "Letzter Fortschritt: {0}",
|
||||
"LabelLastSeen": "Zuletzt gesehen",
|
||||
"LabelLastTime": "Letztes Mal",
|
||||
"LabelLastUpdate": "Letzte Aktualisierung",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Keine {0}",
|
||||
"LabelLibraryItem": "Bibliothekseintrag",
|
||||
"LabelLibraryName": "Bibliotheksname",
|
||||
"LabelLibrarySortByProgress": "Fortschritt: Letzte Aktualisierung",
|
||||
"LabelLibrarySortByProgressFinished": "Fortschritt: Beendet",
|
||||
"LabelLibrarySortByProgressStarted": "Fortschritt: Gestartet",
|
||||
"LabelLimit": "Begrenzung",
|
||||
"LabelLineSpacing": "Zeilenabstand",
|
||||
"LabelListenAgain": "Erneut anhören",
|
||||
@@ -425,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Warnungen",
|
||||
"LabelLookForNewEpisodesAfterDate": "Suche nach neuen Episoden nach diesem Datum",
|
||||
"LabelLowestPriority": "Niedrigste Priorität",
|
||||
"LabelMatchConfidence": "Vertrauenswert",
|
||||
"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",
|
||||
"LabelMaxEpisodesToDownload": "Max. Anzahl an Episoden zum Herunterladen, 0 für unbegrenzte Episoden.",
|
||||
@@ -433,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.",
|
||||
"LabelMediaPlayer": "Mediaplayer",
|
||||
"LabelMediaType": "Medientyp",
|
||||
"LabelMetaTag": "Meta Schlagwort",
|
||||
"LabelMetaTag": "Meta Tag",
|
||||
"LabelMetaTags": "Meta Tags",
|
||||
"LabelMetadataOrderOfPrecedenceDescription": "Höher priorisierte Quellen für Metadaten überschreiben Metadaten aus Quellen mit niedrigerer Priorität",
|
||||
"LabelMetadataProvider": "Metadatenanbieter",
|
||||
@@ -454,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Neueste Autoren",
|
||||
"LabelNewestEpisodes": "Neueste Episoden",
|
||||
"LabelNextBackupDate": "Nächstes Sicherungsdatum",
|
||||
"LabelNextChapters": "Das nächste Kapitel ist:",
|
||||
"LabelNextScheduledRun": "Nächster planmäßiger Durchlauf",
|
||||
"LabelNoApiKeys": "Keine API-Schlüssel vorhanden",
|
||||
"LabelNoCustomMetadataProviders": "Keine benutzerdefinierten Metadata Anbieter",
|
||||
"LabelNoEpisodesSelected": "Keine Episoden ausgewählt",
|
||||
"LabelNotFinished": "Nicht beendet",
|
||||
@@ -470,6 +495,7 @@
|
||||
"LabelNotificationsMaxQueueSize": "Maximale Größe der Warteschlange für die Benachrichtigungsereignisse",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Es wird nur 1 Ereignis pro Sekunde ausgelöst. Ereignisse werden ignoriert, wenn die Warteschlange die maximale Größe erreicht hat. Dies verhindert Benachrichtigungsspamming.",
|
||||
"LabelNumberOfBooks": "Anzahl der Hörbücher",
|
||||
"LabelNumberOfChapters": "Anzahl an Kapiteln:",
|
||||
"LabelNumberOfEpisodes": "Anzahl der Episoden",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Name des OpenID-Claims, der erweiterte Berechtigungen für Benutzeraktionen innerhalb der Anwendung enthält, die auf Nicht-Admin-Rollen angewendet werden (<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.",
|
||||
@@ -514,7 +540,7 @@
|
||||
"LabelPublishers": "Herausgeber",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Benutzerdefinierte Eigentümer-E-Mail",
|
||||
"LabelRSSFeedCustomOwnerName": "Benutzerdefinierter Name des Eigentümers",
|
||||
"LabelRSSFeedOpen": "RSS Feed öffnen",
|
||||
"LabelRSSFeedOpen": "RSS-Feed offen",
|
||||
"LabelRSSFeedPreventIndexing": "Indizierung verhindern",
|
||||
"LabelRSSFeedSlug": "RSS-Feed-Schlagwort",
|
||||
"LabelRSSFeedURL": "RSS-Feed-URL",
|
||||
@@ -544,6 +570,7 @@
|
||||
"LabelSelectAll": "Alles auswählen",
|
||||
"LabelSelectAllEpisodes": "Alle Episoden auswählen",
|
||||
"LabelSelectEpisodesShowing": "{0} ausgewählte Episoden werden angezeigt",
|
||||
"LabelSelectUser": "Ausgewählter Benutzer",
|
||||
"LabelSelectUsers": "Benutzer auswählen",
|
||||
"LabelSendEbookToDevice": "E-Buch senden an …",
|
||||
"LabelSequence": "Reihenfolge",
|
||||
@@ -561,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Skeumorphes Design mit Holzeinlegeböden",
|
||||
"LabelSettingsChromecastSupport": "Chromecastunterstützung",
|
||||
"LabelSettingsDateFormat": "Datumsformat",
|
||||
"LabelSettingsEnableWatcher": "Bibliotheken automatisch nach Änderungen durchsuchen",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Bibliothek automatisch nach Änderungen durchsuchen",
|
||||
"LabelSettingsEnableWatcher": "Bibliotheken automatisch nach Änderungen überwachen",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Bibliothek automatisch auf Änderungen überwachen",
|
||||
"LabelSettingsEnableWatcherHelp": "Aktiviert das automatische Hinzufügen/Aktualisieren von Elementen, wenn Dateiänderungen erkannt werden. *Erfordert einen Server-Neustart",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Skriptinhalte in Epubs zulassen",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Erlaube Epub-Dateien, Skripte auszuführen. Es wird empfohlen, diese Einstellung deaktiviert zu lassen, es sei denn, du vertraust der Quelle der Epub-Dateien.",
|
||||
@@ -611,6 +638,7 @@
|
||||
"LabelStartTime": "Startzeit",
|
||||
"LabelStarted": "Gestartet",
|
||||
"LabelStartedAt": "Gestartet am",
|
||||
"LabelStartedDate": "Angefangen am {0}",
|
||||
"LabelStatsAudioTracks": "Audiodateien",
|
||||
"LabelStatsAuthors": "Autoren",
|
||||
"LabelStatsBestDay": "Bester Tag",
|
||||
@@ -640,6 +668,7 @@
|
||||
"LabelTheme": "Farbschema",
|
||||
"LabelThemeDark": "Dunkel",
|
||||
"LabelThemeLight": "Hell",
|
||||
"LabelThemeSepia": "Sepia",
|
||||
"LabelTimeBase": "Basiszeit",
|
||||
"LabelTimeDurationXHours": "{0} Stunden",
|
||||
"LabelTimeDurationXMinutes": "{0} Minuten",
|
||||
@@ -681,7 +710,7 @@
|
||||
"LabelUploaderDragAndDropFilesOnly": "Dateien per Drag & Drop hierher ziehen",
|
||||
"LabelUploaderDropFiles": "Dateien löschen",
|
||||
"LabelUploaderItemFetchMetadataHelp": "Automatisches Aktualisieren von Titel, Autor und Serie",
|
||||
"LabelUseAdvancedOptions": "Nutze Erweiterte Optionen",
|
||||
"LabelUseAdvancedOptions": "Erweiterte Optionen verwenden",
|
||||
"LabelUseChapterTrack": "Kapiteldatei verwenden",
|
||||
"LabelUseFullTrack": "Gesamte Datei verwenden",
|
||||
"LabelUseZeroForUnlimited": "0 für unbegrenzt",
|
||||
@@ -707,8 +736,10 @@
|
||||
"LabelYourProgress": "Fortschritt",
|
||||
"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.",
|
||||
"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-Token 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.",
|
||||
"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.",
|
||||
"MessageBackupsLocationEditNote": "Hinweis: Durch das Aktualisieren des Backup-Speicherorts werden vorhandene Sicherungen nicht verschoben oder geändert",
|
||||
"MessageBackupsLocationNoEditNote": "Hinweis: Der Sicherungsspeicherort wird über eine Umgebungsvariable festgelegt und kann hier nicht geändert werden.",
|
||||
@@ -722,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Keine Ergebnisse für Filter \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Keine Ergebnisse für die Abfrage",
|
||||
"MessageBookshelfNoSeries": "Keine Serien vorhanden",
|
||||
"MessageBulkChapterPattern": "Wie viele Kapitel mit diesem Nummerierungs-Muster sollen hinzugefügt werden?",
|
||||
"MessageChapterEndIsAfter": "Ungültige Kapitelendzeit: Kapitelende > Mediumende (Kapitelende liegt nach dem Ende des Mediums)",
|
||||
"MessageChapterErrorFirstNotZero": "Ungültige Kapitelstartzeit: Das erste Kapitel muss bei 0 beginnen",
|
||||
"MessageChapterErrorStartGteDuration": "Ungültige Kapitelstartzeit: Kapitelanfang > Mediumlänge (Kapitelanfang liegt zeitlich nach dem Ende des Mediums -> Lösung: Kapitelanfang < Mediumlänge)",
|
||||
@@ -730,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Kapitel gefunden nicht",
|
||||
"MessageCheckingCron": "Überprüfe Cron...",
|
||||
"MessageConfirmCloseFeed": "Feed wird geschlossen! Bist du dir sicher?",
|
||||
"MessageConfirmDeleteApiKey": "Möchtest du den API-Schlüssel \"{0}\" wirklich entfernen ?",
|
||||
"MessageConfirmDeleteBackup": "Sicherung für {0} wird gelöscht! Bist du dir sicher?",
|
||||
"MessageConfirmDeleteDevice": "Möchtest du das Lesegerät „{0}“ wirklich löschen?",
|
||||
"MessageConfirmDeleteFile": "Datei wird vom System gelöscht! Bist du dir sicher?",
|
||||
@@ -757,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Autor \"{0}\" wird enfernt! Bist du dir sicher?",
|
||||
"MessageConfirmRemoveCollection": "Sammlung \"{0}\" wird entfernt! Bist du dir sicher?",
|
||||
"MessageConfirmRemoveEpisode": "Episode \"{0}\" wird entfernt! Bist du dir sicher?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Hinweis: Die Audiodatei wird nicht gelöscht, es sei denn \"Datei dauerhaft löschen\" ist aktiviert",
|
||||
"MessageConfirmRemoveEpisodes": "{0} Episoden werden entfernt! Bist du dir sicher?",
|
||||
"MessageConfirmRemoveListeningSessions": "Bist du dir sicher, dass du {0} Hörsitzungen enfernen möchtest?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Bist du sicher, dass du alle metadata.{0} Dateien in deinen Bibliotheksordnern löschen willst?",
|
||||
@@ -782,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "Feed-URL wird {0} sein",
|
||||
"MessageFetching": "Wird abgerufen …",
|
||||
"MessageForceReScanDescription": "Durchsucht alle Dateien erneut, wie bei einem frischen Scan. ID3-Tags von Audiodateien, OPF-Dateien und Textdateien werden neu durchsucht.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} </strong> auf {1} gehört",
|
||||
"MessageHeatmapNoListeningSessions": "Keine Hörsitzungen am {0}",
|
||||
"MessageImportantNotice": "Wichtiger Hinweis!",
|
||||
"MessageInsertChapterBelow": "Kapitel unten einfügen",
|
||||
"MessageInvalidAsin": "Ungültige ASIN",
|
||||
@@ -852,7 +888,7 @@
|
||||
"MessageResetChaptersConfirm": "Kapitel und vorgenommenen Änderungen werden zurückgesetzt und rückgängig gemacht! Bist du dir sicher?",
|
||||
"MessageRestoreBackupConfirm": "Bist du dir sicher, dass du die Sicherung wiederherstellen willst, welche am",
|
||||
"MessageRestoreBackupWarning": "Bei der Wiederherstellung einer Sicherung wird die gesamte Datenbank unter /config und die Titelbilder in /metadata/items und /metadata/authors überschrieben.<br /><br />Bei der Sicherung werden keine Dateien in deinen Bibliotheksordnern verändert. Wenn du die Servereinstellungen aktiviert hast, um Cover und Metadaten in deinen Bibliotheksordnern zu speichern, werden diese nicht gesichert oder überschrieben.<br /><br />Alle Clients, die Ihren Server nutzen, werden automatisch aktualisiert.",
|
||||
"MessageScheduleLibraryScanNote": "Für die meisten Anwender wird empfohlen, diese Funktion deaktiviert und die Ordnerüberwachung aktiviert zu lassen. Die Ordnerüberwachung wird Änderungen in den Bibliotheksordnern automatisch erkennen. Die Ordnerüberwachung funktioniert nicht mit allen Dateisystemen (wie NFS), hier kann stattdessen die automatischen Bibliothekssuchen verwendet werden.",
|
||||
"MessageScheduleLibraryScanNote": "Für die meisten Benutzer wird empfohlen, diese Funktion deaktiviert und die Einstellung „Bibliothek automatisch auf Änderungen überwachen“ aktiviert zu lassen – dadurch werden Änderungen in Ihren Bibliotheksordnern automatisch erkannt. Aktivieren Sie diese Funktion, wenn „Bibliothek automatisch auf Änderungen überwachen“ für Ihr Dateisystem (wie NFS) nicht funktioniert.",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Immer {0} um {1} ausführen",
|
||||
"MessageSearchResultsFor": "Suchergebnisse für",
|
||||
"MessageSelected": "{0} ausgewählt",
|
||||
@@ -921,6 +957,7 @@
|
||||
"NotificationOnRSSFeedDisabledDescription": "Wird ausgeführt wenn automatische Downloads von Episoden wegen zu vielen fehlgeschlagenen Versuchen deaktiviert sind",
|
||||
"NotificationOnRSSFeedFailedDescription": "Wird ausgelöst, wenn die RSS-Feed-Anforderung für einen automatischen Episoden-Download fehlschlägt",
|
||||
"NotificationOnTestDescription": "Wird ausgeführt wenn das Benachrichtigungssystem getestet wird",
|
||||
"PlaceholderBulkChapterInput": "Kapitelbezeichnung eingeben oder Nummerierung verwenden (z.B. 'Episode 1', 'Kapitel 10', '1.')",
|
||||
"PlaceholderNewCollection": "Neuer Sammlungsname",
|
||||
"PlaceholderNewFolderPath": "Neuer Ordnerpfad",
|
||||
"PlaceholderNewPlaylist": "Neuer Wiedergabelistenname",
|
||||
@@ -974,17 +1011,23 @@
|
||||
"ToastBookmarkCreateFailed": "Lesezeichen konnte nicht erstellt werden",
|
||||
"ToastBookmarkCreateSuccess": "Lesezeichen hinzugefügt",
|
||||
"ToastBookmarkRemoveSuccess": "Lesezeichen entfernt",
|
||||
"ToastBulkChapterInvalidCount": "Gebe eine Zahl zwischen 1 und 150 ein",
|
||||
"ToastCachePurgeFailed": "Cache leeren fehlgeschlagen",
|
||||
"ToastCachePurgeSuccess": "Cache geleert",
|
||||
"ToastChapterLocked": "Kapitel ist freigegeben.",
|
||||
"ToastChapterStartTimeAdjusted": "Kapitelbeginn um {0} Sekunden angepasst",
|
||||
"ToastChaptersAllLocked": "Alle Kapitel sind gesperrt. Gebe einige Kapitel frei um die Zeiten anzupassen.",
|
||||
"ToastChaptersHaveErrors": "Kapitel sind fehlerhaft",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Die Verschiebung ist nicht möglich, da die Startzeit des letzten Kapitels über die Gesamtdauer dieses Hörbuchs hinausgehen würde.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Ungültige Höhe der Verschiebung. Das erste Kapitel hätte eine Länge von Null oder eine negative Länge und würde vom zweiten Kapitel überschrieben werden. Erhöhen Sie die Startdauer des zweiten Kapitels.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Ungültige Höhe der Verschiebung. Das erste Kapitel hätte eine Länge von Null oder eine negative Länge und würde vom zweiten Kapitel überschrieben werden. Erhöhe die Startdauer des zweiten Kapitels.",
|
||||
"ToastChaptersMustHaveTitles": "Kapitel benötigen eindeutige Namen",
|
||||
"ToastChaptersRemoved": "Kapitel entfernt",
|
||||
"ToastChaptersUpdated": "Kapitel aktualisiert",
|
||||
"ToastCollectionItemsAddFailed": "Das Hinzufügen von Element(en) zur Sammlung ist fehlgeschlagen",
|
||||
"ToastCollectionRemoveSuccess": "Sammlung entfernt",
|
||||
"ToastCollectionUpdateSuccess": "Sammlung aktualisiert",
|
||||
"ToastConnectionNotAvailable": "Verbindung nicht möglich. Bitte später erneut versuchen",
|
||||
"ToastCoverSearchFailed": "Cover-Suche fehlgeschlagen",
|
||||
"ToastCoverUpdateFailed": "Cover-Update fehlgeschlagen",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Datum und Zeit sind ungültig oder unvollständig",
|
||||
"ToastDeleteFileFailed": "Die Datei konnte nicht gelöscht werden",
|
||||
@@ -1000,13 +1043,16 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Warteschlange für Episoden-Downloads gelöscht",
|
||||
"ToastEpisodeUpdateSuccess": "{0} Episoden aktualisiert",
|
||||
"ToastErrorCannotShare": "Das kann nicht nativ auf diesem Gerät freigegeben werden",
|
||||
"ToastFailedToLoadData": "Daten laden fehlgeschlagen",
|
||||
"ToastFailedToCreate": "Fehler beim Erzeugen",
|
||||
"ToastFailedToDelete": "Fehler beim Löschen",
|
||||
"ToastFailedToLoadData": "Fehler beim laden der Daten",
|
||||
"ToastFailedToMatch": "Fehler beim Abgleich",
|
||||
"ToastFailedToShare": "Fehler beim Teilen",
|
||||
"ToastFailedToUpdate": "Aktualisierung ist fehlgeschlagen",
|
||||
"ToastInvalidImageUrl": "Ungültiger Bild URL",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Ungültige Max. Anzahl an Episoden zum Herunterladen",
|
||||
"ToastInvalidUrl": "Ungültiger URL",
|
||||
"ToastInvalidUrls": "Eine oder mehrere URLs sind ungültig",
|
||||
"ToastItemCoverUpdateSuccess": "Titelbild aktualisiert",
|
||||
"ToastItemDeletedFailed": "Fehler beim löschen des Artikels",
|
||||
"ToastItemDeletedSuccess": "Artikel gelöscht",
|
||||
@@ -1031,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Es muss mindestens ein Pfad angegeben werden",
|
||||
"ToastNameEmailRequired": "Name und E-Mail sind erforderlich",
|
||||
"ToastNameRequired": "Name ist erforderlich",
|
||||
"ToastNewApiKeyUserError": "Bitte wähle einen Benutzer aus (Pflichtfeld)",
|
||||
"ToastNewEpisodesFound": "{0} neue Episoden gefunden",
|
||||
"ToastNewUserCreatedFailed": "Fehler beim erstellen des Accounts: \"{ 0}\"",
|
||||
"ToastNewUserCreatedSuccess": "Neuer Account erstellt",
|
||||
@@ -1055,11 +1102,12 @@
|
||||
"ToastPlaylistUpdateSuccess": "Wiedergabeliste aktualisiert",
|
||||
"ToastPodcastCreateFailed": "Podcast konnte nicht erstellt werden",
|
||||
"ToastPodcastCreateSuccess": "Podcast erstellt",
|
||||
"ToastPodcastGetFeedFailed": "Fehler beim abrufen des Podcast Feeds",
|
||||
"ToastPodcastEpisodeUpdated": "Podcast-Folge aktualisiert",
|
||||
"ToastPodcastGetFeedFailed": "Fehler beim abrufen des Podcast-Feeds",
|
||||
"ToastPodcastNoEpisodesInFeed": "Keine Episoden in RSS Feed gefunden",
|
||||
"ToastPodcastNoRssFeed": "Podcast enthält keinen RSS Feed",
|
||||
"ToastProgressIsNotBeingSynced": "Fortschritt wird nicht synchronisiert, Wiedergabe wird neu gestartet",
|
||||
"ToastProviderCreatedFailed": "Fehler beim hinzufügen des Anbieters",
|
||||
"ToastProviderCreatedFailed": "Fehler beim Hinzufügen des Anbieters",
|
||||
"ToastProviderCreatedSuccess": "Neuer Anbieter hinzugefügt",
|
||||
"ToastProviderNameAndUrlRequired": "Name und URL notwendig",
|
||||
"ToastProviderRemoveSuccess": "Anbieter entfernt",
|
||||
@@ -1105,5 +1153,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Passwort erfolgreich verändert",
|
||||
"ToastUserPasswordMismatch": "Passwörter stimmen nicht überein",
|
||||
"ToastUserPasswordMustChange": "Neues Passwort muss sich von altem Passwort unterscheiden",
|
||||
"ToastUserRootRequireName": "Root Benutzername muss angegeben werden"
|
||||
"ToastUserRootRequireName": "Root Benutzername muss angegeben werden",
|
||||
"TooltipAddChapters": "Kapitel hinzufügen",
|
||||
"TooltipAddOneSecond": "1 Sekunde hinzufügen",
|
||||
"TooltipAdjustChapterStart": "Klicke um die Startzeit anzupassen",
|
||||
"TooltipLockAllChapters": "Alle Kapitel sperren",
|
||||
"TooltipLockChapter": "Kapitel sperren (Shift+Klick für mehrere)",
|
||||
"TooltipSubtractOneSecond": "1 Sekunde abziehen",
|
||||
"TooltipUnlockAllChapters": "Alle Kapitel freigeben",
|
||||
"TooltipUnlockChapter": "Kapitel freigeben (Shift+Klick für mehrere)"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,324 @@
|
||||
{
|
||||
"ButtonAdd": "Προσθήκη",
|
||||
"ButtonAddApiKey": "Προσθήκη Κλειδιού API",
|
||||
"ButtonAddChapters": "Προσθήκη Κεφαλαίων",
|
||||
"ButtonAddDevice": "Προσθήκη Συσκευής",
|
||||
"ButtonAddLibrary": "Προσθήκη Βιβλιοθήκης",
|
||||
"ButtonAddPodcasts": "Προσθήκη Podcasts",
|
||||
"ButtonAddUser": "Προσθήκη Χρήστη",
|
||||
"ButtonAddYourFirstLibrary": "Πρόσθεσε την πρώτη σου βιβλιοθήκη",
|
||||
"ButtonApply": "Εφαρμογή",
|
||||
"ButtonApplyChapters": "Εφαρμογή Κεφαλαίων",
|
||||
"ButtonAuthors": "Συγγραφείς",
|
||||
"ButtonBack": "Πίσω",
|
||||
"ButtonBatchEditPopulateFromExisting": "Συμπλήρωση από υπάρχοντα",
|
||||
"ButtonBatchEditPopulateMapDetails": "Συμπλήρωση λεπτομερειών χάρτη",
|
||||
"ButtonBrowseForFolder": "Περιήγηση για Φάκελο",
|
||||
"ButtonCancel": "Ακύρωση",
|
||||
"ButtonCancelEncode": "Ακύρωση Κωδικοποίησης",
|
||||
"ButtonChangeRootPassword": "Αλλαγή Κωδικού Πρόσβασης Root",
|
||||
"ButtonCheckAndDownloadNewEpisodes": "Έλεγχος και Κατέβασμα Νέων Επεισοδίων",
|
||||
"ButtonChooseAFolder": "Επιλογή φακέλου",
|
||||
"ButtonChooseFiles": "Επιλογή αρχείων",
|
||||
"ButtonClearFilter": "Διαγραφή Φίλτρου",
|
||||
"ButtonClose": "Κλείσιμο",
|
||||
"ButtonCloseFeed": "Κλείσιμο Τροφοδοσίας",
|
||||
"ButtonCloseSession": "Κλείσιμο Ανοιχτής Συνεδρίας",
|
||||
"ButtonCollections": "Συλλογές",
|
||||
"ButtonConfigureScanner": "Ρύθμιση Παραμέτρων Σαρωτή",
|
||||
"ButtonCreate": "Δημιουργία",
|
||||
"ButtonCreateBackup": "Δημιουργία Αντιγράφου Ασφαλείας",
|
||||
"ButtonDelete": "Διαγραφή",
|
||||
"ButtonDownloadQueue": "Ουρά",
|
||||
"ButtonEdit": "Επεξεργασία",
|
||||
"ButtonEditChapters": "Επεξεργασία Κεφαλαίων",
|
||||
"ButtonEditPodcast": "Επεξεργασία Podcast",
|
||||
"ButtonEnable": "Ενεργοποίηση",
|
||||
"ButtonForceReScan": "Αναγκαστική Επανάληψη Σάρωσης",
|
||||
"ButtonFullPath": "Πλήρης Διαδρομή",
|
||||
"ButtonHide": "Απόκρυψη",
|
||||
"ButtonHome": "Αρχική",
|
||||
"ButtonIssues": "Θέματα",
|
||||
"ButtonJumpBackward": "Μεταπήδηση Πίσω",
|
||||
"ButtonJumpForward": "Μεταπήδηση Μπροστά",
|
||||
"ButtonLatest": "Τελευταία",
|
||||
"ButtonLibrary": "Βιβλιοθήκη",
|
||||
"ButtonLogout": "Αποσύνδεση",
|
||||
"ButtonLookup": "Εύρεση",
|
||||
"ButtonManageTracks": "Διαχείριση Κομματιών",
|
||||
"ButtonMapChapterTitles": "Χαρτογράφηση Τίτλων Κεφαλαίων",
|
||||
"ButtonMatchAllAuthors": "Αντιστοίχιση Όλων των Συγγραφέων",
|
||||
"ButtonMatchBooks": "Αντιστοίχιση Βιβλίων",
|
||||
"ButtonNevermind": "Άστο",
|
||||
"ButtonNext": "Επόμενο",
|
||||
"ButtonNextChapter": "Επόμενο Κεφάλαιο",
|
||||
"ButtonNextItemInQueue": "Επόμενο Αντικείμενο στην Ουρά",
|
||||
"ButtonOk": "Εντάξει",
|
||||
"ButtonOpenFeed": "Άνοιγμα Τροφοδοσίας",
|
||||
"ButtonOpenManager": "Άνοιγμα Διαχειριστή",
|
||||
"ButtonPause": "Παύση",
|
||||
"ButtonPlay": "Αναπαραγωγή",
|
||||
"ButtonPlayAll": "Αναπαραγωγή Όλων",
|
||||
"ButtonPlaying": "Αναπαράγεται",
|
||||
"ButtonPlaylists": "Λίστες Αναπαραγωγής",
|
||||
"ButtonPrevious": "Προηγούμενο",
|
||||
"ButtonPreviousChapter": "Προηγούμενο Κεφάλαιο",
|
||||
"ButtonProbeAudioFile": "Ανάλυση Αρχείου Ήχου",
|
||||
"ButtonPurgeAllCache": "Εκκαθάριση Όλης της Προσωρινής Μνήμης",
|
||||
"ButtonPurgeItemsCache": "Εκκαθάριση της Μνήμης Αντικειμένων",
|
||||
"ButtonQueueAddItem": "Προσθήκη στην ουρά",
|
||||
"ButtonQueueRemoveItem": "Αφαίρεση απ'την ουρά",
|
||||
"ButtonQuickEmbed": "Γρήγορη Ενσωμάτωση",
|
||||
"ButtonQuickEmbedMetadata": "Γρήγορη Ενσωμάτωση Μεταδεδομένων",
|
||||
"ButtonQuickMatch": "Γρήγορη Αντιστοίχηση",
|
||||
"ButtonReScan": "Επανασάρωση",
|
||||
"ButtonRead": "Ανάγνωση",
|
||||
"ButtonReadLess": "Ανάγνωση λιγότερων",
|
||||
"ButtonReadMore": "Διάβασε περισσότερα",
|
||||
"ButtonRefresh": "Ανανέωση",
|
||||
"ButtonRemove": "Αφαίρεση",
|
||||
"ButtonRemoveAll": "Αφαίρεση Όλων",
|
||||
"ButtonRemoveAllLibraryItems": "Αφαίρεση Όλων των Αντικειμέων Βιβλιοθήκης",
|
||||
"ButtonRemoveFromContinueListening": "Αφαίρεση από τη Συνέχεια Ακρόασης",
|
||||
"ButtonRemoveFromContinueReading": "Αφαίρεση από τη Συνέχεια Ανάγνωσης",
|
||||
"ButtonRemoveSeriesFromContinueSeries": "Αφαίρεση Σειράς από τη Συνέχεια Σειράς",
|
||||
"ButtonReset": "Επαναφορά",
|
||||
"ButtonResetToDefault": "Επαναφορά στις προεπιλογές",
|
||||
"ButtonRestore": "Επαναφορά",
|
||||
"ButtonSave": "Αποθήκευση",
|
||||
"ButtonSaveAndClose": "Αποθήκευση και Κλείσιμο",
|
||||
"ButtonSaveTracklist": "Αποθήκευση Λίστας Κομματιών",
|
||||
"ButtonScan": "Σάρψση",
|
||||
"ButtonScanLibrary": "Σάρωση Βιβλιοθήκης",
|
||||
"ButtonScrollLeft": "Κύλιση Αριστερά",
|
||||
"ButtonScrollRight": "Κύλιση Δεξιά",
|
||||
"ButtonSearch": "Αναζήτηση",
|
||||
"ButtonSelectFolderPath": "Επιλογή Διαδρομής Φακέλου",
|
||||
"ButtonSeries": "Σειρά",
|
||||
"ButtonSetChaptersFromTracks": "Ορισμός κεφαλαίων από τα κομμάτια",
|
||||
"ButtonShare": "Κοινοποίηση",
|
||||
"ButtonShiftTimes": "Χρόνοι Μετακίνησης",
|
||||
"ButtonShow": "Εμφάνιση",
|
||||
"ButtonStartM4BEncode": "Έναρξη Κωδικοποίησης M4B",
|
||||
"ButtonStartMetadataEmbed": "Έναρξη Ενσωμάτωσης Μεταδεδομένων",
|
||||
"ButtonStats": "Στατιστικά",
|
||||
"ButtonSubmit": "Υποβολή",
|
||||
"ButtonTest": "Δοκιμή",
|
||||
"ButtonUnlinkOpenId": "Αποσύνδεση OpenID",
|
||||
"ButtonUpload": "Μεταφόρτωση",
|
||||
"ButtonUploadBackup": "Μεταφόρτωση Αντιγράφου Ασφαλείας",
|
||||
"ButtonUploadCover": "Μεταφόρτωση Εξωφύλλου",
|
||||
"ButtonUploadOPMLFile": "Μεταφόρτωση Αρχείου OPML",
|
||||
"ButtonUserDelete": "Διαγραφή Χρήστη {0}",
|
||||
"ButtonUserEdit": "Επεξεργασίας χρήστη {0}",
|
||||
"ButtonViewAll": "Εμφάνιση Όλων",
|
||||
"ButtonYes": "Ναι",
|
||||
"ErrorUploadFetchMetadataAPI": "Σφάλμα κατά την ανάκτηση μεταδεδομένων",
|
||||
"ErrorUploadFetchMetadataNoResults": "Δεν ήταν δυνατή η ανάκτηση των μεταδεδομένων - δοκιμάστε να ενημερώσετε τον τίτλο και/ή τον συγγραφέα",
|
||||
"ErrorUploadLacksTitle": "Πρέπει να έχει τίτλο",
|
||||
"HeaderAccount": "Λογαριασμός",
|
||||
"HeaderAddCustomMetadataProvider": "Προσθήκη Προσαρμοσμένου Παρόχου Μεταδεδομένων",
|
||||
"HeaderAdvanced": "Για Προχωρημένους",
|
||||
"HeaderApiKeys": "Κλειδιά API",
|
||||
"HeaderAppriseNotificationSettings": "Ρυθμίσεις Ειδοποιήσεων Apprise",
|
||||
"HeaderAudioTracks": "Κομμάτια Ήχου",
|
||||
"HeaderAudiobookTools": "Εργαλεία Διαχείρισης Αρχείων Audiobooks",
|
||||
"HeaderAuthentication": "Αυθεντικοποίηση",
|
||||
"HeaderBackups": "Αντίγραφα Ασφαλείας",
|
||||
"HeaderBulkChapterModal": "Προσθήκη Πολλαπλών Κεφαλαίων",
|
||||
"HeaderChangePassword": "Αλλαγή Κωδικού Πρόσβασης",
|
||||
"HeaderChapters": "Κεφάλαια",
|
||||
"HeaderChooseAFolder": "Επιλογή Φακέλου",
|
||||
"HeaderCollection": "Συλλογή",
|
||||
"HeaderCollectionItems": "Αντικείμενα Συλλογής",
|
||||
"HeaderCover": "Εξώφυλλο",
|
||||
"HeaderCurrentDownloads": "Τρέχουσες Λήψεις",
|
||||
"HeaderDetails": "Λεπτομέρειες",
|
||||
"HeaderDownloadQueue": "Ουρά Λήψης",
|
||||
"HeaderEbookFiles": "Αρχεία Ebook",
|
||||
"HeaderEmail": "Ηλεκτρονικό Ταχυδρομίο",
|
||||
"HeaderEmailSettings": "Ρυθμίσεις Ηλεκτρονικού Ταχυδρομίου",
|
||||
"HeaderEpisodes": "Επεισόδια",
|
||||
"HeaderEreaderSettings": "Ρυθμίσεις Ereader",
|
||||
"HeaderFiles": "Αρχεία",
|
||||
"HeaderFindChapters": "Εύρεση Κεφαλαίων",
|
||||
"HeaderItemFiles": "Αρχεία Αντικειμένων",
|
||||
"HeaderLastListeningSession": "Τελευταία Συνεδρία Ακρόασης",
|
||||
"HeaderLatestEpisodes": "Τελευταία Επεισόδια",
|
||||
"HeaderLibraries": "Βιβλιοθήκες",
|
||||
"HeaderLibraryFiles": "Αρχεία Βιβλιοθήκης",
|
||||
"HeaderLibraryStats": "Στατιστικά Βιβλιοθήκης",
|
||||
"HeaderListeningSessions": "Συνεδρίες Ακρόασης",
|
||||
"HeaderListeningStats": "Στατιστικά Ακρόασης",
|
||||
"HeaderMatch": "Ταύτιση",
|
||||
"HeaderNewAccount": "Νέος Λογαριασμός",
|
||||
"HeaderNewApiKey": "Νέο Κλειδί API",
|
||||
"HeaderNewLibrary": "Νέα Βιβλιοθήκη",
|
||||
"HeaderNotificationCreate": "Δημιουργία Ειδοποίησης",
|
||||
"HeaderNotificationUpdate": "Ενημέρωση Ειδοποίησης",
|
||||
"HeaderNotifications": "Ειδοποιήσεις",
|
||||
"HeaderOpenRSSFeed": "Άνοιγμα Τροφοδοσίας RSS",
|
||||
"HeaderOtherFiles": "Άλλα Αρχεία",
|
||||
"HeaderPermissions": "Δικαιώματα",
|
||||
"HeaderPlayerSettings": "Ρυθμίσεις Αναπαραγωγής",
|
||||
"HeaderPlaylist": "Λίστα Αναπαραγωγής",
|
||||
"HeaderPlaylistItems": "Αντικείμενα Λίστας Αναπαραγωγής",
|
||||
"HeaderPresets": "Προεπιλογές",
|
||||
"HeaderRSSFeedGeneral": "Λεπτομέρειες RSS",
|
||||
"HeaderRSSFeedIsOpen": "Η Τροφοδοσία RSS είναι Ανοιχτή",
|
||||
"HeaderRemoveEpisode": "Αφαίρεση Επεισοδίου",
|
||||
"HeaderSession": "Συνεδρία",
|
||||
"HeaderSetBackupSchedule": "Ορισμός Προγράμματος Αντιγράφων Ασφαλείας",
|
||||
"HeaderSettings": "Ρυθμίσεις",
|
||||
"HeaderSettingsDisplay": "Προβολή",
|
||||
"HeaderSettingsGeneral": "Γενικά",
|
||||
"HeaderSettingsSecurity": "Ασφάλεια",
|
||||
"HeaderSleepTimer": "Χρονοδιακόπτης Ύπνου",
|
||||
"HeaderStatsLargestItems": "Μεγαλύτερα Αντικείμενα",
|
||||
"HeaderStatsLongestItems": "Μεγαλύτερα Αντικείμενα (ώρες)",
|
||||
"HeaderStatsMinutesListeningChart": "Λεπτά Ακρόασης (τελευταίες 7 ημέρες)",
|
||||
"HeaderStatsRecentSessions": "Πρόσφατες Συνεδρίες",
|
||||
"HeaderStatsTop10Authors": "10 Κορυφαίου Συγγραφείς",
|
||||
"HeaderStatsTop5Genres": "5 Κορυφαία Είδη",
|
||||
"HeaderTableOfContents": "Πίνακας Περιεχομένων",
|
||||
"HeaderTools": "Εργαλεία",
|
||||
"HeaderUpdateAccount": "Ενημέρωση Λογαριασμού",
|
||||
"HeaderUpdateApiKey": "Ενημέρωση Κλειδιού API",
|
||||
"HeaderUpdateAuthor": "Ενημέρωση Συγγραφέα",
|
||||
"HeaderUpdateDetails": "Ενημέρωση Λεπτομερειεών",
|
||||
"HeaderUpdateLibrary": "Ενημέρωση Βιβλιοθήκης",
|
||||
"HeaderUsers": "Χρήστες",
|
||||
"HeaderYourStats": "Τα Στατιστικά Σας",
|
||||
"LabelAbridged": "Συνοπτικό",
|
||||
"LabelAccessibleBy": "Προσβάσιμο από",
|
||||
"LabelAccountType": "Τύπος Λογαριασμού",
|
||||
"LabelAccountTypeAdmin": "Διαχειριστής",
|
||||
"LabelAccountTypeGuest": "Επισκέπτης",
|
||||
"LabelAccountTypeUser": "Χρήστης",
|
||||
"LabelAddToCollection": "Προσθήκη σε Συλλογή",
|
||||
"LabelAddToCollectionBatch": "Προσθήκη {0} Βιβλίων στην Συλλογή",
|
||||
"LabelAddToPlaylist": "Προσθήκη στην Λίστα Αναπαραγωγής",
|
||||
"LabelAddedAt": "Προστέθηκε Στις",
|
||||
"LabelAddedDate": "Προστέθηκε {0}",
|
||||
"LabelAll": "Όλα",
|
||||
"LabelAllEpisodesDownloaded": "Όλα τα επεισόδια λήφθηκαν",
|
||||
"LabelAllUsers": "Όλοι οι Χρήστες",
|
||||
"LabelAlreadyInYourLibrary": "Υπάρχει ήδη στην βιβλιοθήκη",
|
||||
"LabelAudioChannels": "Κανάλια Ήχου (1 ή 2)",
|
||||
"LabelAuthor": "Συγγραφέας",
|
||||
"LabelAuthorFirstLast": "Συγγραφέας (Όνομα Επώνυμο)",
|
||||
"LabelAuthorLastFirst": "Συγγραφέας (Επώνυμο, Όνομα)",
|
||||
"LabelAuthors": "Συγγραφείς",
|
||||
"LabelAutoDownloadEpisodes": "Αυτόματο Κατέβασμα Επεισοδίων",
|
||||
"LabelAutoLaunch": "Αυτόματη Εκκίνηση",
|
||||
"LabelBackupLocation": "Τοποθεσία Αντιγράφου Ασφαλείας",
|
||||
"LabelBackupsEnableAutomaticBackups": "Αυτόματα αντίγραφα ασφαλείας",
|
||||
"LabelBackupsNumberToKeep": "Αριθμός αντιγράφων ασφαλείας προς διατήρηση",
|
||||
"LabelBooks": "Βιβλία",
|
||||
"LabelButtonText": "Κείμενο Κουμπιού",
|
||||
"LabelByAuthor": "κατά {0}",
|
||||
"LabelChangePassword": "Αλλαγή Κωδικού Πρόσβασης",
|
||||
"LabelChannels": "Κανάλια",
|
||||
"LabelChapterCount": "{0} Κεφάλαια",
|
||||
"LabelChapterTitle": "Τίτλος Κεφαλαίου",
|
||||
"LabelChapters": "Κεφάλαια",
|
||||
"LabelChaptersFound": "κεφάλαια βρέθηκαν",
|
||||
"LabelClosePlayer": "Κλείσιμο αναπαραγωγής",
|
||||
"LabelCollapseSeries": "Σύμπτυξη Σειράς",
|
||||
"LabelCollection": "Συλλογή",
|
||||
"LabelCollections": "Συλλογές",
|
||||
"LabelComplete": "Ολοκλήρωση",
|
||||
"LabelConfirmPassword": "Επιβεβαίωση Κωδικού Πρόσβασης",
|
||||
"LabelContinueListening": "Συνέχεια Ακρόασης",
|
||||
"LabelContinueReading": "Συνέχεια Ανάγνωσης",
|
||||
"LabelContinueSeries": "Συνέχεια Σειράς",
|
||||
"LabelCover": "Εξώφυλλο",
|
||||
"LabelCoverImageURL": "URL Εικόνας Εξωφύλλου",
|
||||
"LabelCoverProvider": "Πάροχος Εξωφύλλου",
|
||||
"LabelCreatedAt": "Δημιουρήθηκε Στις",
|
||||
"LabelCurrent": "Τρέχων",
|
||||
"LabelCurrently": "Τρέχων:",
|
||||
"LabelDays": "Ημέρες",
|
||||
"LabelDescription": "Περιγραφή",
|
||||
"LabelDevice": "Συσκευή",
|
||||
"LabelDeviceInfo": "Πληροφορίες Συσκευής",
|
||||
"LabelDownload": "Λήψη",
|
||||
"LabelDownloadNEpisodes": "Λήψη {0} επεισοδίων",
|
||||
"LabelDuration": "Διάρκεια",
|
||||
"LabelDurationComparisonExactMatch": "(ακριβής ταύτιση)",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbooks": "Ebooks",
|
||||
"LabelEdit": "Επεξεργασία",
|
||||
"LabelEmail": "Ηλεκτρονικό Ταχυδρομίο",
|
||||
"LabelEmailSettingsFromAddress": "Από Διεύθυνση",
|
||||
"LabelEmailSettingsSecure": "Ασφαλές",
|
||||
"LabelEmailSettingsTestAddress": "Δοκιμή Διεύθυνσης",
|
||||
"LabelEmbeddedCover": "Ενσωματωμένο Εξώφυλλο",
|
||||
"LabelEnable": "Ενεργοποίηση",
|
||||
"LabelEnd": "Τέλος",
|
||||
"LabelEndOfChapter": "Τέλος Κεφαλαίου",
|
||||
"LabelEpisode": "Επεισόδιο",
|
||||
"LabelFile": "Αρχείο",
|
||||
"LabelFilename": "Όνομα Αρχείου",
|
||||
"LabelFinished": "Ολοκληρώθηκε",
|
||||
"LabelFolder": "Φάκελος",
|
||||
"LabelFontFamily": "Οικογένεια Γραμματοσειράς",
|
||||
"LabelGenre": "Είδος",
|
||||
"LabelGenres": "Είδη",
|
||||
"LabelHost": "Διακομιστής",
|
||||
"LabelInProgress": "Σε Εξέλιξη",
|
||||
"LabelLanguage": "Γλώσσα",
|
||||
"LabelLayoutSinglePage": "Μονή Σελίδα",
|
||||
"LabelListenAgain": "Επανάληψη Ακρόασης",
|
||||
"LabelMediaType": "Τύπος Πολυμέσων",
|
||||
"LabelMore": "Περισσότερα",
|
||||
"LabelMoreInfo": "Περισσότερες Πληροφορίες",
|
||||
"LabelName": "Όνομα",
|
||||
"LabelNarrator": "Αφηγητής",
|
||||
"LabelNarrators": "Αφηγητές",
|
||||
"LabelNewestAuthors": "Πρόσφατοι Συγγραφείς",
|
||||
"LabelNewestEpisodes": "Πρόσφατα Επεισόδια",
|
||||
"LabelNotStarted": "Δεν Έχει Ξεκινήσει",
|
||||
"LabelNumberOfEpisodes": "# Επεισοδίων",
|
||||
"LabelPassword": "Κωδικός Πρόσβασης",
|
||||
"LabelPath": "Διαδρομή",
|
||||
"LabelProgress": "Πρόοδος",
|
||||
"LabelPublishYear": "Χρονολογία Έκδοσης",
|
||||
"LabelPublishedDate": "Εκδόθηκε {0}",
|
||||
"LabelRandomly": "Τυχαία",
|
||||
"LabelRead": "Ανάγνωση",
|
||||
"LabelReadAgain": "Ανάγνωση Ξανά",
|
||||
"LabelRecentSeries": "Πρόσφατη Σειρά",
|
||||
"LabelRecentlyAdded": "Προστέθηκαν Πρόσφατα",
|
||||
"LabelSeries": "Σειρά",
|
||||
"LabelSetEbookAsPrimary": "Ορισμός ως πρωτεύων",
|
||||
"LabelShowAll": "Εμφάνιση Όλων",
|
||||
"LabelSize": "Μέγεθος",
|
||||
"LabelSleepTimer": "Χρονοδιακόπτης Ύπνου",
|
||||
"LabelStart": "Έναρξη",
|
||||
"LabelStatsBestDay": "Καλύτερη Ημέρα",
|
||||
"LabelStatsDailyAverage": "Ημερήσιος Μέσος Όρος",
|
||||
"LabelStatsDays": "Ημέρες",
|
||||
"LabelStatsDaysListened": "Ημέρες Ακρόασης",
|
||||
"LabelStatsInARow": "Σε σειρά",
|
||||
"LabelStatsItemsFinished": "Ολοκληρωμένα Αντικείμενα",
|
||||
"LabelStatsMinutes": "λεπτά",
|
||||
"LabelStatsMinutesListening": "Λεπτά Ακρόασης",
|
||||
"LabelStatsWeekListening": "Εβδομαδιαία Ακρόαση",
|
||||
"LabelTheme": "Θέμα",
|
||||
"LabelThemeDark": "Σκοτεινό",
|
||||
"LabelThemeLight": "Φωτεινό",
|
||||
"LabelTimeRemaining": "{0} απομένουν",
|
||||
"LabelTitle": "Τίτλος",
|
||||
"LabelTracks": "Κομμάτια",
|
||||
"LabelType": "Τύπος",
|
||||
"LabelUnknown": "Άγνωστο",
|
||||
"LabelUser": "Χρήστης",
|
||||
"LabelUsername": "Όνομα Χρήστη",
|
||||
"LabelYourProgress": "Η Πρόοδος Σας",
|
||||
"MessageDownloadingEpisode": "Λήψη επεισοδίου",
|
||||
"MessageLoading": "Φόρτωση...",
|
||||
"MessageMarkAsFinished": "Σήμανση ως Ολοκληρωμένο",
|
||||
"MessageNoItemsFound": "Δεν βρέθηκαν αντικείμενα",
|
||||
"MessageNoUserPlaylists": "Δεν έχετε λίστες αναπαραγωγής"
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Add",
|
||||
"ButtonAddApiKey": "Add API Key",
|
||||
"ButtonAddChapters": "Add Chapters",
|
||||
"ButtonAddDevice": "Add Device",
|
||||
"ButtonAddLibrary": "Add Library",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Choose a folder",
|
||||
"ButtonChooseFiles": "Choose files",
|
||||
"ButtonClearFilter": "Clear Filter",
|
||||
"ButtonClose": "Close",
|
||||
"ButtonCloseFeed": "Close Feed",
|
||||
"ButtonCloseSession": "Close Open Session",
|
||||
"ButtonCollections": "Collections",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Account",
|
||||
"HeaderAddCustomMetadataProvider": "Add Custom Metadata Provider",
|
||||
"HeaderAdvanced": "Advanced",
|
||||
"HeaderApiKeys": "API Keys",
|
||||
"HeaderAppriseNotificationSettings": "Apprise Notification Settings",
|
||||
"HeaderAudioTracks": "Audio Tracks",
|
||||
"HeaderAudiobookTools": "Audiobook File Management Tools",
|
||||
"HeaderAuthentication": "Authentication",
|
||||
"HeaderBackups": "Backups",
|
||||
"HeaderBulkChapterModal": "Add Multiple Chapters",
|
||||
"HeaderChangePassword": "Change Password",
|
||||
"HeaderChapters": "Chapters",
|
||||
"HeaderChooseAFolder": "Choose a Folder",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Metadata order of precedence",
|
||||
"HeaderMetadataToEmbed": "Metadata to embed",
|
||||
"HeaderNewAccount": "New Account",
|
||||
"HeaderNewApiKey": "New API Key",
|
||||
"HeaderNewLibrary": "New Library",
|
||||
"HeaderNotificationCreate": "Create Notification",
|
||||
"HeaderNotificationUpdate": "Update Notification",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Experimental Features",
|
||||
"HeaderSettingsGeneral": "General",
|
||||
"HeaderSettingsScanner": "Scanner",
|
||||
"HeaderSettingsSecurity": "Security",
|
||||
"HeaderSettingsWebClient": "Web Client",
|
||||
"HeaderSleepTimer": "Sleep Timer",
|
||||
"HeaderStatsLargestItems": "Largest Items",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Table of Contents",
|
||||
"HeaderTools": "Tools",
|
||||
"HeaderUpdateAccount": "Update Account",
|
||||
"HeaderUpdateApiKey": "Update API Key",
|
||||
"HeaderUpdateAuthor": "Update Author",
|
||||
"HeaderUpdateDetails": "Update Details",
|
||||
"HeaderUpdateLibrary": "Update Library",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "All users excluding guests",
|
||||
"LabelAllUsersIncludingGuests": "All users including guests",
|
||||
"LabelAlreadyInYourLibrary": "Already in your library",
|
||||
"LabelApiKeyCreated": "API Key \"{0}\" created successfully.",
|
||||
"LabelApiKeyCreatedDescription": "Make sure to copy the API key now as you will not be able to see this again.",
|
||||
"LabelApiKeyUser": "Act on behalf of user",
|
||||
"LabelApiKeyUserDescription": "This API key will have the same permissions as the user it is acting on behalf of. This will appear the same in logs as if the user was making the request.",
|
||||
"LabelApiToken": "API Token",
|
||||
"LabelAppend": "Append",
|
||||
"LabelAudioBitrate": "Audio Bitrate (e.g. 128k)",
|
||||
@@ -284,6 +295,7 @@
|
||||
"LabelContinueListening": "Continue Listening",
|
||||
"LabelContinueReading": "Continue Reading",
|
||||
"LabelContinueSeries": "Continue Series",
|
||||
"LabelCorsAllowed": "Allowed CORS Origins",
|
||||
"LabelCover": "Cover",
|
||||
"LabelCoverImageURL": "Cover Image URL",
|
||||
"LabelCoverProvider": "Cover Provider",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Delete from file system (uncheck to only remove from database)",
|
||||
"LabelDescription": "Description",
|
||||
"LabelDeselectAll": "Deselect All",
|
||||
"LabelDetectedPattern": "Detected pattern:",
|
||||
"LabelDevice": "Device",
|
||||
"LabelDeviceInfo": "Device Info",
|
||||
"LabelDeviceIsAvailableTo": "Device is available to...",
|
||||
@@ -346,6 +359,10 @@
|
||||
"LabelExample": "Example",
|
||||
"LabelExpandSeries": "Expand Series",
|
||||
"LabelExpandSubSeries": "Expand Sub Series",
|
||||
"LabelExpired": "Expired",
|
||||
"LabelExpiresAt": "Expires At",
|
||||
"LabelExpiresInSeconds": "Expires in (seconds)",
|
||||
"LabelExpiresNever": "Never",
|
||||
"LabelExplicit": "Explicit",
|
||||
"LabelExplicitChecked": "Explicit (checked)",
|
||||
"LabelExplicitUnchecked": "Not Explicit (unchecked)",
|
||||
@@ -361,6 +378,7 @@
|
||||
"LabelFilterByUser": "Filter by User",
|
||||
"LabelFindEpisodes": "Find Episodes",
|
||||
"LabelFinished": "Finished",
|
||||
"LabelFinishedDate": "Finished {0}",
|
||||
"LabelFolder": "Folder",
|
||||
"LabelFolders": "Folders",
|
||||
"LabelFontBold": "Bold",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "Languages",
|
||||
"LabelLastBookAdded": "Last Book Added",
|
||||
"LabelLastBookUpdated": "Last Book Updated",
|
||||
"LabelLastProgressDate": "Last progress: {0}",
|
||||
"LabelLastSeen": "Last Seen",
|
||||
"LabelLastTime": "Last Time",
|
||||
"LabelLastUpdate": "Last Update",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "No {0}",
|
||||
"LabelLibraryItem": "Library Item",
|
||||
"LabelLibraryName": "Library Name",
|
||||
"LabelLibrarySortByProgress": "Progress: Last Updated",
|
||||
"LabelLibrarySortByProgressFinished": "Progress: Finished",
|
||||
"LabelLibrarySortByProgressStarted": "Progress: Started",
|
||||
"LabelLimit": "Limit",
|
||||
"LabelLineSpacing": "Line spacing",
|
||||
"LabelListenAgain": "Listen Again",
|
||||
@@ -425,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Warn",
|
||||
"LabelLookForNewEpisodesAfterDate": "Look for new episodes after this date",
|
||||
"LabelLowestPriority": "Lowest Priority",
|
||||
"LabelMatchConfidence": "Confidence",
|
||||
"LabelMatchExistingUsersBy": "Match existing users by",
|
||||
"LabelMatchExistingUsersByDescription": "Used for connecting existing users. Once connected, users will be matched by a unique id from your SSO provider",
|
||||
"LabelMaxEpisodesToDownload": "Max # of episodes to download. Use 0 for unlimited.",
|
||||
@@ -454,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Newest Authors",
|
||||
"LabelNewestEpisodes": "Newest Episodes",
|
||||
"LabelNextBackupDate": "Next backup date",
|
||||
"LabelNextChapters": "Next chapters will be:",
|
||||
"LabelNextScheduledRun": "Next scheduled run",
|
||||
"LabelNoApiKeys": "No API keys",
|
||||
"LabelNoCustomMetadataProviders": "No custom metadata providers",
|
||||
"LabelNoEpisodesSelected": "No episodes selected",
|
||||
"LabelNotFinished": "Not Finished",
|
||||
@@ -470,6 +495,7 @@
|
||||
"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.",
|
||||
"LabelNumberOfBooks": "Number of Books",
|
||||
"LabelNumberOfChapters": "Number of chapters:",
|
||||
"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:",
|
||||
"LabelOpenIDClaims": "Leave the following options empty to disable advanced group and permissions assignment, automatically assigning 'User' group then.",
|
||||
@@ -544,6 +570,7 @@
|
||||
"LabelSelectAll": "Select all",
|
||||
"LabelSelectAllEpisodes": "Select all episodes",
|
||||
"LabelSelectEpisodesShowing": "Select {0} episodes showing",
|
||||
"LabelSelectUser": "Select user",
|
||||
"LabelSelectUsers": "Select users",
|
||||
"LabelSendEbookToDevice": "Send Ebook to...",
|
||||
"LabelSequence": "Sequence",
|
||||
@@ -561,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Skeumorphic design with wooden shelves",
|
||||
"LabelSettingsChromecastSupport": "Chromecast support",
|
||||
"LabelSettingsDateFormat": "Date Format",
|
||||
"LabelSettingsEnableWatcher": "Automatically scan libraries for changes",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automatically scan library for changes",
|
||||
"LabelSettingsEnableWatcher": "Automatically watch libraries for changes",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automatically watch library for changes",
|
||||
"LabelSettingsEnableWatcherHelp": "Enables the automatic adding/updating of items when file changes are detected. *Requires server restart",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Allow scripted content in epubs",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Allow epub files to execute scripts. It is recommended to keep this setting disabled unless you trust the source of the epub files.",
|
||||
@@ -611,6 +638,7 @@
|
||||
"LabelStartTime": "Start Time",
|
||||
"LabelStarted": "Started",
|
||||
"LabelStartedAt": "Started At",
|
||||
"LabelStartedDate": "Started {0}",
|
||||
"LabelStatsAudioTracks": "Audio Tracks",
|
||||
"LabelStatsAuthors": "Authors",
|
||||
"LabelStatsBestDay": "Best Day",
|
||||
@@ -640,6 +668,7 @@
|
||||
"LabelTheme": "Theme",
|
||||
"LabelThemeDark": "Dark",
|
||||
"LabelThemeLight": "Light",
|
||||
"LabelThemeSepia": "Sepia",
|
||||
"LabelTimeBase": "Time Base",
|
||||
"LabelTimeDurationXHours": "{0} hours",
|
||||
"LabelTimeDurationXMinutes": "{0} minutes",
|
||||
@@ -708,7 +737,9 @@
|
||||
"MessageAddToPlayerQueue": "Add to player queue",
|
||||
"MessageAppriseDescription": "To use this feature you will need to have an instance of <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> running or an api that will handle those same requests. <br />The Apprise API Url should be the full URL path to send the notification, e.g., if your API instance is served at <code>http://192.168.1.1:8337</code> then you would put <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Ensure you are using the ASIN from the correct Audible region, not Amazon.",
|
||||
"MessageAuthenticationLegacyTokenWarning": "Legacy API tokens will be removed in the future. Use <a href=\"/config/api-keys\">API Keys</a> instead.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Restart your server after saving to apply OIDC changes.",
|
||||
"MessageAuthenticationSecurityMessage": "Authentication has been improved for security. All users are required to re-login.",
|
||||
"MessageBackupsDescription": "Backups include users, user progress, library item details, server settings, and images stored in <code>/metadata/items</code> & <code>/metadata/authors</code>. Backups <strong>do not</strong> include any files stored in your library folders.",
|
||||
"MessageBackupsLocationEditNote": "Note: Updating the backup location will not move or modify existing backups",
|
||||
"MessageBackupsLocationNoEditNote": "Note: The backup location is set through an environment variable and cannot be changed here.",
|
||||
@@ -722,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "No results for filter \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "No results for query",
|
||||
"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",
|
||||
"MessageChapterErrorFirstNotZero": "First chapter must start at 0",
|
||||
"MessageChapterErrorStartGteDuration": "Invalid start time must be less than audiobook duration",
|
||||
@@ -730,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Chapters not found",
|
||||
"MessageCheckingCron": "Checking cron...",
|
||||
"MessageConfirmCloseFeed": "Are you sure you want to close this feed?",
|
||||
"MessageConfirmDeleteApiKey": "Are you sure you want to delete API key \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?",
|
||||
"MessageConfirmDeleteDevice": "Are you sure you want to delete e-reader device \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?",
|
||||
@@ -783,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "Feed URL will be {0}",
|
||||
"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.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} listening</strong> on {1}",
|
||||
"MessageHeatmapNoListeningSessions": "No listening sessions on {0}",
|
||||
"MessageImportantNotice": "Important Notice!",
|
||||
"MessageInsertChapterBelow": "Insert chapter below",
|
||||
"MessageInvalidAsin": "Invalid ASIN",
|
||||
@@ -853,7 +888,7 @@
|
||||
"MessageResetChaptersConfirm": "Are you sure you want to reset chapters and undo the changes you made?",
|
||||
"MessageRestoreBackupConfirm": "Are you sure you want to restore the backup created on",
|
||||
"MessageRestoreBackupWarning": "Restoring a backup will overwrite the entire database located at /config and cover images in /metadata/items & /metadata/authors.<br /><br />Backups do not modify any files in your library folders. If you have enabled server settings to store cover art and metadata in your library folders then those are not backed up or overwritten.<br /><br />All clients using your server will be automatically refreshed.",
|
||||
"MessageScheduleLibraryScanNote": "For most users, it is recommended to leave this feature disabled and keep the folder watcher setting enabled. The folder watcher will automatically detect changes in your library folders. The folder watcher doesn't work for every file system (like NFS) so scheduled library scans can be used instead.",
|
||||
"MessageScheduleLibraryScanNote": "For most users, it is recommended to leave this feature disabled and keep the \"Automatically watch library for changes\" setting enabled - it will automatically detect changes in your library folders. Enable this feature if \"Automatically watch library for changes\" does not work for your file system (like NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Run every {0} at {1}",
|
||||
"MessageSearchResultsFor": "Search results for",
|
||||
"MessageSelected": "{0} selected",
|
||||
@@ -922,6 +957,7 @@
|
||||
"NotificationOnRSSFeedDisabledDescription": "Triggered when automatic episode downloads are disabled due to too many failed attempts",
|
||||
"NotificationOnRSSFeedFailedDescription": "Triggered when the RSS feed request fails for an automatic episode download",
|
||||
"NotificationOnTestDescription": "Event for testing the notification system",
|
||||
"PlaceholderBulkChapterInput": "Enter chapter title or use numbering (e.g., 'Episode 1', 'Chapter 10', '1.')",
|
||||
"PlaceholderNewCollection": "New collection name",
|
||||
"PlaceholderNewFolderPath": "New folder path",
|
||||
"PlaceholderNewPlaylist": "New playlist name",
|
||||
@@ -975,8 +1011,12 @@
|
||||
"ToastBookmarkCreateFailed": "Failed to create bookmark",
|
||||
"ToastBookmarkCreateSuccess": "Bookmark added",
|
||||
"ToastBookmarkRemoveSuccess": "Bookmark removed",
|
||||
"ToastBulkChapterInvalidCount": "Enter a number between 1 and 150",
|
||||
"ToastCachePurgeFailed": "Failed to purge cache",
|
||||
"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",
|
||||
"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.",
|
||||
@@ -986,6 +1026,8 @@
|
||||
"ToastCollectionItemsAddFailed": "Item(s) added to collection failed",
|
||||
"ToastCollectionRemoveSuccess": "Collection removed",
|
||||
"ToastCollectionUpdateSuccess": "Collection updated",
|
||||
"ToastConnectionNotAvailable": "Connection not available. Please try again later",
|
||||
"ToastCoverSearchFailed": "Cover search failed",
|
||||
"ToastCoverUpdateFailed": "Cover update failed",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Date and time is invalid or incomplete",
|
||||
"ToastDeleteFileFailed": "Failed to delete file",
|
||||
@@ -1001,6 +1043,8 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Episode download queue cleared",
|
||||
"ToastEpisodeUpdateSuccess": "{0} episodes updated",
|
||||
"ToastErrorCannotShare": "Cannot share natively on this device",
|
||||
"ToastFailedToCreate": "Failed to create",
|
||||
"ToastFailedToDelete": "Failed to delete",
|
||||
"ToastFailedToLoadData": "Failed to load data",
|
||||
"ToastFailedToMatch": "Failed to match",
|
||||
"ToastFailedToShare": "Failed to share",
|
||||
@@ -1008,6 +1052,7 @@
|
||||
"ToastInvalidImageUrl": "Invalid image URL",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Invalid max episodes to download",
|
||||
"ToastInvalidUrl": "Invalid URL",
|
||||
"ToastInvalidUrls": "One or more URLs are invalid",
|
||||
"ToastItemCoverUpdateSuccess": "Item cover updated",
|
||||
"ToastItemDeletedFailed": "Failed to delete item",
|
||||
"ToastItemDeletedSuccess": "Deleted item",
|
||||
@@ -1032,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Must have at least one path",
|
||||
"ToastNameEmailRequired": "Name and email are required",
|
||||
"ToastNameRequired": "Name is required",
|
||||
"ToastNewApiKeyUserError": "Must select a user",
|
||||
"ToastNewEpisodesFound": "{0} new episodes found",
|
||||
"ToastNewUserCreatedFailed": "Failed to create account: \"{0}\"",
|
||||
"ToastNewUserCreatedSuccess": "New account created",
|
||||
@@ -1056,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Playlist updated",
|
||||
"ToastPodcastCreateFailed": "Failed to create podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast created successfully",
|
||||
"ToastPodcastEpisodeUpdated": "Episode updated",
|
||||
"ToastPodcastGetFeedFailed": "Failed to get podcast feed",
|
||||
"ToastPodcastNoEpisodesInFeed": "No episodes found in RSS feed",
|
||||
"ToastPodcastNoRssFeed": "Podcast does not have an RSS feed",
|
||||
@@ -1106,5 +1153,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Password changed successfully",
|
||||
"ToastUserPasswordMismatch": "Passwords do not match",
|
||||
"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)"
|
||||
}
|
||||
|
||||
+37
-3
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Añadir",
|
||||
"ButtonAddApiKey": "Añadir clave API",
|
||||
"ButtonAddChapters": "Añadir capítulos",
|
||||
"ButtonAddDevice": "Añadir dispositivo",
|
||||
"ButtonAddLibrary": "Añadir biblioteca",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Elegir una carpeta",
|
||||
"ButtonChooseFiles": "Elegir archivos",
|
||||
"ButtonClearFilter": "Quitar filtros",
|
||||
"ButtonClose": "Cerrar",
|
||||
"ButtonCloseFeed": "Cerrar suministro",
|
||||
"ButtonCloseSession": "Cerrar la sesión abierta",
|
||||
"ButtonCollections": "Colecciones",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Cuenta",
|
||||
"HeaderAddCustomMetadataProvider": "Añadir proveedor de metadatos personalizado",
|
||||
"HeaderAdvanced": "Avanzado",
|
||||
"HeaderApiKeys": "Claves API",
|
||||
"HeaderAppriseNotificationSettings": "Configuración de notificaciones de Apprise",
|
||||
"HeaderAudioTracks": "Pistas de audio",
|
||||
"HeaderAudiobookTools": "Herramientas de Gestión de Archivos de Audiolibro",
|
||||
"HeaderAuthentication": "Autenticación",
|
||||
"HeaderBackups": "Respaldos",
|
||||
"HeaderBulkChapterModal": "Añadir Múltiples Capítulos",
|
||||
"HeaderChangePassword": "Cambiar contraseña",
|
||||
"HeaderChapters": "Capítulos",
|
||||
"HeaderChooseAFolder": "Escoger una Carpeta",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Orden de precedencia de metadatos",
|
||||
"HeaderMetadataToEmbed": "Metadatos para Insertar",
|
||||
"HeaderNewAccount": "Cuenta nueva",
|
||||
"HeaderNewApiKey": "Nueva clave API",
|
||||
"HeaderNewLibrary": "Biblioteca nueva",
|
||||
"HeaderNotificationCreate": "Crear notificación",
|
||||
"HeaderNotificationUpdate": "Notificación de actualización",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Funcionalidades experimentales",
|
||||
"HeaderSettingsGeneral": "Generales",
|
||||
"HeaderSettingsScanner": "Escáner",
|
||||
"HeaderSettingsSecurity": "Seguridad",
|
||||
"HeaderSettingsWebClient": "Cliente web",
|
||||
"HeaderSleepTimer": "Temporizador de apagado",
|
||||
"HeaderStatsLargestItems": "Elementos más grandes",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Sumario",
|
||||
"HeaderTools": "Herramientas",
|
||||
"HeaderUpdateAccount": "Actualizar cuenta",
|
||||
"HeaderUpdateApiKey": "Actualizar clave API",
|
||||
"HeaderUpdateAuthor": "Actualizar autor",
|
||||
"HeaderUpdateDetails": "Actualizar detalles",
|
||||
"HeaderUpdateLibrary": "Actualizar biblioteca",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Todos los usuarios excepto invitados",
|
||||
"LabelAllUsersIncludingGuests": "Todos los usuarios e invitados",
|
||||
"LabelAlreadyInYourLibrary": "Ya existe en la Biblioteca",
|
||||
"LabelApiKeyCreated": "La clave de API “{0}” se ha creado con éxito.",
|
||||
"LabelApiKeyCreatedDescription": "Asegúrate de copiar la clave de API ahora, no la volverás a ver otra vez.",
|
||||
"LabelApiKeyUser": "Actuar en nombre del usuario",
|
||||
"LabelApiKeyUserDescription": "Esta clave de API tendrá los mismos permisos que el usuario al que representa. En los registros se verá como si la solicitud la hubiera hecho el usuario directamente.",
|
||||
"LabelApiToken": "Token de la API",
|
||||
"LabelAppend": "Adjuntar",
|
||||
"LabelAudioBitrate": "Tasa de bits del audio (por ejemplo, 128k)",
|
||||
@@ -264,7 +275,7 @@
|
||||
"LabelBonus": "Bonus",
|
||||
"LabelBooks": "Libros",
|
||||
"LabelButtonText": "Texto del botón",
|
||||
"LabelByAuthor": "por {0}",
|
||||
"LabelByAuthor": "por",
|
||||
"LabelChangePassword": "Cambiar contraseña",
|
||||
"LabelChannels": "Canales",
|
||||
"LabelChapterCount": "{0} capítulos",
|
||||
@@ -284,6 +295,7 @@
|
||||
"LabelContinueListening": "Seguir escuchando",
|
||||
"LabelContinueReading": "Continuar leyendo",
|
||||
"LabelContinueSeries": "Continuar series",
|
||||
"LabelCorsAllowed": "Orígenes CORS Permitidos",
|
||||
"LabelCover": "Cubierta",
|
||||
"LabelCoverImageURL": "URL de imagen de cubierta",
|
||||
"LabelCoverProvider": "Proveedor de cubiertas",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Eliminar del sistema de archivos (desmarque para quitar de la base de datos solamente)",
|
||||
"LabelDescription": "Descripción",
|
||||
"LabelDeselectAll": "Deseleccionar Todos",
|
||||
"LabelDetectedPattern": "Patrón detectado:",
|
||||
"LabelDevice": "Dispositivo",
|
||||
"LabelDeviceInfo": "Información del dispositivo",
|
||||
"LabelDeviceIsAvailableTo": "El dispositivo está disponible para...",
|
||||
@@ -346,6 +359,10 @@
|
||||
"LabelExample": "Ejemplo",
|
||||
"LabelExpandSeries": "Ampliar serie",
|
||||
"LabelExpandSubSeries": "Expandir la subserie",
|
||||
"LabelExpired": "Expirado",
|
||||
"LabelExpiresAt": "Expira El",
|
||||
"LabelExpiresInSeconds": "Expira en (segundos)",
|
||||
"LabelExpiresNever": "Nunca",
|
||||
"LabelExplicit": "Explícito",
|
||||
"LabelExplicitChecked": "Explícito (marcado)",
|
||||
"LabelExplicitUnchecked": "No Explícito (sin marcar)",
|
||||
@@ -454,6 +471,7 @@
|
||||
"LabelNewestAuthors": "Autores más nuevos",
|
||||
"LabelNewestEpisodes": "Episodios más nuevos",
|
||||
"LabelNextBackupDate": "Fecha del siguiente respaldo",
|
||||
"LabelNextChapters": "Los próximos capítulos serán:",
|
||||
"LabelNextScheduledRun": "Próxima ejecución programada",
|
||||
"LabelNoCustomMetadataProviders": "Sin proveedores de metadatos personalizados",
|
||||
"LabelNoEpisodesSelected": "Ningún Episodio Seleccionado",
|
||||
@@ -470,6 +488,7 @@
|
||||
"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.",
|
||||
"LabelNumberOfBooks": "Número de libros",
|
||||
"LabelNumberOfChapters": "Número de capítulos:",
|
||||
"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:",
|
||||
"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».",
|
||||
@@ -514,7 +533,7 @@
|
||||
"LabelPublishers": "Editores",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Correo electrónico de dueño personalizado",
|
||||
"LabelRSSFeedCustomOwnerName": "Nombre de dueño personalizado",
|
||||
"LabelRSSFeedOpen": "Suministro RSS abierto",
|
||||
"LabelRSSFeedOpen": "Fuente RSS Abierta",
|
||||
"LabelRSSFeedPreventIndexing": "Evitar indización",
|
||||
"LabelRSSFeedSlug": "«Slug» de suministro RSS",
|
||||
"LabelRSSFeedURL": "URL de suministro RSS",
|
||||
@@ -722,6 +741,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "El filtro «{0}: {1}» no produjo ningún resultado",
|
||||
"MessageBookshelfNoResultsForQuery": "No hay resultados para la consulta",
|
||||
"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",
|
||||
"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",
|
||||
@@ -757,6 +777,7 @@
|
||||
"MessageConfirmRemoveAuthor": "¿Confirma que quiere quitar el autor «{0}»?",
|
||||
"MessageConfirmRemoveCollection": "¿Confirma que quiere quitar la colección «{0}»?",
|
||||
"MessageConfirmRemoveEpisode": "¿Confirma que quiere quitar el episodio «{0}»?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Nota: Esto no borra el archivo de audio a menos que se active la opción \"Borrado definitivo del archivo\"",
|
||||
"MessageConfirmRemoveEpisodes": "¿Confirma que quiere quitar {0} episodios?",
|
||||
"MessageConfirmRemoveListeningSessions": "¿Confirma que quiere quitar {0} sesiones de escucha?",
|
||||
"MessageConfirmRemoveMetadataFiles": "¿Confirma que quiere quitar todos los archivos metadata.{0} en las carpetas de elementos de su biblioteca?",
|
||||
@@ -918,7 +939,10 @@
|
||||
"NotificationOnBackupCompletedDescription": "Se activa cuando se completa una copia de seguridad",
|
||||
"NotificationOnBackupFailedDescription": "Se activa cuando falla una copia de seguridad",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Se activa cuando se descarga automáticamente un episodio de un podcast",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Se activa cuando las descargas automáticas de episodios se desactivan debido a varios intentos fallidos",
|
||||
"NotificationOnRSSFeedFailedDescription": "Se activa cuando la solicitud a la fuente RSS falla durante una descarga automática de episodio",
|
||||
"NotificationOnTestDescription": "Evento para probar el sistema de notificaciones",
|
||||
"PlaceholderBulkChapterInput": "Ingrese título de capítulo o use numeración (ej. 'Episodio 1', 'Capítulo 10', '1.')",
|
||||
"PlaceholderNewCollection": "Nuevo nombre de la colección",
|
||||
"PlaceholderNewFolderPath": "Nueva ruta de carpeta",
|
||||
"PlaceholderNewPlaylist": "Nuevo nombre de la lista de reproducción",
|
||||
@@ -972,8 +996,10 @@
|
||||
"ToastBookmarkCreateFailed": "No se pudo crear el marcador",
|
||||
"ToastBookmarkCreateSuccess": "Marcador añadido",
|
||||
"ToastBookmarkRemoveSuccess": "Marcador eliminado",
|
||||
"ToastBulkChapterInvalidCount": "Por favor ingrese un número válido entre 1 y 150",
|
||||
"ToastCachePurgeFailed": "No se pudo purgar la antememoria",
|
||||
"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",
|
||||
"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.",
|
||||
@@ -1053,6 +1079,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Lista de reproducción actualizada",
|
||||
"ToastPodcastCreateFailed": "No se pudo crear el pódcast",
|
||||
"ToastPodcastCreateSuccess": "Se creó el pódcast correctamente",
|
||||
"ToastPodcastEpisodeUpdated": "Episodio actualizado",
|
||||
"ToastPodcastGetFeedFailed": "No se puede obtener el podcast",
|
||||
"ToastPodcastNoEpisodesInFeed": "No se han encontrado episodios en el feed del RSS",
|
||||
"ToastPodcastNoRssFeed": "El pódcast no tiene suministro RSS",
|
||||
@@ -1103,5 +1130,12 @@
|
||||
"ToastUserPasswordChangeSuccess": "Contraseña modificada correctamente",
|
||||
"ToastUserPasswordMismatch": "No coinciden las contraseñas",
|
||||
"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)"
|
||||
}
|
||||
|
||||
+46
-38
@@ -11,7 +11,7 @@
|
||||
"ButtonAuthors": "Autorid",
|
||||
"ButtonBack": "Tagasi",
|
||||
"ButtonBrowseForFolder": "Sirvi kausta",
|
||||
"ButtonCancel": "Tühista",
|
||||
"ButtonCancel": "Katkesta",
|
||||
"ButtonCancelEncode": "Tühista kodeerimine",
|
||||
"ButtonChangeRootPassword": "Muuda põhiparooli",
|
||||
"ButtonCheckAndDownloadNewEpisodes": "Kontrolli ja laadi alla uued episoodid",
|
||||
@@ -20,9 +20,9 @@
|
||||
"ButtonClearFilter": "Tühista filter",
|
||||
"ButtonCloseFeed": "Sulge voog",
|
||||
"ButtonCloseSession": "Sulge avatud sessioon",
|
||||
"ButtonCollections": "Kogud",
|
||||
"ButtonCollections": "Kollektsioonid",
|
||||
"ButtonConfigureScanner": "Konfigureeri skanner",
|
||||
"ButtonCreate": "Loo",
|
||||
"ButtonCreate": "Loo uus",
|
||||
"ButtonCreateBackup": "Loo varundus",
|
||||
"ButtonDelete": "Kustuta",
|
||||
"ButtonDownloadQueue": "Järjekord",
|
||||
@@ -37,7 +37,7 @@
|
||||
"ButtonIssues": "Probleemid",
|
||||
"ButtonJumpBackward": "Hüppa tagasi",
|
||||
"ButtonJumpForward": "Hüppa edasi",
|
||||
"ButtonLatest": "Uusim",
|
||||
"ButtonLatest": "Viimased",
|
||||
"ButtonLibrary": "Raamatukogu",
|
||||
"ButtonLogout": "Logi välja",
|
||||
"ButtonLookup": "Otsi",
|
||||
@@ -52,11 +52,11 @@
|
||||
"ButtonOk": "Ok",
|
||||
"ButtonOpenFeed": "Ava voog",
|
||||
"ButtonOpenManager": "Ava haldur",
|
||||
"ButtonPause": "Peata",
|
||||
"ButtonPlay": "Mängi",
|
||||
"ButtonPause": "Paus",
|
||||
"ButtonPlay": "Play",
|
||||
"ButtonPlayAll": "Mängi kõik",
|
||||
"ButtonPlaying": "Mängib",
|
||||
"ButtonPlaylists": "Esitusloendid",
|
||||
"ButtonPlaylists": "Playlist",
|
||||
"ButtonPrevious": "Eelmine",
|
||||
"ButtonPreviousChapter": "Eelmine peatükk",
|
||||
"ButtonPurgeAllCache": "Tühjenda kogu vahemälu",
|
||||
@@ -69,7 +69,7 @@
|
||||
"ButtonReadLess": "Loe vähem",
|
||||
"ButtonReadMore": "Loe rohkem",
|
||||
"ButtonRefresh": "Värskenda",
|
||||
"ButtonRemove": "Eemalda",
|
||||
"ButtonRemove": "Kustuta",
|
||||
"ButtonRemoveAll": "Eemalda kõik",
|
||||
"ButtonRemoveAllLibraryItems": "Eemalda kõik raamatukogu esemed",
|
||||
"ButtonRemoveFromContinueListening": "Eemalda jätkake kuulamisest",
|
||||
@@ -120,12 +120,12 @@
|
||||
"HeaderCustomMetadataProviders": "Kohandatud metaandmete pakkujad",
|
||||
"HeaderDetails": "Detailid",
|
||||
"HeaderDownloadQueue": "Allalaadimise järjekord",
|
||||
"HeaderEbookFiles": "E-raamatute failid",
|
||||
"HeaderEbookFiles": "E-raamatu failid",
|
||||
"HeaderEmail": "E-post",
|
||||
"HeaderEmailSettings": "E-posti seaded",
|
||||
"HeaderEpisodes": "Episoodid",
|
||||
"HeaderEreaderDevices": "E-lugerite seadmed",
|
||||
"HeaderEreaderSettings": "E-lugerite seadistused",
|
||||
"HeaderEreaderSettings": "E-lugeja sätted",
|
||||
"HeaderFiles": "Failid",
|
||||
"HeaderFindChapters": "Leia peatükid",
|
||||
"HeaderIgnoredFiles": "Ignoreeritud failid",
|
||||
@@ -155,8 +155,8 @@
|
||||
"HeaderPasswordAuthentication": "Parooli autentimine",
|
||||
"HeaderPermissions": "Õigused",
|
||||
"HeaderPlayerQueue": "Mängija järjekord",
|
||||
"HeaderPlaylist": "Mänguloend",
|
||||
"HeaderPlaylistItems": "Mänguloendi esemed",
|
||||
"HeaderPlaylist": "Playlist",
|
||||
"HeaderPlaylistItems": "Playlisti esemed",
|
||||
"HeaderPodcastsToAdd": "Lisatavad podcastid",
|
||||
"HeaderPreviewCover": "Eelvaate kaas",
|
||||
"HeaderRSSFeedGeneral": "RSS-i üksikasjad",
|
||||
@@ -174,7 +174,7 @@
|
||||
"HeaderSettingsExperimental": "Katsetusfunktsioonid",
|
||||
"HeaderSettingsGeneral": "Üldised",
|
||||
"HeaderSettingsScanner": "Skanner",
|
||||
"HeaderSleepTimer": "Uinaku taimer",
|
||||
"HeaderSleepTimer": "Unetaimer",
|
||||
"HeaderStatsLargestItems": "Suurimad esemed",
|
||||
"HeaderStatsLongestItems": "Kõige pikemad esemed (tunnid)",
|
||||
"HeaderStatsMinutesListeningChart": "Kuulamise minutid (viimased 7 päeva)",
|
||||
@@ -197,9 +197,10 @@
|
||||
"LabelActivity": "Tegevus",
|
||||
"LabelAddToCollection": "Lisa kogusse",
|
||||
"LabelAddToCollectionBatch": "Lisa {0} raamatut kogusse",
|
||||
"LabelAddToPlaylist": "Lisa mänguloendisse",
|
||||
"LabelAddToPlaylist": "Lisa playlisti",
|
||||
"LabelAddToPlaylistBatch": "Lisa {0} eset mänguloendisse",
|
||||
"LabelAddedAt": "Lisatud",
|
||||
"LabelAddedDate": "Lisatud {0}",
|
||||
"LabelAdminUsersOnly": "Ainult administraatorid",
|
||||
"LabelAll": "Kõik",
|
||||
"LabelAllUsers": "Kõik kasutajad",
|
||||
@@ -208,10 +209,10 @@
|
||||
"LabelAlreadyInYourLibrary": "Juba teie raamatukogus",
|
||||
"LabelAppend": "Lisa",
|
||||
"LabelAuthor": "Autor",
|
||||
"LabelAuthorFirstLast": "Autor (Eesnimi Perekonnanimi)",
|
||||
"LabelAuthorLastFirst": "Autor (Perekonnanimi, Eesnimi)",
|
||||
"LabelAuthorFirstLast": "Autor (eesnimi perekonnanimi)",
|
||||
"LabelAuthorLastFirst": "Autor (perekonnanimi, eesnimi)",
|
||||
"LabelAuthors": "Autorid",
|
||||
"LabelAutoDownloadEpisodes": "Automaatne episoodide allalaadimine",
|
||||
"LabelAutoDownloadEpisodes": "Episoodide automaatne allalaadimine",
|
||||
"LabelAutoFetchMetadata": "Automaatne metaandmete hankimine",
|
||||
"LabelAutoFetchMetadataHelp": "Toob tiitli, autori ja seeria metaandmed üleslaadimise hõlbustamiseks. Lisametaandmed võivad pärast üleslaadimist vajada vastavust.",
|
||||
"LabelAutoLaunch": "Automaatne käivitamine",
|
||||
@@ -265,7 +266,7 @@
|
||||
"LabelDiscover": "Avasta",
|
||||
"LabelDownload": "Lae alla",
|
||||
"LabelDownloadNEpisodes": "Lae alla {0} episoodi",
|
||||
"LabelDuration": "Kestus",
|
||||
"LabelDuration": "Kestvus",
|
||||
"LabelDurationFound": "Leitud kestus:",
|
||||
"LabelEbook": "E-raamat",
|
||||
"LabelEbooks": "E-raamatud",
|
||||
@@ -278,6 +279,7 @@
|
||||
"LabelEmbeddedCover": "Manustatud kaas",
|
||||
"LabelEnable": "Luba",
|
||||
"LabelEnd": "Lõpp",
|
||||
"LabelEndOfChapter": "Peatükki lõpp",
|
||||
"LabelEpisode": "Episood",
|
||||
"LabelEpisodeTitle": "Episoodi pealkiri",
|
||||
"LabelEpisodeType": "Episoodi tüüp",
|
||||
@@ -288,13 +290,14 @@
|
||||
"LabelFile": "Fail",
|
||||
"LabelFileBirthtime": "Faili sünniaeg",
|
||||
"LabelFileModified": "Faili muudetud",
|
||||
"LabelFilename": "Failinimi",
|
||||
"LabelFilename": "Faili nimi",
|
||||
"LabelFilterByUser": "Filtri alusel kasutaja järgi",
|
||||
"LabelFindEpisodes": "Otsi episoodid",
|
||||
"LabelFinished": "Lõpetatud",
|
||||
"LabelFolder": "Kaust",
|
||||
"LabelFolders": "Kataloogid",
|
||||
"LabelFontBold": "Paks",
|
||||
"LabelFontBoldness": "Fondi paksus",
|
||||
"LabelFontFamily": "Fondi pere",
|
||||
"LabelFontItalic": "Kaldkiri",
|
||||
"LabelFontScale": "Fondi suurus",
|
||||
@@ -303,7 +306,7 @@
|
||||
"LabelGenre": "Žanr",
|
||||
"LabelGenres": "Žanrid",
|
||||
"LabelHardDeleteFile": "Faili lõplik kustutamine",
|
||||
"LabelHasEbook": "On e-raamat",
|
||||
"LabelHasEbook": "E-raamat olemas",
|
||||
"LabelHasSupplementaryEbook": "On täiendav e-raamat",
|
||||
"LabelHighestPriority": "Kõrgeim prioriteet",
|
||||
"LabelHour": "Tund",
|
||||
@@ -311,7 +314,7 @@
|
||||
"LabelImageURLFromTheWeb": "Pildi URL veebist",
|
||||
"LabelInProgress": "Pooleli",
|
||||
"LabelIncludeInTracklist": "Kaasa jälgimisloendis",
|
||||
"LabelIncomplete": "Puudulik",
|
||||
"LabelIncomplete": "Lõpetamata",
|
||||
"LabelInterval": "Intervall",
|
||||
"LabelIntervalCustomDailyWeekly": "Kohandatud päevane/nädalane",
|
||||
"LabelIntervalEvery12Hours": "Iga 12 tunni tagant",
|
||||
@@ -365,12 +368,12 @@
|
||||
"LabelNarrators": "Jutustajad",
|
||||
"LabelNew": "Uus",
|
||||
"LabelNewPassword": "Uus parool",
|
||||
"LabelNewestAuthors": "Uusimad autorid",
|
||||
"LabelNewestEpisodes": "Uusimad episoodid",
|
||||
"LabelNewestAuthors": "Uuemad autorid",
|
||||
"LabelNewestEpisodes": "Uuemad episoodid",
|
||||
"LabelNextBackupDate": "Järgmine varukoopia kuupäev",
|
||||
"LabelNextScheduledRun": "Järgmine ajakava järgmine",
|
||||
"LabelNoEpisodesSelected": "Episoodid pole valitud",
|
||||
"LabelNotFinished": "Ei ole lõpetatud",
|
||||
"LabelNotFinished": "Lõpetamata",
|
||||
"LabelNotStarted": "Pole alustatud",
|
||||
"LabelNotes": "Märkused",
|
||||
"LabelNotificationAppriseURL": "Apprise URL-id",
|
||||
@@ -383,7 +386,7 @@
|
||||
"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.",
|
||||
"LabelNumberOfBooks": "Raamatute arv",
|
||||
"LabelNumberOfEpisodes": "Episoodide arv",
|
||||
"LabelNumberOfEpisodes": "# episoode",
|
||||
"LabelOpenRSSFeed": "Ava RSS voog",
|
||||
"LabelOverwrite": "Kirjuta üle",
|
||||
"LabelPassword": "Parool",
|
||||
@@ -398,16 +401,18 @@
|
||||
"LabelPhotoPathURL": "Foto tee/URL",
|
||||
"LabelPlayMethod": "Esitusmeetod",
|
||||
"LabelPlaylists": "Mänguloendid",
|
||||
"LabelPodcast": "Podcast",
|
||||
"LabelPodcastSearchRegion": "Podcasti otsingu piirkond",
|
||||
"LabelPodcastType": "Podcasti tüüp",
|
||||
"LabelPodcasts": "Podcastid",
|
||||
"LabelPrefixesToIgnore": "Eiramiseks eesliited (tõstutundetu)",
|
||||
"LabelPreventIndexing": "Vältige oma voogu indekseerimist iTunes'i ja Google podcasti kataloogides",
|
||||
"LabelPrimaryEbook": "Esmane e-raamat",
|
||||
"LabelProgress": "Edenemine",
|
||||
"LabelProgress": "Progress",
|
||||
"LabelProvider": "Pakkuja",
|
||||
"LabelPubDate": "Avaldamise kuupäev",
|
||||
"LabelPublishYear": "Aasta avaldamine",
|
||||
"LabelPubDate": "Publitseerimise kuupäev",
|
||||
"LabelPublishYear": "Publitseerimise aasta",
|
||||
"LabelPublishedDate": "Publitseeritud {0}",
|
||||
"LabelPublisher": "Kirjastaja",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Kohandatud omaniku e-post",
|
||||
"LabelRSSFeedCustomOwnerName": "Kohandatud omaniku nimi",
|
||||
@@ -415,7 +420,8 @@
|
||||
"LabelRSSFeedPreventIndexing": "Vältige indekseerimist",
|
||||
"LabelRSSFeedSlug": "RSS voog Slug",
|
||||
"LabelRSSFeedURL": "RSS voog URL",
|
||||
"LabelRead": "Lugenud",
|
||||
"LabelRandomly": "Juhuslikus järjekorras",
|
||||
"LabelRead": "Loetud läbi",
|
||||
"LabelReadAgain": "Loe uuesti",
|
||||
"LabelReadEbookWithoutProgress": "Lugege e-raamatut ilma edenemist säilitamata",
|
||||
"LabelRecentSeries": "Hiljutised seeriad",
|
||||
@@ -469,9 +475,9 @@
|
||||
"LabelSettingsStoreMetadataWithItem": "Salvesta metaandmed üksusega",
|
||||
"LabelSettingsStoreMetadataWithItemHelp": "Vaikimisi salvestatakse metaandmed /metadata/items kausta. Selle seadistuse lubamine salvestab metaandmed teie raamatukogu üksuse kaustadesse",
|
||||
"LabelSettingsTimeFormat": "Kellaaja vorming",
|
||||
"LabelShowAll": "Näita kõiki",
|
||||
"LabelShowAll": "Näita kõik",
|
||||
"LabelSize": "Suurus",
|
||||
"LabelSleepTimer": "Uinaku taimer",
|
||||
"LabelSleepTimer": "Unetaimer",
|
||||
"LabelStart": "Alusta",
|
||||
"LabelStartTime": "Alustamise aeg",
|
||||
"LabelStarted": "Alustatud",
|
||||
@@ -480,17 +486,17 @@
|
||||
"LabelStatsAuthors": "Autorid",
|
||||
"LabelStatsBestDay": "Parim päev",
|
||||
"LabelStatsDailyAverage": "Päevane keskmine",
|
||||
"LabelStatsDays": "Päevad",
|
||||
"LabelStatsDays": "Päevi",
|
||||
"LabelStatsDaysListened": "Kuulatud päevad",
|
||||
"LabelStatsHours": "Tunnid",
|
||||
"LabelStatsInARow": "järjest",
|
||||
"LabelStatsItemsFinished": "Lõpetatud üksused",
|
||||
"LabelStatsItemsFinished": "Lõpetatud raamatud",
|
||||
"LabelStatsItemsInLibrary": "Üksused raamatukogus",
|
||||
"LabelStatsMinutes": "minutit",
|
||||
"LabelStatsMinutes": "minuteid",
|
||||
"LabelStatsMinutesListening": "Kuulamise minutid",
|
||||
"LabelStatsOverallDays": "Kokku päevad",
|
||||
"LabelStatsOverallHours": "Kokku tunnid",
|
||||
"LabelStatsWeekListening": "Nädala kuulamine",
|
||||
"LabelStatsWeekListening": "Nädala keskmine",
|
||||
"LabelSubtitle": "Alapealkiri",
|
||||
"LabelSupportedFileTypes": "Toetatud failitüübid",
|
||||
"LabelTag": "Silt",
|
||||
@@ -502,7 +508,7 @@
|
||||
"LabelTextEditorNumberedList": "Numberloend",
|
||||
"LabelTextEditorUnlink": "Eemalda link",
|
||||
"LabelTheme": "Teema",
|
||||
"LabelThemeDark": "Tume",
|
||||
"LabelThemeDark": "Pime",
|
||||
"LabelThemeLight": "Hele",
|
||||
"LabelTimeBase": "Aja alus",
|
||||
"LabelTimeListened": "Kuulatud aeg",
|
||||
@@ -527,7 +533,7 @@
|
||||
"LabelType": "Tüüp",
|
||||
"LabelUnabridged": "Täismahus",
|
||||
"LabelUndo": "Võta tagasi",
|
||||
"LabelUnknown": "Tundmatu",
|
||||
"LabelUnknown": "Teadmata",
|
||||
"LabelUpdateCover": "Uuenda kaant",
|
||||
"LabelUpdateCoverHelp": "Luba üle kirjutamine olemasolevate kaante jaoks valitud raamatutele, kui leitakse sobivus",
|
||||
"LabelUpdateDetails": "Uuenda üksikasju",
|
||||
@@ -555,7 +561,8 @@
|
||||
"MessageAppriseDescription": "Selle funktsiooni kasutamiseks peate käivitama <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> eksemplari või API, mis töötleb samu päringuid. <br />Apprise API URL peaks olema täielik URL-rada teatise saatmiseks, näiteks kui teie API eksemplar töötab aadressil <code>http://192.168.1.1:8337</code>, siis peaksite sisestama <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageBackupsDescription": "Varukoopiad hõlmavad kasutajaid, kasutajate edenemist, raamatukogu üksikasju, serveri seadeid ja kaustades <code>/metadata/items</code> ja <code>/metadata/authors</code> salvestatud pilte. Varukoopiad ei hõlma ühtegi teie raamatukogu kaustades olevat faili.",
|
||||
"MessageBatchQuickMatchDescription": "Kiire sobitamine üritab lisada valitud üksustele puuduvad kaaned ja metaandmed. Luba allpool olevad valikud, et lubada Kiire sobitamine'il üle kirjutada olemasolevaid kaasi ja/või metaandmeid.",
|
||||
"MessageBookshelfNoCollections": "Te pole veel ühtegi kogumit teinud",
|
||||
"MessageBookshelfNoCollections": "Te pole veel ühtegi kollektsiooni teinud",
|
||||
"MessageBookshelfNoCollectionsHelp": "Kollektsioonid on avalikud. Kõik kasutajad kellel on olemas ligipääs raamatukogule saavad neid näha.",
|
||||
"MessageBookshelfNoRSSFeeds": "Ühtegi RSS-i voogu pole avatud",
|
||||
"MessageBookshelfNoResultsForFilter": "Filtrile \"{0}: {1}\" pole tulemusi",
|
||||
"MessageBookshelfNoSeries": "Teil pole ühtegi seeriat",
|
||||
@@ -594,6 +601,7 @@
|
||||
"MessageConfirmRenameTagMergeNote": "Märkus: See silt on juba olemas, nii et need ühendatakse.",
|
||||
"MessageConfirmRenameTagWarning": "Hoiatus! Sarnane silt erineva puhvriga on juba olemas \"{0}\".",
|
||||
"MessageConfirmSendEbookToDevice": "Olete kindel, et soovite saata {0} e-raamatu \"{1}\" seadmesse \"{2}\"?",
|
||||
"MessageDaysListenedInTheLastYear": "{0} päeva kuuldud viimase aasta jooksul",
|
||||
"MessageDownloadingEpisode": "Episoodi allalaadimine",
|
||||
"MessageDragFilesIntoTrackOrder": "Lohistage failid õigesse järjekorda",
|
||||
"MessageEmbedFinished": "Manustamine lõpetatud!",
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -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": "ثبت"
|
||||
}
|
||||
+75
-11
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Lisää",
|
||||
"ButtonAddApiKey": "Lisää API avain",
|
||||
"ButtonAddChapters": "Lisää lukuja",
|
||||
"ButtonAddDevice": "Lisää laite",
|
||||
"ButtonAddLibrary": "Lisää kirjasto",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Valitse kansio",
|
||||
"ButtonChooseFiles": "Valitse tiedostot",
|
||||
"ButtonClearFilter": "Poista suodatus",
|
||||
"ButtonClose": "Sulje",
|
||||
"ButtonCloseFeed": "Sulje syöte",
|
||||
"ButtonCloseSession": "Sulje Avoin Sessio",
|
||||
"ButtonCollections": "Kokoelmat",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Tili",
|
||||
"HeaderAddCustomMetadataProvider": "Lisää mukautettu metadata tarjoaja",
|
||||
"HeaderAdvanced": "Edistynyt",
|
||||
"HeaderApiKeys": "API avaimet",
|
||||
"HeaderAppriseNotificationSettings": "Apprise-ilmoitusasetukset",
|
||||
"HeaderAudioTracks": "Ääniraidat",
|
||||
"HeaderAudiobookTools": "Äänikirjojen tiedostonhallintatyökalut",
|
||||
"HeaderAuthentication": "Todennus",
|
||||
"HeaderBackups": "Varmuuskopiot",
|
||||
"HeaderBulkChapterModal": "Lisää useita kappaleita",
|
||||
"HeaderChangePassword": "Vaihda salasana",
|
||||
"HeaderChapters": "Luvut",
|
||||
"HeaderChooseAFolder": "Valitse kansio",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Metadatan tärkeysjärjestys",
|
||||
"HeaderMetadataToEmbed": "Sisällytettävä metadata",
|
||||
"HeaderNewAccount": "Uusi tili",
|
||||
"HeaderNewApiKey": "Uusi API avain",
|
||||
"HeaderNewLibrary": "Uusi kirjasto",
|
||||
"HeaderNotificationCreate": "Luo ilmoitus",
|
||||
"HeaderNotificationUpdate": "Päivitä ilmoitus",
|
||||
@@ -177,6 +182,7 @@
|
||||
"HeaderPlaylist": "Soittolista",
|
||||
"HeaderPlaylistItems": "Soittolistan kohteet",
|
||||
"HeaderPodcastsToAdd": "Lisättävät podcastit",
|
||||
"HeaderPresets": "Esivalinnat",
|
||||
"HeaderPreviewCover": "Esikatsele kansikuvaa",
|
||||
"HeaderRSSFeedGeneral": "RSS yksityiskohdat",
|
||||
"HeaderRSSFeedIsOpen": "RSS syöte on avoinna",
|
||||
@@ -194,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Kokeelliset ominaisuudet",
|
||||
"HeaderSettingsGeneral": "Yleiset",
|
||||
"HeaderSettingsScanner": "Skannaaja",
|
||||
"HeaderSettingsSecurity": "Turvallisuus",
|
||||
"HeaderSettingsWebClient": "Webasiakasohjelma",
|
||||
"HeaderSleepTimer": "Uniajastin",
|
||||
"HeaderStatsLargestItems": "Suurimmat kohteet",
|
||||
@@ -205,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Sisällysluettelo",
|
||||
"HeaderTools": "Työkalut",
|
||||
"HeaderUpdateAccount": "Päivitä tili",
|
||||
"HeaderUpdateApiKey": "Päivitä API avain",
|
||||
"HeaderUpdateAuthor": "Päivitä tekijä",
|
||||
"HeaderUpdateDetails": "Päivitä yksityiskohdat",
|
||||
"HeaderUpdateLibrary": "Päivitä kirjasto",
|
||||
@@ -214,7 +222,7 @@
|
||||
"LabelAbridged": "Lyhennetty",
|
||||
"LabelAbridgedChecked": "Lyhennetty (tarkistettu)",
|
||||
"LabelAbridgedUnchecked": "Lyhentämätön (tarkistamaton)",
|
||||
"LabelAccessibleBy": "Saavutettavissa:",
|
||||
"LabelAccessibleBy": "Saavutettavissa",
|
||||
"LabelAccountType": "Tilin tyyppi",
|
||||
"LabelAccountTypeAdmin": "Järjestelmänvalvoja",
|
||||
"LabelAccountTypeGuest": "Vieras",
|
||||
@@ -234,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Kaikki käyttäjät vieraita lukuun ottamatta",
|
||||
"LabelAllUsersIncludingGuests": "Kaikki käyttäjät mukaan lukien vieraat",
|
||||
"LabelAlreadyInYourLibrary": "Jo kirjastossasi",
|
||||
"LabelApiKeyCreated": "API avain \"{0}\" luotu onnistuneesti.",
|
||||
"LabelApiKeyCreatedDescription": "Varmista, että kopioit API avaimen. Sitä ei näytetä enää tämän jälkeen.",
|
||||
"LabelApiKeyUser": "Toimi käyttäjän puolesta",
|
||||
"LabelApiKeyUserDescription": "Tällä API-avaimella on samat käyttöoikeudet kuin käyttäjällä, jonka puolesta se toimii. Tämä näkyy lokeissa samalla tavalla kuin jos käyttäjä itse tekisi pyynnön.",
|
||||
"LabelApiToken": "Sovellusliittymätunnus",
|
||||
"LabelAppend": "Lisää loppuun",
|
||||
"LabelAudioBitrate": "Äänen bittinopeus (esim. 128k)",
|
||||
@@ -263,7 +275,7 @@
|
||||
"LabelBonus": "Bonus",
|
||||
"LabelBooks": "Kirjat",
|
||||
"LabelButtonText": "Painikkeen teksti",
|
||||
"LabelByAuthor": "tekijältä {0}",
|
||||
"LabelByAuthor": "Tekijältä: {0}",
|
||||
"LabelChangePassword": "Vaihda salasana",
|
||||
"LabelChannels": "Kanavat",
|
||||
"LabelChapterCount": "{0} lukua",
|
||||
@@ -283,6 +295,7 @@
|
||||
"LabelContinueListening": "Jatka kuuntelua",
|
||||
"LabelContinueReading": "Jatka lukemista",
|
||||
"LabelContinueSeries": "Jatka sarjoja",
|
||||
"LabelCorsAllowed": "Salli CORS Origins",
|
||||
"LabelCover": "Kansikuva",
|
||||
"LabelCoverImageURL": "Kansikuvan URL-osoite",
|
||||
"LabelCoverProvider": "Kansikuvan tarjoaja",
|
||||
@@ -296,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Poista tiedostojärjestelmästä (poista merkintä, jos haluat poistaa vain tietokannasta)",
|
||||
"LabelDescription": "Kuvaus",
|
||||
"LabelDeselectAll": "Poista valinta kaikista",
|
||||
"LabelDetectedPattern": "Tunnista malli:",
|
||||
"LabelDevice": "Laite",
|
||||
"LabelDeviceInfo": "Laitteen tiedot",
|
||||
"LabelDeviceIsAvailableTo": "Laite on saatavilla...",
|
||||
@@ -345,7 +359,11 @@
|
||||
"LabelExample": "Esimerkki",
|
||||
"LabelExpandSeries": "Laajenna sarja",
|
||||
"LabelExpandSubSeries": "Laajenna alisarja",
|
||||
"LabelExplicit": "Yksiselitteinen",
|
||||
"LabelExpired": "Vanhentunut",
|
||||
"LabelExpiresAt": "Vanhentuu",
|
||||
"LabelExpiresInSeconds": "Vanhentuu (sekunnissa)",
|
||||
"LabelExpiresNever": "Ei koskaan",
|
||||
"LabelExplicit": "Sopimaton",
|
||||
"LabelExplicitChecked": "Yksiselitteinen (valittu)",
|
||||
"LabelExplicitUnchecked": "Ei yksiselitteinen (ei valittu)",
|
||||
"LabelExportOPML": "Vie OPML",
|
||||
@@ -360,11 +378,12 @@
|
||||
"LabelFilterByUser": "Suodata käyttäjien perusteella",
|
||||
"LabelFindEpisodes": "Etsi jaksoja",
|
||||
"LabelFinished": "Valmis",
|
||||
"LabelFinishedDate": "Valmis {0}",
|
||||
"LabelFolder": "Kansio",
|
||||
"LabelFolders": "Kansiot",
|
||||
"LabelFontBold": "Lihavoitu",
|
||||
"LabelFontBoldness": "Kirjasintyyppien lihavointi",
|
||||
"LabelFontFamily": "Kirjasinperhe",
|
||||
"LabelFontFamily": "Fonttiperhe",
|
||||
"LabelFontItalic": "Kursiivi",
|
||||
"LabelFontScale": "Kirjasintyyppien skaalautuminen",
|
||||
"LabelFontStrikethrough": "Yliviivattu",
|
||||
@@ -404,6 +423,7 @@
|
||||
"LabelLanguages": "Kielet",
|
||||
"LabelLastBookAdded": "Viimeisin lisätty kirja",
|
||||
"LabelLastBookUpdated": "Viimeisin päivitetty kirja",
|
||||
"LabelLastProgressDate": "Viimeisin edistyminen {0}",
|
||||
"LabelLastSeen": "Nähty viimeksi",
|
||||
"LabelLastTime": "Viimeinen kerta",
|
||||
"LabelLastUpdate": "Viimeisin päivitys",
|
||||
@@ -416,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Ei {0}",
|
||||
"LabelLibraryItem": "Kirjaston kohde",
|
||||
"LabelLibraryName": "Kirjaston nimi",
|
||||
"LabelLibrarySortByProgress": "Edistyminen: Viimeksi päivitetty",
|
||||
"LabelLibrarySortByProgressFinished": "Edistyminen: Valmis",
|
||||
"LabelLibrarySortByProgressStarted": "Edistyminen: Aloitettu",
|
||||
"LabelLimit": "Raja",
|
||||
"LabelLineSpacing": "Riviväli",
|
||||
"LabelListenAgain": "Kuuntele uudelleen",
|
||||
@@ -424,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Varoitus",
|
||||
"LabelLookForNewEpisodesAfterDate": "Etsi uusia jaksoja tämän päivämäärän jälkeen",
|
||||
"LabelLowestPriority": "Vähiten tärkeä",
|
||||
"LabelMatchConfidence": "Varmuus",
|
||||
"LabelMatchExistingUsersBy": "Vastaa olemassa olevia käyttäjiä mukaan",
|
||||
"LabelMatchExistingUsersByDescription": "Käytetään olemassa olevien käyttäjien yhdistämiseen. Kun yhteys on muodostettu, käyttäjät saavat yksilöllisen tunnuksen SSO-palveluntarjoajaltasi",
|
||||
"LabelMaxEpisodesToDownload": "Jaksojen maksimilatausmäärä. 0 poistaa rajoituksen.",
|
||||
@@ -453,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Uusimmat tekijät",
|
||||
"LabelNewestEpisodes": "Uusimmat jaksot",
|
||||
"LabelNextBackupDate": "Seuraava varmuuskopiointipäivämäärä",
|
||||
"LabelNextChapters": "Seuraavat luvut:",
|
||||
"LabelNextScheduledRun": "Seuraava ajastettu suorittaminen",
|
||||
"LabelNoApiKeys": "Ei API-avaimia",
|
||||
"LabelNoCustomMetadataProviders": "Ei mukautettuja kuvailutietojen toimittajia",
|
||||
"LabelNoEpisodesSelected": "Jaksoja ei ole valittu",
|
||||
"LabelNotFinished": "Ei valmis",
|
||||
@@ -469,6 +495,7 @@
|
||||
"LabelNotificationsMaxQueueSize": "Ilmoitustapahtumajonon enimmäispituus",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Tapahtumat on rajoitettu ampumaan yksi sekunnissa. Tapahtumat ohitetaan, jos jono on enimmäiskoko. Tämä estää ilmoitusten roskapostin.",
|
||||
"LabelNumberOfBooks": "Kirjojen määrä",
|
||||
"LabelNumberOfChapters": "Lukujen lukumäärä:",
|
||||
"LabelNumberOfEpisodes": "# jaksoja",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "OpenID-vaatimuksen nimi, joka sisältää lisäoikeudet sovelluksen käyttäjän toimiin, joita sovelletaan muihin kuin järjestelmänvalvojan rooleihin (<b>jos määritetty</b>). Jos vaatimus puuttuu vastauksesta, pääsy ABS:iin evätään. Jos yksittäinen vaihtoehto puuttuu, sitä käsitellään <code>false</code>-arvona. Varmista, että identiteetin tarjoajan vaatimus vastaa odotettua rakennetta:",
|
||||
"LabelOpenIDClaims": "Jätä seuraavat vaihtoehdot tyhjiksi, jos haluat poistaa edistyneen ryhmän ja lupien määrityksen käytöstä ja määrittää sitten automaattisesti käyttäjäryhmän.",
|
||||
@@ -513,7 +540,7 @@
|
||||
"LabelPublishers": "Julkaisijat",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Mukautettu omistajan sähköposti",
|
||||
"LabelRSSFeedCustomOwnerName": "Mukautettu omistajan nimi",
|
||||
"LabelRSSFeedOpen": "RSS-syöte avoin",
|
||||
"LabelRSSFeedOpen": "RSS Syöte Avoin",
|
||||
"LabelRSSFeedPreventIndexing": "Estä indeksointi",
|
||||
"LabelRSSFeedSlug": "RSS-syöte Slug",
|
||||
"LabelRSSFeedURL": "RSS-syötteen URL-osoite",
|
||||
@@ -523,7 +550,7 @@
|
||||
"LabelReadAgain": "Lue uudelleen",
|
||||
"LabelReadEbookWithoutProgress": "Lue s-kirja tallentamatta edistymistietoja",
|
||||
"LabelRecentSeries": "Viimeisimmät sarjat",
|
||||
"LabelRecentlyAdded": "Viimeeksi lisätyt",
|
||||
"LabelRecentlyAdded": "Viimeksi lisätyt",
|
||||
"LabelRecommended": "Suositeltu",
|
||||
"LabelRedo": "Tee uudelleen",
|
||||
"LabelRegion": "Alue",
|
||||
@@ -543,6 +570,7 @@
|
||||
"LabelSelectAll": "Valitse kaikki",
|
||||
"LabelSelectAllEpisodes": "Valitse kaikki jaksot",
|
||||
"LabelSelectEpisodesShowing": "Valitse {0} näytettävää jaksoa",
|
||||
"LabelSelectUser": "Valitse käyttäjä",
|
||||
"LabelSelectUsers": "Valitse käyttäjät",
|
||||
"LabelSendEbookToDevice": "Lähetä s-kirja kohteeseen...",
|
||||
"LabelSequence": "Sekvenssi",
|
||||
@@ -560,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Skeuomorfinen muotoilu puisilla hyllyillä",
|
||||
"LabelSettingsChromecastSupport": "Chromecast-tuki",
|
||||
"LabelSettingsDateFormat": "Päivämäärän muoto",
|
||||
"LabelSettingsEnableWatcher": "Skannaa kirjastot automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Skannaa kirjastot automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcher": "Vahdi kirjastoja automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Vahdi kirjastoja automaattisesti muutoksien varalta",
|
||||
"LabelSettingsEnableWatcherHelp": "Ottaa käyttöön kohteiden automaattisen lisäämisen ja päivityksen kun tiedostomuutoksia havaitaan. *Tarvitsee palvelimen uudelleenkäynnistyksen",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Salli komentosarjamuotoinen sisältö epubissa",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Salli epub-tiedostojen suorittaa komentosarjoja. On suositeltavaa pitää tämä asetus pois käytöstä, ellet luota epub-tiedostojen lähteeseen.",
|
||||
@@ -610,6 +638,7 @@
|
||||
"LabelStartTime": "Aloitusaika",
|
||||
"LabelStarted": "Aloitettu",
|
||||
"LabelStartedAt": "Aloitettu",
|
||||
"LabelStartedDate": "Aloitettu {0}",
|
||||
"LabelStatsAudioTracks": "Ääniraidat",
|
||||
"LabelStatsAuthors": "Tekijät",
|
||||
"LabelStatsBestDay": "Paras päivä",
|
||||
@@ -639,6 +668,7 @@
|
||||
"LabelTheme": "Teema",
|
||||
"LabelThemeDark": "Tumma",
|
||||
"LabelThemeLight": "Kirkas",
|
||||
"LabelThemeSepia": "Seepia",
|
||||
"LabelTimeBase": "Aika-alusta",
|
||||
"LabelTimeDurationXHours": "{0} tuntia",
|
||||
"LabelTimeDurationXMinutes": "{0} minuuttia",
|
||||
@@ -706,6 +736,10 @@
|
||||
"LabelYourProgress": "Edistymisesi",
|
||||
"MessageAddToPlayerQueue": "Lisää soittimen jonoon",
|
||||
"MessageAppriseDescription": "Käyttääksesi tätä toimintoa tarvitset <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> -instanssin tai rajapinnan joka käsittelee samoja pyyntöjä. <br />Apprise rajapinnan osoite tulee olla täysi URL polku ilmoituksen lähetykseen, esim. jos rajapinta on osoitteessa <code>http://192.168.1.1:8337</code>,niin arvoksi tulee antaa <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Varmista, että käytät ASIN-tunnusta oikealta Audible-alueelta, ei Amazonista.",
|
||||
"MessageAuthenticationLegacyTokenWarning": "Vanhat API-tunnukset poistetaan tulevaisuudessa. Käytä sen sijaan <a href=\"/config/api-keys\">API-avaimia</a>.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Käynnistä palvelin uudelleen tallennuksen jälkeen ottaaksesi OIDC-muutokset käyttöön.",
|
||||
"MessageAuthenticationSecurityMessage": "Tunnistautumisen tietoturvaa on parannettu. Kaikkien käyttäjien tulee kirjautua sisään uudelleen.",
|
||||
"MessageBackupsDescription": "Varmuuskopiot sisältävät käyttäjät, käyttäjien edistymisen, kirjastokohteiden tiedot, palvelinasetukset ja <code>/metadata/items</code>- ja <code>/metadata/authors</code> -kansioihin tallennetut kuvat. Varmuuskopiot <strong>eivät sisällä</strong> kirjastosi kansioihin tallennettuja tiedostoja.",
|
||||
"MessageBackupsLocationEditNote": "Huomautus: Varmuuskopion sijainnin päivittäminen ei siirrä tai muokkaa olemassa olevia varmuuskopioita",
|
||||
"MessageBackupsLocationNoEditNote": "Huomautus: Varmuuskopion sijainti asetetaan ympäristömuuttujan kautta, eikä sitä voi muuttaa tässä.",
|
||||
@@ -719,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Ei tuloksia suodattimelle \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Ei tuloksia kyselylle",
|
||||
"MessageBookshelfNoSeries": "Sinulla ei ole sarjoja",
|
||||
"MessageBulkChapterPattern": "Kuinka monta lukua haluaisit lisätä tällä numerointimallilla?",
|
||||
"MessageChapterEndIsAfter": "Luvun loppu sijaitsee äänikirjan lopun jälkeen",
|
||||
"MessageChapterErrorFirstNotZero": "Ensimmäisen luvun tulee alkaa nollasta",
|
||||
"MessageChapterErrorStartGteDuration": "Epäkelvollinen aloitusaika; on oltava lyhyempi kuin äänikirjan kesto",
|
||||
@@ -727,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Kappaleita ei löydy",
|
||||
"MessageCheckingCron": "Tarkistetaan cronia...",
|
||||
"MessageConfirmCloseFeed": "Oletko varma, että haluat sulkea tämän syötteen?",
|
||||
"MessageConfirmDeleteApiKey": "Haluatko varmasti poistaa API-avaimen \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Oletko varma, että haluat poistaa varmuuskopion {0}:lle?",
|
||||
"MessageConfirmDeleteDevice": "Oletko varma, että haluat poistaa s-lukulaitteen \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Tämä poistaa tiedoston tiedostojärjestelmästäsi. Oletko varma?",
|
||||
@@ -754,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Oletko varma, että haluat poistaa tekijän \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Oletko varma, että haluat poistaa kokoelman \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Oletko varma, että haluat poistaa jakson \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Huomioi: Tämä ei poista äänitiedostoa, ellei \"Poista tiedosto pysyvästi\" -asetusta ole valittuna",
|
||||
"MessageConfirmRemoveEpisodes": "Oletko varma, että haluat poistaa {0} jaksoa?",
|
||||
"MessageConfirmRemoveListeningSessions": "Oletko varma, että haluat poistaa {0} kuuntelukertaa?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Oletko varma, että haluat poistaa kaikki metadata.{0}-tiedostot kirjaston kohdekansioista?",
|
||||
@@ -779,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "Syötteen URL tulee olemaan {0}",
|
||||
"MessageFetching": "Haetaan...",
|
||||
"MessageForceReScanDescription": "skannaa kaikki tiedostot uudelleen kuten uusi tarkistus. Äänitiedoston ID3-tunnisteet, OPF-tiedostot ja tekstitiedostot skannataan uusina.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} kuunnellaan</strong> on {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Ei kuuntelujaksoja {0}",
|
||||
"MessageImportantNotice": "Tärkeä huomautus!",
|
||||
"MessageInsertChapterBelow": "Syötä luku alle",
|
||||
"MessageInvalidAsin": "Virheellinen ASIN",
|
||||
@@ -849,10 +888,11 @@
|
||||
"MessageResetChaptersConfirm": "Oletko varma, että haluat nollata luvut ja kumota tekemäsi muutokset?",
|
||||
"MessageRestoreBackupConfirm": "Oletko varma, että haluat palauttaa varmuuskopion, joka on luotu",
|
||||
"MessageRestoreBackupWarning": "Varmuuskopion palauttaminen korvaa koko /config:ssa sijaitsevan tietokannan, ja kansikuvat /metadata/items & /metadata/authors:ssa.<br /><br />Varmuuskopiot eivät muuta kirjastokansioissasi olevia tiedostoja. Jos olet ottanut käyttöön palvelinasetuksissa kansikuvien ja metatietojen tallentamisen kirjaston kansioihin, niitä ei varmuuskopioida tai korvata.<br /><br />Kaikki palvelintasi käyttävät asiakkaat virkistetään automaattisesti.",
|
||||
"MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja säilyttää kansiotarkkailu päällä. Kansiotarkkailu havaitsee automaattisesti tiedostomuutokset kirjaston kansioissa. Kansiotarkkailu ei toimi kaikille tiedostojärjestelmille (kuten NFS), jolloin voidaan käyttää ajastettuja kirjastoskannauksia.",
|
||||
"MessageScheduleLibraryScanNote": "Suurimmalle osaa käyttäjistä on suositeltavaa jättää tämä ominaisuus pois päältä ja \"Tarkkaile kirjaston muutoksia automaattisesti\" -asetus pidetään käytössä - se havaitsee muutokset kirjastokansioissasi automaattisesti. Ota tämä ominaisuus käyttöön, jos \"Tarkkaile kirjaston muutoksia automaattisesti\" ei toimi tiedostojärjestelmässäsi (kuten NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Suorita joka {0} klo {1}",
|
||||
"MessageSearchResultsFor": "Hakutulokset haulle",
|
||||
"MessageSelected": "{0} valittuna",
|
||||
"MessageSeriesSequenceCannotContainSpaces": "Sarjan sekvenssi ei voi sisältää välilyöntejä",
|
||||
"MessageServerCouldNotBeReached": "Palvelimelle ei saatu yhteyttä",
|
||||
"MessageSetChaptersFromTracksDescription": "Aseta luvut käyttämällä kutakin äänitiedostoa lukuna ja luvun otsikkoa äänitiedoston nimenä",
|
||||
"MessageShareExpirationWillBe": "Umpeutuminen on <strong>{0}</strong>",
|
||||
@@ -894,7 +934,7 @@
|
||||
"MessageTaskScanningFileChanges": "Tarkastetaan tiedoston muutoksia \"{0}\":sta",
|
||||
"MessageTaskScanningLibrary": "Tarkastetaan kirjastoa \"{0}\"",
|
||||
"MessageTaskTargetDirectoryNotWritable": "Kohdehakemisto ei ole kirjoitettava",
|
||||
"MessageThinking": "Ajattellaan...",
|
||||
"MessageThinking": "Ajatellaan...",
|
||||
"MessageUploaderItemFailed": "Lataaminen ulospäin epäonnistui",
|
||||
"MessageUploaderItemSuccess": "Onnistuneesti ladattu! ulospäin!",
|
||||
"MessageUploading": "Ladataan! ulospäin...",
|
||||
@@ -914,7 +954,10 @@
|
||||
"NotificationOnBackupCompletedDescription": "Laukaistu, kun varmuuskopiointi on valmis",
|
||||
"NotificationOnBackupFailedDescription": "Laukaistu, kun varmuuskopiointi epäonnistuu",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Laukaistu, kun podcast-jakso ladataan automaattisesti",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Laukaistaan, kun automaattiset jaksolataukset poistetaan käytöstä liian monen epäonnistuneen yrityksen vuoksi",
|
||||
"NotificationOnRSSFeedFailedDescription": "Laukaistaan, kun RRS-syötteen pyyntö epäonnistuu automaattisessa jaksolatauksessa",
|
||||
"NotificationOnTestDescription": "Tapahtuma ilmoitusjärjestelmän testaamista varten",
|
||||
"PlaceholderBulkChapterInput": "Syötä luvun otsikko tai käytä numerointia (esim. 'Episodi 1', 'Luku 10', '1.')",
|
||||
"PlaceholderNewCollection": "Uusi kokoelman nimi",
|
||||
"PlaceholderNewFolderPath": "Uusi kansion polku",
|
||||
"PlaceholderNewPlaylist": "Uusi soittolistan nimi",
|
||||
@@ -968,15 +1011,23 @@
|
||||
"ToastBookmarkCreateFailed": "Kirjanmerkin luominen epäonnistui",
|
||||
"ToastBookmarkCreateSuccess": "Kirjanmerkki lisätty",
|
||||
"ToastBookmarkRemoveSuccess": "Kirjanmerkki poistettu",
|
||||
"ToastBulkChapterInvalidCount": "Syötä numero 1 ja 150 välillä",
|
||||
"ToastCachePurgeFailed": "Välimuistin tyhjentäminen epäonnistui",
|
||||
"ToastCachePurgeSuccess": "Välimuisti tyhjennetty onnistuneesti",
|
||||
"ToastChapterLocked": "Luku on lukittu.",
|
||||
"ToastChapterStartTimeAdjusted": "Luvun aloitusaikaa on säädetty {0} sekunnilla",
|
||||
"ToastChaptersAllLocked": "Kaikki luvut ovat lukittuina. Avaa lukuja vaihtaaksesi niiden aikoja.",
|
||||
"ToastChaptersHaveErrors": "Luvuissa on virheitä",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Virheellinen siirtomäärä. Viimeisen luvun aloitusaika ylittäisi tämän äänikirjan keston.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Virheellinen siirtomäärä. Ensimmäisen luvun pituudeksi tulisi nolla tai negatiivinen arvo, ja toinen luku kirjoittaisi sen päälle. Kasvata toisen luvun aloitusaikaa.",
|
||||
"ToastChaptersMustHaveTitles": "Lukuilla on oltava otsikot",
|
||||
"ToastChaptersRemoved": "Luvut poistettu",
|
||||
"ToastChaptersUpdated": "Luvut päivitetty",
|
||||
"ToastCollectionItemsAddFailed": "Kohteen/kohteiden lisääminen kokoelmaan epäonnistui",
|
||||
"ToastCollectionRemoveSuccess": "Kokoelma poistettu",
|
||||
"ToastCollectionUpdateSuccess": "Kokoelma päivitetty",
|
||||
"ToastConnectionNotAvailable": "Verkkoyhteyttä ei saatavilla. Yritä hetken päästä uudelleen",
|
||||
"ToastCoverSearchFailed": "Kansikuvan haku epäonnistui",
|
||||
"ToastCoverUpdateFailed": "Kansikuvan päivitys epäonnistui",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Päivämäärä ja aika ovat epäkelvolliset tai puutteelliset",
|
||||
"ToastDeleteFileFailed": "Tiedoston poistaminen epäonnistui",
|
||||
@@ -992,6 +1043,8 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Jakson latausjono tyhjennetty",
|
||||
"ToastEpisodeUpdateSuccess": "{0} jaksoa päivitetty",
|
||||
"ToastErrorCannotShare": "Ei voi jakaa alkuperäisesti tällä laitteella",
|
||||
"ToastFailedToCreate": "Luonti epäonnistui",
|
||||
"ToastFailedToDelete": "Poisto epäonnistui",
|
||||
"ToastFailedToLoadData": "Tietojen lataaminen epäonnistui",
|
||||
"ToastFailedToMatch": "Vastaaminen epäonnistui",
|
||||
"ToastFailedToShare": "Jakaminen epäonnistui",
|
||||
@@ -999,6 +1052,7 @@
|
||||
"ToastInvalidImageUrl": "Epäkelvollinen kuvan URL-osoite",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Ladattavien jaksojen enimmäismäärä on epäkelvollinen",
|
||||
"ToastInvalidUrl": "Epäkelvollinen URL-osoite",
|
||||
"ToastInvalidUrls": "Yksi tai useampi URL on virheellinen",
|
||||
"ToastItemCoverUpdateSuccess": "Kohteen kansikuva päivitetty",
|
||||
"ToastItemDeletedFailed": "Kohteen poistaminen epäonnistui",
|
||||
"ToastItemDeletedSuccess": "Poistettu kohde",
|
||||
@@ -1023,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "On oltava vähintään yksi polku",
|
||||
"ToastNameEmailRequired": "Nimi ja sähköpostiosoite vaaditaan",
|
||||
"ToastNameRequired": "Nimi vaaditaan",
|
||||
"ToastNewApiKeyUserError": "Täytyy valita käyttäjä",
|
||||
"ToastNewEpisodesFound": "{0} uutta jaksoa löydetty",
|
||||
"ToastNewUserCreatedFailed": "Tilin \"{0}\" luominen epäonnistui",
|
||||
"ToastNewUserCreatedSuccess": "Uusi tili luotu",
|
||||
@@ -1047,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Soittolista päivitetty",
|
||||
"ToastPodcastCreateFailed": "Podcastin luominen epäonnistui",
|
||||
"ToastPodcastCreateSuccess": "Podcastin luominen onnistui",
|
||||
"ToastPodcastEpisodeUpdated": "Episodi päivitetty",
|
||||
"ToastPodcastGetFeedFailed": "Podcast-syötteen saaminen epäonnistui",
|
||||
"ToastPodcastNoEpisodesInFeed": "RSS-syötteestä ei löytynyt jaksoja",
|
||||
"ToastPodcastNoRssFeed": "Podcastilla ei ole RSS-syötettä",
|
||||
@@ -1097,5 +1153,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Salasana vaihdettu onnistuneesti",
|
||||
"ToastUserPasswordMismatch": "Salasanat eivät täsmää",
|
||||
"ToastUserPasswordMustChange": "Uusi salasana ei voi olla sama kuin vanha salasana",
|
||||
"ToastUserRootRequireName": "Pääkäyttäjän nimi on pakollinen"
|
||||
"ToastUserRootRequireName": "Pääkäyttäjän nimi on pakollinen",
|
||||
"TooltipAddChapters": "Lisää luku tai lukuja",
|
||||
"TooltipAddOneSecond": "Lisää 1 sekunti",
|
||||
"TooltipAdjustChapterStart": "Napauta säätääksesi aloitusaikaa",
|
||||
"TooltipLockAllChapters": "Lukitse kaikki luvut",
|
||||
"TooltipLockChapter": "Lukitse luku (Shift+napauta valitaksesi alueen)",
|
||||
"TooltipSubtractOneSecond": "Vähennä 1 sekunti",
|
||||
"TooltipUnlockAllChapters": "Avaa kaikki luvut",
|
||||
"TooltipUnlockChapter": "Avaa luku (Shift+napauta valitaksesi alueen)"
|
||||
}
|
||||
|
||||
+78
-19
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Ajouter",
|
||||
"ButtonAddApiKey": "Ajouter une clé API",
|
||||
"ButtonAddChapters": "Ajouter des chapitres",
|
||||
"ButtonAddDevice": "Ajouter un appareil",
|
||||
"ButtonAddLibrary": "Ajouter une bibliothèque",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Sélectionner un dossier",
|
||||
"ButtonChooseFiles": "Sélectionner des fichiers",
|
||||
"ButtonClearFilter": "Effacer le filtre",
|
||||
"ButtonClose": "Fermer",
|
||||
"ButtonCloseFeed": "Fermer le flux",
|
||||
"ButtonCloseSession": "Fermer la session",
|
||||
"ButtonCollections": "Collections",
|
||||
@@ -74,7 +76,7 @@
|
||||
"ButtonReScan": "Nouvelle analyse",
|
||||
"ButtonRead": "Lire",
|
||||
"ButtonReadLess": "Lire moins",
|
||||
"ButtonReadMore": "Lire la suite",
|
||||
"ButtonReadMore": "Lire plus",
|
||||
"ButtonRefresh": "Rafraîchir",
|
||||
"ButtonRemove": "Retirer",
|
||||
"ButtonRemoveAll": "Supprimer tout",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Compte",
|
||||
"HeaderAddCustomMetadataProvider": "Ajouter un fournisseur de métadonnées personnalisé",
|
||||
"HeaderAdvanced": "Avancé",
|
||||
"HeaderApiKeys": "Clés API",
|
||||
"HeaderAppriseNotificationSettings": "Configuration des notifications Apprise",
|
||||
"HeaderAudioTracks": "Pistes audio",
|
||||
"HeaderAudiobookTools": "Outils de gestion de fichiers de livres audio",
|
||||
"HeaderAuthentication": "Authentification",
|
||||
"HeaderBackups": "Sauvegardes",
|
||||
"HeaderBulkChapterModal": "Ajouter Plusieurs Chapitres",
|
||||
"HeaderChangePassword": "Modifier le mot de passe",
|
||||
"HeaderChapters": "Chapitres",
|
||||
"HeaderChooseAFolder": "Sélectionner un dossier",
|
||||
@@ -162,12 +166,13 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Ordre de priorité des métadonnées",
|
||||
"HeaderMetadataToEmbed": "Métadonnées à intégrer",
|
||||
"HeaderNewAccount": "Nouveau compte",
|
||||
"HeaderNewApiKey": "Nouvelle clé API",
|
||||
"HeaderNewLibrary": "Nouvelle bibliothèque",
|
||||
"HeaderNotificationCreate": "Créer une notification",
|
||||
"HeaderNotificationUpdate": "Mise à jour de la notification",
|
||||
"HeaderNotifications": "Notifications",
|
||||
"HeaderOpenIDConnectAuthentication": "Authentification via OpenID Connect",
|
||||
"HeaderOpenListeningSessions": "Ouvrir les sessions d'écoutes",
|
||||
"HeaderOpenListeningSessions": "Sessions d'écoute ouvertes",
|
||||
"HeaderOpenRSSFeed": "Ouvrir le flux RSS",
|
||||
"HeaderOtherFiles": "Autres fichiers",
|
||||
"HeaderPasswordAuthentication": "Authentification par mot de passe",
|
||||
@@ -177,6 +182,7 @@
|
||||
"HeaderPlaylist": "Liste de lecture",
|
||||
"HeaderPlaylistItems": "Éléments de la liste de lecture",
|
||||
"HeaderPodcastsToAdd": "Podcasts à ajouter",
|
||||
"HeaderPresets": "Préréglages",
|
||||
"HeaderPreviewCover": "Prévisualiser la couverture",
|
||||
"HeaderRSSFeedGeneral": "Détails du flux RSS",
|
||||
"HeaderRSSFeedIsOpen": "Le flux RSS est actif",
|
||||
@@ -194,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Fonctionnalités expérimentales",
|
||||
"HeaderSettingsGeneral": "Général",
|
||||
"HeaderSettingsScanner": "Analyseur",
|
||||
"HeaderSettingsSecurity": "Sécurité",
|
||||
"HeaderSettingsWebClient": "Client Web",
|
||||
"HeaderSleepTimer": "Minuterie",
|
||||
"HeaderStatsLargestItems": "Éléments les plus grands",
|
||||
@@ -201,10 +208,11 @@
|
||||
"HeaderStatsMinutesListeningChart": "Minutes d’écoute (7 derniers jours)",
|
||||
"HeaderStatsRecentSessions": "Sessions récentes",
|
||||
"HeaderStatsTop10Authors": "Top 10 Auteurs",
|
||||
"HeaderStatsTop5Genres": "Top 5 Genres",
|
||||
"HeaderStatsTop5Genres": "Top 5 des genres",
|
||||
"HeaderTableOfContents": "Table des matières",
|
||||
"HeaderTools": "Outils",
|
||||
"HeaderUpdateAccount": "Mettre à jour le compte",
|
||||
"HeaderUpdateApiKey": "Mettre à jour la clé API",
|
||||
"HeaderUpdateAuthor": "Mettre à jour l’auteur",
|
||||
"HeaderUpdateDetails": "Mettre à jour les détails",
|
||||
"HeaderUpdateLibrary": "Mettre à jour la bibliothèque",
|
||||
@@ -234,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Tous les utilisateurs à l’exception des invités",
|
||||
"LabelAllUsersIncludingGuests": "Tous les utilisateurs, y compris les invités",
|
||||
"LabelAlreadyInYourLibrary": "Déjà dans la bibliothèque",
|
||||
"LabelApiKeyCreated": "La clé API « {0} » a été créée avec succès.",
|
||||
"LabelApiKeyCreatedDescription": "Assurez-vous de copier la clé API maintenant car vous ne pourrez plus la voir.",
|
||||
"LabelApiKeyUser": "Agir au nom de l’utilisateur",
|
||||
"LabelApiKeyUserDescription": "Cette clé API disposera des mêmes autorisations que l’utilisateur pour lequel elle agit. Elle apparaîtra dans les journaux comme si c’était l’utilisateur qui effectuait la requête.",
|
||||
"LabelApiToken": "Token API",
|
||||
"LabelAppend": "Ajouter",
|
||||
"LabelAudioBitrate": "Débit audio (par exemple 128k)",
|
||||
@@ -263,7 +275,7 @@
|
||||
"LabelBonus": "Bonus",
|
||||
"LabelBooks": "Livres",
|
||||
"LabelButtonText": "Texte du bouton",
|
||||
"LabelByAuthor": "par {0}",
|
||||
"LabelByAuthor": "de {0}",
|
||||
"LabelChangePassword": "Modifier le mot de passe",
|
||||
"LabelChannels": "Canaux",
|
||||
"LabelChapterCount": "{0} Chapitres",
|
||||
@@ -283,6 +295,7 @@
|
||||
"LabelContinueListening": "Continuer l'écoute",
|
||||
"LabelContinueReading": "Continuer la lecture",
|
||||
"LabelContinueSeries": "Continuer les séries",
|
||||
"LabelCorsAllowed": "Origines autorisées pour les requêtes CORS",
|
||||
"LabelCover": "Couverture",
|
||||
"LabelCoverImageURL": "URL vers l’image de couverture",
|
||||
"LabelCoverProvider": "Source des couvertures",
|
||||
@@ -296,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Supprimer du système de fichiers (décocher pour ne supprimer que de la base de données)",
|
||||
"LabelDescription": "Description",
|
||||
"LabelDeselectAll": "Tout déselectionner",
|
||||
"LabelDetectedPattern": "Motif détecté :",
|
||||
"LabelDevice": "Appareil",
|
||||
"LabelDeviceInfo": "Détail de l’appareil",
|
||||
"LabelDeviceIsAvailableTo": "L’appareil est disponible pour…",
|
||||
@@ -345,7 +359,11 @@
|
||||
"LabelExample": "Exemple",
|
||||
"LabelExpandSeries": "Développer la série",
|
||||
"LabelExpandSubSeries": "Développer les sous-séries",
|
||||
"LabelExplicit": "Restriction",
|
||||
"LabelExpired": "Expiré",
|
||||
"LabelExpiresAt": "Expire à",
|
||||
"LabelExpiresInSeconds": "Expire dans (secondes)",
|
||||
"LabelExpiresNever": "Jamais",
|
||||
"LabelExplicit": "Contenu explicite",
|
||||
"LabelExplicitChecked": "Explicite (vérifié)",
|
||||
"LabelExplicitUnchecked": "Non explicite (non vérifié)",
|
||||
"LabelExportOPML": "Exporter OPML",
|
||||
@@ -360,13 +378,14 @@
|
||||
"LabelFilterByUser": "Filtrer par utilisateur",
|
||||
"LabelFindEpisodes": "Trouver des épisodes",
|
||||
"LabelFinished": "Terminé le",
|
||||
"LabelFinishedDate": "Terminé {0}",
|
||||
"LabelFolder": "Dossier",
|
||||
"LabelFolders": "Dossiers",
|
||||
"LabelFontBold": "Gras",
|
||||
"LabelFontBoldness": "Graisse de la police",
|
||||
"LabelFontFamily": "Polices de caractères",
|
||||
"LabelFontFamily": "Famille de caractères",
|
||||
"LabelFontItalic": "Italique",
|
||||
"LabelFontScale": "Taille de la police de caractère",
|
||||
"LabelFontScale": "Taille de la police",
|
||||
"LabelFontStrikethrough": "Barrer",
|
||||
"LabelFormat": "Format",
|
||||
"LabelFull": "Complet",
|
||||
@@ -404,6 +423,7 @@
|
||||
"LabelLanguages": "Langues",
|
||||
"LabelLastBookAdded": "Dernier livre ajouté",
|
||||
"LabelLastBookUpdated": "Dernier livre mis à jour",
|
||||
"LabelLastProgressDate": "Dernière position : {0}",
|
||||
"LabelLastSeen": "Vu dernièrement",
|
||||
"LabelLastTime": "Progression",
|
||||
"LabelLastUpdate": "Dernière mise à jour",
|
||||
@@ -416,14 +436,18 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Aucun {0}",
|
||||
"LabelLibraryItem": "Élément de bibliothèque",
|
||||
"LabelLibraryName": "Nom de la bibliothèque",
|
||||
"LabelLibrarySortByProgress": "Progression : Mise à jour",
|
||||
"LabelLibrarySortByProgressFinished": "Progression : Terminé",
|
||||
"LabelLibrarySortByProgressStarted": "Progression : En cours",
|
||||
"LabelLimit": "Limite",
|
||||
"LabelLineSpacing": "Espacement des lignes",
|
||||
"LabelLineSpacing": "Interligne",
|
||||
"LabelListenAgain": "Écouter à nouveau",
|
||||
"LabelLogLevelDebug": "Débogage",
|
||||
"LabelLogLevelInfo": "Info",
|
||||
"LabelLogLevelWarn": "Warn",
|
||||
"LabelLogLevelWarn": "Attention",
|
||||
"LabelLookForNewEpisodesAfterDate": "Rechercher les nouveaux épisodes après cette date",
|
||||
"LabelLowestPriority": "Priorité la plus basse",
|
||||
"LabelMatchConfidence": "Confiance",
|
||||
"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",
|
||||
"LabelMaxEpisodesToDownload": "Nombre maximum d’épisodes à télécharger. 0 pour illimité.",
|
||||
@@ -453,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Auteurs récents",
|
||||
"LabelNewestEpisodes": "Épisodes récents",
|
||||
"LabelNextBackupDate": "Date de la prochaine sauvegarde",
|
||||
"LabelNextChapters": "Les prochains chapitres seront :",
|
||||
"LabelNextScheduledRun": "Prochain lancement prévu",
|
||||
"LabelNoApiKeys": "Aucune clé API",
|
||||
"LabelNoCustomMetadataProviders": "Aucun fournisseurs de métadonnées personnalisés",
|
||||
"LabelNoEpisodesSelected": "Aucun épisode sélectionné",
|
||||
"LabelNotFinished": "Non terminé",
|
||||
@@ -469,6 +495,7 @@
|
||||
"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 d’attente est à son maximum. Cela empêche un flot trop important.",
|
||||
"LabelNumberOfBooks": "Nombre de livres",
|
||||
"LabelNumberOfChapters": "Nombre de chapitres :",
|
||||
"LabelNumberOfEpisodes": "Nombre d'épisodes",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Nom de la demande OpenID qui contient des autorisations avancées pour les actions de l’utilisateur dans l’application, qui s’appliqueront à des rôles autres que celui d’administrateur (<b>s’il est configuré</b>). Si la demande est absente de la réponse, l’accè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 d’identité correspond à la structure attendue :",
|
||||
"LabelOpenIDClaims": "Laissez les options suivantes vides pour désactiver l’attribution avancée de groupes et d’autorisations, en attribuant alors automatiquement le groupe « Utilisateur ».",
|
||||
@@ -543,6 +570,7 @@
|
||||
"LabelSelectAll": "Tout sélectionner",
|
||||
"LabelSelectAllEpisodes": "Sélectionner tous les épisodes",
|
||||
"LabelSelectEpisodesShowing": "Sélectionner {0} épisode(s) en cours",
|
||||
"LabelSelectUser": "Sélectionner l’utilisateur",
|
||||
"LabelSelectUsers": "Sélectionner les utilisateurs",
|
||||
"LabelSendEbookToDevice": "Envoyer le livre numérique à…",
|
||||
"LabelSequence": "Séquence",
|
||||
@@ -560,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Interface skeumorphique avec étagères en bois",
|
||||
"LabelSettingsChromecastSupport": "Support du Chromecast",
|
||||
"LabelSettingsDateFormat": "Format de date",
|
||||
"LabelSettingsEnableWatcher": "Analyser automatiquement les bibliothèques pour détecter les modifications",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Analyser automatiquement la bibliothèque pour détecter les modifications",
|
||||
"LabelSettingsEnableWatcher": "Surveiller automatiquement les bibliothèques pour détecter les modifications",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Surveiller automatiquement la bibliothèque pour détecter les modifications",
|
||||
"LabelSettingsEnableWatcherHelp": "Active la mise à jour automatique d'éléments lorsque des modifications de fichiers sont détectées. * Nécessite le redémarrage du serveur",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Autoriser le contenu scénarisé pour les fichiers EPUB",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Autoriser les fichiers EPUB à exécuter des scripts. Il est recommandé de laisser ce paramètre désactivé, sauf si vous faites confiance à la source des fichiers EPUB.",
|
||||
@@ -598,7 +626,7 @@
|
||||
"LabelShareOpen": "Ouvrir le partage",
|
||||
"LabelShareURL": "Partager l’URL",
|
||||
"LabelShowAll": "Tout afficher",
|
||||
"LabelShowSeconds": "Afficher les seondes",
|
||||
"LabelShowSeconds": "Afficher les secondes",
|
||||
"LabelShowSubtitles": "Afficher les sous-titres",
|
||||
"LabelSize": "Taille",
|
||||
"LabelSleepTimer": "Minuterie de mise en veille",
|
||||
@@ -610,6 +638,7 @@
|
||||
"LabelStartTime": "Heure de démarrage",
|
||||
"LabelStarted": "Démarré",
|
||||
"LabelStartedAt": "Démarré à",
|
||||
"LabelStartedDate": "Commencé {0}",
|
||||
"LabelStatsAudioTracks": "Pistes audio",
|
||||
"LabelStatsAuthors": "Auteurs",
|
||||
"LabelStatsBestDay": "Meilleur jour",
|
||||
@@ -639,6 +668,7 @@
|
||||
"LabelTheme": "Thème",
|
||||
"LabelThemeDark": "Sombre",
|
||||
"LabelThemeLight": "Clair",
|
||||
"LabelThemeSepia": "Sépia",
|
||||
"LabelTimeBase": "Base de temps",
|
||||
"LabelTimeDurationXHours": "{0} heures",
|
||||
"LabelTimeDurationXMinutes": "{0} minutes",
|
||||
@@ -707,12 +737,14 @@
|
||||
"MessageAddToPlayerQueue": "Ajouter en file d’attente",
|
||||
"MessageAppriseDescription": "Nécessite une instance d’<a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">API Apprise</a> pour utiliser cette fonctionnalité ou une api qui prend en charge les mêmes requêtes.<br />L’URL de l’API Apprise doit comprendre le chemin complet pour envoyer la notification. Par exemple, si votre instance écoute sur <code>http://192.168.1.1:8337</code> alors vous devez mettre <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Assurez-vous d’utiliser l’ASIN de la bonne région Audible, et non d’Amazon.",
|
||||
"MessageAuthenticationLegacyTokenWarning": "Les jetons d’API hérités seront supprimés à l’avenir. Utilisez plutôt les <a href=\"/config/api-keys\">clés API</a>.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Redémarrez votre serveur après avoir enregistré pour appliquer les modifications OIDC.",
|
||||
"MessageAuthenticationSecurityMessage": "L’authentification a été améliorée pour plus de sécurité. Tous les utilisateurs doivent se reconnecter.",
|
||||
"MessageBackupsDescription": "Les sauvegardes incluent les utilisateurs, la progression des utilisateurs, les détails des éléments de la bibliothèque, les paramètres du serveur et les images stockées dans <code>/metadata/items</code> & <code>/metadata/authors</code>. Les sauvegardes <strong>n’incluent pas</strong> les fichiers stockés dans les dossiers de votre bibliothèque.",
|
||||
"MessageBackupsLocationEditNote": "Remarque : Mettre à jour l'emplacement de sauvegarde ne déplacera pas ou ne modifiera pas les sauvegardes existantes",
|
||||
"MessageBackupsLocationNoEditNote": "Remarque : l’emplacement de sauvegarde est défini via une variable d’environnement et ne peut pas être modifié ici.",
|
||||
"MessageBackupsLocationPathEmpty": "L'emplacement de secours ne peut pas être vide",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Remplir les champs disponibles avec les données de tous les éléments. Les champs avec des valeurs multiples seront fusionnés.",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Renseignez les champs activés avec les données de tous les éléments. Les champs comportant plusieurs valeurs seront fusionnés.",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Renseigner les champs de la carte active avec les informations de cet élément",
|
||||
"MessageBatchQuickMatchDescription": "La recherche par correspondance rapide tentera d’ajouter les couvertures et métadonnées manquantes pour les éléments sélectionnés. Activez les options ci-dessous pour permettre la Recherche par correspondance d’écraser les couvertures et/ou métadonnées existantes.",
|
||||
"MessageBookshelfNoCollections": "Vous n’avez pas encore de collections",
|
||||
@@ -721,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Aucun résultat pour le filtre « {0} : {1} »",
|
||||
"MessageBookshelfNoResultsForQuery": "Aucun résultat pour la requête",
|
||||
"MessageBookshelfNoSeries": "Vous n’avez 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",
|
||||
"MessageChapterErrorFirstNotZero": "Le premier capitre doit débuter à 0",
|
||||
"MessageChapterErrorStartGteDuration": "Horodatage invalide car il doit débuter avant la fin du livre",
|
||||
@@ -729,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Chapitres non trouvés",
|
||||
"MessageCheckingCron": "Vérification du cron…",
|
||||
"MessageConfirmCloseFeed": "Êtes-vous sûr·e de vouloir fermer ce flux ?",
|
||||
"MessageConfirmDeleteApiKey": "Êtes-vous sûr de vouloir supprimer la clé API « {0} » ?",
|
||||
"MessageConfirmDeleteBackup": "Êtes-vous sûr·e de vouloir supprimer la sauvegarde de « {0} » ?",
|
||||
"MessageConfirmDeleteDevice": "Êtes-vous sûr·e de vouloir supprimer la liseuse « {0} » ?",
|
||||
"MessageConfirmDeleteFile": "Cela supprimera le fichier de votre système de fichiers. Êtes-vous sûr ?",
|
||||
@@ -756,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Êtes-vous sûr·e de vouloir supprimer l’auteur « {0} » ?",
|
||||
"MessageConfirmRemoveCollection": "Êtes-vous sûr·e de vouloir supprimer la collection « {0} » ?",
|
||||
"MessageConfirmRemoveEpisode": "Êtes-vous sûr·e de vouloir supprimer l’épisode « {0} » ?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Remarque : cela ne supprime pas le fichier audio, sauf si vous activez « Supprimer définitivement le fichier »",
|
||||
"MessageConfirmRemoveEpisodes": "Êtes-vous sûr·e de vouloir supprimer {0} épisodes ?",
|
||||
"MessageConfirmRemoveListeningSessions": "Êtes-vous sûr·e de vouloir supprimer {0} sessions d’écoute ?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Êtes-vous sûr·e de vouloir supprimer tous les fichiers « metatadata.{0} » des dossiers d’éléments de votre bibliothèque ?",
|
||||
@@ -781,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "L’URL du flux sera {0}",
|
||||
"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 s’ils étaient nouveaux.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} À l’écoute</strong> sur {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Aucune session en cours sur {0}",
|
||||
"MessageImportantNotice": "Information importante !",
|
||||
"MessageInsertChapterBelow": "Insérer le chapitre ci-dessous",
|
||||
"MessageInvalidAsin": "ASIN invalide",
|
||||
@@ -817,7 +854,7 @@
|
||||
"MessageNoItems": "Aucun élément",
|
||||
"MessageNoItemsFound": "Aucun élément trouvé",
|
||||
"MessageNoListeningSessions": "Aucune session d’écoute en cours",
|
||||
"MessageNoLogs": "Aucun journaux",
|
||||
"MessageNoLogs": "Aucun journal",
|
||||
"MessageNoMediaProgress": "Aucun média en cours",
|
||||
"MessageNoNotifications": "Aucune notification",
|
||||
"MessageNoPodcastFeed": "Podcast invalide : pas de flux",
|
||||
@@ -838,7 +875,7 @@
|
||||
"MessagePlaylistCreateFromCollection": "Créer une liste de lecture depuis la collection",
|
||||
"MessagePleaseWait": "Merci de patienter…",
|
||||
"MessagePodcastHasNoRSSFeedForMatching": "Le Podcast n’a pas d’URL 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",
|
||||
"MessageQuickEmbedQueue": "En file d'attente pour une intégration rapide ({0} dans la file d'attente)",
|
||||
"MessageQuickMatchAllEpisodes": "Associer rapidement tous les épisodes",
|
||||
@@ -851,7 +888,7 @@
|
||||
"MessageResetChaptersConfirm": "Êtes-vous sûr·e de vouloir réinitialiser les chapitres et annuler les changements effectués ?",
|
||||
"MessageRestoreBackupConfirm": "Êtes-vous sûr·e de vouloir restaurer la sauvegarde créée le",
|
||||
"MessageRestoreBackupWarning": "Restaurer la sauvegarde écrasera la base de donnée située dans le dossier /config ainsi que les images sur /metadata/items et /metadata/authors.<br><br>Les sauvegardes ne touchent pas aux fichiers de la bibliothèque. Si vous avez activé le paramètre pour sauvegarder les métadonnées et les images de couverture dans le même dossier que les fichiers, ceux-ci ne ni sauvegardés, ni écrasés lors de la restauration.<br><br>Tous les clients utilisant votre serveur seront automatiquement mis à jour.",
|
||||
"MessageScheduleLibraryScanNote": "Pour la plupart des utilisateurs, il est recommandé de laisser cette fonctionnalité désactivée et de maintenir le réglage du moniteur de dossier activé. Le moniteur de dossier détectera automatiquement les changements dans vos dossiers de bibliothèque. Le moniteur de dossier ne fonctionne pas pour chaque système de fichiers (comme NFS) afin que les scans de bibliothèques programmés puissent être utilisés à la place.",
|
||||
"MessageScheduleLibraryScanNote": "Pour la plupart des utilisateurs, il est recommandé de laisser cette fonctionnalité désactivée et de maintenir le paramètre « Surveiller automatiquement la bibliothèque pour détecter les modifications » activé – il détectera automatiquement les modifications dans les dossiers de votre bibliothèque. Activez cette fonctionnalité si l'option « Surveiller automatiquement la bibliothèque pour détecter les modifications » ne fonctionne pas pour votre système de fichiers (comme NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Exécuté tous les {0} à {1}",
|
||||
"MessageSearchResultsFor": "Résultats de recherche pour",
|
||||
"MessageSelected": "{0} sélectionnés",
|
||||
@@ -917,12 +954,15 @@
|
||||
"NotificationOnBackupCompletedDescription": "Déclenché lorsqu’une sauvegarde est terminée",
|
||||
"NotificationOnBackupFailedDescription": "Déclenché lorsqu'une sauvegarde échoue",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Déclenché lorsqu’un épisode de podcast est téléchargé automatiquement",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Déclenché lorsque les téléchargements automatiques d’épisodes sont désactivés en raison d’un trop grand nombre de tentatives infructueuses",
|
||||
"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",
|
||||
"PlaceholderBulkChapterInput": "Entrez le titre du chapitre ou utilisez la numérotation (ex. 'Épisode 1', 'Chapitre 10', '1.')",
|
||||
"PlaceholderNewCollection": "Nom de la nouvelle collection",
|
||||
"PlaceholderNewFolderPath": "Nouveau chemin de dossier",
|
||||
"PlaceholderNewPlaylist": "Nouveau nom de liste de lecture",
|
||||
"PlaceholderSearch": "Recherche…",
|
||||
"PlaceholderSearchEpisode": "Recherche d’épisode…",
|
||||
"PlaceholderSearch": "Recherche...",
|
||||
"PlaceholderSearchEpisode": "Rechercher un épisode…",
|
||||
"StatsAuthorsAdded": "auteurs ajoutés",
|
||||
"StatsBooksAdded": "livres ajoutés",
|
||||
"StatsBooksAdditional": "Les ajouts comprennent…",
|
||||
@@ -971,8 +1011,12 @@
|
||||
"ToastBookmarkCreateFailed": "Échec de la création de signet",
|
||||
"ToastBookmarkCreateSuccess": "Signet ajouté",
|
||||
"ToastBookmarkRemoveSuccess": "Signet supprimé",
|
||||
"ToastBulkChapterInvalidCount": "Veuillez entrer un nombre valide entre 1 et 150",
|
||||
"ToastCachePurgeFailed": "Échec de la purge du cache",
|
||||
"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",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Durée de décalage non valide. L’heure 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.",
|
||||
@@ -982,6 +1026,8 @@
|
||||
"ToastCollectionItemsAddFailed": "Échec de l’ajout de(s) élément(s) à la collection",
|
||||
"ToastCollectionRemoveSuccess": "Collection supprimée",
|
||||
"ToastCollectionUpdateSuccess": "Collection mise à jour",
|
||||
"ToastConnectionNotAvailable": "Connexion indisponible. Veuillez réessayer plus tard.",
|
||||
"ToastCoverSearchFailed": "La recherche de la couverture a échoué",
|
||||
"ToastCoverUpdateFailed": "Échec de la mise à jour de la couverture",
|
||||
"ToastDateTimeInvalidOrIncomplete": "La date et l'heure sont invalides ou incomplètes",
|
||||
"ToastDeleteFileFailed": "Échec de la suppression du fichier",
|
||||
@@ -997,6 +1043,8 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "File d’attente de téléchargement des épisodes effacée",
|
||||
"ToastEpisodeUpdateSuccess": "{0} épisodes mis à jour",
|
||||
"ToastErrorCannotShare": "Impossible de partager nativement sur cet appareil",
|
||||
"ToastFailedToCreate": "Échec de la création",
|
||||
"ToastFailedToDelete": "Échec de la suppression",
|
||||
"ToastFailedToLoadData": "Échec du chargement des données",
|
||||
"ToastFailedToMatch": "Échec de la correspondance",
|
||||
"ToastFailedToShare": "Échec du partage",
|
||||
@@ -1004,6 +1052,7 @@
|
||||
"ToastInvalidImageUrl": "URL de l'image invalide",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Nombre maximum d’épisodes à télécharger non valide",
|
||||
"ToastInvalidUrl": "URL invalide",
|
||||
"ToastInvalidUrls": "Une ou plusieurs URL sont invalides",
|
||||
"ToastItemCoverUpdateSuccess": "Couverture mise à jour",
|
||||
"ToastItemDeletedFailed": "La suppression de l'élément à échouée",
|
||||
"ToastItemDeletedSuccess": "Élément supprimé",
|
||||
@@ -1028,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Doit avoir au moins un chemin",
|
||||
"ToastNameEmailRequired": "Le nom et le courriel sont requis",
|
||||
"ToastNameRequired": "Le nom est requis",
|
||||
"ToastNewApiKeyUserError": "Vous devez sélectionner un utilisateur",
|
||||
"ToastNewEpisodesFound": "{0} nouveaux épisodes trouvés",
|
||||
"ToastNewUserCreatedFailed": "La création du compte à échouée : « {0} »",
|
||||
"ToastNewUserCreatedSuccess": "Nouveau compte créé",
|
||||
@@ -1052,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Liste de lecture mise à jour",
|
||||
"ToastPodcastCreateFailed": "Échec de la création du podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast créé avec succès",
|
||||
"ToastPodcastEpisodeUpdated": "Épisode mis à jour",
|
||||
"ToastPodcastGetFeedFailed": "Échec de la récupération du flux du podcast",
|
||||
"ToastPodcastNoEpisodesInFeed": "Aucun épisode trouvé dans le flux RSS",
|
||||
"ToastPodcastNoRssFeed": "Le podcast n’a pas de flux RSS",
|
||||
@@ -1102,5 +1153,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Mot de passe modifié avec succès",
|
||||
"ToastUserPasswordMismatch": "Les mots de passe ne correspondent pas",
|
||||
"ToastUserPasswordMustChange": "Le nouveau mot de passe ne peut pas être identique à l’ancien",
|
||||
"ToastUserRootRequireName": "Vous devez entrer un nom d’utilisateur root"
|
||||
"ToastUserRootRequireName": "Vous devez entrer un nom d’utilisateur 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)"
|
||||
}
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
"ButtonApply": "લાગુ કરો",
|
||||
"ButtonApplyChapters": "પ્રકરણો લાગુ કરો",
|
||||
"ButtonAuthors": "લેખકો",
|
||||
"ButtonBack": "પાછા",
|
||||
"ButtonBatchEditPopulateFromExisting": "હાલની માહિતીમાંથી ભરો",
|
||||
"ButtonBatchEditPopulateMapDetails": "નકશાની વિગત ભરો",
|
||||
"ButtonBrowseForFolder": "ફોલ્ડર માટે જુઓ",
|
||||
"ButtonCancel": "રદ કરો",
|
||||
"ButtonCancelEncode": "એન્કોડ રદ કરો",
|
||||
@@ -27,11 +30,14 @@
|
||||
"ButtonEdit": "સંપાદિત કરો",
|
||||
"ButtonEditChapters": "પ્રકરણો સંપાદિત કરો",
|
||||
"ButtonEditPodcast": "પોડકાસ્ટ સંપાદિત કરો",
|
||||
"ButtonEnable": "સક્રિય કરો",
|
||||
"ButtonForceReScan": "બળપૂર્વક ફરીથી સ્કેન કરો",
|
||||
"ButtonFullPath": "સંપૂર્ણ પથ",
|
||||
"ButtonHide": "છુપાવો",
|
||||
"ButtonHome": "ઘર",
|
||||
"ButtonIssues": "સમસ્યાઓ",
|
||||
"ButtonJumpBackward": "પાછળ જાવો",
|
||||
"ButtonJumpForward": "આગળ જાવો",
|
||||
"ButtonLatest": "નવીનતમ",
|
||||
"ButtonLibrary": "પુસ્તકાલય",
|
||||
"ButtonLogout": "લૉગ આઉટ",
|
||||
@@ -41,19 +47,32 @@
|
||||
"ButtonMatchAllAuthors": "બધા મેળ ખાતા લેખકો શોધો",
|
||||
"ButtonMatchBooks": "મેળ ખાતી પુસ્તકો શોધો",
|
||||
"ButtonNevermind": "કંઈ વાંધો નહીં",
|
||||
"ButtonNext": "આગળ જાઓ",
|
||||
"ButtonNextChapter": "આગળનું અધ્યાય",
|
||||
"ButtonNextItemInQueue": "કતારમાં આવતું આગળનું અધ્યાય",
|
||||
"ButtonOk": "ઓકે",
|
||||
"ButtonOpenFeed": "ફીડ ખોલો",
|
||||
"ButtonOpenManager": "મેનેજર ખોલો",
|
||||
"ButtonPause": "વિરામ",
|
||||
"ButtonPlay": "ચલાવો",
|
||||
"ButtonPlayAll": "બધું ચલાવો",
|
||||
"ButtonPlaying": "ચલાવી રહ્યું છે",
|
||||
"ButtonPlaylists": "પ્લેલિસ્ટ",
|
||||
"ButtonPrevious": "પાછળનું",
|
||||
"ButtonPreviousChapter": "પાછળનું અધ્યાય",
|
||||
"ButtonProbeAudioFile": "ઑડિયો ફાઇલ તપાસો",
|
||||
"ButtonPurgeAllCache": "બધો Cache કાઢી નાખો",
|
||||
"ButtonPurgeItemsCache": "વસ્તુઓનો Cache કાઢી નાખો",
|
||||
"ButtonQueueAddItem": "કતારમાં ઉમેરો",
|
||||
"ButtonQueueRemoveItem": "કતારથી કાઢી નાખો",
|
||||
"ButtonQuickEmbed": "ઝડપથી સમાવેશ કરો",
|
||||
"ButtonQuickEmbedMetadata": "ઝડપથી મેટાડેટા સમાવવો",
|
||||
"ButtonQuickMatch": "ઝડપી મેળ ખવડાવો",
|
||||
"ButtonReScan": "ફરીથી સ્કેન કરો",
|
||||
"ButtonRead": "વાંચો",
|
||||
"ButtonReadLess": "ઓછું વાંચો",
|
||||
"ButtonReadMore": "વધારે વાંચો",
|
||||
"ButtonRefresh": "તાજું કરો",
|
||||
"ButtonRemove": "કાઢી નાખો",
|
||||
"ButtonRemoveAll": "બધું કાઢી નાખો",
|
||||
"ButtonRemoveAllLibraryItems": "બધું પુસ્તકાલય વસ્તુઓ કાઢી નાખો",
|
||||
@@ -68,16 +87,21 @@
|
||||
"ButtonSaveTracklist": "ટ્રેક યાદી સાચવો",
|
||||
"ButtonScan": "સ્કેન કરો",
|
||||
"ButtonScanLibrary": "પુસ્તકાલય સ્કેન કરો",
|
||||
"ButtonScrollLeft": "ડાબે",
|
||||
"ButtonScrollRight": "જમણે",
|
||||
"ButtonSearch": "શોધો",
|
||||
"ButtonSelectFolderPath": "ફોલ્ડર પથ પસંદ કરો",
|
||||
"ButtonSeries": "સિરીઝ",
|
||||
"ButtonSetChaptersFromTracks": "ટ્રેક્સથી પ્રકરણો સેટ કરો",
|
||||
"ButtonShare": "શેર કરો",
|
||||
"ButtonShiftTimes": "સમય શિફ્ટ કરો",
|
||||
"ButtonShow": "બતાવો",
|
||||
"ButtonStartM4BEncode": "M4B એન્કોડ શરૂ કરો",
|
||||
"ButtonStartMetadataEmbed": "મેટાડેટા એમ્બેડ શરૂ કરો",
|
||||
"ButtonStats": "આંકડા",
|
||||
"ButtonSubmit": "સબમિટ કરો",
|
||||
"ButtonTest": "પરખ કરો",
|
||||
"ButtonUnlinkOpenId": "OpenID દૂર કરો",
|
||||
"ButtonUpload": "અપલોડ કરો",
|
||||
"ButtonUploadBackup": "બેકઅપ અપલોડ કરો",
|
||||
"ButtonUploadCover": "કવર અપલોડ કરો",
|
||||
@@ -86,11 +110,16 @@
|
||||
"ButtonUserEdit": "વપરાશકર્તા {0} સંપાદિત કરો",
|
||||
"ButtonViewAll": "બધું જુઓ",
|
||||
"ButtonYes": "હા",
|
||||
"ErrorUploadFetchMetadataAPI": "મેટાડેટા મેળવવામાં તકલીફ આવી",
|
||||
"ErrorUploadFetchMetadataNoResults": "મેટાડેટા મેળવી શક્યા નહીં – કૃપા કરીને શીર્ષક અને/અથવા લેખકનું નામ અપડેટ કરવાનો પ્રયત્ન કરો",
|
||||
"ErrorUploadLacksTitle": "શીર્ષક હોવું આવશ્યક છે",
|
||||
"HeaderAccount": "એકાઉન્ટ",
|
||||
"HeaderAddCustomMetadataProvider": "કસ્ટમ મેટાડેટા પ્રોવાઇડર ઉમેરો",
|
||||
"HeaderAdvanced": "અડ્વાન્સડ",
|
||||
"HeaderAppriseNotificationSettings": "Apprise સૂચના સેટિંગ્સ",
|
||||
"HeaderAudioTracks": "ઓડિયો ટ્રેક્સ",
|
||||
"HeaderAudiobookTools": "ઓડિયોબુક ફાઇલ વ્યવસ્થાપન ટૂલ્સ",
|
||||
"HeaderAuthentication": "પ્રમાણીકરણ",
|
||||
"HeaderBackups": "બેકઅપ્સ",
|
||||
"HeaderChangePassword": "પાસવર્ડ બદલો",
|
||||
"HeaderChapters": "પ્રકરણો",
|
||||
@@ -99,6 +128,7 @@
|
||||
"HeaderCollectionItems": "સંગ્રહ વસ્તુઓ",
|
||||
"HeaderCover": "આવરણ",
|
||||
"HeaderCurrentDownloads": "વર્તમાન ડાઉનલોડ્સ",
|
||||
"HeaderCustomMetadataProviders": "કસ્ટમ મેટાડેટા પ્રોવાઇડર્સ",
|
||||
"HeaderDetails": "વિગતો",
|
||||
"HeaderDownloadQueue": "ડાઉનલોડ કતાર",
|
||||
"HeaderEbookFiles": "ઇબુક ફાઇલો",
|
||||
@@ -129,6 +159,7 @@
|
||||
"HeaderMetadataToEmbed": "એમ્બેડ કરવા માટે મેટાડેટા",
|
||||
"HeaderNewAccount": "નવું એકાઉન્ટ",
|
||||
"HeaderNewLibrary": "નવી પુસ્તકાલય",
|
||||
"HeaderNotificationCreate": "સૂચના બનાવો",
|
||||
"HeaderNotifications": "સૂચનાઓ",
|
||||
"HeaderOpenRSSFeed": "RSS ફીડ ખોલો",
|
||||
"HeaderOtherFiles": "અન્ય ફાઇલો",
|
||||
|
||||
+106
-3
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "הוסף",
|
||||
"ButtonAddApiKey": "הוסף מפתח ממשק תכנות (API)",
|
||||
"ButtonAddChapters": "הוסף פרקים",
|
||||
"ButtonAddDevice": "הוסף התקן",
|
||||
"ButtonAddLibrary": "הוסף ספרייה",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "בחר תיקייה",
|
||||
"ButtonChooseFiles": "בחר קבצים",
|
||||
"ButtonClearFilter": "נקה סינון",
|
||||
"ButtonClose": "סגור",
|
||||
"ButtonCloseFeed": "סגור ערוץ",
|
||||
"ButtonCloseSession": "סגור סשן פתוח",
|
||||
"ButtonCollections": "אוספים",
|
||||
@@ -79,7 +81,7 @@
|
||||
"ButtonRemove": "הסר",
|
||||
"ButtonRemoveAll": "הסר הכל",
|
||||
"ButtonRemoveAllLibraryItems": "הסר את כל פריטי הספרייה",
|
||||
"ButtonRemoveFromContinueListening": "הסר מ- המשך האזנה",
|
||||
"ButtonRemoveFromContinueListening": "הסר מ״המשך האזנה״",
|
||||
"ButtonRemoveFromContinueReading": "הסר מ- המשך קריאה",
|
||||
"ButtonRemoveSeriesFromContinueSeries": "הסר סדרה מ- המשך סדרה",
|
||||
"ButtonReset": "איפוס",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "חשבון",
|
||||
"HeaderAddCustomMetadataProvider": "הוסף ספק מטא-נתונים מותאם אישית",
|
||||
"HeaderAdvanced": "מתקדם",
|
||||
"HeaderApiKeys": "מפתחות API",
|
||||
"HeaderAppriseNotificationSettings": "הגדרות התראות של Apprise",
|
||||
"HeaderAudioTracks": "רצועות קול",
|
||||
"HeaderAudiobookTools": "כלים לניהול קבצי ספרים קוליים",
|
||||
"HeaderAuthentication": "אימות",
|
||||
"HeaderBackups": "גיבויים",
|
||||
"HeaderBulkChapterModal": "הוסף מספר פרקים",
|
||||
"HeaderChangePassword": "שנה סיסמה",
|
||||
"HeaderChapters": "פרקים",
|
||||
"HeaderChooseAFolder": "בחר תיקייה",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "סדר העדפת מטא-נתונים",
|
||||
"HeaderMetadataToEmbed": "מטא-נתונים להטמעה",
|
||||
"HeaderNewAccount": "חשבון חדש",
|
||||
"HeaderNewApiKey": "מפתח API חדש",
|
||||
"HeaderNewLibrary": "ספרייה חדשה",
|
||||
"HeaderNotificationCreate": "צור התראה",
|
||||
"HeaderNotificationUpdate": "עדכון התראה",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "תכונות ניסיוניות",
|
||||
"HeaderSettingsGeneral": "כללי",
|
||||
"HeaderSettingsScanner": "סורק",
|
||||
"HeaderSettingsSecurity": "אבטחה",
|
||||
"HeaderSettingsWebClient": "מערך",
|
||||
"HeaderSleepTimer": "טיימר שינה",
|
||||
"HeaderStatsLargestItems": "הפריטים הגדולים ביותר",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "תוכן עניינים",
|
||||
"HeaderTools": "כלים",
|
||||
"HeaderUpdateAccount": "עדכן חשבון",
|
||||
"HeaderUpdateApiKey": "עדכן מפתח API",
|
||||
"HeaderUpdateAuthor": "עדכן יוצר",
|
||||
"HeaderUpdateDetails": "עדכן פרטים",
|
||||
"HeaderUpdateLibrary": "עדכן ספרייה",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "כל המשתמשים, ללא אורחים",
|
||||
"LabelAllUsersIncludingGuests": "כל המשתמשים כולל אורחים",
|
||||
"LabelAlreadyInYourLibrary": "כבר קיים בספרייה שלך",
|
||||
"LabelApiKeyCreated": "מפתח API ״{0}״ נוצר בהצלחה.",
|
||||
"LabelApiKeyCreatedDescription": "אנא העתק את מפתח ה־API כעת, לא ניתן יהיה להציגו שוב.",
|
||||
"LabelApiKeyUser": "פעל בשם המשתמש",
|
||||
"LabelApiKeyUserDescription": "למפתח ה־API יהיו הרשאות זהות למשתמש שעל שמו הוא פועל. ביומני הרישום (logs), הפעולות יופיעו כאילו בוצעו על ידי המשתמש עצמו.",
|
||||
"LabelApiToken": "טוקן API",
|
||||
"LabelAppend": "הוסף לסוף",
|
||||
"LabelAudioBitrate": "קצב סיביות (לדוגמא 128k)",
|
||||
@@ -284,6 +295,7 @@
|
||||
"LabelContinueListening": "המשך האזנה",
|
||||
"LabelContinueReading": "המשך קריאה",
|
||||
"LabelContinueSeries": "המשך סדרה",
|
||||
"LabelCorsAllowed": "מקורות CORS מורשים",
|
||||
"LabelCover": "כריכה",
|
||||
"LabelCoverImageURL": "כתובת התמונה ברשת",
|
||||
"LabelCoverProvider": "ספק כריכה",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "מחיקה מהמערכת הקבצים (הסר סימון למחיקה רק ממסד הנתונים)",
|
||||
"LabelDescription": "תיאור",
|
||||
"LabelDeselectAll": "הסר בחירת כל הפריטים",
|
||||
"LabelDetectedPattern": "תבנית שזוהתה:",
|
||||
"LabelDevice": "התקן",
|
||||
"LabelDeviceInfo": "מידע על התקן",
|
||||
"LabelDeviceIsAvailableTo": "התקן זמין ל...",
|
||||
@@ -346,7 +359,11 @@
|
||||
"LabelExample": "דוגמה",
|
||||
"LabelExpandSeries": "הרחב סדרה",
|
||||
"LabelExpandSubSeries": "הרחב תת סדרה",
|
||||
"LabelExplicit": "בוטה",
|
||||
"LabelExpired": "פג תוקף",
|
||||
"LabelExpiresAt": "יפוג בתאריך",
|
||||
"LabelExpiresInSeconds": "יפוג בעוד (שניות)",
|
||||
"LabelExpiresNever": "ללא הגבלת זמן",
|
||||
"LabelExplicit": "מפורש",
|
||||
"LabelExplicitChecked": "בוטה (מסומן)",
|
||||
"LabelExplicitUnchecked": "לא בוטה (לא מסומן)",
|
||||
"LabelExportOPML": "ייצוא OPML",
|
||||
@@ -361,6 +378,7 @@
|
||||
"LabelFilterByUser": "סינון לפי משתמש",
|
||||
"LabelFindEpisodes": "מצא פרקים",
|
||||
"LabelFinished": "הושלם",
|
||||
"LabelFinishedDate": "הושלם {0}",
|
||||
"LabelFolder": "תיקייה",
|
||||
"LabelFolders": "תיקיות",
|
||||
"LabelFontBold": "מודגש",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "שפות",
|
||||
"LabelLastBookAdded": "הספר האחרון שנוסף",
|
||||
"LabelLastBookUpdated": "הספר האחרון שעודכן",
|
||||
"LabelLastProgressDate": "התקדמות אחרונה: {0}",
|
||||
"LabelLastSeen": "נראה לאחרונה",
|
||||
"LabelLastTime": "הזמן האחרון",
|
||||
"LabelLastUpdate": "עדכון אחרון",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "לא {0}",
|
||||
"LabelLibraryItem": "פריט ספרייה",
|
||||
"LabelLibraryName": "שם הספרייה",
|
||||
"LabelLibrarySortByProgress": "התקדמות: עודכן לאחרונה",
|
||||
"LabelLibrarySortByProgressFinished": "התקדמות: הושלם",
|
||||
"LabelLibrarySortByProgressStarted": "התקדמות: הותחל",
|
||||
"LabelLimit": "מגבלה",
|
||||
"LabelLineSpacing": "מרווח שורה",
|
||||
"LabelListenAgain": "האזן שוב",
|
||||
@@ -425,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "אזהרה",
|
||||
"LabelLookForNewEpisodesAfterDate": "חפש פרקים חדשים לאחר תאריך זה",
|
||||
"LabelLowestPriority": "העדיפות הנמוכה ביותר",
|
||||
"LabelMatchConfidence": "רמת ודאות",
|
||||
"LabelMatchExistingUsersBy": "התאם משתמשים קיימים לפי",
|
||||
"LabelMatchExistingUsersByDescription": "משמש לחיבור משתמשים קיימים. לאחר החיבור, המשתמשים יותאמו לפי זיהוי ייחודי מספק ה-SSO שלך",
|
||||
"LabelMaxEpisodesToDownload": "מספר פרקים מקסימלי להורדה. 0 - ללא הגבלה.",
|
||||
@@ -454,7 +477,9 @@
|
||||
"LabelNewestAuthors": "הסופרים האחרונים",
|
||||
"LabelNewestEpisodes": "הפרקים החדשים ביותר",
|
||||
"LabelNextBackupDate": "תאריך הגיבוי הבא",
|
||||
"LabelNextChapters": "הפרקים הבא יהיו:",
|
||||
"LabelNextScheduledRun": "הרצה מתוזמנת הבאה",
|
||||
"LabelNoApiKeys": "אין מפתחות API",
|
||||
"LabelNoCustomMetadataProviders": "אין ספקי מטא-נתונים מותאמים אישית",
|
||||
"LabelNoEpisodesSelected": "לא נבחרו פרקים",
|
||||
"LabelNotFinished": "לא הושלם",
|
||||
@@ -470,16 +495,21 @@
|
||||
"LabelNotificationsMaxQueueSize": "גודל התור המרבי לאירועי התראה",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "האירועים מוגבלים לשליחה אחת לשנייה. האירועים יתעלמו אם התור מלא. הגדרה זו נועדה למנוע ספאם התראות.",
|
||||
"LabelNumberOfBooks": "מספר הספרים",
|
||||
"LabelNumberOfChapters": "מספר הפרקים:",
|
||||
"LabelNumberOfEpisodes": "# פרקים",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "שם OpenID claim המכילה הרשאות מתקדמות לפעולות משתמש בתוך האפליקציה, אשר יחולו על תפקידים שאינם מנהלי מערכת (<b>אם הוגדרה</b>). אם התביעה חסרה בתגובה, הגישה ל-ABS תידחה. אם אפשרות אחת חסרה, היא תטופל כ-<code>false</code> יש לוודא שטענת ספק הזהויות תואמת את המבנה הצפוי:",
|
||||
"LabelOpenIDClaims": "השאר את האפשרויות הבאות ריקות כדי להשבית הקצאת קבוצות והרשאות מתקדמת, ולאחר מכן להקצות אוטומטית את קבוצת 'משתמש'.",
|
||||
"LabelOpenIDGroupClaimDescription": "שם ה־OpenID claim המכיל את רשימת הקבוצות של המשתמש. בדרך כלל נקרא <code>groups</code>. <b>אם הוגדרה</b>, האפליקציה תקצה תפקידים באופן אוטומטי על סמך השיוך לקבוצות, בתנאי ששמות הקבוצות ב־claim הם 'admin', 'user' או 'guest' (ללא רגישות לרישיות - Case-insensitive). ה־claim צריך להכיל רשימה; אם המשתמש משויך למספר קבוצות, האפליקציה תקצה את התפקיד בעל רמת הגישה הגבוהה ביותר. במידה ולא נמצאה קבוצה תואמת, הגישה תיחסם.",
|
||||
"LabelOpenRSSFeed": "פתח ערוץ RSS",
|
||||
"LabelOverwrite": "לשכפל",
|
||||
"LabelPaginationPageXOfY": "עמוד {0} מתוך {1}",
|
||||
"LabelPassword": "סיסמה",
|
||||
"LabelPath": "נתיב",
|
||||
"LabelPermanent": "קבוע",
|
||||
"LabelPermissionsAccessAllLibraries": "ניתן לגשת לכל הספריות",
|
||||
"LabelPermissionsAccessAllTags": "ניתן לגשת לכל התגיות",
|
||||
"LabelPermissionsAccessExplicitContent": "ניתן לגשת לתוכן בוטה",
|
||||
"LabelPermissionsCreateEreader": "ניתן ליצור קורא ספרים דיגיטלי",
|
||||
"LabelPermissionsDelete": "מותר למחוק",
|
||||
"LabelPermissionsDownload": "מותר להוריד",
|
||||
"LabelPermissionsUpdate": "מותר לעדכן",
|
||||
@@ -487,6 +517,8 @@
|
||||
"LabelPersonalYearReview": "השנה שלך בסקירה ({0})",
|
||||
"LabelPhotoPathURL": "נתיב/URL לתמונה",
|
||||
"LabelPlayMethod": "שיטת הפעלה",
|
||||
"LabelPlaybackRateIncrementDecrement": "שיעור הגדלה/הפחתה של מהירות ההשמעה",
|
||||
"LabelPlayerChapterNumberMarker": "{0} מתוך {1}",
|
||||
"LabelPlaylists": "רשימות השמעה",
|
||||
"LabelPodcast": "פודקאסט",
|
||||
"LabelPodcastSearchRegion": "אזור חיפוש פודקאסט",
|
||||
@@ -498,10 +530,14 @@
|
||||
"LabelPrimaryEbook": "ספר אלקטרוני ראשי",
|
||||
"LabelProgress": "התקדמות",
|
||||
"LabelProvider": "ספק",
|
||||
"LabelProviderAuthorizationValue": "ערך כותרת האימות (Authorization Header)",
|
||||
"LabelPubDate": "תאריך פרסום",
|
||||
"LabelPublishYear": "שנת הפרסום",
|
||||
"LabelPublishedDate": "פורסם {0}",
|
||||
"LabelPublishedDecade": "עשור פרסום",
|
||||
"LabelPublishedDecades": "עשורי פרסום",
|
||||
"LabelPublisher": "מוציא לאור",
|
||||
"LabelPublishers": "מוצאים לאור",
|
||||
"LabelRSSFeedCustomOwnerEmail": "אימייל בעלים מותאם אישית",
|
||||
"LabelRSSFeedCustomOwnerName": "שם בעלים מותאם אישית",
|
||||
"LabelRSSFeedOpen": "ערוץ RSS פתוח",
|
||||
@@ -509,6 +545,7 @@
|
||||
"LabelRSSFeedSlug": "Slug של ערוץ ה-RSS",
|
||||
"LabelRSSFeedURL": "כתובת ערוץ ה-RSS",
|
||||
"LabelRandomly": "באופן אקראי",
|
||||
"LabelReAddSeriesToContinueListening": "הוסף סדרה בחזרה אל ״המשך האזנה״",
|
||||
"LabelRead": "קריאה",
|
||||
"LabelReadAgain": "קרא שוב",
|
||||
"LabelReadEbookWithoutProgress": "קרא/י ספר אלקטרוני ללא שמירת התקדמות",
|
||||
@@ -518,29 +555,44 @@
|
||||
"LabelRedo": "עשה שוב",
|
||||
"LabelRegion": "אזור",
|
||||
"LabelReleaseDate": "תאריך הוצאה לאור",
|
||||
"LabelRemoveAllMetadataAbs": "הסר את כל קבצי metadata.abs",
|
||||
"LabelRemoveAllMetadataJson": "הסר את כל קבצי metadata.json",
|
||||
"LabelRemoveAudibleBranding": "הסר פתיח וסיום של Audible מהפרקים",
|
||||
"LabelRemoveCover": "הסר כריכה",
|
||||
"LabelRemoveMetadataFile": "הסר קבצי מטא־נתונים מתיקיות הפריטים בספרייה",
|
||||
"LabelRemoveMetadataFileHelp": "הסר את כל קבצי metadata.json ו־metadata.abs מתיקיות {0}.",
|
||||
"LabelRowsPerPage": "שורות לעמוד",
|
||||
"LabelSearchTerm": "מונח חיפוש",
|
||||
"LabelSearchTitle": "כותרת חיפוש",
|
||||
"LabelSearchTitleOrASIN": "כותרת חיפוש או ASIN",
|
||||
"LabelSeason": "עונה",
|
||||
"LabelSeasonNumber": "עונה #{0}",
|
||||
"LabelSelectAll": "בחר הכל",
|
||||
"LabelSelectAllEpisodes": "בחר את כל הפרקים",
|
||||
"LabelSelectEpisodesShowing": "בחר {0} פרקים המוצגים",
|
||||
"LabelSelectUser": "בחר משתמש",
|
||||
"LabelSelectUsers": "בחר משתמשים",
|
||||
"LabelSendEbookToDevice": "שלח ספר אלקטרוני ל...",
|
||||
"LabelSequence": "רצף",
|
||||
"LabelSerial": "מספר סידורי",
|
||||
"LabelSeries": "סדרה",
|
||||
"LabelSeriesName": "שם הסדרה",
|
||||
"LabelSeriesProgress": "התקדמות בסדרה",
|
||||
"LabelServerLogLevel": "רמת פירוט יומני הרישום",
|
||||
"LabelServerYearReview": "השנה בסקירה של השרת ({0})",
|
||||
"LabelSetEbookAsPrimary": "קבע כראשי",
|
||||
"LabelSetEbookAsSupplementary": "קבע כמשלים",
|
||||
"LabelSettingsAllowIframe": "אפשר הטמעה בתוך iframe",
|
||||
"LabelSettingsAudiobooksOnly": "רק ספרי קול",
|
||||
"LabelSettingsAudiobooksOnlyHelp": "הפעלת ההגדרה הזו תתעלם מקבצי ספרים אלקטרוניים אלא אם כן הם נמצאים בתיקיית ספרי קול, שבמקרה זה יקבעו כספרים אלקטרוניים נלווים",
|
||||
"LabelSettingsBookshelfViewHelp": "עיצוב סקאומורפי עם מדפי עץ",
|
||||
"LabelSettingsChromecastSupport": "תמיכה ב-Chromecast",
|
||||
"LabelSettingsDateFormat": "פורמט תאריך",
|
||||
"LabelSettingsEnableWatcher": "הפעל מעקב שינויים בספריות",
|
||||
"LabelSettingsEnableWatcherForLibrary": "הפעל מעקב שינויים בספרייה",
|
||||
"LabelSettingsEnableWatcherHelp": "מאפשר הוספת/עדכון אוטומטי של פריטים כאשר שינויי קבצים זוהים. *דורש איתחול שרת",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "אפשור תוכן הכולל סקריפטים ב־ePubs",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "אפשר לקובצי EPUB להריץ סקריפטים. מומלץ להשאיר את ההגדרה כבויה, אלא אם כן מקור קובצי ה־ePub מהימן.",
|
||||
"LabelSettingsExperimentalFeatures": "תכונות ניסיוניות",
|
||||
"LabelSettingsExperimentalFeaturesHelp": "תכונות בפיתוח שדורשות משובך ובדיקה. לחץ לפתיחת דיון ב-GitHub.",
|
||||
"LabelSettingsFindCovers": "מצא כריכות",
|
||||
@@ -549,7 +601,8 @@
|
||||
"LabelSettingsHideSingleBookSeriesHelp": "סדרות הכוללות ספר אחד יוסתרו מדף הסדרות ומדף הבית.",
|
||||
"LabelSettingsHomePageBookshelfView": "השתמש בתצוגת מדף בדף הבית",
|
||||
"LabelSettingsLibraryBookshelfView": "השתמש בתצוגת מדף בספרייה",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "דלג על ספרים קודמים ב-המשך סדרה",
|
||||
"LabelSettingsLibraryMarkAsFinishedWhen": "סמן פריט מדיה כהושלם כאשר",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "דלג על ספרים קודמים ב״המשך סדרה״",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "מדף המשך סדרות מציג את הספר הראשון שלא הושמע בסדרה שיש בה לפחות ספר אחד שהושלם ואין ספרים שכבר באמצע שמיעה. הפעלת הגדרה זו תמשיך סדרות מהספר שהושלם הכי מתקדם בסדרה במקום מהספר הראשון שלא הושמע.",
|
||||
"LabelSettingsParseSubtitles": "פענח כתוביות",
|
||||
"LabelSettingsParseSubtitlesHelp": "העתק כותרת משנה משם תיקיית הספר.<br>כותרת המשנה חייבת להיות מופרדת עם התו ״-״<br>לדוגמא, כותרת המשנה לספר ״שם הספר - כותרת משנה״, היא ״כותרת משנה״",
|
||||
@@ -566,13 +619,22 @@
|
||||
"LabelSettingsStoreMetadataWithItem": "אחסן מטה-נתונים עם הפריט",
|
||||
"LabelSettingsStoreMetadataWithItemHelp": "כברירת מחדל, קבצי מטה-נתונים מאוחסנים ב- /metadata/items, הפעלת ההגדרה תאחסן קבצי מטה-נתונים בתיקיית פריט שלך בספרייה",
|
||||
"LabelSettingsTimeFormat": "פורמט זמן",
|
||||
"LabelShare": "שתף",
|
||||
"LabelShareDownloadableHelp": "אפשר למי שיש ברשותו קישור שיתוף להוריד קובץ ZIP של פריט הספרייה.",
|
||||
"LabelShareURL": "שתף קישור",
|
||||
"LabelShowAll": "הצג הכל",
|
||||
"LabelShowSeconds": "הצג שניות",
|
||||
"LabelShowSubtitles": "הצג כתוביות",
|
||||
"LabelSize": "גודל",
|
||||
"LabelSleepTimer": "טיימר שינה",
|
||||
"LabelSortAscending": "סדר עולה",
|
||||
"LabelSortDescending": "סדר יורד",
|
||||
"LabelSortPubDate": "מיין לפי תאריך פרסום",
|
||||
"LabelStart": "התחל",
|
||||
"LabelStartTime": "זמן התחלה",
|
||||
"LabelStarted": "התחיל",
|
||||
"LabelStartedAt": "התחיל ב",
|
||||
"LabelStartedDate": "הותחל {0}",
|
||||
"LabelStatsAudioTracks": "רצועות שמע",
|
||||
"LabelStatsAuthors": "מחברים",
|
||||
"LabelStatsBestDay": "היום הטוב ביותר",
|
||||
@@ -602,7 +664,13 @@
|
||||
"LabelTheme": "ערכת נושא",
|
||||
"LabelThemeDark": "כהה",
|
||||
"LabelThemeLight": "בהיר",
|
||||
"LabelThemeSepia": "ספיה",
|
||||
"LabelTimeBase": "בסיס זמן",
|
||||
"LabelTimeDurationXHours": "{0} שעות",
|
||||
"LabelTimeDurationXMinutes": "{0} דקות",
|
||||
"LabelTimeDurationXSeconds": "{0} שניות",
|
||||
"LabelTimeInMinutes": "זמן בשניות",
|
||||
"LabelTimeLeft": "נותרו {0}",
|
||||
"LabelTimeListened": "זמן האזנה",
|
||||
"LabelTimeListenedToday": "זמן האזנה היום",
|
||||
"LabelTimeRemaining": "{0} נותרו",
|
||||
@@ -610,6 +678,7 @@
|
||||
"LabelTitle": "כותרת",
|
||||
"LabelToolsEmbedMetadata": "הטמעת מטה-נתונים",
|
||||
"LabelToolsEmbedMetadataDescription": "הטמעת מטה-נתונים לקבצי שמע כולל תמונות כריכה ופרקים.",
|
||||
"LabelToolsM4bEncoder": "מקודד M4B",
|
||||
"LabelToolsMakeM4b": "יצירת קובץ אודיו M4B",
|
||||
"LabelToolsMakeM4bDescription": "יצירת קובץ אודיו .M4B עם מטה-נתונים מוטמעים, תמונת שער ופרקים.",
|
||||
"LabelToolsSplitM4b": "פיצול M4B ל-MP3",
|
||||
@@ -622,29 +691,39 @@
|
||||
"LabelTracksMultiTrack": "רב-ערוצי",
|
||||
"LabelTracksNone": "אין ערוצים",
|
||||
"LabelTracksSingleTrack": "רצועה יחידה",
|
||||
"LabelTrailer": "קדימון",
|
||||
"LabelType": "סוג",
|
||||
"LabelUnabridged": "לא מקוצר",
|
||||
"LabelUndo": "בטל",
|
||||
"LabelUnknown": "לא ידוע",
|
||||
"LabelUnknownPublishDate": "תאריך הוצאה לאור לא ידוע",
|
||||
"LabelUpdateCover": "עדכן כריכה",
|
||||
"LabelUpdateCoverHelp": "אפשר החלפה של כריכות קיימות עבור הספרים הנבחרים כאשר נמצאה התאמה",
|
||||
"LabelUpdateDetails": "עדכון פרטים",
|
||||
"LabelUpdateDetailsHelp": "אפשר החלפה של פרטים קיימים עבור הספרים הנבחרים כאשר נמצאה התאמה",
|
||||
"LabelUpdatedAt": "עודכן ב-",
|
||||
"LabelUploaderDragAndDrop": "גרור ושחרר קבצים או תיקיות",
|
||||
"LabelUploaderDragAndDropFilesOnly": "גרור ושחרר קבצים",
|
||||
"LabelUploaderDropFiles": "שחרר קבצים",
|
||||
"LabelUploaderItemFetchMetadataHelp": "משיכת כותרת, סופר וסדרה באופן אוטומטי",
|
||||
"LabelUseAdvancedOptions": "השתמש באפשרויות מתקדמות",
|
||||
"LabelUseChapterTrack": "השתמש ברצועות הפרקים",
|
||||
"LabelUseFullTrack": "השתמש ברצועה המלאה",
|
||||
"LabelUseZeroForUnlimited": "השתמש ב־0 מתוך אין־סוף",
|
||||
"LabelUser": "משתמש",
|
||||
"LabelUsername": "שם משתמש",
|
||||
"LabelValue": "ערך",
|
||||
"LabelVersion": "גרסה",
|
||||
"LabelViewBookmarks": "הצג סימניות",
|
||||
"LabelViewChapters": "הצג פרקים",
|
||||
"LabelViewPlayerSettings": "הצג הגדרות נגן",
|
||||
"LabelViewQueue": "הצג תור נגן",
|
||||
"LabelVolume": "עוצמת קול",
|
||||
"LabelWebRedirectURLsDescription": "יש לאשר את הכתובות הבאות אצל ספק ה־OAuth כדי לאפשר הפניה חזרה לאפליקציית הדפדפן לאחר ההתחברות:",
|
||||
"LabelWebRedirectURLsSubfolder": "תיקיית משנה לכתובות הפניה",
|
||||
"LabelWeekdaysToRun": "ימי השבוע להרצה",
|
||||
"LabelXBooks": "{0} ספרים",
|
||||
"LabelXItems": "{0} פריטים",
|
||||
"LabelYearReviewHide": "הסתר סקירת שנה",
|
||||
"LabelYearReviewShow": "הצג סקירת שנה",
|
||||
"LabelYourAudiobookDuration": "משך הספר הקולי שלך",
|
||||
@@ -653,31 +732,55 @@
|
||||
"LabelYourProgress": "ההתקדמות שלך",
|
||||
"MessageAddToPlayerQueue": "הוסף לתור הנגן",
|
||||
"MessageAppriseDescription": "כדי להשתמש בתכונה זו יש לך להריץ מופע של <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">ממשק התכנית האפליקציה</a> או API שיטפל בבקשות אלו. <br /> כתובת URL של ממשק ה-Apprise API צריכה להיות הנתיב המלא לשליחת ההתראה, לדוגמה, אם המופע של ה-API שלך מוצע ב-<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> כוללים קבצים שמורים בתיקיות הספרייה שלך.",
|
||||
"MessageBackupsLocationEditNote": "הערה: שינוי מיקום הגיבוי לא יגרום להעברה או לשינוי של גיבויים קיימים",
|
||||
"MessageBackupsLocationNoEditNote": "הערה: מיקום הגיבוי מוגדר באמצעות משתנה סביבה ולא ניתן לשנותו כאן.",
|
||||
"MessageBackupsLocationPathEmpty": "נתיב מיקום הגיבוי אינו יכול להיות ריק",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "מלא את השדות הפעילים בנתונים מכל הפריטים. שדות בעלי ערכים מרובים ימוזגו",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "מלא את שדות פרטי המיפוי הפעילים בנתונים מפריט זה",
|
||||
"MessageBatchQuickMatchDescription": "התאמה מהירה תנסה להוסיף כריכות ומטה-נתונים חסרים עבור הפריטים הנבחרים. הפעל את האפשרויות למטה כדי לאפשר להתאמה מהירה להחליף כריכות קיימות ו/או מטה-נתונים.",
|
||||
"MessageBookshelfNoCollections": "עדיין לא יצרת אוספים",
|
||||
"MessageBookshelfNoCollectionsHelp": "האוספים ציבוריים. כל המשתמשים בעלי גישה לספרייה יכולים לראות אותם.",
|
||||
"MessageBookshelfNoRSSFeeds": "אין ערוצי RSS פתוחים",
|
||||
"MessageBookshelfNoResultsForFilter": "אין תוצאות עבור סינון \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "אין תוצאות עבור השאילתה",
|
||||
"MessageBookshelfNoSeries": "אין לך סדרות",
|
||||
"MessageBulkChapterPattern": "כמה פרקים להוסיף לפי תבנית מספור זו?",
|
||||
"MessageChapterEndIsAfter": "זמן סיום הפרק אחרי סיום הספר הקולי שלך",
|
||||
"MessageChapterErrorFirstNotZero": "הפרק הראשון חייב להתחיל ב-0",
|
||||
"MessageChapterErrorStartGteDuration": "זמן התחלה לא תקין, חייב להיות פחות ממשך הספר הקולי",
|
||||
"MessageChapterErrorStartLtPrev": "זמן התחלה לא תקין, חייב להיות גדול או שווה לזמן ההתחלה של הפרק הקודם",
|
||||
"MessageChapterStartIsAfter": "התחלת הפרק אחרי סיום הספר הקולי שלך",
|
||||
"MessageChaptersNotFound": "לא נמצאו פרקים",
|
||||
"MessageCheckingCron": "בודק את תזמון העבודה...",
|
||||
"MessageConfirmCloseFeed": "האם אתה בטוח שאתה רוצה לסגור את הערוץ הזה?",
|
||||
"MessageConfirmDeleteApiKey": "האם למחוק את מפתח ה־API \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "האם אתה בטוח שברצונך למחוק גיבוי עבור {0}?",
|
||||
"MessageConfirmDeleteDevice": "האם למחוק את הקורא האלקטרוני \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "הקובץ ימחק לצמיתות מהמערכת שלך. האם אתה בטוח?",
|
||||
"MessageConfirmDeleteLibrary": "האם אתה בטוח שברצונך למחוק לצמיתות את הספרייה \"{0}\"?",
|
||||
"MessageConfirmDeleteLibraryItem": "פריט הספרייה יימחק לצמיתות ממסד הנתונים ומהמערכת שלך. האם אתה בטוח?",
|
||||
"MessageConfirmDeleteLibraryItems": "פריטי הספרייה {0} יימחקו ממסד הנתונים ומהמערכת שלך. האם אתה בטוח?",
|
||||
"MessageConfirmDeleteMetadataProvider": "האם למחוק את ספק המטא־נתונים המותאם \"{0}\"?",
|
||||
"MessageConfirmDeleteNotification": "האם למחוק התראה זו?",
|
||||
"MessageConfirmDeleteSession": "האם אתה בטוח שאתה רוצה למחוק את ההפעלה הזו?",
|
||||
"MessageConfirmEmbedMetadataInAudioFiles": "האם להטמיע מטא־נתונים ב־{0} קובצי שמע?",
|
||||
"MessageConfirmForceReScan": "האם אתה בטוח שאתה רוצה להכריח סריקה מחדש?",
|
||||
"MessageConfirmMarkAllEpisodesFinished": "האם אתה בטוח שברצונך לסמן את כל הפרקים כהסתיימו?",
|
||||
"MessageConfirmMarkAllEpisodesNotFinished": "האם אתה בטוח שברצונך לסמן את כל הפרקים כלא הסתיימו?",
|
||||
"MessageConfirmMarkItemFinished": "האם לסמן את \"{0}\" כהושלם?",
|
||||
"MessageConfirmMarkItemNotFinished": "האם לסמן את \"{0}\" כלא הושלם?",
|
||||
"MessageConfirmMarkSeriesFinished": "האם אתה בטוח שברצונך לסמן את כל הספרים בסדרה זו כהסתיימו?",
|
||||
"MessageConfirmMarkSeriesNotFinished": "האם אתה בטוח שברצונך לסמן את כל הספרים בסדרה זו כלא הסתיימו?",
|
||||
"MessageConfirmNotificationTestTrigger": "האם להפעיל התראה זו עם נתוני בדיקה?",
|
||||
"MessageConfirmPurgeCache": "ניקוי המטמון ימחק את כל התיקייה ב־<code>/metadata/cache</code>.<br /><br />האם למחוק את תיקיית המטמון?",
|
||||
"MessageConfirmPurgeItemsCache": "ניקוי מטמון הפריטים ימחק את כל התיקייה ב־<code>metadata/cache/items/</code>.<br />האם למחוק?",
|
||||
"MessageConfirmQuickEmbed": "אזהרה! הטמעה מהירה לא תגבה גיבוי של קבצי האודיו שלך. וודא שיש לך גיבוי של קבצי האודיו שלך. <br><br>האם ברצונך להמשיך?",
|
||||
"MessageConfirmQuickMatchEpisodes": "התאמה מהירה תדרוס פרטים עבור פרקים תואמים. רק פרקים ללא התאמה יעודכנו. האם להמשיך?",
|
||||
"MessageConfirmReScanLibraryItems": "האם אתה בטוח שברצונך לסרוק מחדש {0} פריטים?",
|
||||
"MessageConfirmRemoveAllChapters": "האם אתה בטוח שברצונך להסיר את כל הפרקים?",
|
||||
"MessageConfirmRemoveAuthor": "האם אתה בטוח שברצונך להסיר את המחבר \"{0}\"?",
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
{
|
||||
"ButtonAdd": "जोड़ें",
|
||||
"ButtonAddApiKey": "एपीआई कुंजी जोड़ें",
|
||||
"ButtonAddChapters": "अध्याय जोड़ें",
|
||||
"ButtonAddDevice": "उपकरण जोड़ें",
|
||||
"ButtonAddLibrary": "संग्रह जोड़ें",
|
||||
"ButtonAddPodcasts": "पॉडकास्ट जोड़ें",
|
||||
"ButtonAddUser": "उपयोगकर्ता जोड़ें",
|
||||
"ButtonAddYourFirstLibrary": "अपनी पहली पुस्तकालय जोड़ें",
|
||||
"ButtonApply": "लागू करें",
|
||||
"ButtonApplyChapters": "अध्यायों में परिवर्तन लागू करें",
|
||||
"ButtonAuthors": "लेखक",
|
||||
"ButtonBack": "पीछे",
|
||||
"ButtonBatchEditPopulateFromExisting": "मौजूदा से आबाद करें",
|
||||
"ButtonBatchEditPopulateMapDetails": "मानचित्र विवरण भरें",
|
||||
"ButtonBrowseForFolder": "फ़ोल्डर खोजें",
|
||||
"ButtonCancel": "रद्द करें",
|
||||
"ButtonCancelEncode": "एनकोड रद्द करें",
|
||||
@@ -15,7 +21,9 @@
|
||||
"ButtonChooseAFolder": "एक फ़ोल्डर चुनें",
|
||||
"ButtonChooseFiles": "फ़ाइलें चुनें",
|
||||
"ButtonClearFilter": "लागू फ़िल्टर साफ़ करें",
|
||||
"ButtonClose": "बंद करें",
|
||||
"ButtonCloseFeed": "फ़ीड बंद करें",
|
||||
"ButtonCloseSession": "वर्तमान सत्र बंद करें",
|
||||
"ButtonCollections": "संग्रह",
|
||||
"ButtonConfigureScanner": "स्कैनर सेटिंग्स बदलें",
|
||||
"ButtonCreate": "बनाएं",
|
||||
@@ -25,6 +33,7 @@
|
||||
"ButtonEdit": "संपादित करें",
|
||||
"ButtonEditChapters": "अध्याय संपादित करें",
|
||||
"ButtonEditPodcast": "पॉडकास्ट संपादित करें",
|
||||
"ButtonEnable": "सक्षम करें",
|
||||
"ButtonForceReScan": "बलपूर्वक पुन: स्कैन करें",
|
||||
"ButtonFullPath": "पूर्ण पथ",
|
||||
"ButtonHide": "छुपाएं",
|
||||
|
||||
+174
-118
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Dodaj",
|
||||
"ButtonAddApiKey": "Dodaj API ključ",
|
||||
"ButtonAddChapters": "Dodaj poglavlja",
|
||||
"ButtonAddDevice": "Dodaj uređaj",
|
||||
"ButtonAddLibrary": "Dodaj knjižnicu",
|
||||
@@ -10,8 +11,8 @@
|
||||
"ButtonApplyChapters": "Primijeni poglavlja",
|
||||
"ButtonAuthors": "Autori",
|
||||
"ButtonBack": "Natrag",
|
||||
"ButtonBatchEditPopulateFromExisting": "Popuni iz postojećeg",
|
||||
"ButtonBatchEditPopulateMapDetails": "Popuni mapirane pojedinosti",
|
||||
"ButtonBatchEditPopulateFromExisting": "Popuni iz postojećih",
|
||||
"ButtonBatchEditPopulateMapDetails": "Popuni detalje karte",
|
||||
"ButtonBrowseForFolder": "Pronađi mapu",
|
||||
"ButtonCancel": "Odustani",
|
||||
"ButtonCancelEncode": "Otkaži kodiranje",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Odaberi mapu",
|
||||
"ButtonChooseFiles": "Odaberi datoteke",
|
||||
"ButtonClearFilter": "Poništi filter",
|
||||
"ButtonClose": "Zatvori",
|
||||
"ButtonCloseFeed": "Zatvori izvor",
|
||||
"ButtonCloseSession": "Zatvori otvorenu sesiju",
|
||||
"ButtonCollections": "Zbirke",
|
||||
@@ -81,7 +83,7 @@
|
||||
"ButtonRemoveAllLibraryItems": "Ukloni sve stavke iz knjižnice",
|
||||
"ButtonRemoveFromContinueListening": "Ukloni iz Nastavi slušati",
|
||||
"ButtonRemoveFromContinueReading": "Ukloni iz Nastavi čitati",
|
||||
"ButtonRemoveSeriesFromContinueSeries": "Ukloni seriju iz Nastavi seriju",
|
||||
"ButtonRemoveSeriesFromContinueSeries": "Ukloni serijal iz popisa „Nastavi serijal”",
|
||||
"ButtonReset": "Poništi",
|
||||
"ButtonResetToDefault": "Vrati na početne postavke",
|
||||
"ButtonRestore": "Vraćanje",
|
||||
@@ -105,32 +107,34 @@
|
||||
"ButtonSubmit": "Pošalji",
|
||||
"ButtonTest": "Test",
|
||||
"ButtonUnlinkOpenId": "Prekini vezu s OpenID-jem",
|
||||
"ButtonUpload": "Učitaj",
|
||||
"ButtonUploadBackup": "Učitaj sigurnosnu kopiju",
|
||||
"ButtonUploadCover": "Učitaj naslovnicu",
|
||||
"ButtonUploadOPMLFile": "Učitaj OPML datoteku",
|
||||
"ButtonUpload": "Prenesi",
|
||||
"ButtonUploadBackup": "Prenesi sigurnosnu kopiju",
|
||||
"ButtonUploadCover": "Prenesi naslovnicu",
|
||||
"ButtonUploadOPMLFile": "Prenesi OPML datoteku",
|
||||
"ButtonUserDelete": "Izbriši korisnika {0}",
|
||||
"ButtonUserEdit": "Uredi korisnika {0}",
|
||||
"ButtonViewAll": "Prikaži sve",
|
||||
"ButtonYes": "Da",
|
||||
"ErrorUploadFetchMetadataAPI": "Pogreška pri dohvatu meta-podataka",
|
||||
"ErrorUploadFetchMetadataNoResults": "Dohvat meta-podataka nije uspio - pokušajte ispraviti naslov i/ili autora",
|
||||
"ErrorUploadLacksTitle": "Naslov je obavezan",
|
||||
"ErrorUploadFetchMetadataAPI": "Pogreška pri dohvaćanju meta-podataka",
|
||||
"ErrorUploadFetchMetadataNoResults": "Nije bilo moguće dohvatiti meta-podatake – pokušajte aktualizirati naslov i/ili autora",
|
||||
"ErrorUploadLacksTitle": "Mora imati naslov",
|
||||
"HeaderAccount": "Korisnički račun",
|
||||
"HeaderAddCustomMetadataProvider": "Dodaj prilagođenog pružatelja meta-podataka",
|
||||
"HeaderAdvanced": "Napredno",
|
||||
"HeaderApiKeys": "API ključevi",
|
||||
"HeaderAppriseNotificationSettings": "Postavke obavijesti Apprise",
|
||||
"HeaderAudioTracks": "Zvučni zapisi",
|
||||
"HeaderAudiobookTools": "Alati za upravljanje datotekama zvučnih knjiga",
|
||||
"HeaderAuthentication": "Provjera autentičnosti",
|
||||
"HeaderBackups": "Sigurnosne kopije",
|
||||
"HeaderBulkChapterModal": "Dodaj više poglavlja",
|
||||
"HeaderChangePassword": "Promjena zaporke",
|
||||
"HeaderChapters": "Poglavlja",
|
||||
"HeaderChooseAFolder": "Odaberi mapu",
|
||||
"HeaderCollection": "Zbirka",
|
||||
"HeaderCollectionItems": "Stavke u zbirci",
|
||||
"HeaderCover": "Naslovnica",
|
||||
"HeaderCurrentDownloads": "Preuzimanja u tijeku",
|
||||
"HeaderCurrentDownloads": "Trenutačna preuzimanja",
|
||||
"HeaderCustomMessageOnLogin": "Prilagođena poruka prilikom prijave",
|
||||
"HeaderCustomMetadataProviders": "Prilagođeni pružatelji meta-podataka",
|
||||
"HeaderDetails": "Pojedinosti",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Redoslijed prihvaćanja meta-podataka",
|
||||
"HeaderMetadataToEmbed": "Meta-podatci za ugradnju",
|
||||
"HeaderNewAccount": "Novi korisnički račun",
|
||||
"HeaderNewApiKey": "Novi API ključ",
|
||||
"HeaderNewLibrary": "Nova knjižnica",
|
||||
"HeaderNotificationCreate": "Izradi obavijest",
|
||||
"HeaderNotificationUpdate": "Ažuriraj obavijest",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Eksperimentalne značajke",
|
||||
"HeaderSettingsGeneral": "Općenito",
|
||||
"HeaderSettingsScanner": "Skener",
|
||||
"HeaderSettingsSecurity": "Sigurnost",
|
||||
"HeaderSettingsWebClient": "Web klijent",
|
||||
"HeaderSleepTimer": "Timer za spavanje",
|
||||
"HeaderStatsLargestItems": "Najveće stavke",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Sadržaj",
|
||||
"HeaderTools": "Alati",
|
||||
"HeaderUpdateAccount": "Ažuriraj korisnički račun",
|
||||
"HeaderUpdateApiKey": "Ažuriraj API ključ",
|
||||
"HeaderUpdateAuthor": "Ažuriraj autora",
|
||||
"HeaderUpdateDetails": "Ažuriraj pojedinosti",
|
||||
"HeaderUpdateLibrary": "Ažuriraj knjižnicu",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Svi korisnici osim gostiju",
|
||||
"LabelAllUsersIncludingGuests": "Svi korisnici uključujući i goste",
|
||||
"LabelAlreadyInYourLibrary": "Već u vašoj knjižnici",
|
||||
"LabelApiKeyCreated": "API ključ \"{0}\" uspješno izrađen.",
|
||||
"LabelApiKeyCreatedDescription": "Ne zaboravite odmah kopirati API ključ jer ga više nećete moći vidjeti.",
|
||||
"LabelApiKeyUser": "Izvršavaj u ime korisnika",
|
||||
"LabelApiKeyUserDescription": "Ovaj API ključ imat će iste dozvole kao i korisnik u čije ime djeluje. U zapisnicima će biti zabilježeno da je korisnik slao zahtjeve.",
|
||||
"LabelApiToken": "API Token",
|
||||
"LabelAppend": "Pridodaj",
|
||||
"LabelAudioBitrate": "Kvaliteta zvučnog zapisa (npr. 128k)",
|
||||
@@ -246,7 +257,7 @@
|
||||
"LabelAuthors": "Autori",
|
||||
"LabelAutoDownloadEpisodes": "Automatski preuzmi nastavke",
|
||||
"LabelAutoFetchMetadata": "Automatski dohvati meta-podatke",
|
||||
"LabelAutoFetchMetadataHelp": "Dohvaća meta-podatke o naslovu, autoru i serijalu kako bi pojednostavnio učitavanje. Dodatni meta-podatci će se možda morati dohvatiti nakon učitavanja.",
|
||||
"LabelAutoFetchMetadataHelp": "Dohvaća meta-podatke o naslovu, autoru i serijalu kako bi pojednostavnio prijenos. Dodatni meta-podatci će se možda morati usporediti nakon prijenosa.",
|
||||
"LabelAutoLaunch": "Automatsko pokretanje",
|
||||
"LabelAutoLaunchDescription": "Automatski preusmjeri na pružatelja autentifikacijskih usluga prilikom otvaranja stranice za prijavu (putanja za ručno zaobilaženje opcije <code>/login?autoLaunch=0</code>)",
|
||||
"LabelAutoRegister": "Automatska registracija",
|
||||
@@ -275,8 +286,8 @@
|
||||
"LabelClickToUseCurrentValue": "Kliknite za trenutnu vrijednost",
|
||||
"LabelClosePlayer": "Zatvori reproduktor",
|
||||
"LabelCodec": "Kodek",
|
||||
"LabelCollapseSeries": "Serijale prikaži sažeto",
|
||||
"LabelCollapseSubSeries": "Podserijale prikaži sažeto",
|
||||
"LabelCollapseSeries": "Sažmi serijal",
|
||||
"LabelCollapseSubSeries": "Sažmi podserijale",
|
||||
"LabelCollection": "Zbirka",
|
||||
"LabelCollections": "Zbirke",
|
||||
"LabelComplete": "Potpuno",
|
||||
@@ -284,6 +295,7 @@
|
||||
"LabelContinueListening": "Nastavi slušati",
|
||||
"LabelContinueReading": "Nastavi čitati",
|
||||
"LabelContinueSeries": "Nastavi serijal",
|
||||
"LabelCorsAllowed": "Dozvoljena CORS ishodišta",
|
||||
"LabelCover": "Naslovnica",
|
||||
"LabelCoverImageURL": "URL naslovnice",
|
||||
"LabelCoverProvider": "Pružatelj naslovnica",
|
||||
@@ -291,15 +303,16 @@
|
||||
"LabelCronExpression": "Cron izraz",
|
||||
"LabelCurrent": "Trenutan",
|
||||
"LabelCurrently": "Trenutno:",
|
||||
"LabelCustomCronExpression": "Prilagođeni CRON izraz:",
|
||||
"LabelCustomCronExpression": "Prilagođeni cron izraz:",
|
||||
"LabelDatetime": "Datum i vrijeme",
|
||||
"LabelDays": "Dani",
|
||||
"LabelDeleteFromFileSystemCheckbox": "Izbriši datoteke (uklonite kvačicu ako stavku želite izbrisati samo iz baze podataka)",
|
||||
"LabelDescription": "Opis",
|
||||
"LabelDeselectAll": "Odznači sve",
|
||||
"LabelDetectedPattern": "Prepoznat obrazac:",
|
||||
"LabelDevice": "Uređaj",
|
||||
"LabelDeviceInfo": "O uređaju",
|
||||
"LabelDeviceIsAvailableTo": "Uređaj je dostupan...",
|
||||
"LabelDeviceIsAvailableTo": "Uređaj je dostupan za...",
|
||||
"LabelDirectory": "Direktorij",
|
||||
"LabelDiscFromFilename": "Disk iz imena datoteke",
|
||||
"LabelDiscFromMetadata": "Disk iz metapodataka",
|
||||
@@ -327,7 +340,7 @@
|
||||
"LabelEncodingBackupLocation": "Sigurnosna kopija vaših izvornih zvučnih datoteka čuvat će se u mapi:",
|
||||
"LabelEncodingChaptersNotEmbedded": "Poglavlja se ne ugrađuju u zvučne knjige koje se sastoje od više zvučnih zapisa.",
|
||||
"LabelEncodingClearItemCache": "Svakako redovito praznite predmemoriju stavki.",
|
||||
"LabelEncodingFinishedM4B": "Stvorene M4B datoteke spremit će se u vašu mapu sa zvučnim knjigama:",
|
||||
"LabelEncodingFinishedM4B": "Gotove M4B datoteke spremit će se u vašu mapu sa zvučnim knjigama:",
|
||||
"LabelEncodingInfoEmbedded": "Meta-podatci će se ugraditi u zvučne zapise u vašoj mapi sa zvučnim knjigama.",
|
||||
"LabelEncodingStartedNavigation": "Nakon pokretanja zadatka možete napustiti ovu stranicu.",
|
||||
"LabelEncodingTimeWarning": "Kodiranje može potrajati do 30 minuta.",
|
||||
@@ -344,9 +357,13 @@
|
||||
"LabelEpisodes": "Nastavci",
|
||||
"LabelEpisodic": "U nastavcima",
|
||||
"LabelExample": "Primjer",
|
||||
"LabelExpandSeries": "Serijal prikaži prošireno",
|
||||
"LabelExpandSubSeries": "Podserijal prikaži prošireno",
|
||||
"LabelExplicit": "Eksplicitni sadržaj",
|
||||
"LabelExpandSeries": "Proširi serijal",
|
||||
"LabelExpandSubSeries": "Proširi podserijal",
|
||||
"LabelExpired": "Istekao",
|
||||
"LabelExpiresAt": "Istječe",
|
||||
"LabelExpiresInSeconds": "Istječe za (sekundi)",
|
||||
"LabelExpiresNever": "Nikada",
|
||||
"LabelExplicit": "Eksplicitno",
|
||||
"LabelExplicitChecked": "Eksplicitni sadržaj (označeno)",
|
||||
"LabelExplicitUnchecked": "Nije eksplicitni sadržaj (odznačeno)",
|
||||
"LabelExportOPML": "Izvoz OPML-a",
|
||||
@@ -357,15 +374,16 @@
|
||||
"LabelFileBornDate": "Stvoreno {0}",
|
||||
"LabelFileModified": "Datoteka izmijenjena",
|
||||
"LabelFileModifiedDate": "Izmijenjeno {0}",
|
||||
"LabelFilename": "Naziv datoteke",
|
||||
"LabelFilename": "Ime datoteke",
|
||||
"LabelFilterByUser": "Filtriraj po korisniku",
|
||||
"LabelFindEpisodes": "Pronađi nastavke",
|
||||
"LabelFinished": "Dovršeno",
|
||||
"LabelFinished": "Završeno",
|
||||
"LabelFinishedDate": "Završeno {0}",
|
||||
"LabelFolder": "Mapa",
|
||||
"LabelFolders": "Mape",
|
||||
"LabelFontBold": "Podebljano",
|
||||
"LabelFontBoldness": "Debljina slova",
|
||||
"LabelFontFamily": "Skupina fontova",
|
||||
"LabelFontFamily": "Skup pisma",
|
||||
"LabelFontItalic": "Kurziv",
|
||||
"LabelFontScale": "Veličina slova",
|
||||
"LabelFontStrikethrough": "Precrtano",
|
||||
@@ -376,7 +394,7 @@
|
||||
"LabelHardDeleteFile": "Izbriši datoteku zauvijek",
|
||||
"LabelHasEbook": "Ima e-knjigu",
|
||||
"LabelHasSupplementaryEbook": "Ima dopunsku e-knjigu",
|
||||
"LabelHideSubtitles": "Skrij podnaslove",
|
||||
"LabelHideSubtitles": "Sakrij podnaslove",
|
||||
"LabelHighestPriority": "Najviši prioritet",
|
||||
"LabelHost": "Poslužitelj",
|
||||
"LabelHour": "Sat",
|
||||
@@ -384,7 +402,7 @@
|
||||
"LabelIcon": "Ikona",
|
||||
"LabelImageURLFromTheWeb": "URL slike s weba",
|
||||
"LabelInProgress": "U tijeku",
|
||||
"LabelIncludeInTracklist": "Uključi u popisu zvučnih zapisa",
|
||||
"LabelIncludeInTracklist": "Uključi u popis zvučnih zapisa",
|
||||
"LabelIncomplete": "Nepotpuno",
|
||||
"LabelInterval": "Interval",
|
||||
"LabelIntervalCustomDailyWeekly": "Prilagođeno dnevno/tjedno",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "Jezici",
|
||||
"LabelLastBookAdded": "Zadnja dodana knjiga",
|
||||
"LabelLastBookUpdated": "Zadnja ažurirana knjiga",
|
||||
"LabelLastProgressDate": "Zadnji napredak: {0}",
|
||||
"LabelLastSeen": "Zadnji puta viđen",
|
||||
"LabelLastTime": "Zadnje doslušano vrijeme",
|
||||
"LabelLastUpdate": "Zadnje ažuriranje",
|
||||
@@ -417,19 +436,23 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Br {0}",
|
||||
"LabelLibraryItem": "Stavka knjižnice",
|
||||
"LabelLibraryName": "Ime knjižnice",
|
||||
"LabelLibrarySortByProgress": "Napredak: Zadnje ažuriranje",
|
||||
"LabelLibrarySortByProgressFinished": "Napredak: Završeno",
|
||||
"LabelLibrarySortByProgressStarted": "Napredak: Započeto",
|
||||
"LabelLimit": "Ograničenje",
|
||||
"LabelLineSpacing": "Razmak između redaka",
|
||||
"LabelListenAgain": "Ponovno poslušaj",
|
||||
"LabelLogLevelDebug": "Debug",
|
||||
"LabelLogLevelInfo": "Info",
|
||||
"LabelLogLevelWarn": "Warn",
|
||||
"LabelLogLevelWarn": "Upozorenje",
|
||||
"LabelLookForNewEpisodesAfterDate": "Traži nove nastavke nakon ovog datuma",
|
||||
"LabelLowestPriority": "Najniži prioritet",
|
||||
"LabelMatchConfidence": "Pouzdanost",
|
||||
"LabelMatchExistingUsersBy": "Prepoznaj postojeće korisnike pomoću",
|
||||
"LabelMatchExistingUsersByDescription": "Rabi se za povezivanje postojećih korisnika. Nakon što se spoje, korisnike se prepoznaje temeljem jedinstvene oznake vašeg pružatelja SSO usluga",
|
||||
"LabelMaxEpisodesToDownload": "Najveći broj nastavaka za preuzimanje. 0 za neograničeno.",
|
||||
"LabelMaxEpisodesToDownloadPerCheck": "Najviše novih nastavaka za preuzimanje po provjeri",
|
||||
"LabelMaxEpisodesToKeep": "Najviše nastavaka za čuvanje",
|
||||
"LabelMaxEpisodesToDownloadPerCheck": "Najveći broj novih nastavaka za preuzimanje po provjeri",
|
||||
"LabelMaxEpisodesToKeep": "Najveći # nastavaka za čuvanje",
|
||||
"LabelMaxEpisodesToKeepHelp": "Ako je vrijednost 0, nema ograničenja broja. Nakon automatskog preuzimanja novog nastavka ova funkcija briše najstariji nastavak ako ih ima više od zadanog broja. Ovo briše samo jedan nastavak po novom preuzetom nastavku.",
|
||||
"LabelMediaPlayer": "Reproduktor medijskih sadržaja",
|
||||
"LabelMediaType": "Vrsta medija",
|
||||
@@ -454,10 +477,12 @@
|
||||
"LabelNewestAuthors": "Najnoviji autori",
|
||||
"LabelNewestEpisodes": "Najnoviji nastavci",
|
||||
"LabelNextBackupDate": "Sljedeća izrada sigurnosne kopije",
|
||||
"LabelNextChapters": "Sljedeća poglavlja bit će:",
|
||||
"LabelNextScheduledRun": "Sljedeće zakazano izvođenje",
|
||||
"LabelNoApiKeys": "Nema API ključeva",
|
||||
"LabelNoCustomMetadataProviders": "Nema prilagođenih pružatelja meta-podataka",
|
||||
"LabelNoEpisodesSelected": "Nema odabranih nastavaka",
|
||||
"LabelNotFinished": "Nije dovršeno",
|
||||
"LabelNotFinished": "Nezavršeno",
|
||||
"LabelNotStarted": "Nije započeto",
|
||||
"LabelNotes": "Bilješke",
|
||||
"LabelNotificationAppriseURL": "Apprise URL(ovi)",
|
||||
@@ -470,10 +495,11 @@
|
||||
"LabelNotificationsMaxQueueSize": "Najveći broj događaja za obavijest u redu čekanja",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Događaji se mogu okinuti samo jednom u sekundi. Događaji će se zanemariti ako je red čekanja pun. Ovo sprečava prekomjerno slanje obavijesti.",
|
||||
"LabelNumberOfBooks": "Broj knjiga",
|
||||
"LabelNumberOfChapters": "Broj poglavljâ:",
|
||||
"LabelNumberOfEpisodes": "broj nastavaka",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Naziv OpenID zahtjeva koji sadrži napredna dopuštenja za korisničke radnje u aplikaciji koje će se primijeniti na ne-administratorske uloge (<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": "Ime 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 će se odbiti. Ako 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'.",
|
||||
"LabelOpenIDGroupClaimDescription": "Naziv OpenID zahtjeva koji sadrži popis korisnikovih grupa. Često se naziva <code>groups</code>. <b>Ako se konfigurira</b>, aplikacija će automatski dodijeliti uloge temeljem korisnikovih članstava u grupama, pod uvjetom da se iste zovu 'admin', 'user' ili 'guest' u zahtjevu (ne razlikuju se velika i mala slova). Zahtjev treba sadržavati popis i ako je korisnik član više grupa, aplikacija će dodijeliti ulogu koja odgovara najvišoj razini pristupa. Ukoliko se niti jedna grupa ne podudara, pristup će biti onemogućen.",
|
||||
"LabelOpenIDGroupClaimDescription": "Ime OpenID zahtjeva koji sadrži popis grupa korisnika. Često se zove <code>groups</code>. <b>Ako se konfigurira</b>, aplikacija će automatski dodijeliti uloge temeljem korisničkih članstava u grupama, pod uvjetom da se iste zovu 'admin', 'user' ili 'guest' u zahtjevu (ne razlikuju se velika i mala slova). Zahtjev treba sadržavati popis i ako je korisnik član više grupa, aplikacija će dodijeliti ulogu koja odgovara najvišoj razini pristupa. Ukoliko se niti jedna grupa ne podudara, pristup će se odbiti.",
|
||||
"LabelOpenRSSFeed": "Otvori RSS Feed",
|
||||
"LabelOverwrite": "Prepiši",
|
||||
"LabelPaginationPageXOfY": "Stranica {0} od {1}",
|
||||
@@ -487,7 +513,7 @@
|
||||
"LabelPermissionsDelete": "Smije brisati",
|
||||
"LabelPermissionsDownload": "Smije preuzimati",
|
||||
"LabelPermissionsUpdate": "Smije ažurirati",
|
||||
"LabelPermissionsUpload": "Smije učitavati",
|
||||
"LabelPermissionsUpload": "Smije prenositi",
|
||||
"LabelPersonalYearReview": "Vaš godišnji pregled ({0})",
|
||||
"LabelPhotoPathURL": "Putanja ili URL fotografije",
|
||||
"LabelPlayMethod": "Način reprodukcije",
|
||||
@@ -519,11 +545,11 @@
|
||||
"LabelRSSFeedSlug": "Slug RSS izvora",
|
||||
"LabelRSSFeedURL": "URL RSS izvora",
|
||||
"LabelRandomly": "Nasumično",
|
||||
"LabelReAddSeriesToContinueListening": "Ponovno dodaj serijal u Nastavi slušati",
|
||||
"LabelReAddSeriesToContinueListening": "Ponovo dodaj serijal u „Nastavi slušati”",
|
||||
"LabelRead": "Čitaj",
|
||||
"LabelReadAgain": "Ponovno čitaj",
|
||||
"LabelReadEbookWithoutProgress": "Čitaj e-knjige bez praćenja napretka",
|
||||
"LabelRecentSeries": "Najnoviji serijali",
|
||||
"LabelRecentSeries": "Nedavni serijali",
|
||||
"LabelRecentlyAdded": "Nedavno dodano",
|
||||
"LabelRecommended": "Preporučeno",
|
||||
"LabelRedo": "Ponovi",
|
||||
@@ -544,8 +570,9 @@
|
||||
"LabelSelectAll": "Označi sve",
|
||||
"LabelSelectAllEpisodes": "Označi sve nastavke",
|
||||
"LabelSelectEpisodesShowing": "Prikazujem {0} odabranih nastavaka",
|
||||
"LabelSelectUser": "Odaberite korisnika",
|
||||
"LabelSelectUsers": "Označi korisnike",
|
||||
"LabelSendEbookToDevice": "Pošalji e-knjigu …",
|
||||
"LabelSendEbookToDevice": "Pošalji e-knjigu na…",
|
||||
"LabelSequence": "Slijed",
|
||||
"LabelSerial": "Serijal",
|
||||
"LabelSeries": "Serijal",
|
||||
@@ -561,36 +588,36 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Skeumorfni dizajn sa drvenim policama",
|
||||
"LabelSettingsChromecastSupport": "Podrška za Chromecast",
|
||||
"LabelSettingsDateFormat": "Format datuma",
|
||||
"LabelSettingsEnableWatcher": "Automatski pretražuj ima li promjena u knjižnicama",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automatski traži promjene u knjižnicama",
|
||||
"LabelSettingsEnableWatcher": "Automatski prati promjene u knjižnicama",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Automatski prati promjene u knjižnici",
|
||||
"LabelSettingsEnableWatcherHelp": "Omogućuje automatsko dodavanje/ažuriranje stavki kada se uoče izmjene datoteka. *Potrebno je ponovno pokretanje poslužitelja",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Omogući skripte u epub datotekama",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Omogućuje epub datotekama izvođenje skripti. Preporučamo isključiti ovu mogućnost ukoliko nemate povjerenja u izvore epub datoteka.",
|
||||
"LabelSettingsExperimentalFeatures": "Eksperimentalne značajke",
|
||||
"LabelSettingsExperimentalFeaturesHelp": "Značajke u razvoju za koje trebamo vaše povratne informacije i pomoć u testiranju. Kliknite za otvaranje rasprave na githubu.",
|
||||
"LabelSettingsExperimentalFeatures": "Eksperimentalne funkcije",
|
||||
"LabelSettingsExperimentalFeaturesHelp": "Funkcije u razvoju za koje trebamo vaše povratne informacije i pomoć u testiranju. Kliknite za otvaranje rasprave na githubu.",
|
||||
"LabelSettingsFindCovers": "Pronađi naslovnice",
|
||||
"LabelSettingsFindCoversHelp": "Ako vaša zvučna knjiga nema ugrađenu naslovnicu ili sliku naslovnice u mapi, skener će pokušati pronaći naslovnicu.<br>Napomena: ovo će produžiti trajanje skeniranja",
|
||||
"LabelSettingsHideSingleBookSeries": "Skrij serijale sa samo jednom knjigom",
|
||||
"LabelSettingsHideSingleBookSeries": "Sakrij serijale sa samo jednom knjigom",
|
||||
"LabelSettingsHideSingleBookSeriesHelp": "Serijali koji se sastoje od samo jedne knjige neće se prikazivati na stranici serijala i na policama početne stranice.",
|
||||
"LabelSettingsHomePageBookshelfView": "Prikaži početnu stranicu kao policu s knjigama",
|
||||
"LabelSettingsLibraryBookshelfView": "Prikaži knjižnicu kao policu s knjigama",
|
||||
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Postotak dovršenosti veći od",
|
||||
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Preostalo vrijeme je manje od (sekundi)",
|
||||
"LabelSettingsLibraryMarkAsFinishedWhen": "Označi medij dovršenim kada",
|
||||
"LabelSettingsLibraryMarkAsFinishedPercentComplete": "Postotak završenosti je veći od",
|
||||
"LabelSettingsLibraryMarkAsFinishedTimeRemaining": "Preostalo vrijeme je manje od (sekunde)",
|
||||
"LabelSettingsLibraryMarkAsFinishedWhen": "Označi medij kao završen kada",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Preskoči ranije knjige u funkciji Nastavi serijal",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Na polici početne stranice Nastavi serijal prikazuje se prva nezapočeta knjiga serijala koji imaju barem jednu dovršenu knjigu i nijednu započetu knjigu. Ako se ova opcija uključi serijal će nastaviti od zadnje dovršene knjige umjesto od prve nezapočete knjige.",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "Na polici početne stranice Nastavi serijal prikazuje se prva nezapočeta knjiga serijala koji imaju barem jednu završenu knjigu i nijednu započetu knjigu. Ako se ova opcija uključi serijal će nastaviti od zadnje završene knjige umjesto od prve nezapočete knjige.",
|
||||
"LabelSettingsParseSubtitles": "Raščlani podnaslove",
|
||||
"LabelSettingsParseSubtitlesHelp": "Iz naziva mape zvučne knjige raščlanjuje podnaslov.<br>Podnaslov mora biti odvojen s \" - \"<br>npr. \"Naslov knjige - Ovo je podnaslov\" imat će podnaslov \"Ovo je podnaslov\"",
|
||||
"LabelSettingsParseSubtitlesHelp": "Raščlani podnaslove iz imena mape zvučne knjige.<br>Podnaslov mora biti odvojen sa \" - \"<br>npr. \"Naslov knjige - Ovo je podnaslov\" imat će podnaslov \"Ovo je podnaslov\"",
|
||||
"LabelSettingsPreferMatchedMetadata": "Daj prednost meta-podatcima prepoznatih stavki",
|
||||
"LabelSettingsPreferMatchedMetadataHelp": "Podatci prepoznatog naslova nadjačat će postojeće informacije kod korištenja funkcije Brzog prepoznavanja. Zadana funkcionalnost je da Brzo prepoznavanje samo dopuni podatke koji nedostaju.",
|
||||
"LabelSettingsPreferMatchedMetadataHelp": "Podatci prepoznatog naslova će nadjačati postojeće informacije pri korištenju funkcije „Brzo prepoznavanje”. Zadana funkcionalnost je da „Brzo prepoznavanje” samo doda nedostajuće podatke.",
|
||||
"LabelSettingsSkipMatchingBooksWithASIN": "Preskoči prepoznavanje knjiga koje već imaju ASIN",
|
||||
"LabelSettingsSkipMatchingBooksWithISBN": "Preskoči prepoznavanje knjiga koje već imaju ISBN",
|
||||
"LabelSettingsSortingIgnorePrefixes": "Zanemari prefikse kod sortiranja",
|
||||
"LabelSettingsSortingIgnorePrefixesHelp": "npr. za prefiks \"the\" naslov knjige \"The Book Title\" sortirat će se \"Book Title, The\"",
|
||||
"LabelSettingsSquareBookCovers": "Koristi pravokutne naslovnice knjiga",
|
||||
"LabelSettingsSquareBookCoversHelp": "Koristi pravokutne naslovnice umjesto uobičajenih naslovnica omjera 1,6:1",
|
||||
"LabelSettingsStoreCoversWithItem": "Spremi naslovnice uz stavke",
|
||||
"LabelSettingsStoreCoversWithItemHelp": "Naslovnice se obično spremaju u /metadata/items, ako uključite ovu opciju naslovnice će se spremati u mapu knjižničke stavke. Čuva se samo jedna datoteka naziva \"cover\"",
|
||||
"LabelSettingsStoreCoversWithItem": "Spremi naslovnice sa stavkom",
|
||||
"LabelSettingsStoreCoversWithItemHelp": "Naslovnice se obično spremaju u /metadata/items. Uključivanjem ove opcije naslovnice će se spremati u mapu stavki vaše knjižnice. Čuva se samo jedna datoteka s imenom \"cover\"",
|
||||
"LabelSettingsStoreMetadataWithItem": "Spremi metapodatke uz stavku",
|
||||
"LabelSettingsStoreMetadataWithItemHelp": "Meta-podatci se obično spremaju u /metadata/items; ako uključite ovu postavku meta-podatci će se čuvati u mapama knjižničkih stavki",
|
||||
"LabelSettingsTimeFormat": "Format vremena",
|
||||
@@ -611,6 +638,7 @@
|
||||
"LabelStartTime": "Vrijeme početka",
|
||||
"LabelStarted": "Započeto",
|
||||
"LabelStartedAt": "Započeto",
|
||||
"LabelStartedDate": "Započeto {0}",
|
||||
"LabelStatsAudioTracks": "Zvučni zapisi",
|
||||
"LabelStatsAuthors": "Autori",
|
||||
"LabelStatsBestDay": "Najbolji dan",
|
||||
@@ -619,7 +647,7 @@
|
||||
"LabelStatsDaysListened": "Dana slušano",
|
||||
"LabelStatsHours": "Sati",
|
||||
"LabelStatsInARow": "uzastopno",
|
||||
"LabelStatsItemsFinished": "Dovršenih stavki",
|
||||
"LabelStatsItemsFinished": "Završene stavke",
|
||||
"LabelStatsItemsInLibrary": "Stavke u knjižnici",
|
||||
"LabelStatsMinutes": "minute",
|
||||
"LabelStatsMinutesListening": "Minuta odslušano",
|
||||
@@ -640,6 +668,7 @@
|
||||
"LabelTheme": "Tema",
|
||||
"LabelThemeDark": "Tamna",
|
||||
"LabelThemeLight": "Svijetla",
|
||||
"LabelThemeSepia": "Sepija",
|
||||
"LabelTimeBase": "Baza vremena",
|
||||
"LabelTimeDurationXHours": "{0} sati",
|
||||
"LabelTimeDurationXMinutes": "{0} minuta",
|
||||
@@ -677,12 +706,12 @@
|
||||
"LabelUpdateDetails": "Ažuriraj pojedinosti",
|
||||
"LabelUpdateDetailsHelp": "Dopusti prepisivanje postojećih podataka za odabrane knjige kada se prepoznaju",
|
||||
"LabelUpdatedAt": "Ažurirano",
|
||||
"LabelUploaderDragAndDrop": "Pritisni i prevuci datoteke ili mape",
|
||||
"LabelUploaderDragAndDropFilesOnly": "Pritisni i prevuci datoteke",
|
||||
"LabelUploaderDragAndDrop": "Povuci i ispusti datoteke ili mape",
|
||||
"LabelUploaderDragAndDropFilesOnly": "Povuci i ispusti datoteke",
|
||||
"LabelUploaderDropFiles": "Ispusti datoteke",
|
||||
"LabelUploaderItemFetchMetadataHelp": "Automatski dohvati naslov, autora i serijal",
|
||||
"LabelUseAdvancedOptions": "Koristi se naprednim opcijama",
|
||||
"LabelUseChapterTrack": "Upravljaj trakom poglavlja",
|
||||
"LabelUseAdvancedOptions": "Koristi napredne opcije",
|
||||
"LabelUseChapterTrack": "Koristi zvučni zapis poglavlja",
|
||||
"LabelUseFullTrack": "Koristi cijeli zvučni zapis",
|
||||
"LabelUseZeroForUnlimited": "0 za neograničeno",
|
||||
"LabelUser": "Korisnik",
|
||||
@@ -706,10 +735,12 @@
|
||||
"LabelYourPlaylists": "Vaši popisi za izvođenje",
|
||||
"LabelYourProgress": "Vaš napredak",
|
||||
"MessageAddToPlayerQueue": "Dodaj u redoslijed izvođenja",
|
||||
"MessageAppriseDescription": "Da biste se koristili ovom značajkom, treba vam instanca <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API-ja</a> ili API koji može rukovati istom vrstom zahtjeva.<br />The Adresa Apprise API-ja treba biti puna URL putanja za slanje obavijesti, npr. ako vam se API instanca poslužuje na adresi <code>http://192.168.1.1:8337</code> trebate upisati <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAppriseDescription": "Za korištnje ove funkcije, treba vam instanca <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API-ja</a> ili API koji može rukovati istom vrstom zahtjeva.<br />URL Apprise API-ja mora biti potpuna URL putanja za slanje obavijesti, npr. ako vam se API instanca poslužuje na adresi <code>http://192.168.1.1:8337</code> morate upisati <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Upišite ASIN iz odgovarajuće Audibleove regije, ne s Amazonov.",
|
||||
"MessageAuthenticationLegacyTokenWarning": "Starije API tokene ćemo ukloniti. Umjesto njih, koristite se <a href=\"/config/api-keys\">API ključevima</a> .",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Ponovno pokrenite poslužitelj da biste primijenili OIDC promjene.",
|
||||
"MessageBackupsDescription": "Sigurnosne kopije sadrže korisnike, korisnikov napredak medija, pojedinosti knjižničke građe, postavke poslužitelja i slike koje se spremaju u <code>/metadata/items</code> & <code>/metadata/authors</code>. Sigurnosne kopije ne sadrže niti jednu datoteku iz mapa knjižnice.",
|
||||
"MessageAuthenticationSecurityMessage": "Provjera autentičnosti poboljšana je radi sigurnosti. Svi se korisnici moraju ponovno prijaviti.",
|
||||
"MessageBackupsDescription": "Sigurnosne kopije sadrže korisnike, napredak korisnika, pojedinosti knjižničke građe, postavke poslužitelja i slike koje se spremaju u <code>/metadata/items</code> i <code>/metadata/authors</code>. Sigurnosne kopije ne sadrže niti jednu datoteku iz mapa knjižnice.",
|
||||
"MessageBackupsLocationEditNote": "Napomena: Uređivanje lokacije za sigurnosne kopije ne premješta ili mijenja postojeće sigurnosne kopije",
|
||||
"MessageBackupsLocationNoEditNote": "Napomena: Lokacija za sigurnosne kopije zadana je kroz varijablu okoline i ovdje se ne može izmijeniti.",
|
||||
"MessageBackupsLocationPathEmpty": "Putanja do lokacije za sigurnosne kopije ne može ostati prazna",
|
||||
@@ -722,14 +753,16 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Nema rezultata za filter \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Vaš upit nema rezultata",
|
||||
"MessageBookshelfNoSeries": "Nemate niti jedan serijal",
|
||||
"MessageBulkChapterPattern": "Koliko poglavlja želite dodati s ovim obrascem numeracije?",
|
||||
"MessageChapterEndIsAfter": "Kraj poglavlja je nakon kraja zvučne knjige",
|
||||
"MessageChapterErrorFirstNotZero": "Prvo poglavlje mora započeti u 0",
|
||||
"MessageChapterErrorStartGteDuration": "Netočno vrijeme početka, mora biti manje od trajanja zvučne knjige",
|
||||
"MessageChapterErrorStartLtPrev": "Netočno vrijeme početka, mora biti veće ili jednako vremenu početka prethodnog poglavlja",
|
||||
"MessageChapterStartIsAfter": "Početak poglavlja je nakon kraja zvučne knjige",
|
||||
"MessageChaptersNotFound": "Poglavlja nisu pronađena",
|
||||
"MessageCheckingCron": "Provjeravam cron...",
|
||||
"MessageCheckingCron": "Provjeravanje cron izraza...",
|
||||
"MessageConfirmCloseFeed": "Sigurno želite zatvoriti ovaj izvor?",
|
||||
"MessageConfirmDeleteApiKey": "Sigurno želite izbrisati API ključ \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Sigurno želite izbrisati sigurnosnu kopiju za {0}?",
|
||||
"MessageConfirmDeleteDevice": "Sigurno želite izbrisati e-čitač \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Ovo će izbrisati datoteke s datotečnog sustava. Jeste li sigurni?",
|
||||
@@ -741,12 +774,12 @@
|
||||
"MessageConfirmDeleteSession": "Sigurno želite izbrisati ovu sesiju?",
|
||||
"MessageConfirmEmbedMetadataInAudioFiles": "Sigurno želite ugraditi meta-podatke u {0} zvučnih datoteka?",
|
||||
"MessageConfirmForceReScan": "Sigurno želite ponovno pokrenuti skeniranje?",
|
||||
"MessageConfirmMarkAllEpisodesFinished": "Sigurno želite označiti sve nastavke dovršenima?",
|
||||
"MessageConfirmMarkAllEpisodesNotFinished": "Sigurno želite označiti sve nastavke nedovršenima?",
|
||||
"MessageConfirmMarkItemFinished": "Sigurno želite označiti \"{0}\" dovršenim?",
|
||||
"MessageConfirmMarkItemNotFinished": "Sigurno želite označiti \"{0}\" nedovršenim?",
|
||||
"MessageConfirmMarkSeriesFinished": "Sigurno želite označiti sve knjige u ovom serijalu dovršenima?",
|
||||
"MessageConfirmMarkSeriesNotFinished": "Sigurno želite označiti sve knjige u ovom serijalu nedovršenima?",
|
||||
"MessageConfirmMarkAllEpisodesFinished": "Sigurno želite označiti sve nastavke kao završene?",
|
||||
"MessageConfirmMarkAllEpisodesNotFinished": "Sigurno želite označiti sve nastavke kao nezavršene?",
|
||||
"MessageConfirmMarkItemFinished": "Sigurno želite označiti stavku \"{0}\" kao završenu?",
|
||||
"MessageConfirmMarkItemNotFinished": "Sigurno želite označiti stavku \"{0}\" kao nezavršenu?",
|
||||
"MessageConfirmMarkSeriesFinished": "Sigurno želite označiti sve knjige u ovom serijalu kao završene?",
|
||||
"MessageConfirmMarkSeriesNotFinished": "Sigurno želite označiti sve knjige u ovom serijalu kao nezavršene?",
|
||||
"MessageConfirmNotificationTestTrigger": "Želite li okinuti ovu obavijest s probnim podatcima?",
|
||||
"MessageConfirmPurgeCache": "Brisanje predmemorije izbrisat će cijelu mapu <code>/metadata/cache</code>. <br /><br />Sigurno želite izbrisati mapu predmemorije?",
|
||||
"MessageConfirmPurgeItemsCache": "Brisanje predmemorije stavki izbrisat će cijelu mapu <code>/metadata/cache/items</code>.<br />Jeste li sigurni?",
|
||||
@@ -757,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Sigurno želite ukloniti autora \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Sigurno želite obrisati kolekciju \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Sigurno želite ukloniti nastavak \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Napomena: Ova funkcija neće izbrisati zvučnu datoteku ukoliko ne uključite opciju \"Izbriši datoteku zauvijek\"",
|
||||
"MessageConfirmRemoveEpisodes": "Sigurno želite ukloniti {0} nastavaka?",
|
||||
"MessageConfirmRemoveListeningSessions": "Sigurno želite ukloniti {0} sesija slušanja?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Sigurno želite ukloniti sve datoteke metadata.{0} u mapama vaših knjižničkih stavki?",
|
||||
@@ -773,42 +807,44 @@
|
||||
"MessageConfirmUnlinkOpenId": "Sigurno želite odspojiti ovog korisnika s OpenID-ja?",
|
||||
"MessageDaysListenedInTheLastYear": "{0} dana slušanja u posljednjih godinu dana",
|
||||
"MessageDownloadingEpisode": "Preuzimam nastavak",
|
||||
"MessageDragFilesIntoTrackOrder": "Prevlačenjem datoteka složite pravilan redoslijed",
|
||||
"MessageDragFilesIntoTrackOrder": "Povlači datoteke u ispravan redoslijed",
|
||||
"MessageEmbedFailed": "Ugrađivanje nije uspjelo!",
|
||||
"MessageEmbedFinished": "Ugrađivanje je dovršeno!",
|
||||
"MessageEmbedFinished": "Ugrađivanje je završeno!",
|
||||
"MessageEmbedQueue": "Ugrađivanje meta-podataka dodano u red obrade ({0} u redu)",
|
||||
"MessageEpisodesQueuedForDownload": "{0} nastavak(a) u redu za preuzimanje",
|
||||
"MessageEreaderDevices": "Da biste osigurali isporuku e-knjiga, možda ćete morati gornju adresu e-pošte dodati kao dopuštenog pošiljatelja za svaki od donjih uređaja.",
|
||||
"MessageFeedURLWillBe": "URL izvora bit će {0}",
|
||||
"MessageFetching": "Dohvaćam...",
|
||||
"MessageFetching": "Dohvaćanje...",
|
||||
"MessageForceReScanDescription": "će ponovno skenirati sve datoteke kao nove datoteke. ID3 tagovi zvučnih datoteka, OPF datoteke i tekstualne datoteke skenirat će se kao da su nove.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} sluša</strong> na {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Nema sesija slušanja na {0}",
|
||||
"MessageImportantNotice": "Važna obavijest!",
|
||||
"MessageInsertChapterBelow": "Unesi poglavlje ispod",
|
||||
"MessageInvalidAsin": "Nevažeći ASIN",
|
||||
"MessageItemsSelected": "{0} odabranih stavki",
|
||||
"MessageItemsUpdated": "{0} stavki ažurirano",
|
||||
"MessageJoinUsOn": "Pridruži nam se na",
|
||||
"MessageLoading": "Učitavam...",
|
||||
"MessageLoadingFolders": "Učitavam mape...",
|
||||
"MessageLoading": "Učitavanje...",
|
||||
"MessageLoadingFolders": "Učitavanje mape...",
|
||||
"MessageLogsDescription": "Zapisnici se čuvaju u <code>/metadata/logs</code> u obliku JSON datoteka. Zapisnici pada sustava čuvaju se u datoteci <code>/metadata/logs/crash_logs.txt</code>.",
|
||||
"MessageM4BFailed": "M4B neuspješan!",
|
||||
"MessageM4BFinished": "M4B završio!",
|
||||
"MessageMapChapterTitles": "Mapiraj nazive poglavlja postojećim poglavljima zvučne knjige bez uređivanja vremenskih identifikatora",
|
||||
"MessageMarkAllEpisodesFinished": "Označi sve nastavke dovršenima",
|
||||
"MessageMarkAllEpisodesNotFinished": "Označi sve nastavke nedovršenima",
|
||||
"MessageMarkAsFinished": "Označi kao dovršeno",
|
||||
"MessageMarkAsNotFinished": "Označi kao nedovršeno",
|
||||
"MessageMatchBooksDescription": "će pokušati prepoznati knjige iz knjižnice u katalogu odabranog pružatelja podatka te nadopuniti podatke koji nedostaju i naslovnice. Ne prepisuje preko postojećih podataka.",
|
||||
"MessageM4BFailed": "M4B datoteka neuspjela!",
|
||||
"MessageM4BFinished": "M4B datoteka je završena!",
|
||||
"MessageMapChapterTitles": "Mapiraj imana poglavlja s vašim postojećim poglavljima zvučne knjige bez podešavanja vremenskih identifikatora",
|
||||
"MessageMarkAllEpisodesFinished": "Označi sve nastavke kao završene",
|
||||
"MessageMarkAllEpisodesNotFinished": "Označi sve nastavke kao nezavršene",
|
||||
"MessageMarkAsFinished": "Označi kao završeno",
|
||||
"MessageMarkAsNotFinished": "Označi kao nezavršeno",
|
||||
"MessageMatchBooksDescription": "će pokušati prepoznati knjige iz knjižnice u katalogu odabranog pružatelja podatka te nadopuniti podatke koji nedostaju i naslovnice. Ne prepisuje postojeće podatke.",
|
||||
"MessageNoAudioTracks": "Nema zvučnih zapisa",
|
||||
"MessageNoAuthors": "Nema autora",
|
||||
"MessageNoBackups": "Nema sigurnosnih kopija",
|
||||
"MessageNoBookmarks": "Nema knjižnih oznaka",
|
||||
"MessageNoChapters": "Nema poglavlja",
|
||||
"MessageNoCollections": "Nema zbirki",
|
||||
"MessageNoCoversFound": "Naslovnice nisu pronađene",
|
||||
"MessageNoCoversFound": "Nije pronađena nijedna naslovnica",
|
||||
"MessageNoDescription": "Nema opisa",
|
||||
"MessageNoDevices": "Nema uređaja",
|
||||
"MessageNoDownloadsInProgress": "Nema preuzimanja u tijeku",
|
||||
"MessageNoDownloadsInProgress": "Trenutačno nema preuzimanja u tijeku",
|
||||
"MessageNoDownloadsQueued": "Nema preuzimanja u redu",
|
||||
"MessageNoEpisodeMatchesFound": "Nije pronađen ni jedan odgovarajući nastavak",
|
||||
"MessageNoEpisodes": "Nema nastavaka",
|
||||
@@ -837,28 +873,28 @@
|
||||
"MessagePauseChapter": "Pauziraj reprodukciju poglavlja",
|
||||
"MessagePlayChapter": "Slušaj početak poglavlja",
|
||||
"MessagePlaylistCreateFromCollection": "Stvori popis za izvođenje od zbirke",
|
||||
"MessagePleaseWait": "Molimo pričekajte...",
|
||||
"MessagePleaseWait": "Pričekajte...",
|
||||
"MessagePodcastHasNoRSSFeedForMatching": "Podcast nema adresu RSS izvora za prepoznavanje",
|
||||
"MessagePodcastSearchField": "Upišite izraz za pretraživanje ili URL RSS izvora",
|
||||
"MessageQuickEmbedInProgress": "Brzo ugrađivanje u tijeku",
|
||||
"MessageQuickEmbedQueue": "Dodano u red za brzo ugrađivanje ({0} u redu izvođenja)",
|
||||
"MessageQuickMatchAllEpisodes": "Brzo prepoznavanje svih nastavaka",
|
||||
"MessageQuickMatchDescription": "Popuni pojedinosti i naslovnice koji nedostaju prvim pronađenim rezultatom za '{0}'. Ne prepisuje podatke osim ako ne uključite mogućnost 'Daj prednost meta-podatcima prepoznatih stavki'.",
|
||||
"MessageQuickMatchDescription": "Popuni pojedinosti i naslovnice koji nedostaju prvim pronađenim rezultatom za '{0}'. Ne prepisuje podatke osim ako je postavka poslužitelja „Daj prednost meta-podatcima prepoznatih stavki” uključena.",
|
||||
"MessageRemoveChapter": "Ukloni poglavlje",
|
||||
"MessageRemoveEpisodes": "Ukloni {0} nastavaka",
|
||||
"MessageRemoveFromPlayerQueue": "Ukloni iz redoslijeda izvođenja",
|
||||
"MessageRemoveUserWarning": "Sigurno želite trajno izbrisati korisnika \"{0}\"?",
|
||||
"MessageReportBugsAndContribute": "Prijavite pogreške, zatražite funkcionalnosti i doprinesite na",
|
||||
"MessageReportBugsAndContribute": "Prijavite pogreške, zatražite funkcije i doprinesite na",
|
||||
"MessageResetChaptersConfirm": "Sigurno želite vratiti poglavlja na prethodno stanje i poništiti učinjene promjene?",
|
||||
"MessageRestoreBackupConfirm": "Sigurno želite vratiti sigurnosnu kopiju izrađenu",
|
||||
"MessageRestoreBackupWarning": "Vraćanjem sigurnosne kopije prepisat ćete cijelu bazu podataka koja se nalazi u /config i slike naslovnice u /metadata/items i /metadata/authors.<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.",
|
||||
"MessageScheduleLibraryScanNote": "Za većinu korisnika se preporučuje ostaviti ovu funkciju deaktiviranom i ostaviti postavku promatrača mape aktiviranom. Promatrač mapa će automatski otkriti promjene u mapama vaše knjižnice. Promatrač mapa ne radi na svakom datotečnom sustavu (kao što je NFS) pa se umjesto njega mogu koristiti planirana pretraživanja knjižnice.",
|
||||
"MessageScheduleLibraryScanNote": "Za većinu korisnika se preporučuje ostaviti ovu funkciju deaktiviranom kao i fukciju „Automatski prati promjene u knjižnici” koja automatski otkriva promjene u mapama vaše knjižnice. Fukcija „Automatski prati promjene u knjižnici” ne radi na svakom datotečnom sustavu (kao što je NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Pokreni svaki {0} u {1}",
|
||||
"MessageSearchResultsFor": "Rezultati pretrage za",
|
||||
"MessageSelected": "{0} odabrano",
|
||||
"MessageSeriesSequenceCannotContainSpaces": "Slijed serijala ne može sadržavati praznine",
|
||||
"MessageServerCouldNotBeReached": "Nije moguće pristupiti poslužitelju",
|
||||
"MessageSetChaptersFromTracksDescription": "Postavi poglavlja koristeći se zvučnom datotekom kao poglavljem i nazivom datoteke kao naslovom poglavlja",
|
||||
"MessageServerCouldNotBeReached": "Nije bilo moguće pristupiti poslužitelju",
|
||||
"MessageSetChaptersFromTracksDescription": "Postavi poglavlja koristeći svaku zvučnu datoteku kao poglavlje, a naslov poglavlja kao ime datoteke",
|
||||
"MessageShareExpirationWillBe": "Vrijeme isteka će biti <strong>{0}</strong>",
|
||||
"MessageShareExpiresIn": "Istječe za {0}",
|
||||
"MessageShareURLWillBe": "URL za dijeljenje bit će <strong>{0}</strong>",
|
||||
@@ -887,7 +923,7 @@
|
||||
"MessageTaskOpmlImportFeedPodcastDescription": "Stvaranje podcasta \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedPodcastExists": "Podcast već postoji u putanji",
|
||||
"MessageTaskOpmlImportFeedPodcastFailed": "Stvaranje podcasta nije uspjelo",
|
||||
"MessageTaskOpmlImportFinished": "Dodano {0} podcasta",
|
||||
"MessageTaskOpmlImportFinished": "Broj dodanih podcasta: {0}",
|
||||
"MessageTaskOpmlParseFailed": "Raščlanjivanje OPML datoteke nije uspjelo",
|
||||
"MessageTaskOpmlParseFastFail": "Neispravna OPML datoteka, oznaka <opml> nije pronađena ILI oznaka <outline> nije pronađena",
|
||||
"MessageTaskOpmlParseNoneFound": "U OPML datoteci nisu pronađeni izvori",
|
||||
@@ -898,10 +934,10 @@
|
||||
"MessageTaskScanningFileChanges": "Skeniranje izmijenjenih datoteka u \"{0}\"",
|
||||
"MessageTaskScanningLibrary": "Skeniranje knjižnice \"{0}\"",
|
||||
"MessageTaskTargetDirectoryNotWritable": "U odredišnu mapu nije moguće pisati",
|
||||
"MessageThinking": "Razmišljam...",
|
||||
"MessageUploaderItemFailed": "Učitavanje nije uspjelo",
|
||||
"MessageUploaderItemSuccess": "Uspješno učitano!",
|
||||
"MessageUploading": "Učitavam...",
|
||||
"MessageThinking": "Razmišljanje...",
|
||||
"MessageUploaderItemFailed": "Prijenos nije uspio",
|
||||
"MessageUploaderItemSuccess": "Uspješno preneseno!",
|
||||
"MessageUploading": "Prijenos...",
|
||||
"MessageValidCronExpression": "Ispravan cron izraz",
|
||||
"MessageWatcherIsDisabledGlobally": "Praćenje datotečnog sustava globalno je isključen u postavkama poslužitelja",
|
||||
"MessageXLibraryIsEmpty": "{0} Knjižnica je prazna!",
|
||||
@@ -913,24 +949,25 @@
|
||||
"NoteRSSFeedPodcastAppsHttps": "Pripazite: Većina aplikacija za podcaste iziskuje URL RSS izvora koji se koristi HTTPS protokolom",
|
||||
"NoteRSSFeedPodcastAppsPubDate": "Upozorenje: jedan ili više vaših nastavaka nemaju datum objavljivanja. To je obavezno kod nekih aplikacija za podcaste.",
|
||||
"NoteUploaderFoldersWithMediaFiles": "Mape s medijskim datotekama smatrat će se zasebnim stavkama knjižnice.",
|
||||
"NoteUploaderOnlyAudioFiles": "Ako učitavate samo zvučne datoteke svaka će se zvučna datoteka uvesti kao zasebna zvučna knjiga.",
|
||||
"NoteUploaderUnsupportedFiles": "Nepodržane vrste datoteka zanemaruju se. Kada odabirete datoteke ili ispuštate mapu, sve datoteke koje nisu u mapi stavke zanemarit će se.",
|
||||
"NoteUploaderOnlyAudioFiles": "Ako prenosite samo zvučne datoteke svaka će se zvučna datoteka uvesti kao zasebna zvučna knjiga.",
|
||||
"NoteUploaderUnsupportedFiles": "Nepodržane vrste datoteka se zanemaruju. Kada birate datoteke ili ispuštate mapu, sve datoteke koje nisu u mapi stavke će se zanemariti.",
|
||||
"NotificationOnBackupCompletedDescription": "Pokreće se po završetku sigurnosnog kopiranja",
|
||||
"NotificationOnBackupFailedDescription": "Pokreće se kada sigurnosno kopiranje ne uspije",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Pokreće se kada se nastavak podcasta automatski preuzme",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Pokreće se kada su automatska preuzimanja nastavaka onemogućena zbog previše neuspjelih pokušaja",
|
||||
"NotificationOnRSSFeedFailedDescription": "Pokreće se u slučaju pogreške pri pokušaju automatskog preuzimanja nastavka s RSS izvora",
|
||||
"NotificationOnTestDescription": "Događaj za testiranje sustava obavijesti",
|
||||
"PlaceholderBulkChapterInput": "Upišite naslov poglavlja ili ga numerirajte (npr. '1. nastavak', 'Poglavlje 10', '1.')",
|
||||
"PlaceholderNewCollection": "Ime nove zbirke",
|
||||
"PlaceholderNewFolderPath": "Nova putanja mape",
|
||||
"PlaceholderNewPlaylist": "Naziv novog popisa za izvođenje",
|
||||
"PlaceholderNewPlaylist": "Ime novog popisa za izvođenje",
|
||||
"PlaceholderSearch": "Traži...",
|
||||
"PlaceholderSearchEpisode": "Traži nastavak...",
|
||||
"StatsAuthorsAdded": "autora dodano",
|
||||
"StatsBooksAdded": "knjiga dodano",
|
||||
"StatsBooksAdditional": "Novi naslovi uključuju…",
|
||||
"StatsBooksFinished": "knjiga dovršeno",
|
||||
"StatsBooksFinishedThisYear": "Neke knjige dovršene ove godine…",
|
||||
"StatsBooksFinished": "završene knjige",
|
||||
"StatsBooksFinishedThisYear": "Neke završene knjige ove godine…",
|
||||
"StatsBooksListenedTo": "knjiga slušano",
|
||||
"StatsCollectionGrewTo": "Vaša je zbirka knjiga narasla na…",
|
||||
"StatsSessions": "sesija",
|
||||
@@ -962,8 +999,8 @@
|
||||
"ToastBackupInvalidMaxKeep": "Neispravan broj sigurnosnih kopija za čuvanje",
|
||||
"ToastBackupInvalidMaxSize": "Neispravna najveća veličina sigurnosne kopije",
|
||||
"ToastBackupRestoreFailed": "Vraćanje sigurnosne kopije nije uspjelo",
|
||||
"ToastBackupUploadFailed": "Učitavanje sigurnosne kopije nije uspjelo",
|
||||
"ToastBackupUploadSuccess": "Sigurnosna kopija učitana",
|
||||
"ToastBackupUploadFailed": "Prijenos sigurnosne kopije nije uspio",
|
||||
"ToastBackupUploadSuccess": "Sigurnosna kopija je prenesea",
|
||||
"ToastBatchApplyDetailsToItemsSuccess": "Pojedinosti primijenjene stavkama",
|
||||
"ToastBatchDeleteFailed": "Grupno brisanje nije uspjelo",
|
||||
"ToastBatchDeleteSuccess": "Grupno brisanje je uspjelo",
|
||||
@@ -974,32 +1011,40 @@
|
||||
"ToastBookmarkCreateFailed": "Izrada knjižne oznake nije uspjela",
|
||||
"ToastBookmarkCreateSuccess": "Knjižna oznaka dodana",
|
||||
"ToastBookmarkRemoveSuccess": "Knjižna oznaka uklonjena",
|
||||
"ToastBulkChapterInvalidCount": "Upišite broj od 1 i 150",
|
||||
"ToastCachePurgeFailed": "Čišćenje predmemorije nije uspjelo",
|
||||
"ToastCachePurgeSuccess": "Predmemorija uspješno očišćena",
|
||||
"ToastChapterLocked": "Poglavlje je zaključano.",
|
||||
"ToastChapterStartTimeAdjusted": "Vrijeme početka poglavlja prilagođeno za {0} sekundi",
|
||||
"ToastChaptersAllLocked": "Sva su poglavlja zaključana. Otključajte neka poglavlja za pomicanje njihovog vremena.",
|
||||
"ToastChaptersHaveErrors": "Poglavlja imaju pogreške",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Neispravna vrijednost pomaka. Početak zadnjeg poglavlja bio bi nakon duljine trajanja ove zvučne knjige.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Neispravna vrijednost pomaka. Trajanje prvog poglavlja bilo bi nula ili negativno i drugo poglavlje bi ga prepisalo. Povećajte vrijeme početka drugog poglavlja.",
|
||||
"ToastChaptersMustHaveTitles": "Poglavlja moraju imati naslove",
|
||||
"ToastChaptersRemoved": "Poglavlja uklonjena",
|
||||
"ToastChaptersUpdated": "Poglavlja su ažurirana",
|
||||
"ToastCollectionItemsAddFailed": "Neuspješno dodavanje stavki u zbirku",
|
||||
"ToastCollectionItemsAddFailed": "Neuspjelo dodavanje stavki u zbirku",
|
||||
"ToastCollectionRemoveSuccess": "Zbirka izbrisana",
|
||||
"ToastCollectionUpdateSuccess": "Zbirka ažurirana",
|
||||
"ToastConnectionNotAvailable": "Veza nije dostupna. Pokušaj ponovo kasnije",
|
||||
"ToastCoverSearchFailed": "Pretraga naslovnice neuspjela",
|
||||
"ToastCoverUpdateFailed": "Ažuriranje naslovnice nije uspjelo",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Datum i vrijeme su neispravni ili nepotpuni",
|
||||
"ToastDeleteFileFailed": "Brisanje datoteke nije uspjelo",
|
||||
"ToastDeleteFileSuccess": "Datoteka izbrisana",
|
||||
"ToastDeviceAddFailed": "Dodavanje uređaja nije uspjelo",
|
||||
"ToastDeviceNameAlreadyExists": "E-čitač s tim nazivom već postoji",
|
||||
"ToastDeviceNameAlreadyExists": "E-čitač s tim imenom već postoji",
|
||||
"ToastDeviceTestEmailFailed": "Slanje probne poruke e-pošte nije uspjelo",
|
||||
"ToastDeviceTestEmailSuccess": "Probna poruka e-pošte poslana",
|
||||
"ToastEmailSettingsUpdateSuccess": "Postavke e-pošte ažurirane",
|
||||
"ToastEncodeCancelFailed": "Kodiranje nije uspješno otkazano",
|
||||
"ToastEncodeCancelFailed": "Prekidanje kodiranja nije uspjelo",
|
||||
"ToastEncodeCancelSucces": "Kodiranje otkazano",
|
||||
"ToastEpisodeDownloadQueueClearFailed": "Redoslijed izvođenja nije uspješno očišćen",
|
||||
"ToastEpisodeDownloadQueueClearFailed": "Brisanje redoslijeda izvođenja nije uspjelo",
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Redoslijed preuzimanja nastavaka očišćen",
|
||||
"ToastEpisodeUpdateSuccess": "{0} nastavak/a ažurirano",
|
||||
"ToastErrorCannotShare": "Dijeljenje na ovaj uređaj nije moguće",
|
||||
"ToastFailedToCreate": "Izrada nije uspjela",
|
||||
"ToastFailedToDelete": "Brisanje nije uspjelo",
|
||||
"ToastFailedToLoadData": "Učitavanje podataka nije uspjelo",
|
||||
"ToastFailedToMatch": "Nije prepoznato",
|
||||
"ToastFailedToShare": "Dijeljenje nije uspjelo",
|
||||
@@ -1007,14 +1052,15 @@
|
||||
"ToastInvalidImageUrl": "Neispravan URL slike",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Neispravan unos maksimalnog broja nastavaka",
|
||||
"ToastInvalidUrl": "Neispravan URL",
|
||||
"ToastInvalidUrls": "Jedan ili više URL-ova nisu ispravni",
|
||||
"ToastItemCoverUpdateSuccess": "Naslovnica stavke ažurirana",
|
||||
"ToastItemDeletedFailed": "Brisanje stavke nije uspjelo",
|
||||
"ToastItemDeletedSuccess": "Stavka je izbrisana",
|
||||
"ToastItemDetailsUpdateSuccess": "Pojedinosti stavke su ažurirane",
|
||||
"ToastItemMarkedAsFinishedFailed": "Označavanje kao Dovršeno nije uspjelo",
|
||||
"ToastItemMarkedAsFinishedSuccess": "Stavka označena kao dovršena",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Označavanje kao Nije dovršeno nije uspjelo",
|
||||
"ToastItemMarkedAsNotFinishedSuccess": "Stavka označena kao nedovršena",
|
||||
"ToastItemMarkedAsFinishedFailed": "Označavanje kao „Završeno” nije uspjelo",
|
||||
"ToastItemMarkedAsFinishedSuccess": "Stavka je označena kao završena",
|
||||
"ToastItemMarkedAsNotFinishedFailed": "Označavanje kao „Nezavršeno” nije uspjelo",
|
||||
"ToastItemMarkedAsNotFinishedSuccess": "Stavka je označena kao nezavršena",
|
||||
"ToastItemUpdateSuccess": "Stavka ažurirana",
|
||||
"ToastLibraryCreateFailed": "Stvaranje knjižnice nije uspjelo",
|
||||
"ToastLibraryCreateSuccess": "Knjižnica \"{0}\" stvorena",
|
||||
@@ -1023,16 +1069,17 @@
|
||||
"ToastLibraryScanFailedToStart": "Skeniranje nije uspjelo",
|
||||
"ToastLibraryScanStarted": "Skeniranje knjižnice započelo",
|
||||
"ToastLibraryUpdateSuccess": "Knjižnica \"{0}\" ažurirana",
|
||||
"ToastMatchAllAuthorsFailed": "Nisu prepoznati svi autori",
|
||||
"ToastMatchAllAuthorsFailed": "Prepoznavanje svih autora nije uspjelo",
|
||||
"ToastMetadataFilesRemovedError": "Pogreška kod uklanjanja datoteka metadata.{0}",
|
||||
"ToastMetadataFilesRemovedNoneFound": "U knjižnici nisu pronađene datoteke metadata.{0}",
|
||||
"ToastMetadataFilesRemovedNoneRemoved": "Datoteke metadata.{0} nisu uklonjenje",
|
||||
"ToastMetadataFilesRemovedSuccess": "uklonjeno {0} datoteka metadata.{1}",
|
||||
"ToastMustHaveAtLeastOnePath": "Mora postojati barem jedna putanja",
|
||||
"ToastMetadataFilesRemovedNoneRemoved": "Nijedna datoteka metadata.{0} nije uklonjenja",
|
||||
"ToastMetadataFilesRemovedSuccess": "Broj uklonjenih datoteka metadata.{1}: {0}",
|
||||
"ToastMustHaveAtLeastOnePath": "Mora imati barem jednu putanju",
|
||||
"ToastNameEmailRequired": "Ime i adresa e-pošte su obavezni",
|
||||
"ToastNameRequired": "Ime je obavezno",
|
||||
"ToastNewApiKeyUserError": "Morate odabrati korisnika",
|
||||
"ToastNewEpisodesFound": "pronađeno {0} novih nastavaka",
|
||||
"ToastNewUserCreatedFailed": "Račun \"{0}\" nije uspješno izrađen",
|
||||
"ToastNewUserCreatedFailed": "Stvaranje računa nije uspjelo: \"{0}\"",
|
||||
"ToastNewUserCreatedSuccess": "Novi račun izrađen",
|
||||
"ToastNewUserLibraryError": "Treba odabrati barem jednu knjižnicu",
|
||||
"ToastNewUserPasswordError": "Mora imati zaporku, samo korisnik root može imati praznu zaporku",
|
||||
@@ -1043,19 +1090,20 @@
|
||||
"ToastNoUpdatesNecessary": "Ažuriranja nisu potrebna",
|
||||
"ToastNotificationCreateFailed": "Stvaranje obavijesti nije uspjelo",
|
||||
"ToastNotificationDeleteFailed": "Brisanje obavijesti nije uspjelo",
|
||||
"ToastNotificationFailedMaximum": "Najveći broj neuspješnih pokušaja mora biti >= 0",
|
||||
"ToastNotificationFailedMaximum": "Najveći broj neuspjelih pokušaja mora biti >= 0",
|
||||
"ToastNotificationQueueMaximum": "Najveći broj obavijesti u redu mora biti >= 0",
|
||||
"ToastNotificationSettingsUpdateSuccess": "Postavke obavijesti ažurirane",
|
||||
"ToastNotificationTestTriggerFailed": "Okidanje probne obavijesti nije uspjelo",
|
||||
"ToastNotificationTestTriggerSuccess": "Okinuta je probna obavijest",
|
||||
"ToastNotificationUpdateSuccess": "Obavijest ažurirana",
|
||||
"ToastPlaylistCreateFailed": "Popis za izvođenje nije izrađen",
|
||||
"ToastPlaylistCreateFailed": "Izrada popisa za izvođenje nije uspjela",
|
||||
"ToastPlaylistCreateSuccess": "Popis za izvođenje izrađen",
|
||||
"ToastPlaylistRemoveSuccess": "Popis za izvođenje uklonjen",
|
||||
"ToastPlaylistUpdateSuccess": "Popis za izvođenje ažuriran",
|
||||
"ToastPodcastCreateFailed": "Podcast nije izrađen",
|
||||
"ToastPodcastCreateFailed": "Stvaranje podcasta nije uspjelo",
|
||||
"ToastPodcastCreateSuccess": "Podcast uspješno izrađen",
|
||||
"ToastPodcastGetFeedFailed": "Dohvat izvora podcasta nije uspio",
|
||||
"ToastPodcastEpisodeUpdated": "Nastavak ažuriran",
|
||||
"ToastPodcastGetFeedFailed": "Dohvaćanje izvora podcasta nije uspjelo",
|
||||
"ToastPodcastNoEpisodesInFeed": "U RSS izvoru nisu pronađeni nastavci",
|
||||
"ToastPodcastNoRssFeed": "Podcast nema RSS izvor",
|
||||
"ToastProgressIsNotBeingSynced": "Napredak se ne sinkronizira, ponovno pokrenite reprodukciju",
|
||||
@@ -1063,7 +1111,7 @@
|
||||
"ToastProviderCreatedSuccess": "Novi pružatelj dodan",
|
||||
"ToastProviderNameAndUrlRequired": "Ime i URL su obavezni",
|
||||
"ToastProviderRemoveSuccess": "Pružatelj uklonjen",
|
||||
"ToastRSSFeedCloseFailed": "RSS izvor nije uspješno zatvoren",
|
||||
"ToastRSSFeedCloseFailed": "Zatvaranje RSS izvora nije uspjelo",
|
||||
"ToastRSSFeedCloseSuccess": "RSS izvor zatvoren",
|
||||
"ToastRemoveFailed": "Uklanjanje nije uspjelo",
|
||||
"ToastRemoveItemFromCollectionFailed": "Uklanjanje stavke iz zbirke nije uspjelo",
|
||||
@@ -1071,7 +1119,7 @@
|
||||
"ToastRemoveItemsWithIssuesFailed": "Uklanjanje knjižničkih stavki s problemima nije uspjelo",
|
||||
"ToastRemoveItemsWithIssuesSuccess": "Uspješno uklonjene knjižničke stavke s problemima",
|
||||
"ToastRenameFailed": "Preimenovanje nije uspjelo",
|
||||
"ToastRescanFailed": "Ponovno skeniranje {0} nije uspjelo",
|
||||
"ToastRescanFailed": "Ponovno skeniranje nije uspjelo za {0}",
|
||||
"ToastRescanRemoved": "Ponovno skeniranje dovršene stavke je uklonjeno",
|
||||
"ToastRescanUpToDate": "Ponovno skeniranje dovršene stavke bilo je ažurno",
|
||||
"ToastRescanUpdated": "Ponovno skeniranje dovršene stavke je ažurirano",
|
||||
@@ -1086,7 +1134,7 @@
|
||||
"ToastSessionCloseFailed": "Zatvaranje sesije nije uspjelo",
|
||||
"ToastSessionDeleteFailed": "Brisanje sesije nije uspjelo",
|
||||
"ToastSessionDeleteSuccess": "Sesija izbrisana",
|
||||
"ToastSleepTimerDone": "Timer za spavanje istječe... zZzzZz",
|
||||
"ToastSleepTimerDone": "Timer za spavanje gotov... zZzzZz",
|
||||
"ToastSlugMustChange": "Slug sadrži nedozvoljene znakove",
|
||||
"ToastSlugRequired": "Slug je obavezan",
|
||||
"ToastSocketConnected": "Socket priključen",
|
||||
@@ -1098,12 +1146,20 @@
|
||||
"ToastUnknownError": "Nepoznata pogreška",
|
||||
"ToastUnlinkOpenIdFailed": "Uklanjanje OpenID veze korisnika nije uspjelo",
|
||||
"ToastUnlinkOpenIdSuccess": "Korisnik odspojen od OpenID-ja",
|
||||
"ToastUploaderFilepathExistsError": "Putanja \"{0}\" već postoji na poslužitelju",
|
||||
"ToastUploaderItemExistsInSubdirectoryError": "Stavka \"{0}\" koristi se podmapom u putanje za učitavanje.",
|
||||
"ToastUploaderFilepathExistsError": "Datotečna putanja \"{0}\" već postoji na poslužitelju",
|
||||
"ToastUploaderItemExistsInSubdirectoryError": "Stavka \"{0}\" koristi podmapu putanje za prijenos.",
|
||||
"ToastUserDeleteFailed": "Brisanje korisnika nije uspjelo",
|
||||
"ToastUserDeleteSuccess": "Korisnik izbrisan",
|
||||
"ToastUserPasswordChangeSuccess": "Zaporka je uspješno promijenjena",
|
||||
"ToastUserPasswordMismatch": "Zaporke se ne podudaraju",
|
||||
"ToastUserPasswordMustChange": "Nova zaporka ne smije biti jednaka staroj",
|
||||
"ToastUserRootRequireName": "Obavezan je unos korisničkog imena root korisnika"
|
||||
"ToastUserRootRequireName": "Obavezan je unos korisničkog imena root korisnika",
|
||||
"TooltipAddChapters": "Dodavanje poglavlja",
|
||||
"TooltipAddOneSecond": "Dodaj 1 sekundu",
|
||||
"TooltipAdjustChapterStart": "Kliknite za uređivanje početnog vremena",
|
||||
"TooltipLockAllChapters": "Zaključaj sva poglavlja",
|
||||
"TooltipLockChapter": "Zaključaj poglavlje (Shift + klik za raspon)",
|
||||
"TooltipSubtractOneSecond": "Oduzmi 1 sekundu",
|
||||
"TooltipUnlockAllChapters": "Otključaj sva poglavlja",
|
||||
"TooltipUnlockChapter": "Otključaj poglavlje (Shift+klik za raspon)"
|
||||
}
|
||||
|
||||
+68
-12
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Hozzáadás",
|
||||
"ButtonAddApiKey": "API kulcs hozzáadása",
|
||||
"ButtonAddChapters": "Fejezetek hozzáadása",
|
||||
"ButtonAddDevice": "Eszköz hozzáadása",
|
||||
"ButtonAddLibrary": "Könyvtár hozzáadása",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Válassz egy mappát",
|
||||
"ButtonChooseFiles": "Fájlok kiválasztása",
|
||||
"ButtonClearFilter": "Szűrő törlése",
|
||||
"ButtonClose": "Bezár",
|
||||
"ButtonCloseFeed": "Hírcsatorna bezárása",
|
||||
"ButtonCloseSession": "Nyitott munkamenet bezárása",
|
||||
"ButtonCollections": "Gyűjtemények",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Fiók",
|
||||
"HeaderAddCustomMetadataProvider": "Egyedi metaadat szolgáltató hozzáadása",
|
||||
"HeaderAdvanced": "Haladó",
|
||||
"HeaderApiKeys": "API kulcsok",
|
||||
"HeaderAppriseNotificationSettings": "Apprise értesítési beállítások",
|
||||
"HeaderAudioTracks": "Audiósávok",
|
||||
"HeaderAudiobookTools": "Hangoskönyv fájlkezelő eszközök",
|
||||
"HeaderAuthentication": "Hitelesítés",
|
||||
"HeaderBackups": "Biztonsági másolatok",
|
||||
"HeaderBulkChapterModal": "Több fejezet hozzáadása",
|
||||
"HeaderChangePassword": "Jelszó megváltoztatása",
|
||||
"HeaderChapters": "Fejezetek",
|
||||
"HeaderChooseAFolder": "Válasszon egy mappát",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Metaadatok előnyben részesítési sorrendje",
|
||||
"HeaderMetadataToEmbed": "Beágyazandó metaadatok",
|
||||
"HeaderNewAccount": "Új fiók",
|
||||
"HeaderNewApiKey": "Új API kulcs",
|
||||
"HeaderNewLibrary": "Új könyvtár",
|
||||
"HeaderNotificationCreate": "Értesítés készítése",
|
||||
"HeaderNotificationUpdate": "Értesítés frissítése",
|
||||
@@ -195,17 +200,19 @@
|
||||
"HeaderSettingsExperimental": "Kísérleti funkciók",
|
||||
"HeaderSettingsGeneral": "Általános",
|
||||
"HeaderSettingsScanner": "Szkenner",
|
||||
"HeaderSettingsSecurity": "Biztonság",
|
||||
"HeaderSettingsWebClient": "Webkliens",
|
||||
"HeaderSleepTimer": "Alvásidőzítő",
|
||||
"HeaderStatsLargestItems": "Legnagyobb elemek",
|
||||
"HeaderStatsLongestItems": "Leghosszabb elemek (órában)",
|
||||
"HeaderStatsMinutesListeningChart": "Hallgatási grafikon percekben (az elmúlt 7 napból)",
|
||||
"HeaderStatsMinutesListeningChart": "Hallgatási grafikon percben (az elmúlt 7 napból)",
|
||||
"HeaderStatsRecentSessions": "Legutóbbi munkamenetek",
|
||||
"HeaderStatsTop10Authors": "Top 10 szerző",
|
||||
"HeaderStatsTop5Genres": "Top 5 műfaj",
|
||||
"HeaderTableOfContents": "Tartalomjegyzék",
|
||||
"HeaderTools": "Eszközök",
|
||||
"HeaderUpdateAccount": "Fiók frissítése",
|
||||
"HeaderUpdateApiKey": "API kulcs frissítése",
|
||||
"HeaderUpdateAuthor": "Szerző frissítése",
|
||||
"HeaderUpdateDetails": "Részletek frissítése",
|
||||
"HeaderUpdateLibrary": "Könyvtár frissítése",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Minden felhasználó, vendégek kivételével",
|
||||
"LabelAllUsersIncludingGuests": "Minden felhasználó, beleértve a vendégeket is",
|
||||
"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",
|
||||
"LabelAppend": "Hozzáfűzés",
|
||||
"LabelAudioBitrate": "Audió bitráta (pl.128k)",
|
||||
@@ -264,7 +275,7 @@
|
||||
"LabelBonus": "Bónusz",
|
||||
"LabelBooks": "Könyvek",
|
||||
"LabelButtonText": "Gomb szövege",
|
||||
"LabelByAuthor": "{} által",
|
||||
"LabelByAuthor": "{0} által",
|
||||
"LabelChangePassword": "Jelszó megváltoztatása",
|
||||
"LabelChannels": "Csatornák",
|
||||
"LabelChapterCount": "{0} Fejezet",
|
||||
@@ -275,15 +286,16 @@
|
||||
"LabelClickToUseCurrentValue": "Kattintson az aktuális érték használatához",
|
||||
"LabelClosePlayer": "Lejátszó bezárása",
|
||||
"LabelCodec": "Kodek",
|
||||
"LabelCollapseSeries": "Sorozat összecsukása",
|
||||
"LabelCollapseSeries": "Sorozatok összecsukása",
|
||||
"LabelCollapseSubSeries": "Alszéria összecsukása",
|
||||
"LabelCollection": "Gyűjtemény",
|
||||
"LabelCollections": "Gyűjtemény",
|
||||
"LabelCollections": "Gyűjtemények",
|
||||
"LabelComplete": "Kész",
|
||||
"LabelConfirmPassword": "Jelszó megerősítése",
|
||||
"LabelContinueListening": "Hallgatás folytatása",
|
||||
"LabelContinueReading": "Olvasás folytatása",
|
||||
"LabelContinueSeries": "Sorozat folytatása",
|
||||
"LabelCorsAllowed": "Megengedett CORS Originek",
|
||||
"LabelCover": "Borító",
|
||||
"LabelCoverImageURL": "Borítókép URL",
|
||||
"LabelCoverProvider": "Borító Szolgáltató",
|
||||
@@ -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)",
|
||||
"LabelDescription": "Leírás",
|
||||
"LabelDeselectAll": "Minden kijelölés megszüntetése",
|
||||
"LabelDetectedPattern": "Észlelt minta:",
|
||||
"LabelDevice": "Eszköz",
|
||||
"LabelDeviceInfo": "Eszköz információ",
|
||||
"LabelDeviceIsAvailableTo": "Eszköz elérhető a következő számára...",
|
||||
@@ -346,6 +359,10 @@
|
||||
"LabelExample": "Példa",
|
||||
"LabelExpandSeries": "Sorozat kinyitása",
|
||||
"LabelExpandSubSeries": "Alsorozat kinyitása",
|
||||
"LabelExpired": "Lejárt",
|
||||
"LabelExpiresAt": "Lejár",
|
||||
"LabelExpiresInSeconds": "Lejár (másodpercben)",
|
||||
"LabelExpiresNever": "Soha",
|
||||
"LabelExplicit": "Szókimondó",
|
||||
"LabelExplicitChecked": "Explicit (ellenőrizve)",
|
||||
"LabelExplicitUnchecked": "Nem explicit (nem ellenőrzött)",
|
||||
@@ -361,11 +378,12 @@
|
||||
"LabelFilterByUser": "Szűrés felhasználó szerint",
|
||||
"LabelFindEpisodes": "Epizódok keresése",
|
||||
"LabelFinished": "Befejezett",
|
||||
"LabelFinishedDate": "Befejezve {0}",
|
||||
"LabelFolder": "Mappa",
|
||||
"LabelFolders": "Mappák",
|
||||
"LabelFontBold": "Félkövér",
|
||||
"LabelFontBoldness": "Betű vastagság",
|
||||
"LabelFontFamily": "Betűtípus család",
|
||||
"LabelFontFamily": "Betűcsalád",
|
||||
"LabelFontItalic": "Dőlt",
|
||||
"LabelFontScale": "Betűméret skála",
|
||||
"LabelFontStrikethrough": "Áthúzott",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "Nyelvek",
|
||||
"LabelLastBookAdded": "Utolsó hozzáadott könyv",
|
||||
"LabelLastBookUpdated": "Utolsó frissített könyv",
|
||||
"LabelLastProgressDate": "Legutóbbi haladás: {0}",
|
||||
"LabelLastSeen": "Utolsó látogatás",
|
||||
"LabelLastTime": "Utolsó alkalom",
|
||||
"LabelLastUpdate": "Utolsó frissítés",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Nem {0}",
|
||||
"LabelLibraryItem": "Könyvtári elem",
|
||||
"LabelLibraryName": "Könyvtár neve",
|
||||
"LabelLibrarySortByProgress": "Folyamat: Legutóbbi frissítés",
|
||||
"LabelLibrarySortByProgressFinished": "Folyamat: Befejezve",
|
||||
"LabelLibrarySortByProgressStarted": "Folyamat: Elindult",
|
||||
"LabelLimit": "Korlát",
|
||||
"LabelLineSpacing": "Sorköz",
|
||||
"LabelListenAgain": "Újrahallgatás",
|
||||
@@ -425,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Figyelmeztetés",
|
||||
"LabelLookForNewEpisodesAfterDate": "Új epizódok keresése ezen a dátum után",
|
||||
"LabelLowestPriority": "Legalacsonyabb prioritás",
|
||||
"LabelMatchConfidence": "Bizalom",
|
||||
"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",
|
||||
"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",
|
||||
"LabelNewestEpisodes": "Legújabb epizódok",
|
||||
"LabelNextBackupDate": "Következő biztonsági másolat dátuma",
|
||||
"LabelNextChapters": "A következő fejezetek:",
|
||||
"LabelNextScheduledRun": "Következő ütemezett futtatás",
|
||||
"LabelNoApiKeys": "Nincs API kulcs",
|
||||
"LabelNoCustomMetadataProviders": "Nincsenek egyedi metaadat szolgáltatók",
|
||||
"LabelNoEpisodesSelected": "Nincsenek kiválasztott epizódok",
|
||||
"LabelNotFinished": "Nem befejezett",
|
||||
@@ -470,10 +495,11 @@
|
||||
"LabelNotificationsMaxQueueSize": "Maximális értesítési események sorának mérete",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Az események korlátozva vannak, hogy másodpercenként 1-szer történjenek. Ha a sor maximális méretű, akkor az események figyelmen kívül lesznek hagyva. Ez megakadályozza az értesítések spamelését.",
|
||||
"LabelNumberOfBooks": "Könyvek száma",
|
||||
"LabelNumberOfChapters": "Fejezetek száma:",
|
||||
"LabelNumberOfEpisodes": "Epizódok száma",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Az OpenID-igény neve, amely a felhasználói műveletekre vonatkozó haladó jogosultságokat tartalmazza az alkalmazáson belül, és amely a nem adminisztrátori szerepkörökre vonatkozik (<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.",
|
||||
"LabelOpenIDGroupClaimDescription": "Az OpenID-igény neve, amely a felhasználó csoportjainak listáját tartalmazza. Általában <code>groups<code> néven hivatkoznak rá. <b>Ha konfigurálva van<b>, az alkalmazás automatikusan hozzárendeli a szerepköröket a felhasználó csoporttagságai alapján, feltéve, hogy ezek a csoportok az igényben kis- és nagybetűkre érzéketlenül ‘admin’, ‘user’ vagy ‘guest’ néven szerepelnek. Az igénynek egy listát kell tartalmaznia, és ha egy felhasználó több csoport tagja, az alkalmazás a legmagasabb szintű hozzáféréssel rendelkező szerepkört rendeli hozzá. Ha egyetlen csoport sem felel meg, a hozzáférés megtagadásra kerül.",
|
||||
"LabelOpenIDGroupClaimDescription": "Az OpenID-igény neve, amely a felhasználó csoportjainak listáját tartalmazza. Általában <code>groups</code> néven hivatkoznak rá. <b>Ha konfigurálva van</b>, az alkalmazás automatikusan hozzárendeli a szerepköröket a felhasználó csoporttagságai alapján, feltéve, hogy ezek a csoportok az igényben kis- és nagybetűkre érzéketlenül ‘admin’, ‘user’ vagy ‘guest’ néven szerepelnek. Az igénynek egy listát kell tartalmaznia, és ha egy felhasználó több csoport tagja, az alkalmazás a legmagasabb szintű hozzáféréssel rendelkező szerepkört rendeli hozzá. Ha egyetlen csoport sem felel meg, a hozzáférés megtagadásra kerül.",
|
||||
"LabelOpenRSSFeed": "RSS hírcsatorna megnyitása",
|
||||
"LabelOverwrite": "Felülírás",
|
||||
"LabelPaginationPageXOfY": "{0} oldal {1}-ból/ből",
|
||||
@@ -544,6 +570,7 @@
|
||||
"LabelSelectAll": "Minden kiválasztása",
|
||||
"LabelSelectAllEpisodes": "Összes epizód kiválasztása",
|
||||
"LabelSelectEpisodesShowing": "Kiválasztás {0} megjelenített epizód",
|
||||
"LabelSelectUser": "Felhasználó kiválasztása",
|
||||
"LabelSelectUsers": "Felhasználók kiválasztása",
|
||||
"LabelSendEbookToDevice": "E-könyv küldése...",
|
||||
"LabelSequence": "Sorozat",
|
||||
@@ -561,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Skeuomorfikus dizájn fa polcokkal",
|
||||
"LabelSettingsChromecastSupport": "Chromecast támogatás",
|
||||
"LabelSettingsDateFormat": "Dátumformátum",
|
||||
"LabelSettingsEnableWatcher": "Változások automatikus vizsgálata a könyvtárakban",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Változások automatikus vizsgálata a könyvtárban",
|
||||
"LabelSettingsEnableWatcher": "Változások automatikus figyelése a könyvtárakban",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Változások automatikus figyelése a könyvtárban",
|
||||
"LabelSettingsEnableWatcherHelp": "Engedélyezi az automatikus elem hozzáadás/frissítés funkciót, amikor fájlváltozásokat észlel. *Szerver újraindítása szükséges",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Szkriptelt tartalmak engedélyezése epub-okban",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Megengedi, hogy az epub fájlok szkripteket hajtsanak végre. Ezt a beállítást kikapcsolva ajánlott tartani, kivéve, ha megbízik az epub fájlok forrásában.",
|
||||
@@ -611,12 +638,13 @@
|
||||
"LabelStartTime": "Kezdési idő",
|
||||
"LabelStarted": "Elkezdődött",
|
||||
"LabelStartedAt": "Kezdés ideje",
|
||||
"LabelStartedDate": "Elindítva {0}",
|
||||
"LabelStatsAudioTracks": "Audiósáv",
|
||||
"LabelStatsAuthors": "Szerző",
|
||||
"LabelStatsBestDay": "Legjobb nap",
|
||||
"LabelStatsDailyAverage": "Napi átlag",
|
||||
"LabelStatsDays": "Napok",
|
||||
"LabelStatsDaysListened": "Hallgatással töltött napok",
|
||||
"LabelStatsDays": "Nap",
|
||||
"LabelStatsDaysListened": "Hallgatással töltött nap",
|
||||
"LabelStatsHours": "Órák",
|
||||
"LabelStatsInARow": "egymás után",
|
||||
"LabelStatsItemsFinished": "Befejezett elem",
|
||||
@@ -640,6 +668,7 @@
|
||||
"LabelTheme": "Téma",
|
||||
"LabelThemeDark": "Sötét",
|
||||
"LabelThemeLight": "Világos",
|
||||
"LabelThemeSepia": "Szépia",
|
||||
"LabelTimeBase": "Időalap",
|
||||
"LabelTimeDurationXHours": "{0} óra",
|
||||
"LabelTimeDurationXMinutes": "{0} perc",
|
||||
@@ -708,7 +737,9 @@
|
||||
"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.",
|
||||
"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.",
|
||||
"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.",
|
||||
"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ó.",
|
||||
@@ -722,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Nincs eredmény a \"{0}: {1}\" szűrőre",
|
||||
"MessageBookshelfNoResultsForQuery": "Nincs eredmény a lekérdezéshez",
|
||||
"MessageBookshelfNoSeries": "Nincsenek sorozatai",
|
||||
"MessageBulkChapterPattern": "Hány fejezetet szeretne hozzáadni ezzel a számozási mintával?",
|
||||
"MessageChapterEndIsAfter": "A fejezet vége a hangoskönyv végét követi",
|
||||
"MessageChapterErrorFirstNotZero": "Az első fejezetnek 0:00-kor kell kezdődnie",
|
||||
"MessageChapterErrorStartGteDuration": "Érvénytelen kezdési idő, kevesebbnek kell lennie, mint a hangoskönyv időtartama",
|
||||
@@ -730,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Fejezetek nem találhatók",
|
||||
"MessageCheckingCron": "Cron ellenőrzése...",
|
||||
"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?",
|
||||
"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?",
|
||||
@@ -757,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Biztosan eltávolítja a(z) \"{0}\" szerzőt?",
|
||||
"MessageConfirmRemoveCollection": "Biztosan eltávolítja a(z) \"{0}\" gyűjteményt?",
|
||||
"MessageConfirmRemoveEpisode": "Biztosan eltávolítja a(z) \"{0}\" epizódot?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Megjegyzés: Ez nem törli a hangfájlt, kivéve, ha a \"Hangfájl végleges törlése\" be van kapcsolva",
|
||||
"MessageConfirmRemoveEpisodes": "Biztosan eltávolítja a(z) {0} epizódot?",
|
||||
"MessageConfirmRemoveListeningSessions": "Biztosan eltávolítja a(z) {0} hallgatási munkamenetet?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Biztos, hogy az összes metaadatot el akarja távolítani {0} fájl van könyvtár mappáiban?",
|
||||
@@ -782,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "A hírcsatorna URL-je {0} lesz",
|
||||
"MessageFetching": "Lekérdezés...",
|
||||
"MessageForceReScanDescription": "minden fájlt újra szkennel, mint egy friss szkennelés. Az audiofájlok ID3 címkéi, OPF fájlok és szövegfájlok újként lesznek szkennelve.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} hallgatja</strong> ezen {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Nincs hallgatás folyamatban ezen: {0}",
|
||||
"MessageImportantNotice": "Fontos közlemény!",
|
||||
"MessageInsertChapterBelow": "Fejezet beszúrása alulra",
|
||||
"MessageInvalidAsin": "Érvénytelen ASIN",
|
||||
@@ -852,7 +888,7 @@
|
||||
"MessageResetChaptersConfirm": "Biztosan alaphelyzetbe szeretné állítani a fejezeteket és visszavonni a módosításokat?",
|
||||
"MessageRestoreBackupConfirm": "Biztosan vissza szeretné állítani a biztonsági másolatot, amely ekkor készült:",
|
||||
"MessageRestoreBackupWarning": "A biztonsági mentés visszaállítása felülírja az egész adatbázist, amely a /config mappában található, valamint a borítóképeket a /metadata/items és /metadata/authors mappákban.<br /><br />A biztonsági mentések nem módosítják a könyvtár mappáiban található fájlokat. Ha engedélyezte a szerverbeállításokat a borítóképek és a metaadatok könyvtármappákban való tárolására, akkor ezek nem kerülnek biztonsági mentésre vagy felülírásra.<br /><br />A szerver használó összes kliens automatikusan frissül.",
|
||||
"MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. A mappafigyelő nem működik minden fájlrendszernél (mint például az NFS), ezért helyette ütemezett könyvtárellenőrzéseket lehet használni.",
|
||||
"MessageScheduleLibraryScanNote": "A legtöbb felhasználó számára ajánlott ezt a funkciót kikapcsolva hagyni, és engedélyezni a mappafigyelő beállítást. A mappafigyelő automatikusan észleli a könyvtári mappák változásait. Kapcsolja be ezt a funkciót, ha az „Automatikus könyvtárfigyelés” nem működik a fájlrendszerén (például NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Futás minden {1} óra {0}-kor",
|
||||
"MessageSearchResultsFor": "Keresési eredmények",
|
||||
"MessageSelected": "{0} kiválasztva",
|
||||
@@ -921,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",
|
||||
"NotificationOnRSSFeedFailedDescription": "Akkor aktiválódik, ha az RSS feed kérés sikertelen az automatikus epizódletöltésnél",
|
||||
"NotificationOnTestDescription": "Esemény az értesítési rendszer teszteléséhez",
|
||||
"PlaceholderBulkChapterInput": "Írja be a fejezet címét vagy használjon számozást (pl. „1. epizód”, „10. fejezet”, „1.”)",
|
||||
"PlaceholderNewCollection": "Új gyűjtemény neve",
|
||||
"PlaceholderNewFolderPath": "Új mappa útvonala",
|
||||
"PlaceholderNewPlaylist": "Új lejátszási lista neve",
|
||||
@@ -974,8 +1011,12 @@
|
||||
"ToastBookmarkCreateFailed": "Könyvjelző létrehozása sikertelen",
|
||||
"ToastBookmarkCreateSuccess": "Könyvjelző hozzáadva",
|
||||
"ToastBookmarkRemoveSuccess": "Könyvjelző eltávolítva",
|
||||
"ToastBulkChapterInvalidCount": "Írjon be egy számot 1 és 150 között",
|
||||
"ToastCachePurgeFailed": "A gyorsítótár törlése sikertelen",
|
||||
"ToastCachePurgeSuccess": "A gyorsítótár sikeresen törölve",
|
||||
"ToastChapterLocked": "A fejezet zárolt.",
|
||||
"ToastChapterStartTimeAdjusted": "A fejezet kezdési ideje {0} másodperccel módosítva",
|
||||
"ToastChaptersAllLocked": "Minden fejezet zárolt. Nyisson meg néhány fejezetet, hogy módosítsa azok idejét.",
|
||||
"ToastChaptersHaveErrors": "A fejezetek hibákat tartalmaznak",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Érvénytelen eltolási érték. Az utolsó fejezet kezdési időpontja túlnyúlna a hangoskönyv időtartamán.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Érvénytelen eltolási érték. Az első fejezet hossza nulla vagy negatív lenne, és a második fejezet felülírná. Növelje a második fejezet kezdő időtartamát.",
|
||||
@@ -985,6 +1026,8 @@
|
||||
"ToastCollectionItemsAddFailed": "A tétel(ek) hozzáadása gyűjteményhez sikertelen",
|
||||
"ToastCollectionRemoveSuccess": "Gyűjtemény eltávolítva",
|
||||
"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",
|
||||
"ToastDateTimeInvalidOrIncomplete": "A dátum és az időpont érvénytelen vagy hiányos",
|
||||
"ToastDeleteFileFailed": "Nem sikerült törölni a fájlt",
|
||||
@@ -1000,6 +1043,8 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Epizód letöltési várólista törölve",
|
||||
"ToastEpisodeUpdateSuccess": "{0} epizód frissítve",
|
||||
"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",
|
||||
"ToastFailedToMatch": "Nem sikerült egyezőséget találni",
|
||||
"ToastFailedToShare": "Nem sikerült megosztani",
|
||||
@@ -1007,6 +1052,7 @@
|
||||
"ToastInvalidImageUrl": "Érvénytelen a kép URL címe",
|
||||
"ToastInvalidMaxEpisodesToDownload": "A letölthető epizódok száma érvénytelen",
|
||||
"ToastInvalidUrl": "Érvénytelen URL",
|
||||
"ToastInvalidUrls": "Egy vagy több URL érvénytelen",
|
||||
"ToastItemCoverUpdateSuccess": "Elem borítója frissítve",
|
||||
"ToastItemDeletedFailed": "Nem sikerült törölni az elemet",
|
||||
"ToastItemDeletedSuccess": "Elem törölve",
|
||||
@@ -1031,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Legalább egy elérési útvonalnak kell lennie",
|
||||
"ToastNameEmailRequired": "Név és e-mail cím 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",
|
||||
"ToastNewUserCreatedFailed": "Nem sikerült a fiókot létrehozni: „{0}”",
|
||||
"ToastNewUserCreatedSuccess": "Új fiók létrehozva",
|
||||
@@ -1055,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Lejátszási lista frissítve",
|
||||
"ToastPodcastCreateFailed": "Podcast létrehozása sikertelen",
|
||||
"ToastPodcastCreateSuccess": "A podcast sikeresen létrehozva",
|
||||
"ToastPodcastEpisodeUpdated": "Epizód frissítve",
|
||||
"ToastPodcastGetFeedFailed": "Nem sikerült podcast feedet kapni",
|
||||
"ToastPodcastNoEpisodesInFeed": "Nincsenek epizódok az RSS hírcsatornában",
|
||||
"ToastPodcastNoRssFeed": "A podcastnak nincs RSS-hírcsatornája",
|
||||
@@ -1105,5 +1153,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Jelszó sikeresen megváltoztatva",
|
||||
"ToastUserPasswordMismatch": "A jelszavak nem egyeznek",
|
||||
"ToastUserPasswordMustChange": "Az új jelszó nem egyezik a régi jelszóval",
|
||||
"ToastUserRootRequireName": "Egy root felhasználónevet kell megadnia"
|
||||
"ToastUserRootRequireName": "Egy root felhasználónevet kell megadnia",
|
||||
"TooltipAddChapters": "Fejezet(ek) hozzáadása",
|
||||
"TooltipAddOneSecond": "1 másodperc hozzáadása",
|
||||
"TooltipAdjustChapterStart": "Kattintson a kezdési idő beállításához",
|
||||
"TooltipLockAllChapters": "Az összes fejezet zárolása",
|
||||
"TooltipLockChapter": "Fejezet zárolása (Shift+kattintás a tartományhoz)",
|
||||
"TooltipSubtractOneSecond": "1 másodperc levonása",
|
||||
"TooltipUnlockAllChapters": "Az összes fejezet feloldása",
|
||||
"TooltipUnlockChapter": "Fejezet feloldása (Shift+kattintás a tartományhoz)"
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
+65
-9
@@ -1,18 +1,19 @@
|
||||
{
|
||||
"ButtonAdd": "Aggiungi",
|
||||
"ButtonAddApiKey": "Aggiungi la chiave API",
|
||||
"ButtonAddChapters": "Aggiungi Capitoli",
|
||||
"ButtonAddDevice": "Aggiungi Dispositivo",
|
||||
"ButtonAddLibrary": "Aggiungi Libreria",
|
||||
"ButtonAddPodcasts": "Aggiungi Podcast",
|
||||
"ButtonAddUser": "Aggiungi User",
|
||||
"ButtonAddUser": "Aggiungi Utente",
|
||||
"ButtonAddYourFirstLibrary": "Aggiungi la tua prima libreria",
|
||||
"ButtonApply": "Applica",
|
||||
"ButtonApplyChapters": "Applica",
|
||||
"ButtonApplyChapters": "Applica Capitoli",
|
||||
"ButtonAuthors": "Autori",
|
||||
"ButtonBack": "Indietro",
|
||||
"ButtonBatchEditPopulateFromExisting": "Popola da esistente",
|
||||
"ButtonBatchEditPopulateMapDetails": "Inserisci i dettagli della mappa",
|
||||
"ButtonBrowseForFolder": "Per Cartella",
|
||||
"ButtonBrowseForFolder": "Sfoglia per Cartella",
|
||||
"ButtonCancel": "Annulla",
|
||||
"ButtonCancelEncode": "Ferma la codifica",
|
||||
"ButtonChangeRootPassword": "Cambia la Password di root",
|
||||
@@ -20,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Seleziona la Cartella",
|
||||
"ButtonChooseFiles": "Seleziona i File",
|
||||
"ButtonClearFilter": "Elimina filtri",
|
||||
"ButtonClose": "Chiudi",
|
||||
"ButtonCloseFeed": "Chiudi flusso",
|
||||
"ButtonCloseSession": "Chiudi la sessione aperta",
|
||||
"ButtonCollections": "Raccolte",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Account",
|
||||
"HeaderAddCustomMetadataProvider": "Aggiungi fornitori di metadati personalizzati",
|
||||
"HeaderAdvanced": "Avanzate",
|
||||
"HeaderApiKeys": "Le chiavi API",
|
||||
"HeaderAppriseNotificationSettings": "Apprendi le impostazioni di Notifica",
|
||||
"HeaderAudioTracks": "Tracce audio",
|
||||
"HeaderAudiobookTools": "Strumenti di gestione file audiolibri",
|
||||
"HeaderAuthentication": "Authenticazione",
|
||||
"HeaderBackups": "Backup",
|
||||
"HeaderBulkChapterModal": "Aggiungere più capitoli",
|
||||
"HeaderChangePassword": "Cambia la password",
|
||||
"HeaderChapters": "Capitoli",
|
||||
"HeaderChooseAFolder": "Seleziona la cartella",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Priorità ordine Metadata",
|
||||
"HeaderMetadataToEmbed": "Metadata da incorporare",
|
||||
"HeaderNewAccount": "Nuovo Account",
|
||||
"HeaderNewApiKey": "Nuova chiave API",
|
||||
"HeaderNewLibrary": "Nuova Libreria",
|
||||
"HeaderNotificationCreate": "Crea una notifica",
|
||||
"HeaderNotificationUpdate": "Aggiornamento della notifica",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Opzioni Sperimentali",
|
||||
"HeaderSettingsGeneral": "Generale",
|
||||
"HeaderSettingsScanner": "Scanner",
|
||||
"HeaderSettingsSecurity": "Sicurezza",
|
||||
"HeaderSettingsWebClient": "Web Client",
|
||||
"HeaderSleepTimer": "Sveglia",
|
||||
"HeaderStatsLargestItems": "File pesanti",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Indice",
|
||||
"HeaderTools": "Strumenti",
|
||||
"HeaderUpdateAccount": "Aggiorna Account",
|
||||
"HeaderUpdateApiKey": "Aggiornamento chiave API",
|
||||
"HeaderUpdateAuthor": "Aggiorna Autore",
|
||||
"HeaderUpdateDetails": "Aggiorna Dettagli",
|
||||
"HeaderUpdateLibrary": "Aggiorna Libreria",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Tutti gli Utenti Esclusi gli ospiti",
|
||||
"LabelAllUsersIncludingGuests": "Tutti gli Utenti Inclusi gli ospiti",
|
||||
"LabelAlreadyInYourLibrary": "Già esistente nella libreria",
|
||||
"LabelApiKeyCreated": "API Key \"{0}\" creato con successo.",
|
||||
"LabelApiKeyCreatedDescription": "Assicurarsi di copiare la chiave API ora poiché non si potrà rivederla.",
|
||||
"LabelApiKeyUser": "Agisce per conto dell'utente",
|
||||
"LabelApiKeyUserDescription": "Questa chiave API avrà le stesse autorizzazioni dell'utente per conto del quale agisce. Apparirà nei registri come se l'utente stesse facendo la richiesta.",
|
||||
"LabelApiToken": "API Token",
|
||||
"LabelAppend": "Appese",
|
||||
"LabelAudioBitrate": "Audio Bitrate (es. 128k)",
|
||||
@@ -264,7 +275,7 @@
|
||||
"LabelBonus": "Bonus",
|
||||
"LabelBooks": "Libri",
|
||||
"LabelButtonText": "Buttone Testo",
|
||||
"LabelByAuthor": "da {0}",
|
||||
"LabelByAuthor": "di {0}",
|
||||
"LabelChangePassword": "Cambia Password",
|
||||
"LabelChannels": "Canali",
|
||||
"LabelChapterCount": "{0} Capitoli",
|
||||
@@ -284,6 +295,7 @@
|
||||
"LabelContinueListening": "Continua l'ascolto",
|
||||
"LabelContinueReading": "Continua la lettura",
|
||||
"LabelContinueSeries": "Continua serie",
|
||||
"LabelCorsAllowed": "CORS consentiti Origine",
|
||||
"LabelCover": "Copertina",
|
||||
"LabelCoverImageURL": "Indirizzo della cover URL",
|
||||
"LabelCoverProvider": "Cover Sorgente",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Elimina dal file system (togli la spunta per eliminarla solo dal DB)",
|
||||
"LabelDescription": "Descrizione",
|
||||
"LabelDeselectAll": "Deseleziona Tutto",
|
||||
"LabelDetectedPattern": "Trovato pattern:",
|
||||
"LabelDevice": "Dispositivo",
|
||||
"LabelDeviceInfo": "Info dispositivo",
|
||||
"LabelDeviceIsAvailableTo": "Il dispositivo e disponibile su…",
|
||||
@@ -346,6 +359,10 @@
|
||||
"LabelExample": "Esempio",
|
||||
"LabelExpandSeries": "Espandi Serie",
|
||||
"LabelExpandSubSeries": "Espandi Sub Serie",
|
||||
"LabelExpired": "Scadenza",
|
||||
"LabelExpiresAt": "Scade a",
|
||||
"LabelExpiresInSeconds": "Scade in (secondi)",
|
||||
"LabelExpiresNever": "Mai",
|
||||
"LabelExplicit": "Esplicito",
|
||||
"LabelExplicitChecked": "Esplicito (selezionato)",
|
||||
"LabelExplicitUnchecked": "Non Esplicito (selezionato)",
|
||||
@@ -361,11 +378,12 @@
|
||||
"LabelFilterByUser": "Filtro per Utente",
|
||||
"LabelFindEpisodes": "Trova Episodi",
|
||||
"LabelFinished": "Finita",
|
||||
"LabelFinishedDate": "Finito {0}",
|
||||
"LabelFolder": "Cartella",
|
||||
"LabelFolders": "Cartelle",
|
||||
"LabelFontBold": "Grassetto",
|
||||
"LabelFontBoldness": "Grassetto",
|
||||
"LabelFontFamily": "Famiglia di caratteri",
|
||||
"LabelFontFamily": "Famiglia caratteri",
|
||||
"LabelFontItalic": "Corsivo",
|
||||
"LabelFontScale": "Dimensione font",
|
||||
"LabelFontStrikethrough": "Barrato",
|
||||
@@ -405,6 +423,7 @@
|
||||
"LabelLanguages": "Lingua",
|
||||
"LabelLastBookAdded": "Ultimo Libro Aggiunto",
|
||||
"LabelLastBookUpdated": "Ultimo Libro Aggiornato",
|
||||
"LabelLastProgressDate": "Ultimi progressi: Si'",
|
||||
"LabelLastSeen": "Ultimi Visti",
|
||||
"LabelLastTime": "Ultima Volta",
|
||||
"LabelLastUpdate": "Ultimo Aggiornamento",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Nessuno {0}",
|
||||
"LabelLibraryItem": "Elementi della biblioteca",
|
||||
"LabelLibraryName": "Nome della biblioteca",
|
||||
"LabelLibrarySortByProgress": "Progressi: Ultimi aggiornamenti",
|
||||
"LabelLibrarySortByProgressFinished": "Progressi: Completati",
|
||||
"LabelLibrarySortByProgressStarted": "Progressi: Iniziati",
|
||||
"LabelLimit": "Limiti",
|
||||
"LabelLineSpacing": "Interlinea",
|
||||
"LabelListenAgain": "Ascolta ancora",
|
||||
@@ -425,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Allarme",
|
||||
"LabelLookForNewEpisodesAfterDate": "Cerca nuovi episodi dopo questa data",
|
||||
"LabelLowestPriority": "Priorità Minima",
|
||||
"LabelMatchConfidence": "Fiducia",
|
||||
"LabelMatchExistingUsersBy": "Abbina gli utenti esistenti per",
|
||||
"LabelMatchExistingUsersByDescription": "Utilizzato per connettere gli utenti esistenti. Una volta connessi, gli utenti verranno abbinati a un ID univoco dal tuo provider SSO",
|
||||
"LabelMaxEpisodesToDownload": "Max # di episodi da scaricare. Usa 0 per illimitati.",
|
||||
@@ -454,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Nuovi autori",
|
||||
"LabelNewestEpisodes": "Nuovi episodi",
|
||||
"LabelNextBackupDate": "Data Prossimo Backup",
|
||||
"LabelNextChapters": "I prossimi capitoli saranno:",
|
||||
"LabelNextScheduledRun": "Data prossima esecuzione schedulata",
|
||||
"LabelNoApiKeys": "Nessuna chiave API",
|
||||
"LabelNoCustomMetadataProviders": "Nessun provider di metadati personalizzato",
|
||||
"LabelNoEpisodesSelected": "Nessun Episodio Selezionato",
|
||||
"LabelNotFinished": "Da completare",
|
||||
@@ -470,6 +495,7 @@
|
||||
"LabelNotificationsMaxQueueSize": "Coda Massima di notifiche eventi",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Le notifiche sono limitate per 1 al secondo, per evitare lo spamming le notifiche verrano ignorare se superano la coda.",
|
||||
"LabelNumberOfBooks": "Numero di libri",
|
||||
"LabelNumberOfChapters": "Numero di capitoli:",
|
||||
"LabelNumberOfEpisodes": "Numero di episodi",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Nome dell'attestazione OpenID che contiene autorizzazioni avanzate per le azioni dell'utente all'interno dell'applicazione che verranno applicate ai ruoli non amministratori (<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\".",
|
||||
@@ -544,6 +570,7 @@
|
||||
"LabelSelectAll": "Seleziona tutto",
|
||||
"LabelSelectAllEpisodes": "Seleziona tutti gli Episodi",
|
||||
"LabelSelectEpisodesShowing": "Selezionati {0} episodi da visualizzare",
|
||||
"LabelSelectUser": "Seleziona l'utente",
|
||||
"LabelSelectUsers": "Selezione Utenti",
|
||||
"LabelSendEbookToDevice": "Invia il libro a...",
|
||||
"LabelSequence": "Sequenza",
|
||||
@@ -561,8 +588,8 @@
|
||||
"LabelSettingsBookshelfViewHelp": "Design con scaffali in legno",
|
||||
"LabelSettingsChromecastSupport": "Supporto a Chromecast",
|
||||
"LabelSettingsDateFormat": "Formato Data",
|
||||
"LabelSettingsEnableWatcher": "Scansiona le librerie Automaticamente per trovare modifiche",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Scansiona la libreria Automaticamente per trovare modifiche",
|
||||
"LabelSettingsEnableWatcher": "Controlla automaticamente le modifiche alle librerie",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Controlla automaticamente le modifiche alle librerie",
|
||||
"LabelSettingsEnableWatcherHelp": "Abilita l'aggiunta/aggiornamento automatico degli elementi quando vengono rilevate modifiche ai file. *Richiede il riavvio del Server",
|
||||
"LabelSettingsEpubsAllowScriptedContent": "Consenti contenuti con script negli epub",
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Consenti ai file epub di eseguire script. Si consiglia di mantenere questa impostazione disabilitata a meno che non si ritenga attendibile l'origine dei file epub.",
|
||||
@@ -611,6 +638,7 @@
|
||||
"LabelStartTime": "Tempo di inizio",
|
||||
"LabelStarted": "Iniziato",
|
||||
"LabelStartedAt": "Iniziato al",
|
||||
"LabelStartedDate": "Iniziati {0}",
|
||||
"LabelStatsAudioTracks": "Tracce Audio",
|
||||
"LabelStatsAuthors": "Autori",
|
||||
"LabelStatsBestDay": "Giorno migliore",
|
||||
@@ -640,6 +668,7 @@
|
||||
"LabelTheme": "Tema",
|
||||
"LabelThemeDark": "Scuro",
|
||||
"LabelThemeLight": "Chiaro",
|
||||
"LabelThemeSepia": "Seppia",
|
||||
"LabelTimeBase": "Tempo base",
|
||||
"LabelTimeDurationXHours": "{0} Ore",
|
||||
"LabelTimeDurationXMinutes": "{0} minuti",
|
||||
@@ -708,7 +737,9 @@
|
||||
"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>.",
|
||||
"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.",
|
||||
"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.",
|
||||
"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.",
|
||||
@@ -722,6 +753,7 @@
|
||||
"MessageBookshelfNoResultsForFilter": "Nessun risultato per il filtro \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Nessun risultato per la query",
|
||||
"MessageBookshelfNoSeries": "Non c'è nessuna Serie",
|
||||
"MessageBulkChapterPattern": "Quanti capitoli vuoi aggiungere con questo motivo di numerazione?",
|
||||
"MessageChapterEndIsAfter": "La fine del capitolo è dopo la fine del tuo audiolibro",
|
||||
"MessageChapterErrorFirstNotZero": "Il primo capitolo deve iniziare da 0",
|
||||
"MessageChapterErrorStartGteDuration": "L'ora di inizio non valida deve essere inferiore alla durata dell'audiolibro",
|
||||
@@ -730,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Capitoli non trovati",
|
||||
"MessageCheckingCron": "Controllo cron...",
|
||||
"MessageConfirmCloseFeed": "Sei sicuro di voler chiudere questo feed?",
|
||||
"MessageConfirmDeleteApiKey": "Sei sicuro di voler eliminare la chiave API \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Sei sicuro di voler eliminare il backup {0}?",
|
||||
"MessageConfirmDeleteDevice": "Sei sicuro/sicura di voler eliminare il lettore di libri {0}?",
|
||||
"MessageConfirmDeleteFile": "Questo eliminerà il file dal tuo file system. Sei sicuro?",
|
||||
@@ -757,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Sei sicuro di voler rimuovere l'autore? \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Sei sicuro di voler rimuovere la Raccolta \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Sei sicuro di voler rimuovere l'episodio \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Nota: Questo non cancella il file audio a meno che non toggling \"Hard delete file\"",
|
||||
"MessageConfirmRemoveEpisodes": "Sei sicuro di voler rimuovere {0} episodi?",
|
||||
"MessageConfirmRemoveListeningSessions": "Sei sicuro di voler rimuovere {0} sessioni di Ascolto?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Vuoi davvero rimuovere tutti i metadati.{0} file nelle cartelle degli elementi della tua libreria?",
|
||||
@@ -782,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "l’URL del flusso sarà {0}",
|
||||
"MessageFetching": "Recupero info…",
|
||||
"MessageForceReScanDescription": "eseguirà nuovamente la scansione di tutti i file come una nuova scansione. I tag ID3 dei file audio, i file OPF e i file di testo verranno scansionati come nuovi.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} in ascolto</strong> su {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Nessuna sessione di ascolto su {0}",
|
||||
"MessageImportantNotice": "Avviso Importante!",
|
||||
"MessageInsertChapterBelow": "Inserisci capitolo sotto",
|
||||
"MessageInvalidAsin": "ASIN non Valido",
|
||||
@@ -852,7 +888,7 @@
|
||||
"MessageResetChaptersConfirm": "Sei sicuro di voler reimpostare i capitoli e annullare le modifiche ?",
|
||||
"MessageRestoreBackupConfirm": "Sei sicuro di voler ripristinare il backup creato su",
|
||||
"MessageRestoreBackupWarning": "Il ripristino di un backup sovrascriverà l'intero database situato in /config e sovrascrive le immagini in /metadata/items & /metadata/authors.<br /><br />I backup non modificano alcun file nelle cartelle della libreria. Se hai abilitato le impostazioni del server per archiviare copertine e metadati nelle cartelle della libreria, questi non vengono sottoposti a backup o sovrascritti.<br /><br />Tutti i client che utilizzano il tuo server verranno aggiornati automaticamente.",
|
||||
"MessageScheduleLibraryScanNote": "Per la maggior parte degli utenti, si consiglia di lasciare questa funzionalità disabilitata e di mantenere abilitata l'impostazione di folder watcher. Il folder watcher rileverà automaticamente le modifiche nelle cartelle della libreria. Il folder watcher non funziona per ogni file system (come NFS), quindi è possibile utilizzare le scansioni pianificate della libreria.",
|
||||
"MessageScheduleLibraryScanNote": "Per la maggior parte degli utenti, si consiglia di lasciare questa funzione disabilitata e mantenere abilitata l'impostazione “Controlla automaticamente le modifiche nella libreria”: in questo modo verranno rilevate automaticamente le modifiche nelle cartelle della libreria. Abilita questa funzione se “Controlla automaticamente le modifiche nella libreria” non funziona con il tuo file system (come NFS).",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Esegui ogni {0} alle {1}",
|
||||
"MessageSearchResultsFor": "cerca risultati per",
|
||||
"MessageSelected": "{0} selezionati",
|
||||
@@ -921,6 +957,7 @@
|
||||
"NotificationOnRSSFeedDisabledDescription": "Attivato quando i download automatici degli episodi vengono disabilitati a causa di troppi tentativi falliti",
|
||||
"NotificationOnRSSFeedFailedDescription": "Attivato quando la richiesta del feed RSS per il download automatico di un episodio fallisce",
|
||||
"NotificationOnTestDescription": "test il sistema di notifica",
|
||||
"PlaceholderBulkChapterInput": "Inserire il titolo del capitolo o utilizzate la numerazione (es. 'Episodio 1', 'Capitolo 10', '1.')",
|
||||
"PlaceholderNewCollection": "Nome Nuova Raccolta",
|
||||
"PlaceholderNewFolderPath": "Nuovo Percorso Cartella",
|
||||
"PlaceholderNewPlaylist": "Nome nuova playlist",
|
||||
@@ -974,8 +1011,12 @@
|
||||
"ToastBookmarkCreateFailed": "Creazione segnalibro fallita",
|
||||
"ToastBookmarkCreateSuccess": "Segnalibro creato",
|
||||
"ToastBookmarkRemoveSuccess": "Segnalibro Rimosso",
|
||||
"ToastBulkChapterInvalidCount": "Inserire un numero tra 1 e 150",
|
||||
"ToastCachePurgeFailed": "Impossibile eliminare la cache",
|
||||
"ToastCachePurgeSuccess": "Cache eliminata correttamente",
|
||||
"ToastChapterLocked": "Il capitolo è bloccato.",
|
||||
"ToastChapterStartTimeAdjusted": "Tempo di inizio del capitolo modificato di {0} secondi",
|
||||
"ToastChaptersAllLocked": "Tutti i capitoli sono bloccati. Sblocca alcuni capitoli per modificarne i tempi.",
|
||||
"ToastChaptersHaveErrors": "I capitoli contengono errori",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Quantità di spostamento non valida. L'orario di inizio dell'ultimo capitolo si estenderebbe oltre la durata di questo audiolibro.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Quantità di spostamento non valida. Il primo capitolo avrebbe una lunghezza pari a zero o negativa e verrebbe sovrascritto dal secondo capitolo. Aumentare la durata iniziale del secondo capitolo.",
|
||||
@@ -985,6 +1026,8 @@
|
||||
"ToastCollectionItemsAddFailed": "l'aggiunta dell'elemento(i) alla raccolta non è riuscito",
|
||||
"ToastCollectionRemoveSuccess": "Collezione rimossa",
|
||||
"ToastCollectionUpdateSuccess": "Raccolta aggiornata",
|
||||
"ToastConnectionNotAvailable": "Connessione non disponibile. Provare più tardi",
|
||||
"ToastCoverSearchFailed": "Ricerca Cover fallita",
|
||||
"ToastCoverUpdateFailed": "Aggiornamento cover fallito",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Data e ora non sono valide o incomplete",
|
||||
"ToastDeleteFileFailed": "Impossibile eliminare il file",
|
||||
@@ -1000,6 +1043,8 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Coda di download degli episodi cancellata",
|
||||
"ToastEpisodeUpdateSuccess": "{0} episodi aggiornati",
|
||||
"ToastErrorCannotShare": "Impossibile condividere in modo nativo su questo dispositivo",
|
||||
"ToastFailedToCreate": "Non creato",
|
||||
"ToastFailedToDelete": "Non eliminata",
|
||||
"ToastFailedToLoadData": "Impossibile caricare i dati",
|
||||
"ToastFailedToMatch": "Impossibile abbinare",
|
||||
"ToastFailedToShare": "Impossibile condividere",
|
||||
@@ -1007,6 +1052,7 @@
|
||||
"ToastInvalidImageUrl": "URL dell'immagine non valido",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Numero massimo di episodi non valido da scaricare",
|
||||
"ToastInvalidUrl": "URL non valido",
|
||||
"ToastInvalidUrls": "Uno o più URL sono invalidi",
|
||||
"ToastItemCoverUpdateSuccess": "Cover aggiornata",
|
||||
"ToastItemDeletedFailed": "Impossibile eliminare l'elemento",
|
||||
"ToastItemDeletedSuccess": "Elemento eliminato",
|
||||
@@ -1031,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Deve avere almeno un percorso",
|
||||
"ToastNameEmailRequired": "Nome ed email sono obbligatori",
|
||||
"ToastNameRequired": "Il nome è obbligatorio",
|
||||
"ToastNewApiKeyUserError": "Deve selezionare un utente",
|
||||
"ToastNewEpisodesFound": "{0} nuovi episodi trovati",
|
||||
"ToastNewUserCreatedFailed": "Impossibile creare l'account: \"{0}\"",
|
||||
"ToastNewUserCreatedSuccess": "Nuovo account creato",
|
||||
@@ -1055,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Playlist Aggiornata",
|
||||
"ToastPodcastCreateFailed": "Errore creazione podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast creato correttamente",
|
||||
"ToastPodcastEpisodeUpdated": "Episodio aggiornato",
|
||||
"ToastPodcastGetFeedFailed": "Impossibile ottenere il feed del podcast",
|
||||
"ToastPodcastNoEpisodesInFeed": "Nessun episodio trovato nel feed RSS",
|
||||
"ToastPodcastNoRssFeed": "Il podcast non ha un feed RSS",
|
||||
@@ -1105,5 +1153,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Password modificata con successo",
|
||||
"ToastUserPasswordMismatch": "Le password non corrispondono",
|
||||
"ToastUserPasswordMustChange": "La nuova password non può corrispondere alla vecchia password",
|
||||
"ToastUserRootRequireName": "È necessario immettere un nome utente root"
|
||||
"ToastUserRootRequireName": "È necessario immettere un nome utente root",
|
||||
"TooltipAddChapters": "Aggiungere capitolo/i",
|
||||
"TooltipAddOneSecond": "Aggiungere 1 secondo",
|
||||
"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)"
|
||||
}
|
||||
|
||||
+253
-3
@@ -1,21 +1,271 @@
|
||||
{
|
||||
"ButtonAdd": "追加",
|
||||
"ButtonAddApiKey": "APIキーの追加",
|
||||
"ButtonAddChapters": "チャプターの追加",
|
||||
"ButtonAddDevice": "端末の追加",
|
||||
"ButtonAddLibrary": "ライブラリーの追加",
|
||||
"ButtonAddPodcasts": "ポッドキャストの追加",
|
||||
"ButtonAddUser": "ユーザーの追加",
|
||||
"ButtonAddYourFirstLibrary": "最初のライブラリーを追加",
|
||||
"ButtonApply": "確定",
|
||||
"ButtonApplyChapters": "チャプターを確定する",
|
||||
"ButtonAuthors": "作者",
|
||||
"ButtonBack": "戻る",
|
||||
"ButtonBatchEditPopulateFromExisting": "既存のものから取り込む",
|
||||
"ButtonBatchEditPopulateMapDetails": "チャプター情報を読み込む",
|
||||
"ButtonBrowseForFolder": "フォルダーを選択する",
|
||||
"ButtonCancel": "キャンセル",
|
||||
"ButtonCancelEncode": "エンコードを取り消す",
|
||||
"ButtonChangeRootPassword": "Rootのパスワードを変更する",
|
||||
"ButtonCheckAndDownloadNewEpisodes": "新しいエピソードを確認してダウンロード",
|
||||
"ButtonChooseAFolder": "フォルダーを選ぶ",
|
||||
"ButtonChooseFiles": "ファイルを選ぶ",
|
||||
"ButtonClearFilter": "絞り込みを解除",
|
||||
"ButtonClose": "閉じる",
|
||||
"ButtonCloseFeed": "フィードを閉じる",
|
||||
"ButtonCloseSession": "開いているセッションを閉じる",
|
||||
"ButtonCollections": "コレクション",
|
||||
"ButtonConfigureScanner": "スキャナーの設定",
|
||||
"ButtonCreate": "作成",
|
||||
"ButtonCreateBackup": "バックアップを作成する",
|
||||
"ButtonDelete": "削除",
|
||||
"ButtonDownloadQueue": "次に再生",
|
||||
"ButtonEdit": "編集",
|
||||
"ButtonEditChapters": "チャプターの編集",
|
||||
"ButtonEditPodcast": "ポッドキャストの編集",
|
||||
"ButtonEnable": "オンにする",
|
||||
"ButtonFireAndFail": "エラーを無視して実行",
|
||||
"ButtonFireOnTest": "テストを実行",
|
||||
"ButtonForceReScan": "強制的に再スキャンする",
|
||||
"ButtonFullPath": "絶対パス",
|
||||
"ButtonHide": "非表示",
|
||||
"ButtonHome": "ホーム",
|
||||
"ButtonIssues": "問題",
|
||||
"ButtonJumpBackward": "巻き戻し",
|
||||
"ButtonJumpForward": "早送り",
|
||||
"ButtonLatest": "最新",
|
||||
"ButtonLibrary": "ライブラリー",
|
||||
"ButtonLogout": "ログアウト",
|
||||
"ButtonLookup": "参照",
|
||||
"ButtonManageTracks": "トラックの管理",
|
||||
"ButtonMapChapterTitles": "チャプターのタイトルを割り当て",
|
||||
"ButtonMatchAllAuthors": "すべての作者と紐付け",
|
||||
"ButtonMatchBooks": "本と紐付け",
|
||||
"ButtonNevermind": "中止",
|
||||
"ButtonNext": "次",
|
||||
"ButtonNextChapter": "次のチャプター",
|
||||
"ButtonNextItemInQueue": "キューの中の次のアイテム",
|
||||
"ButtonOk": "はい",
|
||||
"ButtonPlay": "プレイ",
|
||||
"ButtonOpenFeed": "フィードを開く",
|
||||
"ButtonOpenManager": "管理画面を開く",
|
||||
"ButtonPause": "一時停止",
|
||||
"ButtonPlay": "再生",
|
||||
"ButtonPlayAll": "全て再生",
|
||||
"ButtonPlaying": "プレイ中",
|
||||
"ButtonPlaylists": "プレイリスト",
|
||||
"ButtonPrevious": "先",
|
||||
"ButtonRead": "野村",
|
||||
"ButtonPreviousChapter": "前のチャプター",
|
||||
"ButtonProbeAudioFile": "オーディオファイルを解析",
|
||||
"ButtonPurgeAllCache": "全てのキャッシュを削除",
|
||||
"ButtonPurgeItemsCache": "項目のキャッシュを削除",
|
||||
"ButtonQueueAddItem": "次に再生する",
|
||||
"ButtonQueueRemoveItem": "次に再生から削除",
|
||||
"ButtonQuickEmbed": "クイック埋め込み",
|
||||
"ButtonQuickEmbedMetadata": "メタデータの埋め込み",
|
||||
"ButtonQuickMatch": "クイックマッチ",
|
||||
"ButtonReScan": "再スキャン",
|
||||
"ButtonRead": "読む",
|
||||
"ButtonReadLess": "閉じる",
|
||||
"ButtonReadMore": "もっと見る",
|
||||
"ButtonRefresh": "再読み込み",
|
||||
"ButtonRemove": "削除",
|
||||
"ButtonRemoveAll": "全て削除",
|
||||
"ButtonRemoveAllLibraryItems": "ライブラリーの項目を全て削除",
|
||||
"ButtonRemoveFromContinueListening": "「続きを聴く」から削除",
|
||||
"ButtonRemoveFromContinueReading": "「続きを読む」から削除",
|
||||
"ButtonRemoveSeriesFromContinueSeries": "「シリーズを続く」からシリーズを削除",
|
||||
"ButtonReset": "元に戻す",
|
||||
"ButtonResetToDefault": "デフォルトに戻す",
|
||||
"ButtonRestore": "復元",
|
||||
"ButtonSave": "保存",
|
||||
"ButtonSaveAndClose": "保存して閉じる",
|
||||
"ButtonSaveTracklist": "トラックリストを保存",
|
||||
"ButtonScan": "スキャン",
|
||||
"ButtonScanLibrary": "ライブラリーをスキャン",
|
||||
"ButtonScrollLeft": "左にスクロール",
|
||||
"ButtonScrollRight": "右にスクロール",
|
||||
"ButtonSearch": "検索",
|
||||
"ButtonSelectFolderPath": "保存先フォルダを選択",
|
||||
"ButtonSeries": "シリーズ",
|
||||
"ButtonSetChaptersFromTracks": "トラックからチャプターを設定する",
|
||||
"ButtonShare": "共有",
|
||||
"ButtonShiftTimes": "再生時間の移動",
|
||||
"ButtonShow": "表示",
|
||||
"ButtonStartM4BEncode": "M4Bエンコード開始",
|
||||
"ButtonStartMetadataEmbed": "メタデータ埋め込み開始",
|
||||
"ButtonStats": "統計",
|
||||
"ButtonSubmit": "送信",
|
||||
"ButtonTest": "テスト",
|
||||
"ButtonUnlinkOpenId": "OpenID 連携解除",
|
||||
"ButtonUpload": "アップロード",
|
||||
"ButtonUploadBackup": "バックアップのアップロード",
|
||||
"ButtonUploadCover": "カバー画像をアップロード",
|
||||
"ButtonUploadOPMLFile": "OPMLファイルをアップロード",
|
||||
"ButtonUserDelete": "ユーザーを削除 {0}",
|
||||
"ButtonUserEdit": "ユーザを編集 {0}",
|
||||
"ButtonViewAll": "すべて表示",
|
||||
"ButtonYes": "はい",
|
||||
"ErrorUploadFetchMetadataAPI": "メタデータの取得中にエラーが発生しました",
|
||||
"ErrorUploadFetchMetadataNoResults": "メタデータ取得に失敗しました。タイトルや著者名を更新してください",
|
||||
"ErrorUploadLacksTitle": "タイトルは必須です",
|
||||
"HeaderAccount": "アカウント",
|
||||
"HeaderAddCustomMetadataProvider": "カスタムメタデータプロバイダーを追加",
|
||||
"HeaderAdvanced": "上級者向け",
|
||||
"HeaderApiKeys": "APIキー",
|
||||
"HeaderAppriseNotificationSettings": "Apprise 通知設定",
|
||||
"HeaderAudioTracks": "オーディオトラック",
|
||||
"HeaderAudiobookTools": "オーディオブックのファイル管理ツール",
|
||||
"HeaderAuthentication": "認証",
|
||||
"HeaderBackups": "バックアップ",
|
||||
"HeaderBulkChapterModal": "チャプターをまとめて追加",
|
||||
"HeaderChangePassword": "パスワードを変更",
|
||||
"HeaderChapters": "チャプター",
|
||||
"HeaderChooseAFolder": "フォルダを選択",
|
||||
"HeaderCollection": "コレクション",
|
||||
"HeaderCollectionItems": "コレクションの項目",
|
||||
"HeaderCover": "カバー",
|
||||
"HeaderCurrentDownloads": "現在のダウンロード",
|
||||
"HeaderCustomMessageOnLogin": "ログイン時のカスタムメッセージ",
|
||||
"HeaderCustomMetadataProviders": "カスタムメタデータプロバイダー",
|
||||
"HeaderDetails": "詳細",
|
||||
"HeaderDownloadQueue": "ダウンロード待ち",
|
||||
"HeaderEbookFiles": "電子書籍ファイル",
|
||||
"HeaderEmail": "メール",
|
||||
"HeaderEmailSettings": "メール設定",
|
||||
"HeaderEpisodes": "エピソード",
|
||||
"HeaderEreaderDevices": "電子書籍リーダー端末",
|
||||
"HeaderEreaderSettings": "電子書籍リーダーの設定",
|
||||
"HeaderFiles": "ファイル",
|
||||
"HeaderFindChapters": "チャプターを検索",
|
||||
"HeaderIgnoredFiles": "無視されたファイル",
|
||||
"HeaderItemFiles": "アイテムファイル",
|
||||
"HeaderItemMetadataUtils": "アイテムメタデータユーティリティ",
|
||||
"HeaderLastListeningSession": "直近の再生セッション",
|
||||
"HeaderLatestEpisodes": "最新のエピソード",
|
||||
"HeaderLibraries": "ライブラリー",
|
||||
"HeaderLibraryFiles": "ライブラリファイル",
|
||||
"HeaderLibraryStats": "ライブラリ統計",
|
||||
"HeaderListeningSessions": "再生セッション",
|
||||
"HeaderListeningStats": "再生統計",
|
||||
"HeaderLogin": "ログイン",
|
||||
"HeaderLogs": "ログ",
|
||||
"HeaderManageGenres": "ジャンルを管理",
|
||||
"HeaderManageTags": "タグを管理",
|
||||
"HeaderMapDetails": "マップの詳細",
|
||||
"HeaderMatch": "マッチ",
|
||||
"HeaderMetadataOrderOfPrecedence": "メタデータの優先順",
|
||||
"HeaderMetadataToEmbed": "埋め込むメタデータ",
|
||||
"HeaderNewAccount": "新規アカウント",
|
||||
"HeaderNewApiKey": "新規APIキー",
|
||||
"HeaderNewLibrary": "新規ライブラリー",
|
||||
"HeaderNotificationCreate": "通知を作成",
|
||||
"HeaderNotificationUpdate": "通知を更新",
|
||||
"HeaderNotifications": "通知",
|
||||
"HeaderOpenIDConnectAuthentication": "OpenID Connect 認証",
|
||||
"HeaderOpenRSSFeed": "RSS Feedを開く",
|
||||
"HeaderPlayerSettings": "プレーヤーの設定",
|
||||
"HeaderPlaylist": "プレイリスト",
|
||||
"HeaderPlaylistItems": "プレイリストアイテム",
|
||||
"HeaderRSSFeedGeneral": "RSS 詳細",
|
||||
"HeaderRSSFeedIsOpen": "RSSフィードが開いています",
|
||||
"HeaderSettings": "設定",
|
||||
"HeaderSettingsGeneral": "一般",
|
||||
"HeaderSettingsScanner": "スキャナー",
|
||||
"HeaderSleepTimer": "スリープタイマー",
|
||||
"HeaderStatsMinutesListeningChart": "過去7日間の視聴時間(分)",
|
||||
"HeaderStatsRecentSessions": "最近の再生履歴",
|
||||
"HeaderTableOfContents": "目次",
|
||||
"HeaderYourStats": "再生統計",
|
||||
"LabelAddToPlaylist": "プレイリストの追加",
|
||||
"LabelAddedAt": "追加日時",
|
||||
"LabelAddedDate": "追加日時 {0}",
|
||||
"LabelAll": "すべて",
|
||||
"LabelAuthor": "著者",
|
||||
"LabelAuthorFirstLast": "著者(名 氏)",
|
||||
"LabelAuthorLastFirst": "著者(氏 名)",
|
||||
"LabelAuthors": "著者",
|
||||
"LabelAutoDownloadEpisodes": "エピソードの自動ダウンロード",
|
||||
"LabelBooks": "ほん",
|
||||
"LabelByAuthor": "著 {0}",
|
||||
"LabelChapters": "チャプター",
|
||||
"LabelClosePlayer": "プレイヤーを閉じる",
|
||||
"LabelCollapseSeries": "シリーズを折りたたむ",
|
||||
"LabelComplete": "完了",
|
||||
"LabelContinueListening": "続きから聞く",
|
||||
"LabelContinueReading": "続きを読む",
|
||||
"LabelContinueSeries": "シリーズを続く",
|
||||
"LabelDescription": "説明",
|
||||
"LabelDiscover": "おすすめ",
|
||||
"LabelDownload": "ダウンロード",
|
||||
"LabelDuration": "長さ",
|
||||
"LabelEbook": "Eブック",
|
||||
"LabelEbooks": "Eブック",
|
||||
"LabelEnable": "有効",
|
||||
"LabelEnd": "終了",
|
||||
"LabelEndOfChapter": "チャプターの最後",
|
||||
"LabelEpisode": "エピソード",
|
||||
"LabelEpisodes": "エピソード",
|
||||
"LabelEpisodic": "エピソード",
|
||||
"LabelExplicit": "露骨な表現",
|
||||
"LabelFeedURL": "Feed URL",
|
||||
"LabelFile": "ファイル",
|
||||
"LabelFileBirthtime": "ファイル作成日時",
|
||||
"LabelFileModified": "ファイル更新日時",
|
||||
"LabelFilename": "ファイル名",
|
||||
"LabelFinished": "完了",
|
||||
"LabelFolder": "フォルダ",
|
||||
"LabelFontBoldness": "フォントの太さ",
|
||||
"LabelFontFamily": "フォントファミリー",
|
||||
"LabelFontScale": "フォントサイズ",
|
||||
"LabelGenre": "ジャンル",
|
||||
"LabelGenres": "ジャンル",
|
||||
"LabelHasEbook": "eBookあり",
|
||||
"LabelHasSupplementaryEbook": "付属eBookあり",
|
||||
"LabelHost": "ホスト",
|
||||
"LabelInProgress": "進行中",
|
||||
"LabelIncomplete": "未完了",
|
||||
"LabelLanguage": "言語",
|
||||
"LabelLanguages": "言語",
|
||||
"LabelLayout": "レイアウト",
|
||||
"LabelLayoutSinglePage": "単ページ",
|
||||
"LabelLineSpacing": "行間",
|
||||
"LabelListenAgain": "再度視聴",
|
||||
"LabelMediaType": "メディアの種類",
|
||||
"LabelMoreInfo": "追加情報",
|
||||
"LabelName": "名",
|
||||
"LabelNarrator": "ナレーター",
|
||||
"LabelNarrators": "ナレーター",
|
||||
"LabelNew": "新しい",
|
||||
"LabelNewPassword": "新しいのパスワード",
|
||||
"LabelNewestAuthors": "最新の著者",
|
||||
"LabelNewestEpisodes": "最新エピソード",
|
||||
"LabelPassword": "パスワード",
|
||||
"LabelPath": "パス",
|
||||
"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に保存されますが、この設定をオンにするとライブラリーの項目のフォルダーに保存されます"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Pridėti",
|
||||
"ButtonAddApiKey": "Pridėti API raktą",
|
||||
"ButtonAddChapters": "Pridėti skyrius",
|
||||
"ButtonAddDevice": "Pridėti įrenginį",
|
||||
"ButtonAddLibrary": "Pridėti Biblioteką",
|
||||
@@ -18,6 +19,7 @@
|
||||
"ButtonChooseAFolder": "Pasirinkite aplanką",
|
||||
"ButtonChooseFiles": "Pasirinkite failus",
|
||||
"ButtonClearFilter": "Valyti filtrą",
|
||||
"ButtonClose": "Uždaryti",
|
||||
"ButtonCloseFeed": "Uždaryti srautą",
|
||||
"ButtonCloseSession": "Uždaryti Atidarytą sesiją",
|
||||
"ButtonCollections": "Kolekcijos",
|
||||
@@ -251,7 +253,7 @@
|
||||
"LabelDuration": "Trukmė",
|
||||
"LabelDurationFound": "Rasta trukmė:",
|
||||
"LabelEbook": "Elektroninė knyga",
|
||||
"LabelEbooks": "Elektroninės knygos",
|
||||
"LabelEbooks": "El. knygos",
|
||||
"LabelEdit": "Redaguoti",
|
||||
"LabelEmail": "El. paštas",
|
||||
"LabelEmailSettingsFromAddress": "Siuntėjo adresas",
|
||||
@@ -261,6 +263,7 @@
|
||||
"LabelEmbeddedCover": "Įterptas viršelis",
|
||||
"LabelEnable": "Įjungti",
|
||||
"LabelEnd": "Pabaiga",
|
||||
"LabelEndOfChapter": "Skyriaus pabaiga",
|
||||
"LabelEpisode": "Epizodas",
|
||||
"LabelEpisodeTitle": "Epizodo pavadinimas",
|
||||
"LabelEpisodeType": "Epizodo tipas",
|
||||
@@ -282,8 +285,8 @@
|
||||
"LabelGenre": "Žanras",
|
||||
"LabelGenres": "Žanrai",
|
||||
"LabelHardDeleteFile": "Galutinai ištrinti failą",
|
||||
"LabelHasEbook": "Turi e-knygą",
|
||||
"LabelHasSupplementaryEbook": "Turi papildomą e-knygą",
|
||||
"LabelHasEbook": "Turi el. knygą",
|
||||
"LabelHasSupplementaryEbook": "Turi papildomą el. knygą",
|
||||
"LabelHost": "Serveris",
|
||||
"LabelHour": "Valanda",
|
||||
"LabelIcon": "Piktograma",
|
||||
|
||||
+98
-44
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Toevoegen",
|
||||
"ButtonAddApiKey": "API Key toevoegen",
|
||||
"ButtonAddChapters": "Hoofdstukken toevoegen",
|
||||
"ButtonAddDevice": "Toestel toevoegen",
|
||||
"ButtonAddLibrary": "Bibliotheek toevoegen",
|
||||
@@ -10,7 +11,7 @@
|
||||
"ButtonApplyChapters": "Hoofdstukken toepassen",
|
||||
"ButtonAuthors": "Auteurs",
|
||||
"ButtonBack": "Terug",
|
||||
"ButtonBatchEditPopulateFromExisting": "Vullen vanuit bestaande",
|
||||
"ButtonBatchEditPopulateFromExisting": "Vul in met huidige",
|
||||
"ButtonBatchEditPopulateMapDetails": "Kaartgegevens invullen",
|
||||
"ButtonBrowseForFolder": "Bladeren naar map",
|
||||
"ButtonCancel": "Annuleren",
|
||||
@@ -20,11 +21,12 @@
|
||||
"ButtonChooseAFolder": "Map kiezen",
|
||||
"ButtonChooseFiles": "Bestanden kiezen",
|
||||
"ButtonClearFilter": "Filter verwijderen",
|
||||
"ButtonClose": "Sluiten",
|
||||
"ButtonCloseFeed": "Feed sluiten",
|
||||
"ButtonCloseSession": "Sluit Sessie",
|
||||
"ButtonCollections": "Collecties",
|
||||
"ButtonConfigureScanner": "Configureer scanner",
|
||||
"ButtonCreate": "Creëer",
|
||||
"ButtonCreate": "Aanmaken",
|
||||
"ButtonCreateBackup": "Maak back-up",
|
||||
"ButtonDelete": "Verwijder",
|
||||
"ButtonDownloadQueue": "Wachtrij",
|
||||
@@ -32,8 +34,8 @@
|
||||
"ButtonEditChapters": "Hoofdstukken wijzigen",
|
||||
"ButtonEditPodcast": "Podcast wijzigen",
|
||||
"ButtonEnable": "Aanzetten",
|
||||
"ButtonFireAndFail": "Fire and Fail",
|
||||
"ButtonFireOnTest": "Fire onTest event",
|
||||
"ButtonFireAndFail": "Uitvoeren en falen",
|
||||
"ButtonFireOnTest": "Test-Event uitvoeren",
|
||||
"ButtonForceReScan": "Forceer nieuwe scan",
|
||||
"ButtonFullPath": "Volledig pad",
|
||||
"ButtonHide": "Verberg",
|
||||
@@ -43,9 +45,9 @@
|
||||
"ButtonJumpForward": "Spring vooruit",
|
||||
"ButtonLatest": "Meest recent",
|
||||
"ButtonLibrary": "Bibliotheek",
|
||||
"ButtonLogout": "Log uit",
|
||||
"ButtonLogout": "Uitloggen",
|
||||
"ButtonLookup": "Zoeken",
|
||||
"ButtonManageTracks": "Beheer tracks",
|
||||
"ButtonManageTracks": "Tracks beheren",
|
||||
"ButtonMapChapterTitles": "Hoofdstuktitels mappen",
|
||||
"ButtonMatchAllAuthors": "Alle auteurs matchen",
|
||||
"ButtonMatchBooks": "Alle boeken matchen",
|
||||
@@ -72,7 +74,7 @@
|
||||
"ButtonQuickEmbedMetadata": "Snel Metadata Insluiten",
|
||||
"ButtonQuickMatch": "Snelle match",
|
||||
"ButtonReScan": "Nieuwe scan",
|
||||
"ButtonRead": "Lees",
|
||||
"ButtonRead": "Lezen",
|
||||
"ButtonReadLess": "Lees minder",
|
||||
"ButtonReadMore": "Lees meer",
|
||||
"ButtonRefresh": "Verversen",
|
||||
@@ -107,7 +109,7 @@
|
||||
"ButtonUnlinkOpenId": "OpenID Ontkoppelen",
|
||||
"ButtonUpload": "Upload",
|
||||
"ButtonUploadBackup": "Upload back-up",
|
||||
"ButtonUploadCover": "Upload cover",
|
||||
"ButtonUploadCover": "Omslag uploaden",
|
||||
"ButtonUploadOPMLFile": "Upload OPML-bestand",
|
||||
"ButtonUserDelete": "Verwijder gebruiker {0}",
|
||||
"ButtonUserEdit": "Wijzig gebruiker {0}",
|
||||
@@ -119,11 +121,13 @@
|
||||
"HeaderAccount": "Account",
|
||||
"HeaderAddCustomMetadataProvider": "Aangepaste Metadataprovider Toevoegen",
|
||||
"HeaderAdvanced": "Geavanceerd",
|
||||
"HeaderApiKeys": "API Key",
|
||||
"HeaderAppriseNotificationSettings": "Apprise-notificatie instellingen",
|
||||
"HeaderAudioTracks": "Audiotracks",
|
||||
"HeaderAudiobookTools": "Audioboekbestandbeheer tools",
|
||||
"HeaderAuthentication": "Authenticatie",
|
||||
"HeaderBackups": "Back-ups",
|
||||
"HeaderBulkChapterModal": "Meerdere hoofdstukken toevoegen",
|
||||
"HeaderChangePassword": "Wachtwoord wijzigen",
|
||||
"HeaderChapters": "Hoofdstukken",
|
||||
"HeaderChooseAFolder": "Map kiezen",
|
||||
@@ -162,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Metadata volgorde",
|
||||
"HeaderMetadataToEmbed": "In te sluiten metadata",
|
||||
"HeaderNewAccount": "Nieuwe account",
|
||||
"HeaderNewApiKey": "Nieuwe API Key",
|
||||
"HeaderNewLibrary": "Nieuwe bibliotheek",
|
||||
"HeaderNotificationCreate": "Notificatie Aanmaken",
|
||||
"HeaderNotificationUpdate": "Update Notificatie",
|
||||
@@ -178,7 +183,7 @@
|
||||
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
||||
"HeaderPodcastsToAdd": "Toe te voegen podcasts",
|
||||
"HeaderPresets": "Voorinstellingen",
|
||||
"HeaderPreviewCover": "Preview cover",
|
||||
"HeaderPreviewCover": "Voorbeeld omslag",
|
||||
"HeaderRSSFeedGeneral": "RSS-details",
|
||||
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
||||
"HeaderRSSFeeds": "RSS-feeds",
|
||||
@@ -195,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Experimentele functies",
|
||||
"HeaderSettingsGeneral": "Algemeen",
|
||||
"HeaderSettingsScanner": "Scanner",
|
||||
"HeaderSettingsSecurity": "Beveiliging",
|
||||
"HeaderSettingsWebClient": "Web Client",
|
||||
"HeaderSleepTimer": "Slaaptimer",
|
||||
"HeaderStatsLargestItems": "Grootste items",
|
||||
@@ -206,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Inhoudsopgave",
|
||||
"HeaderTools": "Gereedschap",
|
||||
"HeaderUpdateAccount": "Account bijwerken",
|
||||
"HeaderUpdateApiKey": "API Key updaten",
|
||||
"HeaderUpdateAuthor": "Auteur bijwerken",
|
||||
"HeaderUpdateDetails": "Details bijwerken",
|
||||
"HeaderUpdateLibrary": "Bibliotheek bijwerken",
|
||||
@@ -227,7 +234,7 @@
|
||||
"LabelAddToPlaylist": "Toevoegen aan afspeellijst",
|
||||
"LabelAddToPlaylistBatch": "{0} onderdelen toevoegen aan afspeellijst",
|
||||
"LabelAddedAt": "Toegevoegd op",
|
||||
"LabelAddedDate": "Toegevoegd {0}",
|
||||
"LabelAddedDate": "{0} toegevoegd",
|
||||
"LabelAdminUsersOnly": "Enkel Admin gebruikers",
|
||||
"LabelAll": "Alle",
|
||||
"LabelAllEpisodesDownloaded": "Alle afleveringen gedownload",
|
||||
@@ -235,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Alle gebruikers exclusief gasten",
|
||||
"LabelAllUsersIncludingGuests": "Alle gebruikers inclusief gasten",
|
||||
"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",
|
||||
"LabelAppend": "Achteraan toevoegen",
|
||||
"LabelAudioBitrate": "Audio Bitrate (b.v. 128k)",
|
||||
@@ -284,8 +295,9 @@
|
||||
"LabelContinueListening": "Verder Luisteren",
|
||||
"LabelContinueReading": "Verder lezen",
|
||||
"LabelContinueSeries": "Doorgaan met Serie",
|
||||
"LabelCorsAllowed": "CORS bronnen toestaan",
|
||||
"LabelCover": "Omslag",
|
||||
"LabelCoverImageURL": "Coverafbeelding URL",
|
||||
"LabelCoverImageURL": "Omslagafbeelding-URL",
|
||||
"LabelCoverProvider": "Omslag bron",
|
||||
"LabelCreatedAt": "Gecreëerd op",
|
||||
"LabelCronExpression": "Cron-uitdrukking",
|
||||
@@ -297,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Verwijderen uit bestandssysteem (uncheck om alleen uit database te verwijderen)",
|
||||
"LabelDescription": "Beschrijving",
|
||||
"LabelDeselectAll": "Deselecteer alle",
|
||||
"LabelDetectedPattern": "Gedetecteerd patroon:",
|
||||
"LabelDevice": "Apparaat",
|
||||
"LabelDeviceInfo": "Apparaat info",
|
||||
"LabelDeviceIsAvailableTo": "Apparaat is beschikbaar voor...",
|
||||
@@ -312,7 +325,7 @@
|
||||
"LabelDurationComparisonLonger": "({0} langer)",
|
||||
"LabelDurationComparisonShorter": "({0} korter)",
|
||||
"LabelDurationFound": "Gevonden duur:",
|
||||
"LabelEbook": "Ebook",
|
||||
"LabelEbook": "E-boek",
|
||||
"LabelEbooks": "Eboeken",
|
||||
"LabelEdit": "Wijzig",
|
||||
"LabelEmail": "Email",
|
||||
@@ -322,7 +335,7 @@
|
||||
"LabelEmailSettingsSecure": "Veilig",
|
||||
"LabelEmailSettingsSecureHelp": "Als 'waar', dan gebruikt de verbinding TLS om met de server te verbinden. Als 'onwaar', dan wordt TLS gebruikt als de server de STARTTLS-extensie ondersteunt. In de meeste gevallen kies je voor 'waar' verbindt met poort 465. Voo poort 587 of 25, laat op 'onwaar'. (van nodemailer.com/smtp/#authentication)",
|
||||
"LabelEmailSettingsTestAddress": "Test-adres",
|
||||
"LabelEmbeddedCover": "Ingesloten cover",
|
||||
"LabelEmbeddedCover": "Omslag in bestand",
|
||||
"LabelEnable": "Inschakelen",
|
||||
"LabelEncodingBackupLocation": "Er wordt een back-up van uw originele audiobestanden opgeslagen in:",
|
||||
"LabelEncodingChaptersNotEmbedded": "Hoofdstukken zijn niet ingesloten in audioboeken met meerdere sporen.",
|
||||
@@ -331,7 +344,7 @@
|
||||
"LabelEncodingInfoEmbedded": "Metagegevens worden ingesloten in de audiotracks in uw audioboekmap.",
|
||||
"LabelEncodingStartedNavigation": "Eenmaal de taak is gestart kan u weg navigeren van deze pagina.",
|
||||
"LabelEncodingTimeWarning": "Encoding kan tot 30 minuten duren.",
|
||||
"LabelEncodingWarningAdvancedSettings": "Waarschuwing: update deze instellingen niet tenzij u bekend bent met de coderingsopties van ffmpeg.",
|
||||
"LabelEncodingWarningAdvancedSettings": "Waarschuwing: pas deze instellingen niet aan tenzij u bekend bent met de coderingsopties van ffmpeg.",
|
||||
"LabelEncodingWatcherDisabled": "Als u de watcher hebt uitgeschakeld, moet u het audioboek daarna opnieuw scannen.",
|
||||
"LabelEnd": "Einde",
|
||||
"LabelEndOfChapter": "Einde van het Hoofdstuk",
|
||||
@@ -346,6 +359,10 @@
|
||||
"LabelExample": "Voorbeeld",
|
||||
"LabelExpandSeries": "Serie Uitvouwen",
|
||||
"LabelExpandSubSeries": "Subserie Uitvouwen",
|
||||
"LabelExpired": "Verlopen",
|
||||
"LabelExpiresAt": "Loopt af op",
|
||||
"LabelExpiresInSeconds": "Loopt af in (seconds) seconden",
|
||||
"LabelExpiresNever": "Nooit",
|
||||
"LabelExplicit": "Expliciet",
|
||||
"LabelExplicitChecked": "Expliciet (gechecked)",
|
||||
"LabelExplicitUnchecked": "Niet Expliciet (niet gechecked)",
|
||||
@@ -361,10 +378,11 @@
|
||||
"LabelFilterByUser": "Filter op gebruiker",
|
||||
"LabelFindEpisodes": "Zoek afleveringen",
|
||||
"LabelFinished": "Voltooid",
|
||||
"LabelFinishedDate": "Voltooid {0}",
|
||||
"LabelFolder": "Map",
|
||||
"LabelFolders": "Mappen",
|
||||
"LabelFontBold": "Vetgedrukt",
|
||||
"LabelFontBoldness": "Font Boldness",
|
||||
"LabelFontBoldness": "Lettertype Dikte",
|
||||
"LabelFontFamily": "Lettertypefamilie",
|
||||
"LabelFontItalic": "Cursief",
|
||||
"LabelFontScale": "Lettertype schaal",
|
||||
@@ -372,8 +390,8 @@
|
||||
"LabelFormat": "Formaat",
|
||||
"LabelFull": "Vol",
|
||||
"LabelGenre": "Genre",
|
||||
"LabelGenres": "Genres",
|
||||
"LabelHardDeleteFile": "Hard-delete bestand",
|
||||
"LabelGenres": "Categorieën",
|
||||
"LabelHardDeleteFile": "Bestand permanent verwijderen",
|
||||
"LabelHasEbook": "Heeft Ebook",
|
||||
"LabelHasSupplementaryEbook": "Heeft aanvullend Ebook",
|
||||
"LabelHideSubtitles": "Ondertitels Verstoppen",
|
||||
@@ -405,9 +423,10 @@
|
||||
"LabelLanguages": "Talen",
|
||||
"LabelLastBookAdded": "Laatst toegevoegde boek",
|
||||
"LabelLastBookUpdated": "Laatst bijgewerkte boek",
|
||||
"LabelLastProgressDate": "Laatste vooruitgang: {0}",
|
||||
"LabelLastSeen": "Laatst gezien",
|
||||
"LabelLastTime": "Laatste keer",
|
||||
"LabelLastUpdate": "Laatste update",
|
||||
"LabelLastUpdate": "Laatste wijziging",
|
||||
"LabelLayout": "Layout",
|
||||
"LabelLayoutSinglePage": "Enkele pagina",
|
||||
"LabelLayoutSplitPage": "Gesplitste pagina",
|
||||
@@ -417,6 +436,9 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Nee {0}",
|
||||
"LabelLibraryItem": "Bibliotheekonderdeel",
|
||||
"LabelLibraryName": "Bibliotheeknaam",
|
||||
"LabelLibrarySortByProgress": "Voortuigang geüpdatet",
|
||||
"LabelLibrarySortByProgressFinished": "Datum voltooid",
|
||||
"LabelLibrarySortByProgressStarted": "Datum gestart",
|
||||
"LabelLimit": "Limiet",
|
||||
"LabelLineSpacing": "Regelruimte",
|
||||
"LabelListenAgain": "Opnieuw Beluisteren",
|
||||
@@ -425,6 +447,7 @@
|
||||
"LabelLogLevelWarn": "Waarschuwing",
|
||||
"LabelLookForNewEpisodesAfterDate": "Zoek naar nieuwe afleveringen na deze datum",
|
||||
"LabelLowestPriority": "Laagste Prioriteit",
|
||||
"LabelMatchConfidence": "Vertrouwen",
|
||||
"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",
|
||||
"LabelMaxEpisodesToDownload": "Maximale # afleveringen om te downloaden. Gebruik 0 voor ongelimiteerd.",
|
||||
@@ -454,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Nieuwste Auteurs",
|
||||
"LabelNewestEpisodes": "Nieuwste Afleveringen",
|
||||
"LabelNextBackupDate": "Volgende back-up datum",
|
||||
"LabelNextChapters": "Volgende hoofdstukken zijn:",
|
||||
"LabelNextScheduledRun": "Volgende geplande run",
|
||||
"LabelNoApiKeys": "Geen API keys",
|
||||
"LabelNoCustomMetadataProviders": "Geen custom metadata bronnen",
|
||||
"LabelNoEpisodesSelected": "Geen afleveringen geselecteerd",
|
||||
"LabelNotFinished": "Niet Voltooid",
|
||||
@@ -470,6 +495,7 @@
|
||||
"LabelNotificationsMaxQueueSize": "Max rijgrootte voor notificatie gebeurtenissen",
|
||||
"LabelNotificationsMaxQueueSizeHelp": "Gebeurtenissen zijn beperkt tot 1 aftrap per seconde. Gebeurtenissen zullen genegeerd worden als de rij aan de maximale grootte zit. Dit voorkomt notificatie-spamming.",
|
||||
"LabelNumberOfBooks": "Aantal Boeken",
|
||||
"LabelNumberOfChapters": "Aantal hoofdstukken:",
|
||||
"LabelNumberOfEpisodes": "# Afleveringen",
|
||||
"LabelOpenIDAdvancedPermsClaimDescription": "Naam van de OpenID-claim die geavanceerde machtigingen bevat voor gebruikersacties binnen de applicatie die van toepassing zijn op niet-beheerdersrollen (<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.",
|
||||
@@ -514,7 +540,7 @@
|
||||
"LabelPublishers": "Uitgevers",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Aangepast e-mailadres eigenaar",
|
||||
"LabelRSSFeedCustomOwnerName": "Aangepaste naam eigenaar",
|
||||
"LabelRSSFeedOpen": "RSS Feed Open",
|
||||
"LabelRSSFeedOpen": "RSS Feed open",
|
||||
"LabelRSSFeedPreventIndexing": "Voorkom indexering",
|
||||
"LabelRSSFeedSlug": "RSS-feed slug",
|
||||
"LabelRSSFeedURL": "RSS-feed URL",
|
||||
@@ -532,7 +558,7 @@
|
||||
"LabelRemoveAllMetadataAbs": "Verwijder alle metadata.abs bestanden",
|
||||
"LabelRemoveAllMetadataJson": "Verwijder alle metadata.json bestanden",
|
||||
"LabelRemoveAudibleBranding": "Verwijder Audible intro en outro uit hoofdstukken",
|
||||
"LabelRemoveCover": "Verwijder cover",
|
||||
"LabelRemoveCover": "Omslag verwijderen",
|
||||
"LabelRemoveMetadataFile": "Verwijder metadata bestanden in bibliotheek item folders",
|
||||
"LabelRemoveMetadataFileHelp": "Verwijder alle metadata.json en metadata.abs bestanden in uw {0} folders.",
|
||||
"LabelRowsPerPage": "Rijen per pagina",
|
||||
@@ -544,6 +570,7 @@
|
||||
"LabelSelectAll": "Alles selecteren",
|
||||
"LabelSelectAllEpisodes": "Selecteer alle afleveringen",
|
||||
"LabelSelectEpisodesShowing": "Selecteer {0} afleveringen laten zien",
|
||||
"LabelSelectUser": "Gebruiker kiezen",
|
||||
"LabelSelectUsers": "Selecteer gebruikers",
|
||||
"LabelSendEbookToDevice": "Stuur ebook naar...",
|
||||
"LabelSequence": "Sequentie",
|
||||
@@ -560,7 +587,7 @@
|
||||
"LabelSettingsAudiobooksOnlyHelp": "Deze instelling inschakelen zorgt ervoor dat ebook-bestanden genegeerd worden tenzij ze in een audiobook-map staan, in welk geval ze worden ingesteld als supplementaire ebooks",
|
||||
"LabelSettingsBookshelfViewHelp": "Skeumorphisch design met houten planken",
|
||||
"LabelSettingsChromecastSupport": "Chromecast ondersteuning",
|
||||
"LabelSettingsDateFormat": "Datum format",
|
||||
"LabelSettingsDateFormat": "Datumnotatie",
|
||||
"LabelSettingsEnableWatcher": "Bibliotheken automatisch scannen op wijzigingen",
|
||||
"LabelSettingsEnableWatcherForLibrary": "Bibliotheek automatisch scannen op wijzigingen",
|
||||
"LabelSettingsEnableWatcherHelp": "Zorgt voor het automatisch toevoegen/bijwerken van onderdelen als bestandswijzigingen worden gedetecteerd. *Vereist herstarten van server",
|
||||
@@ -568,8 +595,8 @@
|
||||
"LabelSettingsEpubsAllowScriptedContentHelp": "Sta toe dat epub-bestanden scripts uitvoeren. Het wordt aanbevolen om deze instelling uitgeschakeld te houden, tenzij u de bron van de epub-bestanden vertrouwt.",
|
||||
"LabelSettingsExperimentalFeatures": "Experimentele functies",
|
||||
"LabelSettingsExperimentalFeaturesHelp": "Functies in ontwikkeling die je feedback en testing kunnen gebruiken. Klik om de Github-discussie te openen.",
|
||||
"LabelSettingsFindCovers": "Zoek covers",
|
||||
"LabelSettingsFindCoversHelp": "Als je audioboek geen ingesloten cover of cover in de map heeft, zal de scanner proberen een cover te vinden.<br>Opmerking: Dit zal de scan-duur verlengen",
|
||||
"LabelSettingsFindCovers": "Omslagen zoeken",
|
||||
"LabelSettingsFindCoversHelp": "Als je audioboek geen omslag in het bestand of in de map heeft, zal de scanner automatisch proberen een omslag te vinden.<br>Opmerking: Dit kan de scantijd verlengen",
|
||||
"LabelSettingsHideSingleBookSeries": "Verberg series met een enkel boek",
|
||||
"LabelSettingsHideSingleBookSeriesHelp": "Series die slechts een enkel boek bevatten worden verborgen op de seriespagina en de homepagina-planken.",
|
||||
"LabelSettingsHomePageBookshelfView": "Boekenplank-view voor homepagina",
|
||||
@@ -579,18 +606,18 @@
|
||||
"LabelSettingsLibraryMarkAsFinishedWhen": "Markeer media item wanneer voltooid",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeries": "Sla eedere boeken in Serie Verderzetten over",
|
||||
"LabelSettingsOnlyShowLaterBooksInContinueSeriesHelp": "De Continue Series home page shelf toont het eerste boek dat nog niet is begonnen in series waarvan er minstens één is voltooid en er geen boeken in uitvoering zijn. Als u deze instelling inschakelt, wordt de serie voortgezet vanaf het boek dat het verst is voltooid in plaats van het eerste boek dat nog niet is begonnen.",
|
||||
"LabelSettingsParseSubtitles": "Parseer subtitel",
|
||||
"LabelSettingsParseSubtitles": "Subtitel afleiden uit foldernaam",
|
||||
"LabelSettingsParseSubtitlesHelp": "Haal subtitels uit mapnaam van audioboek.<br>Subtitel moet gescheiden zijn met \" - \"<br>b.v. \"Boektitel - Een Subtitel Hier\" heeft als subtitel \"Een Subtitel Hier\"",
|
||||
"LabelSettingsPreferMatchedMetadata": "Prefereer gematchte metadata",
|
||||
"LabelSettingsPreferMatchedMetadata": "Geef voorkeur aan gematchte metadata",
|
||||
"LabelSettingsPreferMatchedMetadataHelp": "Gematchte data zal onderdeeldetails overschrijven bij gebruik van Quick Match. Standaard vult Quick Match uitsluitend ontbrekende details aan.",
|
||||
"LabelSettingsSkipMatchingBooksWithASIN": "Sla matchen van boeken over die al over een ASIN beschikken",
|
||||
"LabelSettingsSkipMatchingBooksWithISBN": "Sla matchen van boeken over die al over een ISBN beschikken",
|
||||
"LabelSettingsSortingIgnorePrefixes": "Negeer voorvoegsels bij sorteren",
|
||||
"LabelSettingsSortingIgnorePrefixesHelp": "b.v. voor voorvoegsel \"The\" wordt titel \"The Title\" dan gesorteerd als \"Title, The\"",
|
||||
"LabelSettingsSquareBookCovers": "Gebruik vierkante boekcovers",
|
||||
"LabelSettingsSquareBookCoversHelp": "Prefereer gebruik van vierkante covers boven standaard 1.6:1 boekcovers",
|
||||
"LabelSettingsStoreCoversWithItem": "Bewaar covers bij onderdeel",
|
||||
"LabelSettingsStoreCoversWithItemHelp": "Standaard worden covers bewaard in /metadata/items, door deze instelling in te schakelen zullen covers in de map van je bibliotheekonderdeel bewaard worden. Slechts een bestand genaamd \"cover\" zal worden bewaard",
|
||||
"LabelSettingsSquareBookCovers": "Gebruik vierkante boekomslagen",
|
||||
"LabelSettingsSquareBookCoversHelp": "Gebruik vierkante boekomslagen in plaats van standaard 1,6:1",
|
||||
"LabelSettingsStoreCoversWithItem": "Bewaar omslagen bij onderdeel",
|
||||
"LabelSettingsStoreCoversWithItemHelp": "Omslagen worden standaard in /metadata/items opgeslagen. Bij inschakelen worden ze in de map van het bibliotheekitem zelf opgeslagen. Slechts een bestand genaamd \"cover\" zal worden bewaard",
|
||||
"LabelSettingsStoreMetadataWithItem": "Bewaar metadata bij onderdeel",
|
||||
"LabelSettingsStoreMetadataWithItemHelp": "Standaard worden metadata-bestanden bewaard in /metadata/items, door deze instelling in te schakelen zullen metadata bestanden in de map van je bibliotheekonderdeel bewaard worden",
|
||||
"LabelSettingsTimeFormat": "Tijdformat",
|
||||
@@ -611,6 +638,7 @@
|
||||
"LabelStartTime": "Starttijd",
|
||||
"LabelStarted": "Gestart",
|
||||
"LabelStartedAt": "Gestart op",
|
||||
"LabelStartedDate": "Gestart {0}",
|
||||
"LabelStatsAudioTracks": "Audiotracks",
|
||||
"LabelStatsAuthors": "Auteurs",
|
||||
"LabelStatsBestDay": "Beste dag",
|
||||
@@ -636,10 +664,11 @@
|
||||
"LabelTextEditorBulletedList": "Opgesomde lijst",
|
||||
"LabelTextEditorLink": "Link",
|
||||
"LabelTextEditorNumberedList": "Genummerde lijst",
|
||||
"LabelTextEditorUnlink": "Unlink",
|
||||
"LabelTextEditorUnlink": "Ontkoppelen",
|
||||
"LabelTheme": "Thema",
|
||||
"LabelThemeDark": "Donker",
|
||||
"LabelThemeLight": "Licht",
|
||||
"LabelThemeSepia": "Sepia",
|
||||
"LabelTimeBase": "Tijdsbasis",
|
||||
"LabelTimeDurationXHours": "{0} Uren",
|
||||
"LabelTimeDurationXMinutes": "{0} minuten",
|
||||
@@ -652,12 +681,12 @@
|
||||
"LabelTimeToShift": "Tijd op te schuiven in seconden",
|
||||
"LabelTitle": "Titel",
|
||||
"LabelToolsEmbedMetadata": "Metadata insluiten",
|
||||
"LabelToolsEmbedMetadataDescription": "Metadata insluiten in audiobestanden, inclusief coverafbeelding en hoofdstukken.",
|
||||
"LabelToolsEmbedMetadataDescription": "Metadata insluiten in audiobestanden, inclusief omslagafbeelding en hoofdstukken.",
|
||||
"LabelToolsM4bEncoder": "M4B Encoder",
|
||||
"LabelToolsMakeM4b": "Maak M4B-audioboekbestand",
|
||||
"LabelToolsMakeM4bDescription": "Genereer een .M4B-audioboekbestand met ingesloten metadata, coverafbeelding en hoofdstukken.",
|
||||
"LabelToolsMakeM4bDescription": "Genereer een .M4B-audioboekbestand met ingesloten metadata, omslagafbeelding en hoofdstukken.",
|
||||
"LabelToolsSplitM4b": "Splitst M4B in MP3's",
|
||||
"LabelToolsSplitM4bDescription": "Maak MP3's van een M4B, gesplitst per hoofdstuk met ingesloten metadata, coverafbeelding en hoofdstukken.",
|
||||
"LabelToolsSplitM4bDescription": "Maak MP3's van een M4B, gesplitst per hoofdstuk met ingesloten metadata, omslagafbeelding en hoofdstukken.",
|
||||
"LabelTotalDuration": "Totale duur",
|
||||
"LabelTotalTimeListened": "Totale tijd geluisterd",
|
||||
"LabelTrackFromFilename": "Track vanuit bestandsnaam",
|
||||
@@ -672,8 +701,8 @@
|
||||
"LabelUndo": "Ongedaan maken",
|
||||
"LabelUnknown": "Onbekend",
|
||||
"LabelUnknownPublishDate": "Onbekende uitgeefdatum",
|
||||
"LabelUpdateCover": "Cover bijwerken",
|
||||
"LabelUpdateCoverHelp": "Sta overschrijven van bestaande covers toe voor de geselecteerde boeken wanneer een match is gevonden",
|
||||
"LabelUpdateCover": "Omslag bijwerken",
|
||||
"LabelUpdateCoverHelp": "Sta overschrijven van bestaande omslagen toe voor de geselecteerde boeken wanneer een match is gevonden",
|
||||
"LabelUpdateDetails": "Details bijwerken",
|
||||
"LabelUpdateDetailsHelp": "Sta overschrijven van bestaande details toe voor de geselecteerde boeken wanneer een match is gevonden",
|
||||
"LabelUpdatedAt": "Bijgewerkt op",
|
||||
@@ -708,20 +737,23 @@
|
||||
"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.",
|
||||
"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.",
|
||||
"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.",
|
||||
"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.",
|
||||
"MessageBackupsLocationPathEmpty": "Backup locatie pad kan niet leeg zijn",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Vul actieve velden in met data van alle items. Velden met meerdere waarden zullen worden samengevoegd",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Vul actieve folder detail velden met de data van dit item",
|
||||
"MessageBatchQuickMatchDescription": "Quick Match zal proberen ontbrekende covers en metadata voor de geselecteerde onderdelen te matchten. Schakel de opties hieronder in om Quick Match toe te staan bestaande covers en/of metadata te overschrijven.",
|
||||
"MessageBatchQuickMatchDescription": "Quick Match probeert ontbrekende omslagen en metadata toe te voegen aan de geselecteerde items. Schakel de opties hieronder in om Quick Match bestaande omslagen en/of metadata te laten overschrijven.",
|
||||
"MessageBookshelfNoCollections": "Je hebt nog geen collecties gemaakt",
|
||||
"MessageBookshelfNoCollectionsHelp": "Collecties zijn publiekelijk. Alle gebruikers met toegang tot de bibliotheek kunnen ze zien.",
|
||||
"MessageBookshelfNoRSSFeeds": "Geen RSS-feeds geopend",
|
||||
"MessageBookshelfNoResultsForFilter": "Geen resultaten voor filter \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Geen resultaten voor query",
|
||||
"MessageBookshelfNoSeries": "Je hebt geen series",
|
||||
"MessageBulkChapterPattern": "Hoeveel hoofdstukken wilt u met dit nummeringspatroon toevoegen?",
|
||||
"MessageChapterEndIsAfter": "Hoofdstukeinde is na het einde van je audioboek",
|
||||
"MessageChapterErrorFirstNotZero": "Eerste hoofdstuk moet starten op 0",
|
||||
"MessageChapterErrorStartGteDuration": "Ongeldig: starttijd moet kleiner zijn dan duur van audioboek",
|
||||
@@ -730,6 +762,7 @@
|
||||
"MessageChaptersNotFound": "Hoofdstukken niet gevonden",
|
||||
"MessageCheckingCron": "Cron aan het checken...",
|
||||
"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?",
|
||||
"MessageConfirmDeleteDevice": "Ben je zeker dat je e-reader apparaat \"{0}\" wil verwijderen?",
|
||||
"MessageConfirmDeleteFile": "Dit verwijdert het bestand uit het bestandssysteem. Weet je het zeker?",
|
||||
@@ -757,11 +790,12 @@
|
||||
"MessageConfirmRemoveAuthor": "Weet je zeker dat je auteur \"{0}\" wil verwijderen?",
|
||||
"MessageConfirmRemoveCollection": "Weet je zeker dat je de collectie \"{0}\" wil verwijderen?",
|
||||
"MessageConfirmRemoveEpisode": "Weet je zeker dat je de aflevering \"{0}\" wil verwijderen?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Let op: Het audiobestand wordt niet verwijderd, tenzij je ‘Bestand permanent verwijderen’ inschakelt",
|
||||
"MessageConfirmRemoveEpisodes": "Weet je zeker dat je {0} afleveringen wil 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?",
|
||||
"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?",
|
||||
"MessageConfirmRenameGenreMergeNote": "Opmerking: Dit genre bestaat al, dus zullen ze worden samengevoegd.",
|
||||
"MessageConfirmRenameGenreWarning": "Waarschuwing! Een gelijknamig genre met ander hoofdlettergebruik bestaat al: \"{0}\".",
|
||||
@@ -782,6 +816,8 @@
|
||||
"MessageFeedURLWillBe": "Feed URL zal {0} zijn",
|
||||
"MessageFetching": "Aan het ophalen...",
|
||||
"MessageForceReScanDescription": "zal alle bestanden opnieuw scannen als een verse scan. Audiobestanden ID3-tags, OPF-bestanden en textbestanden zullen als nieuw worden gescand.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} luistert</strong> op {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Geen luistersessies op {0}",
|
||||
"MessageImportantNotice": "Belangrijke opmerking!",
|
||||
"MessageInsertChapterBelow": "Hoofdstuk hieronder invoegen",
|
||||
"MessageInvalidAsin": "Ongeldige ASIN",
|
||||
@@ -798,14 +834,14 @@
|
||||
"MessageMarkAllEpisodesNotFinished": "Markeer alle afleveringen als niet voltooid",
|
||||
"MessageMarkAsFinished": "Markeer als Voltooid",
|
||||
"MessageMarkAsNotFinished": "Markeer als Niet Voltooid",
|
||||
"MessageMatchBooksDescription": "zal proberen boeken in de bibliotheek te matchen met een boek uit de geselecteerde bron en lege details en coverafbeelding te vullen. Overschrijft details niet.",
|
||||
"MessageMatchBooksDescription": "zal proberen boeken in de bibliotheek te koppelen aan een boek uit de geselecteerde bron en ontbrekende gegevens en een omslag toe te voegen. Overschrijft geen bestaande gegevens.",
|
||||
"MessageNoAudioTracks": "Geen audiotracks",
|
||||
"MessageNoAuthors": "Geen auteurs",
|
||||
"MessageNoBackups": "Geen back-ups",
|
||||
"MessageNoBookmarks": "Geen boekwijzers",
|
||||
"MessageNoChapters": "Geen hoofdstukken",
|
||||
"MessageNoCollections": "Geen collecties",
|
||||
"MessageNoCoversFound": "Geen covers gevonden",
|
||||
"MessageNoCoversFound": "Geen omslagen gevonden",
|
||||
"MessageNoDescription": "Geen beschrijving",
|
||||
"MessageNoDevices": "Geen Apparaten",
|
||||
"MessageNoDownloadsInProgress": "Geen downloads bezig op dit moment",
|
||||
@@ -843,7 +879,7 @@
|
||||
"MessageQuickEmbedInProgress": "Snelle inbedding in uitvoering",
|
||||
"MessageQuickEmbedQueue": "In de wachtrij voor snelle insluiting ({0} in wachtrij)",
|
||||
"MessageQuickMatchAllEpisodes": "Alle Afleveringen Snel Matchen",
|
||||
"MessageQuickMatchDescription": "Vul lege onderdeeldetails & cover met eerste matchresultaat van '{0}'. Overschrijft geen details tenzij 'Prefereer gematchte metadata' serverinstelling is ingeschakeld.",
|
||||
"MessageQuickMatchDescription": "Vult ontbrekende gegevens & omslag met eerste matchresultaat van '{0}'. Overschrijft gegevens alleen als de serverinstelling ‘Geef voorkeur aan gematchte metadata’ is ingeschakeld.",
|
||||
"MessageRemoveChapter": "Verwijder hoofdstuk",
|
||||
"MessageRemoveEpisodes": "Verwijder {0} aflevering(en)",
|
||||
"MessageRemoveFromPlayerQueue": "Verwijder uit afspeelwachtrij",
|
||||
@@ -851,7 +887,7 @@
|
||||
"MessageReportBugsAndContribute": "Rapporteer bugs, vraag functionaliteiten aan en draag bij op",
|
||||
"MessageResetChaptersConfirm": "Weet je zeker dat je de hoofdstukken wil resetten en de wijzigingen die je gemaakt hebt ongedaan wil maken?",
|
||||
"MessageRestoreBackupConfirm": "Weet je zeker dat je wil herstellen met behulp van de back-up gemaakt op",
|
||||
"MessageRestoreBackupWarning": "Herstellen met een back-up zal de volledige database in /config en de covers in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om covers en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle clients die van je server gebruik maken zullen automatisch worden ververst.",
|
||||
"MessageRestoreBackupWarning": "Een back-up herstellen zal de volledige database in /config en de omslagen in /metadata/items & /metadata/authors overschrijven.<br /><br />Back-ups wijzigen geen bestanden in je bibliotheekmappen. Als je de serverinstelling gebruikt om omslagen en metadata in je bibliotheekmappen te bewaren dan worden deze niet geback-upt of overschreven.<br /><br />Alle apparaten die je server gebruiken, worden automatisch ververst.",
|
||||
"MessageScheduleLibraryScanNote": "Voor de meeste gebruikers is het raadzaam om deze functie uitgeschakeld te laten en de folder watcher-instelling ingeschakeld te houden. De folder watcher detecteert automatisch wijzigingen in uw bibliotheekmappen. De folder watcher werkt niet voor elk bestandssysteem (zoals NFS), dus geplande bibliotheekscans kunnen in plaats daarvan worden gebruikt.",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Elke {0} uitvoeren op {1}",
|
||||
"MessageSearchResultsFor": "Zoekresultaten voor",
|
||||
@@ -921,6 +957,7 @@
|
||||
"NotificationOnRSSFeedDisabledDescription": "Wordt geactiveerd wanneer automatische afleveringsdownloads zijn uitgeschakeld vanwege te veel mislukte pogingen",
|
||||
"NotificationOnRSSFeedFailedDescription": "Getriggerd wanneer de RSS feed aanvraag faalt voor een automatische aflevering download",
|
||||
"NotificationOnTestDescription": "Event voor het testen van het notificatiesysteem",
|
||||
"PlaceholderBulkChapterInput": "Voer een hoofdstuktitel in of gebruik nummering (bijv. 'Aflevering 1', 'Hoofdstuk 10', '1.')",
|
||||
"PlaceholderNewCollection": "Nieuwe naam collectie",
|
||||
"PlaceholderNewFolderPath": "Nieuwe locatie map",
|
||||
"PlaceholderNewPlaylist": "Nieuwe naam afspeellijst",
|
||||
@@ -974,8 +1011,12 @@
|
||||
"ToastBookmarkCreateFailed": "Aanmaken boekwijzer mislukt",
|
||||
"ToastBookmarkCreateSuccess": "boekwijzer toegevoegd",
|
||||
"ToastBookmarkRemoveSuccess": "Boekwijzer verwijderd",
|
||||
"ToastBulkChapterInvalidCount": "Voer een nummer in tussen 1 en 150",
|
||||
"ToastCachePurgeFailed": "Cache wissen is mislukt",
|
||||
"ToastCachePurgeSuccess": "Cache succesvol verwijderd",
|
||||
"ToastChapterLocked": "Hoofdstuk is vergrendeld.",
|
||||
"ToastChapterStartTimeAdjusted": "Hoofdstukstarttijd aangepast met {0} seconden",
|
||||
"ToastChaptersAllLocked": "Alle hoofdstukken zijn vergrendeld. Ontgrendel sommige hoofdstukken om hun tijd te verschuiven.",
|
||||
"ToastChaptersHaveErrors": "Hoofdstukken bevatten fouten",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Ongeldige shift-tijd. De starttijd van het laatste hoofdstuk zou langer zijn dan de duur van dit audioboek.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Ongeldige shift-lengte. Het eerste hoofdstuk zou nul of een negatieve lengte hebben en zou worden overschreven door het tweede hoofdstuk. Verleng de startduur van het tweede hoofdstuk.",
|
||||
@@ -985,7 +1026,7 @@
|
||||
"ToastCollectionItemsAddFailed": "Item(s) toegevoegd aan collectie mislukt",
|
||||
"ToastCollectionRemoveSuccess": "Collectie verwijderd",
|
||||
"ToastCollectionUpdateSuccess": "Collectie bijgewerkt",
|
||||
"ToastCoverUpdateFailed": "Cover update mislukt",
|
||||
"ToastCoverUpdateFailed": "Omslag bijwerken mislukt",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Datum en tijd ongeldig of onvolledig",
|
||||
"ToastDeleteFileFailed": "Bestand verwijderen mislukt",
|
||||
"ToastDeleteFileSuccess": "Bestand verwijderd",
|
||||
@@ -1000,6 +1041,8 @@
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Aflevering download-wachtrij geleegt",
|
||||
"ToastEpisodeUpdateSuccess": "{0} afleveringen bijgewerkt",
|
||||
"ToastErrorCannotShare": "Kan niet native delen op dit apparaat",
|
||||
"ToastFailedToCreate": "Fout tijdens creëren",
|
||||
"ToastFailedToDelete": "Fout tijdens verwijderen",
|
||||
"ToastFailedToLoadData": "Data laden mislukt",
|
||||
"ToastFailedToMatch": "Match mislukt",
|
||||
"ToastFailedToShare": "Delen mislukt",
|
||||
@@ -1007,7 +1050,8 @@
|
||||
"ToastInvalidImageUrl": "Ongeldige afbeeldings-URL",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Ongeldig maximum aantal afleveringen om te downloaden",
|
||||
"ToastInvalidUrl": "Ongeldige URL",
|
||||
"ToastItemCoverUpdateSuccess": "Cover onderdeel bijgewerkt",
|
||||
"ToastInvalidUrls": "Een of meerdere URLs zijn ongeldig",
|
||||
"ToastItemCoverUpdateSuccess": "Omslag bijgewerkt",
|
||||
"ToastItemDeletedFailed": "Item verwijderen mislukt",
|
||||
"ToastItemDeletedSuccess": "Verwijderd item",
|
||||
"ToastItemDetailsUpdateSuccess": "Details onderdeel bijgewerkt",
|
||||
@@ -1031,6 +1075,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Moet ten minste een pad hebben",
|
||||
"ToastNameEmailRequired": "Naam en email zijn vereist",
|
||||
"ToastNameRequired": "Naam is vereist",
|
||||
"ToastNewApiKeyUserError": "Selecteer een gebruiker",
|
||||
"ToastNewEpisodesFound": "{0} nieuwe afleveringen gevonden",
|
||||
"ToastNewUserCreatedFailed": "Account: \"{0}\" aanmaken mislukt",
|
||||
"ToastNewUserCreatedSuccess": "Nieuw account aangemaakt",
|
||||
@@ -1055,6 +1100,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Afspeellijst bijgewerkt",
|
||||
"ToastPodcastCreateFailed": "Podcast aanmaken mislukt",
|
||||
"ToastPodcastCreateSuccess": "Podcast aangemaakt",
|
||||
"ToastPodcastEpisodeUpdated": "Aflevering bijgewerkt",
|
||||
"ToastPodcastGetFeedFailed": "Podcast feed ophalen mislukt",
|
||||
"ToastPodcastNoEpisodesInFeed": "Geen afleveringen gevonden in RSS feed",
|
||||
"ToastPodcastNoRssFeed": "Podcast heeft geen RSS feed",
|
||||
@@ -1105,5 +1151,13 @@
|
||||
"ToastUserPasswordChangeSuccess": "Wachtwoord succesvol gewijzigd",
|
||||
"ToastUserPasswordMismatch": "Wachtwoorden komen niet overeen",
|
||||
"ToastUserPasswordMustChange": "Het nieuwe wachtwoord kan niet overeenkomen met het oude wachtwoord",
|
||||
"ToastUserRootRequireName": "U moet een root-gebruikersnaam invoeren"
|
||||
"ToastUserRootRequireName": "U moet een root-gebruikersnaam invoeren",
|
||||
"TooltipAddChapters": "Hoofdstuk(ken) toevoegen",
|
||||
"TooltipAddOneSecond": "1 seconde toevoegen",
|
||||
"TooltipAdjustChapterStart": "Klik om de starttijd aan te passen",
|
||||
"TooltipLockAllChapters": "Alle hoofdstukken vergrendelen",
|
||||
"TooltipLockChapter": "Hoofdstuk vergrendelen (Shift+klikken voor bereik)",
|
||||
"TooltipSubtractOneSecond": "Trek 1 seconde af",
|
||||
"TooltipUnlockAllChapters": "Alle hoofdstukken ontgrendelen",
|
||||
"TooltipUnlockChapter": "Hoofdstuk ontgrendelen (Shift+klikken voor bereik)"
|
||||
}
|
||||
|
||||
+144
-17
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"ButtonAdd": "Legg til",
|
||||
"ButtonAddApiKey": "Legg til API-nøkkel",
|
||||
"ButtonAddChapters": "Legg til kapittel",
|
||||
"ButtonAddDevice": "Legg til enhet",
|
||||
"ButtonAddLibrary": "Legg til bibliotek",
|
||||
@@ -10,6 +11,8 @@
|
||||
"ButtonApplyChapters": "Bruk kapittel",
|
||||
"ButtonAuthors": "Forfattere",
|
||||
"ButtonBack": "Tilbake",
|
||||
"ButtonBatchEditPopulateFromExisting": "Fyll ut fra eksisterende",
|
||||
"ButtonBatchEditPopulateMapDetails": "Legg til detaljer",
|
||||
"ButtonBrowseForFolder": "Bla gjennom mappe",
|
||||
"ButtonCancel": "Avbryt",
|
||||
"ButtonCancelEncode": "Avbryt konvertering",
|
||||
@@ -18,6 +21,7 @@
|
||||
"ButtonChooseAFolder": "Velg mappe",
|
||||
"ButtonChooseFiles": "Velg filer",
|
||||
"ButtonClearFilter": "Fjern filter",
|
||||
"ButtonClose": "Lukk",
|
||||
"ButtonCloseFeed": "Lukk Feed",
|
||||
"ButtonCloseSession": "Lukk åpen økt",
|
||||
"ButtonCollections": "Samlinger",
|
||||
@@ -30,7 +34,7 @@
|
||||
"ButtonEditChapters": "Rediger kapittel",
|
||||
"ButtonEditPodcast": "Rediger podcast",
|
||||
"ButtonEnable": "Aktiver",
|
||||
"ButtonFireAndFail": "Kjør ved feil",
|
||||
"ButtonFireAndFail": "Utfør og feil",
|
||||
"ButtonFireOnTest": "Kjør onTest-kommando",
|
||||
"ButtonForceReScan": "Tving skann",
|
||||
"ButtonFullPath": "Full sti",
|
||||
@@ -109,7 +113,7 @@
|
||||
"ButtonUploadOPMLFile": "Last opp OPML fil",
|
||||
"ButtonUserDelete": "Slett bruker {0}",
|
||||
"ButtonUserEdit": "Rediger bruker {0}",
|
||||
"ButtonViewAll": "Vis alle",
|
||||
"ButtonViewAll": "Vis alt",
|
||||
"ButtonYes": "Ja",
|
||||
"ErrorUploadFetchMetadataAPI": "Feil ved innhenting av metadata",
|
||||
"ErrorUploadFetchMetadataNoResults": "Kunne ikke hente metadata - forsøk å oppdatere tittel og/eller forfatter",
|
||||
@@ -117,11 +121,13 @@
|
||||
"HeaderAccount": "Konto",
|
||||
"HeaderAddCustomMetadataProvider": "Legg til egendefinert metadata tilbyder",
|
||||
"HeaderAdvanced": "Avansert",
|
||||
"HeaderApiKeys": "API-nøkler",
|
||||
"HeaderAppriseNotificationSettings": "Apprise varslingsinstillinger",
|
||||
"HeaderAudioTracks": "Lydspor",
|
||||
"HeaderAudiobookTools": "Lydbok Filbehandlingsverktøy",
|
||||
"HeaderAuthentication": "Autentisering",
|
||||
"HeaderBackups": "Sikkerhetskopier",
|
||||
"HeaderBulkChapterModal": "Legg til flere kapitler",
|
||||
"HeaderChangePassword": "Bytt passord",
|
||||
"HeaderChapters": "Kapittel",
|
||||
"HeaderChooseAFolder": "Velg en mappe",
|
||||
@@ -160,6 +166,7 @@
|
||||
"HeaderMetadataOrderOfPrecedence": "Prioriteringsrekkefølge for metadata",
|
||||
"HeaderMetadataToEmbed": "Metadata å bake inn",
|
||||
"HeaderNewAccount": "Ny konto",
|
||||
"HeaderNewApiKey": "Ny API-nøkkel",
|
||||
"HeaderNewLibrary": "Ny bibliotek",
|
||||
"HeaderNotificationCreate": "Opprett varsling",
|
||||
"HeaderNotificationUpdate": "Oppdater varsling",
|
||||
@@ -193,6 +200,7 @@
|
||||
"HeaderSettingsExperimental": "Eksperimentelle funksjoner",
|
||||
"HeaderSettingsGeneral": "Generell",
|
||||
"HeaderSettingsScanner": "Skanner",
|
||||
"HeaderSettingsSecurity": "Sikkerhet",
|
||||
"HeaderSettingsWebClient": "Webklient",
|
||||
"HeaderSleepTimer": "Sove timer",
|
||||
"HeaderStatsLargestItems": "Største enheter",
|
||||
@@ -204,6 +212,7 @@
|
||||
"HeaderTableOfContents": "Innholdsfortegnelse",
|
||||
"HeaderTools": "Verktøy",
|
||||
"HeaderUpdateAccount": "Oppdater konto",
|
||||
"HeaderUpdateApiKey": "Oppdater API-nøkkel",
|
||||
"HeaderUpdateAuthor": "Oppdater forfatter",
|
||||
"HeaderUpdateDetails": "Oppdater detaljer",
|
||||
"HeaderUpdateLibrary": "Oppdater bibliotek",
|
||||
@@ -233,6 +242,10 @@
|
||||
"LabelAllUsersExcludingGuests": "Alle brukere bortsett fra gjester",
|
||||
"LabelAllUsersIncludingGuests": "Alle brukere inkludert gjester",
|
||||
"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",
|
||||
"LabelAppend": "Legge til",
|
||||
"LabelAudioBitrate": "Bitrate for lyd (f.eks. 128k)",
|
||||
@@ -252,7 +265,7 @@
|
||||
"LabelBackToUser": "Tilbake til bruker",
|
||||
"LabelBackupAudioFiles": "Sikkerhetskopier lydfiler",
|
||||
"LabelBackupLocation": "Mappe for sikkerhetskopiering",
|
||||
"LabelBackupsEnableAutomaticBackups": "Aktiver automatisk sikkerhetskopi",
|
||||
"LabelBackupsEnableAutomaticBackups": "Automatiske sikkerhetskopier",
|
||||
"LabelBackupsEnableAutomaticBackupsHelp": "Sikkerhetskopier lagret under /metadata/backups",
|
||||
"LabelBackupsMaxBackupSize": "Maksimal størrelse for sikkerhetskopi (i GB) (0 for ubegrenset)",
|
||||
"LabelBackupsMaxBackupSizeHelp": "For å forhindre feilkonfigurasjon, vil sikkerhetskopier mislykkes hvis de oveskride konfigurert størrelse.",
|
||||
@@ -282,6 +295,7 @@
|
||||
"LabelContinueListening": "Fortsett lytting",
|
||||
"LabelContinueReading": "Fortsett lesing",
|
||||
"LabelContinueSeries": "Fortsett serier",
|
||||
"LabelCorsAllowed": "Tillate CORS-opprinnelser",
|
||||
"LabelCover": "Omslag",
|
||||
"LabelCoverImageURL": "Omslagsbilde URL",
|
||||
"LabelCoverProvider": "Tilbyder av omslagsbilde",
|
||||
@@ -295,6 +309,7 @@
|
||||
"LabelDeleteFromFileSystemCheckbox": "Slett fra filsystemet (fjern haken for kun å ta bort fra databasen)",
|
||||
"LabelDescription": "Beskrivelse",
|
||||
"LabelDeselectAll": "Fjern valg",
|
||||
"LabelDetectedPattern": "Oppdaget mønster:",
|
||||
"LabelDevice": "Enhet",
|
||||
"LabelDeviceInfo": "Enhetsinformasjon",
|
||||
"LabelDeviceIsAvailableTo": "Enheten er tilgjengelig for...",
|
||||
@@ -344,6 +359,10 @@
|
||||
"LabelExample": "Eksempel",
|
||||
"LabelExpandSeries": "Vis serie",
|
||||
"LabelExpandSubSeries": "Vis underserie",
|
||||
"LabelExpired": "Utløpt",
|
||||
"LabelExpiresAt": "Utløper",
|
||||
"LabelExpiresInSeconds": "Utløper om (sekunder)",
|
||||
"LabelExpiresNever": "Aldri",
|
||||
"LabelExplicit": "Eksplisitt",
|
||||
"LabelExplicitChecked": "Eksplisitt (avhuket)",
|
||||
"LabelExplicitUnchecked": "Ikke eksplisitt (ikke avhuket)",
|
||||
@@ -359,11 +378,12 @@
|
||||
"LabelFilterByUser": "Filtrer etter bruker",
|
||||
"LabelFindEpisodes": "Finn episoder",
|
||||
"LabelFinished": "Fullført",
|
||||
"LabelFinishedDate": "Fullført {0}",
|
||||
"LabelFolder": "Mappe",
|
||||
"LabelFolders": "Mapper",
|
||||
"LabelFontBold": "Fet",
|
||||
"LabelFontBoldness": "Skrifttykkelse",
|
||||
"LabelFontFamily": "Fontfamilie",
|
||||
"LabelFontFamily": "Skriftfamilie",
|
||||
"LabelFontItalic": "Kursiv",
|
||||
"LabelFontScale": "Font størrelse",
|
||||
"LabelFontStrikethrough": "Gjennomstreking",
|
||||
@@ -373,7 +393,7 @@
|
||||
"LabelGenres": "Sjangre",
|
||||
"LabelHardDeleteFile": "Tving sletting av fil",
|
||||
"LabelHasEbook": "Har e-bok",
|
||||
"LabelHasSupplementaryEbook": "Har komplimentær e-bok",
|
||||
"LabelHasSupplementaryEbook": "Har supplerende e-bok",
|
||||
"LabelHideSubtitles": "Skjul undertitler",
|
||||
"LabelHighestPriority": "Høyeste prioritet",
|
||||
"LabelHost": "Tjener",
|
||||
@@ -403,10 +423,11 @@
|
||||
"LabelLanguages": "Språk",
|
||||
"LabelLastBookAdded": "Siste bok lagt til",
|
||||
"LabelLastBookUpdated": "Siste bok oppdatert",
|
||||
"LabelLastProgressDate": "Siste fremgang: {0}",
|
||||
"LabelLastSeen": "Sist sett",
|
||||
"LabelLastTime": "Siste tid",
|
||||
"LabelLastUpdate": "Siste oppdatering",
|
||||
"LabelLayout": "Oppsett",
|
||||
"LabelLayout": "Utseende",
|
||||
"LabelLayoutSinglePage": "Enkeltside",
|
||||
"LabelLayoutSplitPage": "Del side",
|
||||
"LabelLess": "Mindre",
|
||||
@@ -415,16 +436,20 @@
|
||||
"LabelLibraryFilterSublistEmpty": "Ingen {0}",
|
||||
"LabelLibraryItem": "Bibliotek enhet",
|
||||
"LabelLibraryName": "Bibliotek navn",
|
||||
"LabelLibrarySortByProgress": "Fremdrift: Sist oppdatert",
|
||||
"LabelLibrarySortByProgressFinished": "Fremdrift: Fullført",
|
||||
"LabelLibrarySortByProgressStarted": "Fremdrift: Startet",
|
||||
"LabelLimit": "Begrensning",
|
||||
"LabelLineSpacing": "Linjemellomrom",
|
||||
"LabelListenAgain": "Lytt igjen",
|
||||
"LabelLogLevelDebug": "Debug",
|
||||
"LabelLogLevelInfo": "Info",
|
||||
"LabelLogLevelWarn": "Warn",
|
||||
"LabelLogLevelWarn": "Varsel",
|
||||
"LabelLookForNewEpisodesAfterDate": "Se etter nye episoder etter denne datoen",
|
||||
"LabelLowestPriority": "Laveste prioritet",
|
||||
"LabelMatchConfidence": "Konfidens",
|
||||
"LabelMatchExistingUsersBy": "Knytt sammen eksisterende brukere basert på",
|
||||
"LabelMatchExistingUsersByDescription": "Brukes for å koble til eksisterende brukere. Når koblingen er i orden vil brukerne bli identifisert med en unik id fra SSO-tilbyderen.",
|
||||
"LabelMatchExistingUsersByDescription": "Brukes for å koble til eksisterende brukere. Når koblingen er i orden vil brukerne bli identifisert med en unik id fra SSO-tilbyderen",
|
||||
"LabelMaxEpisodesToDownload": "Maksimalt antall episoder som skal lastes ned. Bruk 0 for ubegrenset.",
|
||||
"LabelMaxEpisodesToDownloadPerCheck": "Maksimalt antall nye episoder som skal lastes ned per sjekk",
|
||||
"LabelMaxEpisodesToKeep": "Maksimalt antall episoder som skal beholdes",
|
||||
@@ -433,7 +458,7 @@
|
||||
"LabelMediaType": "Medie type",
|
||||
"LabelMetaTag": "Meta tag",
|
||||
"LabelMetaTags": "Meta tags",
|
||||
"LabelMetadataOrderOfPrecedenceDescription": "Høyere prioritert kilder for metadata overstyrer laverer prioriterte kilder for metadata.",
|
||||
"LabelMetadataOrderOfPrecedenceDescription": "Høyere prioritert kilder for metadata overstyrer laverer prioriterte kilder for metadata",
|
||||
"LabelMetadataProvider": "Metadata Leverandør",
|
||||
"LabelMinute": "Minutt",
|
||||
"LabelMinutes": "Minutter",
|
||||
@@ -452,7 +477,9 @@
|
||||
"LabelNewestAuthors": "Nyeste forfattere",
|
||||
"LabelNewestEpisodes": "Nyeste episoder",
|
||||
"LabelNextBackupDate": "Neste sikkerhetskopi dato",
|
||||
"LabelNextChapters": "Neste kapitler blir:",
|
||||
"LabelNextScheduledRun": "Neste planlagte kjøring",
|
||||
"LabelNoApiKeys": "Ingen API-nøkler",
|
||||
"LabelNoCustomMetadataProviders": "Ingen egendefinerte tilbydere for metadata",
|
||||
"LabelNoEpisodesSelected": "Ingen episoder valgt",
|
||||
"LabelNotFinished": "Ikke fullført",
|
||||
@@ -468,9 +495,11 @@
|
||||
"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.",
|
||||
"LabelNumberOfBooks": "Antall bøker",
|
||||
"LabelNumberOfEpisodes": "Antall episoder",
|
||||
"LabelNumberOfChapters": "Antall kapitler:",
|
||||
"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:",
|
||||
"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",
|
||||
"LabelOverwrite": "Overskriv",
|
||||
"LabelPaginationPageXOfY": "Side {0} av {1}",
|
||||
@@ -488,6 +517,7 @@
|
||||
"LabelPersonalYearReview": "Oppsummering av året ditt ({0})",
|
||||
"LabelPhotoPathURL": "Bilde sti/URL",
|
||||
"LabelPlayMethod": "Avspillingsmetode",
|
||||
"LabelPlaybackRateIncrementDecrement": "Trinnstørrelse for økning/senking av avspillingshastighet",
|
||||
"LabelPlayerChapterNumberMarker": "{0} av {1}",
|
||||
"LabelPlaylists": "Spilleliste",
|
||||
"LabelPodcast": "Podcast",
|
||||
@@ -510,11 +540,11 @@
|
||||
"LabelPublishers": "Utgivere",
|
||||
"LabelRSSFeedCustomOwnerEmail": "Tilpasset eier e-post",
|
||||
"LabelRSSFeedCustomOwnerName": "Tilpasset eier Navn",
|
||||
"LabelRSSFeedOpen": "RSS Feed åpne",
|
||||
"LabelRSSFeedOpen": "RSS-strøm åpen",
|
||||
"LabelRSSFeedPreventIndexing": "Forhindre indeksering",
|
||||
"LabelRSSFeedSlug": "RSS-feed ID",
|
||||
"LabelRSSFeedURL": "RSS-feed URL",
|
||||
"LabelRandomly": "Tilfeldig",
|
||||
"LabelRandomly": "Tilfeldighet",
|
||||
"LabelReAddSeriesToContinueListening": "Legg til igjen til \"Fortsett å lytte\"",
|
||||
"LabelRead": "Les",
|
||||
"LabelReadAgain": "Les igjen",
|
||||
@@ -540,6 +570,7 @@
|
||||
"LabelSelectAll": "Velg alt",
|
||||
"LabelSelectAllEpisodes": "Velg alle episoder",
|
||||
"LabelSelectEpisodesShowing": "Velg {0} episoder vist",
|
||||
"LabelSelectUser": "Velg bruker",
|
||||
"LabelSelectUsers": "Velg brukere",
|
||||
"LabelSendEbookToDevice": "Send Ebok til...",
|
||||
"LabelSequence": "Sekvens",
|
||||
@@ -607,6 +638,7 @@
|
||||
"LabelStartTime": "Start Tid",
|
||||
"LabelStarted": "Startet",
|
||||
"LabelStartedAt": "Startet",
|
||||
"LabelStartedDate": "Startet {0}",
|
||||
"LabelStatsAudioTracks": "Lydspor",
|
||||
"LabelStatsAuthors": "Forfattere",
|
||||
"LabelStatsBestDay": "Beste dag",
|
||||
@@ -624,7 +656,7 @@
|
||||
"LabelStatsWeekListening": "Uker lyttet",
|
||||
"LabelSubtitle": "Undertittel",
|
||||
"LabelSupportedFileTypes": "Støttede filtyper",
|
||||
"LabelTag": "Tag",
|
||||
"LabelTag": "Merke",
|
||||
"LabelTags": "Tagger",
|
||||
"LabelTagsAccessibleToUser": "Tagger tilgjengelig for bruker",
|
||||
"LabelTagsNotAccessibleToUser": "Tagger ikke tilgjengelig for bruker",
|
||||
@@ -636,6 +668,7 @@
|
||||
"LabelTheme": "Tema",
|
||||
"LabelThemeDark": "Mørk",
|
||||
"LabelThemeLight": "Lys",
|
||||
"LabelThemeSepia": "Sepia",
|
||||
"LabelTimeBase": "Tidsbase",
|
||||
"LabelTimeDurationXHours": "{0} timer",
|
||||
"LabelTimeDurationXMinutes": "{0} minutter",
|
||||
@@ -704,24 +737,32 @@
|
||||
"MessageAddToPlayerQueue": "Legg til i kø",
|
||||
"MessageAppriseDescription": "For å bruke denne funksjonen trenger du en instans av <a href=\"https://github.com/caronc/apprise-api\" target=\"_blank\">Apprise API</a> kjørende eller et API som håndterer disse forespørslene. <br />Apprise API URL skal være hele URL-en til varslingen, f.eks., hvis din API-instans er på <code>http://192.168.1.1:8337</code> så skal du bruke <code>http://192.168.1.1:8337/notify</code>.",
|
||||
"MessageAsinCheck": "Påse at du bruker ASIN fra den riktige Audible-regionen, ikke Amazon.",
|
||||
"MessageAuthenticationLegacyTokenWarning": "Eldre API-tokener vil bli fjernet i fremtiden. Bruk <a href=\"/config/api-keys\">API-nøkler</a> i stedet.",
|
||||
"MessageAuthenticationOIDCChangesRestart": "Etter å ha lagret, start serveren din på nytt for at OIDC-endringene skal tre i kraft.",
|
||||
"MessageAuthenticationSecurityMessage": "Autentisering er forbedret av sikkerhetshensyn. Alle brukere må logge inn på nytt.",
|
||||
"MessageBackupsDescription": "Sikkerhetskopier inkluderer, brukerfremgang, detaljer om bibliotekgjenstander, tjener instillinger og bilder lagret under <code>/metadata/items</code> og <code>/metadata/authors</code>. Sikkerhetskopier <strong>vil ikke</strong> inkludere filer som er lagret i bibliotek mappene.",
|
||||
"MessageBackupsLocationEditNote": "Viktig: Endring av mappen for sikkerhetskopi hverken endrer eller flytter eksisterende sikkerhetskopier!",
|
||||
"MessageBackupsLocationNoEditNote": "NB: Mappen for sikkerhetskopi settes i en miljøvariabel og kan ikke endres her.",
|
||||
"MessageBackupsLocationNoEditNote": "Viktig: Mappen for sikkerhetskopi satt i en miljøvariabel og kan ikke endres her.",
|
||||
"MessageBackupsLocationPathEmpty": "Mappen for sikkerhetskopiering må angis",
|
||||
"MessageBatchEditPopulateMapDetailsAllHelp": "Fyll aktiverte felt med data fra alle elementer. Felt med flere verdier blir slått sammen",
|
||||
"MessageBatchEditPopulateMapDetailsItemHelp": "Fyll aktiverte kartdetaljfelt med data fra dette elementet",
|
||||
"MessageBatchQuickMatchDescription": "Kjapt søk vil forsøke å legge til manglende omslag og metadata for de valgte gjenstandene. Aktiver dette valget for å tillate Kjapt søk til å overskrive eksisterende omslag og/eller metadata.",
|
||||
"MessageBookshelfNoCollections": "Du har ikke laget noen samlinger ennå",
|
||||
"MessageBookshelfNoCollectionsHelp": "Samlinger er offentlige. Alle brukere med tilgang til biblioteket kan se dem.",
|
||||
"MessageBookshelfNoRSSFeeds": "Ingen RSS feed er åpen",
|
||||
"MessageBookshelfNoResultsForFilter": "Ingen resultat for filter \"{0}: {1}\"",
|
||||
"MessageBookshelfNoResultsForQuery": "Ingen resultater for søket",
|
||||
"MessageBookshelfNoSeries": "Du har ingen serier",
|
||||
"MessageBulkChapterPattern": "Hvor mange kapitler vil du legge til med dette nummereringsmønsteret?",
|
||||
"MessageChapterEndIsAfter": "Kapittel slutt er etter slutt av lydboken",
|
||||
"MessageChapterErrorFirstNotZero": "Første kapittel starter på 0",
|
||||
"MessageChapterErrorStartGteDuration": "Feil start tid, må være mindre enn lengde på lydbok",
|
||||
"MessageChapterErrorStartLtPrev": "Feil start tid, må være større eller det samme som forrige kapittel start tid",
|
||||
"MessageChapterStartIsAfter": "Kapittel start er etter slutten av din lydbok",
|
||||
"MessageChaptersNotFound": "Fant ikke kapitler",
|
||||
"MessageCheckingCron": "Sjekker cron...",
|
||||
"MessageConfirmCloseFeed": "Er du sikker på at du vil lukke denne feeden?",
|
||||
"MessageConfirmDeleteApiKey": "Er du sikker på at du vil slette API-nøkkelen \"{0}\"?",
|
||||
"MessageConfirmDeleteBackup": "Er du sikker på at du vil slette sikkerhetskopi for {0}?",
|
||||
"MessageConfirmDeleteDevice": "Er du sikker på at du vil slette e-leser enheten \"{0}\"?",
|
||||
"MessageConfirmDeleteFile": "Dette vil slette filen fra filsystemet. Er du sikker?",
|
||||
@@ -740,7 +781,7 @@
|
||||
"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?",
|
||||
"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 vil slette mappen?",
|
||||
"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?",
|
||||
"MessageConfirmQuickMatchEpisodes": "Hurtig gjenkjenning av episoder overskriver detaljene hvis en match blir funnet. Kun episoder som ikke allerede er matchet blir oppdatert. Er du sikker?",
|
||||
@@ -749,6 +790,7 @@
|
||||
"MessageConfirmRemoveAuthor": "Er du sikker på at du vil fjerne forfatteren \"{0}\"?",
|
||||
"MessageConfirmRemoveCollection": "Er du sikker på at du vil fjerne samling\"{0}\"?",
|
||||
"MessageConfirmRemoveEpisode": "Er du sikker på at du vil fjerne episode \"{0}\"?",
|
||||
"MessageConfirmRemoveEpisodeNote": "Merk: Dette sletter ikke lydfilen med mindre du slår på \"Hard delete file\"",
|
||||
"MessageConfirmRemoveEpisodes": "Er du sikker på at du vil fjerne {0} episoder?",
|
||||
"MessageConfirmRemoveListeningSessions": "Er du sikker på at du vil fjerne {0} lytte-sesjoner?",
|
||||
"MessageConfirmRemoveMetadataFiles": "Er du sikker på at du vil fjerne alle metadata.{0}-filer i mappene for biblioteks-elementer?",
|
||||
@@ -774,8 +816,11 @@
|
||||
"MessageFeedURLWillBe": "Feed URL vil bli {0}",
|
||||
"MessageFetching": "Henter...",
|
||||
"MessageForceReScanDescription": "vil skanne alle filene igjen som en ny skann. Lyd fil ID3 tagger, OPF filer og tekstfiler vil bli skannet som nye.",
|
||||
"MessageHeatmapListeningTimeTooltip": "<strong>{0} lytter</strong> på {1}",
|
||||
"MessageHeatmapNoListeningSessions": "Ingen lytteøkter på {0}",
|
||||
"MessageImportantNotice": "Viktig varsel!",
|
||||
"MessageInsertChapterBelow": "Sett inn kapittel under",
|
||||
"MessageInvalidAsin": "Ugyldig ASIN",
|
||||
"MessageItemsSelected": "{0} Gjenstander valgt",
|
||||
"MessageItemsUpdated": "{0} Gjenstander oppdatert",
|
||||
"MessageJoinUsOn": "Følg oss nå",
|
||||
@@ -821,6 +866,7 @@
|
||||
"MessageNoTasksRunning": "Ingen oppgaver kjører",
|
||||
"MessageNoUpdatesWereNecessary": "Ingen oppdatering var nødvendig",
|
||||
"MessageNoUserPlaylists": "Du har ingen spillelister",
|
||||
"MessageNoUserPlaylistsHelp": "Spillelister er private. Bare brukeren som oppretter dem kan se dem.",
|
||||
"MessageNotYetImplemented": "Ikke implementert ennå",
|
||||
"MessageOpmlPreviewNote": "PS: Dette er en forhåndvisning av en OPML-fil. Den faktiske podcast-tittelen hentes direkte fra RSS-feeden.",
|
||||
"MessageOr": "eller",
|
||||
@@ -829,7 +875,7 @@
|
||||
"MessagePlaylistCreateFromCollection": "Lag spilleliste fra samling",
|
||||
"MessagePleaseWait": "Vennligst vent...",
|
||||
"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",
|
||||
"MessageQuickEmbedQueue": "Kø for hurtiginnbygging ({0} i kø)",
|
||||
"MessageQuickMatchAllEpisodes": "Kjapp matching av alle episoder",
|
||||
@@ -843,8 +889,10 @@
|
||||
"MessageRestoreBackupConfirm": "Er du sikker på at du vil gjenopprette sikkerhetskopien som var laget",
|
||||
"MessageRestoreBackupWarning": "gjenoppretting av sikkerhetskopi vil overskrive hele databasen under /config og omslagsbilde under /metadata/items og /metadata/authors.<br /><br />Sikkerhetskopier endrer ikke noen filer under dine bibliotekmapper. Hvis du har aktivert tjenerinstillingen for å lagre omslagsbilder og metadata i bibliotekmapper så vil ikke de filene bli tatt sikkerhetskopi eller overskrevet.<br /><br />Alle klientene som bruker din tjener vil bli fornyet automatisk.",
|
||||
"MessageScheduleLibraryScanNote": "For de fleste brukere er det anbefalt å la denne funksjonen være slått av, og la mappeovervåkeren stå på. Mappeovervåkeren oppdager automatisk endringer i biblioteksmappene. Mappeovervåkeren fungerer ikke med alle filsystemer (f.eks. NFS) og da kan planlagt skanning av bibliotekene brukes i steden for.",
|
||||
"MessageScheduleRunEveryWeekdayAtTime": "Kjør hver {0} kl. {1}",
|
||||
"MessageSearchResultsFor": "Søk resultat for",
|
||||
"MessageSelected": "{0} valgt",
|
||||
"MessageSeriesSequenceCannotContainSpaces": "Serienummer kan ikke inneholde mellomrom",
|
||||
"MessageServerCouldNotBeReached": "Tjener kunne ikke bli nådd",
|
||||
"MessageSetChaptersFromTracksDescription": "Sett kapitler ved å bruke hver lydfil som kapittel og kapitteltittel som lydfilnavnet",
|
||||
"MessageShareExpirationWillBe": "Utløp vil være <strong>{0}</strong>",
|
||||
@@ -865,6 +913,27 @@
|
||||
"MessageTaskFailedToMergeAudioFiles": "Kunne ikke slå sammen lydfiler",
|
||||
"MessageTaskFailedToMoveM4bFile": "Kunne ikke flytte M4B-fil",
|
||||
"MessageTaskFailedToWriteMetadataFile": "Kunne ikke lagre metadata-fil",
|
||||
"MessageTaskMatchingBooksInLibrary": "Samsvarende bøker i biblioteket \"{0}\"",
|
||||
"MessageTaskNoFilesToScan": "Ingen filer å skanne",
|
||||
"MessageTaskOpmlImport": "OPML-import",
|
||||
"MessageTaskOpmlImportDescription": "Oppretter podkaster fra {0} RSS-feeder",
|
||||
"MessageTaskOpmlImportFeed": "OPML-importfeed",
|
||||
"MessageTaskOpmlImportFeedDescription": "Importerer RSS-feed \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedFailed": "Kunne ikke hente podcast-feed",
|
||||
"MessageTaskOpmlImportFeedPodcastDescription": "Oppretter podkast \"{0}\"",
|
||||
"MessageTaskOpmlImportFeedPodcastExists": "Podkast finnes allerede på stien",
|
||||
"MessageTaskOpmlImportFeedPodcastFailed": "Misslykkes å opprette podcast",
|
||||
"MessageTaskOpmlImportFinished": "La til {0} podkaster",
|
||||
"MessageTaskOpmlParseFailed": "Klarte ikke å tolke OPML-fil",
|
||||
"MessageTaskOpmlParseFastFail": "Ugyldig OPML-fil: <opml>-tagg ble ikke funnet ELLER en <outline>-tagg ble ikke funnet",
|
||||
"MessageTaskOpmlParseNoneFound": "Fant ingen feeder i OPML-filen",
|
||||
"MessageTaskScanItemsAdded": "{0} lagt til",
|
||||
"MessageTaskScanItemsMissing": "{0} mangler",
|
||||
"MessageTaskScanItemsUpdated": "{0} oppdatert",
|
||||
"MessageTaskScanNoChangesNeeded": "Ingen endringer nødvendig",
|
||||
"MessageTaskScanningFileChanges": "Skanner filendringer i \"{0}\"",
|
||||
"MessageTaskScanningLibrary": "Skanner biblioteket \"{0}\"",
|
||||
"MessageTaskTargetDirectoryNotWritable": "Målkatalogen er ikke skrivbar",
|
||||
"MessageThinking": "Tenker...",
|
||||
"MessageUploaderItemFailed": "Opplastning mislykkes",
|
||||
"MessageUploaderItemSuccess": "Opplastning fullført!",
|
||||
@@ -882,13 +951,43 @@
|
||||
"NoteUploaderFoldersWithMediaFiles": "Mapper med mediefiler vil bli behandlet som separate bibliotekgjenstander.",
|
||||
"NoteUploaderOnlyAudioFiles": "Om man laster opp kun lydfiler så vil hver lydfil bli behandlet som en separat lydbok.",
|
||||
"NoteUploaderUnsupportedFiles": "Filer som ikke er støttet vil bli ignorert. Når man velger eller slipper en mappe, filer som ikke er en mappe vil bli ignorert.",
|
||||
"NotificationOnBackupCompletedDescription": "Utløses når en sikkerhetskopi er fullført",
|
||||
"NotificationOnBackupFailedDescription": "Utløses når en sikkerhetskopi mislykkes",
|
||||
"NotificationOnEpisodeDownloadedDescription": "Utløses når en podkastepisode lastes ned automatisk",
|
||||
"NotificationOnRSSFeedDisabledDescription": "Utløses når automatiske episodenedlastinger deaktiveres på grunn av for mange mislykkede forsøk",
|
||||
"NotificationOnRSSFeedFailedDescription": "Utløses når RSS-feedforespørselen mislykkes for en automatisk episodenedlasting",
|
||||
"NotificationOnTestDescription": "Hendelse for testing av varslingssystemet",
|
||||
"PlaceholderBulkChapterInput": "Skriv inn kapitteltittel eller bruk nummerering (f.eks. 'Episode 1', 'Kapittel 10', '1.')",
|
||||
"PlaceholderNewCollection": "Ny samlingsnavn",
|
||||
"PlaceholderNewFolderPath": "Ny mappesti",
|
||||
"PlaceholderNewPlaylist": "Ny spillelistenavn",
|
||||
"PlaceholderSearch": "Søk..",
|
||||
"PlaceholderSearchEpisode": "Søk episode..",
|
||||
"StatsAuthorsAdded": "forfattere lagt til",
|
||||
"StatsBooksAdded": "bøker lagt til",
|
||||
"StatsBooksAdditional": "Noen av tilleggene inkluderer…",
|
||||
"StatsBooksFinished": "bøker fullført",
|
||||
"StatsBooksFinishedThisYear": "Noen bøker fullført i år…",
|
||||
"StatsBooksListenedTo": "bøker lyttet til",
|
||||
"StatsCollectionGrewTo": "Boksamlingen din vokste til…",
|
||||
"StatsSessions": "økter",
|
||||
"StatsSpentListening": "brukt på lytting",
|
||||
"StatsTopAuthor": "BESTE FORFATTER",
|
||||
"StatsTopAuthors": "BESTE FORFATTERE",
|
||||
"StatsTopGenre": "BESTE SJANGER",
|
||||
"StatsTopGenres": "BESTE SJANGRE",
|
||||
"StatsTopMonth": "BESTE MÅNED",
|
||||
"StatsTopNarrator": "BESTE FORTELLER",
|
||||
"StatsTopNarrators": "BESTE FORTELLERE",
|
||||
"StatsTotalDuration": "Med en total varighet på…",
|
||||
"StatsYearInReview": "ÅRET SOM GIKK",
|
||||
"ToastAccountUpdateSuccess": "Konto oppdatert",
|
||||
"ToastAppriseUrlRequired": "Du må angi en Apprise-URL",
|
||||
"ToastAsinRequired": "ASIN er påkrevd",
|
||||
"ToastAuthorImageRemoveSuccess": "Forfatter bilde fjernet",
|
||||
"ToastAuthorNotFound": "Fant ikke forfatter \"{0}\"",
|
||||
"ToastAuthorRemoveSuccess": "Forfatter fjernet",
|
||||
"ToastAuthorSearchNotFound": "Fant ikke forfatter",
|
||||
"ToastAuthorUpdateMerged": "Forfatter slått sammen",
|
||||
"ToastAuthorUpdateSuccess": "Forfatter oppdatert",
|
||||
"ToastAuthorUpdateSuccessNoImageFound": "Forfatter oppdater (ingen bilde funnet)",
|
||||
@@ -902,6 +1001,7 @@
|
||||
"ToastBackupRestoreFailed": "Misslykkes å gjenopprette sikkerhetskopi",
|
||||
"ToastBackupUploadFailed": "Misslykkes å laste opp sikkerhetskopi",
|
||||
"ToastBackupUploadSuccess": "Sikkerhetskopi lastet opp",
|
||||
"ToastBatchApplyDetailsToItemsSuccess": "Detaljer brukt på elementene",
|
||||
"ToastBatchDeleteFailed": "Sletting feilet på utvalget",
|
||||
"ToastBatchDeleteSuccess": "Sletting av samling utført",
|
||||
"ToastBatchQuickMatchFailed": "Feil ved rask integrering av metadata!",
|
||||
@@ -911,16 +1011,25 @@
|
||||
"ToastBookmarkCreateFailed": "Misslykkes å opprette bokmerke",
|
||||
"ToastBookmarkCreateSuccess": "Bokmerke lagt til",
|
||||
"ToastBookmarkRemoveSuccess": "Bokmerke fjernet",
|
||||
"ToastBulkChapterInvalidCount": "Skriv inn et tall mellom 1 og 150",
|
||||
"ToastCachePurgeFailed": "Kunne ikke å slette mellomlager",
|
||||
"ToastCachePurgeSuccess": "Mellomlager slettet",
|
||||
"ToastChapterLocked": "Kapittelet er låst.",
|
||||
"ToastChapterStartTimeAdjusted": "Kapittelstart ble justert med {0} sekunder",
|
||||
"ToastChaptersAllLocked": "Alle kapitler er låst. Lås opp noen kapitler for å flytte tidene.",
|
||||
"ToastChaptersHaveErrors": "Kapittel har feil",
|
||||
"ToastChaptersInvalidShiftAmountLast": "Ugyldig forskyvningsverdi. Starttid for siste kapittel vil gå utover varigheten til denne lydboken.",
|
||||
"ToastChaptersInvalidShiftAmountStart": "Ugyldig forskyvningsverdi. Det første kapitlet ville fått null eller negativ lengde og blitt overskrevet av det andre kapitlet. Øk starttiden til det andre kapitlet.",
|
||||
"ToastChaptersMustHaveTitles": "Kapittel må ha titler",
|
||||
"ToastChaptersRemoved": "Kapitler fjernet",
|
||||
"ToastChaptersUpdated": "Kapitler oppdatert",
|
||||
"ToastCollectionItemsAddFailed": "Feil med å legge til element(er)",
|
||||
"ToastCollectionRemoveSuccess": "Samling fjernet",
|
||||
"ToastCollectionUpdateSuccess": "samlingupdated",
|
||||
"ToastConnectionNotAvailable": "Tilkobling er ikke tilgjengelig. Prøv igjen senere",
|
||||
"ToastCoverSearchFailed": "Finner ikke bokomslag",
|
||||
"ToastCoverUpdateFailed": "Oppdatering av bilde feilet",
|
||||
"ToastDateTimeInvalidOrIncomplete": "Dato og klokkeslett er ugyldig eller ufullstendig",
|
||||
"ToastDeleteFileFailed": "Kunne ikke slette fil",
|
||||
"ToastDeleteFileSuccess": "Fil slettet",
|
||||
"ToastDeviceAddFailed": "Kunne ikke legge til enhet",
|
||||
@@ -933,6 +1042,9 @@
|
||||
"ToastEpisodeDownloadQueueClearFailed": "Kunne ikke tømme køen",
|
||||
"ToastEpisodeDownloadQueueClearSuccess": "Nedlastingskø for eposider tømt",
|
||||
"ToastEpisodeUpdateSuccess": "{0} episoder oppdatert",
|
||||
"ToastErrorCannotShare": "Kan ikke dele direkte på denne enheten",
|
||||
"ToastFailedToCreate": "Kunne ikke opprette",
|
||||
"ToastFailedToDelete": "Kunne ikke slette",
|
||||
"ToastFailedToLoadData": "Kunne ikke laste inn data",
|
||||
"ToastFailedToMatch": "Kunne ikke matche",
|
||||
"ToastFailedToShare": "Deling feilet",
|
||||
@@ -940,6 +1052,7 @@
|
||||
"ToastInvalidImageUrl": "Ugyldig URL for bilde",
|
||||
"ToastInvalidMaxEpisodesToDownload": "Ugyldig maksimalt antall for nedlasting av episoder",
|
||||
"ToastInvalidUrl": "Ugyldig URL",
|
||||
"ToastInvalidUrls": "Én eller flere URL-er er ugyldige",
|
||||
"ToastItemCoverUpdateSuccess": "Omslag oppdatert",
|
||||
"ToastItemDeletedFailed": "Kunne ikke slette element",
|
||||
"ToastItemDeletedSuccess": "Element slettet",
|
||||
@@ -964,6 +1077,7 @@
|
||||
"ToastMustHaveAtLeastOnePath": "Påkrevd med minst én mappe",
|
||||
"ToastNameEmailRequired": "Navn og e-post påkrevd",
|
||||
"ToastNameRequired": "Navn er påkrevd",
|
||||
"ToastNewApiKeyUserError": "Du må velge en bruker",
|
||||
"ToastNewEpisodesFound": "{0} nye episoder funnet",
|
||||
"ToastNewUserCreatedFailed": "Kunne ikke opprette konto: \"{0}\"",
|
||||
"ToastNewUserCreatedSuccess": "Ny konto opprettet",
|
||||
@@ -972,6 +1086,7 @@
|
||||
"ToastNewUserTagError": "Velg minst en tag",
|
||||
"ToastNewUserUsernameError": "Skriv inn brukernavn",
|
||||
"ToastNoNewEpisodesFound": "Ingen nye episoder funnet",
|
||||
"ToastNoRSSFeed": "Podkasten har ikke en RSS-feed",
|
||||
"ToastNoUpdatesNecessary": "Ingen oppdateringer nødvendig",
|
||||
"ToastNotificationCreateFailed": "Kunne ikke opprette varsling",
|
||||
"ToastNotificationDeleteFailed": "Kunne ikke slette varsling",
|
||||
@@ -987,6 +1102,7 @@
|
||||
"ToastPlaylistUpdateSuccess": "Spilleliste oppdatert",
|
||||
"ToastPodcastCreateFailed": "Misslykkes å opprette podcast",
|
||||
"ToastPodcastCreateSuccess": "Podcast opprettet",
|
||||
"ToastPodcastEpisodeUpdated": "Episode oppdatert",
|
||||
"ToastPodcastGetFeedFailed": "Kunne ikke hente podcast-feed",
|
||||
"ToastPodcastNoEpisodesInFeed": "Ingen episoder funnet i RSS-feed",
|
||||
"ToastPodcastNoRssFeed": "Podcast har ingen RSS-feed",
|
||||
@@ -1011,6 +1127,7 @@
|
||||
"ToastSelectAtLeastOneUser": "Velg minst én bruker",
|
||||
"ToastSendEbookToDeviceFailed": "Misslykkes å sende ebok",
|
||||
"ToastSendEbookToDeviceSuccess": "Ebok sendt til \"{0}\"",
|
||||
"ToastSeriesSubmitFailedSameName": "Kan ikke legge til to serier med samme navn",
|
||||
"ToastSeriesUpdateFailed": "Misslykkes å oppdatere serie",
|
||||
"ToastSeriesUpdateSuccess": "Serie oppdatert",
|
||||
"ToastServerSettingsUpdateSuccess": "Server-innstillinger oppdatert",
|
||||
@@ -1029,10 +1146,20 @@
|
||||
"ToastUnknownError": "Ukjent feil",
|
||||
"ToastUnlinkOpenIdFailed": "Kunne ikke koble bruker fra OpenID",
|
||||
"ToastUnlinkOpenIdSuccess": "Bruker koblet fra OpenID",
|
||||
"ToastUploaderFilepathExistsError": "Filstien \"{0}\" finnes allerede på serveren",
|
||||
"ToastUploaderItemExistsInSubdirectoryError": "Elementet \"{0}\" bruker en underkatalog av opplastingsstien.",
|
||||
"ToastUserDeleteFailed": "Misslykkes å slette bruker",
|
||||
"ToastUserDeleteSuccess": "Bruker slettet",
|
||||
"ToastUserPasswordChangeSuccess": "Passord ble endret",
|
||||
"ToastUserPasswordMismatch": "Passord må stemme overens",
|
||||
"ToastUserPasswordMustChange": "Nytt passord kan ikke være identisk med gammelt passord",
|
||||
"ToastUserRootRequireName": "Root-brukernavn er påkrevd"
|
||||
"ToastUserRootRequireName": "Root-brukernavn er påkrevd",
|
||||
"TooltipAddChapters": "Legg til kapittel(er)",
|
||||
"TooltipAddOneSecond": "Legg til 1 sekund",
|
||||
"TooltipAdjustChapterStart": "Klikk for å justere starttid",
|
||||
"TooltipLockAllChapters": "Lås alle kapitler",
|
||||
"TooltipLockChapter": "Lås kapittel (Shift+klikk for område)",
|
||||
"TooltipSubtractOneSecond": "Trekk fra 1 sekund",
|
||||
"TooltipUnlockAllChapters": "Lås opp alle kapitler",
|
||||
"TooltipUnlockChapter": "Lås opp kapittel (Shift+klikk for område)"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user